/* Minification failed. Returning unminified contents.
(113,1-6): run-time error JS1195: Expected expression: class
(114,23-24): run-time error JS1004: Expected ';': {
(121,1-2): run-time error JS1002: Syntax error: }
(124,12-13): run-time error JS1004: Expected ';': :
(124,69-70): run-time error JS1004: Expected ';': {
(135,1-6): run-time error JS1195: Expected expression: class
(136,23-24): run-time error JS1004: Expected ';': {
(140,30-31): run-time error JS1197: Too many errors. The file might not be a JavaScript file: )
 */
(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
/// This code was generated by Orange Onion Scaffolder.
// template: MVC.TSApp.cs
// class: RedirectUrl
panda = {};
var Authentication = require("./app/Authentication/Authentication");
panda.Authentication = Authentication;
var CallToAction = require('./app/CallToAction/CallToAction');
panda.CallToAction = CallToAction;
var Contact = require('./app/Contact/Contact');
panda.Contact = Contact;
var ContentPage = require('./app/ContentPage/ContentPage');
panda.ContentPage = ContentPage;
var HomeStream = require('./app/HomeStream/HomeStream');
panda.HomeStream = HomeStream;
var DashboardVersion = require('./app/DashboardVersion/DashboardVersion');
panda.DashboardVersion = DashboardVersion;
var Media = require('./app/Media/Media');
panda.MediaLibrary = Media;
var ContentPageTreeView = require('./app/ContentPageTreeView/ContentPageTreeView');
panda.ContentPageTreeView = ContentPageTreeView;
var Coupon = require('./app/Coupon/Coupon');
panda.Coupon = Coupon;
var CouponRedemption = require('./app/CouponRedemption/CouponRedemption');
panda.CouponRedemption = CouponRedemption;
var Fundraiser = require('./app/Fundraiser/Fundraiser');
panda.Fundraiser = Fundraiser;
var FundraiserBlackoutDate = require('./app/FundraiserBlackoutDate/FundraiserBlackoutDate');
panda.FundraiserBlackoutDate = FundraiserBlackoutDate;
var FundraiserMember = require('./app/FundraiserMember/FundraiserMember');
panda.FundraiserMember = FundraiserMember;
var FundraiserUnitException = require('./app/FundraiserUnitException/FundraiserUnitException');
panda.FundraiserUnitException = FundraiserUnitException;
var GridContentPage = require('./app/GridContentPage/GridContentPage');
panda.GridContentPage = GridContentPage;
var HalfAndHalf = require('./app/HalfAndHalf/HalfAndHalf');
panda.HalfAndHalf = HalfAndHalf;
var Meal = require('./app/Meal/Meal');
panda.Meal = Meal;
var MenuCategory = require('./app/MenuCategory/MenuCategory');
panda.MenuCategory = MenuCategory;
var MenuItem = require('./app/MenuItem/MenuItem');
panda.MenuItem = MenuItem;
var MobileFeature = require('./app/MobileFeature/MobileFeature');
panda.MobileFeature = MobileFeature;
var QuestionAnswer = require('./app/QuestionAnswer/QuestionAnswer');
panda.QuestionAnswer = QuestionAnswer;
var RedirectUrl = require('./app/RedirectUrl/RedirectUrl');
panda.RedirectUrl = RedirectUrl;
var Store = require('./app/Store/Store');
panda.Store = Store;
var StoreException = require('./app/StoreException/StoreException');
panda.StoreException = StoreException;
var SystemContentPage = require('./app/SystemContentPage/SystemContentPage');
panda.SystemContentPage = SystemContentPage;
var User = require('./app/User/User');
panda.User = User;
var UserLocation = require('./app/UserLocation/UserLocation');
panda.UserLocation = UserLocation;
var Connect = require('./app/Connect/Connect');
panda.ConnectUs = Connect;
var ContactUs = require('./app/ContactUs/ContactUs');
panda.ContactUs = ContactUs;
var FundraiserLogin = require('./app/FundraiserLogin/FundraiserLogin');
panda.FundraiserLogin = FundraiserLogin;
var Menu = require('./app/Menu/Menu');
panda.Menu = Menu;
var PandaFundraiser = require('./app/PandaFundraiser/PandaFundraiser');
panda.PandaFundraiser = PandaFundraiser;
var PandaFundraiserBlackoutDate = require('./app/PandaFundraiserBlackoutDate/PandaFundraiserBlackoutDate');
panda.PandaFundraiserBlackoutDate = PandaFundraiserBlackoutDate;
var PandaFundraiserMember = require('./app/PandaFundraiserMember/PandaFundraiserMember');
panda.PandaFundraiserMember = PandaFundraiserMember;
var PublicContentPage = require('./app/PublicContentPage/PublicContentPage');
panda.PublicContentPage = PublicContentPage;
var Error = require('./app/Error/Error');
panda.Error = Error;
var AdminError = require('./app/AdminError/AdminError');
panda.AdminError = AdminError;
var StyleGuide = require('./app/StyleGuide/StyleGuide');
panda.StyleGuide = StyleGuide;
var SiteMap = require('./app/SiteMap/SiteMap');
panda.SiteMap = SiteMap;
var FeedbackKeyword = require('./app/FeedbackKeyword/FeedbackKeyword');
panda.FeedbackKeyword = FeedbackKeyword;
var Vendor = require('./app/Vendor/Vendor');
panda.Vendor = Vendor;
var FeedbackKeywordLog = require('./app/FeedbackKeywordLog/FeedbackKeywordLog');
panda.FeedbackKeywordLog = FeedbackKeywordLog;
var Allergen = require('./app/Allergen/Allergen');
panda.Allergen = Allergen;
var FundraiserLog = require('./app/FundraiserLog/FundraiserLog');
panda.FundraiserLog = FundraiserLog;
var FundraiserInquiry = require('./app/FundraiserInquiry/FundraiserInquiry');
panda.FundraiserInquiry = FundraiserInquiry;
var YelpReview = require('./app/YelpReview/YelpReview');
panda.YelpReview = YelpReview;
var VisitorScheduledMeeting = require('./app/VisitorScheduledMeeting/VisitorScheduledMeeting');
panda.VisitorScheduledMeeting = VisitorScheduledMeeting;
var Nutrition = require('./app/Nutrition/Nutrition');
panda.Nutrition = Nutrition;

document.onkeydown = function (e) {
    if (e.keyCode === 13) {
        console.log('enter');
        document.activeElement.click();
    }
};
},{"./app/AdminError/AdminError":2,"./app/Allergen/Allergen":3,"./app/Authentication/Authentication":5,"./app/CallToAction/CallToAction":13,"./app/Connect/Connect":15,"./app/Contact/Contact":20,"./app/ContactUs/ContactUs":18,"./app/ContentPage/ContentPage":23,"./app/ContentPageTreeView/ContentPageTreeView":22,"./app/Coupon/Coupon":28,"./app/CouponRedemption/CouponRedemption":27,"./app/DashboardVersion/DashboardVersion":29,"./app/Error/Error":32,"./app/FeedbackKeyword/FeedbackKeyword":34,"./app/FeedbackKeywordLog/FeedbackKeywordLog":33,"./app/Fundraiser/Fundraiser":47,"./app/FundraiserBlackoutDate/FundraiserBlackoutDate":36,"./app/FundraiserInquiry/FundraiserInquiry":38,"./app/FundraiserLog/FundraiserLog":40,"./app/FundraiserLogin/FundraiserLogin":41,"./app/FundraiserMember/FundraiserMember":43,"./app/FundraiserUnitException/FundraiserUnitException":45,"./app/GridContentPage/GridContentPage":49,"./app/HalfAndHalf/HalfAndHalf":51,"./app/HomeStream/HomeStream":53,"./app/Meal/Meal":55,"./app/Media/Media":56,"./app/Menu/Menu":62,"./app/MenuCategory/MenuCategory":58,"./app/MenuItem/MenuItem":60,"./app/MobileFeature/MobileFeature":63,"./app/Nutrition/Nutrition":64,"./app/PandaFundraiser/PandaFundraiser":68,"./app/PandaFundraiserBlackoutDate/PandaFundraiserBlackoutDate":65,"./app/PandaFundraiserMember/PandaFundraiserMember":66,"./app/PublicContentPage/PublicContentPage":71,"./app/QuestionAnswer/QuestionAnswer":72,"./app/RedirectUrl/RedirectUrl":73,"./app/SiteMap/SiteMap":75,"./app/Store/Store":78,"./app/StoreException/StoreException":76,"./app/StyleGuide/StyleGuide":80,"./app/SystemContentPage/SystemContentPage":81,"./app/User/User":84,"./app/UserLocation/UserLocation":83,"./app/Vendor/Vendor":86,"./app/VisitorScheduledMeeting/VisitorScheduledMeeting":87,"./app/YelpReview/YelpReview":88}],2:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
class AdminError {
    constructor(data) {
        //call base class constructor
        // super(data, Form, Table, Router);
        this.data = data;
        ko.applyBindings(this);
        $('.hideUnbound').removeClass('hideUnbound');
    }
}
module.exports = AdminError;

},{"jquery":109,"knockout":111}],3:[function(require,module,exports){
"use strict";
/// This code was generated by Orange Onion Scaffolder.
// template: MVC.JSModule.cs
// class: Allergen
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
const Table = require("../Base/Table");
const AllergenRouter = require("./AllergenRouter");
const Form = require("../Base/Form");
class Allergen extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, Form, Table, AllergenRouter);
        this.data = data;
        ko.applyBindings(this);
        $('.hideUnbound').removeClass('hideUnbound');
    }
}
module.exports = Allergen;

},{"../Base/Form":7,"../Base/Table":11,"../Base/VMBase":12,"./AllergenRouter":4,"jquery":109,"knockout":111}],4:[function(require,module,exports){
"use strict";
const Router = require("../Base/Router");
class AllergenRouter extends Router {
    constructor(data, vm, alternateroutes) {
        super(data, vm, alternateroutes);
        this.data = data;
        this.vm = vm;
    }
    getRoutes() {
        var self;
        self = this;
        return [
            {
                name: `${self.getArea()}/${self.data.Title}#/list`,
                func: () => {
                    self.vm.form.cancel();
                    self.vm.table.load();
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/new`,
                func() {
                    self.vm.form.add();
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/view/:id`,
                func() {
                    var id = this.params['id'];
                    self.vm.form.getDetail(id);
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/index`,
                func() {
                    self.vm.form.getDetail(null);
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/delete/:id`,
                func() {
                    var id = this.params['id'];
                    self.vm.form.deleteItem(id);
                },
                convertToRegEx: false
            }
        ];
    }
}
module.exports = AllergenRouter;

},{"../Base/Router":10}],5:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
const Table = require("../Base/Table");
const Form = require("../Base/Form");
const AuthenticationRouter1 = require("./AuthenticationRouter");
class Authentication extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, Form, Table, AuthenticationRouter1);
        this.data = data;
        this.Filters = null;
        var self = this;
        ko.applyBindings(this);
        $('.hideUnbound').removeClass('hideUnbound');
        $('#login-button').on('click', () => {
            self.Alerts([]);
            var url = '/Admin/Authentication/Login';
            var mapping = {
                'ignore': this.data.KOMapping.allNonPostBack
            };
            var postData = ko.mapping.toJS(this, mapping);
            $('#loading').height($(window).height());
            this.IsLoading(true);
            var promise = $.ajax({
                url: url,
                data: JSON.stringify(postData),
                type: 'POST',
                cache: false,
                contentType: 'application/json;charset=utf-8'
            });
            promise.fail(function (error) {
                //something went wrong display error
                var html = error.error().responseText;
                var element = $('<div/>').html(html);
                $('style', element).remove();
                var htmlText = element.html();
                self.AddAlert(htmlText, 'error');
                self.IsLoading(false);
            });
            promise.done(function (data) {
                if (data.LoginSuccess) {
                    window.location.href = data.ReturnUrl;
                }
                else {
                    self.AddAlert(data.Message, 'error');
                }
                self.IsLoading(false);
            });
            return promise;
        });
        $('#forgot-password-button').on('click', () => {
            self.Alerts.removeAll();
            self.IsLoading(true);
            var promise = $.ajax({
                url: '/Admin/Authentication/ForgotPassword?email=' + $('#ItemDetail_Email').val(),
                type: 'POST',
                cache: false,
                dataType: 'json'
            });
            promise.fail(function (error) {
                //something went wrong display error
                var msg = error.error().responseJSON.Message;
                var element = $('<div/>').html(msg);
                $('style', element).remove();
                var htmlText = element.html();
                self.AddAlert(htmlText, "error");
                self.IsLoading(false);
            });
            promise.done(function (data) {
                self.IsLoading(false);
                self.AddAlert(data.Message, 'success');
                self.ShowForgotPassword(false);
                window.location.hash = '#/index';
            });
            return promise;
        });
        $('#reset-password-button').on('click', () => {
            self.Alerts.removeAll();
            self.IsLoading(true);
            var mapping = {
                'ignore': this.data.KOMapping.allNonPostBack
            };
            var postData = ko.mapping.toJS(this, mapping);
            var promise = $.ajax({
                url: '/Admin/Authentication/ResetPassword',
                data: JSON.stringify(postData),
                type: 'POST',
                cache: false,
                contentType: 'application/json;charset=utf-8',
                dataType: 'json'
            });
            promise.fail(function (error) {
                //something went wrong display error
                //var msg = error.error().responseJSON.Message;
                $.each(error.responseJSON.ModelState.PropertyErrors, function (k, v) {
                    var element = $('<div/>').html(v.ErrorMessage);
                    $('style', element).remove();
                    var htmlText = element.html();
                    self.AddAlert(htmlText, "error");
                });
                $.each(error.responseJSON.ModelState.ModelErrors, function (k, v) {
                    var element = $('<div/>').html(v.ErrorMessage);
                    $('style', element).remove();
                    var htmlText = element.html();
                    self.AddAlert(htmlText, "error");
                });
                self.IsLoading(false);
            });
            promise.done(function (data) {
                self.IsLoading(false);
                self.AddAlert(data.Message, 'success');
                self.ShowForgotPassword(false);
                self.ShowResetPassword(false);
                window.location.hash = '#/index';
            });
            return promise;
        });
        $(document).on('keyup', (e) => {
            if (e.which === 13) {
                self.ItemDetail.Password($('#password-text').val());
                self.ItemDetail.Email($('#ItemDetail_Email').val());
                $('#login-button').click();
            }
        });
    }
}
module.exports = Authentication;

},{"../Base/Form":7,"../Base/Table":11,"../Base/VMBase":12,"./AuthenticationRouter":6,"jquery":109,"knockout":111}],6:[function(require,module,exports){
"use strict";
const Router = require("../Base/Router");
class AuthenticationRouter extends Router {
    constructor(data, vm, alternateroutes) {
        super(data, vm, alternateroutes);
        this.data = data;
        this.vm = vm;
    }
    getRoutes() {
        var self;
        self = this;
        return [
            {
                name: '/Admin/Authentication#/index',
                func() {
                    self.vm.ShowForgotPassword(false);
                },
                convertToRegEx: true
            },
            {
                name: '/Admin/Authentication#/forgotpassword',
                func() {
                    self.vm.ShowForgotPassword(true);
                },
                convertToRegEx: true
            },
            {
                name: '/Admin/Authentication#/resetpassword',
                func() {
                    self.vm.ShowForgotPassword(false);
                    self.vm.ShowResetPassword(true);
                },
                convertToRegEx: true
            }
        ];
    }
}
module.exports = AuthenticationRouter;

},{"../Base/Router":10}],7:[function(require,module,exports){
"use strict";
const $ = require("jquery");
var JQuery = $;
const ko = require("knockout");
const komapping = require("knockout.mapping");
ko.mapping = komapping;
const _ = require("underscore");
const bootstrap = require("bootstrap");
bootstrap;
const isLoading = require("jquery-isloading");
isLoading;
class Form {
    constructor(data, vm, editAction = 'Edit') {
        this.data = data;
        this.vm = vm;
        this.editAction = editAction;
        this.controllerUrl = `/${data.Title}`;
        this.tabRowSelector = '.main-modal-form form > .row';
        this.area = this.data.Area ? `/${this.data.Area}` : '';
        this.getUrl = `${this.area}/${data.Title}/Item`;
        this.postUrl = `${this.area}/${this.data.Title}/${this.editAction}`;
        this.vm.IsLoading.subscribe(function (newValue) {
            if (newValue)
                $.isLoading({ 'text': 'Loading...' });
            else
                $.isLoading('hide');
        }, this);
        this.setupBindigs();
        this.setupTabs();
    }
    //postUrl(): string {
    //    return `${this.area() }/${this.data.Title}/${this.editAction}`;
    //}
    //area(): string {
    //    return this.data.Area ? `/${this.data.Area}` : '';
    //}
    setupBindigs() {
        var self = this;
        //tab click setup
        $('.modalform-holder').on('click', '.form-tab-nav', function () {
            //set clicked one to active
            var formTab = ko.dataFor(this); //local this
            var index = _.indexOf(self.vm.FormTabs(), formTab);
            self.vm.ActiveTabIndex(index);
        });
        $('.modalform-holder').on('click', '#save', () => {
            this.post();
            return false;
        });
        $('.indexform-holder').on('click', '#save', () => {
            this.postIndex();
            return false;
        });
        $('.form-body').on('click', '#confirm-delete', () => {
            this.confirmDelete();
            return false;
        });
    }
    setupClearValidation(property) {
        //get property off of vm using string name coming from server
        var vmProperty = this.getVmProperty(property);
        if (ko.isObservable(vmProperty)) {
            var subscription = vmProperty.subscribe((newValue) => {
                this.removeError(property);
                //get rid of subscription
                subscription.dispose();
            });
        }
    }
    confirmDelete() {
        this.editAction = 'Delete';
        this.postUrl = `${this.area}/${this.data.Title}/${this.editAction}`;
        var promise = this.post();
        promise.done(() => {
            $('#delete-modal').modal('hide');
            this.editAction = 'Edit';
            this.postUrl = `${this.area}/${this.data.Title}/${this.editAction}`;
        });
    }
    //postUrl() {
    //    return `${this.area}/${this.data.Title}/${this.editAction}`;
    //}
    //area() {
    //    return this.data.Area ? `/${this.data.Area}` : '';
    //}
    removeError(property) {
        //property id has _ instead of .
        var forminput = $('#' + property.replace(/\./g, '_'));
        $("#error_message_" + property.replace(/\./g, '_')).empty();
        //select2 uses parent
        if (forminput.hasClass('select2-offscreen')) {
            forminput = $('.select2-container', forminput.parent());
        }
        //remove error class to parent element
        var formGroup = forminput.parent();
        formGroup.removeClass('has-error has-feedback');
        //remove bootsrap popover
        if ((forminput).attr('data-trigger')) {
            forminput
                .removeAttr('data-trigger')
                .removeAttr('data-placement')
                .removeAttr('data-content')
                .popover('destroy') //todo bootstrap popover
            ;
        }
        //remove popover element
        $('.form-control-feedback', formGroup).remove();
        //get rid of subscription
        //subscription.dispose();
        //refresh tabs
        this.refreshTabValidationBadges();
        //handle span differently
        var isSpan = forminput.is('span');
        if (isSpan) {
            forminput.text('');
            forminput.removeClass('label label-danger');
        }
        //});
    }
    getVmProperty(property) {
        var propertyParts = property.split('.');
        var vmProperty = this.vm[propertyParts[0]][propertyParts[1]];
        return vmProperty;
    }
    setupTabs() {
        $(this.tabRowSelector + ' h2').hide();
        //create a knockoutobservable foreach h2 inside a row
        $(this.tabRowSelector + ' h2').each((index, value) => {
            var element = $(value);
            var attr = 'visible: $root.ActiveTabIndex() === ' + index.toString();
            $(value).parent().parent().attr('data-bind', attr);
            this.vm.FormTabs.push({
                Text: ko.observable(element.html()),
                ErrorCount: ko.observable(0),
                ChangeCount: ko.observable(0),
                Hidden: ko.observable(false),
                Id: ko.observable(null)
            });
        });
        this.vm.ActiveTabIndex(0);
    }
    generateNewClientId() {
        return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8); return v.toString(16); });
    }
    add() {
        this.vm.IsLoading(true);
        this.resetDetail();
        this.vm.ItemDetailIsNew(true);
        $('body').addClass('form-shown');
        this.vm.FormVisible(true);
        this.vm.IsLoading(false);
    }
    deleteitem(id) {
        var promise = this.getDetail(id);
        promise.done(() => {
            this.vm.routes.view(id);
            $('#delete-modal').modal('show');
        });
        return promise;
    }
    cancel() {
        this.vm.FormVisible(false);
        setTimeout(function () {
            $('body').removeClass('form-shown');
        }, 250);
    }
    post() {
        //prevent double post
        if (this.vm.IsLoading()) {
            return;
        }
        //make overlay loading div full height
        $('#loading').height($(window).height());
        this.vm.IsLoading(true);
        var ignoreMapping = {
            'ignore': this.data.KOMapping.allNonPostBack
        };
        var postData = ko.mapping.toJS(this.vm, ignoreMapping);
        delete postData.Alerts;
        delete postData.NewVersion;
        $(".form-validation-errors").hide();
        var promise = $.ajax({
            url: this.postUrl.toString().toLowerCase(),
            data: JSON.stringify(postData),
            type: 'POST',
            cache: false,
            contentType: 'application/json;charset=utf-8',
        });
        promise.fail((error) => this.postPromiseFail(error));
        promise.done(data => this.postPromiseDone(data));
        return promise;
    }
    postIndex() {
        //prevent double post
        if (this.vm.IsLoading()) {
            return;
        }
        //make overlay loading div full height
        $('#loading').height($(window).height());
        this.vm.IsLoading(true);
        var ignoreMapping = {
            'ignore': this.data.KOMapping.allNonPostBack
        };
        var postData = ko.mapping.toJS(this.vm, ignoreMapping);
        delete postData.Alerts;
        delete postData.NewVersion;
        $(".form-validation-errors").hide();
        var promise = $.ajax({
            url: this.postUrl.toString().toLowerCase(),
            data: JSON.stringify(postData),
            type: 'POST',
            cache: false,
            contentType: 'application/json;charset=utf-8',
        });
        promise.fail((error) => this.postPromiseFail(error));
        promise.done(data => this.postPromiseIndexDone(data));
        return promise;
    }
    deleteItem(id) {
        this.isDeleting = true;
        this.vm.routes.view(id); // Kicks off an implied getDetail()
        //var promise = this.getDetail(id);
        //promise.done(() => {
        //    this.vm.routes.view(id);
        //    $('#delete-modal').modal('show');
        //    this.isModalShowing = true;
        //});
        //return promise;
    }
    //confirmDelete() {
    //    this.editAction = 'Delete';
    //    var promise = this.post();
    //    promise.done(() => {
    //        this.editAction = 'Edit';
    //    });
    //}
    mapPostData(data) {
        var copyMapping = {
            'copy': this.data.KOMapping.copy
        };
        ko.mapping.fromJS(data.ItemDetail, copyMapping, this.vm.ItemDetail);
    }
    addPropertyError(propertyError) {
        var key = propertyError.Key, message = propertyError.ErrorMessage;
        if (key === undefined || key === null)
            return;
        //find matching input
        var forminput = $('#' + key.replace(/\./g, '_'));
        //select2 need to use parent element
        if (forminput.hasClass('select2-offscreen')) {
            forminput = $('.select2-container', forminput.parent());
        }
        this.formInputAddError(forminput, key, message);
        var errorMessage = $("#error_message_" + key.replace(/\./g, '_'));
        this.formInputAddError(errorMessage, key, message);
    }
    //add error state to dom
    formInputAddError(forminput, key, message) {
        //select2 need to use parent element
        if (forminput.hasClass('select2-offscreen')) {
            forminput = $('.select2-container', forminput.parent());
        }
        var isSpan = forminput.is('span');
        var formElementFound = true;
        if (forminput.length > 0) {
            var elementParent = forminput.parent();
            elementParent.addClass('has-error has-feedback');
            if (!isSpan) {
                elementParent.append('<span class=\'glyphicon glyphicon-remove form-control-feedback\'></span>');
            }
            else {
                forminput.text(message);
                forminput.addClass('label label-danger');
            }
            if (message && !isSpan) {
                forminput
                    .attr('data-trigger', 'hover')
                    .attr('data-placement', 'bottom')
                    .attr('data-content', message)
                    .popover();
            }
            if (!isSpan)
                forminput.attr('aria-invalid', 'true');
        }
        else {
            formElementFound = false;
            if (message === 'DBConcurrencyException') {
                //$("#conflictModal").modal("show");
            }
            else {
                //addAlert(message, "error"); //todo form class level validation
            }
        }
        if (formElementFound) {
            this.setupClearValidation(key);
        }
    }
    //remove error state from don
    formInputRemoveError(forminput, key) {
        if (forminput.hasClass('select2-offscreen')) {
            forminput = $('.select2-container', forminput.parent());
        }
        //remove error class to parent element
        var formGroup = forminput.closest('.form-group');
        formGroup.removeClass('has-error has-feedback');
        //remove bootsrap popover
        if ((forminput).attr('data-trigger')) {
            forminput
                .removeAttr('data-trigger')
                .removeAttr('data-placement')
                .removeAttr('data-content')
                .popover('destroy') //todo bootstrap popover
            ;
        }
        //remove popover element
        $('.form-control-feedback', formGroup).remove();
        //refresh tabs
        this.refreshTabValidationBadges();
        //handle span differently
        var isSpan = forminput.is('span');
        if (isSpan) {
            forminput.text('');
            forminput.removeClass('label label-danger');
        }
    }
    //setup tab validation notice
    refreshTabValidationBadges() {
        //find elements inside row that have has-error class
        $('.form-holder .row').each((i, v) => {
            //get the number of errors on in tab section
            var errors = $('.has-error', v).length;
            //find tab by title and set error count
            var tabTitle = $('h2', v).html();
            var match = ko.utils.arrayFirst(this.vm.FormTabs(), item => (tabTitle === item.Text()));
            if (match) {
                match.ErrorCount(errors);
            }
        });
    }
    //resets item detail so that it looks like a new insert
    resetDetail() {
        //$('#delete-modal').modal('hide');
        ko.mapping.fromJS(this.vm.NewItemDetail, {}, this.vm.ItemDetail);
        //this.refreshTabValidationBadges();
        _.each(this.vm.FormTabs(), function (tab) { tab.ErrorCount(0); }); //reset errors to 0
        $('.main-modal-form form > .row').hide();
        this.vm.ActiveTabIndex(0);
        $('.main-modal-form form > .row:eq(0)').show();
    }
    //resets item detail so that it looks like a new insert
    resetDetailIndex() {
        //$('#delete-modal').modal('hide');
        // ko.mapping.fromJS(this.vm.NewItemDetail, {}, this.vm.ItemDetail);
        //this.refreshTabValidationBadges();
        _.each(this.vm.FormTabs(), function (tab) { tab.ErrorCount(0); }); //reset errors to 0
        $('.main-modal-form form > .row').hide();
        this.vm.ActiveTabIndex(0);
        $('.main-modal-form form > .row:eq(0)').show();
    }
    getDetail(id) {
        this.resetDetail();
        //$('#loading').height($(window).height());
        this.vm.IsLoading(true);
        $('body').addClass('form-shown');
        var promise = $.ajax({
            url: this.getUrl,
            data: { id: id },
            type: 'GET',
            cache: false,
            contentType: 'application/json;charset=utf-8'
        });
        promise.fail((error) => this.getPromiseFail(error, id));
        promise.fail((error) => {
            var html = error.error().responseText;
            var element = $('<div/>').html(html);
            $('style', element).remove();
            var htmlText = element.html();
            this.vm.AddAlert(htmlText, 'alert-error');
            this.vm.IsLoading(false);
        });
        promise.done((data) => this.getPromiseDone(data, id));
        return promise;
    }
    komappingfromdata(data, id) {
        var copyMapping = {
            'copy': this.data.KOMapping.allNonPostBack
        };
        ko.mapping.fromJS(data.ItemDetail, copyMapping, this.vm.ItemDetail);
    }
    //post ajax fail$$
    postPromiseFail(error) {
        if (error.status === 400) {
            if (error.responseJSON.ModelState.PropertyErrors.length > 0)
                $(".form-validation-errors").show();
            _.each(error.responseJSON.ModelState.PropertyErrors, (propertyError) => {
                this.addPropertyError(propertyError);
            });
            _.each(error.responseJSON.ModelState.ModelErrors, (v) => {
                // addAlert(v.ErrorMessage, 'error');
            });
            this.refreshTabValidationBadges();
        }
        else if (error.status === 422) {
            // Failed captcha
            alert("Your request appears to be invalid. Please try again.");
        }
        else {
            if (error.responseJSON) {
                if (error.responseJSON.Message) {
                    this.vm.AddAlert(error.responseJSON.Message, 'error');
                }
                else {
                    var html = error.error().responseText;
                    var element = $('<div/>').html(html);
                    $('style', element).remove();
                    var htmlText = element.html();
                    this.vm.AddAlert(htmlText, 'error');
                }
            }
            else {
                var html2 = error.error().responseText;
                var element2 = $('<div/>').html(html2);
                $('style', element2).remove();
                var htmlText2 = element2.html();
                this.vm.AddAlert(htmlText2, 'error');
            }
        }
        this.vm.IsLoading(false);
    }
    //post ajax success
    postPromiseDone(data) {
        this.mapPostData(data);
        if (!this.vm.LeaveOpenOnAjaxSuccess()) {
            this.vm.routes.goBack();
            this.resetDetail();
            this.vm.AddAlert(data.Message, 'success');
        }
        this.vm.IsLoading(false);
    }
    //post ajax success
    postPromiseIndexDone(data) {
        this.mapPostData(data);
        if (!this.vm.LeaveOpenOnAjaxSuccess()) {
            this.vm.routes.goBack();
            this.resetDetailIndex();
            this.vm.AddAlert(data.Message, 'success');
        }
        this.vm.IsLoading(false);
    }
    //get ajax fail
    getPromiseFail(error, id) {
        var html = error.error().responseText;
        var element = $('<div/>').html(html);
        $('style', element).remove();
        var htmlText = element.html();
        this.vm.AddAlert(htmlText, 'alert-error');
        this.vm.IsLoading(false);
    }
    //get ajax success
    getPromiseDone(data, id) {
        if (data.length === 0 || data === 'undefined') {
            window.location.href = '/Admin/Authentication/Login';
        }
        this.vm.ItemDetailIsNew(false);
        this.komappingfromdata(data, id);
        this.vm.routes.view(id);
        this.vm.IsLoading(false);
        this.vm.FormVisible(true);
        if (this.isDeleting) {
            $('#delete-modal').modal('show');
            this.isModalShowing = true;
        }
    }
}
module.exports = Form;

},{"bootstrap":96,"jquery":109,"jquery-isloading":90,"knockout":111,"knockout.mapping":110,"underscore":113}],8:[function(require,module,exports){
"use strict";
const ko = require("knockout");
const $ = require("jquery");
class KoBindingExtensions {
    register() {
        ko.bindingHandlers.hidden = {
            update(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
                var value = ko.utils.unwrapObservable(valueAccessor());
                ko.bindingHandlers.visible.update(element, () => (!value), allBindingsAccessor, viewModel, bindingContext);
            }
        };
        ko.bindingHandlers.slideInVisible = {
            init(element, valueAccessor) {
                // Initially set the element to be instantly visible/hidden depending on the value
                var value = valueAccessor();
                $(element).toggle(ko.unwrap(value)); // Use "unwrapObservable" so we can handle values that may or may not be observable
            },
            update(element, valueAccessor) {
                // Whenever the value subsequently changes, slowly fade the element in or out
                var value = valueAccessor();
                var jqueryElement = $(element);
                if (ko.unwrap(value)) {
                    //scroll browser to top to make sure form is in view
                    $('body')
                        .animate({ scrollTop: 0 }, '250', 'swing');
                    //hide
                    //position off screen 
                    //show
                    //slide into position
                    jqueryElement
                        .hide()
                        .animate({ left: -3000 }, 1, 'linear', function () {
                        $(this).show(); //local this
                    })
                        .animate({ left: 0 }, 250);
                }
                else {
                    //slide off screen
                    //hide
                    //reset to 0 position
                    jqueryElement
                        .animate({ left: -3000 }, 500, 'linear', function () {
                        $(this).hide().css('left', '0'); //local this
                    });
                    ;
                }
            }
        };
        ko.bindingHandlers.slideAlert = {
            init(element, valueAccessor, allBindings, viewModel, bindingContext) {
                $(element).slideDown(400);
                //auto remove success messages after 3 seconds
                if (viewModel.Type === 'alert-success') {
                    setTimeout(() => {
                        $(element).slideUp(400);
                        bindingContext.$root.Alerts.remove(viewModel);
                    }, 3000);
                }
            }
        };
        ko.bindingHandlers.href = {
            update(element, valueAccessor, allBindings, viewModel, bindingContext) {
                ko.bindingHandlers.attr.update(element, () => {
                    return { href: valueAccessor() };
                }, allBindings, viewModel, bindingContext);
            }
        };
        ko.bindingHandlers.datetime = {
            update: function (element, valueAccessor, allBindingsAccessor, viewModel) {
                var value = valueAccessor();
                var allBindings = allBindingsAccessor();
                var valueUnwrapped = ko.utils.unwrapObservable(value);
                // Date formats: http://momentjs.com/docs/#/displaying/format/
                var elementFormat = $(element).attr('data-format');
                var pattern = elementFormat || allBindings.format || 'MM/DD/YYYY';
                var output = '';
                if (valueUnwrapped !== null && valueUnwrapped !== undefined && valueUnwrapped.length > 0) {
                    if (valueUnwrapped.indexOf('Z') == valueUnwrapped.length - 1) { //by default momentjs converts UTC to local and we want it to stay UTC if selected
                        output = moment.utc(valueUnwrapped).format(pattern);
                    }
                    else {
                        output = moment(valueUnwrapped).format(pattern);
                    }
                }
                if ($(element).is('input') === true) {
                    $(element).val(output);
                }
                else {
                    $(element).text(output);
                }
            }
        };
        ko.bindingHandlers.time = {
            update: function (element, valueAccessor, allBindingsAccessor, viewModel) {
                var value = valueAccessor();
                var allBindings = allBindingsAccessor();
                var valueUnwrapped = ko.utils.unwrapObservable(value);
                // Date formats: http://momentjs.com/docs/#/displaying/format/
                var elementFormat = $(element).attr('data-format');
                var pattern = elementFormat || allBindings.format || 'H:mm a';
                var output = '';
                if (valueUnwrapped !== null && valueUnwrapped !== undefined && valueUnwrapped.length > 0) {
                    if (valueUnwrapped.indexOf('Z') == valueUnwrapped.length - 1) { //by default momentjs converts UTC to local and we want it to stay UTC if selected
                        output = moment.utc(valueUnwrapped).format(pattern);
                    }
                    else {
                        output = moment(valueUnwrapped).format(pattern);
                    }
                }
                if ($(element).is('input') === true) {
                    $(element).val(output);
                }
                else {
                    $(element).text(output);
                }
            }
        };
        ko.bindingHandlers.summernote = {
            init(element, valueAccessor, allBindings, viewModel, bindingContext) {
                var valueBinding = valueAccessor();
                var $element = $(element);
                var updateObservable = () => viewModel[valueBinding]($element.code());
                $element.summernote({
                    height: 600,
                    onblur: updateObservable
                });
                $element.code(viewModel[valueBinding]());
                // replace script tags so they're not executed when loaded in admin
                var codeToReplace = $element.code();
                codeToReplace = codeToReplace.replace('<script', '<!--<script');
                codeToReplace = codeToReplace.replace('</script>', '</script>-->');
                $element.code(codeToReplace);
                viewModel[valueBinding].subscribe(newValue => {
                    $element.code(viewModel[valueBinding]());
                });
            }
        };
    }
}
module.exports = KoBindingExtensions;

},{"jquery":109,"knockout":111}],9:[function(require,module,exports){
"use strict";
const ko = require("knockout");
const $ = require("jquery");
const select2 = require("select2");
const _ = require("underscore");
$['select2'] = select2;
class KoBindingSelect2 {
    addBinding() { ko.bindingHandlers.select2helper = this; }
    init(element, valueAccessor, allBindings, viewModel, bindingContext) {
        /*Inital Setup*/
        ko.utils.domNodeDisposal.addDisposeCallback(element, () => {
            $(element).select2('destroy');
        });
        var boundObservable = valueAccessor();
        var isBoundToArray = KoBindingSelect2.isObservableArray(boundObservable);
        var select2HelperSourceName = allBindings().select2HelperSourceName;
        var oDataAjaxSource = allBindings().select2HelperODataAjaxSource;
        var isReferenceType = allBindings().select2HelperReference;
        var customSelectionFormat = allBindings().select2HelperFormatSelection;
        var customResultFormat = allBindings().select2HelperFormatResult;
        var placeholderText = allBindings().select2PlaceholderText;
        var allowClear = allBindings().select2AllowClear;
        var oDataSort = allBindings().select2HelperODataSort;
        var optionsSupplied = true;
        //select2 options
        var data = {};
        data.formatSelection = customSelectionFormat ? KoBindingSelect2.getNestedProperty(customSelectionFormat, bindingContext.$root) : KoBindingSelect2.formatSelection;
        data.formatResult = customResultFormat ? KoBindingSelect2.getNestedProperty(customResultFormat, bindingContext.$root) : KoBindingSelect2.formatResult;
        data.id = KoBindingSelect2.formatId;
        data.matcher = KoBindingSelect2.matcher;
        data.multiple = isBoundToArray;
        data.dropdownAutoWidth = true;
        data.placeholder = placeholderText ? placeholderText : '';
        data.allowClear = allowClear ? allowClear : true;
        var initValue = null;
        if (!isBoundToArray) {
            if (isReferenceType) {
                var value = ko.toJS(boundObservable);
                if (value)
                    initValue = value;
            }
            else {
                initValue = ko.toJS(boundObservable);
            }
        }
        //setup source for options
        if (select2HelperSourceName) { //using array on view model
            var sourceList = KoBindingSelect2.getNestedProperty(select2HelperSourceName, bindingContext.$root);
            data.data = () => {
                return { results: ko.utils.unwrapObservable(sourceList) };
            };
        }
        else if (oDataAjaxSource) { //using ajax
            data.initSelection = (element, callback) => {
                callback(ko.toJS(boundObservable));
            };
            var pageSize = 30;
            data.ajax = {
                url: oDataAjaxSource,
                dataType: 'json',
                data(term, page) {
                    return {
                        $inlinecount: 'allpages',
                        $orderby: oDataSort ? oDataSort : "Name",
                        $top: pageSize,
                        $skip: (page == undefined || page < 1) ? 0 : (page - 1) * pageSize,
                        SearchTerm: term == undefined ? '' : term
                    };
                },
                results(resultData, page) {
                    var more = (page * pageSize) < resultData.PageInfo.TotalItemCount;
                    return { results: resultData.List, more: more };
                }
            };
        }
        else {
            //no valid source specified
            optionsSupplied = false;
        }
        if (optionsSupplied) {
            $(element).select2(data);
            /*Initial value*/
            if (initValue) {
                $(element).select2('val', initValue);
            }
            /*Jquery Updates*/
            $(element).on('change', (event) => {
                if (event.added) {
                    //update observable depending on if it is an array or property
                    var newValue = ko.utils.unwrapObservable(event.added);
                    ;
                    if (isReferenceType) {
                        if (!isBoundToArray) {
                            boundObservable(newValue);
                        }
                        else {
                            boundObservable.push(newValue);
                        }
                    }
                    else {
                        if (!isBoundToArray) {
                            boundObservable(newValue.Id);
                        }
                        else {
                            boundObservable.push(newValue.Id);
                        }
                    }
                }
                //if removing and bound to array we have to call remove on observable array
                if (event.removed && isBoundToArray) {
                    var removedValue = ko.utils.unwrapObservable(event.removed);
                    ;
                    //find the item with matchin id and remove
                    boundObservable.remove(item => {
                        var id = isReferenceType ? item.Id : item;
                        var itemId = ko.utils.unwrapObservable(id);
                        var removedValueId = ko.utils.unwrapObservable(removedValue.Id);
                        return itemId === removedValueId;
                    });
                }
            });
            $(element).on("select2-removed", function (event) {
                if (!isBoundToArray) {
                    boundObservable(null);
                }
            });
            /*observable updates*/
            boundObservable.subscribe(newValue => {
                newValue = ko.toJS(newValue);
                if (isBoundToArray) {
                    if (newValue.length === 0)
                        $(element).select2('val', null);
                    else {
                        var plucked = _.pluck(newValue, 'Id');
                        $(element).select2('val', plucked);
                    }
                }
                else {
                    if (isReferenceType) {
                        $(element).select2('data', newValue);
                    }
                    else {
                        $(element).select2('val', newValue);
                    }
                }
            });
        }
    }
    static isObservableArray(boundObservable) {
        return (boundObservable() instanceof Array);
    }
    static formatSelection(item) {
        return ko.utils.unwrapObservable(item.Name);
    }
    static formatResult(item) {
        return ko.utils.unwrapObservable(item.Name);
    }
    static formatId(item) {
        if (item)
            return ko.utils.unwrapObservable(item.Id);
    }
    static matcher(term, text, option) {
        var name = ko.utils.unwrapObservable(option.Name);
        return name.toUpperCase().indexOf(term.toUpperCase()) >= 0;
    }
    static getNestedProperty(propertyString, parentObject) {
        var parts = propertyString.split('.');
        for (var i = 0, size = parts.length; i < size; i++) {
            parentObject = parentObject[parts[i]];
        }
        return parentObject;
    }
}
module.exports = KoBindingSelect2;

},{"jquery":109,"knockout":111,"select2":94,"underscore":113}],10:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const Sammy = require("sammy");
const _ = require("underscore");
class Router {
    constructor(data, vm, alternateroutes) {
        this.data = data;
        this.vm = vm;
        if (alternateroutes) {
            this.routes = alternateroutes;
        }
        else {
            this.routes = this.getRoutes();
            // add i regex flag for case insensitive routes
            for (var i = 0; i < this.routes.length; i++) {
                if (this.routes[i].convertToRegEx && this.routes[i].name.constructor !== RegExp) {
                    this.routes[i].name = new RegExp(this.routes[i].name.toString(), 'i');
                }
            }
        }
        this.setupBindigs();
        this.initRoutes();
    }
    getRoutes() {
        var self = this;
        return [
            {
                name: new RegExp(`${self.getArea()}/${self.data.Title}#/list`),
                func: () => {
                    self.vm.form.cancel();
                    self.vm.table.load();
                },
                convertToRegEx: true
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/new`,
                func() {
                    self.vm.form.add();
                },
                convertToRegEx: true
            },
            {
                //name: /\#\/view\/(.*)/i,
                name: `${self.getArea()}/${self.data.Title}#/view/:id`,
                func() {
                    var id = this.params['id'];
                    self.vm.form.getDetail(id);
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/index`,
                func() {
                    self.vm.form.getDetail(null);
                },
                convertToRegEx: true
            }
        ];
    }
    setupBindigs() {
        var self = this;
        //#add show call new route
        $('#admin-button-container').on('click', '#add', () => {
            this.add();
            return false;
        });
        //#cancel show back
        $('.main-modal-form').on('click', '.dialog-close', () => {
            this.goBack();
            return false;
        });
    }
    initRoutes() {
        var app = Sammy('body', sammy => {
            //pass error 
            sammy.raise_errors = true;
            //register all routes (this allows us to add to them from derived class)
            _.each(this.routes, v => {
                sammy.get(v.name, v.func);
            });
            //keep track of last route
            sammy.before((route) => {
                this.lastRoute = this.currentRoute;
                this.currentRoute = route;
            });
        });
        $(() => {
            //go to default route
            app.run(this.getArea() + '/' + this.vm.Title().toLowerCase() + '#/' + this.vm.DefaultSammyRoute());
        });
    }
    getArea() {
        var area = '';
        if (this.vm.Area()) {
            area = '/' + this.vm.Area();
        }
        return area;
    }
    //go to previous route or default route if undefined
    goBack() {
        window.location.hash = `#/list`;
    }
    add() {
        window.location.hash = '#/new';
    }
    view(id) {
        window.location.hash = '#/view/' + id;
    }
}
module.exports = Router;

},{"jquery":109,"sammy":93,"underscore":113}],11:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
const komapping = require("knockout.mapping");
ko.mapping = komapping;
const _ = require("underscore");
class Table {
    constructor(data, vm) {
        this.data = data;
        this.vm = vm;
        this.oDataUrl = `/api/${data.Title}`;
        this.defaultSort = "CreatedDate desc";
        this.orderby = this.defaultSort;
        this.sortBy = new Array();
        this.setupSubscriptions();
        this.setupBindings();
    }
    //loads ajax data into table
    loadResponse(responsedata) {
        //clear the list
        this.vm.List.removeAll();
        //add the new items
        _.each(responsedata.List, (v) => {
            this.vm.List.push(v);
        });
        //reload page info
        ko.mapping.fromJS(responsedata.PageInfo, {}, this.vm.PageInfo);
    }
    //subscribes to observables
    setupSubscriptions() {
        //page number
        this.vm.PageInfo.PageNumber.subscribe(() => {
            this.load();
        });
        //page size
        this.vm.PageInfo.PageSize.subscribe((newValue) => {
            this.somethingChanged();
        });
        //filters values
        _.each(this.vm.Filters, (v) => {
            v.subscribe(() => {
                this.somethingChanged();
            });
        });
    }
    somethingChanged() {
        if (this.vm.PageInfo.PageNumber() === 1)
            this.load();
        this.vm.PageInfo.PageNumber(1);
    }
    setupBindings() {
        //add click handlers to the column-headings
        var self = this;
        // click - column headers
        $(".table-holder-" + this.data.Title).on("click", ".column-heading", function () {
            var data = ko.dataFor(this); //'this' is local
            var isUp = data.IsSortedUp();
            var isDown = data.IsSortedDown();
            //neither -> up
            if (!isUp && !isDown) {
                data.IsSortedUp(true);
                //add column asc to array + remove other variants of this column
                self.sortBy.push(data.SortColumn() + " asc");
                self.sortBy = _.without(self.sortBy, data.SortColumn() + " desc");
                // remove default sort if it's not the same sort we just invoked
                if (self.defaultSort !== data.SortColumn() + " asc")
                    self.sortBy = _.without(self.sortBy, self.defaultSort);
            }
            //up -> down
            else if (isUp) {
                data.IsSortedUp(false);
                data.IsSortedDown(true);
                //add column desc to array + remove other variants of this column
                self.sortBy.push(data.SortColumn() + " desc");
                self.sortBy = _.without(self.sortBy, data.SortColumn() + " asc");
                // remove default sort if it's not the same sort we just invoked
                if (self.defaultSort !== data.SortColumn() + " desc")
                    self.sortBy = _.without(self.sortBy, self.defaultSort);
            }
            //down -> neither
            else {
                data.IsSortedUp(false);
                data.IsSortedDown(false);
                //remove all variants of this column
                self.sortBy = _.without(self.sortBy, data.SortColumn() + " desc");
                self.sortBy = _.without(self.sortBy, data.SortColumn() + " asc");
                self.sortBy = _.without(self.sortBy, self.defaultSort);
            }
            //if no sort add default
            if (self.sortBy.length === 0)
                self.sortBy.push(self.defaultSort);
            self.orderby = self.sortBy.join(", ");
            self.load();
            return false;
        });
        // click - paging controls
        $(".pagination-container-" + this.data.Title + " .pagination").on("click", "a, button", function () {
            var aLink = this;
            var vm = ko.dataFor(this);
            if ($(aLink).parent().hasClass("disabled") === false) {
                var aText = $(aLink).text().toLowerCase();
                var pageNumber = vm.PageInfo.PageNumber();
                if (aText.indexOf("first") > -1) {
                    pageNumber = 1;
                }
                else if (aText.indexOf("prev") > -1 || $(aLink).hasClass('prev')) {
                    pageNumber = pageNumber - 1;
                }
                else if (aText.indexOf("next") > -1 || $(aLink).hasClass('next')) {
                    pageNumber = pageNumber + 1;
                }
                else if (aText.indexOf("last") > -1) {
                    pageNumber = self.vm.PageInfo.PageCount();
                }
                else { //numbers
                    pageNumber = parseInt(aText);
                }
                vm.PageInfo.PageNumber(pageNumber);
            }
            //self.load();
            return false;
        });
    }
    //clears sorts on all columns except ones named
    clearSortColumns(dotNotClearColumnName) {
        _.each(this.vm.Columns(), (v) => {
            if (v.ColumnName() !== dotNotClearColumnName) {
                v.IsSortedUp(false);
                v.IsSortedDown(false);
            }
        });
    }
    top() {
        return (this.vm.PageInfo.PageSize());
    }
    skip() {
        return (this.vm.PageInfo.PageNumber() - 1) * this.top();
    }
    //sends ajax call for data 
    load() {
        this.vm.form.isDeleting = false;
        $('#loading').height($(window).height());
        this.vm.IsLoading(true);
        //format the request
        var requestData = {
            $inlinecount: "allpages",
            $orderby: this.orderby,
            $top: this.top(),
            $skip: this.skip()
        };
        //add in filters
        $.extend(requestData, ko.toJS(this.vm.Filters));
        //make the request
        var response = $.ajax({
            url: this.oDataUrl,
            dataType: "json",
            cache: false,
            data: requestData
        });
        //handle successful response
        response.done(responsedata => {
            this.loadResponse(responsedata);
            this.vm.IsLoading(false);
        });
        return response;
    }
}
module.exports = Table;

},{"jquery":109,"knockout":111,"knockout.mapping":110,"underscore":113}],12:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const $ = require("jquery");
window['$'] = $;
const ko = require("knockout");
const komapping = require("knockout.mapping");
ko.mapping = komapping;
window['ko'] = ko; //for console debugging
const koextensions = require("./KoBindingExtensions");
new koextensions().register();
const koselect2 = require("./KoBindingSelect2");
new koselect2().addBinding();
const mommentDatetimeKo = require("moment-datepicker-ko");
mommentDatetimeKo;
const mommentDatetime = require("moment-datepicker");
mommentDatetime;
const bootstrap = require("bootstrap");
bootstrap;
class VmBase {
    constructor(data, formType, tableType, routerType) {
        this.data = data;
        ko.mapping.fromJS(data, data.KOMapping, this);
        this.setupBindings();
        //save copy of what a empty item looks like for creating after editing
        this.NewItemDetail = ko.mapping.toJS(this.ItemDetail);
        if (formType !== null)
            this.form = new formType(data, this);
        if (tableType !== null)
            this.table = new tableType(data, this);
        if (routerType !== null)
            this.routes = new routerType(data, this);
    }
    setupBindings() {
        var self = this;
        $('.alerts-holder').on('click', '.close', function () {
            var data = ko.dataFor(this); //local this
            self.Alerts.remove(data);
        });
        $('body').on('click', '.main-hamburger', function () {
            $("#wrapper").toggleClass("toggled");
        });
        //$('body').on('click', function () {
        //    $("#wrapper").removeClass("toggled");
        //})
    }
    AddAlert(message, alertType) {
        var css = 'alert-warning';
        if (alertType === 'info')
            css = 'alert-info';
        if (alertType === 'error')
            css = 'alert-danger';
        if (alertType === 'success')
            css = 'alert-success';
        this.Alerts.push({
            Message: message,
            Type: css,
            IsVisible: ko.observable(true)
        });
    }
}
exports.VmBase = VmBase;

},{"./KoBindingExtensions":8,"./KoBindingSelect2":9,"bootstrap":96,"jquery":109,"knockout":111,"knockout.mapping":110,"moment-datepicker":92,"moment-datepicker-ko":91}],13:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
const Table = require("../Base/Table");
const Router = require("../Base/Router");
const Form = require("../Base/Form");
class CallToAction extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, Form, Table, Router);
        this.data = data;
        ko.applyBindings(this);
        $('.hideUnbound').removeClass('hideUnbound');
    }
}
module.exports = CallToAction;

},{"../Base/Form":7,"../Base/Router":10,"../Base/Table":11,"../Base/VMBase":12,"jquery":109,"knockout":111}],14:[function(require,module,exports){
"use strict";
const $ = require("jquery");
/**
 * Modal that can be used anywhere.
 * @param  {String}  modalName  Name of the modal
 */
class Modal {
    constructor(modalName) {
        this.name = modalName;
        this.visible = false;
        this.$trigger = $('[data-modal-trigger="' + modalName + '"]');
        this.$modal = $('[data-modal="' + modalName + '"]');
    }
    /**
     * Init function for an indivual modal - Sets up click actions.
     */
    init() {
        var modal = this;
        if ($('[data-modal-overlay]').length < 1) {
            $('.wrapper, .modal-body').after('<div class="modal-overlay" data-modal-overlay data-state="hidden"></div>');
            $('[data-modal-overlay], [data-modal-close]').on('click', function (event) {
                event.preventDefault();
                modal.close();
            });
        }
        this.$modal.attr('data-state', 'hidden');
        //this.$trigger.on('click', function (event) {
        //    event.preventDefault();
        //    modal.open();
        //});
    }
    /**
     * Function to open this Modal
     */
    open(id) {
        this.eventId = id;
        var $overlay = $('[data-modal-overlay]').first();
        // var $clone = this.$modal.clone().attr('data-state', 'visible');
        this.$modal.attr('data-state', 'visible');
        $overlay.attr('data-state', 'visible');
        this.visible = true;
    }
    /**
     * Function to Close this Modal
     */
    close() {
        var $overlay = $('[data-modal-overlay]').first();
        this.$modal.attr('data-state', 'hidden');
        $overlay.attr('data-state', 'hidden');
        this.visible = false;
    }
}
module.exports = Modal;

},{"jquery":109}],15:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
const Table = require("../Base/Table");
const ConnectRouter = require("./ConnectRouter");
const ConnectForm = require("./ConnectForm");
const Modal = require("../Common/Modal");
class Connect extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, ConnectForm, Table, ConnectRouter);
        this.data = data;
        this.modal = new Modal("unsubscribe");
        this.modal.init();
        this.OriginalEmail = ko.observable('');
        $('.modalform-holder').on('click', '#save-connect', () => {
            var promise = this.form.post();
            promise.done((data) => {
                window.location.href = "/ConnectUs#/thankyou";
            });
            return false;
        });
        $('.modalform-holder').on('click', '#update-connect', () => {
            console.log('update');
            var promise = this.form.post();
            promise.done((data) => {
                window.location.href = "/connectus#/thankyou";
            });
            return false;
        });
        $('.modalform-holder').on('click', '#save-connect-standalone', () => {
            var promise = this.form.post();
            promise.done((data) => {
                window.location.href = "/ConnectUs/StandAlone#/thankyou";
            });
            return false;
        });
        $('.modalform-holder').on('click', '#unsubscribe', () => {
            var promise = this.form.unsubscribe();
            promise.done((data) => {
                this.modal.close();
                window.location.href = "/connectus#/unsubscribed";
            });
            promise.fail((error) => this.form.postPromiseFail(error));
            return false;
        });
        $('.modalform-holder').keypress(function (e) {
            var key = e.which;
            if (key === 13) // the enter key code
             {
                $('#save-connect').click();
                return false;
            }
        });
        $('.modalform-holder').on('click', '#unsubscribe-modal', () => {
            this.modal.open('unsubscribe');
            return false;
        });
        ko.applyBindings(this);
        $('.hideUnbound').removeClass('hideUnbound');
    }
}
module.exports = Connect;

},{"../Base/Table":11,"../Base/VMBase":12,"../Common/Modal":14,"./ConnectForm":16,"./ConnectRouter":17,"jquery":109,"knockout":111}],16:[function(require,module,exports){
"use strict";
const Form = require("../Base/Form");
class ConnectForm extends Form {
    constructor(data, vm, editAction = 'Edit') {
        super(data, vm, editAction);
        this.data = data;
        this.vm = vm;
        this.editAction = editAction;
        $('#EmailOptIn').on('click', () => {
            if (vm.ItemDetail.Email() === null || vm.ItemDetail.Email().length === 0) {
                vm.ItemDetail.Email('none');
                vm.ItemDetail.Email('');
            }
            if (vm.ItemDetail.ConfirmEmail() === null || vm.ItemDetail.ConfirmEmail().length === 0) {
                vm.ItemDetail.ConfirmEmail('none');
                vm.ItemDetail.ConfirmEmail('');
            }
            this.removeErrors();
        });
        $('#SmsOptIn').on('click', () => {
            if (vm.ItemDetail.Phone() === null || vm.ItemDetail.Phone().length === 0) {
                vm.ItemDetail.Phone('none');
                vm.ItemDetail.Phone('');
            }
            this.removeErrors();
        });
    }
    promiseDone(data, id) {
        super.getPromiseDone(data, id);
        window.location.href = data.ReturnUrl;
    }
    removeErrors() {
        $('#ItemDetail_EmailOptIn').text('');
        $('#ItemDetail_EmailOptIn').removeClass('label').removeClass('label-danger');
        $('#ItemDetail_EmailOptIn').parent().removeClass('has-error').removeClass('has-feedback');
        $('#ItemDetail_SmsOptIn').text('');
        $('#ItemDetail_SmsOptIn').removeClass('label').removeClass('label-danger');
        $('#ItemDetail_SmsOptIn').parent().removeClass('has-error').removeClass('has-feedback');
    }
    unsubscribe() {
        var mapping = {
            'ignore': this.vm.data.KOMapping.allNonPostBack
        };
        var postData = ko.mapping.toJS(this.vm, mapping);
        var promise = $.ajax({
            url: '/connectus/unsubscribe',
            data: JSON.stringify(postData),
            type: 'POST',
            cache: false,
            contentType: 'application/json;charset=utf-8',
        });
        return promise;
    }
    getSubscriber(id) {
        var promise = $.ajax({
            url: '/connectus/subscriber?id=' + encodeURIComponent(id),
            type: 'GET',
            cache: false
        });
        promise.done((data) => this.refreshFields(data));
        return promise;
    }
    refreshFields(data) {
        this.vm.ItemDetail.FirstName(data.ItemDetail.FirstName);
        this.vm.ItemDetail.LastName(data.ItemDetail.LastName);
        this.vm.ItemDetail.Email(data.ItemDetail.Email);
        this.vm.ItemDetail.ConfirmEmail(data.ItemDetail.ConfirmEmail);
        this.vm.ItemDetail.Zip(data.ItemDetail.Zip);
        this.vm.ItemDetail.BirthdayDay(data.ItemDetail.BirthdayDay);
        this.vm.ItemDetail.BirthdayMonth(data.ItemDetail.BirthdayMonth);
        this.vm.ItemDetail.UniqueId(data.ItemDetail.UniqueId);
        this.vm.ItemDetail.EmailOptIn(true);
        this.vm.OriginalEmail(data.ItemDetail.Email);
    }
}
module.exports = ConnectForm;

},{"../Base/Form":7}],17:[function(require,module,exports){
"use strict";
const Router = require("../Base/Router");
class ConnectRouter extends Router {
    constructor(data, vm, alternateroutes) {
        super(data, vm, alternateroutes);
        this.data = data;
        this.vm = vm;
    }
    getRoutes() {
        var self;
        self = this;
        return [
            {
                name: `/ConnectUs#/new`,
                func() {
                    self.vm.form.add();
                    self.vm.ShowThankYou(false);
                    self.vm.ShowUnsubscribed(false);
                    self.vm.IsUpdate(false);
                },
                convertToRegEx: true
            },
            {
                name: `/ConnectUs#/thankyou`,
                func() {
                    self.vm.ShowThankYou(true);
                    self.vm.ShowUnsubscribed(false);
                    self.vm.IsUpdate(false);
                },
                convertToRegEx: true
            },
            {
                name: `/Connect/StandAlone#/new`,
                func() {
                    self.vm.form.add();
                    self.vm.ShowThankYou(false);
                    self.vm.ShowUnsubscribed(false);
                    self.vm.IsUpdate(false);
                },
                convertToRegEx: true
            },
            {
                name: `/Connect/StandAlone#/thankyou`,
                func() {
                    self.vm.ShowThankYou(true);
                    self.vm.ShowUnsubscribed(false);
                    self.vm.IsUpdate(false);
                },
                convertToRegEx: true
            },
            {
                name: `/ConnectUs#/profile`,
                func() {
                    var id = this.params.uid;
                    var promise = self.vm.form.getSubscriber(id);
                    promise.done(() => self.vm.IsUpdate(true));
                    promise.fail(() => {
                        window.location.href = "/connectus#/new";
                    });
                    self.vm.form.add();
                    self.vm.ShowThankYou(false);
                },
                convertToRegEx: true
            },
            {
                name: `/connectus#/unsubscribed`,
                func() {
                    self.vm.ShowThankYou(false);
                    self.vm.ShowUnsubscribed(true);
                    self.vm.IsUpdate(false);
                },
                convertToRegEx: true
            },
        ];
    }
}
module.exports = ConnectRouter;

},{"../Base/Router":10}],18:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
const Table = require("../Base/Table");
const Form = require("../Base/Form");
const ContactUsRouter = require("./ContactUsRouter");
const _ = require("underscore");
const Store = require("../Store/Store");
class ContactUs extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, Form, Table, ContactUsRouter);
        this.data = data;
        //setup table, routes and form
        var self = this;
        //reuse the store vm for store search
        this.storeVm = new Store(data.StoreViewModel, false);
        this.ItemDetail.StoreState.subscribe((newValue) => {
            if (newValue !== 'undefined' && newValue != null) {
                this.StoreCities.removeAll();
                $.ajax({
                    url: '/api/Store/GetStoreCitiesByState?state=' + newValue,
                    success: function (data) {
                        _.each(data, (v) => {
                            self.StoreCities.push(v);
                        });
                    }
                });
            }
        });
        this.ItemDetail.StoreCity.subscribe((newValue) => {
            if (newValue !== 'undefined' && newValue != null) {
                this.StoreAddresses.removeAll();
                $.ajax({
                    url: '/api/Store/GetStoresByStateAndCity?state=' + this.ItemDetail.StoreState() + '&city=' + newValue,
                    success: function (data) {
                        _.each(data, (v) => {
                            self.StoreAddresses.push(v);
                        });
                    }
                });
            }
        });
        $('.modalform-holder').on('click', '#save-contact', () => {
            $('#ItemDetail_RequireResponse').text('');
            $('#ItemDetail_RequireResponse').removeClass('label').removeClass('label-danger');
            $('#ItemDetail_RequireResponse').parent().removeClass('has-error').removeClass('has-feedback');
            var promise = this.form.post();
            promise.done(() => {
                window.location.href = "/ContactUs#/thankyou";
            });
            return false;
        });
        ko.applyBindings(this);
        $(".hideUnbound").removeClass("hideUnbound");
        //$('#ItemDetail_PurchaseDate').val('mm/dd/yyyy');
    }
}
module.exports = ContactUs;

},{"../Base/Form":7,"../Base/Table":11,"../Base/VMBase":12,"../Store/Store":78,"./ContactUsRouter":19,"jquery":109,"knockout":111,"underscore":113}],19:[function(require,module,exports){
"use strict";
const Router = require("../Base/Router");
class ContactUsRouter extends Router {
    constructor(data, vm, alternateroutes) {
        super(data, vm, alternateroutes);
        this.data = data;
        this.vm = vm;
    }
    getRoutes() {
        var self;
        self = this;
        return [
            {
                name: '/ContactUs#/new',
                func() {
                    var origin = this.params.platform;
                    self.vm.form.add();
                    if (origin != '') {
                        self.vm.ItemDetail.Origin(origin);
                    }
                    self.vm.ShowThankYou(false);
                },
                convertToRegEx: true
            },
            {
                name: '/ContactUs#/thankyou',
                func() {
                    self.vm.ShowThankYou(true);
                },
                convertToRegEx: true
            }
        ];
    }
}
module.exports = ContactUsRouter;

},{"../Base/Router":10}],20:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
const Table = require("../Base/Table");
const ContactRouter = require("./ContactRouter");
const Form = require("../Base/Form");
class Contact extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, Form, Table, ContactRouter);
        this.data = data;
        ko.applyBindings(this);
        $('.hideUnbound').removeClass('hideUnbound');
    }
}
module.exports = Contact;

},{"../Base/Form":7,"../Base/Table":11,"../Base/VMBase":12,"./ContactRouter":21,"jquery":109,"knockout":111}],21:[function(require,module,exports){
"use strict";
const Router = require("../Base/Router");
class ContactRouter extends Router {
    constructor(data, vm, alternateroutes) {
        super(data, vm, alternateroutes);
        this.data = data;
        this.vm = vm;
    }
    getRoutes() {
        var self;
        self = this;
        return [
            {
                name: `${self.getArea()}/${self.data.Title}#/list`,
                func: () => {
                    self.vm.form.cancel();
                    self.vm.table.load();
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/new`,
                func() {
                    self.vm.form.add();
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/view/:id`,
                func() {
                    var id = this.params['id'];
                    self.vm.form.getDetail(id);
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/index`,
                func() {
                    self.vm.form.getDetail(null);
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/delete/:id`,
                func() {
                    var id = this.params['id'];
                    self.vm.form.deleteItem(id);
                },
                convertToRegEx: false
            }
        ];
    }
}
module.exports = ContactRouter;

},{"../Base/Router":10}],22:[function(require,module,exports){
"use strict";
/// This code was generated by Orange Onion Scaffolder.
// template: MVC.JSModule.cs
// class: ContentPageTreeView
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
const Table = require("../Base/Table");
const Router = require("../Base/Router");
const Form = require("../Base/Form");
class ContentPageTreeView extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, Form, Table, Router);
        this.data = data;
        ko.applyBindings(this);
        $('.hideUnbound').removeClass('hideUnbound');
    }
}
module.exports = ContentPageTreeView;

},{"../Base/Form":7,"../Base/Router":10,"../Base/Table":11,"../Base/VMBase":12,"jquery":109,"knockout":111}],23:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
const ContentPageForm = require("./ContentPageForm");
const Table = require("../Base/Table");
const PageBase = require("./ContentPageBase");
const ContentPageRouter = require("./ContentPageRouter");
class ContentPage extends PageBase {
    constructor(data, applyBindings = true) {
        //call base class constructor
        super(data, ContentPageForm, Table, ContentPageRouter);
        this.data = data;
        if (applyBindings) {
            ko.applyBindings(this);
            $('.hideUnbound').removeClass('hideUnbound');
        }
    }
}
module.exports = ContentPage;

},{"../Base/Table":11,"./ContentPageBase":24,"./ContentPageForm":25,"./ContentPageRouter":26,"jquery":109,"knockout":111}],24:[function(require,module,exports){
"use strict";
const base = require("../Base/VMBase");
class ContentPageBase extends base.VmBase {
    constructor(data, formType, tableType, routerType) {
        super(data, formType, tableType, routerType);
        this.data = data;
    }
}
module.exports = ContentPageBase;

},{"../Base/VMBase":12}],25:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
const _ = require("underscore");
const Form = require("../Base/Form");
const moment = require("moment");
const summernote = require("summernote");
summernote;
class ContentPageForm extends Form {
    constructor(data, vm) {
        super(data, vm);
        this.data = data;
        this.vm = vm;
        this.versionErrorKey = 'CF1B6183-8A11-449F-8C4B-D1AE13B7DE0F';
        this.newPageName = ko.observable('');
        this.newPageName.subscribe((newValue) => {
            this.vm.NewItemDetail.Name(newValue);
        });
        this.addItemDetailClientOnlyProperties();
    }
    setupTabs() {
        $(this.tabRowSelector + ' h2').hide();
        //create a knockoutobservable foreach h2 inside a row
        $(this.tabRowSelector + ' h2').each((index, value) => {
            var element = $(value);
            var attr = 'visible: $root.ActiveTabIndex() === ' + index.toString();
            $(value).parent().parent().attr('data-bind', attr);
            var allLang = this.vm.Meta.AllLanguages;
            var matchingLang = _.findWhere(allLang, { Name: element.html() });
            var newTab = {
                Text: ko.observable(element.html()),
                ErrorCount: ko.observable(0),
                ChangeCount: ko.observable(0),
                Hidden: ko.observable(false),
                Id: null
            };
            if (matchingLang) {
                newTab.Id = matchingLang.Id;
            }
            this.vm.FormTabs.push(newTab);
        });
        this.vm.ActiveTabIndex(0);
    }
    //find the form input based on proprty key
    addPropertyError(propertyError) {
        var key = propertyError.Key, message = propertyError.ErrorMessage;
        var forminput = null;
        if (key.indexOf(this.versionErrorKey) > -1) {
            forminput = this.getVersionFormInput(key);
        }
        else {
            //find matching input
            forminput = $('#' + key.replace(/\./g, '_'));
        }
        this.formInputAddError(forminput, key, message);
    }
    removeError(key) {
        var forminput = null;
        if (key.indexOf(this.versionErrorKey) > -1) {
            forminput = this.getVersionFormInput(key);
        }
        else {
            forminput = $('#' + key.replace(/\./g, '_'));
        }
        this.formInputRemoveError(forminput, key);
    }
    formInputRemoveError(forminput, key) {
        super.formInputRemoveError(forminput, key);
    }
    getVersionFormInput(key) {
        var splitVal = key.split('|');
        var lang = splitVal[1];
        var version = splitVal[2];
        var property = splitVal[3];
        var vm = this.vm;
        //find the tab for the lang and 
        //var tab = _.find(this.vm.FormTabs(), { Id: lang });
        return $('#' + property, '.' + lang + '-tab');
    }
    //protected setupClearValidation(property) {
    //    var vmProperty;
    //    //get property off of vm using string name coming from server
    //    var propertyParts = property.split('.');
    //    var countOfParts = propertyParts.length;
    //    if (countOfParts === 2)
    //        vmProperty = this.vm[propertyParts[0]][propertyParts[1]];
    //    if (countOfParts === 3)
    //        var activeVersion = this.vm[propertyParts[0]][propertyParts[1]];
    //    vmProperty = $('input#Title.form-control');
    //    if (ko.isObservable(vmProperty)) {
    //        var subscription = vmProperty.subscribe((newValue) => {
    //            var forminput;
    //            //property id has _ instead of .
    //            if (countOfParts === 2)
    //                forminput = $('#' + property.replace(/\./g, '_'));
    //            //select2 uses parent
    //            if (forminput.hasClass('select2-offscreen')) {
    //                forminput = $('.select2-container', forminput.parent());
    //            }
    //            //remove error class to parent element
    //            var formGroup = forminput.parent();
    //            formGroup.removeClass('has-error has-feedback');
    //            //remove bootsrap popover
    //            if ((forminput).attr('data-trigger')) {
    //                forminput
    //                    .removeAttr('data-trigger')
    //                    .removeAttr('data-placement')
    //                    .removeAttr('data-content')
    //                    .popover('destroy') //todo bootstrap popover
    //                ;
    //            }
    //            //remove popover element
    //            $('.form-control-feedback', formGroup).remove();
    //            //get rid of subscription
    //            subscription.dispose();
    //            //refresh tabs
    //            this.refreshTabValidationBadges();
    //            //handle span differently
    //            var isSpan = forminput.is('span');
    //            if (isSpan) {
    //                forminput.text('');
    //                forminput.removeClass('label label-danger');
    //            }
    //        });
    //    }
    //}
    setupBindigs() {
        super.setupBindigs();
        var self = this;
        $('.version-tab').on('click', '.activate-version', function () {
            var data = ko.dataFor(this);
            //figure out version
            //make sure current Active_ version is valid (if its not valid we cant navigate away)
            self.vm.ItemDetail['Active_' + data.Language()](data);
            return false;
        });
        $(`.${this.data.Title}-form-body`).on('click', '#confirm-delete', () => {
            this.confirmDelete();
            return false;
        });
        this.addActiveTabLanguageId();
    }
    resetDetail() {
        super.resetDetail();
        this.clearAllVersions();
    }
    sortAllVersions() {
        //todo why does this make objects being sorted observable?
        //this.vm.ItemDetail.AllVersions.sort((version1, version2) => {
        //    if (version1.Date() === version2.Date()) {
        //        return version1.Version() < version2.Version();
        //    }
        //    return version1.Date() < version2.Date();
        //});
    }
    setupLanguageVersions() {
        var maxLanguageVersion = {};
        var self = this;
        this.clearAllLanguageVersions();
        _.each(this.vm.ItemDetail.AllVersions(), (v) => {
            //this needs to pull the parent url to append to the begining if it has a parent
            self.addNewPermalink(v);
            //add to language version array
            var language = v.Language();
            this.addVersionComputed(v);
            var propertyName = `All_${v.Language()}`;
            this.vm.ItemDetail[propertyName].push(v);
            //set max version in temp object
            //if there is no max version for language make it this one
            if (maxLanguageVersion[language] == undefined) {
                maxLanguageVersion[language] = v;
            }
            else {
                //if this one is bigger than the current max make this one the max
                if (v.Version() > maxLanguageVersion[language].Version()) {
                    maxLanguageVersion[language] = v;
                }
            }
        });
        //set max version to observable
        _.each(this.vm.Meta.AllLanguages, (v) => {
            var propertyName = `Active_${v.Id}`;
            if (maxLanguageVersion[v.Id] !== undefined) {
                var activeVersion = this.vm.ItemDetail[propertyName]();
                if (activeVersion === null) {
                    this.vm.ItemDetail[propertyName](maxLanguageVersion[v.Id]);
                }
                else {
                    var lang = v.Id;
                    var version = activeVersion.Version();
                    var activeVersion = _.find(this.vm.ItemDetail[`All_${v.Id}`](), (ver) => (ver.Version() === version && ver.Language() === lang));
                    this.vm.ItemDetail[propertyName](activeVersion);
                }
            }
            propertyName = `MaxVersion_${v.Id}`;
            var x = maxLanguageVersion[v.Id] ?
                maxLanguageVersion[v.Id] :
                ko.mapping.fromJS(ko.toJS(this.vm.NewVersion));
            this.vm.ItemDetail[propertyName](x);
        });
        this.addActiveTabLanguageId();
    }
    clearAllLanguageVersions() {
        _.each(this.vm.Meta.AllLanguages, (v) => {
            var propertyName = `All_${v.Id}`;
            this.vm.ItemDetail[propertyName].removeAll();
        });
    }
    addVersionComputed(version) {
    }
    addActiveTabLanguageId() {
        this.vm.ItemDetail['ActiveTabLanguageId'] = ko.computed(() => {
            if (this.data.Meta.AllLanguages[this.vm.ActiveTabIndex()])
                return this.data.Meta.AllLanguages[this.vm.ActiveTabIndex()].Id;
            return null;
        });
    }
    getNewVersion(language) {
        var maxVersion = this.vm.ItemDetail['MaxVersion_' + language]().Version();
        var newVersion = maxVersion + 1;
        var versionToCreateFrom = this.getVersionToCreateFrom(language);
        var newObservable = ko.mapping.fromJS(ko.toJS(versionToCreateFrom));
        this.addVersionComputed(newObservable);
        newObservable.Id(this.vm.NewVersion.Id());
        var today = moment().format('YYYY-MM-DD[T]') + '00:00:00';
        newObservable.Version(newVersion);
        newObservable.VersionDisplay(language + '-' + newObservable.Version());
        newObservable.Language(language);
        newObservable.Date(today);
        newObservable.StartDateTime = ko.observable(new Date());
        newObservable.Date(today);
        newObservable.ParentContentPage = ko.observable(versionToCreateFrom.ParentContentPage());
        newObservable.IsReadOnly(false);
        newObservable.CreatedBy(this.vm.User.UserName());
        newObservable.CreatedDate(today);
        newObservable.Status(this.vm.NewVersion.Status());
        //newObservable.Status('Draft');
        this.vm.ItemDetail.AllVersions.push(newObservable);
        this.vm.ItemDetail['All_' + language].push(newObservable);
        this.sortAllVersions();
        this.vm.ItemDetail['MaxVersion_' + language](newObservable);
        this.addNewPermalink(newObservable);
        this.vm.ItemDetail['Active_' + language](newObservable);
        return newObservable;
    }
    getVersionToCreateFrom(language) {
        //first see if there is a active version for language
        var versionToCreateFrom = this.vm.ItemDetail['Active_' + language]();
        //check all versions 
        if (versionToCreateFrom === null) {
            versionToCreateFrom = _.max(this.vm.ItemDetail.AllVersions(), function (version) { return version.Version(); });
            if (versionToCreateFrom === -Infinity)
                versionToCreateFrom = null;
        }
        //finally used default new version
        if (versionToCreateFrom === null) {
            versionToCreateFrom = this.vm.NewVersion;
        }
        return versionToCreateFrom;
    }
    //changeStatus(id, status) {
    //    var propertyName = `Active_${id}`;
    //    //keep track of the original status incase the server validation fails
    //    this.vm.ItemDetail[propertyName]().OriginalStatus(this.vm.ItemDetail[propertyName]().Status());
    //    this.vm.ItemDetail[propertyName]().Status(status);
    //    super.post();
    //}
    changeStatus(id, status) {
        var propertyName = `Active_${id}`;
        var oldStatus = this.vm.ItemDetail[propertyName]().Status();
        this.vm.ItemDetail[propertyName]().OriginalStatus(oldStatus);
        this.vm.ItemDetail[propertyName]().Status(status);
        this.vm.ItemDetail.ActiveVersionDisplay(this.vm.ItemDetail[propertyName]().VersionDisplay());
        this.post();
        //var promise = super.post();
        //promise.fail((data) => this.getPromiseFail(data, id));
        //return promise;
    }
    unPublish(id) {
        var propertyName = `Active_${id}`;
        var endTime = moment().format('YYYY-MM-DD[T]') + '00:00:00';
        var startTime = moment().subtract(1, 'days').format('YYYY-MM-DD[T]') + '00:00:00';
        if (this.vm.ItemDetail[propertyName]().StartDateTime() === endTime) {
            this.vm.ItemDetail[propertyName]().StartDateTime(startTime);
        }
        this.vm.ItemDetail[propertyName]().EndDateTime(endTime);
        this.post();
    }
    preview(id) {
        var propertyName = `Active_${id}`;
        this.vm.LeaveOpenOnAjaxSuccess(true);
        var promise = this.post();
        promise.done((data) => {
            var version = this.vm.ItemDetail[propertyName]();
            this.vm.LeaveOpenOnAjaxSuccess(false);
            var url = version.PermalinkDisplay() + '?previewId=' + version.Id() + '&tick=' + Date.now();
            window.open(url, '_blank');
        });
    }
    clearAllVersions() {
        var self = this;
        //create a dynamic active observable for each lang type
        _.each(self.vm.Meta.AllLanguages, (v, i) => {
            var propertyName = 'Active_' + v.Id;
            this.vm.ItemDetail[propertyName](null);
            var propertyName = 'MaxVersion_' + v.Id;
            var maxVersion = ko.mapping.fromJS(ko.toJS(this.vm.NewVersion));
            this.vm.ItemDetail[propertyName](maxVersion);
            var propertyName = 'All_' + v.Id;
            this.vm.ItemDetail[propertyName].removeAll();
        });
    }
    addItemDetailClientOnlyProperties() {
        //create a dynamic active observable for each lang type
        _.each(this.vm.Meta.AllLanguages, (v, i) => {
            //Active
            var activePropertyName = `Active_${v.Id}`;
            this.vm.ItemDetail[activePropertyName] = ko.observable(null);
            //Max
            this.vm.ItemDetail[`MaxVersion_${v.Id}`] = ko.observable(null);
            //All
            var propertyName = `All_${v.Id}`;
            this.vm.ItemDetail[propertyName] = ko.observableArray([]);
        });
    }
    komappingfromdata(data, id) {
        var copyMapping = {
            'copy': this.data.KOMapping.allNonPostBack
        };
        //do not make ParentContentPage child properties observable
        //make the whole ParentContentPage object itself observable
        copyMapping['ParentContentPage'] = { 'create': function (options) {
                return ko.observable(options.data);
            } };
        ko.mapping.fromJS(data.ItemDetail, copyMapping, this.vm.ItemDetail);
    }
    addNewPermalink(v) {
        v.PermalinkDisplay = ko.computed(() => {
            var permalinkDisplay;
            var language = v.Language() + '/';
            if (v.Language() === 'en')
                language = '';
            //if we have a parent get its active node language match and prepend its url 
            if (v.ParentContentPage() !== null) {
                var version = _.find(v.ParentContentPage().ActiveTreeNodes, (node) => (node.Language === v.Language()));
                if (version !== undefined && version !== null) {
                    var url = v.Url() === null ? '' : v.Url();
                    permalinkDisplay = this.data.RootUrl + language + version.Url + '/' + url;
                }
            }
            else {
                var url = v.Url() === null ? '' : v.Url();
                permalinkDisplay = this.data.RootUrl + language + url;
            }
            return permalinkDisplay;
        });
    }
    getPromiseFail(error, id) {
        var propertyName = `Active_${id}`;
        var oldStatus = this.vm.ItemDetail[propertyName]().OriginalStatus();
        this.vm.ItemDetail[propertyName]().Status(oldStatus);
    }
    //getPromiseFail(error, id) {
    //    super.getPromiseFail(error, id);
    //}
    getPromiseDone(data, id) {
        super.getPromiseDone(data, id);
        this.sortAllVersions();
        this.setupLanguageVersions();
    }
    postPromiseDone(data) {
        if (!this.vm.LeaveOpenOnAjaxSuccess()) {
            this.vm.routes.goBack();
            this.resetDetail();
            this.vm.AddAlert(data.Message, 'success');
        }
        else {
            this.mapPostData(data);
        }
        this.vm.IsLoading(false);
    }
    postPromiseFail(error) {
        super.postPromiseFail(error);
        _.each(this.vm.ItemDetail.AllVersions(), function (version) {
            if (version.OriginalStatus()) {
                version.Status(version.OriginalStatus());
                version.OriginalStatus(null);
            }
        });
    }
    getVmProperty(property) {
        if (property.indexOf(this.versionErrorKey) > -1) {
            var splitVal = property.split('|');
            var lang = splitVal[1];
            var version = splitVal[2];
            var property = splitVal[3];
            //var vm = this.vm;
            var errorVersion = _.find(this.vm.ItemDetail.AllVersions(), function (v) { return (v.Version().toString() === version && v.Language() === lang); });
            return errorVersion[property];
        }
        else {
            return super.getVmProperty(property);
        }
    }
    mapPostData(data) {
        super.mapPostData(data);
        this.setupLanguageVersions();
    }
    post() {
        //prevent double post
        if (this.vm.IsLoading()) {
            return;
        }
        //make overlay loading div full height
        $('#loading').height($(window).height());
        this.vm.IsLoading(true);
        var ignoreMapping = {
            'ignore': this.data.KOMapping.allNonPostBack
        };
        var postData = ko.mapping.toJS(this.vm, ignoreMapping);
        $.each(postData.ItemDetail.AllVersions, function (i, v) {
            if (moment.isMoment(v.StartDateTime))
                v.StartDateTime = v.StartDateTime.format("YYYY-MM-DTHH:mm:ss.mmm");
            if (!isNaN(v.EndDateTime)) {
                if (moment.isMoment(v.EndDateTime))
                    v.EndDateTime = v.EndDateTime.format("YYYY-MM-DTHH:mm:ss.mmm");
            }
        });
        postData = JSON.stringify(postData);
        postData = postData.replace('<!--<script', '<script');
        postData = postData.replace('</script>-->', '</script>');
        delete postData.Alerts;
        delete postData.NewVersion;
        var promise = $.ajax({
            url: this.postUrl.toString().toLowerCase(),
            data: postData,
            type: 'POST',
            cache: false,
            contentType: 'application/json;charset=utf-8',
        });
        promise.fail((error) => this.postPromiseFail(error));
        promise.done(data => this.postPromiseDone(data));
        return promise;
    }
}
module.exports = ContentPageForm;

},{"../Base/Form":7,"jquery":109,"knockout":111,"moment":112,"summernote":95,"underscore":113}],26:[function(require,module,exports){
"use strict";
const Router = require("../Base/Router");
class ContentPageRouter extends Router {
    constructor(data, vm, alternateroutes) {
        super(data, vm, alternateroutes);
        this.data = data;
        this.vm = vm;
    }
    getRoutes() {
        var self;
        self = this;
        return [
            {
                name: `${self.getArea()}/${self.data.Title}#/list`,
                func: () => {
                    self.vm.form.cancel();
                    self.vm.table.load();
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/new`,
                func() {
                    self.vm.form.add();
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/view/:id`,
                func() {
                    var id = this.params['id'];
                    self.vm.form.getDetail(id);
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/index`,
                func() {
                    self.vm.form.getDetail(null);
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/delete/:id`,
                func() {
                    var id = this.params['id'];
                    self.vm.form.deleteItem(id);
                },
                convertToRegEx: false
            }
        ];
    }
}
module.exports = ContentPageRouter;

},{"../Base/Router":10}],27:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
const Table = require("../Base/Table");
const Router = require("../Base/Router");
const Form = require("../Base/Form");
class CouponRedemption extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, Form, Table, Router);
        this.data = data;
        ko.applyBindings(this);
        $('.hideUnbound').removeClass('hideUnbound');
    }
}
module.exports = CouponRedemption;

},{"../Base/Form":7,"../Base/Router":10,"../Base/Table":11,"../Base/VMBase":12,"jquery":109,"knockout":111}],28:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
const Table = require("../Base/Table");
const Router = require("../Base/Router");
const Form = require("../Base/Form");
class Coupon extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, Form, Table, Router);
        this.data = data;
        ko.applyBindings(this);
        $(".hideUnbound").removeClass("hideUnbound");
    }
}
module.exports = Coupon;

},{"../Base/Form":7,"../Base/Router":10,"../Base/Table":11,"../Base/VMBase":12,"jquery":109,"knockout":111}],29:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
const Table = require("../Base/Table");
const DashboardVersionRouter = require("./DashboardVersionRouter");
const DashboardVersionForm = require("./DashboardVersionForm");
class DashboardVersion extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, DashboardVersionForm, Table, DashboardVersionRouter);
        this.data = data;
        ko.applyBindings(this);
        $('.hideUnbound').removeClass('hideUnbound');
    }
}
module.exports = DashboardVersion;

},{"../Base/Table":11,"../Base/VMBase":12,"./DashboardVersionForm":30,"./DashboardVersionRouter":31,"jquery":109,"knockout":111}],30:[function(require,module,exports){
"use strict";
const Form = require("../Base/Form");
class DashboardVersionForm extends Form {
    constructor(data, vm, editAction = 'Edit') {
        super(data, vm, editAction);
        this.data = data;
        this.vm = vm;
        this.editAction = editAction;
        $('#ItemDetail_UpgradeRequired').on('click', () => {
            if (vm.ItemDetail.UpgradeRequired() == false) {
                $('#upgrade-required-modal').modal({
                    backdrop: 'static',
                    keyboard: false
                });
            }
            else {
                vm.ItemDetail.UpgradeRequired(false);
                vm.ItemDetail.CurrentVersion(true);
            }
        });
        $('#require-upgrade').on('click', () => {
            vm.ItemDetail.UpgradeRequired(true);
            vm.ItemDetail.CurrentVersion(false);
            $('#upgrade-required-modal').modal('hide');
        });
        $('#require-upgrade-cancel').on('click', () => {
            vm.ItemDetail.UpgradeRequired(false);
            vm.ItemDetail.CurrentVersion(true);
            $('#upgrade-required-modal').modal('hide');
        });
        $('#ItemDetail_CurrentVersion').on('click', () => {
            vm.ItemDetail.UpgradeRequired(false);
        });
    }
}
module.exports = DashboardVersionForm;

},{"../Base/Form":7}],31:[function(require,module,exports){
"use strict";
const Router = require("../Base/Router");
class DashboardVersionRouter extends Router {
    constructor(data, vm, alternateroutes) {
        super(data, vm, alternateroutes);
        this.data = data;
        this.vm = vm;
    }
    getRoutes() {
        var self;
        self = this;
        return [
            {
                name: `${self.getArea()}/${self.data.Title}#/list`,
                func: () => {
                    self.vm.form.cancel();
                    self.vm.table.load();
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/new`,
                func() {
                    self.vm.form.add();
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/view/:id`,
                func() {
                    var id = this.params['id'];
                    self.vm.form.getDetail(id);
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/index`,
                func() {
                    self.vm.form.getDetail(null);
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/delete/:id`,
                func() {
                    var id = this.params['id'];
                    self.vm.form.deleteItem(id);
                },
                convertToRegEx: false
            }
        ];
    }
}
module.exports = DashboardVersionRouter;

},{"../Base/Router":10}],32:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
class Error {
    constructor(data) {
        //call base class constructor
        // super(data, Form, Table, Router);
        this.data = data;
        ko.applyBindings(this);
        $('.hideUnbound').removeClass('hideUnbound');
    }
}
module.exports = Error;

},{"jquery":109,"knockout":111}],33:[function(require,module,exports){
"use strict";
/// This code was generated by Orange Onion Scaffolder.
// template: MVC.JSModule.cs
// class: FeedbackKeywordLog
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
const Table = require("../Base/Table");
const Router = require("../Base/Router");
const Form = require("../Base/Form");
const _ = require("underscore");
class FeedbackKeywordLog extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, Form, Table, Router);
        this.data = data;
        ko.applyBindings(this);
        $('.hideUnbound').removeClass('hideUnbound');
    }
    clearFilters() {
        _.each(this.Filters, (v) => {
            v('');
        });
    }
}
module.exports = FeedbackKeywordLog;

},{"../Base/Form":7,"../Base/Router":10,"../Base/Table":11,"../Base/VMBase":12,"jquery":109,"knockout":111,"underscore":113}],34:[function(require,module,exports){
"use strict";
/// This code was generated by Orange Onion Scaffolder.
// template: MVC.JSModule.cs
// class: FeedbackKeyword
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
const Table = require("../Base/Table");
const Form = require("../Base/Form");
const FeedbackKeywordRouter = require("./FeedbackKeywordRouter");
class FeedbackKeyword extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, Form, Table, FeedbackKeywordRouter);
        this.data = data;
        ko.applyBindings(this);
        $('.hideUnbound').removeClass('hideUnbound');
    }
}
module.exports = FeedbackKeyword;

},{"../Base/Form":7,"../Base/Table":11,"../Base/VMBase":12,"./FeedbackKeywordRouter":35,"jquery":109,"knockout":111}],35:[function(require,module,exports){
"use strict";
const Router = require("../Base/Router");
class FeedbackKeywordRouter extends Router {
    constructor(data, vm, alternateroutes) {
        super(data, vm, alternateroutes);
        this.data = data;
        this.vm = vm;
    }
    getRoutes() {
        var self;
        self = this;
        return [
            {
                name: `${self.getArea()}/${self.data.Title}#/list`,
                func: () => {
                    self.vm.form.cancel();
                    self.vm.table.load();
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/new`,
                func() {
                    self.vm.form.add();
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/view/:id`,
                func() {
                    var id = this.params['id'];
                    self.vm.form.getDetail(id);
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/index`,
                func() {
                    self.vm.form.getDetail(null);
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/delete/:id`,
                func() {
                    var id = this.params['id'];
                    self.vm.form.deleteItem(id);
                },
                convertToRegEx: false
            }
        ];
    }
}
module.exports = FeedbackKeywordRouter;

},{"../Base/Router":10}],36:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
const Table = require("../Base/Table");
const FundraiserBlackoutDateRouter = require("./FundraiserBlackoutDateRouter");
const Form = require("../Base/Form");
class FundraiserBlackoutDate extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, Form, Table, FundraiserBlackoutDateRouter);
        this.data = data;
        ko.applyBindings(this);
        $(".hideUnbound").removeClass("hideUnbound");
    }
}
module.exports = FundraiserBlackoutDate;

},{"../Base/Form":7,"../Base/Table":11,"../Base/VMBase":12,"./FundraiserBlackoutDateRouter":37,"jquery":109,"knockout":111}],37:[function(require,module,exports){
"use strict";
const Router = require("../Base/Router");
class FundraiserBlackoutDateRouter extends Router {
    constructor(data, vm, alternateroutes) {
        super(data, vm, alternateroutes);
        this.data = data;
        this.vm = vm;
    }
    getRoutes() {
        var self;
        self = this;
        return [
            {
                name: `${self.getArea()}/${self.data.Title}#/list`,
                func: () => {
                    self.vm.form.cancel();
                    self.vm.table.load();
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/new`,
                func() {
                    self.vm.form.add();
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/view/:id`,
                func() {
                    var id = this.params['id'];
                    self.vm.form.getDetail(id);
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/index`,
                func() {
                    self.vm.form.getDetail(null);
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/delete/:id`,
                func() {
                    var id = this.params['id'];
                    self.vm.form.deleteItem(id);
                },
                convertToRegEx: false
            }
        ];
    }
}
module.exports = FundraiserBlackoutDateRouter;

},{"../Base/Router":10}],38:[function(require,module,exports){
"use strict";
/// This code was generated by Orange Onion Scaffolder.
// template: MVC.JSModule.cs
// class: FundraiserInquiry
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
const Table = require("../Base/Table");
const Form = require("../Base/Form");
const FundraiserInquiryRouter = require("./FundraiserInquiryRouter");
const _ = require("underscore");
class FundraiserInquiry extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, Form, Table, FundraiserInquiryRouter);
        this.data = data;
        this.NumDates = 1;
        var self = this;
        $('.modalform-holder').on('click', '#save-fundraiser-inquiry', () => {
            self.ItemDetail.InterestedDates([]);
            $('input[name^="ItemDetail.InterestedDates"]').each(function () {
                if ($(this).val()) {
                    self.ItemDetail.InterestedDates().push($(this).val());
                }
            });
            var promise = this.form.post();
            promise.done(() => {
                window.location.href = "/fundraiserinquiry#/thankyou";
            });
            return false;
        });
        $('.modalform-holder').on('click', '#add-interested-date', () => {
            $('#interested-dates').append('<div class="input-group"><div class="date-input"><input name="ItemDetail.InterestedDates[' + self.NumDates + ']" class="form-control" id="ItemDetail_InterestedDates[' + this.NumDates + ']" type="date"></div><div class="input-group-addon background-white"><i class="fa fa-calendar"></i></div></div>');
            this.NumDates++;
            return false;
        });
        ko.applyBindings(this);
        $('.hideUnbound').removeClass('hideUnbound');
    }
    clearFilters() {
        _.each(this.Filters, (v) => {
            v('');
        });
    }
}
module.exports = FundraiserInquiry;

},{"../Base/Form":7,"../Base/Table":11,"../Base/VMBase":12,"./FundraiserInquiryRouter":39,"jquery":109,"knockout":111,"underscore":113}],39:[function(require,module,exports){
"use strict";
const Router = require("../Base/Router");
class FundraiserInquiryRouter extends Router {
    constructor(data, vm, alternateroutes) {
        super(data, vm, alternateroutes);
        this.data = data;
        this.vm = vm;
    }
    getRoutes() {
        var self;
        self = this;
        return [
            {
                name: '/FundraiserInquiry#/new',
                func() {
                    self.vm.form.add();
                    self.vm.ShowThankYou(false);
                },
                convertToRegEx: true
            },
            {
                name: '/FundraiserInquiry#/thankyou',
                func() {
                    self.vm.ShowThankYou(true);
                },
                convertToRegEx: true
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/list`,
                func: () => {
                    self.vm.form.cancel();
                    self.vm.table.load();
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/new`,
                func() {
                    self.vm.form.add();
                    self.vm.ShowThankYou(false);
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/view/:id`,
                func() {
                    var id = this.params['id'];
                    self.vm.form.getDetail(id);
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/index`,
                func() {
                    self.vm.form.getDetail(null);
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/thankyou`,
                func() {
                    self.vm.ShowThankYou(true);
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/delete/:id`,
                func() {
                    var id = this.params['id'];
                    self.vm.form.deleteItem(id);
                },
                convertToRegEx: false
            }
        ];
    }
}
module.exports = FundraiserInquiryRouter;

},{"../Base/Router":10}],40:[function(require,module,exports){
"use strict";
/// This code was generated by Orange Onion Scaffolder.
// template: MVC.JSModule.cs
// class: FundraiserLog
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
const Table = require("../Base/Table");
const Router = require("../Base/Router");
const Form = require("../Base/Form");
class FundraiserLog extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, Form, Table, Router);
        this.data = data;
        ko.applyBindings(this);
        $('.hideUnbound').removeClass('hideUnbound');
    }
    copyFundraiser(id) {
        var ignoreMapping = {
            'ignore': this.data.KOMapping.allNonPostBack
        };
        console.log(id);
        var promise = $.ajax({
            url: '/Admin/FundraiserLog/Copy',
            data: 'id=' + id,
            type: 'POST',
            cache: false
        });
        promise.fail((error) => {
            this.IsLoading(false);
        });
        promise.done(data => {
            this.IsLoading(false);
        });
    }
}
module.exports = FundraiserLog;

},{"../Base/Form":7,"../Base/Router":10,"../Base/Table":11,"../Base/VMBase":12,"jquery":109,"knockout":111}],41:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
const Table = require("../Base/Table");
const Router = require("../Base/Router");
const Modal = require("../Common/Modal");
const LoginForm = require("./FundraiserLoginForm");
class FundraiserLogin extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, LoginForm, Table, Router);
        this.data = data;
        var self = this;
        this.modal = new Modal("forgotPassword");
        this.modal.init();
        self.ItemDetail.ShowSuccess(false);
        $("div.login-box").on("click", "a.forgot-password", function () {
            $("#resetEmailAddress").val(null);
            self.ItemDetail.ShowSuccess(false);
            self.ItemDetail.EmailIsValid(true);
            self.modal.open("forgotPassword");
        });
        $('div.px-modal div.button-group button.button.secondary.reset-password-done').on('click', function () {
            window.location.href = "/fundraiserlogin#/index";
        });
        $('div.px-modal div.button-group button.button.secondary.reset-password').on('click', function (event) {
            event.preventDefault();
            var email = $("#resetEmailAddress").val();
            var url = "/pandafundraisermember/forgotpassword?emailAddress=" + email;
            var mapping = {
                'ignore': self.data.KOMapping.allNonPostBack
            };
            var postData = ko.mapping.toJS(self, mapping);
            $("#loading").height($(window).height());
            self.IsLoading(true);
            var promise = $.ajax({
                url: url,
                data: JSON.stringify(postData),
                type: "POST",
                cache: false,
                contentType: "application/json;charset=utf-8"
            });
            promise.fail(function (error) {
                //something went wrong display error
                self.ItemDetail.EmailIsValid(false);
                self.IsLoading(false);
            });
            promise.done(function (vm) {
                self.ItemDetail.EmailIsValid(true);
                self.ItemDetail.ShowSuccess(true);
                self.IsLoading(false);
            });
            return promise;
        });
        ko.applyBindings(this);
        $('.hideUnbound').removeClass('hideUnbound');
    }
}
module.exports = FundraiserLogin;

},{"../Base/Router":10,"../Base/Table":11,"../Base/VMBase":12,"../Common/Modal":14,"./FundraiserLoginForm":42,"jquery":109,"knockout":111}],42:[function(require,module,exports){
"use strict";
const Form = require("../Base/Form");
class FundraiserLoginForm extends Form {
    constructor(data, vm, editAction = 'Login') {
        super(data, vm, editAction);
        this.data = data;
        this.vm = vm;
        this.editAction = editAction;
    }
    post() {
        var promise = super.post();
        promise.done(data => {
            window.location.href = data.ReturnUrl;
        });
        promise.fail(error => {
            this.vm.Message(error.responseJSON.Message);
        });
        return promise;
    }
    promiseDone(data, id) {
        super.getPromiseDone(data, id);
        window.location.href = data.ReturnUrl;
    }
}
module.exports = FundraiserLoginForm;

},{"../Base/Form":7}],43:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
const Table = require("../Base/Table");
const Form = require("../Base/Form");
const FundraiserMemberRouter = require("./FundraiserMemberRouter");
class FundraiserMember extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, Form, Table, FundraiserMemberRouter);
        this.data = data;
        ko.applyBindings(this);
        $('.hideUnbound').removeClass('hideUnbound');
    }
}
module.exports = FundraiserMember;

},{"../Base/Form":7,"../Base/Table":11,"../Base/VMBase":12,"./FundraiserMemberRouter":44,"jquery":109,"knockout":111}],44:[function(require,module,exports){
"use strict";
const Router = require("../Base/Router");
class FundraiserMemberRouter extends Router {
    constructor(data, vm, alternateroutes) {
        super(data, vm, alternateroutes);
        this.data = data;
        this.vm = vm;
    }
    getRoutes() {
        var self;
        self = this;
        return [
            {
                name: `${self.getArea()}/${self.data.Title}#/list`,
                func: () => {
                    self.vm.form.cancel();
                    self.vm.table.load();
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/new`,
                func() {
                    self.vm.form.add();
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/view/:id`,
                func() {
                    var id = this.params['id'];
                    self.vm.form.getDetail(id);
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/index`,
                func() {
                    self.vm.form.getDetail(null);
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/delete/:id`,
                func() {
                    var id = this.params['id'];
                    self.vm.form.deleteItem(id);
                },
                convertToRegEx: false
            }
        ];
    }
}
module.exports = FundraiserMemberRouter;

},{"../Base/Router":10}],45:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
const Table = require("../Base/Table");
const FundraiserUnitExceptionRouter = require("./FundraiserUnitExceptionRouter");
const Form = require("../Base/Form");
class FundraiserUnitException extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, Form, Table, FundraiserUnitExceptionRouter);
        this.data = data;
        ko.applyBindings(this);
        $('.hideUnbound').removeClass('hideUnbound');
    }
}
module.exports = FundraiserUnitException;

},{"../Base/Form":7,"../Base/Table":11,"../Base/VMBase":12,"./FundraiserUnitExceptionRouter":46,"jquery":109,"knockout":111}],46:[function(require,module,exports){
"use strict";
const Router = require("../Base/Router");
class FundraiserUnitExceptionRouter extends Router {
    constructor(data, vm, alternateroutes) {
        super(data, vm, alternateroutes);
        this.data = data;
        this.vm = vm;
    }
    getRoutes() {
        var self;
        self = this;
        return [
            {
                name: `${self.getArea()}/${self.data.Title}#/list`,
                func: () => {
                    self.vm.form.cancel();
                    self.vm.table.load();
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/new`,
                func() {
                    self.vm.form.add();
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/view/:id`,
                func() {
                    var id = this.params['id'];
                    self.vm.form.getDetail(id);
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/index`,
                func() {
                    self.vm.form.getDetail(null);
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/delete/:id`,
                func() {
                    var id = this.params['id'];
                    self.vm.form.deleteItem(id);
                },
                convertToRegEx: false
            }
        ];
    }
}
module.exports = FundraiserUnitExceptionRouter;

},{"../Base/Router":10}],47:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
const Table = require("../Base/Table");
const FundraiserRouter = require("./FundraiserRouter");
const Form = require("../Base/Form");
const Modal = require("../Common/Modal");
const _ = require("underscore");
class Fundraiser extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, Form, Table, FundraiserRouter);
        this.data = data;
        this.modal = new Modal('fundraiserStatusWarning');
        this.modal.init();
        var self = this;
        ko.applyBindings(this);
        $(".hideUnbound").removeClass("hideUnbound");
        $('#item-detail-form').on("change", '#ItemDetail_Status', () => {
            //your code goes here...
            if ($('#ItemDetail_Status').val() == 'COMPLETED') {
                this.modal.open('clicked-status');
            }
            ;
        });
        $('#save').on('click', function () {
            if ($('#ItemDetail_Status').val() == 'COMPLETED') {
                $('#item-detail-form #ItemDetail_Status').trigger("change");
                return false;
            }
        });
        $('#Logo').on('change', function () {
            for (var i = 0; i < this.files.length; i++) {
                var file = this.files[i];
                var fd = new FormData();
                fd.append("fileToUpload", file);
                $.ajax({
                    url: '/pandafundraiser/uploadfile',
                    data: fd,
                    type: 'POST',
                    cache: false,
                    processData: false,
                    contentType: false,
                    success: function (data) {
                        self.ItemDetail.Logo(data);
                    }
                });
            }
        });
        $('body').on('click', '.remove-logo', (e) => {
            e.preventDefault();
            this.ItemDetail.Logo('');
            $('#Logo').val('');
        });
        this.ItemDetail.NumberStores.subscribe(function (numberStores) {
            if (numberStores === 'Multiple Stores') {
                self.ItemDetail.ShowMultipleStoresUpload(true);
            }
            else {
                self.ItemDetail.ShowMultipleStoresUpload(false);
            }
        });
        $('body').on('change', '#Stores', function () {
            for (var i = 0; i < this.files.length; i++) {
                var file = this.files[i];
                var fd = new FormData();
                fd.append("fileToUpload", file);
                $.ajax({
                    url: '/admin/fundraiser/UploadFundraiserStoreList',
                    data: fd,
                    type: 'POST',
                    cache: false,
                    processData: false,
                    contentType: false,
                    success: function (data) { },
                    error: function () {
                        console.log('error');
                        $('#StoreUploadError').html('There was an error uploading file');
                    }
                });
            }
        });
    }
    clearFilters() {
        _.each(this.Filters, (v) => {
            v('');
        });
    }
    exportFundraisers() {
        var ignoreMapping = {
            'ignore': this.data.KOMapping.allNonPostBack
        };
        var postData = ko.mapping.toJS(this, ignoreMapping);
        delete postData.Alerts;
        var promise = $.ajax({
            url: '/Admin/Fundraiser/Export',
            data: JSON.stringify(postData),
            type: 'POST',
            cache: false,
            contentType: 'application/json;charset=utf-8'
        });
        promise.fail((error) => {
            this.IsLoading(false);
        });
        promise.done(data => {
            this.IsLoading(false);
        });
    }
}
module.exports = Fundraiser;

},{"../Base/Form":7,"../Base/Table":11,"../Base/VMBase":12,"../Common/Modal":14,"./FundraiserRouter":48,"jquery":109,"knockout":111,"underscore":113}],48:[function(require,module,exports){
"use strict";
const Router = require("../Base/Router");
class FundraiserRouter extends Router {
    constructor(data, vm, alternateroutes) {
        super(data, vm, alternateroutes);
        this.data = data;
        this.vm = vm;
    }
    getRoutes() {
        var self;
        self = this;
        return [
            {
                name: `${self.getArea()}/${self.data.Title}#/list`,
                func: () => {
                    self.vm.form.cancel();
                    self.vm.table.load();
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/new`,
                func() {
                    self.vm.form.add();
                    self.vm.ItemDetail.NumberStores('One Store');
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/view/:id`,
                func() {
                    var id = this.params['id'];
                    self.vm.form.getDetail(id);
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/index`,
                func() {
                    self.vm.form.getDetail(null);
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/delete/:id`,
                func() {
                    var id = this.params['id'];
                    self.vm.form.deleteItem(id);
                },
                convertToRegEx: false
            }
        ];
    }
}
module.exports = FundraiserRouter;

},{"../Base/Router":10}],49:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
const PageBase = require("../ContentPage/ContentPageBase");
const GridContentPageForm = require("./GridContentPageForm");
const Table = require("../Base/Table");
const ContentPageRouter = require("../ContentPage/ContentPageRouter");
class GridContentPage extends PageBase {
    constructor(data) {
        super(data, GridContentPageForm, Table, ContentPageRouter);
        this.data = data;
        ko.applyBindings(this);
        $('.hideUnbound').removeClass('hideUnbound');
    }
}
module.exports = GridContentPage;

},{"../Base/Table":11,"../ContentPage/ContentPageBase":24,"../ContentPage/ContentPageRouter":26,"./GridContentPageForm":50,"jquery":109,"knockout":111}],50:[function(require,module,exports){
"use strict";
const _ = require("underscore");
const PageForm = require("../ContentPage/ContentPageForm");
class GridContentPageForm extends PageForm {
    constructor(data, vm) {
        super(data, vm);
        this.data = data;
        this.vm = vm;
        this.addItemDetailClientOnlyProperties();
    }
    setupBindigs() {
        super.setupBindigs();
        var self = this;
        var modelHolderSelector = $('.modalform-holder');
        //Toggle Collapse
        modelHolderSelector.on('click', '.toggle-row', function () {
            var data = ko.dataFor(this); //local this
            data.Hidden(!data.Hidden());
        });
        modelHolderSelector.on('click', '.gridcell-toggle', function () {
            var data = ko.dataFor(this); //local this
            data.Expanded(!data.Expanded());
            var cell = $(this).parent().parent().parent(); //local this
            var originalClass = cell.attr('data-normal-css');
            if (cell.hasClass(originalClass)) {
                cell.removeClass(originalClass);
                cell.addClass('col-xs-12');
            }
            else {
                cell.addClass(originalClass);
                cell.removeClass('col-xs-12');
            }
        });
        modelHolderSelector.on('click', '.minimize-all', function () {
            var data = ko.dataFor(this); //local this
            self.minimizeAllRows(data);
        });
        modelHolderSelector.on('click', '.maximize-all', function () {
            var data = ko.dataFor(this); //local this
            self.maximizeAllRows(data);
        });
        //Removing
        modelHolderSelector.on('click', '.row-remove', function () {
            var data = ko.dataFor(this); //local this
            var context = ko.contextFor(this); //local this
            var grid = context.$parent;
            grid.Rows.remove(data);
        });
        modelHolderSelector.on('click', '.cell-remove', function () {
            var data = ko.dataFor(this); //local this
            var context = ko.contextFor(this); //local this
            var row = context.$parent;
            row.Cells.remove(data);
        });
        modelHolderSelector.on('click', '.href-remove', function () {
            var data = ko.dataFor(this); //local this
            var context = ko.contextFor(this); //local this
            var cell = context.$parent;
            cell.Hrefs.remove(data);
        });
        //Adding
        modelHolderSelector.on('click', '.add-row', function () {
            var data = ko.dataFor(this); //local this
            self.minimizeAllRows(data);
            var order = data.Rows().length + 1;
            var row = self.vm.NewRow;
            var rowCopy = ko.mapping.fromJS(ko.toJS(row));
            self.addSortedCells(rowCopy);
            var cell = self.vm.NewCell;
            var cellCopy = ko.mapping.fromJS(ko.toJS(cell));
            self.addSortedHrefs(cellCopy);
            cellCopy.Order(order);
            rowCopy.Cells.push(cellCopy);
            rowCopy.Order(order);
            data.Rows.push(rowCopy);
        });
        modelHolderSelector.on('click', '.add-cell', function () {
            var row = ko.dataFor(this); //local this
            var order = row.Cells().length + 1;
            var cell = self.vm.NewCell;
            var cellCopy = ko.mapping.fromJS(ko.toJS(cell));
            self.addSortedHrefs(cellCopy);
            cellCopy.Order(order);
            row.Cells.push(cellCopy);
        });
        modelHolderSelector.on('click', '.add-href', function () {
            var cell = ko.dataFor(this); //local this
            var href = self.vm.NewHref;
            var hrefCopy = ko.mapping.fromJS(ko.toJS(href));
            cell.Hrefs.push(hrefCopy);
        });
    }
    minimizeAllRows(data) {
        _.each(data.Rows(), (row) => {
            row.Hidden(true);
        });
    }
    maximizeAllRows(data) {
        _.each(data.Rows(), (row) => {
            row.Hidden(false);
        });
    }
    getNewVersion(language) {
        var newVersion = super.getNewVersion(language);
        //reset all Ids to 00000000-0000-0000-0000-000000000000
        //so that all all children of new version are new copies
        var defaultId = newVersion.Id();
        _.each(newVersion.Rows(), (row) => {
            row.Id(defaultId);
            _.each(row.Cells(), (cell) => {
                cell.Id(defaultId);
                _.each(cell.Hrefs(), (href) => {
                    href.Id(defaultId);
                });
            });
        });
        return newVersion;
    }
    addVersionComputed(version) {
        super.addVersionComputed(version);
        //sorted rows
        version.SortedRows = ko.computed(() => {
            return version.Rows().sort((left, right) => (left.Order() === right.Order() ? 0 : (left.Order() < right.Order() ? -1 : 1)));
        });
        //sorted cells
        _.each(version.Rows(), (row) => {
            this.addSortedCells(row);
        });
        version.showMinimizeAll = ko.computed(() => _.any(version.Rows(), (row) => (!row.Hidden())));
        version.showMaximizeAll = ko.computed(() => _.any(version.Rows(), (row) => (row.Hidden())));
    }
    addSortedCells(row) {
        row.SortedCells = ko.computed(() => {
            return row.Cells().sort((left, right) => (left.Order() === right.Order() ? 0 : (left.Order() < right.Order() ? -1 : 1)));
        });
        //sorted cells
        _.each(row.Cells(), (cell) => {
            this.addSortedHrefs(cell);
        });
    }
    addSortedHrefs(cell) {
        cell.SortedHrefs = ko.computed(() => cell.Hrefs().sort((left, right) => (left.Order() === right.Order() ? 0 : (left.Order() < right.Order() ? -1 : 1))));
    }
    post() {
        //prevent double post
        if (this.vm.IsLoading()) {
            return;
        }
        //make overlay loading div full height
        $('#loading').height($(window).height());
        this.vm.IsLoading(true);
        var ignoreMapping = {
            'ignore': this.data.KOMapping.allNonPostBack
        };
        var postData = ko.mapping.toJS(this.vm, ignoreMapping);
        $.each(postData.ItemDetail.AllVersions, function (i, v) {
            if (moment.isMoment(v.StartDateTime))
                v.StartDateTime = v.StartDateTime.format("YYYY-MM-DTHH:mm:ss.mmm");
            if (!isNaN(v.EndDateTime)) {
                if (moment.isMoment(v.EndDateTime))
                    v.EndDateTime = v.EndDateTime.format("YYYY-MM-DTHH:mm:ss.mmm");
            }
        });
        postData = JSON.stringify(postData);
        postData = postData.replace('<!--<script', '<script');
        postData = postData.replace('</script>-->', '</script>');
        delete postData.Alerts;
        delete postData.NewVersion;
        var promise = $.ajax({
            url: this.postUrl.toString().toLowerCase(),
            data: postData,
            type: 'POST',
            cache: false,
            contentType: 'application/json;charset=utf-8',
        });
        promise.fail((error) => this.postPromiseFail(error));
        promise.done(data => this.postPromiseDone(data));
        return promise;
    }
}
module.exports = GridContentPageForm;

},{"../ContentPage/ContentPageForm":25,"underscore":113}],51:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
const Table = require("../Base/Table");
const HalfAndHalfRouter = require("./HalfAndHalfRouter");
const Form = require("../Base/Form");
class HalfAndHalf extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, Form, Table, HalfAndHalfRouter);
        this.data = data;
        ko.applyBindings(this);
        $('.hideUnbound').removeClass('hideUnbound');
    }
}
module.exports = HalfAndHalf;

},{"../Base/Form":7,"../Base/Table":11,"../Base/VMBase":12,"./HalfAndHalfRouter":52,"jquery":109,"knockout":111}],52:[function(require,module,exports){
"use strict";
const Router = require("../Base/Router");
class HalfAndHalfRouter extends Router {
    constructor(data, vm, alternateroutes) {
        super(data, vm, alternateroutes);
        this.data = data;
        this.vm = vm;
    }
    getRoutes() {
        var self;
        self = this;
        return [
            {
                name: `${self.getArea()}/${self.data.Title}#/list`,
                func: () => {
                    self.vm.form.cancel();
                    self.vm.table.load();
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/new`,
                func() {
                    self.vm.form.add();
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/view/:id`,
                func() {
                    var id = this.params['id'];
                    self.vm.form.getDetail(id);
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/index`,
                func() {
                    self.vm.form.getDetail(null);
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/delete/:id`,
                func() {
                    var id = this.params['id'];
                    self.vm.form.deleteItem(id);
                },
                convertToRegEx: false
            }
        ];
    }
}
module.exports = HalfAndHalfRouter;

},{"../Base/Router":10}],53:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
const Table = require("../Base/Table");
const HomeStreamRouter = require("./HomeStreamRouter");
const Form = require("../Base/Form");
class HomeStream extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, Form, Table, HomeStreamRouter);
        this.data = data;
        ko.applyBindings(this);
        $('.hideUnbound').removeClass('hideUnbound');
    }
}
module.exports = HomeStream;

},{"../Base/Form":7,"../Base/Table":11,"../Base/VMBase":12,"./HomeStreamRouter":54,"jquery":109,"knockout":111}],54:[function(require,module,exports){
"use strict";
const Router = require("../Base/Router");
class HomeStreamRouter extends Router {
    constructor(data, vm, alternateroutes) {
        super(data, vm, alternateroutes);
        this.data = data;
        this.vm = vm;
    }
    getRoutes() {
        var self;
        self = this;
        return [
            {
                name: `${self.getArea()}/${self.data.Title}#/list`,
                func: () => {
                    self.vm.form.cancel();
                    //self.vm.table.load();
                },
                convertToRegEx: false
            }
        ];
    }
}
module.exports = HomeStreamRouter;

},{"../Base/Router":10}],55:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
const Table = require("../Base/Table");
const Router = require("../Base/Router");
const Form = require("../Base/Form");
class Meal extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, Form, Table, Router);
        this.data = data;
        ko.applyBindings(this);
        $('.hideUnbound').removeClass('hideUnbound');
    }
}
module.exports = Meal;

},{"../Base/Form":7,"../Base/Router":10,"../Base/Table":11,"../Base/VMBase":12,"jquery":109,"knockout":111}],56:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
const Table = require("../Base/Table");
const MediaRouter = require("./MediaRouter");
const Form = require("../Base/Form");
class Media extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, Form, Table, MediaRouter);
        this.data = data;
        ko.applyBindings(this);
        $('.hideUnbound').removeClass('hideUnbound');
    }
}
module.exports = Media;

},{"../Base/Form":7,"../Base/Table":11,"../Base/VMBase":12,"./MediaRouter":57,"jquery":109,"knockout":111}],57:[function(require,module,exports){
"use strict";
const Router = require("../Base/Router");
class MediaRouter extends Router {
    constructor(data, vm, alternateroutes) {
        super(data, vm, alternateroutes);
        this.data = data;
        this.vm = vm;
    }
    getRoutes() {
        var self;
        self = this;
        return [
            {
                name: `${self.getArea()}/${self.data.Title}#/list`,
                func: () => {
                    self.vm.form.cancel();
                    self.vm.table.load();
                },
                convertToRegEx: false
            }
        ];
    }
}
module.exports = MediaRouter;

},{"../Base/Router":10}],58:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
const Table = require("../Base/Table");
const MenuCategoryRouter = require("./MenuCategoryRouter");
const Form = require("../Base/Form");
class MenuItem extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, Form, Table, MenuCategoryRouter);
        this.data = data;
        ko.applyBindings(this);
        $(".hideUnbound").removeClass("hideUnbound");
    }
}
module.exports = MenuItem;

},{"../Base/Form":7,"../Base/Table":11,"../Base/VMBase":12,"./MenuCategoryRouter":59,"jquery":109,"knockout":111}],59:[function(require,module,exports){
"use strict";
const Router = require("../Base/Router");
class MenuCategoryRouter extends Router {
    constructor(data, vm, alternateroutes) {
        super(data, vm, alternateroutes);
        this.data = data;
        this.vm = vm;
    }
    getRoutes() {
        var self;
        self = this;
        return [
            {
                name: `${self.getArea()}/${self.data.Title}#/list`,
                func: () => {
                    self.vm.form.cancel();
                    self.vm.table.load();
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/new`,
                func() {
                    self.vm.form.add();
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/view/:id`,
                func() {
                    var id = this.params['id'];
                    self.vm.form.getDetail(id);
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/index`,
                func() {
                    self.vm.form.getDetail(null);
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/delete/:id`,
                func() {
                    var id = this.params['id'];
                    self.vm.form.deleteItem(id);
                },
                convertToRegEx: false
            }
        ];
    }
}
module.exports = MenuCategoryRouter;

},{"../Base/Router":10}],60:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
const Table = require("../Base/Table");
const MenuItemRouter = require("./MenuItemRouter");
const Form = require("../Base/Form");
class MenuItem extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, Form, Table, MenuItemRouter);
        this.data = data;
        ko.applyBindings(this);
        $('.hideUnbound').removeClass('hideUnbound');
    }
}
module.exports = MenuItem;

},{"../Base/Form":7,"../Base/Table":11,"../Base/VMBase":12,"./MenuItemRouter":61,"jquery":109,"knockout":111}],61:[function(require,module,exports){
"use strict";
const Router = require("../Base/Router");
class MenuItemRouter extends Router {
    constructor(data, vm, alternateroutes) {
        super(data, vm, alternateroutes);
        this.data = data;
        this.vm = vm;
    }
    getRoutes() {
        var self;
        self = this;
        return [
            {
                name: `${self.getArea()}/${self.data.Title}#/list`,
                func: () => {
                    self.vm.form.cancel();
                    self.vm.table.load();
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/new`,
                func() {
                    self.vm.form.add();
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/view/:id`,
                func() {
                    var id = this.params['id'];
                    self.vm.form.getDetail(id);
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/index`,
                func() {
                    self.vm.form.getDetail(null);
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/delete/:id`,
                func() {
                    var id = this.params['id'];
                    self.vm.form.deleteItem(id);
                },
                convertToRegEx: false
            }
        ];
    }
}
module.exports = MenuItemRouter;

},{"../Base/Router":10}],62:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
class Menu extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, null, null, null);
        this.data = data;
        ko.applyBindings(this);
        $(".hideUnbound").removeClass("hideUnbound");
    }
}
module.exports = Menu;

},{"../Base/VMBase":12,"jquery":109,"knockout":111}],63:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
const Table = require("../Base/Table");
const Router = require("../Base/Router");
const Form = require("../Base/Form");
class MobileFeature extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, Form, Table, Router);
        this.data = data;
        ko.applyBindings(this);
        $('.hideUnbound').removeClass('hideUnbound');
    }
}
module.exports = MobileFeature;

},{"../Base/Form":7,"../Base/Router":10,"../Base/Table":11,"../Base/VMBase":12,"jquery":109,"knockout":111}],64:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
class Nutrition {
    constructor(data) {
        //call base class constructor
        // super(data, Form, Table, Router);
        this.data = data;
        ko.applyBindings(this);
        $('.hideUnbound').removeClass('hideUnbound');
    }
}
module.exports = Nutrition;

},{"jquery":109,"knockout":111}],65:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
const Table = require("../Base/Table");
const Router = require("../Base/Router");
const Form = require("../Base/Form");
class PandaFundraiserBlackoutDate extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, Form, Table, Router);
        this.data = data;
        ko.applyBindings(this);
        $(".hideUnbound").removeClass("hideUnbound");
    }
}
module.exports = PandaFundraiserBlackoutDate;

},{"../Base/Form":7,"../Base/Router":10,"../Base/Table":11,"../Base/VMBase":12,"jquery":109,"knockout":111}],66:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
const Table = require("../Base/Table");
const Router = require("../Base/Router");
//import Form = require('../Base/Form');
const PandaFundraiserMemberForm = require("./PandaFundraiserMemberForm");
class PandaFundraiserMember extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, PandaFundraiserMemberForm, Table, Router);
        this.data = data;
        var self = this;
        self.LeaveOpenOnAjaxSuccess(false);
        self.ItemDetail.ShowSuccess(false);
        $("#register").on("click", () => {
            var url = "/pandafundraisermember/edit";
            var mapping = {
                'ignore': this.data.KOMapping.allNonPostBack
            };
            var postData = ko.mapping.toJS(this, mapping);
            $("#loading").height($(window).height());
            this.IsLoading(true);
            delete postData.Alerts;
            var promise = $.ajax({
                url: url,
                data: JSON.stringify(postData),
                type: "POST",
                cache: false,
                contentType: "application/json;charset=utf-8"
            });
            promise.fail(function (error) {
                //something went wrong display error
                var html = error.error().responseText;
                var element = $("<div/>").html(html);
                $("style", element).remove();
                var htmlText = element.html();
                this.AddAlert(htmlText, "error");
                this.IsLoading(false);
            });
            promise.done(function (data) {
                if (data.LoginSuccess) {
                    window.location.href = data.ReturnUrl;
                }
                else {
                    this.AddAlert(data.Message, "error");
                }
                this.vm.IsLoading(false);
            });
            return promise;
        });
        $('button.button.primary.change-password').on('click', function (event) {
            event.preventDefault();
            var url = "/pandafundraisermember/resetpassword";
            var mapping = {
                'ignore': self.data.KOMapping.allNonPostBack
            };
            var postData = ko.mapping.toJS(self, mapping);
            delete postData.Alerts;
            $("#loading").height($(window).height());
            self.IsLoading(true);
            var promise = $.ajax({
                url: url,
                data: JSON.stringify(postData),
                type: "POST",
                cache: false,
                contentType: "application/json;charset=utf-8"
            });
            promise.fail((error) => self.form.postPromiseFail(error));
            promise.done(function (vm) {
                self.ItemDetail.ShowSuccess(true);
                self.IsLoading(false);
            });
            return promise;
        });
        ko.applyBindings(this);
        $('.hideUnbound').removeClass('hideUnbound');
    }
}
module.exports = PandaFundraiserMember;

},{"../Base/Router":10,"../Base/Table":11,"../Base/VMBase":12,"./PandaFundraiserMemberForm":67,"jquery":109,"knockout":111}],67:[function(require,module,exports){
"use strict";
const Form = require("../Base/Form");
class PandaFundraiserMemberForm extends Form {
    constructor(data, vm, editAction = 'Edit') {
        super(data, vm, editAction);
        this.data = data;
        this.vm = vm;
        this.editAction = editAction;
        var self = this;
    }
    post() {
        this.vm.ItemDetail.InvalidEmailMessage(null);
        var promise = super.post();
        promise.done(data => {
            //window.location.href = data.ReturnUrl;
            if (this.vm.ItemDetailIsNew())
                window.location.href = '/fundraiserlogin#/index';
            else
                window.location.href = '/pandafundraiser#/list';
        });
        promise.fail(error => {
            this.vm.Message = error.responseJSON.Message;
            var html = error.error().responseText;
            var element = $("<div/>").html(html);
            $("style", element).remove();
            var htmlText = element.html();
            this.vm.AddAlert(htmlText, "error");
        });
        return promise;
    }
}
module.exports = PandaFundraiserMemberForm;

},{"../Base/Form":7}],68:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
const Table = require("../Base/Table");
const PandaFundraiserRouter = require("./PandaFundraiserRouter");
const PandaFundraiserForm = require("./PandaFundraiserForm");
const Store = require("../Store/Store");
const Modal = require("../Common/Modal");
const _ = require("underscore");
class PandaFundraiser extends base.VmBase {
    //me: this;
    constructor(data) {
        //call base class constructor
        super(data, PandaFundraiserForm, Table, PandaFundraiserRouter);
        this.data = data;
        this.table.orderby = "EventDate desc";
        //setup table, routes and form
        var self = this;
        //reuse the store vm for store search
        this.storeVm = new Store(data.StoreViewModel, false, true);
        this.storeVm.Filters.ShowHawaii(false);
        this.modal = new Modal("deleteEvent");
        this.modal.init();
        $(".table-holder-" + this.data.Title).on("click", "a.cancel-event", function () {
            var aData = ko.dataFor(this); //local this
            var id = aData.UniqueId;
            self.modal.open(id);
        });
        $('div.px-modal div.button-group button.button.secondary').on('click', function () {
            //self.Alerts = ;
            var url = "/pandafundraiser/cancel?uniqueid=" + self.modal.eventId;
            var mapping = {
                'ignore': self.data.KOMapping.allNonPostBack
            };
            var postData = ko.mapping.toJS(self, mapping);
            $("#loading").height($(window).height());
            self.IsLoading(true);
            var promise = $.ajax({
                url: url,
                data: JSON.stringify(postData),
                type: "POST",
                cache: false,
                contentType: "application/json;charset=utf-8"
            });
            promise.fail(error => {
                //something went wrong display error
                var html = error.error().responseText;
                var element = $("<div/>").html(html);
                $("style", element).remove();
                var htmlText = element.html();
                self.AddAlert(htmlText, "error");
                self.IsLoading(false);
            });
            promise.done(vm => {
                window.location.hash = '#/' + vm.DefaultSammyRoute;
                self.IsLoading(false);
                self.table.load();
            });
            self.modal.close();
            //return true;
            return promise;
        });
        $('.modalform-holder').on('click', '#continue-fundraiser', () => {
            //prevent double post
            if (this.IsLoading() || (!this.ItemDetail.CanEdit() && !this.ItemDetailIsNew())) {
                return false;
            }
            var re = new RegExp('MemberId');
            var value = re.exec(document.cookie);
            if (value === null) {
                window.location.href = '/fundraiserlogin#/index';
            }
            this.ItemDetail.CustomerConfirmed(false);
            var captcha = window["fundraiserCaptchaSatisfied"];
            if (!captcha) {
                if (this.ItemDetail.AgreeToTerms())
                    alert("Please complete the captcha challenge.");
                return false;
            }
            //make overlay loading div full height
            $('#loading').height($(window).height());
            this.IsLoading(true);
            var ignoreMapping = {
                'ignore': this.data.KOMapping.allNonPostBack
            };
            var postData = ko.mapping.toJS(this, ignoreMapping);
            delete postData.Alerts;
            var promise = $.ajax({
                url: 'pandafundraiser/edit',
                data: JSON.stringify(postData),
                type: 'POST',
                cache: false,
                contentType: 'application/json;charset=utf-8',
            });
            promise.fail((error) => {
                if (error.status === 400) {
                    _.each(error.responseJSON.ModelState.PropertyErrors, (propertyError) => {
                        this.form.addPropertyError(propertyError);
                    });
                    _.each(error.responseJSON.ModelState.ModelErrors, (v) => {
                        // addAlert(v.ErrorMessage, 'error');
                    });
                    if (error.responseJSON.Message) {
                        this.Message = error.responseJSON.Message;
                    }
                    this.form.refreshTabValidationBadges();
                }
                else {
                    if (error.responseJSON) {
                        if (error.responseJSON.Message) {
                            this.AddAlert(error.responseJSON.Message, 'error');
                        }
                        else {
                            var html = error.error().responseText;
                            var element = $('<div/>').html(html);
                            $('style', element).remove();
                            var htmlText = element.html();
                            this.AddAlert(htmlText, 'error');
                        }
                    }
                    else {
                        var html2 = error.error().responseText;
                        var element2 = $('<div/>').html(html2);
                        $('style', element2).remove();
                        var htmlText2 = element2.html();
                        this.AddAlert(htmlText2, 'error');
                    }
                }
                this.IsLoading(false);
            });
            promise.done((data) => {
                if (data.ReviewEvent) {
                    ko.mapping.fromJS(data.ItemDetail, {}, this.ItemDetail);
                    //ko.mapping.fromJS(data.StoreViewModel, {}, this.storeVm);
                    ko.mapping.fromJS(data.StoreViewModel.Filters, {}, this.storeVm.Filters);
                    this.FormVisible(false);
                    this.ReviewEvent(true);
                    //var id = this.params['id'];
                    window.location.hash = '#/view/' + ko.unwrap(data.ItemDetail.Id);
                }
                else {
                    this.ReviewEvent(false);
                    this.FormVisible(true);
                }
                this.IsLoading(false);
            });
            return false;
        });
        $('.modalform-holder').on('click', '#save-fundraiser', () => {
            //prevent double post
            if (this.IsLoading()) {
                return;
            }
            this.ItemDetail.AgreeToTerms(true);
            this.ItemDetail.CustomerConfirmed(true);
            //make overlay loading div full height
            $('#loading').height($(window).height());
            this.IsLoading(true);
            var ignoreMapping = {
                'ignore': this.data.KOMapping.allNonPostBack
            };
            var postData = ko.mapping.toJS(this, ignoreMapping);
            delete postData.Alerts;
            var promise = $.ajax({
                url: 'pandafundraiser/edit',
                data: JSON.stringify(postData),
                type: 'POST',
                cache: false,
                contentType: 'application/json;charset=utf-8',
            });
            promise.fail((error) => {
                if (error.status === 400) {
                    if (this.ReviewEvent()) { //if they were on the review event tab and clicked submit and the validation failed go back to the edit tab
                        this.ReviewEvent(false);
                        this.FormVisible(true);
                        this.EventSubmitted(false);
                    }
                    _.each(error.responseJSON.ModelState.PropertyErrors, (propertyError) => {
                        this.form.addPropertyError(propertyError);
                    });
                    _.each(error.responseJSON.ModelState.ModelErrors, (v) => {
                        // addAlert(v.ErrorMessage, 'error');
                    });
                    if (error.responseJSON.Message) {
                        this.Message = error.responseJSON.Message;
                    }
                    this.form.refreshTabValidationBadges();
                }
                else {
                    if (error.responseJSON) {
                        if (error.responseJSON.Message) {
                            this.AddAlert(error.responseJSON.Message, 'error');
                        }
                        else {
                            var html = error.error().responseText;
                            var element = $('<div/>').html(html);
                            $('style', element).remove();
                            var htmlText = element.html();
                            this.AddAlert(htmlText, 'error');
                        }
                    }
                    else {
                        var html2 = error.error().responseText;
                        var element2 = $('<div/>').html(html2);
                        $('style', element2).remove();
                        var htmlText2 = element2.html();
                        this.AddAlert(htmlText2, 'error');
                    }
                }
                this.IsLoading(false);
            });
            promise.done((data) => {
                var copyMapping = {
                    'copy': this.data.KOMapping.copy
                };
                ko.mapping.fromJS(data.ItemDetail, copyMapping, this.ItemDetail);
                if (!this.data.LeaveOpenOnAjaxSuccess) {
                    this.ReviewEvent(false);
                    this.FormVisible(false);
                    this.EventSubmitted(true);
                }
                this.IsLoading(false);
            });
            return false;
        });
        $('.modalform-holder').on('change', '#Logo', function () {
            for (var i = 0; i < this.files.length; i++) {
                var file = this.files[i];
                var fd = new FormData();
                fd.append("fileToUpload", file);
                $.ajax({
                    url: 'pandafundraiser/uploadfile',
                    data: fd,
                    type: 'POST',
                    cache: false,
                    processData: false,
                    contentType: false,
                    success: function (data) {
                        self.ItemDetail.Logo(data);
                    }
                });
            }
        });
        $('.modalform-holder').on('click', '.image-button-tile', () => {
            this.ItemDetail.Logo('');
            $('#Logo').val('');
        });
        ko.applyBindings(this);
        $('.hideUnbound').removeClass('hideUnbound');
        this.PaymentToModalShown = false;
        $('#ItemDetail_PaymentPayableTo').blur(() => {
            if (!this.PaymentToModalShown) {
                alert('Help us get your check to you on time! Please take a moment to ensure your organization’s name is not abbreviated and matches your Tax ID.');
                // only show once
                this.PaymentToModalShown = true;
            }
        });
        $(document).ready(function () {
            $('#ItemDetail_EventDate').val('mm/dd/yyyy');
        });
    }
}
module.exports = PandaFundraiser;

},{"../Base/Table":11,"../Base/VMBase":12,"../Common/Modal":14,"../Store/Store":78,"./PandaFundraiserForm":69,"./PandaFundraiserRouter":70,"jquery":109,"knockout":111,"underscore":113}],69:[function(require,module,exports){
"use strict";
const Form = require("../Base/Form");
class PandaFundraiserForm extends Form {
    constructor(data, vm, editAction = 'Edit') {
        super(data, vm, editAction);
        this.data = data;
        this.vm = vm;
        this.editAction = editAction;
    }
    promiseDone(data, id) {
        this.vm.ItemDetailIsNew(false);
        this.komappingfromdata(data, id);
        this.vm.IsLoading(false);
        this.vm.FormVisible(true);
        this.vm.ReviewEvent(data.ReviewEvent);
        if (this.vm.ReviewEvent())
            this.vm.FormVisible(false);
        if (data.ReturnUrl !== null)
            window.location.href = data.ReturnUrl;
        //else
        //  this.vm.routes.view(id);
    }
    getDetail(id) {
        this.resetDetail();
        $('#loading').height($(window).height());
        this.vm.IsLoading(true);
        $('body').addClass('form-shown');
        var promise = $.ajax({
            url: this.getUrl,
            data: { id: id },
            type: 'GET',
            cache: false,
            contentType: 'application/json;charset=utf-8'
        });
        promise.fail((error) => {
            var html = error.error().responseText;
            var element = $('<div/>').html(html);
            $('style', element).remove();
            var htmlText = element.html();
            this.vm.AddAlert(htmlText, 'alert-error');
            this.vm.IsLoading(false);
        });
        promise.done((data) => this.promiseDone(data, id));
        return promise;
    }
    komappingfromdata(data, id) {
        var copyMapping = {
            'copy': this.data.KOMapping.allNonPostBack
        };
        data.ItemDetail.EventDate = moment(data.ItemDetail.EventDate).format('YYYY-MM-DD');
        ko.mapping.fromJS(data.ItemDetail, copyMapping, this.vm.ItemDetail);
        if (data.StoreViewModel != null) {
            ko.mapping.fromJS(data.StoreViewModel.Filters, copyMapping, this.vm.storeVm.Filters);
            ko.mapping.fromJS(data.StoreViewModel.ItemDetail, copyMapping, this.vm.storeVm.ItemDetail);
        }
    }
    //resets item detail so that it looks like a new insert
    resetDetail() {
        super.resetDetail();
        this.vm.ItemDetail.EventDate(null); //clear the datepicker time
        ko.mapping.fromJS(this.vm.NewItemDetail, {}, this.vm.ItemDetail);
        this.vm.storeVm.Filters.SearchTerm(null);
    }
    post() {
        this.vm.routes.lastRoute = undefined;
        var promise = super.post();
        promise.done(data => {
            window.scrollTo(0, 0);
            if (data.ReturnUrl !== null)
                window.location.href = data.ReturnUrl;
        });
        return promise;
    }
}
module.exports = PandaFundraiserForm;

},{"../Base/Form":7}],70:[function(require,module,exports){
"use strict";
const Router = require("../Base/Router");
class PandaFundraiserRouter extends Router {
    constructor(data, vm, alternateroutes) {
        super(data, vm, alternateroutes);
        this.data = data;
        this.vm = vm;
    }
    getRoutes() {
        var self;
        self = this;
        return [
            {
                name: '/PandaFundraiser#/list',
                func() {
                    var re = new RegExp('MemberId');
                    var value = re.exec(document.cookie);
                    if (value === null) {
                        window.location.href = '/fundraiserlogin#/index';
                    }
                    self.vm.form.cancel();
                    self.vm.table.load();
                    self.vm.ReviewEvent(false);
                    self.vm.FormVisible(false);
                    self.vm.EventSubmitted(false);
                    self.vm.ViewResources(false);
                },
                convertToRegEx: true
            },
            {
                name: '/PandaFundraiser#/new',
                func() {
                    var re = new RegExp('MemberId');
                    var value = re.exec(document.cookie);
                    if (value === null) {
                        window.location.href = '/fundraiserlogin#/index';
                    }
                    self.vm.form.resetDetail();
                    self.vm.ItemDetailIsNew(true);
                    self.vm.ReviewEvent(false);
                    self.vm.FormVisible(true);
                    self.vm.ViewResources(false);
                    $('#ItemDetail_EventDate').val('mm/dd/yyyy');
                },
                convertToRegEx: true
            },
            {
                name: '/PandaFundraiser#/save',
                func() {
                    self.vm.SaveForLater(true);
                    self.vm.ItemDetail.SaveForLater(true);
                    self.vm.ReturnUrl = '/pandafundraiser#/list';
                    var re = new RegExp('MemberId');
                    var value = re.exec(document.cookie);
                    if (value === null) {
                        window.location.href = '/fundraiserlogin#/index';
                    }
                    return self.vm.form.post();
                },
                convertToRegEx: true
            },
            {
                name: /\/PandaFundraiser#\/view\/(.*)/i,
                func() {
                    var id = this.params['splat'][0];
                    var re = new RegExp('MemberId');
                    var value = re.exec(document.cookie);
                    if (value === null) {
                        window.location.href = '/fundraiserlogin#/index';
                    }
                    var promise = self.vm.form.getDetail(id);
                    promise.done(() => {
                        self.vm.ReviewEvent(true);
                        self.vm.FormVisible(false);
                        self.vm.EventSubmitted(false);
                        self.vm.ViewResources(false);
                    });
                },
                convertToRegEx: false
            },
            {
                name: /\/PandaFundraiser#\/resources\/(.*)/i,
                func() {
                    var id = this.params['splat'][0];
                    var re = new RegExp('MemberId');
                    var value = re.exec(document.cookie);
                    if (value === null) {
                        window.location.href = '/fundraiserlogin#/index';
                    }
                    var promise = self.vm.form.getDetail(id);
                    promise.done(() => {
                        self.vm.ReviewEvent(false);
                        self.vm.FormVisible(false);
                        self.vm.EventSubmitted(false);
                        self.vm.ViewResources(true);
                    });
                },
                convertToRegEx: false
            },
            {
                name: /\/PandaFundraiser#\/edit\/(.*)/i,
                func() {
                    var id = this.params['splat'][0];
                    var re = new RegExp('MemberId');
                    var value = re.exec(document.cookie);
                    if (value === null) {
                        window.location.href = '/fundraiserlogin#/index';
                    }
                    self.vm.form.getDetail(id);
                },
                convertToRegEx: false
            }
        ];
    }
}
module.exports = PandaFundraiserRouter;

},{"../Base/Router":10}],71:[function(require,module,exports){
"use strict";
/// This code was generated by Orange Onion Scaffolder.
// template: MVC.JSModule.cs
// class: PublicContentPage
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
class PublicContentPage extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, null, null, null);
        this.data = data;
        var $element = $('.content-container');
        $element.summernote({
            height: 600, airMode: true
        });
        ko.applyBindings(this);
        $('.hideUnbound').removeClass('hideUnbound');
    }
}
module.exports = PublicContentPage;

},{"../Base/VMBase":12,"jquery":109,"knockout":111}],72:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
const Table = require("../Base/Table");
const Router = require("../Base/Router");
const Form = require("../Base/Form");
class QuestionAnswer extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, Form, Table, Router);
        this.data = data;
        ko.applyBindings(this);
        $(".hideUnbound").removeClass("hideUnbound");
    }
}
module.exports = QuestionAnswer;

},{"../Base/Form":7,"../Base/Router":10,"../Base/Table":11,"../Base/VMBase":12,"jquery":109,"knockout":111}],73:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
const Table = require("../Base/Table");
const RedirectUrlRouter = require("./RedirectUrlRouter");
const Form = require("../Base/Form");
class RedirectUrl extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, Form, Table, RedirectUrlRouter);
        this.data = data;
        ko.applyBindings(this);
        $('.hideUnbound').removeClass('hideUnbound');
    }
}
module.exports = RedirectUrl;

},{"../Base/Form":7,"../Base/Table":11,"../Base/VMBase":12,"./RedirectUrlRouter":74,"jquery":109,"knockout":111}],74:[function(require,module,exports){
"use strict";
const Router = require("../Base/Router");
class RedirectUrlRouter extends Router {
    constructor(data, vm, alternateroutes) {
        super(data, vm, alternateroutes);
        this.data = data;
        this.vm = vm;
    }
    getRoutes() {
        var self;
        self = this;
        return [
            {
                name: `${self.getArea()}/${self.data.Title}#/list`,
                func: () => {
                    self.vm.form.cancel();
                    self.vm.table.load();
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/new`,
                func() {
                    self.vm.form.add();
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/view/:id`,
                func() {
                    var id = this.params['id'];
                    self.vm.form.getDetail(id);
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/index`,
                func() {
                    self.vm.form.getDetail(null);
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/delete/:id`,
                func() {
                    var id = this.params['id'];
                    self.vm.form.deleteItem(id);
                },
                convertToRegEx: false
            }
        ];
    }
}
module.exports = RedirectUrlRouter;

},{"../Base/Router":10}],75:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
class SiteMap {
    constructor(data) {
        //call base class constructor
        // super(data, Form, Table, Router);
        this.data = data;
        ko.applyBindings(this);
        $('.hideUnbound').removeClass('hideUnbound');
    }
}
module.exports = SiteMap;

},{"jquery":109,"knockout":111}],76:[function(require,module,exports){
"use strict";
/// This code was generated by Orange Onion Scaffolder.
// template: MVC.JSModule.cs
// class: StoreException
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
const Table = require("../Base/Table");
const StoreExceptionRouter = require("./StoreExceptionRouter");
const Form = require("../Base/Form");
class StoreException extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, Form, Table, StoreExceptionRouter);
        this.data = data;
        ko.applyBindings(this);
        $('.hideUnbound').removeClass('hideUnbound');
    }
}
module.exports = StoreException;

},{"../Base/Form":7,"../Base/Table":11,"../Base/VMBase":12,"./StoreExceptionRouter":77,"jquery":109,"knockout":111}],77:[function(require,module,exports){
"use strict";
const Router = require("../Base/Router");
class StoreExceptionRouter extends Router {
    constructor(data, vm, alternateroutes) {
        super(data, vm, alternateroutes);
        this.data = data;
        this.vm = vm;
    }
    getRoutes() {
        var self;
        self = this;
        return [
            {
                name: `${self.getArea()}/${self.data.Title}#/list`,
                func: () => {
                    self.vm.form.cancel();
                    self.vm.table.load();
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/new`,
                func() {
                    self.vm.form.add();
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/view/:id`,
                func() {
                    var id = this.params['id'];
                    self.vm.form.getDetail(id);
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/index`,
                func() {
                    self.vm.form.getDetail(null);
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/delete/:id`,
                func() {
                    var id = this.params['id'];
                    self.vm.form.deleteItem(id);
                },
                convertToRegEx: false
            }
        ];
    }
}
module.exports = StoreExceptionRouter;

},{"../Base/Router":10}],78:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
//import Table = require('../Base/Table');
const Router = require("../Base/Router");
const Form = require("../Base/Form");
const StoreTable = require("./StoreTable");
class Store extends base.VmBase {
    constructor(data, applyBindings = true, fundraiserStores = false) {
        //call base class constructor
        super(data, Form, StoreTable, Router);
        this.data = data;
        this.toggleFundraiser = (data, e) => {
            var postData = data.Id;
            $.ajax({
                url: '/Admin/Store/ToggleFundraiser?store=' + data.Id,
                type: 'GET',
                contentType: 'application/json;charset=utf-8',
                async: false,
                data: postData
            }).done((responsedata) => {
                this.table.load();
            });
        };
        if (applyBindings) {
            ko.applyBindings(this);
            $('.hideUnbound').removeClass('hideUnbound');
        }
        if (fundraiserStores) {
            this.GetUrl = '/api/Store/Get';
        }
        else {
            this.GetUrl = '/api/Store/GetAllFundraiserInclude';
        }
    }
}
module.exports = Store;

},{"../Base/Form":7,"../Base/Router":10,"../Base/VMBase":12,"./StoreTable":79,"jquery":109,"knockout":111}],79:[function(require,module,exports){
"use strict";
const Table = require("../Base/Table");
const $ = require("jquery");
const ko = require("knockout");
const komapping = require("knockout.mapping");
ko.mapping = komapping;
class StoreTable extends Table {
    constructor(data, vm) {
        super(data, vm);
        this.data = data;
        this.vm = vm;
    }
    //sends ajax call for data 
    load() {
        //this.vm.form.isDeleting = false;
        this.orderby = 'Name';
        $('#loading').height($(window).height());
        this.vm.IsLoading(true);
        //format the request
        var requestData = {
            $inlinecount: "allpages",
            $orderby: this.orderby,
            $top: this.top(),
            $skip: this.skip()
        };
        //add in filters
        $.extend(requestData, ko.toJS(this.vm.Filters));
        //make the request
        var response = $.ajax({
            url: this.vm.GetUrl,
            dataType: "json",
            cache: false,
            data: requestData
        });
        //handle successful response
        response.done(responsedata => {
            this.loadResponse(responsedata);
            this.vm.HasHawaiiLocations(responsedata.HasHawaiiLocations);
            this.vm.IsLoading(false);
        });
        return response;
    }
}
module.exports = StoreTable;

},{"../Base/Table":11,"jquery":109,"knockout":111,"knockout.mapping":110}],80:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
const Table = require("../Base/Table");
const Router = require("../Base/Router");
const Form = require("../Base/Form");
class StyleGuide extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, Form, Table, Router);
        this.data = data;
        ko.applyBindings(this);
        $(".hideUnbound").removeClass("hideUnbound");
        //this.table.defaultSort = ""
    }
}
module.exports = StyleGuide;

},{"../Base/Form":7,"../Base/Router":10,"../Base/Table":11,"../Base/VMBase":12,"jquery":109,"knockout":111}],81:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
const PageBase = require("../ContentPage/ContentPageBase");
const SystemContentPageForm = require("./SystemContentPageForm");
const Table = require("../Base/Table");
const ContentPageRouter = require("../ContentPage/ContentPageRouter");
class SystemContentPage extends PageBase {
    constructor(data) {
        super(data, SystemContentPageForm, Table, ContentPageRouter);
        this.data = data;
        ko.applyBindings(this);
        $('.hideUnbound').removeClass('hideUnbound');
    }
}
module.exports = SystemContentPage;

},{"../Base/Table":11,"../ContentPage/ContentPageBase":24,"../ContentPage/ContentPageRouter":26,"./SystemContentPageForm":82,"jquery":109,"knockout":111}],82:[function(require,module,exports){
"use strict";
const PageForm = require("../ContentPage/ContentPageForm");
class SystemContentPageForm extends PageForm {
    constructor(data, vm) {
        super(data, vm);
        this.data = data;
        this.vm = vm;
        this.addItemDetailClientOnlyProperties();
    }
    //add-contentblock
    setupBindigs() {
        super.setupBindigs();
        var self = this;
        var modelHolderSelector = $('.modalform-holder');
        //Adding
        modelHolderSelector.on('click', '.add-contentblock', function () {
            var data = ko.dataFor(this); //local this
            var row = self.vm.NewContentBlock;
            var rowCopy = ko.mapping.fromJS(ko.toJS(row));
            // self.addSortedCells(rowCopy);
            data.ContentBlocks.push(rowCopy);
        });
    }
}
module.exports = SystemContentPageForm;

},{"../ContentPage/ContentPageForm":25}],83:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
const Table = require("../Base/Table");
const Router = require("../Base/Router");
const Form = require("../Base/Form");
class UserLocation extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, Form, Table, Router);
        this.data = data;
        ko.applyBindings(this);
        $(".hideUnbound").removeClass("hideUnbound");
        //this.table.defaultSort = ""
    }
}
module.exports = UserLocation;

},{"../Base/Form":7,"../Base/Router":10,"../Base/Table":11,"../Base/VMBase":12,"jquery":109,"knockout":111}],84:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
const Table = require("../Base/Table");
const UserRouter = require("./UserRouter");
const Form = require("../Base/Form");
class User extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, Form, Table, UserRouter);
        this.data = data;
        ko.applyBindings(this);
        $(".hideUnbound").removeClass("hideUnbound");
    }
}
module.exports = User;

},{"../Base/Form":7,"../Base/Table":11,"../Base/VMBase":12,"./UserRouter":85,"jquery":109,"knockout":111}],85:[function(require,module,exports){
"use strict";
const Router = require("../Base/Router");
class UserRouter extends Router {
    constructor(data, vm, alternateroutes) {
        super(data, vm, alternateroutes);
        this.data = data;
        this.vm = vm;
    }
    getRoutes() {
        var self;
        self = this;
        return [
            {
                name: `${self.getArea()}/${self.data.Title}#/list`,
                func: () => {
                    self.vm.form.cancel();
                    self.vm.table.load();
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/new`,
                func() {
                    self.vm.form.add();
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/view/:id`,
                func() {
                    var id = this.params['id'];
                    self.vm.form.getDetail(id);
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/index`,
                func() {
                    self.vm.form.getDetail(null);
                },
                convertToRegEx: false
            },
            {
                name: `${self.getArea()}/${self.data.Title}#/delete/:id`,
                func() {
                    var id = this.params['id'];
                    self.vm.form.deleteItem(id);
                },
                convertToRegEx: false
            }
        ];
    }
}
module.exports = UserRouter;

},{"../Base/Router":10}],86:[function(require,module,exports){
"use strict";
/// This code was generated by Orange Onion Scaffolder.
// template: MVC.JSModule.cs
// class: Vendor
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
const Table = require("../Base/Table");
const Router = require("../Base/Router");
const Form = require("../Base/Form");
class Vendor extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, Form, Table, Router);
        this.data = data;
        ko.applyBindings(this);
        $('.hideUnbound').removeClass('hideUnbound');
    }
}
module.exports = Vendor;

},{"../Base/Form":7,"../Base/Router":10,"../Base/Table":11,"../Base/VMBase":12,"jquery":109,"knockout":111}],87:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
const Table = require("../Base/Table");
const Router = require("../Base/Router");
const Form = require("../Base/Form");
class VisitorScheduledMeeting extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, Form, Table, Router);
        this.data = data;
        $('.modalform-holder').on('click', '#save-visitor', () => {
            var promise = this.form.post();
            promise.done((data) => {
                window.location.href = "/lunar-new-year/schedule-a-visit/ThankYou";
            });
            return false;
        });
        ko.applyBindings(this);
        $('.hideUnbound').removeClass('hideUnbound');
    }
}
module.exports = VisitorScheduledMeeting;

},{"../Base/Form":7,"../Base/Router":10,"../Base/Table":11,"../Base/VMBase":12,"jquery":109,"knockout":111}],88:[function(require,module,exports){
"use strict";
const $ = require("jquery");
const ko = require("knockout");
const base = require("../Base/VMBase");
const Router = require("../Base/Router");
const Form = require("../Base/Form");
const YelpReviewTable = require("./YelpReviewTable");
const _ = require("underscore");
class YelpReview extends base.VmBase {
    constructor(data) {
        //call base class constructor
        super(data, Form, YelpReviewTable, Router);
        this.data = data;
        ko.applyBindings(this);
        $('.hideUnbound').removeClass('hideUnbound');
    }
    clearFilters() {
        _.each(this.Filters, (v) => {
            v('');
        });
    }
}
module.exports = YelpReview;

},{"../Base/Form":7,"../Base/Router":10,"../Base/VMBase":12,"./YelpReviewTable":89,"jquery":109,"knockout":111,"underscore":113}],89:[function(require,module,exports){
"use strict";
const Table = require("../Base/Table");
const ko = require("knockout");
const komapping = require("knockout.mapping");
ko.mapping = komapping;
class YelpReviewTable extends Table {
    constructor(data, vm) {
        super(data, vm);
        this.data = data;
        this.vm = vm;
    }
}
module.exports = YelpReviewTable;

},{"../Base/Table":11,"knockout":111,"knockout.mapping":110}],90:[function(require,module,exports){
(function (global){

; jQuery = global.jQuery = require("jquery");
; var __browserify_shim_require__=require;(function browserifyShim(module, define, require) {
﻿/**
* Loading plugin for jQuery
* version: v1.0.6
* 
* Small helper to give the user a visual feedback that something is happening 
* when fetching/posting data
* 
* USAGE:
* - global overlay:                     $.isLoading();
* - use javascript:                     $( selector ).isLoading();
* - On non-form elements:               $("div").isLoading({ text: "Loading", position:'inside'});
* - remove the loading element:         $( selector ).isLoading( "hide" );
*
* @author Laurent Blanes <laurent.blanes@gmail.com>
* ---
* Copyright 2013, Laurent Blanes ( https://github.com/hekigan/is-loading )
* 
* The MIT License (MIT)
* 
* Copyright (c) 2013 Laurent Blanes
* 
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
* 
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
* 
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
; (function ($, window, document, undefined) {

    // Create the defaults once
    var pluginName = "isLoading",
        defaults = {
            'position': "right",        // right | inside | overlay
            'text': "",                 // Text to display next to the loader
            'class': "icon-refresh",    // loader CSS class
            'tpl': '<span class="isloading-wrapper %wrapper%">%text%<i class="%class% icon-spin"></i></span>',    // loader base Tag
            'disableSource': true,      // true | false
            'disableOthers': []
        };

    // The actual plugin constructor
    function Plugin(element, options) {
        this.element = element;

        // Merge user options with default ones
        this.options = $.extend({}, defaults, options);

        this._defaults = defaults;
        this._name = pluginName;
        this._loader = null;                // Contain the loading tag element

        this.init();
    }

    // Contructor function for the plugin (only once on page load)
    function contruct() {

        if (!$[pluginName]) {
            $.isLoading = function (opts) {
                $("body").isLoading(opts);
            };
        }
    }

    Plugin.prototype = {

        init: function () {

            if ($(this.element).is("body")) {
                this.options.position = "overlay";
            }
            this.show();
        },

        show: function () {

            var self = this,
                tpl = self.options.tpl.replace('%wrapper%', ' isloading-show ' + ' isloading-' + self.options.position);
            tpl = tpl.replace('%class%', self.options['class']);
            tpl = tpl.replace('%text%', (self.options.text !== "") ? self.options.text + ' ' : '');
            self._loader = $(tpl);

            // Disable the element
            if ($(self.element).is("input, textarea") && true === self.options.disableSource) {

                $(self.element).attr("disabled", "disabled");

            }
            else if (true === self.options.disableSource) {

                $(self.element).addClass("disabled");

            }

            // Set position
            switch (self.options.position) {

                case "inside":
                    $(self.element).html(self._loader);
                    break;

                case "overlay":
                    var $wrapperTpl = null;

                    if ($(self.element).is("body")) {
                        $wrapperTpl = $('<div class="isloading-overlay" style="position:fixed; left:0; top:0; z-index: 10000; background: rgba(0,0,0,0.5); width: 100%; height: ' + $(window).height() + 'px;" />');
                        $("body").prepend($wrapperTpl);

                        $(window).on('resize', function () {
                            $wrapperTpl.height($(window).height() + 'px');
                            self._loader.css({ top: ($(window).height() / 2 - self._loader.outerHeight() / 2) + 'px' });
                        });
                    } else {
                        var cssPosition = $(self.element).css('position'),
                            pos = {},
                            height = $(self.element).outerHeight() + 'px',
                            width = '100%'; // $( self.element ).outerWidth() + 'px;

                        if ('relative' === cssPosition || 'absolute' === cssPosition) {
                            pos = { 'top': 0, 'left': 0 };
                        } else {
                            pos = $(self.element).position();
                        }
                        $wrapperTpl = $('<div class="isloading-overlay" style="position:absolute; top: ' + pos.top + 'px; left: ' + pos.left + 'px; z-index: 10000; background: rgba(0,0,0,0.5); width: ' + width + '; height: ' + height + ';" />');
                        $(self.element).prepend($wrapperTpl);

                        $(window).on('resize', function () {
                            $wrapperTpl.height($(self.element).outerHeight() + 'px');
                            self._loader.css({ top: ($wrapperTpl.outerHeight() / 2 - self._loader.outerHeight() / 2) + 'px' });
                        });
                    }

                    $wrapperTpl.html(self._loader);
                    self._loader.css({ top: ($wrapperTpl.outerHeight() / 2 - self._loader.outerHeight() / 2) + 'px' });
                    break;

                default:
                    $(self.element).after(self._loader);
                    break;
            }

            self.disableOthers();
        },

        hide: function () {

            if ("overlay" === this.options.position) {

                $(this.element).find(".isloading-overlay").first().remove();

            } else {

                $(this._loader).remove();
                $(this.element).text($(this.element).attr("data-isloading-label"));

            }

            $(this.element).removeAttr("disabled").removeClass("disabled");

            this.enableOthers();
        },

        disableOthers: function () {
            $.each(this.options.disableOthers, function (i, e) {
                var elt = $(e);
                if (elt.is("button, input, textarea")) {
                    elt.attr("disabled", "disabled");
                }
                else {
                    elt.addClass("disabled");
                }
            });
        },

        enableOthers: function () {
            $.each(this.options.disableOthers, function (i, e) {
                var elt = $(e);
                if (elt.is("button, input, textarea")) {
                    elt.removeAttr("disabled");
                }
                else {
                    elt.removeClass("disabled");
                }
            });
        }
    };

    // Constructor
    $.fn[pluginName] = function (options) {
        return this.each(function () {
            if (options && "hide" !== options || !$.data(this, "plugin_" + pluginName)) {
                $.data(this, "plugin_" + pluginName, new Plugin(this, options));
            } else {
                var elt = $.data(this, "plugin_" + pluginName);

                if ("hide" === options) { elt.hide(); }
                else { elt.show(); }
            }
        });
    };

    contruct();

})(jQuery, window, document);
}).call(global, module, undefined, undefined);

}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlNjcmlwdHMvbGliL2pxdWVyeS5pc2xvYWRpbmcuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIlxuOyBqUXVlcnkgPSBnbG9iYWwualF1ZXJ5ID0gcmVxdWlyZShcImpxdWVyeVwiKTtcbjsgdmFyIF9fYnJvd3NlcmlmeV9zaGltX3JlcXVpcmVfXz1yZXF1aXJlOyhmdW5jdGlvbiBicm93c2VyaWZ5U2hpbShtb2R1bGUsIGRlZmluZSwgcmVxdWlyZSkge1xu77u/LyoqXHJcbiogTG9hZGluZyBwbHVnaW4gZm9yIGpRdWVyeVxyXG4qIHZlcnNpb246IHYxLjAuNlxyXG4qIFxyXG4qIFNtYWxsIGhlbHBlciB0byBnaXZlIHRoZSB1c2VyIGEgdmlzdWFsIGZlZWRiYWNrIHRoYXQgc29tZXRoaW5nIGlzIGhhcHBlbmluZyBcclxuKiB3aGVuIGZldGNoaW5nL3Bvc3RpbmcgZGF0YVxyXG4qIFxyXG4qIFVTQUdFOlxyXG4qIC0gZ2xvYmFsIG92ZXJsYXk6ICAgICAgICAgICAgICAgICAgICAgJC5pc0xvYWRpbmcoKTtcclxuKiAtIHVzZSBqYXZhc2NyaXB0OiAgICAgICAgICAgICAgICAgICAgICQoIHNlbGVjdG9yICkuaXNMb2FkaW5nKCk7XHJcbiogLSBPbiBub24tZm9ybSBlbGVtZW50czogICAgICAgICAgICAgICAkKFwiZGl2XCIpLmlzTG9hZGluZyh7IHRleHQ6IFwiTG9hZGluZ1wiLCBwb3NpdGlvbjonaW5zaWRlJ30pO1xyXG4qIC0gcmVtb3ZlIHRoZSBsb2FkaW5nIGVsZW1lbnQ6ICAgICAgICAgJCggc2VsZWN0b3IgKS5pc0xvYWRpbmcoIFwiaGlkZVwiICk7XHJcbipcclxuKiBAYXV0aG9yIExhdXJlbnQgQmxhbmVzIDxsYXVyZW50LmJsYW5lc0BnbWFpbC5jb20+XHJcbiogLS0tXHJcbiogQ29weXJpZ2h0IDIwMTMsIExhdXJlbnQgQmxhbmVzICggaHR0cHM6Ly9naXRodWIuY29tL2hla2lnYW4vaXMtbG9hZGluZyApXHJcbiogXHJcbiogVGhlIE1JVCBMaWNlbnNlIChNSVQpXHJcbiogXHJcbiogQ29weXJpZ2h0IChjKSAyMDEzIExhdXJlbnQgQmxhbmVzXHJcbiogXHJcbiogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxyXG4qIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcclxuKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXHJcbiogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxyXG4qIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xyXG4qIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XHJcbiogXHJcbiogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cclxuKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cclxuKiBcclxuKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXHJcbiogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXHJcbiogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXHJcbiogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxyXG4qIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXHJcbiogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxyXG4qIFRIRSBTT0ZUV0FSRS5cclxuKi9cclxuOyAoZnVuY3Rpb24gKCQsIHdpbmRvdywgZG9jdW1lbnQsIHVuZGVmaW5lZCkge1xyXG5cclxuICAgIC8vIENyZWF0ZSB0aGUgZGVmYXVsdHMgb25jZVxyXG4gICAgdmFyIHBsdWdpbk5hbWUgPSBcImlzTG9hZGluZ1wiLFxyXG4gICAgICAgIGRlZmF1bHRzID0ge1xyXG4gICAgICAgICAgICAncG9zaXRpb24nOiBcInJpZ2h0XCIsICAgICAgICAvLyByaWdodCB8IGluc2lkZSB8IG92ZXJsYXlcclxuICAgICAgICAgICAgJ3RleHQnOiBcIlwiLCAgICAgICAgICAgICAgICAgLy8gVGV4dCB0byBkaXNwbGF5IG5leHQgdG8gdGhlIGxvYWRlclxyXG4gICAgICAgICAgICAnY2xhc3MnOiBcImljb24tcmVmcmVzaFwiLCAgICAvLyBsb2FkZXIgQ1NTIGNsYXNzXHJcbiAgICAgICAgICAgICd0cGwnOiAnPHNwYW4gY2xhc3M9XCJpc2xvYWRpbmctd3JhcHBlciAld3JhcHBlciVcIj4ldGV4dCU8aSBjbGFzcz1cIiVjbGFzcyUgaWNvbi1zcGluXCI+PC9pPjwvc3Bhbj4nLCAgICAvLyBsb2FkZXIgYmFzZSBUYWdcclxuICAgICAgICAgICAgJ2Rpc2FibGVTb3VyY2UnOiB0cnVlLCAgICAgIC8vIHRydWUgfCBmYWxzZVxyXG4gICAgICAgICAgICAnZGlzYWJsZU90aGVycyc6IFtdXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAvLyBUaGUgYWN0dWFsIHBsdWdpbiBjb25zdHJ1Y3RvclxyXG4gICAgZnVuY3Rpb24gUGx1Z2luKGVsZW1lbnQsIG9wdGlvbnMpIHtcclxuICAgICAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50O1xyXG5cclxuICAgICAgICAvLyBNZXJnZSB1c2VyIG9wdGlvbnMgd2l0aCBkZWZhdWx0IG9uZXNcclxuICAgICAgICB0aGlzLm9wdGlvbnMgPSAkLmV4dGVuZCh7fSwgZGVmYXVsdHMsIG9wdGlvbnMpO1xyXG5cclxuICAgICAgICB0aGlzLl9kZWZhdWx0cyA9IGRlZmF1bHRzO1xyXG4gICAgICAgIHRoaXMuX25hbWUgPSBwbHVnaW5OYW1lO1xyXG4gICAgICAgIHRoaXMuX2xvYWRlciA9IG51bGw7ICAgICAgICAgICAgICAgIC8vIENvbnRhaW4gdGhlIGxvYWRpbmcgdGFnIGVsZW1lbnRcclxuXHJcbiAgICAgICAgdGhpcy5pbml0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ29udHJ1Y3RvciBmdW5jdGlvbiBmb3IgdGhlIHBsdWdpbiAob25seSBvbmNlIG9uIHBhZ2UgbG9hZClcclxuICAgIGZ1bmN0aW9uIGNvbnRydWN0KCkge1xyXG5cclxuICAgICAgICBpZiAoISRbcGx1Z2luTmFtZV0pIHtcclxuICAgICAgICAgICAgJC5pc0xvYWRpbmcgPSBmdW5jdGlvbiAob3B0cykge1xyXG4gICAgICAgICAgICAgICAgJChcImJvZHlcIikuaXNMb2FkaW5nKG9wdHMpO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBQbHVnaW4ucHJvdG90eXBlID0ge1xyXG5cclxuICAgICAgICBpbml0OiBmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgICAgICAgICBpZiAoJCh0aGlzLmVsZW1lbnQpLmlzKFwiYm9keVwiKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uID0gXCJvdmVybGF5XCI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5zaG93KCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgc2hvdzogZnVuY3Rpb24gKCkge1xyXG5cclxuICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzLFxyXG4gICAgICAgICAgICAgICAgdHBsID0gc2VsZi5vcHRpb25zLnRwbC5yZXBsYWNlKCcld3JhcHBlciUnLCAnIGlzbG9hZGluZy1zaG93ICcgKyAnIGlzbG9hZGluZy0nICsgc2VsZi5vcHRpb25zLnBvc2l0aW9uKTtcclxuICAgICAgICAgICAgdHBsID0gdHBsLnJlcGxhY2UoJyVjbGFzcyUnLCBzZWxmLm9wdGlvbnNbJ2NsYXNzJ10pO1xyXG4gICAgICAgICAgICB0cGwgPSB0cGwucmVwbGFjZSgnJXRleHQlJywgKHNlbGYub3B0aW9ucy50ZXh0ICE9PSBcIlwiKSA/IHNlbGYub3B0aW9ucy50ZXh0ICsgJyAnIDogJycpO1xyXG4gICAgICAgICAgICBzZWxmLl9sb2FkZXIgPSAkKHRwbCk7XHJcblxyXG4gICAgICAgICAgICAvLyBEaXNhYmxlIHRoZSBlbGVtZW50XHJcbiAgICAgICAgICAgIGlmICgkKHNlbGYuZWxlbWVudCkuaXMoXCJpbnB1dCwgdGV4dGFyZWFcIikgJiYgdHJ1ZSA9PT0gc2VsZi5vcHRpb25zLmRpc2FibGVTb3VyY2UpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAkKHNlbGYuZWxlbWVudCkuYXR0cihcImRpc2FibGVkXCIsIFwiZGlzYWJsZWRcIik7XHJcblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHRydWUgPT09IHNlbGYub3B0aW9ucy5kaXNhYmxlU291cmNlKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgJChzZWxmLmVsZW1lbnQpLmFkZENsYXNzKFwiZGlzYWJsZWRcIik7XHJcblxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBTZXQgcG9zaXRpb25cclxuICAgICAgICAgICAgc3dpdGNoIChzZWxmLm9wdGlvbnMucG9zaXRpb24pIHtcclxuXHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiaW5zaWRlXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgJChzZWxmLmVsZW1lbnQpLmh0bWwoc2VsZi5fbG9hZGVyKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgICAgICBjYXNlIFwib3ZlcmxheVwiOlxyXG4gICAgICAgICAgICAgICAgICAgIHZhciAkd3JhcHBlclRwbCA9IG51bGw7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICgkKHNlbGYuZWxlbWVudCkuaXMoXCJib2R5XCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICR3cmFwcGVyVHBsID0gJCgnPGRpdiBjbGFzcz1cImlzbG9hZGluZy1vdmVybGF5XCIgc3R5bGU9XCJwb3NpdGlvbjpmaXhlZDsgbGVmdDowOyB0b3A6MDsgei1pbmRleDogMTAwMDA7IGJhY2tncm91bmQ6IHJnYmEoMCwwLDAsMC41KTsgd2lkdGg6IDEwMCU7IGhlaWdodDogJyArICQod2luZG93KS5oZWlnaHQoKSArICdweDtcIiAvPicpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAkKFwiYm9keVwiKS5wcmVwZW5kKCR3cmFwcGVyVHBsKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICQod2luZG93KS5vbigncmVzaXplJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHdyYXBwZXJUcGwuaGVpZ2h0KCQod2luZG93KS5oZWlnaHQoKSArICdweCcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fbG9hZGVyLmNzcyh7IHRvcDogKCQod2luZG93KS5oZWlnaHQoKSAvIDIgLSBzZWxmLl9sb2FkZXIub3V0ZXJIZWlnaHQoKSAvIDIpICsgJ3B4JyB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNzc1Bvc2l0aW9uID0gJChzZWxmLmVsZW1lbnQpLmNzcygncG9zaXRpb24nKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcyA9IHt9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ID0gJChzZWxmLmVsZW1lbnQpLm91dGVySGVpZ2h0KCkgKyAncHgnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSAnMTAwJSc7IC8vICQoIHNlbGYuZWxlbWVudCApLm91dGVyV2lkdGgoKSArICdweDtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgncmVsYXRpdmUnID09PSBjc3NQb3NpdGlvbiB8fCAnYWJzb2x1dGUnID09PSBjc3NQb3NpdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zID0geyAndG9wJzogMCwgJ2xlZnQnOiAwIH07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3MgPSAkKHNlbGYuZWxlbWVudCkucG9zaXRpb24oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAkd3JhcHBlclRwbCA9ICQoJzxkaXYgY2xhc3M9XCJpc2xvYWRpbmctb3ZlcmxheVwiIHN0eWxlPVwicG9zaXRpb246YWJzb2x1dGU7IHRvcDogJyArIHBvcy50b3AgKyAncHg7IGxlZnQ6ICcgKyBwb3MubGVmdCArICdweDsgei1pbmRleDogMTAwMDA7IGJhY2tncm91bmQ6IHJnYmEoMCwwLDAsMC41KTsgd2lkdGg6ICcgKyB3aWR0aCArICc7IGhlaWdodDogJyArIGhlaWdodCArICc7XCIgLz4nKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmVsZW1lbnQpLnByZXBlbmQoJHdyYXBwZXJUcGwpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgJCh3aW5kb3cpLm9uKCdyZXNpemUnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkd3JhcHBlclRwbC5oZWlnaHQoJChzZWxmLmVsZW1lbnQpLm91dGVySGVpZ2h0KCkgKyAncHgnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2xvYWRlci5jc3MoeyB0b3A6ICgkd3JhcHBlclRwbC5vdXRlckhlaWdodCgpIC8gMiAtIHNlbGYuX2xvYWRlci5vdXRlckhlaWdodCgpIC8gMikgKyAncHgnIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICR3cmFwcGVyVHBsLmh0bWwoc2VsZi5fbG9hZGVyKTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLl9sb2FkZXIuY3NzKHsgdG9wOiAoJHdyYXBwZXJUcGwub3V0ZXJIZWlnaHQoKSAvIDIgLSBzZWxmLl9sb2FkZXIub3V0ZXJIZWlnaHQoKSAvIDIpICsgJ3B4JyB9KTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgICQoc2VsZi5lbGVtZW50KS5hZnRlcihzZWxmLl9sb2FkZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBzZWxmLmRpc2FibGVPdGhlcnMoKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBoaWRlOiBmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgICAgICAgICBpZiAoXCJvdmVybGF5XCIgPT09IHRoaXMub3B0aW9ucy5wb3NpdGlvbikge1xyXG5cclxuICAgICAgICAgICAgICAgICQodGhpcy5lbGVtZW50KS5maW5kKFwiLmlzbG9hZGluZy1vdmVybGF5XCIpLmZpcnN0KCkucmVtb3ZlKCk7XHJcblxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG5cclxuICAgICAgICAgICAgICAgICQodGhpcy5fbG9hZGVyKS5yZW1vdmUoKTtcclxuICAgICAgICAgICAgICAgICQodGhpcy5lbGVtZW50KS50ZXh0KCQodGhpcy5lbGVtZW50KS5hdHRyKFwiZGF0YS1pc2xvYWRpbmctbGFiZWxcIikpO1xyXG5cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgJCh0aGlzLmVsZW1lbnQpLnJlbW92ZUF0dHIoXCJkaXNhYmxlZFwiKS5yZW1vdmVDbGFzcyhcImRpc2FibGVkXCIpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5lbmFibGVPdGhlcnMoKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBkaXNhYmxlT3RoZXJzOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICQuZWFjaCh0aGlzLm9wdGlvbnMuZGlzYWJsZU90aGVycywgZnVuY3Rpb24gKGksIGUpIHtcclxuICAgICAgICAgICAgICAgIHZhciBlbHQgPSAkKGUpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGVsdC5pcyhcImJ1dHRvbiwgaW5wdXQsIHRleHRhcmVhXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZWx0LmF0dHIoXCJkaXNhYmxlZFwiLCBcImRpc2FibGVkXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZWx0LmFkZENsYXNzKFwiZGlzYWJsZWRcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIGVuYWJsZU90aGVyczogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAkLmVhY2godGhpcy5vcHRpb25zLmRpc2FibGVPdGhlcnMsIGZ1bmN0aW9uIChpLCBlKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZWx0ID0gJChlKTtcclxuICAgICAgICAgICAgICAgIGlmIChlbHQuaXMoXCJidXR0b24sIGlucHV0LCB0ZXh0YXJlYVwiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVsdC5yZW1vdmVBdHRyKFwiZGlzYWJsZWRcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBlbHQucmVtb3ZlQ2xhc3MoXCJkaXNhYmxlZFwiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICAvLyBDb25zdHJ1Y3RvclxyXG4gICAgJC5mbltwbHVnaW5OYW1lXSA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmIChvcHRpb25zICYmIFwiaGlkZVwiICE9PSBvcHRpb25zIHx8ICEkLmRhdGEodGhpcywgXCJwbHVnaW5fXCIgKyBwbHVnaW5OYW1lKSkge1xyXG4gICAgICAgICAgICAgICAgJC5kYXRhKHRoaXMsIFwicGx1Z2luX1wiICsgcGx1Z2luTmFtZSwgbmV3IFBsdWdpbih0aGlzLCBvcHRpb25zKSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZWx0ID0gJC5kYXRhKHRoaXMsIFwicGx1Z2luX1wiICsgcGx1Z2luTmFtZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKFwiaGlkZVwiID09PSBvcHRpb25zKSB7IGVsdC5oaWRlKCk7IH1cclxuICAgICAgICAgICAgICAgIGVsc2UgeyBlbHQuc2hvdygpOyB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH07XHJcblxyXG4gICAgY29udHJ1Y3QoKTtcclxuXHJcbn0pKGpRdWVyeSwgd2luZG93LCBkb2N1bWVudCk7XG59KS5jYWxsKGdsb2JhbCwgbW9kdWxlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCk7XG4iXX0=
},{"jquery":109}],91:[function(require,module,exports){
(function (global){

; bootstrap = global.bootstrap = require("bootstrap");
moment = global.moment = require("moment");
jQuery = global.jQuery = require("jquery");
ko = global.ko = require("knockout");
; var __browserify_shim_require__=require;(function browserifyShim(module, define, require) {
(function ($, ko, moment, undefined) {

    //#region Utils

    var detectDataType = function (value) {
        for (var fname in detectDataType.typeDetection) {
            var f = detectDataType[fname];
            if (f(value)) {
                return detectDataType.typeDetection[fname];
            }
        }
        return null;
    };

    detectDataType.isString = function (value) {
        return typeof value === 'string';
    };
    detectDataType.isDate = function (value) {
        return typeof value === 'object' && Object.prototype.toString.call(value) === "[object Date]";
    };
    detectDataType.isMoment = function (value) {
        return moment.isMoment(value);
    };
    detectDataType.typeDetection = {
        "isMoment": "moment",
        "isString": "string",
        "isDate": "date"
    };

    var elBinder = function($el) {
        return {
            set: function(value) {
                if (value === undefined) {
                    value = null;
                }
                var funcs = elBinder.functions[$el.data(elBinder.DATATYPE_KEY)] || elBinder.functions['_default'];
                var func = funcs['set'] || elBinder.functions['_default']['set'];
                return func($el, value);
            },
            get: function() {
                var funcs = elBinder.functions[$el.data(elBinder.DATATYPE_KEY)] || elBinder.functions['_default'];
                var func = funcs['get'] || elBinder.functions['_default']['get'];
                return func($el);
            },
            register: function(dataType) {
                $el.data(elBinder.DATATYPE_KEY, dataType);
            }
        }
    };
    
    elBinder.DATATYPE_KEY = "datepicker.ko.dataType";

    elBinder.functions = {
        '_default': {
            get: function ($el) {
                return $el.datepicker('get');
            },
            set: function ($el, value) {
                $el.datepicker('set', value);
            }
        },
        'iso': {
            get: function ($el) {
                var value = $el.datepicker('get');
                return (value && value.format('YYYY-MM-DD'));
            },
            set: function ($el, value) {
                var mnt = moment(value);
                $el.datepicker('set', mnt);
            }
        },
        'format': {
            get: function ($el) {
                return $el.datepicker('getAsText');
            }
        },
        'date': {
            get: function ($el) {
                var value = $el.datepicker('get');
                return (value && value.toDate());
            }
        }
    };

    //#endregion

    ko.bindingHandlers.datepicker = {
        init: function (element, valueAccessor, allBindingsAccessor) {
            var options = allBindingsAccessor().datepickerOptions || {};
            var dataType = options.dataType || detectDataType(ko.utils.unwrapObservable(valueAccessor()));
            dataType = !dataType || dataType == 'string' ? 'iso' : dataType;
            var $el = $(element).datepicker(options);

            elBinder($el).register(dataType);

            ko.utils.registerEventHandler(element, "changeDate", function (event) {
                var accessor = valueAccessor();
                if (ko.isObservable(accessor)) {
                    var value = elBinder($el).get();
                    accessor(value);
                }
            });
        },
        update: function (element, valueAccessor) {
            elBinder($(element))
                .set(ko.utils.unwrapObservable(valueAccessor()));
        }
    };


    ko.bindingHandlers.datetimepicker = {
        init: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
            //initialize datepicker with some optional options
            var options = {
                format: 'DD/MM/YYYY hh:mm A',
                defaultDate: valueAccessor()()
            };

            if (allBindingsAccessor() !== undefined) {
                if (allBindingsAccessor().datepickerOptions !== undefined) {
                    options.format = allBindingsAccessor().datepickerOptions.format !== undefined ? allBindingsAccessor().datepickerOptions.format : options.format;
                }
            }

            $(element).datetimepicker(options);

            //when a user changes the date, update the view model
            ko.utils.registerEventHandler(element, "dp.change", function (event) {
                var value = valueAccessor();
                if (ko.isObservable(value)) {
                    value(event.date);
                }
            });
        },
        update: function (element, valueAccessor) {
            elBinder($(element))
                .set(ko.utils.unwrapObservable(valueAccessor()));
        }
    };
})(jQuery, this.ko, this.moment);
}).call(global, module, undefined, undefined);

}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlNjcmlwdHMvbGliL21vbWVudC1kYXRlcGlja2VyLWtvLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiXG47IGJvb3RzdHJhcCA9IGdsb2JhbC5ib290c3RyYXAgPSByZXF1aXJlKFwiYm9vdHN0cmFwXCIpO1xubW9tZW50ID0gZ2xvYmFsLm1vbWVudCA9IHJlcXVpcmUoXCJtb21lbnRcIik7XG5qUXVlcnkgPSBnbG9iYWwualF1ZXJ5ID0gcmVxdWlyZShcImpxdWVyeVwiKTtcbmtvID0gZ2xvYmFsLmtvID0gcmVxdWlyZShcImtub2Nrb3V0XCIpO1xuOyB2YXIgX19icm93c2VyaWZ5X3NoaW1fcmVxdWlyZV9fPXJlcXVpcmU7KGZ1bmN0aW9uIGJyb3dzZXJpZnlTaGltKG1vZHVsZSwgZGVmaW5lLCByZXF1aXJlKSB7XG4oZnVuY3Rpb24gKCQsIGtvLCBtb21lbnQsIHVuZGVmaW5lZCkge1xyXG5cclxuICAgIC8vI3JlZ2lvbiBVdGlsc1xyXG5cclxuICAgIHZhciBkZXRlY3REYXRhVHlwZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xyXG4gICAgICAgIGZvciAodmFyIGZuYW1lIGluIGRldGVjdERhdGFUeXBlLnR5cGVEZXRlY3Rpb24pIHtcclxuICAgICAgICAgICAgdmFyIGYgPSBkZXRlY3REYXRhVHlwZVtmbmFtZV07XHJcbiAgICAgICAgICAgIGlmIChmKHZhbHVlKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRldGVjdERhdGFUeXBlLnR5cGVEZXRlY3Rpb25bZm5hbWVdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfTtcclxuXHJcbiAgICBkZXRlY3REYXRhVHlwZS5pc1N0cmluZyA9IGZ1bmN0aW9uICh2YWx1ZSkge1xyXG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnO1xyXG4gICAgfTtcclxuICAgIGRldGVjdERhdGFUeXBlLmlzRGF0ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xyXG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09IFwiW29iamVjdCBEYXRlXVwiO1xyXG4gICAgfTtcclxuICAgIGRldGVjdERhdGFUeXBlLmlzTW9tZW50ID0gZnVuY3Rpb24gKHZhbHVlKSB7XHJcbiAgICAgICAgcmV0dXJuIG1vbWVudC5pc01vbWVudCh2YWx1ZSk7XHJcbiAgICB9O1xyXG4gICAgZGV0ZWN0RGF0YVR5cGUudHlwZURldGVjdGlvbiA9IHtcclxuICAgICAgICBcImlzTW9tZW50XCI6IFwibW9tZW50XCIsXHJcbiAgICAgICAgXCJpc1N0cmluZ1wiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgIFwiaXNEYXRlXCI6IFwiZGF0ZVwiXHJcbiAgICB9O1xyXG5cclxuICAgIHZhciBlbEJpbmRlciA9IGZ1bmN0aW9uKCRlbCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24odmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdmFyIGZ1bmNzID0gZWxCaW5kZXIuZnVuY3Rpb25zWyRlbC5kYXRhKGVsQmluZGVyLkRBVEFUWVBFX0tFWSldIHx8IGVsQmluZGVyLmZ1bmN0aW9uc1snX2RlZmF1bHQnXTtcclxuICAgICAgICAgICAgICAgIHZhciBmdW5jID0gZnVuY3NbJ3NldCddIHx8IGVsQmluZGVyLmZ1bmN0aW9uc1snX2RlZmF1bHQnXVsnc2V0J107XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZnVuYygkZWwsIHZhbHVlKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgIHZhciBmdW5jcyA9IGVsQmluZGVyLmZ1bmN0aW9uc1skZWwuZGF0YShlbEJpbmRlci5EQVRBVFlQRV9LRVkpXSB8fCBlbEJpbmRlci5mdW5jdGlvbnNbJ19kZWZhdWx0J107XHJcbiAgICAgICAgICAgICAgICB2YXIgZnVuYyA9IGZ1bmNzWydnZXQnXSB8fCBlbEJpbmRlci5mdW5jdGlvbnNbJ19kZWZhdWx0J11bJ2dldCddO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmMoJGVsKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgcmVnaXN0ZXI6IGZ1bmN0aW9uKGRhdGFUeXBlKSB7XHJcbiAgICAgICAgICAgICAgICAkZWwuZGF0YShlbEJpbmRlci5EQVRBVFlQRV9LRVksIGRhdGFUeXBlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICBcclxuICAgIGVsQmluZGVyLkRBVEFUWVBFX0tFWSA9IFwiZGF0ZXBpY2tlci5rby5kYXRhVHlwZVwiO1xyXG5cclxuICAgIGVsQmluZGVyLmZ1bmN0aW9ucyA9IHtcclxuICAgICAgICAnX2RlZmF1bHQnOiB7XHJcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCRlbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICRlbC5kYXRlcGlja2VyKCdnZXQnKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAoJGVsLCB2YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgJGVsLmRhdGVwaWNrZXIoJ3NldCcsIHZhbHVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgJ2lzbyc6IHtcclxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoJGVsKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSAkZWwuZGF0ZXBpY2tlcignZ2V0Jyk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gKHZhbHVlICYmIHZhbHVlLmZvcm1hdCgnWVlZWS1NTS1ERCcpKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAoJGVsLCB2YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIG1udCA9IG1vbWVudCh2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAkZWwuZGF0ZXBpY2tlcignc2V0JywgbW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgJ2Zvcm1hdCc6IHtcclxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoJGVsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJGVsLmRhdGVwaWNrZXIoJ2dldEFzVGV4dCcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICAnZGF0ZSc6IHtcclxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoJGVsKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSAkZWwuZGF0ZXBpY2tlcignZ2V0Jyk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gKHZhbHVlICYmIHZhbHVlLnRvRGF0ZSgpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgLy8jZW5kcmVnaW9uXHJcblxyXG4gICAga28uYmluZGluZ0hhbmRsZXJzLmRhdGVwaWNrZXIgPSB7XHJcbiAgICAgICAgaW5pdDogZnVuY3Rpb24gKGVsZW1lbnQsIHZhbHVlQWNjZXNzb3IsIGFsbEJpbmRpbmdzQWNjZXNzb3IpIHtcclxuICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSBhbGxCaW5kaW5nc0FjY2Vzc29yKCkuZGF0ZXBpY2tlck9wdGlvbnMgfHwge307XHJcbiAgICAgICAgICAgIHZhciBkYXRhVHlwZSA9IG9wdGlvbnMuZGF0YVR5cGUgfHwgZGV0ZWN0RGF0YVR5cGUoa28udXRpbHMudW53cmFwT2JzZXJ2YWJsZSh2YWx1ZUFjY2Vzc29yKCkpKTtcclxuICAgICAgICAgICAgZGF0YVR5cGUgPSAhZGF0YVR5cGUgfHwgZGF0YVR5cGUgPT0gJ3N0cmluZycgPyAnaXNvJyA6IGRhdGFUeXBlO1xyXG4gICAgICAgICAgICB2YXIgJGVsID0gJChlbGVtZW50KS5kYXRlcGlja2VyKG9wdGlvbnMpO1xyXG5cclxuICAgICAgICAgICAgZWxCaW5kZXIoJGVsKS5yZWdpc3RlcihkYXRhVHlwZSk7XHJcblxyXG4gICAgICAgICAgICBrby51dGlscy5yZWdpc3RlckV2ZW50SGFuZGxlcihlbGVtZW50LCBcImNoYW5nZURhdGVcIiwgZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgYWNjZXNzb3IgPSB2YWx1ZUFjY2Vzc29yKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoa28uaXNPYnNlcnZhYmxlKGFjY2Vzc29yKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IGVsQmluZGVyKCRlbCkuZ2V0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYWNjZXNzb3IodmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIHVwZGF0ZTogZnVuY3Rpb24gKGVsZW1lbnQsIHZhbHVlQWNjZXNzb3IpIHtcclxuICAgICAgICAgICAgZWxCaW5kZXIoJChlbGVtZW50KSlcclxuICAgICAgICAgICAgICAgIC5zZXQoa28udXRpbHMudW53cmFwT2JzZXJ2YWJsZSh2YWx1ZUFjY2Vzc29yKCkpKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuXHJcbiAgICBrby5iaW5kaW5nSGFuZGxlcnMuZGF0ZXRpbWVwaWNrZXIgPSB7XHJcbiAgICAgICAgaW5pdDogZnVuY3Rpb24gKGVsZW1lbnQsIHZhbHVlQWNjZXNzb3IsIGFsbEJpbmRpbmdzQWNjZXNzb3IsIHZpZXdNb2RlbCwgYmluZGluZ0NvbnRleHQpIHtcclxuICAgICAgICAgICAgLy9pbml0aWFsaXplIGRhdGVwaWNrZXIgd2l0aCBzb21lIG9wdGlvbmFsIG9wdGlvbnNcclxuICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSB7XHJcbiAgICAgICAgICAgICAgICBmb3JtYXQ6ICdERC9NTS9ZWVlZIGhoOm1tIEEnLFxyXG4gICAgICAgICAgICAgICAgZGVmYXVsdERhdGU6IHZhbHVlQWNjZXNzb3IoKSgpXHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBpZiAoYWxsQmluZGluZ3NBY2Nlc3NvcigpICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGlmIChhbGxCaW5kaW5nc0FjY2Vzc29yKCkuZGF0ZXBpY2tlck9wdGlvbnMgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZm9ybWF0ID0gYWxsQmluZGluZ3NBY2Nlc3NvcigpLmRhdGVwaWNrZXJPcHRpb25zLmZvcm1hdCAhPT0gdW5kZWZpbmVkID8gYWxsQmluZGluZ3NBY2Nlc3NvcigpLmRhdGVwaWNrZXJPcHRpb25zLmZvcm1hdCA6IG9wdGlvbnMuZm9ybWF0O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAkKGVsZW1lbnQpLmRhdGV0aW1lcGlja2VyKG9wdGlvbnMpO1xyXG5cclxuICAgICAgICAgICAgLy93aGVuIGEgdXNlciBjaGFuZ2VzIHRoZSBkYXRlLCB1cGRhdGUgdGhlIHZpZXcgbW9kZWxcclxuICAgICAgICAgICAga28udXRpbHMucmVnaXN0ZXJFdmVudEhhbmRsZXIoZWxlbWVudCwgXCJkcC5jaGFuZ2VcIiwgZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSB2YWx1ZUFjY2Vzc29yKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoa28uaXNPYnNlcnZhYmxlKHZhbHVlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlKGV2ZW50LmRhdGUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIHVwZGF0ZTogZnVuY3Rpb24gKGVsZW1lbnQsIHZhbHVlQWNjZXNzb3IpIHtcclxuICAgICAgICAgICAgZWxCaW5kZXIoJChlbGVtZW50KSlcclxuICAgICAgICAgICAgICAgIC5zZXQoa28udXRpbHMudW53cmFwT2JzZXJ2YWJsZSh2YWx1ZUFjY2Vzc29yKCkpKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG59KShqUXVlcnksIHRoaXMua28sIHRoaXMubW9tZW50KTtcbn0pLmNhbGwoZ2xvYmFsLCBtb2R1bGUsIHVuZGVmaW5lZCwgdW5kZWZpbmVkKTtcbiJdfQ==
},{"bootstrap":96,"jquery":109,"knockout":111,"moment":112}],92:[function(require,module,exports){
(function (global){

; moment = global.moment = require("moment");
jQuery = global.jQuery = require("jquery");
; var __browserify_shim_require__=require;(function browserifyShim(module, define, require) {
/* =========================================================
 * MomentDatepicker
 * Based on http://www.eyecon.ro/bootstrap-datepicker
 * =========================================================
 * Copyright 2012 Andres Moschini
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * ========================================================= */

!function ($, moment, undefined) {

    // Picker object

    var Datepicker = function (element, options) {
        this.element = $(element);
        this.autoHide = true && (options.autoHide !== false) && (this.element.data('datepicker-autohide') !== false);
        this.format = options.format || this.element.data('datepicker-format') || moment.localeData().longDateFormat('L');
        this.calendarPlacement = options.calendarPlacement || this.element.data('datepicker-calendarplacement') || 'right';
        this.picker = $(DPGlobal.template)
							.appendTo(options.container)
							.on({
							    click: $.proxy(this.click, this),
							    mousedown: $.proxy(this.mousedown, this)
							});

        this.$viewport = $(options.viewport || options.container);

        var startDateText = options.startDate || this.element.data('datepicker-startdate') || undefined;
        this.startDate = (startDateText) ? DPGlobal.parseDate(startDateText, this.format) : undefined;
        var endDateText = options.endDate || this.element.data('datepicker-enddate') || undefined;
        this.endDate = (endDateText) ? DPGlobal.parseDate(endDateText, this.format) : undefined;
        this.isInput = this.element.is('input');
        this.component = !this.isInput && this.element.is('.date') ? this.element.find('.input-group-addon, .add-on') : false;

        if (this.isInput) {
            this.element.on({
                focus: $.proxy(this.show, this),
                blur: $.proxy(function (e) {
                    this._hide();
                    this.triggerChangeDate();
                }, this),
                input: $.proxy(function (e) {
                    this.updateFromValue(true);
                }, this),
                keyup: $.proxy(function (e) {
                    if (e.keyCode == 13)
                        this.updateFromValue();
                }, this),
                click: $.proxy(this.show, this)
            });
        } else {
            if (this.component) {
                this.component.on('click', $.proxy(this.show, this));
            } else {
                this.element.on('click', $.proxy(this.show, this));
            }
        }
        this.minViewMode = options.minViewMode || this.element.data('datepicker-minviewmode') || 0;
        if (typeof this.minViewMode === 'string') {
            switch (this.minViewMode) {
                case 'months':
                    this.minViewMode = 1;
                    break;
                case 'years':
                    this.minViewMode = 2;
                    break;
                default:
                    this.minViewMode = 0;
                    break;
            }
        }
        this.viewMode = options.viewMode || this.element.data('datepicker-viewmode') || 0;
        if (typeof this.viewMode === 'string') {
            switch (this.viewMode) {
                case 'months':
                    this.viewMode = 1;
                    break;
                case 'years':
                    this.viewMode = 2;
                    break;
                default:
                    this.viewMode = 0;
                    break;
            }
        }
        this.startViewMode = this.viewMode;
        this.weekStart = options.weekStart || this.element.data('datepicker-weekstart') || 0;
        this.weekEnd = this.weekStart === 0 ? 6 : this.weekStart - 1;
        this.fillDow();
        this.fillMonths();
        this.setCustomClasses();
        this.updateFromValue();
        this.showMode();
        this.refresh();
    };

    Datepicker.prototype = {
        constructor: Datepicker,
        get: function () {
            return (this.moment && this.moment.clone());
        },
        getAsText: function (format) {
            var displayFormat = this.format;
            if (Object.prototype.toString.call(displayFormat) === '[object Array]') {
                displayFormat = displayFormat[0];
            }
            return (this.moment && this.moment.format(format || displayFormat)) || '';
        },
        show: function (e) {

            if (this.isInput && this.element.is(':disabled')) { return; }

            else if (this.element.children('input').is(':disabled')) { return; }

            this.picker.show();
            this.height = (this.component && this.component.outerHeight()) || this.element.outerHeight();
            this.place();
            $(window).on('resize', $.proxy(this.place, this));
            if (e) {
                e.stopPropagation();
                e.preventDefault();
            }
            if (!this.isInput) {
                $(document).on('mousedown', $.proxy(this.hide, this));
            }
            this.element.trigger({
                type: 'show'
            });
        },

        _hide: function (e) {
            // When going from the input to the picker, IE handles the blur/click
            // events differently than other browsers, in such a way that the blur
            // event triggers a hide before the click event can stop propagation.
            if (navigator.userAgent.indexOf("MSIE 8.0") > 0) {
                var t = this, args = arguments;

                function cancel_hide() {
                    clearTimeout(hide_timeout);
                    e.target.focus();
                    t.picker.off('click', cancel_hide);
                }

                function do_hide() {
                    t.hide.apply(t, args);
                    t.picker.off('click', cancel_hide);
                }

                this.picker.on('click', cancel_hide);
                var hide_timeout = setTimeout(do_hide, 100);
            } else {
                return this.hide.apply(this, arguments);
            }
        },

        hide: function () {
            this.picker.hide();
            $(window).off('resize', this.place);
            this.viewMode = this.startViewMode;
            this.showMode();
            if (!this.isInput) {
                $(document).off('mousedown', this.hide);
            }
            this.refresh();
            this.element.trigger({
                type: 'hide'
            });
        },

        refresh: function () {
            var formated = this.getAsText();

            if (!this.isInput) {
                if (this.component) {
                    this.element.find('input').prop('value', formated).change();
                }
                this.element.data('date', formated).change();
            } else {
                this.element.prop('value', formated).change();
            }
        },

        set: function (newDate, ommitEvent) {
            this.update(newDate, ommitEvent);
            this.refresh();
        },

        place: function () {
            var sourceItem = this.component ? this.component : this.element;
            var offset = sourceItem.offset();

            var viewportOffset = this.$viewport.offset();
            var scrollTop = this.$viewport.scrollTop();

            var zIndex = parseInt(this.element.parents().filter(function () {
                var zIndex = $(this).css('z-index');
                return zIndex != 'auto' && zIndex != '0';
            }).first().css('z-index')) + 10;

            if (this.calendarPlacement == 'left') {
                this.picker.css({
                    top: offset.top + this.height,
                    left: offset.left + sourceItem[0].offsetWidth - this.picker[0].offsetWidth
                });
            } else {
                this.picker.css({
                    top: offset.top + this.height,
                    left: offset.left,
                    zIndex : zIndex
                });
            }
        },
        lastValue: null,
        triggerChangeDate: function () {
            var newValue = this.moment ? this.moment.valueOf() : null;
            if (newValue != this.lastValue) {
                this.lastValue = newValue;
                this.element.trigger({
                    type: 'changeDate'
                });
            }
            if (this.autoHide)
                this.hide();
        },
        updateFromValue: function (ommitEvent) {
            this.update(this.isInput ? this.element.prop('value') : this.element.data('date'), ommitEvent);
        },

        update: function (newDate, ommitEvent) {
            var originalValue = this.moment ? this.moment.valueOf() : null;

            this.moment = DPGlobal.parseDate(newDate, this.format);

            var newValue = this.moment ? this.moment.valueOf() : null;

            if (!this.viewDate || originalValue != newValue) {
                this.viewDate = this.get() || moment().hours(0).minutes(0).seconds(0).milliseconds(0);
                this.fill();
                this.element.trigger({
                    type: 'changeDateInstant'
                });
            }
            if (!ommitEvent)
                this.triggerChangeDate();
        },

        fillDow: function () {
            var dowCnt = this.weekStart;
            var html = '<tr>';
            var daysMin = $.proxy(moment.localeData().weekdaysMin, moment.localeData());
            while (dowCnt < this.weekStart + 7) {
                html += '<th class="dow">' + daysMin(moment().day((dowCnt++) % 7)) + '</th>';
            }
            html += '</tr>';
            this.picker.find('.datepicker-days thead').append(html);
        },

        fillMonths: function () {
            var html = '';
            var i = 0;
            var monthsShort = $.proxy(moment.localeData().monthsShort, moment.localeData());
            while (i < 12) {
                html += '<span class="month">' + monthsShort(moment().startOf('month').month(i++)) + '</span>';
            }
            this.picker.find('.datepicker-months td').append(html);
        },

        fill: function () {
            var year = this.viewDate.year();
            var month = this.viewDate.month();
            var currentMoment = this.get();
            var currentDate = currentMoment ? currentMoment.valueOf() : null; //TODO: use diff
            var currentYear = currentMoment ? currentMoment.year() : null;
            var currentMonth = currentMoment ? currentMoment.month() : null;

            this.picker.find('.datepicker-days th:eq(1)')
						.text(moment.localeData().months(moment().month(month)) + ' ' + year);

            var prevMonth = moment([year, month, 1]);
            prevMonth.subtract(1, 'day');
            prevMonth.day(prevMonth.day() - (prevMonth.day() - this.weekStart + 7) % 7);

            //TODO: use diff
            var nextMonthVal = moment(prevMonth).add(42, 'days').valueOf();

            html = [];
            var clsName;
            //TODO: use diff
            while (prevMonth.valueOf() < nextMonthVal) {
                if (prevMonth.day() === this.weekStart) {
                    html.push('<tr>');
                }
                clsName = '';
                //TODO: use diff
                if (prevMonth.year() < year || (prevMonth.year() == year && prevMonth.month() < month)) {
                    clsName += ' old';
                } else if (prevMonth.year() > year || (prevMonth.year() == year && prevMonth.month() > month)) {
                    clsName += ' new';
                }
                //TODO: use diff
                if (prevMonth.valueOf() === currentDate) {
                    clsName += ' active';
                }
                if (prevMonth.valueOf() < this.startDate || prevMonth.valueOf() > this.endDate) {
                    clsName += ' disabled';
                }
                html.push('<td class="day' + clsName + '">' + prevMonth.date() + '</td>');
                if (prevMonth.day() === this.weekEnd) {
                    html.push('</tr>');
                }
                prevMonth.add(1, 'days');
            }
            this.picker.find('.datepicker-days tbody').empty().append(html.join(''));

            var months = this.picker.find('.datepicker-months')
						.find('th:eq(1)')
							.text(year)
							.end()
						.find('span').removeClass('active').removeClass('disabled');
            if (currentYear === year) {
                months.eq(currentMonth).addClass('active');
            }
            if (((this.startDate) && year < this.startDate.year()) || ((this.endDate) && year > this.endDate.year())) {
                months.addClass('disabled');
            }
            if ((this.startDate) && year == this.startDate.year()) {
                months.slice(0, this.startDate.month()).addClass('disabled');
            }
            if ((this.endDate) && year == this.endDate.year()) {
                months.slice(this.endDate.month() + 1).addClass('disabled');
            }

            html = '';
            year = parseInt(year / 10, 10) * 10;
            var yearCont = this.picker.find('.datepicker-years')
								.find('th:eq(1)')
									.text(year + '-' + (year + 9))
									.end()
								.find('td');
            year -= 1;
            for (var i = -1; i < 11; i++) {
                html += '<span class="year' + (i === -1 || i === 10 ? ' old' : '') + (currentYear === year ? ' active' : '') + (((this.startDate) && year < this.startDate.year()) || ((this.endDate) && year > this.endDate.year()) ? ' disabled' : '') + '">' + year + '</span>';
                year += 1;
            }
            yearCont.html(html);
        },

        click: function (e) {
            e.stopPropagation();
            e.preventDefault();
            var target = $(e.target).closest('span, td, th');
            if (target.length === 1) {
                switch (target[0].nodeName.toLowerCase()) {
                    case 'th':
                        switch (target[0].className) {
                            case 'switch':
                                this.showMode(1);
                                break;
                            case 'prev':
                            case 'next':
                                var nav = DPGlobal.modes[this.viewMode];
                                this.viewDate.add(nav.navStep * (target[0].className === 'prev' ? -1 : 1), nav.navFnc);
                                this.fill();
                                this.refresh();
                                break;
                        }
                        break;
                    case 'span':
                        if (!target.is('.disabled')) {
                            if (target.is('.month')) {

                                var newMonth = target.parent().find('span').index(target);
                                //this.viewDate.month(newMonth); I do not like how it works when the new month have less days
                                this.viewDate.add(newMonth - this.viewDate.month(), 'months');

                            } else {
                                var year = parseInt(target.text(), 10) || 0;
                                this.viewDate.year(year);
                            }

                            if (this.viewMode !== this.minViewMode) {
                                this.showMode(-1);
                                this.set(this.viewDate, true);
                            } else {
                                this.set(this.viewDate);
                            }
                        }
                        break;
                    case 'td':
                        if (!target.is('.disabled')) {
                            if (target.is('.day')) {
                                var day = parseInt(target.text(), 10) || 1;
                                var tempDate = this.viewDate.clone();
                                if (target.is('.old')) {
                                    tempDate.startOf('month').add(-1, 'days');
                                } else if (target.is('.new')) {
                                    tempDate.endOf('month').add(1, 'days');
                                }
                                var month = tempDate.month();
                                var year = tempDate.year();
                                this.set(moment([year, month, day]));
                            }
                        }
                        break;
                }
            }
        },

        dateWithinRange: function (date) {
            return date >= this.startDate && date <= this.endDate;
        },

        mousedown: function (e) {
            e.stopPropagation();
            e.preventDefault();
        },

        showMode: function (dir) {
            if (dir) {
                this.viewMode = Math.max(this.minViewMode, Math.min(2, this.viewMode + dir));
            }
            this.picker.find('>div').hide().filter('.datepicker-' + DPGlobal.modes[this.viewMode].clsName).show();
        },
        setCustomClasses: function() {
            if (this.calendarPlacement == 'left') {
                this.picker.addClass('datepicker-left');
            }
        }
    };

    $.fn.datepicker = function (option, val) {
        var results = [];
        var chain = this.each(function () {
            var $this = $(this),
				data = $this.data('datepicker'),
				options = typeof option === 'object' && option;
            if (typeof option === 'string') {
                if (data) {
                    var result = data[option](val);
                    if (typeof result !== 'undefined')
                        results.push(result);
                }
            } else if (!data) {
                $this.data('datepicker', (data = new Datepicker(this, $.extend({}, $.fn.datepicker.defaults, options))));
            }
        });
        return results.length == 1 ? results[0]
            : results.length ? results
            : chain;
    };

    $.fn.datepicker.defaults = {
        container : 'body'
    };
    $.fn.datepicker.Constructor = Datepicker;

    var DPGlobal = {
        modes: [
			{
			    clsName: 'days',
			    navFnc: 'months',
			    navStep: 1
			},
			{
			    clsName: 'months',
			    navFnc: 'years',
			    navStep: 1
			},
			{
			    clsName: 'years',
			    navFnc: 'years',
			    navStep: 10
			}],
        parseDate: function (value, format) {
            var mmnt = null;
            if (typeof value === "string") {
                if (Object.prototype.toString.call(format) === '[object Array]') {
                    mmnt = moment(value, format, true);
                } else {
                    mmnt = moment(value, format);
                }
            }
            if (!mmnt || !mmnt.isValid()) {
                mmnt = moment(value);
            }
            if (!mmnt || !mmnt.isValid()) {
                return null;
            }
            return mmnt.hours(0).minutes(0).seconds(0).milliseconds(0);
        },
        headTemplate: '<thead>' +
							'<tr>' +
								'<th class="prev">&lsaquo;</th>' +
								'<th colspan="5" class="switch"></th>' +
								'<th class="next">&rsaquo;</th>' +
							'</tr>' +
						'</thead>',
        contTemplate: '<tbody><tr><td colspan="7"></td></tr></tbody>'
    };
    DPGlobal.template = '<div class="datepicker dropdown-menu">' +
							'<div class="datepicker-days">' +
								'<table class=" table-condensed">' +
									DPGlobal.headTemplate +
									'<tbody></tbody>' +
								'</table>' +
							'</div>' +
							'<div class="datepicker-months">' +
								'<table class="table-condensed">' +
									DPGlobal.headTemplate +
									DPGlobal.contTemplate +
								'</table>' +
							'</div>' +
							'<div class="datepicker-years">' +
								'<table class="table-condensed">' +
									DPGlobal.headTemplate +
									DPGlobal.contTemplate +
								'</table>' +
							'</div>' +
						'</div>';

}(this.jQuery, this.moment);
}).call(global, module, undefined, undefined);

}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlNjcmlwdHMvbGliL21vbWVudC1kYXRlcGlja2VyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIlxuOyBtb21lbnQgPSBnbG9iYWwubW9tZW50ID0gcmVxdWlyZShcIm1vbWVudFwiKTtcbmpRdWVyeSA9IGdsb2JhbC5qUXVlcnkgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xuOyB2YXIgX19icm93c2VyaWZ5X3NoaW1fcmVxdWlyZV9fPXJlcXVpcmU7KGZ1bmN0aW9uIGJyb3dzZXJpZnlTaGltKG1vZHVsZSwgZGVmaW5lLCByZXF1aXJlKSB7XG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICogTW9tZW50RGF0ZXBpY2tlclxyXG4gKiBCYXNlZCBvbiBodHRwOi8vd3d3LmV5ZWNvbi5yby9ib290c3RyYXAtZGF0ZXBpY2tlclxyXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICogQ29weXJpZ2h0IDIwMTIgQW5kcmVzIE1vc2NoaW5pXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xyXG5cclxuIWZ1bmN0aW9uICgkLCBtb21lbnQsIHVuZGVmaW5lZCkge1xyXG5cclxuICAgIC8vIFBpY2tlciBvYmplY3RcclxuXHJcbiAgICB2YXIgRGF0ZXBpY2tlciA9IGZ1bmN0aW9uIChlbGVtZW50LCBvcHRpb25zKSB7XHJcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gJChlbGVtZW50KTtcclxuICAgICAgICB0aGlzLmF1dG9IaWRlID0gdHJ1ZSAmJiAob3B0aW9ucy5hdXRvSGlkZSAhPT0gZmFsc2UpICYmICh0aGlzLmVsZW1lbnQuZGF0YSgnZGF0ZXBpY2tlci1hdXRvaGlkZScpICE9PSBmYWxzZSk7XHJcbiAgICAgICAgdGhpcy5mb3JtYXQgPSBvcHRpb25zLmZvcm1hdCB8fCB0aGlzLmVsZW1lbnQuZGF0YSgnZGF0ZXBpY2tlci1mb3JtYXQnKSB8fCBtb21lbnQubG9jYWxlRGF0YSgpLmxvbmdEYXRlRm9ybWF0KCdMJyk7XHJcbiAgICAgICAgdGhpcy5jYWxlbmRhclBsYWNlbWVudCA9IG9wdGlvbnMuY2FsZW5kYXJQbGFjZW1lbnQgfHwgdGhpcy5lbGVtZW50LmRhdGEoJ2RhdGVwaWNrZXItY2FsZW5kYXJwbGFjZW1lbnQnKSB8fCAncmlnaHQnO1xyXG4gICAgICAgIHRoaXMucGlja2VyID0gJChEUEdsb2JhbC50ZW1wbGF0ZSlcclxuXHRcdFx0XHRcdFx0XHQuYXBwZW5kVG8ob3B0aW9ucy5jb250YWluZXIpXHJcblx0XHRcdFx0XHRcdFx0Lm9uKHtcclxuXHRcdFx0XHRcdFx0XHQgICAgY2xpY2s6ICQucHJveHkodGhpcy5jbGljaywgdGhpcyksXHJcblx0XHRcdFx0XHRcdFx0ICAgIG1vdXNlZG93bjogJC5wcm94eSh0aGlzLm1vdXNlZG93biwgdGhpcylcclxuXHRcdFx0XHRcdFx0XHR9KTtcclxuXHJcbiAgICAgICAgdGhpcy4kdmlld3BvcnQgPSAkKG9wdGlvbnMudmlld3BvcnQgfHwgb3B0aW9ucy5jb250YWluZXIpO1xyXG5cclxuICAgICAgICB2YXIgc3RhcnREYXRlVGV4dCA9IG9wdGlvbnMuc3RhcnREYXRlIHx8IHRoaXMuZWxlbWVudC5kYXRhKCdkYXRlcGlja2VyLXN0YXJ0ZGF0ZScpIHx8IHVuZGVmaW5lZDtcclxuICAgICAgICB0aGlzLnN0YXJ0RGF0ZSA9IChzdGFydERhdGVUZXh0KSA/IERQR2xvYmFsLnBhcnNlRGF0ZShzdGFydERhdGVUZXh0LCB0aGlzLmZvcm1hdCkgOiB1bmRlZmluZWQ7XHJcbiAgICAgICAgdmFyIGVuZERhdGVUZXh0ID0gb3B0aW9ucy5lbmREYXRlIHx8IHRoaXMuZWxlbWVudC5kYXRhKCdkYXRlcGlja2VyLWVuZGRhdGUnKSB8fCB1bmRlZmluZWQ7XHJcbiAgICAgICAgdGhpcy5lbmREYXRlID0gKGVuZERhdGVUZXh0KSA/IERQR2xvYmFsLnBhcnNlRGF0ZShlbmREYXRlVGV4dCwgdGhpcy5mb3JtYXQpIDogdW5kZWZpbmVkO1xyXG4gICAgICAgIHRoaXMuaXNJbnB1dCA9IHRoaXMuZWxlbWVudC5pcygnaW5wdXQnKTtcclxuICAgICAgICB0aGlzLmNvbXBvbmVudCA9ICF0aGlzLmlzSW5wdXQgJiYgdGhpcy5lbGVtZW50LmlzKCcuZGF0ZScpID8gdGhpcy5lbGVtZW50LmZpbmQoJy5pbnB1dC1ncm91cC1hZGRvbiwgLmFkZC1vbicpIDogZmFsc2U7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmlzSW5wdXQpIHtcclxuICAgICAgICAgICAgdGhpcy5lbGVtZW50Lm9uKHtcclxuICAgICAgICAgICAgICAgIGZvY3VzOiAkLnByb3h5KHRoaXMuc2hvdywgdGhpcyksXHJcbiAgICAgICAgICAgICAgICBibHVyOiAkLnByb3h5KGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faGlkZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlckNoYW5nZURhdGUoKTtcclxuICAgICAgICAgICAgICAgIH0sIHRoaXMpLFxyXG4gICAgICAgICAgICAgICAgaW5wdXQ6ICQucHJveHkoZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUZyb21WYWx1ZSh0cnVlKTtcclxuICAgICAgICAgICAgICAgIH0sIHRoaXMpLFxyXG4gICAgICAgICAgICAgICAga2V5dXA6ICQucHJveHkoZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZS5rZXlDb2RlID09IDEzKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUZyb21WYWx1ZSgpO1xyXG4gICAgICAgICAgICAgICAgfSwgdGhpcyksXHJcbiAgICAgICAgICAgICAgICBjbGljazogJC5wcm94eSh0aGlzLnNob3csIHRoaXMpXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbXBvbmVudCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnQub24oJ2NsaWNrJywgJC5wcm94eSh0aGlzLnNob3csIHRoaXMpKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuc2hvdywgdGhpcykpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubWluVmlld01vZGUgPSBvcHRpb25zLm1pblZpZXdNb2RlIHx8IHRoaXMuZWxlbWVudC5kYXRhKCdkYXRlcGlja2VyLW1pbnZpZXdtb2RlJykgfHwgMDtcclxuICAgICAgICBpZiAodHlwZW9mIHRoaXMubWluVmlld01vZGUgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIHN3aXRjaCAodGhpcy5taW5WaWV3TW9kZSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnbW9udGhzJzpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1pblZpZXdNb2RlID0gMTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgJ3llYXJzJzpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1pblZpZXdNb2RlID0gMjtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5taW5WaWV3TW9kZSA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy52aWV3TW9kZSA9IG9wdGlvbnMudmlld01vZGUgfHwgdGhpcy5lbGVtZW50LmRhdGEoJ2RhdGVwaWNrZXItdmlld21vZGUnKSB8fCAwO1xyXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy52aWV3TW9kZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgc3dpdGNoICh0aGlzLnZpZXdNb2RlKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdtb250aHMnOlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmlld01vZGUgPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAneWVhcnMnOlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmlld01vZGUgPSAyO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnZpZXdNb2RlID0gMDtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnN0YXJ0Vmlld01vZGUgPSB0aGlzLnZpZXdNb2RlO1xyXG4gICAgICAgIHRoaXMud2Vla1N0YXJ0ID0gb3B0aW9ucy53ZWVrU3RhcnQgfHwgdGhpcy5lbGVtZW50LmRhdGEoJ2RhdGVwaWNrZXItd2Vla3N0YXJ0JykgfHwgMDtcclxuICAgICAgICB0aGlzLndlZWtFbmQgPSB0aGlzLndlZWtTdGFydCA9PT0gMCA/IDYgOiB0aGlzLndlZWtTdGFydCAtIDE7XHJcbiAgICAgICAgdGhpcy5maWxsRG93KCk7XHJcbiAgICAgICAgdGhpcy5maWxsTW9udGhzKCk7XHJcbiAgICAgICAgdGhpcy5zZXRDdXN0b21DbGFzc2VzKCk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVGcm9tVmFsdWUoKTtcclxuICAgICAgICB0aGlzLnNob3dNb2RlKCk7XHJcbiAgICAgICAgdGhpcy5yZWZyZXNoKCk7XHJcbiAgICB9O1xyXG5cclxuICAgIERhdGVwaWNrZXIucHJvdG90eXBlID0ge1xyXG4gICAgICAgIGNvbnN0cnVjdG9yOiBEYXRlcGlja2VyLFxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gKHRoaXMubW9tZW50ICYmIHRoaXMubW9tZW50LmNsb25lKCkpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZ2V0QXNUZXh0OiBmdW5jdGlvbiAoZm9ybWF0KSB7XHJcbiAgICAgICAgICAgIHZhciBkaXNwbGF5Rm9ybWF0ID0gdGhpcy5mb3JtYXQ7XHJcbiAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZGlzcGxheUZvcm1hdCkgPT09ICdbb2JqZWN0IEFycmF5XScpIHtcclxuICAgICAgICAgICAgICAgIGRpc3BsYXlGb3JtYXQgPSBkaXNwbGF5Rm9ybWF0WzBdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiAodGhpcy5tb21lbnQgJiYgdGhpcy5tb21lbnQuZm9ybWF0KGZvcm1hdCB8fCBkaXNwbGF5Rm9ybWF0KSkgfHwgJyc7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBzaG93OiBmdW5jdGlvbiAoZSkge1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNJbnB1dCAmJiB0aGlzLmVsZW1lbnQuaXMoJzpkaXNhYmxlZCcpKSB7IHJldHVybjsgfVxyXG5cclxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5lbGVtZW50LmNoaWxkcmVuKCdpbnB1dCcpLmlzKCc6ZGlzYWJsZWQnKSkgeyByZXR1cm47IH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMucGlja2VyLnNob3coKTtcclxuICAgICAgICAgICAgdGhpcy5oZWlnaHQgPSAodGhpcy5jb21wb25lbnQgJiYgdGhpcy5jb21wb25lbnQub3V0ZXJIZWlnaHQoKSkgfHwgdGhpcy5lbGVtZW50Lm91dGVySGVpZ2h0KCk7XHJcbiAgICAgICAgICAgIHRoaXMucGxhY2UoKTtcclxuICAgICAgICAgICAgJCh3aW5kb3cpLm9uKCdyZXNpemUnLCAkLnByb3h5KHRoaXMucGxhY2UsIHRoaXMpKTtcclxuICAgICAgICAgICAgaWYgKGUpIHtcclxuICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCF0aGlzLmlzSW5wdXQpIHtcclxuICAgICAgICAgICAgICAgICQoZG9jdW1lbnQpLm9uKCdtb3VzZWRvd24nLCAkLnByb3h5KHRoaXMuaGlkZSwgdGhpcykpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC50cmlnZ2VyKHtcclxuICAgICAgICAgICAgICAgIHR5cGU6ICdzaG93J1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfaGlkZTogZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgLy8gV2hlbiBnb2luZyBmcm9tIHRoZSBpbnB1dCB0byB0aGUgcGlja2VyLCBJRSBoYW5kbGVzIHRoZSBibHVyL2NsaWNrXHJcbiAgICAgICAgICAgIC8vIGV2ZW50cyBkaWZmZXJlbnRseSB0aGFuIG90aGVyIGJyb3dzZXJzLCBpbiBzdWNoIGEgd2F5IHRoYXQgdGhlIGJsdXJcclxuICAgICAgICAgICAgLy8gZXZlbnQgdHJpZ2dlcnMgYSBoaWRlIGJlZm9yZSB0aGUgY2xpY2sgZXZlbnQgY2FuIHN0b3AgcHJvcGFnYXRpb24uXHJcbiAgICAgICAgICAgIGlmIChuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoXCJNU0lFIDguMFwiKSA+IDApIHtcclxuICAgICAgICAgICAgICAgIHZhciB0ID0gdGhpcywgYXJncyA9IGFyZ3VtZW50cztcclxuXHJcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBjYW5jZWxfaGlkZSgpIHtcclxuICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlkZV90aW1lb3V0KTtcclxuICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgICAgIHQucGlja2VyLm9mZignY2xpY2snLCBjYW5jZWxfaGlkZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gZG9faGlkZSgpIHtcclxuICAgICAgICAgICAgICAgICAgICB0LmhpZGUuYXBwbHkodCwgYXJncyk7XHJcbiAgICAgICAgICAgICAgICAgICAgdC5waWNrZXIub2ZmKCdjbGljaycsIGNhbmNlbF9oaWRlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnBpY2tlci5vbignY2xpY2snLCBjYW5jZWxfaGlkZSk7XHJcbiAgICAgICAgICAgICAgICB2YXIgaGlkZV90aW1lb3V0ID0gc2V0VGltZW91dChkb19oaWRlLCAxMDApO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGlkZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgaGlkZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB0aGlzLnBpY2tlci5oaWRlKCk7XHJcbiAgICAgICAgICAgICQod2luZG93KS5vZmYoJ3Jlc2l6ZScsIHRoaXMucGxhY2UpO1xyXG4gICAgICAgICAgICB0aGlzLnZpZXdNb2RlID0gdGhpcy5zdGFydFZpZXdNb2RlO1xyXG4gICAgICAgICAgICB0aGlzLnNob3dNb2RlKCk7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5pc0lucHV0KSB7XHJcbiAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5vZmYoJ21vdXNlZG93bicsIHRoaXMuaGlkZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5yZWZyZXNoKCk7XHJcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC50cmlnZ2VyKHtcclxuICAgICAgICAgICAgICAgIHR5cGU6ICdoaWRlJ1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICByZWZyZXNoOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBmb3JtYXRlZCA9IHRoaXMuZ2V0QXNUZXh0KCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNJbnB1dCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY29tcG9uZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50LmZpbmQoJ2lucHV0JykucHJvcCgndmFsdWUnLCBmb3JtYXRlZCkuY2hhbmdlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQuZGF0YSgnZGF0ZScsIGZvcm1hdGVkKS5jaGFuZ2UoKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5wcm9wKCd2YWx1ZScsIGZvcm1hdGVkKS5jaGFuZ2UoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHNldDogZnVuY3Rpb24gKG5ld0RhdGUsIG9tbWl0RXZlbnQpIHtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGUobmV3RGF0ZSwgb21taXRFdmVudCk7XHJcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaCgpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHBsYWNlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBzb3VyY2VJdGVtID0gdGhpcy5jb21wb25lbnQgPyB0aGlzLmNvbXBvbmVudCA6IHRoaXMuZWxlbWVudDtcclxuICAgICAgICAgICAgdmFyIG9mZnNldCA9IHNvdXJjZUl0ZW0ub2Zmc2V0KCk7XHJcblxyXG4gICAgICAgICAgICB2YXIgdmlld3BvcnRPZmZzZXQgPSB0aGlzLiR2aWV3cG9ydC5vZmZzZXQoKTtcclxuICAgICAgICAgICAgdmFyIHNjcm9sbFRvcCA9IHRoaXMuJHZpZXdwb3J0LnNjcm9sbFRvcCgpO1xyXG5cclxuICAgICAgICAgICAgdmFyIHpJbmRleCA9IHBhcnNlSW50KHRoaXMuZWxlbWVudC5wYXJlbnRzKCkuZmlsdGVyKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHZhciB6SW5kZXggPSAkKHRoaXMpLmNzcygnei1pbmRleCcpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHpJbmRleCAhPSAnYXV0bycgJiYgekluZGV4ICE9ICcwJztcclxuICAgICAgICAgICAgfSkuZmlyc3QoKS5jc3MoJ3otaW5kZXgnKSkgKyAxMDtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNhbGVuZGFyUGxhY2VtZW50ID09ICdsZWZ0Jykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5waWNrZXIuY3NzKHtcclxuICAgICAgICAgICAgICAgICAgICB0b3A6IG9mZnNldC50b3AgKyB0aGlzLmhlaWdodCxcclxuICAgICAgICAgICAgICAgICAgICBsZWZ0OiBvZmZzZXQubGVmdCArIHNvdXJjZUl0ZW1bMF0ub2Zmc2V0V2lkdGggLSB0aGlzLnBpY2tlclswXS5vZmZzZXRXaWR0aFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBpY2tlci5jc3Moe1xyXG4gICAgICAgICAgICAgICAgICAgIHRvcDogb2Zmc2V0LnRvcCArIHRoaXMuaGVpZ2h0LFxyXG4gICAgICAgICAgICAgICAgICAgIGxlZnQ6IG9mZnNldC5sZWZ0LFxyXG4gICAgICAgICAgICAgICAgICAgIHpJbmRleCA6IHpJbmRleFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIGxhc3RWYWx1ZTogbnVsbCxcclxuICAgICAgICB0cmlnZ2VyQ2hhbmdlRGF0ZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgbmV3VmFsdWUgPSB0aGlzLm1vbWVudCA/IHRoaXMubW9tZW50LnZhbHVlT2YoKSA6IG51bGw7XHJcbiAgICAgICAgICAgIGlmIChuZXdWYWx1ZSAhPSB0aGlzLmxhc3RWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0VmFsdWUgPSBuZXdWYWx1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC50cmlnZ2VyKHtcclxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnY2hhbmdlRGF0ZSdcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmF1dG9IaWRlKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5oaWRlKCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICB1cGRhdGVGcm9tVmFsdWU6IGZ1bmN0aW9uIChvbW1pdEV2ZW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlKHRoaXMuaXNJbnB1dCA/IHRoaXMuZWxlbWVudC5wcm9wKCd2YWx1ZScpIDogdGhpcy5lbGVtZW50LmRhdGEoJ2RhdGUnKSwgb21taXRFdmVudCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgdXBkYXRlOiBmdW5jdGlvbiAobmV3RGF0ZSwgb21taXRFdmVudCkge1xyXG4gICAgICAgICAgICB2YXIgb3JpZ2luYWxWYWx1ZSA9IHRoaXMubW9tZW50ID8gdGhpcy5tb21lbnQudmFsdWVPZigpIDogbnVsbDtcclxuXHJcbiAgICAgICAgICAgIHRoaXMubW9tZW50ID0gRFBHbG9iYWwucGFyc2VEYXRlKG5ld0RhdGUsIHRoaXMuZm9ybWF0KTtcclxuXHJcbiAgICAgICAgICAgIHZhciBuZXdWYWx1ZSA9IHRoaXMubW9tZW50ID8gdGhpcy5tb21lbnQudmFsdWVPZigpIDogbnVsbDtcclxuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy52aWV3RGF0ZSB8fCBvcmlnaW5hbFZhbHVlICE9IG5ld1ZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXdEYXRlID0gdGhpcy5nZXQoKSB8fCBtb21lbnQoKS5ob3VycygwKS5taW51dGVzKDApLnNlY29uZHMoMCkubWlsbGlzZWNvbmRzKDApO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5maWxsKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQudHJpZ2dlcih7XHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2NoYW5nZURhdGVJbnN0YW50J1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCFvbW1pdEV2ZW50KVxyXG4gICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyQ2hhbmdlRGF0ZSgpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIGZpbGxEb3c6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIGRvd0NudCA9IHRoaXMud2Vla1N0YXJ0O1xyXG4gICAgICAgICAgICB2YXIgaHRtbCA9ICc8dHI+JztcclxuICAgICAgICAgICAgdmFyIGRheXNNaW4gPSAkLnByb3h5KG1vbWVudC5sb2NhbGVEYXRhKCkud2Vla2RheXNNaW4sIG1vbWVudC5sb2NhbGVEYXRhKCkpO1xyXG4gICAgICAgICAgICB3aGlsZSAoZG93Q250IDwgdGhpcy53ZWVrU3RhcnQgKyA3KSB7XHJcbiAgICAgICAgICAgICAgICBodG1sICs9ICc8dGggY2xhc3M9XCJkb3dcIj4nICsgZGF5c01pbihtb21lbnQoKS5kYXkoKGRvd0NudCsrKSAlIDcpKSArICc8L3RoPic7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaHRtbCArPSAnPC90cj4nO1xyXG4gICAgICAgICAgICB0aGlzLnBpY2tlci5maW5kKCcuZGF0ZXBpY2tlci1kYXlzIHRoZWFkJykuYXBwZW5kKGh0bWwpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIGZpbGxNb250aHM6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIGh0bWwgPSAnJztcclxuICAgICAgICAgICAgdmFyIGkgPSAwO1xyXG4gICAgICAgICAgICB2YXIgbW9udGhzU2hvcnQgPSAkLnByb3h5KG1vbWVudC5sb2NhbGVEYXRhKCkubW9udGhzU2hvcnQsIG1vbWVudC5sb2NhbGVEYXRhKCkpO1xyXG4gICAgICAgICAgICB3aGlsZSAoaSA8IDEyKSB7XHJcbiAgICAgICAgICAgICAgICBodG1sICs9ICc8c3BhbiBjbGFzcz1cIm1vbnRoXCI+JyArIG1vbnRoc1Nob3J0KG1vbWVudCgpLnN0YXJ0T2YoJ21vbnRoJykubW9udGgoaSsrKSkgKyAnPC9zcGFuPic7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5waWNrZXIuZmluZCgnLmRhdGVwaWNrZXItbW9udGhzIHRkJykuYXBwZW5kKGh0bWwpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIGZpbGw6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIHllYXIgPSB0aGlzLnZpZXdEYXRlLnllYXIoKTtcclxuICAgICAgICAgICAgdmFyIG1vbnRoID0gdGhpcy52aWV3RGF0ZS5tb250aCgpO1xyXG4gICAgICAgICAgICB2YXIgY3VycmVudE1vbWVudCA9IHRoaXMuZ2V0KCk7XHJcbiAgICAgICAgICAgIHZhciBjdXJyZW50RGF0ZSA9IGN1cnJlbnRNb21lbnQgPyBjdXJyZW50TW9tZW50LnZhbHVlT2YoKSA6IG51bGw7IC8vVE9ETzogdXNlIGRpZmZcclxuICAgICAgICAgICAgdmFyIGN1cnJlbnRZZWFyID0gY3VycmVudE1vbWVudCA/IGN1cnJlbnRNb21lbnQueWVhcigpIDogbnVsbDtcclxuICAgICAgICAgICAgdmFyIGN1cnJlbnRNb250aCA9IGN1cnJlbnRNb21lbnQgPyBjdXJyZW50TW9tZW50Lm1vbnRoKCkgOiBudWxsO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5waWNrZXIuZmluZCgnLmRhdGVwaWNrZXItZGF5cyB0aDplcSgxKScpXHJcblx0XHRcdFx0XHRcdC50ZXh0KG1vbWVudC5sb2NhbGVEYXRhKCkubW9udGhzKG1vbWVudCgpLm1vbnRoKG1vbnRoKSkgKyAnICcgKyB5ZWFyKTtcclxuXHJcbiAgICAgICAgICAgIHZhciBwcmV2TW9udGggPSBtb21lbnQoW3llYXIsIG1vbnRoLCAxXSk7XHJcbiAgICAgICAgICAgIHByZXZNb250aC5zdWJ0cmFjdCgxLCAnZGF5Jyk7XHJcbiAgICAgICAgICAgIHByZXZNb250aC5kYXkocHJldk1vbnRoLmRheSgpIC0gKHByZXZNb250aC5kYXkoKSAtIHRoaXMud2Vla1N0YXJ0ICsgNykgJSA3KTtcclxuXHJcbiAgICAgICAgICAgIC8vVE9ETzogdXNlIGRpZmZcclxuICAgICAgICAgICAgdmFyIG5leHRNb250aFZhbCA9IG1vbWVudChwcmV2TW9udGgpLmFkZCg0MiwgJ2RheXMnKS52YWx1ZU9mKCk7XHJcblxyXG4gICAgICAgICAgICBodG1sID0gW107XHJcbiAgICAgICAgICAgIHZhciBjbHNOYW1lO1xyXG4gICAgICAgICAgICAvL1RPRE86IHVzZSBkaWZmXHJcbiAgICAgICAgICAgIHdoaWxlIChwcmV2TW9udGgudmFsdWVPZigpIDwgbmV4dE1vbnRoVmFsKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocHJldk1vbnRoLmRheSgpID09PSB0aGlzLndlZWtTdGFydCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGh0bWwucHVzaCgnPHRyPicpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY2xzTmFtZSA9ICcnO1xyXG4gICAgICAgICAgICAgICAgLy9UT0RPOiB1c2UgZGlmZlxyXG4gICAgICAgICAgICAgICAgaWYgKHByZXZNb250aC55ZWFyKCkgPCB5ZWFyIHx8IChwcmV2TW9udGgueWVhcigpID09IHllYXIgJiYgcHJldk1vbnRoLm1vbnRoKCkgPCBtb250aCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjbHNOYW1lICs9ICcgb2xkJztcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJldk1vbnRoLnllYXIoKSA+IHllYXIgfHwgKHByZXZNb250aC55ZWFyKCkgPT0geWVhciAmJiBwcmV2TW9udGgubW9udGgoKSA+IG1vbnRoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNsc05hbWUgKz0gJyBuZXcnO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy9UT0RPOiB1c2UgZGlmZlxyXG4gICAgICAgICAgICAgICAgaWYgKHByZXZNb250aC52YWx1ZU9mKCkgPT09IGN1cnJlbnREYXRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2xzTmFtZSArPSAnIGFjdGl2ZSc7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAocHJldk1vbnRoLnZhbHVlT2YoKSA8IHRoaXMuc3RhcnREYXRlIHx8IHByZXZNb250aC52YWx1ZU9mKCkgPiB0aGlzLmVuZERhdGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBjbHNOYW1lICs9ICcgZGlzYWJsZWQnO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaHRtbC5wdXNoKCc8dGQgY2xhc3M9XCJkYXknICsgY2xzTmFtZSArICdcIj4nICsgcHJldk1vbnRoLmRhdGUoKSArICc8L3RkPicpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHByZXZNb250aC5kYXkoKSA9PT0gdGhpcy53ZWVrRW5kKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaHRtbC5wdXNoKCc8L3RyPicpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcHJldk1vbnRoLmFkZCgxLCAnZGF5cycpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMucGlja2VyLmZpbmQoJy5kYXRlcGlja2VyLWRheXMgdGJvZHknKS5lbXB0eSgpLmFwcGVuZChodG1sLmpvaW4oJycpKTtcclxuXHJcbiAgICAgICAgICAgIHZhciBtb250aHMgPSB0aGlzLnBpY2tlci5maW5kKCcuZGF0ZXBpY2tlci1tb250aHMnKVxyXG5cdFx0XHRcdFx0XHQuZmluZCgndGg6ZXEoMSknKVxyXG5cdFx0XHRcdFx0XHRcdC50ZXh0KHllYXIpXHJcblx0XHRcdFx0XHRcdFx0LmVuZCgpXHJcblx0XHRcdFx0XHRcdC5maW5kKCdzcGFuJykucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpLnJlbW92ZUNsYXNzKCdkaXNhYmxlZCcpO1xyXG4gICAgICAgICAgICBpZiAoY3VycmVudFllYXIgPT09IHllYXIpIHtcclxuICAgICAgICAgICAgICAgIG1vbnRocy5lcShjdXJyZW50TW9udGgpLmFkZENsYXNzKCdhY3RpdmUnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoKCh0aGlzLnN0YXJ0RGF0ZSkgJiYgeWVhciA8IHRoaXMuc3RhcnREYXRlLnllYXIoKSkgfHwgKCh0aGlzLmVuZERhdGUpICYmIHllYXIgPiB0aGlzLmVuZERhdGUueWVhcigpKSkge1xyXG4gICAgICAgICAgICAgICAgbW9udGhzLmFkZENsYXNzKCdkaXNhYmxlZCcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICgodGhpcy5zdGFydERhdGUpICYmIHllYXIgPT0gdGhpcy5zdGFydERhdGUueWVhcigpKSB7XHJcbiAgICAgICAgICAgICAgICBtb250aHMuc2xpY2UoMCwgdGhpcy5zdGFydERhdGUubW9udGgoKSkuYWRkQ2xhc3MoJ2Rpc2FibGVkJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCh0aGlzLmVuZERhdGUpICYmIHllYXIgPT0gdGhpcy5lbmREYXRlLnllYXIoKSkge1xyXG4gICAgICAgICAgICAgICAgbW9udGhzLnNsaWNlKHRoaXMuZW5kRGF0ZS5tb250aCgpICsgMSkuYWRkQ2xhc3MoJ2Rpc2FibGVkJyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGh0bWwgPSAnJztcclxuICAgICAgICAgICAgeWVhciA9IHBhcnNlSW50KHllYXIgLyAxMCwgMTApICogMTA7XHJcbiAgICAgICAgICAgIHZhciB5ZWFyQ29udCA9IHRoaXMucGlja2VyLmZpbmQoJy5kYXRlcGlja2VyLXllYXJzJylcclxuXHRcdFx0XHRcdFx0XHRcdC5maW5kKCd0aDplcSgxKScpXHJcblx0XHRcdFx0XHRcdFx0XHRcdC50ZXh0KHllYXIgKyAnLScgKyAoeWVhciArIDkpKVxyXG5cdFx0XHRcdFx0XHRcdFx0XHQuZW5kKClcclxuXHRcdFx0XHRcdFx0XHRcdC5maW5kKCd0ZCcpO1xyXG4gICAgICAgICAgICB5ZWFyIC09IDE7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAtMTsgaSA8IDExOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGh0bWwgKz0gJzxzcGFuIGNsYXNzPVwieWVhcicgKyAoaSA9PT0gLTEgfHwgaSA9PT0gMTAgPyAnIG9sZCcgOiAnJykgKyAoY3VycmVudFllYXIgPT09IHllYXIgPyAnIGFjdGl2ZScgOiAnJykgKyAoKCh0aGlzLnN0YXJ0RGF0ZSkgJiYgeWVhciA8IHRoaXMuc3RhcnREYXRlLnllYXIoKSkgfHwgKCh0aGlzLmVuZERhdGUpICYmIHllYXIgPiB0aGlzLmVuZERhdGUueWVhcigpKSA/ICcgZGlzYWJsZWQnIDogJycpICsgJ1wiPicgKyB5ZWFyICsgJzwvc3Bhbj4nO1xyXG4gICAgICAgICAgICAgICAgeWVhciArPSAxO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHllYXJDb250Lmh0bWwoaHRtbCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgY2xpY2s6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgdmFyIHRhcmdldCA9ICQoZS50YXJnZXQpLmNsb3Nlc3QoJ3NwYW4sIHRkLCB0aCcpO1xyXG4gICAgICAgICAgICBpZiAodGFyZ2V0Lmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgc3dpdGNoICh0YXJnZXRbMF0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3RoJzpcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0YXJnZXRbMF0uY2xhc3NOYW1lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdzd2l0Y2gnOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvd01vZGUoMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdwcmV2JzpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ25leHQnOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuYXYgPSBEUEdsb2JhbC5tb2Rlc1t0aGlzLnZpZXdNb2RlXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZpZXdEYXRlLmFkZChuYXYubmF2U3RlcCAqICh0YXJnZXRbMF0uY2xhc3NOYW1lID09PSAncHJldicgPyAtMSA6IDEpLCBuYXYubmF2Rm5jKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbGwoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZnJlc2goKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlICdzcGFuJzpcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YXJnZXQuaXMoJy5kaXNhYmxlZCcpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0LmlzKCcubW9udGgnKSkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV3TW9udGggPSB0YXJnZXQucGFyZW50KCkuZmluZCgnc3BhbicpLmluZGV4KHRhcmdldCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy90aGlzLnZpZXdEYXRlLm1vbnRoKG5ld01vbnRoKTsgSSBkbyBub3QgbGlrZSBob3cgaXQgd29ya3Mgd2hlbiB0aGUgbmV3IG1vbnRoIGhhdmUgbGVzcyBkYXlzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52aWV3RGF0ZS5hZGQobmV3TW9udGggLSB0aGlzLnZpZXdEYXRlLm1vbnRoKCksICdtb250aHMnKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB5ZWFyID0gcGFyc2VJbnQodGFyZ2V0LnRleHQoKSwgMTApIHx8IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52aWV3RGF0ZS55ZWFyKHllYXIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnZpZXdNb2RlICE9PSB0aGlzLm1pblZpZXdNb2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93TW9kZSgtMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXQodGhpcy52aWV3RGF0ZSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0KHRoaXMudmlld0RhdGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3RkJzpcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YXJnZXQuaXMoJy5kaXNhYmxlZCcpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0LmlzKCcuZGF5JykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGF5ID0gcGFyc2VJbnQodGFyZ2V0LnRleHQoKSwgMTApIHx8IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRlbXBEYXRlID0gdGhpcy52aWV3RGF0ZS5jbG9uZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQuaXMoJy5vbGQnKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wRGF0ZS5zdGFydE9mKCdtb250aCcpLmFkZCgtMSwgJ2RheXMnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRhcmdldC5pcygnLm5ldycpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBEYXRlLmVuZE9mKCdtb250aCcpLmFkZCgxLCAnZGF5cycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbW9udGggPSB0ZW1wRGF0ZS5tb250aCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB5ZWFyID0gdGVtcERhdGUueWVhcigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0KG1vbWVudChbeWVhciwgbW9udGgsIGRheV0pKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIGRhdGVXaXRoaW5SYW5nZTogZnVuY3Rpb24gKGRhdGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGRhdGUgPj0gdGhpcy5zdGFydERhdGUgJiYgZGF0ZSA8PSB0aGlzLmVuZERhdGU7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgbW91c2Vkb3duOiBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgc2hvd01vZGU6IGZ1bmN0aW9uIChkaXIpIHtcclxuICAgICAgICAgICAgaWYgKGRpcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy52aWV3TW9kZSA9IE1hdGgubWF4KHRoaXMubWluVmlld01vZGUsIE1hdGgubWluKDIsIHRoaXMudmlld01vZGUgKyBkaXIpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnBpY2tlci5maW5kKCc+ZGl2JykuaGlkZSgpLmZpbHRlcignLmRhdGVwaWNrZXItJyArIERQR2xvYmFsLm1vZGVzW3RoaXMudmlld01vZGVdLmNsc05hbWUpLnNob3coKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIHNldEN1c3RvbUNsYXNzZXM6IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5jYWxlbmRhclBsYWNlbWVudCA9PSAnbGVmdCcpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucGlja2VyLmFkZENsYXNzKCdkYXRlcGlja2VyLWxlZnQnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgJC5mbi5kYXRlcGlja2VyID0gZnVuY3Rpb24gKG9wdGlvbiwgdmFsKSB7XHJcbiAgICAgICAgdmFyIHJlc3VsdHMgPSBbXTtcclxuICAgICAgICB2YXIgY2hhaW4gPSB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgJHRoaXMgPSAkKHRoaXMpLFxyXG5cdFx0XHRcdGRhdGEgPSAkdGhpcy5kYXRhKCdkYXRlcGlja2VyJyksXHJcblx0XHRcdFx0b3B0aW9ucyA9IHR5cGVvZiBvcHRpb24gPT09ICdvYmplY3QnICYmIG9wdGlvbjtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb24gPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBkYXRhW29wdGlvbl0odmFsKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlc3VsdCAhPT0gJ3VuZGVmaW5lZCcpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaChyZXN1bHQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAkdGhpcy5kYXRhKCdkYXRlcGlja2VyJywgKGRhdGEgPSBuZXcgRGF0ZXBpY2tlcih0aGlzLCAkLmV4dGVuZCh7fSwgJC5mbi5kYXRlcGlja2VyLmRlZmF1bHRzLCBvcHRpb25zKSkpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiByZXN1bHRzLmxlbmd0aCA9PSAxID8gcmVzdWx0c1swXVxyXG4gICAgICAgICAgICA6IHJlc3VsdHMubGVuZ3RoID8gcmVzdWx0c1xyXG4gICAgICAgICAgICA6IGNoYWluO1xyXG4gICAgfTtcclxuXHJcbiAgICAkLmZuLmRhdGVwaWNrZXIuZGVmYXVsdHMgPSB7XHJcbiAgICAgICAgY29udGFpbmVyIDogJ2JvZHknXHJcbiAgICB9O1xyXG4gICAgJC5mbi5kYXRlcGlja2VyLkNvbnN0cnVjdG9yID0gRGF0ZXBpY2tlcjtcclxuXHJcbiAgICB2YXIgRFBHbG9iYWwgPSB7XHJcbiAgICAgICAgbW9kZXM6IFtcclxuXHRcdFx0e1xyXG5cdFx0XHQgICAgY2xzTmFtZTogJ2RheXMnLFxyXG5cdFx0XHQgICAgbmF2Rm5jOiAnbW9udGhzJyxcclxuXHRcdFx0ICAgIG5hdlN0ZXA6IDFcclxuXHRcdFx0fSxcclxuXHRcdFx0e1xyXG5cdFx0XHQgICAgY2xzTmFtZTogJ21vbnRocycsXHJcblx0XHRcdCAgICBuYXZGbmM6ICd5ZWFycycsXHJcblx0XHRcdCAgICBuYXZTdGVwOiAxXHJcblx0XHRcdH0sXHJcblx0XHRcdHtcclxuXHRcdFx0ICAgIGNsc05hbWU6ICd5ZWFycycsXHJcblx0XHRcdCAgICBuYXZGbmM6ICd5ZWFycycsXHJcblx0XHRcdCAgICBuYXZTdGVwOiAxMFxyXG5cdFx0XHR9XSxcclxuICAgICAgICBwYXJzZURhdGU6IGZ1bmN0aW9uICh2YWx1ZSwgZm9ybWF0KSB7XHJcbiAgICAgICAgICAgIHZhciBtbW50ID0gbnVsbDtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChmb3JtYXQpID09PSAnW29iamVjdCBBcnJheV0nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbW1udCA9IG1vbWVudCh2YWx1ZSwgZm9ybWF0LCB0cnVlKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbW1udCA9IG1vbWVudCh2YWx1ZSwgZm9ybWF0KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIW1tbnQgfHwgIW1tbnQuaXNWYWxpZCgpKSB7XHJcbiAgICAgICAgICAgICAgICBtbW50ID0gbW9tZW50KHZhbHVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIW1tbnQgfHwgIW1tbnQuaXNWYWxpZCgpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gbW1udC5ob3VycygwKS5taW51dGVzKDApLnNlY29uZHMoMCkubWlsbGlzZWNvbmRzKDApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgaGVhZFRlbXBsYXRlOiAnPHRoZWFkPicgK1xyXG5cdFx0XHRcdFx0XHRcdCc8dHI+JyArXHJcblx0XHRcdFx0XHRcdFx0XHQnPHRoIGNsYXNzPVwicHJldlwiPiZsc2FxdW87PC90aD4nICtcclxuXHRcdFx0XHRcdFx0XHRcdCc8dGggY29sc3Bhbj1cIjVcIiBjbGFzcz1cInN3aXRjaFwiPjwvdGg+JyArXHJcblx0XHRcdFx0XHRcdFx0XHQnPHRoIGNsYXNzPVwibmV4dFwiPiZyc2FxdW87PC90aD4nICtcclxuXHRcdFx0XHRcdFx0XHQnPC90cj4nICtcclxuXHRcdFx0XHRcdFx0JzwvdGhlYWQ+JyxcclxuICAgICAgICBjb250VGVtcGxhdGU6ICc8dGJvZHk+PHRyPjx0ZCBjb2xzcGFuPVwiN1wiPjwvdGQ+PC90cj48L3Rib2R5PidcclxuICAgIH07XHJcbiAgICBEUEdsb2JhbC50ZW1wbGF0ZSA9ICc8ZGl2IGNsYXNzPVwiZGF0ZXBpY2tlciBkcm9wZG93bi1tZW51XCI+JyArXHJcblx0XHRcdFx0XHRcdFx0JzxkaXYgY2xhc3M9XCJkYXRlcGlja2VyLWRheXNcIj4nICtcclxuXHRcdFx0XHRcdFx0XHRcdCc8dGFibGUgY2xhc3M9XCIgdGFibGUtY29uZGVuc2VkXCI+JyArXHJcblx0XHRcdFx0XHRcdFx0XHRcdERQR2xvYmFsLmhlYWRUZW1wbGF0ZSArXHJcblx0XHRcdFx0XHRcdFx0XHRcdCc8dGJvZHk+PC90Ym9keT4nICtcclxuXHRcdFx0XHRcdFx0XHRcdCc8L3RhYmxlPicgK1xyXG5cdFx0XHRcdFx0XHRcdCc8L2Rpdj4nICtcclxuXHRcdFx0XHRcdFx0XHQnPGRpdiBjbGFzcz1cImRhdGVwaWNrZXItbW9udGhzXCI+JyArXHJcblx0XHRcdFx0XHRcdFx0XHQnPHRhYmxlIGNsYXNzPVwidGFibGUtY29uZGVuc2VkXCI+JyArXHJcblx0XHRcdFx0XHRcdFx0XHRcdERQR2xvYmFsLmhlYWRUZW1wbGF0ZSArXHJcblx0XHRcdFx0XHRcdFx0XHRcdERQR2xvYmFsLmNvbnRUZW1wbGF0ZSArXHJcblx0XHRcdFx0XHRcdFx0XHQnPC90YWJsZT4nICtcclxuXHRcdFx0XHRcdFx0XHQnPC9kaXY+JyArXHJcblx0XHRcdFx0XHRcdFx0JzxkaXYgY2xhc3M9XCJkYXRlcGlja2VyLXllYXJzXCI+JyArXHJcblx0XHRcdFx0XHRcdFx0XHQnPHRhYmxlIGNsYXNzPVwidGFibGUtY29uZGVuc2VkXCI+JyArXHJcblx0XHRcdFx0XHRcdFx0XHRcdERQR2xvYmFsLmhlYWRUZW1wbGF0ZSArXHJcblx0XHRcdFx0XHRcdFx0XHRcdERQR2xvYmFsLmNvbnRUZW1wbGF0ZSArXHJcblx0XHRcdFx0XHRcdFx0XHQnPC90YWJsZT4nICtcclxuXHRcdFx0XHRcdFx0XHQnPC9kaXY+JyArXHJcblx0XHRcdFx0XHRcdCc8L2Rpdj4nO1xyXG5cclxufSh0aGlzLmpRdWVyeSwgdGhpcy5tb21lbnQpO1xufSkuY2FsbChnbG9iYWwsIG1vZHVsZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQpO1xuIl19
},{"jquery":109,"moment":112}],93:[function(require,module,exports){
(function (global){

; JQuery = global.JQuery = require("jquery");
; var __browserify_shim_require__=require;(function browserifyShim(module, exports, require, define, browserify_shim__define__module__export__) {
// name: sammy
// version: 0.7.5

// Sammy.js / http://sammyjs.org

(function(factory){
  // Support module loading scenarios
  if (typeof define === 'function' && define.amd){
    // AMD Anonymous Module
    define(['jquery'], factory);
  } else {
    // No module loader (plain <script> tag) - put directly in global namespace
    jQuery.sammy = window.Sammy = factory(jQuery);
  }
})(function($){

  var Sammy,
      PATH_REPLACER = "([^\/]+)",
      PATH_NAME_MATCHER = /:([\w\d]+)/g,
      QUERY_STRING_MATCHER = /\?([^#]*)?$/,
      // mainly for making `arguments` an Array
      _makeArray = function(nonarray) { return Array.prototype.slice.call(nonarray); },
      // borrowed from jQuery
      _isFunction = function( obj ) { return Object.prototype.toString.call(obj) === "[object Function]"; },
      _isArray = function( obj ) { return Object.prototype.toString.call(obj) === "[object Array]"; },
      _isRegExp = function( obj ) { return Object.prototype.toString.call(obj) === "[object RegExp]"; },
      _decode = function( str ) { return decodeURIComponent((str || '').replace(/\+/g, ' ')); },
      _encode = encodeURIComponent,
      _escapeHTML = function(s) {
        return String(s).replace(/&(?!\w+;)/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
      },
      _routeWrapper = function(verb) {
        return function() {
          return this.route.apply(this, [verb].concat(Array.prototype.slice.call(arguments)));
        };
      },
      _template_cache = {},
      _has_history = !!(window.history && history.pushState),
      loggers = [];


  // `Sammy` (also aliased as $.sammy) is not only the namespace for a
  // number of prototypes, its also a top level method that allows for easy
  // creation/management of `Sammy.Application` instances. There are a
  // number of different forms for `Sammy()` but each returns an instance
  // of `Sammy.Application`. When a new instance is created using
  // `Sammy` it is added to an Object called `Sammy.apps`. This
  // provides for an easy way to get at existing Sammy applications. Only one
  // instance is allowed per `element_selector` so when calling
  // `Sammy('selector')` multiple times, the first time will create
  // the application and the following times will extend the application
  // already added to that selector.
  //
  // ### Example
  //
  //      // returns the app at #main or a new app
  //      Sammy('#main')
  //
  //      // equivalent to "new Sammy.Application", except appends to apps
  //      Sammy();
  //      Sammy(function() { ... });
  //
  //      // extends the app at '#main' with function.
  //      Sammy('#main', function() { ... });
  //
  Sammy = function() {
    var args = _makeArray(arguments),
        app, selector;
    Sammy.apps = Sammy.apps || {};
    if (args.length === 0 || args[0] && _isFunction(args[0])) { // Sammy()
      return Sammy.apply(Sammy, ['body'].concat(args));
    } else if (typeof (selector = args.shift()) == 'string') { // Sammy('#main')
      app = Sammy.apps[selector] || new Sammy.Application();
      app.element_selector = selector;
      if (args.length > 0) {
        $.each(args, function(i, plugin) {
          app.use(plugin);
        });
      }
      // if the selector changes make sure the reference in Sammy.apps changes
      if (app.element_selector != selector) {
        delete Sammy.apps[selector];
      }
      Sammy.apps[app.element_selector] = app;
      return app;
    }
  };

  Sammy.VERSION = '0.7.5';

  // Add to the global logger pool. Takes a function that accepts an
  // unknown number of arguments and should print them or send them somewhere
  // The first argument is always a timestamp.
  Sammy.addLogger = function(logger) {
    loggers.push(logger);
  };

  // Sends a log message to each logger listed in the global
  // loggers pool. Can take any number of arguments.
  // Also prefixes the arguments with a timestamp.
  Sammy.log = function()  {
    var args = _makeArray(arguments);
    args.unshift("[" + Date() + "]");
    $.each(loggers, function(i, logger) {
      logger.apply(Sammy, args);
    });
  };

  if (typeof window.console != 'undefined') {
    if (typeof window.console.log === 'function' && _isFunction(window.console.log.apply)) {
      Sammy.addLogger(function() {
        window.console.log.apply(window.console, arguments);
      });
    } else {
      Sammy.addLogger(function() {
        window.console.log(arguments);
      });
    }
  } else if (typeof console != 'undefined') {
    Sammy.addLogger(function() {
      console.log.apply(console, arguments);
    });
  }

  $.extend(Sammy, {
    makeArray: _makeArray,
    isFunction: _isFunction,
    isArray: _isArray
  });

  // Sammy.Object is the base for all other Sammy classes. It provides some useful
  // functionality, including cloning, iterating, etc.
  Sammy.Object = function(obj) { // constructor
    return $.extend(this, obj || {});
  };

  $.extend(Sammy.Object.prototype, {

    // Escape HTML in string, use in templates to prevent script injection.
    // Also aliased as `h()`
    escapeHTML: _escapeHTML,
    h: _escapeHTML,

    // Returns a copy of the object with Functions removed.
    toHash: function() {
      var json = {};
      $.each(this, function(k,v) {
        if (!_isFunction(v)) {
          json[k] = v;
        }
      });
      return json;
    },

    // Renders a simple HTML version of this Objects attributes.
    // Does not render functions.
    // For example. Given this Sammy.Object:
    //
    //     var s = new Sammy.Object({first_name: 'Sammy', last_name: 'Davis Jr.'});
    //     s.toHTML()
    //     //=> '<strong>first_name</strong> Sammy<br /><strong>last_name</strong> Davis Jr.<br />'
    //
    toHTML: function() {
      var display = "";
      $.each(this, function(k, v) {
        if (!_isFunction(v)) {
          display += "<strong>" + k + "</strong> " + v + "<br />";
        }
      });
      return display;
    },

    // Returns an array of keys for this object. If `attributes_only`
    // is true will not return keys that map to a `function()`
    keys: function(attributes_only) {
      var keys = [];
      for (var property in this) {
        if (!_isFunction(this[property]) || !attributes_only) {
          keys.push(property);
        }
      }
      return keys;
    },

    // Checks if the object has a value at `key` and that the value is not empty
    has: function(key) {
      return this[key] && $.trim(this[key].toString()) !== '';
    },

    // convenience method to join as many arguments as you want
    // by the first argument - useful for making paths
    join: function() {
      var args = _makeArray(arguments);
      var delimiter = args.shift();
      return args.join(delimiter);
    },

    // Shortcut to Sammy.log
    log: function() {
      Sammy.log.apply(Sammy, arguments);
    },

    // Returns a string representation of this object.
    // if `include_functions` is true, it will also toString() the
    // methods of this object. By default only prints the attributes.
    toString: function(include_functions) {
      var s = [];
      $.each(this, function(k, v) {
        if (!_isFunction(v) || include_functions) {
          s.push('"' + k + '": ' + v.toString());
        }
      });
      return "Sammy.Object: {" + s.join(',') + "}";
    }
  });


  // Return whether the event targets this window.
  Sammy.targetIsThisWindow = function targetIsThisWindow(event, tagName) {
    var targetElement = $(event.target).closest(tagName);
    if (targetElement.length === 0) { return true; }

    var targetWindow = targetElement.attr('target');
    if (!targetWindow || targetWindow === window.name || targetWindow === '_self') { return true; }
    if (targetWindow === '_blank') { return false; }
    if (targetWindow === 'top' && window === window.top) { return true; }
    return false;
  };


  // The DefaultLocationProxy is the default location proxy for all Sammy applications.
  // A location proxy is a prototype that conforms to a simple interface. The purpose
  // of a location proxy is to notify the Sammy.Application its bound to when the location
  // or 'external state' changes.
  //
  // The `DefaultLocationProxy` watches for changes to the path of the current window and
  // is also able to set the path based on changes in the application. It does this by
  // using different methods depending on what is available in the current browser. In
  // the latest and greatest browsers it used the HTML5 History API and the `pushState`
  // `popState` events/methods. This allows you to use Sammy to serve a site behind normal
  // URI paths as opposed to the older default of hash (#) based routing. Because the server
  // can interpret the changed path on a refresh or re-entry, though, it requires additional
  // support on the server side. If you'd like to force disable HTML5 history support, please
  // use the `disable_push_state` setting on `Sammy.Application`. If pushState support
  // is enabled, `DefaultLocationProxy` also binds to all links on the page. If a link is clicked
  // that matches the current set of routes, the URL is changed using pushState instead of
  // fully setting the location and the app is notified of the change.
  //
  // If the browser does not have support for HTML5 History, `DefaultLocationProxy` automatically
  // falls back to the older hash based routing. The newest browsers (IE, Safari > 4, FF >= 3.6)
  // support a 'onhashchange' DOM event, thats fired whenever the location.hash changes.
  // In this situation the DefaultLocationProxy just binds to this event and delegates it to
  // the application. In the case of older browsers a poller is set up to track changes to the
  // hash.
  Sammy.DefaultLocationProxy = function(app, run_interval_every) {
    this.app = app;
    // set is native to false and start the poller immediately
    this.is_native = false;
    this.has_history = _has_history;
    this._startPolling(run_interval_every);
  };

  Sammy.DefaultLocationProxy.fullPath = function(location_obj) {
   // Bypass the `window.location.hash` attribute.  If a question mark
    // appears in the hash IE6 will strip it and all of the following
    // characters from `window.location.hash`.
    var matches = location_obj.toString().match(/^[^#]*(#.+)$/);
    var hash = matches ? matches[1] : '';
    return [location_obj.pathname, location_obj.search, hash].join('');
  };
$.extend(Sammy.DefaultLocationProxy.prototype , {
    // bind the proxy events to the current app.
    bind: function() {
      var proxy = this, app = this.app, lp = Sammy.DefaultLocationProxy;
      $(window).bind('hashchange.' + this.app.eventNamespace(), function(e, non_native) {
        // if we receive a native hash change event, set the proxy accordingly
        // and stop polling
        if (proxy.is_native === false && !non_native) {
          proxy.is_native = true;
          window.clearInterval(lp._interval);
          lp._interval = null;
        }
        app.trigger('location-changed');
      });
      if (_has_history && !app.disable_push_state) {
        // bind to popstate
        $(window).bind('popstate.' + this.app.eventNamespace(), function(e) {
          app.trigger('location-changed');
        });
        // bind to link clicks that have routes
        $(document).delegate('a', 'click.history-' + this.app.eventNamespace(), function (e) {
          if (e.isDefaultPrevented() || e.metaKey || e.ctrlKey) {
            return;
          }
          var full_path = lp.fullPath(this),
            // Get anchor's host name in a cross browser compatible way.
            // IE looses hostname property when setting href in JS
            // with a relative URL, e.g. a.setAttribute('href',"/whatever").
            // Circumvent this problem by creating a new link with given URL and
            // querying that for a hostname.
            hostname = this.hostname ? this.hostname : function (a) {
              var l = document.createElement("a");
              l.href = a.href;
              return l.hostname;
            }(this);

          if (hostname == window.location.hostname &&
              app.lookupRoute('get', full_path) &&
              Sammy.targetIsThisWindow(e, 'a')) {
            e.preventDefault();
            proxy.setLocation(full_path);
            return false;
          }
        });
      }
      if (!lp._bindings) {
        lp._bindings = 0;
      }
      lp._bindings++;
    },

    // unbind the proxy events from the current app
    unbind: function() {
      $(window).unbind('hashchange.' + this.app.eventNamespace());
      $(window).unbind('popstate.' + this.app.eventNamespace());
      $(document).undelegate('a', 'click.history-' + this.app.eventNamespace());
      Sammy.DefaultLocationProxy._bindings--;
      if (Sammy.DefaultLocationProxy._bindings <= 0) {
        window.clearInterval(Sammy.DefaultLocationProxy._interval);
        Sammy.DefaultLocationProxy._interval = null;
      }
    },

    // get the current location from the hash.
    getLocation: function() {
      return Sammy.DefaultLocationProxy.fullPath(window.location);
    },

    // set the current location to `new_location`
    setLocation: function(new_location) {
      if (/^([^#\/]|$)/.test(new_location)) { // non-prefixed url
        if (_has_history && !this.app.disable_push_state) {
          new_location = '/' + new_location;
        } else {
          new_location = '#!/' + new_location;
        }
      }
      if (new_location != this.getLocation()) {
        // HTML5 History exists and new_location is a full path
        if (_has_history && !this.app.disable_push_state && /^\//.test(new_location)) {
          history.pushState({ path: new_location }, window.title, new_location);
          this.app.trigger('location-changed');
        } else {
          return (window.location = new_location);
        }
      }
    },

    _startPolling: function(every) {
      // set up interval
      var proxy = this;
      if (!Sammy.DefaultLocationProxy._interval) {
        if (!every) { every = 10; }
        var hashCheck = function() {
          var current_location = proxy.getLocation();
          if (typeof Sammy.DefaultLocationProxy._last_location == 'undefined' ||
            current_location != Sammy.DefaultLocationProxy._last_location) {
            window.setTimeout(function() {
              $(window).trigger('hashchange', [true]);
            }, 0);
          }
          Sammy.DefaultLocationProxy._last_location = current_location;
        };
        hashCheck();
        Sammy.DefaultLocationProxy._interval = window.setInterval(hashCheck, every);
      }
    }
  });


  // Sammy.Application is the Base prototype for defining 'applications'.
  // An 'application' is a collection of 'routes' and bound events that is
  // attached to an element when `run()` is called.
  // The only argument an 'app_function' is evaluated within the context of the application.
  Sammy.Application = function(app_function) {
    var app = this;
    this.routes            = {};
    this.listeners         = new Sammy.Object({});
    this.arounds           = [];
    this.befores           = [];
    // generate a unique namespace
    this.namespace         = (new Date()).getTime() + '-' + parseInt(Math.random() * 1000, 10);
    this.context_prototype = function() { Sammy.EventContext.apply(this, arguments); };
    this.context_prototype.prototype = new Sammy.EventContext();

    if (_isFunction(app_function)) {
      app_function.apply(this, [this]);
    }
    // set the location proxy if not defined to the default (DefaultLocationProxy)
    if (!this._location_proxy) {
      this.setLocationProxy(new Sammy.DefaultLocationProxy(this, this.run_interval_every));
    }
    if (this.debug) {
      this.bindToAllEvents(function(e, data) {
        app.log(app.toString(), e.cleaned_type, data || {});
      });
    }
  };

  Sammy.Application.prototype = $.extend({}, Sammy.Object.prototype, {

    // the four route verbs
    ROUTE_VERBS: ['get','post','put','delete'],

    // An array of the default events triggered by the
    // application during its lifecycle
    APP_EVENTS: ['run', 'unload', 'lookup-route', 'run-route', 'route-found', 'event-context-before', 'event-context-after', 'changed', 'error', 'check-form-submission', 'redirect', 'location-changed'],

    _last_route: null,
    _location_proxy: null,
    _running: false,

    // Defines what element the application is bound to. Provide a selector
    // (parseable by `jQuery()`) and this will be used by `$element()`
    element_selector: 'body',

    // When set to true, logs all of the default events using `log()`
    debug: false,

    // When set to true, and the error() handler is not overridden, will actually
    // raise JS errors in routes (500) and when routes can't be found (404)
    raise_errors: false,

    // The time in milliseconds that the URL is queried for changes
    run_interval_every: 50,

    // if using the `DefaultLocationProxy` setting this to true will force the app to use
    // traditional hash based routing as opposed to the new HTML5 PushState support
    disable_push_state: false,

    // The default template engine to use when using `partial()` in an
    // `EventContext`. `template_engine` can either be a string that
    // corresponds to the name of a method/helper on EventContext or it can be a function
    // that takes two arguments, the content of the unrendered partial and an optional
    // JS object that contains interpolation data. Template engine is only called/referred
    // to if the extension of the partial is null or unknown. See `partial()`
    // for more information
    template_engine: null,

    // //=> Sammy.Application: body
    toString: function() {
      return 'Sammy.Application:' + this.element_selector;
    },

    // returns a jQuery object of the Applications bound element.
    $element: function(selector) {
      return selector ? $(this.element_selector).find(selector) : $(this.element_selector);
    },

    // `use()` is the entry point for including Sammy plugins.
    // The first argument to use should be a function() that is evaluated
    // in the context of the current application, just like the `app_function`
    // argument to the `Sammy.Application` constructor.
    //
    // Any additional arguments are passed to the app function sequentially.
    //
    // For much more detail about plugins, check out:
    // [http://sammyjs.org/docs/plugins](http://sammyjs.org/docs/plugins)
    //
    // ### Example
    //
    //      var MyPlugin = function(app, prepend) {
    //
    //        this.helpers({
    //          myhelper: function(text) {
    //            alert(prepend + " " + text);
    //          }
    //        });
    //
    //      };
    //
    //      var app = $.sammy(function() {
    //
    //        this.use(MyPlugin, 'This is my plugin');
    //
    //        this.get('#/', function() {
    //          this.myhelper('and dont you forget it!');
    //          //=> Alerts: This is my plugin and dont you forget it!
    //        });
    //
    //      });
    //
    // If plugin is passed as a string it assumes your are trying to load
    // Sammy."Plugin". This is the preferred way of loading core Sammy plugins
    // as it allows for better error-messaging.
    //
    // ### Example
    //
    //      $.sammy(function() {
    //        this.use('Mustache'); //=> Sammy.Mustache
    //        this.use('Storage'); //=> Sammy.Storage
    //      });
    //
    use: function() {
      // flatten the arguments
      var args = _makeArray(arguments),
          plugin = args.shift(),
          plugin_name = plugin || '';
      try {
        args.unshift(this);
        if (typeof plugin == 'string') {
          plugin_name = 'Sammy.' + plugin;
          plugin = Sammy[plugin];
        }
        plugin.apply(this, args);
      } catch(e) {
        if (typeof plugin === 'undefined') {
          this.error("Plugin Error: called use() but plugin (" + plugin_name.toString() + ") is not defined", e);
        } else if (!_isFunction(plugin)) {
          this.error("Plugin Error: called use() but '" + plugin_name.toString() + "' is not a function", e);
        } else {
          this.error("Plugin Error", e);
        }
      }
      return this;
    },

    // Sets the location proxy for the current app. By default this is set to
    // a new `Sammy.DefaultLocationProxy` on initialization. However, you can set
    // the location_proxy inside you're app function to give your app a custom
    // location mechanism. See `Sammy.DefaultLocationProxy` and `Sammy.DataLocationProxy`
    // for examples.
    //
    // `setLocationProxy()` takes an initialized location proxy.
    //
    // ### Example
    //
    //        // to bind to data instead of the default hash;
    //        var app = $.sammy(function() {
    //          this.setLocationProxy(new Sammy.DataLocationProxy(this));
    //        });
    //
    setLocationProxy: function(new_proxy) {
      var original_proxy = this._location_proxy;
      this._location_proxy = new_proxy;
      if (this.isRunning()) {
        if (original_proxy) {
          // if there is already a location proxy, unbind it.
          original_proxy.unbind();
        }
        this._location_proxy.bind();
      }
    },

    // provide log() override for inside an app that includes the relevant application element_selector
    log: function() {
      Sammy.log.apply(Sammy, Array.prototype.concat.apply([this.element_selector],arguments));
    },


    // `route()` is the main method for defining routes within an application.
    // For great detail on routes, check out:
    // [http://sammyjs.org/docs/routes](http://sammyjs.org/docs/routes)
    //
    // This method also has aliases for each of the different verbs (eg. `get()`, `post()`, etc.)
    //
    // ### Arguments
    //
    // * `verb` A String in the set of ROUTE_VERBS or 'any'. 'any' will add routes for each
    //    of the ROUTE_VERBS. If only two arguments are passed,
    //    the first argument is the path, the second is the callback and the verb
    //    is assumed to be 'any'.
    // * `path` A Regexp or a String representing the path to match to invoke this verb.
    // * `callback` A Function that is called/evaluated when the route is run see: `runRoute()`.
    //    It is also possible to pass a string as the callback, which is looked up as the name
    //    of a method on the application.
    //
    route: function(verb, path) {
      var app = this, param_names = [], add_route, path_match, callback = Array.prototype.slice.call(arguments,2);

      // if the method signature is just (path, callback)
      // assume the verb is 'any'
      if (callback.length === 0 && _isFunction(path)) {
        callback = [path];
        path = verb;
        verb = 'any';
      }

      verb = verb.toLowerCase(); // ensure verb is lower case

      // if path is a string turn it into a regex
      if (path.constructor == String) {

        // Needs to be explicitly set because IE will maintain the index unless NULL is returned,
        // which means that with two consecutive routes that contain params, the second set of params will not be found and end up in splat instead of params
        // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/RegExp/lastIndex
        PATH_NAME_MATCHER.lastIndex = 0;

        // find the names
        while ((path_match = PATH_NAME_MATCHER.exec(path)) !== null) {
          param_names.push(path_match[1]);
        }
        // replace with the path replacement
        path = new RegExp(path.replace(PATH_NAME_MATCHER, PATH_REPLACER) + "$");
      }
      // lookup callbacks
      $.each(callback,function(i,cb){
        if (typeof(cb) === 'string') {
          callback[i] = app[cb];
        }
      });

      add_route = function(with_verb) {
        var r = {verb: with_verb, path: path, callback: callback, param_names: param_names};
        // add route to routes array
        app.routes[with_verb] = app.routes[with_verb] || [];
        // place routes in order of definition
        app.routes[with_verb].push(r);
      };

      if (verb === 'any') {
        $.each(this.ROUTE_VERBS, function(i, v) { add_route(v); });
      } else {
        add_route(verb);
      }

      // return the app
      return this;
    },

    // Alias for route('get', ...)
    get: _routeWrapper('get'),

    // Alias for route('post', ...)
    post: _routeWrapper('post'),

    // Alias for route('put', ...)
    put: _routeWrapper('put'),

    // Alias for route('delete', ...)
    del: _routeWrapper('delete'),

    // Alias for route('any', ...)
    any: _routeWrapper('any'),

    // `mapRoutes` takes an array of arrays, each array being passed to route()
    // as arguments, this allows for mass definition of routes. Another benefit is
    // this makes it possible/easier to load routes via remote JSON.
    //
    // ### Example
    //
    //      var app = $.sammy(function() {
    //
    //        this.mapRoutes([
    //            ['get', '#/', function() { this.log('index'); }],
    //            // strings in callbacks are looked up as methods on the app
    //            ['post', '#/create', 'addUser'],
    //            // No verb assumes 'any' as the verb
    //            [/dowhatever/, function() { this.log(this.verb, this.path)}];
    //          ]);
    //      });
    //
    mapRoutes: function(route_array) {
      var app = this;
      $.each(route_array, function(i, route_args) {
        app.route.apply(app, route_args);
      });
      return this;
    },

    // A unique event namespace defined per application.
    // All events bound with `bind()` are automatically bound within this space.
    eventNamespace: function() {
      return ['sammy-app', this.namespace].join('-');
    },

    // Works just like `jQuery.fn.bind()` with a couple notable differences.
    //
    // * It binds all events to the application element
    // * All events are bound within the `eventNamespace()`
    // * Events are not actually bound until the application is started with `run()`
    // * callbacks are evaluated within the context of a Sammy.EventContext
    //
    bind: function(name, data, callback) {
      var app = this;
      // build the callback
      // if the arity is 2, callback is the second argument
      if (typeof callback == 'undefined') { callback = data; }
      var listener_callback =  function() {
        // pull off the context from the arguments to the callback
        var e, context, data;
        e       = arguments[0];
        data    = arguments[1];
        if (data && data.context) {
          context = data.context;
          delete data.context;
        } else {
          context = new app.context_prototype(app, 'bind', e.type, data, e.target);
        }
        e.cleaned_type = e.type.replace(app.eventNamespace(), '');
        callback.apply(context, [e, data]);
      };

      // it could be that the app element doesnt exist yet
      // so attach to the listeners array and then run()
      // will actually bind the event.
      if (!this.listeners[name]) { this.listeners[name] = []; }
      this.listeners[name].push(listener_callback);
      if (this.isRunning()) {
        // if the app is running
        // *actually* bind the event to the app element
        this._listen(name, listener_callback);
      }
      return this;
    },

    // Triggers custom events defined with `bind()`
    //
    // ### Arguments
    //
    // * `name` The name of the event. Automatically prefixed with the `eventNamespace()`
    // * `data` An optional Object that can be passed to the bound callback.
    // * `context` An optional context/Object in which to execute the bound callback.
    //   If no context is supplied a the context is a new `Sammy.EventContext`
    //
    trigger: function(name, data) {
      this.$element().trigger([name, this.eventNamespace()].join('.'), [data]);
      return this;
    },

    // Reruns the current route
    refresh: function() {
      this.last_location = null;
      this.trigger('location-changed');
      return this;
    },

    // Takes a single callback that is pushed on to a stack.
    // Before any route is run, the callbacks are evaluated in order within
    // the current `Sammy.EventContext`
    //
    // If any of the callbacks explicitly return false, execution of any
    // further callbacks and the route itself is halted.
    //
    // You can also provide a set of options that will define when to run this
    // before based on the route it proceeds.
    //
    // ### Example
    //
    //      var app = $.sammy(function() {
    //
    //        // will run at #/route but not at #/
    //        this.before('#/route', function() {
    //          //...
    //        });
    //
    //        // will run at #/ but not at #/route
    //        this.before({except: {path: '#/route'}}, function() {
    //          this.log('not before #/route');
    //        });
    //
    //        this.get('#/', function() {});
    //
    //        this.get('#/route', function() {});
    //
    //      });
    //
    // See `contextMatchesOptions()` for a full list of supported options
    //
    before: function(options, callback) {
      if (_isFunction(options)) {
        callback = options;
        options = {};
      }
      this.befores.push([options, callback]);
      return this;
    },

    // A shortcut for binding a callback to be run after a route is executed.
    // After callbacks have no guarunteed order.
    after: function(callback) {
      return this.bind('event-context-after', callback);
    },


    // Adds an around filter to the application. around filters are functions
    // that take a single argument `callback` which is the entire route
    // execution path wrapped up in a closure. This means you can decide whether
    // or not to proceed with execution by not invoking `callback` or,
    // more usefully wrapping callback inside the result of an asynchronous execution.
    //
    // ### Example
    //
    // The most common use case for around() is calling a _possibly_ async function
    // and executing the route within the functions callback:
    //
    //      var app = $.sammy(function() {
    //
    //        var current_user = false;
    //
    //        function checkLoggedIn(callback) {
    //          // /session returns a JSON representation of the logged in user
    //          // or an empty object
    //          if (!current_user) {
    //            $.getJSON('/session', function(json) {
    //              if (json.login) {
    //                // show the user as logged in
    //                current_user = json;
    //                // execute the route path
    //                callback();
    //              } else {
    //                // show the user as not logged in
    //                current_user = false;
    //                // the context of aroundFilters is an EventContext
    //                this.redirect('#/login');
    //              }
    //            });
    //          } else {
    //            // execute the route path
    //            callback();
    //          }
    //        };
    //
    //        this.around(checkLoggedIn);
    //
    //      });
    //
    around: function(callback) {
      this.arounds.push(callback);
      return this;
    },

    // Adds a onComplete function to the application. onComplete functions are executed
    // at the end of a chain of route callbacks, if they call next(). Unlike after,
    // which is called as soon as the route is complete, onComplete is like a final next()
    // for all routes, and is thus run asynchronously
    //
    // ### Example
    //
    //      app.get('/chain',function(context,next) {
    //          console.log('chain1');
    //          next();
    //      },function(context,next) {
    //          console.log('chain2');
    //          next();
    //      });
    //
    //      app.get('/link',function(context,next) {
    //          console.log('link1');
    //          next();
    //      },function(context,next) {
    //          console.log('link2');
    //          next();
    //      });
    //
    //      app.onComplete(function() {
    //          console.log("Running finally");
    //      });
    //
    // If you go to '/chain', you will get the following messages:
    //
    //      chain1
    //      chain2
    //      Running onComplete
    //
    //
    // If you go to /link, you will get the following messages:
    //
    //      link1
    //      link2
    //      Running onComplete
    //
    //
    // It really comes to play when doing asynchronous:
    //
    //      app.get('/chain',function(context,next) {
    //        $.get('/my/url',function() {
    //          console.log('chain1');
    //          next();
    //        });
    //      },function(context,next) {
    //        console.log('chain2');
    //        next();
    //      });
    //
    onComplete: function(callback) {
      this._onComplete = callback;
      return this;
    },

    // Returns `true` if the current application is running.
    isRunning: function() {
      return this._running;
    },

    // Helpers extends the EventContext prototype specific to this app.
    // This allows you to define app specific helper functions that can be used
    // whenever you're inside of an event context (templates, routes, bind).
    //
    // ### Example
    //
    //     var app = $.sammy(function() {
    //
    //       helpers({
    //         upcase: function(text) {
    //          return text.toString().toUpperCase();
    //         }
    //       });
    //
    //       get('#/', function() { with(this) {
    //         // inside of this context I can use the helpers
    //         $('#main').html(upcase($('#main').text());
    //       }});
    //
    //     });
    //
    //
    // ### Arguments
    //
    // * `extensions` An object collection of functions to extend the context.
    //
    helpers: function(extensions) {
      $.extend(this.context_prototype.prototype, extensions);
      return this;
    },

    // Helper extends the event context just like `helpers()` but does it
    // a single method at a time. This is especially useful for dynamically named
    // helpers
    //
    // ### Example
    //
    //     // Trivial example that adds 3 helper methods to the context dynamically
    //     var app = $.sammy(function(app) {
    //
    //       $.each([1,2,3], function(i, num) {
    //         app.helper('helper' + num, function() {
    //           this.log("I'm helper number " + num);
    //         });
    //       });
    //
    //       this.get('#/', function() {
    //         this.helper2(); //=> I'm helper number 2
    //       });
    //     });
    //
    // ### Arguments
    //
    // * `name` The name of the method
    // * `method` The function to be added to the prototype at `name`
    //
    helper: function(name, method) {
      this.context_prototype.prototype[name] = method;
      return this;
    },

    // Actually starts the application's lifecycle. `run()` should be invoked
    // within a document.ready block to ensure the DOM exists before binding events, etc.
    //
    // ### Example
    //
    //     var app = $.sammy(function() { ... }); // your application
    //     $(function() { // document.ready
    //        app.run();
    //     });
    //
    // ### Arguments
    //
    // * `start_url` Optionally, a String can be passed which the App will redirect to
    //   after the events/routes have been bound.
    run: function(start_url) {
      if (this.isRunning()) { return false; }
      var app = this;

      // actually bind all the listeners
      $.each(this.listeners.toHash(), function(name, callbacks) {
        $.each(callbacks, function(i, listener_callback) {
          app._listen(name, listener_callback);
        });
      });

      this.trigger('run', {start_url: start_url});
      this._running = true;
      // set last location
      this.last_location = null;
      if (!(/\#(.+)/.test(this.getLocation())) && typeof start_url != 'undefined') {
        this.setLocation(start_url);
      }
      // check url
      this._checkLocation();
      this._location_proxy.bind();
      this.bind('location-changed', function() {
        app._checkLocation();
      });

      // bind to submit to capture post/put/delete routes
      this.bind('submit', function(e) {
        if ( !Sammy.targetIsThisWindow(e, 'form') ) { return true; }
        var returned = app._checkFormSubmission($(e.target).closest('form'));
        return (returned === false) ? e.preventDefault() : false;
      });

      // bind unload to body unload
      $(window).bind('unload', function() {
        app.unload();
      });

      // trigger html changed
      return this.trigger('changed');
    },

    // The opposite of `run()`, un-binds all event listeners and intervals
    // `run()` Automatically binds a `onunload` event to run this when
    // the document is closed.
    unload: function() {
      if (!this.isRunning()) { return false; }
      var app = this;
      this.trigger('unload');
      // clear interval
      this._location_proxy.unbind();
      // unbind form submits
      this.$element().unbind('submit').removeClass(app.eventNamespace());
      // unbind all events
      $.each(this.listeners.toHash() , function(name, listeners) {
        $.each(listeners, function(i, listener_callback) {
          app._unlisten(name, listener_callback);
        });
      });
      this._running = false;
      return this;
    },

    // Not only runs `unbind` but also destroys the app reference.
    destroy: function() {
      this.unload();
      delete Sammy.apps[this.element_selector];
      return this;
    },

    // Will bind a single callback function to every event that is already
    // being listened to in the app. This includes all the `APP_EVENTS`
    // as well as any custom events defined with `bind()`.
    //
    // Used internally for debug logging.
    bindToAllEvents: function(callback) {
      var app = this;
      // bind to the APP_EVENTS first
      $.each(this.APP_EVENTS, function(i, e) {
        app.bind(e, callback);
      });
      // next, bind to listener names (only if they dont exist in APP_EVENTS)
      $.each(this.listeners.keys(true), function(i, name) {
        if ($.inArray(name, app.APP_EVENTS) == -1) {
          app.bind(name, callback);
        }
      });
      return this;
    },

    // Returns a copy of the given path with any query string after the hash
    // removed.
    routablePath: function(path) {
      return path.replace(QUERY_STRING_MATCHER, '');
    },

    // Given a verb and a String path, will return either a route object or false
    // if a matching route can be found within the current defined set.
    lookupRoute: function(verb, path) {
      var app = this, routed = false, i = 0, l, route;
      if (typeof this.routes[verb] != 'undefined') {
        l = this.routes[verb].length;
        for (; i < l; i++) {
          route = this.routes[verb][i];
          if (app.routablePath(path).match(route.path)) {
            routed = route;
            break;
          }
        }
      }
      return routed;
    },

    // First, invokes `lookupRoute()` and if a route is found, parses the
    // possible URL params and then invokes the route's callback within a new
    // `Sammy.EventContext`. If the route can not be found, it calls
    // `notFound()`. If `raise_errors` is set to `true` and
    // the `error()` has not been overridden, it will throw an actual JS
    // error.
    //
    // You probably will never have to call this directly.
    //
    // ### Arguments
    //
    // * `verb` A String for the verb.
    // * `path` A String path to lookup.
    // * `params` An Object of Params pulled from the URI or passed directly.
    //
    // ### Returns
    //
    // Either returns the value returned by the route callback or raises a 404 Not Found error.
    //
    runRoute: function(verb, path, params, target) {
      var app = this,
          route = this.lookupRoute(verb, path),
          context,
          wrapped_route,
          arounds,
          around,
          befores,
          before,
          callback_args,
          path_params,
          final_returned;

      if (this.debug) {
        this.log('runRoute', [verb, path].join(' '));
      }

      this.trigger('run-route', {verb: verb, path: path, params: params});
      if (typeof params == 'undefined') { params = {}; }

      $.extend(params, this._parseQueryString(path));

      if (route) {
        this.trigger('route-found', {route: route});
        // pull out the params from the path
        if ((path_params = route.path.exec(this.routablePath(path))) !== null) {
          // first match is the full path
          path_params.shift();
          // for each of the matches
          $.each(path_params, function(i, param) {
            // if theres a matching param name
            if (route.param_names[i]) {
              // set the name to the match
              params[route.param_names[i]] = _decode(param);
            } else {
              // initialize 'splat'
              if (!params.splat) { params.splat = []; }
              params.splat.push(_decode(param));
            }
          });
        }

        // set event context
        context  = new this.context_prototype(this, verb, path, params, target);
        // ensure arrays
        arounds = this.arounds.slice(0);
        befores = this.befores.slice(0);
        // set the callback args to the context + contents of the splat
        callback_args = [context];
        if (params.splat) {
          callback_args = callback_args.concat(params.splat);
        }
        // wrap the route up with the before filters
        wrapped_route = function() {
          var returned, i, nextRoute;
          while (befores.length > 0) {
            before = befores.shift();
            // check the options
            if (app.contextMatchesOptions(context, before[0])) {
              returned = before[1].apply(context, [context]);
              if (returned === false) { return false; }
            }
          }
          app.last_route = route;
          context.trigger('event-context-before', {context: context});
          // run multiple callbacks
          if (typeof(route.callback) === "function") {
            route.callback = [route.callback];
          }
          if (route.callback && route.callback.length) {
            i = -1;
            nextRoute = function() {
              i++;
              if (route.callback[i]) {
                returned = route.callback[i].apply(context,callback_args);
              } else if (app._onComplete && typeof(app._onComplete === "function")) {
                app._onComplete(context);
              }
            };
            callback_args.push(nextRoute);
            nextRoute();
          }
          context.trigger('event-context-after', {context: context});
          return returned;
        };
        $.each(arounds.reverse(), function(i, around) {
          var last_wrapped_route = wrapped_route;
          wrapped_route = function() { return around.apply(context, [last_wrapped_route]); };
        });
        try {
          final_returned = wrapped_route();
        } catch(e) {
          this.error(['500 Error', verb, path].join(' '), e);
        }
        return final_returned;
      } else {
        return this.notFound(verb, path);
      }
    },

    // Matches an object of options against an `EventContext` like object that
    // contains `path` and `verb` attributes. Internally Sammy uses this
    // for matching `before()` filters against specific options. You can set the
    // object to _only_ match certain paths or verbs, or match all paths or verbs _except_
    // those that match the options.
    //
    // ### Example
    //
    //     var app = $.sammy(),
    //         context = {verb: 'get', path: '#/mypath'};
    //
    //     // match against a path string
    //     app.contextMatchesOptions(context, '#/mypath'); //=> true
    //     app.contextMatchesOptions(context, '#/otherpath'); //=> false
    //     // equivalent to
    //     app.contextMatchesOptions(context, {only: {path:'#/mypath'}}); //=> true
    //     app.contextMatchesOptions(context, {only: {path:'#/otherpath'}}); //=> false
    //     // match against a path regexp
    //     app.contextMatchesOptions(context, /path/); //=> true
    //     app.contextMatchesOptions(context, /^path/); //=> false
    //     // match only a verb
    //     app.contextMatchesOptions(context, {only: {verb:'get'}}); //=> true
    //     app.contextMatchesOptions(context, {only: {verb:'post'}}); //=> false
    //     // match all except a verb
    //     app.contextMatchesOptions(context, {except: {verb:'post'}}); //=> true
    //     app.contextMatchesOptions(context, {except: {verb:'get'}}); //=> false
    //     // match all except a path
    //     app.contextMatchesOptions(context, {except: {path:'#/otherpath'}}); //=> true
    //     app.contextMatchesOptions(context, {except: {path:'#/mypath'}}); //=> false
    //     // match all except a verb and a path
    //     app.contextMatchesOptions(context, {except: {path:'#/otherpath', verb:'post'}}); //=> true
    //     app.contextMatchesOptions(context, {except: {path:'#/mypath', verb:'post'}}); //=> true
    //     app.contextMatchesOptions(context, {except: {path:'#/mypath', verb:'get'}}); //=> false
    //     // match multiple paths
    //     app.contextMatchesOptions(context, {path: ['#/mypath', '#/otherpath']}); //=> true
    //     app.contextMatchesOptions(context, {path: ['#/otherpath', '#/thirdpath']}); //=> false
    //     // equivalent to
    //     app.contextMatchesOptions(context, {only: {path: ['#/mypath', '#/otherpath']}}); //=> true
    //     app.contextMatchesOptions(context, {only: {path: ['#/otherpath', '#/thirdpath']}}); //=> false
    //     // match all except multiple paths
    //     app.contextMatchesOptions(context, {except: {path: ['#/mypath', '#/otherpath']}}); //=> false
    //     app.contextMatchesOptions(context, {except: {path: ['#/otherpath', '#/thirdpath']}}); //=> true
    //     // match all except multiple paths and verbs
    //     app.contextMatchesOptions(context, {except: {path: ['#/mypath', '#/otherpath'], verb: ['get', 'post']}}); //=> false
    //     app.contextMatchesOptions(context, {except: {path: ['#/otherpath', '#/thirdpath'], verb: ['get', 'post']}}); //=> true
    //
    contextMatchesOptions: function(context, match_options, positive) {
      var options = match_options;
      // normalize options
      if (typeof options === 'string' || _isRegExp(options)) {
        options = {path: options};
      }
      if (typeof positive === 'undefined') {
        positive = true;
      }
      // empty options always match
      if ($.isEmptyObject(options)) {
        return true;
      }
      // Do we have to match against multiple paths?
      if (_isArray(options.path)){
        var results, numopt, opts, len;
        results = [];
        for (numopt = 0, len = options.path.length; numopt < len; numopt += 1) {
          opts = $.extend({}, options, {path: options.path[numopt]});
          results.push(this.contextMatchesOptions(context, opts));
        }
        var matched = $.inArray(true, results) > -1 ? true : false;
        return positive ? matched : !matched;
      }
      if (options.only) {
        return this.contextMatchesOptions(context, options.only, true);
      } else if (options.except) {
        return this.contextMatchesOptions(context, options.except, false);
      }
      var path_matched = true, verb_matched = true;
      if (options.path) {
        if (!_isRegExp(options.path)) {
          options.path = new RegExp(options.path.toString() + '$');
        }
        path_matched = options.path.test(context.path);
      }
      if (options.verb) {
        if(typeof options.verb === 'string') {
          verb_matched = options.verb === context.verb;
        } else {
          verb_matched = options.verb.indexOf(context.verb) > -1;
        }
      }
      return positive ? (verb_matched && path_matched) : !(verb_matched && path_matched);
    },


    // Delegates to the `location_proxy` to get the current location.
    // See `Sammy.DefaultLocationProxy` for more info on location proxies.
    getLocation: function() {
      return this._location_proxy.getLocation();
    },

    // Delegates to the `location_proxy` to set the current location.
    // See `Sammy.DefaultLocationProxy` for more info on location proxies.
    //
    // ### Arguments
    //
    // * `new_location` A new location string (e.g. '#/')
    //
    setLocation: function(new_location) {
      return this._location_proxy.setLocation(new_location);
    },

    // Swaps the content of `$element()` with `content`
    // You can override this method to provide an alternate swap behavior
    // for `EventContext.partial()`.
    //
    // ### Example
    //
    //      var app = $.sammy(function() {
    //
    //        // implements a 'fade out'/'fade in'
    //        this.swap = function(content, callback) {
    //          var context = this;
    //          context.$element().fadeOut('slow', function() {
    //            context.$element().html(content);
    //            context.$element().fadeIn('slow', function() {
    //              if (callback) {
    //                callback.apply();
    //              }
    //            });
    //          });
    //        };
    //
    //      });
    //
    swap: function(content, callback) {
      var $el = this.$element().html(content);
      if (_isFunction(callback)) { callback(content); }
      return $el;
    },

    // a simple global cache for templates. Uses the same semantics as
    // `Sammy.Cache` and `Sammy.Storage` so can easily be replaced with
    // a persistent storage that lasts beyond the current request.
    templateCache: function(key, value) {
      if (typeof value != 'undefined') {
        return _template_cache[key] = value;
      } else {
        return _template_cache[key];
      }
    },

    // clear the templateCache
    clearTemplateCache: function() {
      return (_template_cache = {});
    },

    // This throws a '404 Not Found' error by invoking `error()`.
    // Override this method or `error()` to provide custom
    // 404 behavior (i.e redirecting to / or showing a warning)
    notFound: function(verb, path) {
      var ret = this.error(['404 Not Found', verb, path].join(' '));
      return (verb === 'get') ? ret : true;
    },

    // The base error handler takes a string `message` and an `Error`
    // object. If `raise_errors` is set to `true` on the app level,
    // this will re-throw the error to the browser. Otherwise it will send the error
    // to `log()`. Override this method to provide custom error handling
    // e.g logging to a server side component or displaying some feedback to the
    // user.
    error: function(message, original_error) {
      if (!original_error) { original_error = new Error(); }
      original_error.message = [message, original_error.message].join(' ');
      this.trigger('error', {message: original_error.message, error: original_error});
      if (this.raise_errors) {
        throw(original_error);
      } else {
        this.log(original_error.message, original_error);
      }
    },

    _checkLocation: function() {
      var location, returned;
      // get current location
      location = this.getLocation();
      // compare to see if hash has changed
      if (!this.last_location || this.last_location[0] != 'get' || this.last_location[1] != location) {
        // reset last location
        this.last_location = ['get', location];
        // lookup route for current hash
        returned = this.runRoute('get', location);
      }
      return returned;
    },

    _getFormVerb: function(form) {
      var $form = $(form), verb, $_method;
      $_method = $form.find('input[name="_method"]');
      if ($_method.length > 0) { verb = $_method.val(); }
      if (!verb) { verb = $form[0].getAttribute('method'); }
      if (!verb || verb === '') { verb = 'get'; }
      return $.trim(verb.toString().toLowerCase());
    },

    _checkFormSubmission: function(form) {
      var $form, path, verb, params, returned;
      this.trigger('check-form-submission', {form: form});
      $form = $(form);
      path  = $form.attr('action') || '';
      verb  = this._getFormVerb($form);

      if (this.debug) {
        this.log('_checkFormSubmission', $form, path, verb);
      }

      if (verb === 'get') {
        params = this._serializeFormParams($form);
        if (params !== '') { path += '?' + params; }
        this.setLocation(path);
        returned = false;
      } else {
        params = $.extend({}, this._parseFormParams($form));
        returned = this.runRoute(verb, path, params, form.get(0));
      }
      return (typeof returned == 'undefined') ? false : returned;
    },

    _serializeFormParams: function($form) {
       var queryString = "",
         fields = $form.serializeArray(),
         i;
       if (fields.length > 0) {
         queryString = this._encodeFormPair(fields[0].name, fields[0].value);
         for (i = 1; i < fields.length; i++) {
           queryString = queryString + "&" + this._encodeFormPair(fields[i].name, fields[i].value);
         }
       }
       return queryString;
    },

    _encodeFormPair: function(name, value){
      return _encode(name) + "=" + _encode(value);
    },

    _parseFormParams: function($form) {
      var params = {},
          form_fields = $form.serializeArray(),
          i;
      for (i = 0; i < form_fields.length; i++) {
        params = this._parseParamPair(params, form_fields[i].name, form_fields[i].value);
      }
      return params;
    },

    _parseQueryString: function(path) {
      var params = {}, parts, pairs, pair, i;

      parts = path.match(QUERY_STRING_MATCHER);
      if (parts && parts[1]) {
        pairs = parts[1].split('&');
        for (i = 0; i < pairs.length; i++) {
          pair = pairs[i].split('=');
          params = this._parseParamPair(params, _decode(pair[0]), _decode(pair[1] || ""));
        }
      }
      return params;
    },

    _parseParamPair: function(params, key, value) {
      if (typeof params[key] !== 'undefined') {
        if (_isArray(params[key])) {
          params[key].push(value);
        } else {
          params[key] = [params[key], value];
        }
      } else {
        params[key] = value;
      }
      return params;
    },

    _listen: function(name, callback) {
      return this.$element().bind([name, this.eventNamespace()].join('.'), callback);
    },

    _unlisten: function(name, callback) {
      return this.$element().unbind([name, this.eventNamespace()].join('.'), callback);
    }

  });

  // `Sammy.RenderContext` is an object that makes sequential template loading,
  // rendering and interpolation seamless even when dealing with asynchronous
  // operations.
  //
  // `RenderContext` objects are not usually created directly, rather they are
  // instantiated from an `Sammy.EventContext` by using `render()`, `load()` or
  // `partial()` which all return `RenderContext` objects.
  //
  // `RenderContext` methods always returns a modified `RenderContext`
  // for chaining (like jQuery itself).
  //
  // The core magic is in the `then()` method which puts the callback passed as
  // an argument into a queue to be executed once the previous callback is complete.
  // All the methods of `RenderContext` are wrapped in `then()` which allows you
  // to queue up methods by chaining, but maintaining a guaranteed execution order
  // even with remote calls to fetch templates.
  //
  Sammy.RenderContext = function(event_context) {
    this.event_context    = event_context;
    this.callbacks        = [];
    this.previous_content = null;
    this.content          = null;
    this.next_engine      = false;
    this.waiting          = false;
  };

  Sammy.RenderContext.prototype = $.extend({}, Sammy.Object.prototype, {

    // The "core" of the `RenderContext` object, adds the `callback` to the
    // queue. If the context is `waiting` (meaning an async operation is happening)
    // then the callback will be executed in order, once the other operations are
    // complete. If there is no currently executing operation, the `callback`
    // is executed immediately.
    //
    // The value returned from the callback is stored in `content` for the
    // subsequent operation. If you return `false`, the queue will pause, and
    // the next callback in the queue will not be executed until `next()` is
    // called. This allows for the guaranteed order of execution while working
    // with async operations.
    //
    // If then() is passed a string instead of a function, the string is looked
    // up as a helper method on the event context.
    //
    // ### Example
    //
    //      this.get('#/', function() {
    //        // initialize the RenderContext
    //        // Even though `load()` executes async, the next `then()`
    //        // wont execute until the load finishes
    //        this.load('myfile.txt')
    //            .then(function(content) {
    //              // the first argument to then is the content of the
    //              // prev operation
    //              $('#main').html(content);
    //            });
    //      });
    //
    then: function(callback) {
      if (!_isFunction(callback)) {
        // if a string is passed to then, assume we want to call
        // a helper on the event context in its context
        if (typeof callback === 'string' && callback in this.event_context) {
          var helper = this.event_context[callback];
          callback = function(content) {
            return helper.apply(this.event_context, [content]);
          };
        } else {
          return this;
        }
      }
      var context = this;
      if (this.waiting) {
        this.callbacks.push(callback);
      } else {
        this.wait();
        window.setTimeout(function() {
          var returned = callback.apply(context, [context.content, context.previous_content]);
          if (returned !== false) {
            context.next(returned);
          }
        }, 0);
      }
      return this;
    },

    // Pause the `RenderContext` queue. Combined with `next()` allows for async
    // operations.
    //
    // ### Example
    //
    //        this.get('#/', function() {
    //          this.load('mytext.json')
    //              .then(function(content) {
    //                var context = this,
    //                    data    = JSON.parse(content);
    //                // pause execution
    //                context.wait();
    //                // post to a url
    //                $.post(data.url, {}, function(response) {
    //                  context.next(JSON.parse(response));
    //                });
    //              })
    //              .then(function(data) {
    //                // data is json from the previous post
    //                $('#message').text(data.status);
    //              });
    //        });
    wait: function() {
      this.waiting = true;
    },

    // Resume the queue, setting `content` to be used in the next operation.
    // See `wait()` for an example.
    next: function(content) {
      this.waiting = false;
      if (typeof content !== 'undefined') {
        this.previous_content = this.content;
        this.content = content;
      }
      if (this.callbacks.length > 0) {
        this.then(this.callbacks.shift());
      }
    },

    // Load a template into the context.
    // The `location` can either be a string specifying the remote path to the
    // file, a jQuery object, or a DOM element.
    //
    // No interpolation happens by default, the content is stored in
    // `content`.
    //
    // In the case of a path, unless the option `{cache: false}` is passed the
    // data is stored in the app's `templateCache()`.
    //
    // If a jQuery or DOM object is passed the `innerHTML` of the node is pulled in.
    // This is useful for nesting templates as part of the initial page load wrapped
    // in invisible elements or `<script>` tags. With template paths, the template
    // engine is looked up by the extension. For DOM/jQuery embedded templates,
    // this isnt possible, so there are a couple of options:
    //
    //  * pass an `{engine:}` option.
    //  * define the engine in the `data-engine` attribute of the passed node.
    //  * just store the raw template data and use `interpolate()` manually
    //
    // If a `callback` is passed it is executed after the template load.
    load: function(location, options, callback) {
      var context = this;
      return this.then(function() {
        var should_cache, cached, is_json, location_array;
        if (_isFunction(options)) {
          callback = options;
          options = {};
        } else {
          options = $.extend({}, options);
        }
        if (callback) { this.then(callback); }
        if (typeof location === 'string') {
          // it's a path
          is_json      = (location.match(/\.json(\?|$)/) || options.json);
          should_cache = is_json ? options.cache === true : options.cache !== false;
          context.next_engine = context.event_context.engineFor(location);
          delete options.cache;
          delete options.json;
          if (options.engine) {
            context.next_engine = options.engine;
            delete options.engine;
          }
          if (should_cache && (cached = this.event_context.app.templateCache(location))) {
            return cached;
          }
          this.wait();
          $.ajax($.extend({
            url: location,
            data: {},
            dataType: is_json ? 'json' : 'text',
            type: 'get',
            success: function(data) {
              if (should_cache) {
                context.event_context.app.templateCache(location, data);
              }
              context.next(data);
            }
          }, options));
          return false;
        } else {
          // it's a dom/jQuery
          if (location.nodeType) {
            return location.innerHTML;
          }
          if (location.selector) {
            // it's a jQuery
            context.next_engine = location.attr('data-engine');
            if (options.clone === false) {
              return location.remove()[0].innerHTML.toString();
            } else {
              return location[0].innerHTML.toString();
            }
          }
        }
      });
    },

    // Load partials
    //
    // ### Example
    //
    //      this.loadPartials({mypartial: '/path/to/partial'});
    //
    loadPartials: function(partials) {
      var name;
      if(partials) {
        this.partials = this.partials || {};
        for(name in partials) {
          (function(context, name) {
            context.load(partials[name])
                   .then(function(template) {
                     this.partials[name] = template;
                   });
          })(this, name);
        }
      }
      return this;
    },

    // `load()` a template and then `interpolate()` it with data.
    //
    // can be called with multiple different signatures:
    //
    //      this.render(callback);
    //      this.render('/location');
    //      this.render('/location', {some: data});
    //      this.render('/location', callback);
    //      this.render('/location', {some: data}, callback);
    //      this.render('/location', {some: data}, {my: partials});
    //      this.render('/location', callback, {my: partials});
    //      this.render('/location', {some: data}, callback, {my: partials});
    //
    // ### Example
    //
    //      this.get('#/', function() {
    //        this.render('mytemplate.template', {name: 'test'});
    //      });
    //
    render: function(location, data, callback, partials) {
      if (_isFunction(location) && !data) {
        // invoked as render(callback)
        return this.then(location);
      } else {
        if(_isFunction(data)) {
          // invoked as render(location, callback, [partials])
          partials = callback;
          callback = data;
          data = null;
        } else if(callback && !_isFunction(callback)) {
          // invoked as render(location, data, partials)
          partials = callback;
          callback = null;
        }

        return this.loadPartials(partials)
                   .load(location)
                   .interpolate(data, location)
                   .then(callback);
      }
    },

    // `render()` the `location` with `data` and then `swap()` the
    // app's `$element` with the rendered content.
    partial: function(location, data, callback, partials) {
      if (_isFunction(callback)) {
        // invoked as partial(location, data, callback, [partials])
        return this.render(location, data, partials).swap(callback);
      } else if (_isFunction(data)) {
        // invoked as partial(location, callback, [partials])
        return this.render(location, {}, callback).swap(data);
      } else {
        // invoked as partial(location, data, [partials])
        return this.render(location, data, callback).swap();
      }
    },

    // defers the call of function to occur in order of the render queue.
    // The function can accept any number of arguments as long as the last
    // argument is a callback function. This is useful for putting arbitrary
    // asynchronous functions into the queue. The content passed to the
    // callback is passed as `content` to the next item in the queue.
    //
    // ### Example
    //
    //     this.send($.getJSON, '/app.json')
    //         .then(function(json) {
    //           $('#message).text(json['message']);
    //          });
    //
    //
    send: function() {
      var context = this,
          args = _makeArray(arguments),
          fun  = args.shift();

      if (_isArray(args[0])) { args = args[0]; }

      return this.then(function(content) {
        args.push(function(response) { context.next(response); });
        context.wait();
        fun.apply(fun, args);
        return false;
      });
    },

    // iterates over an array, applying the callback for each item item. the
    // callback takes the same style of arguments as `jQuery.each()` (index, item).
    // The return value of each callback is collected as a single string and stored
    // as `content` to be used in the next iteration of the `RenderContext`.
    collect: function(array, callback, now) {
      var context = this;
      var coll = function() {
        if (_isFunction(array)) {
          callback = array;
          array = this.content;
        }
        var contents = [], doms = false;
        $.each(array, function(i, item) {
          var returned = callback.apply(context, [i, item]);
          if (returned.jquery && returned.length == 1) {
            returned = returned[0];
            doms = true;
          }
          contents.push(returned);
          return returned;
        });
        return doms ? contents : contents.join('');
      };
      return now ? coll() : this.then(coll);
    },

    // loads a template, and then interpolates it for each item in the `data`
    // array. If a callback is passed, it will call the callback with each
    // item in the array _after_ interpolation
    renderEach: function(location, name, data, callback) {
      if (_isArray(name)) {
        callback = data;
        data = name;
        name = null;
      }
      return this.load(location).then(function(content) {
          var rctx = this;
          if (!data) {
            data = _isArray(this.previous_content) ? this.previous_content : [];
          }
          if (callback) {
            $.each(data, function(i, value) {
              var idata = {}, engine = this.next_engine || location;
              if (name) {
                idata[name] = value;
              } else {
                idata = value;
              }
              callback(value, rctx.event_context.interpolate(content, idata, engine));
            });
          } else {
            return this.collect(data, function(i, value) {
              var idata = {}, engine = this.next_engine || location;
              if (name) {
                idata[name] = value;
              } else {
                idata = value;
              }
              return this.event_context.interpolate(content, idata, engine);
            }, true);
          }
      });
    },

    // uses the previous loaded `content` and the `data` object to interpolate
    // a template. `engine` defines the templating/interpolation method/engine
    // that should be used. If `engine` is not passed, the `next_engine` is
    // used. If `retain` is `true`, the final interpolated data is appended to
    // the `previous_content` instead of just replacing it.
    interpolate: function(data, engine, retain) {
      var context = this;
      return this.then(function(content, prev) {
        if (!data && prev) { data = prev; }
        if (this.next_engine) {
          engine = this.next_engine;
          this.next_engine = false;
        }
        var rendered = context.event_context.interpolate(content, data, engine, this.partials);
        return retain ? prev + rendered : rendered;
      });
    },

    // Swap the return contents ensuring order. See `Application#swap`
    swap: function(callback) {
      return this.then(function(content) {
        this.event_context.swap(content, callback);
        return content;
      }).trigger('changed', {});
    },

    // Same usage as `jQuery.fn.appendTo()` but uses `then()` to ensure order
    appendTo: function(selector) {
      return this.then(function(content) {
        $(selector).append(content);
      }).trigger('changed', {});
    },

    // Same usage as `jQuery.fn.prependTo()` but uses `then()` to ensure order
    prependTo: function(selector) {
      return this.then(function(content) {
        $(selector).prepend(content);
      }).trigger('changed', {});
    },

    // Replaces the `$(selector)` using `html()` with the previously loaded
    // `content`
    replace: function(selector) {
      return this.then(function(content) {
        $(selector).html(content);
      }).trigger('changed', {});
    },

    // trigger the event in the order of the event context. Same semantics
    // as `Sammy.EventContext#trigger()`. If data is omitted, `content`
    // is sent as `{content: content}`
    trigger: function(name, data) {
      return this.then(function(content) {
        if (typeof data == 'undefined') { data = {content: content}; }
        this.event_context.trigger(name, data);
        return content;
      });
    }

  });

  // `Sammy.EventContext` objects are created every time a route is run or a
  // bound event is triggered. The callbacks for these events are evaluated within a `Sammy.EventContext`
  // This within these callbacks the special methods of `EventContext` are available.
  //
  // ### Example
  //
  //       $.sammy(function() {
  //         // The context here is this Sammy.Application
  //         this.get('#/:name', function() {
  //           // The context here is a new Sammy.EventContext
  //           if (this.params['name'] == 'sammy') {
  //             this.partial('name.html.erb', {name: 'Sammy'});
  //           } else {
  //             this.redirect('#/somewhere-else')
  //           }
  //         });
  //       });
  //
  // Initialize a new EventContext
  //
  // ### Arguments
  //
  // * `app` The `Sammy.Application` this event is called within.
  // * `verb` The verb invoked to run this context/route.
  // * `path` The string path invoked to run this context/route.
  // * `params` An Object of optional params to pass to the context. Is converted
  //   to a `Sammy.Object`.
  // * `target` a DOM element that the event that holds this context originates
  //   from. For post, put and del routes, this is the form element that triggered
  //   the route.
  //
  Sammy.EventContext = function(app, verb, path, params, target) {
    this.app    = app;
    this.verb   = verb;
    this.path   = path;
    this.params = new Sammy.Object(params);
    this.target = target;
  };

  Sammy.EventContext.prototype = $.extend({}, Sammy.Object.prototype, {

    // A shortcut to the app's `$element()`
    $element: function() {
      return this.app.$element(_makeArray(arguments).shift());
    },

    // Look up a templating engine within the current app and context.
    // `engine` can be one of the following:
    //
    // * a function: should conform to `function(content, data) { return interpolated; }`
    // * a template path: 'template.ejs', looks up the extension to match to
    //   the `ejs()` helper
    // * a string referring to the helper: "mustache" => `mustache()`
    //
    // If no engine is found, use the app's default `template_engine`
    //
    engineFor: function(engine) {
      var context = this, engine_match;
      // if path is actually an engine function just return it
      if (_isFunction(engine)) { return engine; }
      // lookup engine name by path extension
      engine = (engine || context.app.template_engine).toString();
      if ((engine_match = engine.match(/\.([^\.\?\#]+)(\?|$)/))) {
        engine = engine_match[1];
      }
      // set the engine to the default template engine if no match is found
      if (engine && _isFunction(context[engine])) {
        return context[engine];
      }

      if (context.app.template_engine) {
        return this.engineFor(context.app.template_engine);
      }
      return function(content, data) { return content; };
    },

    // using the template `engine` found with `engineFor()`, interpolate the
    // `data` into `content`
    interpolate: function(content, data, engine, partials) {
      return this.engineFor(engine).apply(this, [content, data, partials]);
    },

    // Create and return a `Sammy.RenderContext` calling `render()` on it.
    // Loads the template and interpolate the data, however does not actual
    // place it in the DOM.
    //
    // ### Example
    //
    //      // mytemplate.mustache <div class="name">{{name}}</div>
    //      render('mytemplate.mustache', {name: 'quirkey'});
    //      // sets the `content` to <div class="name">quirkey</div>
    //      render('mytemplate.mustache', {name: 'quirkey'})
    //        .appendTo('ul');
    //      // appends the rendered content to $('ul')
    //
    render: function(location, data, callback, partials) {
      return new Sammy.RenderContext(this).render(location, data, callback, partials);
    },

    // Create and return a `Sammy.RenderContext` calling `renderEach()` on it.
    // Loads the template and interpolates the data for each item,
    // however does not actual place it in the DOM.
    //
    // ### Example
    //
    //      // mytemplate.mustache <div class="name">{{name}}</div>
    //      renderEach('mytemplate.mustache', [{name: 'quirkey'}, {name: 'endor'}])
    //      // sets the `content` to <div class="name">quirkey</div><div class="name">endor</div>
    //      renderEach('mytemplate.mustache', [{name: 'quirkey'}, {name: 'endor'}]).appendTo('ul');
    //      // appends the rendered content to $('ul')
    //
    renderEach: function(location, name, data, callback) {
      return new Sammy.RenderContext(this).renderEach(location, name, data, callback);
    },

    // create a new `Sammy.RenderContext` calling `load()` with `location` and
    // `options`. Called without interpolation or placement, this allows for
    // preloading/caching the templates.
    load: function(location, options, callback) {
      return new Sammy.RenderContext(this).load(location, options, callback);
    },

    // create a new `Sammy.RenderContext` calling `loadPartials()` with `partials`.
    loadPartials: function(partials) {
      return new Sammy.RenderContext(this).loadPartials(partials);
    },

    // `render()` the `location` with `data` and then `swap()` the
    // app's `$element` with the rendered content.
    partial: function(location, data, callback, partials) {
      return new Sammy.RenderContext(this).partial(location, data, callback, partials);
    },

    // create a new `Sammy.RenderContext` calling `send()` with an arbitrary
    // function
    send: function() {
      var rctx = new Sammy.RenderContext(this);
      return rctx.send.apply(rctx, arguments);
    },

    // Changes the location of the current window. If `to` begins with
    // '#' it only changes the document's hash. If passed more than 1 argument
    // redirect will join them together with forward slashes.
    //
    // ### Example
    //
    //      redirect('#/other/route');
    //      // equivalent to
    //      redirect('#', 'other', 'route');
    //
    redirect: function() {
      var to, args = _makeArray(arguments),
          current_location = this.app.getLocation(),
          l = args.length;
      if (l > 1) {
        var i = 0, paths = [], pairs = [], params = {}, has_params = false;
        for (; i < l; i++) {
          if (typeof args[i] == 'string') {
            paths.push(args[i]);
          } else {
            $.extend(params, args[i]);
            has_params = true;
          }
        }
        to = paths.join('/');
        if (has_params) {
          for (var k in params) {
            pairs.push(this.app._encodeFormPair(k, params[k]));
          }
          to += '?' + pairs.join('&');
        }
      } else {
        to = args[0];
      }
      this.trigger('redirect', {to: to});
      this.app.last_location = [this.verb, this.path];
      this.app.setLocation(to);
      if (new RegExp(to).test(current_location)) {
        this.app.trigger('location-changed');
      }
    },

    // Triggers events on `app` within the current context.
    trigger: function(name, data) {
      if (typeof data == 'undefined') { data = {}; }
      if (!data.context) { data.context = this; }
      return this.app.trigger(name, data);
    },

    // A shortcut to app's `eventNamespace()`
    eventNamespace: function() {
      return this.app.eventNamespace();
    },

    // A shortcut to app's `swap()`
    swap: function(contents, callback) {
      return this.app.swap(contents, callback);
    },

    // Raises a possible `notFound()` error for the current path.
    notFound: function() {
      return this.app.notFound(this.verb, this.path);
    },

    // Default JSON parsing uses jQuery's `parseJSON()`. Include `Sammy.JSON`
    // plugin for the more conformant "crockford special".
    json: function(string) {
      return $.parseJSON(string);
    },

    // //=> Sammy.EventContext: get #/ {}
    toString: function() {
      return "Sammy.EventContext: " + [this.verb, this.path, this.params].join(' ');
    }

  });

  return Sammy;
});


; browserify_shim__define__module__export__(typeof Sammy != "undefined" ? Sammy : window.Sammy);

}).call(global, undefined, undefined, undefined, undefined, function defineExport(ex) { module.exports = ex; });

}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlNjcmlwdHMvbGliL3NhbW15LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIlxuOyBKUXVlcnkgPSBnbG9iYWwuSlF1ZXJ5ID0gcmVxdWlyZShcImpxdWVyeVwiKTtcbjsgdmFyIF9fYnJvd3NlcmlmeV9zaGltX3JlcXVpcmVfXz1yZXF1aXJlOyhmdW5jdGlvbiBicm93c2VyaWZ5U2hpbShtb2R1bGUsIGV4cG9ydHMsIHJlcXVpcmUsIGRlZmluZSwgYnJvd3NlcmlmeV9zaGltX19kZWZpbmVfX21vZHVsZV9fZXhwb3J0X18pIHtcbi8vIG5hbWU6IHNhbW15XHJcbi8vIHZlcnNpb246IDAuNy41XHJcblxyXG4vLyBTYW1teS5qcyAvIGh0dHA6Ly9zYW1teWpzLm9yZ1xyXG5cclxuKGZ1bmN0aW9uKGZhY3Rvcnkpe1xyXG4gIC8vIFN1cHBvcnQgbW9kdWxlIGxvYWRpbmcgc2NlbmFyaW9zXHJcbiAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCl7XHJcbiAgICAvLyBBTUQgQW5vbnltb3VzIE1vZHVsZVxyXG4gICAgZGVmaW5lKFsnanF1ZXJ5J10sIGZhY3RvcnkpO1xyXG4gIH0gZWxzZSB7XHJcbiAgICAvLyBObyBtb2R1bGUgbG9hZGVyIChwbGFpbiA8c2NyaXB0PiB0YWcpIC0gcHV0IGRpcmVjdGx5IGluIGdsb2JhbCBuYW1lc3BhY2VcclxuICAgIGpRdWVyeS5zYW1teSA9IHdpbmRvdy5TYW1teSA9IGZhY3RvcnkoalF1ZXJ5KTtcclxuICB9XHJcbn0pKGZ1bmN0aW9uKCQpe1xyXG5cclxuICB2YXIgU2FtbXksXHJcbiAgICAgIFBBVEhfUkVQTEFDRVIgPSBcIihbXlxcL10rKVwiLFxyXG4gICAgICBQQVRIX05BTUVfTUFUQ0hFUiA9IC86KFtcXHdcXGRdKykvZyxcclxuICAgICAgUVVFUllfU1RSSU5HX01BVENIRVIgPSAvXFw/KFteI10qKT8kLyxcclxuICAgICAgLy8gbWFpbmx5IGZvciBtYWtpbmcgYGFyZ3VtZW50c2AgYW4gQXJyYXlcclxuICAgICAgX21ha2VBcnJheSA9IGZ1bmN0aW9uKG5vbmFycmF5KSB7IHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChub25hcnJheSk7IH0sXHJcbiAgICAgIC8vIGJvcnJvd2VkIGZyb20galF1ZXJ5XHJcbiAgICAgIF9pc0Z1bmN0aW9uID0gZnVuY3Rpb24oIG9iaiApIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopID09PSBcIltvYmplY3QgRnVuY3Rpb25dXCI7IH0sXHJcbiAgICAgIF9pc0FycmF5ID0gZnVuY3Rpb24oIG9iaiApIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopID09PSBcIltvYmplY3QgQXJyYXldXCI7IH0sXHJcbiAgICAgIF9pc1JlZ0V4cCA9IGZ1bmN0aW9uKCBvYmogKSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKSA9PT0gXCJbb2JqZWN0IFJlZ0V4cF1cIjsgfSxcclxuICAgICAgX2RlY29kZSA9IGZ1bmN0aW9uKCBzdHIgKSB7IHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoKHN0ciB8fCAnJykucmVwbGFjZSgvXFwrL2csICcgJykpOyB9LFxyXG4gICAgICBfZW5jb2RlID0gZW5jb2RlVVJJQ29tcG9uZW50LFxyXG4gICAgICBfZXNjYXBlSFRNTCA9IGZ1bmN0aW9uKHMpIHtcclxuICAgICAgICByZXR1cm4gU3RyaW5nKHMpLnJlcGxhY2UoLyYoPyFcXHcrOykvZywgJyZhbXA7JykucmVwbGFjZSgvPC9nLCAnJmx0OycpLnJlcGxhY2UoLz4vZywgJyZndDsnKS5yZXBsYWNlKC9cIi9nLCAnJnF1b3Q7Jyk7XHJcbiAgICAgIH0sXHJcbiAgICAgIF9yb3V0ZVdyYXBwZXIgPSBmdW5jdGlvbih2ZXJiKSB7XHJcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMucm91dGUuYXBwbHkodGhpcywgW3ZlcmJdLmNvbmNhdChBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpKSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgfSxcclxuICAgICAgX3RlbXBsYXRlX2NhY2hlID0ge30sXHJcbiAgICAgIF9oYXNfaGlzdG9yeSA9ICEhKHdpbmRvdy5oaXN0b3J5ICYmIGhpc3RvcnkucHVzaFN0YXRlKSxcclxuICAgICAgbG9nZ2VycyA9IFtdO1xyXG5cclxuXHJcbiAgLy8gYFNhbW15YCAoYWxzbyBhbGlhc2VkIGFzICQuc2FtbXkpIGlzIG5vdCBvbmx5IHRoZSBuYW1lc3BhY2UgZm9yIGFcclxuICAvLyBudW1iZXIgb2YgcHJvdG90eXBlcywgaXRzIGFsc28gYSB0b3AgbGV2ZWwgbWV0aG9kIHRoYXQgYWxsb3dzIGZvciBlYXN5XHJcbiAgLy8gY3JlYXRpb24vbWFuYWdlbWVudCBvZiBgU2FtbXkuQXBwbGljYXRpb25gIGluc3RhbmNlcy4gVGhlcmUgYXJlIGFcclxuICAvLyBudW1iZXIgb2YgZGlmZmVyZW50IGZvcm1zIGZvciBgU2FtbXkoKWAgYnV0IGVhY2ggcmV0dXJucyBhbiBpbnN0YW5jZVxyXG4gIC8vIG9mIGBTYW1teS5BcHBsaWNhdGlvbmAuIFdoZW4gYSBuZXcgaW5zdGFuY2UgaXMgY3JlYXRlZCB1c2luZ1xyXG4gIC8vIGBTYW1teWAgaXQgaXMgYWRkZWQgdG8gYW4gT2JqZWN0IGNhbGxlZCBgU2FtbXkuYXBwc2AuIFRoaXNcclxuICAvLyBwcm92aWRlcyBmb3IgYW4gZWFzeSB3YXkgdG8gZ2V0IGF0IGV4aXN0aW5nIFNhbW15IGFwcGxpY2F0aW9ucy4gT25seSBvbmVcclxuICAvLyBpbnN0YW5jZSBpcyBhbGxvd2VkIHBlciBgZWxlbWVudF9zZWxlY3RvcmAgc28gd2hlbiBjYWxsaW5nXHJcbiAgLy8gYFNhbW15KCdzZWxlY3RvcicpYCBtdWx0aXBsZSB0aW1lcywgdGhlIGZpcnN0IHRpbWUgd2lsbCBjcmVhdGVcclxuICAvLyB0aGUgYXBwbGljYXRpb24gYW5kIHRoZSBmb2xsb3dpbmcgdGltZXMgd2lsbCBleHRlbmQgdGhlIGFwcGxpY2F0aW9uXHJcbiAgLy8gYWxyZWFkeSBhZGRlZCB0byB0aGF0IHNlbGVjdG9yLlxyXG4gIC8vXHJcbiAgLy8gIyMjIEV4YW1wbGVcclxuICAvL1xyXG4gIC8vICAgICAgLy8gcmV0dXJucyB0aGUgYXBwIGF0ICNtYWluIG9yIGEgbmV3IGFwcFxyXG4gIC8vICAgICAgU2FtbXkoJyNtYWluJylcclxuICAvL1xyXG4gIC8vICAgICAgLy8gZXF1aXZhbGVudCB0byBcIm5ldyBTYW1teS5BcHBsaWNhdGlvblwiLCBleGNlcHQgYXBwZW5kcyB0byBhcHBzXHJcbiAgLy8gICAgICBTYW1teSgpO1xyXG4gIC8vICAgICAgU2FtbXkoZnVuY3Rpb24oKSB7IC4uLiB9KTtcclxuICAvL1xyXG4gIC8vICAgICAgLy8gZXh0ZW5kcyB0aGUgYXBwIGF0ICcjbWFpbicgd2l0aCBmdW5jdGlvbi5cclxuICAvLyAgICAgIFNhbW15KCcjbWFpbicsIGZ1bmN0aW9uKCkgeyAuLi4gfSk7XHJcbiAgLy9cclxuICBTYW1teSA9IGZ1bmN0aW9uKCkge1xyXG4gICAgdmFyIGFyZ3MgPSBfbWFrZUFycmF5KGFyZ3VtZW50cyksXHJcbiAgICAgICAgYXBwLCBzZWxlY3RvcjtcclxuICAgIFNhbW15LmFwcHMgPSBTYW1teS5hcHBzIHx8IHt9O1xyXG4gICAgaWYgKGFyZ3MubGVuZ3RoID09PSAwIHx8IGFyZ3NbMF0gJiYgX2lzRnVuY3Rpb24oYXJnc1swXSkpIHsgLy8gU2FtbXkoKVxyXG4gICAgICByZXR1cm4gU2FtbXkuYXBwbHkoU2FtbXksIFsnYm9keSddLmNvbmNhdChhcmdzKSk7XHJcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiAoc2VsZWN0b3IgPSBhcmdzLnNoaWZ0KCkpID09ICdzdHJpbmcnKSB7IC8vIFNhbW15KCcjbWFpbicpXHJcbiAgICAgIGFwcCA9IFNhbW15LmFwcHNbc2VsZWN0b3JdIHx8IG5ldyBTYW1teS5BcHBsaWNhdGlvbigpO1xyXG4gICAgICBhcHAuZWxlbWVudF9zZWxlY3RvciA9IHNlbGVjdG9yO1xyXG4gICAgICBpZiAoYXJncy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgJC5lYWNoKGFyZ3MsIGZ1bmN0aW9uKGksIHBsdWdpbikge1xyXG4gICAgICAgICAgYXBwLnVzZShwbHVnaW4pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIGlmIHRoZSBzZWxlY3RvciBjaGFuZ2VzIG1ha2Ugc3VyZSB0aGUgcmVmZXJlbmNlIGluIFNhbW15LmFwcHMgY2hhbmdlc1xyXG4gICAgICBpZiAoYXBwLmVsZW1lbnRfc2VsZWN0b3IgIT0gc2VsZWN0b3IpIHtcclxuICAgICAgICBkZWxldGUgU2FtbXkuYXBwc1tzZWxlY3Rvcl07XHJcbiAgICAgIH1cclxuICAgICAgU2FtbXkuYXBwc1thcHAuZWxlbWVudF9zZWxlY3Rvcl0gPSBhcHA7XHJcbiAgICAgIHJldHVybiBhcHA7XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgU2FtbXkuVkVSU0lPTiA9ICcwLjcuNSc7XHJcblxyXG4gIC8vIEFkZCB0byB0aGUgZ2xvYmFsIGxvZ2dlciBwb29sLiBUYWtlcyBhIGZ1bmN0aW9uIHRoYXQgYWNjZXB0cyBhblxyXG4gIC8vIHVua25vd24gbnVtYmVyIG9mIGFyZ3VtZW50cyBhbmQgc2hvdWxkIHByaW50IHRoZW0gb3Igc2VuZCB0aGVtIHNvbWV3aGVyZVxyXG4gIC8vIFRoZSBmaXJzdCBhcmd1bWVudCBpcyBhbHdheXMgYSB0aW1lc3RhbXAuXHJcbiAgU2FtbXkuYWRkTG9nZ2VyID0gZnVuY3Rpb24obG9nZ2VyKSB7XHJcbiAgICBsb2dnZXJzLnB1c2gobG9nZ2VyKTtcclxuICB9O1xyXG5cclxuICAvLyBTZW5kcyBhIGxvZyBtZXNzYWdlIHRvIGVhY2ggbG9nZ2VyIGxpc3RlZCBpbiB0aGUgZ2xvYmFsXHJcbiAgLy8gbG9nZ2VycyBwb29sLiBDYW4gdGFrZSBhbnkgbnVtYmVyIG9mIGFyZ3VtZW50cy5cclxuICAvLyBBbHNvIHByZWZpeGVzIHRoZSBhcmd1bWVudHMgd2l0aCBhIHRpbWVzdGFtcC5cclxuICBTYW1teS5sb2cgPSBmdW5jdGlvbigpICB7XHJcbiAgICB2YXIgYXJncyA9IF9tYWtlQXJyYXkoYXJndW1lbnRzKTtcclxuICAgIGFyZ3MudW5zaGlmdChcIltcIiArIERhdGUoKSArIFwiXVwiKTtcclxuICAgICQuZWFjaChsb2dnZXJzLCBmdW5jdGlvbihpLCBsb2dnZXIpIHtcclxuICAgICAgbG9nZ2VyLmFwcGx5KFNhbW15LCBhcmdzKTtcclxuICAgIH0pO1xyXG4gIH07XHJcblxyXG4gIGlmICh0eXBlb2Ygd2luZG93LmNvbnNvbGUgIT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgIGlmICh0eXBlb2Ygd2luZG93LmNvbnNvbGUubG9nID09PSAnZnVuY3Rpb24nICYmIF9pc0Z1bmN0aW9uKHdpbmRvdy5jb25zb2xlLmxvZy5hcHBseSkpIHtcclxuICAgICAgU2FtbXkuYWRkTG9nZ2VyKGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIHdpbmRvdy5jb25zb2xlLmxvZy5hcHBseSh3aW5kb3cuY29uc29sZSwgYXJndW1lbnRzKTtcclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBTYW1teS5hZGRMb2dnZXIoZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgd2luZG93LmNvbnNvbGUubG9nKGFyZ3VtZW50cyk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH0gZWxzZSBpZiAodHlwZW9mIGNvbnNvbGUgIT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgIFNhbW15LmFkZExvZ2dlcihmdW5jdGlvbigpIHtcclxuICAgICAgY29uc29sZS5sb2cuYXBwbHkoY29uc29sZSwgYXJndW1lbnRzKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgJC5leHRlbmQoU2FtbXksIHtcclxuICAgIG1ha2VBcnJheTogX21ha2VBcnJheSxcclxuICAgIGlzRnVuY3Rpb246IF9pc0Z1bmN0aW9uLFxyXG4gICAgaXNBcnJheTogX2lzQXJyYXlcclxuICB9KTtcclxuXHJcbiAgLy8gU2FtbXkuT2JqZWN0IGlzIHRoZSBiYXNlIGZvciBhbGwgb3RoZXIgU2FtbXkgY2xhc3Nlcy4gSXQgcHJvdmlkZXMgc29tZSB1c2VmdWxcclxuICAvLyBmdW5jdGlvbmFsaXR5LCBpbmNsdWRpbmcgY2xvbmluZywgaXRlcmF0aW5nLCBldGMuXHJcbiAgU2FtbXkuT2JqZWN0ID0gZnVuY3Rpb24ob2JqKSB7IC8vIGNvbnN0cnVjdG9yXHJcbiAgICByZXR1cm4gJC5leHRlbmQodGhpcywgb2JqIHx8IHt9KTtcclxuICB9O1xyXG5cclxuICAkLmV4dGVuZChTYW1teS5PYmplY3QucHJvdG90eXBlLCB7XHJcblxyXG4gICAgLy8gRXNjYXBlIEhUTUwgaW4gc3RyaW5nLCB1c2UgaW4gdGVtcGxhdGVzIHRvIHByZXZlbnQgc2NyaXB0IGluamVjdGlvbi5cclxuICAgIC8vIEFsc28gYWxpYXNlZCBhcyBgaCgpYFxyXG4gICAgZXNjYXBlSFRNTDogX2VzY2FwZUhUTUwsXHJcbiAgICBoOiBfZXNjYXBlSFRNTCxcclxuXHJcbiAgICAvLyBSZXR1cm5zIGEgY29weSBvZiB0aGUgb2JqZWN0IHdpdGggRnVuY3Rpb25zIHJlbW92ZWQuXHJcbiAgICB0b0hhc2g6IGZ1bmN0aW9uKCkge1xyXG4gICAgICB2YXIganNvbiA9IHt9O1xyXG4gICAgICAkLmVhY2godGhpcywgZnVuY3Rpb24oayx2KSB7XHJcbiAgICAgICAgaWYgKCFfaXNGdW5jdGlvbih2KSkge1xyXG4gICAgICAgICAganNvbltrXSA9IHY7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuIGpzb247XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIFJlbmRlcnMgYSBzaW1wbGUgSFRNTCB2ZXJzaW9uIG9mIHRoaXMgT2JqZWN0cyBhdHRyaWJ1dGVzLlxyXG4gICAgLy8gRG9lcyBub3QgcmVuZGVyIGZ1bmN0aW9ucy5cclxuICAgIC8vIEZvciBleGFtcGxlLiBHaXZlbiB0aGlzIFNhbW15Lk9iamVjdDpcclxuICAgIC8vXHJcbiAgICAvLyAgICAgdmFyIHMgPSBuZXcgU2FtbXkuT2JqZWN0KHtmaXJzdF9uYW1lOiAnU2FtbXknLCBsYXN0X25hbWU6ICdEYXZpcyBKci4nfSk7XHJcbiAgICAvLyAgICAgcy50b0hUTUwoKVxyXG4gICAgLy8gICAgIC8vPT4gJzxzdHJvbmc+Zmlyc3RfbmFtZTwvc3Ryb25nPiBTYW1teTxiciAvPjxzdHJvbmc+bGFzdF9uYW1lPC9zdHJvbmc+IERhdmlzIEpyLjxiciAvPidcclxuICAgIC8vXHJcbiAgICB0b0hUTUw6IGZ1bmN0aW9uKCkge1xyXG4gICAgICB2YXIgZGlzcGxheSA9IFwiXCI7XHJcbiAgICAgICQuZWFjaCh0aGlzLCBmdW5jdGlvbihrLCB2KSB7XHJcbiAgICAgICAgaWYgKCFfaXNGdW5jdGlvbih2KSkge1xyXG4gICAgICAgICAgZGlzcGxheSArPSBcIjxzdHJvbmc+XCIgKyBrICsgXCI8L3N0cm9uZz4gXCIgKyB2ICsgXCI8YnIgLz5cIjtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm4gZGlzcGxheTtcclxuICAgIH0sXHJcblxyXG4gICAgLy8gUmV0dXJucyBhbiBhcnJheSBvZiBrZXlzIGZvciB0aGlzIG9iamVjdC4gSWYgYGF0dHJpYnV0ZXNfb25seWBcclxuICAgIC8vIGlzIHRydWUgd2lsbCBub3QgcmV0dXJuIGtleXMgdGhhdCBtYXAgdG8gYSBgZnVuY3Rpb24oKWBcclxuICAgIGtleXM6IGZ1bmN0aW9uKGF0dHJpYnV0ZXNfb25seSkge1xyXG4gICAgICB2YXIga2V5cyA9IFtdO1xyXG4gICAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiB0aGlzKSB7XHJcbiAgICAgICAgaWYgKCFfaXNGdW5jdGlvbih0aGlzW3Byb3BlcnR5XSkgfHwgIWF0dHJpYnV0ZXNfb25seSkge1xyXG4gICAgICAgICAga2V5cy5wdXNoKHByb3BlcnR5KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGtleXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIENoZWNrcyBpZiB0aGUgb2JqZWN0IGhhcyBhIHZhbHVlIGF0IGBrZXlgIGFuZCB0aGF0IHRoZSB2YWx1ZSBpcyBub3QgZW1wdHlcclxuICAgIGhhczogZnVuY3Rpb24oa2V5KSB7XHJcbiAgICAgIHJldHVybiB0aGlzW2tleV0gJiYgJC50cmltKHRoaXNba2V5XS50b1N0cmluZygpKSAhPT0gJyc7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIGNvbnZlbmllbmNlIG1ldGhvZCB0byBqb2luIGFzIG1hbnkgYXJndW1lbnRzIGFzIHlvdSB3YW50XHJcbiAgICAvLyBieSB0aGUgZmlyc3QgYXJndW1lbnQgLSB1c2VmdWwgZm9yIG1ha2luZyBwYXRoc1xyXG4gICAgam9pbjogZnVuY3Rpb24oKSB7XHJcbiAgICAgIHZhciBhcmdzID0gX21ha2VBcnJheShhcmd1bWVudHMpO1xyXG4gICAgICB2YXIgZGVsaW1pdGVyID0gYXJncy5zaGlmdCgpO1xyXG4gICAgICByZXR1cm4gYXJncy5qb2luKGRlbGltaXRlcik7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIFNob3J0Y3V0IHRvIFNhbW15LmxvZ1xyXG4gICAgbG9nOiBmdW5jdGlvbigpIHtcclxuICAgICAgU2FtbXkubG9nLmFwcGx5KFNhbW15LCBhcmd1bWVudHMpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LlxyXG4gICAgLy8gaWYgYGluY2x1ZGVfZnVuY3Rpb25zYCBpcyB0cnVlLCBpdCB3aWxsIGFsc28gdG9TdHJpbmcoKSB0aGVcclxuICAgIC8vIG1ldGhvZHMgb2YgdGhpcyBvYmplY3QuIEJ5IGRlZmF1bHQgb25seSBwcmludHMgdGhlIGF0dHJpYnV0ZXMuXHJcbiAgICB0b1N0cmluZzogZnVuY3Rpb24oaW5jbHVkZV9mdW5jdGlvbnMpIHtcclxuICAgICAgdmFyIHMgPSBbXTtcclxuICAgICAgJC5lYWNoKHRoaXMsIGZ1bmN0aW9uKGssIHYpIHtcclxuICAgICAgICBpZiAoIV9pc0Z1bmN0aW9uKHYpIHx8IGluY2x1ZGVfZnVuY3Rpb25zKSB7XHJcbiAgICAgICAgICBzLnB1c2goJ1wiJyArIGsgKyAnXCI6ICcgKyB2LnRvU3RyaW5nKCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybiBcIlNhbW15Lk9iamVjdDoge1wiICsgcy5qb2luKCcsJykgKyBcIn1cIjtcclxuICAgIH1cclxuICB9KTtcclxuXHJcblxyXG4gIC8vIFJldHVybiB3aGV0aGVyIHRoZSBldmVudCB0YXJnZXRzIHRoaXMgd2luZG93LlxyXG4gIFNhbW15LnRhcmdldElzVGhpc1dpbmRvdyA9IGZ1bmN0aW9uIHRhcmdldElzVGhpc1dpbmRvdyhldmVudCwgdGFnTmFtZSkge1xyXG4gICAgdmFyIHRhcmdldEVsZW1lbnQgPSAkKGV2ZW50LnRhcmdldCkuY2xvc2VzdCh0YWdOYW1lKTtcclxuICAgIGlmICh0YXJnZXRFbGVtZW50Lmxlbmd0aCA9PT0gMCkgeyByZXR1cm4gdHJ1ZTsgfVxyXG5cclxuICAgIHZhciB0YXJnZXRXaW5kb3cgPSB0YXJnZXRFbGVtZW50LmF0dHIoJ3RhcmdldCcpO1xyXG4gICAgaWYgKCF0YXJnZXRXaW5kb3cgfHwgdGFyZ2V0V2luZG93ID09PSB3aW5kb3cubmFtZSB8fCB0YXJnZXRXaW5kb3cgPT09ICdfc2VsZicpIHsgcmV0dXJuIHRydWU7IH1cclxuICAgIGlmICh0YXJnZXRXaW5kb3cgPT09ICdfYmxhbmsnKSB7IHJldHVybiBmYWxzZTsgfVxyXG4gICAgaWYgKHRhcmdldFdpbmRvdyA9PT0gJ3RvcCcgJiYgd2luZG93ID09PSB3aW5kb3cudG9wKSB7IHJldHVybiB0cnVlOyB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfTtcclxuXHJcblxyXG4gIC8vIFRoZSBEZWZhdWx0TG9jYXRpb25Qcm94eSBpcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBwcm94eSBmb3IgYWxsIFNhbW15IGFwcGxpY2F0aW9ucy5cclxuICAvLyBBIGxvY2F0aW9uIHByb3h5IGlzIGEgcHJvdG90eXBlIHRoYXQgY29uZm9ybXMgdG8gYSBzaW1wbGUgaW50ZXJmYWNlLiBUaGUgcHVycG9zZVxyXG4gIC8vIG9mIGEgbG9jYXRpb24gcHJveHkgaXMgdG8gbm90aWZ5IHRoZSBTYW1teS5BcHBsaWNhdGlvbiBpdHMgYm91bmQgdG8gd2hlbiB0aGUgbG9jYXRpb25cclxuICAvLyBvciAnZXh0ZXJuYWwgc3RhdGUnIGNoYW5nZXMuXHJcbiAgLy9cclxuICAvLyBUaGUgYERlZmF1bHRMb2NhdGlvblByb3h5YCB3YXRjaGVzIGZvciBjaGFuZ2VzIHRvIHRoZSBwYXRoIG9mIHRoZSBjdXJyZW50IHdpbmRvdyBhbmRcclxuICAvLyBpcyBhbHNvIGFibGUgdG8gc2V0IHRoZSBwYXRoIGJhc2VkIG9uIGNoYW5nZXMgaW4gdGhlIGFwcGxpY2F0aW9uLiBJdCBkb2VzIHRoaXMgYnlcclxuICAvLyB1c2luZyBkaWZmZXJlbnQgbWV0aG9kcyBkZXBlbmRpbmcgb24gd2hhdCBpcyBhdmFpbGFibGUgaW4gdGhlIGN1cnJlbnQgYnJvd3Nlci4gSW5cclxuICAvLyB0aGUgbGF0ZXN0IGFuZCBncmVhdGVzdCBicm93c2VycyBpdCB1c2VkIHRoZSBIVE1MNSBIaXN0b3J5IEFQSSBhbmQgdGhlIGBwdXNoU3RhdGVgXHJcbiAgLy8gYHBvcFN0YXRlYCBldmVudHMvbWV0aG9kcy4gVGhpcyBhbGxvd3MgeW91IHRvIHVzZSBTYW1teSB0byBzZXJ2ZSBhIHNpdGUgYmVoaW5kIG5vcm1hbFxyXG4gIC8vIFVSSSBwYXRocyBhcyBvcHBvc2VkIHRvIHRoZSBvbGRlciBkZWZhdWx0IG9mIGhhc2ggKCMpIGJhc2VkIHJvdXRpbmcuIEJlY2F1c2UgdGhlIHNlcnZlclxyXG4gIC8vIGNhbiBpbnRlcnByZXQgdGhlIGNoYW5nZWQgcGF0aCBvbiBhIHJlZnJlc2ggb3IgcmUtZW50cnksIHRob3VnaCwgaXQgcmVxdWlyZXMgYWRkaXRpb25hbFxyXG4gIC8vIHN1cHBvcnQgb24gdGhlIHNlcnZlciBzaWRlLiBJZiB5b3UnZCBsaWtlIHRvIGZvcmNlIGRpc2FibGUgSFRNTDUgaGlzdG9yeSBzdXBwb3J0LCBwbGVhc2VcclxuICAvLyB1c2UgdGhlIGBkaXNhYmxlX3B1c2hfc3RhdGVgIHNldHRpbmcgb24gYFNhbW15LkFwcGxpY2F0aW9uYC4gSWYgcHVzaFN0YXRlIHN1cHBvcnRcclxuICAvLyBpcyBlbmFibGVkLCBgRGVmYXVsdExvY2F0aW9uUHJveHlgIGFsc28gYmluZHMgdG8gYWxsIGxpbmtzIG9uIHRoZSBwYWdlLiBJZiBhIGxpbmsgaXMgY2xpY2tlZFxyXG4gIC8vIHRoYXQgbWF0Y2hlcyB0aGUgY3VycmVudCBzZXQgb2Ygcm91dGVzLCB0aGUgVVJMIGlzIGNoYW5nZWQgdXNpbmcgcHVzaFN0YXRlIGluc3RlYWQgb2ZcclxuICAvLyBmdWxseSBzZXR0aW5nIHRoZSBsb2NhdGlvbiBhbmQgdGhlIGFwcCBpcyBub3RpZmllZCBvZiB0aGUgY2hhbmdlLlxyXG4gIC8vXHJcbiAgLy8gSWYgdGhlIGJyb3dzZXIgZG9lcyBub3QgaGF2ZSBzdXBwb3J0IGZvciBIVE1MNSBIaXN0b3J5LCBgRGVmYXVsdExvY2F0aW9uUHJveHlgIGF1dG9tYXRpY2FsbHlcclxuICAvLyBmYWxscyBiYWNrIHRvIHRoZSBvbGRlciBoYXNoIGJhc2VkIHJvdXRpbmcuIFRoZSBuZXdlc3QgYnJvd3NlcnMgKElFLCBTYWZhcmkgPiA0LCBGRiA+PSAzLjYpXHJcbiAgLy8gc3VwcG9ydCBhICdvbmhhc2hjaGFuZ2UnIERPTSBldmVudCwgdGhhdHMgZmlyZWQgd2hlbmV2ZXIgdGhlIGxvY2F0aW9uLmhhc2ggY2hhbmdlcy5cclxuICAvLyBJbiB0aGlzIHNpdHVhdGlvbiB0aGUgRGVmYXVsdExvY2F0aW9uUHJveHkganVzdCBiaW5kcyB0byB0aGlzIGV2ZW50IGFuZCBkZWxlZ2F0ZXMgaXQgdG9cclxuICAvLyB0aGUgYXBwbGljYXRpb24uIEluIHRoZSBjYXNlIG9mIG9sZGVyIGJyb3dzZXJzIGEgcG9sbGVyIGlzIHNldCB1cCB0byB0cmFjayBjaGFuZ2VzIHRvIHRoZVxyXG4gIC8vIGhhc2guXHJcbiAgU2FtbXkuRGVmYXVsdExvY2F0aW9uUHJveHkgPSBmdW5jdGlvbihhcHAsIHJ1bl9pbnRlcnZhbF9ldmVyeSkge1xyXG4gICAgdGhpcy5hcHAgPSBhcHA7XHJcbiAgICAvLyBzZXQgaXMgbmF0aXZlIHRvIGZhbHNlIGFuZCBzdGFydCB0aGUgcG9sbGVyIGltbWVkaWF0ZWx5XHJcbiAgICB0aGlzLmlzX25hdGl2ZSA9IGZhbHNlO1xyXG4gICAgdGhpcy5oYXNfaGlzdG9yeSA9IF9oYXNfaGlzdG9yeTtcclxuICAgIHRoaXMuX3N0YXJ0UG9sbGluZyhydW5faW50ZXJ2YWxfZXZlcnkpO1xyXG4gIH07XHJcblxyXG4gIFNhbW15LkRlZmF1bHRMb2NhdGlvblByb3h5LmZ1bGxQYXRoID0gZnVuY3Rpb24obG9jYXRpb25fb2JqKSB7XHJcbiAgIC8vIEJ5cGFzcyB0aGUgYHdpbmRvdy5sb2NhdGlvbi5oYXNoYCBhdHRyaWJ1dGUuICBJZiBhIHF1ZXN0aW9uIG1hcmtcclxuICAgIC8vIGFwcGVhcnMgaW4gdGhlIGhhc2ggSUU2IHdpbGwgc3RyaXAgaXQgYW5kIGFsbCBvZiB0aGUgZm9sbG93aW5nXHJcbiAgICAvLyBjaGFyYWN0ZXJzIGZyb20gYHdpbmRvdy5sb2NhdGlvbi5oYXNoYC5cclxuICAgIHZhciBtYXRjaGVzID0gbG9jYXRpb25fb2JqLnRvU3RyaW5nKCkubWF0Y2goL15bXiNdKigjLispJC8pO1xyXG4gICAgdmFyIGhhc2ggPSBtYXRjaGVzID8gbWF0Y2hlc1sxXSA6ICcnO1xyXG4gICAgcmV0dXJuIFtsb2NhdGlvbl9vYmoucGF0aG5hbWUsIGxvY2F0aW9uX29iai5zZWFyY2gsIGhhc2hdLmpvaW4oJycpO1xyXG4gIH07XHJcbiQuZXh0ZW5kKFNhbW15LkRlZmF1bHRMb2NhdGlvblByb3h5LnByb3RvdHlwZSAsIHtcclxuICAgIC8vIGJpbmQgdGhlIHByb3h5IGV2ZW50cyB0byB0aGUgY3VycmVudCBhcHAuXHJcbiAgICBiaW5kOiBmdW5jdGlvbigpIHtcclxuICAgICAgdmFyIHByb3h5ID0gdGhpcywgYXBwID0gdGhpcy5hcHAsIGxwID0gU2FtbXkuRGVmYXVsdExvY2F0aW9uUHJveHk7XHJcbiAgICAgICQod2luZG93KS5iaW5kKCdoYXNoY2hhbmdlLicgKyB0aGlzLmFwcC5ldmVudE5hbWVzcGFjZSgpLCBmdW5jdGlvbihlLCBub25fbmF0aXZlKSB7XHJcbiAgICAgICAgLy8gaWYgd2UgcmVjZWl2ZSBhIG5hdGl2ZSBoYXNoIGNoYW5nZSBldmVudCwgc2V0IHRoZSBwcm94eSBhY2NvcmRpbmdseVxyXG4gICAgICAgIC8vIGFuZCBzdG9wIHBvbGxpbmdcclxuICAgICAgICBpZiAocHJveHkuaXNfbmF0aXZlID09PSBmYWxzZSAmJiAhbm9uX25hdGl2ZSkge1xyXG4gICAgICAgICAgcHJveHkuaXNfbmF0aXZlID0gdHJ1ZTtcclxuICAgICAgICAgIHdpbmRvdy5jbGVhckludGVydmFsKGxwLl9pbnRlcnZhbCk7XHJcbiAgICAgICAgICBscC5faW50ZXJ2YWwgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBhcHAudHJpZ2dlcignbG9jYXRpb24tY2hhbmdlZCcpO1xyXG4gICAgICB9KTtcclxuICAgICAgaWYgKF9oYXNfaGlzdG9yeSAmJiAhYXBwLmRpc2FibGVfcHVzaF9zdGF0ZSkge1xyXG4gICAgICAgIC8vIGJpbmQgdG8gcG9wc3RhdGVcclxuICAgICAgICAkKHdpbmRvdykuYmluZCgncG9wc3RhdGUuJyArIHRoaXMuYXBwLmV2ZW50TmFtZXNwYWNlKCksIGZ1bmN0aW9uKGUpIHtcclxuICAgICAgICAgIGFwcC50cmlnZ2VyKCdsb2NhdGlvbi1jaGFuZ2VkJyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgLy8gYmluZCB0byBsaW5rIGNsaWNrcyB0aGF0IGhhdmUgcm91dGVzXHJcbiAgICAgICAgJChkb2N1bWVudCkuZGVsZWdhdGUoJ2EnLCAnY2xpY2suaGlzdG9yeS0nICsgdGhpcy5hcHAuZXZlbnROYW1lc3BhY2UoKSwgZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgIGlmIChlLmlzRGVmYXVsdFByZXZlbnRlZCgpIHx8IGUubWV0YUtleSB8fCBlLmN0cmxLZXkpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdmFyIGZ1bGxfcGF0aCA9IGxwLmZ1bGxQYXRoKHRoaXMpLFxyXG4gICAgICAgICAgICAvLyBHZXQgYW5jaG9yJ3MgaG9zdCBuYW1lIGluIGEgY3Jvc3MgYnJvd3NlciBjb21wYXRpYmxlIHdheS5cclxuICAgICAgICAgICAgLy8gSUUgbG9vc2VzIGhvc3RuYW1lIHByb3BlcnR5IHdoZW4gc2V0dGluZyBocmVmIGluIEpTXHJcbiAgICAgICAgICAgIC8vIHdpdGggYSByZWxhdGl2ZSBVUkwsIGUuZy4gYS5zZXRBdHRyaWJ1dGUoJ2hyZWYnLFwiL3doYXRldmVyXCIpLlxyXG4gICAgICAgICAgICAvLyBDaXJjdW12ZW50IHRoaXMgcHJvYmxlbSBieSBjcmVhdGluZyBhIG5ldyBsaW5rIHdpdGggZ2l2ZW4gVVJMIGFuZFxyXG4gICAgICAgICAgICAvLyBxdWVyeWluZyB0aGF0IGZvciBhIGhvc3RuYW1lLlxyXG4gICAgICAgICAgICBob3N0bmFtZSA9IHRoaXMuaG9zdG5hbWUgPyB0aGlzLmhvc3RuYW1lIDogZnVuY3Rpb24gKGEpIHtcclxuICAgICAgICAgICAgICB2YXIgbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhXCIpO1xyXG4gICAgICAgICAgICAgIGwuaHJlZiA9IGEuaHJlZjtcclxuICAgICAgICAgICAgICByZXR1cm4gbC5ob3N0bmFtZTtcclxuICAgICAgICAgICAgfSh0aGlzKTtcclxuXHJcbiAgICAgICAgICBpZiAoaG9zdG5hbWUgPT0gd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lICYmXHJcbiAgICAgICAgICAgICAgYXBwLmxvb2t1cFJvdXRlKCdnZXQnLCBmdWxsX3BhdGgpICYmXHJcbiAgICAgICAgICAgICAgU2FtbXkudGFyZ2V0SXNUaGlzV2luZG93KGUsICdhJykpIHtcclxuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICBwcm94eS5zZXRMb2NhdGlvbihmdWxsX3BhdGgpO1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCFscC5fYmluZGluZ3MpIHtcclxuICAgICAgICBscC5fYmluZGluZ3MgPSAwO1xyXG4gICAgICB9XHJcbiAgICAgIGxwLl9iaW5kaW5ncysrO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyB1bmJpbmQgdGhlIHByb3h5IGV2ZW50cyBmcm9tIHRoZSBjdXJyZW50IGFwcFxyXG4gICAgdW5iaW5kOiBmdW5jdGlvbigpIHtcclxuICAgICAgJCh3aW5kb3cpLnVuYmluZCgnaGFzaGNoYW5nZS4nICsgdGhpcy5hcHAuZXZlbnROYW1lc3BhY2UoKSk7XHJcbiAgICAgICQod2luZG93KS51bmJpbmQoJ3BvcHN0YXRlLicgKyB0aGlzLmFwcC5ldmVudE5hbWVzcGFjZSgpKTtcclxuICAgICAgJChkb2N1bWVudCkudW5kZWxlZ2F0ZSgnYScsICdjbGljay5oaXN0b3J5LScgKyB0aGlzLmFwcC5ldmVudE5hbWVzcGFjZSgpKTtcclxuICAgICAgU2FtbXkuRGVmYXVsdExvY2F0aW9uUHJveHkuX2JpbmRpbmdzLS07XHJcbiAgICAgIGlmIChTYW1teS5EZWZhdWx0TG9jYXRpb25Qcm94eS5fYmluZGluZ3MgPD0gMCkge1xyXG4gICAgICAgIHdpbmRvdy5jbGVhckludGVydmFsKFNhbW15LkRlZmF1bHRMb2NhdGlvblByb3h5Ll9pbnRlcnZhbCk7XHJcbiAgICAgICAgU2FtbXkuRGVmYXVsdExvY2F0aW9uUHJveHkuX2ludGVydmFsID0gbnVsbDtcclxuICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvLyBnZXQgdGhlIGN1cnJlbnQgbG9jYXRpb24gZnJvbSB0aGUgaGFzaC5cclxuICAgIGdldExvY2F0aW9uOiBmdW5jdGlvbigpIHtcclxuICAgICAgcmV0dXJuIFNhbW15LkRlZmF1bHRMb2NhdGlvblByb3h5LmZ1bGxQYXRoKHdpbmRvdy5sb2NhdGlvbik7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIHNldCB0aGUgY3VycmVudCBsb2NhdGlvbiB0byBgbmV3X2xvY2F0aW9uYFxyXG4gICAgc2V0TG9jYXRpb246IGZ1bmN0aW9uKG5ld19sb2NhdGlvbikge1xyXG4gICAgICBpZiAoL14oW14jXFwvXXwkKS8udGVzdChuZXdfbG9jYXRpb24pKSB7IC8vIG5vbi1wcmVmaXhlZCB1cmxcclxuICAgICAgICBpZiAoX2hhc19oaXN0b3J5ICYmICF0aGlzLmFwcC5kaXNhYmxlX3B1c2hfc3RhdGUpIHtcclxuICAgICAgICAgIG5ld19sb2NhdGlvbiA9ICcvJyArIG5ld19sb2NhdGlvbjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgbmV3X2xvY2F0aW9uID0gJyMhLycgKyBuZXdfbG9jYXRpb247XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmIChuZXdfbG9jYXRpb24gIT0gdGhpcy5nZXRMb2NhdGlvbigpKSB7XHJcbiAgICAgICAgLy8gSFRNTDUgSGlzdG9yeSBleGlzdHMgYW5kIG5ld19sb2NhdGlvbiBpcyBhIGZ1bGwgcGF0aFxyXG4gICAgICAgIGlmIChfaGFzX2hpc3RvcnkgJiYgIXRoaXMuYXBwLmRpc2FibGVfcHVzaF9zdGF0ZSAmJiAvXlxcLy8udGVzdChuZXdfbG9jYXRpb24pKSB7XHJcbiAgICAgICAgICBoaXN0b3J5LnB1c2hTdGF0ZSh7IHBhdGg6IG5ld19sb2NhdGlvbiB9LCB3aW5kb3cudGl0bGUsIG5ld19sb2NhdGlvbik7XHJcbiAgICAgICAgICB0aGlzLmFwcC50cmlnZ2VyKCdsb2NhdGlvbi1jaGFuZ2VkJyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJldHVybiAod2luZG93LmxvY2F0aW9uID0gbmV3X2xvY2F0aW9uKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgX3N0YXJ0UG9sbGluZzogZnVuY3Rpb24oZXZlcnkpIHtcclxuICAgICAgLy8gc2V0IHVwIGludGVydmFsXHJcbiAgICAgIHZhciBwcm94eSA9IHRoaXM7XHJcbiAgICAgIGlmICghU2FtbXkuRGVmYXVsdExvY2F0aW9uUHJveHkuX2ludGVydmFsKSB7XHJcbiAgICAgICAgaWYgKCFldmVyeSkgeyBldmVyeSA9IDEwOyB9XHJcbiAgICAgICAgdmFyIGhhc2hDaGVjayA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgdmFyIGN1cnJlbnRfbG9jYXRpb24gPSBwcm94eS5nZXRMb2NhdGlvbigpO1xyXG4gICAgICAgICAgaWYgKHR5cGVvZiBTYW1teS5EZWZhdWx0TG9jYXRpb25Qcm94eS5fbGFzdF9sb2NhdGlvbiA9PSAndW5kZWZpbmVkJyB8fFxyXG4gICAgICAgICAgICBjdXJyZW50X2xvY2F0aW9uICE9IFNhbW15LkRlZmF1bHRMb2NhdGlvblByb3h5Ll9sYXN0X2xvY2F0aW9uKSB7XHJcbiAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICQod2luZG93KS50cmlnZ2VyKCdoYXNoY2hhbmdlJywgW3RydWVdKTtcclxuICAgICAgICAgICAgfSwgMCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBTYW1teS5EZWZhdWx0TG9jYXRpb25Qcm94eS5fbGFzdF9sb2NhdGlvbiA9IGN1cnJlbnRfbG9jYXRpb247XHJcbiAgICAgICAgfTtcclxuICAgICAgICBoYXNoQ2hlY2soKTtcclxuICAgICAgICBTYW1teS5EZWZhdWx0TG9jYXRpb25Qcm94eS5faW50ZXJ2YWwgPSB3aW5kb3cuc2V0SW50ZXJ2YWwoaGFzaENoZWNrLCBldmVyeSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9KTtcclxuXHJcblxyXG4gIC8vIFNhbW15LkFwcGxpY2F0aW9uIGlzIHRoZSBCYXNlIHByb3RvdHlwZSBmb3IgZGVmaW5pbmcgJ2FwcGxpY2F0aW9ucycuXHJcbiAgLy8gQW4gJ2FwcGxpY2F0aW9uJyBpcyBhIGNvbGxlY3Rpb24gb2YgJ3JvdXRlcycgYW5kIGJvdW5kIGV2ZW50cyB0aGF0IGlzXHJcbiAgLy8gYXR0YWNoZWQgdG8gYW4gZWxlbWVudCB3aGVuIGBydW4oKWAgaXMgY2FsbGVkLlxyXG4gIC8vIFRoZSBvbmx5IGFyZ3VtZW50IGFuICdhcHBfZnVuY3Rpb24nIGlzIGV2YWx1YXRlZCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgdGhlIGFwcGxpY2F0aW9uLlxyXG4gIFNhbW15LkFwcGxpY2F0aW9uID0gZnVuY3Rpb24oYXBwX2Z1bmN0aW9uKSB7XHJcbiAgICB2YXIgYXBwID0gdGhpcztcclxuICAgIHRoaXMucm91dGVzICAgICAgICAgICAgPSB7fTtcclxuICAgIHRoaXMubGlzdGVuZXJzICAgICAgICAgPSBuZXcgU2FtbXkuT2JqZWN0KHt9KTtcclxuICAgIHRoaXMuYXJvdW5kcyAgICAgICAgICAgPSBbXTtcclxuICAgIHRoaXMuYmVmb3JlcyAgICAgICAgICAgPSBbXTtcclxuICAgIC8vIGdlbmVyYXRlIGEgdW5pcXVlIG5hbWVzcGFjZVxyXG4gICAgdGhpcy5uYW1lc3BhY2UgICAgICAgICA9IChuZXcgRGF0ZSgpKS5nZXRUaW1lKCkgKyAnLScgKyBwYXJzZUludChNYXRoLnJhbmRvbSgpICogMTAwMCwgMTApO1xyXG4gICAgdGhpcy5jb250ZXh0X3Byb3RvdHlwZSA9IGZ1bmN0aW9uKCkgeyBTYW1teS5FdmVudENvbnRleHQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfTtcclxuICAgIHRoaXMuY29udGV4dF9wcm90b3R5cGUucHJvdG90eXBlID0gbmV3IFNhbW15LkV2ZW50Q29udGV4dCgpO1xyXG5cclxuICAgIGlmIChfaXNGdW5jdGlvbihhcHBfZnVuY3Rpb24pKSB7XHJcbiAgICAgIGFwcF9mdW5jdGlvbi5hcHBseSh0aGlzLCBbdGhpc10pO1xyXG4gICAgfVxyXG4gICAgLy8gc2V0IHRoZSBsb2NhdGlvbiBwcm94eSBpZiBub3QgZGVmaW5lZCB0byB0aGUgZGVmYXVsdCAoRGVmYXVsdExvY2F0aW9uUHJveHkpXHJcbiAgICBpZiAoIXRoaXMuX2xvY2F0aW9uX3Byb3h5KSB7XHJcbiAgICAgIHRoaXMuc2V0TG9jYXRpb25Qcm94eShuZXcgU2FtbXkuRGVmYXVsdExvY2F0aW9uUHJveHkodGhpcywgdGhpcy5ydW5faW50ZXJ2YWxfZXZlcnkpKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmRlYnVnKSB7XHJcbiAgICAgIHRoaXMuYmluZFRvQWxsRXZlbnRzKGZ1bmN0aW9uKGUsIGRhdGEpIHtcclxuICAgICAgICBhcHAubG9nKGFwcC50b1N0cmluZygpLCBlLmNsZWFuZWRfdHlwZSwgZGF0YSB8fCB7fSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIFNhbW15LkFwcGxpY2F0aW9uLnByb3RvdHlwZSA9ICQuZXh0ZW5kKHt9LCBTYW1teS5PYmplY3QucHJvdG90eXBlLCB7XHJcblxyXG4gICAgLy8gdGhlIGZvdXIgcm91dGUgdmVyYnNcclxuICAgIFJPVVRFX1ZFUkJTOiBbJ2dldCcsJ3Bvc3QnLCdwdXQnLCdkZWxldGUnXSxcclxuXHJcbiAgICAvLyBBbiBhcnJheSBvZiB0aGUgZGVmYXVsdCBldmVudHMgdHJpZ2dlcmVkIGJ5IHRoZVxyXG4gICAgLy8gYXBwbGljYXRpb24gZHVyaW5nIGl0cyBsaWZlY3ljbGVcclxuICAgIEFQUF9FVkVOVFM6IFsncnVuJywgJ3VubG9hZCcsICdsb29rdXAtcm91dGUnLCAncnVuLXJvdXRlJywgJ3JvdXRlLWZvdW5kJywgJ2V2ZW50LWNvbnRleHQtYmVmb3JlJywgJ2V2ZW50LWNvbnRleHQtYWZ0ZXInLCAnY2hhbmdlZCcsICdlcnJvcicsICdjaGVjay1mb3JtLXN1Ym1pc3Npb24nLCAncmVkaXJlY3QnLCAnbG9jYXRpb24tY2hhbmdlZCddLFxyXG5cclxuICAgIF9sYXN0X3JvdXRlOiBudWxsLFxyXG4gICAgX2xvY2F0aW9uX3Byb3h5OiBudWxsLFxyXG4gICAgX3J1bm5pbmc6IGZhbHNlLFxyXG5cclxuICAgIC8vIERlZmluZXMgd2hhdCBlbGVtZW50IHRoZSBhcHBsaWNhdGlvbiBpcyBib3VuZCB0by4gUHJvdmlkZSBhIHNlbGVjdG9yXHJcbiAgICAvLyAocGFyc2VhYmxlIGJ5IGBqUXVlcnkoKWApIGFuZCB0aGlzIHdpbGwgYmUgdXNlZCBieSBgJGVsZW1lbnQoKWBcclxuICAgIGVsZW1lbnRfc2VsZWN0b3I6ICdib2R5JyxcclxuXHJcbiAgICAvLyBXaGVuIHNldCB0byB0cnVlLCBsb2dzIGFsbCBvZiB0aGUgZGVmYXVsdCBldmVudHMgdXNpbmcgYGxvZygpYFxyXG4gICAgZGVidWc6IGZhbHNlLFxyXG5cclxuICAgIC8vIFdoZW4gc2V0IHRvIHRydWUsIGFuZCB0aGUgZXJyb3IoKSBoYW5kbGVyIGlzIG5vdCBvdmVycmlkZGVuLCB3aWxsIGFjdHVhbGx5XHJcbiAgICAvLyByYWlzZSBKUyBlcnJvcnMgaW4gcm91dGVzICg1MDApIGFuZCB3aGVuIHJvdXRlcyBjYW4ndCBiZSBmb3VuZCAoNDA0KVxyXG4gICAgcmFpc2VfZXJyb3JzOiBmYWxzZSxcclxuXHJcbiAgICAvLyBUaGUgdGltZSBpbiBtaWxsaXNlY29uZHMgdGhhdCB0aGUgVVJMIGlzIHF1ZXJpZWQgZm9yIGNoYW5nZXNcclxuICAgIHJ1bl9pbnRlcnZhbF9ldmVyeTogNTAsXHJcblxyXG4gICAgLy8gaWYgdXNpbmcgdGhlIGBEZWZhdWx0TG9jYXRpb25Qcm94eWAgc2V0dGluZyB0aGlzIHRvIHRydWUgd2lsbCBmb3JjZSB0aGUgYXBwIHRvIHVzZVxyXG4gICAgLy8gdHJhZGl0aW9uYWwgaGFzaCBiYXNlZCByb3V0aW5nIGFzIG9wcG9zZWQgdG8gdGhlIG5ldyBIVE1MNSBQdXNoU3RhdGUgc3VwcG9ydFxyXG4gICAgZGlzYWJsZV9wdXNoX3N0YXRlOiBmYWxzZSxcclxuXHJcbiAgICAvLyBUaGUgZGVmYXVsdCB0ZW1wbGF0ZSBlbmdpbmUgdG8gdXNlIHdoZW4gdXNpbmcgYHBhcnRpYWwoKWAgaW4gYW5cclxuICAgIC8vIGBFdmVudENvbnRleHRgLiBgdGVtcGxhdGVfZW5naW5lYCBjYW4gZWl0aGVyIGJlIGEgc3RyaW5nIHRoYXRcclxuICAgIC8vIGNvcnJlc3BvbmRzIHRvIHRoZSBuYW1lIG9mIGEgbWV0aG9kL2hlbHBlciBvbiBFdmVudENvbnRleHQgb3IgaXQgY2FuIGJlIGEgZnVuY3Rpb25cclxuICAgIC8vIHRoYXQgdGFrZXMgdHdvIGFyZ3VtZW50cywgdGhlIGNvbnRlbnQgb2YgdGhlIHVucmVuZGVyZWQgcGFydGlhbCBhbmQgYW4gb3B0aW9uYWxcclxuICAgIC8vIEpTIG9iamVjdCB0aGF0IGNvbnRhaW5zIGludGVycG9sYXRpb24gZGF0YS4gVGVtcGxhdGUgZW5naW5lIGlzIG9ubHkgY2FsbGVkL3JlZmVycmVkXHJcbiAgICAvLyB0byBpZiB0aGUgZXh0ZW5zaW9uIG9mIHRoZSBwYXJ0aWFsIGlzIG51bGwgb3IgdW5rbm93bi4gU2VlIGBwYXJ0aWFsKClgXHJcbiAgICAvLyBmb3IgbW9yZSBpbmZvcm1hdGlvblxyXG4gICAgdGVtcGxhdGVfZW5naW5lOiBudWxsLFxyXG5cclxuICAgIC8vIC8vPT4gU2FtbXkuQXBwbGljYXRpb246IGJvZHlcclxuICAgIHRvU3RyaW5nOiBmdW5jdGlvbigpIHtcclxuICAgICAgcmV0dXJuICdTYW1teS5BcHBsaWNhdGlvbjonICsgdGhpcy5lbGVtZW50X3NlbGVjdG9yO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyByZXR1cm5zIGEgalF1ZXJ5IG9iamVjdCBvZiB0aGUgQXBwbGljYXRpb25zIGJvdW5kIGVsZW1lbnQuXHJcbiAgICAkZWxlbWVudDogZnVuY3Rpb24oc2VsZWN0b3IpIHtcclxuICAgICAgcmV0dXJuIHNlbGVjdG9yID8gJCh0aGlzLmVsZW1lbnRfc2VsZWN0b3IpLmZpbmQoc2VsZWN0b3IpIDogJCh0aGlzLmVsZW1lbnRfc2VsZWN0b3IpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBgdXNlKClgIGlzIHRoZSBlbnRyeSBwb2ludCBmb3IgaW5jbHVkaW5nIFNhbW15IHBsdWdpbnMuXHJcbiAgICAvLyBUaGUgZmlyc3QgYXJndW1lbnQgdG8gdXNlIHNob3VsZCBiZSBhIGZ1bmN0aW9uKCkgdGhhdCBpcyBldmFsdWF0ZWRcclxuICAgIC8vIGluIHRoZSBjb250ZXh0IG9mIHRoZSBjdXJyZW50IGFwcGxpY2F0aW9uLCBqdXN0IGxpa2UgdGhlIGBhcHBfZnVuY3Rpb25gXHJcbiAgICAvLyBhcmd1bWVudCB0byB0aGUgYFNhbW15LkFwcGxpY2F0aW9uYCBjb25zdHJ1Y3Rvci5cclxuICAgIC8vXHJcbiAgICAvLyBBbnkgYWRkaXRpb25hbCBhcmd1bWVudHMgYXJlIHBhc3NlZCB0byB0aGUgYXBwIGZ1bmN0aW9uIHNlcXVlbnRpYWxseS5cclxuICAgIC8vXHJcbiAgICAvLyBGb3IgbXVjaCBtb3JlIGRldGFpbCBhYm91dCBwbHVnaW5zLCBjaGVjayBvdXQ6XHJcbiAgICAvLyBbaHR0cDovL3NhbW15anMub3JnL2RvY3MvcGx1Z2luc10oaHR0cDovL3NhbW15anMub3JnL2RvY3MvcGx1Z2lucylcclxuICAgIC8vXHJcbiAgICAvLyAjIyMgRXhhbXBsZVxyXG4gICAgLy9cclxuICAgIC8vICAgICAgdmFyIE15UGx1Z2luID0gZnVuY3Rpb24oYXBwLCBwcmVwZW5kKSB7XHJcbiAgICAvL1xyXG4gICAgLy8gICAgICAgIHRoaXMuaGVscGVycyh7XHJcbiAgICAvLyAgICAgICAgICBteWhlbHBlcjogZnVuY3Rpb24odGV4dCkge1xyXG4gICAgLy8gICAgICAgICAgICBhbGVydChwcmVwZW5kICsgXCIgXCIgKyB0ZXh0KTtcclxuICAgIC8vICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICB9KTtcclxuICAgIC8vXHJcbiAgICAvLyAgICAgIH07XHJcbiAgICAvL1xyXG4gICAgLy8gICAgICB2YXIgYXBwID0gJC5zYW1teShmdW5jdGlvbigpIHtcclxuICAgIC8vXHJcbiAgICAvLyAgICAgICAgdGhpcy51c2UoTXlQbHVnaW4sICdUaGlzIGlzIG15IHBsdWdpbicpO1xyXG4gICAgLy9cclxuICAgIC8vICAgICAgICB0aGlzLmdldCgnIy8nLCBmdW5jdGlvbigpIHtcclxuICAgIC8vICAgICAgICAgIHRoaXMubXloZWxwZXIoJ2FuZCBkb250IHlvdSBmb3JnZXQgaXQhJyk7XHJcbiAgICAvLyAgICAgICAgICAvLz0+IEFsZXJ0czogVGhpcyBpcyBteSBwbHVnaW4gYW5kIGRvbnQgeW91IGZvcmdldCBpdCFcclxuICAgIC8vICAgICAgICB9KTtcclxuICAgIC8vXHJcbiAgICAvLyAgICAgIH0pO1xyXG4gICAgLy9cclxuICAgIC8vIElmIHBsdWdpbiBpcyBwYXNzZWQgYXMgYSBzdHJpbmcgaXQgYXNzdW1lcyB5b3VyIGFyZSB0cnlpbmcgdG8gbG9hZFxyXG4gICAgLy8gU2FtbXkuXCJQbHVnaW5cIi4gVGhpcyBpcyB0aGUgcHJlZmVycmVkIHdheSBvZiBsb2FkaW5nIGNvcmUgU2FtbXkgcGx1Z2luc1xyXG4gICAgLy8gYXMgaXQgYWxsb3dzIGZvciBiZXR0ZXIgZXJyb3ItbWVzc2FnaW5nLlxyXG4gICAgLy9cclxuICAgIC8vICMjIyBFeGFtcGxlXHJcbiAgICAvL1xyXG4gICAgLy8gICAgICAkLnNhbW15KGZ1bmN0aW9uKCkge1xyXG4gICAgLy8gICAgICAgIHRoaXMudXNlKCdNdXN0YWNoZScpOyAvLz0+IFNhbW15Lk11c3RhY2hlXHJcbiAgICAvLyAgICAgICAgdGhpcy51c2UoJ1N0b3JhZ2UnKTsgLy89PiBTYW1teS5TdG9yYWdlXHJcbiAgICAvLyAgICAgIH0pO1xyXG4gICAgLy9cclxuICAgIHVzZTogZnVuY3Rpb24oKSB7XHJcbiAgICAgIC8vIGZsYXR0ZW4gdGhlIGFyZ3VtZW50c1xyXG4gICAgICB2YXIgYXJncyA9IF9tYWtlQXJyYXkoYXJndW1lbnRzKSxcclxuICAgICAgICAgIHBsdWdpbiA9IGFyZ3Muc2hpZnQoKSxcclxuICAgICAgICAgIHBsdWdpbl9uYW1lID0gcGx1Z2luIHx8ICcnO1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGFyZ3MudW5zaGlmdCh0aGlzKTtcclxuICAgICAgICBpZiAodHlwZW9mIHBsdWdpbiA9PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgcGx1Z2luX25hbWUgPSAnU2FtbXkuJyArIHBsdWdpbjtcclxuICAgICAgICAgIHBsdWdpbiA9IFNhbW15W3BsdWdpbl07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHBsdWdpbi5hcHBseSh0aGlzLCBhcmdzKTtcclxuICAgICAgfSBjYXRjaChlKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBwbHVnaW4gPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICB0aGlzLmVycm9yKFwiUGx1Z2luIEVycm9yOiBjYWxsZWQgdXNlKCkgYnV0IHBsdWdpbiAoXCIgKyBwbHVnaW5fbmFtZS50b1N0cmluZygpICsgXCIpIGlzIG5vdCBkZWZpbmVkXCIsIGUpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoIV9pc0Z1bmN0aW9uKHBsdWdpbikpIHtcclxuICAgICAgICAgIHRoaXMuZXJyb3IoXCJQbHVnaW4gRXJyb3I6IGNhbGxlZCB1c2UoKSBidXQgJ1wiICsgcGx1Z2luX25hbWUudG9TdHJpbmcoKSArIFwiJyBpcyBub3QgYSBmdW5jdGlvblwiLCBlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5lcnJvcihcIlBsdWdpbiBFcnJvclwiLCBlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIFNldHMgdGhlIGxvY2F0aW9uIHByb3h5IGZvciB0aGUgY3VycmVudCBhcHAuIEJ5IGRlZmF1bHQgdGhpcyBpcyBzZXQgdG9cclxuICAgIC8vIGEgbmV3IGBTYW1teS5EZWZhdWx0TG9jYXRpb25Qcm94eWAgb24gaW5pdGlhbGl6YXRpb24uIEhvd2V2ZXIsIHlvdSBjYW4gc2V0XHJcbiAgICAvLyB0aGUgbG9jYXRpb25fcHJveHkgaW5zaWRlIHlvdSdyZSBhcHAgZnVuY3Rpb24gdG8gZ2l2ZSB5b3VyIGFwcCBhIGN1c3RvbVxyXG4gICAgLy8gbG9jYXRpb24gbWVjaGFuaXNtLiBTZWUgYFNhbW15LkRlZmF1bHRMb2NhdGlvblByb3h5YCBhbmQgYFNhbW15LkRhdGFMb2NhdGlvblByb3h5YFxyXG4gICAgLy8gZm9yIGV4YW1wbGVzLlxyXG4gICAgLy9cclxuICAgIC8vIGBzZXRMb2NhdGlvblByb3h5KClgIHRha2VzIGFuIGluaXRpYWxpemVkIGxvY2F0aW9uIHByb3h5LlxyXG4gICAgLy9cclxuICAgIC8vICMjIyBFeGFtcGxlXHJcbiAgICAvL1xyXG4gICAgLy8gICAgICAgIC8vIHRvIGJpbmQgdG8gZGF0YSBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IGhhc2g7XHJcbiAgICAvLyAgICAgICAgdmFyIGFwcCA9ICQuc2FtbXkoZnVuY3Rpb24oKSB7XHJcbiAgICAvLyAgICAgICAgICB0aGlzLnNldExvY2F0aW9uUHJveHkobmV3IFNhbW15LkRhdGFMb2NhdGlvblByb3h5KHRoaXMpKTtcclxuICAgIC8vICAgICAgICB9KTtcclxuICAgIC8vXHJcbiAgICBzZXRMb2NhdGlvblByb3h5OiBmdW5jdGlvbihuZXdfcHJveHkpIHtcclxuICAgICAgdmFyIG9yaWdpbmFsX3Byb3h5ID0gdGhpcy5fbG9jYXRpb25fcHJveHk7XHJcbiAgICAgIHRoaXMuX2xvY2F0aW9uX3Byb3h5ID0gbmV3X3Byb3h5O1xyXG4gICAgICBpZiAodGhpcy5pc1J1bm5pbmcoKSkge1xyXG4gICAgICAgIGlmIChvcmlnaW5hbF9wcm94eSkge1xyXG4gICAgICAgICAgLy8gaWYgdGhlcmUgaXMgYWxyZWFkeSBhIGxvY2F0aW9uIHByb3h5LCB1bmJpbmQgaXQuXHJcbiAgICAgICAgICBvcmlnaW5hbF9wcm94eS51bmJpbmQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fbG9jYXRpb25fcHJveHkuYmluZCgpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIHByb3ZpZGUgbG9nKCkgb3ZlcnJpZGUgZm9yIGluc2lkZSBhbiBhcHAgdGhhdCBpbmNsdWRlcyB0aGUgcmVsZXZhbnQgYXBwbGljYXRpb24gZWxlbWVudF9zZWxlY3RvclxyXG4gICAgbG9nOiBmdW5jdGlvbigpIHtcclxuICAgICAgU2FtbXkubG9nLmFwcGx5KFNhbW15LCBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFt0aGlzLmVsZW1lbnRfc2VsZWN0b3JdLGFyZ3VtZW50cykpO1xyXG4gICAgfSxcclxuXHJcblxyXG4gICAgLy8gYHJvdXRlKClgIGlzIHRoZSBtYWluIG1ldGhvZCBmb3IgZGVmaW5pbmcgcm91dGVzIHdpdGhpbiBhbiBhcHBsaWNhdGlvbi5cclxuICAgIC8vIEZvciBncmVhdCBkZXRhaWwgb24gcm91dGVzLCBjaGVjayBvdXQ6XHJcbiAgICAvLyBbaHR0cDovL3NhbW15anMub3JnL2RvY3Mvcm91dGVzXShodHRwOi8vc2FtbXlqcy5vcmcvZG9jcy9yb3V0ZXMpXHJcbiAgICAvL1xyXG4gICAgLy8gVGhpcyBtZXRob2QgYWxzbyBoYXMgYWxpYXNlcyBmb3IgZWFjaCBvZiB0aGUgZGlmZmVyZW50IHZlcmJzIChlZy4gYGdldCgpYCwgYHBvc3QoKWAsIGV0Yy4pXHJcbiAgICAvL1xyXG4gICAgLy8gIyMjIEFyZ3VtZW50c1xyXG4gICAgLy9cclxuICAgIC8vICogYHZlcmJgIEEgU3RyaW5nIGluIHRoZSBzZXQgb2YgUk9VVEVfVkVSQlMgb3IgJ2FueScuICdhbnknIHdpbGwgYWRkIHJvdXRlcyBmb3IgZWFjaFxyXG4gICAgLy8gICAgb2YgdGhlIFJPVVRFX1ZFUkJTLiBJZiBvbmx5IHR3byBhcmd1bWVudHMgYXJlIHBhc3NlZCxcclxuICAgIC8vICAgIHRoZSBmaXJzdCBhcmd1bWVudCBpcyB0aGUgcGF0aCwgdGhlIHNlY29uZCBpcyB0aGUgY2FsbGJhY2sgYW5kIHRoZSB2ZXJiXHJcbiAgICAvLyAgICBpcyBhc3N1bWVkIHRvIGJlICdhbnknLlxyXG4gICAgLy8gKiBgcGF0aGAgQSBSZWdleHAgb3IgYSBTdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBwYXRoIHRvIG1hdGNoIHRvIGludm9rZSB0aGlzIHZlcmIuXHJcbiAgICAvLyAqIGBjYWxsYmFja2AgQSBGdW5jdGlvbiB0aGF0IGlzIGNhbGxlZC9ldmFsdWF0ZWQgd2hlbiB0aGUgcm91dGUgaXMgcnVuIHNlZTogYHJ1blJvdXRlKClgLlxyXG4gICAgLy8gICAgSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBwYXNzIGEgc3RyaW5nIGFzIHRoZSBjYWxsYmFjaywgd2hpY2ggaXMgbG9va2VkIHVwIGFzIHRoZSBuYW1lXHJcbiAgICAvLyAgICBvZiBhIG1ldGhvZCBvbiB0aGUgYXBwbGljYXRpb24uXHJcbiAgICAvL1xyXG4gICAgcm91dGU6IGZ1bmN0aW9uKHZlcmIsIHBhdGgpIHtcclxuICAgICAgdmFyIGFwcCA9IHRoaXMsIHBhcmFtX25hbWVzID0gW10sIGFkZF9yb3V0ZSwgcGF0aF9tYXRjaCwgY2FsbGJhY2sgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMik7XHJcblxyXG4gICAgICAvLyBpZiB0aGUgbWV0aG9kIHNpZ25hdHVyZSBpcyBqdXN0IChwYXRoLCBjYWxsYmFjaylcclxuICAgICAgLy8gYXNzdW1lIHRoZSB2ZXJiIGlzICdhbnknXHJcbiAgICAgIGlmIChjYWxsYmFjay5sZW5ndGggPT09IDAgJiYgX2lzRnVuY3Rpb24ocGF0aCkpIHtcclxuICAgICAgICBjYWxsYmFjayA9IFtwYXRoXTtcclxuICAgICAgICBwYXRoID0gdmVyYjtcclxuICAgICAgICB2ZXJiID0gJ2FueSc7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHZlcmIgPSB2ZXJiLnRvTG93ZXJDYXNlKCk7IC8vIGVuc3VyZSB2ZXJiIGlzIGxvd2VyIGNhc2VcclxuXHJcbiAgICAgIC8vIGlmIHBhdGggaXMgYSBzdHJpbmcgdHVybiBpdCBpbnRvIGEgcmVnZXhcclxuICAgICAgaWYgKHBhdGguY29uc3RydWN0b3IgPT0gU3RyaW5nKSB7XHJcblxyXG4gICAgICAgIC8vIE5lZWRzIHRvIGJlIGV4cGxpY2l0bHkgc2V0IGJlY2F1c2UgSUUgd2lsbCBtYWludGFpbiB0aGUgaW5kZXggdW5sZXNzIE5VTEwgaXMgcmV0dXJuZWQsXHJcbiAgICAgICAgLy8gd2hpY2ggbWVhbnMgdGhhdCB3aXRoIHR3byBjb25zZWN1dGl2ZSByb3V0ZXMgdGhhdCBjb250YWluIHBhcmFtcywgdGhlIHNlY29uZCBzZXQgb2YgcGFyYW1zIHdpbGwgbm90IGJlIGZvdW5kIGFuZCBlbmQgdXAgaW4gc3BsYXQgaW5zdGVhZCBvZiBwYXJhbXNcclxuICAgICAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9Db3JlX0phdmFTY3JpcHRfMS41X1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9SZWdFeHAvbGFzdEluZGV4XHJcbiAgICAgICAgUEFUSF9OQU1FX01BVENIRVIubGFzdEluZGV4ID0gMDtcclxuXHJcbiAgICAgICAgLy8gZmluZCB0aGUgbmFtZXNcclxuICAgICAgICB3aGlsZSAoKHBhdGhfbWF0Y2ggPSBQQVRIX05BTUVfTUFUQ0hFUi5leGVjKHBhdGgpKSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgcGFyYW1fbmFtZXMucHVzaChwYXRoX21hdGNoWzFdKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gcmVwbGFjZSB3aXRoIHRoZSBwYXRoIHJlcGxhY2VtZW50XHJcbiAgICAgICAgcGF0aCA9IG5ldyBSZWdFeHAocGF0aC5yZXBsYWNlKFBBVEhfTkFNRV9NQVRDSEVSLCBQQVRIX1JFUExBQ0VSKSArIFwiJFwiKTtcclxuICAgICAgfVxyXG4gICAgICAvLyBsb29rdXAgY2FsbGJhY2tzXHJcbiAgICAgICQuZWFjaChjYWxsYmFjayxmdW5jdGlvbihpLGNiKXtcclxuICAgICAgICBpZiAodHlwZW9mKGNiKSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgIGNhbGxiYWNrW2ldID0gYXBwW2NiXTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgYWRkX3JvdXRlID0gZnVuY3Rpb24od2l0aF92ZXJiKSB7XHJcbiAgICAgICAgdmFyIHIgPSB7dmVyYjogd2l0aF92ZXJiLCBwYXRoOiBwYXRoLCBjYWxsYmFjazogY2FsbGJhY2ssIHBhcmFtX25hbWVzOiBwYXJhbV9uYW1lc307XHJcbiAgICAgICAgLy8gYWRkIHJvdXRlIHRvIHJvdXRlcyBhcnJheVxyXG4gICAgICAgIGFwcC5yb3V0ZXNbd2l0aF92ZXJiXSA9IGFwcC5yb3V0ZXNbd2l0aF92ZXJiXSB8fCBbXTtcclxuICAgICAgICAvLyBwbGFjZSByb3V0ZXMgaW4gb3JkZXIgb2YgZGVmaW5pdGlvblxyXG4gICAgICAgIGFwcC5yb3V0ZXNbd2l0aF92ZXJiXS5wdXNoKHIpO1xyXG4gICAgICB9O1xyXG5cclxuICAgICAgaWYgKHZlcmIgPT09ICdhbnknKSB7XHJcbiAgICAgICAgJC5lYWNoKHRoaXMuUk9VVEVfVkVSQlMsIGZ1bmN0aW9uKGksIHYpIHsgYWRkX3JvdXRlKHYpOyB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBhZGRfcm91dGUodmVyYik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIHJldHVybiB0aGUgYXBwXHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBBbGlhcyBmb3Igcm91dGUoJ2dldCcsIC4uLilcclxuICAgIGdldDogX3JvdXRlV3JhcHBlcignZ2V0JyksXHJcblxyXG4gICAgLy8gQWxpYXMgZm9yIHJvdXRlKCdwb3N0JywgLi4uKVxyXG4gICAgcG9zdDogX3JvdXRlV3JhcHBlcigncG9zdCcpLFxyXG5cclxuICAgIC8vIEFsaWFzIGZvciByb3V0ZSgncHV0JywgLi4uKVxyXG4gICAgcHV0OiBfcm91dGVXcmFwcGVyKCdwdXQnKSxcclxuXHJcbiAgICAvLyBBbGlhcyBmb3Igcm91dGUoJ2RlbGV0ZScsIC4uLilcclxuICAgIGRlbDogX3JvdXRlV3JhcHBlcignZGVsZXRlJyksXHJcblxyXG4gICAgLy8gQWxpYXMgZm9yIHJvdXRlKCdhbnknLCAuLi4pXHJcbiAgICBhbnk6IF9yb3V0ZVdyYXBwZXIoJ2FueScpLFxyXG5cclxuICAgIC8vIGBtYXBSb3V0ZXNgIHRha2VzIGFuIGFycmF5IG9mIGFycmF5cywgZWFjaCBhcnJheSBiZWluZyBwYXNzZWQgdG8gcm91dGUoKVxyXG4gICAgLy8gYXMgYXJndW1lbnRzLCB0aGlzIGFsbG93cyBmb3IgbWFzcyBkZWZpbml0aW9uIG9mIHJvdXRlcy4gQW5vdGhlciBiZW5lZml0IGlzXHJcbiAgICAvLyB0aGlzIG1ha2VzIGl0IHBvc3NpYmxlL2Vhc2llciB0byBsb2FkIHJvdXRlcyB2aWEgcmVtb3RlIEpTT04uXHJcbiAgICAvL1xyXG4gICAgLy8gIyMjIEV4YW1wbGVcclxuICAgIC8vXHJcbiAgICAvLyAgICAgIHZhciBhcHAgPSAkLnNhbW15KGZ1bmN0aW9uKCkge1xyXG4gICAgLy9cclxuICAgIC8vICAgICAgICB0aGlzLm1hcFJvdXRlcyhbXHJcbiAgICAvLyAgICAgICAgICAgIFsnZ2V0JywgJyMvJywgZnVuY3Rpb24oKSB7IHRoaXMubG9nKCdpbmRleCcpOyB9XSxcclxuICAgIC8vICAgICAgICAgICAgLy8gc3RyaW5ncyBpbiBjYWxsYmFja3MgYXJlIGxvb2tlZCB1cCBhcyBtZXRob2RzIG9uIHRoZSBhcHBcclxuICAgIC8vICAgICAgICAgICAgWydwb3N0JywgJyMvY3JlYXRlJywgJ2FkZFVzZXInXSxcclxuICAgIC8vICAgICAgICAgICAgLy8gTm8gdmVyYiBhc3N1bWVzICdhbnknIGFzIHRoZSB2ZXJiXHJcbiAgICAvLyAgICAgICAgICAgIFsvZG93aGF0ZXZlci8sIGZ1bmN0aW9uKCkgeyB0aGlzLmxvZyh0aGlzLnZlcmIsIHRoaXMucGF0aCl9XTtcclxuICAgIC8vICAgICAgICAgIF0pO1xyXG4gICAgLy8gICAgICB9KTtcclxuICAgIC8vXHJcbiAgICBtYXBSb3V0ZXM6IGZ1bmN0aW9uKHJvdXRlX2FycmF5KSB7XHJcbiAgICAgIHZhciBhcHAgPSB0aGlzO1xyXG4gICAgICAkLmVhY2gocm91dGVfYXJyYXksIGZ1bmN0aW9uKGksIHJvdXRlX2FyZ3MpIHtcclxuICAgICAgICBhcHAucm91dGUuYXBwbHkoYXBwLCByb3V0ZV9hcmdzKTtcclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBBIHVuaXF1ZSBldmVudCBuYW1lc3BhY2UgZGVmaW5lZCBwZXIgYXBwbGljYXRpb24uXHJcbiAgICAvLyBBbGwgZXZlbnRzIGJvdW5kIHdpdGggYGJpbmQoKWAgYXJlIGF1dG9tYXRpY2FsbHkgYm91bmQgd2l0aGluIHRoaXMgc3BhY2UuXHJcbiAgICBldmVudE5hbWVzcGFjZTogZnVuY3Rpb24oKSB7XHJcbiAgICAgIHJldHVybiBbJ3NhbW15LWFwcCcsIHRoaXMubmFtZXNwYWNlXS5qb2luKCctJyk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIFdvcmtzIGp1c3QgbGlrZSBgalF1ZXJ5LmZuLmJpbmQoKWAgd2l0aCBhIGNvdXBsZSBub3RhYmxlIGRpZmZlcmVuY2VzLlxyXG4gICAgLy9cclxuICAgIC8vICogSXQgYmluZHMgYWxsIGV2ZW50cyB0byB0aGUgYXBwbGljYXRpb24gZWxlbWVudFxyXG4gICAgLy8gKiBBbGwgZXZlbnRzIGFyZSBib3VuZCB3aXRoaW4gdGhlIGBldmVudE5hbWVzcGFjZSgpYFxyXG4gICAgLy8gKiBFdmVudHMgYXJlIG5vdCBhY3R1YWxseSBib3VuZCB1bnRpbCB0aGUgYXBwbGljYXRpb24gaXMgc3RhcnRlZCB3aXRoIGBydW4oKWBcclxuICAgIC8vICogY2FsbGJhY2tzIGFyZSBldmFsdWF0ZWQgd2l0aGluIHRoZSBjb250ZXh0IG9mIGEgU2FtbXkuRXZlbnRDb250ZXh0XHJcbiAgICAvL1xyXG4gICAgYmluZDogZnVuY3Rpb24obmFtZSwgZGF0YSwgY2FsbGJhY2spIHtcclxuICAgICAgdmFyIGFwcCA9IHRoaXM7XHJcbiAgICAgIC8vIGJ1aWxkIHRoZSBjYWxsYmFja1xyXG4gICAgICAvLyBpZiB0aGUgYXJpdHkgaXMgMiwgY2FsbGJhY2sgaXMgdGhlIHNlY29uZCBhcmd1bWVudFxyXG4gICAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09ICd1bmRlZmluZWQnKSB7IGNhbGxiYWNrID0gZGF0YTsgfVxyXG4gICAgICB2YXIgbGlzdGVuZXJfY2FsbGJhY2sgPSAgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgLy8gcHVsbCBvZmYgdGhlIGNvbnRleHQgZnJvbSB0aGUgYXJndW1lbnRzIHRvIHRoZSBjYWxsYmFja1xyXG4gICAgICAgIHZhciBlLCBjb250ZXh0LCBkYXRhO1xyXG4gICAgICAgIGUgICAgICAgPSBhcmd1bWVudHNbMF07XHJcbiAgICAgICAgZGF0YSAgICA9IGFyZ3VtZW50c1sxXTtcclxuICAgICAgICBpZiAoZGF0YSAmJiBkYXRhLmNvbnRleHQpIHtcclxuICAgICAgICAgIGNvbnRleHQgPSBkYXRhLmNvbnRleHQ7XHJcbiAgICAgICAgICBkZWxldGUgZGF0YS5jb250ZXh0O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjb250ZXh0ID0gbmV3IGFwcC5jb250ZXh0X3Byb3RvdHlwZShhcHAsICdiaW5kJywgZS50eXBlLCBkYXRhLCBlLnRhcmdldCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGUuY2xlYW5lZF90eXBlID0gZS50eXBlLnJlcGxhY2UoYXBwLmV2ZW50TmFtZXNwYWNlKCksICcnKTtcclxuICAgICAgICBjYWxsYmFjay5hcHBseShjb250ZXh0LCBbZSwgZGF0YV0pO1xyXG4gICAgICB9O1xyXG5cclxuICAgICAgLy8gaXQgY291bGQgYmUgdGhhdCB0aGUgYXBwIGVsZW1lbnQgZG9lc250IGV4aXN0IHlldFxyXG4gICAgICAvLyBzbyBhdHRhY2ggdG8gdGhlIGxpc3RlbmVycyBhcnJheSBhbmQgdGhlbiBydW4oKVxyXG4gICAgICAvLyB3aWxsIGFjdHVhbGx5IGJpbmQgdGhlIGV2ZW50LlxyXG4gICAgICBpZiAoIXRoaXMubGlzdGVuZXJzW25hbWVdKSB7IHRoaXMubGlzdGVuZXJzW25hbWVdID0gW107IH1cclxuICAgICAgdGhpcy5saXN0ZW5lcnNbbmFtZV0ucHVzaChsaXN0ZW5lcl9jYWxsYmFjayk7XHJcbiAgICAgIGlmICh0aGlzLmlzUnVubmluZygpKSB7XHJcbiAgICAgICAgLy8gaWYgdGhlIGFwcCBpcyBydW5uaW5nXHJcbiAgICAgICAgLy8gKmFjdHVhbGx5KiBiaW5kIHRoZSBldmVudCB0byB0aGUgYXBwIGVsZW1lbnRcclxuICAgICAgICB0aGlzLl9saXN0ZW4obmFtZSwgbGlzdGVuZXJfY2FsbGJhY2spO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBUcmlnZ2VycyBjdXN0b20gZXZlbnRzIGRlZmluZWQgd2l0aCBgYmluZCgpYFxyXG4gICAgLy9cclxuICAgIC8vICMjIyBBcmd1bWVudHNcclxuICAgIC8vXHJcbiAgICAvLyAqIGBuYW1lYCBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuIEF1dG9tYXRpY2FsbHkgcHJlZml4ZWQgd2l0aCB0aGUgYGV2ZW50TmFtZXNwYWNlKClgXHJcbiAgICAvLyAqIGBkYXRhYCBBbiBvcHRpb25hbCBPYmplY3QgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIHRoZSBib3VuZCBjYWxsYmFjay5cclxuICAgIC8vICogYGNvbnRleHRgIEFuIG9wdGlvbmFsIGNvbnRleHQvT2JqZWN0IGluIHdoaWNoIHRvIGV4ZWN1dGUgdGhlIGJvdW5kIGNhbGxiYWNrLlxyXG4gICAgLy8gICBJZiBubyBjb250ZXh0IGlzIHN1cHBsaWVkIGEgdGhlIGNvbnRleHQgaXMgYSBuZXcgYFNhbW15LkV2ZW50Q29udGV4dGBcclxuICAgIC8vXHJcbiAgICB0cmlnZ2VyOiBmdW5jdGlvbihuYW1lLCBkYXRhKSB7XHJcbiAgICAgIHRoaXMuJGVsZW1lbnQoKS50cmlnZ2VyKFtuYW1lLCB0aGlzLmV2ZW50TmFtZXNwYWNlKCldLmpvaW4oJy4nKSwgW2RhdGFdKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIFJlcnVucyB0aGUgY3VycmVudCByb3V0ZVxyXG4gICAgcmVmcmVzaDogZnVuY3Rpb24oKSB7XHJcbiAgICAgIHRoaXMubGFzdF9sb2NhdGlvbiA9IG51bGw7XHJcbiAgICAgIHRoaXMudHJpZ2dlcignbG9jYXRpb24tY2hhbmdlZCcpO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLy8gVGFrZXMgYSBzaW5nbGUgY2FsbGJhY2sgdGhhdCBpcyBwdXNoZWQgb24gdG8gYSBzdGFjay5cclxuICAgIC8vIEJlZm9yZSBhbnkgcm91dGUgaXMgcnVuLCB0aGUgY2FsbGJhY2tzIGFyZSBldmFsdWF0ZWQgaW4gb3JkZXIgd2l0aGluXHJcbiAgICAvLyB0aGUgY3VycmVudCBgU2FtbXkuRXZlbnRDb250ZXh0YFxyXG4gICAgLy9cclxuICAgIC8vIElmIGFueSBvZiB0aGUgY2FsbGJhY2tzIGV4cGxpY2l0bHkgcmV0dXJuIGZhbHNlLCBleGVjdXRpb24gb2YgYW55XHJcbiAgICAvLyBmdXJ0aGVyIGNhbGxiYWNrcyBhbmQgdGhlIHJvdXRlIGl0c2VsZiBpcyBoYWx0ZWQuXHJcbiAgICAvL1xyXG4gICAgLy8gWW91IGNhbiBhbHNvIHByb3ZpZGUgYSBzZXQgb2Ygb3B0aW9ucyB0aGF0IHdpbGwgZGVmaW5lIHdoZW4gdG8gcnVuIHRoaXNcclxuICAgIC8vIGJlZm9yZSBiYXNlZCBvbiB0aGUgcm91dGUgaXQgcHJvY2VlZHMuXHJcbiAgICAvL1xyXG4gICAgLy8gIyMjIEV4YW1wbGVcclxuICAgIC8vXHJcbiAgICAvLyAgICAgIHZhciBhcHAgPSAkLnNhbW15KGZ1bmN0aW9uKCkge1xyXG4gICAgLy9cclxuICAgIC8vICAgICAgICAvLyB3aWxsIHJ1biBhdCAjL3JvdXRlIGJ1dCBub3QgYXQgIy9cclxuICAgIC8vICAgICAgICB0aGlzLmJlZm9yZSgnIy9yb3V0ZScsIGZ1bmN0aW9uKCkge1xyXG4gICAgLy8gICAgICAgICAgLy8uLi5cclxuICAgIC8vICAgICAgICB9KTtcclxuICAgIC8vXHJcbiAgICAvLyAgICAgICAgLy8gd2lsbCBydW4gYXQgIy8gYnV0IG5vdCBhdCAjL3JvdXRlXHJcbiAgICAvLyAgICAgICAgdGhpcy5iZWZvcmUoe2V4Y2VwdDoge3BhdGg6ICcjL3JvdXRlJ319LCBmdW5jdGlvbigpIHtcclxuICAgIC8vICAgICAgICAgIHRoaXMubG9nKCdub3QgYmVmb3JlICMvcm91dGUnKTtcclxuICAgIC8vICAgICAgICB9KTtcclxuICAgIC8vXHJcbiAgICAvLyAgICAgICAgdGhpcy5nZXQoJyMvJywgZnVuY3Rpb24oKSB7fSk7XHJcbiAgICAvL1xyXG4gICAgLy8gICAgICAgIHRoaXMuZ2V0KCcjL3JvdXRlJywgZnVuY3Rpb24oKSB7fSk7XHJcbiAgICAvL1xyXG4gICAgLy8gICAgICB9KTtcclxuICAgIC8vXHJcbiAgICAvLyBTZWUgYGNvbnRleHRNYXRjaGVzT3B0aW9ucygpYCBmb3IgYSBmdWxsIGxpc3Qgb2Ygc3VwcG9ydGVkIG9wdGlvbnNcclxuICAgIC8vXHJcbiAgICBiZWZvcmU6IGZ1bmN0aW9uKG9wdGlvbnMsIGNhbGxiYWNrKSB7XHJcbiAgICAgIGlmIChfaXNGdW5jdGlvbihvcHRpb25zKSkge1xyXG4gICAgICAgIGNhbGxiYWNrID0gb3B0aW9ucztcclxuICAgICAgICBvcHRpb25zID0ge307XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5iZWZvcmVzLnB1c2goW29wdGlvbnMsIGNhbGxiYWNrXSk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBBIHNob3J0Y3V0IGZvciBiaW5kaW5nIGEgY2FsbGJhY2sgdG8gYmUgcnVuIGFmdGVyIGEgcm91dGUgaXMgZXhlY3V0ZWQuXHJcbiAgICAvLyBBZnRlciBjYWxsYmFja3MgaGF2ZSBubyBndWFydW50ZWVkIG9yZGVyLlxyXG4gICAgYWZ0ZXI6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmJpbmQoJ2V2ZW50LWNvbnRleHQtYWZ0ZXInLCBjYWxsYmFjayk7XHJcbiAgICB9LFxyXG5cclxuXHJcbiAgICAvLyBBZGRzIGFuIGFyb3VuZCBmaWx0ZXIgdG8gdGhlIGFwcGxpY2F0aW9uLiBhcm91bmQgZmlsdGVycyBhcmUgZnVuY3Rpb25zXHJcbiAgICAvLyB0aGF0IHRha2UgYSBzaW5nbGUgYXJndW1lbnQgYGNhbGxiYWNrYCB3aGljaCBpcyB0aGUgZW50aXJlIHJvdXRlXHJcbiAgICAvLyBleGVjdXRpb24gcGF0aCB3cmFwcGVkIHVwIGluIGEgY2xvc3VyZS4gVGhpcyBtZWFucyB5b3UgY2FuIGRlY2lkZSB3aGV0aGVyXHJcbiAgICAvLyBvciBub3QgdG8gcHJvY2VlZCB3aXRoIGV4ZWN1dGlvbiBieSBub3QgaW52b2tpbmcgYGNhbGxiYWNrYCBvcixcclxuICAgIC8vIG1vcmUgdXNlZnVsbHkgd3JhcHBpbmcgY2FsbGJhY2sgaW5zaWRlIHRoZSByZXN1bHQgb2YgYW4gYXN5bmNocm9ub3VzIGV4ZWN1dGlvbi5cclxuICAgIC8vXHJcbiAgICAvLyAjIyMgRXhhbXBsZVxyXG4gICAgLy9cclxuICAgIC8vIFRoZSBtb3N0IGNvbW1vbiB1c2UgY2FzZSBmb3IgYXJvdW5kKCkgaXMgY2FsbGluZyBhIF9wb3NzaWJseV8gYXN5bmMgZnVuY3Rpb25cclxuICAgIC8vIGFuZCBleGVjdXRpbmcgdGhlIHJvdXRlIHdpdGhpbiB0aGUgZnVuY3Rpb25zIGNhbGxiYWNrOlxyXG4gICAgLy9cclxuICAgIC8vICAgICAgdmFyIGFwcCA9ICQuc2FtbXkoZnVuY3Rpb24oKSB7XHJcbiAgICAvL1xyXG4gICAgLy8gICAgICAgIHZhciBjdXJyZW50X3VzZXIgPSBmYWxzZTtcclxuICAgIC8vXHJcbiAgICAvLyAgICAgICAgZnVuY3Rpb24gY2hlY2tMb2dnZWRJbihjYWxsYmFjaykge1xyXG4gICAgLy8gICAgICAgICAgLy8gL3Nlc3Npb24gcmV0dXJucyBhIEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhlIGxvZ2dlZCBpbiB1c2VyXHJcbiAgICAvLyAgICAgICAgICAvLyBvciBhbiBlbXB0eSBvYmplY3RcclxuICAgIC8vICAgICAgICAgIGlmICghY3VycmVudF91c2VyKSB7XHJcbiAgICAvLyAgICAgICAgICAgICQuZ2V0SlNPTignL3Nlc3Npb24nLCBmdW5jdGlvbihqc29uKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgaWYgKGpzb24ubG9naW4pIHtcclxuICAgIC8vICAgICAgICAgICAgICAgIC8vIHNob3cgdGhlIHVzZXIgYXMgbG9nZ2VkIGluXHJcbiAgICAvLyAgICAgICAgICAgICAgICBjdXJyZW50X3VzZXIgPSBqc29uO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgLy8gZXhlY3V0ZSB0aGUgcm91dGUgcGF0aFxyXG4gICAgLy8gICAgICAgICAgICAgICAgY2FsbGJhY2soKTtcclxuICAgIC8vICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgLy8gc2hvdyB0aGUgdXNlciBhcyBub3QgbG9nZ2VkIGluXHJcbiAgICAvLyAgICAgICAgICAgICAgICBjdXJyZW50X3VzZXIgPSBmYWxzZTtcclxuICAgIC8vICAgICAgICAgICAgICAgIC8vIHRoZSBjb250ZXh0IG9mIGFyb3VuZEZpbHRlcnMgaXMgYW4gRXZlbnRDb250ZXh0XHJcbiAgICAvLyAgICAgICAgICAgICAgICB0aGlzLnJlZGlyZWN0KCcjL2xvZ2luJyk7XHJcbiAgICAvLyAgICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICAgICB9KTtcclxuICAgIC8vICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAvLyAgICAgICAgICAgIC8vIGV4ZWN1dGUgdGhlIHJvdXRlIHBhdGhcclxuICAgIC8vICAgICAgICAgICAgY2FsbGJhY2soKTtcclxuICAgIC8vICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICB9O1xyXG4gICAgLy9cclxuICAgIC8vICAgICAgICB0aGlzLmFyb3VuZChjaGVja0xvZ2dlZEluKTtcclxuICAgIC8vXHJcbiAgICAvLyAgICAgIH0pO1xyXG4gICAgLy9cclxuICAgIGFyb3VuZDogZnVuY3Rpb24oY2FsbGJhY2spIHtcclxuICAgICAgdGhpcy5hcm91bmRzLnB1c2goY2FsbGJhY2spO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLy8gQWRkcyBhIG9uQ29tcGxldGUgZnVuY3Rpb24gdG8gdGhlIGFwcGxpY2F0aW9uLiBvbkNvbXBsZXRlIGZ1bmN0aW9ucyBhcmUgZXhlY3V0ZWRcclxuICAgIC8vIGF0IHRoZSBlbmQgb2YgYSBjaGFpbiBvZiByb3V0ZSBjYWxsYmFja3MsIGlmIHRoZXkgY2FsbCBuZXh0KCkuIFVubGlrZSBhZnRlcixcclxuICAgIC8vIHdoaWNoIGlzIGNhbGxlZCBhcyBzb29uIGFzIHRoZSByb3V0ZSBpcyBjb21wbGV0ZSwgb25Db21wbGV0ZSBpcyBsaWtlIGEgZmluYWwgbmV4dCgpXHJcbiAgICAvLyBmb3IgYWxsIHJvdXRlcywgYW5kIGlzIHRodXMgcnVuIGFzeW5jaHJvbm91c2x5XHJcbiAgICAvL1xyXG4gICAgLy8gIyMjIEV4YW1wbGVcclxuICAgIC8vXHJcbiAgICAvLyAgICAgIGFwcC5nZXQoJy9jaGFpbicsZnVuY3Rpb24oY29udGV4dCxuZXh0KSB7XHJcbiAgICAvLyAgICAgICAgICBjb25zb2xlLmxvZygnY2hhaW4xJyk7XHJcbiAgICAvLyAgICAgICAgICBuZXh0KCk7XHJcbiAgICAvLyAgICAgIH0sZnVuY3Rpb24oY29udGV4dCxuZXh0KSB7XHJcbiAgICAvLyAgICAgICAgICBjb25zb2xlLmxvZygnY2hhaW4yJyk7XHJcbiAgICAvLyAgICAgICAgICBuZXh0KCk7XHJcbiAgICAvLyAgICAgIH0pO1xyXG4gICAgLy9cclxuICAgIC8vICAgICAgYXBwLmdldCgnL2xpbmsnLGZ1bmN0aW9uKGNvbnRleHQsbmV4dCkge1xyXG4gICAgLy8gICAgICAgICAgY29uc29sZS5sb2coJ2xpbmsxJyk7XHJcbiAgICAvLyAgICAgICAgICBuZXh0KCk7XHJcbiAgICAvLyAgICAgIH0sZnVuY3Rpb24oY29udGV4dCxuZXh0KSB7XHJcbiAgICAvLyAgICAgICAgICBjb25zb2xlLmxvZygnbGluazInKTtcclxuICAgIC8vICAgICAgICAgIG5leHQoKTtcclxuICAgIC8vICAgICAgfSk7XHJcbiAgICAvL1xyXG4gICAgLy8gICAgICBhcHAub25Db21wbGV0ZShmdW5jdGlvbigpIHtcclxuICAgIC8vICAgICAgICAgIGNvbnNvbGUubG9nKFwiUnVubmluZyBmaW5hbGx5XCIpO1xyXG4gICAgLy8gICAgICB9KTtcclxuICAgIC8vXHJcbiAgICAvLyBJZiB5b3UgZ28gdG8gJy9jaGFpbicsIHlvdSB3aWxsIGdldCB0aGUgZm9sbG93aW5nIG1lc3NhZ2VzOlxyXG4gICAgLy9cclxuICAgIC8vICAgICAgY2hhaW4xXHJcbiAgICAvLyAgICAgIGNoYWluMlxyXG4gICAgLy8gICAgICBSdW5uaW5nIG9uQ29tcGxldGVcclxuICAgIC8vXHJcbiAgICAvL1xyXG4gICAgLy8gSWYgeW91IGdvIHRvIC9saW5rLCB5b3Ugd2lsbCBnZXQgdGhlIGZvbGxvd2luZyBtZXNzYWdlczpcclxuICAgIC8vXHJcbiAgICAvLyAgICAgIGxpbmsxXHJcbiAgICAvLyAgICAgIGxpbmsyXHJcbiAgICAvLyAgICAgIFJ1bm5pbmcgb25Db21wbGV0ZVxyXG4gICAgLy9cclxuICAgIC8vXHJcbiAgICAvLyBJdCByZWFsbHkgY29tZXMgdG8gcGxheSB3aGVuIGRvaW5nIGFzeW5jaHJvbm91czpcclxuICAgIC8vXHJcbiAgICAvLyAgICAgIGFwcC5nZXQoJy9jaGFpbicsZnVuY3Rpb24oY29udGV4dCxuZXh0KSB7XHJcbiAgICAvLyAgICAgICAgJC5nZXQoJy9teS91cmwnLGZ1bmN0aW9uKCkge1xyXG4gICAgLy8gICAgICAgICAgY29uc29sZS5sb2coJ2NoYWluMScpO1xyXG4gICAgLy8gICAgICAgICAgbmV4dCgpO1xyXG4gICAgLy8gICAgICAgIH0pO1xyXG4gICAgLy8gICAgICB9LGZ1bmN0aW9uKGNvbnRleHQsbmV4dCkge1xyXG4gICAgLy8gICAgICAgIGNvbnNvbGUubG9nKCdjaGFpbjInKTtcclxuICAgIC8vICAgICAgICBuZXh0KCk7XHJcbiAgICAvLyAgICAgIH0pO1xyXG4gICAgLy9cclxuICAgIG9uQ29tcGxldGU6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XHJcbiAgICAgIHRoaXMuX29uQ29tcGxldGUgPSBjYWxsYmFjaztcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIFJldHVybnMgYHRydWVgIGlmIHRoZSBjdXJyZW50IGFwcGxpY2F0aW9uIGlzIHJ1bm5pbmcuXHJcbiAgICBpc1J1bm5pbmc6IGZ1bmN0aW9uKCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5fcnVubmluZztcclxuICAgIH0sXHJcblxyXG4gICAgLy8gSGVscGVycyBleHRlbmRzIHRoZSBFdmVudENvbnRleHQgcHJvdG90eXBlIHNwZWNpZmljIHRvIHRoaXMgYXBwLlxyXG4gICAgLy8gVGhpcyBhbGxvd3MgeW91IHRvIGRlZmluZSBhcHAgc3BlY2lmaWMgaGVscGVyIGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSB1c2VkXHJcbiAgICAvLyB3aGVuZXZlciB5b3UncmUgaW5zaWRlIG9mIGFuIGV2ZW50IGNvbnRleHQgKHRlbXBsYXRlcywgcm91dGVzLCBiaW5kKS5cclxuICAgIC8vXHJcbiAgICAvLyAjIyMgRXhhbXBsZVxyXG4gICAgLy9cclxuICAgIC8vICAgICB2YXIgYXBwID0gJC5zYW1teShmdW5jdGlvbigpIHtcclxuICAgIC8vXHJcbiAgICAvLyAgICAgICBoZWxwZXJzKHtcclxuICAgIC8vICAgICAgICAgdXBjYXNlOiBmdW5jdGlvbih0ZXh0KSB7XHJcbiAgICAvLyAgICAgICAgICByZXR1cm4gdGV4dC50b1N0cmluZygpLnRvVXBwZXJDYXNlKCk7XHJcbiAgICAvLyAgICAgICAgIH1cclxuICAgIC8vICAgICAgIH0pO1xyXG4gICAgLy9cclxuICAgIC8vICAgICAgIGdldCgnIy8nLCBmdW5jdGlvbigpIHsgd2l0aCh0aGlzKSB7XHJcbiAgICAvLyAgICAgICAgIC8vIGluc2lkZSBvZiB0aGlzIGNvbnRleHQgSSBjYW4gdXNlIHRoZSBoZWxwZXJzXHJcbiAgICAvLyAgICAgICAgICQoJyNtYWluJykuaHRtbCh1cGNhc2UoJCgnI21haW4nKS50ZXh0KCkpO1xyXG4gICAgLy8gICAgICAgfX0pO1xyXG4gICAgLy9cclxuICAgIC8vICAgICB9KTtcclxuICAgIC8vXHJcbiAgICAvL1xyXG4gICAgLy8gIyMjIEFyZ3VtZW50c1xyXG4gICAgLy9cclxuICAgIC8vICogYGV4dGVuc2lvbnNgIEFuIG9iamVjdCBjb2xsZWN0aW9uIG9mIGZ1bmN0aW9ucyB0byBleHRlbmQgdGhlIGNvbnRleHQuXHJcbiAgICAvL1xyXG4gICAgaGVscGVyczogZnVuY3Rpb24oZXh0ZW5zaW9ucykge1xyXG4gICAgICAkLmV4dGVuZCh0aGlzLmNvbnRleHRfcHJvdG90eXBlLnByb3RvdHlwZSwgZXh0ZW5zaW9ucyk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBIZWxwZXIgZXh0ZW5kcyB0aGUgZXZlbnQgY29udGV4dCBqdXN0IGxpa2UgYGhlbHBlcnMoKWAgYnV0IGRvZXMgaXRcclxuICAgIC8vIGEgc2luZ2xlIG1ldGhvZCBhdCBhIHRpbWUuIFRoaXMgaXMgZXNwZWNpYWxseSB1c2VmdWwgZm9yIGR5bmFtaWNhbGx5IG5hbWVkXHJcbiAgICAvLyBoZWxwZXJzXHJcbiAgICAvL1xyXG4gICAgLy8gIyMjIEV4YW1wbGVcclxuICAgIC8vXHJcbiAgICAvLyAgICAgLy8gVHJpdmlhbCBleGFtcGxlIHRoYXQgYWRkcyAzIGhlbHBlciBtZXRob2RzIHRvIHRoZSBjb250ZXh0IGR5bmFtaWNhbGx5XHJcbiAgICAvLyAgICAgdmFyIGFwcCA9ICQuc2FtbXkoZnVuY3Rpb24oYXBwKSB7XHJcbiAgICAvL1xyXG4gICAgLy8gICAgICAgJC5lYWNoKFsxLDIsM10sIGZ1bmN0aW9uKGksIG51bSkge1xyXG4gICAgLy8gICAgICAgICBhcHAuaGVscGVyKCdoZWxwZXInICsgbnVtLCBmdW5jdGlvbigpIHtcclxuICAgIC8vICAgICAgICAgICB0aGlzLmxvZyhcIkknbSBoZWxwZXIgbnVtYmVyIFwiICsgbnVtKTtcclxuICAgIC8vICAgICAgICAgfSk7XHJcbiAgICAvLyAgICAgICB9KTtcclxuICAgIC8vXHJcbiAgICAvLyAgICAgICB0aGlzLmdldCgnIy8nLCBmdW5jdGlvbigpIHtcclxuICAgIC8vICAgICAgICAgdGhpcy5oZWxwZXIyKCk7IC8vPT4gSSdtIGhlbHBlciBudW1iZXIgMlxyXG4gICAgLy8gICAgICAgfSk7XHJcbiAgICAvLyAgICAgfSk7XHJcbiAgICAvL1xyXG4gICAgLy8gIyMjIEFyZ3VtZW50c1xyXG4gICAgLy9cclxuICAgIC8vICogYG5hbWVgIFRoZSBuYW1lIG9mIHRoZSBtZXRob2RcclxuICAgIC8vICogYG1ldGhvZGAgVGhlIGZ1bmN0aW9uIHRvIGJlIGFkZGVkIHRvIHRoZSBwcm90b3R5cGUgYXQgYG5hbWVgXHJcbiAgICAvL1xyXG4gICAgaGVscGVyOiBmdW5jdGlvbihuYW1lLCBtZXRob2QpIHtcclxuICAgICAgdGhpcy5jb250ZXh0X3Byb3RvdHlwZS5wcm90b3R5cGVbbmFtZV0gPSBtZXRob2Q7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBBY3R1YWxseSBzdGFydHMgdGhlIGFwcGxpY2F0aW9uJ3MgbGlmZWN5Y2xlLiBgcnVuKClgIHNob3VsZCBiZSBpbnZva2VkXHJcbiAgICAvLyB3aXRoaW4gYSBkb2N1bWVudC5yZWFkeSBibG9jayB0byBlbnN1cmUgdGhlIERPTSBleGlzdHMgYmVmb3JlIGJpbmRpbmcgZXZlbnRzLCBldGMuXHJcbiAgICAvL1xyXG4gICAgLy8gIyMjIEV4YW1wbGVcclxuICAgIC8vXHJcbiAgICAvLyAgICAgdmFyIGFwcCA9ICQuc2FtbXkoZnVuY3Rpb24oKSB7IC4uLiB9KTsgLy8geW91ciBhcHBsaWNhdGlvblxyXG4gICAgLy8gICAgICQoZnVuY3Rpb24oKSB7IC8vIGRvY3VtZW50LnJlYWR5XHJcbiAgICAvLyAgICAgICAgYXBwLnJ1bigpO1xyXG4gICAgLy8gICAgIH0pO1xyXG4gICAgLy9cclxuICAgIC8vICMjIyBBcmd1bWVudHNcclxuICAgIC8vXHJcbiAgICAvLyAqIGBzdGFydF91cmxgIE9wdGlvbmFsbHksIGEgU3RyaW5nIGNhbiBiZSBwYXNzZWQgd2hpY2ggdGhlIEFwcCB3aWxsIHJlZGlyZWN0IHRvXHJcbiAgICAvLyAgIGFmdGVyIHRoZSBldmVudHMvcm91dGVzIGhhdmUgYmVlbiBib3VuZC5cclxuICAgIHJ1bjogZnVuY3Rpb24oc3RhcnRfdXJsKSB7XHJcbiAgICAgIGlmICh0aGlzLmlzUnVubmluZygpKSB7IHJldHVybiBmYWxzZTsgfVxyXG4gICAgICB2YXIgYXBwID0gdGhpcztcclxuXHJcbiAgICAgIC8vIGFjdHVhbGx5IGJpbmQgYWxsIHRoZSBsaXN0ZW5lcnNcclxuICAgICAgJC5lYWNoKHRoaXMubGlzdGVuZXJzLnRvSGFzaCgpLCBmdW5jdGlvbihuYW1lLCBjYWxsYmFja3MpIHtcclxuICAgICAgICAkLmVhY2goY2FsbGJhY2tzLCBmdW5jdGlvbihpLCBsaXN0ZW5lcl9jYWxsYmFjaykge1xyXG4gICAgICAgICAgYXBwLl9saXN0ZW4obmFtZSwgbGlzdGVuZXJfY2FsbGJhY2spO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHRoaXMudHJpZ2dlcigncnVuJywge3N0YXJ0X3VybDogc3RhcnRfdXJsfSk7XHJcbiAgICAgIHRoaXMuX3J1bm5pbmcgPSB0cnVlO1xyXG4gICAgICAvLyBzZXQgbGFzdCBsb2NhdGlvblxyXG4gICAgICB0aGlzLmxhc3RfbG9jYXRpb24gPSBudWxsO1xyXG4gICAgICBpZiAoISgvXFwjKC4rKS8udGVzdCh0aGlzLmdldExvY2F0aW9uKCkpKSAmJiB0eXBlb2Ygc3RhcnRfdXJsICE9ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgdGhpcy5zZXRMb2NhdGlvbihzdGFydF91cmwpO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIGNoZWNrIHVybFxyXG4gICAgICB0aGlzLl9jaGVja0xvY2F0aW9uKCk7XHJcbiAgICAgIHRoaXMuX2xvY2F0aW9uX3Byb3h5LmJpbmQoKTtcclxuICAgICAgdGhpcy5iaW5kKCdsb2NhdGlvbi1jaGFuZ2VkJywgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgYXBwLl9jaGVja0xvY2F0aW9uKCk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgLy8gYmluZCB0byBzdWJtaXQgdG8gY2FwdHVyZSBwb3N0L3B1dC9kZWxldGUgcm91dGVzXHJcbiAgICAgIHRoaXMuYmluZCgnc3VibWl0JywgZnVuY3Rpb24oZSkge1xyXG4gICAgICAgIGlmICggIVNhbW15LnRhcmdldElzVGhpc1dpbmRvdyhlLCAnZm9ybScpICkgeyByZXR1cm4gdHJ1ZTsgfVxyXG4gICAgICAgIHZhciByZXR1cm5lZCA9IGFwcC5fY2hlY2tGb3JtU3VibWlzc2lvbigkKGUudGFyZ2V0KS5jbG9zZXN0KCdmb3JtJykpO1xyXG4gICAgICAgIHJldHVybiAocmV0dXJuZWQgPT09IGZhbHNlKSA/IGUucHJldmVudERlZmF1bHQoKSA6IGZhbHNlO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIC8vIGJpbmQgdW5sb2FkIHRvIGJvZHkgdW5sb2FkXHJcbiAgICAgICQod2luZG93KS5iaW5kKCd1bmxvYWQnLCBmdW5jdGlvbigpIHtcclxuICAgICAgICBhcHAudW5sb2FkKCk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgLy8gdHJpZ2dlciBodG1sIGNoYW5nZWRcclxuICAgICAgcmV0dXJuIHRoaXMudHJpZ2dlcignY2hhbmdlZCcpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBUaGUgb3Bwb3NpdGUgb2YgYHJ1bigpYCwgdW4tYmluZHMgYWxsIGV2ZW50IGxpc3RlbmVycyBhbmQgaW50ZXJ2YWxzXHJcbiAgICAvLyBgcnVuKClgIEF1dG9tYXRpY2FsbHkgYmluZHMgYSBgb251bmxvYWRgIGV2ZW50IHRvIHJ1biB0aGlzIHdoZW5cclxuICAgIC8vIHRoZSBkb2N1bWVudCBpcyBjbG9zZWQuXHJcbiAgICB1bmxvYWQ6IGZ1bmN0aW9uKCkge1xyXG4gICAgICBpZiAoIXRoaXMuaXNSdW5uaW5nKCkpIHsgcmV0dXJuIGZhbHNlOyB9XHJcbiAgICAgIHZhciBhcHAgPSB0aGlzO1xyXG4gICAgICB0aGlzLnRyaWdnZXIoJ3VubG9hZCcpO1xyXG4gICAgICAvLyBjbGVhciBpbnRlcnZhbFxyXG4gICAgICB0aGlzLl9sb2NhdGlvbl9wcm94eS51bmJpbmQoKTtcclxuICAgICAgLy8gdW5iaW5kIGZvcm0gc3VibWl0c1xyXG4gICAgICB0aGlzLiRlbGVtZW50KCkudW5iaW5kKCdzdWJtaXQnKS5yZW1vdmVDbGFzcyhhcHAuZXZlbnROYW1lc3BhY2UoKSk7XHJcbiAgICAgIC8vIHVuYmluZCBhbGwgZXZlbnRzXHJcbiAgICAgICQuZWFjaCh0aGlzLmxpc3RlbmVycy50b0hhc2goKSAsIGZ1bmN0aW9uKG5hbWUsIGxpc3RlbmVycykge1xyXG4gICAgICAgICQuZWFjaChsaXN0ZW5lcnMsIGZ1bmN0aW9uKGksIGxpc3RlbmVyX2NhbGxiYWNrKSB7XHJcbiAgICAgICAgICBhcHAuX3VubGlzdGVuKG5hbWUsIGxpc3RlbmVyX2NhbGxiYWNrKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMuX3J1bm5pbmcgPSBmYWxzZTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIE5vdCBvbmx5IHJ1bnMgYHVuYmluZGAgYnV0IGFsc28gZGVzdHJveXMgdGhlIGFwcCByZWZlcmVuY2UuXHJcbiAgICBkZXN0cm95OiBmdW5jdGlvbigpIHtcclxuICAgICAgdGhpcy51bmxvYWQoKTtcclxuICAgICAgZGVsZXRlIFNhbW15LmFwcHNbdGhpcy5lbGVtZW50X3NlbGVjdG9yXTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIFdpbGwgYmluZCBhIHNpbmdsZSBjYWxsYmFjayBmdW5jdGlvbiB0byBldmVyeSBldmVudCB0aGF0IGlzIGFscmVhZHlcclxuICAgIC8vIGJlaW5nIGxpc3RlbmVkIHRvIGluIHRoZSBhcHAuIFRoaXMgaW5jbHVkZXMgYWxsIHRoZSBgQVBQX0VWRU5UU2BcclxuICAgIC8vIGFzIHdlbGwgYXMgYW55IGN1c3RvbSBldmVudHMgZGVmaW5lZCB3aXRoIGBiaW5kKClgLlxyXG4gICAgLy9cclxuICAgIC8vIFVzZWQgaW50ZXJuYWxseSBmb3IgZGVidWcgbG9nZ2luZy5cclxuICAgIGJpbmRUb0FsbEV2ZW50czogZnVuY3Rpb24oY2FsbGJhY2spIHtcclxuICAgICAgdmFyIGFwcCA9IHRoaXM7XHJcbiAgICAgIC8vIGJpbmQgdG8gdGhlIEFQUF9FVkVOVFMgZmlyc3RcclxuICAgICAgJC5lYWNoKHRoaXMuQVBQX0VWRU5UUywgZnVuY3Rpb24oaSwgZSkge1xyXG4gICAgICAgIGFwcC5iaW5kKGUsIGNhbGxiYWNrKTtcclxuICAgICAgfSk7XHJcbiAgICAgIC8vIG5leHQsIGJpbmQgdG8gbGlzdGVuZXIgbmFtZXMgKG9ubHkgaWYgdGhleSBkb250IGV4aXN0IGluIEFQUF9FVkVOVFMpXHJcbiAgICAgICQuZWFjaCh0aGlzLmxpc3RlbmVycy5rZXlzKHRydWUpLCBmdW5jdGlvbihpLCBuYW1lKSB7XHJcbiAgICAgICAgaWYgKCQuaW5BcnJheShuYW1lLCBhcHAuQVBQX0VWRU5UUykgPT0gLTEpIHtcclxuICAgICAgICAgIGFwcC5iaW5kKG5hbWUsIGNhbGxiYWNrKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLy8gUmV0dXJucyBhIGNvcHkgb2YgdGhlIGdpdmVuIHBhdGggd2l0aCBhbnkgcXVlcnkgc3RyaW5nIGFmdGVyIHRoZSBoYXNoXHJcbiAgICAvLyByZW1vdmVkLlxyXG4gICAgcm91dGFibGVQYXRoOiBmdW5jdGlvbihwYXRoKSB7XHJcbiAgICAgIHJldHVybiBwYXRoLnJlcGxhY2UoUVVFUllfU1RSSU5HX01BVENIRVIsICcnKTtcclxuICAgIH0sXHJcblxyXG4gICAgLy8gR2l2ZW4gYSB2ZXJiIGFuZCBhIFN0cmluZyBwYXRoLCB3aWxsIHJldHVybiBlaXRoZXIgYSByb3V0ZSBvYmplY3Qgb3IgZmFsc2VcclxuICAgIC8vIGlmIGEgbWF0Y2hpbmcgcm91dGUgY2FuIGJlIGZvdW5kIHdpdGhpbiB0aGUgY3VycmVudCBkZWZpbmVkIHNldC5cclxuICAgIGxvb2t1cFJvdXRlOiBmdW5jdGlvbih2ZXJiLCBwYXRoKSB7XHJcbiAgICAgIHZhciBhcHAgPSB0aGlzLCByb3V0ZWQgPSBmYWxzZSwgaSA9IDAsIGwsIHJvdXRlO1xyXG4gICAgICBpZiAodHlwZW9mIHRoaXMucm91dGVzW3ZlcmJdICE9ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgbCA9IHRoaXMucm91dGVzW3ZlcmJdLmxlbmd0aDtcclxuICAgICAgICBmb3IgKDsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgICAgcm91dGUgPSB0aGlzLnJvdXRlc1t2ZXJiXVtpXTtcclxuICAgICAgICAgIGlmIChhcHAucm91dGFibGVQYXRoKHBhdGgpLm1hdGNoKHJvdXRlLnBhdGgpKSB7XHJcbiAgICAgICAgICAgIHJvdXRlZCA9IHJvdXRlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHJvdXRlZDtcclxuICAgIH0sXHJcblxyXG4gICAgLy8gRmlyc3QsIGludm9rZXMgYGxvb2t1cFJvdXRlKClgIGFuZCBpZiBhIHJvdXRlIGlzIGZvdW5kLCBwYXJzZXMgdGhlXHJcbiAgICAvLyBwb3NzaWJsZSBVUkwgcGFyYW1zIGFuZCB0aGVuIGludm9rZXMgdGhlIHJvdXRlJ3MgY2FsbGJhY2sgd2l0aGluIGEgbmV3XHJcbiAgICAvLyBgU2FtbXkuRXZlbnRDb250ZXh0YC4gSWYgdGhlIHJvdXRlIGNhbiBub3QgYmUgZm91bmQsIGl0IGNhbGxzXHJcbiAgICAvLyBgbm90Rm91bmQoKWAuIElmIGByYWlzZV9lcnJvcnNgIGlzIHNldCB0byBgdHJ1ZWAgYW5kXHJcbiAgICAvLyB0aGUgYGVycm9yKClgIGhhcyBub3QgYmVlbiBvdmVycmlkZGVuLCBpdCB3aWxsIHRocm93IGFuIGFjdHVhbCBKU1xyXG4gICAgLy8gZXJyb3IuXHJcbiAgICAvL1xyXG4gICAgLy8gWW91IHByb2JhYmx5IHdpbGwgbmV2ZXIgaGF2ZSB0byBjYWxsIHRoaXMgZGlyZWN0bHkuXHJcbiAgICAvL1xyXG4gICAgLy8gIyMjIEFyZ3VtZW50c1xyXG4gICAgLy9cclxuICAgIC8vICogYHZlcmJgIEEgU3RyaW5nIGZvciB0aGUgdmVyYi5cclxuICAgIC8vICogYHBhdGhgIEEgU3RyaW5nIHBhdGggdG8gbG9va3VwLlxyXG4gICAgLy8gKiBgcGFyYW1zYCBBbiBPYmplY3Qgb2YgUGFyYW1zIHB1bGxlZCBmcm9tIHRoZSBVUkkgb3IgcGFzc2VkIGRpcmVjdGx5LlxyXG4gICAgLy9cclxuICAgIC8vICMjIyBSZXR1cm5zXHJcbiAgICAvL1xyXG4gICAgLy8gRWl0aGVyIHJldHVybnMgdGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZSByb3V0ZSBjYWxsYmFjayBvciByYWlzZXMgYSA0MDQgTm90IEZvdW5kIGVycm9yLlxyXG4gICAgLy9cclxuICAgIHJ1blJvdXRlOiBmdW5jdGlvbih2ZXJiLCBwYXRoLCBwYXJhbXMsIHRhcmdldCkge1xyXG4gICAgICB2YXIgYXBwID0gdGhpcyxcclxuICAgICAgICAgIHJvdXRlID0gdGhpcy5sb29rdXBSb3V0ZSh2ZXJiLCBwYXRoKSxcclxuICAgICAgICAgIGNvbnRleHQsXHJcbiAgICAgICAgICB3cmFwcGVkX3JvdXRlLFxyXG4gICAgICAgICAgYXJvdW5kcyxcclxuICAgICAgICAgIGFyb3VuZCxcclxuICAgICAgICAgIGJlZm9yZXMsXHJcbiAgICAgICAgICBiZWZvcmUsXHJcbiAgICAgICAgICBjYWxsYmFja19hcmdzLFxyXG4gICAgICAgICAgcGF0aF9wYXJhbXMsXHJcbiAgICAgICAgICBmaW5hbF9yZXR1cm5lZDtcclxuXHJcbiAgICAgIGlmICh0aGlzLmRlYnVnKSB7XHJcbiAgICAgICAgdGhpcy5sb2coJ3J1blJvdXRlJywgW3ZlcmIsIHBhdGhdLmpvaW4oJyAnKSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMudHJpZ2dlcigncnVuLXJvdXRlJywge3ZlcmI6IHZlcmIsIHBhdGg6IHBhdGgsIHBhcmFtczogcGFyYW1zfSk7XHJcbiAgICAgIGlmICh0eXBlb2YgcGFyYW1zID09ICd1bmRlZmluZWQnKSB7IHBhcmFtcyA9IHt9OyB9XHJcblxyXG4gICAgICAkLmV4dGVuZChwYXJhbXMsIHRoaXMuX3BhcnNlUXVlcnlTdHJpbmcocGF0aCkpO1xyXG5cclxuICAgICAgaWYgKHJvdXRlKSB7XHJcbiAgICAgICAgdGhpcy50cmlnZ2VyKCdyb3V0ZS1mb3VuZCcsIHtyb3V0ZTogcm91dGV9KTtcclxuICAgICAgICAvLyBwdWxsIG91dCB0aGUgcGFyYW1zIGZyb20gdGhlIHBhdGhcclxuICAgICAgICBpZiAoKHBhdGhfcGFyYW1zID0gcm91dGUucGF0aC5leGVjKHRoaXMucm91dGFibGVQYXRoKHBhdGgpKSkgIT09IG51bGwpIHtcclxuICAgICAgICAgIC8vIGZpcnN0IG1hdGNoIGlzIHRoZSBmdWxsIHBhdGhcclxuICAgICAgICAgIHBhdGhfcGFyYW1zLnNoaWZ0KCk7XHJcbiAgICAgICAgICAvLyBmb3IgZWFjaCBvZiB0aGUgbWF0Y2hlc1xyXG4gICAgICAgICAgJC5lYWNoKHBhdGhfcGFyYW1zLCBmdW5jdGlvbihpLCBwYXJhbSkge1xyXG4gICAgICAgICAgICAvLyBpZiB0aGVyZXMgYSBtYXRjaGluZyBwYXJhbSBuYW1lXHJcbiAgICAgICAgICAgIGlmIChyb3V0ZS5wYXJhbV9uYW1lc1tpXSkge1xyXG4gICAgICAgICAgICAgIC8vIHNldCB0aGUgbmFtZSB0byB0aGUgbWF0Y2hcclxuICAgICAgICAgICAgICBwYXJhbXNbcm91dGUucGFyYW1fbmFtZXNbaV1dID0gX2RlY29kZShwYXJhbSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSAnc3BsYXQnXHJcbiAgICAgICAgICAgICAgaWYgKCFwYXJhbXMuc3BsYXQpIHsgcGFyYW1zLnNwbGF0ID0gW107IH1cclxuICAgICAgICAgICAgICBwYXJhbXMuc3BsYXQucHVzaChfZGVjb2RlKHBhcmFtKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gc2V0IGV2ZW50IGNvbnRleHRcclxuICAgICAgICBjb250ZXh0ICA9IG5ldyB0aGlzLmNvbnRleHRfcHJvdG90eXBlKHRoaXMsIHZlcmIsIHBhdGgsIHBhcmFtcywgdGFyZ2V0KTtcclxuICAgICAgICAvLyBlbnN1cmUgYXJyYXlzXHJcbiAgICAgICAgYXJvdW5kcyA9IHRoaXMuYXJvdW5kcy5zbGljZSgwKTtcclxuICAgICAgICBiZWZvcmVzID0gdGhpcy5iZWZvcmVzLnNsaWNlKDApO1xyXG4gICAgICAgIC8vIHNldCB0aGUgY2FsbGJhY2sgYXJncyB0byB0aGUgY29udGV4dCArIGNvbnRlbnRzIG9mIHRoZSBzcGxhdFxyXG4gICAgICAgIGNhbGxiYWNrX2FyZ3MgPSBbY29udGV4dF07XHJcbiAgICAgICAgaWYgKHBhcmFtcy5zcGxhdCkge1xyXG4gICAgICAgICAgY2FsbGJhY2tfYXJncyA9IGNhbGxiYWNrX2FyZ3MuY29uY2F0KHBhcmFtcy5zcGxhdCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHdyYXAgdGhlIHJvdXRlIHVwIHdpdGggdGhlIGJlZm9yZSBmaWx0ZXJzXHJcbiAgICAgICAgd3JhcHBlZF9yb3V0ZSA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgdmFyIHJldHVybmVkLCBpLCBuZXh0Um91dGU7XHJcbiAgICAgICAgICB3aGlsZSAoYmVmb3Jlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGJlZm9yZSA9IGJlZm9yZXMuc2hpZnQoKTtcclxuICAgICAgICAgICAgLy8gY2hlY2sgdGhlIG9wdGlvbnNcclxuICAgICAgICAgICAgaWYgKGFwcC5jb250ZXh0TWF0Y2hlc09wdGlvbnMoY29udGV4dCwgYmVmb3JlWzBdKSkge1xyXG4gICAgICAgICAgICAgIHJldHVybmVkID0gYmVmb3JlWzFdLmFwcGx5KGNvbnRleHQsIFtjb250ZXh0XSk7XHJcbiAgICAgICAgICAgICAgaWYgKHJldHVybmVkID09PSBmYWxzZSkgeyByZXR1cm4gZmFsc2U7IH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYXBwLmxhc3Rfcm91dGUgPSByb3V0ZTtcclxuICAgICAgICAgIGNvbnRleHQudHJpZ2dlcignZXZlbnQtY29udGV4dC1iZWZvcmUnLCB7Y29udGV4dDogY29udGV4dH0pO1xyXG4gICAgICAgICAgLy8gcnVuIG11bHRpcGxlIGNhbGxiYWNrc1xyXG4gICAgICAgICAgaWYgKHR5cGVvZihyb3V0ZS5jYWxsYmFjaykgPT09IFwiZnVuY3Rpb25cIikge1xyXG4gICAgICAgICAgICByb3V0ZS5jYWxsYmFjayA9IFtyb3V0ZS5jYWxsYmFja107XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAocm91dGUuY2FsbGJhY2sgJiYgcm91dGUuY2FsbGJhY2subGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGkgPSAtMTtcclxuICAgICAgICAgICAgbmV4dFJvdXRlID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgaSsrO1xyXG4gICAgICAgICAgICAgIGlmIChyb3V0ZS5jYWxsYmFja1tpXSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuZWQgPSByb3V0ZS5jYWxsYmFja1tpXS5hcHBseShjb250ZXh0LGNhbGxiYWNrX2FyZ3MpO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXBwLl9vbkNvbXBsZXRlICYmIHR5cGVvZihhcHAuX29uQ29tcGxldGUgPT09IFwiZnVuY3Rpb25cIikpIHtcclxuICAgICAgICAgICAgICAgIGFwcC5fb25Db21wbGV0ZShjb250ZXh0KTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGNhbGxiYWNrX2FyZ3MucHVzaChuZXh0Um91dGUpO1xyXG4gICAgICAgICAgICBuZXh0Um91dGUoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGNvbnRleHQudHJpZ2dlcignZXZlbnQtY29udGV4dC1hZnRlcicsIHtjb250ZXh0OiBjb250ZXh0fSk7XHJcbiAgICAgICAgICByZXR1cm4gcmV0dXJuZWQ7XHJcbiAgICAgICAgfTtcclxuICAgICAgICAkLmVhY2goYXJvdW5kcy5yZXZlcnNlKCksIGZ1bmN0aW9uKGksIGFyb3VuZCkge1xyXG4gICAgICAgICAgdmFyIGxhc3Rfd3JhcHBlZF9yb3V0ZSA9IHdyYXBwZWRfcm91dGU7XHJcbiAgICAgICAgICB3cmFwcGVkX3JvdXRlID0gZnVuY3Rpb24oKSB7IHJldHVybiBhcm91bmQuYXBwbHkoY29udGV4dCwgW2xhc3Rfd3JhcHBlZF9yb3V0ZV0pOyB9O1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBmaW5hbF9yZXR1cm5lZCA9IHdyYXBwZWRfcm91dGUoKTtcclxuICAgICAgICB9IGNhdGNoKGUpIHtcclxuICAgICAgICAgIHRoaXMuZXJyb3IoWyc1MDAgRXJyb3InLCB2ZXJiLCBwYXRoXS5qb2luKCcgJyksIGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmluYWxfcmV0dXJuZWQ7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubm90Rm91bmQodmVyYiwgcGF0aCk7XHJcbiAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLy8gTWF0Y2hlcyBhbiBvYmplY3Qgb2Ygb3B0aW9ucyBhZ2FpbnN0IGFuIGBFdmVudENvbnRleHRgIGxpa2Ugb2JqZWN0IHRoYXRcclxuICAgIC8vIGNvbnRhaW5zIGBwYXRoYCBhbmQgYHZlcmJgIGF0dHJpYnV0ZXMuIEludGVybmFsbHkgU2FtbXkgdXNlcyB0aGlzXHJcbiAgICAvLyBmb3IgbWF0Y2hpbmcgYGJlZm9yZSgpYCBmaWx0ZXJzIGFnYWluc3Qgc3BlY2lmaWMgb3B0aW9ucy4gWW91IGNhbiBzZXQgdGhlXHJcbiAgICAvLyBvYmplY3QgdG8gX29ubHlfIG1hdGNoIGNlcnRhaW4gcGF0aHMgb3IgdmVyYnMsIG9yIG1hdGNoIGFsbCBwYXRocyBvciB2ZXJicyBfZXhjZXB0X1xyXG4gICAgLy8gdGhvc2UgdGhhdCBtYXRjaCB0aGUgb3B0aW9ucy5cclxuICAgIC8vXHJcbiAgICAvLyAjIyMgRXhhbXBsZVxyXG4gICAgLy9cclxuICAgIC8vICAgICB2YXIgYXBwID0gJC5zYW1teSgpLFxyXG4gICAgLy8gICAgICAgICBjb250ZXh0ID0ge3ZlcmI6ICdnZXQnLCBwYXRoOiAnIy9teXBhdGgnfTtcclxuICAgIC8vXHJcbiAgICAvLyAgICAgLy8gbWF0Y2ggYWdhaW5zdCBhIHBhdGggc3RyaW5nXHJcbiAgICAvLyAgICAgYXBwLmNvbnRleHRNYXRjaGVzT3B0aW9ucyhjb250ZXh0LCAnIy9teXBhdGgnKTsgLy89PiB0cnVlXHJcbiAgICAvLyAgICAgYXBwLmNvbnRleHRNYXRjaGVzT3B0aW9ucyhjb250ZXh0LCAnIy9vdGhlcnBhdGgnKTsgLy89PiBmYWxzZVxyXG4gICAgLy8gICAgIC8vIGVxdWl2YWxlbnQgdG9cclxuICAgIC8vICAgICBhcHAuY29udGV4dE1hdGNoZXNPcHRpb25zKGNvbnRleHQsIHtvbmx5OiB7cGF0aDonIy9teXBhdGgnfX0pOyAvLz0+IHRydWVcclxuICAgIC8vICAgICBhcHAuY29udGV4dE1hdGNoZXNPcHRpb25zKGNvbnRleHQsIHtvbmx5OiB7cGF0aDonIy9vdGhlcnBhdGgnfX0pOyAvLz0+IGZhbHNlXHJcbiAgICAvLyAgICAgLy8gbWF0Y2ggYWdhaW5zdCBhIHBhdGggcmVnZXhwXHJcbiAgICAvLyAgICAgYXBwLmNvbnRleHRNYXRjaGVzT3B0aW9ucyhjb250ZXh0LCAvcGF0aC8pOyAvLz0+IHRydWVcclxuICAgIC8vICAgICBhcHAuY29udGV4dE1hdGNoZXNPcHRpb25zKGNvbnRleHQsIC9ecGF0aC8pOyAvLz0+IGZhbHNlXHJcbiAgICAvLyAgICAgLy8gbWF0Y2ggb25seSBhIHZlcmJcclxuICAgIC8vICAgICBhcHAuY29udGV4dE1hdGNoZXNPcHRpb25zKGNvbnRleHQsIHtvbmx5OiB7dmVyYjonZ2V0J319KTsgLy89PiB0cnVlXHJcbiAgICAvLyAgICAgYXBwLmNvbnRleHRNYXRjaGVzT3B0aW9ucyhjb250ZXh0LCB7b25seToge3ZlcmI6J3Bvc3QnfX0pOyAvLz0+IGZhbHNlXHJcbiAgICAvLyAgICAgLy8gbWF0Y2ggYWxsIGV4Y2VwdCBhIHZlcmJcclxuICAgIC8vICAgICBhcHAuY29udGV4dE1hdGNoZXNPcHRpb25zKGNvbnRleHQsIHtleGNlcHQ6IHt2ZXJiOidwb3N0J319KTsgLy89PiB0cnVlXHJcbiAgICAvLyAgICAgYXBwLmNvbnRleHRNYXRjaGVzT3B0aW9ucyhjb250ZXh0LCB7ZXhjZXB0OiB7dmVyYjonZ2V0J319KTsgLy89PiBmYWxzZVxyXG4gICAgLy8gICAgIC8vIG1hdGNoIGFsbCBleGNlcHQgYSBwYXRoXHJcbiAgICAvLyAgICAgYXBwLmNvbnRleHRNYXRjaGVzT3B0aW9ucyhjb250ZXh0LCB7ZXhjZXB0OiB7cGF0aDonIy9vdGhlcnBhdGgnfX0pOyAvLz0+IHRydWVcclxuICAgIC8vICAgICBhcHAuY29udGV4dE1hdGNoZXNPcHRpb25zKGNvbnRleHQsIHtleGNlcHQ6IHtwYXRoOicjL215cGF0aCd9fSk7IC8vPT4gZmFsc2VcclxuICAgIC8vICAgICAvLyBtYXRjaCBhbGwgZXhjZXB0IGEgdmVyYiBhbmQgYSBwYXRoXHJcbiAgICAvLyAgICAgYXBwLmNvbnRleHRNYXRjaGVzT3B0aW9ucyhjb250ZXh0LCB7ZXhjZXB0OiB7cGF0aDonIy9vdGhlcnBhdGgnLCB2ZXJiOidwb3N0J319KTsgLy89PiB0cnVlXHJcbiAgICAvLyAgICAgYXBwLmNvbnRleHRNYXRjaGVzT3B0aW9ucyhjb250ZXh0LCB7ZXhjZXB0OiB7cGF0aDonIy9teXBhdGgnLCB2ZXJiOidwb3N0J319KTsgLy89PiB0cnVlXHJcbiAgICAvLyAgICAgYXBwLmNvbnRleHRNYXRjaGVzT3B0aW9ucyhjb250ZXh0LCB7ZXhjZXB0OiB7cGF0aDonIy9teXBhdGgnLCB2ZXJiOidnZXQnfX0pOyAvLz0+IGZhbHNlXHJcbiAgICAvLyAgICAgLy8gbWF0Y2ggbXVsdGlwbGUgcGF0aHNcclxuICAgIC8vICAgICBhcHAuY29udGV4dE1hdGNoZXNPcHRpb25zKGNvbnRleHQsIHtwYXRoOiBbJyMvbXlwYXRoJywgJyMvb3RoZXJwYXRoJ119KTsgLy89PiB0cnVlXHJcbiAgICAvLyAgICAgYXBwLmNvbnRleHRNYXRjaGVzT3B0aW9ucyhjb250ZXh0LCB7cGF0aDogWycjL290aGVycGF0aCcsICcjL3RoaXJkcGF0aCddfSk7IC8vPT4gZmFsc2VcclxuICAgIC8vICAgICAvLyBlcXVpdmFsZW50IHRvXHJcbiAgICAvLyAgICAgYXBwLmNvbnRleHRNYXRjaGVzT3B0aW9ucyhjb250ZXh0LCB7b25seToge3BhdGg6IFsnIy9teXBhdGgnLCAnIy9vdGhlcnBhdGgnXX19KTsgLy89PiB0cnVlXHJcbiAgICAvLyAgICAgYXBwLmNvbnRleHRNYXRjaGVzT3B0aW9ucyhjb250ZXh0LCB7b25seToge3BhdGg6IFsnIy9vdGhlcnBhdGgnLCAnIy90aGlyZHBhdGgnXX19KTsgLy89PiBmYWxzZVxyXG4gICAgLy8gICAgIC8vIG1hdGNoIGFsbCBleGNlcHQgbXVsdGlwbGUgcGF0aHNcclxuICAgIC8vICAgICBhcHAuY29udGV4dE1hdGNoZXNPcHRpb25zKGNvbnRleHQsIHtleGNlcHQ6IHtwYXRoOiBbJyMvbXlwYXRoJywgJyMvb3RoZXJwYXRoJ119fSk7IC8vPT4gZmFsc2VcclxuICAgIC8vICAgICBhcHAuY29udGV4dE1hdGNoZXNPcHRpb25zKGNvbnRleHQsIHtleGNlcHQ6IHtwYXRoOiBbJyMvb3RoZXJwYXRoJywgJyMvdGhpcmRwYXRoJ119fSk7IC8vPT4gdHJ1ZVxyXG4gICAgLy8gICAgIC8vIG1hdGNoIGFsbCBleGNlcHQgbXVsdGlwbGUgcGF0aHMgYW5kIHZlcmJzXHJcbiAgICAvLyAgICAgYXBwLmNvbnRleHRNYXRjaGVzT3B0aW9ucyhjb250ZXh0LCB7ZXhjZXB0OiB7cGF0aDogWycjL215cGF0aCcsICcjL290aGVycGF0aCddLCB2ZXJiOiBbJ2dldCcsICdwb3N0J119fSk7IC8vPT4gZmFsc2VcclxuICAgIC8vICAgICBhcHAuY29udGV4dE1hdGNoZXNPcHRpb25zKGNvbnRleHQsIHtleGNlcHQ6IHtwYXRoOiBbJyMvb3RoZXJwYXRoJywgJyMvdGhpcmRwYXRoJ10sIHZlcmI6IFsnZ2V0JywgJ3Bvc3QnXX19KTsgLy89PiB0cnVlXHJcbiAgICAvL1xyXG4gICAgY29udGV4dE1hdGNoZXNPcHRpb25zOiBmdW5jdGlvbihjb250ZXh0LCBtYXRjaF9vcHRpb25zLCBwb3NpdGl2ZSkge1xyXG4gICAgICB2YXIgb3B0aW9ucyA9IG1hdGNoX29wdGlvbnM7XHJcbiAgICAgIC8vIG5vcm1hbGl6ZSBvcHRpb25zXHJcbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ3N0cmluZycgfHwgX2lzUmVnRXhwKG9wdGlvbnMpKSB7XHJcbiAgICAgICAgb3B0aW9ucyA9IHtwYXRoOiBvcHRpb25zfTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodHlwZW9mIHBvc2l0aXZlID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIHBvc2l0aXZlID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICAvLyBlbXB0eSBvcHRpb25zIGFsd2F5cyBtYXRjaFxyXG4gICAgICBpZiAoJC5pc0VtcHR5T2JqZWN0KG9wdGlvbnMpKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgLy8gRG8gd2UgaGF2ZSB0byBtYXRjaCBhZ2FpbnN0IG11bHRpcGxlIHBhdGhzP1xyXG4gICAgICBpZiAoX2lzQXJyYXkob3B0aW9ucy5wYXRoKSl7XHJcbiAgICAgICAgdmFyIHJlc3VsdHMsIG51bW9wdCwgb3B0cywgbGVuO1xyXG4gICAgICAgIHJlc3VsdHMgPSBbXTtcclxuICAgICAgICBmb3IgKG51bW9wdCA9IDAsIGxlbiA9IG9wdGlvbnMucGF0aC5sZW5ndGg7IG51bW9wdCA8IGxlbjsgbnVtb3B0ICs9IDEpIHtcclxuICAgICAgICAgIG9wdHMgPSAkLmV4dGVuZCh7fSwgb3B0aW9ucywge3BhdGg6IG9wdGlvbnMucGF0aFtudW1vcHRdfSk7XHJcbiAgICAgICAgICByZXN1bHRzLnB1c2godGhpcy5jb250ZXh0TWF0Y2hlc09wdGlvbnMoY29udGV4dCwgb3B0cykpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgbWF0Y2hlZCA9ICQuaW5BcnJheSh0cnVlLCByZXN1bHRzKSA+IC0xID8gdHJ1ZSA6IGZhbHNlO1xyXG4gICAgICAgIHJldHVybiBwb3NpdGl2ZSA/IG1hdGNoZWQgOiAhbWF0Y2hlZDtcclxuICAgICAgfVxyXG4gICAgICBpZiAob3B0aW9ucy5vbmx5KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGV4dE1hdGNoZXNPcHRpb25zKGNvbnRleHQsIG9wdGlvbnMub25seSwgdHJ1ZSk7XHJcbiAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy5leGNlcHQpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb250ZXh0TWF0Y2hlc09wdGlvbnMoY29udGV4dCwgb3B0aW9ucy5leGNlcHQsIGZhbHNlKTtcclxuICAgICAgfVxyXG4gICAgICB2YXIgcGF0aF9tYXRjaGVkID0gdHJ1ZSwgdmVyYl9tYXRjaGVkID0gdHJ1ZTtcclxuICAgICAgaWYgKG9wdGlvbnMucGF0aCkge1xyXG4gICAgICAgIGlmICghX2lzUmVnRXhwKG9wdGlvbnMucGF0aCkpIHtcclxuICAgICAgICAgIG9wdGlvbnMucGF0aCA9IG5ldyBSZWdFeHAob3B0aW9ucy5wYXRoLnRvU3RyaW5nKCkgKyAnJCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBwYXRoX21hdGNoZWQgPSBvcHRpb25zLnBhdGgudGVzdChjb250ZXh0LnBhdGgpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChvcHRpb25zLnZlcmIpIHtcclxuICAgICAgICBpZih0eXBlb2Ygb3B0aW9ucy52ZXJiID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgdmVyYl9tYXRjaGVkID0gb3B0aW9ucy52ZXJiID09PSBjb250ZXh0LnZlcmI7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHZlcmJfbWF0Y2hlZCA9IG9wdGlvbnMudmVyYi5pbmRleE9mKGNvbnRleHQudmVyYikgPiAtMTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHBvc2l0aXZlID8gKHZlcmJfbWF0Y2hlZCAmJiBwYXRoX21hdGNoZWQpIDogISh2ZXJiX21hdGNoZWQgJiYgcGF0aF9tYXRjaGVkKTtcclxuICAgIH0sXHJcblxyXG5cclxuICAgIC8vIERlbGVnYXRlcyB0byB0aGUgYGxvY2F0aW9uX3Byb3h5YCB0byBnZXQgdGhlIGN1cnJlbnQgbG9jYXRpb24uXHJcbiAgICAvLyBTZWUgYFNhbW15LkRlZmF1bHRMb2NhdGlvblByb3h5YCBmb3IgbW9yZSBpbmZvIG9uIGxvY2F0aW9uIHByb3hpZXMuXHJcbiAgICBnZXRMb2NhdGlvbjogZnVuY3Rpb24oKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLl9sb2NhdGlvbl9wcm94eS5nZXRMb2NhdGlvbigpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBEZWxlZ2F0ZXMgdG8gdGhlIGBsb2NhdGlvbl9wcm94eWAgdG8gc2V0IHRoZSBjdXJyZW50IGxvY2F0aW9uLlxyXG4gICAgLy8gU2VlIGBTYW1teS5EZWZhdWx0TG9jYXRpb25Qcm94eWAgZm9yIG1vcmUgaW5mbyBvbiBsb2NhdGlvbiBwcm94aWVzLlxyXG4gICAgLy9cclxuICAgIC8vICMjIyBBcmd1bWVudHNcclxuICAgIC8vXHJcbiAgICAvLyAqIGBuZXdfbG9jYXRpb25gIEEgbmV3IGxvY2F0aW9uIHN0cmluZyAoZS5nLiAnIy8nKVxyXG4gICAgLy9cclxuICAgIHNldExvY2F0aW9uOiBmdW5jdGlvbihuZXdfbG9jYXRpb24pIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX2xvY2F0aW9uX3Byb3h5LnNldExvY2F0aW9uKG5ld19sb2NhdGlvbik7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIFN3YXBzIHRoZSBjb250ZW50IG9mIGAkZWxlbWVudCgpYCB3aXRoIGBjb250ZW50YFxyXG4gICAgLy8gWW91IGNhbiBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBwcm92aWRlIGFuIGFsdGVybmF0ZSBzd2FwIGJlaGF2aW9yXHJcbiAgICAvLyBmb3IgYEV2ZW50Q29udGV4dC5wYXJ0aWFsKClgLlxyXG4gICAgLy9cclxuICAgIC8vICMjIyBFeGFtcGxlXHJcbiAgICAvL1xyXG4gICAgLy8gICAgICB2YXIgYXBwID0gJC5zYW1teShmdW5jdGlvbigpIHtcclxuICAgIC8vXHJcbiAgICAvLyAgICAgICAgLy8gaW1wbGVtZW50cyBhICdmYWRlIG91dCcvJ2ZhZGUgaW4nXHJcbiAgICAvLyAgICAgICAgdGhpcy5zd2FwID0gZnVuY3Rpb24oY29udGVudCwgY2FsbGJhY2spIHtcclxuICAgIC8vICAgICAgICAgIHZhciBjb250ZXh0ID0gdGhpcztcclxuICAgIC8vICAgICAgICAgIGNvbnRleHQuJGVsZW1lbnQoKS5mYWRlT3V0KCdzbG93JywgZnVuY3Rpb24oKSB7XHJcbiAgICAvLyAgICAgICAgICAgIGNvbnRleHQuJGVsZW1lbnQoKS5odG1sKGNvbnRlbnQpO1xyXG4gICAgLy8gICAgICAgICAgICBjb250ZXh0LiRlbGVtZW50KCkuZmFkZUluKCdzbG93JywgZnVuY3Rpb24oKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICBjYWxsYmFjay5hcHBseSgpO1xyXG4gICAgLy8gICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgICAgfSk7XHJcbiAgICAvLyAgICAgICAgICB9KTtcclxuICAgIC8vICAgICAgICB9O1xyXG4gICAgLy9cclxuICAgIC8vICAgICAgfSk7XHJcbiAgICAvL1xyXG4gICAgc3dhcDogZnVuY3Rpb24oY29udGVudCwgY2FsbGJhY2spIHtcclxuICAgICAgdmFyICRlbCA9IHRoaXMuJGVsZW1lbnQoKS5odG1sKGNvbnRlbnQpO1xyXG4gICAgICBpZiAoX2lzRnVuY3Rpb24oY2FsbGJhY2spKSB7IGNhbGxiYWNrKGNvbnRlbnQpOyB9XHJcbiAgICAgIHJldHVybiAkZWw7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIGEgc2ltcGxlIGdsb2JhbCBjYWNoZSBmb3IgdGVtcGxhdGVzLiBVc2VzIHRoZSBzYW1lIHNlbWFudGljcyBhc1xyXG4gICAgLy8gYFNhbW15LkNhY2hlYCBhbmQgYFNhbW15LlN0b3JhZ2VgIHNvIGNhbiBlYXNpbHkgYmUgcmVwbGFjZWQgd2l0aFxyXG4gICAgLy8gYSBwZXJzaXN0ZW50IHN0b3JhZ2UgdGhhdCBsYXN0cyBiZXlvbmQgdGhlIGN1cnJlbnQgcmVxdWVzdC5cclxuICAgIHRlbXBsYXRlQ2FjaGU6IGZ1bmN0aW9uKGtleSwgdmFsdWUpIHtcclxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIHJldHVybiBfdGVtcGxhdGVfY2FjaGVba2V5XSA9IHZhbHVlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBfdGVtcGxhdGVfY2FjaGVba2V5XTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvLyBjbGVhciB0aGUgdGVtcGxhdGVDYWNoZVxyXG4gICAgY2xlYXJUZW1wbGF0ZUNhY2hlOiBmdW5jdGlvbigpIHtcclxuICAgICAgcmV0dXJuIChfdGVtcGxhdGVfY2FjaGUgPSB7fSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIFRoaXMgdGhyb3dzIGEgJzQwNCBOb3QgRm91bmQnIGVycm9yIGJ5IGludm9raW5nIGBlcnJvcigpYC5cclxuICAgIC8vIE92ZXJyaWRlIHRoaXMgbWV0aG9kIG9yIGBlcnJvcigpYCB0byBwcm92aWRlIGN1c3RvbVxyXG4gICAgLy8gNDA0IGJlaGF2aW9yIChpLmUgcmVkaXJlY3RpbmcgdG8gLyBvciBzaG93aW5nIGEgd2FybmluZylcclxuICAgIG5vdEZvdW5kOiBmdW5jdGlvbih2ZXJiLCBwYXRoKSB7XHJcbiAgICAgIHZhciByZXQgPSB0aGlzLmVycm9yKFsnNDA0IE5vdCBGb3VuZCcsIHZlcmIsIHBhdGhdLmpvaW4oJyAnKSk7XHJcbiAgICAgIHJldHVybiAodmVyYiA9PT0gJ2dldCcpID8gcmV0IDogdHJ1ZTtcclxuICAgIH0sXHJcblxyXG4gICAgLy8gVGhlIGJhc2UgZXJyb3IgaGFuZGxlciB0YWtlcyBhIHN0cmluZyBgbWVzc2FnZWAgYW5kIGFuIGBFcnJvcmBcclxuICAgIC8vIG9iamVjdC4gSWYgYHJhaXNlX2Vycm9yc2AgaXMgc2V0IHRvIGB0cnVlYCBvbiB0aGUgYXBwIGxldmVsLFxyXG4gICAgLy8gdGhpcyB3aWxsIHJlLXRocm93IHRoZSBlcnJvciB0byB0aGUgYnJvd3Nlci4gT3RoZXJ3aXNlIGl0IHdpbGwgc2VuZCB0aGUgZXJyb3JcclxuICAgIC8vIHRvIGBsb2coKWAuIE92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHByb3ZpZGUgY3VzdG9tIGVycm9yIGhhbmRsaW5nXHJcbiAgICAvLyBlLmcgbG9nZ2luZyB0byBhIHNlcnZlciBzaWRlIGNvbXBvbmVudCBvciBkaXNwbGF5aW5nIHNvbWUgZmVlZGJhY2sgdG8gdGhlXHJcbiAgICAvLyB1c2VyLlxyXG4gICAgZXJyb3I6IGZ1bmN0aW9uKG1lc3NhZ2UsIG9yaWdpbmFsX2Vycm9yKSB7XHJcbiAgICAgIGlmICghb3JpZ2luYWxfZXJyb3IpIHsgb3JpZ2luYWxfZXJyb3IgPSBuZXcgRXJyb3IoKTsgfVxyXG4gICAgICBvcmlnaW5hbF9lcnJvci5tZXNzYWdlID0gW21lc3NhZ2UsIG9yaWdpbmFsX2Vycm9yLm1lc3NhZ2VdLmpvaW4oJyAnKTtcclxuICAgICAgdGhpcy50cmlnZ2VyKCdlcnJvcicsIHttZXNzYWdlOiBvcmlnaW5hbF9lcnJvci5tZXNzYWdlLCBlcnJvcjogb3JpZ2luYWxfZXJyb3J9KTtcclxuICAgICAgaWYgKHRoaXMucmFpc2VfZXJyb3JzKSB7XHJcbiAgICAgICAgdGhyb3cob3JpZ2luYWxfZXJyb3IpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMubG9nKG9yaWdpbmFsX2Vycm9yLm1lc3NhZ2UsIG9yaWdpbmFsX2Vycm9yKTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICBfY2hlY2tMb2NhdGlvbjogZnVuY3Rpb24oKSB7XHJcbiAgICAgIHZhciBsb2NhdGlvbiwgcmV0dXJuZWQ7XHJcbiAgICAgIC8vIGdldCBjdXJyZW50IGxvY2F0aW9uXHJcbiAgICAgIGxvY2F0aW9uID0gdGhpcy5nZXRMb2NhdGlvbigpO1xyXG4gICAgICAvLyBjb21wYXJlIHRvIHNlZSBpZiBoYXNoIGhhcyBjaGFuZ2VkXHJcbiAgICAgIGlmICghdGhpcy5sYXN0X2xvY2F0aW9uIHx8IHRoaXMubGFzdF9sb2NhdGlvblswXSAhPSAnZ2V0JyB8fCB0aGlzLmxhc3RfbG9jYXRpb25bMV0gIT0gbG9jYXRpb24pIHtcclxuICAgICAgICAvLyByZXNldCBsYXN0IGxvY2F0aW9uXHJcbiAgICAgICAgdGhpcy5sYXN0X2xvY2F0aW9uID0gWydnZXQnLCBsb2NhdGlvbl07XHJcbiAgICAgICAgLy8gbG9va3VwIHJvdXRlIGZvciBjdXJyZW50IGhhc2hcclxuICAgICAgICByZXR1cm5lZCA9IHRoaXMucnVuUm91dGUoJ2dldCcsIGxvY2F0aW9uKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gcmV0dXJuZWQ7XHJcbiAgICB9LFxyXG5cclxuICAgIF9nZXRGb3JtVmVyYjogZnVuY3Rpb24oZm9ybSkge1xyXG4gICAgICB2YXIgJGZvcm0gPSAkKGZvcm0pLCB2ZXJiLCAkX21ldGhvZDtcclxuICAgICAgJF9tZXRob2QgPSAkZm9ybS5maW5kKCdpbnB1dFtuYW1lPVwiX21ldGhvZFwiXScpO1xyXG4gICAgICBpZiAoJF9tZXRob2QubGVuZ3RoID4gMCkgeyB2ZXJiID0gJF9tZXRob2QudmFsKCk7IH1cclxuICAgICAgaWYgKCF2ZXJiKSB7IHZlcmIgPSAkZm9ybVswXS5nZXRBdHRyaWJ1dGUoJ21ldGhvZCcpOyB9XHJcbiAgICAgIGlmICghdmVyYiB8fCB2ZXJiID09PSAnJykgeyB2ZXJiID0gJ2dldCc7IH1cclxuICAgICAgcmV0dXJuICQudHJpbSh2ZXJiLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSk7XHJcbiAgICB9LFxyXG5cclxuICAgIF9jaGVja0Zvcm1TdWJtaXNzaW9uOiBmdW5jdGlvbihmb3JtKSB7XHJcbiAgICAgIHZhciAkZm9ybSwgcGF0aCwgdmVyYiwgcGFyYW1zLCByZXR1cm5lZDtcclxuICAgICAgdGhpcy50cmlnZ2VyKCdjaGVjay1mb3JtLXN1Ym1pc3Npb24nLCB7Zm9ybTogZm9ybX0pO1xyXG4gICAgICAkZm9ybSA9ICQoZm9ybSk7XHJcbiAgICAgIHBhdGggID0gJGZvcm0uYXR0cignYWN0aW9uJykgfHwgJyc7XHJcbiAgICAgIHZlcmIgID0gdGhpcy5fZ2V0Rm9ybVZlcmIoJGZvcm0pO1xyXG5cclxuICAgICAgaWYgKHRoaXMuZGVidWcpIHtcclxuICAgICAgICB0aGlzLmxvZygnX2NoZWNrRm9ybVN1Ym1pc3Npb24nLCAkZm9ybSwgcGF0aCwgdmVyYik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh2ZXJiID09PSAnZ2V0Jykge1xyXG4gICAgICAgIHBhcmFtcyA9IHRoaXMuX3NlcmlhbGl6ZUZvcm1QYXJhbXMoJGZvcm0pO1xyXG4gICAgICAgIGlmIChwYXJhbXMgIT09ICcnKSB7IHBhdGggKz0gJz8nICsgcGFyYW1zOyB9XHJcbiAgICAgICAgdGhpcy5zZXRMb2NhdGlvbihwYXRoKTtcclxuICAgICAgICByZXR1cm5lZCA9IGZhbHNlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHBhcmFtcyA9ICQuZXh0ZW5kKHt9LCB0aGlzLl9wYXJzZUZvcm1QYXJhbXMoJGZvcm0pKTtcclxuICAgICAgICByZXR1cm5lZCA9IHRoaXMucnVuUm91dGUodmVyYiwgcGF0aCwgcGFyYW1zLCBmb3JtLmdldCgwKSk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuICh0eXBlb2YgcmV0dXJuZWQgPT0gJ3VuZGVmaW5lZCcpID8gZmFsc2UgOiByZXR1cm5lZDtcclxuICAgIH0sXHJcblxyXG4gICAgX3NlcmlhbGl6ZUZvcm1QYXJhbXM6IGZ1bmN0aW9uKCRmb3JtKSB7XHJcbiAgICAgICB2YXIgcXVlcnlTdHJpbmcgPSBcIlwiLFxyXG4gICAgICAgICBmaWVsZHMgPSAkZm9ybS5zZXJpYWxpemVBcnJheSgpLFxyXG4gICAgICAgICBpO1xyXG4gICAgICAgaWYgKGZpZWxkcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgIHF1ZXJ5U3RyaW5nID0gdGhpcy5fZW5jb2RlRm9ybVBhaXIoZmllbGRzWzBdLm5hbWUsIGZpZWxkc1swXS52YWx1ZSk7XHJcbiAgICAgICAgIGZvciAoaSA9IDE7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICBxdWVyeVN0cmluZyA9IHF1ZXJ5U3RyaW5nICsgXCImXCIgKyB0aGlzLl9lbmNvZGVGb3JtUGFpcihmaWVsZHNbaV0ubmFtZSwgZmllbGRzW2ldLnZhbHVlKTtcclxuICAgICAgICAgfVxyXG4gICAgICAgfVxyXG4gICAgICAgcmV0dXJuIHF1ZXJ5U3RyaW5nO1xyXG4gICAgfSxcclxuXHJcbiAgICBfZW5jb2RlRm9ybVBhaXI6IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKXtcclxuICAgICAgcmV0dXJuIF9lbmNvZGUobmFtZSkgKyBcIj1cIiArIF9lbmNvZGUodmFsdWUpO1xyXG4gICAgfSxcclxuXHJcbiAgICBfcGFyc2VGb3JtUGFyYW1zOiBmdW5jdGlvbigkZm9ybSkge1xyXG4gICAgICB2YXIgcGFyYW1zID0ge30sXHJcbiAgICAgICAgICBmb3JtX2ZpZWxkcyA9ICRmb3JtLnNlcmlhbGl6ZUFycmF5KCksXHJcbiAgICAgICAgICBpO1xyXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgZm9ybV9maWVsZHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBwYXJhbXMgPSB0aGlzLl9wYXJzZVBhcmFtUGFpcihwYXJhbXMsIGZvcm1fZmllbGRzW2ldLm5hbWUsIGZvcm1fZmllbGRzW2ldLnZhbHVlKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gcGFyYW1zO1xyXG4gICAgfSxcclxuXHJcbiAgICBfcGFyc2VRdWVyeVN0cmluZzogZnVuY3Rpb24ocGF0aCkge1xyXG4gICAgICB2YXIgcGFyYW1zID0ge30sIHBhcnRzLCBwYWlycywgcGFpciwgaTtcclxuXHJcbiAgICAgIHBhcnRzID0gcGF0aC5tYXRjaChRVUVSWV9TVFJJTkdfTUFUQ0hFUik7XHJcbiAgICAgIGlmIChwYXJ0cyAmJiBwYXJ0c1sxXSkge1xyXG4gICAgICAgIHBhaXJzID0gcGFydHNbMV0uc3BsaXQoJyYnKTtcclxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGFpcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIHBhaXIgPSBwYWlyc1tpXS5zcGxpdCgnPScpO1xyXG4gICAgICAgICAgcGFyYW1zID0gdGhpcy5fcGFyc2VQYXJhbVBhaXIocGFyYW1zLCBfZGVjb2RlKHBhaXJbMF0pLCBfZGVjb2RlKHBhaXJbMV0gfHwgXCJcIikpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gcGFyYW1zO1xyXG4gICAgfSxcclxuXHJcbiAgICBfcGFyc2VQYXJhbVBhaXI6IGZ1bmN0aW9uKHBhcmFtcywga2V5LCB2YWx1ZSkge1xyXG4gICAgICBpZiAodHlwZW9mIHBhcmFtc1trZXldICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIGlmIChfaXNBcnJheShwYXJhbXNba2V5XSkpIHtcclxuICAgICAgICAgIHBhcmFtc1trZXldLnB1c2godmFsdWUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBwYXJhbXNba2V5XSA9IFtwYXJhbXNba2V5XSwgdmFsdWVdO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBwYXJhbXNba2V5XSA9IHZhbHVlO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBwYXJhbXM7XHJcbiAgICB9LFxyXG5cclxuICAgIF9saXN0ZW46IGZ1bmN0aW9uKG5hbWUsIGNhbGxiYWNrKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLiRlbGVtZW50KCkuYmluZChbbmFtZSwgdGhpcy5ldmVudE5hbWVzcGFjZSgpXS5qb2luKCcuJyksIGNhbGxiYWNrKTtcclxuICAgIH0sXHJcblxyXG4gICAgX3VubGlzdGVuOiBmdW5jdGlvbihuYW1lLCBjYWxsYmFjaykge1xyXG4gICAgICByZXR1cm4gdGhpcy4kZWxlbWVudCgpLnVuYmluZChbbmFtZSwgdGhpcy5ldmVudE5hbWVzcGFjZSgpXS5qb2luKCcuJyksIGNhbGxiYWNrKTtcclxuICAgIH1cclxuXHJcbiAgfSk7XHJcblxyXG4gIC8vIGBTYW1teS5SZW5kZXJDb250ZXh0YCBpcyBhbiBvYmplY3QgdGhhdCBtYWtlcyBzZXF1ZW50aWFsIHRlbXBsYXRlIGxvYWRpbmcsXHJcbiAgLy8gcmVuZGVyaW5nIGFuZCBpbnRlcnBvbGF0aW9uIHNlYW1sZXNzIGV2ZW4gd2hlbiBkZWFsaW5nIHdpdGggYXN5bmNocm9ub3VzXHJcbiAgLy8gb3BlcmF0aW9ucy5cclxuICAvL1xyXG4gIC8vIGBSZW5kZXJDb250ZXh0YCBvYmplY3RzIGFyZSBub3QgdXN1YWxseSBjcmVhdGVkIGRpcmVjdGx5LCByYXRoZXIgdGhleSBhcmVcclxuICAvLyBpbnN0YW50aWF0ZWQgZnJvbSBhbiBgU2FtbXkuRXZlbnRDb250ZXh0YCBieSB1c2luZyBgcmVuZGVyKClgLCBgbG9hZCgpYCBvclxyXG4gIC8vIGBwYXJ0aWFsKClgIHdoaWNoIGFsbCByZXR1cm4gYFJlbmRlckNvbnRleHRgIG9iamVjdHMuXHJcbiAgLy9cclxuICAvLyBgUmVuZGVyQ29udGV4dGAgbWV0aG9kcyBhbHdheXMgcmV0dXJucyBhIG1vZGlmaWVkIGBSZW5kZXJDb250ZXh0YFxyXG4gIC8vIGZvciBjaGFpbmluZyAobGlrZSBqUXVlcnkgaXRzZWxmKS5cclxuICAvL1xyXG4gIC8vIFRoZSBjb3JlIG1hZ2ljIGlzIGluIHRoZSBgdGhlbigpYCBtZXRob2Qgd2hpY2ggcHV0cyB0aGUgY2FsbGJhY2sgcGFzc2VkIGFzXHJcbiAgLy8gYW4gYXJndW1lbnQgaW50byBhIHF1ZXVlIHRvIGJlIGV4ZWN1dGVkIG9uY2UgdGhlIHByZXZpb3VzIGNhbGxiYWNrIGlzIGNvbXBsZXRlLlxyXG4gIC8vIEFsbCB0aGUgbWV0aG9kcyBvZiBgUmVuZGVyQ29udGV4dGAgYXJlIHdyYXBwZWQgaW4gYHRoZW4oKWAgd2hpY2ggYWxsb3dzIHlvdVxyXG4gIC8vIHRvIHF1ZXVlIHVwIG1ldGhvZHMgYnkgY2hhaW5pbmcsIGJ1dCBtYWludGFpbmluZyBhIGd1YXJhbnRlZWQgZXhlY3V0aW9uIG9yZGVyXHJcbiAgLy8gZXZlbiB3aXRoIHJlbW90ZSBjYWxscyB0byBmZXRjaCB0ZW1wbGF0ZXMuXHJcbiAgLy9cclxuICBTYW1teS5SZW5kZXJDb250ZXh0ID0gZnVuY3Rpb24oZXZlbnRfY29udGV4dCkge1xyXG4gICAgdGhpcy5ldmVudF9jb250ZXh0ICAgID0gZXZlbnRfY29udGV4dDtcclxuICAgIHRoaXMuY2FsbGJhY2tzICAgICAgICA9IFtdO1xyXG4gICAgdGhpcy5wcmV2aW91c19jb250ZW50ID0gbnVsbDtcclxuICAgIHRoaXMuY29udGVudCAgICAgICAgICA9IG51bGw7XHJcbiAgICB0aGlzLm5leHRfZW5naW5lICAgICAgPSBmYWxzZTtcclxuICAgIHRoaXMud2FpdGluZyAgICAgICAgICA9IGZhbHNlO1xyXG4gIH07XHJcblxyXG4gIFNhbW15LlJlbmRlckNvbnRleHQucHJvdG90eXBlID0gJC5leHRlbmQoe30sIFNhbW15Lk9iamVjdC5wcm90b3R5cGUsIHtcclxuXHJcbiAgICAvLyBUaGUgXCJjb3JlXCIgb2YgdGhlIGBSZW5kZXJDb250ZXh0YCBvYmplY3QsIGFkZHMgdGhlIGBjYWxsYmFja2AgdG8gdGhlXHJcbiAgICAvLyBxdWV1ZS4gSWYgdGhlIGNvbnRleHQgaXMgYHdhaXRpbmdgIChtZWFuaW5nIGFuIGFzeW5jIG9wZXJhdGlvbiBpcyBoYXBwZW5pbmcpXHJcbiAgICAvLyB0aGVuIHRoZSBjYWxsYmFjayB3aWxsIGJlIGV4ZWN1dGVkIGluIG9yZGVyLCBvbmNlIHRoZSBvdGhlciBvcGVyYXRpb25zIGFyZVxyXG4gICAgLy8gY29tcGxldGUuIElmIHRoZXJlIGlzIG5vIGN1cnJlbnRseSBleGVjdXRpbmcgb3BlcmF0aW9uLCB0aGUgYGNhbGxiYWNrYFxyXG4gICAgLy8gaXMgZXhlY3V0ZWQgaW1tZWRpYXRlbHkuXHJcbiAgICAvL1xyXG4gICAgLy8gVGhlIHZhbHVlIHJldHVybmVkIGZyb20gdGhlIGNhbGxiYWNrIGlzIHN0b3JlZCBpbiBgY29udGVudGAgZm9yIHRoZVxyXG4gICAgLy8gc3Vic2VxdWVudCBvcGVyYXRpb24uIElmIHlvdSByZXR1cm4gYGZhbHNlYCwgdGhlIHF1ZXVlIHdpbGwgcGF1c2UsIGFuZFxyXG4gICAgLy8gdGhlIG5leHQgY2FsbGJhY2sgaW4gdGhlIHF1ZXVlIHdpbGwgbm90IGJlIGV4ZWN1dGVkIHVudGlsIGBuZXh0KClgIGlzXHJcbiAgICAvLyBjYWxsZWQuIFRoaXMgYWxsb3dzIGZvciB0aGUgZ3VhcmFudGVlZCBvcmRlciBvZiBleGVjdXRpb24gd2hpbGUgd29ya2luZ1xyXG4gICAgLy8gd2l0aCBhc3luYyBvcGVyYXRpb25zLlxyXG4gICAgLy9cclxuICAgIC8vIElmIHRoZW4oKSBpcyBwYXNzZWQgYSBzdHJpbmcgaW5zdGVhZCBvZiBhIGZ1bmN0aW9uLCB0aGUgc3RyaW5nIGlzIGxvb2tlZFxyXG4gICAgLy8gdXAgYXMgYSBoZWxwZXIgbWV0aG9kIG9uIHRoZSBldmVudCBjb250ZXh0LlxyXG4gICAgLy9cclxuICAgIC8vICMjIyBFeGFtcGxlXHJcbiAgICAvL1xyXG4gICAgLy8gICAgICB0aGlzLmdldCgnIy8nLCBmdW5jdGlvbigpIHtcclxuICAgIC8vICAgICAgICAvLyBpbml0aWFsaXplIHRoZSBSZW5kZXJDb250ZXh0XHJcbiAgICAvLyAgICAgICAgLy8gRXZlbiB0aG91Z2ggYGxvYWQoKWAgZXhlY3V0ZXMgYXN5bmMsIHRoZSBuZXh0IGB0aGVuKClgXHJcbiAgICAvLyAgICAgICAgLy8gd29udCBleGVjdXRlIHVudGlsIHRoZSBsb2FkIGZpbmlzaGVzXHJcbiAgICAvLyAgICAgICAgdGhpcy5sb2FkKCdteWZpbGUudHh0JylcclxuICAgIC8vICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24oY29udGVudCkge1xyXG4gICAgLy8gICAgICAgICAgICAgIC8vIHRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGVuIGlzIHRoZSBjb250ZW50IG9mIHRoZVxyXG4gICAgLy8gICAgICAgICAgICAgIC8vIHByZXYgb3BlcmF0aW9uXHJcbiAgICAvLyAgICAgICAgICAgICAgJCgnI21haW4nKS5odG1sKGNvbnRlbnQpO1xyXG4gICAgLy8gICAgICAgICAgICB9KTtcclxuICAgIC8vICAgICAgfSk7XHJcbiAgICAvL1xyXG4gICAgdGhlbjogZnVuY3Rpb24oY2FsbGJhY2spIHtcclxuICAgICAgaWYgKCFfaXNGdW5jdGlvbihjYWxsYmFjaykpIHtcclxuICAgICAgICAvLyBpZiBhIHN0cmluZyBpcyBwYXNzZWQgdG8gdGhlbiwgYXNzdW1lIHdlIHdhbnQgdG8gY2FsbFxyXG4gICAgICAgIC8vIGEgaGVscGVyIG9uIHRoZSBldmVudCBjb250ZXh0IGluIGl0cyBjb250ZXh0XHJcbiAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ3N0cmluZycgJiYgY2FsbGJhY2sgaW4gdGhpcy5ldmVudF9jb250ZXh0KSB7XHJcbiAgICAgICAgICB2YXIgaGVscGVyID0gdGhpcy5ldmVudF9jb250ZXh0W2NhbGxiYWNrXTtcclxuICAgICAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24oY29udGVudCkge1xyXG4gICAgICAgICAgICByZXR1cm4gaGVscGVyLmFwcGx5KHRoaXMuZXZlbnRfY29udGV4dCwgW2NvbnRlbnRdKTtcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICB2YXIgY29udGV4dCA9IHRoaXM7XHJcbiAgICAgIGlmICh0aGlzLndhaXRpbmcpIHtcclxuICAgICAgICB0aGlzLmNhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLndhaXQoKTtcclxuICAgICAgICB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpIHtcclxuICAgICAgICAgIHZhciByZXR1cm5lZCA9IGNhbGxiYWNrLmFwcGx5KGNvbnRleHQsIFtjb250ZXh0LmNvbnRlbnQsIGNvbnRleHQucHJldmlvdXNfY29udGVudF0pO1xyXG4gICAgICAgICAgaWYgKHJldHVybmVkICE9PSBmYWxzZSkge1xyXG4gICAgICAgICAgICBjb250ZXh0Lm5leHQocmV0dXJuZWQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sIDApO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBQYXVzZSB0aGUgYFJlbmRlckNvbnRleHRgIHF1ZXVlLiBDb21iaW5lZCB3aXRoIGBuZXh0KClgIGFsbG93cyBmb3IgYXN5bmNcclxuICAgIC8vIG9wZXJhdGlvbnMuXHJcbiAgICAvL1xyXG4gICAgLy8gIyMjIEV4YW1wbGVcclxuICAgIC8vXHJcbiAgICAvLyAgICAgICAgdGhpcy5nZXQoJyMvJywgZnVuY3Rpb24oKSB7XHJcbiAgICAvLyAgICAgICAgICB0aGlzLmxvYWQoJ215dGV4dC5qc29uJylcclxuICAgIC8vICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbihjb250ZW50KSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICB2YXIgY29udGV4dCA9IHRoaXMsXHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgZGF0YSAgICA9IEpTT04ucGFyc2UoY29udGVudCk7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAvLyBwYXVzZSBleGVjdXRpb25cclxuICAgIC8vICAgICAgICAgICAgICAgIGNvbnRleHQud2FpdCgpO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgLy8gcG9zdCB0byBhIHVybFxyXG4gICAgLy8gICAgICAgICAgICAgICAgJC5wb3N0KGRhdGEudXJsLCB7fSwgZnVuY3Rpb24ocmVzcG9uc2UpIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgY29udGV4dC5uZXh0KEpTT04ucGFyc2UocmVzcG9uc2UpKTtcclxuICAgIC8vICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgLy8gICAgICAgICAgICAgIH0pXHJcbiAgICAvLyAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24oZGF0YSkge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgLy8gZGF0YSBpcyBqc29uIGZyb20gdGhlIHByZXZpb3VzIHBvc3RcclxuICAgIC8vICAgICAgICAgICAgICAgICQoJyNtZXNzYWdlJykudGV4dChkYXRhLnN0YXR1cyk7XHJcbiAgICAvLyAgICAgICAgICAgICAgfSk7XHJcbiAgICAvLyAgICAgICAgfSk7XHJcbiAgICB3YWl0OiBmdW5jdGlvbigpIHtcclxuICAgICAgdGhpcy53YWl0aW5nID0gdHJ1ZTtcclxuICAgIH0sXHJcblxyXG4gICAgLy8gUmVzdW1lIHRoZSBxdWV1ZSwgc2V0dGluZyBgY29udGVudGAgdG8gYmUgdXNlZCBpbiB0aGUgbmV4dCBvcGVyYXRpb24uXHJcbiAgICAvLyBTZWUgYHdhaXQoKWAgZm9yIGFuIGV4YW1wbGUuXHJcbiAgICBuZXh0OiBmdW5jdGlvbihjb250ZW50KSB7XHJcbiAgICAgIHRoaXMud2FpdGluZyA9IGZhbHNlO1xyXG4gICAgICBpZiAodHlwZW9mIGNvbnRlbnQgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgdGhpcy5wcmV2aW91c19jb250ZW50ID0gdGhpcy5jb250ZW50O1xyXG4gICAgICAgIHRoaXMuY29udGVudCA9IGNvbnRlbnQ7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMuY2FsbGJhY2tzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICB0aGlzLnRoZW4odGhpcy5jYWxsYmFja3Muc2hpZnQoKSk7XHJcbiAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLy8gTG9hZCBhIHRlbXBsYXRlIGludG8gdGhlIGNvbnRleHQuXHJcbiAgICAvLyBUaGUgYGxvY2F0aW9uYCBjYW4gZWl0aGVyIGJlIGEgc3RyaW5nIHNwZWNpZnlpbmcgdGhlIHJlbW90ZSBwYXRoIHRvIHRoZVxyXG4gICAgLy8gZmlsZSwgYSBqUXVlcnkgb2JqZWN0LCBvciBhIERPTSBlbGVtZW50LlxyXG4gICAgLy9cclxuICAgIC8vIE5vIGludGVycG9sYXRpb24gaGFwcGVucyBieSBkZWZhdWx0LCB0aGUgY29udGVudCBpcyBzdG9yZWQgaW5cclxuICAgIC8vIGBjb250ZW50YC5cclxuICAgIC8vXHJcbiAgICAvLyBJbiB0aGUgY2FzZSBvZiBhIHBhdGgsIHVubGVzcyB0aGUgb3B0aW9uIGB7Y2FjaGU6IGZhbHNlfWAgaXMgcGFzc2VkIHRoZVxyXG4gICAgLy8gZGF0YSBpcyBzdG9yZWQgaW4gdGhlIGFwcCdzIGB0ZW1wbGF0ZUNhY2hlKClgLlxyXG4gICAgLy9cclxuICAgIC8vIElmIGEgalF1ZXJ5IG9yIERPTSBvYmplY3QgaXMgcGFzc2VkIHRoZSBgaW5uZXJIVE1MYCBvZiB0aGUgbm9kZSBpcyBwdWxsZWQgaW4uXHJcbiAgICAvLyBUaGlzIGlzIHVzZWZ1bCBmb3IgbmVzdGluZyB0ZW1wbGF0ZXMgYXMgcGFydCBvZiB0aGUgaW5pdGlhbCBwYWdlIGxvYWQgd3JhcHBlZFxyXG4gICAgLy8gaW4gaW52aXNpYmxlIGVsZW1lbnRzIG9yIGA8c2NyaXB0PmAgdGFncy4gV2l0aCB0ZW1wbGF0ZSBwYXRocywgdGhlIHRlbXBsYXRlXHJcbiAgICAvLyBlbmdpbmUgaXMgbG9va2VkIHVwIGJ5IHRoZSBleHRlbnNpb24uIEZvciBET00valF1ZXJ5IGVtYmVkZGVkIHRlbXBsYXRlcyxcclxuICAgIC8vIHRoaXMgaXNudCBwb3NzaWJsZSwgc28gdGhlcmUgYXJlIGEgY291cGxlIG9mIG9wdGlvbnM6XHJcbiAgICAvL1xyXG4gICAgLy8gICogcGFzcyBhbiBge2VuZ2luZTp9YCBvcHRpb24uXHJcbiAgICAvLyAgKiBkZWZpbmUgdGhlIGVuZ2luZSBpbiB0aGUgYGRhdGEtZW5naW5lYCBhdHRyaWJ1dGUgb2YgdGhlIHBhc3NlZCBub2RlLlxyXG4gICAgLy8gICoganVzdCBzdG9yZSB0aGUgcmF3IHRlbXBsYXRlIGRhdGEgYW5kIHVzZSBgaW50ZXJwb2xhdGUoKWAgbWFudWFsbHlcclxuICAgIC8vXHJcbiAgICAvLyBJZiBhIGBjYWxsYmFja2AgaXMgcGFzc2VkIGl0IGlzIGV4ZWN1dGVkIGFmdGVyIHRoZSB0ZW1wbGF0ZSBsb2FkLlxyXG4gICAgbG9hZDogZnVuY3Rpb24obG9jYXRpb24sIG9wdGlvbnMsIGNhbGxiYWNrKSB7XHJcbiAgICAgIHZhciBjb250ZXh0ID0gdGhpcztcclxuICAgICAgcmV0dXJuIHRoaXMudGhlbihmdW5jdGlvbigpIHtcclxuICAgICAgICB2YXIgc2hvdWxkX2NhY2hlLCBjYWNoZWQsIGlzX2pzb24sIGxvY2F0aW9uX2FycmF5O1xyXG4gICAgICAgIGlmIChfaXNGdW5jdGlvbihvcHRpb25zKSkge1xyXG4gICAgICAgICAgY2FsbGJhY2sgPSBvcHRpb25zO1xyXG4gICAgICAgICAgb3B0aW9ucyA9IHt9O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBvcHRpb25zID0gJC5leHRlbmQoe30sIG9wdGlvbnMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY2FsbGJhY2spIHsgdGhpcy50aGVuKGNhbGxiYWNrKTsgfVxyXG4gICAgICAgIGlmICh0eXBlb2YgbG9jYXRpb24gPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAvLyBpdCdzIGEgcGF0aFxyXG4gICAgICAgICAgaXNfanNvbiAgICAgID0gKGxvY2F0aW9uLm1hdGNoKC9cXC5qc29uKFxcP3wkKS8pIHx8IG9wdGlvbnMuanNvbik7XHJcbiAgICAgICAgICBzaG91bGRfY2FjaGUgPSBpc19qc29uID8gb3B0aW9ucy5jYWNoZSA9PT0gdHJ1ZSA6IG9wdGlvbnMuY2FjaGUgIT09IGZhbHNlO1xyXG4gICAgICAgICAgY29udGV4dC5uZXh0X2VuZ2luZSA9IGNvbnRleHQuZXZlbnRfY29udGV4dC5lbmdpbmVGb3IobG9jYXRpb24pO1xyXG4gICAgICAgICAgZGVsZXRlIG9wdGlvbnMuY2FjaGU7XHJcbiAgICAgICAgICBkZWxldGUgb3B0aW9ucy5qc29uO1xyXG4gICAgICAgICAgaWYgKG9wdGlvbnMuZW5naW5lKSB7XHJcbiAgICAgICAgICAgIGNvbnRleHQubmV4dF9lbmdpbmUgPSBvcHRpb25zLmVuZ2luZTtcclxuICAgICAgICAgICAgZGVsZXRlIG9wdGlvbnMuZW5naW5lO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKHNob3VsZF9jYWNoZSAmJiAoY2FjaGVkID0gdGhpcy5ldmVudF9jb250ZXh0LmFwcC50ZW1wbGF0ZUNhY2hlKGxvY2F0aW9uKSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMud2FpdCgpO1xyXG4gICAgICAgICAgJC5hamF4KCQuZXh0ZW5kKHtcclxuICAgICAgICAgICAgdXJsOiBsb2NhdGlvbixcclxuICAgICAgICAgICAgZGF0YToge30sXHJcbiAgICAgICAgICAgIGRhdGFUeXBlOiBpc19qc29uID8gJ2pzb24nIDogJ3RleHQnLFxyXG4gICAgICAgICAgICB0eXBlOiAnZ2V0JyxcclxuICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24oZGF0YSkge1xyXG4gICAgICAgICAgICAgIGlmIChzaG91bGRfY2FjaGUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRleHQuZXZlbnRfY29udGV4dC5hcHAudGVtcGxhdGVDYWNoZShsb2NhdGlvbiwgZGF0YSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGNvbnRleHQubmV4dChkYXRhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSwgb3B0aW9ucykpO1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvLyBpdCdzIGEgZG9tL2pRdWVyeVxyXG4gICAgICAgICAgaWYgKGxvY2F0aW9uLm5vZGVUeXBlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBsb2NhdGlvbi5pbm5lckhUTUw7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAobG9jYXRpb24uc2VsZWN0b3IpIHtcclxuICAgICAgICAgICAgLy8gaXQncyBhIGpRdWVyeVxyXG4gICAgICAgICAgICBjb250ZXh0Lm5leHRfZW5naW5lID0gbG9jYXRpb24uYXR0cignZGF0YS1lbmdpbmUnKTtcclxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuY2xvbmUgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIGxvY2F0aW9uLnJlbW92ZSgpWzBdLmlubmVySFRNTC50b1N0cmluZygpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHJldHVybiBsb2NhdGlvblswXS5pbm5lckhUTUwudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIExvYWQgcGFydGlhbHNcclxuICAgIC8vXHJcbiAgICAvLyAjIyMgRXhhbXBsZVxyXG4gICAgLy9cclxuICAgIC8vICAgICAgdGhpcy5sb2FkUGFydGlhbHMoe215cGFydGlhbDogJy9wYXRoL3RvL3BhcnRpYWwnfSk7XHJcbiAgICAvL1xyXG4gICAgbG9hZFBhcnRpYWxzOiBmdW5jdGlvbihwYXJ0aWFscykge1xyXG4gICAgICB2YXIgbmFtZTtcclxuICAgICAgaWYocGFydGlhbHMpIHtcclxuICAgICAgICB0aGlzLnBhcnRpYWxzID0gdGhpcy5wYXJ0aWFscyB8fCB7fTtcclxuICAgICAgICBmb3IobmFtZSBpbiBwYXJ0aWFscykge1xyXG4gICAgICAgICAgKGZ1bmN0aW9uKGNvbnRleHQsIG5hbWUpIHtcclxuICAgICAgICAgICAgY29udGV4dC5sb2FkKHBhcnRpYWxzW25hbWVdKVxyXG4gICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24odGVtcGxhdGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJ0aWFsc1tuYW1lXSA9IHRlbXBsYXRlO1xyXG4gICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9KSh0aGlzLCBuYW1lKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIGBsb2FkKClgIGEgdGVtcGxhdGUgYW5kIHRoZW4gYGludGVycG9sYXRlKClgIGl0IHdpdGggZGF0YS5cclxuICAgIC8vXHJcbiAgICAvLyBjYW4gYmUgY2FsbGVkIHdpdGggbXVsdGlwbGUgZGlmZmVyZW50IHNpZ25hdHVyZXM6XHJcbiAgICAvL1xyXG4gICAgLy8gICAgICB0aGlzLnJlbmRlcihjYWxsYmFjayk7XHJcbiAgICAvLyAgICAgIHRoaXMucmVuZGVyKCcvbG9jYXRpb24nKTtcclxuICAgIC8vICAgICAgdGhpcy5yZW5kZXIoJy9sb2NhdGlvbicsIHtzb21lOiBkYXRhfSk7XHJcbiAgICAvLyAgICAgIHRoaXMucmVuZGVyKCcvbG9jYXRpb24nLCBjYWxsYmFjayk7XHJcbiAgICAvLyAgICAgIHRoaXMucmVuZGVyKCcvbG9jYXRpb24nLCB7c29tZTogZGF0YX0sIGNhbGxiYWNrKTtcclxuICAgIC8vICAgICAgdGhpcy5yZW5kZXIoJy9sb2NhdGlvbicsIHtzb21lOiBkYXRhfSwge215OiBwYXJ0aWFsc30pO1xyXG4gICAgLy8gICAgICB0aGlzLnJlbmRlcignL2xvY2F0aW9uJywgY2FsbGJhY2ssIHtteTogcGFydGlhbHN9KTtcclxuICAgIC8vICAgICAgdGhpcy5yZW5kZXIoJy9sb2NhdGlvbicsIHtzb21lOiBkYXRhfSwgY2FsbGJhY2ssIHtteTogcGFydGlhbHN9KTtcclxuICAgIC8vXHJcbiAgICAvLyAjIyMgRXhhbXBsZVxyXG4gICAgLy9cclxuICAgIC8vICAgICAgdGhpcy5nZXQoJyMvJywgZnVuY3Rpb24oKSB7XHJcbiAgICAvLyAgICAgICAgdGhpcy5yZW5kZXIoJ215dGVtcGxhdGUudGVtcGxhdGUnLCB7bmFtZTogJ3Rlc3QnfSk7XHJcbiAgICAvLyAgICAgIH0pO1xyXG4gICAgLy9cclxuICAgIHJlbmRlcjogZnVuY3Rpb24obG9jYXRpb24sIGRhdGEsIGNhbGxiYWNrLCBwYXJ0aWFscykge1xyXG4gICAgICBpZiAoX2lzRnVuY3Rpb24obG9jYXRpb24pICYmICFkYXRhKSB7XHJcbiAgICAgICAgLy8gaW52b2tlZCBhcyByZW5kZXIoY2FsbGJhY2spXHJcbiAgICAgICAgcmV0dXJuIHRoaXMudGhlbihsb2NhdGlvbik7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYoX2lzRnVuY3Rpb24oZGF0YSkpIHtcclxuICAgICAgICAgIC8vIGludm9rZWQgYXMgcmVuZGVyKGxvY2F0aW9uLCBjYWxsYmFjaywgW3BhcnRpYWxzXSlcclxuICAgICAgICAgIHBhcnRpYWxzID0gY2FsbGJhY2s7XHJcbiAgICAgICAgICBjYWxsYmFjayA9IGRhdGE7XHJcbiAgICAgICAgICBkYXRhID0gbnVsbDtcclxuICAgICAgICB9IGVsc2UgaWYoY2FsbGJhY2sgJiYgIV9pc0Z1bmN0aW9uKGNhbGxiYWNrKSkge1xyXG4gICAgICAgICAgLy8gaW52b2tlZCBhcyByZW5kZXIobG9jYXRpb24sIGRhdGEsIHBhcnRpYWxzKVxyXG4gICAgICAgICAgcGFydGlhbHMgPSBjYWxsYmFjaztcclxuICAgICAgICAgIGNhbGxiYWNrID0gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRQYXJ0aWFscyhwYXJ0aWFscylcclxuICAgICAgICAgICAgICAgICAgIC5sb2FkKGxvY2F0aW9uKVxyXG4gICAgICAgICAgICAgICAgICAgLmludGVycG9sYXRlKGRhdGEsIGxvY2F0aW9uKVxyXG4gICAgICAgICAgICAgICAgICAgLnRoZW4oY2FsbGJhY2spO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIGByZW5kZXIoKWAgdGhlIGBsb2NhdGlvbmAgd2l0aCBgZGF0YWAgYW5kIHRoZW4gYHN3YXAoKWAgdGhlXHJcbiAgICAvLyBhcHAncyBgJGVsZW1lbnRgIHdpdGggdGhlIHJlbmRlcmVkIGNvbnRlbnQuXHJcbiAgICBwYXJ0aWFsOiBmdW5jdGlvbihsb2NhdGlvbiwgZGF0YSwgY2FsbGJhY2ssIHBhcnRpYWxzKSB7XHJcbiAgICAgIGlmIChfaXNGdW5jdGlvbihjYWxsYmFjaykpIHtcclxuICAgICAgICAvLyBpbnZva2VkIGFzIHBhcnRpYWwobG9jYXRpb24sIGRhdGEsIGNhbGxiYWNrLCBbcGFydGlhbHNdKVxyXG4gICAgICAgIHJldHVybiB0aGlzLnJlbmRlcihsb2NhdGlvbiwgZGF0YSwgcGFydGlhbHMpLnN3YXAoY2FsbGJhY2spO1xyXG4gICAgICB9IGVsc2UgaWYgKF9pc0Z1bmN0aW9uKGRhdGEpKSB7XHJcbiAgICAgICAgLy8gaW52b2tlZCBhcyBwYXJ0aWFsKGxvY2F0aW9uLCBjYWxsYmFjaywgW3BhcnRpYWxzXSlcclxuICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXIobG9jYXRpb24sIHt9LCBjYWxsYmFjaykuc3dhcChkYXRhKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyBpbnZva2VkIGFzIHBhcnRpYWwobG9jYXRpb24sIGRhdGEsIFtwYXJ0aWFsc10pXHJcbiAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyKGxvY2F0aW9uLCBkYXRhLCBjYWxsYmFjaykuc3dhcCgpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIGRlZmVycyB0aGUgY2FsbCBvZiBmdW5jdGlvbiB0byBvY2N1ciBpbiBvcmRlciBvZiB0aGUgcmVuZGVyIHF1ZXVlLlxyXG4gICAgLy8gVGhlIGZ1bmN0aW9uIGNhbiBhY2NlcHQgYW55IG51bWJlciBvZiBhcmd1bWVudHMgYXMgbG9uZyBhcyB0aGUgbGFzdFxyXG4gICAgLy8gYXJndW1lbnQgaXMgYSBjYWxsYmFjayBmdW5jdGlvbi4gVGhpcyBpcyB1c2VmdWwgZm9yIHB1dHRpbmcgYXJiaXRyYXJ5XHJcbiAgICAvLyBhc3luY2hyb25vdXMgZnVuY3Rpb25zIGludG8gdGhlIHF1ZXVlLiBUaGUgY29udGVudCBwYXNzZWQgdG8gdGhlXHJcbiAgICAvLyBjYWxsYmFjayBpcyBwYXNzZWQgYXMgYGNvbnRlbnRgIHRvIHRoZSBuZXh0IGl0ZW0gaW4gdGhlIHF1ZXVlLlxyXG4gICAgLy9cclxuICAgIC8vICMjIyBFeGFtcGxlXHJcbiAgICAvL1xyXG4gICAgLy8gICAgIHRoaXMuc2VuZCgkLmdldEpTT04sICcvYXBwLmpzb24nKVxyXG4gICAgLy8gICAgICAgICAudGhlbihmdW5jdGlvbihqc29uKSB7XHJcbiAgICAvLyAgICAgICAgICAgJCgnI21lc3NhZ2UpLnRleHQoanNvblsnbWVzc2FnZSddKTtcclxuICAgIC8vICAgICAgICAgIH0pO1xyXG4gICAgLy9cclxuICAgIC8vXHJcbiAgICBzZW5kOiBmdW5jdGlvbigpIHtcclxuICAgICAgdmFyIGNvbnRleHQgPSB0aGlzLFxyXG4gICAgICAgICAgYXJncyA9IF9tYWtlQXJyYXkoYXJndW1lbnRzKSxcclxuICAgICAgICAgIGZ1biAgPSBhcmdzLnNoaWZ0KCk7XHJcblxyXG4gICAgICBpZiAoX2lzQXJyYXkoYXJnc1swXSkpIHsgYXJncyA9IGFyZ3NbMF07IH1cclxuXHJcbiAgICAgIHJldHVybiB0aGlzLnRoZW4oZnVuY3Rpb24oY29udGVudCkge1xyXG4gICAgICAgIGFyZ3MucHVzaChmdW5jdGlvbihyZXNwb25zZSkgeyBjb250ZXh0Lm5leHQocmVzcG9uc2UpOyB9KTtcclxuICAgICAgICBjb250ZXh0LndhaXQoKTtcclxuICAgICAgICBmdW4uYXBwbHkoZnVuLCBhcmdzKTtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH0pO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBpdGVyYXRlcyBvdmVyIGFuIGFycmF5LCBhcHBseWluZyB0aGUgY2FsbGJhY2sgZm9yIGVhY2ggaXRlbSBpdGVtLiB0aGVcclxuICAgIC8vIGNhbGxiYWNrIHRha2VzIHRoZSBzYW1lIHN0eWxlIG9mIGFyZ3VtZW50cyBhcyBgalF1ZXJ5LmVhY2goKWAgKGluZGV4LCBpdGVtKS5cclxuICAgIC8vIFRoZSByZXR1cm4gdmFsdWUgb2YgZWFjaCBjYWxsYmFjayBpcyBjb2xsZWN0ZWQgYXMgYSBzaW5nbGUgc3RyaW5nIGFuZCBzdG9yZWRcclxuICAgIC8vIGFzIGBjb250ZW50YCB0byBiZSB1c2VkIGluIHRoZSBuZXh0IGl0ZXJhdGlvbiBvZiB0aGUgYFJlbmRlckNvbnRleHRgLlxyXG4gICAgY29sbGVjdDogZnVuY3Rpb24oYXJyYXksIGNhbGxiYWNrLCBub3cpIHtcclxuICAgICAgdmFyIGNvbnRleHQgPSB0aGlzO1xyXG4gICAgICB2YXIgY29sbCA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIGlmIChfaXNGdW5jdGlvbihhcnJheSkpIHtcclxuICAgICAgICAgIGNhbGxiYWNrID0gYXJyYXk7XHJcbiAgICAgICAgICBhcnJheSA9IHRoaXMuY29udGVudDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGNvbnRlbnRzID0gW10sIGRvbXMgPSBmYWxzZTtcclxuICAgICAgICAkLmVhY2goYXJyYXksIGZ1bmN0aW9uKGksIGl0ZW0pIHtcclxuICAgICAgICAgIHZhciByZXR1cm5lZCA9IGNhbGxiYWNrLmFwcGx5KGNvbnRleHQsIFtpLCBpdGVtXSk7XHJcbiAgICAgICAgICBpZiAocmV0dXJuZWQuanF1ZXJ5ICYmIHJldHVybmVkLmxlbmd0aCA9PSAxKSB7XHJcbiAgICAgICAgICAgIHJldHVybmVkID0gcmV0dXJuZWRbMF07XHJcbiAgICAgICAgICAgIGRvbXMgPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgY29udGVudHMucHVzaChyZXR1cm5lZCk7XHJcbiAgICAgICAgICByZXR1cm4gcmV0dXJuZWQ7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIGRvbXMgPyBjb250ZW50cyA6IGNvbnRlbnRzLmpvaW4oJycpO1xyXG4gICAgICB9O1xyXG4gICAgICByZXR1cm4gbm93ID8gY29sbCgpIDogdGhpcy50aGVuKGNvbGwpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBsb2FkcyBhIHRlbXBsYXRlLCBhbmQgdGhlbiBpbnRlcnBvbGF0ZXMgaXQgZm9yIGVhY2ggaXRlbSBpbiB0aGUgYGRhdGFgXHJcbiAgICAvLyBhcnJheS4gSWYgYSBjYWxsYmFjayBpcyBwYXNzZWQsIGl0IHdpbGwgY2FsbCB0aGUgY2FsbGJhY2sgd2l0aCBlYWNoXHJcbiAgICAvLyBpdGVtIGluIHRoZSBhcnJheSBfYWZ0ZXJfIGludGVycG9sYXRpb25cclxuICAgIHJlbmRlckVhY2g6IGZ1bmN0aW9uKGxvY2F0aW9uLCBuYW1lLCBkYXRhLCBjYWxsYmFjaykge1xyXG4gICAgICBpZiAoX2lzQXJyYXkobmFtZSkpIHtcclxuICAgICAgICBjYWxsYmFjayA9IGRhdGE7XHJcbiAgICAgICAgZGF0YSA9IG5hbWU7XHJcbiAgICAgICAgbmFtZSA9IG51bGw7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRoaXMubG9hZChsb2NhdGlvbikudGhlbihmdW5jdGlvbihjb250ZW50KSB7XHJcbiAgICAgICAgICB2YXIgcmN0eCA9IHRoaXM7XHJcbiAgICAgICAgICBpZiAoIWRhdGEpIHtcclxuICAgICAgICAgICAgZGF0YSA9IF9pc0FycmF5KHRoaXMucHJldmlvdXNfY29udGVudCkgPyB0aGlzLnByZXZpb3VzX2NvbnRlbnQgOiBbXTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChjYWxsYmFjaykge1xyXG4gICAgICAgICAgICAkLmVhY2goZGF0YSwgZnVuY3Rpb24oaSwgdmFsdWUpIHtcclxuICAgICAgICAgICAgICB2YXIgaWRhdGEgPSB7fSwgZW5naW5lID0gdGhpcy5uZXh0X2VuZ2luZSB8fCBsb2NhdGlvbjtcclxuICAgICAgICAgICAgICBpZiAobmFtZSkge1xyXG4gICAgICAgICAgICAgICAgaWRhdGFbbmFtZV0gPSB2YWx1ZTtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWRhdGEgPSB2YWx1ZTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgY2FsbGJhY2sodmFsdWUsIHJjdHguZXZlbnRfY29udGV4dC5pbnRlcnBvbGF0ZShjb250ZW50LCBpZGF0YSwgZW5naW5lKSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29sbGVjdChkYXRhLCBmdW5jdGlvbihpLCB2YWx1ZSkge1xyXG4gICAgICAgICAgICAgIHZhciBpZGF0YSA9IHt9LCBlbmdpbmUgPSB0aGlzLm5leHRfZW5naW5lIHx8IGxvY2F0aW9uO1xyXG4gICAgICAgICAgICAgIGlmIChuYW1lKSB7XHJcbiAgICAgICAgICAgICAgICBpZGF0YVtuYW1lXSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZGF0YSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5ldmVudF9jb250ZXh0LmludGVycG9sYXRlKGNvbnRlbnQsIGlkYXRhLCBlbmdpbmUpO1xyXG4gICAgICAgICAgICB9LCB0cnVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIHVzZXMgdGhlIHByZXZpb3VzIGxvYWRlZCBgY29udGVudGAgYW5kIHRoZSBgZGF0YWAgb2JqZWN0IHRvIGludGVycG9sYXRlXHJcbiAgICAvLyBhIHRlbXBsYXRlLiBgZW5naW5lYCBkZWZpbmVzIHRoZSB0ZW1wbGF0aW5nL2ludGVycG9sYXRpb24gbWV0aG9kL2VuZ2luZVxyXG4gICAgLy8gdGhhdCBzaG91bGQgYmUgdXNlZC4gSWYgYGVuZ2luZWAgaXMgbm90IHBhc3NlZCwgdGhlIGBuZXh0X2VuZ2luZWAgaXNcclxuICAgIC8vIHVzZWQuIElmIGByZXRhaW5gIGlzIGB0cnVlYCwgdGhlIGZpbmFsIGludGVycG9sYXRlZCBkYXRhIGlzIGFwcGVuZGVkIHRvXHJcbiAgICAvLyB0aGUgYHByZXZpb3VzX2NvbnRlbnRgIGluc3RlYWQgb2YganVzdCByZXBsYWNpbmcgaXQuXHJcbiAgICBpbnRlcnBvbGF0ZTogZnVuY3Rpb24oZGF0YSwgZW5naW5lLCByZXRhaW4pIHtcclxuICAgICAgdmFyIGNvbnRleHQgPSB0aGlzO1xyXG4gICAgICByZXR1cm4gdGhpcy50aGVuKGZ1bmN0aW9uKGNvbnRlbnQsIHByZXYpIHtcclxuICAgICAgICBpZiAoIWRhdGEgJiYgcHJldikgeyBkYXRhID0gcHJldjsgfVxyXG4gICAgICAgIGlmICh0aGlzLm5leHRfZW5naW5lKSB7XHJcbiAgICAgICAgICBlbmdpbmUgPSB0aGlzLm5leHRfZW5naW5lO1xyXG4gICAgICAgICAgdGhpcy5uZXh0X2VuZ2luZSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgcmVuZGVyZWQgPSBjb250ZXh0LmV2ZW50X2NvbnRleHQuaW50ZXJwb2xhdGUoY29udGVudCwgZGF0YSwgZW5naW5lLCB0aGlzLnBhcnRpYWxzKTtcclxuICAgICAgICByZXR1cm4gcmV0YWluID8gcHJldiArIHJlbmRlcmVkIDogcmVuZGVyZWQ7XHJcbiAgICAgIH0pO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBTd2FwIHRoZSByZXR1cm4gY29udGVudHMgZW5zdXJpbmcgb3JkZXIuIFNlZSBgQXBwbGljYXRpb24jc3dhcGBcclxuICAgIHN3YXA6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnRoZW4oZnVuY3Rpb24oY29udGVudCkge1xyXG4gICAgICAgIHRoaXMuZXZlbnRfY29udGV4dC5zd2FwKGNvbnRlbnQsIGNhbGxiYWNrKTtcclxuICAgICAgICByZXR1cm4gY29udGVudDtcclxuICAgICAgfSkudHJpZ2dlcignY2hhbmdlZCcsIHt9KTtcclxuICAgIH0sXHJcblxyXG4gICAgLy8gU2FtZSB1c2FnZSBhcyBgalF1ZXJ5LmZuLmFwcGVuZFRvKClgIGJ1dCB1c2VzIGB0aGVuKClgIHRvIGVuc3VyZSBvcmRlclxyXG4gICAgYXBwZW5kVG86IGZ1bmN0aW9uKHNlbGVjdG9yKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnRoZW4oZnVuY3Rpb24oY29udGVudCkge1xyXG4gICAgICAgICQoc2VsZWN0b3IpLmFwcGVuZChjb250ZW50KTtcclxuICAgICAgfSkudHJpZ2dlcignY2hhbmdlZCcsIHt9KTtcclxuICAgIH0sXHJcblxyXG4gICAgLy8gU2FtZSB1c2FnZSBhcyBgalF1ZXJ5LmZuLnByZXBlbmRUbygpYCBidXQgdXNlcyBgdGhlbigpYCB0byBlbnN1cmUgb3JkZXJcclxuICAgIHByZXBlbmRUbzogZnVuY3Rpb24oc2VsZWN0b3IpIHtcclxuICAgICAgcmV0dXJuIHRoaXMudGhlbihmdW5jdGlvbihjb250ZW50KSB7XHJcbiAgICAgICAgJChzZWxlY3RvcikucHJlcGVuZChjb250ZW50KTtcclxuICAgICAgfSkudHJpZ2dlcignY2hhbmdlZCcsIHt9KTtcclxuICAgIH0sXHJcblxyXG4gICAgLy8gUmVwbGFjZXMgdGhlIGAkKHNlbGVjdG9yKWAgdXNpbmcgYGh0bWwoKWAgd2l0aCB0aGUgcHJldmlvdXNseSBsb2FkZWRcclxuICAgIC8vIGBjb250ZW50YFxyXG4gICAgcmVwbGFjZTogZnVuY3Rpb24oc2VsZWN0b3IpIHtcclxuICAgICAgcmV0dXJuIHRoaXMudGhlbihmdW5jdGlvbihjb250ZW50KSB7XHJcbiAgICAgICAgJChzZWxlY3RvcikuaHRtbChjb250ZW50KTtcclxuICAgICAgfSkudHJpZ2dlcignY2hhbmdlZCcsIHt9KTtcclxuICAgIH0sXHJcblxyXG4gICAgLy8gdHJpZ2dlciB0aGUgZXZlbnQgaW4gdGhlIG9yZGVyIG9mIHRoZSBldmVudCBjb250ZXh0LiBTYW1lIHNlbWFudGljc1xyXG4gICAgLy8gYXMgYFNhbW15LkV2ZW50Q29udGV4dCN0cmlnZ2VyKClgLiBJZiBkYXRhIGlzIG9taXR0ZWQsIGBjb250ZW50YFxyXG4gICAgLy8gaXMgc2VudCBhcyBge2NvbnRlbnQ6IGNvbnRlbnR9YFxyXG4gICAgdHJpZ2dlcjogZnVuY3Rpb24obmFtZSwgZGF0YSkge1xyXG4gICAgICByZXR1cm4gdGhpcy50aGVuKGZ1bmN0aW9uKGNvbnRlbnQpIHtcclxuICAgICAgICBpZiAodHlwZW9mIGRhdGEgPT0gJ3VuZGVmaW5lZCcpIHsgZGF0YSA9IHtjb250ZW50OiBjb250ZW50fTsgfVxyXG4gICAgICAgIHRoaXMuZXZlbnRfY29udGV4dC50cmlnZ2VyKG5hbWUsIGRhdGEpO1xyXG4gICAgICAgIHJldHVybiBjb250ZW50O1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgfSk7XHJcblxyXG4gIC8vIGBTYW1teS5FdmVudENvbnRleHRgIG9iamVjdHMgYXJlIGNyZWF0ZWQgZXZlcnkgdGltZSBhIHJvdXRlIGlzIHJ1biBvciBhXHJcbiAgLy8gYm91bmQgZXZlbnQgaXMgdHJpZ2dlcmVkLiBUaGUgY2FsbGJhY2tzIGZvciB0aGVzZSBldmVudHMgYXJlIGV2YWx1YXRlZCB3aXRoaW4gYSBgU2FtbXkuRXZlbnRDb250ZXh0YFxyXG4gIC8vIFRoaXMgd2l0aGluIHRoZXNlIGNhbGxiYWNrcyB0aGUgc3BlY2lhbCBtZXRob2RzIG9mIGBFdmVudENvbnRleHRgIGFyZSBhdmFpbGFibGUuXHJcbiAgLy9cclxuICAvLyAjIyMgRXhhbXBsZVxyXG4gIC8vXHJcbiAgLy8gICAgICAgJC5zYW1teShmdW5jdGlvbigpIHtcclxuICAvLyAgICAgICAgIC8vIFRoZSBjb250ZXh0IGhlcmUgaXMgdGhpcyBTYW1teS5BcHBsaWNhdGlvblxyXG4gIC8vICAgICAgICAgdGhpcy5nZXQoJyMvOm5hbWUnLCBmdW5jdGlvbigpIHtcclxuICAvLyAgICAgICAgICAgLy8gVGhlIGNvbnRleHQgaGVyZSBpcyBhIG5ldyBTYW1teS5FdmVudENvbnRleHRcclxuICAvLyAgICAgICAgICAgaWYgKHRoaXMucGFyYW1zWyduYW1lJ10gPT0gJ3NhbW15Jykge1xyXG4gIC8vICAgICAgICAgICAgIHRoaXMucGFydGlhbCgnbmFtZS5odG1sLmVyYicsIHtuYW1lOiAnU2FtbXknfSk7XHJcbiAgLy8gICAgICAgICAgIH0gZWxzZSB7XHJcbiAgLy8gICAgICAgICAgICAgdGhpcy5yZWRpcmVjdCgnIy9zb21ld2hlcmUtZWxzZScpXHJcbiAgLy8gICAgICAgICAgIH1cclxuICAvLyAgICAgICAgIH0pO1xyXG4gIC8vICAgICAgIH0pO1xyXG4gIC8vXHJcbiAgLy8gSW5pdGlhbGl6ZSBhIG5ldyBFdmVudENvbnRleHRcclxuICAvL1xyXG4gIC8vICMjIyBBcmd1bWVudHNcclxuICAvL1xyXG4gIC8vICogYGFwcGAgVGhlIGBTYW1teS5BcHBsaWNhdGlvbmAgdGhpcyBldmVudCBpcyBjYWxsZWQgd2l0aGluLlxyXG4gIC8vICogYHZlcmJgIFRoZSB2ZXJiIGludm9rZWQgdG8gcnVuIHRoaXMgY29udGV4dC9yb3V0ZS5cclxuICAvLyAqIGBwYXRoYCBUaGUgc3RyaW5nIHBhdGggaW52b2tlZCB0byBydW4gdGhpcyBjb250ZXh0L3JvdXRlLlxyXG4gIC8vICogYHBhcmFtc2AgQW4gT2JqZWN0IG9mIG9wdGlvbmFsIHBhcmFtcyB0byBwYXNzIHRvIHRoZSBjb250ZXh0LiBJcyBjb252ZXJ0ZWRcclxuICAvLyAgIHRvIGEgYFNhbW15Lk9iamVjdGAuXHJcbiAgLy8gKiBgdGFyZ2V0YCBhIERPTSBlbGVtZW50IHRoYXQgdGhlIGV2ZW50IHRoYXQgaG9sZHMgdGhpcyBjb250ZXh0IG9yaWdpbmF0ZXNcclxuICAvLyAgIGZyb20uIEZvciBwb3N0LCBwdXQgYW5kIGRlbCByb3V0ZXMsIHRoaXMgaXMgdGhlIGZvcm0gZWxlbWVudCB0aGF0IHRyaWdnZXJlZFxyXG4gIC8vICAgdGhlIHJvdXRlLlxyXG4gIC8vXHJcbiAgU2FtbXkuRXZlbnRDb250ZXh0ID0gZnVuY3Rpb24oYXBwLCB2ZXJiLCBwYXRoLCBwYXJhbXMsIHRhcmdldCkge1xyXG4gICAgdGhpcy5hcHAgICAgPSBhcHA7XHJcbiAgICB0aGlzLnZlcmIgICA9IHZlcmI7XHJcbiAgICB0aGlzLnBhdGggICA9IHBhdGg7XHJcbiAgICB0aGlzLnBhcmFtcyA9IG5ldyBTYW1teS5PYmplY3QocGFyYW1zKTtcclxuICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0O1xyXG4gIH07XHJcblxyXG4gIFNhbW15LkV2ZW50Q29udGV4dC5wcm90b3R5cGUgPSAkLmV4dGVuZCh7fSwgU2FtbXkuT2JqZWN0LnByb3RvdHlwZSwge1xyXG5cclxuICAgIC8vIEEgc2hvcnRjdXQgdG8gdGhlIGFwcCdzIGAkZWxlbWVudCgpYFxyXG4gICAgJGVsZW1lbnQ6IGZ1bmN0aW9uKCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5hcHAuJGVsZW1lbnQoX21ha2VBcnJheShhcmd1bWVudHMpLnNoaWZ0KCkpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBMb29rIHVwIGEgdGVtcGxhdGluZyBlbmdpbmUgd2l0aGluIHRoZSBjdXJyZW50IGFwcCBhbmQgY29udGV4dC5cclxuICAgIC8vIGBlbmdpbmVgIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzpcclxuICAgIC8vXHJcbiAgICAvLyAqIGEgZnVuY3Rpb246IHNob3VsZCBjb25mb3JtIHRvIGBmdW5jdGlvbihjb250ZW50LCBkYXRhKSB7IHJldHVybiBpbnRlcnBvbGF0ZWQ7IH1gXHJcbiAgICAvLyAqIGEgdGVtcGxhdGUgcGF0aDogJ3RlbXBsYXRlLmVqcycsIGxvb2tzIHVwIHRoZSBleHRlbnNpb24gdG8gbWF0Y2ggdG9cclxuICAgIC8vICAgdGhlIGBlanMoKWAgaGVscGVyXHJcbiAgICAvLyAqIGEgc3RyaW5nIHJlZmVycmluZyB0byB0aGUgaGVscGVyOiBcIm11c3RhY2hlXCIgPT4gYG11c3RhY2hlKClgXHJcbiAgICAvL1xyXG4gICAgLy8gSWYgbm8gZW5naW5lIGlzIGZvdW5kLCB1c2UgdGhlIGFwcCdzIGRlZmF1bHQgYHRlbXBsYXRlX2VuZ2luZWBcclxuICAgIC8vXHJcbiAgICBlbmdpbmVGb3I6IGZ1bmN0aW9uKGVuZ2luZSkge1xyXG4gICAgICB2YXIgY29udGV4dCA9IHRoaXMsIGVuZ2luZV9tYXRjaDtcclxuICAgICAgLy8gaWYgcGF0aCBpcyBhY3R1YWxseSBhbiBlbmdpbmUgZnVuY3Rpb24ganVzdCByZXR1cm4gaXRcclxuICAgICAgaWYgKF9pc0Z1bmN0aW9uKGVuZ2luZSkpIHsgcmV0dXJuIGVuZ2luZTsgfVxyXG4gICAgICAvLyBsb29rdXAgZW5naW5lIG5hbWUgYnkgcGF0aCBleHRlbnNpb25cclxuICAgICAgZW5naW5lID0gKGVuZ2luZSB8fCBjb250ZXh0LmFwcC50ZW1wbGF0ZV9lbmdpbmUpLnRvU3RyaW5nKCk7XHJcbiAgICAgIGlmICgoZW5naW5lX21hdGNoID0gZW5naW5lLm1hdGNoKC9cXC4oW15cXC5cXD9cXCNdKykoXFw/fCQpLykpKSB7XHJcbiAgICAgICAgZW5naW5lID0gZW5naW5lX21hdGNoWzFdO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIHNldCB0aGUgZW5naW5lIHRvIHRoZSBkZWZhdWx0IHRlbXBsYXRlIGVuZ2luZSBpZiBubyBtYXRjaCBpcyBmb3VuZFxyXG4gICAgICBpZiAoZW5naW5lICYmIF9pc0Z1bmN0aW9uKGNvbnRleHRbZW5naW5lXSkpIHtcclxuICAgICAgICByZXR1cm4gY29udGV4dFtlbmdpbmVdO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoY29udGV4dC5hcHAudGVtcGxhdGVfZW5naW5lKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZW5naW5lRm9yKGNvbnRleHQuYXBwLnRlbXBsYXRlX2VuZ2luZSk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGZ1bmN0aW9uKGNvbnRlbnQsIGRhdGEpIHsgcmV0dXJuIGNvbnRlbnQ7IH07XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIHVzaW5nIHRoZSB0ZW1wbGF0ZSBgZW5naW5lYCBmb3VuZCB3aXRoIGBlbmdpbmVGb3IoKWAsIGludGVycG9sYXRlIHRoZVxyXG4gICAgLy8gYGRhdGFgIGludG8gYGNvbnRlbnRgXHJcbiAgICBpbnRlcnBvbGF0ZTogZnVuY3Rpb24oY29udGVudCwgZGF0YSwgZW5naW5lLCBwYXJ0aWFscykge1xyXG4gICAgICByZXR1cm4gdGhpcy5lbmdpbmVGb3IoZW5naW5lKS5hcHBseSh0aGlzLCBbY29udGVudCwgZGF0YSwgcGFydGlhbHNdKTtcclxuICAgIH0sXHJcblxyXG4gICAgLy8gQ3JlYXRlIGFuZCByZXR1cm4gYSBgU2FtbXkuUmVuZGVyQ29udGV4dGAgY2FsbGluZyBgcmVuZGVyKClgIG9uIGl0LlxyXG4gICAgLy8gTG9hZHMgdGhlIHRlbXBsYXRlIGFuZCBpbnRlcnBvbGF0ZSB0aGUgZGF0YSwgaG93ZXZlciBkb2VzIG5vdCBhY3R1YWxcclxuICAgIC8vIHBsYWNlIGl0IGluIHRoZSBET00uXHJcbiAgICAvL1xyXG4gICAgLy8gIyMjIEV4YW1wbGVcclxuICAgIC8vXHJcbiAgICAvLyAgICAgIC8vIG15dGVtcGxhdGUubXVzdGFjaGUgPGRpdiBjbGFzcz1cIm5hbWVcIj57e25hbWV9fTwvZGl2PlxyXG4gICAgLy8gICAgICByZW5kZXIoJ215dGVtcGxhdGUubXVzdGFjaGUnLCB7bmFtZTogJ3F1aXJrZXknfSk7XHJcbiAgICAvLyAgICAgIC8vIHNldHMgdGhlIGBjb250ZW50YCB0byA8ZGl2IGNsYXNzPVwibmFtZVwiPnF1aXJrZXk8L2Rpdj5cclxuICAgIC8vICAgICAgcmVuZGVyKCdteXRlbXBsYXRlLm11c3RhY2hlJywge25hbWU6ICdxdWlya2V5J30pXHJcbiAgICAvLyAgICAgICAgLmFwcGVuZFRvKCd1bCcpO1xyXG4gICAgLy8gICAgICAvLyBhcHBlbmRzIHRoZSByZW5kZXJlZCBjb250ZW50IHRvICQoJ3VsJylcclxuICAgIC8vXHJcbiAgICByZW5kZXI6IGZ1bmN0aW9uKGxvY2F0aW9uLCBkYXRhLCBjYWxsYmFjaywgcGFydGlhbHMpIHtcclxuICAgICAgcmV0dXJuIG5ldyBTYW1teS5SZW5kZXJDb250ZXh0KHRoaXMpLnJlbmRlcihsb2NhdGlvbiwgZGF0YSwgY2FsbGJhY2ssIHBhcnRpYWxzKTtcclxuICAgIH0sXHJcblxyXG4gICAgLy8gQ3JlYXRlIGFuZCByZXR1cm4gYSBgU2FtbXkuUmVuZGVyQ29udGV4dGAgY2FsbGluZyBgcmVuZGVyRWFjaCgpYCBvbiBpdC5cclxuICAgIC8vIExvYWRzIHRoZSB0ZW1wbGF0ZSBhbmQgaW50ZXJwb2xhdGVzIHRoZSBkYXRhIGZvciBlYWNoIGl0ZW0sXHJcbiAgICAvLyBob3dldmVyIGRvZXMgbm90IGFjdHVhbCBwbGFjZSBpdCBpbiB0aGUgRE9NLlxyXG4gICAgLy9cclxuICAgIC8vICMjIyBFeGFtcGxlXHJcbiAgICAvL1xyXG4gICAgLy8gICAgICAvLyBteXRlbXBsYXRlLm11c3RhY2hlIDxkaXYgY2xhc3M9XCJuYW1lXCI+e3tuYW1lfX08L2Rpdj5cclxuICAgIC8vICAgICAgcmVuZGVyRWFjaCgnbXl0ZW1wbGF0ZS5tdXN0YWNoZScsIFt7bmFtZTogJ3F1aXJrZXknfSwge25hbWU6ICdlbmRvcid9XSlcclxuICAgIC8vICAgICAgLy8gc2V0cyB0aGUgYGNvbnRlbnRgIHRvIDxkaXYgY2xhc3M9XCJuYW1lXCI+cXVpcmtleTwvZGl2PjxkaXYgY2xhc3M9XCJuYW1lXCI+ZW5kb3I8L2Rpdj5cclxuICAgIC8vICAgICAgcmVuZGVyRWFjaCgnbXl0ZW1wbGF0ZS5tdXN0YWNoZScsIFt7bmFtZTogJ3F1aXJrZXknfSwge25hbWU6ICdlbmRvcid9XSkuYXBwZW5kVG8oJ3VsJyk7XHJcbiAgICAvLyAgICAgIC8vIGFwcGVuZHMgdGhlIHJlbmRlcmVkIGNvbnRlbnQgdG8gJCgndWwnKVxyXG4gICAgLy9cclxuICAgIHJlbmRlckVhY2g6IGZ1bmN0aW9uKGxvY2F0aW9uLCBuYW1lLCBkYXRhLCBjYWxsYmFjaykge1xyXG4gICAgICByZXR1cm4gbmV3IFNhbW15LlJlbmRlckNvbnRleHQodGhpcykucmVuZGVyRWFjaChsb2NhdGlvbiwgbmFtZSwgZGF0YSwgY2FsbGJhY2spO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBjcmVhdGUgYSBuZXcgYFNhbW15LlJlbmRlckNvbnRleHRgIGNhbGxpbmcgYGxvYWQoKWAgd2l0aCBgbG9jYXRpb25gIGFuZFxyXG4gICAgLy8gYG9wdGlvbnNgLiBDYWxsZWQgd2l0aG91dCBpbnRlcnBvbGF0aW9uIG9yIHBsYWNlbWVudCwgdGhpcyBhbGxvd3MgZm9yXHJcbiAgICAvLyBwcmVsb2FkaW5nL2NhY2hpbmcgdGhlIHRlbXBsYXRlcy5cclxuICAgIGxvYWQ6IGZ1bmN0aW9uKGxvY2F0aW9uLCBvcHRpb25zLCBjYWxsYmFjaykge1xyXG4gICAgICByZXR1cm4gbmV3IFNhbW15LlJlbmRlckNvbnRleHQodGhpcykubG9hZChsb2NhdGlvbiwgb3B0aW9ucywgY2FsbGJhY2spO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBjcmVhdGUgYSBuZXcgYFNhbW15LlJlbmRlckNvbnRleHRgIGNhbGxpbmcgYGxvYWRQYXJ0aWFscygpYCB3aXRoIGBwYXJ0aWFsc2AuXHJcbiAgICBsb2FkUGFydGlhbHM6IGZ1bmN0aW9uKHBhcnRpYWxzKSB7XHJcbiAgICAgIHJldHVybiBuZXcgU2FtbXkuUmVuZGVyQ29udGV4dCh0aGlzKS5sb2FkUGFydGlhbHMocGFydGlhbHMpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBgcmVuZGVyKClgIHRoZSBgbG9jYXRpb25gIHdpdGggYGRhdGFgIGFuZCB0aGVuIGBzd2FwKClgIHRoZVxyXG4gICAgLy8gYXBwJ3MgYCRlbGVtZW50YCB3aXRoIHRoZSByZW5kZXJlZCBjb250ZW50LlxyXG4gICAgcGFydGlhbDogZnVuY3Rpb24obG9jYXRpb24sIGRhdGEsIGNhbGxiYWNrLCBwYXJ0aWFscykge1xyXG4gICAgICByZXR1cm4gbmV3IFNhbW15LlJlbmRlckNvbnRleHQodGhpcykucGFydGlhbChsb2NhdGlvbiwgZGF0YSwgY2FsbGJhY2ssIHBhcnRpYWxzKTtcclxuICAgIH0sXHJcblxyXG4gICAgLy8gY3JlYXRlIGEgbmV3IGBTYW1teS5SZW5kZXJDb250ZXh0YCBjYWxsaW5nIGBzZW5kKClgIHdpdGggYW4gYXJiaXRyYXJ5XHJcbiAgICAvLyBmdW5jdGlvblxyXG4gICAgc2VuZDogZnVuY3Rpb24oKSB7XHJcbiAgICAgIHZhciByY3R4ID0gbmV3IFNhbW15LlJlbmRlckNvbnRleHQodGhpcyk7XHJcbiAgICAgIHJldHVybiByY3R4LnNlbmQuYXBwbHkocmN0eCwgYXJndW1lbnRzKTtcclxuICAgIH0sXHJcblxyXG4gICAgLy8gQ2hhbmdlcyB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgd2luZG93LiBJZiBgdG9gIGJlZ2lucyB3aXRoXHJcbiAgICAvLyAnIycgaXQgb25seSBjaGFuZ2VzIHRoZSBkb2N1bWVudCdzIGhhc2guIElmIHBhc3NlZCBtb3JlIHRoYW4gMSBhcmd1bWVudFxyXG4gICAgLy8gcmVkaXJlY3Qgd2lsbCBqb2luIHRoZW0gdG9nZXRoZXIgd2l0aCBmb3J3YXJkIHNsYXNoZXMuXHJcbiAgICAvL1xyXG4gICAgLy8gIyMjIEV4YW1wbGVcclxuICAgIC8vXHJcbiAgICAvLyAgICAgIHJlZGlyZWN0KCcjL290aGVyL3JvdXRlJyk7XHJcbiAgICAvLyAgICAgIC8vIGVxdWl2YWxlbnQgdG9cclxuICAgIC8vICAgICAgcmVkaXJlY3QoJyMnLCAnb3RoZXInLCAncm91dGUnKTtcclxuICAgIC8vXHJcbiAgICByZWRpcmVjdDogZnVuY3Rpb24oKSB7XHJcbiAgICAgIHZhciB0bywgYXJncyA9IF9tYWtlQXJyYXkoYXJndW1lbnRzKSxcclxuICAgICAgICAgIGN1cnJlbnRfbG9jYXRpb24gPSB0aGlzLmFwcC5nZXRMb2NhdGlvbigpLFxyXG4gICAgICAgICAgbCA9IGFyZ3MubGVuZ3RoO1xyXG4gICAgICBpZiAobCA+IDEpIHtcclxuICAgICAgICB2YXIgaSA9IDAsIHBhdGhzID0gW10sIHBhaXJzID0gW10sIHBhcmFtcyA9IHt9LCBoYXNfcGFyYW1zID0gZmFsc2U7XHJcbiAgICAgICAgZm9yICg7IGkgPCBsOyBpKyspIHtcclxuICAgICAgICAgIGlmICh0eXBlb2YgYXJnc1tpXSA9PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICBwYXRocy5wdXNoKGFyZ3NbaV0pO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgJC5leHRlbmQocGFyYW1zLCBhcmdzW2ldKTtcclxuICAgICAgICAgICAgaGFzX3BhcmFtcyA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRvID0gcGF0aHMuam9pbignLycpO1xyXG4gICAgICAgIGlmIChoYXNfcGFyYW1zKSB7XHJcbiAgICAgICAgICBmb3IgKHZhciBrIGluIHBhcmFtcykge1xyXG4gICAgICAgICAgICBwYWlycy5wdXNoKHRoaXMuYXBwLl9lbmNvZGVGb3JtUGFpcihrLCBwYXJhbXNba10pKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRvICs9ICc/JyArIHBhaXJzLmpvaW4oJyYnKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdG8gPSBhcmdzWzBdO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMudHJpZ2dlcigncmVkaXJlY3QnLCB7dG86IHRvfSk7XHJcbiAgICAgIHRoaXMuYXBwLmxhc3RfbG9jYXRpb24gPSBbdGhpcy52ZXJiLCB0aGlzLnBhdGhdO1xyXG4gICAgICB0aGlzLmFwcC5zZXRMb2NhdGlvbih0byk7XHJcbiAgICAgIGlmIChuZXcgUmVnRXhwKHRvKS50ZXN0KGN1cnJlbnRfbG9jYXRpb24pKSB7XHJcbiAgICAgICAgdGhpcy5hcHAudHJpZ2dlcignbG9jYXRpb24tY2hhbmdlZCcpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIFRyaWdnZXJzIGV2ZW50cyBvbiBgYXBwYCB3aXRoaW4gdGhlIGN1cnJlbnQgY29udGV4dC5cclxuICAgIHRyaWdnZXI6IGZ1bmN0aW9uKG5hbWUsIGRhdGEpIHtcclxuICAgICAgaWYgKHR5cGVvZiBkYXRhID09ICd1bmRlZmluZWQnKSB7IGRhdGEgPSB7fTsgfVxyXG4gICAgICBpZiAoIWRhdGEuY29udGV4dCkgeyBkYXRhLmNvbnRleHQgPSB0aGlzOyB9XHJcbiAgICAgIHJldHVybiB0aGlzLmFwcC50cmlnZ2VyKG5hbWUsIGRhdGEpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBBIHNob3J0Y3V0IHRvIGFwcCdzIGBldmVudE5hbWVzcGFjZSgpYFxyXG4gICAgZXZlbnROYW1lc3BhY2U6IGZ1bmN0aW9uKCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5hcHAuZXZlbnROYW1lc3BhY2UoKTtcclxuICAgIH0sXHJcblxyXG4gICAgLy8gQSBzaG9ydGN1dCB0byBhcHAncyBgc3dhcCgpYFxyXG4gICAgc3dhcDogZnVuY3Rpb24oY29udGVudHMsIGNhbGxiYWNrKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmFwcC5zd2FwKGNvbnRlbnRzLCBjYWxsYmFjayk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIFJhaXNlcyBhIHBvc3NpYmxlIGBub3RGb3VuZCgpYCBlcnJvciBmb3IgdGhlIGN1cnJlbnQgcGF0aC5cclxuICAgIG5vdEZvdW5kOiBmdW5jdGlvbigpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuYXBwLm5vdEZvdW5kKHRoaXMudmVyYiwgdGhpcy5wYXRoKTtcclxuICAgIH0sXHJcblxyXG4gICAgLy8gRGVmYXVsdCBKU09OIHBhcnNpbmcgdXNlcyBqUXVlcnkncyBgcGFyc2VKU09OKClgLiBJbmNsdWRlIGBTYW1teS5KU09OYFxyXG4gICAgLy8gcGx1Z2luIGZvciB0aGUgbW9yZSBjb25mb3JtYW50IFwiY3JvY2tmb3JkIHNwZWNpYWxcIi5cclxuICAgIGpzb246IGZ1bmN0aW9uKHN0cmluZykge1xyXG4gICAgICByZXR1cm4gJC5wYXJzZUpTT04oc3RyaW5nKTtcclxuICAgIH0sXHJcblxyXG4gICAgLy8gLy89PiBTYW1teS5FdmVudENvbnRleHQ6IGdldCAjLyB7fVxyXG4gICAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkge1xyXG4gICAgICByZXR1cm4gXCJTYW1teS5FdmVudENvbnRleHQ6IFwiICsgW3RoaXMudmVyYiwgdGhpcy5wYXRoLCB0aGlzLnBhcmFtc10uam9pbignICcpO1xyXG4gICAgfVxyXG5cclxuICB9KTtcclxuXHJcbiAgcmV0dXJuIFNhbW15O1xyXG59KTtcclxuXHJcblxuOyBicm93c2VyaWZ5X3NoaW1fX2RlZmluZV9fbW9kdWxlX19leHBvcnRfXyh0eXBlb2YgU2FtbXkgIT0gXCJ1bmRlZmluZWRcIiA/IFNhbW15IDogd2luZG93LlNhbW15KTtcblxufSkuY2FsbChnbG9iYWwsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgZnVuY3Rpb24gZGVmaW5lRXhwb3J0KGV4KSB7IG1vZHVsZS5leHBvcnRzID0gZXg7IH0pO1xuIl19
},{"jquery":109}],94:[function(require,module,exports){
(function (global){

; jQuery = global.jQuery = require("jquery");
; var __browserify_shim_require__=require;(function browserifyShim(module, define, require) {
/*
Copyright 2012 Igor Vaynberg

Version: 3.4.2 Timestamp: Mon Aug 12 15:04:12 PDT 2013

This software is licensed under the Apache License, Version 2.0 (the "Apache License") or the GNU
General Public License version 2 (the "GPL License"). You may choose either license to govern your
use of this software only upon the condition that you accept all of the terms of either the Apache
License or the GPL License.

You may obtain a copy of the Apache License and the GPL License at:

    http://www.apache.org/licenses/LICENSE-2.0
    http://www.gnu.org/licenses/gpl-2.0.html

Unless required by applicable law or agreed to in writing, software distributed under the
Apache License or the GPL Licesnse is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
CONDITIONS OF ANY KIND, either express or implied. See the Apache License and the GPL License for
the specific language governing permissions and limitations under the Apache License and the GPL License.
*/
(function ($) {
    if(typeof $.fn.each2 == "undefined") {
        $.extend($.fn, {
            /*
            * 4-10 times faster .each replacement
            * use it carefully, as it overrides jQuery context of element on each iteration
            */
            each2 : function (c) {
                var j = $([0]), i = -1, l = this.length;
                while (
                    ++i < l
                    && (j.context = j[0] = this[i])
                    && c.call(j[0], i, j) !== false //"this"=DOM, i=index, j=jQuery object
                );
                return this;
            }
        });
    }
})(jQuery);

(function ($, undefined) {
    "use strict";
    /*global document, window, jQuery, console */

    if (window.Select2 !== undefined) {
        return;
    }

    var KEY, AbstractSelect2, SingleSelect2, MultiSelect2, nextUid, sizer,
        lastMousePosition={x:0,y:0}, $document, scrollBarDimensions,

    KEY = {
        TAB: 9,
        ENTER: 13,
        ESC: 27,
        SPACE: 32,
        LEFT: 37,
        UP: 38,
        RIGHT: 39,
        DOWN: 40,
        SHIFT: 16,
        CTRL: 17,
        ALT: 18,
        PAGE_UP: 33,
        PAGE_DOWN: 34,
        HOME: 36,
        END: 35,
        BACKSPACE: 8,
        DELETE: 46,
        isArrow: function (k) {
            k = k.which ? k.which : k;
            switch (k) {
            case KEY.LEFT:
            case KEY.RIGHT:
            case KEY.UP:
            case KEY.DOWN:
                return true;
            }
            return false;
        },
        isControl: function (e) {
            var k = e.which;
            switch (k) {
            case KEY.SHIFT:
            case KEY.CTRL:
            case KEY.ALT:
                return true;
            }

            if (e.metaKey) return true;

            return false;
        },
        isFunctionKey: function (k) {
            k = k.which ? k.which : k;
            return k >= 112 && k <= 123;
        }
    },
    MEASURE_SCROLLBAR_TEMPLATE = "<div class='select2-measure-scrollbar'></div>",

    DIACRITICS = {"\u24B6":"A","\uFF21":"A","\u00C0":"A","\u00C1":"A","\u00C2":"A","\u1EA6":"A","\u1EA4":"A","\u1EAA":"A","\u1EA8":"A","\u00C3":"A","\u0100":"A","\u0102":"A","\u1EB0":"A","\u1EAE":"A","\u1EB4":"A","\u1EB2":"A","\u0226":"A","\u01E0":"A","\u00C4":"A","\u01DE":"A","\u1EA2":"A","\u00C5":"A","\u01FA":"A","\u01CD":"A","\u0200":"A","\u0202":"A","\u1EA0":"A","\u1EAC":"A","\u1EB6":"A","\u1E00":"A","\u0104":"A","\u023A":"A","\u2C6F":"A","\uA732":"AA","\u00C6":"AE","\u01FC":"AE","\u01E2":"AE","\uA734":"AO","\uA736":"AU","\uA738":"AV","\uA73A":"AV","\uA73C":"AY","\u24B7":"B","\uFF22":"B","\u1E02":"B","\u1E04":"B","\u1E06":"B","\u0243":"B","\u0182":"B","\u0181":"B","\u24B8":"C","\uFF23":"C","\u0106":"C","\u0108":"C","\u010A":"C","\u010C":"C","\u00C7":"C","\u1E08":"C","\u0187":"C","\u023B":"C","\uA73E":"C","\u24B9":"D","\uFF24":"D","\u1E0A":"D","\u010E":"D","\u1E0C":"D","\u1E10":"D","\u1E12":"D","\u1E0E":"D","\u0110":"D","\u018B":"D","\u018A":"D","\u0189":"D","\uA779":"D","\u01F1":"DZ","\u01C4":"DZ","\u01F2":"Dz","\u01C5":"Dz","\u24BA":"E","\uFF25":"E","\u00C8":"E","\u00C9":"E","\u00CA":"E","\u1EC0":"E","\u1EBE":"E","\u1EC4":"E","\u1EC2":"E","\u1EBC":"E","\u0112":"E","\u1E14":"E","\u1E16":"E","\u0114":"E","\u0116":"E","\u00CB":"E","\u1EBA":"E","\u011A":"E","\u0204":"E","\u0206":"E","\u1EB8":"E","\u1EC6":"E","\u0228":"E","\u1E1C":"E","\u0118":"E","\u1E18":"E","\u1E1A":"E","\u0190":"E","\u018E":"E","\u24BB":"F","\uFF26":"F","\u1E1E":"F","\u0191":"F","\uA77B":"F","\u24BC":"G","\uFF27":"G","\u01F4":"G","\u011C":"G","\u1E20":"G","\u011E":"G","\u0120":"G","\u01E6":"G","\u0122":"G","\u01E4":"G","\u0193":"G","\uA7A0":"G","\uA77D":"G","\uA77E":"G","\u24BD":"H","\uFF28":"H","\u0124":"H","\u1E22":"H","\u1E26":"H","\u021E":"H","\u1E24":"H","\u1E28":"H","\u1E2A":"H","\u0126":"H","\u2C67":"H","\u2C75":"H","\uA78D":"H","\u24BE":"I","\uFF29":"I","\u00CC":"I","\u00CD":"I","\u00CE":"I","\u0128":"I","\u012A":"I","\u012C":"I","\u0130":"I","\u00CF":"I","\u1E2E":"I","\u1EC8":"I","\u01CF":"I","\u0208":"I","\u020A":"I","\u1ECA":"I","\u012E":"I","\u1E2C":"I","\u0197":"I","\u24BF":"J","\uFF2A":"J","\u0134":"J","\u0248":"J","\u24C0":"K","\uFF2B":"K","\u1E30":"K","\u01E8":"K","\u1E32":"K","\u0136":"K","\u1E34":"K","\u0198":"K","\u2C69":"K","\uA740":"K","\uA742":"K","\uA744":"K","\uA7A2":"K","\u24C1":"L","\uFF2C":"L","\u013F":"L","\u0139":"L","\u013D":"L","\u1E36":"L","\u1E38":"L","\u013B":"L","\u1E3C":"L","\u1E3A":"L","\u0141":"L","\u023D":"L","\u2C62":"L","\u2C60":"L","\uA748":"L","\uA746":"L","\uA780":"L","\u01C7":"LJ","\u01C8":"Lj","\u24C2":"M","\uFF2D":"M","\u1E3E":"M","\u1E40":"M","\u1E42":"M","\u2C6E":"M","\u019C":"M","\u24C3":"N","\uFF2E":"N","\u01F8":"N","\u0143":"N","\u00D1":"N","\u1E44":"N","\u0147":"N","\u1E46":"N","\u0145":"N","\u1E4A":"N","\u1E48":"N","\u0220":"N","\u019D":"N","\uA790":"N","\uA7A4":"N","\u01CA":"NJ","\u01CB":"Nj","\u24C4":"O","\uFF2F":"O","\u00D2":"O","\u00D3":"O","\u00D4":"O","\u1ED2":"O","\u1ED0":"O","\u1ED6":"O","\u1ED4":"O","\u00D5":"O","\u1E4C":"O","\u022C":"O","\u1E4E":"O","\u014C":"O","\u1E50":"O","\u1E52":"O","\u014E":"O","\u022E":"O","\u0230":"O","\u00D6":"O","\u022A":"O","\u1ECE":"O","\u0150":"O","\u01D1":"O","\u020C":"O","\u020E":"O","\u01A0":"O","\u1EDC":"O","\u1EDA":"O","\u1EE0":"O","\u1EDE":"O","\u1EE2":"O","\u1ECC":"O","\u1ED8":"O","\u01EA":"O","\u01EC":"O","\u00D8":"O","\u01FE":"O","\u0186":"O","\u019F":"O","\uA74A":"O","\uA74C":"O","\u01A2":"OI","\uA74E":"OO","\u0222":"OU","\u24C5":"P","\uFF30":"P","\u1E54":"P","\u1E56":"P","\u01A4":"P","\u2C63":"P","\uA750":"P","\uA752":"P","\uA754":"P","\u24C6":"Q","\uFF31":"Q","\uA756":"Q","\uA758":"Q","\u024A":"Q","\u24C7":"R","\uFF32":"R","\u0154":"R","\u1E58":"R","\u0158":"R","\u0210":"R","\u0212":"R","\u1E5A":"R","\u1E5C":"R","\u0156":"R","\u1E5E":"R","\u024C":"R","\u2C64":"R","\uA75A":"R","\uA7A6":"R","\uA782":"R","\u24C8":"S","\uFF33":"S","\u1E9E":"S","\u015A":"S","\u1E64":"S","\u015C":"S","\u1E60":"S","\u0160":"S","\u1E66":"S","\u1E62":"S","\u1E68":"S","\u0218":"S","\u015E":"S","\u2C7E":"S","\uA7A8":"S","\uA784":"S","\u24C9":"T","\uFF34":"T","\u1E6A":"T","\u0164":"T","\u1E6C":"T","\u021A":"T","\u0162":"T","\u1E70":"T","\u1E6E":"T","\u0166":"T","\u01AC":"T","\u01AE":"T","\u023E":"T","\uA786":"T","\uA728":"TZ","\u24CA":"U","\uFF35":"U","\u00D9":"U","\u00DA":"U","\u00DB":"U","\u0168":"U","\u1E78":"U","\u016A":"U","\u1E7A":"U","\u016C":"U","\u00DC":"U","\u01DB":"U","\u01D7":"U","\u01D5":"U","\u01D9":"U","\u1EE6":"U","\u016E":"U","\u0170":"U","\u01D3":"U","\u0214":"U","\u0216":"U","\u01AF":"U","\u1EEA":"U","\u1EE8":"U","\u1EEE":"U","\u1EEC":"U","\u1EF0":"U","\u1EE4":"U","\u1E72":"U","\u0172":"U","\u1E76":"U","\u1E74":"U","\u0244":"U","\u24CB":"V","\uFF36":"V","\u1E7C":"V","\u1E7E":"V","\u01B2":"V","\uA75E":"V","\u0245":"V","\uA760":"VY","\u24CC":"W","\uFF37":"W","\u1E80":"W","\u1E82":"W","\u0174":"W","\u1E86":"W","\u1E84":"W","\u1E88":"W","\u2C72":"W","\u24CD":"X","\uFF38":"X","\u1E8A":"X","\u1E8C":"X","\u24CE":"Y","\uFF39":"Y","\u1EF2":"Y","\u00DD":"Y","\u0176":"Y","\u1EF8":"Y","\u0232":"Y","\u1E8E":"Y","\u0178":"Y","\u1EF6":"Y","\u1EF4":"Y","\u01B3":"Y","\u024E":"Y","\u1EFE":"Y","\u24CF":"Z","\uFF3A":"Z","\u0179":"Z","\u1E90":"Z","\u017B":"Z","\u017D":"Z","\u1E92":"Z","\u1E94":"Z","\u01B5":"Z","\u0224":"Z","\u2C7F":"Z","\u2C6B":"Z","\uA762":"Z","\u24D0":"a","\uFF41":"a","\u1E9A":"a","\u00E0":"a","\u00E1":"a","\u00E2":"a","\u1EA7":"a","\u1EA5":"a","\u1EAB":"a","\u1EA9":"a","\u00E3":"a","\u0101":"a","\u0103":"a","\u1EB1":"a","\u1EAF":"a","\u1EB5":"a","\u1EB3":"a","\u0227":"a","\u01E1":"a","\u00E4":"a","\u01DF":"a","\u1EA3":"a","\u00E5":"a","\u01FB":"a","\u01CE":"a","\u0201":"a","\u0203":"a","\u1EA1":"a","\u1EAD":"a","\u1EB7":"a","\u1E01":"a","\u0105":"a","\u2C65":"a","\u0250":"a","\uA733":"aa","\u00E6":"ae","\u01FD":"ae","\u01E3":"ae","\uA735":"ao","\uA737":"au","\uA739":"av","\uA73B":"av","\uA73D":"ay","\u24D1":"b","\uFF42":"b","\u1E03":"b","\u1E05":"b","\u1E07":"b","\u0180":"b","\u0183":"b","\u0253":"b","\u24D2":"c","\uFF43":"c","\u0107":"c","\u0109":"c","\u010B":"c","\u010D":"c","\u00E7":"c","\u1E09":"c","\u0188":"c","\u023C":"c","\uA73F":"c","\u2184":"c","\u24D3":"d","\uFF44":"d","\u1E0B":"d","\u010F":"d","\u1E0D":"d","\u1E11":"d","\u1E13":"d","\u1E0F":"d","\u0111":"d","\u018C":"d","\u0256":"d","\u0257":"d","\uA77A":"d","\u01F3":"dz","\u01C6":"dz","\u24D4":"e","\uFF45":"e","\u00E8":"e","\u00E9":"e","\u00EA":"e","\u1EC1":"e","\u1EBF":"e","\u1EC5":"e","\u1EC3":"e","\u1EBD":"e","\u0113":"e","\u1E15":"e","\u1E17":"e","\u0115":"e","\u0117":"e","\u00EB":"e","\u1EBB":"e","\u011B":"e","\u0205":"e","\u0207":"e","\u1EB9":"e","\u1EC7":"e","\u0229":"e","\u1E1D":"e","\u0119":"e","\u1E19":"e","\u1E1B":"e","\u0247":"e","\u025B":"e","\u01DD":"e","\u24D5":"f","\uFF46":"f","\u1E1F":"f","\u0192":"f","\uA77C":"f","\u24D6":"g","\uFF47":"g","\u01F5":"g","\u011D":"g","\u1E21":"g","\u011F":"g","\u0121":"g","\u01E7":"g","\u0123":"g","\u01E5":"g","\u0260":"g","\uA7A1":"g","\u1D79":"g","\uA77F":"g","\u24D7":"h","\uFF48":"h","\u0125":"h","\u1E23":"h","\u1E27":"h","\u021F":"h","\u1E25":"h","\u1E29":"h","\u1E2B":"h","\u1E96":"h","\u0127":"h","\u2C68":"h","\u2C76":"h","\u0265":"h","\u0195":"hv","\u24D8":"i","\uFF49":"i","\u00EC":"i","\u00ED":"i","\u00EE":"i","\u0129":"i","\u012B":"i","\u012D":"i","\u00EF":"i","\u1E2F":"i","\u1EC9":"i","\u01D0":"i","\u0209":"i","\u020B":"i","\u1ECB":"i","\u012F":"i","\u1E2D":"i","\u0268":"i","\u0131":"i","\u24D9":"j","\uFF4A":"j","\u0135":"j","\u01F0":"j","\u0249":"j","\u24DA":"k","\uFF4B":"k","\u1E31":"k","\u01E9":"k","\u1E33":"k","\u0137":"k","\u1E35":"k","\u0199":"k","\u2C6A":"k","\uA741":"k","\uA743":"k","\uA745":"k","\uA7A3":"k","\u24DB":"l","\uFF4C":"l","\u0140":"l","\u013A":"l","\u013E":"l","\u1E37":"l","\u1E39":"l","\u013C":"l","\u1E3D":"l","\u1E3B":"l","\u017F":"l","\u0142":"l","\u019A":"l","\u026B":"l","\u2C61":"l","\uA749":"l","\uA781":"l","\uA747":"l","\u01C9":"lj","\u24DC":"m","\uFF4D":"m","\u1E3F":"m","\u1E41":"m","\u1E43":"m","\u0271":"m","\u026F":"m","\u24DD":"n","\uFF4E":"n","\u01F9":"n","\u0144":"n","\u00F1":"n","\u1E45":"n","\u0148":"n","\u1E47":"n","\u0146":"n","\u1E4B":"n","\u1E49":"n","\u019E":"n","\u0272":"n","\u0149":"n","\uA791":"n","\uA7A5":"n","\u01CC":"nj","\u24DE":"o","\uFF4F":"o","\u00F2":"o","\u00F3":"o","\u00F4":"o","\u1ED3":"o","\u1ED1":"o","\u1ED7":"o","\u1ED5":"o","\u00F5":"o","\u1E4D":"o","\u022D":"o","\u1E4F":"o","\u014D":"o","\u1E51":"o","\u1E53":"o","\u014F":"o","\u022F":"o","\u0231":"o","\u00F6":"o","\u022B":"o","\u1ECF":"o","\u0151":"o","\u01D2":"o","\u020D":"o","\u020F":"o","\u01A1":"o","\u1EDD":"o","\u1EDB":"o","\u1EE1":"o","\u1EDF":"o","\u1EE3":"o","\u1ECD":"o","\u1ED9":"o","\u01EB":"o","\u01ED":"o","\u00F8":"o","\u01FF":"o","\u0254":"o","\uA74B":"o","\uA74D":"o","\u0275":"o","\u01A3":"oi","\u0223":"ou","\uA74F":"oo","\u24DF":"p","\uFF50":"p","\u1E55":"p","\u1E57":"p","\u01A5":"p","\u1D7D":"p","\uA751":"p","\uA753":"p","\uA755":"p","\u24E0":"q","\uFF51":"q","\u024B":"q","\uA757":"q","\uA759":"q","\u24E1":"r","\uFF52":"r","\u0155":"r","\u1E59":"r","\u0159":"r","\u0211":"r","\u0213":"r","\u1E5B":"r","\u1E5D":"r","\u0157":"r","\u1E5F":"r","\u024D":"r","\u027D":"r","\uA75B":"r","\uA7A7":"r","\uA783":"r","\u24E2":"s","\uFF53":"s","\u00DF":"s","\u015B":"s","\u1E65":"s","\u015D":"s","\u1E61":"s","\u0161":"s","\u1E67":"s","\u1E63":"s","\u1E69":"s","\u0219":"s","\u015F":"s","\u023F":"s","\uA7A9":"s","\uA785":"s","\u1E9B":"s","\u24E3":"t","\uFF54":"t","\u1E6B":"t","\u1E97":"t","\u0165":"t","\u1E6D":"t","\u021B":"t","\u0163":"t","\u1E71":"t","\u1E6F":"t","\u0167":"t","\u01AD":"t","\u0288":"t","\u2C66":"t","\uA787":"t","\uA729":"tz","\u24E4":"u","\uFF55":"u","\u00F9":"u","\u00FA":"u","\u00FB":"u","\u0169":"u","\u1E79":"u","\u016B":"u","\u1E7B":"u","\u016D":"u","\u00FC":"u","\u01DC":"u","\u01D8":"u","\u01D6":"u","\u01DA":"u","\u1EE7":"u","\u016F":"u","\u0171":"u","\u01D4":"u","\u0215":"u","\u0217":"u","\u01B0":"u","\u1EEB":"u","\u1EE9":"u","\u1EEF":"u","\u1EED":"u","\u1EF1":"u","\u1EE5":"u","\u1E73":"u","\u0173":"u","\u1E77":"u","\u1E75":"u","\u0289":"u","\u24E5":"v","\uFF56":"v","\u1E7D":"v","\u1E7F":"v","\u028B":"v","\uA75F":"v","\u028C":"v","\uA761":"vy","\u24E6":"w","\uFF57":"w","\u1E81":"w","\u1E83":"w","\u0175":"w","\u1E87":"w","\u1E85":"w","\u1E98":"w","\u1E89":"w","\u2C73":"w","\u24E7":"x","\uFF58":"x","\u1E8B":"x","\u1E8D":"x","\u24E8":"y","\uFF59":"y","\u1EF3":"y","\u00FD":"y","\u0177":"y","\u1EF9":"y","\u0233":"y","\u1E8F":"y","\u00FF":"y","\u1EF7":"y","\u1E99":"y","\u1EF5":"y","\u01B4":"y","\u024F":"y","\u1EFF":"y","\u24E9":"z","\uFF5A":"z","\u017A":"z","\u1E91":"z","\u017C":"z","\u017E":"z","\u1E93":"z","\u1E95":"z","\u01B6":"z","\u0225":"z","\u0240":"z","\u2C6C":"z","\uA763":"z"};

    $document = $(document);

    nextUid=(function() { var counter=1; return function() { return counter++; }; }());


    function stripDiacritics(str) {
        var ret, i, l, c;

        if (!str || str.length < 1) return str;

        ret = "";
        for (i = 0, l = str.length; i < l; i++) {
            c = str.charAt(i);
            ret += DIACRITICS[c] || c;
        }
        return ret;
    }

    function indexOf(value, array) {
        var i = 0, l = array.length;
        for (; i < l; i = i + 1) {
            if (equal(value, array[i])) return i;
        }
        return -1;
    }

    function measureScrollbar () {
        var $template = $( MEASURE_SCROLLBAR_TEMPLATE );
        $template.appendTo('body');

        var dim = {
            width: $template.width() - $template[0].clientWidth,
            height: $template.height() - $template[0].clientHeight
        };
        $template.remove();

        return dim;
    }

    /**
     * Compares equality of a and b
     * @param a
     * @param b
     */
    function equal(a, b) {
        if (a === b) return true;
        if (a === undefined || b === undefined) return false;
        if (a === null || b === null) return false;
        // Check whether 'a' or 'b' is a string (primitive or object).
        // The concatenation of an empty string (+'') converts its argument to a string's primitive.
        if (a.constructor === String) return a+'' === b+''; // a+'' - in case 'a' is a String object
        if (b.constructor === String) return b+'' === a+''; // b+'' - in case 'b' is a String object
        return false;
    }

    /**
     * Splits the string into an array of values, trimming each value. An empty array is returned for nulls or empty
     * strings
     * @param string
     * @param separator
     */
    function splitVal(string, separator) {
        var val, i, l;
        if (string === null || string.length < 1) return [];
        val = string.split(separator);
        for (i = 0, l = val.length; i < l; i = i + 1) val[i] = $.trim(val[i]);
        return val;
    }

    function getSideBorderPadding(element) {
        return element.outerWidth(false) - element.width();
    }

    function installKeyUpChangeEvent(element) {
        var key="keyup-change-value";
        element.on("keydown", function () {
            if ($.data(element, key) === undefined) {
                $.data(element, key, element.val());
            }
        });
        element.on("keyup", function () {
            var val= $.data(element, key);
            if (val !== undefined && element.val() !== val) {
                $.removeData(element, key);
                element.trigger("keyup-change");
            }
        });
    }

    $document.on("mousemove", function (e) {
        lastMousePosition.x = e.pageX;
        lastMousePosition.y = e.pageY;
    });

    /**
     * filters mouse events so an event is fired only if the mouse moved.
     *
     * filters out mouse events that occur when mouse is stationary but
     * the elements under the pointer are scrolled.
     */
    function installFilteredMouseMove(element) {
        element.on("mousemove", function (e) {
            var lastpos = lastMousePosition;
            if (lastpos === undefined || lastpos.x !== e.pageX || lastpos.y !== e.pageY) {
                $(e.target).trigger("mousemove-filtered", e);
            }
        });
    }

    /**
     * Debounces a function. Returns a function that calls the original fn function only if no invocations have been made
     * within the last quietMillis milliseconds.
     *
     * @param quietMillis number of milliseconds to wait before invoking fn
     * @param fn function to be debounced
     * @param ctx object to be used as this reference within fn
     * @return debounced version of fn
     */
    function debounce(quietMillis, fn, ctx) {
        ctx = ctx || undefined;
        var timeout;
        return function () {
            var args = arguments;
            window.clearTimeout(timeout);
            timeout = window.setTimeout(function() {
                fn.apply(ctx, args);
            }, quietMillis);
        };
    }

    /**
     * A simple implementation of a thunk
     * @param formula function used to lazily initialize the thunk
     * @return {Function}
     */
    function thunk(formula) {
        var evaluated = false,
            value;
        return function() {
            if (evaluated === false) { value = formula(); evaluated = true; }
            return value;
        };
    };

    function installDebouncedScroll(threshold, element) {
        var notify = debounce(threshold, function (e) { element.trigger("scroll-debounced", e);});
        element.on("scroll", function (e) {
            if (indexOf(e.target, element.get()) >= 0) notify(e);
        });
    }

    function focus($el) {
        if ($el[0] === document.activeElement) return;

        /* set the focus in a 0 timeout - that way the focus is set after the processing
            of the current event has finished - which seems like the only reliable way
            to set focus */
        window.setTimeout(function() {
            var el=$el[0], pos=$el.val().length, range;

            $el.focus();

            /* make sure el received focus so we do not error out when trying to manipulate the caret.
                sometimes modals or others listeners may steal it after its set */
            if ($el.is(":visible") && el === document.activeElement) {

                /* after the focus is set move the caret to the end, necessary when we val()
                    just before setting focus */
                if(el.setSelectionRange)
                {
                    el.setSelectionRange(pos, pos);
                }
                else if (el.createTextRange) {
                    range = el.createTextRange();
                    range.collapse(false);
                    range.select();
                }
            }
        }, 0);
    }

    function getCursorInfo(el) {
        el = $(el)[0];
        var offset = 0;
        var length = 0;
        if ('selectionStart' in el) {
            offset = el.selectionStart;
            length = el.selectionEnd - offset;
        } else if ('selection' in document) {
            el.focus();
            var sel = document.selection.createRange();
            length = document.selection.createRange().text.length;
            sel.moveStart('character', -el.value.length);
            offset = sel.text.length - length;
        }
        return { offset: offset, length: length };
    }

    function killEvent(event) {
        event.preventDefault();
        event.stopPropagation();
    }
    function killEventImmediately(event) {
        event.preventDefault();
        event.stopImmediatePropagation();
    }

    function measureTextWidth(e) {
        if (!sizer){
            var style = e[0].currentStyle || window.getComputedStyle(e[0], null);
            sizer = $(document.createElement("div")).css({
                position: "absolute",
                left: "-10000px",
                top: "-10000px",
                display: "none",
                fontSize: style.fontSize,
                fontFamily: style.fontFamily,
                fontStyle: style.fontStyle,
                fontWeight: style.fontWeight,
                letterSpacing: style.letterSpacing,
                textTransform: style.textTransform,
                whiteSpace: "nowrap"
            });
            sizer.attr("class","select2-sizer");
            $("body").append(sizer);
        }
        sizer.text(e.val());
        return sizer.width();
    }

    function syncCssClasses(dest, src, adapter) {
        var classes, replacements = [], adapted;

        classes = dest.attr("class");
        if (classes) {
            classes = '' + classes; // for IE which returns object
            $(classes.split(" ")).each2(function() {
                if (this.indexOf("select2-") === 0) {
                    replacements.push(this);
                }
            });
        }
        classes = src.attr("class");
        if (classes) {
            classes = '' + classes; // for IE which returns object
            $(classes.split(" ")).each2(function() {
                if (this.indexOf("select2-") !== 0) {
                    adapted = adapter(this);
                    if (adapted) {
                        replacements.push(this);
                    }
                }
            });
        }
        dest.attr("class", replacements.join(" "));
    }


    function markMatch(text, term, markup, escapeMarkup) {
        var match=stripDiacritics(text.toUpperCase()).indexOf(stripDiacritics(term.toUpperCase())),
            tl=term.length;

        if (match<0) {
            markup.push(escapeMarkup(text));
            return;
        }

        markup.push(escapeMarkup(text.substring(0, match)));
        markup.push("<span class='select2-match'>");
        markup.push(escapeMarkup(text.substring(match, match + tl)));
        markup.push("</span>");
        markup.push(escapeMarkup(text.substring(match + tl, text.length)));
    }

    function defaultEscapeMarkup(markup) {
        var replace_map = {
            '\\': '&#92;',
            '&': '&amp;',
            '<': '&lt;',
            '>': '&gt;',
            '"': '&quot;',
            "'": '&#39;',
            "/": '&#47;'
        };

        return String(markup).replace(/[&<>"'\/\\]/g, function (match) {
            return replace_map[match];
        });
    }

    /**
     * Produces an ajax-based query function
     *
     * @param options object containing configuration paramters
     * @param options.params parameter map for the transport ajax call, can contain such options as cache, jsonpCallback, etc. see $.ajax
     * @param options.transport function that will be used to execute the ajax request. must be compatible with parameters supported by $.ajax
     * @param options.url url for the data
     * @param options.data a function(searchTerm, pageNumber, context) that should return an object containing query string parameters for the above url.
     * @param options.dataType request data type: ajax, jsonp, other datatatypes supported by jQuery's $.ajax function or the transport function if specified
     * @param options.quietMillis (optional) milliseconds to wait before making the ajaxRequest, helps debounce the ajax function if invoked too often
     * @param options.results a function(remoteData, pageNumber) that converts data returned form the remote request to the format expected by Select2.
     *      The expected format is an object containing the following keys:
     *      results array of objects that will be used as choices
     *      more (optional) boolean indicating whether there are more results available
     *      Example: {results:[{id:1, text:'Red'},{id:2, text:'Blue'}], more:true}
     */
    function ajax(options) {
        var timeout, // current scheduled but not yet executed request
            handler = null,
            quietMillis = options.quietMillis || 100,
            ajaxUrl = options.url,
            self = this;

        return function (query) {
            window.clearTimeout(timeout);
            timeout = window.setTimeout(function () {
                var data = options.data, // ajax data function
                    url = ajaxUrl, // ajax url string or function
                    transport = options.transport || $.fn.select2.ajaxDefaults.transport,
                    // deprecated - to be removed in 4.0  - use params instead
                    deprecated = {
                        type: options.type || 'GET', // set type of request (GET or POST)
                        cache: options.cache || false,
                        jsonpCallback: options.jsonpCallback||undefined,
                        dataType: options.dataType||"json"
                    },
                    params = $.extend({}, $.fn.select2.ajaxDefaults.params, deprecated);

                data = data ? data.call(self, query.term, query.page, query.context) : null;
                url = (typeof url === 'function') ? url.call(self, query.term, query.page, query.context) : url;

                if (handler) { handler.abort(); }

                if (options.params) {
                    if ($.isFunction(options.params)) {
                        $.extend(params, options.params.call(self));
                    } else {
                        $.extend(params, options.params);
                    }
                }

                $.extend(params, {
                    url: url,
                    dataType: options.dataType,
                    data: data,
                    success: function (data) {
                        // TODO - replace query.page with query so users have access to term, page, etc.
                        var results = options.results(data, query.page);
                        query.callback(results);
                    }
                });
                handler = transport.call(self, params);
            }, quietMillis);
        };
    }

    /**
     * Produces a query function that works with a local array
     *
     * @param options object containing configuration parameters. The options parameter can either be an array or an
     * object.
     *
     * If the array form is used it is assumed that it contains objects with 'id' and 'text' keys.
     *
     * If the object form is used ti is assumed that it contains 'data' and 'text' keys. The 'data' key should contain
     * an array of objects that will be used as choices. These objects must contain at least an 'id' key. The 'text'
     * key can either be a String in which case it is expected that each element in the 'data' array has a key with the
     * value of 'text' which will be used to match choices. Alternatively, text can be a function(item) that can extract
     * the text.
     */
    function local(options) {
        var data = options, // data elements
            dataText,
            tmp,
            text = function (item) { return ""+item.text; }; // function used to retrieve the text portion of a data item that is matched against the search

         if ($.isArray(data)) {
            tmp = data;
            data = { results: tmp };
        }

         if ($.isFunction(data) === false) {
            tmp = data;
            data = function() { return tmp; };
        }

        var dataItem = data();
        if (dataItem.text) {
            text = dataItem.text;
            // if text is not a function we assume it to be a key name
            if (!$.isFunction(text)) {
                dataText = dataItem.text; // we need to store this in a separate variable because in the next step data gets reset and data.text is no longer available
                text = function (item) { return item[dataText]; };
            }
        }

        return function (query) {
            var t = query.term, filtered = { results: [] }, process;
            if (t === "") {
                query.callback(data());
                return;
            }

            process = function(datum, collection) {
                var group, attr;
                datum = datum[0];
                if (datum.children) {
                    group = {};
                    for (attr in datum) {
                        if (datum.hasOwnProperty(attr)) group[attr]=datum[attr];
                    }
                    group.children=[];
                    $(datum.children).each2(function(i, childDatum) { process(childDatum, group.children); });
                    if (group.children.length || query.matcher(t, text(group), datum)) {
                        collection.push(group);
                    }
                } else {
                    if (query.matcher(t, text(datum), datum)) {
                        collection.push(datum);
                    }
                }
            };

            $(data().results).each2(function(i, datum) { process(datum, filtered.results); });
            query.callback(filtered);
        };
    }

    // TODO javadoc
    function tags(data) {
        var isFunc = $.isFunction(data);
        return function (query) {
            var t = query.term, filtered = {results: []};
            $(isFunc ? data() : data).each(function () {
                var isObject = this.text !== undefined,
                    text = isObject ? this.text : this;
                if (t === "" || query.matcher(t, text)) {
                    filtered.results.push(isObject ? this : {id: this, text: this});
                }
            });
            query.callback(filtered);
        };
    }

    /**
     * Checks if the formatter function should be used.
     *
     * Throws an error if it is not a function. Returns true if it should be used,
     * false if no formatting should be performed.
     *
     * @param formatter
     */
    function checkFormatter(formatter, formatterName) {
        if ($.isFunction(formatter)) return true;
        if (!formatter) return false;
        throw new Error(formatterName +" must be a function or a falsy value");
    }

    function evaluate(val) {
        return $.isFunction(val) ? val() : val;
    }

    function countResults(results) {
        var count = 0;
        $.each(results, function(i, item) {
            if (item.children) {
                count += countResults(item.children);
            } else {
                count++;
            }
        });
        return count;
    }

    /**
     * Default tokenizer. This function uses breaks the input on substring match of any string from the
     * opts.tokenSeparators array and uses opts.createSearchChoice to create the choice object. Both of those
     * two options have to be defined in order for the tokenizer to work.
     *
     * @param input text user has typed so far or pasted into the search field
     * @param selection currently selected choices
     * @param selectCallback function(choice) callback tho add the choice to selection
     * @param opts select2's opts
     * @return undefined/null to leave the current input unchanged, or a string to change the input to the returned value
     */
    function defaultTokenizer(input, selection, selectCallback, opts) {
        var original = input, // store the original so we can compare and know if we need to tell the search to update its text
            dupe = false, // check for whether a token we extracted represents a duplicate selected choice
            token, // token
            index, // position at which the separator was found
            i, l, // looping variables
            separator; // the matched separator

        if (!opts.createSearchChoice || !opts.tokenSeparators || opts.tokenSeparators.length < 1) return undefined;

        while (true) {
            index = -1;

            for (i = 0, l = opts.tokenSeparators.length; i < l; i++) {
                separator = opts.tokenSeparators[i];
                index = input.indexOf(separator);
                if (index >= 0) break;
            }

            if (index < 0) break; // did not find any token separator in the input string, bail

            token = input.substring(0, index);
            input = input.substring(index + separator.length);

            if (token.length > 0) {
                token = opts.createSearchChoice.call(this, token, selection);
                if (token !== undefined && token !== null && opts.id(token) !== undefined && opts.id(token) !== null) {
                    dupe = false;
                    for (i = 0, l = selection.length; i < l; i++) {
                        if (equal(opts.id(token), opts.id(selection[i]))) {
                            dupe = true; break;
                        }
                    }

                    if (!dupe) selectCallback(token);
                }
            }
        }

        if (original!==input) return input;
    }

    /**
     * Creates a new class
     *
     * @param superClass
     * @param methods
     */
    function clazz(SuperClass, methods) {
        var constructor = function () {};
        constructor.prototype = new SuperClass;
        constructor.prototype.constructor = constructor;
        constructor.prototype.parent = SuperClass.prototype;
        constructor.prototype = $.extend(constructor.prototype, methods);
        return constructor;
    }

    AbstractSelect2 = clazz(Object, {

        // abstract
        bind: function (func) {
            var self = this;
            return function () {
                func.apply(self, arguments);
            };
        },

        // abstract
        init: function (opts) {
            var results, search, resultsSelector = ".select2-results", disabled, readonly;

            // prepare options
            this.opts = opts = this.prepareOpts(opts);

            this.id=opts.id;

            // destroy if called on an existing component
            if (opts.element.data("select2") !== undefined &&
                opts.element.data("select2") !== null) {
                opts.element.data("select2").destroy();
            }

            this.container = this.createContainer();

            this.containerId="s2id_"+(opts.element.attr("id") || "autogen"+nextUid());
            this.containerSelector="#"+this.containerId.replace(/([;&,\.\+\*\~':"\!\^#$%@\[\]\(\)=>\|])/g, '\\$1');
            this.container.attr("id", this.containerId);

            // cache the body so future lookups are cheap
            this.body = thunk(function() { return opts.element.closest("body"); });

            syncCssClasses(this.container, this.opts.element, this.opts.adaptContainerCssClass);

            this.container.attr("style", opts.element.attr("style"));
            this.container.css(evaluate(opts.containerCss));
            this.container.addClass(evaluate(opts.containerCssClass));

            this.elementTabIndex = this.opts.element.attr("tabindex");

            // swap container for the element
            this.opts.element
                .data("select2", this)
                .attr("tabindex", "-1")
                .before(this.container);
            this.container.data("select2", this);

            this.dropdown = this.container.find(".select2-drop");
            this.dropdown.addClass(evaluate(opts.dropdownCssClass));
            this.dropdown.data("select2", this);

            syncCssClasses(this.dropdown, this.opts.element, this.opts.adaptDropdownCssClass);

            this.results = results = this.container.find(resultsSelector);
            this.search = search = this.container.find("input.select2-input");

            this.queryCount = 0;
            this.resultsPage = 0;
            this.context = null;

            // initialize the container
            this.initContainer();

            installFilteredMouseMove(this.results);
            this.dropdown.on("mousemove-filtered touchstart touchmove touchend", resultsSelector, this.bind(this.highlightUnderEvent));

            installDebouncedScroll(80, this.results);
            this.dropdown.on("scroll-debounced", resultsSelector, this.bind(this.loadMoreIfNeeded));

            // do not propagate change event from the search field out of the component
            $(this.container).on("change", ".select2-input", function(e) {e.stopPropagation();});
            $(this.dropdown).on("change", ".select2-input", function(e) {e.stopPropagation();});

            // if jquery.mousewheel plugin is installed we can prevent out-of-bounds scrolling of results via mousewheel
            if ($.fn.mousewheel) {
                results.mousewheel(function (e, delta, deltaX, deltaY) {
                    var top = results.scrollTop(), height;
                    if (deltaY > 0 && top - deltaY <= 0) {
                        results.scrollTop(0);
                        killEvent(e);
                    } else if (deltaY < 0 && results.get(0).scrollHeight - results.scrollTop() + deltaY <= results.height()) {
                        results.scrollTop(results.get(0).scrollHeight - results.height());
                        killEvent(e);
                    }
                });
            }

            installKeyUpChangeEvent(search);
            search.on("keyup-change input paste", this.bind(this.updateResults));
            search.on("focus", function () { search.addClass("select2-focused"); });
            search.on("blur", function () { search.removeClass("select2-focused");});

            this.dropdown.on("mouseup", resultsSelector, this.bind(function (e) {
                if ($(e.target).closest(".select2-result-selectable").length > 0) {
                    this.highlightUnderEvent(e);
                    this.selectHighlighted(e);
                }
            }));

            // trap all mouse events from leaving the dropdown. sometimes there may be a modal that is listening
            // for mouse events outside of itself so it can close itself. since the dropdown is now outside the select2's
            // dom it will trigger the popup close, which is not what we want
            this.dropdown.on("click mouseup mousedown", function (e) { e.stopPropagation(); });

            if ($.isFunction(this.opts.initSelection)) {
                // initialize selection based on the current value of the source element
                this.initSelection();

                // if the user has provided a function that can set selection based on the value of the source element
                // we monitor the change event on the element and trigger it, allowing for two way synchronization
                this.monitorSource();
            }

            if (opts.maximumInputLength !== null) {
                this.search.attr("maxlength", opts.maximumInputLength);
            }

            var disabled = opts.element.prop("disabled");
            if (disabled === undefined) disabled = false;
            this.enable(!disabled);

            var readonly = opts.element.prop("readonly");
            if (readonly === undefined) readonly = false;
            this.readonly(readonly);

            // Calculate size of scrollbar
            scrollBarDimensions = scrollBarDimensions || measureScrollbar();

            this.autofocus = opts.element.prop("autofocus");
            opts.element.prop("autofocus", false);
            if (this.autofocus) this.focus();

            this.nextSearchTerm = undefined;
        },

        // abstract
        destroy: function () {
            var element=this.opts.element, select2 = element.data("select2");

            this.close();

            if (this.propertyObserver) { delete this.propertyObserver; this.propertyObserver = null; }

            if (select2 !== undefined) {
                select2.container.remove();
                select2.dropdown.remove();
                element
                    .removeClass("select2-offscreen")
                    .removeData("select2")
                    .off(".select2")
                    .prop("autofocus", this.autofocus || false);
                if (this.elementTabIndex) {
                    element.attr({tabindex: this.elementTabIndex});
                } else {
                    element.removeAttr("tabindex");
                }
                element.show();
            }
        },

        // abstract
        optionToData: function(element) {
            if (element.is("option")) {
                return {
                    id:element.prop("value"),
                    text:element.text(),
                    element: element.get(),
                    css: element.attr("class"),
                    disabled: element.prop("disabled"),
                    locked: equal(element.attr("locked"), "locked") || equal(element.data("locked"), true)
                };
            } else if (element.is("optgroup")) {
                return {
                    text:element.attr("label"),
                    children:[],
                    element: element.get(),
                    css: element.attr("class")
                };
            }
        },

        // abstract
        prepareOpts: function (opts) {
            var element, select, idKey, ajaxUrl, self = this;

            element = opts.element;

            if (element.get(0).tagName.toLowerCase() === "select") {
                this.select = select = opts.element;
            }

            if (select) {
                // these options are not allowed when attached to a select because they are picked up off the element itself
                $.each(["id", "multiple", "ajax", "query", "createSearchChoice", "initSelection", "data", "tags"], function () {
                    if (this in opts) {
                        throw new Error("Option '" + this + "' is not allowed for Select2 when attached to a <select> element.");
                    }
                });
            }

            opts = $.extend({}, {
                populateResults: function(container, results, query) {
                    var populate,  data, result, children, id=this.opts.id;

                    populate=function(results, container, depth) {

                        var i, l, result, selectable, disabled, compound, node, label, innerContainer, formatted;

                        results = opts.sortResults(results, container, query);

                        for (i = 0, l = results.length; i < l; i = i + 1) {

                            result=results[i];

                            disabled = (result.disabled === true);
                            selectable = (!disabled) && (id(result) !== undefined);

                            compound=result.children && result.children.length > 0;

                            node=$("<li></li>");
                            node.addClass("select2-results-dept-"+depth);
                            node.addClass("select2-result");
                            node.addClass(selectable ? "select2-result-selectable" : "select2-result-unselectable");
                            if (disabled) { node.addClass("select2-disabled"); }
                            if (compound) { node.addClass("select2-result-with-children"); }
                            node.addClass(self.opts.formatResultCssClass(result));

                            label=$(document.createElement("div"));
                            label.addClass("select2-result-label");

                            formatted=opts.formatResult(result, label, query, self.opts.escapeMarkup);
                            if (formatted!==undefined) {
                                label.html(formatted);
                            }

                            node.append(label);

                            if (compound) {

                                innerContainer=$("<ul></ul>");
                                innerContainer.addClass("select2-result-sub");
                                populate(result.children, innerContainer, depth+1);
                                node.append(innerContainer);
                            }

                            node.data("select2-data", result);
                            container.append(node);
                        }
                    };

                    populate(results, container, 0);
                }
            }, $.fn.select2.defaults, opts);

            if (typeof(opts.id) !== "function") {
                idKey = opts.id;
                opts.id = function (e) { return e[idKey]; };
            }

            if ($.isArray(opts.element.data("select2Tags"))) {
                if ("tags" in opts) {
                    throw "tags specified as both an attribute 'data-select2-tags' and in options of Select2 " + opts.element.attr("id");
                }
                opts.tags=opts.element.data("select2Tags");
            }

            if (select) {
                opts.query = this.bind(function (query) {
                    var data = { results: [], more: false },
                        term = query.term,
                        children, placeholderOption, process;

                    process=function(element, collection) {
                        var group;
                        if (element.is("option")) {
                            if (query.matcher(term, element.text(), element)) {
                                collection.push(self.optionToData(element));
                            }
                        } else if (element.is("optgroup")) {
                            group=self.optionToData(element);
                            element.children().each2(function(i, elm) { process(elm, group.children); });
                            if (group.children.length>0) {
                                collection.push(group);
                            }
                        }
                    };

                    children=element.children();

                    // ignore the placeholder option if there is one
                    if (this.getPlaceholder() !== undefined && children.length > 0) {
                        placeholderOption = this.getPlaceholderOption();
                        if (placeholderOption) {
                            children=children.not(placeholderOption);
                        }
                    }

                    children.each2(function(i, elm) { process(elm, data.results); });

                    query.callback(data);
                });
                // this is needed because inside val() we construct choices from options and there id is hardcoded
                opts.id=function(e) { return e.id; };
                opts.formatResultCssClass = function(data) { return data.css; };
            } else {
                if (!("query" in opts)) {

                    if ("ajax" in opts) {
                        ajaxUrl = opts.element.data("ajax-url");
                        if (ajaxUrl && ajaxUrl.length > 0) {
                            opts.ajax.url = ajaxUrl;
                        }
                        opts.query = ajax.call(opts.element, opts.ajax);
                    } else if ("data" in opts) {
                        opts.query = local(opts.data);
                    } else if ("tags" in opts) {
                        opts.query = tags(opts.tags);
                        if (opts.createSearchChoice === undefined) {
                            opts.createSearchChoice = function (term) { return {id: $.trim(term), text: $.trim(term)}; };
                        }
                        if (opts.initSelection === undefined) {
                            opts.initSelection = function (element, callback) {
                                var data = [];
                                $(splitVal(element.val(), opts.separator)).each(function () {
                                    var id = this, text = this, tags=opts.tags;
                                    if ($.isFunction(tags)) tags=tags();
                                    $(tags).each(function() { if (equal(this.id, id)) { text = this.text; return false; } });
                                    data.push({id: id, text: text});
                                });

                                callback(data);
                            };
                        }
                    }
                }
            }
            if (typeof(opts.query) !== "function") {
                throw "query function not defined for Select2 " + opts.element.attr("id");
            }

            return opts;
        },

        /**
         * Monitor the original element for changes and update select2 accordingly
         */
        // abstract
        monitorSource: function () {
            var el = this.opts.element, sync;

            el.on("change.select2", this.bind(function (e) {
                if (this.opts.element.data("select2-change-triggered") !== true) {
                    this.initSelection();
                }
            }));

            sync = this.bind(function () {

                var enabled, readonly, self = this;

                // sync enabled state
                var disabled = el.prop("disabled");
                if (disabled === undefined) disabled = false;
                this.enable(!disabled);

                var readonly = el.prop("readonly");
                if (readonly === undefined) readonly = false;
                this.readonly(readonly);

                syncCssClasses(this.container, this.opts.element, this.opts.adaptContainerCssClass);
                this.container.addClass(evaluate(this.opts.containerCssClass));

                syncCssClasses(this.dropdown, this.opts.element, this.opts.adaptDropdownCssClass);
                this.dropdown.addClass(evaluate(this.opts.dropdownCssClass));

            });

            // mozilla and IE
            el.on("propertychange.select2 DOMAttrModified.select2", sync);


            // hold onto a reference of the callback to work around a chromium bug
            if (this.mutationCallback === undefined) {
                this.mutationCallback = function (mutations) {
                    mutations.forEach(sync);
                }
            }

            // safari and chrome
            if (typeof WebKitMutationObserver !== "undefined") {
                if (this.propertyObserver) { delete this.propertyObserver; this.propertyObserver = null; }
                this.propertyObserver = new WebKitMutationObserver(this.mutationCallback);
                this.propertyObserver.observe(el.get(0), { attributes:true, subtree:false });
            }
        },

        // abstract
        triggerSelect: function(data) {
            var evt = $.Event("select2-selecting", { val: this.id(data), object: data });
            this.opts.element.trigger(evt);
            return !evt.isDefaultPrevented();
        },

        /**
         * Triggers the change event on the source element
         */
        // abstract
        triggerChange: function (details) {

            details = details || {};
            details= $.extend({}, details, { type: "change", val: this.val() });
            // prevents recursive triggering
            this.opts.element.data("select2-change-triggered", true);
            this.opts.element.trigger(details);
            this.opts.element.data("select2-change-triggered", false);

            // some validation frameworks ignore the change event and listen instead to keyup, click for selects
            // so here we trigger the click event manually
            this.opts.element.click();

            // ValidationEngine ignorea the change event and listens instead to blur
            // so here we trigger the blur event manually if so desired
            if (this.opts.blurOnChange)
                this.opts.element.blur();
        },

        //abstract
        isInterfaceEnabled: function()
        {
            return this.enabledInterface === true;
        },

        // abstract
        enableInterface: function() {
            var enabled = this._enabled && !this._readonly,
                disabled = !enabled;

            if (enabled === this.enabledInterface) return false;

            this.container.toggleClass("select2-container-disabled", disabled);
            this.close();
            this.enabledInterface = enabled;

            return true;
        },

        // abstract
        enable: function(enabled) {
            if (enabled === undefined) enabled = true;
            if (this._enabled === enabled) return;
            this._enabled = enabled;

            this.opts.element.prop("disabled", !enabled);
            this.enableInterface();
        },

        // abstract
        disable: function() {
            this.enable(false);
        },

        // abstract
        readonly: function(enabled) {
            if (enabled === undefined) enabled = false;
            if (this._readonly === enabled) return false;
            this._readonly = enabled;

            this.opts.element.prop("readonly", enabled);
            this.enableInterface();
            return true;
        },

        // abstract
        opened: function () {
            return this.container.hasClass("select2-dropdown-open");
        },

        // abstract
        positionDropdown: function() {
            var $dropdown = this.dropdown,
                offset = this.container.offset(),
                height = this.container.outerHeight(false),
                width = this.container.outerWidth(false),
                dropHeight = $dropdown.outerHeight(false),
                viewPortRight = $(window).scrollLeft() + $(window).width(),
                viewportBottom = $(window).scrollTop() + $(window).height(),
                dropTop = offset.top + height,
                dropLeft = offset.left,
                enoughRoomBelow = dropTop + dropHeight <= viewportBottom,
                enoughRoomAbove = (offset.top - dropHeight) >= this.body().scrollTop(),
                dropWidth = $dropdown.outerWidth(false),
                enoughRoomOnRight = dropLeft + dropWidth <= viewPortRight,
                aboveNow = $dropdown.hasClass("select2-drop-above"),
                bodyOffset,
                above,
                css,
                resultsListNode;

            if (this.opts.dropdownAutoWidth) {
                resultsListNode = $('.select2-results', $dropdown)[0];
                $dropdown.addClass('select2-drop-auto-width');
                $dropdown.css('width', '');
                // Add scrollbar width to dropdown if vertical scrollbar is present
                dropWidth = $dropdown.outerWidth(false) + (resultsListNode.scrollHeight === resultsListNode.clientHeight ? 0 : scrollBarDimensions.width);
                dropWidth > width ? width = dropWidth : dropWidth = width;
                enoughRoomOnRight = dropLeft + dropWidth <= viewPortRight;
            }
            else {
                this.container.removeClass('select2-drop-auto-width');
            }

            //console.log("below/ droptop:", dropTop, "dropHeight", dropHeight, "sum", (dropTop+dropHeight)+" viewport bottom", viewportBottom, "enough?", enoughRoomBelow);
            //console.log("above/ offset.top", offset.top, "dropHeight", dropHeight, "top", (offset.top-dropHeight), "scrollTop", this.body().scrollTop(), "enough?", enoughRoomAbove);

            // fix positioning when body has an offset and is not position: static
            if (this.body().css('position') !== 'static') {
                bodyOffset = this.body().offset();
                dropTop -= bodyOffset.top;
                dropLeft -= bodyOffset.left;
            }

            // always prefer the current above/below alignment, unless there is not enough room
            if (aboveNow) {
                above = true;
                if (!enoughRoomAbove && enoughRoomBelow) above = false;
            } else {
                above = false;
                if (!enoughRoomBelow && enoughRoomAbove) above = true;
            }

            if (!enoughRoomOnRight) {
               dropLeft = offset.left + width - dropWidth;
            }

            if (above) {
                dropTop = offset.top - dropHeight;
                this.container.addClass("select2-drop-above");
                $dropdown.addClass("select2-drop-above");
            }
            else {
                this.container.removeClass("select2-drop-above");
                $dropdown.removeClass("select2-drop-above");
            }

            css = $.extend({
                top: dropTop,
                left: dropLeft,
                width: width
            }, evaluate(this.opts.dropdownCss));

            $dropdown.css(css);
        },

        // abstract
        shouldOpen: function() {
            var event;

            if (this.opened()) return false;

            if (this._enabled === false || this._readonly === true) return false;

            event = $.Event("select2-opening");
            this.opts.element.trigger(event);
            return !event.isDefaultPrevented();
        },

        // abstract
        clearDropdownAlignmentPreference: function() {
            // clear the classes used to figure out the preference of where the dropdown should be opened
            this.container.removeClass("select2-drop-above");
            this.dropdown.removeClass("select2-drop-above");
        },

        /**
         * Opens the dropdown
         *
         * @return {Boolean} whether or not dropdown was opened. This method will return false if, for example,
         * the dropdown is already open, or if the 'open' event listener on the element called preventDefault().
         */
        // abstract
        open: function () {

            if (!this.shouldOpen()) return false;

            this.opening();

            return true;
        },

        /**
         * Performs the opening of the dropdown
         */
        // abstract
        opening: function() {
            var cid = this.containerId,
                scroll = "scroll." + cid,
                resize = "resize."+cid,
                orient = "orientationchange."+cid,
                mask, maskCss;

            this.container.addClass("select2-dropdown-open").addClass("select2-container-active");

            this.clearDropdownAlignmentPreference();

            if(this.dropdown[0] !== this.body().children().last()[0]) {
                this.dropdown.detach().appendTo(this.body());
            }

            // create the dropdown mask if doesnt already exist
            mask = $("#select2-drop-mask");
            if (mask.length == 0) {
                mask = $(document.createElement("div"));
                mask.attr("id","select2-drop-mask").attr("class","select2-drop-mask");
                mask.hide();
                mask.appendTo(this.body());
                mask.on("mousedown touchstart click", function (e) {
                    var dropdown = $("#select2-drop"), self;
                    if (dropdown.length > 0) {
                        self=dropdown.data("select2");
                        if (self.opts.selectOnBlur) {
                            self.selectHighlighted({noFocus: true});
                        }
                        self.close({focus:false});
                        e.preventDefault();
                        e.stopPropagation();
                    }
                });
            }

            // ensure the mask is always right before the dropdown
            if (this.dropdown.prev()[0] !== mask[0]) {
                this.dropdown.before(mask);
            }

            // move the global id to the correct dropdown
            $("#select2-drop").removeAttr("id");
            this.dropdown.attr("id", "select2-drop");

            // show the elements
            mask.show();

            this.positionDropdown();
            this.dropdown.show();
            this.positionDropdown();

            this.dropdown.addClass("select2-drop-active");

            // attach listeners to events that can change the position of the container and thus require
            // the position of the dropdown to be updated as well so it does not come unglued from the container
            var that = this;
            this.container.parents().add(window).each(function () {
                $(this).on(resize+" "+scroll+" "+orient, function (e) {
                    that.positionDropdown();
                });
            });


        },

        // abstract
        close: function () {
            if (!this.opened()) return;

            var cid = this.containerId,
                scroll = "scroll." + cid,
                resize = "resize."+cid,
                orient = "orientationchange."+cid;

            // unbind event listeners
            this.container.parents().add(window).each(function () { $(this).off(scroll).off(resize).off(orient); });

            this.clearDropdownAlignmentPreference();

            $("#select2-drop-mask").hide();
            this.dropdown.removeAttr("id"); // only the active dropdown has the select2-drop id
            this.dropdown.hide();
            this.container.removeClass("select2-dropdown-open");
            this.results.empty();


            this.clearSearch();
            this.search.removeClass("select2-active");
            this.opts.element.trigger($.Event("select2-close"));
        },

        /**
         * Opens control, sets input value, and updates results.
         */
        // abstract
        externalSearch: function (term) {
            this.open();
            this.search.val(term);
            this.updateResults(false);
        },

        // abstract
        clearSearch: function () {

        },

        //abstract
        getMaximumSelectionSize: function() {
            return evaluate(this.opts.maximumSelectionSize);
        },

        // abstract
        ensureHighlightVisible: function () {
            var results = this.results, children, index, child, hb, rb, y, more;

            index = this.highlight();

            if (index < 0) return;

            if (index == 0) {

                // if the first element is highlighted scroll all the way to the top,
                // that way any unselectable headers above it will also be scrolled
                // into view

                results.scrollTop(0);
                return;
            }

            children = this.findHighlightableChoices().find('.select2-result-label');

            child = $(children[index]);

            hb = child.offset().top + child.outerHeight(true);

            // if this is the last child lets also make sure select2-more-results is visible
            if (index === children.length - 1) {
                more = results.find("li.select2-more-results");
                if (more.length > 0) {
                    hb = more.offset().top + more.outerHeight(true);
                }
            }

            rb = results.offset().top + results.outerHeight(true);
            if (hb > rb) {
                results.scrollTop(results.scrollTop() + (hb - rb));
            }
            y = child.offset().top - results.offset().top;

            // make sure the top of the element is visible
            if (y < 0 && child.css('display') != 'none' ) {
                results.scrollTop(results.scrollTop() + y); // y is negative
            }
        },

        // abstract
        findHighlightableChoices: function() {
            return this.results.find(".select2-result-selectable:not(.select2-selected):not(.select2-disabled)");
        },

        // abstract
        moveHighlight: function (delta) {
            var choices = this.findHighlightableChoices(),
                index = this.highlight();

            while (index > -1 && index < choices.length) {
                index += delta;
                var choice = $(choices[index]);
                if (choice.hasClass("select2-result-selectable") && !choice.hasClass("select2-disabled") && !choice.hasClass("select2-selected")) {
                    this.highlight(index);
                    break;
                }
            }
        },

        // abstract
        highlight: function (index) {
            var choices = this.findHighlightableChoices(),
                choice,
                data;

            if (arguments.length === 0) {
                return indexOf(choices.filter(".select2-highlighted")[0], choices.get());
            }

            if (index >= choices.length) index = choices.length - 1;
            if (index < 0) index = 0;

            this.removeHighlight();

            choice = $(choices[index]);
            choice.addClass("select2-highlighted");

            this.ensureHighlightVisible();

            data = choice.data("select2-data");
            if (data) {
                this.opts.element.trigger({ type: "select2-highlight", val: this.id(data), choice: data });
            }
        },

        removeHighlight: function() {
            this.results.find(".select2-highlighted").removeClass("select2-highlighted");
        },

        // abstract
        countSelectableResults: function() {
            return this.findHighlightableChoices().length;
        },

        // abstract
        highlightUnderEvent: function (event) {
            var el = $(event.target).closest(".select2-result-selectable");
            if (el.length > 0 && !el.is(".select2-highlighted")) {
                var choices = this.findHighlightableChoices();
                this.highlight(choices.index(el));
            } else if (el.length == 0) {
                // if we are over an unselectable item remove all highlights
                this.removeHighlight();
            }
        },

        // abstract
        loadMoreIfNeeded: function () {
            var results = this.results,
                more = results.find("li.select2-more-results"),
                below, // pixels the element is below the scroll fold, below==0 is when the element is starting to be visible
                offset = -1, // index of first element without data
                page = this.resultsPage + 1,
                self=this,
                term=this.search.val(),
                context=this.context;

            if (more.length === 0) return;
            below = more.offset().top - results.offset().top - results.height();

            if (below <= this.opts.loadMorePadding) {
                more.addClass("select2-active");
                this.opts.query({
                        element: this.opts.element,
                        term: term,
                        page: page,
                        context: context,
                        matcher: this.opts.matcher,
                        callback: this.bind(function (data) {

                    // ignore a response if the select2 has been closed before it was received
                    if (!self.opened()) return;


                    self.opts.populateResults.call(this, results, data.results, {term: term, page: page, context:context});
                    self.postprocessResults(data, false, false);

                    if (data.more===true) {
                        more.detach().appendTo(results).text(self.opts.formatLoadMore(page+1));
                        window.setTimeout(function() { self.loadMoreIfNeeded(); }, 10);
                    } else {
                        more.remove();
                    }
                    self.positionDropdown();
                    self.resultsPage = page;
                    self.context = data.context;
                    this.opts.element.trigger({ type: "select2-loaded", items: data });
                })});
            }
        },

        /**
         * Default tokenizer function which does nothing
         */
        tokenize: function() {

        },

        /**
         * @param initial whether or not this is the call to this method right after the dropdown has been opened
         */
        // abstract
        updateResults: function (initial) {
            var search = this.search,
                results = this.results,
                opts = this.opts,
                data,
                self = this,
                input,
                term = search.val(),
                lastTerm = $.data(this.container, "select2-last-term"),
                // sequence number used to drop out-of-order responses
                queryNumber;

            // prevent duplicate queries against the same term
            if (initial !== true && lastTerm && equal(term, lastTerm)) return;

            $.data(this.container, "select2-last-term", term);

            // if the search is currently hidden we do not alter the results
            if (initial !== true && (this.showSearchInput === false || !this.opened())) {
                return;
            }

            function postRender() {
                search.removeClass("select2-active");
                self.positionDropdown();
            }

            function render(html) {
                results.html(html);
                postRender();
            }

            queryNumber = ++this.queryCount;

            var maxSelSize = this.getMaximumSelectionSize();
            if (maxSelSize >=1) {
                data = this.data();
                if ($.isArray(data) && data.length >= maxSelSize && checkFormatter(opts.formatSelectionTooBig, "formatSelectionTooBig")) {
                    render("<li class='select2-selection-limit'>" + opts.formatSelectionTooBig(maxSelSize) + "</li>");
                    return;
                }
            }

            if (search.val().length < opts.minimumInputLength) {
                if (checkFormatter(opts.formatInputTooShort, "formatInputTooShort")) {
                    render("<li class='select2-no-results'>" + opts.formatInputTooShort(search.val(), opts.minimumInputLength) + "</li>");
                } else {
                    render("");
                }
                if (initial && this.showSearch) this.showSearch(true);
                return;
            }

            if (opts.maximumInputLength && search.val().length > opts.maximumInputLength) {
                if (checkFormatter(opts.formatInputTooLong, "formatInputTooLong")) {
                    render("<li class='select2-no-results'>" + opts.formatInputTooLong(search.val(), opts.maximumInputLength) + "</li>");
                } else {
                    render("");
                }
                return;
            }

            if (opts.formatSearching && this.findHighlightableChoices().length === 0) {
                render("<li class='select2-searching'>" + opts.formatSearching() + "</li>");
            }

            search.addClass("select2-active");

            this.removeHighlight();

            // give the tokenizer a chance to pre-process the input
            input = this.tokenize();
            if (input != undefined && input != null) {
                search.val(input);
            }

            this.resultsPage = 1;

            opts.query({
                element: opts.element,
                    term: search.val(),
                    page: this.resultsPage,
                    context: null,
                    matcher: opts.matcher,
                    callback: this.bind(function (data) {
                var def; // default choice

                // ignore old responses
                if (queryNumber != this.queryCount) {
                  return;
                }

                // ignore a response if the select2 has been closed before it was received
                if (!this.opened()) {
                    this.search.removeClass("select2-active");
                    return;
                }

                // save context, if any
                this.context = (data.context===undefined) ? null : data.context;
                // create a default choice and prepend it to the list
                if (this.opts.createSearchChoice && search.val() !== "") {
                    def = this.opts.createSearchChoice.call(self, search.val(), data.results);
                    if (def !== undefined && def !== null && self.id(def) !== undefined && self.id(def) !== null) {
                        if ($(data.results).filter(
                            function () {
                                return equal(self.id(this), self.id(def));
                            }).length === 0) {
                            data.results.unshift(def);
                        }
                    }
                }

                if (data.results.length === 0 && checkFormatter(opts.formatNoMatches, "formatNoMatches")) {
                    render("<li class='select2-no-results'>" + opts.formatNoMatches(search.val()) + "</li>");
                    return;
                }

                results.empty();
                self.opts.populateResults.call(this, results, data.results, {term: search.val(), page: this.resultsPage, context:null});

                if (data.more === true && checkFormatter(opts.formatLoadMore, "formatLoadMore")) {
                    results.append("<li class='select2-more-results'>" + self.opts.escapeMarkup(opts.formatLoadMore(this.resultsPage)) + "</li>");
                    window.setTimeout(function() { self.loadMoreIfNeeded(); }, 10);
                }

                this.postprocessResults(data, initial);

                postRender();

                this.opts.element.trigger({ type: "select2-loaded", items: data });
            })});
        },

        // abstract
        cancel: function () {
            this.close();
        },

        // abstract
        blur: function () {
            // if selectOnBlur == true, select the currently highlighted option
            if (this.opts.selectOnBlur)
                this.selectHighlighted({noFocus: true});

            this.close();
            this.container.removeClass("select2-container-active");
            // synonymous to .is(':focus'), which is available in jquery >= 1.6
            if (this.search[0] === document.activeElement) { this.search.blur(); }
            this.clearSearch();
            this.selection.find(".select2-search-choice-focus").removeClass("select2-search-choice-focus");
        },

        // abstract
        focusSearch: function () {
            focus(this.search);
        },

        // abstract
        selectHighlighted: function (options) {
            var index=this.highlight(),
                highlighted=this.results.find(".select2-highlighted"),
                data = highlighted.closest('.select2-result').data("select2-data");

            if (data) {
                this.highlight(index);
                this.onSelect(data, options);
            } else if (options && options.noFocus) {
                this.close();
            }
        },

        // abstract
        getPlaceholder: function () {
            var placeholderOption;
            return this.opts.element.attr("placeholder") ||
                this.opts.element.attr("data-placeholder") || // jquery 1.4 compat
                this.opts.element.data("placeholder") ||
                this.opts.placeholder ||
                ((placeholderOption = this.getPlaceholderOption()) !== undefined ? placeholderOption.text() : undefined);
        },

        // abstract
        getPlaceholderOption: function() {
            if (this.select) {
                var firstOption = this.select.children().first();
                if (this.opts.placeholderOption !== undefined ) {
                    //Determine the placeholder option based on the specified placeholderOption setting
                    return (this.opts.placeholderOption === "first" && firstOption) ||
                           (typeof this.opts.placeholderOption === "function" && this.opts.placeholderOption(this.select));
                } else if (firstOption.text() === "" && firstOption.val() === "") {
                    //No explicit placeholder option specified, use the first if it's blank
                    return firstOption;
                }
            }
        },

        /**
         * Get the desired width for the container element.  This is
         * derived first from option `width` passed to select2, then
         * the inline 'style' on the original element, and finally
         * falls back to the jQuery calculated element width.
         */
        // abstract
        initContainerWidth: function () {
            function resolveContainerWidth() {
                var style, attrs, matches, i, l;

                if (this.opts.width === "off") {
                    return null;
                } else if (this.opts.width === "element"){
                    return this.opts.element.outerWidth(false) === 0 ? 'auto' : this.opts.element.outerWidth(false) + 'px';
                } else if (this.opts.width === "copy" || this.opts.width === "resolve") {
                    // check if there is inline style on the element that contains width
                    style = this.opts.element.attr('style');
                    if (style !== undefined) {
                        attrs = style.split(';');
                        for (i = 0, l = attrs.length; i < l; i = i + 1) {
                            matches = attrs[i].replace(/\s/g, '')
                                .match(/[^-]width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i);
                            if (matches !== null && matches.length >= 1)
                                return matches[1];
                        }
                    }

                    if (this.opts.width === "resolve") {
                        // next check if css('width') can resolve a width that is percent based, this is sometimes possible
                        // when attached to input type=hidden or elements hidden via css
                        style = this.opts.element.css('width');
                        if (style.indexOf("%") > 0) return style;

                        // finally, fallback on the calculated width of the element
                        return (this.opts.element.outerWidth(false) === 0 ? 'auto' : this.opts.element.outerWidth(false) + 'px');
                    }

                    return null;
                } else if ($.isFunction(this.opts.width)) {
                    return this.opts.width();
                } else {
                    return this.opts.width;
               }
            };

            var width = resolveContainerWidth.call(this);
            if (width !== null) {
                this.container.css("width", width);
            }
        }
    });

    SingleSelect2 = clazz(AbstractSelect2, {

        // single

        createContainer: function () {
            var container = $(document.createElement("div")).attr({
                "class": "select2-container"
            }).html([
                "<a href='javascript:void(0)' onclick='return false;' class='select2-choice' tabindex='-1'>",
                "   <span class='select2-chosen'>&nbsp;</span><abbr class='select2-search-choice-close'></abbr>",
                "   <span class='select2-arrow'><i class='fa fa-sort brand-info select2-fa'></i></span>",
                "</a>",
                "<input class='select2-focusser select2-offscreen' type='text'/>",
                "<div class='select2-drop select2-display-none'>",
                "   <div class='select2-search'>",
                "       <input type='text' autocomplete='off' autocorrect='off' autocapitalize='off' spellcheck='false' class='select2-input'/>",
                "   </div>",
                "   <ul class='select2-results'>",
                "   </ul>",
                "</div>"].join(""));
            return container;
        },

        // single
        enableInterface: function() {
            if (this.parent.enableInterface.apply(this, arguments)) {
                this.focusser.prop("disabled", !this.isInterfaceEnabled());
            }
        },

        // single
        opening: function () {
            var el, range, len;

            if (this.opts.minimumResultsForSearch >= 0) {
                this.showSearch(true);
            }

            this.parent.opening.apply(this, arguments);

            if (this.showSearchInput !== false) {
                // IE appends focusser.val() at the end of field :/ so we manually insert it at the beginning using a range
                // all other browsers handle this just fine

                this.search.val(this.focusser.val());
            }
            this.search.focus();
            // move the cursor to the end after focussing, otherwise it will be at the beginning and
            // new text will appear *before* focusser.val()
            el = this.search.get(0);
            if (el.createTextRange) {
                range = el.createTextRange();
                range.collapse(false);
                range.select();
            } else if (el.setSelectionRange) {
                len = this.search.val().length;
                el.setSelectionRange(len, len);
            }

            // initializes search's value with nextSearchTerm (if defined by user)
            // ignore nextSearchTerm if the dropdown is opened by the user pressing a letter
            if(this.search.val() === "") {
                if(this.nextSearchTerm != undefined){
                    this.search.val(this.nextSearchTerm);
                    this.search.select();
                }
            }

            this.focusser.prop("disabled", true).val("");
            this.updateResults(true);
            this.opts.element.trigger($.Event("select2-open"));
        },

        // single
        close: function (params) {
            if (!this.opened()) return;
            this.parent.close.apply(this, arguments);

            params = params || {focus: true};
            this.focusser.removeAttr("disabled");

            if (params.focus) {
                this.focusser.focus();
            }
        },

        // single
        focus: function () {
            if (this.opened()) {
                this.close();
            } else {
                this.focusser.removeAttr("disabled");
                this.focusser.focus();
            }
        },

        // single
        isFocused: function () {
            return this.container.hasClass("select2-container-active");
        },

        // single
        cancel: function () {
            this.parent.cancel.apply(this, arguments);
            this.focusser.removeAttr("disabled");
            this.focusser.focus();
        },

        // single
        destroy: function() {
            $("label[for='" + this.focusser.attr('id') + "']")
                .attr('for', this.opts.element.attr("id"));
            this.parent.destroy.apply(this, arguments);
        },

        // single
        initContainer: function () {

            var selection,
                container = this.container,
                dropdown = this.dropdown;

            if (this.opts.minimumResultsForSearch < 0) {
                this.showSearch(false);
            } else {
                this.showSearch(true);
            }

            this.selection = selection = container.find(".select2-choice");

            this.focusser = container.find(".select2-focusser");

            // rewrite labels from original element to focusser
            this.focusser.attr("id", "s2id_autogen"+nextUid());

            $("label[for='" + this.opts.element.attr("id") + "']")
                .attr('for', this.focusser.attr('id'));

            this.focusser.attr("tabindex", this.elementTabIndex);

            this.search.on("keydown", this.bind(function (e) {
                if (!this.isInterfaceEnabled()) return;

                if (e.which === KEY.PAGE_UP || e.which === KEY.PAGE_DOWN) {
                    // prevent the page from scrolling
                    killEvent(e);
                    return;
                }

                switch (e.which) {
                    case KEY.UP:
                    case KEY.DOWN:
                        this.moveHighlight((e.which === KEY.UP) ? -1 : 1);
                        killEvent(e);
                        return;
                    case KEY.ENTER:
                        this.selectHighlighted();
                        killEvent(e);
                        return;
                    case KEY.TAB:
                        // if selectOnBlur == true, select the currently highlighted option
                        if (this.opts.selectOnBlur) {
                            this.selectHighlighted({noFocus: true});
                        }
                        return;
                    case KEY.ESC:
                        this.cancel(e);
                        killEvent(e);
                        return;
                }
            }));

            this.search.on("blur", this.bind(function(e) {
                // a workaround for chrome to keep the search field focussed when the scroll bar is used to scroll the dropdown.
                // without this the search field loses focus which is annoying
                if (document.activeElement === this.body().get(0)) {
                    window.setTimeout(this.bind(function() {
                        this.search.focus();
                    }), 0);
                }
            }));

            this.focusser.on("keydown", this.bind(function (e) {
                if (!this.isInterfaceEnabled()) return;

                if (e.which === KEY.TAB || KEY.isControl(e) || KEY.isFunctionKey(e) || e.which === KEY.ESC) {
                    return;
                }

                if (this.opts.openOnEnter === false && e.which === KEY.ENTER) {
                    killEvent(e);
                    return;
                }

                if (e.which == KEY.DOWN || e.which == KEY.UP
                    || (e.which == KEY.ENTER && this.opts.openOnEnter)) {

                    if (e.altKey || e.ctrlKey || e.shiftKey || e.metaKey) return;

                    this.open();
                    killEvent(e);
                    return;
                }

                if (e.which == KEY.DELETE || e.which == KEY.BACKSPACE) {
                    if (this.opts.allowClear) {
                        this.clear();
                    }
                    killEvent(e);
                    return;
                }
            }));


            installKeyUpChangeEvent(this.focusser);
            this.focusser.on("keyup-change input", this.bind(function(e) {
                if (this.opts.minimumResultsForSearch >= 0) {
                    e.stopPropagation();
                    if (this.opened()) return;
                    this.open();
                }
            }));

            selection.on("mousedown", "abbr", this.bind(function (e) {
                if (!this.isInterfaceEnabled()) return;
                this.clear();
                killEventImmediately(e);
                this.close();
                this.selection.focus();
            }));

            selection.on("mousedown", this.bind(function (e) {

                if (!this.container.hasClass("select2-container-active")) {
                    this.opts.element.trigger($.Event("select2-focus"));
                }

                if (this.opened()) {
                    this.close();
                } else if (this.isInterfaceEnabled()) {
                    this.open();
                }

                killEvent(e);
            }));

            dropdown.on("mousedown", this.bind(function() { this.search.focus(); }));

            selection.on("focus", this.bind(function(e) {
                killEvent(e);
            }));

            this.focusser.on("focus", this.bind(function(){
                if (!this.container.hasClass("select2-container-active")) {
                    this.opts.element.trigger($.Event("select2-focus"));
                }
                this.container.addClass("select2-container-active");
            })).on("blur", this.bind(function() {
                if (!this.opened()) {
                    this.container.removeClass("select2-container-active");
                    this.opts.element.trigger($.Event("select2-blur"));
                }
            }));
            this.search.on("focus", this.bind(function(){
                if (!this.container.hasClass("select2-container-active")) {
                    this.opts.element.trigger($.Event("select2-focus"));
                }
                this.container.addClass("select2-container-active");
            }));

            this.initContainerWidth();
            this.opts.element.addClass("select2-offscreen");
            this.setPlaceholder();

        },

        // single
        clear: function(triggerChange) {
            var data=this.selection.data("select2-data");
            if (data) { // guard against queued quick consecutive clicks
                var placeholderOption = this.getPlaceholderOption();
                this.opts.element.val(placeholderOption ? placeholderOption.val() : "");
                this.selection.find(".select2-chosen").empty();
                this.selection.removeData("select2-data");
                this.setPlaceholder();

                if (triggerChange !== false){
                    this.opts.element.trigger({ type: "select2-removed", val: this.id(data), choice: data });
                    this.triggerChange({removed:data});
                }
            }
        },

        /**
         * Sets selection based on source element's value
         */
        // single
        initSelection: function () {
            var selected;
            if (this.isPlaceholderOptionSelected()) {
                this.updateSelection(null);
                this.close();
                this.setPlaceholder();
            } else {
                var self = this;
                this.opts.initSelection.call(null, this.opts.element, function(selected){
                    if (selected !== undefined && selected !== null) {
                        self.updateSelection(selected);
                        self.close();
                        self.setPlaceholder();
                    }
                });
            }
        },

        isPlaceholderOptionSelected: function() {
            var placeholderOption;
            if (!this.opts.placeholder) return false; // no placeholder specified so no option should be considered
            return ((placeholderOption = this.getPlaceholderOption()) !== undefined && placeholderOption.is(':selected'))
                || (this.opts.element.val() === "")
                || (this.opts.element.val() === undefined)
                || (this.opts.element.val() === null);
        },

        // single
        prepareOpts: function () {
            var opts = this.parent.prepareOpts.apply(this, arguments),
                self=this;

            if (opts.element.get(0).tagName.toLowerCase() === "select") {
                // install the selection initializer
                opts.initSelection = function (element, callback) {
                    var selected = element.find(":selected");
                    // a single select box always has a value, no need to null check 'selected'
                    callback(self.optionToData(selected));
                };
            } else if ("data" in opts) {
                // install default initSelection when applied to hidden input and data is local
                opts.initSelection = opts.initSelection || function (element, callback) {
                    var id = element.val();
                    //search in data by id, storing the actual matching item
                    var match = null;
                    opts.query({
                        matcher: function(term, text, el){
                            var is_match = equal(id, opts.id(el));
                            if (is_match) {
                                match = el;
                            }
                            return is_match;
                        },
                        callback: !$.isFunction(callback) ? $.noop : function() {
                            callback(match);
                        }
                    });
                };
            }

            return opts;
        },

        // single
        getPlaceholder: function() {
            // if a placeholder is specified on a single select without a valid placeholder option ignore it
            if (this.select) {
                if (this.getPlaceholderOption() === undefined) {
                    return undefined;
                }
            }

            return this.parent.getPlaceholder.apply(this, arguments);
        },

        // single
        setPlaceholder: function () {
            var placeholder = this.getPlaceholder();

            if (this.isPlaceholderOptionSelected() && placeholder !== undefined) {

                // check for a placeholder option if attached to a select
                if (this.select && this.getPlaceholderOption() === undefined) return;

                this.selection.find(".select2-chosen").html(this.opts.escapeMarkup(placeholder));

                this.selection.addClass("select2-default");

                this.container.removeClass("select2-allowclear");
            }
        },

        // single
        postprocessResults: function (data, initial, noHighlightUpdate) {
            var selected = 0, self = this, showSearchInput = true;

            // find the selected element in the result list

            this.findHighlightableChoices().each2(function (i, elm) {
                if (equal(self.id(elm.data("select2-data")), self.opts.element.val())) {
                    selected = i;
                    return false;
                }
            });

            // and highlight it
            if (noHighlightUpdate !== false) {
                if (initial === true && selected >= 0) {
                    this.highlight(selected);
                } else {
                    this.highlight(0);
                }
            }

            // hide the search box if this is the first we got the results and there are enough of them for search

            if (initial === true) {
                var min = this.opts.minimumResultsForSearch;
                if (min >= 0) {
                    this.showSearch(countResults(data.results) >= min);
                }
            }
        },

        // single
        showSearch: function(showSearchInput) {
            if (this.showSearchInput === showSearchInput) return;

            this.showSearchInput = showSearchInput;

            this.dropdown.find(".select2-search").toggleClass("select2-search-hidden", !showSearchInput);
            this.dropdown.find(".select2-search").toggleClass("select2-offscreen", !showSearchInput);
            //add "select2-with-searchbox" to the container if search box is shown
            $(this.dropdown, this.container).toggleClass("select2-with-searchbox", showSearchInput);
        },

        // single
        onSelect: function (data, options) {

            if (!this.triggerSelect(data)) { return; }

            var old = this.opts.element.val(),
                oldData = this.data();

            this.opts.element.val(this.id(data));
            this.updateSelection(data);

            this.opts.element.trigger({ type: "select2-selected", val: this.id(data), choice: data });

            this.nextSearchTerm = this.opts.nextSearchTerm(data, this.search.val());
            this.close();

            if (!options || !options.noFocus)
                this.selection.focus();

            if (!equal(old, this.id(data))) { this.triggerChange({added:data,removed:oldData}); }
        },

        // single
        updateSelection: function (data) {

            var container=this.selection.find(".select2-chosen"), formatted, cssClass;

            this.selection.data("select2-data", data);

            container.empty();
            if (data !== null) {
                formatted=this.opts.formatSelection(data, container, this.opts.escapeMarkup);
            }
            if (formatted !== undefined) {
                container.append(formatted);
            }
            cssClass=this.opts.formatSelectionCssClass(data, container);
            if (cssClass !== undefined) {
                container.addClass(cssClass);
            }

            this.selection.removeClass("select2-default");

            if (this.opts.allowClear && this.getPlaceholder() !== undefined) {
                this.container.addClass("select2-allowclear");
            }
        },

        // single
        val: function () {
            var val,
                triggerChange = false,
                data = null,
                self = this,
                oldData = this.data();

            if (arguments.length === 0) {
                return this.opts.element.val();
            }

            val = arguments[0];

            if (arguments.length > 1) {
                triggerChange = arguments[1];
            }

            if (this.select) {
                this.select
                    .val(val)
                    .find(":selected").each2(function (i, elm) {
                        data = self.optionToData(elm);
                        return false;
                    });
                this.updateSelection(data);
                this.setPlaceholder();
                if (triggerChange) {
                    this.triggerChange({added: data, removed:oldData});
                }
            } else {
                // val is an id. !val is true for [undefined,null,'',0] - 0 is legal
                if (!val && val !== 0) {
                    this.clear(triggerChange);
                    return;
                }
                if (this.opts.initSelection === undefined) {
                    throw new Error("cannot call val() if initSelection() is not defined");
                }
                this.opts.element.val(val);
                this.opts.initSelection(this.opts.element, function(data){
                    self.opts.element.val(!data ? "" : self.id(data));
                    self.updateSelection(data);
                    self.setPlaceholder();
                    if (triggerChange) {
                        self.triggerChange({added: data, removed:oldData});
                    }
                });
            }
        },

        // single
        clearSearch: function () {
            this.search.val("");
            this.focusser.val("");
        },

        // single
        data: function(value) {
            var data,
                triggerChange = false;

            if (arguments.length === 0) {
                data = this.selection.data("select2-data");
                if (data == undefined) data = null;
                return data;
            } else {
                if (arguments.length > 1) {
                    triggerChange = arguments[1];
                }
                if (!value) {
                    this.clear(triggerChange);
                } else {
                    data = this.data();
                    this.opts.element.val(!value ? "" : this.id(value));
                    this.updateSelection(value);
                    if (triggerChange) {
                        this.triggerChange({added: value, removed:data});
                    }
                }
            }
        }
    });

    MultiSelect2 = clazz(AbstractSelect2, {

        // multi
        createContainer: function () {
            var container = $(document.createElement("div")).attr({
                "class": "select2-container select2-container-multi"
            }).html([
                "<ul class='select2-choices'>",
                "  <li class='select2-search-field'>",
                "    <input type='text' autocomplete='off' autocorrect='off' autocapitalize='off' spellcheck='false' class='select2-input'>",
                "  </li>",
                "</ul>",
                "<div class='select2-drop select2-drop-multi select2-display-none'>",
                "   <ul class='select2-results'>",
                "   </ul>",
                "</div>"].join(""));
            return container;
        },

        // multi
        prepareOpts: function () {
            var opts = this.parent.prepareOpts.apply(this, arguments),
                self=this;

            // TODO validate placeholder is a string if specified

            if (opts.element.get(0).tagName.toLowerCase() === "select") {
                // install sthe selection initializer
                opts.initSelection = function (element, callback) {

                    var data = [];

                    element.find(":selected").each2(function (i, elm) {
                        data.push(self.optionToData(elm));
                    });
                    callback(data);
                };
            } else if ("data" in opts) {
                // install default initSelection when applied to hidden input and data is local
                opts.initSelection = opts.initSelection || function (element, callback) {
                    var ids = splitVal(element.val(), opts.separator);
                    //search in data by array of ids, storing matching items in a list
                    var matches = [];
                    opts.query({
                        matcher: function(term, text, el){
                            var is_match = $.grep(ids, function(id) {
                                return equal(id, opts.id(el));
                            }).length;
                            if (is_match) {
                                matches.push(el);
                            }
                            return is_match;
                        },
                        callback: !$.isFunction(callback) ? $.noop : function() {
                            // reorder matches based on the order they appear in the ids array because right now
                            // they are in the order in which they appear in data array
                            var ordered = [];
                            for (var i = 0; i < ids.length; i++) {
                                var id = ids[i];
                                for (var j = 0; j < matches.length; j++) {
                                    var match = matches[j];
                                    if (equal(id, opts.id(match))) {
                                        ordered.push(match);
                                        matches.splice(j, 1);
                                        break;
                                    }
                                }
                            }
                            callback(ordered);
                        }
                    });
                };
            }

            return opts;
        },

        selectChoice: function (choice) {

            var selected = this.container.find(".select2-search-choice-focus");
            if (selected.length && choice && choice[0] == selected[0]) {

            } else {
                if (selected.length) {
                    this.opts.element.trigger("choice-deselected", selected);
                }
                selected.removeClass("select2-search-choice-focus");
                if (choice && choice.length) {
                    this.close();
                    choice.addClass("select2-search-choice-focus");
                    this.opts.element.trigger("choice-selected", choice);
                }
            }
        },

        // multi
        destroy: function() {
            $("label[for='" + this.search.attr('id') + "']")
                .attr('for', this.opts.element.attr("id"));
            this.parent.destroy.apply(this, arguments);
        },

        // multi
        initContainer: function () {

            var selector = ".select2-choices", selection;

            this.searchContainer = this.container.find(".select2-search-field");
            this.selection = selection = this.container.find(selector);

            var _this = this;
            this.selection.on("click", ".select2-search-choice", function (e) {
                //killEvent(e);
                _this.search[0].focus();
                _this.selectChoice($(this));
            });

            // rewrite labels from original element to focusser
            this.search.attr("id", "s2id_autogen"+nextUid());
            $("label[for='" + this.opts.element.attr("id") + "']")
                .attr('for', this.search.attr('id'));

            this.search.on("input paste", this.bind(function() {
                if (!this.isInterfaceEnabled()) return;
                if (!this.opened()) {
                    this.open();
                }
            }));

            this.search.attr("tabindex", this.elementTabIndex);

            this.keydowns = 0;
            this.search.on("keydown", this.bind(function (e) {
                if (!this.isInterfaceEnabled()) return;

                ++this.keydowns;
                var selected = selection.find(".select2-search-choice-focus");
                var prev = selected.prev(".select2-search-choice:not(.select2-locked)");
                var next = selected.next(".select2-search-choice:not(.select2-locked)");
                var pos = getCursorInfo(this.search);

                if (selected.length &&
                    (e.which == KEY.LEFT || e.which == KEY.RIGHT || e.which == KEY.BACKSPACE || e.which == KEY.DELETE || e.which == KEY.ENTER)) {
                    var selectedChoice = selected;
                    if (e.which == KEY.LEFT && prev.length) {
                        selectedChoice = prev;
                    }
                    else if (e.which == KEY.RIGHT) {
                        selectedChoice = next.length ? next : null;
                    }
                    else if (e.which === KEY.BACKSPACE) {
                        this.unselect(selected.first());
                        this.search.width(10);
                        selectedChoice = prev.length ? prev : next;
                    } else if (e.which == KEY.DELETE) {
                        this.unselect(selected.first());
                        this.search.width(10);
                        selectedChoice = next.length ? next : null;
                    } else if (e.which == KEY.ENTER) {
                        selectedChoice = null;
                    }

                    this.selectChoice(selectedChoice);
                    killEvent(e);
                    if (!selectedChoice || !selectedChoice.length) {
                        this.open();
                    }
                    return;
                } else if (((e.which === KEY.BACKSPACE && this.keydowns == 1)
                    || e.which == KEY.LEFT) && (pos.offset == 0 && !pos.length)) {

                    this.selectChoice(selection.find(".select2-search-choice:not(.select2-locked)").last());
                    killEvent(e);
                    return;
                } else {
                    this.selectChoice(null);
                }

                if (this.opened()) {
                    switch (e.which) {
                    case KEY.UP:
                    case KEY.DOWN:
                        this.moveHighlight((e.which === KEY.UP) ? -1 : 1);
                        killEvent(e);
                        return;
                    case KEY.ENTER:
                        this.selectHighlighted();
                        killEvent(e);
                        return;
                    case KEY.TAB:
                        // if selectOnBlur == true, select the currently highlighted option
                        if (this.opts.selectOnBlur) {
                            this.selectHighlighted({noFocus:true});
                        }
                        this.close();
                        return;
                    case KEY.ESC:
                        this.cancel(e);
                        killEvent(e);
                        return;
                    }
                }

                if (e.which === KEY.TAB || KEY.isControl(e) || KEY.isFunctionKey(e)
                 || e.which === KEY.BACKSPACE || e.which === KEY.ESC) {
                    return;
                }

                if (e.which === KEY.ENTER) {
                    if (this.opts.openOnEnter === false) {
                        return;
                    } else if (e.altKey || e.ctrlKey || e.shiftKey || e.metaKey) {
                        return;
                    }
                }

                this.open();

                if (e.which === KEY.PAGE_UP || e.which === KEY.PAGE_DOWN) {
                    // prevent the page from scrolling
                    killEvent(e);
                }

                if (e.which === KEY.ENTER) {
                    // prevent form from being submitted
                    killEvent(e);
                }

            }));

            this.search.on("keyup", this.bind(function (e) {
                this.keydowns = 0;
                this.resizeSearch();
            })
            );

            this.search.on("blur", this.bind(function(e) {
                this.container.removeClass("select2-container-active");
                this.search.removeClass("select2-focused");
                this.selectChoice(null);
                if (!this.opened()) this.clearSearch();
                e.stopImmediatePropagation();
                this.opts.element.trigger($.Event("select2-blur"));
            }));

            this.container.on("click", selector, this.bind(function (e) {
                if (!this.isInterfaceEnabled()) return;
                if ($(e.target).closest(".select2-search-choice").length > 0) {
                    // clicked inside a select2 search choice, do not open
                    return;
                }
                this.selectChoice(null);
                this.clearPlaceholder();
                if (!this.container.hasClass("select2-container-active")) {
                    this.opts.element.trigger($.Event("select2-focus"));
                }
                this.open();
                this.focusSearch();
                e.preventDefault();
            }));

            this.container.on("focus", selector, this.bind(function () {
                if (!this.isInterfaceEnabled()) return;
                if (!this.container.hasClass("select2-container-active")) {
                    this.opts.element.trigger($.Event("select2-focus"));
                }
                this.container.addClass("select2-container-active");
                this.dropdown.addClass("select2-drop-active");
                this.clearPlaceholder();
            }));

            this.initContainerWidth();
            this.opts.element.addClass("select2-offscreen");

            // set the placeholder if necessary
            this.clearSearch();
        },

        // multi
        enableInterface: function() {
            if (this.parent.enableInterface.apply(this, arguments)) {
                this.search.prop("disabled", !this.isInterfaceEnabled());
            }
        },

        // multi
        initSelection: function () {
            var data;
            if (this.opts.element.val() === "" && this.opts.element.text() === "") {
                this.updateSelection([]);
                this.close();
                // set the placeholder if necessary
                this.clearSearch();
            }
            if (this.select || this.opts.element.val() !== "") {
                var self = this;
                this.opts.initSelection.call(null, this.opts.element, function(data){
                    if (data !== undefined && data !== null) {
                        self.updateSelection(data);
                        self.close();
                        // set the placeholder if necessary
                        self.clearSearch();
                    }
                });
            }
        },

        // multi
        clearSearch: function () {
            var placeholder = this.getPlaceholder(),
                maxWidth = this.getMaxSearchWidth();

            if (placeholder !== undefined  && this.getVal().length === 0 && this.search.hasClass("select2-focused") === false) {
                this.search.val(placeholder).addClass("select2-default");
                // stretch the search box to full width of the container so as much of the placeholder is visible as possible
                // we could call this.resizeSearch(), but we do not because that requires a sizer and we do not want to create one so early because of a firefox bug, see #944
                this.search.width(maxWidth > 0 ? maxWidth : this.container.css("width"));
            } else {
                this.search.val("").width(10);
            }
        },

        // multi
        clearPlaceholder: function () {
            if (this.search.hasClass("select2-default")) {
                this.search.val("").removeClass("select2-default");
            }
        },

        // multi
        opening: function () {
            this.clearPlaceholder(); // should be done before super so placeholder is not used to search
            this.resizeSearch();

            this.parent.opening.apply(this, arguments);

            this.focusSearch();

            this.updateResults(true);
            this.search.focus();
            this.opts.element.trigger($.Event("select2-open"));
        },

        // multi
        close: function () {
            if (!this.opened()) return;
            this.parent.close.apply(this, arguments);
        },

        // multi
        focus: function () {
            this.close();
            this.search.focus();
        },

        // multi
        isFocused: function () {
            return this.search.hasClass("select2-focused");
        },

        // multi
        updateSelection: function (data) {
            var ids = [], filtered = [], self = this;

            // filter out duplicates
            $(data).each(function () {
                if (indexOf(self.id(this), ids) < 0) {
                    ids.push(self.id(this));
                    filtered.push(this);
                }
            });
            data = filtered;

            this.selection.find(".select2-search-choice").remove();
            $(data).each(function () {
                self.addSelectedChoice(this);
            });
            self.postprocessResults();
        },

        // multi
        tokenize: function() {
            var input = this.search.val();
            input = this.opts.tokenizer.call(this, input, this.data(), this.bind(this.onSelect), this.opts);
            if (input != null && input != undefined) {
                this.search.val(input);
                if (input.length > 0) {
                    this.open();
                }
            }

        },

        // multi
        onSelect: function (data, options) {

            if (!this.triggerSelect(data)) { return; }

            this.addSelectedChoice(data);

            this.opts.element.trigger({ type: "selected", val: this.id(data), choice: data });

            if (this.select || !this.opts.closeOnSelect) this.postprocessResults(data, false, this.opts.closeOnSelect===true);

            if (this.opts.closeOnSelect) {
                this.close();
                this.search.width(10);
            } else {
                if (this.countSelectableResults()>0) {
                    this.search.width(10);
                    this.resizeSearch();
                    if (this.getMaximumSelectionSize() > 0 && this.val().length >= this.getMaximumSelectionSize()) {
                        // if we reached max selection size repaint the results so choices
                        // are replaced with the max selection reached message
                        this.updateResults(true);
                    }
                    this.positionDropdown();
                } else {
                    // if nothing left to select close
                    this.close();
                    this.search.width(10);
                }
            }

            // since its not possible to select an element that has already been
            // added we do not need to check if this is a new element before firing change
            this.triggerChange({ added: data });

            if (!options || !options.noFocus)
                this.focusSearch();
        },

        // multi
        cancel: function () {
            this.close();
            this.focusSearch();
        },

        addSelectedChoice: function (data) {
            var enableChoice = !data.locked,
                enabledItem = $(
                    "<li class='select2-search-choice'>" +
                    "    <div></div>" +
                    "    <a href='#' onclick='return false;' class='select2-search-choice-close' tabindex='-1'></a>" +
                    "</li>"),
                disabledItem = $(
                    "<li class='select2-search-choice select2-locked'>" +
                    "<div></div>" +
                    "</li>");
            var choice = enableChoice ? enabledItem : disabledItem,
                id = this.id(data),
                val = this.getVal(),
                formatted,
                cssClass;

            formatted=this.opts.formatSelection(data, choice.find("div"), this.opts.escapeMarkup);
            if (formatted != undefined) {
                choice.find("div").replaceWith("<div>"+formatted+"</div>");
            }
            cssClass=this.opts.formatSelectionCssClass(data, choice.find("div"));
            if (cssClass != undefined) {
                choice.addClass(cssClass);
            }

            if(enableChoice){
              choice.find(".select2-search-choice-close")
                  .on("mousedown", killEvent)
                  .on("click dblclick", this.bind(function (e) {
                  if (!this.isInterfaceEnabled()) return;

                  $(e.target).closest(".select2-search-choice").fadeOut('fast', this.bind(function(){
                      this.unselect($(e.target));
                      this.selection.find(".select2-search-choice-focus").removeClass("select2-search-choice-focus");
                      this.close();
                      this.focusSearch();
                  })).dequeue();
                  killEvent(e);
              })).on("focus", this.bind(function () {
                  if (!this.isInterfaceEnabled()) return;
                  this.container.addClass("select2-container-active");
                  this.dropdown.addClass("select2-drop-active");
              }));
            }

            choice.data("select2-data", data);
            choice.insertBefore(this.searchContainer);

            val.push(id);
            this.setVal(val);
        },

        // multi
        unselect: function (selected) {
            var val = this.getVal(),
                data,
                index;

            selected = selected.closest(".select2-search-choice");

            if (selected.length === 0) {
                throw "Invalid argument: " + selected + ". Must be .select2-search-choice";
            }

            data = selected.data("select2-data");

            if (!data) {
                // prevent a race condition when the 'x' is clicked really fast repeatedly the event can be queued
                // and invoked on an element already removed
                return;
            }

            index = indexOf(this.id(data), val);

            if (index >= 0) {
                val.splice(index, 1);
                this.setVal(val);
                if (this.select) this.postprocessResults();
            }
            selected.remove();

            this.opts.element.trigger({ type: "removed", val: this.id(data), choice: data });
            this.triggerChange({ removed: data });
        },

        // multi
        postprocessResults: function (data, initial, noHighlightUpdate) {
            var val = this.getVal(),
                choices = this.results.find(".select2-result"),
                compound = this.results.find(".select2-result-with-children"),
                self = this;

            choices.each2(function (i, choice) {
                var id = self.id(choice.data("select2-data"));
                if (indexOf(id, val) >= 0) {
                    choice.addClass("select2-selected");
                    // mark all children of the selected parent as selected
                    choice.find(".select2-result-selectable").addClass("select2-selected");
                }
            });

            compound.each2(function(i, choice) {
                // hide an optgroup if it doesnt have any selectable children
                if (!choice.is('.select2-result-selectable')
                    && choice.find(".select2-result-selectable:not(.select2-selected)").length === 0) {
                    choice.addClass("select2-selected");
                }
            });

            if (this.highlight() == -1 && noHighlightUpdate !== false){
                self.highlight(0);
            }

            //If all results are chosen render formatNoMAtches
            if(!this.opts.createSearchChoice && !choices.filter('.select2-result:not(.select2-selected)').length > 0){
                if(!data || data && !data.more && this.results.find(".select2-no-results").length === 0) {
                    if (checkFormatter(self.opts.formatNoMatches, "formatNoMatches")) {
                        this.results.append("<li class='select2-no-results'>" + self.opts.formatNoMatches(self.search.val()) + "</li>");
                    }
                }
            }

        },

        // multi
        getMaxSearchWidth: function() {
            return this.selection.width() - getSideBorderPadding(this.search);
        },

        // multi
        resizeSearch: function () {
            var minimumWidth, left, maxWidth, containerLeft, searchWidth,
                sideBorderPadding = getSideBorderPadding(this.search);

            minimumWidth = measureTextWidth(this.search) + 10;

            left = this.search.offset().left;

            maxWidth = this.selection.width();
            containerLeft = this.selection.offset().left;

            searchWidth = maxWidth - (left - containerLeft) - sideBorderPadding;

            if (searchWidth < minimumWidth) {
                searchWidth = maxWidth - sideBorderPadding;
            }

            if (searchWidth < 40) {
                searchWidth = maxWidth - sideBorderPadding;
            }

            if (searchWidth <= 0) {
              searchWidth = minimumWidth;
            }

            this.search.width(searchWidth);
        },

        // multi
        getVal: function () {
            var val;
            if (this.select) {
                val = this.select.val();
                return val === null ? [] : val;
            } else {
                val = this.opts.element.val();
                return splitVal(val, this.opts.separator);
            }
        },

        // multi
        setVal: function (val) {
            var unique;
            if (this.select) {
                this.select.val(val);
            } else {
                unique = [];
                // filter out duplicates
                $(val).each(function () {
                    if (indexOf(this, unique) < 0) unique.push(this);
                });
                this.opts.element.val(unique.length === 0 ? "" : unique.join(this.opts.separator));
            }
        },

        // multi
        buildChangeDetails: function (old, current) {
            var current = current.slice(0),
                old = old.slice(0);

            // remove intersection from each array
            for (var i = 0; i < current.length; i++) {
                for (var j = 0; j < old.length; j++) {
                    if (equal(this.opts.id(current[i]), this.opts.id(old[j]))) {
                        current.splice(i, 1);
                        i--;
                        old.splice(j, 1);
                        j--;
                    }
                }
            }

            return {added: current, removed: old};
        },


        // multi
        val: function (val, triggerChange) {
            var oldData, self=this, changeDetails;

            if (arguments.length === 0) {
                return this.getVal();
            }

            oldData=this.data();
            if (!oldData.length) oldData=[];

            // val is an id. !val is true for [undefined,null,'',0] - 0 is legal
            if (!val && val !== 0) {
                this.opts.element.val("");
                this.updateSelection([]);
                this.clearSearch();
                if (triggerChange) {
                    this.triggerChange({added: this.data(), removed: oldData});
                }
                return;
            }

            // val is a list of ids
            this.setVal(val);

            if (this.select) {
                this.opts.initSelection(this.select, this.bind(this.updateSelection));
                if (triggerChange) {
                    this.triggerChange(this.buildChangeDetails(oldData, this.data()));
                }
            } else {
                if (this.opts.initSelection === undefined) {
                    throw new Error("val() cannot be called if initSelection() is not defined");
                }

                this.opts.initSelection(this.opts.element, function(data){
                    var ids=$.map(data, self.id);
                    self.setVal(ids);
                    self.updateSelection(data);
                    self.clearSearch();
                    if (triggerChange) {
                        self.triggerChange(self.buildChangeDetails(oldData, this.data()));
                    }
                });
            }
            this.clearSearch();
        },

        // multi
        onSortStart: function() {
            if (this.select) {
                throw new Error("Sorting of elements is not supported when attached to <select>. Attach to <input type='hidden'/> instead.");
            }

            // collapse search field into 0 width so its container can be collapsed as well
            this.search.width(0);
            // hide the container
            this.searchContainer.hide();
        },

        // multi
        onSortEnd:function() {

            var val=[], self=this;

            // show search and move it to the end of the list
            this.searchContainer.show();
            // make sure the search container is the last item in the list
            this.searchContainer.appendTo(this.searchContainer.parent());
            // since we collapsed the width in dragStarted, we resize it here
            this.resizeSearch();

            // update selection
            this.selection.find(".select2-search-choice").each(function() {
                val.push(self.opts.id($(this).data("select2-data")));
            });
            this.setVal(val);
            this.triggerChange();
        },

        // multi
        data: function(values, triggerChange) {
            var self=this, ids, old;
            if (arguments.length === 0) {
                 return this.selection
                     .find(".select2-search-choice")
                     .map(function() { return $(this).data("select2-data"); })
                     .get();
            } else {
                old = this.data();
                if (!values) { values = []; }
                ids = $.map(values, function(e) { return self.opts.id(e); });
                this.setVal(ids);
                this.updateSelection(values);
                this.clearSearch();
                if (triggerChange) {
                    this.triggerChange(this.buildChangeDetails(old, this.data()));
                }
            }
        }
    });

    $.fn.select2 = function () {

        var args = Array.prototype.slice.call(arguments, 0),
            opts,
            select2,
            method, value, multiple,
            allowedMethods = ["val", "destroy", "opened", "open", "close", "focus", "isFocused", "container", "dropdown", "onSortStart", "onSortEnd", "enable", "disable", "readonly", "positionDropdown", "data", "search"],
            valueMethods = ["opened", "isFocused", "container", "dropdown"],
            propertyMethods = ["val", "data"],
            methodsMap = { search: "externalSearch" };

        this.each(function () {
            if (args.length === 0 || typeof(args[0]) === "object") {
                opts = args.length === 0 ? {} : $.extend({}, args[0]);
                opts.element = $(this);

                if (opts.element.get(0).tagName.toLowerCase() === "select") {
                    multiple = opts.element.prop("multiple");
                } else {
                    multiple = opts.multiple || false;
                    if ("tags" in opts) {opts.multiple = multiple = true;}
                }

                select2 = multiple ? new MultiSelect2() : new SingleSelect2();
                select2.init(opts);
            } else if (typeof(args[0]) === "string") {

                if (indexOf(args[0], allowedMethods) < 0) {
                    throw "Unknown method: " + args[0];
                }

                value = undefined;
                select2 = $(this).data("select2");
                if (select2 === undefined) return;

                method=args[0];

                if (method === "container") {
                    value = select2.container;
                } else if (method === "dropdown") {
                    value = select2.dropdown;
                } else {
                    if (methodsMap[method]) method = methodsMap[method];

                    value = select2[method].apply(select2, args.slice(1));
                }
                if (indexOf(args[0], valueMethods) >= 0
                    || (indexOf(args[0], propertyMethods) && args.length == 1)) {
                    return false; // abort the iteration, ready to return first matched value
                }
            } else {
                throw "Invalid arguments to select2 plugin: " + args;
            }
        });
        return (value === undefined) ? this : value;
    };

    // plugin defaults, accessible to users
    $.fn.select2.defaults = {
        width: "copy",
        loadMorePadding: 0,
        closeOnSelect: true,
        openOnEnter: true,
        containerCss: {},
        dropdownCss: {},
        containerCssClass: "",
        dropdownCssClass: "",
        formatResult: function(result, container, query, escapeMarkup) {
            var markup=[];
            markMatch(result.text, query.term, markup, escapeMarkup);
            return markup.join("");
        },
        formatSelection: function (data, container, escapeMarkup) {
            return data ? escapeMarkup(data.text) : undefined;
        },
        sortResults: function (results, container, query) {
            return results;
        },
        formatResultCssClass: function(data) {return undefined;},
        formatSelectionCssClass: function(data, container) {return undefined;},
        formatNoMatches: function () { return "No matches found"; },
        formatInputTooShort: function (input, min) { var n = min - input.length; return "Please enter " + n + " more character" + (n == 1? "" : "s"); },
        formatInputTooLong: function (input, max) { var n = input.length - max; return "Please delete " + n + " character" + (n == 1? "" : "s"); },
        formatSelectionTooBig: function (limit) { return "You can only select " + limit + " item" + (limit == 1 ? "" : "s"); },
        formatLoadMore: function (pageNumber) { return "Loading more results..."; },
        formatSearching: function () { return "Searching..."; },
        minimumResultsForSearch: 0,
        minimumInputLength: 0,
        maximumInputLength: null,
        maximumSelectionSize: 0,
        id: function (e) { return e.id; },
        matcher: function(term, text) {
            return stripDiacritics(''+text).toUpperCase().indexOf(stripDiacritics(''+term).toUpperCase()) >= 0;
        },
        separator: ",",
        tokenSeparators: [],
        tokenizer: defaultTokenizer,
        escapeMarkup: defaultEscapeMarkup,
        blurOnChange: false,
        selectOnBlur: false,
        adaptContainerCssClass: function(c) { return c; },
        adaptDropdownCssClass: function(c) { return null; },
        nextSearchTerm: function(selectedObject, currentSearchTerm) { return undefined; }
    };

    $.fn.select2.ajaxDefaults = {
        transport: $.ajax,
        params: {
            type: "GET",
            cache: false,
            dataType: "json"
        }
    };

    // exports
    window.Select2 = {
        query: {
            ajax: ajax,
            local: local,
            tags: tags
        }, util: {
            debounce: debounce,
            markMatch: markMatch,
            escapeMarkup: defaultEscapeMarkup,
            stripDiacritics: stripDiacritics
        }, "class": {
            "abstract": AbstractSelect2,
            "single": SingleSelect2,
            "multi": MultiSelect2
        }
    };

}(jQuery));


}).call(global, module, undefined, undefined);

}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlNjcmlwdHMvbGliL3NlbGVjdDIuMy40LjIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJcbjsgalF1ZXJ5ID0gZ2xvYmFsLmpRdWVyeSA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XG47IHZhciBfX2Jyb3dzZXJpZnlfc2hpbV9yZXF1aXJlX189cmVxdWlyZTsoZnVuY3Rpb24gYnJvd3NlcmlmeVNoaW0obW9kdWxlLCBkZWZpbmUsIHJlcXVpcmUpIHtcbi8qXHJcbkNvcHlyaWdodCAyMDEyIElnb3IgVmF5bmJlcmdcclxuXHJcblZlcnNpb246IDMuNC4yIFRpbWVzdGFtcDogTW9uIEF1ZyAxMiAxNTowNDoxMiBQRFQgMjAxM1xyXG5cclxuVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJBcGFjaGUgTGljZW5zZVwiKSBvciB0aGUgR05VXHJcbkdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyICh0aGUgXCJHUEwgTGljZW5zZVwiKS4gWW91IG1heSBjaG9vc2UgZWl0aGVyIGxpY2Vuc2UgdG8gZ292ZXJuIHlvdXJcclxudXNlIG9mIHRoaXMgc29mdHdhcmUgb25seSB1cG9uIHRoZSBjb25kaXRpb24gdGhhdCB5b3UgYWNjZXB0IGFsbCBvZiB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBBcGFjaGVcclxuTGljZW5zZSBvciB0aGUgR1BMIExpY2Vuc2UuXHJcblxyXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIEFwYWNoZSBMaWNlbnNlIGFuZCB0aGUgR1BMIExpY2Vuc2UgYXQ6XHJcblxyXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sXHJcblxyXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZVxyXG5BcGFjaGUgTGljZW5zZSBvciB0aGUgR1BMIExpY2VzbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SXHJcbkNPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgQXBhY2hlIExpY2Vuc2UgYW5kIHRoZSBHUEwgTGljZW5zZSBmb3JcclxudGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlIGFuZCB0aGUgR1BMIExpY2Vuc2UuXHJcbiovXHJcbihmdW5jdGlvbiAoJCkge1xyXG4gICAgaWYodHlwZW9mICQuZm4uZWFjaDIgPT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgICQuZXh0ZW5kKCQuZm4sIHtcclxuICAgICAgICAgICAgLypcclxuICAgICAgICAgICAgKiA0LTEwIHRpbWVzIGZhc3RlciAuZWFjaCByZXBsYWNlbWVudFxyXG4gICAgICAgICAgICAqIHVzZSBpdCBjYXJlZnVsbHksIGFzIGl0IG92ZXJyaWRlcyBqUXVlcnkgY29udGV4dCBvZiBlbGVtZW50IG9uIGVhY2ggaXRlcmF0aW9uXHJcbiAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIGVhY2gyIDogZnVuY3Rpb24gKGMpIHtcclxuICAgICAgICAgICAgICAgIHZhciBqID0gJChbMF0pLCBpID0gLTEsIGwgPSB0aGlzLmxlbmd0aDtcclxuICAgICAgICAgICAgICAgIHdoaWxlIChcclxuICAgICAgICAgICAgICAgICAgICArK2kgPCBsXHJcbiAgICAgICAgICAgICAgICAgICAgJiYgKGouY29udGV4dCA9IGpbMF0gPSB0aGlzW2ldKVxyXG4gICAgICAgICAgICAgICAgICAgICYmIGMuY2FsbChqWzBdLCBpLCBqKSAhPT0gZmFsc2UgLy9cInRoaXNcIj1ET00sIGk9aW5kZXgsIGo9alF1ZXJ5IG9iamVjdFxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn0pKGpRdWVyeSk7XHJcblxyXG4oZnVuY3Rpb24gKCQsIHVuZGVmaW5lZCkge1xyXG4gICAgXCJ1c2Ugc3RyaWN0XCI7XHJcbiAgICAvKmdsb2JhbCBkb2N1bWVudCwgd2luZG93LCBqUXVlcnksIGNvbnNvbGUgKi9cclxuXHJcbiAgICBpZiAod2luZG93LlNlbGVjdDIgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB2YXIgS0VZLCBBYnN0cmFjdFNlbGVjdDIsIFNpbmdsZVNlbGVjdDIsIE11bHRpU2VsZWN0MiwgbmV4dFVpZCwgc2l6ZXIsXHJcbiAgICAgICAgbGFzdE1vdXNlUG9zaXRpb249e3g6MCx5OjB9LCAkZG9jdW1lbnQsIHNjcm9sbEJhckRpbWVuc2lvbnMsXHJcblxyXG4gICAgS0VZID0ge1xyXG4gICAgICAgIFRBQjogOSxcclxuICAgICAgICBFTlRFUjogMTMsXHJcbiAgICAgICAgRVNDOiAyNyxcclxuICAgICAgICBTUEFDRTogMzIsXHJcbiAgICAgICAgTEVGVDogMzcsXHJcbiAgICAgICAgVVA6IDM4LFxyXG4gICAgICAgIFJJR0hUOiAzOSxcclxuICAgICAgICBET1dOOiA0MCxcclxuICAgICAgICBTSElGVDogMTYsXHJcbiAgICAgICAgQ1RSTDogMTcsXHJcbiAgICAgICAgQUxUOiAxOCxcclxuICAgICAgICBQQUdFX1VQOiAzMyxcclxuICAgICAgICBQQUdFX0RPV046IDM0LFxyXG4gICAgICAgIEhPTUU6IDM2LFxyXG4gICAgICAgIEVORDogMzUsXHJcbiAgICAgICAgQkFDS1NQQUNFOiA4LFxyXG4gICAgICAgIERFTEVURTogNDYsXHJcbiAgICAgICAgaXNBcnJvdzogZnVuY3Rpb24gKGspIHtcclxuICAgICAgICAgICAgayA9IGsud2hpY2ggPyBrLndoaWNoIDogaztcclxuICAgICAgICAgICAgc3dpdGNoIChrKSB7XHJcbiAgICAgICAgICAgIGNhc2UgS0VZLkxFRlQ6XHJcbiAgICAgICAgICAgIGNhc2UgS0VZLlJJR0hUOlxyXG4gICAgICAgICAgICBjYXNlIEtFWS5VUDpcclxuICAgICAgICAgICAgY2FzZSBLRVkuRE9XTjpcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGlzQ29udHJvbDogZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgdmFyIGsgPSBlLndoaWNoO1xyXG4gICAgICAgICAgICBzd2l0Y2ggKGspIHtcclxuICAgICAgICAgICAgY2FzZSBLRVkuU0hJRlQ6XHJcbiAgICAgICAgICAgIGNhc2UgS0VZLkNUUkw6XHJcbiAgICAgICAgICAgIGNhc2UgS0VZLkFMVDpcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoZS5tZXRhS2V5KSByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGlzRnVuY3Rpb25LZXk6IGZ1bmN0aW9uIChrKSB7XHJcbiAgICAgICAgICAgIGsgPSBrLndoaWNoID8gay53aGljaCA6IGs7XHJcbiAgICAgICAgICAgIHJldHVybiBrID49IDExMiAmJiBrIDw9IDEyMztcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAgTUVBU1VSRV9TQ1JPTExCQVJfVEVNUExBVEUgPSBcIjxkaXYgY2xhc3M9J3NlbGVjdDItbWVhc3VyZS1zY3JvbGxiYXInPjwvZGl2PlwiLFxyXG5cclxuICAgIERJQUNSSVRJQ1MgPSB7XCJcXHUyNEI2XCI6XCJBXCIsXCJcXHVGRjIxXCI6XCJBXCIsXCJcXHUwMEMwXCI6XCJBXCIsXCJcXHUwMEMxXCI6XCJBXCIsXCJcXHUwMEMyXCI6XCJBXCIsXCJcXHUxRUE2XCI6XCJBXCIsXCJcXHUxRUE0XCI6XCJBXCIsXCJcXHUxRUFBXCI6XCJBXCIsXCJcXHUxRUE4XCI6XCJBXCIsXCJcXHUwMEMzXCI6XCJBXCIsXCJcXHUwMTAwXCI6XCJBXCIsXCJcXHUwMTAyXCI6XCJBXCIsXCJcXHUxRUIwXCI6XCJBXCIsXCJcXHUxRUFFXCI6XCJBXCIsXCJcXHUxRUI0XCI6XCJBXCIsXCJcXHUxRUIyXCI6XCJBXCIsXCJcXHUwMjI2XCI6XCJBXCIsXCJcXHUwMUUwXCI6XCJBXCIsXCJcXHUwMEM0XCI6XCJBXCIsXCJcXHUwMURFXCI6XCJBXCIsXCJcXHUxRUEyXCI6XCJBXCIsXCJcXHUwMEM1XCI6XCJBXCIsXCJcXHUwMUZBXCI6XCJBXCIsXCJcXHUwMUNEXCI6XCJBXCIsXCJcXHUwMjAwXCI6XCJBXCIsXCJcXHUwMjAyXCI6XCJBXCIsXCJcXHUxRUEwXCI6XCJBXCIsXCJcXHUxRUFDXCI6XCJBXCIsXCJcXHUxRUI2XCI6XCJBXCIsXCJcXHUxRTAwXCI6XCJBXCIsXCJcXHUwMTA0XCI6XCJBXCIsXCJcXHUwMjNBXCI6XCJBXCIsXCJcXHUyQzZGXCI6XCJBXCIsXCJcXHVBNzMyXCI6XCJBQVwiLFwiXFx1MDBDNlwiOlwiQUVcIixcIlxcdTAxRkNcIjpcIkFFXCIsXCJcXHUwMUUyXCI6XCJBRVwiLFwiXFx1QTczNFwiOlwiQU9cIixcIlxcdUE3MzZcIjpcIkFVXCIsXCJcXHVBNzM4XCI6XCJBVlwiLFwiXFx1QTczQVwiOlwiQVZcIixcIlxcdUE3M0NcIjpcIkFZXCIsXCJcXHUyNEI3XCI6XCJCXCIsXCJcXHVGRjIyXCI6XCJCXCIsXCJcXHUxRTAyXCI6XCJCXCIsXCJcXHUxRTA0XCI6XCJCXCIsXCJcXHUxRTA2XCI6XCJCXCIsXCJcXHUwMjQzXCI6XCJCXCIsXCJcXHUwMTgyXCI6XCJCXCIsXCJcXHUwMTgxXCI6XCJCXCIsXCJcXHUyNEI4XCI6XCJDXCIsXCJcXHVGRjIzXCI6XCJDXCIsXCJcXHUwMTA2XCI6XCJDXCIsXCJcXHUwMTA4XCI6XCJDXCIsXCJcXHUwMTBBXCI6XCJDXCIsXCJcXHUwMTBDXCI6XCJDXCIsXCJcXHUwMEM3XCI6XCJDXCIsXCJcXHUxRTA4XCI6XCJDXCIsXCJcXHUwMTg3XCI6XCJDXCIsXCJcXHUwMjNCXCI6XCJDXCIsXCJcXHVBNzNFXCI6XCJDXCIsXCJcXHUyNEI5XCI6XCJEXCIsXCJcXHVGRjI0XCI6XCJEXCIsXCJcXHUxRTBBXCI6XCJEXCIsXCJcXHUwMTBFXCI6XCJEXCIsXCJcXHUxRTBDXCI6XCJEXCIsXCJcXHUxRTEwXCI6XCJEXCIsXCJcXHUxRTEyXCI6XCJEXCIsXCJcXHUxRTBFXCI6XCJEXCIsXCJcXHUwMTEwXCI6XCJEXCIsXCJcXHUwMThCXCI6XCJEXCIsXCJcXHUwMThBXCI6XCJEXCIsXCJcXHUwMTg5XCI6XCJEXCIsXCJcXHVBNzc5XCI6XCJEXCIsXCJcXHUwMUYxXCI6XCJEWlwiLFwiXFx1MDFDNFwiOlwiRFpcIixcIlxcdTAxRjJcIjpcIkR6XCIsXCJcXHUwMUM1XCI6XCJEelwiLFwiXFx1MjRCQVwiOlwiRVwiLFwiXFx1RkYyNVwiOlwiRVwiLFwiXFx1MDBDOFwiOlwiRVwiLFwiXFx1MDBDOVwiOlwiRVwiLFwiXFx1MDBDQVwiOlwiRVwiLFwiXFx1MUVDMFwiOlwiRVwiLFwiXFx1MUVCRVwiOlwiRVwiLFwiXFx1MUVDNFwiOlwiRVwiLFwiXFx1MUVDMlwiOlwiRVwiLFwiXFx1MUVCQ1wiOlwiRVwiLFwiXFx1MDExMlwiOlwiRVwiLFwiXFx1MUUxNFwiOlwiRVwiLFwiXFx1MUUxNlwiOlwiRVwiLFwiXFx1MDExNFwiOlwiRVwiLFwiXFx1MDExNlwiOlwiRVwiLFwiXFx1MDBDQlwiOlwiRVwiLFwiXFx1MUVCQVwiOlwiRVwiLFwiXFx1MDExQVwiOlwiRVwiLFwiXFx1MDIwNFwiOlwiRVwiLFwiXFx1MDIwNlwiOlwiRVwiLFwiXFx1MUVCOFwiOlwiRVwiLFwiXFx1MUVDNlwiOlwiRVwiLFwiXFx1MDIyOFwiOlwiRVwiLFwiXFx1MUUxQ1wiOlwiRVwiLFwiXFx1MDExOFwiOlwiRVwiLFwiXFx1MUUxOFwiOlwiRVwiLFwiXFx1MUUxQVwiOlwiRVwiLFwiXFx1MDE5MFwiOlwiRVwiLFwiXFx1MDE4RVwiOlwiRVwiLFwiXFx1MjRCQlwiOlwiRlwiLFwiXFx1RkYyNlwiOlwiRlwiLFwiXFx1MUUxRVwiOlwiRlwiLFwiXFx1MDE5MVwiOlwiRlwiLFwiXFx1QTc3QlwiOlwiRlwiLFwiXFx1MjRCQ1wiOlwiR1wiLFwiXFx1RkYyN1wiOlwiR1wiLFwiXFx1MDFGNFwiOlwiR1wiLFwiXFx1MDExQ1wiOlwiR1wiLFwiXFx1MUUyMFwiOlwiR1wiLFwiXFx1MDExRVwiOlwiR1wiLFwiXFx1MDEyMFwiOlwiR1wiLFwiXFx1MDFFNlwiOlwiR1wiLFwiXFx1MDEyMlwiOlwiR1wiLFwiXFx1MDFFNFwiOlwiR1wiLFwiXFx1MDE5M1wiOlwiR1wiLFwiXFx1QTdBMFwiOlwiR1wiLFwiXFx1QTc3RFwiOlwiR1wiLFwiXFx1QTc3RVwiOlwiR1wiLFwiXFx1MjRCRFwiOlwiSFwiLFwiXFx1RkYyOFwiOlwiSFwiLFwiXFx1MDEyNFwiOlwiSFwiLFwiXFx1MUUyMlwiOlwiSFwiLFwiXFx1MUUyNlwiOlwiSFwiLFwiXFx1MDIxRVwiOlwiSFwiLFwiXFx1MUUyNFwiOlwiSFwiLFwiXFx1MUUyOFwiOlwiSFwiLFwiXFx1MUUyQVwiOlwiSFwiLFwiXFx1MDEyNlwiOlwiSFwiLFwiXFx1MkM2N1wiOlwiSFwiLFwiXFx1MkM3NVwiOlwiSFwiLFwiXFx1QTc4RFwiOlwiSFwiLFwiXFx1MjRCRVwiOlwiSVwiLFwiXFx1RkYyOVwiOlwiSVwiLFwiXFx1MDBDQ1wiOlwiSVwiLFwiXFx1MDBDRFwiOlwiSVwiLFwiXFx1MDBDRVwiOlwiSVwiLFwiXFx1MDEyOFwiOlwiSVwiLFwiXFx1MDEyQVwiOlwiSVwiLFwiXFx1MDEyQ1wiOlwiSVwiLFwiXFx1MDEzMFwiOlwiSVwiLFwiXFx1MDBDRlwiOlwiSVwiLFwiXFx1MUUyRVwiOlwiSVwiLFwiXFx1MUVDOFwiOlwiSVwiLFwiXFx1MDFDRlwiOlwiSVwiLFwiXFx1MDIwOFwiOlwiSVwiLFwiXFx1MDIwQVwiOlwiSVwiLFwiXFx1MUVDQVwiOlwiSVwiLFwiXFx1MDEyRVwiOlwiSVwiLFwiXFx1MUUyQ1wiOlwiSVwiLFwiXFx1MDE5N1wiOlwiSVwiLFwiXFx1MjRCRlwiOlwiSlwiLFwiXFx1RkYyQVwiOlwiSlwiLFwiXFx1MDEzNFwiOlwiSlwiLFwiXFx1MDI0OFwiOlwiSlwiLFwiXFx1MjRDMFwiOlwiS1wiLFwiXFx1RkYyQlwiOlwiS1wiLFwiXFx1MUUzMFwiOlwiS1wiLFwiXFx1MDFFOFwiOlwiS1wiLFwiXFx1MUUzMlwiOlwiS1wiLFwiXFx1MDEzNlwiOlwiS1wiLFwiXFx1MUUzNFwiOlwiS1wiLFwiXFx1MDE5OFwiOlwiS1wiLFwiXFx1MkM2OVwiOlwiS1wiLFwiXFx1QTc0MFwiOlwiS1wiLFwiXFx1QTc0MlwiOlwiS1wiLFwiXFx1QTc0NFwiOlwiS1wiLFwiXFx1QTdBMlwiOlwiS1wiLFwiXFx1MjRDMVwiOlwiTFwiLFwiXFx1RkYyQ1wiOlwiTFwiLFwiXFx1MDEzRlwiOlwiTFwiLFwiXFx1MDEzOVwiOlwiTFwiLFwiXFx1MDEzRFwiOlwiTFwiLFwiXFx1MUUzNlwiOlwiTFwiLFwiXFx1MUUzOFwiOlwiTFwiLFwiXFx1MDEzQlwiOlwiTFwiLFwiXFx1MUUzQ1wiOlwiTFwiLFwiXFx1MUUzQVwiOlwiTFwiLFwiXFx1MDE0MVwiOlwiTFwiLFwiXFx1MDIzRFwiOlwiTFwiLFwiXFx1MkM2MlwiOlwiTFwiLFwiXFx1MkM2MFwiOlwiTFwiLFwiXFx1QTc0OFwiOlwiTFwiLFwiXFx1QTc0NlwiOlwiTFwiLFwiXFx1QTc4MFwiOlwiTFwiLFwiXFx1MDFDN1wiOlwiTEpcIixcIlxcdTAxQzhcIjpcIkxqXCIsXCJcXHUyNEMyXCI6XCJNXCIsXCJcXHVGRjJEXCI6XCJNXCIsXCJcXHUxRTNFXCI6XCJNXCIsXCJcXHUxRTQwXCI6XCJNXCIsXCJcXHUxRTQyXCI6XCJNXCIsXCJcXHUyQzZFXCI6XCJNXCIsXCJcXHUwMTlDXCI6XCJNXCIsXCJcXHUyNEMzXCI6XCJOXCIsXCJcXHVGRjJFXCI6XCJOXCIsXCJcXHUwMUY4XCI6XCJOXCIsXCJcXHUwMTQzXCI6XCJOXCIsXCJcXHUwMEQxXCI6XCJOXCIsXCJcXHUxRTQ0XCI6XCJOXCIsXCJcXHUwMTQ3XCI6XCJOXCIsXCJcXHUxRTQ2XCI6XCJOXCIsXCJcXHUwMTQ1XCI6XCJOXCIsXCJcXHUxRTRBXCI6XCJOXCIsXCJcXHUxRTQ4XCI6XCJOXCIsXCJcXHUwMjIwXCI6XCJOXCIsXCJcXHUwMTlEXCI6XCJOXCIsXCJcXHVBNzkwXCI6XCJOXCIsXCJcXHVBN0E0XCI6XCJOXCIsXCJcXHUwMUNBXCI6XCJOSlwiLFwiXFx1MDFDQlwiOlwiTmpcIixcIlxcdTI0QzRcIjpcIk9cIixcIlxcdUZGMkZcIjpcIk9cIixcIlxcdTAwRDJcIjpcIk9cIixcIlxcdTAwRDNcIjpcIk9cIixcIlxcdTAwRDRcIjpcIk9cIixcIlxcdTFFRDJcIjpcIk9cIixcIlxcdTFFRDBcIjpcIk9cIixcIlxcdTFFRDZcIjpcIk9cIixcIlxcdTFFRDRcIjpcIk9cIixcIlxcdTAwRDVcIjpcIk9cIixcIlxcdTFFNENcIjpcIk9cIixcIlxcdTAyMkNcIjpcIk9cIixcIlxcdTFFNEVcIjpcIk9cIixcIlxcdTAxNENcIjpcIk9cIixcIlxcdTFFNTBcIjpcIk9cIixcIlxcdTFFNTJcIjpcIk9cIixcIlxcdTAxNEVcIjpcIk9cIixcIlxcdTAyMkVcIjpcIk9cIixcIlxcdTAyMzBcIjpcIk9cIixcIlxcdTAwRDZcIjpcIk9cIixcIlxcdTAyMkFcIjpcIk9cIixcIlxcdTFFQ0VcIjpcIk9cIixcIlxcdTAxNTBcIjpcIk9cIixcIlxcdTAxRDFcIjpcIk9cIixcIlxcdTAyMENcIjpcIk9cIixcIlxcdTAyMEVcIjpcIk9cIixcIlxcdTAxQTBcIjpcIk9cIixcIlxcdTFFRENcIjpcIk9cIixcIlxcdTFFREFcIjpcIk9cIixcIlxcdTFFRTBcIjpcIk9cIixcIlxcdTFFREVcIjpcIk9cIixcIlxcdTFFRTJcIjpcIk9cIixcIlxcdTFFQ0NcIjpcIk9cIixcIlxcdTFFRDhcIjpcIk9cIixcIlxcdTAxRUFcIjpcIk9cIixcIlxcdTAxRUNcIjpcIk9cIixcIlxcdTAwRDhcIjpcIk9cIixcIlxcdTAxRkVcIjpcIk9cIixcIlxcdTAxODZcIjpcIk9cIixcIlxcdTAxOUZcIjpcIk9cIixcIlxcdUE3NEFcIjpcIk9cIixcIlxcdUE3NENcIjpcIk9cIixcIlxcdTAxQTJcIjpcIk9JXCIsXCJcXHVBNzRFXCI6XCJPT1wiLFwiXFx1MDIyMlwiOlwiT1VcIixcIlxcdTI0QzVcIjpcIlBcIixcIlxcdUZGMzBcIjpcIlBcIixcIlxcdTFFNTRcIjpcIlBcIixcIlxcdTFFNTZcIjpcIlBcIixcIlxcdTAxQTRcIjpcIlBcIixcIlxcdTJDNjNcIjpcIlBcIixcIlxcdUE3NTBcIjpcIlBcIixcIlxcdUE3NTJcIjpcIlBcIixcIlxcdUE3NTRcIjpcIlBcIixcIlxcdTI0QzZcIjpcIlFcIixcIlxcdUZGMzFcIjpcIlFcIixcIlxcdUE3NTZcIjpcIlFcIixcIlxcdUE3NThcIjpcIlFcIixcIlxcdTAyNEFcIjpcIlFcIixcIlxcdTI0QzdcIjpcIlJcIixcIlxcdUZGMzJcIjpcIlJcIixcIlxcdTAxNTRcIjpcIlJcIixcIlxcdTFFNThcIjpcIlJcIixcIlxcdTAxNThcIjpcIlJcIixcIlxcdTAyMTBcIjpcIlJcIixcIlxcdTAyMTJcIjpcIlJcIixcIlxcdTFFNUFcIjpcIlJcIixcIlxcdTFFNUNcIjpcIlJcIixcIlxcdTAxNTZcIjpcIlJcIixcIlxcdTFFNUVcIjpcIlJcIixcIlxcdTAyNENcIjpcIlJcIixcIlxcdTJDNjRcIjpcIlJcIixcIlxcdUE3NUFcIjpcIlJcIixcIlxcdUE3QTZcIjpcIlJcIixcIlxcdUE3ODJcIjpcIlJcIixcIlxcdTI0QzhcIjpcIlNcIixcIlxcdUZGMzNcIjpcIlNcIixcIlxcdTFFOUVcIjpcIlNcIixcIlxcdTAxNUFcIjpcIlNcIixcIlxcdTFFNjRcIjpcIlNcIixcIlxcdTAxNUNcIjpcIlNcIixcIlxcdTFFNjBcIjpcIlNcIixcIlxcdTAxNjBcIjpcIlNcIixcIlxcdTFFNjZcIjpcIlNcIixcIlxcdTFFNjJcIjpcIlNcIixcIlxcdTFFNjhcIjpcIlNcIixcIlxcdTAyMThcIjpcIlNcIixcIlxcdTAxNUVcIjpcIlNcIixcIlxcdTJDN0VcIjpcIlNcIixcIlxcdUE3QThcIjpcIlNcIixcIlxcdUE3ODRcIjpcIlNcIixcIlxcdTI0QzlcIjpcIlRcIixcIlxcdUZGMzRcIjpcIlRcIixcIlxcdTFFNkFcIjpcIlRcIixcIlxcdTAxNjRcIjpcIlRcIixcIlxcdTFFNkNcIjpcIlRcIixcIlxcdTAyMUFcIjpcIlRcIixcIlxcdTAxNjJcIjpcIlRcIixcIlxcdTFFNzBcIjpcIlRcIixcIlxcdTFFNkVcIjpcIlRcIixcIlxcdTAxNjZcIjpcIlRcIixcIlxcdTAxQUNcIjpcIlRcIixcIlxcdTAxQUVcIjpcIlRcIixcIlxcdTAyM0VcIjpcIlRcIixcIlxcdUE3ODZcIjpcIlRcIixcIlxcdUE3MjhcIjpcIlRaXCIsXCJcXHUyNENBXCI6XCJVXCIsXCJcXHVGRjM1XCI6XCJVXCIsXCJcXHUwMEQ5XCI6XCJVXCIsXCJcXHUwMERBXCI6XCJVXCIsXCJcXHUwMERCXCI6XCJVXCIsXCJcXHUwMTY4XCI6XCJVXCIsXCJcXHUxRTc4XCI6XCJVXCIsXCJcXHUwMTZBXCI6XCJVXCIsXCJcXHUxRTdBXCI6XCJVXCIsXCJcXHUwMTZDXCI6XCJVXCIsXCJcXHUwMERDXCI6XCJVXCIsXCJcXHUwMURCXCI6XCJVXCIsXCJcXHUwMUQ3XCI6XCJVXCIsXCJcXHUwMUQ1XCI6XCJVXCIsXCJcXHUwMUQ5XCI6XCJVXCIsXCJcXHUxRUU2XCI6XCJVXCIsXCJcXHUwMTZFXCI6XCJVXCIsXCJcXHUwMTcwXCI6XCJVXCIsXCJcXHUwMUQzXCI6XCJVXCIsXCJcXHUwMjE0XCI6XCJVXCIsXCJcXHUwMjE2XCI6XCJVXCIsXCJcXHUwMUFGXCI6XCJVXCIsXCJcXHUxRUVBXCI6XCJVXCIsXCJcXHUxRUU4XCI6XCJVXCIsXCJcXHUxRUVFXCI6XCJVXCIsXCJcXHUxRUVDXCI6XCJVXCIsXCJcXHUxRUYwXCI6XCJVXCIsXCJcXHUxRUU0XCI6XCJVXCIsXCJcXHUxRTcyXCI6XCJVXCIsXCJcXHUwMTcyXCI6XCJVXCIsXCJcXHUxRTc2XCI6XCJVXCIsXCJcXHUxRTc0XCI6XCJVXCIsXCJcXHUwMjQ0XCI6XCJVXCIsXCJcXHUyNENCXCI6XCJWXCIsXCJcXHVGRjM2XCI6XCJWXCIsXCJcXHUxRTdDXCI6XCJWXCIsXCJcXHUxRTdFXCI6XCJWXCIsXCJcXHUwMUIyXCI6XCJWXCIsXCJcXHVBNzVFXCI6XCJWXCIsXCJcXHUwMjQ1XCI6XCJWXCIsXCJcXHVBNzYwXCI6XCJWWVwiLFwiXFx1MjRDQ1wiOlwiV1wiLFwiXFx1RkYzN1wiOlwiV1wiLFwiXFx1MUU4MFwiOlwiV1wiLFwiXFx1MUU4MlwiOlwiV1wiLFwiXFx1MDE3NFwiOlwiV1wiLFwiXFx1MUU4NlwiOlwiV1wiLFwiXFx1MUU4NFwiOlwiV1wiLFwiXFx1MUU4OFwiOlwiV1wiLFwiXFx1MkM3MlwiOlwiV1wiLFwiXFx1MjRDRFwiOlwiWFwiLFwiXFx1RkYzOFwiOlwiWFwiLFwiXFx1MUU4QVwiOlwiWFwiLFwiXFx1MUU4Q1wiOlwiWFwiLFwiXFx1MjRDRVwiOlwiWVwiLFwiXFx1RkYzOVwiOlwiWVwiLFwiXFx1MUVGMlwiOlwiWVwiLFwiXFx1MDBERFwiOlwiWVwiLFwiXFx1MDE3NlwiOlwiWVwiLFwiXFx1MUVGOFwiOlwiWVwiLFwiXFx1MDIzMlwiOlwiWVwiLFwiXFx1MUU4RVwiOlwiWVwiLFwiXFx1MDE3OFwiOlwiWVwiLFwiXFx1MUVGNlwiOlwiWVwiLFwiXFx1MUVGNFwiOlwiWVwiLFwiXFx1MDFCM1wiOlwiWVwiLFwiXFx1MDI0RVwiOlwiWVwiLFwiXFx1MUVGRVwiOlwiWVwiLFwiXFx1MjRDRlwiOlwiWlwiLFwiXFx1RkYzQVwiOlwiWlwiLFwiXFx1MDE3OVwiOlwiWlwiLFwiXFx1MUU5MFwiOlwiWlwiLFwiXFx1MDE3QlwiOlwiWlwiLFwiXFx1MDE3RFwiOlwiWlwiLFwiXFx1MUU5MlwiOlwiWlwiLFwiXFx1MUU5NFwiOlwiWlwiLFwiXFx1MDFCNVwiOlwiWlwiLFwiXFx1MDIyNFwiOlwiWlwiLFwiXFx1MkM3RlwiOlwiWlwiLFwiXFx1MkM2QlwiOlwiWlwiLFwiXFx1QTc2MlwiOlwiWlwiLFwiXFx1MjREMFwiOlwiYVwiLFwiXFx1RkY0MVwiOlwiYVwiLFwiXFx1MUU5QVwiOlwiYVwiLFwiXFx1MDBFMFwiOlwiYVwiLFwiXFx1MDBFMVwiOlwiYVwiLFwiXFx1MDBFMlwiOlwiYVwiLFwiXFx1MUVBN1wiOlwiYVwiLFwiXFx1MUVBNVwiOlwiYVwiLFwiXFx1MUVBQlwiOlwiYVwiLFwiXFx1MUVBOVwiOlwiYVwiLFwiXFx1MDBFM1wiOlwiYVwiLFwiXFx1MDEwMVwiOlwiYVwiLFwiXFx1MDEwM1wiOlwiYVwiLFwiXFx1MUVCMVwiOlwiYVwiLFwiXFx1MUVBRlwiOlwiYVwiLFwiXFx1MUVCNVwiOlwiYVwiLFwiXFx1MUVCM1wiOlwiYVwiLFwiXFx1MDIyN1wiOlwiYVwiLFwiXFx1MDFFMVwiOlwiYVwiLFwiXFx1MDBFNFwiOlwiYVwiLFwiXFx1MDFERlwiOlwiYVwiLFwiXFx1MUVBM1wiOlwiYVwiLFwiXFx1MDBFNVwiOlwiYVwiLFwiXFx1MDFGQlwiOlwiYVwiLFwiXFx1MDFDRVwiOlwiYVwiLFwiXFx1MDIwMVwiOlwiYVwiLFwiXFx1MDIwM1wiOlwiYVwiLFwiXFx1MUVBMVwiOlwiYVwiLFwiXFx1MUVBRFwiOlwiYVwiLFwiXFx1MUVCN1wiOlwiYVwiLFwiXFx1MUUwMVwiOlwiYVwiLFwiXFx1MDEwNVwiOlwiYVwiLFwiXFx1MkM2NVwiOlwiYVwiLFwiXFx1MDI1MFwiOlwiYVwiLFwiXFx1QTczM1wiOlwiYWFcIixcIlxcdTAwRTZcIjpcImFlXCIsXCJcXHUwMUZEXCI6XCJhZVwiLFwiXFx1MDFFM1wiOlwiYWVcIixcIlxcdUE3MzVcIjpcImFvXCIsXCJcXHVBNzM3XCI6XCJhdVwiLFwiXFx1QTczOVwiOlwiYXZcIixcIlxcdUE3M0JcIjpcImF2XCIsXCJcXHVBNzNEXCI6XCJheVwiLFwiXFx1MjREMVwiOlwiYlwiLFwiXFx1RkY0MlwiOlwiYlwiLFwiXFx1MUUwM1wiOlwiYlwiLFwiXFx1MUUwNVwiOlwiYlwiLFwiXFx1MUUwN1wiOlwiYlwiLFwiXFx1MDE4MFwiOlwiYlwiLFwiXFx1MDE4M1wiOlwiYlwiLFwiXFx1MDI1M1wiOlwiYlwiLFwiXFx1MjREMlwiOlwiY1wiLFwiXFx1RkY0M1wiOlwiY1wiLFwiXFx1MDEwN1wiOlwiY1wiLFwiXFx1MDEwOVwiOlwiY1wiLFwiXFx1MDEwQlwiOlwiY1wiLFwiXFx1MDEwRFwiOlwiY1wiLFwiXFx1MDBFN1wiOlwiY1wiLFwiXFx1MUUwOVwiOlwiY1wiLFwiXFx1MDE4OFwiOlwiY1wiLFwiXFx1MDIzQ1wiOlwiY1wiLFwiXFx1QTczRlwiOlwiY1wiLFwiXFx1MjE4NFwiOlwiY1wiLFwiXFx1MjREM1wiOlwiZFwiLFwiXFx1RkY0NFwiOlwiZFwiLFwiXFx1MUUwQlwiOlwiZFwiLFwiXFx1MDEwRlwiOlwiZFwiLFwiXFx1MUUwRFwiOlwiZFwiLFwiXFx1MUUxMVwiOlwiZFwiLFwiXFx1MUUxM1wiOlwiZFwiLFwiXFx1MUUwRlwiOlwiZFwiLFwiXFx1MDExMVwiOlwiZFwiLFwiXFx1MDE4Q1wiOlwiZFwiLFwiXFx1MDI1NlwiOlwiZFwiLFwiXFx1MDI1N1wiOlwiZFwiLFwiXFx1QTc3QVwiOlwiZFwiLFwiXFx1MDFGM1wiOlwiZHpcIixcIlxcdTAxQzZcIjpcImR6XCIsXCJcXHUyNEQ0XCI6XCJlXCIsXCJcXHVGRjQ1XCI6XCJlXCIsXCJcXHUwMEU4XCI6XCJlXCIsXCJcXHUwMEU5XCI6XCJlXCIsXCJcXHUwMEVBXCI6XCJlXCIsXCJcXHUxRUMxXCI6XCJlXCIsXCJcXHUxRUJGXCI6XCJlXCIsXCJcXHUxRUM1XCI6XCJlXCIsXCJcXHUxRUMzXCI6XCJlXCIsXCJcXHUxRUJEXCI6XCJlXCIsXCJcXHUwMTEzXCI6XCJlXCIsXCJcXHUxRTE1XCI6XCJlXCIsXCJcXHUxRTE3XCI6XCJlXCIsXCJcXHUwMTE1XCI6XCJlXCIsXCJcXHUwMTE3XCI6XCJlXCIsXCJcXHUwMEVCXCI6XCJlXCIsXCJcXHUxRUJCXCI6XCJlXCIsXCJcXHUwMTFCXCI6XCJlXCIsXCJcXHUwMjA1XCI6XCJlXCIsXCJcXHUwMjA3XCI6XCJlXCIsXCJcXHUxRUI5XCI6XCJlXCIsXCJcXHUxRUM3XCI6XCJlXCIsXCJcXHUwMjI5XCI6XCJlXCIsXCJcXHUxRTFEXCI6XCJlXCIsXCJcXHUwMTE5XCI6XCJlXCIsXCJcXHUxRTE5XCI6XCJlXCIsXCJcXHUxRTFCXCI6XCJlXCIsXCJcXHUwMjQ3XCI6XCJlXCIsXCJcXHUwMjVCXCI6XCJlXCIsXCJcXHUwMUREXCI6XCJlXCIsXCJcXHUyNEQ1XCI6XCJmXCIsXCJcXHVGRjQ2XCI6XCJmXCIsXCJcXHUxRTFGXCI6XCJmXCIsXCJcXHUwMTkyXCI6XCJmXCIsXCJcXHVBNzdDXCI6XCJmXCIsXCJcXHUyNEQ2XCI6XCJnXCIsXCJcXHVGRjQ3XCI6XCJnXCIsXCJcXHUwMUY1XCI6XCJnXCIsXCJcXHUwMTFEXCI6XCJnXCIsXCJcXHUxRTIxXCI6XCJnXCIsXCJcXHUwMTFGXCI6XCJnXCIsXCJcXHUwMTIxXCI6XCJnXCIsXCJcXHUwMUU3XCI6XCJnXCIsXCJcXHUwMTIzXCI6XCJnXCIsXCJcXHUwMUU1XCI6XCJnXCIsXCJcXHUwMjYwXCI6XCJnXCIsXCJcXHVBN0ExXCI6XCJnXCIsXCJcXHUxRDc5XCI6XCJnXCIsXCJcXHVBNzdGXCI6XCJnXCIsXCJcXHUyNEQ3XCI6XCJoXCIsXCJcXHVGRjQ4XCI6XCJoXCIsXCJcXHUwMTI1XCI6XCJoXCIsXCJcXHUxRTIzXCI6XCJoXCIsXCJcXHUxRTI3XCI6XCJoXCIsXCJcXHUwMjFGXCI6XCJoXCIsXCJcXHUxRTI1XCI6XCJoXCIsXCJcXHUxRTI5XCI6XCJoXCIsXCJcXHUxRTJCXCI6XCJoXCIsXCJcXHUxRTk2XCI6XCJoXCIsXCJcXHUwMTI3XCI6XCJoXCIsXCJcXHUyQzY4XCI6XCJoXCIsXCJcXHUyQzc2XCI6XCJoXCIsXCJcXHUwMjY1XCI6XCJoXCIsXCJcXHUwMTk1XCI6XCJodlwiLFwiXFx1MjREOFwiOlwiaVwiLFwiXFx1RkY0OVwiOlwiaVwiLFwiXFx1MDBFQ1wiOlwiaVwiLFwiXFx1MDBFRFwiOlwiaVwiLFwiXFx1MDBFRVwiOlwiaVwiLFwiXFx1MDEyOVwiOlwiaVwiLFwiXFx1MDEyQlwiOlwiaVwiLFwiXFx1MDEyRFwiOlwiaVwiLFwiXFx1MDBFRlwiOlwiaVwiLFwiXFx1MUUyRlwiOlwiaVwiLFwiXFx1MUVDOVwiOlwiaVwiLFwiXFx1MDFEMFwiOlwiaVwiLFwiXFx1MDIwOVwiOlwiaVwiLFwiXFx1MDIwQlwiOlwiaVwiLFwiXFx1MUVDQlwiOlwiaVwiLFwiXFx1MDEyRlwiOlwiaVwiLFwiXFx1MUUyRFwiOlwiaVwiLFwiXFx1MDI2OFwiOlwiaVwiLFwiXFx1MDEzMVwiOlwiaVwiLFwiXFx1MjREOVwiOlwialwiLFwiXFx1RkY0QVwiOlwialwiLFwiXFx1MDEzNVwiOlwialwiLFwiXFx1MDFGMFwiOlwialwiLFwiXFx1MDI0OVwiOlwialwiLFwiXFx1MjREQVwiOlwia1wiLFwiXFx1RkY0QlwiOlwia1wiLFwiXFx1MUUzMVwiOlwia1wiLFwiXFx1MDFFOVwiOlwia1wiLFwiXFx1MUUzM1wiOlwia1wiLFwiXFx1MDEzN1wiOlwia1wiLFwiXFx1MUUzNVwiOlwia1wiLFwiXFx1MDE5OVwiOlwia1wiLFwiXFx1MkM2QVwiOlwia1wiLFwiXFx1QTc0MVwiOlwia1wiLFwiXFx1QTc0M1wiOlwia1wiLFwiXFx1QTc0NVwiOlwia1wiLFwiXFx1QTdBM1wiOlwia1wiLFwiXFx1MjREQlwiOlwibFwiLFwiXFx1RkY0Q1wiOlwibFwiLFwiXFx1MDE0MFwiOlwibFwiLFwiXFx1MDEzQVwiOlwibFwiLFwiXFx1MDEzRVwiOlwibFwiLFwiXFx1MUUzN1wiOlwibFwiLFwiXFx1MUUzOVwiOlwibFwiLFwiXFx1MDEzQ1wiOlwibFwiLFwiXFx1MUUzRFwiOlwibFwiLFwiXFx1MUUzQlwiOlwibFwiLFwiXFx1MDE3RlwiOlwibFwiLFwiXFx1MDE0MlwiOlwibFwiLFwiXFx1MDE5QVwiOlwibFwiLFwiXFx1MDI2QlwiOlwibFwiLFwiXFx1MkM2MVwiOlwibFwiLFwiXFx1QTc0OVwiOlwibFwiLFwiXFx1QTc4MVwiOlwibFwiLFwiXFx1QTc0N1wiOlwibFwiLFwiXFx1MDFDOVwiOlwibGpcIixcIlxcdTI0RENcIjpcIm1cIixcIlxcdUZGNERcIjpcIm1cIixcIlxcdTFFM0ZcIjpcIm1cIixcIlxcdTFFNDFcIjpcIm1cIixcIlxcdTFFNDNcIjpcIm1cIixcIlxcdTAyNzFcIjpcIm1cIixcIlxcdTAyNkZcIjpcIm1cIixcIlxcdTI0RERcIjpcIm5cIixcIlxcdUZGNEVcIjpcIm5cIixcIlxcdTAxRjlcIjpcIm5cIixcIlxcdTAxNDRcIjpcIm5cIixcIlxcdTAwRjFcIjpcIm5cIixcIlxcdTFFNDVcIjpcIm5cIixcIlxcdTAxNDhcIjpcIm5cIixcIlxcdTFFNDdcIjpcIm5cIixcIlxcdTAxNDZcIjpcIm5cIixcIlxcdTFFNEJcIjpcIm5cIixcIlxcdTFFNDlcIjpcIm5cIixcIlxcdTAxOUVcIjpcIm5cIixcIlxcdTAyNzJcIjpcIm5cIixcIlxcdTAxNDlcIjpcIm5cIixcIlxcdUE3OTFcIjpcIm5cIixcIlxcdUE3QTVcIjpcIm5cIixcIlxcdTAxQ0NcIjpcIm5qXCIsXCJcXHUyNERFXCI6XCJvXCIsXCJcXHVGRjRGXCI6XCJvXCIsXCJcXHUwMEYyXCI6XCJvXCIsXCJcXHUwMEYzXCI6XCJvXCIsXCJcXHUwMEY0XCI6XCJvXCIsXCJcXHUxRUQzXCI6XCJvXCIsXCJcXHUxRUQxXCI6XCJvXCIsXCJcXHUxRUQ3XCI6XCJvXCIsXCJcXHUxRUQ1XCI6XCJvXCIsXCJcXHUwMEY1XCI6XCJvXCIsXCJcXHUxRTREXCI6XCJvXCIsXCJcXHUwMjJEXCI6XCJvXCIsXCJcXHUxRTRGXCI6XCJvXCIsXCJcXHUwMTREXCI6XCJvXCIsXCJcXHUxRTUxXCI6XCJvXCIsXCJcXHUxRTUzXCI6XCJvXCIsXCJcXHUwMTRGXCI6XCJvXCIsXCJcXHUwMjJGXCI6XCJvXCIsXCJcXHUwMjMxXCI6XCJvXCIsXCJcXHUwMEY2XCI6XCJvXCIsXCJcXHUwMjJCXCI6XCJvXCIsXCJcXHUxRUNGXCI6XCJvXCIsXCJcXHUwMTUxXCI6XCJvXCIsXCJcXHUwMUQyXCI6XCJvXCIsXCJcXHUwMjBEXCI6XCJvXCIsXCJcXHUwMjBGXCI6XCJvXCIsXCJcXHUwMUExXCI6XCJvXCIsXCJcXHUxRUREXCI6XCJvXCIsXCJcXHUxRURCXCI6XCJvXCIsXCJcXHUxRUUxXCI6XCJvXCIsXCJcXHUxRURGXCI6XCJvXCIsXCJcXHUxRUUzXCI6XCJvXCIsXCJcXHUxRUNEXCI6XCJvXCIsXCJcXHUxRUQ5XCI6XCJvXCIsXCJcXHUwMUVCXCI6XCJvXCIsXCJcXHUwMUVEXCI6XCJvXCIsXCJcXHUwMEY4XCI6XCJvXCIsXCJcXHUwMUZGXCI6XCJvXCIsXCJcXHUwMjU0XCI6XCJvXCIsXCJcXHVBNzRCXCI6XCJvXCIsXCJcXHVBNzREXCI6XCJvXCIsXCJcXHUwMjc1XCI6XCJvXCIsXCJcXHUwMUEzXCI6XCJvaVwiLFwiXFx1MDIyM1wiOlwib3VcIixcIlxcdUE3NEZcIjpcIm9vXCIsXCJcXHUyNERGXCI6XCJwXCIsXCJcXHVGRjUwXCI6XCJwXCIsXCJcXHUxRTU1XCI6XCJwXCIsXCJcXHUxRTU3XCI6XCJwXCIsXCJcXHUwMUE1XCI6XCJwXCIsXCJcXHUxRDdEXCI6XCJwXCIsXCJcXHVBNzUxXCI6XCJwXCIsXCJcXHVBNzUzXCI6XCJwXCIsXCJcXHVBNzU1XCI6XCJwXCIsXCJcXHUyNEUwXCI6XCJxXCIsXCJcXHVGRjUxXCI6XCJxXCIsXCJcXHUwMjRCXCI6XCJxXCIsXCJcXHVBNzU3XCI6XCJxXCIsXCJcXHVBNzU5XCI6XCJxXCIsXCJcXHUyNEUxXCI6XCJyXCIsXCJcXHVGRjUyXCI6XCJyXCIsXCJcXHUwMTU1XCI6XCJyXCIsXCJcXHUxRTU5XCI6XCJyXCIsXCJcXHUwMTU5XCI6XCJyXCIsXCJcXHUwMjExXCI6XCJyXCIsXCJcXHUwMjEzXCI6XCJyXCIsXCJcXHUxRTVCXCI6XCJyXCIsXCJcXHUxRTVEXCI6XCJyXCIsXCJcXHUwMTU3XCI6XCJyXCIsXCJcXHUxRTVGXCI6XCJyXCIsXCJcXHUwMjREXCI6XCJyXCIsXCJcXHUwMjdEXCI6XCJyXCIsXCJcXHVBNzVCXCI6XCJyXCIsXCJcXHVBN0E3XCI6XCJyXCIsXCJcXHVBNzgzXCI6XCJyXCIsXCJcXHUyNEUyXCI6XCJzXCIsXCJcXHVGRjUzXCI6XCJzXCIsXCJcXHUwMERGXCI6XCJzXCIsXCJcXHUwMTVCXCI6XCJzXCIsXCJcXHUxRTY1XCI6XCJzXCIsXCJcXHUwMTVEXCI6XCJzXCIsXCJcXHUxRTYxXCI6XCJzXCIsXCJcXHUwMTYxXCI6XCJzXCIsXCJcXHUxRTY3XCI6XCJzXCIsXCJcXHUxRTYzXCI6XCJzXCIsXCJcXHUxRTY5XCI6XCJzXCIsXCJcXHUwMjE5XCI6XCJzXCIsXCJcXHUwMTVGXCI6XCJzXCIsXCJcXHUwMjNGXCI6XCJzXCIsXCJcXHVBN0E5XCI6XCJzXCIsXCJcXHVBNzg1XCI6XCJzXCIsXCJcXHUxRTlCXCI6XCJzXCIsXCJcXHUyNEUzXCI6XCJ0XCIsXCJcXHVGRjU0XCI6XCJ0XCIsXCJcXHUxRTZCXCI6XCJ0XCIsXCJcXHUxRTk3XCI6XCJ0XCIsXCJcXHUwMTY1XCI6XCJ0XCIsXCJcXHUxRTZEXCI6XCJ0XCIsXCJcXHUwMjFCXCI6XCJ0XCIsXCJcXHUwMTYzXCI6XCJ0XCIsXCJcXHUxRTcxXCI6XCJ0XCIsXCJcXHUxRTZGXCI6XCJ0XCIsXCJcXHUwMTY3XCI6XCJ0XCIsXCJcXHUwMUFEXCI6XCJ0XCIsXCJcXHUwMjg4XCI6XCJ0XCIsXCJcXHUyQzY2XCI6XCJ0XCIsXCJcXHVBNzg3XCI6XCJ0XCIsXCJcXHVBNzI5XCI6XCJ0elwiLFwiXFx1MjRFNFwiOlwidVwiLFwiXFx1RkY1NVwiOlwidVwiLFwiXFx1MDBGOVwiOlwidVwiLFwiXFx1MDBGQVwiOlwidVwiLFwiXFx1MDBGQlwiOlwidVwiLFwiXFx1MDE2OVwiOlwidVwiLFwiXFx1MUU3OVwiOlwidVwiLFwiXFx1MDE2QlwiOlwidVwiLFwiXFx1MUU3QlwiOlwidVwiLFwiXFx1MDE2RFwiOlwidVwiLFwiXFx1MDBGQ1wiOlwidVwiLFwiXFx1MDFEQ1wiOlwidVwiLFwiXFx1MDFEOFwiOlwidVwiLFwiXFx1MDFENlwiOlwidVwiLFwiXFx1MDFEQVwiOlwidVwiLFwiXFx1MUVFN1wiOlwidVwiLFwiXFx1MDE2RlwiOlwidVwiLFwiXFx1MDE3MVwiOlwidVwiLFwiXFx1MDFENFwiOlwidVwiLFwiXFx1MDIxNVwiOlwidVwiLFwiXFx1MDIxN1wiOlwidVwiLFwiXFx1MDFCMFwiOlwidVwiLFwiXFx1MUVFQlwiOlwidVwiLFwiXFx1MUVFOVwiOlwidVwiLFwiXFx1MUVFRlwiOlwidVwiLFwiXFx1MUVFRFwiOlwidVwiLFwiXFx1MUVGMVwiOlwidVwiLFwiXFx1MUVFNVwiOlwidVwiLFwiXFx1MUU3M1wiOlwidVwiLFwiXFx1MDE3M1wiOlwidVwiLFwiXFx1MUU3N1wiOlwidVwiLFwiXFx1MUU3NVwiOlwidVwiLFwiXFx1MDI4OVwiOlwidVwiLFwiXFx1MjRFNVwiOlwidlwiLFwiXFx1RkY1NlwiOlwidlwiLFwiXFx1MUU3RFwiOlwidlwiLFwiXFx1MUU3RlwiOlwidlwiLFwiXFx1MDI4QlwiOlwidlwiLFwiXFx1QTc1RlwiOlwidlwiLFwiXFx1MDI4Q1wiOlwidlwiLFwiXFx1QTc2MVwiOlwidnlcIixcIlxcdTI0RTZcIjpcIndcIixcIlxcdUZGNTdcIjpcIndcIixcIlxcdTFFODFcIjpcIndcIixcIlxcdTFFODNcIjpcIndcIixcIlxcdTAxNzVcIjpcIndcIixcIlxcdTFFODdcIjpcIndcIixcIlxcdTFFODVcIjpcIndcIixcIlxcdTFFOThcIjpcIndcIixcIlxcdTFFODlcIjpcIndcIixcIlxcdTJDNzNcIjpcIndcIixcIlxcdTI0RTdcIjpcInhcIixcIlxcdUZGNThcIjpcInhcIixcIlxcdTFFOEJcIjpcInhcIixcIlxcdTFFOERcIjpcInhcIixcIlxcdTI0RThcIjpcInlcIixcIlxcdUZGNTlcIjpcInlcIixcIlxcdTFFRjNcIjpcInlcIixcIlxcdTAwRkRcIjpcInlcIixcIlxcdTAxNzdcIjpcInlcIixcIlxcdTFFRjlcIjpcInlcIixcIlxcdTAyMzNcIjpcInlcIixcIlxcdTFFOEZcIjpcInlcIixcIlxcdTAwRkZcIjpcInlcIixcIlxcdTFFRjdcIjpcInlcIixcIlxcdTFFOTlcIjpcInlcIixcIlxcdTFFRjVcIjpcInlcIixcIlxcdTAxQjRcIjpcInlcIixcIlxcdTAyNEZcIjpcInlcIixcIlxcdTFFRkZcIjpcInlcIixcIlxcdTI0RTlcIjpcInpcIixcIlxcdUZGNUFcIjpcInpcIixcIlxcdTAxN0FcIjpcInpcIixcIlxcdTFFOTFcIjpcInpcIixcIlxcdTAxN0NcIjpcInpcIixcIlxcdTAxN0VcIjpcInpcIixcIlxcdTFFOTNcIjpcInpcIixcIlxcdTFFOTVcIjpcInpcIixcIlxcdTAxQjZcIjpcInpcIixcIlxcdTAyMjVcIjpcInpcIixcIlxcdTAyNDBcIjpcInpcIixcIlxcdTJDNkNcIjpcInpcIixcIlxcdUE3NjNcIjpcInpcIn07XHJcblxyXG4gICAgJGRvY3VtZW50ID0gJChkb2N1bWVudCk7XHJcblxyXG4gICAgbmV4dFVpZD0oZnVuY3Rpb24oKSB7IHZhciBjb3VudGVyPTE7IHJldHVybiBmdW5jdGlvbigpIHsgcmV0dXJuIGNvdW50ZXIrKzsgfTsgfSgpKTtcclxuXHJcblxyXG4gICAgZnVuY3Rpb24gc3RyaXBEaWFjcml0aWNzKHN0cikge1xyXG4gICAgICAgIHZhciByZXQsIGksIGwsIGM7XHJcblxyXG4gICAgICAgIGlmICghc3RyIHx8IHN0ci5sZW5ndGggPCAxKSByZXR1cm4gc3RyO1xyXG5cclxuICAgICAgICByZXQgPSBcIlwiO1xyXG4gICAgICAgIGZvciAoaSA9IDAsIGwgPSBzdHIubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGMgPSBzdHIuY2hhckF0KGkpO1xyXG4gICAgICAgICAgICByZXQgKz0gRElBQ1JJVElDU1tjXSB8fCBjO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmV0O1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGluZGV4T2YodmFsdWUsIGFycmF5KSB7XHJcbiAgICAgICAgdmFyIGkgPSAwLCBsID0gYXJyYXkubGVuZ3RoO1xyXG4gICAgICAgIGZvciAoOyBpIDwgbDsgaSA9IGkgKyAxKSB7XHJcbiAgICAgICAgICAgIGlmIChlcXVhbCh2YWx1ZSwgYXJyYXlbaV0pKSByZXR1cm4gaTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIG1lYXN1cmVTY3JvbGxiYXIgKCkge1xyXG4gICAgICAgIHZhciAkdGVtcGxhdGUgPSAkKCBNRUFTVVJFX1NDUk9MTEJBUl9URU1QTEFURSApO1xyXG4gICAgICAgICR0ZW1wbGF0ZS5hcHBlbmRUbygnYm9keScpO1xyXG5cclxuICAgICAgICB2YXIgZGltID0ge1xyXG4gICAgICAgICAgICB3aWR0aDogJHRlbXBsYXRlLndpZHRoKCkgLSAkdGVtcGxhdGVbMF0uY2xpZW50V2lkdGgsXHJcbiAgICAgICAgICAgIGhlaWdodDogJHRlbXBsYXRlLmhlaWdodCgpIC0gJHRlbXBsYXRlWzBdLmNsaWVudEhlaWdodFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgJHRlbXBsYXRlLnJlbW92ZSgpO1xyXG5cclxuICAgICAgICByZXR1cm4gZGltO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29tcGFyZXMgZXF1YWxpdHkgb2YgYSBhbmQgYlxyXG4gICAgICogQHBhcmFtIGFcclxuICAgICAqIEBwYXJhbSBiXHJcbiAgICAgKi9cclxuICAgIGZ1bmN0aW9uIGVxdWFsKGEsIGIpIHtcclxuICAgICAgICBpZiAoYSA9PT0gYikgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgaWYgKGEgPT09IHVuZGVmaW5lZCB8fCBiID09PSB1bmRlZmluZWQpIHJldHVybiBmYWxzZTtcclxuICAgICAgICBpZiAoYSA9PT0gbnVsbCB8fCBiID09PSBudWxsKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgLy8gQ2hlY2sgd2hldGhlciAnYScgb3IgJ2InIGlzIGEgc3RyaW5nIChwcmltaXRpdmUgb3Igb2JqZWN0KS5cclxuICAgICAgICAvLyBUaGUgY29uY2F0ZW5hdGlvbiBvZiBhbiBlbXB0eSBzdHJpbmcgKCsnJykgY29udmVydHMgaXRzIGFyZ3VtZW50IHRvIGEgc3RyaW5nJ3MgcHJpbWl0aXZlLlxyXG4gICAgICAgIGlmIChhLmNvbnN0cnVjdG9yID09PSBTdHJpbmcpIHJldHVybiBhKycnID09PSBiKycnOyAvLyBhKycnIC0gaW4gY2FzZSAnYScgaXMgYSBTdHJpbmcgb2JqZWN0XHJcbiAgICAgICAgaWYgKGIuY29uc3RydWN0b3IgPT09IFN0cmluZykgcmV0dXJuIGIrJycgPT09IGErJyc7IC8vIGIrJycgLSBpbiBjYXNlICdiJyBpcyBhIFN0cmluZyBvYmplY3RcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTcGxpdHMgdGhlIHN0cmluZyBpbnRvIGFuIGFycmF5IG9mIHZhbHVlcywgdHJpbW1pbmcgZWFjaCB2YWx1ZS4gQW4gZW1wdHkgYXJyYXkgaXMgcmV0dXJuZWQgZm9yIG51bGxzIG9yIGVtcHR5XHJcbiAgICAgKiBzdHJpbmdzXHJcbiAgICAgKiBAcGFyYW0gc3RyaW5nXHJcbiAgICAgKiBAcGFyYW0gc2VwYXJhdG9yXHJcbiAgICAgKi9cclxuICAgIGZ1bmN0aW9uIHNwbGl0VmFsKHN0cmluZywgc2VwYXJhdG9yKSB7XHJcbiAgICAgICAgdmFyIHZhbCwgaSwgbDtcclxuICAgICAgICBpZiAoc3RyaW5nID09PSBudWxsIHx8IHN0cmluZy5sZW5ndGggPCAxKSByZXR1cm4gW107XHJcbiAgICAgICAgdmFsID0gc3RyaW5nLnNwbGl0KHNlcGFyYXRvcik7XHJcbiAgICAgICAgZm9yIChpID0gMCwgbCA9IHZhbC5sZW5ndGg7IGkgPCBsOyBpID0gaSArIDEpIHZhbFtpXSA9ICQudHJpbSh2YWxbaV0pO1xyXG4gICAgICAgIHJldHVybiB2YWw7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZ2V0U2lkZUJvcmRlclBhZGRpbmcoZWxlbWVudCkge1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50Lm91dGVyV2lkdGgoZmFsc2UpIC0gZWxlbWVudC53aWR0aCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGluc3RhbGxLZXlVcENoYW5nZUV2ZW50KGVsZW1lbnQpIHtcclxuICAgICAgICB2YXIga2V5PVwia2V5dXAtY2hhbmdlLXZhbHVlXCI7XHJcbiAgICAgICAgZWxlbWVudC5vbihcImtleWRvd25cIiwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAoJC5kYXRhKGVsZW1lbnQsIGtleSkgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgJC5kYXRhKGVsZW1lbnQsIGtleSwgZWxlbWVudC52YWwoKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBlbGVtZW50Lm9uKFwia2V5dXBcIiwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgdmFsPSAkLmRhdGEoZWxlbWVudCwga2V5KTtcclxuICAgICAgICAgICAgaWYgKHZhbCAhPT0gdW5kZWZpbmVkICYmIGVsZW1lbnQudmFsKCkgIT09IHZhbCkge1xyXG4gICAgICAgICAgICAgICAgJC5yZW1vdmVEYXRhKGVsZW1lbnQsIGtleSk7XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50LnRyaWdnZXIoXCJrZXl1cC1jaGFuZ2VcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAkZG9jdW1lbnQub24oXCJtb3VzZW1vdmVcIiwgZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICBsYXN0TW91c2VQb3NpdGlvbi54ID0gZS5wYWdlWDtcclxuICAgICAgICBsYXN0TW91c2VQb3NpdGlvbi55ID0gZS5wYWdlWTtcclxuICAgIH0pO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogZmlsdGVycyBtb3VzZSBldmVudHMgc28gYW4gZXZlbnQgaXMgZmlyZWQgb25seSBpZiB0aGUgbW91c2UgbW92ZWQuXHJcbiAgICAgKlxyXG4gICAgICogZmlsdGVycyBvdXQgbW91c2UgZXZlbnRzIHRoYXQgb2NjdXIgd2hlbiBtb3VzZSBpcyBzdGF0aW9uYXJ5IGJ1dFxyXG4gICAgICogdGhlIGVsZW1lbnRzIHVuZGVyIHRoZSBwb2ludGVyIGFyZSBzY3JvbGxlZC5cclxuICAgICAqL1xyXG4gICAgZnVuY3Rpb24gaW5zdGFsbEZpbHRlcmVkTW91c2VNb3ZlKGVsZW1lbnQpIHtcclxuICAgICAgICBlbGVtZW50Lm9uKFwibW91c2Vtb3ZlXCIsIGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIHZhciBsYXN0cG9zID0gbGFzdE1vdXNlUG9zaXRpb247XHJcbiAgICAgICAgICAgIGlmIChsYXN0cG9zID09PSB1bmRlZmluZWQgfHwgbGFzdHBvcy54ICE9PSBlLnBhZ2VYIHx8IGxhc3Rwb3MueSAhPT0gZS5wYWdlWSkge1xyXG4gICAgICAgICAgICAgICAgJChlLnRhcmdldCkudHJpZ2dlcihcIm1vdXNlbW92ZS1maWx0ZXJlZFwiLCBlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGVib3VuY2VzIGEgZnVuY3Rpb24uIFJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGNhbGxzIHRoZSBvcmlnaW5hbCBmbiBmdW5jdGlvbiBvbmx5IGlmIG5vIGludm9jYXRpb25zIGhhdmUgYmVlbiBtYWRlXHJcbiAgICAgKiB3aXRoaW4gdGhlIGxhc3QgcXVpZXRNaWxsaXMgbWlsbGlzZWNvbmRzLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBxdWlldE1pbGxpcyBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQgYmVmb3JlIGludm9raW5nIGZuXHJcbiAgICAgKiBAcGFyYW0gZm4gZnVuY3Rpb24gdG8gYmUgZGVib3VuY2VkXHJcbiAgICAgKiBAcGFyYW0gY3R4IG9iamVjdCB0byBiZSB1c2VkIGFzIHRoaXMgcmVmZXJlbmNlIHdpdGhpbiBmblxyXG4gICAgICogQHJldHVybiBkZWJvdW5jZWQgdmVyc2lvbiBvZiBmblxyXG4gICAgICovXHJcbiAgICBmdW5jdGlvbiBkZWJvdW5jZShxdWlldE1pbGxpcywgZm4sIGN0eCkge1xyXG4gICAgICAgIGN0eCA9IGN0eCB8fCB1bmRlZmluZWQ7XHJcbiAgICAgICAgdmFyIHRpbWVvdXQ7XHJcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XHJcbiAgICAgICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGltZW91dCk7XHJcbiAgICAgICAgICAgIHRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgIGZuLmFwcGx5KGN0eCwgYXJncyk7XHJcbiAgICAgICAgICAgIH0sIHF1aWV0TWlsbGlzKTtcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSBzaW1wbGUgaW1wbGVtZW50YXRpb24gb2YgYSB0aHVua1xyXG4gICAgICogQHBhcmFtIGZvcm11bGEgZnVuY3Rpb24gdXNlZCB0byBsYXppbHkgaW5pdGlhbGl6ZSB0aGUgdGh1bmtcclxuICAgICAqIEByZXR1cm4ge0Z1bmN0aW9ufVxyXG4gICAgICovXHJcbiAgICBmdW5jdGlvbiB0aHVuayhmb3JtdWxhKSB7XHJcbiAgICAgICAgdmFyIGV2YWx1YXRlZCA9IGZhbHNlLFxyXG4gICAgICAgICAgICB2YWx1ZTtcclxuICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIGlmIChldmFsdWF0ZWQgPT09IGZhbHNlKSB7IHZhbHVlID0gZm9ybXVsYSgpOyBldmFsdWF0ZWQgPSB0cnVlOyB9XHJcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgICAgICB9O1xyXG4gICAgfTtcclxuXHJcbiAgICBmdW5jdGlvbiBpbnN0YWxsRGVib3VuY2VkU2Nyb2xsKHRocmVzaG9sZCwgZWxlbWVudCkge1xyXG4gICAgICAgIHZhciBub3RpZnkgPSBkZWJvdW5jZSh0aHJlc2hvbGQsIGZ1bmN0aW9uIChlKSB7IGVsZW1lbnQudHJpZ2dlcihcInNjcm9sbC1kZWJvdW5jZWRcIiwgZSk7fSk7XHJcbiAgICAgICAgZWxlbWVudC5vbihcInNjcm9sbFwiLCBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICBpZiAoaW5kZXhPZihlLnRhcmdldCwgZWxlbWVudC5nZXQoKSkgPj0gMCkgbm90aWZ5KGUpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGZvY3VzKCRlbCkge1xyXG4gICAgICAgIGlmICgkZWxbMF0gPT09IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpIHJldHVybjtcclxuXHJcbiAgICAgICAgLyogc2V0IHRoZSBmb2N1cyBpbiBhIDAgdGltZW91dCAtIHRoYXQgd2F5IHRoZSBmb2N1cyBpcyBzZXQgYWZ0ZXIgdGhlIHByb2Nlc3NpbmdcclxuICAgICAgICAgICAgb2YgdGhlIGN1cnJlbnQgZXZlbnQgaGFzIGZpbmlzaGVkIC0gd2hpY2ggc2VlbXMgbGlrZSB0aGUgb25seSByZWxpYWJsZSB3YXlcclxuICAgICAgICAgICAgdG8gc2V0IGZvY3VzICovXHJcbiAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIHZhciBlbD0kZWxbMF0sIHBvcz0kZWwudmFsKCkubGVuZ3RoLCByYW5nZTtcclxuXHJcbiAgICAgICAgICAgICRlbC5mb2N1cygpO1xyXG5cclxuICAgICAgICAgICAgLyogbWFrZSBzdXJlIGVsIHJlY2VpdmVkIGZvY3VzIHNvIHdlIGRvIG5vdCBlcnJvciBvdXQgd2hlbiB0cnlpbmcgdG8gbWFuaXB1bGF0ZSB0aGUgY2FyZXQuXHJcbiAgICAgICAgICAgICAgICBzb21ldGltZXMgbW9kYWxzIG9yIG90aGVycyBsaXN0ZW5lcnMgbWF5IHN0ZWFsIGl0IGFmdGVyIGl0cyBzZXQgKi9cclxuICAgICAgICAgICAgaWYgKCRlbC5pcyhcIjp2aXNpYmxlXCIpICYmIGVsID09PSBkb2N1bWVudC5hY3RpdmVFbGVtZW50KSB7XHJcblxyXG4gICAgICAgICAgICAgICAgLyogYWZ0ZXIgdGhlIGZvY3VzIGlzIHNldCBtb3ZlIHRoZSBjYXJldCB0byB0aGUgZW5kLCBuZWNlc3Nhcnkgd2hlbiB3ZSB2YWwoKVxyXG4gICAgICAgICAgICAgICAgICAgIGp1c3QgYmVmb3JlIHNldHRpbmcgZm9jdXMgKi9cclxuICAgICAgICAgICAgICAgIGlmKGVsLnNldFNlbGVjdGlvblJhbmdlKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGVsLnNldFNlbGVjdGlvblJhbmdlKHBvcywgcG9zKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVsLmNyZWF0ZVRleHRSYW5nZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJhbmdlID0gZWwuY3JlYXRlVGV4dFJhbmdlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2UuY29sbGFwc2UoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJhbmdlLnNlbGVjdCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSwgMCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZ2V0Q3Vyc29ySW5mbyhlbCkge1xyXG4gICAgICAgIGVsID0gJChlbClbMF07XHJcbiAgICAgICAgdmFyIG9mZnNldCA9IDA7XHJcbiAgICAgICAgdmFyIGxlbmd0aCA9IDA7XHJcbiAgICAgICAgaWYgKCdzZWxlY3Rpb25TdGFydCcgaW4gZWwpIHtcclxuICAgICAgICAgICAgb2Zmc2V0ID0gZWwuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGxlbmd0aCA9IGVsLnNlbGVjdGlvbkVuZCAtIG9mZnNldDtcclxuICAgICAgICB9IGVsc2UgaWYgKCdzZWxlY3Rpb24nIGluIGRvY3VtZW50KSB7XHJcbiAgICAgICAgICAgIGVsLmZvY3VzKCk7XHJcbiAgICAgICAgICAgIHZhciBzZWwgPSBkb2N1bWVudC5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKTtcclxuICAgICAgICAgICAgbGVuZ3RoID0gZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCkudGV4dC5sZW5ndGg7XHJcbiAgICAgICAgICAgIHNlbC5tb3ZlU3RhcnQoJ2NoYXJhY3RlcicsIC1lbC52YWx1ZS5sZW5ndGgpO1xyXG4gICAgICAgICAgICBvZmZzZXQgPSBzZWwudGV4dC5sZW5ndGggLSBsZW5ndGg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7IG9mZnNldDogb2Zmc2V0LCBsZW5ndGg6IGxlbmd0aCB9O1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGtpbGxFdmVudChldmVudCkge1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBraWxsRXZlbnRJbW1lZGlhdGVseShldmVudCkge1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gbWVhc3VyZVRleHRXaWR0aChlKSB7XHJcbiAgICAgICAgaWYgKCFzaXplcil7XHJcbiAgICAgICAgICAgIHZhciBzdHlsZSA9IGVbMF0uY3VycmVudFN0eWxlIHx8IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVbMF0sIG51bGwpO1xyXG4gICAgICAgICAgICBzaXplciA9ICQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSkuY3NzKHtcclxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBcImFic29sdXRlXCIsXHJcbiAgICAgICAgICAgICAgICBsZWZ0OiBcIi0xMDAwMHB4XCIsXHJcbiAgICAgICAgICAgICAgICB0b3A6IFwiLTEwMDAwcHhcIixcclxuICAgICAgICAgICAgICAgIGRpc3BsYXk6IFwibm9uZVwiLFxyXG4gICAgICAgICAgICAgICAgZm9udFNpemU6IHN0eWxlLmZvbnRTaXplLFxyXG4gICAgICAgICAgICAgICAgZm9udEZhbWlseTogc3R5bGUuZm9udEZhbWlseSxcclxuICAgICAgICAgICAgICAgIGZvbnRTdHlsZTogc3R5bGUuZm9udFN0eWxlLFxyXG4gICAgICAgICAgICAgICAgZm9udFdlaWdodDogc3R5bGUuZm9udFdlaWdodCxcclxuICAgICAgICAgICAgICAgIGxldHRlclNwYWNpbmc6IHN0eWxlLmxldHRlclNwYWNpbmcsXHJcbiAgICAgICAgICAgICAgICB0ZXh0VHJhbnNmb3JtOiBzdHlsZS50ZXh0VHJhbnNmb3JtLFxyXG4gICAgICAgICAgICAgICAgd2hpdGVTcGFjZTogXCJub3dyYXBcIlxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgc2l6ZXIuYXR0cihcImNsYXNzXCIsXCJzZWxlY3QyLXNpemVyXCIpO1xyXG4gICAgICAgICAgICAkKFwiYm9keVwiKS5hcHBlbmQoc2l6ZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzaXplci50ZXh0KGUudmFsKCkpO1xyXG4gICAgICAgIHJldHVybiBzaXplci53aWR0aCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHN5bmNDc3NDbGFzc2VzKGRlc3QsIHNyYywgYWRhcHRlcikge1xyXG4gICAgICAgIHZhciBjbGFzc2VzLCByZXBsYWNlbWVudHMgPSBbXSwgYWRhcHRlZDtcclxuXHJcbiAgICAgICAgY2xhc3NlcyA9IGRlc3QuYXR0cihcImNsYXNzXCIpO1xyXG4gICAgICAgIGlmIChjbGFzc2VzKSB7XHJcbiAgICAgICAgICAgIGNsYXNzZXMgPSAnJyArIGNsYXNzZXM7IC8vIGZvciBJRSB3aGljaCByZXR1cm5zIG9iamVjdFxyXG4gICAgICAgICAgICAkKGNsYXNzZXMuc3BsaXQoXCIgXCIpKS5lYWNoMihmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmluZGV4T2YoXCJzZWxlY3QyLVwiKSA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50cy5wdXNoKHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2xhc3NlcyA9IHNyYy5hdHRyKFwiY2xhc3NcIik7XHJcbiAgICAgICAgaWYgKGNsYXNzZXMpIHtcclxuICAgICAgICAgICAgY2xhc3NlcyA9ICcnICsgY2xhc3NlczsgLy8gZm9yIElFIHdoaWNoIHJldHVybnMgb2JqZWN0XHJcbiAgICAgICAgICAgICQoY2xhc3Nlcy5zcGxpdChcIiBcIikpLmVhY2gyKGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaW5kZXhPZihcInNlbGVjdDItXCIpICE9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYWRhcHRlZCA9IGFkYXB0ZXIodGhpcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFkYXB0ZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnRzLnB1c2godGhpcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZGVzdC5hdHRyKFwiY2xhc3NcIiwgcmVwbGFjZW1lbnRzLmpvaW4oXCIgXCIpKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgZnVuY3Rpb24gbWFya01hdGNoKHRleHQsIHRlcm0sIG1hcmt1cCwgZXNjYXBlTWFya3VwKSB7XHJcbiAgICAgICAgdmFyIG1hdGNoPXN0cmlwRGlhY3JpdGljcyh0ZXh0LnRvVXBwZXJDYXNlKCkpLmluZGV4T2Yoc3RyaXBEaWFjcml0aWNzKHRlcm0udG9VcHBlckNhc2UoKSkpLFxyXG4gICAgICAgICAgICB0bD10ZXJtLmxlbmd0aDtcclxuXHJcbiAgICAgICAgaWYgKG1hdGNoPDApIHtcclxuICAgICAgICAgICAgbWFya3VwLnB1c2goZXNjYXBlTWFya3VwKHRleHQpKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbWFya3VwLnB1c2goZXNjYXBlTWFya3VwKHRleHQuc3Vic3RyaW5nKDAsIG1hdGNoKSkpO1xyXG4gICAgICAgIG1hcmt1cC5wdXNoKFwiPHNwYW4gY2xhc3M9J3NlbGVjdDItbWF0Y2gnPlwiKTtcclxuICAgICAgICBtYXJrdXAucHVzaChlc2NhcGVNYXJrdXAodGV4dC5zdWJzdHJpbmcobWF0Y2gsIG1hdGNoICsgdGwpKSk7XHJcbiAgICAgICAgbWFya3VwLnB1c2goXCI8L3NwYW4+XCIpO1xyXG4gICAgICAgIG1hcmt1cC5wdXNoKGVzY2FwZU1hcmt1cCh0ZXh0LnN1YnN0cmluZyhtYXRjaCArIHRsLCB0ZXh0Lmxlbmd0aCkpKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBkZWZhdWx0RXNjYXBlTWFya3VwKG1hcmt1cCkge1xyXG4gICAgICAgIHZhciByZXBsYWNlX21hcCA9IHtcclxuICAgICAgICAgICAgJ1xcXFwnOiAnJiM5MjsnLFxyXG4gICAgICAgICAgICAnJic6ICcmYW1wOycsXHJcbiAgICAgICAgICAgICc8JzogJyZsdDsnLFxyXG4gICAgICAgICAgICAnPic6ICcmZ3Q7JyxcclxuICAgICAgICAgICAgJ1wiJzogJyZxdW90OycsXHJcbiAgICAgICAgICAgIFwiJ1wiOiAnJiMzOTsnLFxyXG4gICAgICAgICAgICBcIi9cIjogJyYjNDc7J1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHJldHVybiBTdHJpbmcobWFya3VwKS5yZXBsYWNlKC9bJjw+XCInXFwvXFxcXF0vZywgZnVuY3Rpb24gKG1hdGNoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiByZXBsYWNlX21hcFttYXRjaF07XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcm9kdWNlcyBhbiBhamF4LWJhc2VkIHF1ZXJ5IGZ1bmN0aW9uXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIG9wdGlvbnMgb2JqZWN0IGNvbnRhaW5pbmcgY29uZmlndXJhdGlvbiBwYXJhbXRlcnNcclxuICAgICAqIEBwYXJhbSBvcHRpb25zLnBhcmFtcyBwYXJhbWV0ZXIgbWFwIGZvciB0aGUgdHJhbnNwb3J0IGFqYXggY2FsbCwgY2FuIGNvbnRhaW4gc3VjaCBvcHRpb25zIGFzIGNhY2hlLCBqc29ucENhbGxiYWNrLCBldGMuIHNlZSAkLmFqYXhcclxuICAgICAqIEBwYXJhbSBvcHRpb25zLnRyYW5zcG9ydCBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgdXNlZCB0byBleGVjdXRlIHRoZSBhamF4IHJlcXVlc3QuIG11c3QgYmUgY29tcGF0aWJsZSB3aXRoIHBhcmFtZXRlcnMgc3VwcG9ydGVkIGJ5ICQuYWpheFxyXG4gICAgICogQHBhcmFtIG9wdGlvbnMudXJsIHVybCBmb3IgdGhlIGRhdGFcclxuICAgICAqIEBwYXJhbSBvcHRpb25zLmRhdGEgYSBmdW5jdGlvbihzZWFyY2hUZXJtLCBwYWdlTnVtYmVyLCBjb250ZXh0KSB0aGF0IHNob3VsZCByZXR1cm4gYW4gb2JqZWN0IGNvbnRhaW5pbmcgcXVlcnkgc3RyaW5nIHBhcmFtZXRlcnMgZm9yIHRoZSBhYm92ZSB1cmwuXHJcbiAgICAgKiBAcGFyYW0gb3B0aW9ucy5kYXRhVHlwZSByZXF1ZXN0IGRhdGEgdHlwZTogYWpheCwganNvbnAsIG90aGVyIGRhdGF0YXR5cGVzIHN1cHBvcnRlZCBieSBqUXVlcnkncyAkLmFqYXggZnVuY3Rpb24gb3IgdGhlIHRyYW5zcG9ydCBmdW5jdGlvbiBpZiBzcGVjaWZpZWRcclxuICAgICAqIEBwYXJhbSBvcHRpb25zLnF1aWV0TWlsbGlzIChvcHRpb25hbCkgbWlsbGlzZWNvbmRzIHRvIHdhaXQgYmVmb3JlIG1ha2luZyB0aGUgYWpheFJlcXVlc3QsIGhlbHBzIGRlYm91bmNlIHRoZSBhamF4IGZ1bmN0aW9uIGlmIGludm9rZWQgdG9vIG9mdGVuXHJcbiAgICAgKiBAcGFyYW0gb3B0aW9ucy5yZXN1bHRzIGEgZnVuY3Rpb24ocmVtb3RlRGF0YSwgcGFnZU51bWJlcikgdGhhdCBjb252ZXJ0cyBkYXRhIHJldHVybmVkIGZvcm0gdGhlIHJlbW90ZSByZXF1ZXN0IHRvIHRoZSBmb3JtYXQgZXhwZWN0ZWQgYnkgU2VsZWN0Mi5cclxuICAgICAqICAgICAgVGhlIGV4cGVjdGVkIGZvcm1hdCBpcyBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgZm9sbG93aW5nIGtleXM6XHJcbiAgICAgKiAgICAgIHJlc3VsdHMgYXJyYXkgb2Ygb2JqZWN0cyB0aGF0IHdpbGwgYmUgdXNlZCBhcyBjaG9pY2VzXHJcbiAgICAgKiAgICAgIG1vcmUgKG9wdGlvbmFsKSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGVyZSBhcmUgbW9yZSByZXN1bHRzIGF2YWlsYWJsZVxyXG4gICAgICogICAgICBFeGFtcGxlOiB7cmVzdWx0czpbe2lkOjEsIHRleHQ6J1JlZCd9LHtpZDoyLCB0ZXh0OidCbHVlJ31dLCBtb3JlOnRydWV9XHJcbiAgICAgKi9cclxuICAgIGZ1bmN0aW9uIGFqYXgob3B0aW9ucykge1xyXG4gICAgICAgIHZhciB0aW1lb3V0LCAvLyBjdXJyZW50IHNjaGVkdWxlZCBidXQgbm90IHlldCBleGVjdXRlZCByZXF1ZXN0XHJcbiAgICAgICAgICAgIGhhbmRsZXIgPSBudWxsLFxyXG4gICAgICAgICAgICBxdWlldE1pbGxpcyA9IG9wdGlvbnMucXVpZXRNaWxsaXMgfHwgMTAwLFxyXG4gICAgICAgICAgICBhamF4VXJsID0gb3B0aW9ucy51cmwsXHJcbiAgICAgICAgICAgIHNlbGYgPSB0aGlzO1xyXG5cclxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHF1ZXJ5KSB7XHJcbiAgICAgICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGltZW91dCk7XHJcbiAgICAgICAgICAgIHRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IG9wdGlvbnMuZGF0YSwgLy8gYWpheCBkYXRhIGZ1bmN0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgdXJsID0gYWpheFVybCwgLy8gYWpheCB1cmwgc3RyaW5nIG9yIGZ1bmN0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0ID0gb3B0aW9ucy50cmFuc3BvcnQgfHwgJC5mbi5zZWxlY3QyLmFqYXhEZWZhdWx0cy50cmFuc3BvcnQsXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gZGVwcmVjYXRlZCAtIHRvIGJlIHJlbW92ZWQgaW4gNC4wICAtIHVzZSBwYXJhbXMgaW5zdGVhZFxyXG4gICAgICAgICAgICAgICAgICAgIGRlcHJlY2F0ZWQgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IG9wdGlvbnMudHlwZSB8fCAnR0VUJywgLy8gc2V0IHR5cGUgb2YgcmVxdWVzdCAoR0VUIG9yIFBPU1QpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlOiBvcHRpb25zLmNhY2hlIHx8IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBqc29ucENhbGxiYWNrOiBvcHRpb25zLmpzb25wQ2FsbGJhY2t8fHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVR5cGU6IG9wdGlvbnMuZGF0YVR5cGV8fFwianNvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBwYXJhbXMgPSAkLmV4dGVuZCh7fSwgJC5mbi5zZWxlY3QyLmFqYXhEZWZhdWx0cy5wYXJhbXMsIGRlcHJlY2F0ZWQpO1xyXG5cclxuICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhID8gZGF0YS5jYWxsKHNlbGYsIHF1ZXJ5LnRlcm0sIHF1ZXJ5LnBhZ2UsIHF1ZXJ5LmNvbnRleHQpIDogbnVsbDtcclxuICAgICAgICAgICAgICAgIHVybCA9ICh0eXBlb2YgdXJsID09PSAnZnVuY3Rpb24nKSA/IHVybC5jYWxsKHNlbGYsIHF1ZXJ5LnRlcm0sIHF1ZXJ5LnBhZ2UsIHF1ZXJ5LmNvbnRleHQpIDogdXJsO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChoYW5kbGVyKSB7IGhhbmRsZXIuYWJvcnQoKTsgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnBhcmFtcykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICgkLmlzRnVuY3Rpb24ob3B0aW9ucy5wYXJhbXMpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICQuZXh0ZW5kKHBhcmFtcywgb3B0aW9ucy5wYXJhbXMuY2FsbChzZWxmKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJC5leHRlbmQocGFyYW1zLCBvcHRpb25zLnBhcmFtcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICQuZXh0ZW5kKHBhcmFtcywge1xyXG4gICAgICAgICAgICAgICAgICAgIHVybDogdXJsLFxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiBvcHRpb25zLmRhdGFUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IGRhdGEsXHJcbiAgICAgICAgICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24gKGRhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyAtIHJlcGxhY2UgcXVlcnkucGFnZSB3aXRoIHF1ZXJ5IHNvIHVzZXJzIGhhdmUgYWNjZXNzIHRvIHRlcm0sIHBhZ2UsIGV0Yy5cclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdHMgPSBvcHRpb25zLnJlc3VsdHMoZGF0YSwgcXVlcnkucGFnZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5LmNhbGxiYWNrKHJlc3VsdHMpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgaGFuZGxlciA9IHRyYW5zcG9ydC5jYWxsKHNlbGYsIHBhcmFtcyk7XHJcbiAgICAgICAgICAgIH0sIHF1aWV0TWlsbGlzKTtcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJvZHVjZXMgYSBxdWVyeSBmdW5jdGlvbiB0aGF0IHdvcmtzIHdpdGggYSBsb2NhbCBhcnJheVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBvcHRpb25zIG9iamVjdCBjb250YWluaW5nIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycy4gVGhlIG9wdGlvbnMgcGFyYW1ldGVyIGNhbiBlaXRoZXIgYmUgYW4gYXJyYXkgb3IgYW5cclxuICAgICAqIG9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBJZiB0aGUgYXJyYXkgZm9ybSBpcyB1c2VkIGl0IGlzIGFzc3VtZWQgdGhhdCBpdCBjb250YWlucyBvYmplY3RzIHdpdGggJ2lkJyBhbmQgJ3RleHQnIGtleXMuXHJcbiAgICAgKlxyXG4gICAgICogSWYgdGhlIG9iamVjdCBmb3JtIGlzIHVzZWQgdGkgaXMgYXNzdW1lZCB0aGF0IGl0IGNvbnRhaW5zICdkYXRhJyBhbmQgJ3RleHQnIGtleXMuIFRoZSAnZGF0YScga2V5IHNob3VsZCBjb250YWluXHJcbiAgICAgKiBhbiBhcnJheSBvZiBvYmplY3RzIHRoYXQgd2lsbCBiZSB1c2VkIGFzIGNob2ljZXMuIFRoZXNlIG9iamVjdHMgbXVzdCBjb250YWluIGF0IGxlYXN0IGFuICdpZCcga2V5LiBUaGUgJ3RleHQnXHJcbiAgICAgKiBrZXkgY2FuIGVpdGhlciBiZSBhIFN0cmluZyBpbiB3aGljaCBjYXNlIGl0IGlzIGV4cGVjdGVkIHRoYXQgZWFjaCBlbGVtZW50IGluIHRoZSAnZGF0YScgYXJyYXkgaGFzIGEga2V5IHdpdGggdGhlXHJcbiAgICAgKiB2YWx1ZSBvZiAndGV4dCcgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIG1hdGNoIGNob2ljZXMuIEFsdGVybmF0aXZlbHksIHRleHQgY2FuIGJlIGEgZnVuY3Rpb24oaXRlbSkgdGhhdCBjYW4gZXh0cmFjdFxyXG4gICAgICogdGhlIHRleHQuXHJcbiAgICAgKi9cclxuICAgIGZ1bmN0aW9uIGxvY2FsKG9wdGlvbnMpIHtcclxuICAgICAgICB2YXIgZGF0YSA9IG9wdGlvbnMsIC8vIGRhdGEgZWxlbWVudHNcclxuICAgICAgICAgICAgZGF0YVRleHQsXHJcbiAgICAgICAgICAgIHRtcCxcclxuICAgICAgICAgICAgdGV4dCA9IGZ1bmN0aW9uIChpdGVtKSB7IHJldHVybiBcIlwiK2l0ZW0udGV4dDsgfTsgLy8gZnVuY3Rpb24gdXNlZCB0byByZXRyaWV2ZSB0aGUgdGV4dCBwb3J0aW9uIG9mIGEgZGF0YSBpdGVtIHRoYXQgaXMgbWF0Y2hlZCBhZ2FpbnN0IHRoZSBzZWFyY2hcclxuXHJcbiAgICAgICAgIGlmICgkLmlzQXJyYXkoZGF0YSkpIHtcclxuICAgICAgICAgICAgdG1wID0gZGF0YTtcclxuICAgICAgICAgICAgZGF0YSA9IHsgcmVzdWx0czogdG1wIH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAgaWYgKCQuaXNGdW5jdGlvbihkYXRhKSA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgdG1wID0gZGF0YTtcclxuICAgICAgICAgICAgZGF0YSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdG1wOyB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIGRhdGFJdGVtID0gZGF0YSgpO1xyXG4gICAgICAgIGlmIChkYXRhSXRlbS50ZXh0KSB7XHJcbiAgICAgICAgICAgIHRleHQgPSBkYXRhSXRlbS50ZXh0O1xyXG4gICAgICAgICAgICAvLyBpZiB0ZXh0IGlzIG5vdCBhIGZ1bmN0aW9uIHdlIGFzc3VtZSBpdCB0byBiZSBhIGtleSBuYW1lXHJcbiAgICAgICAgICAgIGlmICghJC5pc0Z1bmN0aW9uKHRleHQpKSB7XHJcbiAgICAgICAgICAgICAgICBkYXRhVGV4dCA9IGRhdGFJdGVtLnRleHQ7IC8vIHdlIG5lZWQgdG8gc3RvcmUgdGhpcyBpbiBhIHNlcGFyYXRlIHZhcmlhYmxlIGJlY2F1c2UgaW4gdGhlIG5leHQgc3RlcCBkYXRhIGdldHMgcmVzZXQgYW5kIGRhdGEudGV4dCBpcyBubyBsb25nZXIgYXZhaWxhYmxlXHJcbiAgICAgICAgICAgICAgICB0ZXh0ID0gZnVuY3Rpb24gKGl0ZW0pIHsgcmV0dXJuIGl0ZW1bZGF0YVRleHRdOyB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHF1ZXJ5KSB7XHJcbiAgICAgICAgICAgIHZhciB0ID0gcXVlcnkudGVybSwgZmlsdGVyZWQgPSB7IHJlc3VsdHM6IFtdIH0sIHByb2Nlc3M7XHJcbiAgICAgICAgICAgIGlmICh0ID09PSBcIlwiKSB7XHJcbiAgICAgICAgICAgICAgICBxdWVyeS5jYWxsYmFjayhkYXRhKCkpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBwcm9jZXNzID0gZnVuY3Rpb24oZGF0dW0sIGNvbGxlY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgIHZhciBncm91cCwgYXR0cjtcclxuICAgICAgICAgICAgICAgIGRhdHVtID0gZGF0dW1bMF07XHJcbiAgICAgICAgICAgICAgICBpZiAoZGF0dW0uY2hpbGRyZW4pIHtcclxuICAgICAgICAgICAgICAgICAgICBncm91cCA9IHt9O1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAoYXR0ciBpbiBkYXR1bSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0dW0uaGFzT3duUHJvcGVydHkoYXR0cikpIGdyb3VwW2F0dHJdPWRhdHVtW2F0dHJdO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBncm91cC5jaGlsZHJlbj1bXTtcclxuICAgICAgICAgICAgICAgICAgICAkKGRhdHVtLmNoaWxkcmVuKS5lYWNoMihmdW5jdGlvbihpLCBjaGlsZERhdHVtKSB7IHByb2Nlc3MoY2hpbGREYXR1bSwgZ3JvdXAuY2hpbGRyZW4pOyB9KTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZ3JvdXAuY2hpbGRyZW4ubGVuZ3RoIHx8IHF1ZXJ5Lm1hdGNoZXIodCwgdGV4dChncm91cCksIGRhdHVtKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uLnB1c2goZ3JvdXApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHF1ZXJ5Lm1hdGNoZXIodCwgdGV4dChkYXR1bSksIGRhdHVtKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uLnB1c2goZGF0dW0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICQoZGF0YSgpLnJlc3VsdHMpLmVhY2gyKGZ1bmN0aW9uKGksIGRhdHVtKSB7IHByb2Nlc3MoZGF0dW0sIGZpbHRlcmVkLnJlc3VsdHMpOyB9KTtcclxuICAgICAgICAgICAgcXVlcnkuY2FsbGJhY2soZmlsdGVyZWQpO1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVE9ETyBqYXZhZG9jXHJcbiAgICBmdW5jdGlvbiB0YWdzKGRhdGEpIHtcclxuICAgICAgICB2YXIgaXNGdW5jID0gJC5pc0Z1bmN0aW9uKGRhdGEpO1xyXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAocXVlcnkpIHtcclxuICAgICAgICAgICAgdmFyIHQgPSBxdWVyeS50ZXJtLCBmaWx0ZXJlZCA9IHtyZXN1bHRzOiBbXX07XHJcbiAgICAgICAgICAgICQoaXNGdW5jID8gZGF0YSgpIDogZGF0YSkuZWFjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgaXNPYmplY3QgPSB0aGlzLnRleHQgIT09IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gaXNPYmplY3QgPyB0aGlzLnRleHQgOiB0aGlzO1xyXG4gICAgICAgICAgICAgICAgaWYgKHQgPT09IFwiXCIgfHwgcXVlcnkubWF0Y2hlcih0LCB0ZXh0KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkLnJlc3VsdHMucHVzaChpc09iamVjdCA/IHRoaXMgOiB7aWQ6IHRoaXMsIHRleHQ6IHRoaXN9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHF1ZXJ5LmNhbGxiYWNrKGZpbHRlcmVkKTtcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hlY2tzIGlmIHRoZSBmb3JtYXR0ZXIgZnVuY3Rpb24gc2hvdWxkIGJlIHVzZWQuXHJcbiAgICAgKlxyXG4gICAgICogVGhyb3dzIGFuIGVycm9yIGlmIGl0IGlzIG5vdCBhIGZ1bmN0aW9uLiBSZXR1cm5zIHRydWUgaWYgaXQgc2hvdWxkIGJlIHVzZWQsXHJcbiAgICAgKiBmYWxzZSBpZiBubyBmb3JtYXR0aW5nIHNob3VsZCBiZSBwZXJmb3JtZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGZvcm1hdHRlclxyXG4gICAgICovXHJcbiAgICBmdW5jdGlvbiBjaGVja0Zvcm1hdHRlcihmb3JtYXR0ZXIsIGZvcm1hdHRlck5hbWUpIHtcclxuICAgICAgICBpZiAoJC5pc0Z1bmN0aW9uKGZvcm1hdHRlcikpIHJldHVybiB0cnVlO1xyXG4gICAgICAgIGlmICghZm9ybWF0dGVyKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGZvcm1hdHRlck5hbWUgK1wiIG11c3QgYmUgYSBmdW5jdGlvbiBvciBhIGZhbHN5IHZhbHVlXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGV2YWx1YXRlKHZhbCkge1xyXG4gICAgICAgIHJldHVybiAkLmlzRnVuY3Rpb24odmFsKSA/IHZhbCgpIDogdmFsO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGNvdW50UmVzdWx0cyhyZXN1bHRzKSB7XHJcbiAgICAgICAgdmFyIGNvdW50ID0gMDtcclxuICAgICAgICAkLmVhY2gocmVzdWx0cywgZnVuY3Rpb24oaSwgaXRlbSkge1xyXG4gICAgICAgICAgICBpZiAoaXRlbS5jaGlsZHJlbikge1xyXG4gICAgICAgICAgICAgICAgY291bnQgKz0gY291bnRSZXN1bHRzKGl0ZW0uY2hpbGRyZW4pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY291bnQrKztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiBjb3VudDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERlZmF1bHQgdG9rZW5pemVyLiBUaGlzIGZ1bmN0aW9uIHVzZXMgYnJlYWtzIHRoZSBpbnB1dCBvbiBzdWJzdHJpbmcgbWF0Y2ggb2YgYW55IHN0cmluZyBmcm9tIHRoZVxyXG4gICAgICogb3B0cy50b2tlblNlcGFyYXRvcnMgYXJyYXkgYW5kIHVzZXMgb3B0cy5jcmVhdGVTZWFyY2hDaG9pY2UgdG8gY3JlYXRlIHRoZSBjaG9pY2Ugb2JqZWN0LiBCb3RoIG9mIHRob3NlXHJcbiAgICAgKiB0d28gb3B0aW9ucyBoYXZlIHRvIGJlIGRlZmluZWQgaW4gb3JkZXIgZm9yIHRoZSB0b2tlbml6ZXIgdG8gd29yay5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gaW5wdXQgdGV4dCB1c2VyIGhhcyB0eXBlZCBzbyBmYXIgb3IgcGFzdGVkIGludG8gdGhlIHNlYXJjaCBmaWVsZFxyXG4gICAgICogQHBhcmFtIHNlbGVjdGlvbiBjdXJyZW50bHkgc2VsZWN0ZWQgY2hvaWNlc1xyXG4gICAgICogQHBhcmFtIHNlbGVjdENhbGxiYWNrIGZ1bmN0aW9uKGNob2ljZSkgY2FsbGJhY2sgdGhvIGFkZCB0aGUgY2hvaWNlIHRvIHNlbGVjdGlvblxyXG4gICAgICogQHBhcmFtIG9wdHMgc2VsZWN0MidzIG9wdHNcclxuICAgICAqIEByZXR1cm4gdW5kZWZpbmVkL251bGwgdG8gbGVhdmUgdGhlIGN1cnJlbnQgaW5wdXQgdW5jaGFuZ2VkLCBvciBhIHN0cmluZyB0byBjaGFuZ2UgdGhlIGlucHV0IHRvIHRoZSByZXR1cm5lZCB2YWx1ZVxyXG4gICAgICovXHJcbiAgICBmdW5jdGlvbiBkZWZhdWx0VG9rZW5pemVyKGlucHV0LCBzZWxlY3Rpb24sIHNlbGVjdENhbGxiYWNrLCBvcHRzKSB7XHJcbiAgICAgICAgdmFyIG9yaWdpbmFsID0gaW5wdXQsIC8vIHN0b3JlIHRoZSBvcmlnaW5hbCBzbyB3ZSBjYW4gY29tcGFyZSBhbmQga25vdyBpZiB3ZSBuZWVkIHRvIHRlbGwgdGhlIHNlYXJjaCB0byB1cGRhdGUgaXRzIHRleHRcclxuICAgICAgICAgICAgZHVwZSA9IGZhbHNlLCAvLyBjaGVjayBmb3Igd2hldGhlciBhIHRva2VuIHdlIGV4dHJhY3RlZCByZXByZXNlbnRzIGEgZHVwbGljYXRlIHNlbGVjdGVkIGNob2ljZVxyXG4gICAgICAgICAgICB0b2tlbiwgLy8gdG9rZW5cclxuICAgICAgICAgICAgaW5kZXgsIC8vIHBvc2l0aW9uIGF0IHdoaWNoIHRoZSBzZXBhcmF0b3Igd2FzIGZvdW5kXHJcbiAgICAgICAgICAgIGksIGwsIC8vIGxvb3BpbmcgdmFyaWFibGVzXHJcbiAgICAgICAgICAgIHNlcGFyYXRvcjsgLy8gdGhlIG1hdGNoZWQgc2VwYXJhdG9yXHJcblxyXG4gICAgICAgIGlmICghb3B0cy5jcmVhdGVTZWFyY2hDaG9pY2UgfHwgIW9wdHMudG9rZW5TZXBhcmF0b3JzIHx8IG9wdHMudG9rZW5TZXBhcmF0b3JzLmxlbmd0aCA8IDEpIHJldHVybiB1bmRlZmluZWQ7XHJcblxyXG4gICAgICAgIHdoaWxlICh0cnVlKSB7XHJcbiAgICAgICAgICAgIGluZGV4ID0gLTE7XHJcblxyXG4gICAgICAgICAgICBmb3IgKGkgPSAwLCBsID0gb3B0cy50b2tlblNlcGFyYXRvcnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBzZXBhcmF0b3IgPSBvcHRzLnRva2VuU2VwYXJhdG9yc1tpXTtcclxuICAgICAgICAgICAgICAgIGluZGV4ID0gaW5wdXQuaW5kZXhPZihzZXBhcmF0b3IpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoaW5kZXggPCAwKSBicmVhazsgLy8gZGlkIG5vdCBmaW5kIGFueSB0b2tlbiBzZXBhcmF0b3IgaW4gdGhlIGlucHV0IHN0cmluZywgYmFpbFxyXG5cclxuICAgICAgICAgICAgdG9rZW4gPSBpbnB1dC5zdWJzdHJpbmcoMCwgaW5kZXgpO1xyXG4gICAgICAgICAgICBpbnB1dCA9IGlucHV0LnN1YnN0cmluZyhpbmRleCArIHNlcGFyYXRvci5sZW5ndGgpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRva2VuLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHRva2VuID0gb3B0cy5jcmVhdGVTZWFyY2hDaG9pY2UuY2FsbCh0aGlzLCB0b2tlbiwgc2VsZWN0aW9uKTtcclxuICAgICAgICAgICAgICAgIGlmICh0b2tlbiAhPT0gdW5kZWZpbmVkICYmIHRva2VuICE9PSBudWxsICYmIG9wdHMuaWQodG9rZW4pICE9PSB1bmRlZmluZWQgJiYgb3B0cy5pZCh0b2tlbikgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICBkdXBlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMCwgbCA9IHNlbGVjdGlvbi5sZW5ndGg7IGkgPCBsOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVxdWFsKG9wdHMuaWQodG9rZW4pLCBvcHRzLmlkKHNlbGVjdGlvbltpXSkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXBlID0gdHJ1ZTsgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghZHVwZSkgc2VsZWN0Q2FsbGJhY2sodG9rZW4pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAob3JpZ2luYWwhPT1pbnB1dCkgcmV0dXJuIGlucHV0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIG5ldyBjbGFzc1xyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBzdXBlckNsYXNzXHJcbiAgICAgKiBAcGFyYW0gbWV0aG9kc1xyXG4gICAgICovXHJcbiAgICBmdW5jdGlvbiBjbGF6eihTdXBlckNsYXNzLCBtZXRob2RzKSB7XHJcbiAgICAgICAgdmFyIGNvbnN0cnVjdG9yID0gZnVuY3Rpb24gKCkge307XHJcbiAgICAgICAgY29uc3RydWN0b3IucHJvdG90eXBlID0gbmV3IFN1cGVyQ2xhc3M7XHJcbiAgICAgICAgY29uc3RydWN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY29uc3RydWN0b3I7XHJcbiAgICAgICAgY29uc3RydWN0b3IucHJvdG90eXBlLnBhcmVudCA9IFN1cGVyQ2xhc3MucHJvdG90eXBlO1xyXG4gICAgICAgIGNvbnN0cnVjdG9yLnByb3RvdHlwZSA9ICQuZXh0ZW5kKGNvbnN0cnVjdG9yLnByb3RvdHlwZSwgbWV0aG9kcyk7XHJcbiAgICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yO1xyXG4gICAgfVxyXG5cclxuICAgIEFic3RyYWN0U2VsZWN0MiA9IGNsYXp6KE9iamVjdCwge1xyXG5cclxuICAgICAgICAvLyBhYnN0cmFjdFxyXG4gICAgICAgIGJpbmQ6IGZ1bmN0aW9uIChmdW5jKSB7XHJcbiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpcztcclxuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIGZ1bmMuYXBwbHkoc2VsZiwgYXJndW1lbnRzKTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBhYnN0cmFjdFxyXG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uIChvcHRzKSB7XHJcbiAgICAgICAgICAgIHZhciByZXN1bHRzLCBzZWFyY2gsIHJlc3VsdHNTZWxlY3RvciA9IFwiLnNlbGVjdDItcmVzdWx0c1wiLCBkaXNhYmxlZCwgcmVhZG9ubHk7XHJcblxyXG4gICAgICAgICAgICAvLyBwcmVwYXJlIG9wdGlvbnNcclxuICAgICAgICAgICAgdGhpcy5vcHRzID0gb3B0cyA9IHRoaXMucHJlcGFyZU9wdHMob3B0cyk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmlkPW9wdHMuaWQ7XHJcblxyXG4gICAgICAgICAgICAvLyBkZXN0cm95IGlmIGNhbGxlZCBvbiBhbiBleGlzdGluZyBjb21wb25lbnRcclxuICAgICAgICAgICAgaWYgKG9wdHMuZWxlbWVudC5kYXRhKFwic2VsZWN0MlwiKSAhPT0gdW5kZWZpbmVkICYmXHJcbiAgICAgICAgICAgICAgICBvcHRzLmVsZW1lbnQuZGF0YShcInNlbGVjdDJcIikgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIG9wdHMuZWxlbWVudC5kYXRhKFwic2VsZWN0MlwiKS5kZXN0cm95KCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyID0gdGhpcy5jcmVhdGVDb250YWluZXIoKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVySWQ9XCJzMmlkX1wiKyhvcHRzLmVsZW1lbnQuYXR0cihcImlkXCIpIHx8IFwiYXV0b2dlblwiK25leHRVaWQoKSk7XHJcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyU2VsZWN0b3I9XCIjXCIrdGhpcy5jb250YWluZXJJZC5yZXBsYWNlKC8oWzsmLFxcLlxcK1xcKlxcfic6XCJcXCFcXF4jJCVAXFxbXFxdXFwoXFwpPT5cXHxdKS9nLCAnXFxcXCQxJyk7XHJcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLmF0dHIoXCJpZFwiLCB0aGlzLmNvbnRhaW5lcklkKTtcclxuXHJcbiAgICAgICAgICAgIC8vIGNhY2hlIHRoZSBib2R5IHNvIGZ1dHVyZSBsb29rdXBzIGFyZSBjaGVhcFxyXG4gICAgICAgICAgICB0aGlzLmJvZHkgPSB0aHVuayhmdW5jdGlvbigpIHsgcmV0dXJuIG9wdHMuZWxlbWVudC5jbG9zZXN0KFwiYm9keVwiKTsgfSk7XHJcblxyXG4gICAgICAgICAgICBzeW5jQ3NzQ2xhc3Nlcyh0aGlzLmNvbnRhaW5lciwgdGhpcy5vcHRzLmVsZW1lbnQsIHRoaXMub3B0cy5hZGFwdENvbnRhaW5lckNzc0NsYXNzKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLmF0dHIoXCJzdHlsZVwiLCBvcHRzLmVsZW1lbnQuYXR0cihcInN0eWxlXCIpKTtcclxuICAgICAgICAgICAgdGhpcy5jb250YWluZXIuY3NzKGV2YWx1YXRlKG9wdHMuY29udGFpbmVyQ3NzKSk7XHJcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLmFkZENsYXNzKGV2YWx1YXRlKG9wdHMuY29udGFpbmVyQ3NzQ2xhc3MpKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudFRhYkluZGV4ID0gdGhpcy5vcHRzLmVsZW1lbnQuYXR0cihcInRhYmluZGV4XCIpO1xyXG5cclxuICAgICAgICAgICAgLy8gc3dhcCBjb250YWluZXIgZm9yIHRoZSBlbGVtZW50XHJcbiAgICAgICAgICAgIHRoaXMub3B0cy5lbGVtZW50XHJcbiAgICAgICAgICAgICAgICAuZGF0YShcInNlbGVjdDJcIiwgdGhpcylcclxuICAgICAgICAgICAgICAgIC5hdHRyKFwidGFiaW5kZXhcIiwgXCItMVwiKVxyXG4gICAgICAgICAgICAgICAgLmJlZm9yZSh0aGlzLmNvbnRhaW5lcik7XHJcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLmRhdGEoXCJzZWxlY3QyXCIsIHRoaXMpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5kcm9wZG93biA9IHRoaXMuY29udGFpbmVyLmZpbmQoXCIuc2VsZWN0Mi1kcm9wXCIpO1xyXG4gICAgICAgICAgICB0aGlzLmRyb3Bkb3duLmFkZENsYXNzKGV2YWx1YXRlKG9wdHMuZHJvcGRvd25Dc3NDbGFzcykpO1xyXG4gICAgICAgICAgICB0aGlzLmRyb3Bkb3duLmRhdGEoXCJzZWxlY3QyXCIsIHRoaXMpO1xyXG5cclxuICAgICAgICAgICAgc3luY0Nzc0NsYXNzZXModGhpcy5kcm9wZG93biwgdGhpcy5vcHRzLmVsZW1lbnQsIHRoaXMub3B0cy5hZGFwdERyb3Bkb3duQ3NzQ2xhc3MpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5yZXN1bHRzID0gcmVzdWx0cyA9IHRoaXMuY29udGFpbmVyLmZpbmQocmVzdWx0c1NlbGVjdG9yKTtcclxuICAgICAgICAgICAgdGhpcy5zZWFyY2ggPSBzZWFyY2ggPSB0aGlzLmNvbnRhaW5lci5maW5kKFwiaW5wdXQuc2VsZWN0Mi1pbnB1dFwiKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMucXVlcnlDb3VudCA9IDA7XHJcbiAgICAgICAgICAgIHRoaXMucmVzdWx0c1BhZ2UgPSAwO1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRleHQgPSBudWxsO1xyXG5cclxuICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSB0aGUgY29udGFpbmVyXHJcbiAgICAgICAgICAgIHRoaXMuaW5pdENvbnRhaW5lcigpO1xyXG5cclxuICAgICAgICAgICAgaW5zdGFsbEZpbHRlcmVkTW91c2VNb3ZlKHRoaXMucmVzdWx0cyk7XHJcbiAgICAgICAgICAgIHRoaXMuZHJvcGRvd24ub24oXCJtb3VzZW1vdmUtZmlsdGVyZWQgdG91Y2hzdGFydCB0b3VjaG1vdmUgdG91Y2hlbmRcIiwgcmVzdWx0c1NlbGVjdG9yLCB0aGlzLmJpbmQodGhpcy5oaWdobGlnaHRVbmRlckV2ZW50KSk7XHJcblxyXG4gICAgICAgICAgICBpbnN0YWxsRGVib3VuY2VkU2Nyb2xsKDgwLCB0aGlzLnJlc3VsdHMpO1xyXG4gICAgICAgICAgICB0aGlzLmRyb3Bkb3duLm9uKFwic2Nyb2xsLWRlYm91bmNlZFwiLCByZXN1bHRzU2VsZWN0b3IsIHRoaXMuYmluZCh0aGlzLmxvYWRNb3JlSWZOZWVkZWQpKTtcclxuXHJcbiAgICAgICAgICAgIC8vIGRvIG5vdCBwcm9wYWdhdGUgY2hhbmdlIGV2ZW50IGZyb20gdGhlIHNlYXJjaCBmaWVsZCBvdXQgb2YgdGhlIGNvbXBvbmVudFxyXG4gICAgICAgICAgICAkKHRoaXMuY29udGFpbmVyKS5vbihcImNoYW5nZVwiLCBcIi5zZWxlY3QyLWlucHV0XCIsIGZ1bmN0aW9uKGUpIHtlLnN0b3BQcm9wYWdhdGlvbigpO30pO1xyXG4gICAgICAgICAgICAkKHRoaXMuZHJvcGRvd24pLm9uKFwiY2hhbmdlXCIsIFwiLnNlbGVjdDItaW5wdXRcIiwgZnVuY3Rpb24oZSkge2Uuc3RvcFByb3BhZ2F0aW9uKCk7fSk7XHJcblxyXG4gICAgICAgICAgICAvLyBpZiBqcXVlcnkubW91c2V3aGVlbCBwbHVnaW4gaXMgaW5zdGFsbGVkIHdlIGNhbiBwcmV2ZW50IG91dC1vZi1ib3VuZHMgc2Nyb2xsaW5nIG9mIHJlc3VsdHMgdmlhIG1vdXNld2hlZWxcclxuICAgICAgICAgICAgaWYgKCQuZm4ubW91c2V3aGVlbCkge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0cy5tb3VzZXdoZWVsKGZ1bmN0aW9uIChlLCBkZWx0YSwgZGVsdGFYLCBkZWx0YVkpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgdG9wID0gcmVzdWx0cy5zY3JvbGxUb3AoKSwgaGVpZ2h0O1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChkZWx0YVkgPiAwICYmIHRvcCAtIGRlbHRhWSA8PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMuc2Nyb2xsVG9wKDApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBraWxsRXZlbnQoZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkZWx0YVkgPCAwICYmIHJlc3VsdHMuZ2V0KDApLnNjcm9sbEhlaWdodCAtIHJlc3VsdHMuc2Nyb2xsVG9wKCkgKyBkZWx0YVkgPD0gcmVzdWx0cy5oZWlnaHQoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLnNjcm9sbFRvcChyZXN1bHRzLmdldCgwKS5zY3JvbGxIZWlnaHQgLSByZXN1bHRzLmhlaWdodCgpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAga2lsbEV2ZW50KGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpbnN0YWxsS2V5VXBDaGFuZ2VFdmVudChzZWFyY2gpO1xyXG4gICAgICAgICAgICBzZWFyY2gub24oXCJrZXl1cC1jaGFuZ2UgaW5wdXQgcGFzdGVcIiwgdGhpcy5iaW5kKHRoaXMudXBkYXRlUmVzdWx0cykpO1xyXG4gICAgICAgICAgICBzZWFyY2gub24oXCJmb2N1c1wiLCBmdW5jdGlvbiAoKSB7IHNlYXJjaC5hZGRDbGFzcyhcInNlbGVjdDItZm9jdXNlZFwiKTsgfSk7XHJcbiAgICAgICAgICAgIHNlYXJjaC5vbihcImJsdXJcIiwgZnVuY3Rpb24gKCkgeyBzZWFyY2gucmVtb3ZlQ2xhc3MoXCJzZWxlY3QyLWZvY3VzZWRcIik7fSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmRyb3Bkb3duLm9uKFwibW91c2V1cFwiLCByZXN1bHRzU2VsZWN0b3IsIHRoaXMuYmluZChmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCQoZS50YXJnZXQpLmNsb3Nlc3QoXCIuc2VsZWN0Mi1yZXN1bHQtc2VsZWN0YWJsZVwiKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRVbmRlckV2ZW50KGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0SGlnaGxpZ2h0ZWQoZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pKTtcclxuXHJcbiAgICAgICAgICAgIC8vIHRyYXAgYWxsIG1vdXNlIGV2ZW50cyBmcm9tIGxlYXZpbmcgdGhlIGRyb3Bkb3duLiBzb21ldGltZXMgdGhlcmUgbWF5IGJlIGEgbW9kYWwgdGhhdCBpcyBsaXN0ZW5pbmdcclxuICAgICAgICAgICAgLy8gZm9yIG1vdXNlIGV2ZW50cyBvdXRzaWRlIG9mIGl0c2VsZiBzbyBpdCBjYW4gY2xvc2UgaXRzZWxmLiBzaW5jZSB0aGUgZHJvcGRvd24gaXMgbm93IG91dHNpZGUgdGhlIHNlbGVjdDInc1xyXG4gICAgICAgICAgICAvLyBkb20gaXQgd2lsbCB0cmlnZ2VyIHRoZSBwb3B1cCBjbG9zZSwgd2hpY2ggaXMgbm90IHdoYXQgd2Ugd2FudFxyXG4gICAgICAgICAgICB0aGlzLmRyb3Bkb3duLm9uKFwiY2xpY2sgbW91c2V1cCBtb3VzZWRvd25cIiwgZnVuY3Rpb24gKGUpIHsgZS5zdG9wUHJvcGFnYXRpb24oKTsgfSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoJC5pc0Z1bmN0aW9uKHRoaXMub3B0cy5pbml0U2VsZWN0aW9uKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSBzZWxlY3Rpb24gYmFzZWQgb24gdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHNvdXJjZSBlbGVtZW50XHJcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRTZWxlY3Rpb24oKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgdXNlciBoYXMgcHJvdmlkZWQgYSBmdW5jdGlvbiB0aGF0IGNhbiBzZXQgc2VsZWN0aW9uIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiB0aGUgc291cmNlIGVsZW1lbnRcclxuICAgICAgICAgICAgICAgIC8vIHdlIG1vbml0b3IgdGhlIGNoYW5nZSBldmVudCBvbiB0aGUgZWxlbWVudCBhbmQgdHJpZ2dlciBpdCwgYWxsb3dpbmcgZm9yIHR3byB3YXkgc3luY2hyb25pemF0aW9uXHJcbiAgICAgICAgICAgICAgICB0aGlzLm1vbml0b3JTb3VyY2UoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKG9wdHMubWF4aW11bUlucHV0TGVuZ3RoICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaC5hdHRyKFwibWF4bGVuZ3RoXCIsIG9wdHMubWF4aW11bUlucHV0TGVuZ3RoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdmFyIGRpc2FibGVkID0gb3B0cy5lbGVtZW50LnByb3AoXCJkaXNhYmxlZFwiKTtcclxuICAgICAgICAgICAgaWYgKGRpc2FibGVkID09PSB1bmRlZmluZWQpIGRpc2FibGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlKCFkaXNhYmxlZCk7XHJcblxyXG4gICAgICAgICAgICB2YXIgcmVhZG9ubHkgPSBvcHRzLmVsZW1lbnQucHJvcChcInJlYWRvbmx5XCIpO1xyXG4gICAgICAgICAgICBpZiAocmVhZG9ubHkgPT09IHVuZGVmaW5lZCkgcmVhZG9ubHkgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5yZWFkb25seShyZWFkb25seSk7XHJcblxyXG4gICAgICAgICAgICAvLyBDYWxjdWxhdGUgc2l6ZSBvZiBzY3JvbGxiYXJcclxuICAgICAgICAgICAgc2Nyb2xsQmFyRGltZW5zaW9ucyA9IHNjcm9sbEJhckRpbWVuc2lvbnMgfHwgbWVhc3VyZVNjcm9sbGJhcigpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5hdXRvZm9jdXMgPSBvcHRzLmVsZW1lbnQucHJvcChcImF1dG9mb2N1c1wiKTtcclxuICAgICAgICAgICAgb3B0cy5lbGVtZW50LnByb3AoXCJhdXRvZm9jdXNcIiwgZmFsc2UpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5hdXRvZm9jdXMpIHRoaXMuZm9jdXMoKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMubmV4dFNlYXJjaFRlcm0gPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gYWJzdHJhY3RcclxuICAgICAgICBkZXN0cm95OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBlbGVtZW50PXRoaXMub3B0cy5lbGVtZW50LCBzZWxlY3QyID0gZWxlbWVudC5kYXRhKFwic2VsZWN0MlwiKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnByb3BlcnR5T2JzZXJ2ZXIpIHsgZGVsZXRlIHRoaXMucHJvcGVydHlPYnNlcnZlcjsgdGhpcy5wcm9wZXJ0eU9ic2VydmVyID0gbnVsbDsgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHNlbGVjdDIgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0Mi5jb250YWluZXIucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3QyLmRyb3Bkb3duLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAgICAgZWxlbWVudFxyXG4gICAgICAgICAgICAgICAgICAgIC5yZW1vdmVDbGFzcyhcInNlbGVjdDItb2Zmc2NyZWVuXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgLnJlbW92ZURhdGEoXCJzZWxlY3QyXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgLm9mZihcIi5zZWxlY3QyXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgLnByb3AoXCJhdXRvZm9jdXNcIiwgdGhpcy5hdXRvZm9jdXMgfHwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZWxlbWVudFRhYkluZGV4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5hdHRyKHt0YWJpbmRleDogdGhpcy5lbGVtZW50VGFiSW5kZXh9KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyKFwidGFiaW5kZXhcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50LnNob3coKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIGFic3RyYWN0XHJcbiAgICAgICAgb3B0aW9uVG9EYXRhOiBmdW5jdGlvbihlbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGlmIChlbGVtZW50LmlzKFwib3B0aW9uXCIpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlkOmVsZW1lbnQucHJvcChcInZhbHVlXCIpLFxyXG4gICAgICAgICAgICAgICAgICAgIHRleHQ6ZWxlbWVudC50ZXh0KCksXHJcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudDogZWxlbWVudC5nZXQoKSxcclxuICAgICAgICAgICAgICAgICAgICBjc3M6IGVsZW1lbnQuYXR0cihcImNsYXNzXCIpLFxyXG4gICAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiBlbGVtZW50LnByb3AoXCJkaXNhYmxlZFwiKSxcclxuICAgICAgICAgICAgICAgICAgICBsb2NrZWQ6IGVxdWFsKGVsZW1lbnQuYXR0cihcImxvY2tlZFwiKSwgXCJsb2NrZWRcIikgfHwgZXF1YWwoZWxlbWVudC5kYXRhKFwibG9ja2VkXCIpLCB0cnVlKVxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50LmlzKFwib3B0Z3JvdXBcIikpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGV4dDplbGVtZW50LmF0dHIoXCJsYWJlbFwiKSxcclxuICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbjpbXSxcclxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50OiBlbGVtZW50LmdldCgpLFxyXG4gICAgICAgICAgICAgICAgICAgIGNzczogZWxlbWVudC5hdHRyKFwiY2xhc3NcIilcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBhYnN0cmFjdFxyXG4gICAgICAgIHByZXBhcmVPcHRzOiBmdW5jdGlvbiAob3B0cykge1xyXG4gICAgICAgICAgICB2YXIgZWxlbWVudCwgc2VsZWN0LCBpZEtleSwgYWpheFVybCwgc2VsZiA9IHRoaXM7XHJcblxyXG4gICAgICAgICAgICBlbGVtZW50ID0gb3B0cy5lbGVtZW50O1xyXG5cclxuICAgICAgICAgICAgaWYgKGVsZW1lbnQuZ2V0KDApLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJzZWxlY3RcIikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3QgPSBzZWxlY3QgPSBvcHRzLmVsZW1lbnQ7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChzZWxlY3QpIHtcclxuICAgICAgICAgICAgICAgIC8vIHRoZXNlIG9wdGlvbnMgYXJlIG5vdCBhbGxvd2VkIHdoZW4gYXR0YWNoZWQgdG8gYSBzZWxlY3QgYmVjYXVzZSB0aGV5IGFyZSBwaWNrZWQgdXAgb2ZmIHRoZSBlbGVtZW50IGl0c2VsZlxyXG4gICAgICAgICAgICAgICAgJC5lYWNoKFtcImlkXCIsIFwibXVsdGlwbGVcIiwgXCJhamF4XCIsIFwicXVlcnlcIiwgXCJjcmVhdGVTZWFyY2hDaG9pY2VcIiwgXCJpbml0U2VsZWN0aW9uXCIsIFwiZGF0YVwiLCBcInRhZ3NcIl0sIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcyBpbiBvcHRzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk9wdGlvbiAnXCIgKyB0aGlzICsgXCInIGlzIG5vdCBhbGxvd2VkIGZvciBTZWxlY3QyIHdoZW4gYXR0YWNoZWQgdG8gYSA8c2VsZWN0PiBlbGVtZW50LlwiKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgb3B0cyA9ICQuZXh0ZW5kKHt9LCB7XHJcbiAgICAgICAgICAgICAgICBwb3B1bGF0ZVJlc3VsdHM6IGZ1bmN0aW9uKGNvbnRhaW5lciwgcmVzdWx0cywgcXVlcnkpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgcG9wdWxhdGUsICBkYXRhLCByZXN1bHQsIGNoaWxkcmVuLCBpZD10aGlzLm9wdHMuaWQ7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHBvcHVsYXRlPWZ1bmN0aW9uKHJlc3VsdHMsIGNvbnRhaW5lciwgZGVwdGgpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpLCBsLCByZXN1bHQsIHNlbGVjdGFibGUsIGRpc2FibGVkLCBjb21wb3VuZCwgbm9kZSwgbGFiZWwsIGlubmVyQ29udGFpbmVyLCBmb3JtYXR0ZWQ7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gb3B0cy5zb3J0UmVzdWx0cyhyZXN1bHRzLCBjb250YWluZXIsIHF1ZXJ5KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDAsIGwgPSByZXN1bHRzLmxlbmd0aDsgaSA8IGw7IGkgPSBpICsgMSkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdD1yZXN1bHRzW2ldO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkID0gKHJlc3VsdC5kaXNhYmxlZCA9PT0gdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RhYmxlID0gKCFkaXNhYmxlZCkgJiYgKGlkKHJlc3VsdCkgIT09IHVuZGVmaW5lZCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG91bmQ9cmVzdWx0LmNoaWxkcmVuICYmIHJlc3VsdC5jaGlsZHJlbi5sZW5ndGggPiAwO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGU9JChcIjxsaT48L2xpPlwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuYWRkQ2xhc3MoXCJzZWxlY3QyLXJlc3VsdHMtZGVwdC1cIitkZXB0aCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLmFkZENsYXNzKFwic2VsZWN0Mi1yZXN1bHRcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLmFkZENsYXNzKHNlbGVjdGFibGUgPyBcInNlbGVjdDItcmVzdWx0LXNlbGVjdGFibGVcIiA6IFwic2VsZWN0Mi1yZXN1bHQtdW5zZWxlY3RhYmxlXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpc2FibGVkKSB7IG5vZGUuYWRkQ2xhc3MoXCJzZWxlY3QyLWRpc2FibGVkXCIpOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG91bmQpIHsgbm9kZS5hZGRDbGFzcyhcInNlbGVjdDItcmVzdWx0LXdpdGgtY2hpbGRyZW5cIik7IH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuYWRkQ2xhc3Moc2VsZi5vcHRzLmZvcm1hdFJlc3VsdENzc0NsYXNzKHJlc3VsdCkpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPSQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbC5hZGRDbGFzcyhcInNlbGVjdDItcmVzdWx0LWxhYmVsXCIpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHRlZD1vcHRzLmZvcm1hdFJlc3VsdChyZXN1bHQsIGxhYmVsLCBxdWVyeSwgc2VsZi5vcHRzLmVzY2FwZU1hcmt1cCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybWF0dGVkIT09dW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwuaHRtbChmb3JtYXR0ZWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuYXBwZW5kKGxhYmVsKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG91bmQpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5uZXJDb250YWluZXI9JChcIjx1bD48L3VsPlwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbm5lckNvbnRhaW5lci5hZGRDbGFzcyhcInNlbGVjdDItcmVzdWx0LXN1YlwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3B1bGF0ZShyZXN1bHQuY2hpbGRyZW4sIGlubmVyQ29udGFpbmVyLCBkZXB0aCsxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLmFwcGVuZChpbm5lckNvbnRhaW5lcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5kYXRhKFwic2VsZWN0Mi1kYXRhXCIsIHJlc3VsdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXIuYXBwZW5kKG5vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcG9wdWxhdGUocmVzdWx0cywgY29udGFpbmVyLCAwKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSwgJC5mbi5zZWxlY3QyLmRlZmF1bHRzLCBvcHRzKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0eXBlb2Yob3B0cy5pZCkgIT09IFwiZnVuY3Rpb25cIikge1xyXG4gICAgICAgICAgICAgICAgaWRLZXkgPSBvcHRzLmlkO1xyXG4gICAgICAgICAgICAgICAgb3B0cy5pZCA9IGZ1bmN0aW9uIChlKSB7IHJldHVybiBlW2lkS2V5XTsgfTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCQuaXNBcnJheShvcHRzLmVsZW1lbnQuZGF0YShcInNlbGVjdDJUYWdzXCIpKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKFwidGFnc1wiIGluIG9wdHMpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBcInRhZ3Mgc3BlY2lmaWVkIGFzIGJvdGggYW4gYXR0cmlidXRlICdkYXRhLXNlbGVjdDItdGFncycgYW5kIGluIG9wdGlvbnMgb2YgU2VsZWN0MiBcIiArIG9wdHMuZWxlbWVudC5hdHRyKFwiaWRcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBvcHRzLnRhZ3M9b3B0cy5lbGVtZW50LmRhdGEoXCJzZWxlY3QyVGFnc1wiKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHNlbGVjdCkge1xyXG4gICAgICAgICAgICAgICAgb3B0cy5xdWVyeSA9IHRoaXMuYmluZChmdW5jdGlvbiAocXVlcnkpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IHsgcmVzdWx0czogW10sIG1vcmU6IGZhbHNlIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlcm0gPSBxdWVyeS50ZXJtLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiwgcGxhY2Vob2xkZXJPcHRpb24sIHByb2Nlc3M7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3M9ZnVuY3Rpb24oZWxlbWVudCwgY29sbGVjdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZ3JvdXA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmlzKFwib3B0aW9uXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocXVlcnkubWF0Y2hlcih0ZXJtLCBlbGVtZW50LnRleHQoKSwgZWxlbWVudCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uLnB1c2goc2VsZi5vcHRpb25Ub0RhdGEoZWxlbWVudCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQuaXMoXCJvcHRncm91cFwiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXA9c2VsZi5vcHRpb25Ub0RhdGEoZWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmNoaWxkcmVuKCkuZWFjaDIoZnVuY3Rpb24oaSwgZWxtKSB7IHByb2Nlc3MoZWxtLCBncm91cC5jaGlsZHJlbik7IH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdyb3VwLmNoaWxkcmVuLmxlbmd0aD4wKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdGlvbi5wdXNoKGdyb3VwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuPWVsZW1lbnQuY2hpbGRyZW4oKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIHRoZSBwbGFjZWhvbGRlciBvcHRpb24gaWYgdGhlcmUgaXMgb25lXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZ2V0UGxhY2Vob2xkZXIoKSAhPT0gdW5kZWZpbmVkICYmIGNoaWxkcmVuLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXJPcHRpb24gPSB0aGlzLmdldFBsYWNlaG9sZGVyT3B0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbGFjZWhvbGRlck9wdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW49Y2hpbGRyZW4ubm90KHBsYWNlaG9sZGVyT3B0aW9uKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4uZWFjaDIoZnVuY3Rpb24oaSwgZWxtKSB7IHByb2Nlc3MoZWxtLCBkYXRhLnJlc3VsdHMpOyB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcXVlcnkuY2FsbGJhY2soZGF0YSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgaW5zaWRlIHZhbCgpIHdlIGNvbnN0cnVjdCBjaG9pY2VzIGZyb20gb3B0aW9ucyBhbmQgdGhlcmUgaWQgaXMgaGFyZGNvZGVkXHJcbiAgICAgICAgICAgICAgICBvcHRzLmlkPWZ1bmN0aW9uKGUpIHsgcmV0dXJuIGUuaWQ7IH07XHJcbiAgICAgICAgICAgICAgICBvcHRzLmZvcm1hdFJlc3VsdENzc0NsYXNzID0gZnVuY3Rpb24oZGF0YSkgeyByZXR1cm4gZGF0YS5jc3M7IH07XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIShcInF1ZXJ5XCIgaW4gb3B0cykpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKFwiYWpheFwiIGluIG9wdHMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYWpheFVybCA9IG9wdHMuZWxlbWVudC5kYXRhKFwiYWpheC11cmxcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhamF4VXJsICYmIGFqYXhVcmwubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0cy5hamF4LnVybCA9IGFqYXhVcmw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgb3B0cy5xdWVyeSA9IGFqYXguY2FsbChvcHRzLmVsZW1lbnQsIG9wdHMuYWpheCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcImRhdGFcIiBpbiBvcHRzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdHMucXVlcnkgPSBsb2NhbChvcHRzLmRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXCJ0YWdzXCIgaW4gb3B0cykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRzLnF1ZXJ5ID0gdGFncyhvcHRzLnRhZ3MpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0cy5jcmVhdGVTZWFyY2hDaG9pY2UgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0cy5jcmVhdGVTZWFyY2hDaG9pY2UgPSBmdW5jdGlvbiAodGVybSkgeyByZXR1cm4ge2lkOiAkLnRyaW0odGVybSksIHRleHQ6ICQudHJpbSh0ZXJtKX07IH07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdHMuaW5pdFNlbGVjdGlvbiA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRzLmluaXRTZWxlY3Rpb24gPSBmdW5jdGlvbiAoZWxlbWVudCwgY2FsbGJhY2spIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoc3BsaXRWYWwoZWxlbWVudC52YWwoKSwgb3B0cy5zZXBhcmF0b3IpKS5lYWNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlkID0gdGhpcywgdGV4dCA9IHRoaXMsIHRhZ3M9b3B0cy50YWdzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJC5pc0Z1bmN0aW9uKHRhZ3MpKSB0YWdzPXRhZ3MoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0YWdzKS5lYWNoKGZ1bmN0aW9uKCkgeyBpZiAoZXF1YWwodGhpcy5pZCwgaWQpKSB7IHRleHQgPSB0aGlzLnRleHQ7IHJldHVybiBmYWxzZTsgfSB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5wdXNoKHtpZDogaWQsIHRleHQ6IHRleHR9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2Yob3B0cy5xdWVyeSkgIT09IFwiZnVuY3Rpb25cIikge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgXCJxdWVyeSBmdW5jdGlvbiBub3QgZGVmaW5lZCBmb3IgU2VsZWN0MiBcIiArIG9wdHMuZWxlbWVudC5hdHRyKFwiaWRcIik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiBvcHRzO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIE1vbml0b3IgdGhlIG9yaWdpbmFsIGVsZW1lbnQgZm9yIGNoYW5nZXMgYW5kIHVwZGF0ZSBzZWxlY3QyIGFjY29yZGluZ2x5XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgLy8gYWJzdHJhY3RcclxuICAgICAgICBtb25pdG9yU291cmNlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBlbCA9IHRoaXMub3B0cy5lbGVtZW50LCBzeW5jO1xyXG5cclxuICAgICAgICAgICAgZWwub24oXCJjaGFuZ2Uuc2VsZWN0MlwiLCB0aGlzLmJpbmQoZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdHMuZWxlbWVudC5kYXRhKFwic2VsZWN0Mi1jaGFuZ2UtdHJpZ2dlcmVkXCIpICE9PSB0cnVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0U2VsZWN0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pKTtcclxuXHJcbiAgICAgICAgICAgIHN5bmMgPSB0aGlzLmJpbmQoZnVuY3Rpb24gKCkge1xyXG5cclxuICAgICAgICAgICAgICAgIHZhciBlbmFibGVkLCByZWFkb25seSwgc2VsZiA9IHRoaXM7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gc3luYyBlbmFibGVkIHN0YXRlXHJcbiAgICAgICAgICAgICAgICB2YXIgZGlzYWJsZWQgPSBlbC5wcm9wKFwiZGlzYWJsZWRcIik7XHJcbiAgICAgICAgICAgICAgICBpZiAoZGlzYWJsZWQgPT09IHVuZGVmaW5lZCkgZGlzYWJsZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZW5hYmxlKCFkaXNhYmxlZCk7XHJcblxyXG4gICAgICAgICAgICAgICAgdmFyIHJlYWRvbmx5ID0gZWwucHJvcChcInJlYWRvbmx5XCIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlYWRvbmx5ID09PSB1bmRlZmluZWQpIHJlYWRvbmx5ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlYWRvbmx5KHJlYWRvbmx5KTtcclxuXHJcbiAgICAgICAgICAgICAgICBzeW5jQ3NzQ2xhc3Nlcyh0aGlzLmNvbnRhaW5lciwgdGhpcy5vcHRzLmVsZW1lbnQsIHRoaXMub3B0cy5hZGFwdENvbnRhaW5lckNzc0NsYXNzKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLmFkZENsYXNzKGV2YWx1YXRlKHRoaXMub3B0cy5jb250YWluZXJDc3NDbGFzcykpO1xyXG5cclxuICAgICAgICAgICAgICAgIHN5bmNDc3NDbGFzc2VzKHRoaXMuZHJvcGRvd24sIHRoaXMub3B0cy5lbGVtZW50LCB0aGlzLm9wdHMuYWRhcHREcm9wZG93bkNzc0NsYXNzKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZHJvcGRvd24uYWRkQ2xhc3MoZXZhbHVhdGUodGhpcy5vcHRzLmRyb3Bkb3duQ3NzQ2xhc3MpKTtcclxuXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgLy8gbW96aWxsYSBhbmQgSUVcclxuICAgICAgICAgICAgZWwub24oXCJwcm9wZXJ0eWNoYW5nZS5zZWxlY3QyIERPTUF0dHJNb2RpZmllZC5zZWxlY3QyXCIsIHN5bmMpO1xyXG5cclxuXHJcbiAgICAgICAgICAgIC8vIGhvbGQgb250byBhIHJlZmVyZW5jZSBvZiB0aGUgY2FsbGJhY2sgdG8gd29yayBhcm91bmQgYSBjaHJvbWl1bSBidWdcclxuICAgICAgICAgICAgaWYgKHRoaXMubXV0YXRpb25DYWxsYmFjayA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm11dGF0aW9uQ2FsbGJhY2sgPSBmdW5jdGlvbiAobXV0YXRpb25zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbXV0YXRpb25zLmZvckVhY2goc3luYyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIHNhZmFyaSBhbmQgY2hyb21lXHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgV2ViS2l0TXV0YXRpb25PYnNlcnZlciAhPT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucHJvcGVydHlPYnNlcnZlcikgeyBkZWxldGUgdGhpcy5wcm9wZXJ0eU9ic2VydmVyOyB0aGlzLnByb3BlcnR5T2JzZXJ2ZXIgPSBudWxsOyB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLnByb3BlcnR5T2JzZXJ2ZXIgPSBuZXcgV2ViS2l0TXV0YXRpb25PYnNlcnZlcih0aGlzLm11dGF0aW9uQ2FsbGJhY2spO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wZXJ0eU9ic2VydmVyLm9ic2VydmUoZWwuZ2V0KDApLCB7IGF0dHJpYnV0ZXM6dHJ1ZSwgc3VidHJlZTpmYWxzZSB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIGFic3RyYWN0XHJcbiAgICAgICAgdHJpZ2dlclNlbGVjdDogZnVuY3Rpb24oZGF0YSkge1xyXG4gICAgICAgICAgICB2YXIgZXZ0ID0gJC5FdmVudChcInNlbGVjdDItc2VsZWN0aW5nXCIsIHsgdmFsOiB0aGlzLmlkKGRhdGEpLCBvYmplY3Q6IGRhdGEgfSk7XHJcbiAgICAgICAgICAgIHRoaXMub3B0cy5lbGVtZW50LnRyaWdnZXIoZXZ0KTtcclxuICAgICAgICAgICAgcmV0dXJuICFldnQuaXNEZWZhdWx0UHJldmVudGVkKCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVHJpZ2dlcnMgdGhlIGNoYW5nZSBldmVudCBvbiB0aGUgc291cmNlIGVsZW1lbnRcclxuICAgICAgICAgKi9cclxuICAgICAgICAvLyBhYnN0cmFjdFxyXG4gICAgICAgIHRyaWdnZXJDaGFuZ2U6IGZ1bmN0aW9uIChkZXRhaWxzKSB7XHJcblxyXG4gICAgICAgICAgICBkZXRhaWxzID0gZGV0YWlscyB8fCB7fTtcclxuICAgICAgICAgICAgZGV0YWlscz0gJC5leHRlbmQoe30sIGRldGFpbHMsIHsgdHlwZTogXCJjaGFuZ2VcIiwgdmFsOiB0aGlzLnZhbCgpIH0pO1xyXG4gICAgICAgICAgICAvLyBwcmV2ZW50cyByZWN1cnNpdmUgdHJpZ2dlcmluZ1xyXG4gICAgICAgICAgICB0aGlzLm9wdHMuZWxlbWVudC5kYXRhKFwic2VsZWN0Mi1jaGFuZ2UtdHJpZ2dlcmVkXCIsIHRydWUpO1xyXG4gICAgICAgICAgICB0aGlzLm9wdHMuZWxlbWVudC50cmlnZ2VyKGRldGFpbHMpO1xyXG4gICAgICAgICAgICB0aGlzLm9wdHMuZWxlbWVudC5kYXRhKFwic2VsZWN0Mi1jaGFuZ2UtdHJpZ2dlcmVkXCIsIGZhbHNlKTtcclxuXHJcbiAgICAgICAgICAgIC8vIHNvbWUgdmFsaWRhdGlvbiBmcmFtZXdvcmtzIGlnbm9yZSB0aGUgY2hhbmdlIGV2ZW50IGFuZCBsaXN0ZW4gaW5zdGVhZCB0byBrZXl1cCwgY2xpY2sgZm9yIHNlbGVjdHNcclxuICAgICAgICAgICAgLy8gc28gaGVyZSB3ZSB0cmlnZ2VyIHRoZSBjbGljayBldmVudCBtYW51YWxseVxyXG4gICAgICAgICAgICB0aGlzLm9wdHMuZWxlbWVudC5jbGljaygpO1xyXG5cclxuICAgICAgICAgICAgLy8gVmFsaWRhdGlvbkVuZ2luZSBpZ25vcmVhIHRoZSBjaGFuZ2UgZXZlbnQgYW5kIGxpc3RlbnMgaW5zdGVhZCB0byBibHVyXHJcbiAgICAgICAgICAgIC8vIHNvIGhlcmUgd2UgdHJpZ2dlciB0aGUgYmx1ciBldmVudCBtYW51YWxseSBpZiBzbyBkZXNpcmVkXHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdHMuYmx1ck9uQ2hhbmdlKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5vcHRzLmVsZW1lbnQuYmx1cigpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vYWJzdHJhY3RcclxuICAgICAgICBpc0ludGVyZmFjZUVuYWJsZWQ6IGZ1bmN0aW9uKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVuYWJsZWRJbnRlcmZhY2UgPT09IHRydWU7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gYWJzdHJhY3RcclxuICAgICAgICBlbmFibGVJbnRlcmZhY2U6IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICB2YXIgZW5hYmxlZCA9IHRoaXMuX2VuYWJsZWQgJiYgIXRoaXMuX3JlYWRvbmx5LFxyXG4gICAgICAgICAgICAgICAgZGlzYWJsZWQgPSAhZW5hYmxlZDtcclxuXHJcbiAgICAgICAgICAgIGlmIChlbmFibGVkID09PSB0aGlzLmVuYWJsZWRJbnRlcmZhY2UpIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLnRvZ2dsZUNsYXNzKFwic2VsZWN0Mi1jb250YWluZXItZGlzYWJsZWRcIiwgZGlzYWJsZWQpO1xyXG4gICAgICAgICAgICB0aGlzLmNsb3NlKCk7XHJcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlZEludGVyZmFjZSA9IGVuYWJsZWQ7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBhYnN0cmFjdFxyXG4gICAgICAgIGVuYWJsZTogZnVuY3Rpb24oZW5hYmxlZCkge1xyXG4gICAgICAgICAgICBpZiAoZW5hYmxlZCA9PT0gdW5kZWZpbmVkKSBlbmFibGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2VuYWJsZWQgPT09IGVuYWJsZWQpIHJldHVybjtcclxuICAgICAgICAgICAgdGhpcy5fZW5hYmxlZCA9IGVuYWJsZWQ7XHJcblxyXG4gICAgICAgICAgICB0aGlzLm9wdHMuZWxlbWVudC5wcm9wKFwiZGlzYWJsZWRcIiwgIWVuYWJsZWQpO1xyXG4gICAgICAgICAgICB0aGlzLmVuYWJsZUludGVyZmFjZSgpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIGFic3RyYWN0XHJcbiAgICAgICAgZGlzYWJsZTogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlKGZhbHNlKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBhYnN0cmFjdFxyXG4gICAgICAgIHJlYWRvbmx5OiBmdW5jdGlvbihlbmFibGVkKSB7XHJcbiAgICAgICAgICAgIGlmIChlbmFibGVkID09PSB1bmRlZmluZWQpIGVuYWJsZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3JlYWRvbmx5ID09PSBlbmFibGVkKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuX3JlYWRvbmx5ID0gZW5hYmxlZDtcclxuXHJcbiAgICAgICAgICAgIHRoaXMub3B0cy5lbGVtZW50LnByb3AoXCJyZWFkb25seVwiLCBlbmFibGVkKTtcclxuICAgICAgICAgICAgdGhpcy5lbmFibGVJbnRlcmZhY2UoKTtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gYWJzdHJhY3RcclxuICAgICAgICBvcGVuZWQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyLmhhc0NsYXNzKFwic2VsZWN0Mi1kcm9wZG93bi1vcGVuXCIpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIGFic3RyYWN0XHJcbiAgICAgICAgcG9zaXRpb25Ecm9wZG93bjogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIHZhciAkZHJvcGRvd24gPSB0aGlzLmRyb3Bkb3duLFxyXG4gICAgICAgICAgICAgICAgb2Zmc2V0ID0gdGhpcy5jb250YWluZXIub2Zmc2V0KCksXHJcbiAgICAgICAgICAgICAgICBoZWlnaHQgPSB0aGlzLmNvbnRhaW5lci5vdXRlckhlaWdodChmYWxzZSksXHJcbiAgICAgICAgICAgICAgICB3aWR0aCA9IHRoaXMuY29udGFpbmVyLm91dGVyV2lkdGgoZmFsc2UpLFxyXG4gICAgICAgICAgICAgICAgZHJvcEhlaWdodCA9ICRkcm9wZG93bi5vdXRlckhlaWdodChmYWxzZSksXHJcbiAgICAgICAgICAgICAgICB2aWV3UG9ydFJpZ2h0ID0gJCh3aW5kb3cpLnNjcm9sbExlZnQoKSArICQod2luZG93KS53aWR0aCgpLFxyXG4gICAgICAgICAgICAgICAgdmlld3BvcnRCb3R0b20gPSAkKHdpbmRvdykuc2Nyb2xsVG9wKCkgKyAkKHdpbmRvdykuaGVpZ2h0KCksXHJcbiAgICAgICAgICAgICAgICBkcm9wVG9wID0gb2Zmc2V0LnRvcCArIGhlaWdodCxcclxuICAgICAgICAgICAgICAgIGRyb3BMZWZ0ID0gb2Zmc2V0LmxlZnQsXHJcbiAgICAgICAgICAgICAgICBlbm91Z2hSb29tQmVsb3cgPSBkcm9wVG9wICsgZHJvcEhlaWdodCA8PSB2aWV3cG9ydEJvdHRvbSxcclxuICAgICAgICAgICAgICAgIGVub3VnaFJvb21BYm92ZSA9IChvZmZzZXQudG9wIC0gZHJvcEhlaWdodCkgPj0gdGhpcy5ib2R5KCkuc2Nyb2xsVG9wKCksXHJcbiAgICAgICAgICAgICAgICBkcm9wV2lkdGggPSAkZHJvcGRvd24ub3V0ZXJXaWR0aChmYWxzZSksXHJcbiAgICAgICAgICAgICAgICBlbm91Z2hSb29tT25SaWdodCA9IGRyb3BMZWZ0ICsgZHJvcFdpZHRoIDw9IHZpZXdQb3J0UmlnaHQsXHJcbiAgICAgICAgICAgICAgICBhYm92ZU5vdyA9ICRkcm9wZG93bi5oYXNDbGFzcyhcInNlbGVjdDItZHJvcC1hYm92ZVwiKSxcclxuICAgICAgICAgICAgICAgIGJvZHlPZmZzZXQsXHJcbiAgICAgICAgICAgICAgICBhYm92ZSxcclxuICAgICAgICAgICAgICAgIGNzcyxcclxuICAgICAgICAgICAgICAgIHJlc3VsdHNMaXN0Tm9kZTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdHMuZHJvcGRvd25BdXRvV2lkdGgpIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdHNMaXN0Tm9kZSA9ICQoJy5zZWxlY3QyLXJlc3VsdHMnLCAkZHJvcGRvd24pWzBdO1xyXG4gICAgICAgICAgICAgICAgJGRyb3Bkb3duLmFkZENsYXNzKCdzZWxlY3QyLWRyb3AtYXV0by13aWR0aCcpO1xyXG4gICAgICAgICAgICAgICAgJGRyb3Bkb3duLmNzcygnd2lkdGgnLCAnJyk7XHJcbiAgICAgICAgICAgICAgICAvLyBBZGQgc2Nyb2xsYmFyIHdpZHRoIHRvIGRyb3Bkb3duIGlmIHZlcnRpY2FsIHNjcm9sbGJhciBpcyBwcmVzZW50XHJcbiAgICAgICAgICAgICAgICBkcm9wV2lkdGggPSAkZHJvcGRvd24ub3V0ZXJXaWR0aChmYWxzZSkgKyAocmVzdWx0c0xpc3ROb2RlLnNjcm9sbEhlaWdodCA9PT0gcmVzdWx0c0xpc3ROb2RlLmNsaWVudEhlaWdodCA/IDAgOiBzY3JvbGxCYXJEaW1lbnNpb25zLndpZHRoKTtcclxuICAgICAgICAgICAgICAgIGRyb3BXaWR0aCA+IHdpZHRoID8gd2lkdGggPSBkcm9wV2lkdGggOiBkcm9wV2lkdGggPSB3aWR0aDtcclxuICAgICAgICAgICAgICAgIGVub3VnaFJvb21PblJpZ2h0ID0gZHJvcExlZnQgKyBkcm9wV2lkdGggPD0gdmlld1BvcnRSaWdodDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLnJlbW92ZUNsYXNzKCdzZWxlY3QyLWRyb3AtYXV0by13aWR0aCcpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKFwiYmVsb3cvIGRyb3B0b3A6XCIsIGRyb3BUb3AsIFwiZHJvcEhlaWdodFwiLCBkcm9wSGVpZ2h0LCBcInN1bVwiLCAoZHJvcFRvcCtkcm9wSGVpZ2h0KStcIiB2aWV3cG9ydCBib3R0b21cIiwgdmlld3BvcnRCb3R0b20sIFwiZW5vdWdoP1wiLCBlbm91Z2hSb29tQmVsb3cpO1xyXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKFwiYWJvdmUvIG9mZnNldC50b3BcIiwgb2Zmc2V0LnRvcCwgXCJkcm9wSGVpZ2h0XCIsIGRyb3BIZWlnaHQsIFwidG9wXCIsIChvZmZzZXQudG9wLWRyb3BIZWlnaHQpLCBcInNjcm9sbFRvcFwiLCB0aGlzLmJvZHkoKS5zY3JvbGxUb3AoKSwgXCJlbm91Z2g/XCIsIGVub3VnaFJvb21BYm92ZSk7XHJcblxyXG4gICAgICAgICAgICAvLyBmaXggcG9zaXRpb25pbmcgd2hlbiBib2R5IGhhcyBhbiBvZmZzZXQgYW5kIGlzIG5vdCBwb3NpdGlvbjogc3RhdGljXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmJvZHkoKS5jc3MoJ3Bvc2l0aW9uJykgIT09ICdzdGF0aWMnKSB7XHJcbiAgICAgICAgICAgICAgICBib2R5T2Zmc2V0ID0gdGhpcy5ib2R5KCkub2Zmc2V0KCk7XHJcbiAgICAgICAgICAgICAgICBkcm9wVG9wIC09IGJvZHlPZmZzZXQudG9wO1xyXG4gICAgICAgICAgICAgICAgZHJvcExlZnQgLT0gYm9keU9mZnNldC5sZWZ0O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBhbHdheXMgcHJlZmVyIHRoZSBjdXJyZW50IGFib3ZlL2JlbG93IGFsaWdubWVudCwgdW5sZXNzIHRoZXJlIGlzIG5vdCBlbm91Z2ggcm9vbVxyXG4gICAgICAgICAgICBpZiAoYWJvdmVOb3cpIHtcclxuICAgICAgICAgICAgICAgIGFib3ZlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGlmICghZW5vdWdoUm9vbUFib3ZlICYmIGVub3VnaFJvb21CZWxvdykgYWJvdmUgPSBmYWxzZTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGFib3ZlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWVub3VnaFJvb21CZWxvdyAmJiBlbm91Z2hSb29tQWJvdmUpIGFib3ZlID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCFlbm91Z2hSb29tT25SaWdodCkge1xyXG4gICAgICAgICAgICAgICBkcm9wTGVmdCA9IG9mZnNldC5sZWZ0ICsgd2lkdGggLSBkcm9wV2lkdGg7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChhYm92ZSkge1xyXG4gICAgICAgICAgICAgICAgZHJvcFRvcCA9IG9mZnNldC50b3AgLSBkcm9wSGVpZ2h0O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb250YWluZXIuYWRkQ2xhc3MoXCJzZWxlY3QyLWRyb3AtYWJvdmVcIik7XHJcbiAgICAgICAgICAgICAgICAkZHJvcGRvd24uYWRkQ2xhc3MoXCJzZWxlY3QyLWRyb3AtYWJvdmVcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5yZW1vdmVDbGFzcyhcInNlbGVjdDItZHJvcC1hYm92ZVwiKTtcclxuICAgICAgICAgICAgICAgICRkcm9wZG93bi5yZW1vdmVDbGFzcyhcInNlbGVjdDItZHJvcC1hYm92ZVwiKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY3NzID0gJC5leHRlbmQoe1xyXG4gICAgICAgICAgICAgICAgdG9wOiBkcm9wVG9wLFxyXG4gICAgICAgICAgICAgICAgbGVmdDogZHJvcExlZnQsXHJcbiAgICAgICAgICAgICAgICB3aWR0aDogd2lkdGhcclxuICAgICAgICAgICAgfSwgZXZhbHVhdGUodGhpcy5vcHRzLmRyb3Bkb3duQ3NzKSk7XHJcblxyXG4gICAgICAgICAgICAkZHJvcGRvd24uY3NzKGNzcyk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gYWJzdHJhY3RcclxuICAgICAgICBzaG91bGRPcGVuOiBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgdmFyIGV2ZW50O1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMub3BlbmVkKCkpIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9lbmFibGVkID09PSBmYWxzZSB8fCB0aGlzLl9yZWFkb25seSA9PT0gdHJ1ZSkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgZXZlbnQgPSAkLkV2ZW50KFwic2VsZWN0Mi1vcGVuaW5nXCIpO1xyXG4gICAgICAgICAgICB0aGlzLm9wdHMuZWxlbWVudC50cmlnZ2VyKGV2ZW50KTtcclxuICAgICAgICAgICAgcmV0dXJuICFldmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBhYnN0cmFjdFxyXG4gICAgICAgIGNsZWFyRHJvcGRvd25BbGlnbm1lbnRQcmVmZXJlbmNlOiBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgLy8gY2xlYXIgdGhlIGNsYXNzZXMgdXNlZCB0byBmaWd1cmUgb3V0IHRoZSBwcmVmZXJlbmNlIG9mIHdoZXJlIHRoZSBkcm9wZG93biBzaG91bGQgYmUgb3BlbmVkXHJcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLnJlbW92ZUNsYXNzKFwic2VsZWN0Mi1kcm9wLWFib3ZlXCIpO1xyXG4gICAgICAgICAgICB0aGlzLmRyb3Bkb3duLnJlbW92ZUNsYXNzKFwic2VsZWN0Mi1kcm9wLWFib3ZlXCIpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIE9wZW5zIHRoZSBkcm9wZG93blxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQHJldHVybiB7Qm9vbGVhbn0gd2hldGhlciBvciBub3QgZHJvcGRvd24gd2FzIG9wZW5lZC4gVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gZmFsc2UgaWYsIGZvciBleGFtcGxlLFxyXG4gICAgICAgICAqIHRoZSBkcm9wZG93biBpcyBhbHJlYWR5IG9wZW4sIG9yIGlmIHRoZSAnb3BlbicgZXZlbnQgbGlzdGVuZXIgb24gdGhlIGVsZW1lbnQgY2FsbGVkIHByZXZlbnREZWZhdWx0KCkuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgLy8gYWJzdHJhY3RcclxuICAgICAgICBvcGVuOiBmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuc2hvdWxkT3BlbigpKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICB0aGlzLm9wZW5pbmcoKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFBlcmZvcm1zIHRoZSBvcGVuaW5nIG9mIHRoZSBkcm9wZG93blxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIC8vIGFic3RyYWN0XHJcbiAgICAgICAgb3BlbmluZzogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIHZhciBjaWQgPSB0aGlzLmNvbnRhaW5lcklkLFxyXG4gICAgICAgICAgICAgICAgc2Nyb2xsID0gXCJzY3JvbGwuXCIgKyBjaWQsXHJcbiAgICAgICAgICAgICAgICByZXNpemUgPSBcInJlc2l6ZS5cIitjaWQsXHJcbiAgICAgICAgICAgICAgICBvcmllbnQgPSBcIm9yaWVudGF0aW9uY2hhbmdlLlwiK2NpZCxcclxuICAgICAgICAgICAgICAgIG1hc2ssIG1hc2tDc3M7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5hZGRDbGFzcyhcInNlbGVjdDItZHJvcGRvd24tb3BlblwiKS5hZGRDbGFzcyhcInNlbGVjdDItY29udGFpbmVyLWFjdGl2ZVwiKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuY2xlYXJEcm9wZG93bkFsaWdubWVudFByZWZlcmVuY2UoKTtcclxuXHJcbiAgICAgICAgICAgIGlmKHRoaXMuZHJvcGRvd25bMF0gIT09IHRoaXMuYm9keSgpLmNoaWxkcmVuKCkubGFzdCgpWzBdKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRyb3Bkb3duLmRldGFjaCgpLmFwcGVuZFRvKHRoaXMuYm9keSgpKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gY3JlYXRlIHRoZSBkcm9wZG93biBtYXNrIGlmIGRvZXNudCBhbHJlYWR5IGV4aXN0XHJcbiAgICAgICAgICAgIG1hc2sgPSAkKFwiI3NlbGVjdDItZHJvcC1tYXNrXCIpO1xyXG4gICAgICAgICAgICBpZiAobWFzay5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgbWFzayA9ICQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSk7XHJcbiAgICAgICAgICAgICAgICBtYXNrLmF0dHIoXCJpZFwiLFwic2VsZWN0Mi1kcm9wLW1hc2tcIikuYXR0cihcImNsYXNzXCIsXCJzZWxlY3QyLWRyb3AtbWFza1wiKTtcclxuICAgICAgICAgICAgICAgIG1hc2suaGlkZSgpO1xyXG4gICAgICAgICAgICAgICAgbWFzay5hcHBlbmRUbyh0aGlzLmJvZHkoKSk7XHJcbiAgICAgICAgICAgICAgICBtYXNrLm9uKFwibW91c2Vkb3duIHRvdWNoc3RhcnQgY2xpY2tcIiwgZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgZHJvcGRvd24gPSAkKFwiI3NlbGVjdDItZHJvcFwiKSwgc2VsZjtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZHJvcGRvd24ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmPWRyb3Bkb3duLmRhdGEoXCJzZWxlY3QyXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRzLnNlbGVjdE9uQmx1cikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZWxlY3RIaWdobGlnaHRlZCh7bm9Gb2N1czogdHJ1ZX0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2xvc2Uoe2ZvY3VzOmZhbHNlfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gZW5zdXJlIHRoZSBtYXNrIGlzIGFsd2F5cyByaWdodCBiZWZvcmUgdGhlIGRyb3Bkb3duXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmRyb3Bkb3duLnByZXYoKVswXSAhPT0gbWFza1swXSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kcm9wZG93bi5iZWZvcmUobWFzayk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIG1vdmUgdGhlIGdsb2JhbCBpZCB0byB0aGUgY29ycmVjdCBkcm9wZG93blxyXG4gICAgICAgICAgICAkKFwiI3NlbGVjdDItZHJvcFwiKS5yZW1vdmVBdHRyKFwiaWRcIik7XHJcbiAgICAgICAgICAgIHRoaXMuZHJvcGRvd24uYXR0cihcImlkXCIsIFwic2VsZWN0Mi1kcm9wXCIpO1xyXG5cclxuICAgICAgICAgICAgLy8gc2hvdyB0aGUgZWxlbWVudHNcclxuICAgICAgICAgICAgbWFzay5zaG93KCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uRHJvcGRvd24oKTtcclxuICAgICAgICAgICAgdGhpcy5kcm9wZG93bi5zaG93KCk7XHJcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25Ecm9wZG93bigpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5kcm9wZG93bi5hZGRDbGFzcyhcInNlbGVjdDItZHJvcC1hY3RpdmVcIik7XHJcblxyXG4gICAgICAgICAgICAvLyBhdHRhY2ggbGlzdGVuZXJzIHRvIGV2ZW50cyB0aGF0IGNhbiBjaGFuZ2UgdGhlIHBvc2l0aW9uIG9mIHRoZSBjb250YWluZXIgYW5kIHRodXMgcmVxdWlyZVxyXG4gICAgICAgICAgICAvLyB0aGUgcG9zaXRpb24gb2YgdGhlIGRyb3Bkb3duIHRvIGJlIHVwZGF0ZWQgYXMgd2VsbCBzbyBpdCBkb2VzIG5vdCBjb21lIHVuZ2x1ZWQgZnJvbSB0aGUgY29udGFpbmVyXHJcbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcztcclxuICAgICAgICAgICAgdGhpcy5jb250YWluZXIucGFyZW50cygpLmFkZCh3aW5kb3cpLmVhY2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgJCh0aGlzKS5vbihyZXNpemUrXCIgXCIrc2Nyb2xsK1wiIFwiK29yaWVudCwgZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGF0LnBvc2l0aW9uRHJvcGRvd24oKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcblxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIGFic3RyYWN0XHJcbiAgICAgICAgY2xvc2U6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLm9wZW5lZCgpKSByZXR1cm47XHJcblxyXG4gICAgICAgICAgICB2YXIgY2lkID0gdGhpcy5jb250YWluZXJJZCxcclxuICAgICAgICAgICAgICAgIHNjcm9sbCA9IFwic2Nyb2xsLlwiICsgY2lkLFxyXG4gICAgICAgICAgICAgICAgcmVzaXplID0gXCJyZXNpemUuXCIrY2lkLFxyXG4gICAgICAgICAgICAgICAgb3JpZW50ID0gXCJvcmllbnRhdGlvbmNoYW5nZS5cIitjaWQ7XHJcblxyXG4gICAgICAgICAgICAvLyB1bmJpbmQgZXZlbnQgbGlzdGVuZXJzXHJcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLnBhcmVudHMoKS5hZGQod2luZG93KS5lYWNoKGZ1bmN0aW9uICgpIHsgJCh0aGlzKS5vZmYoc2Nyb2xsKS5vZmYocmVzaXplKS5vZmYob3JpZW50KTsgfSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmNsZWFyRHJvcGRvd25BbGlnbm1lbnRQcmVmZXJlbmNlKCk7XHJcblxyXG4gICAgICAgICAgICAkKFwiI3NlbGVjdDItZHJvcC1tYXNrXCIpLmhpZGUoKTtcclxuICAgICAgICAgICAgdGhpcy5kcm9wZG93bi5yZW1vdmVBdHRyKFwiaWRcIik7IC8vIG9ubHkgdGhlIGFjdGl2ZSBkcm9wZG93biBoYXMgdGhlIHNlbGVjdDItZHJvcCBpZFxyXG4gICAgICAgICAgICB0aGlzLmRyb3Bkb3duLmhpZGUoKTtcclxuICAgICAgICAgICAgdGhpcy5jb250YWluZXIucmVtb3ZlQ2xhc3MoXCJzZWxlY3QyLWRyb3Bkb3duLW9wZW5cIik7XHJcbiAgICAgICAgICAgIHRoaXMucmVzdWx0cy5lbXB0eSgpO1xyXG5cclxuXHJcbiAgICAgICAgICAgIHRoaXMuY2xlYXJTZWFyY2goKTtcclxuICAgICAgICAgICAgdGhpcy5zZWFyY2gucmVtb3ZlQ2xhc3MoXCJzZWxlY3QyLWFjdGl2ZVwiKTtcclxuICAgICAgICAgICAgdGhpcy5vcHRzLmVsZW1lbnQudHJpZ2dlcigkLkV2ZW50KFwic2VsZWN0Mi1jbG9zZVwiKSk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogT3BlbnMgY29udHJvbCwgc2V0cyBpbnB1dCB2YWx1ZSwgYW5kIHVwZGF0ZXMgcmVzdWx0cy5cclxuICAgICAgICAgKi9cclxuICAgICAgICAvLyBhYnN0cmFjdFxyXG4gICAgICAgIGV4dGVybmFsU2VhcmNoOiBmdW5jdGlvbiAodGVybSkge1xyXG4gICAgICAgICAgICB0aGlzLm9wZW4oKTtcclxuICAgICAgICAgICAgdGhpcy5zZWFyY2gudmFsKHRlcm0pO1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVJlc3VsdHMoZmFsc2UpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIGFic3RyYWN0XHJcbiAgICAgICAgY2xlYXJTZWFyY2g6IGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy9hYnN0cmFjdFxyXG4gICAgICAgIGdldE1heGltdW1TZWxlY3Rpb25TaXplOiBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGV2YWx1YXRlKHRoaXMub3B0cy5tYXhpbXVtU2VsZWN0aW9uU2l6ZSk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gYWJzdHJhY3RcclxuICAgICAgICBlbnN1cmVIaWdobGlnaHRWaXNpYmxlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciByZXN1bHRzID0gdGhpcy5yZXN1bHRzLCBjaGlsZHJlbiwgaW5kZXgsIGNoaWxkLCBoYiwgcmIsIHksIG1vcmU7XHJcblxyXG4gICAgICAgICAgICBpbmRleCA9IHRoaXMuaGlnaGxpZ2h0KCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoaW5kZXggPCAwKSByZXR1cm47XHJcblxyXG4gICAgICAgICAgICBpZiAoaW5kZXggPT0gMCkge1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBmaXJzdCBlbGVtZW50IGlzIGhpZ2hsaWdodGVkIHNjcm9sbCBhbGwgdGhlIHdheSB0byB0aGUgdG9wLFxyXG4gICAgICAgICAgICAgICAgLy8gdGhhdCB3YXkgYW55IHVuc2VsZWN0YWJsZSBoZWFkZXJzIGFib3ZlIGl0IHdpbGwgYWxzbyBiZSBzY3JvbGxlZFxyXG4gICAgICAgICAgICAgICAgLy8gaW50byB2aWV3XHJcblxyXG4gICAgICAgICAgICAgICAgcmVzdWx0cy5zY3JvbGxUb3AoMCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNoaWxkcmVuID0gdGhpcy5maW5kSGlnaGxpZ2h0YWJsZUNob2ljZXMoKS5maW5kKCcuc2VsZWN0Mi1yZXN1bHQtbGFiZWwnKTtcclxuXHJcbiAgICAgICAgICAgIGNoaWxkID0gJChjaGlsZHJlbltpbmRleF0pO1xyXG5cclxuICAgICAgICAgICAgaGIgPSBjaGlsZC5vZmZzZXQoKS50b3AgKyBjaGlsZC5vdXRlckhlaWdodCh0cnVlKTtcclxuXHJcbiAgICAgICAgICAgIC8vIGlmIHRoaXMgaXMgdGhlIGxhc3QgY2hpbGQgbGV0cyBhbHNvIG1ha2Ugc3VyZSBzZWxlY3QyLW1vcmUtcmVzdWx0cyBpcyB2aXNpYmxlXHJcbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gY2hpbGRyZW4ubGVuZ3RoIC0gMSkge1xyXG4gICAgICAgICAgICAgICAgbW9yZSA9IHJlc3VsdHMuZmluZChcImxpLnNlbGVjdDItbW9yZS1yZXN1bHRzXCIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKG1vcmUubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGhiID0gbW9yZS5vZmZzZXQoKS50b3AgKyBtb3JlLm91dGVySGVpZ2h0KHRydWUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByYiA9IHJlc3VsdHMub2Zmc2V0KCkudG9wICsgcmVzdWx0cy5vdXRlckhlaWdodCh0cnVlKTtcclxuICAgICAgICAgICAgaWYgKGhiID4gcmIpIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdHMuc2Nyb2xsVG9wKHJlc3VsdHMuc2Nyb2xsVG9wKCkgKyAoaGIgLSByYikpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHkgPSBjaGlsZC5vZmZzZXQoKS50b3AgLSByZXN1bHRzLm9mZnNldCgpLnRvcDtcclxuXHJcbiAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgdG9wIG9mIHRoZSBlbGVtZW50IGlzIHZpc2libGVcclxuICAgICAgICAgICAgaWYgKHkgPCAwICYmIGNoaWxkLmNzcygnZGlzcGxheScpICE9ICdub25lJyApIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdHMuc2Nyb2xsVG9wKHJlc3VsdHMuc2Nyb2xsVG9wKCkgKyB5KTsgLy8geSBpcyBuZWdhdGl2ZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gYWJzdHJhY3RcclxuICAgICAgICBmaW5kSGlnaGxpZ2h0YWJsZUNob2ljZXM6IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZXN1bHRzLmZpbmQoXCIuc2VsZWN0Mi1yZXN1bHQtc2VsZWN0YWJsZTpub3QoLnNlbGVjdDItc2VsZWN0ZWQpOm5vdCguc2VsZWN0Mi1kaXNhYmxlZClcIik7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gYWJzdHJhY3RcclxuICAgICAgICBtb3ZlSGlnaGxpZ2h0OiBmdW5jdGlvbiAoZGVsdGEpIHtcclxuICAgICAgICAgICAgdmFyIGNob2ljZXMgPSB0aGlzLmZpbmRIaWdobGlnaHRhYmxlQ2hvaWNlcygpLFxyXG4gICAgICAgICAgICAgICAgaW5kZXggPSB0aGlzLmhpZ2hsaWdodCgpO1xyXG5cclxuICAgICAgICAgICAgd2hpbGUgKGluZGV4ID4gLTEgJiYgaW5kZXggPCBjaG9pY2VzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgaW5kZXggKz0gZGVsdGE7XHJcbiAgICAgICAgICAgICAgICB2YXIgY2hvaWNlID0gJChjaG9pY2VzW2luZGV4XSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoY2hvaWNlLmhhc0NsYXNzKFwic2VsZWN0Mi1yZXN1bHQtc2VsZWN0YWJsZVwiKSAmJiAhY2hvaWNlLmhhc0NsYXNzKFwic2VsZWN0Mi1kaXNhYmxlZFwiKSAmJiAhY2hvaWNlLmhhc0NsYXNzKFwic2VsZWN0Mi1zZWxlY3RlZFwiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0KGluZGV4KTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIGFic3RyYWN0XHJcbiAgICAgICAgaGlnaGxpZ2h0OiBmdW5jdGlvbiAoaW5kZXgpIHtcclxuICAgICAgICAgICAgdmFyIGNob2ljZXMgPSB0aGlzLmZpbmRIaWdobGlnaHRhYmxlQ2hvaWNlcygpLFxyXG4gICAgICAgICAgICAgICAgY2hvaWNlLFxyXG4gICAgICAgICAgICAgICAgZGF0YTtcclxuXHJcbiAgICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXhPZihjaG9pY2VzLmZpbHRlcihcIi5zZWxlY3QyLWhpZ2hsaWdodGVkXCIpWzBdLCBjaG9pY2VzLmdldCgpKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGluZGV4ID49IGNob2ljZXMubGVuZ3RoKSBpbmRleCA9IGNob2ljZXMubGVuZ3RoIC0gMTtcclxuICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgaW5kZXggPSAwO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5yZW1vdmVIaWdobGlnaHQoKTtcclxuXHJcbiAgICAgICAgICAgIGNob2ljZSA9ICQoY2hvaWNlc1tpbmRleF0pO1xyXG4gICAgICAgICAgICBjaG9pY2UuYWRkQ2xhc3MoXCJzZWxlY3QyLWhpZ2hsaWdodGVkXCIpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5lbnN1cmVIaWdobGlnaHRWaXNpYmxlKCk7XHJcblxyXG4gICAgICAgICAgICBkYXRhID0gY2hvaWNlLmRhdGEoXCJzZWxlY3QyLWRhdGFcIik7XHJcbiAgICAgICAgICAgIGlmIChkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9wdHMuZWxlbWVudC50cmlnZ2VyKHsgdHlwZTogXCJzZWxlY3QyLWhpZ2hsaWdodFwiLCB2YWw6IHRoaXMuaWQoZGF0YSksIGNob2ljZTogZGF0YSB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHJlbW92ZUhpZ2hsaWdodDogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVzdWx0cy5maW5kKFwiLnNlbGVjdDItaGlnaGxpZ2h0ZWRcIikucmVtb3ZlQ2xhc3MoXCJzZWxlY3QyLWhpZ2hsaWdodGVkXCIpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIGFic3RyYWN0XHJcbiAgICAgICAgY291bnRTZWxlY3RhYmxlUmVzdWx0czogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbmRIaWdobGlnaHRhYmxlQ2hvaWNlcygpLmxlbmd0aDtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBhYnN0cmFjdFxyXG4gICAgICAgIGhpZ2hsaWdodFVuZGVyRXZlbnQ6IGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICAgICAgICB2YXIgZWwgPSAkKGV2ZW50LnRhcmdldCkuY2xvc2VzdChcIi5zZWxlY3QyLXJlc3VsdC1zZWxlY3RhYmxlXCIpO1xyXG4gICAgICAgICAgICBpZiAoZWwubGVuZ3RoID4gMCAmJiAhZWwuaXMoXCIuc2VsZWN0Mi1oaWdobGlnaHRlZFwiKSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGNob2ljZXMgPSB0aGlzLmZpbmRIaWdobGlnaHRhYmxlQ2hvaWNlcygpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5oaWdobGlnaHQoY2hvaWNlcy5pbmRleChlbCkpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVsLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBhcmUgb3ZlciBhbiB1bnNlbGVjdGFibGUgaXRlbSByZW1vdmUgYWxsIGhpZ2hsaWdodHNcclxuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlSGlnaGxpZ2h0KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBhYnN0cmFjdFxyXG4gICAgICAgIGxvYWRNb3JlSWZOZWVkZWQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIHJlc3VsdHMgPSB0aGlzLnJlc3VsdHMsXHJcbiAgICAgICAgICAgICAgICBtb3JlID0gcmVzdWx0cy5maW5kKFwibGkuc2VsZWN0Mi1tb3JlLXJlc3VsdHNcIiksXHJcbiAgICAgICAgICAgICAgICBiZWxvdywgLy8gcGl4ZWxzIHRoZSBlbGVtZW50IGlzIGJlbG93IHRoZSBzY3JvbGwgZm9sZCwgYmVsb3c9PTAgaXMgd2hlbiB0aGUgZWxlbWVudCBpcyBzdGFydGluZyB0byBiZSB2aXNpYmxlXHJcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSAtMSwgLy8gaW5kZXggb2YgZmlyc3QgZWxlbWVudCB3aXRob3V0IGRhdGFcclxuICAgICAgICAgICAgICAgIHBhZ2UgPSB0aGlzLnJlc3VsdHNQYWdlICsgMSxcclxuICAgICAgICAgICAgICAgIHNlbGY9dGhpcyxcclxuICAgICAgICAgICAgICAgIHRlcm09dGhpcy5zZWFyY2gudmFsKCksXHJcbiAgICAgICAgICAgICAgICBjb250ZXh0PXRoaXMuY29udGV4dDtcclxuXHJcbiAgICAgICAgICAgIGlmIChtb3JlLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xyXG4gICAgICAgICAgICBiZWxvdyA9IG1vcmUub2Zmc2V0KCkudG9wIC0gcmVzdWx0cy5vZmZzZXQoKS50b3AgLSByZXN1bHRzLmhlaWdodCgpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGJlbG93IDw9IHRoaXMub3B0cy5sb2FkTW9yZVBhZGRpbmcpIHtcclxuICAgICAgICAgICAgICAgIG1vcmUuYWRkQ2xhc3MoXCJzZWxlY3QyLWFjdGl2ZVwiKTtcclxuICAgICAgICAgICAgICAgIHRoaXMub3B0cy5xdWVyeSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6IHRoaXMub3B0cy5lbGVtZW50LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXJtOiB0ZXJtLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWdlOiBwYWdlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiBjb250ZXh0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVyOiB0aGlzLm9wdHMubWF0Y2hlcixcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2s6IHRoaXMuYmluZChmdW5jdGlvbiAoZGF0YSkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgYSByZXNwb25zZSBpZiB0aGUgc2VsZWN0MiBoYXMgYmVlbiBjbG9zZWQgYmVmb3JlIGl0IHdhcyByZWNlaXZlZFxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghc2VsZi5vcGVuZWQoKSkgcmV0dXJuO1xyXG5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRzLnBvcHVsYXRlUmVzdWx0cy5jYWxsKHRoaXMsIHJlc3VsdHMsIGRhdGEucmVzdWx0cywge3Rlcm06IHRlcm0sIHBhZ2U6IHBhZ2UsIGNvbnRleHQ6Y29udGV4dH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYucG9zdHByb2Nlc3NSZXN1bHRzKGRhdGEsIGZhbHNlLCBmYWxzZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLm1vcmU9PT10cnVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vcmUuZGV0YWNoKCkuYXBwZW5kVG8ocmVzdWx0cykudGV4dChzZWxmLm9wdHMuZm9ybWF0TG9hZE1vcmUocGFnZSsxKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyBzZWxmLmxvYWRNb3JlSWZOZWVkZWQoKTsgfSwgMTApO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vcmUucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYucG9zaXRpb25Ecm9wZG93bigpO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYucmVzdWx0c1BhZ2UgPSBwYWdlO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuY29udGV4dCA9IGRhdGEuY29udGV4dDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdHMuZWxlbWVudC50cmlnZ2VyKHsgdHlwZTogXCJzZWxlY3QyLWxvYWRlZFwiLCBpdGVtczogZGF0YSB9KTtcclxuICAgICAgICAgICAgICAgIH0pfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBEZWZhdWx0IHRva2VuaXplciBmdW5jdGlvbiB3aGljaCBkb2VzIG5vdGhpbmdcclxuICAgICAgICAgKi9cclxuICAgICAgICB0b2tlbml6ZTogZnVuY3Rpb24oKSB7XHJcblxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBwYXJhbSBpbml0aWFsIHdoZXRoZXIgb3Igbm90IHRoaXMgaXMgdGhlIGNhbGwgdG8gdGhpcyBtZXRob2QgcmlnaHQgYWZ0ZXIgdGhlIGRyb3Bkb3duIGhhcyBiZWVuIG9wZW5lZFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIC8vIGFic3RyYWN0XHJcbiAgICAgICAgdXBkYXRlUmVzdWx0czogZnVuY3Rpb24gKGluaXRpYWwpIHtcclxuICAgICAgICAgICAgdmFyIHNlYXJjaCA9IHRoaXMuc2VhcmNoLFxyXG4gICAgICAgICAgICAgICAgcmVzdWx0cyA9IHRoaXMucmVzdWx0cyxcclxuICAgICAgICAgICAgICAgIG9wdHMgPSB0aGlzLm9wdHMsXHJcbiAgICAgICAgICAgICAgICBkYXRhLFxyXG4gICAgICAgICAgICAgICAgc2VsZiA9IHRoaXMsXHJcbiAgICAgICAgICAgICAgICBpbnB1dCxcclxuICAgICAgICAgICAgICAgIHRlcm0gPSBzZWFyY2gudmFsKCksXHJcbiAgICAgICAgICAgICAgICBsYXN0VGVybSA9ICQuZGF0YSh0aGlzLmNvbnRhaW5lciwgXCJzZWxlY3QyLWxhc3QtdGVybVwiKSxcclxuICAgICAgICAgICAgICAgIC8vIHNlcXVlbmNlIG51bWJlciB1c2VkIHRvIGRyb3Agb3V0LW9mLW9yZGVyIHJlc3BvbnNlc1xyXG4gICAgICAgICAgICAgICAgcXVlcnlOdW1iZXI7XHJcblxyXG4gICAgICAgICAgICAvLyBwcmV2ZW50IGR1cGxpY2F0ZSBxdWVyaWVzIGFnYWluc3QgdGhlIHNhbWUgdGVybVxyXG4gICAgICAgICAgICBpZiAoaW5pdGlhbCAhPT0gdHJ1ZSAmJiBsYXN0VGVybSAmJiBlcXVhbCh0ZXJtLCBsYXN0VGVybSkpIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgICQuZGF0YSh0aGlzLmNvbnRhaW5lciwgXCJzZWxlY3QyLWxhc3QtdGVybVwiLCB0ZXJtKTtcclxuXHJcbiAgICAgICAgICAgIC8vIGlmIHRoZSBzZWFyY2ggaXMgY3VycmVudGx5IGhpZGRlbiB3ZSBkbyBub3QgYWx0ZXIgdGhlIHJlc3VsdHNcclxuICAgICAgICAgICAgaWYgKGluaXRpYWwgIT09IHRydWUgJiYgKHRoaXMuc2hvd1NlYXJjaElucHV0ID09PSBmYWxzZSB8fCAhdGhpcy5vcGVuZWQoKSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZnVuY3Rpb24gcG9zdFJlbmRlcigpIHtcclxuICAgICAgICAgICAgICAgIHNlYXJjaC5yZW1vdmVDbGFzcyhcInNlbGVjdDItYWN0aXZlXCIpO1xyXG4gICAgICAgICAgICAgICAgc2VsZi5wb3NpdGlvbkRyb3Bkb3duKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZ1bmN0aW9uIHJlbmRlcihodG1sKSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHRzLmh0bWwoaHRtbCk7XHJcbiAgICAgICAgICAgICAgICBwb3N0UmVuZGVyKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHF1ZXJ5TnVtYmVyID0gKyt0aGlzLnF1ZXJ5Q291bnQ7XHJcblxyXG4gICAgICAgICAgICB2YXIgbWF4U2VsU2l6ZSA9IHRoaXMuZ2V0TWF4aW11bVNlbGVjdGlvblNpemUoKTtcclxuICAgICAgICAgICAgaWYgKG1heFNlbFNpemUgPj0xKSB7XHJcbiAgICAgICAgICAgICAgICBkYXRhID0gdGhpcy5kYXRhKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoJC5pc0FycmF5KGRhdGEpICYmIGRhdGEubGVuZ3RoID49IG1heFNlbFNpemUgJiYgY2hlY2tGb3JtYXR0ZXIob3B0cy5mb3JtYXRTZWxlY3Rpb25Ub29CaWcsIFwiZm9ybWF0U2VsZWN0aW9uVG9vQmlnXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyKFwiPGxpIGNsYXNzPSdzZWxlY3QyLXNlbGVjdGlvbi1saW1pdCc+XCIgKyBvcHRzLmZvcm1hdFNlbGVjdGlvblRvb0JpZyhtYXhTZWxTaXplKSArIFwiPC9saT5cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoc2VhcmNoLnZhbCgpLmxlbmd0aCA8IG9wdHMubWluaW11bUlucHV0TGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY2hlY2tGb3JtYXR0ZXIob3B0cy5mb3JtYXRJbnB1dFRvb1Nob3J0LCBcImZvcm1hdElucHV0VG9vU2hvcnRcIikpIHtcclxuICAgICAgICAgICAgICAgICAgICByZW5kZXIoXCI8bGkgY2xhc3M9J3NlbGVjdDItbm8tcmVzdWx0cyc+XCIgKyBvcHRzLmZvcm1hdElucHV0VG9vU2hvcnQoc2VhcmNoLnZhbCgpLCBvcHRzLm1pbmltdW1JbnB1dExlbmd0aCkgKyBcIjwvbGk+XCIpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZW5kZXIoXCJcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoaW5pdGlhbCAmJiB0aGlzLnNob3dTZWFyY2gpIHRoaXMuc2hvd1NlYXJjaCh0cnVlKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKG9wdHMubWF4aW11bUlucHV0TGVuZ3RoICYmIHNlYXJjaC52YWwoKS5sZW5ndGggPiBvcHRzLm1heGltdW1JbnB1dExlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNoZWNrRm9ybWF0dGVyKG9wdHMuZm9ybWF0SW5wdXRUb29Mb25nLCBcImZvcm1hdElucHV0VG9vTG9uZ1wiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlbmRlcihcIjxsaSBjbGFzcz0nc2VsZWN0Mi1uby1yZXN1bHRzJz5cIiArIG9wdHMuZm9ybWF0SW5wdXRUb29Mb25nKHNlYXJjaC52YWwoKSwgb3B0cy5tYXhpbXVtSW5wdXRMZW5ndGgpICsgXCI8L2xpPlwiKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyKFwiXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAob3B0cy5mb3JtYXRTZWFyY2hpbmcgJiYgdGhpcy5maW5kSGlnaGxpZ2h0YWJsZUNob2ljZXMoKS5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgICAgIHJlbmRlcihcIjxsaSBjbGFzcz0nc2VsZWN0Mi1zZWFyY2hpbmcnPlwiICsgb3B0cy5mb3JtYXRTZWFyY2hpbmcoKSArIFwiPC9saT5cIik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHNlYXJjaC5hZGRDbGFzcyhcInNlbGVjdDItYWN0aXZlXCIpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5yZW1vdmVIaWdobGlnaHQoKTtcclxuXHJcbiAgICAgICAgICAgIC8vIGdpdmUgdGhlIHRva2VuaXplciBhIGNoYW5jZSB0byBwcmUtcHJvY2VzcyB0aGUgaW5wdXRcclxuICAgICAgICAgICAgaW5wdXQgPSB0aGlzLnRva2VuaXplKCk7XHJcbiAgICAgICAgICAgIGlmIChpbnB1dCAhPSB1bmRlZmluZWQgJiYgaW5wdXQgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgc2VhcmNoLnZhbChpbnB1dCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMucmVzdWx0c1BhZ2UgPSAxO1xyXG5cclxuICAgICAgICAgICAgb3B0cy5xdWVyeSh7XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50OiBvcHRzLmVsZW1lbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVybTogc2VhcmNoLnZhbCgpLFxyXG4gICAgICAgICAgICAgICAgICAgIHBhZ2U6IHRoaXMucmVzdWx0c1BhZ2UsXHJcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dDogbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICBtYXRjaGVyOiBvcHRzLm1hdGNoZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2s6IHRoaXMuYmluZChmdW5jdGlvbiAoZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGRlZjsgLy8gZGVmYXVsdCBjaG9pY2VcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBpZ25vcmUgb2xkIHJlc3BvbnNlc1xyXG4gICAgICAgICAgICAgICAgaWYgKHF1ZXJ5TnVtYmVyICE9IHRoaXMucXVlcnlDb3VudCkge1xyXG4gICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIGEgcmVzcG9uc2UgaWYgdGhlIHNlbGVjdDIgaGFzIGJlZW4gY2xvc2VkIGJlZm9yZSBpdCB3YXMgcmVjZWl2ZWRcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcGVuZWQoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoLnJlbW92ZUNsYXNzKFwic2VsZWN0Mi1hY3RpdmVcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8vIHNhdmUgY29udGV4dCwgaWYgYW55XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQgPSAoZGF0YS5jb250ZXh0PT09dW5kZWZpbmVkKSA/IG51bGwgOiBkYXRhLmNvbnRleHQ7XHJcbiAgICAgICAgICAgICAgICAvLyBjcmVhdGUgYSBkZWZhdWx0IGNob2ljZSBhbmQgcHJlcGVuZCBpdCB0byB0aGUgbGlzdFxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0cy5jcmVhdGVTZWFyY2hDaG9pY2UgJiYgc2VhcmNoLnZhbCgpICE9PSBcIlwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGVmID0gdGhpcy5vcHRzLmNyZWF0ZVNlYXJjaENob2ljZS5jYWxsKHNlbGYsIHNlYXJjaC52YWwoKSwgZGF0YS5yZXN1bHRzKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZGVmICE9PSB1bmRlZmluZWQgJiYgZGVmICE9PSBudWxsICYmIHNlbGYuaWQoZGVmKSAhPT0gdW5kZWZpbmVkICYmIHNlbGYuaWQoZGVmKSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoJChkYXRhLnJlc3VsdHMpLmZpbHRlcihcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXF1YWwoc2VsZi5pZCh0aGlzKSwgc2VsZi5pZChkZWYpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5yZXN1bHRzLnVuc2hpZnQoZGVmKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5yZXN1bHRzLmxlbmd0aCA9PT0gMCAmJiBjaGVja0Zvcm1hdHRlcihvcHRzLmZvcm1hdE5vTWF0Y2hlcywgXCJmb3JtYXROb01hdGNoZXNcIikpIHtcclxuICAgICAgICAgICAgICAgICAgICByZW5kZXIoXCI8bGkgY2xhc3M9J3NlbGVjdDItbm8tcmVzdWx0cyc+XCIgKyBvcHRzLmZvcm1hdE5vTWF0Y2hlcyhzZWFyY2gudmFsKCkpICsgXCI8L2xpPlwiKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgcmVzdWx0cy5lbXB0eSgpO1xyXG4gICAgICAgICAgICAgICAgc2VsZi5vcHRzLnBvcHVsYXRlUmVzdWx0cy5jYWxsKHRoaXMsIHJlc3VsdHMsIGRhdGEucmVzdWx0cywge3Rlcm06IHNlYXJjaC52YWwoKSwgcGFnZTogdGhpcy5yZXN1bHRzUGFnZSwgY29udGV4dDpudWxsfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGRhdGEubW9yZSA9PT0gdHJ1ZSAmJiBjaGVja0Zvcm1hdHRlcihvcHRzLmZvcm1hdExvYWRNb3JlLCBcImZvcm1hdExvYWRNb3JlXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoXCI8bGkgY2xhc3M9J3NlbGVjdDItbW9yZS1yZXN1bHRzJz5cIiArIHNlbGYub3B0cy5lc2NhcGVNYXJrdXAob3B0cy5mb3JtYXRMb2FkTW9yZSh0aGlzLnJlc3VsdHNQYWdlKSkgKyBcIjwvbGk+XCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyBzZWxmLmxvYWRNb3JlSWZOZWVkZWQoKTsgfSwgMTApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMucG9zdHByb2Nlc3NSZXN1bHRzKGRhdGEsIGluaXRpYWwpO1xyXG5cclxuICAgICAgICAgICAgICAgIHBvc3RSZW5kZXIoKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLm9wdHMuZWxlbWVudC50cmlnZ2VyKHsgdHlwZTogXCJzZWxlY3QyLWxvYWRlZFwiLCBpdGVtczogZGF0YSB9KTtcclxuICAgICAgICAgICAgfSl9KTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBhYnN0cmFjdFxyXG4gICAgICAgIGNhbmNlbDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB0aGlzLmNsb3NlKCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gYWJzdHJhY3RcclxuICAgICAgICBibHVyOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIC8vIGlmIHNlbGVjdE9uQmx1ciA9PSB0cnVlLCBzZWxlY3QgdGhlIGN1cnJlbnRseSBoaWdobGlnaHRlZCBvcHRpb25cclxuICAgICAgICAgICAgaWYgKHRoaXMub3B0cy5zZWxlY3RPbkJsdXIpXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdEhpZ2hsaWdodGVkKHtub0ZvY3VzOiB0cnVlfSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmNsb3NlKCk7XHJcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLnJlbW92ZUNsYXNzKFwic2VsZWN0Mi1jb250YWluZXItYWN0aXZlXCIpO1xyXG4gICAgICAgICAgICAvLyBzeW5vbnltb3VzIHRvIC5pcygnOmZvY3VzJyksIHdoaWNoIGlzIGF2YWlsYWJsZSBpbiBqcXVlcnkgPj0gMS42XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNlYXJjaFswXSA9PT0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkgeyB0aGlzLnNlYXJjaC5ibHVyKCk7IH1cclxuICAgICAgICAgICAgdGhpcy5jbGVhclNlYXJjaCgpO1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5maW5kKFwiLnNlbGVjdDItc2VhcmNoLWNob2ljZS1mb2N1c1wiKS5yZW1vdmVDbGFzcyhcInNlbGVjdDItc2VhcmNoLWNob2ljZS1mb2N1c1wiKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBhYnN0cmFjdFxyXG4gICAgICAgIGZvY3VzU2VhcmNoOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGZvY3VzKHRoaXMuc2VhcmNoKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBhYnN0cmFjdFxyXG4gICAgICAgIHNlbGVjdEhpZ2hsaWdodGVkOiBmdW5jdGlvbiAob3B0aW9ucykge1xyXG4gICAgICAgICAgICB2YXIgaW5kZXg9dGhpcy5oaWdobGlnaHQoKSxcclxuICAgICAgICAgICAgICAgIGhpZ2hsaWdodGVkPXRoaXMucmVzdWx0cy5maW5kKFwiLnNlbGVjdDItaGlnaGxpZ2h0ZWRcIiksXHJcbiAgICAgICAgICAgICAgICBkYXRhID0gaGlnaGxpZ2h0ZWQuY2xvc2VzdCgnLnNlbGVjdDItcmVzdWx0JykuZGF0YShcInNlbGVjdDItZGF0YVwiKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhpZ2hsaWdodChpbmRleCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9uU2VsZWN0KGRhdGEsIG9wdGlvbnMpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5ub0ZvY3VzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBhYnN0cmFjdFxyXG4gICAgICAgIGdldFBsYWNlaG9sZGVyOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBwbGFjZWhvbGRlck9wdGlvbjtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMub3B0cy5lbGVtZW50LmF0dHIoXCJwbGFjZWhvbGRlclwiKSB8fFxyXG4gICAgICAgICAgICAgICAgdGhpcy5vcHRzLmVsZW1lbnQuYXR0cihcImRhdGEtcGxhY2Vob2xkZXJcIikgfHwgLy8ganF1ZXJ5IDEuNCBjb21wYXRcclxuICAgICAgICAgICAgICAgIHRoaXMub3B0cy5lbGVtZW50LmRhdGEoXCJwbGFjZWhvbGRlclwiKSB8fFxyXG4gICAgICAgICAgICAgICAgdGhpcy5vcHRzLnBsYWNlaG9sZGVyIHx8XHJcbiAgICAgICAgICAgICAgICAoKHBsYWNlaG9sZGVyT3B0aW9uID0gdGhpcy5nZXRQbGFjZWhvbGRlck9wdGlvbigpKSAhPT0gdW5kZWZpbmVkID8gcGxhY2Vob2xkZXJPcHRpb24udGV4dCgpIDogdW5kZWZpbmVkKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBhYnN0cmFjdFxyXG4gICAgICAgIGdldFBsYWNlaG9sZGVyT3B0aW9uOiBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0KSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZmlyc3RPcHRpb24gPSB0aGlzLnNlbGVjdC5jaGlsZHJlbigpLmZpcnN0KCk7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRzLnBsYWNlaG9sZGVyT3B0aW9uICE9PSB1bmRlZmluZWQgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9EZXRlcm1pbmUgdGhlIHBsYWNlaG9sZGVyIG9wdGlvbiBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIHBsYWNlaG9sZGVyT3B0aW9uIHNldHRpbmdcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHRoaXMub3B0cy5wbGFjZWhvbGRlck9wdGlvbiA9PT0gXCJmaXJzdFwiICYmIGZpcnN0T3B0aW9uKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAodHlwZW9mIHRoaXMub3B0cy5wbGFjZWhvbGRlck9wdGlvbiA9PT0gXCJmdW5jdGlvblwiICYmIHRoaXMub3B0cy5wbGFjZWhvbGRlck9wdGlvbih0aGlzLnNlbGVjdCkpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmaXJzdE9wdGlvbi50ZXh0KCkgPT09IFwiXCIgJiYgZmlyc3RPcHRpb24udmFsKCkgPT09IFwiXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAvL05vIGV4cGxpY2l0IHBsYWNlaG9sZGVyIG9wdGlvbiBzcGVjaWZpZWQsIHVzZSB0aGUgZmlyc3QgaWYgaXQncyBibGFua1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmaXJzdE9wdGlvbjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEdldCB0aGUgZGVzaXJlZCB3aWR0aCBmb3IgdGhlIGNvbnRhaW5lciBlbGVtZW50LiAgVGhpcyBpc1xyXG4gICAgICAgICAqIGRlcml2ZWQgZmlyc3QgZnJvbSBvcHRpb24gYHdpZHRoYCBwYXNzZWQgdG8gc2VsZWN0MiwgdGhlblxyXG4gICAgICAgICAqIHRoZSBpbmxpbmUgJ3N0eWxlJyBvbiB0aGUgb3JpZ2luYWwgZWxlbWVudCwgYW5kIGZpbmFsbHlcclxuICAgICAgICAgKiBmYWxscyBiYWNrIHRvIHRoZSBqUXVlcnkgY2FsY3VsYXRlZCBlbGVtZW50IHdpZHRoLlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIC8vIGFic3RyYWN0XHJcbiAgICAgICAgaW5pdENvbnRhaW5lcldpZHRoOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGZ1bmN0aW9uIHJlc29sdmVDb250YWluZXJXaWR0aCgpIHtcclxuICAgICAgICAgICAgICAgIHZhciBzdHlsZSwgYXR0cnMsIG1hdGNoZXMsIGksIGw7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0cy53aWR0aCA9PT0gXCJvZmZcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm9wdHMud2lkdGggPT09IFwiZWxlbWVudFwiKXtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vcHRzLmVsZW1lbnQub3V0ZXJXaWR0aChmYWxzZSkgPT09IDAgPyAnYXV0bycgOiB0aGlzLm9wdHMuZWxlbWVudC5vdXRlcldpZHRoKGZhbHNlKSArICdweCc7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMub3B0cy53aWR0aCA9PT0gXCJjb3B5XCIgfHwgdGhpcy5vcHRzLndpZHRoID09PSBcInJlc29sdmVcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZXJlIGlzIGlubGluZSBzdHlsZSBvbiB0aGUgZWxlbWVudCB0aGF0IGNvbnRhaW5zIHdpZHRoXHJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGUgPSB0aGlzLm9wdHMuZWxlbWVudC5hdHRyKCdzdHlsZScpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzID0gc3R5bGUuc3BsaXQoJzsnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMCwgbCA9IGF0dHJzLmxlbmd0aDsgaSA8IGw7IGkgPSBpICsgMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcyA9IGF0dHJzW2ldLnJlcGxhY2UoL1xccy9nLCAnJylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWF0Y2goL1teLV13aWR0aDooKFstK10/KFswLTldKlxcLik/WzAtOV0rKShweHxlbXxleHwlfGlufGNtfG1tfHB0fHBjKSkvaSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2hlcyAhPT0gbnVsbCAmJiBtYXRjaGVzLmxlbmd0aCA+PSAxKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaGVzWzFdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRzLndpZHRoID09PSBcInJlc29sdmVcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXh0IGNoZWNrIGlmIGNzcygnd2lkdGgnKSBjYW4gcmVzb2x2ZSBhIHdpZHRoIHRoYXQgaXMgcGVyY2VudCBiYXNlZCwgdGhpcyBpcyBzb21ldGltZXMgcG9zc2libGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiBhdHRhY2hlZCB0byBpbnB1dCB0eXBlPWhpZGRlbiBvciBlbGVtZW50cyBoaWRkZW4gdmlhIGNzc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZSA9IHRoaXMub3B0cy5lbGVtZW50LmNzcygnd2lkdGgnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlLmluZGV4T2YoXCIlXCIpID4gMCkgcmV0dXJuIHN0eWxlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmluYWxseSwgZmFsbGJhY2sgb24gdGhlIGNhbGN1bGF0ZWQgd2lkdGggb2YgdGhlIGVsZW1lbnRcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh0aGlzLm9wdHMuZWxlbWVudC5vdXRlcldpZHRoKGZhbHNlKSA9PT0gMCA/ICdhdXRvJyA6IHRoaXMub3B0cy5lbGVtZW50Lm91dGVyV2lkdGgoZmFsc2UpICsgJ3B4Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoJC5pc0Z1bmN0aW9uKHRoaXMub3B0cy53aWR0aCkpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vcHRzLndpZHRoKCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm9wdHMud2lkdGg7XHJcbiAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIHZhciB3aWR0aCA9IHJlc29sdmVDb250YWluZXJXaWR0aC5jYWxsKHRoaXMpO1xyXG4gICAgICAgICAgICBpZiAod2lkdGggIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLmNzcyhcIndpZHRoXCIsIHdpZHRoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIFNpbmdsZVNlbGVjdDIgPSBjbGF6eihBYnN0cmFjdFNlbGVjdDIsIHtcclxuXHJcbiAgICAgICAgLy8gc2luZ2xlXHJcblxyXG4gICAgICAgIGNyZWF0ZUNvbnRhaW5lcjogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgY29udGFpbmVyID0gJChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKS5hdHRyKHtcclxuICAgICAgICAgICAgICAgIFwiY2xhc3NcIjogXCJzZWxlY3QyLWNvbnRhaW5lclwiXHJcbiAgICAgICAgICAgIH0pLmh0bWwoW1xyXG4gICAgICAgICAgICAgICAgXCI8YSBocmVmPSdqYXZhc2NyaXB0OnZvaWQoMCknIG9uY2xpY2s9J3JldHVybiBmYWxzZTsnIGNsYXNzPSdzZWxlY3QyLWNob2ljZScgdGFiaW5kZXg9Jy0xJz5cIixcclxuICAgICAgICAgICAgICAgIFwiICAgPHNwYW4gY2xhc3M9J3NlbGVjdDItY2hvc2VuJz4mbmJzcDs8L3NwYW4+PGFiYnIgY2xhc3M9J3NlbGVjdDItc2VhcmNoLWNob2ljZS1jbG9zZSc+PC9hYmJyPlwiLFxyXG4gICAgICAgICAgICAgICAgXCIgICA8c3BhbiBjbGFzcz0nc2VsZWN0Mi1hcnJvdyc+PGkgY2xhc3M9J2ZhIGZhLXNvcnQgYnJhbmQtaW5mbyBzZWxlY3QyLWZhJz48L2k+PC9zcGFuPlwiLFxyXG4gICAgICAgICAgICAgICAgXCI8L2E+XCIsXHJcbiAgICAgICAgICAgICAgICBcIjxpbnB1dCBjbGFzcz0nc2VsZWN0Mi1mb2N1c3NlciBzZWxlY3QyLW9mZnNjcmVlbicgdHlwZT0ndGV4dCcvPlwiLFxyXG4gICAgICAgICAgICAgICAgXCI8ZGl2IGNsYXNzPSdzZWxlY3QyLWRyb3Agc2VsZWN0Mi1kaXNwbGF5LW5vbmUnPlwiLFxyXG4gICAgICAgICAgICAgICAgXCIgICA8ZGl2IGNsYXNzPSdzZWxlY3QyLXNlYXJjaCc+XCIsXHJcbiAgICAgICAgICAgICAgICBcIiAgICAgICA8aW5wdXQgdHlwZT0ndGV4dCcgYXV0b2NvbXBsZXRlPSdvZmYnIGF1dG9jb3JyZWN0PSdvZmYnIGF1dG9jYXBpdGFsaXplPSdvZmYnIHNwZWxsY2hlY2s9J2ZhbHNlJyBjbGFzcz0nc2VsZWN0Mi1pbnB1dCcvPlwiLFxyXG4gICAgICAgICAgICAgICAgXCIgICA8L2Rpdj5cIixcclxuICAgICAgICAgICAgICAgIFwiICAgPHVsIGNsYXNzPSdzZWxlY3QyLXJlc3VsdHMnPlwiLFxyXG4gICAgICAgICAgICAgICAgXCIgICA8L3VsPlwiLFxyXG4gICAgICAgICAgICAgICAgXCI8L2Rpdj5cIl0uam9pbihcIlwiKSk7XHJcbiAgICAgICAgICAgIHJldHVybiBjb250YWluZXI7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gc2luZ2xlXHJcbiAgICAgICAgZW5hYmxlSW50ZXJmYWNlOiBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50LmVuYWJsZUludGVyZmFjZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZvY3Vzc2VyLnByb3AoXCJkaXNhYmxlZFwiLCAhdGhpcy5pc0ludGVyZmFjZUVuYWJsZWQoKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBzaW5nbGVcclxuICAgICAgICBvcGVuaW5nOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBlbCwgcmFuZ2UsIGxlbjtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdHMubWluaW11bVJlc3VsdHNGb3JTZWFyY2ggPj0gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zaG93U2VhcmNoKHRydWUpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLnBhcmVudC5vcGVuaW5nLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5zaG93U2VhcmNoSW5wdXQgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBJRSBhcHBlbmRzIGZvY3Vzc2VyLnZhbCgpIGF0IHRoZSBlbmQgb2YgZmllbGQgOi8gc28gd2UgbWFudWFsbHkgaW5zZXJ0IGl0IGF0IHRoZSBiZWdpbm5pbmcgdXNpbmcgYSByYW5nZVxyXG4gICAgICAgICAgICAgICAgLy8gYWxsIG90aGVyIGJyb3dzZXJzIGhhbmRsZSB0aGlzIGp1c3QgZmluZVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoLnZhbCh0aGlzLmZvY3Vzc2VyLnZhbCgpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnNlYXJjaC5mb2N1cygpO1xyXG4gICAgICAgICAgICAvLyBtb3ZlIHRoZSBjdXJzb3IgdG8gdGhlIGVuZCBhZnRlciBmb2N1c3NpbmcsIG90aGVyd2lzZSBpdCB3aWxsIGJlIGF0IHRoZSBiZWdpbm5pbmcgYW5kXHJcbiAgICAgICAgICAgIC8vIG5ldyB0ZXh0IHdpbGwgYXBwZWFyICpiZWZvcmUqIGZvY3Vzc2VyLnZhbCgpXHJcbiAgICAgICAgICAgIGVsID0gdGhpcy5zZWFyY2guZ2V0KDApO1xyXG4gICAgICAgICAgICBpZiAoZWwuY3JlYXRlVGV4dFJhbmdlKSB7XHJcbiAgICAgICAgICAgICAgICByYW5nZSA9IGVsLmNyZWF0ZVRleHRSYW5nZSgpO1xyXG4gICAgICAgICAgICAgICAgcmFuZ2UuY29sbGFwc2UoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgcmFuZ2Uuc2VsZWN0KCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZWwuc2V0U2VsZWN0aW9uUmFuZ2UpIHtcclxuICAgICAgICAgICAgICAgIGxlbiA9IHRoaXMuc2VhcmNoLnZhbCgpLmxlbmd0aDtcclxuICAgICAgICAgICAgICAgIGVsLnNldFNlbGVjdGlvblJhbmdlKGxlbiwgbGVuKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZXMgc2VhcmNoJ3MgdmFsdWUgd2l0aCBuZXh0U2VhcmNoVGVybSAoaWYgZGVmaW5lZCBieSB1c2VyKVxyXG4gICAgICAgICAgICAvLyBpZ25vcmUgbmV4dFNlYXJjaFRlcm0gaWYgdGhlIGRyb3Bkb3duIGlzIG9wZW5lZCBieSB0aGUgdXNlciBwcmVzc2luZyBhIGxldHRlclxyXG4gICAgICAgICAgICBpZih0aGlzLnNlYXJjaC52YWwoKSA9PT0gXCJcIikge1xyXG4gICAgICAgICAgICAgICAgaWYodGhpcy5uZXh0U2VhcmNoVGVybSAhPSB1bmRlZmluZWQpe1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoLnZhbCh0aGlzLm5leHRTZWFyY2hUZXJtKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaC5zZWxlY3QoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5mb2N1c3Nlci5wcm9wKFwiZGlzYWJsZWRcIiwgdHJ1ZSkudmFsKFwiXCIpO1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVJlc3VsdHModHJ1ZSk7XHJcbiAgICAgICAgICAgIHRoaXMub3B0cy5lbGVtZW50LnRyaWdnZXIoJC5FdmVudChcInNlbGVjdDItb3BlblwiKSk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gc2luZ2xlXHJcbiAgICAgICAgY2xvc2U6IGZ1bmN0aW9uIChwYXJhbXMpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLm9wZW5lZCgpKSByZXR1cm47XHJcbiAgICAgICAgICAgIHRoaXMucGFyZW50LmNsb3NlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XHJcblxyXG4gICAgICAgICAgICBwYXJhbXMgPSBwYXJhbXMgfHwge2ZvY3VzOiB0cnVlfTtcclxuICAgICAgICAgICAgdGhpcy5mb2N1c3Nlci5yZW1vdmVBdHRyKFwiZGlzYWJsZWRcIik7XHJcblxyXG4gICAgICAgICAgICBpZiAocGFyYW1zLmZvY3VzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZvY3Vzc2VyLmZvY3VzKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBzaW5nbGVcclxuICAgICAgICBmb2N1czogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5vcGVuZWQoKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5mb2N1c3Nlci5yZW1vdmVBdHRyKFwiZGlzYWJsZWRcIik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZvY3Vzc2VyLmZvY3VzKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBzaW5nbGVcclxuICAgICAgICBpc0ZvY3VzZWQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyLmhhc0NsYXNzKFwic2VsZWN0Mi1jb250YWluZXItYWN0aXZlXCIpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIHNpbmdsZVxyXG4gICAgICAgIGNhbmNlbDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB0aGlzLnBhcmVudC5jYW5jZWwuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxuICAgICAgICAgICAgdGhpcy5mb2N1c3Nlci5yZW1vdmVBdHRyKFwiZGlzYWJsZWRcIik7XHJcbiAgICAgICAgICAgIHRoaXMuZm9jdXNzZXIuZm9jdXMoKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBzaW5nbGVcclxuICAgICAgICBkZXN0cm95OiBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgJChcImxhYmVsW2Zvcj0nXCIgKyB0aGlzLmZvY3Vzc2VyLmF0dHIoJ2lkJykgKyBcIiddXCIpXHJcbiAgICAgICAgICAgICAgICAuYXR0cignZm9yJywgdGhpcy5vcHRzLmVsZW1lbnQuYXR0cihcImlkXCIpKTtcclxuICAgICAgICAgICAgdGhpcy5wYXJlbnQuZGVzdHJveS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIHNpbmdsZVxyXG4gICAgICAgIGluaXRDb250YWluZXI6IGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24sXHJcbiAgICAgICAgICAgICAgICBjb250YWluZXIgPSB0aGlzLmNvbnRhaW5lcixcclxuICAgICAgICAgICAgICAgIGRyb3Bkb3duID0gdGhpcy5kcm9wZG93bjtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdHMubWluaW11bVJlc3VsdHNGb3JTZWFyY2ggPCAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dTZWFyY2goZmFsc2UpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zaG93U2VhcmNoKHRydWUpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbiA9IGNvbnRhaW5lci5maW5kKFwiLnNlbGVjdDItY2hvaWNlXCIpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5mb2N1c3NlciA9IGNvbnRhaW5lci5maW5kKFwiLnNlbGVjdDItZm9jdXNzZXJcIik7XHJcblxyXG4gICAgICAgICAgICAvLyByZXdyaXRlIGxhYmVscyBmcm9tIG9yaWdpbmFsIGVsZW1lbnQgdG8gZm9jdXNzZXJcclxuICAgICAgICAgICAgdGhpcy5mb2N1c3Nlci5hdHRyKFwiaWRcIiwgXCJzMmlkX2F1dG9nZW5cIituZXh0VWlkKCkpO1xyXG5cclxuICAgICAgICAgICAgJChcImxhYmVsW2Zvcj0nXCIgKyB0aGlzLm9wdHMuZWxlbWVudC5hdHRyKFwiaWRcIikgKyBcIiddXCIpXHJcbiAgICAgICAgICAgICAgICAuYXR0cignZm9yJywgdGhpcy5mb2N1c3Nlci5hdHRyKCdpZCcpKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZm9jdXNzZXIuYXR0cihcInRhYmluZGV4XCIsIHRoaXMuZWxlbWVudFRhYkluZGV4KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoLm9uKFwia2V5ZG93blwiLCB0aGlzLmJpbmQoZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc0ludGVyZmFjZUVuYWJsZWQoKSkgcmV0dXJuO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChlLndoaWNoID09PSBLRVkuUEFHRV9VUCB8fCBlLndoaWNoID09PSBLRVkuUEFHRV9ET1dOKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gcHJldmVudCB0aGUgcGFnZSBmcm9tIHNjcm9sbGluZ1xyXG4gICAgICAgICAgICAgICAgICAgIGtpbGxFdmVudChlKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgc3dpdGNoIChlLndoaWNoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBLRVkuVVA6XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBLRVkuRE9XTjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tb3ZlSGlnaGxpZ2h0KChlLndoaWNoID09PSBLRVkuVVApID8gLTEgOiAxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAga2lsbEV2ZW50KGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBLRVkuRU5URVI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0SGlnaGxpZ2h0ZWQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAga2lsbEV2ZW50KGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBLRVkuVEFCOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBzZWxlY3RPbkJsdXIgPT0gdHJ1ZSwgc2VsZWN0IHRoZSBjdXJyZW50bHkgaGlnaGxpZ2h0ZWQgb3B0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdHMuc2VsZWN0T25CbHVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdEhpZ2hsaWdodGVkKHtub0ZvY3VzOiB0cnVlfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgS0VZLkVTQzpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW5jZWwoZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGtpbGxFdmVudChlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNlYXJjaC5vbihcImJsdXJcIiwgdGhpcy5iaW5kKGZ1bmN0aW9uKGUpIHtcclxuICAgICAgICAgICAgICAgIC8vIGEgd29ya2Fyb3VuZCBmb3IgY2hyb21lIHRvIGtlZXAgdGhlIHNlYXJjaCBmaWVsZCBmb2N1c3NlZCB3aGVuIHRoZSBzY3JvbGwgYmFyIGlzIHVzZWQgdG8gc2Nyb2xsIHRoZSBkcm9wZG93bi5cclxuICAgICAgICAgICAgICAgIC8vIHdpdGhvdXQgdGhpcyB0aGUgc2VhcmNoIGZpZWxkIGxvc2VzIGZvY3VzIHdoaWNoIGlzIGFubm95aW5nXHJcbiAgICAgICAgICAgICAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gdGhpcy5ib2R5KCkuZ2V0KDApKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQodGhpcy5iaW5kKGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaC5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pLCAwKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSkpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5mb2N1c3Nlci5vbihcImtleWRvd25cIiwgdGhpcy5iaW5kKGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNJbnRlcmZhY2VFbmFibGVkKCkpIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZS53aGljaCA9PT0gS0VZLlRBQiB8fCBLRVkuaXNDb250cm9sKGUpIHx8IEtFWS5pc0Z1bmN0aW9uS2V5KGUpIHx8IGUud2hpY2ggPT09IEtFWS5FU0MpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0cy5vcGVuT25FbnRlciA9PT0gZmFsc2UgJiYgZS53aGljaCA9PT0gS0VZLkVOVEVSKSB7XHJcbiAgICAgICAgICAgICAgICAgICAga2lsbEV2ZW50KGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZS53aGljaCA9PSBLRVkuRE9XTiB8fCBlLndoaWNoID09IEtFWS5VUFxyXG4gICAgICAgICAgICAgICAgICAgIHx8IChlLndoaWNoID09IEtFWS5FTlRFUiAmJiB0aGlzLm9wdHMub3Blbk9uRW50ZXIpKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlLmFsdEtleSB8fCBlLmN0cmxLZXkgfHwgZS5zaGlmdEtleSB8fCBlLm1ldGFLZXkpIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcGVuKCk7XHJcbiAgICAgICAgICAgICAgICAgICAga2lsbEV2ZW50KGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZS53aGljaCA9PSBLRVkuREVMRVRFIHx8IGUud2hpY2ggPT0gS0VZLkJBQ0tTUEFDRSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdHMuYWxsb3dDbGVhcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNsZWFyKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGtpbGxFdmVudChlKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pKTtcclxuXHJcblxyXG4gICAgICAgICAgICBpbnN0YWxsS2V5VXBDaGFuZ2VFdmVudCh0aGlzLmZvY3Vzc2VyKTtcclxuICAgICAgICAgICAgdGhpcy5mb2N1c3Nlci5vbihcImtleXVwLWNoYW5nZSBpbnB1dFwiLCB0aGlzLmJpbmQoZnVuY3Rpb24oZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0cy5taW5pbXVtUmVzdWx0c0ZvclNlYXJjaCA+PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcGVuZWQoKSkgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3BlbigpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KSk7XHJcblxyXG4gICAgICAgICAgICBzZWxlY3Rpb24ub24oXCJtb3VzZWRvd25cIiwgXCJhYmJyXCIsIHRoaXMuYmluZChmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzSW50ZXJmYWNlRW5hYmxlZCgpKSByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNsZWFyKCk7XHJcbiAgICAgICAgICAgICAgICBraWxsRXZlbnRJbW1lZGlhdGVseShlKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLmZvY3VzKCk7XHJcbiAgICAgICAgICAgIH0pKTtcclxuXHJcbiAgICAgICAgICAgIHNlbGVjdGlvbi5vbihcIm1vdXNlZG93blwiLCB0aGlzLmJpbmQoZnVuY3Rpb24gKGUpIHtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY29udGFpbmVyLmhhc0NsYXNzKFwic2VsZWN0Mi1jb250YWluZXItYWN0aXZlXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRzLmVsZW1lbnQudHJpZ2dlcigkLkV2ZW50KFwic2VsZWN0Mi1mb2N1c1wiKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3BlbmVkKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsb3NlKCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNJbnRlcmZhY2VFbmFibGVkKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wZW4oKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBraWxsRXZlbnQoZSk7XHJcbiAgICAgICAgICAgIH0pKTtcclxuXHJcbiAgICAgICAgICAgIGRyb3Bkb3duLm9uKFwibW91c2Vkb3duXCIsIHRoaXMuYmluZChmdW5jdGlvbigpIHsgdGhpcy5zZWFyY2guZm9jdXMoKTsgfSkpO1xyXG5cclxuICAgICAgICAgICAgc2VsZWN0aW9uLm9uKFwiZm9jdXNcIiwgdGhpcy5iaW5kKGZ1bmN0aW9uKGUpIHtcclxuICAgICAgICAgICAgICAgIGtpbGxFdmVudChlKTtcclxuICAgICAgICAgICAgfSkpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5mb2N1c3Nlci5vbihcImZvY3VzXCIsIHRoaXMuYmluZChmdW5jdGlvbigpe1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmNvbnRhaW5lci5oYXNDbGFzcyhcInNlbGVjdDItY29udGFpbmVyLWFjdGl2ZVwiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3B0cy5lbGVtZW50LnRyaWdnZXIoJC5FdmVudChcInNlbGVjdDItZm9jdXNcIikpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5jb250YWluZXIuYWRkQ2xhc3MoXCJzZWxlY3QyLWNvbnRhaW5lci1hY3RpdmVcIik7XHJcbiAgICAgICAgICAgIH0pKS5vbihcImJsdXJcIiwgdGhpcy5iaW5kKGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wZW5lZCgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250YWluZXIucmVtb3ZlQ2xhc3MoXCJzZWxlY3QyLWNvbnRhaW5lci1hY3RpdmVcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRzLmVsZW1lbnQudHJpZ2dlcigkLkV2ZW50KFwic2VsZWN0Mi1ibHVyXCIpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICB0aGlzLnNlYXJjaC5vbihcImZvY3VzXCIsIHRoaXMuYmluZChmdW5jdGlvbigpe1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmNvbnRhaW5lci5oYXNDbGFzcyhcInNlbGVjdDItY29udGFpbmVyLWFjdGl2ZVwiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3B0cy5lbGVtZW50LnRyaWdnZXIoJC5FdmVudChcInNlbGVjdDItZm9jdXNcIikpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5jb250YWluZXIuYWRkQ2xhc3MoXCJzZWxlY3QyLWNvbnRhaW5lci1hY3RpdmVcIik7XHJcbiAgICAgICAgICAgIH0pKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuaW5pdENvbnRhaW5lcldpZHRoKCk7XHJcbiAgICAgICAgICAgIHRoaXMub3B0cy5lbGVtZW50LmFkZENsYXNzKFwic2VsZWN0Mi1vZmZzY3JlZW5cIik7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0UGxhY2Vob2xkZXIoKTtcclxuXHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gc2luZ2xlXHJcbiAgICAgICAgY2xlYXI6IGZ1bmN0aW9uKHRyaWdnZXJDaGFuZ2UpIHtcclxuICAgICAgICAgICAgdmFyIGRhdGE9dGhpcy5zZWxlY3Rpb24uZGF0YShcInNlbGVjdDItZGF0YVwiKTtcclxuICAgICAgICAgICAgaWYgKGRhdGEpIHsgLy8gZ3VhcmQgYWdhaW5zdCBxdWV1ZWQgcXVpY2sgY29uc2VjdXRpdmUgY2xpY2tzXHJcbiAgICAgICAgICAgICAgICB2YXIgcGxhY2Vob2xkZXJPcHRpb24gPSB0aGlzLmdldFBsYWNlaG9sZGVyT3B0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9wdHMuZWxlbWVudC52YWwocGxhY2Vob2xkZXJPcHRpb24gPyBwbGFjZWhvbGRlck9wdGlvbi52YWwoKSA6IFwiXCIpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uZmluZChcIi5zZWxlY3QyLWNob3NlblwiKS5lbXB0eSgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24ucmVtb3ZlRGF0YShcInNlbGVjdDItZGF0YVwiKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0UGxhY2Vob2xkZXIoKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodHJpZ2dlckNoYW5nZSAhPT0gZmFsc2Upe1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3B0cy5lbGVtZW50LnRyaWdnZXIoeyB0eXBlOiBcInNlbGVjdDItcmVtb3ZlZFwiLCB2YWw6IHRoaXMuaWQoZGF0YSksIGNob2ljZTogZGF0YSB9KTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyaWdnZXJDaGFuZ2Uoe3JlbW92ZWQ6ZGF0YX0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogU2V0cyBzZWxlY3Rpb24gYmFzZWQgb24gc291cmNlIGVsZW1lbnQncyB2YWx1ZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIC8vIHNpbmdsZVxyXG4gICAgICAgIGluaXRTZWxlY3Rpb246IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIHNlbGVjdGVkO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5pc1BsYWNlaG9sZGVyT3B0aW9uU2VsZWN0ZWQoKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTZWxlY3Rpb24obnVsbCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldFBsYWNlaG9sZGVyKCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9wdHMuaW5pdFNlbGVjdGlvbi5jYWxsKG51bGwsIHRoaXMub3B0cy5lbGVtZW50LCBmdW5jdGlvbihzZWxlY3RlZCl7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkICE9PSB1bmRlZmluZWQgJiYgc2VsZWN0ZWQgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi51cGRhdGVTZWxlY3Rpb24oc2VsZWN0ZWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNsb3NlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0UGxhY2Vob2xkZXIoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIGlzUGxhY2Vob2xkZXJPcHRpb25TZWxlY3RlZDogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIHZhciBwbGFjZWhvbGRlck9wdGlvbjtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLm9wdHMucGxhY2Vob2xkZXIpIHJldHVybiBmYWxzZTsgLy8gbm8gcGxhY2Vob2xkZXIgc3BlY2lmaWVkIHNvIG5vIG9wdGlvbiBzaG91bGQgYmUgY29uc2lkZXJlZFxyXG4gICAgICAgICAgICByZXR1cm4gKChwbGFjZWhvbGRlck9wdGlvbiA9IHRoaXMuZ2V0UGxhY2Vob2xkZXJPcHRpb24oKSkgIT09IHVuZGVmaW5lZCAmJiBwbGFjZWhvbGRlck9wdGlvbi5pcygnOnNlbGVjdGVkJykpXHJcbiAgICAgICAgICAgICAgICB8fCAodGhpcy5vcHRzLmVsZW1lbnQudmFsKCkgPT09IFwiXCIpXHJcbiAgICAgICAgICAgICAgICB8fCAodGhpcy5vcHRzLmVsZW1lbnQudmFsKCkgPT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgICAgIHx8ICh0aGlzLm9wdHMuZWxlbWVudC52YWwoKSA9PT0gbnVsbCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gc2luZ2xlXHJcbiAgICAgICAgcHJlcGFyZU9wdHM6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIG9wdHMgPSB0aGlzLnBhcmVudC5wcmVwYXJlT3B0cy5hcHBseSh0aGlzLCBhcmd1bWVudHMpLFxyXG4gICAgICAgICAgICAgICAgc2VsZj10aGlzO1xyXG5cclxuICAgICAgICAgICAgaWYgKG9wdHMuZWxlbWVudC5nZXQoMCkudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInNlbGVjdFwiKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBpbnN0YWxsIHRoZSBzZWxlY3Rpb24gaW5pdGlhbGl6ZXJcclxuICAgICAgICAgICAgICAgIG9wdHMuaW5pdFNlbGVjdGlvbiA9IGZ1bmN0aW9uIChlbGVtZW50LCBjYWxsYmFjaykge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IGVsZW1lbnQuZmluZChcIjpzZWxlY3RlZFwiKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyBhIHNpbmdsZSBzZWxlY3QgYm94IGFsd2F5cyBoYXMgYSB2YWx1ZSwgbm8gbmVlZCB0byBudWxsIGNoZWNrICdzZWxlY3RlZCdcclxuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhzZWxmLm9wdGlvblRvRGF0YShzZWxlY3RlZCkpO1xyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChcImRhdGFcIiBpbiBvcHRzKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBpbnN0YWxsIGRlZmF1bHQgaW5pdFNlbGVjdGlvbiB3aGVuIGFwcGxpZWQgdG8gaGlkZGVuIGlucHV0IGFuZCBkYXRhIGlzIGxvY2FsXHJcbiAgICAgICAgICAgICAgICBvcHRzLmluaXRTZWxlY3Rpb24gPSBvcHRzLmluaXRTZWxlY3Rpb24gfHwgZnVuY3Rpb24gKGVsZW1lbnQsIGNhbGxiYWNrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGlkID0gZWxlbWVudC52YWwoKTtcclxuICAgICAgICAgICAgICAgICAgICAvL3NlYXJjaCBpbiBkYXRhIGJ5IGlkLCBzdG9yaW5nIHRoZSBhY3R1YWwgbWF0Y2hpbmcgaXRlbVxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBtYXRjaCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgb3B0cy5xdWVyeSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZXI6IGZ1bmN0aW9uKHRlcm0sIHRleHQsIGVsKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpc19tYXRjaCA9IGVxdWFsKGlkLCBvcHRzLmlkKGVsKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNfbWF0Y2gpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IGVsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzX21hdGNoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjazogISQuaXNGdW5jdGlvbihjYWxsYmFjaykgPyAkLm5vb3AgOiBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG1hdGNoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIG9wdHM7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gc2luZ2xlXHJcbiAgICAgICAgZ2V0UGxhY2Vob2xkZXI6IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAvLyBpZiBhIHBsYWNlaG9sZGVyIGlzIHNwZWNpZmllZCBvbiBhIHNpbmdsZSBzZWxlY3Qgd2l0aG91dCBhIHZhbGlkIHBsYWNlaG9sZGVyIG9wdGlvbiBpZ25vcmUgaXRcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0KSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5nZXRQbGFjZWhvbGRlck9wdGlvbigpID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQuZ2V0UGxhY2Vob2xkZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBzaW5nbGVcclxuICAgICAgICBzZXRQbGFjZWhvbGRlcjogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgcGxhY2Vob2xkZXIgPSB0aGlzLmdldFBsYWNlaG9sZGVyKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5pc1BsYWNlaG9sZGVyT3B0aW9uU2VsZWN0ZWQoKSAmJiBwbGFjZWhvbGRlciAhPT0gdW5kZWZpbmVkKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gY2hlY2sgZm9yIGEgcGxhY2Vob2xkZXIgb3B0aW9uIGlmIGF0dGFjaGVkIHRvIGEgc2VsZWN0XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWxlY3QgJiYgdGhpcy5nZXRQbGFjZWhvbGRlck9wdGlvbigpID09PSB1bmRlZmluZWQpIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5maW5kKFwiLnNlbGVjdDItY2hvc2VuXCIpLmh0bWwodGhpcy5vcHRzLmVzY2FwZU1hcmt1cChwbGFjZWhvbGRlcikpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLmFkZENsYXNzKFwic2VsZWN0Mi1kZWZhdWx0XCIpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLnJlbW92ZUNsYXNzKFwic2VsZWN0Mi1hbGxvd2NsZWFyXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gc2luZ2xlXHJcbiAgICAgICAgcG9zdHByb2Nlc3NSZXN1bHRzOiBmdW5jdGlvbiAoZGF0YSwgaW5pdGlhbCwgbm9IaWdobGlnaHRVcGRhdGUpIHtcclxuICAgICAgICAgICAgdmFyIHNlbGVjdGVkID0gMCwgc2VsZiA9IHRoaXMsIHNob3dTZWFyY2hJbnB1dCA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICAvLyBmaW5kIHRoZSBzZWxlY3RlZCBlbGVtZW50IGluIHRoZSByZXN1bHQgbGlzdFxyXG5cclxuICAgICAgICAgICAgdGhpcy5maW5kSGlnaGxpZ2h0YWJsZUNob2ljZXMoKS5lYWNoMihmdW5jdGlvbiAoaSwgZWxtKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXF1YWwoc2VsZi5pZChlbG0uZGF0YShcInNlbGVjdDItZGF0YVwiKSksIHNlbGYub3B0cy5lbGVtZW50LnZhbCgpKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkID0gaTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgLy8gYW5kIGhpZ2hsaWdodCBpdFxyXG4gICAgICAgICAgICBpZiAobm9IaWdobGlnaHRVcGRhdGUgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaW5pdGlhbCA9PT0gdHJ1ZSAmJiBzZWxlY3RlZCA+PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWdobGlnaHQoc2VsZWN0ZWQpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZ2hsaWdodCgwKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gaGlkZSB0aGUgc2VhcmNoIGJveCBpZiB0aGlzIGlzIHRoZSBmaXJzdCB3ZSBnb3QgdGhlIHJlc3VsdHMgYW5kIHRoZXJlIGFyZSBlbm91Z2ggb2YgdGhlbSBmb3Igc2VhcmNoXHJcblxyXG4gICAgICAgICAgICBpZiAoaW5pdGlhbCA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIG1pbiA9IHRoaXMub3B0cy5taW5pbXVtUmVzdWx0c0ZvclNlYXJjaDtcclxuICAgICAgICAgICAgICAgIGlmIChtaW4gPj0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvd1NlYXJjaChjb3VudFJlc3VsdHMoZGF0YS5yZXN1bHRzKSA+PSBtaW4pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gc2luZ2xlXHJcbiAgICAgICAgc2hvd1NlYXJjaDogZnVuY3Rpb24oc2hvd1NlYXJjaElucHV0KSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNob3dTZWFyY2hJbnB1dCA9PT0gc2hvd1NlYXJjaElucHV0KSByZXR1cm47XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNob3dTZWFyY2hJbnB1dCA9IHNob3dTZWFyY2hJbnB1dDtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZHJvcGRvd24uZmluZChcIi5zZWxlY3QyLXNlYXJjaFwiKS50b2dnbGVDbGFzcyhcInNlbGVjdDItc2VhcmNoLWhpZGRlblwiLCAhc2hvd1NlYXJjaElucHV0KTtcclxuICAgICAgICAgICAgdGhpcy5kcm9wZG93bi5maW5kKFwiLnNlbGVjdDItc2VhcmNoXCIpLnRvZ2dsZUNsYXNzKFwic2VsZWN0Mi1vZmZzY3JlZW5cIiwgIXNob3dTZWFyY2hJbnB1dCk7XHJcbiAgICAgICAgICAgIC8vYWRkIFwic2VsZWN0Mi13aXRoLXNlYXJjaGJveFwiIHRvIHRoZSBjb250YWluZXIgaWYgc2VhcmNoIGJveCBpcyBzaG93blxyXG4gICAgICAgICAgICAkKHRoaXMuZHJvcGRvd24sIHRoaXMuY29udGFpbmVyKS50b2dnbGVDbGFzcyhcInNlbGVjdDItd2l0aC1zZWFyY2hib3hcIiwgc2hvd1NlYXJjaElucHV0KTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBzaW5nbGVcclxuICAgICAgICBvblNlbGVjdDogZnVuY3Rpb24gKGRhdGEsIG9wdGlvbnMpIHtcclxuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy50cmlnZ2VyU2VsZWN0KGRhdGEpKSB7IHJldHVybjsgfVxyXG5cclxuICAgICAgICAgICAgdmFyIG9sZCA9IHRoaXMub3B0cy5lbGVtZW50LnZhbCgpLFxyXG4gICAgICAgICAgICAgICAgb2xkRGF0YSA9IHRoaXMuZGF0YSgpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5vcHRzLmVsZW1lbnQudmFsKHRoaXMuaWQoZGF0YSkpO1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVNlbGVjdGlvbihkYXRhKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMub3B0cy5lbGVtZW50LnRyaWdnZXIoeyB0eXBlOiBcInNlbGVjdDItc2VsZWN0ZWRcIiwgdmFsOiB0aGlzLmlkKGRhdGEpLCBjaG9pY2U6IGRhdGEgfSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLm5leHRTZWFyY2hUZXJtID0gdGhpcy5vcHRzLm5leHRTZWFyY2hUZXJtKGRhdGEsIHRoaXMuc2VhcmNoLnZhbCgpKTtcclxuICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFvcHRpb25zIHx8ICFvcHRpb25zLm5vRm9jdXMpXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5mb2N1cygpO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFlcXVhbChvbGQsIHRoaXMuaWQoZGF0YSkpKSB7IHRoaXMudHJpZ2dlckNoYW5nZSh7YWRkZWQ6ZGF0YSxyZW1vdmVkOm9sZERhdGF9KTsgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIHNpbmdsZVxyXG4gICAgICAgIHVwZGF0ZVNlbGVjdGlvbjogZnVuY3Rpb24gKGRhdGEpIHtcclxuXHJcbiAgICAgICAgICAgIHZhciBjb250YWluZXI9dGhpcy5zZWxlY3Rpb24uZmluZChcIi5zZWxlY3QyLWNob3NlblwiKSwgZm9ybWF0dGVkLCBjc3NDbGFzcztcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLmRhdGEoXCJzZWxlY3QyLWRhdGFcIiwgZGF0YSk7XHJcblxyXG4gICAgICAgICAgICBjb250YWluZXIuZW1wdHkoKTtcclxuICAgICAgICAgICAgaWYgKGRhdGEgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGZvcm1hdHRlZD10aGlzLm9wdHMuZm9ybWF0U2VsZWN0aW9uKGRhdGEsIGNvbnRhaW5lciwgdGhpcy5vcHRzLmVzY2FwZU1hcmt1cCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGZvcm1hdHRlZCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXIuYXBwZW5kKGZvcm1hdHRlZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY3NzQ2xhc3M9dGhpcy5vcHRzLmZvcm1hdFNlbGVjdGlvbkNzc0NsYXNzKGRhdGEsIGNvbnRhaW5lcik7XHJcbiAgICAgICAgICAgIGlmIChjc3NDbGFzcyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXIuYWRkQ2xhc3MoY3NzQ2xhc3MpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5yZW1vdmVDbGFzcyhcInNlbGVjdDItZGVmYXVsdFwiKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdHMuYWxsb3dDbGVhciAmJiB0aGlzLmdldFBsYWNlaG9sZGVyKCkgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb250YWluZXIuYWRkQ2xhc3MoXCJzZWxlY3QyLWFsbG93Y2xlYXJcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBzaW5nbGVcclxuICAgICAgICB2YWw6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIHZhbCxcclxuICAgICAgICAgICAgICAgIHRyaWdnZXJDaGFuZ2UgPSBmYWxzZSxcclxuICAgICAgICAgICAgICAgIGRhdGEgPSBudWxsLFxyXG4gICAgICAgICAgICAgICAgc2VsZiA9IHRoaXMsXHJcbiAgICAgICAgICAgICAgICBvbGREYXRhID0gdGhpcy5kYXRhKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub3B0cy5lbGVtZW50LnZhbCgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB2YWwgPSBhcmd1bWVudHNbMF07XHJcblxyXG4gICAgICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICAgICAgICAgIHRyaWdnZXJDaGFuZ2UgPSBhcmd1bWVudHNbMV07XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RcclxuICAgICAgICAgICAgICAgICAgICAudmFsKHZhbClcclxuICAgICAgICAgICAgICAgICAgICAuZmluZChcIjpzZWxlY3RlZFwiKS5lYWNoMihmdW5jdGlvbiAoaSwgZWxtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBzZWxmLm9wdGlvblRvRGF0YShlbG0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVNlbGVjdGlvbihkYXRhKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0UGxhY2Vob2xkZXIoKTtcclxuICAgICAgICAgICAgICAgIGlmICh0cmlnZ2VyQ2hhbmdlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyQ2hhbmdlKHthZGRlZDogZGF0YSwgcmVtb3ZlZDpvbGREYXRhfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyB2YWwgaXMgYW4gaWQuICF2YWwgaXMgdHJ1ZSBmb3IgW3VuZGVmaW5lZCxudWxsLCcnLDBdIC0gMCBpcyBsZWdhbFxyXG4gICAgICAgICAgICAgICAgaWYgKCF2YWwgJiYgdmFsICE9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGVhcih0cmlnZ2VyQ2hhbmdlKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRzLmluaXRTZWxlY3Rpb24gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImNhbm5vdCBjYWxsIHZhbCgpIGlmIGluaXRTZWxlY3Rpb24oKSBpcyBub3QgZGVmaW5lZFwiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMub3B0cy5lbGVtZW50LnZhbCh2YWwpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vcHRzLmluaXRTZWxlY3Rpb24odGhpcy5vcHRzLmVsZW1lbnQsIGZ1bmN0aW9uKGRhdGEpe1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYub3B0cy5lbGVtZW50LnZhbCghZGF0YSA/IFwiXCIgOiBzZWxmLmlkKGRhdGEpKTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnVwZGF0ZVNlbGVjdGlvbihkYXRhKTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFBsYWNlaG9sZGVyKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRyaWdnZXJDaGFuZ2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyQ2hhbmdlKHthZGRlZDogZGF0YSwgcmVtb3ZlZDpvbGREYXRhfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBzaW5nbGVcclxuICAgICAgICBjbGVhclNlYXJjaDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB0aGlzLnNlYXJjaC52YWwoXCJcIik7XHJcbiAgICAgICAgICAgIHRoaXMuZm9jdXNzZXIudmFsKFwiXCIpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIHNpbmdsZVxyXG4gICAgICAgIGRhdGE6IGZ1bmN0aW9uKHZhbHVlKSB7XHJcbiAgICAgICAgICAgIHZhciBkYXRhLFxyXG4gICAgICAgICAgICAgICAgdHJpZ2dlckNoYW5nZSA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgICAgIGRhdGEgPSB0aGlzLnNlbGVjdGlvbi5kYXRhKFwic2VsZWN0Mi1kYXRhXCIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGRhdGEgPT0gdW5kZWZpbmVkKSBkYXRhID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlckNoYW5nZSA9IGFyZ3VtZW50c1sxXTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICghdmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsZWFyKHRyaWdnZXJDaGFuZ2UpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBkYXRhID0gdGhpcy5kYXRhKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRzLmVsZW1lbnQudmFsKCF2YWx1ZSA/IFwiXCIgOiB0aGlzLmlkKHZhbHVlKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTZWxlY3Rpb24odmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0cmlnZ2VyQ2hhbmdlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlckNoYW5nZSh7YWRkZWQ6IHZhbHVlLCByZW1vdmVkOmRhdGF9KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBNdWx0aVNlbGVjdDIgPSBjbGF6eihBYnN0cmFjdFNlbGVjdDIsIHtcclxuXHJcbiAgICAgICAgLy8gbXVsdGlcclxuICAgICAgICBjcmVhdGVDb250YWluZXI6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIGNvbnRhaW5lciA9ICQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSkuYXR0cih7XHJcbiAgICAgICAgICAgICAgICBcImNsYXNzXCI6IFwic2VsZWN0Mi1jb250YWluZXIgc2VsZWN0Mi1jb250YWluZXItbXVsdGlcIlxyXG4gICAgICAgICAgICB9KS5odG1sKFtcclxuICAgICAgICAgICAgICAgIFwiPHVsIGNsYXNzPSdzZWxlY3QyLWNob2ljZXMnPlwiLFxyXG4gICAgICAgICAgICAgICAgXCIgIDxsaSBjbGFzcz0nc2VsZWN0Mi1zZWFyY2gtZmllbGQnPlwiLFxyXG4gICAgICAgICAgICAgICAgXCIgICAgPGlucHV0IHR5cGU9J3RleHQnIGF1dG9jb21wbGV0ZT0nb2ZmJyBhdXRvY29ycmVjdD0nb2ZmJyBhdXRvY2FwaXRhbGl6ZT0nb2ZmJyBzcGVsbGNoZWNrPSdmYWxzZScgY2xhc3M9J3NlbGVjdDItaW5wdXQnPlwiLFxyXG4gICAgICAgICAgICAgICAgXCIgIDwvbGk+XCIsXHJcbiAgICAgICAgICAgICAgICBcIjwvdWw+XCIsXHJcbiAgICAgICAgICAgICAgICBcIjxkaXYgY2xhc3M9J3NlbGVjdDItZHJvcCBzZWxlY3QyLWRyb3AtbXVsdGkgc2VsZWN0Mi1kaXNwbGF5LW5vbmUnPlwiLFxyXG4gICAgICAgICAgICAgICAgXCIgICA8dWwgY2xhc3M9J3NlbGVjdDItcmVzdWx0cyc+XCIsXHJcbiAgICAgICAgICAgICAgICBcIiAgIDwvdWw+XCIsXHJcbiAgICAgICAgICAgICAgICBcIjwvZGl2PlwiXS5qb2luKFwiXCIpKTtcclxuICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lcjtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBtdWx0aVxyXG4gICAgICAgIHByZXBhcmVPcHRzOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBvcHRzID0gdGhpcy5wYXJlbnQucHJlcGFyZU9wdHMuYXBwbHkodGhpcywgYXJndW1lbnRzKSxcclxuICAgICAgICAgICAgICAgIHNlbGY9dGhpcztcclxuXHJcbiAgICAgICAgICAgIC8vIFRPRE8gdmFsaWRhdGUgcGxhY2Vob2xkZXIgaXMgYSBzdHJpbmcgaWYgc3BlY2lmaWVkXHJcblxyXG4gICAgICAgICAgICBpZiAob3B0cy5lbGVtZW50LmdldCgwKS50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwic2VsZWN0XCIpIHtcclxuICAgICAgICAgICAgICAgIC8vIGluc3RhbGwgc3RoZSBzZWxlY3Rpb24gaW5pdGlhbGl6ZXJcclxuICAgICAgICAgICAgICAgIG9wdHMuaW5pdFNlbGVjdGlvbiA9IGZ1bmN0aW9uIChlbGVtZW50LCBjYWxsYmFjaykge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IFtdO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmZpbmQoXCI6c2VsZWN0ZWRcIikuZWFjaDIoZnVuY3Rpb24gKGksIGVsbSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnB1c2goc2VsZi5vcHRpb25Ub0RhdGEoZWxtKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZGF0YSk7XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKFwiZGF0YVwiIGluIG9wdHMpIHtcclxuICAgICAgICAgICAgICAgIC8vIGluc3RhbGwgZGVmYXVsdCBpbml0U2VsZWN0aW9uIHdoZW4gYXBwbGllZCB0byBoaWRkZW4gaW5wdXQgYW5kIGRhdGEgaXMgbG9jYWxcclxuICAgICAgICAgICAgICAgIG9wdHMuaW5pdFNlbGVjdGlvbiA9IG9wdHMuaW5pdFNlbGVjdGlvbiB8fCBmdW5jdGlvbiAoZWxlbWVudCwgY2FsbGJhY2spIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgaWRzID0gc3BsaXRWYWwoZWxlbWVudC52YWwoKSwgb3B0cy5zZXBhcmF0b3IpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vc2VhcmNoIGluIGRhdGEgYnkgYXJyYXkgb2YgaWRzLCBzdG9yaW5nIG1hdGNoaW5nIGl0ZW1zIGluIGEgbGlzdFxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBtYXRjaGVzID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgb3B0cy5xdWVyeSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZXI6IGZ1bmN0aW9uKHRlcm0sIHRleHQsIGVsKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpc19tYXRjaCA9ICQuZ3JlcChpZHMsIGZ1bmN0aW9uKGlkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVxdWFsKGlkLCBvcHRzLmlkKGVsKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNfbWF0Y2gpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVzLnB1c2goZWwpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzX21hdGNoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjazogISQuaXNGdW5jdGlvbihjYWxsYmFjaykgPyAkLm5vb3AgOiBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlb3JkZXIgbWF0Y2hlcyBiYXNlZCBvbiB0aGUgb3JkZXIgdGhleSBhcHBlYXIgaW4gdGhlIGlkcyBhcnJheSBiZWNhdXNlIHJpZ2h0IG5vd1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhleSBhcmUgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgYXBwZWFyIGluIGRhdGEgYXJyYXlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvcmRlcmVkID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGlkcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpZCA9IGlkc1tpXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG1hdGNoZXMubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1hdGNoID0gbWF0Y2hlc1tqXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVxdWFsKGlkLCBvcHRzLmlkKG1hdGNoKSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyZWQucHVzaChtYXRjaCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVzLnNwbGljZShqLCAxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sob3JkZXJlZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiBvcHRzO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHNlbGVjdENob2ljZTogZnVuY3Rpb24gKGNob2ljZSkge1xyXG5cclxuICAgICAgICAgICAgdmFyIHNlbGVjdGVkID0gdGhpcy5jb250YWluZXIuZmluZChcIi5zZWxlY3QyLXNlYXJjaC1jaG9pY2UtZm9jdXNcIik7XHJcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZC5sZW5ndGggJiYgY2hvaWNlICYmIGNob2ljZVswXSA9PSBzZWxlY3RlZFswXSkge1xyXG5cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZC5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdHMuZWxlbWVudC50cmlnZ2VyKFwiY2hvaWNlLWRlc2VsZWN0ZWRcIiwgc2VsZWN0ZWQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWQucmVtb3ZlQ2xhc3MoXCJzZWxlY3QyLXNlYXJjaC1jaG9pY2UtZm9jdXNcIik7XHJcbiAgICAgICAgICAgICAgICBpZiAoY2hvaWNlICYmIGNob2ljZS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsb3NlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY2hvaWNlLmFkZENsYXNzKFwic2VsZWN0Mi1zZWFyY2gtY2hvaWNlLWZvY3VzXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3B0cy5lbGVtZW50LnRyaWdnZXIoXCJjaG9pY2Utc2VsZWN0ZWRcIiwgY2hvaWNlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIG11bHRpXHJcbiAgICAgICAgZGVzdHJveTogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICQoXCJsYWJlbFtmb3I9J1wiICsgdGhpcy5zZWFyY2guYXR0cignaWQnKSArIFwiJ11cIilcclxuICAgICAgICAgICAgICAgIC5hdHRyKCdmb3InLCB0aGlzLm9wdHMuZWxlbWVudC5hdHRyKFwiaWRcIikpO1xyXG4gICAgICAgICAgICB0aGlzLnBhcmVudC5kZXN0cm95LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gbXVsdGlcclxuICAgICAgICBpbml0Q29udGFpbmVyOiBmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgICAgICAgICB2YXIgc2VsZWN0b3IgPSBcIi5zZWxlY3QyLWNob2ljZXNcIiwgc2VsZWN0aW9uO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5zZWFyY2hDb250YWluZXIgPSB0aGlzLmNvbnRhaW5lci5maW5kKFwiLnNlbGVjdDItc2VhcmNoLWZpZWxkXCIpO1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbiA9IHRoaXMuY29udGFpbmVyLmZpbmQoc2VsZWN0b3IpO1xyXG5cclxuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24ub24oXCJjbGlja1wiLCBcIi5zZWxlY3QyLXNlYXJjaC1jaG9pY2VcIiwgZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgICAgIC8va2lsbEV2ZW50KGUpO1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuc2VhcmNoWzBdLmZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5zZWxlY3RDaG9pY2UoJCh0aGlzKSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgLy8gcmV3cml0ZSBsYWJlbHMgZnJvbSBvcmlnaW5hbCBlbGVtZW50IHRvIGZvY3Vzc2VyXHJcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoLmF0dHIoXCJpZFwiLCBcInMyaWRfYXV0b2dlblwiK25leHRVaWQoKSk7XHJcbiAgICAgICAgICAgICQoXCJsYWJlbFtmb3I9J1wiICsgdGhpcy5vcHRzLmVsZW1lbnQuYXR0cihcImlkXCIpICsgXCInXVwiKVxyXG4gICAgICAgICAgICAgICAgLmF0dHIoJ2ZvcicsIHRoaXMuc2VhcmNoLmF0dHIoJ2lkJykpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5zZWFyY2gub24oXCJpbnB1dCBwYXN0ZVwiLCB0aGlzLmJpbmQoZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNJbnRlcmZhY2VFbmFibGVkKCkpIHJldHVybjtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcGVuZWQoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3BlbigpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNlYXJjaC5hdHRyKFwidGFiaW5kZXhcIiwgdGhpcy5lbGVtZW50VGFiSW5kZXgpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5rZXlkb3ducyA9IDA7XHJcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoLm9uKFwia2V5ZG93blwiLCB0aGlzLmJpbmQoZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc0ludGVyZmFjZUVuYWJsZWQoKSkgcmV0dXJuO1xyXG5cclxuICAgICAgICAgICAgICAgICsrdGhpcy5rZXlkb3ducztcclxuICAgICAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IHNlbGVjdGlvbi5maW5kKFwiLnNlbGVjdDItc2VhcmNoLWNob2ljZS1mb2N1c1wiKTtcclxuICAgICAgICAgICAgICAgIHZhciBwcmV2ID0gc2VsZWN0ZWQucHJldihcIi5zZWxlY3QyLXNlYXJjaC1jaG9pY2U6bm90KC5zZWxlY3QyLWxvY2tlZClcIik7XHJcbiAgICAgICAgICAgICAgICB2YXIgbmV4dCA9IHNlbGVjdGVkLm5leHQoXCIuc2VsZWN0Mi1zZWFyY2gtY2hvaWNlOm5vdCguc2VsZWN0Mi1sb2NrZWQpXCIpO1xyXG4gICAgICAgICAgICAgICAgdmFyIHBvcyA9IGdldEN1cnNvckluZm8odGhpcy5zZWFyY2gpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZC5sZW5ndGggJiZcclxuICAgICAgICAgICAgICAgICAgICAoZS53aGljaCA9PSBLRVkuTEVGVCB8fCBlLndoaWNoID09IEtFWS5SSUdIVCB8fCBlLndoaWNoID09IEtFWS5CQUNLU1BBQ0UgfHwgZS53aGljaCA9PSBLRVkuREVMRVRFIHx8IGUud2hpY2ggPT0gS0VZLkVOVEVSKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBzZWxlY3RlZENob2ljZSA9IHNlbGVjdGVkO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlLndoaWNoID09IEtFWS5MRUZUICYmIHByZXYubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkQ2hvaWNlID0gcHJldjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZS53aGljaCA9PSBLRVkuUklHSFQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRDaG9pY2UgPSBuZXh0Lmxlbmd0aCA/IG5leHQgOiBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChlLndoaWNoID09PSBLRVkuQkFDS1NQQUNFKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudW5zZWxlY3Qoc2VsZWN0ZWQuZmlyc3QoKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoLndpZHRoKDEwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRDaG9pY2UgPSBwcmV2Lmxlbmd0aCA/IHByZXYgOiBuZXh0O1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS53aGljaCA9PSBLRVkuREVMRVRFKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudW5zZWxlY3Qoc2VsZWN0ZWQuZmlyc3QoKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoLndpZHRoKDEwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRDaG9pY2UgPSBuZXh0Lmxlbmd0aCA/IG5leHQgOiBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS53aGljaCA9PSBLRVkuRU5URVIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRDaG9pY2UgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RDaG9pY2Uoc2VsZWN0ZWRDaG9pY2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIGtpbGxFdmVudChlKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGVjdGVkQ2hvaWNlIHx8ICFzZWxlY3RlZENob2ljZS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcGVuKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKChlLndoaWNoID09PSBLRVkuQkFDS1NQQUNFICYmIHRoaXMua2V5ZG93bnMgPT0gMSlcclxuICAgICAgICAgICAgICAgICAgICB8fCBlLndoaWNoID09IEtFWS5MRUZUKSAmJiAocG9zLm9mZnNldCA9PSAwICYmICFwb3MubGVuZ3RoKSkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdENob2ljZShzZWxlY3Rpb24uZmluZChcIi5zZWxlY3QyLXNlYXJjaC1jaG9pY2U6bm90KC5zZWxlY3QyLWxvY2tlZClcIikubGFzdCgpKTtcclxuICAgICAgICAgICAgICAgICAgICBraWxsRXZlbnQoZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdENob2ljZShudWxsKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcGVuZWQoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZS53aGljaCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgS0VZLlVQOlxyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgS0VZLkRPV046XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW92ZUhpZ2hsaWdodCgoZS53aGljaCA9PT0gS0VZLlVQKSA/IC0xIDogMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGtpbGxFdmVudChlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgS0VZLkVOVEVSOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdEhpZ2hsaWdodGVkKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGtpbGxFdmVudChlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgS0VZLlRBQjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgc2VsZWN0T25CbHVyID09IHRydWUsIHNlbGVjdCB0aGUgY3VycmVudGx5IGhpZ2hsaWdodGVkIG9wdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRzLnNlbGVjdE9uQmx1cikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RIaWdobGlnaHRlZCh7bm9Gb2N1czp0cnVlfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBLRVkuRVNDOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbmNlbChlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAga2lsbEV2ZW50KGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChlLndoaWNoID09PSBLRVkuVEFCIHx8IEtFWS5pc0NvbnRyb2woZSkgfHwgS0VZLmlzRnVuY3Rpb25LZXkoZSlcclxuICAgICAgICAgICAgICAgICB8fCBlLndoaWNoID09PSBLRVkuQkFDS1NQQUNFIHx8IGUud2hpY2ggPT09IEtFWS5FU0MpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGUud2hpY2ggPT09IEtFWS5FTlRFUikge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdHMub3Blbk9uRW50ZXIgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUuYWx0S2V5IHx8IGUuY3RybEtleSB8fCBlLnNoaWZ0S2V5IHx8IGUubWV0YUtleSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMub3BlbigpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChlLndoaWNoID09PSBLRVkuUEFHRV9VUCB8fCBlLndoaWNoID09PSBLRVkuUEFHRV9ET1dOKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gcHJldmVudCB0aGUgcGFnZSBmcm9tIHNjcm9sbGluZ1xyXG4gICAgICAgICAgICAgICAgICAgIGtpbGxFdmVudChlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZS53aGljaCA9PT0gS0VZLkVOVEVSKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gcHJldmVudCBmb3JtIGZyb20gYmVpbmcgc3VibWl0dGVkXHJcbiAgICAgICAgICAgICAgICAgICAga2lsbEV2ZW50KGUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgfSkpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5zZWFyY2gub24oXCJrZXl1cFwiLCB0aGlzLmJpbmQoZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMua2V5ZG93bnMgPSAwO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZXNpemVTZWFyY2goKTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoLm9uKFwiYmx1clwiLCB0aGlzLmJpbmQoZnVuY3Rpb24oZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb250YWluZXIucmVtb3ZlQ2xhc3MoXCJzZWxlY3QyLWNvbnRhaW5lci1hY3RpdmVcIik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaC5yZW1vdmVDbGFzcyhcInNlbGVjdDItZm9jdXNlZFwiKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0Q2hvaWNlKG51bGwpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wZW5lZCgpKSB0aGlzLmNsZWFyU2VhcmNoKCk7XHJcbiAgICAgICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vcHRzLmVsZW1lbnQudHJpZ2dlcigkLkV2ZW50KFwic2VsZWN0Mi1ibHVyXCIpKTtcclxuICAgICAgICAgICAgfSkpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5jb250YWluZXIub24oXCJjbGlja1wiLCBzZWxlY3RvciwgdGhpcy5iaW5kKGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNJbnRlcmZhY2VFbmFibGVkKCkpIHJldHVybjtcclxuICAgICAgICAgICAgICAgIGlmICgkKGUudGFyZ2V0KS5jbG9zZXN0KFwiLnNlbGVjdDItc2VhcmNoLWNob2ljZVwiKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gY2xpY2tlZCBpbnNpZGUgYSBzZWxlY3QyIHNlYXJjaCBjaG9pY2UsIGRvIG5vdCBvcGVuXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RDaG9pY2UobnVsbCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNsZWFyUGxhY2Vob2xkZXIoKTtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5jb250YWluZXIuaGFzQ2xhc3MoXCJzZWxlY3QyLWNvbnRhaW5lci1hY3RpdmVcIikpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdHMuZWxlbWVudC50cmlnZ2VyKCQuRXZlbnQoXCJzZWxlY3QyLWZvY3VzXCIpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMub3BlbigpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5mb2N1c1NlYXJjaCgpO1xyXG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICB9KSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5vbihcImZvY3VzXCIsIHNlbGVjdG9yLCB0aGlzLmJpbmQoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzSW50ZXJmYWNlRW5hYmxlZCgpKSByZXR1cm47XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY29udGFpbmVyLmhhc0NsYXNzKFwic2VsZWN0Mi1jb250YWluZXItYWN0aXZlXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRzLmVsZW1lbnQudHJpZ2dlcigkLkV2ZW50KFwic2VsZWN0Mi1mb2N1c1wiKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5hZGRDbGFzcyhcInNlbGVjdDItY29udGFpbmVyLWFjdGl2ZVwiKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZHJvcGRvd24uYWRkQ2xhc3MoXCJzZWxlY3QyLWRyb3AtYWN0aXZlXCIpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jbGVhclBsYWNlaG9sZGVyKCk7XHJcbiAgICAgICAgICAgIH0pKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuaW5pdENvbnRhaW5lcldpZHRoKCk7XHJcbiAgICAgICAgICAgIHRoaXMub3B0cy5lbGVtZW50LmFkZENsYXNzKFwic2VsZWN0Mi1vZmZzY3JlZW5cIik7XHJcblxyXG4gICAgICAgICAgICAvLyBzZXQgdGhlIHBsYWNlaG9sZGVyIGlmIG5lY2Vzc2FyeVxyXG4gICAgICAgICAgICB0aGlzLmNsZWFyU2VhcmNoKCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gbXVsdGlcclxuICAgICAgICBlbmFibGVJbnRlcmZhY2U6IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5wYXJlbnQuZW5hYmxlSW50ZXJmYWNlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoLnByb3AoXCJkaXNhYmxlZFwiLCAhdGhpcy5pc0ludGVyZmFjZUVuYWJsZWQoKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBtdWx0aVxyXG4gICAgICAgIGluaXRTZWxlY3Rpb246IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIGRhdGE7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdHMuZWxlbWVudC52YWwoKSA9PT0gXCJcIiAmJiB0aGlzLm9wdHMuZWxlbWVudC50ZXh0KCkgPT09IFwiXCIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU2VsZWN0aW9uKFtdKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcclxuICAgICAgICAgICAgICAgIC8vIHNldCB0aGUgcGxhY2Vob2xkZXIgaWYgbmVjZXNzYXJ5XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNsZWFyU2VhcmNoKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0IHx8IHRoaXMub3B0cy5lbGVtZW50LnZhbCgpICE9PSBcIlwiKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9wdHMuaW5pdFNlbGVjdGlvbi5jYWxsKG51bGwsIHRoaXMub3B0cy5lbGVtZW50LCBmdW5jdGlvbihkYXRhKXtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YSAhPT0gdW5kZWZpbmVkICYmIGRhdGEgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi51cGRhdGVTZWxlY3Rpb24oZGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2xvc2UoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHRoZSBwbGFjZWhvbGRlciBpZiBuZWNlc3NhcnlcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jbGVhclNlYXJjaCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gbXVsdGlcclxuICAgICAgICBjbGVhclNlYXJjaDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgcGxhY2Vob2xkZXIgPSB0aGlzLmdldFBsYWNlaG9sZGVyKCksXHJcbiAgICAgICAgICAgICAgICBtYXhXaWR0aCA9IHRoaXMuZ2V0TWF4U2VhcmNoV2lkdGgoKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChwbGFjZWhvbGRlciAhPT0gdW5kZWZpbmVkICAmJiB0aGlzLmdldFZhbCgpLmxlbmd0aCA9PT0gMCAmJiB0aGlzLnNlYXJjaC5oYXNDbGFzcyhcInNlbGVjdDItZm9jdXNlZFwiKSA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoLnZhbChwbGFjZWhvbGRlcikuYWRkQ2xhc3MoXCJzZWxlY3QyLWRlZmF1bHRcIik7XHJcbiAgICAgICAgICAgICAgICAvLyBzdHJldGNoIHRoZSBzZWFyY2ggYm94IHRvIGZ1bGwgd2lkdGggb2YgdGhlIGNvbnRhaW5lciBzbyBhcyBtdWNoIG9mIHRoZSBwbGFjZWhvbGRlciBpcyB2aXNpYmxlIGFzIHBvc3NpYmxlXHJcbiAgICAgICAgICAgICAgICAvLyB3ZSBjb3VsZCBjYWxsIHRoaXMucmVzaXplU2VhcmNoKCksIGJ1dCB3ZSBkbyBub3QgYmVjYXVzZSB0aGF0IHJlcXVpcmVzIGEgc2l6ZXIgYW5kIHdlIGRvIG5vdCB3YW50IHRvIGNyZWF0ZSBvbmUgc28gZWFybHkgYmVjYXVzZSBvZiBhIGZpcmVmb3ggYnVnLCBzZWUgIzk0NFxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWFyY2gud2lkdGgobWF4V2lkdGggPiAwID8gbWF4V2lkdGggOiB0aGlzLmNvbnRhaW5lci5jc3MoXCJ3aWR0aFwiKSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaC52YWwoXCJcIikud2lkdGgoMTApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gbXVsdGlcclxuICAgICAgICBjbGVhclBsYWNlaG9sZGVyOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNlYXJjaC5oYXNDbGFzcyhcInNlbGVjdDItZGVmYXVsdFwiKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWFyY2gudmFsKFwiXCIpLnJlbW92ZUNsYXNzKFwic2VsZWN0Mi1kZWZhdWx0XCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gbXVsdGlcclxuICAgICAgICBvcGVuaW5nOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2xlYXJQbGFjZWhvbGRlcigpOyAvLyBzaG91bGQgYmUgZG9uZSBiZWZvcmUgc3VwZXIgc28gcGxhY2Vob2xkZXIgaXMgbm90IHVzZWQgdG8gc2VhcmNoXHJcbiAgICAgICAgICAgIHRoaXMucmVzaXplU2VhcmNoKCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnBhcmVudC5vcGVuaW5nLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmZvY3VzU2VhcmNoKCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVJlc3VsdHModHJ1ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoLmZvY3VzKCk7XHJcbiAgICAgICAgICAgIHRoaXMub3B0cy5lbGVtZW50LnRyaWdnZXIoJC5FdmVudChcInNlbGVjdDItb3BlblwiKSk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gbXVsdGlcclxuICAgICAgICBjbG9zZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMub3BlbmVkKCkpIHJldHVybjtcclxuICAgICAgICAgICAgdGhpcy5wYXJlbnQuY2xvc2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBtdWx0aVxyXG4gICAgICAgIGZvY3VzOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcclxuICAgICAgICAgICAgdGhpcy5zZWFyY2guZm9jdXMoKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBtdWx0aVxyXG4gICAgICAgIGlzRm9jdXNlZDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZWFyY2guaGFzQ2xhc3MoXCJzZWxlY3QyLWZvY3VzZWRcIik7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gbXVsdGlcclxuICAgICAgICB1cGRhdGVTZWxlY3Rpb246IGZ1bmN0aW9uIChkYXRhKSB7XHJcbiAgICAgICAgICAgIHZhciBpZHMgPSBbXSwgZmlsdGVyZWQgPSBbXSwgc2VsZiA9IHRoaXM7XHJcblxyXG4gICAgICAgICAgICAvLyBmaWx0ZXIgb3V0IGR1cGxpY2F0ZXNcclxuICAgICAgICAgICAgJChkYXRhKS5lYWNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIGlmIChpbmRleE9mKHNlbGYuaWQodGhpcyksIGlkcykgPCAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWRzLnB1c2goc2VsZi5pZCh0aGlzKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWQucHVzaCh0aGlzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGRhdGEgPSBmaWx0ZXJlZDtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLmZpbmQoXCIuc2VsZWN0Mi1zZWFyY2gtY2hvaWNlXCIpLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAkKGRhdGEpLmVhY2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgc2VsZi5hZGRTZWxlY3RlZENob2ljZSh0aGlzKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHNlbGYucG9zdHByb2Nlc3NSZXN1bHRzKCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gbXVsdGlcclxuICAgICAgICB0b2tlbml6ZTogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIHZhciBpbnB1dCA9IHRoaXMuc2VhcmNoLnZhbCgpO1xyXG4gICAgICAgICAgICBpbnB1dCA9IHRoaXMub3B0cy50b2tlbml6ZXIuY2FsbCh0aGlzLCBpbnB1dCwgdGhpcy5kYXRhKCksIHRoaXMuYmluZCh0aGlzLm9uU2VsZWN0KSwgdGhpcy5vcHRzKTtcclxuICAgICAgICAgICAgaWYgKGlucHV0ICE9IG51bGwgJiYgaW5wdXQgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaC52YWwoaW5wdXQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGlucHV0Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wZW4oKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBtdWx0aVxyXG4gICAgICAgIG9uU2VsZWN0OiBmdW5jdGlvbiAoZGF0YSwgb3B0aW9ucykge1xyXG5cclxuICAgICAgICAgICAgaWYgKCF0aGlzLnRyaWdnZXJTZWxlY3QoZGF0YSkpIHsgcmV0dXJuOyB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmFkZFNlbGVjdGVkQ2hvaWNlKGRhdGEpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5vcHRzLmVsZW1lbnQudHJpZ2dlcih7IHR5cGU6IFwic2VsZWN0ZWRcIiwgdmFsOiB0aGlzLmlkKGRhdGEpLCBjaG9pY2U6IGRhdGEgfSk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3QgfHwgIXRoaXMub3B0cy5jbG9zZU9uU2VsZWN0KSB0aGlzLnBvc3Rwcm9jZXNzUmVzdWx0cyhkYXRhLCBmYWxzZSwgdGhpcy5vcHRzLmNsb3NlT25TZWxlY3Q9PT10cnVlKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdHMuY2xvc2VPblNlbGVjdCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWFyY2gud2lkdGgoMTApO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY291bnRTZWxlY3RhYmxlUmVzdWx0cygpPjApIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaC53aWR0aCgxMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNpemVTZWFyY2goKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5nZXRNYXhpbXVtU2VsZWN0aW9uU2l6ZSgpID4gMCAmJiB0aGlzLnZhbCgpLmxlbmd0aCA+PSB0aGlzLmdldE1heGltdW1TZWxlY3Rpb25TaXplKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgcmVhY2hlZCBtYXggc2VsZWN0aW9uIHNpemUgcmVwYWludCB0aGUgcmVzdWx0cyBzbyBjaG9pY2VzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFyZSByZXBsYWNlZCB3aXRoIHRoZSBtYXggc2VsZWN0aW9uIHJlYWNoZWQgbWVzc2FnZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVJlc3VsdHModHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucG9zaXRpb25Ecm9wZG93bigpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBpZiBub3RoaW5nIGxlZnQgdG8gc2VsZWN0IGNsb3NlXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoLndpZHRoKDEwKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gc2luY2UgaXRzIG5vdCBwb3NzaWJsZSB0byBzZWxlY3QgYW4gZWxlbWVudCB0aGF0IGhhcyBhbHJlYWR5IGJlZW5cclxuICAgICAgICAgICAgLy8gYWRkZWQgd2UgZG8gbm90IG5lZWQgdG8gY2hlY2sgaWYgdGhpcyBpcyBhIG5ldyBlbGVtZW50IGJlZm9yZSBmaXJpbmcgY2hhbmdlXHJcbiAgICAgICAgICAgIHRoaXMudHJpZ2dlckNoYW5nZSh7IGFkZGVkOiBkYXRhIH0pO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFvcHRpb25zIHx8ICFvcHRpb25zLm5vRm9jdXMpXHJcbiAgICAgICAgICAgICAgICB0aGlzLmZvY3VzU2VhcmNoKCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gbXVsdGlcclxuICAgICAgICBjYW5jZWw6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xyXG4gICAgICAgICAgICB0aGlzLmZvY3VzU2VhcmNoKCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgYWRkU2VsZWN0ZWRDaG9pY2U6IGZ1bmN0aW9uIChkYXRhKSB7XHJcbiAgICAgICAgICAgIHZhciBlbmFibGVDaG9pY2UgPSAhZGF0YS5sb2NrZWQsXHJcbiAgICAgICAgICAgICAgICBlbmFibGVkSXRlbSA9ICQoXHJcbiAgICAgICAgICAgICAgICAgICAgXCI8bGkgY2xhc3M9J3NlbGVjdDItc2VhcmNoLWNob2ljZSc+XCIgK1xyXG4gICAgICAgICAgICAgICAgICAgIFwiICAgIDxkaXY+PC9kaXY+XCIgK1xyXG4gICAgICAgICAgICAgICAgICAgIFwiICAgIDxhIGhyZWY9JyMnIG9uY2xpY2s9J3JldHVybiBmYWxzZTsnIGNsYXNzPSdzZWxlY3QyLXNlYXJjaC1jaG9pY2UtY2xvc2UnIHRhYmluZGV4PSctMSc+PC9hPlwiICtcclxuICAgICAgICAgICAgICAgICAgICBcIjwvbGk+XCIpLFxyXG4gICAgICAgICAgICAgICAgZGlzYWJsZWRJdGVtID0gJChcclxuICAgICAgICAgICAgICAgICAgICBcIjxsaSBjbGFzcz0nc2VsZWN0Mi1zZWFyY2gtY2hvaWNlIHNlbGVjdDItbG9ja2VkJz5cIiArXHJcbiAgICAgICAgICAgICAgICAgICAgXCI8ZGl2PjwvZGl2PlwiICtcclxuICAgICAgICAgICAgICAgICAgICBcIjwvbGk+XCIpO1xyXG4gICAgICAgICAgICB2YXIgY2hvaWNlID0gZW5hYmxlQ2hvaWNlID8gZW5hYmxlZEl0ZW0gOiBkaXNhYmxlZEl0ZW0sXHJcbiAgICAgICAgICAgICAgICBpZCA9IHRoaXMuaWQoZGF0YSksXHJcbiAgICAgICAgICAgICAgICB2YWwgPSB0aGlzLmdldFZhbCgpLFxyXG4gICAgICAgICAgICAgICAgZm9ybWF0dGVkLFxyXG4gICAgICAgICAgICAgICAgY3NzQ2xhc3M7XHJcblxyXG4gICAgICAgICAgICBmb3JtYXR0ZWQ9dGhpcy5vcHRzLmZvcm1hdFNlbGVjdGlvbihkYXRhLCBjaG9pY2UuZmluZChcImRpdlwiKSwgdGhpcy5vcHRzLmVzY2FwZU1hcmt1cCk7XHJcbiAgICAgICAgICAgIGlmIChmb3JtYXR0ZWQgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBjaG9pY2UuZmluZChcImRpdlwiKS5yZXBsYWNlV2l0aChcIjxkaXY+XCIrZm9ybWF0dGVkK1wiPC9kaXY+XCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNzc0NsYXNzPXRoaXMub3B0cy5mb3JtYXRTZWxlY3Rpb25Dc3NDbGFzcyhkYXRhLCBjaG9pY2UuZmluZChcImRpdlwiKSk7XHJcbiAgICAgICAgICAgIGlmIChjc3NDbGFzcyAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGNob2ljZS5hZGRDbGFzcyhjc3NDbGFzcyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmKGVuYWJsZUNob2ljZSl7XHJcbiAgICAgICAgICAgICAgY2hvaWNlLmZpbmQoXCIuc2VsZWN0Mi1zZWFyY2gtY2hvaWNlLWNsb3NlXCIpXHJcbiAgICAgICAgICAgICAgICAgIC5vbihcIm1vdXNlZG93blwiLCBraWxsRXZlbnQpXHJcbiAgICAgICAgICAgICAgICAgIC5vbihcImNsaWNrIGRibGNsaWNrXCIsIHRoaXMuYmluZChmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNJbnRlcmZhY2VFbmFibGVkKCkpIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgICAgICAgICQoZS50YXJnZXQpLmNsb3Nlc3QoXCIuc2VsZWN0Mi1zZWFyY2gtY2hvaWNlXCIpLmZhZGVPdXQoJ2Zhc3QnLCB0aGlzLmJpbmQoZnVuY3Rpb24oKXtcclxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMudW5zZWxlY3QoJChlLnRhcmdldCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uZmluZChcIi5zZWxlY3QyLXNlYXJjaC1jaG9pY2UtZm9jdXNcIikucmVtb3ZlQ2xhc3MoXCJzZWxlY3QyLXNlYXJjaC1jaG9pY2UtZm9jdXNcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNsb3NlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZvY3VzU2VhcmNoKCk7XHJcbiAgICAgICAgICAgICAgICAgIH0pKS5kZXF1ZXVlKCk7XHJcbiAgICAgICAgICAgICAgICAgIGtpbGxFdmVudChlKTtcclxuICAgICAgICAgICAgICB9KSkub24oXCJmb2N1c1wiLCB0aGlzLmJpbmQoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNJbnRlcmZhY2VFbmFibGVkKCkpIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5jb250YWluZXIuYWRkQ2xhc3MoXCJzZWxlY3QyLWNvbnRhaW5lci1hY3RpdmVcIik7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuZHJvcGRvd24uYWRkQ2xhc3MoXCJzZWxlY3QyLWRyb3AtYWN0aXZlXCIpO1xyXG4gICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY2hvaWNlLmRhdGEoXCJzZWxlY3QyLWRhdGFcIiwgZGF0YSk7XHJcbiAgICAgICAgICAgIGNob2ljZS5pbnNlcnRCZWZvcmUodGhpcy5zZWFyY2hDb250YWluZXIpO1xyXG5cclxuICAgICAgICAgICAgdmFsLnB1c2goaWQpO1xyXG4gICAgICAgICAgICB0aGlzLnNldFZhbCh2YWwpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIG11bHRpXHJcbiAgICAgICAgdW5zZWxlY3Q6IGZ1bmN0aW9uIChzZWxlY3RlZCkge1xyXG4gICAgICAgICAgICB2YXIgdmFsID0gdGhpcy5nZXRWYWwoKSxcclxuICAgICAgICAgICAgICAgIGRhdGEsXHJcbiAgICAgICAgICAgICAgICBpbmRleDtcclxuXHJcbiAgICAgICAgICAgIHNlbGVjdGVkID0gc2VsZWN0ZWQuY2xvc2VzdChcIi5zZWxlY3QyLXNlYXJjaC1jaG9pY2VcIik7XHJcblxyXG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWQubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBcIkludmFsaWQgYXJndW1lbnQ6IFwiICsgc2VsZWN0ZWQgKyBcIi4gTXVzdCBiZSAuc2VsZWN0Mi1zZWFyY2gtY2hvaWNlXCI7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGRhdGEgPSBzZWxlY3RlZC5kYXRhKFwic2VsZWN0Mi1kYXRhXCIpO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBwcmV2ZW50IGEgcmFjZSBjb25kaXRpb24gd2hlbiB0aGUgJ3gnIGlzIGNsaWNrZWQgcmVhbGx5IGZhc3QgcmVwZWF0ZWRseSB0aGUgZXZlbnQgY2FuIGJlIHF1ZXVlZFxyXG4gICAgICAgICAgICAgICAgLy8gYW5kIGludm9rZWQgb24gYW4gZWxlbWVudCBhbHJlYWR5IHJlbW92ZWRcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaW5kZXggPSBpbmRleE9mKHRoaXMuaWQoZGF0YSksIHZhbCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xyXG4gICAgICAgICAgICAgICAgdmFsLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldFZhbCh2YWwpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0KSB0aGlzLnBvc3Rwcm9jZXNzUmVzdWx0cygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHNlbGVjdGVkLnJlbW92ZSgpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5vcHRzLmVsZW1lbnQudHJpZ2dlcih7IHR5cGU6IFwicmVtb3ZlZFwiLCB2YWw6IHRoaXMuaWQoZGF0YSksIGNob2ljZTogZGF0YSB9KTtcclxuICAgICAgICAgICAgdGhpcy50cmlnZ2VyQ2hhbmdlKHsgcmVtb3ZlZDogZGF0YSB9KTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBtdWx0aVxyXG4gICAgICAgIHBvc3Rwcm9jZXNzUmVzdWx0czogZnVuY3Rpb24gKGRhdGEsIGluaXRpYWwsIG5vSGlnaGxpZ2h0VXBkYXRlKSB7XHJcbiAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLmdldFZhbCgpLFxyXG4gICAgICAgICAgICAgICAgY2hvaWNlcyA9IHRoaXMucmVzdWx0cy5maW5kKFwiLnNlbGVjdDItcmVzdWx0XCIpLFxyXG4gICAgICAgICAgICAgICAgY29tcG91bmQgPSB0aGlzLnJlc3VsdHMuZmluZChcIi5zZWxlY3QyLXJlc3VsdC13aXRoLWNoaWxkcmVuXCIpLFxyXG4gICAgICAgICAgICAgICAgc2VsZiA9IHRoaXM7XHJcblxyXG4gICAgICAgICAgICBjaG9pY2VzLmVhY2gyKGZ1bmN0aW9uIChpLCBjaG9pY2UpIHtcclxuICAgICAgICAgICAgICAgIHZhciBpZCA9IHNlbGYuaWQoY2hvaWNlLmRhdGEoXCJzZWxlY3QyLWRhdGFcIikpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGluZGV4T2YoaWQsIHZhbCkgPj0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNob2ljZS5hZGRDbGFzcyhcInNlbGVjdDItc2VsZWN0ZWRcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gbWFyayBhbGwgY2hpbGRyZW4gb2YgdGhlIHNlbGVjdGVkIHBhcmVudCBhcyBzZWxlY3RlZFxyXG4gICAgICAgICAgICAgICAgICAgIGNob2ljZS5maW5kKFwiLnNlbGVjdDItcmVzdWx0LXNlbGVjdGFibGVcIikuYWRkQ2xhc3MoXCJzZWxlY3QyLXNlbGVjdGVkXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIGNvbXBvdW5kLmVhY2gyKGZ1bmN0aW9uKGksIGNob2ljZSkge1xyXG4gICAgICAgICAgICAgICAgLy8gaGlkZSBhbiBvcHRncm91cCBpZiBpdCBkb2VzbnQgaGF2ZSBhbnkgc2VsZWN0YWJsZSBjaGlsZHJlblxyXG4gICAgICAgICAgICAgICAgaWYgKCFjaG9pY2UuaXMoJy5zZWxlY3QyLXJlc3VsdC1zZWxlY3RhYmxlJylcclxuICAgICAgICAgICAgICAgICAgICAmJiBjaG9pY2UuZmluZChcIi5zZWxlY3QyLXJlc3VsdC1zZWxlY3RhYmxlOm5vdCguc2VsZWN0Mi1zZWxlY3RlZClcIikubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2hvaWNlLmFkZENsYXNzKFwic2VsZWN0Mi1zZWxlY3RlZFwiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5oaWdobGlnaHQoKSA9PSAtMSAmJiBub0hpZ2hsaWdodFVwZGF0ZSAhPT0gZmFsc2Upe1xyXG4gICAgICAgICAgICAgICAgc2VsZi5oaWdobGlnaHQoMCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vSWYgYWxsIHJlc3VsdHMgYXJlIGNob3NlbiByZW5kZXIgZm9ybWF0Tm9NQXRjaGVzXHJcbiAgICAgICAgICAgIGlmKCF0aGlzLm9wdHMuY3JlYXRlU2VhcmNoQ2hvaWNlICYmICFjaG9pY2VzLmZpbHRlcignLnNlbGVjdDItcmVzdWx0Om5vdCguc2VsZWN0Mi1zZWxlY3RlZCknKS5sZW5ndGggPiAwKXtcclxuICAgICAgICAgICAgICAgIGlmKCFkYXRhIHx8IGRhdGEgJiYgIWRhdGEubW9yZSAmJiB0aGlzLnJlc3VsdHMuZmluZChcIi5zZWxlY3QyLW5vLXJlc3VsdHNcIikubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoZWNrRm9ybWF0dGVyKHNlbGYub3B0cy5mb3JtYXROb01hdGNoZXMsIFwiZm9ybWF0Tm9NYXRjaGVzXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVzdWx0cy5hcHBlbmQoXCI8bGkgY2xhc3M9J3NlbGVjdDItbm8tcmVzdWx0cyc+XCIgKyBzZWxmLm9wdHMuZm9ybWF0Tm9NYXRjaGVzKHNlbGYuc2VhcmNoLnZhbCgpKSArIFwiPC9saT5cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIG11bHRpXHJcbiAgICAgICAgZ2V0TWF4U2VhcmNoV2lkdGg6IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb24ud2lkdGgoKSAtIGdldFNpZGVCb3JkZXJQYWRkaW5nKHRoaXMuc2VhcmNoKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBtdWx0aVxyXG4gICAgICAgIHJlc2l6ZVNlYXJjaDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgbWluaW11bVdpZHRoLCBsZWZ0LCBtYXhXaWR0aCwgY29udGFpbmVyTGVmdCwgc2VhcmNoV2lkdGgsXHJcbiAgICAgICAgICAgICAgICBzaWRlQm9yZGVyUGFkZGluZyA9IGdldFNpZGVCb3JkZXJQYWRkaW5nKHRoaXMuc2VhcmNoKTtcclxuXHJcbiAgICAgICAgICAgIG1pbmltdW1XaWR0aCA9IG1lYXN1cmVUZXh0V2lkdGgodGhpcy5zZWFyY2gpICsgMTA7XHJcblxyXG4gICAgICAgICAgICBsZWZ0ID0gdGhpcy5zZWFyY2gub2Zmc2V0KCkubGVmdDtcclxuXHJcbiAgICAgICAgICAgIG1heFdpZHRoID0gdGhpcy5zZWxlY3Rpb24ud2lkdGgoKTtcclxuICAgICAgICAgICAgY29udGFpbmVyTGVmdCA9IHRoaXMuc2VsZWN0aW9uLm9mZnNldCgpLmxlZnQ7XHJcblxyXG4gICAgICAgICAgICBzZWFyY2hXaWR0aCA9IG1heFdpZHRoIC0gKGxlZnQgLSBjb250YWluZXJMZWZ0KSAtIHNpZGVCb3JkZXJQYWRkaW5nO1xyXG5cclxuICAgICAgICAgICAgaWYgKHNlYXJjaFdpZHRoIDwgbWluaW11bVdpZHRoKSB7XHJcbiAgICAgICAgICAgICAgICBzZWFyY2hXaWR0aCA9IG1heFdpZHRoIC0gc2lkZUJvcmRlclBhZGRpbmc7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChzZWFyY2hXaWR0aCA8IDQwKSB7XHJcbiAgICAgICAgICAgICAgICBzZWFyY2hXaWR0aCA9IG1heFdpZHRoIC0gc2lkZUJvcmRlclBhZGRpbmc7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChzZWFyY2hXaWR0aCA8PSAwKSB7XHJcbiAgICAgICAgICAgICAgc2VhcmNoV2lkdGggPSBtaW5pbXVtV2lkdGg7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoLndpZHRoKHNlYXJjaFdpZHRoKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBtdWx0aVxyXG4gICAgICAgIGdldFZhbDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgdmFsO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3QpIHtcclxuICAgICAgICAgICAgICAgIHZhbCA9IHRoaXMuc2VsZWN0LnZhbCgpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbCA9PT0gbnVsbCA/IFtdIDogdmFsO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdmFsID0gdGhpcy5vcHRzLmVsZW1lbnQudmFsKCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gc3BsaXRWYWwodmFsLCB0aGlzLm9wdHMuc2VwYXJhdG9yKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIG11bHRpXHJcbiAgICAgICAgc2V0VmFsOiBmdW5jdGlvbiAodmFsKSB7XHJcbiAgICAgICAgICAgIHZhciB1bmlxdWU7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3QudmFsKHZhbCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB1bmlxdWUgPSBbXTtcclxuICAgICAgICAgICAgICAgIC8vIGZpbHRlciBvdXQgZHVwbGljYXRlc1xyXG4gICAgICAgICAgICAgICAgJCh2YWwpLmVhY2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleE9mKHRoaXMsIHVuaXF1ZSkgPCAwKSB1bmlxdWUucHVzaCh0aGlzKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vcHRzLmVsZW1lbnQudmFsKHVuaXF1ZS5sZW5ndGggPT09IDAgPyBcIlwiIDogdW5pcXVlLmpvaW4odGhpcy5vcHRzLnNlcGFyYXRvcikpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gbXVsdGlcclxuICAgICAgICBidWlsZENoYW5nZURldGFpbHM6IGZ1bmN0aW9uIChvbGQsIGN1cnJlbnQpIHtcclxuICAgICAgICAgICAgdmFyIGN1cnJlbnQgPSBjdXJyZW50LnNsaWNlKDApLFxyXG4gICAgICAgICAgICAgICAgb2xkID0gb2xkLnNsaWNlKDApO1xyXG5cclxuICAgICAgICAgICAgLy8gcmVtb3ZlIGludGVyc2VjdGlvbiBmcm9tIGVhY2ggYXJyYXlcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjdXJyZW50Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG9sZC5sZW5ndGg7IGorKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlcXVhbCh0aGlzLm9wdHMuaWQoY3VycmVudFtpXSksIHRoaXMub3B0cy5pZChvbGRbal0pKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50LnNwbGljZShpLCAxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaS0tO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvbGQuc3BsaWNlKGosIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBqLS07XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4ge2FkZGVkOiBjdXJyZW50LCByZW1vdmVkOiBvbGR9O1xyXG4gICAgICAgIH0sXHJcblxyXG5cclxuICAgICAgICAvLyBtdWx0aVxyXG4gICAgICAgIHZhbDogZnVuY3Rpb24gKHZhbCwgdHJpZ2dlckNoYW5nZSkge1xyXG4gICAgICAgICAgICB2YXIgb2xkRGF0YSwgc2VsZj10aGlzLCBjaGFuZ2VEZXRhaWxzO1xyXG5cclxuICAgICAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldFZhbCgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBvbGREYXRhPXRoaXMuZGF0YSgpO1xyXG4gICAgICAgICAgICBpZiAoIW9sZERhdGEubGVuZ3RoKSBvbGREYXRhPVtdO1xyXG5cclxuICAgICAgICAgICAgLy8gdmFsIGlzIGFuIGlkLiAhdmFsIGlzIHRydWUgZm9yIFt1bmRlZmluZWQsbnVsbCwnJywwXSAtIDAgaXMgbGVnYWxcclxuICAgICAgICAgICAgaWYgKCF2YWwgJiYgdmFsICE9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9wdHMuZWxlbWVudC52YWwoXCJcIik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVNlbGVjdGlvbihbXSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNsZWFyU2VhcmNoKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAodHJpZ2dlckNoYW5nZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlckNoYW5nZSh7YWRkZWQ6IHRoaXMuZGF0YSgpLCByZW1vdmVkOiBvbGREYXRhfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIHZhbCBpcyBhIGxpc3Qgb2YgaWRzXHJcbiAgICAgICAgICAgIHRoaXMuc2V0VmFsKHZhbCk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3QpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMub3B0cy5pbml0U2VsZWN0aW9uKHRoaXMuc2VsZWN0LCB0aGlzLmJpbmQodGhpcy51cGRhdGVTZWxlY3Rpb24pKTtcclxuICAgICAgICAgICAgICAgIGlmICh0cmlnZ2VyQ2hhbmdlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyQ2hhbmdlKHRoaXMuYnVpbGRDaGFuZ2VEZXRhaWxzKG9sZERhdGEsIHRoaXMuZGF0YSgpKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRzLmluaXRTZWxlY3Rpb24gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInZhbCgpIGNhbm5vdCBiZSBjYWxsZWQgaWYgaW5pdFNlbGVjdGlvbigpIGlzIG5vdCBkZWZpbmVkXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMub3B0cy5pbml0U2VsZWN0aW9uKHRoaXMub3B0cy5lbGVtZW50LCBmdW5jdGlvbihkYXRhKXtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgaWRzPSQubWFwKGRhdGEsIHNlbGYuaWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0VmFsKGlkcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi51cGRhdGVTZWxlY3Rpb24oZGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5jbGVhclNlYXJjaCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0cmlnZ2VyQ2hhbmdlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlckNoYW5nZShzZWxmLmJ1aWxkQ2hhbmdlRGV0YWlscyhvbGREYXRhLCB0aGlzLmRhdGEoKSkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuY2xlYXJTZWFyY2goKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBtdWx0aVxyXG4gICAgICAgIG9uU29ydFN0YXJ0OiBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0KSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTb3J0aW5nIG9mIGVsZW1lbnRzIGlzIG5vdCBzdXBwb3J0ZWQgd2hlbiBhdHRhY2hlZCB0byA8c2VsZWN0Pi4gQXR0YWNoIHRvIDxpbnB1dCB0eXBlPSdoaWRkZW4nLz4gaW5zdGVhZC5cIik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIGNvbGxhcHNlIHNlYXJjaCBmaWVsZCBpbnRvIDAgd2lkdGggc28gaXRzIGNvbnRhaW5lciBjYW4gYmUgY29sbGFwc2VkIGFzIHdlbGxcclxuICAgICAgICAgICAgdGhpcy5zZWFyY2gud2lkdGgoMCk7XHJcbiAgICAgICAgICAgIC8vIGhpZGUgdGhlIGNvbnRhaW5lclxyXG4gICAgICAgICAgICB0aGlzLnNlYXJjaENvbnRhaW5lci5oaWRlKCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gbXVsdGlcclxuICAgICAgICBvblNvcnRFbmQ6ZnVuY3Rpb24oKSB7XHJcblxyXG4gICAgICAgICAgICB2YXIgdmFsPVtdLCBzZWxmPXRoaXM7XHJcblxyXG4gICAgICAgICAgICAvLyBzaG93IHNlYXJjaCBhbmQgbW92ZSBpdCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0XHJcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoQ29udGFpbmVyLnNob3coKTtcclxuICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSBzZWFyY2ggY29udGFpbmVyIGlzIHRoZSBsYXN0IGl0ZW0gaW4gdGhlIGxpc3RcclxuICAgICAgICAgICAgdGhpcy5zZWFyY2hDb250YWluZXIuYXBwZW5kVG8odGhpcy5zZWFyY2hDb250YWluZXIucGFyZW50KCkpO1xyXG4gICAgICAgICAgICAvLyBzaW5jZSB3ZSBjb2xsYXBzZWQgdGhlIHdpZHRoIGluIGRyYWdTdGFydGVkLCB3ZSByZXNpemUgaXQgaGVyZVxyXG4gICAgICAgICAgICB0aGlzLnJlc2l6ZVNlYXJjaCgpO1xyXG5cclxuICAgICAgICAgICAgLy8gdXBkYXRlIHNlbGVjdGlvblxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5maW5kKFwiLnNlbGVjdDItc2VhcmNoLWNob2ljZVwiKS5lYWNoKGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgdmFsLnB1c2goc2VsZi5vcHRzLmlkKCQodGhpcykuZGF0YShcInNlbGVjdDItZGF0YVwiKSkpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5zZXRWYWwodmFsKTtcclxuICAgICAgICAgICAgdGhpcy50cmlnZ2VyQ2hhbmdlKCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gbXVsdGlcclxuICAgICAgICBkYXRhOiBmdW5jdGlvbih2YWx1ZXMsIHRyaWdnZXJDaGFuZ2UpIHtcclxuICAgICAgICAgICAgdmFyIHNlbGY9dGhpcywgaWRzLCBvbGQ7XHJcbiAgICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgIC5maW5kKFwiLnNlbGVjdDItc2VhcmNoLWNob2ljZVwiKVxyXG4gICAgICAgICAgICAgICAgICAgICAubWFwKGZ1bmN0aW9uKCkgeyByZXR1cm4gJCh0aGlzKS5kYXRhKFwic2VsZWN0Mi1kYXRhXCIpOyB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAuZ2V0KCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBvbGQgPSB0aGlzLmRhdGEoKTtcclxuICAgICAgICAgICAgICAgIGlmICghdmFsdWVzKSB7IHZhbHVlcyA9IFtdOyB9XHJcbiAgICAgICAgICAgICAgICBpZHMgPSAkLm1hcCh2YWx1ZXMsIGZ1bmN0aW9uKGUpIHsgcmV0dXJuIHNlbGYub3B0cy5pZChlKTsgfSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldFZhbChpZHMpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTZWxlY3Rpb24odmFsdWVzKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJTZWFyY2goKTtcclxuICAgICAgICAgICAgICAgIGlmICh0cmlnZ2VyQ2hhbmdlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyQ2hhbmdlKHRoaXMuYnVpbGRDaGFuZ2VEZXRhaWxzKG9sZCwgdGhpcy5kYXRhKCkpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgICQuZm4uc2VsZWN0MiA9IGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDApLFxyXG4gICAgICAgICAgICBvcHRzLFxyXG4gICAgICAgICAgICBzZWxlY3QyLFxyXG4gICAgICAgICAgICBtZXRob2QsIHZhbHVlLCBtdWx0aXBsZSxcclxuICAgICAgICAgICAgYWxsb3dlZE1ldGhvZHMgPSBbXCJ2YWxcIiwgXCJkZXN0cm95XCIsIFwib3BlbmVkXCIsIFwib3BlblwiLCBcImNsb3NlXCIsIFwiZm9jdXNcIiwgXCJpc0ZvY3VzZWRcIiwgXCJjb250YWluZXJcIiwgXCJkcm9wZG93blwiLCBcIm9uU29ydFN0YXJ0XCIsIFwib25Tb3J0RW5kXCIsIFwiZW5hYmxlXCIsIFwiZGlzYWJsZVwiLCBcInJlYWRvbmx5XCIsIFwicG9zaXRpb25Ecm9wZG93blwiLCBcImRhdGFcIiwgXCJzZWFyY2hcIl0sXHJcbiAgICAgICAgICAgIHZhbHVlTWV0aG9kcyA9IFtcIm9wZW5lZFwiLCBcImlzRm9jdXNlZFwiLCBcImNvbnRhaW5lclwiLCBcImRyb3Bkb3duXCJdLFxyXG4gICAgICAgICAgICBwcm9wZXJ0eU1ldGhvZHMgPSBbXCJ2YWxcIiwgXCJkYXRhXCJdLFxyXG4gICAgICAgICAgICBtZXRob2RzTWFwID0geyBzZWFyY2g6IFwiZXh0ZXJuYWxTZWFyY2hcIiB9O1xyXG5cclxuICAgICAgICB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPT09IDAgfHwgdHlwZW9mKGFyZ3NbMF0pID09PSBcIm9iamVjdFwiKSB7XHJcbiAgICAgICAgICAgICAgICBvcHRzID0gYXJncy5sZW5ndGggPT09IDAgPyB7fSA6ICQuZXh0ZW5kKHt9LCBhcmdzWzBdKTtcclxuICAgICAgICAgICAgICAgIG9wdHMuZWxlbWVudCA9ICQodGhpcyk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKG9wdHMuZWxlbWVudC5nZXQoMCkudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInNlbGVjdFwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGUgPSBvcHRzLmVsZW1lbnQucHJvcChcIm11bHRpcGxlXCIpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBtdWx0aXBsZSA9IG9wdHMubXVsdGlwbGUgfHwgZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKFwidGFnc1wiIGluIG9wdHMpIHtvcHRzLm11bHRpcGxlID0gbXVsdGlwbGUgPSB0cnVlO31cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBzZWxlY3QyID0gbXVsdGlwbGUgPyBuZXcgTXVsdGlTZWxlY3QyKCkgOiBuZXcgU2luZ2xlU2VsZWN0MigpO1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0Mi5pbml0KG9wdHMpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZihhcmdzWzBdKSA9PT0gXCJzdHJpbmdcIikge1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChpbmRleE9mKGFyZ3NbMF0sIGFsbG93ZWRNZXRob2RzKSA8IDApIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBcIlVua25vd24gbWV0aG9kOiBcIiArIGFyZ3NbMF07XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgdmFsdWUgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3QyID0gJCh0aGlzKS5kYXRhKFwic2VsZWN0MlwiKTtcclxuICAgICAgICAgICAgICAgIGlmIChzZWxlY3QyID09PSB1bmRlZmluZWQpIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgICAgICBtZXRob2Q9YXJnc1swXTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAobWV0aG9kID09PSBcImNvbnRhaW5lclwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBzZWxlY3QyLmNvbnRhaW5lcjtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobWV0aG9kID09PSBcImRyb3Bkb3duXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGVjdDIuZHJvcGRvd247XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChtZXRob2RzTWFwW21ldGhvZF0pIG1ldGhvZCA9IG1ldGhvZHNNYXBbbWV0aG9kXTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBzZWxlY3QyW21ldGhvZF0uYXBwbHkoc2VsZWN0MiwgYXJncy5zbGljZSgxKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXhPZihhcmdzWzBdLCB2YWx1ZU1ldGhvZHMpID49IDBcclxuICAgICAgICAgICAgICAgICAgICB8fCAoaW5kZXhPZihhcmdzWzBdLCBwcm9wZXJ0eU1ldGhvZHMpICYmIGFyZ3MubGVuZ3RoID09IDEpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBhYm9ydCB0aGUgaXRlcmF0aW9uLCByZWFkeSB0byByZXR1cm4gZmlyc3QgbWF0Y2hlZCB2YWx1ZVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgXCJJbnZhbGlkIGFyZ3VtZW50cyB0byBzZWxlY3QyIHBsdWdpbjogXCIgKyBhcmdzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSA/IHRoaXMgOiB2YWx1ZTtcclxuICAgIH07XHJcblxyXG4gICAgLy8gcGx1Z2luIGRlZmF1bHRzLCBhY2Nlc3NpYmxlIHRvIHVzZXJzXHJcbiAgICAkLmZuLnNlbGVjdDIuZGVmYXVsdHMgPSB7XHJcbiAgICAgICAgd2lkdGg6IFwiY29weVwiLFxyXG4gICAgICAgIGxvYWRNb3JlUGFkZGluZzogMCxcclxuICAgICAgICBjbG9zZU9uU2VsZWN0OiB0cnVlLFxyXG4gICAgICAgIG9wZW5PbkVudGVyOiB0cnVlLFxyXG4gICAgICAgIGNvbnRhaW5lckNzczoge30sXHJcbiAgICAgICAgZHJvcGRvd25Dc3M6IHt9LFxyXG4gICAgICAgIGNvbnRhaW5lckNzc0NsYXNzOiBcIlwiLFxyXG4gICAgICAgIGRyb3Bkb3duQ3NzQ2xhc3M6IFwiXCIsXHJcbiAgICAgICAgZm9ybWF0UmVzdWx0OiBmdW5jdGlvbihyZXN1bHQsIGNvbnRhaW5lciwgcXVlcnksIGVzY2FwZU1hcmt1cCkge1xyXG4gICAgICAgICAgICB2YXIgbWFya3VwPVtdO1xyXG4gICAgICAgICAgICBtYXJrTWF0Y2gocmVzdWx0LnRleHQsIHF1ZXJ5LnRlcm0sIG1hcmt1cCwgZXNjYXBlTWFya3VwKTtcclxuICAgICAgICAgICAgcmV0dXJuIG1hcmt1cC5qb2luKFwiXCIpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZm9ybWF0U2VsZWN0aW9uOiBmdW5jdGlvbiAoZGF0YSwgY29udGFpbmVyLCBlc2NhcGVNYXJrdXApIHtcclxuICAgICAgICAgICAgcmV0dXJuIGRhdGEgPyBlc2NhcGVNYXJrdXAoZGF0YS50ZXh0KSA6IHVuZGVmaW5lZDtcclxuICAgICAgICB9LFxyXG4gICAgICAgIHNvcnRSZXN1bHRzOiBmdW5jdGlvbiAocmVzdWx0cywgY29udGFpbmVyLCBxdWVyeSkge1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0cztcclxuICAgICAgICB9LFxyXG4gICAgICAgIGZvcm1hdFJlc3VsdENzc0NsYXNzOiBmdW5jdGlvbihkYXRhKSB7cmV0dXJuIHVuZGVmaW5lZDt9LFxyXG4gICAgICAgIGZvcm1hdFNlbGVjdGlvbkNzc0NsYXNzOiBmdW5jdGlvbihkYXRhLCBjb250YWluZXIpIHtyZXR1cm4gdW5kZWZpbmVkO30sXHJcbiAgICAgICAgZm9ybWF0Tm9NYXRjaGVzOiBmdW5jdGlvbiAoKSB7IHJldHVybiBcIk5vIG1hdGNoZXMgZm91bmRcIjsgfSxcclxuICAgICAgICBmb3JtYXRJbnB1dFRvb1Nob3J0OiBmdW5jdGlvbiAoaW5wdXQsIG1pbikgeyB2YXIgbiA9IG1pbiAtIGlucHV0Lmxlbmd0aDsgcmV0dXJuIFwiUGxlYXNlIGVudGVyIFwiICsgbiArIFwiIG1vcmUgY2hhcmFjdGVyXCIgKyAobiA9PSAxPyBcIlwiIDogXCJzXCIpOyB9LFxyXG4gICAgICAgIGZvcm1hdElucHV0VG9vTG9uZzogZnVuY3Rpb24gKGlucHV0LCBtYXgpIHsgdmFyIG4gPSBpbnB1dC5sZW5ndGggLSBtYXg7IHJldHVybiBcIlBsZWFzZSBkZWxldGUgXCIgKyBuICsgXCIgY2hhcmFjdGVyXCIgKyAobiA9PSAxPyBcIlwiIDogXCJzXCIpOyB9LFxyXG4gICAgICAgIGZvcm1hdFNlbGVjdGlvblRvb0JpZzogZnVuY3Rpb24gKGxpbWl0KSB7IHJldHVybiBcIllvdSBjYW4gb25seSBzZWxlY3QgXCIgKyBsaW1pdCArIFwiIGl0ZW1cIiArIChsaW1pdCA9PSAxID8gXCJcIiA6IFwic1wiKTsgfSxcclxuICAgICAgICBmb3JtYXRMb2FkTW9yZTogZnVuY3Rpb24gKHBhZ2VOdW1iZXIpIHsgcmV0dXJuIFwiTG9hZGluZyBtb3JlIHJlc3VsdHMuLi5cIjsgfSxcclxuICAgICAgICBmb3JtYXRTZWFyY2hpbmc6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFwiU2VhcmNoaW5nLi4uXCI7IH0sXHJcbiAgICAgICAgbWluaW11bVJlc3VsdHNGb3JTZWFyY2g6IDAsXHJcbiAgICAgICAgbWluaW11bUlucHV0TGVuZ3RoOiAwLFxyXG4gICAgICAgIG1heGltdW1JbnB1dExlbmd0aDogbnVsbCxcclxuICAgICAgICBtYXhpbXVtU2VsZWN0aW9uU2l6ZTogMCxcclxuICAgICAgICBpZDogZnVuY3Rpb24gKGUpIHsgcmV0dXJuIGUuaWQ7IH0sXHJcbiAgICAgICAgbWF0Y2hlcjogZnVuY3Rpb24odGVybSwgdGV4dCkge1xyXG4gICAgICAgICAgICByZXR1cm4gc3RyaXBEaWFjcml0aWNzKCcnK3RleHQpLnRvVXBwZXJDYXNlKCkuaW5kZXhPZihzdHJpcERpYWNyaXRpY3MoJycrdGVybSkudG9VcHBlckNhc2UoKSkgPj0gMDtcclxuICAgICAgICB9LFxyXG4gICAgICAgIHNlcGFyYXRvcjogXCIsXCIsXHJcbiAgICAgICAgdG9rZW5TZXBhcmF0b3JzOiBbXSxcclxuICAgICAgICB0b2tlbml6ZXI6IGRlZmF1bHRUb2tlbml6ZXIsXHJcbiAgICAgICAgZXNjYXBlTWFya3VwOiBkZWZhdWx0RXNjYXBlTWFya3VwLFxyXG4gICAgICAgIGJsdXJPbkNoYW5nZTogZmFsc2UsXHJcbiAgICAgICAgc2VsZWN0T25CbHVyOiBmYWxzZSxcclxuICAgICAgICBhZGFwdENvbnRhaW5lckNzc0NsYXNzOiBmdW5jdGlvbihjKSB7IHJldHVybiBjOyB9LFxyXG4gICAgICAgIGFkYXB0RHJvcGRvd25Dc3NDbGFzczogZnVuY3Rpb24oYykgeyByZXR1cm4gbnVsbDsgfSxcclxuICAgICAgICBuZXh0U2VhcmNoVGVybTogZnVuY3Rpb24oc2VsZWN0ZWRPYmplY3QsIGN1cnJlbnRTZWFyY2hUZXJtKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cclxuICAgIH07XHJcblxyXG4gICAgJC5mbi5zZWxlY3QyLmFqYXhEZWZhdWx0cyA9IHtcclxuICAgICAgICB0cmFuc3BvcnQ6ICQuYWpheCxcclxuICAgICAgICBwYXJhbXM6IHtcclxuICAgICAgICAgICAgdHlwZTogXCJHRVRcIixcclxuICAgICAgICAgICAgY2FjaGU6IGZhbHNlLFxyXG4gICAgICAgICAgICBkYXRhVHlwZTogXCJqc29uXCJcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIC8vIGV4cG9ydHNcclxuICAgIHdpbmRvdy5TZWxlY3QyID0ge1xyXG4gICAgICAgIHF1ZXJ5OiB7XHJcbiAgICAgICAgICAgIGFqYXg6IGFqYXgsXHJcbiAgICAgICAgICAgIGxvY2FsOiBsb2NhbCxcclxuICAgICAgICAgICAgdGFnczogdGFnc1xyXG4gICAgICAgIH0sIHV0aWw6IHtcclxuICAgICAgICAgICAgZGVib3VuY2U6IGRlYm91bmNlLFxyXG4gICAgICAgICAgICBtYXJrTWF0Y2g6IG1hcmtNYXRjaCxcclxuICAgICAgICAgICAgZXNjYXBlTWFya3VwOiBkZWZhdWx0RXNjYXBlTWFya3VwLFxyXG4gICAgICAgICAgICBzdHJpcERpYWNyaXRpY3M6IHN0cmlwRGlhY3JpdGljc1xyXG4gICAgICAgIH0sIFwiY2xhc3NcIjoge1xyXG4gICAgICAgICAgICBcImFic3RyYWN0XCI6IEFic3RyYWN0U2VsZWN0MixcclxuICAgICAgICAgICAgXCJzaW5nbGVcIjogU2luZ2xlU2VsZWN0MixcclxuICAgICAgICAgICAgXCJtdWx0aVwiOiBNdWx0aVNlbGVjdDJcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxufShqUXVlcnkpKTtcclxuXHJcblxufSkuY2FsbChnbG9iYWwsIG1vZHVsZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQpO1xuIl19
},{"jquery":109}],95:[function(require,module,exports){
(function (global){

; jQuery = global.jQuery = require("jquery");
; var __browserify_shim_require__=require;(function browserifyShim(module, define, require) {
/**
 * Super simple wysiwyg editor on Bootstrap v0.6.3
 * http://summernote.org/
 *
 * summernote.js
 * Copyright 2013-2015 Alan Hong. and other contributors
 * summernote may be freely distributed under the MIT license./
 *
 * Date: 2015-04-08T13:28Z
 */
(function (factory) {
	/* global define */
	if (typeof define === 'function' && define.amd) {
		// AMD. Register as an anonymous module.
		define(['jquery'], factory);
	} else {
		// Browser globals: jQuery
		factory(window.jQuery);
	}
}(function ($) {



	if (!Array.prototype.reduce) {
		/**
		 * Array.prototype.reduce polyfill
		 *
		 * @param {Function} callback
		 * @param {Value} [initialValue]
		 * @return {Value}
		 *
		 * @see http://goo.gl/WNriQD
		 */
		Array.prototype.reduce = function (callback) {
			var t = Object(this), len = t.length >>> 0, k = 0, value;
			if (arguments.length === 2) {
				value = arguments[1];
			} else {
				while (k < len && !(k in t)) {
					k++;
				}
				if (k >= len) {
					throw new TypeError('Reduce of empty array with no initial value');
				}
				value = t[k++];
			}
			for (; k < len; k++) {
				if (k in t) {
					value = callback(value, t[k], k, t);
				}
			}
			return value;
		};
	}

	if ('function' !== typeof Array.prototype.filter) {
		/**
		 * Array.prototype.filter polyfill
		 *
		 * @param {Function} func
		 * @return {Array}
		 *
		 * @see http://goo.gl/T1KFnq
		 */
		Array.prototype.filter = function (func) {
			var t = Object(this), len = t.length >>> 0;

			var res = [];
			var thisArg = arguments.length >= 2 ? arguments[1] : void 0;
			for (var i = 0; i < len; i++) {
				if (i in t) {
					var val = t[i];
					if (func.call(thisArg, val, i, t)) {
						res.push(val);
					}
				}
			}

			return res;
		};
	}

	var isSupportAmd = typeof define === 'function' && define.amd;

	/**
	 * returns whether font is installed or not.
	 *
	 * @param {String} fontName
	 * @return {Boolean}
	 */
	var isFontInstalled = function (fontName) {
		var testFontName = fontName === 'Comic Sans MS' ? 'Courier New' : 'Comic Sans MS';
		var $tester = $('<div>').css({
			position: 'absolute',
			left: '-9999px',
			top: '-9999px',
			fontSize: '200px'
		}).text('mmmmmmmmmwwwwwww').appendTo(document.body);

		var originalWidth = $tester.css('fontFamily', testFontName).width();
		var width = $tester.css('fontFamily', fontName + ',' + testFontName).width();

		$tester.remove();

		return originalWidth !== width;
	};

	/**
	 * @class core.agent
	 *
	 * Object which check platform and agent
	 *
	 * @singleton
	 * @alternateClassName agent
	 */
	var agent = {
		/** @property {Boolean} [isMac=false] true if this agent is Mac  */
		isMac: navigator.appVersion.indexOf('Mac') > -1,
		/** @property {Boolean} [isMSIE=false] true if this agent is a Internet Explorer  */
		isMSIE: navigator.userAgent.indexOf('MSIE') > -1 || navigator.userAgent.indexOf('Trident') > -1,
		/** @property {Boolean} [isFF=false] true if this agent is a Firefox  */
		isFF: navigator.userAgent.indexOf('Firefox') > -1,
		/** @property {String} jqueryVersion current jQuery version string  */
		jqueryVersion: parseFloat($.fn.jquery),
		isSupportAmd: isSupportAmd,
		hasCodeMirror: isSupportAmd ? require.specified('CodeMirror') : !!window.CodeMirror,
		isFontInstalled: isFontInstalled,
		isW3CRangeSupport: !!document.createRange
	};

	/**
	 * @class core.func
	 *
	 * func utils (for high-order func's arg)
	 *
	 * @singleton
	 * @alternateClassName func
	 */
	var func = (function () {
		var eq = function (itemA) {
			return function (itemB) {
				return itemA === itemB;
			};
		};

		var eq2 = function (itemA, itemB) {
			return itemA === itemB;
		};

		var peq2 = function (propName) {
			return function (itemA, itemB) {
				return itemA[propName] === itemB[propName];
			};
		};

		var ok = function () {
			return true;
		};

		var fail = function () {
			return false;
		};

		var not = function (f) {
			return function () {
				return !f.apply(f, arguments);
			};
		};

		var and = function (fA, fB) {
			return function (item) {
				return fA(item) && fB(item);
			};
		};

		var self = function (a) {
			return a;
		};

		var idCounter = 0;

		/**
		 * generate a globally-unique id
		 *
		 * @param {String} [prefix]
		 */
		var uniqueId = function (prefix) {
			var id = ++idCounter + '';
			return prefix ? prefix + id : id;
		};

		/**
		 * returns bnd (bounds) from rect
		 *
		 * - IE Compatability Issue: http://goo.gl/sRLOAo
		 * - Scroll Issue: http://goo.gl/sNjUc
		 *
		 * @param {Rect} rect
		 * @return {Object} bounds
		 * @return {Number} bounds.top
		 * @return {Number} bounds.left
		 * @return {Number} bounds.width
		 * @return {Number} bounds.height
		 */
		var rect2bnd = function (rect) {
			var $document = $(document);
			return {
				top: rect.top + $document.scrollTop(),
				left: rect.left + $document.scrollLeft(),
				width: rect.right - rect.left,
				height: rect.bottom - rect.top
			};
		};

		/**
		 * returns a copy of the object where the keys have become the values and the values the keys.
		 * @param {Object} obj
		 * @return {Object}
		 */
		var invertObject = function (obj) {
			var inverted = {};
			for (var key in obj) {
				if (obj.hasOwnProperty(key)) {
					inverted[obj[key]] = key;
				}
			}
			return inverted;
		};

		return {
			eq: eq,
			eq2: eq2,
			peq2: peq2,
			ok: ok,
			fail: fail,
			self: self,
			not: not,
			and: and,
			uniqueId: uniqueId,
			rect2bnd: rect2bnd,
			invertObject: invertObject
		};
	})();

	/**
	 * @class core.list
	 *
	 * list utils
	 *
	 * @singleton
	 * @alternateClassName list
	 */
	var list = (function () {
		/**
		 * returns the first item of an array.
		 *
		 * @param {Array} array
		 */
		var head = function (array) {
			return array[0];
		};

		/**
		 * returns the last item of an array.
		 *
		 * @param {Array} array
		 */
		var last = function (array) {
			return array[array.length - 1];
		};

		/**
		 * returns everything but the last entry of the array.
		 *
		 * @param {Array} array
		 */
		var initial = function (array) {
			return array.slice(0, array.length - 1);
		};

		/**
		 * returns the rest of the items in an array.
		 *
		 * @param {Array} array
		 */
		var tail = function (array) {
			return array.slice(1);
		};

		/**
		 * returns item of array
		 */
		var find = function (array, pred) {
			for (var idx = 0, len = array.length; idx < len; idx++) {
				var item = array[idx];
				if (pred(item)) {
					return item;
				}
			}
		};

		/**
		 * returns true if all of the values in the array pass the predicate truth test.
		 */
		var all = function (array, pred) {
			for (var idx = 0, len = array.length; idx < len; idx++) {
				if (!pred(array[idx])) {
					return false;
				}
			}
			return true;
		};

		/**
		 * returns true if the value is present in the list.
		 */
		var contains = function (array, item) {
			return $.inArray(item, array) !== -1;
		};

		/**
		 * get sum from a list
		 *
		 * @param {Array} array - array
		 * @param {Function} fn - iterator
		 */
		var sum = function (array, fn) {
			fn = fn || func.self;
			return array.reduce(function (memo, v) {
				return memo + fn(v);
			}, 0);
		};

		/**
		 * returns a copy of the collection with array type.
		 * @param {Collection} collection - collection eg) node.childNodes, ...
		 */
		var from = function (collection) {
			var result = [], idx = -1, length = collection.length;
			while (++idx < length) {
				result[idx] = collection[idx];
			}
			return result;
		};

		/**
		 * cluster elements by predicate function.
		 *
		 * @param {Array} array - array
		 * @param {Function} fn - predicate function for cluster rule
		 * @param {Array[]}
		 */
		var clusterBy = function (array, fn) {
			if (!array.length) { return []; }
			var aTail = tail(array);
			return aTail.reduce(function (memo, v) {
				var aLast = last(memo);
				if (fn(last(aLast), v)) {
					aLast[aLast.length] = v;
				} else {
					memo[memo.length] = [v];
				}
				return memo;
			}, [[head(array)]]);
		};

		/**
		 * returns a copy of the array with all falsy values removed
		 *
		 * @param {Array} array - array
		 * @param {Function} fn - predicate function for cluster rule
		 */
		var compact = function (array) {
			var aResult = [];
			for (var idx = 0, len = array.length; idx < len; idx++) {
				if (array[idx]) { aResult.push(array[idx]); }
			}
			return aResult;
		};

		/**
		 * produces a duplicate-free version of the array
		 *
		 * @param {Array} array
		 */
		var unique = function (array) {
			var results = [];

			for (var idx = 0, len = array.length; idx < len; idx++) {
				if (!contains(results, array[idx])) {
					results.push(array[idx]);
				}
			}

			return results;
		};

		/**
		 * returns next item.
		 * @param {Array} array
		 */
		var next = function (array, item) {
			var idx = array.indexOf(item);
			if (idx === -1) { return null; }

			return array[idx + 1];
		};

		/**
		 * returns prev item.
		 * @param {Array} array
		 */
		var prev = function (array, item) {
			var idx = array.indexOf(item);
			if (idx === -1) { return null; }

			return array[idx - 1];
		};


		return {
			head: head, last: last, initial: initial, tail: tail,
			prev: prev, next: next, find: find, contains: contains,
			all: all, sum: sum, from: from,
			clusterBy: clusterBy, compact: compact, unique: unique
		};
	})();


	var NBSP_CHAR = String.fromCharCode(160);
	var ZERO_WIDTH_NBSP_CHAR = '\ufeff';

	/**
	 * @class core.dom
	 *
	 * Dom functions
	 *
	 * @singleton
	 * @alternateClassName dom
	 */
	var dom = (function () {
		/**
		 * @method isEditable
		 *
		 * returns whether node is `note-editable` or not.
		 *
		 * @param {Node} node
		 * @return {Boolean}
		 */
		var isEditable = function (node) {
			return node && $(node).hasClass('note-editable');
		};

		/**
		 * @method isControlSizing
		 *
		 * returns whether node is `note-control-sizing` or not.
		 *
		 * @param {Node} node
		 * @return {Boolean}
		 */
		var isControlSizing = function (node) {
			return node && $(node).hasClass('note-control-sizing');
		};

		/**
		 * @method  buildLayoutInfo
		 *
		 * build layoutInfo from $editor(.note-editor)
		 *
		 * @param {jQuery} $editor
		 * @return {Object}
		 * @return {Function} return.editor
		 * @return {Node} return.dropzone
		 * @return {Node} return.toolbar
		 * @return {Node} return.editable
		 * @return {Node} return.codable
		 * @return {Node} return.popover
		 * @return {Node} return.handle
		 * @return {Node} return.dialog
		 */
		var buildLayoutInfo = function ($editor) {
			var makeFinder;

			// air mode
			if ($editor.hasClass('note-air-editor')) {
				var id = list.last($editor.attr('id').split('-'));
				makeFinder = function (sIdPrefix) {
					return function () { return $(sIdPrefix + id); };
				};

				return {
					editor: function () { return $editor; },
					holder: function () { return $editor.data('holder'); },
					editable: function () { return $editor; },
					popover: makeFinder('#note-popover-'),
					handle: makeFinder('#note-handle-'),
					dialog: makeFinder('#note-dialog-')
				};

				// frame mode
			} else {
				makeFinder = function (sClassName) {
					return function () { return $editor.find(sClassName); };
				};
				return {
					editor: function () { return $editor; },
					holder: function () { return $editor.data('holder'); },
					dropzone: makeFinder('.note-dropzone'),
					toolbar: makeFinder('.note-toolbar'),
					editable: makeFinder('.note-editable'),
					codable: makeFinder('.note-codable'),
					statusbar: makeFinder('.note-statusbar'),
					popover: makeFinder('.note-popover'),
					handle: makeFinder('.note-handle'),
					dialog: makeFinder('.note-dialog')
				};
			}
		};

		/**
		 * returns makeLayoutInfo from editor's descendant node.
		 *
		 * @private
		 * @param {Node} descendant
		 * @return {Object}
		 */
		var makeLayoutInfo = function (descendant) {
			var $target = $(descendant).closest('.note-editor, .note-air-editor, .note-air-layout');

			if (!$target.length) {
				return null;
			}

			var $editor;
			if ($target.is('.note-editor, .note-air-editor')) {
				$editor = $target;
			} else {
				$editor = $('#note-editor-' + list.last($target.attr('id').split('-')));
			}

			return buildLayoutInfo($editor);
		};

		/**
		 * @method makePredByNodeName
		 *
		 * returns predicate which judge whether nodeName is same
		 *
		 * @param {String} nodeName
		 * @return {Function}
		 */
		var makePredByNodeName = function (nodeName) {
			nodeName = nodeName.toUpperCase();
			return function (node) {
				return node && node.nodeName.toUpperCase() === nodeName;
			};
		};

		/**
		 * @method isText
		 *
		 *
		 *
		 * @param {Node} node
		 * @return {Boolean} true if node's type is text(3)
		 */
		var isText = function (node) {
			return node && node.nodeType === 3;
		};

		/**
		 * ex) br, col, embed, hr, img, input, ...
		 * @see http://www.w3.org/html/wg/drafts/html/master/syntax.html#void-elements
		 */
		var isVoid = function (node) {
			return node && /^BR|^IMG|^HR/.test(node.nodeName.toUpperCase());
		};

		var isPara = function (node) {
			if (isEditable(node)) {
				return false;
			}

			// Chrome(v31.0), FF(v25.0.1) use DIV for paragraph
			return node && /^DIV|^P|^LI|^H[1-7]/.test(node.nodeName.toUpperCase());
		};

		var isLi = makePredByNodeName('LI');

		var isPurePara = function (node) {
			return isPara(node) && !isLi(node);
		};

		var isTable = makePredByNodeName('TABLE');

		var isInline = function (node) {
			return !isBodyContainer(node) &&
				   !isList(node) &&
				   !isPara(node) &&
				   !isTable(node) &&
				   !isBlockquote(node);
		};

		var isList = function (node) {
			return node && /^UL|^OL/.test(node.nodeName.toUpperCase());
		};

		var isCell = function (node) {
			return node && /^TD|^TH/.test(node.nodeName.toUpperCase());
		};

		var isBlockquote = makePredByNodeName('BLOCKQUOTE');

		var isBodyContainer = function (node) {
			return isCell(node) || isBlockquote(node) || isEditable(node);
		};

		var isAnchor = makePredByNodeName('A');

		var isParaInline = function (node) {
			return isInline(node) && !!ancestor(node, isPara);
		};

		var isBodyInline = function (node) {
			return isInline(node) && !ancestor(node, isPara);
		};

		var isBody = makePredByNodeName('BODY');

		/**
		 * returns whether nodeB is closest sibling of nodeA
		 *
		 * @param {Node} nodeA
		 * @param {Node} nodeB
		 * @return {Boolean}
		 */
		var isClosestSibling = function (nodeA, nodeB) {
			return nodeA.nextSibling === nodeB ||
				   nodeA.previousSibling === nodeB;
		};

		/**
		 * returns array of closest siblings with node
		 *
		 * @param {Node} node
		 * @param {function} [pred] - predicate function
		 * @return {Node[]}
		 */
		var withClosestSiblings = function (node, pred) {
			pred = pred || func.ok;

			var siblings = [];
			if (node.previousSibling && pred(node.previousSibling)) {
				siblings.push(node.previousSibling);
			}
			siblings.push(node);
			if (node.nextSibling && pred(node.nextSibling)) {
				siblings.push(node.nextSibling);
			}
			return siblings;
		};

		/**
		 * blank HTML for cursor position
		 */
		var blankHTML = agent.isMSIE ? '&nbsp;' : '<br>';

		/**
		 * @method nodeLength
		 *
		 * returns #text's text size or element's childNodes size
		 *
		 * @param {Node} node
		 */
		var nodeLength = function (node) {
			if (isText(node)) {
				return node.nodeValue.length;
			}

			return node.childNodes.length;
		};

		/**
		 * returns whether node is empty or not.
		 *
		 * @param {Node} node
		 * @return {Boolean}
		 */
		var isEmpty = function (node) {
			var len = nodeLength(node);

			if (len === 0) {
				return true;
			} else if (!dom.isText(node) && len === 1 && node.innerHTML === blankHTML) {
				// ex) <p><br></p>, <span><br></span>
				return true;
			}

			return false;
		};

		/**
		 * padding blankHTML if node is empty (for cursor position)
		 */
		var paddingBlankHTML = function (node) {
			if (!isVoid(node) && !nodeLength(node)) {
				node.innerHTML = blankHTML;
			}
		};

		/**
		 * find nearest ancestor predicate hit
		 *
		 * @param {Node} node
		 * @param {Function} pred - predicate function
		 */
		var ancestor = function (node, pred) {
			while (node) {
				if (pred(node)) { return node; }
				if (isEditable(node)) { break; }

				node = node.parentNode;
			}
			return null;
		};

		/**
		 * find nearest ancestor only single child blood line and predicate hit
		 *
		 * @param {Node} node
		 * @param {Function} pred - predicate function
		 */
		var singleChildAncestor = function (node, pred) {
			node = node.parentNode;

			while (node) {
				if (nodeLength(node) !== 1) { break; }
				if (pred(node)) { return node; }
				if (isEditable(node)) { break; }

				node = node.parentNode;
			}
			return null;
		};

		/**
		 * returns new array of ancestor nodes (until predicate hit).
		 *
		 * @param {Node} node
		 * @param {Function} [optional] pred - predicate function
		 */
		var listAncestor = function (node, pred) {
			pred = pred || func.fail;

			var ancestors = [];
			ancestor(node, function (el) {
				if (!isEditable(el)) {
					ancestors.push(el);
				}

				return pred(el);
			});
			return ancestors;
		};

		/**
		 * find farthest ancestor predicate hit
		 */
		var lastAncestor = function (node, pred) {
			var ancestors = listAncestor(node);
			return list.last(ancestors.filter(pred));
		};

		/**
		 * returns common ancestor node between two nodes.
		 *
		 * @param {Node} nodeA
		 * @param {Node} nodeB
		 */
		var commonAncestor = function (nodeA, nodeB) {
			var ancestors = listAncestor(nodeA);
			for (var n = nodeB; n; n = n.parentNode) {
				if ($.inArray(n, ancestors) > -1) { return n; }
			}
			return null; // difference document area
		};

		/**
		 * listing all previous siblings (until predicate hit).
		 *
		 * @param {Node} node
		 * @param {Function} [optional] pred - predicate function
		 */
		var listPrev = function (node, pred) {
			pred = pred || func.fail;

			var nodes = [];
			while (node) {
				if (pred(node)) { break; }
				nodes.push(node);
				node = node.previousSibling;
			}
			return nodes;
		};

		/**
		 * listing next siblings (until predicate hit).
		 *
		 * @param {Node} node
		 * @param {Function} [pred] - predicate function
		 */
		var listNext = function (node, pred) {
			pred = pred || func.fail;

			var nodes = [];
			while (node) {
				if (pred(node)) { break; }
				nodes.push(node);
				node = node.nextSibling;
			}
			return nodes;
		};

		/**
		 * listing descendant nodes
		 *
		 * @param {Node} node
		 * @param {Function} [pred] - predicate function
		 */
		var listDescendant = function (node, pred) {
			var descendents = [];
			pred = pred || func.ok;

			// start DFS(depth first search) with node
			(function fnWalk(current) {
				if (node !== current && pred(current)) {
					descendents.push(current);
				}
				for (var idx = 0, len = current.childNodes.length; idx < len; idx++) {
					fnWalk(current.childNodes[idx]);
				}
			})(node);

			return descendents;
		};

		/**
		 * wrap node with new tag.
		 *
		 * @param {Node} node
		 * @param {Node} tagName of wrapper
		 * @return {Node} - wrapper
		 */
		var wrap = function (node, wrapperName) {
			var parent = node.parentNode;
			var wrapper = $('<' + wrapperName + '>')[0];

			parent.insertBefore(wrapper, node);
			wrapper.appendChild(node);

			return wrapper;
		};

		/**
		 * insert node after preceding
		 *
		 * @param {Node} node
		 * @param {Node} preceding - predicate function
		 */
		var insertAfter = function (node, preceding) {
			var next = preceding.nextSibling, parent = preceding.parentNode;
			if (next) {
				parent.insertBefore(node, next);
			} else {
				parent.appendChild(node);
			}
			return node;
		};

		/**
		 * append elements.
		 *
		 * @param {Node} node
		 * @param {Collection} aChild
		 */
		var appendChildNodes = function (node, aChild) {
			$.each(aChild, function (idx, child) {
				node.appendChild(child);
			});
			return node;
		};

		/**
		 * returns whether boundaryPoint is left edge or not.
		 *
		 * @param {BoundaryPoint} point
		 * @return {Boolean}
		 */
		var isLeftEdgePoint = function (point) {
			return point.offset === 0;
		};

		/**
		 * returns whether boundaryPoint is right edge or not.
		 *
		 * @param {BoundaryPoint} point
		 * @return {Boolean}
		 */
		var isRightEdgePoint = function (point) {
			return point.offset === nodeLength(point.node);
		};

		/**
		 * returns whether boundaryPoint is edge or not.
		 *
		 * @param {BoundaryPoint} point
		 * @return {Boolean}
		 */
		var isEdgePoint = function (point) {
			return isLeftEdgePoint(point) || isRightEdgePoint(point);
		};

		/**
		 * returns wheter node is left edge of ancestor or not.
		 *
		 * @param {Node} node
		 * @param {Node} ancestor
		 * @return {Boolean}
		 */
		var isLeftEdgeOf = function (node, ancestor) {
			while (node && node !== ancestor) {
				if (position(node) !== 0) {
					return false;
				}
				node = node.parentNode;
			}

			return true;
		};

		/**
		 * returns whether node is right edge of ancestor or not.
		 *
		 * @param {Node} node
		 * @param {Node} ancestor
		 * @return {Boolean}
		 */
		var isRightEdgeOf = function (node, ancestor) {
			while (node && node !== ancestor) {
				if (position(node) !== nodeLength(node.parentNode) - 1) {
					return false;
				}
				node = node.parentNode;
			}

			return true;
		};

		/**
		 * returns offset from parent.
		 *
		 * @param {Node} node
		 */
		var position = function (node) {
			var offset = 0;
			while ((node = node.previousSibling)) {
				offset += 1;
			}
			return offset;
		};

		var hasChildren = function (node) {
			return !!(node && node.childNodes && node.childNodes.length);
		};

		/**
		 * returns previous boundaryPoint
		 *
		 * @param {BoundaryPoint} point
		 * @param {Boolean} isSkipInnerOffset
		 * @return {BoundaryPoint}
		 */
		var prevPoint = function (point, isSkipInnerOffset) {
			var node, offset;

			if (point.offset === 0) {
				if (isEditable(point.node)) {
					return null;
				}

				node = point.node.parentNode;
				offset = position(point.node);
			} else if (hasChildren(point.node)) {
				node = point.node.childNodes[point.offset - 1];
				offset = nodeLength(node);
			} else {
				node = point.node;
				offset = isSkipInnerOffset ? 0 : point.offset - 1;
			}

			return {
				node: node,
				offset: offset
			};
		};

		/**
		 * returns next boundaryPoint
		 *
		 * @param {BoundaryPoint} point
		 * @param {Boolean} isSkipInnerOffset
		 * @return {BoundaryPoint}
		 */
		var nextPoint = function (point, isSkipInnerOffset) {
			var node, offset;

			if (nodeLength(point.node) === point.offset) {
				if (isEditable(point.node)) {
					return null;
				}

				node = point.node.parentNode;
				offset = position(point.node) + 1;
			} else if (hasChildren(point.node)) {
				node = point.node.childNodes[point.offset];
				offset = 0;
			} else {
				node = point.node;
				offset = isSkipInnerOffset ? nodeLength(point.node) : point.offset + 1;
			}

			return {
				node: node,
				offset: offset
			};
		};

		/**
		 * returns whether pointA and pointB is same or not.
		 *
		 * @param {BoundaryPoint} pointA
		 * @param {BoundaryPoint} pointB
		 * @return {Boolean}
		 */
		var isSamePoint = function (pointA, pointB) {
			return pointA.node === pointB.node && pointA.offset === pointB.offset;
		};

		/**
		 * returns whether point is visible (can set cursor) or not.
		 * 
		 * @param {BoundaryPoint} point
		 * @return {Boolean}
		 */
		var isVisiblePoint = function (point) {
			if (isText(point.node) || !hasChildren(point.node) || isEmpty(point.node)) {
				return true;
			}

			var leftNode = point.node.childNodes[point.offset - 1];
			var rightNode = point.node.childNodes[point.offset];
			if ((!leftNode || isVoid(leftNode)) && (!rightNode || isVoid(rightNode))) {
				return true;
			}

			return false;
		};

		/**
		 * @method prevPointUtil
		 *
		 * @param {BoundaryPoint} point
		 * @param {Function} pred
		 * @return {BoundaryPoint}
		 */
		var prevPointUntil = function (point, pred) {
			while (point) {
				if (pred(point)) {
					return point;
				}

				point = prevPoint(point);
			}

			return null;
		};

		/**
		 * @method nextPointUntil
		 *
		 * @param {BoundaryPoint} point
		 * @param {Function} pred
		 * @return {BoundaryPoint}
		 */
		var nextPointUntil = function (point, pred) {
			while (point) {
				if (pred(point)) {
					return point;
				}

				point = nextPoint(point);
			}

			return null;
		};

		/**
		 * @method walkPoint
		 *
		 * @param {BoundaryPoint} startPoint
		 * @param {BoundaryPoint} endPoint
		 * @param {Function} handler
		 * @param {Boolean} isSkipInnerOffset
		 */
		var walkPoint = function (startPoint, endPoint, handler, isSkipInnerOffset) {
			var point = startPoint;

			while (point) {
				handler(point);

				if (isSamePoint(point, endPoint)) {
					break;
				}

				var isSkipOffset = isSkipInnerOffset &&
								   startPoint.node !== point.node &&
								   endPoint.node !== point.node;
				point = nextPoint(point, isSkipOffset);
			}
		};

		/**
		 * @method makeOffsetPath
		 *
		 * return offsetPath(array of offset) from ancestor
		 *
		 * @param {Node} ancestor - ancestor node
		 * @param {Node} node
		 */
		var makeOffsetPath = function (ancestor, node) {
			var ancestors = listAncestor(node, func.eq(ancestor));
			return $.map(ancestors, position).reverse();
		};

		/**
		 * @method fromOffsetPath
		 *
		 * return element from offsetPath(array of offset)
		 *
		 * @param {Node} ancestor - ancestor node
		 * @param {array} offsets - offsetPath
		 */
		var fromOffsetPath = function (ancestor, offsets) {
			var current = ancestor;
			for (var i = 0, len = offsets.length; i < len; i++) {
				if (current.childNodes.length <= offsets[i]) {
					current = current.childNodes[current.childNodes.length - 1];
				} else {
					current = current.childNodes[offsets[i]];
				}
			}
			return current;
		};

		/**
		 * @method splitNode
		 *
		 * split element or #text
		 *
		 * @param {BoundaryPoint} point
		 * @param {Boolean} [isSkipPaddingBlankHTML]
		 * @return {Node} right node of boundaryPoint
		 */
		var splitNode = function (point, isSkipPaddingBlankHTML) {
			// split #text
			if (isText(point.node)) {
				// edge case
				if (isLeftEdgePoint(point)) {
					return point.node;
				} else if (isRightEdgePoint(point)) {
					return point.node.nextSibling;
				}

				return point.node.splitText(point.offset);
			}

			// split element
			var childNode = point.node.childNodes[point.offset];
			var clone = insertAfter(point.node.cloneNode(false), point.node);
			appendChildNodes(clone, listNext(childNode));

			if (!isSkipPaddingBlankHTML) {
				paddingBlankHTML(point.node);
				paddingBlankHTML(clone);
			}

			return clone;
		};

		/**
		 * @method splitTree
		 *
		 * split tree by point
		 *
		 * @param {Node} root - split root
		 * @param {BoundaryPoint} point
		 * @param {Boolean} [isSkipPaddingBlankHTML]
		 * @return {Node} right node of boundaryPoint
		 */
		var splitTree = function (root, point, isSkipPaddingBlankHTML) {
			// ex) [#text, <span>, <p>]
			var ancestors = listAncestor(point.node, func.eq(root));

			if (!ancestors.length) {
				return null;
			} else if (ancestors.length === 1) {
				return splitNode(point, isSkipPaddingBlankHTML);
			}

			return ancestors.reduce(function (node, parent) {
				var clone = insertAfter(parent.cloneNode(false), parent);

				if (node === point.node) {
					node = splitNode(point, isSkipPaddingBlankHTML);
				}

				appendChildNodes(clone, listNext(node));

				if (!isSkipPaddingBlankHTML) {
					paddingBlankHTML(parent);
					paddingBlankHTML(clone);
				}
				return clone;
			});
		};

		/**
		 * split point
		 *
		 * @param {Point} point
		 * @param {Boolean} isInline
		 * @return {Object}
		 */
		var splitPoint = function (point, isInline) {
			// find splitRoot, container
			//  - inline: splitRoot is a child of paragraph
			//  - block: splitRoot is a child of bodyContainer
			var pred = isInline ? isPara : isBodyContainer;
			var ancestors = listAncestor(point.node, pred);
			var topAncestor = list.last(ancestors) || point.node;

			var splitRoot, container;
			if (pred(topAncestor)) {
				splitRoot = ancestors[ancestors.length - 2];
				container = topAncestor;
			} else {
				splitRoot = topAncestor;
				container = splitRoot.parentNode;
			}

			// split with splitTree
			var pivot = splitRoot && splitTree(splitRoot, point, isInline);

			return {
				rightNode: pivot,
				container: container
			};
		};

		var create = function (nodeName) {
			return document.createElement(nodeName);
		};

		var createText = function (text) {
			return document.createTextNode(text);
		};

		/**
		 * @method remove
		 *
		 * remove node, (isRemoveChild: remove child or not)
		 *
		 * @param {Node} node
		 * @param {Boolean} isRemoveChild
		 */
		var remove = function (node, isRemoveChild) {
			if (!node || !node.parentNode) { return; }
			if (node.removeNode) { return node.removeNode(isRemoveChild); }

			var parent = node.parentNode;
			if (!isRemoveChild) {
				var nodes = [];
				var i, len;
				for (i = 0, len = node.childNodes.length; i < len; i++) {
					nodes.push(node.childNodes[i]);
				}

				for (i = 0, len = nodes.length; i < len; i++) {
					parent.insertBefore(nodes[i], node);
				}
			}

			parent.removeChild(node);
		};

		/**
		 * @method removeWhile
		 *
		 * @param {Node} node
		 * @param {Function} pred
		 */
		var removeWhile = function (node, pred) {
			while (node) {
				if (isEditable(node) || !pred(node)) {
					break;
				}

				var parent = node.parentNode;
				remove(node);
				node = parent;
			}
		};

		/**
		 * @method replace
		 *
		 * replace node with provided nodeName
		 *
		 * @param {Node} node
		 * @param {String} nodeName
		 * @return {Node} - new node
		 */
		var replace = function (node, nodeName) {
			if (node.nodeName.toUpperCase() === nodeName.toUpperCase()) {
				return node;
			}

			var newNode = create(nodeName);

			if (node.style.cssText) {
				newNode.style.cssText = node.style.cssText;
			}

			appendChildNodes(newNode, list.from(node.childNodes));
			insertAfter(newNode, node);
			remove(node);

			return newNode;
		};

		var isTextarea = makePredByNodeName('TEXTAREA');

		/**
		 * @method html
		 *
		 * get the HTML contents of node
		 *
		 * @param {jQuery} $node
		 * @param {Boolean} [isNewlineOnBlock]
		 */
		var html = function ($node, isNewlineOnBlock) {
			var markup = isTextarea($node[0]) ? $node.val() : $node.html();

			if (isNewlineOnBlock) {
				var regexTag = /<(\/?)(\b(?!!)[^>\s]*)(.*?)(\s*\/?>)/g;
				markup = markup.replace(regexTag, function (match, endSlash, name) {
					name = name.toUpperCase();
					var isEndOfInlineContainer = /^DIV|^TD|^TH|^P|^LI|^H[1-7]/.test(name) &&
												 !!endSlash;
					var isBlockNode = /^BLOCKQUOTE|^TABLE|^TBODY|^TR|^HR|^UL|^OL/.test(name);

					return match + ((isEndOfInlineContainer || isBlockNode) ? '\n' : '');
				});
				markup = $.trim(markup);
			}

			return markup;
		};

		var value = function ($textarea, stripLinebreaks) {
			var val = $textarea.val();
			if (stripLinebreaks) {
				return val.replace(/[\n\r]/g, '');
			}
			return val;
		};

		return {
			/** @property {String} NBSP_CHAR */
			NBSP_CHAR: NBSP_CHAR,
			/** @property {String} ZERO_WIDTH_NBSP_CHAR */
			ZERO_WIDTH_NBSP_CHAR: ZERO_WIDTH_NBSP_CHAR,
			/** @property {String} blank */
			blank: blankHTML,
			/** @property {String} emptyPara */
			emptyPara: '<p>' + blankHTML + '</p>',
			makePredByNodeName: makePredByNodeName,
			isEditable: isEditable,
			isControlSizing: isControlSizing,
			buildLayoutInfo: buildLayoutInfo,
			makeLayoutInfo: makeLayoutInfo,
			isText: isText,
			isVoid: isVoid,
			isPara: isPara,
			isPurePara: isPurePara,
			isInline: isInline,
			isBodyInline: isBodyInline,
			isBody: isBody,
			isParaInline: isParaInline,
			isList: isList,
			isTable: isTable,
			isCell: isCell,
			isBlockquote: isBlockquote,
			isBodyContainer: isBodyContainer,
			isAnchor: isAnchor,
			isDiv: makePredByNodeName('DIV'),
			isLi: isLi,
			isBR: makePredByNodeName('BR'),
			isSpan: makePredByNodeName('SPAN'),
			isB: makePredByNodeName('B'),
			isU: makePredByNodeName('U'),
			isS: makePredByNodeName('S'),
			isI: makePredByNodeName('I'),
			isImg: makePredByNodeName('IMG'),
			isTextarea: isTextarea,
			isEmpty: isEmpty,
			isEmptyAnchor: func.and(isAnchor, isEmpty),
			isClosestSibling: isClosestSibling,
			withClosestSiblings: withClosestSiblings,
			nodeLength: nodeLength,
			isLeftEdgePoint: isLeftEdgePoint,
			isRightEdgePoint: isRightEdgePoint,
			isEdgePoint: isEdgePoint,
			isLeftEdgeOf: isLeftEdgeOf,
			isRightEdgeOf: isRightEdgeOf,
			prevPoint: prevPoint,
			nextPoint: nextPoint,
			isSamePoint: isSamePoint,
			isVisiblePoint: isVisiblePoint,
			prevPointUntil: prevPointUntil,
			nextPointUntil: nextPointUntil,
			walkPoint: walkPoint,
			ancestor: ancestor,
			singleChildAncestor: singleChildAncestor,
			listAncestor: listAncestor,
			lastAncestor: lastAncestor,
			listNext: listNext,
			listPrev: listPrev,
			listDescendant: listDescendant,
			commonAncestor: commonAncestor,
			wrap: wrap,
			insertAfter: insertAfter,
			appendChildNodes: appendChildNodes,
			position: position,
			hasChildren: hasChildren,
			makeOffsetPath: makeOffsetPath,
			fromOffsetPath: fromOffsetPath,
			splitTree: splitTree,
			splitPoint: splitPoint,
			create: create,
			createText: createText,
			remove: remove,
			removeWhile: removeWhile,
			replace: replace,
			html: html,
			value: value
		};
	})();


	var range = (function () {

		/**
		 * return boundaryPoint from TextRange, inspired by Andy Na's HuskyRange.js
		 *
		 * @param {TextRange} textRange
		 * @param {Boolean} isStart
		 * @return {BoundaryPoint}
		 *
		 * @see http://msdn.microsoft.com/en-us/library/ie/ms535872(v=vs.85).aspx
		 */
		var textRangeToPoint = function (textRange, isStart) {
			var container = textRange.parentElement(), offset;

			var tester = document.body.createTextRange(), prevContainer;
			var childNodes = list.from(container.childNodes);
			for (offset = 0; offset < childNodes.length; offset++) {
				if (dom.isText(childNodes[offset])) {
					continue;
				}
				tester.moveToElementText(childNodes[offset]);
				if (tester.compareEndPoints('StartToStart', textRange) >= 0) {
					break;
				}
				prevContainer = childNodes[offset];
			}

			if (offset !== 0 && dom.isText(childNodes[offset - 1])) {
				var textRangeStart = document.body.createTextRange(), curTextNode = null;
				textRangeStart.moveToElementText(prevContainer || container);
				textRangeStart.collapse(!prevContainer);
				curTextNode = prevContainer ? prevContainer.nextSibling : container.firstChild;

				var pointTester = textRange.duplicate();
				pointTester.setEndPoint('StartToStart', textRangeStart);
				var textCount = pointTester.text.replace(/[\r\n]/g, '').length;

				while (textCount > curTextNode.nodeValue.length && curTextNode.nextSibling) {
					textCount -= curTextNode.nodeValue.length;
					curTextNode = curTextNode.nextSibling;
				}

				/* jshint ignore:start */
				var dummy = curTextNode.nodeValue; // enforce IE to re-reference curTextNode, hack
				/* jshint ignore:end */

				if (isStart && curTextNode.nextSibling && dom.isText(curTextNode.nextSibling) &&
					textCount === curTextNode.nodeValue.length) {
					textCount -= curTextNode.nodeValue.length;
					curTextNode = curTextNode.nextSibling;
				}

				container = curTextNode;
				offset = textCount;
			}

			return {
				cont: container,
				offset: offset
			};
		};

		/**
		 * return TextRange from boundary point (inspired by google closure-library)
		 * @param {BoundaryPoint} point
		 * @return {TextRange}
		 */
		var pointToTextRange = function (point) {
			var textRangeInfo = function (container, offset) {
				var node, isCollapseToStart;

				if (dom.isText(container)) {
					var prevTextNodes = dom.listPrev(container, func.not(dom.isText));
					var prevContainer = list.last(prevTextNodes).previousSibling;
					node = prevContainer || container.parentNode;
					offset += list.sum(list.tail(prevTextNodes), dom.nodeLength);
					isCollapseToStart = !prevContainer;
				} else {
					node = container.childNodes[offset] || container;
					if (dom.isText(node)) {
						return textRangeInfo(node, 0);
					}

					offset = 0;
					isCollapseToStart = false;
				}

				return {
					node: node,
					collapseToStart: isCollapseToStart,
					offset: offset
				};
			};

			var textRange = document.body.createTextRange();
			var info = textRangeInfo(point.node, point.offset);

			textRange.moveToElementText(info.node);
			textRange.collapse(info.collapseToStart);
			textRange.moveStart('character', info.offset);
			return textRange;
		};

		/**
		 * Wrapped Range
		 *
		 * @constructor
		 * @param {Node} sc - start container
		 * @param {Number} so - start offset
		 * @param {Node} ec - end container
		 * @param {Number} eo - end offset
		 */
		var WrappedRange = function (sc, so, ec, eo) {
			this.sc = sc;
			this.so = so;
			this.ec = ec;
			this.eo = eo;

			// nativeRange: get nativeRange from sc, so, ec, eo
			var nativeRange = function () {
				if (agent.isW3CRangeSupport) {
					var w3cRange = document.createRange();
					w3cRange.setStart(sc, so);
					w3cRange.setEnd(ec, eo);

					return w3cRange;
				} else {
					var textRange = pointToTextRange({
						node: sc,
						offset: so
					});

					textRange.setEndPoint('EndToEnd', pointToTextRange({
						node: ec,
						offset: eo
					}));

					return textRange;
				}
			};

			this.getPoints = function () {
				return {
					sc: sc,
					so: so,
					ec: ec,
					eo: eo
				};
			};

			this.getStartPoint = function () {
				return {
					node: sc,
					offset: so
				};
			};

			this.getEndPoint = function () {
				return {
					node: ec,
					offset: eo
				};
			};

			/**
			 * select update visible range
			 */
			this.select = function () {
				var nativeRng = nativeRange();
				if (agent.isW3CRangeSupport) {
					var selection = document.getSelection();
					if (selection.rangeCount > 0) {
						selection.removeAllRanges();
					}
					selection.addRange(nativeRng);
				} else {
					nativeRng.select();
				}
			};

			/**
			 * @return {WrappedRange}
			 */
			this.normalize = function () {

				/**
				 * @param {BoundaryPoint} point
				 * @return {BoundaryPoint}
				 */
				var getVisiblePoint = function (point) {
					if (!dom.isVisiblePoint(point)) {
						if (dom.isLeftEdgePoint(point)) {
							point = dom.nextPointUntil(point, dom.isVisiblePoint);
						} else {
							point = dom.prevPointUntil(point, dom.isVisiblePoint);
						}
					}
					return point;
				};

				var startPoint = getVisiblePoint(this.getStartPoint());
				var endPoint = getVisiblePoint(this.getEndPoint());

				return new WrappedRange(
				  startPoint.node,
				  startPoint.offset,
				  endPoint.node,
				  endPoint.offset
				);
			};

			/**
			 * returns matched nodes on range
			 *
			 * @param {Function} [pred] - predicate function
			 * @param {Object} [options]
			 * @param {Boolean} [options.includeAncestor]
			 * @param {Boolean} [options.fullyContains]
			 * @return {Node[]}
			 */
			this.nodes = function (pred, options) {
				pred = pred || func.ok;

				var includeAncestor = options && options.includeAncestor;
				var fullyContains = options && options.fullyContains;

				// TODO compare points and sort
				var startPoint = this.getStartPoint();
				var endPoint = this.getEndPoint();

				var nodes = [];
				var leftEdgeNodes = [];

				dom.walkPoint(startPoint, endPoint, function (point) {
					if (dom.isEditable(point.node)) {
						return;
					}

					var node;
					if (fullyContains) {
						if (dom.isLeftEdgePoint(point)) {
							leftEdgeNodes.push(point.node);
						}
						if (dom.isRightEdgePoint(point) && list.contains(leftEdgeNodes, point.node)) {
							node = point.node;
						}
					} else if (includeAncestor) {
						node = dom.ancestor(point.node, pred);
					} else {
						node = point.node;
					}

					if (node && pred(node)) {
						nodes.push(node);
					}
				}, true);

				return list.unique(nodes);
			};

			/**
			 * returns commonAncestor of range
			 * @return {Element} - commonAncestor
			 */
			this.commonAncestor = function () {
				return dom.commonAncestor(sc, ec);
			};

			/**
			 * returns expanded range by pred
			 *
			 * @param {Function} pred - predicate function
			 * @return {WrappedRange}
			 */
			this.expand = function (pred) {
				var startAncestor = dom.ancestor(sc, pred);
				var endAncestor = dom.ancestor(ec, pred);

				if (!startAncestor && !endAncestor) {
					return new WrappedRange(sc, so, ec, eo);
				}

				var boundaryPoints = this.getPoints();

				if (startAncestor) {
					boundaryPoints.sc = startAncestor;
					boundaryPoints.so = 0;
				}

				if (endAncestor) {
					boundaryPoints.ec = endAncestor;
					boundaryPoints.eo = dom.nodeLength(endAncestor);
				}

				return new WrappedRange(
				  boundaryPoints.sc,
				  boundaryPoints.so,
				  boundaryPoints.ec,
				  boundaryPoints.eo
				);
			};

			/**
			 * @param {Boolean} isCollapseToStart
			 * @return {WrappedRange}
			 */
			this.collapse = function (isCollapseToStart) {
				if (isCollapseToStart) {
					return new WrappedRange(sc, so, sc, so);
				} else {
					return new WrappedRange(ec, eo, ec, eo);
				}
			};

			/**
			 * splitText on range
			 */
			this.splitText = function () {
				var isSameContainer = sc === ec;
				var boundaryPoints = this.getPoints();

				if (dom.isText(ec) && !dom.isEdgePoint(this.getEndPoint())) {
					ec.splitText(eo);
				}

				if (dom.isText(sc) && !dom.isEdgePoint(this.getStartPoint())) {
					boundaryPoints.sc = sc.splitText(so);
					boundaryPoints.so = 0;

					if (isSameContainer) {
						boundaryPoints.ec = boundaryPoints.sc;
						boundaryPoints.eo = eo - so;
					}
				}

				return new WrappedRange(
				  boundaryPoints.sc,
				  boundaryPoints.so,
				  boundaryPoints.ec,
				  boundaryPoints.eo
				);
			};

			/**
			 * delete contents on range
			 * @return {WrappedRange}
			 */
			this.deleteContents = function () {
				if (this.isCollapsed()) {
					return this;
				}

				var rng = this.splitText();
				var nodes = rng.nodes(null, {
					fullyContains: true
				});

				// find new cursor point
				var point = dom.prevPointUntil(rng.getStartPoint(), function (point) {
					return !list.contains(nodes, point.node);
				});

				var emptyParents = [];
				$.each(nodes, function (idx, node) {
					// find empty parents
					var parent = node.parentNode;
					if (point.node !== parent && dom.nodeLength(parent) === 1) {
						emptyParents.push(parent);
					}
					dom.remove(node, false);
				});

				// remove empty parents
				$.each(emptyParents, function (idx, node) {
					dom.remove(node, false);
				});

				return new WrappedRange(
				  point.node,
				  point.offset,
				  point.node,
				  point.offset
				).normalize();
			};

			/**
			 * makeIsOn: return isOn(pred) function
			 */
			var makeIsOn = function (pred) {
				return function () {
					var ancestor = dom.ancestor(sc, pred);
					return !!ancestor && (ancestor === dom.ancestor(ec, pred));
				};
			};

			// isOnEditable: judge whether range is on editable or not
			this.isOnEditable = makeIsOn(dom.isEditable);
			// isOnList: judge whether range is on list node or not
			this.isOnList = makeIsOn(dom.isList);
			// isOnAnchor: judge whether range is on anchor node or not
			this.isOnAnchor = makeIsOn(dom.isAnchor);
			// isOnAnchor: judge whether range is on cell node or not
			this.isOnCell = makeIsOn(dom.isCell);

			/**
			 * @param {Function} pred
			 * @return {Boolean}
			 */
			this.isLeftEdgeOf = function (pred) {
				if (!dom.isLeftEdgePoint(this.getStartPoint())) {
					return false;
				}

				var node = dom.ancestor(this.sc, pred);
				return node && dom.isLeftEdgeOf(this.sc, node);
			};

			/**
			 * returns whether range was collapsed or not
			 */
			this.isCollapsed = function () {
				return sc === ec && so === eo;
			};

			/**
			 * wrap inline nodes which children of body with paragraph
			 *
			 * @return {WrappedRange}
			 */
			this.wrapBodyInlineWithPara = function () {
				if (dom.isBodyContainer(sc) && dom.isEmpty(sc)) {
					sc.innerHTML = dom.emptyPara;
					return new WrappedRange(sc.firstChild, 0, sc.firstChild, 0);
				}

				if (dom.isParaInline(sc) || dom.isPara(sc)) {
					return this.normalize();
				}

				// find inline top ancestor
				var topAncestor;
				if (dom.isInline(sc)) {
					var ancestors = dom.listAncestor(sc, func.not(dom.isInline));
					topAncestor = list.last(ancestors);
					if (!dom.isInline(topAncestor)) {
						topAncestor = ancestors[ancestors.length - 2] || sc.childNodes[so];
					}
				} else {
					topAncestor = sc.childNodes[so > 0 ? so - 1 : 0];
				}

				// siblings not in paragraph
				var inlineSiblings = dom.listPrev(topAncestor, dom.isParaInline).reverse();
				inlineSiblings = inlineSiblings.concat(dom.listNext(topAncestor.nextSibling, dom.isParaInline));

				// wrap with paragraph
				if (inlineSiblings.length) {
					var para = dom.wrap(list.head(inlineSiblings), 'p');
					dom.appendChildNodes(para, list.tail(inlineSiblings));
				}

				return this.normalize();
			};

			/**
			 * insert node at current cursor
			 *
			 * @param {Node} node
			 * @return {Node}
			 */
			this.insertNode = function (node) {
				var rng = this.wrapBodyInlineWithPara().deleteContents();
				var info = dom.splitPoint(rng.getStartPoint(), dom.isInline(node));

				if (info.rightNode) {
					info.rightNode.parentNode.insertBefore(node, info.rightNode);
				} else {
					info.container.appendChild(node);
				}

				return node;
			};

			/**
			 * returns text in range
			 *
			 * @return {String}
			 */
			this.toString = function () {
				var nativeRng = nativeRange();
				return agent.isW3CRangeSupport ? nativeRng.toString() : nativeRng.text;
			};

			/**
			 * create offsetPath bookmark
			 *
			 * @param {Node} editable
			 */
			this.bookmark = function (editable) {
				return {
					s: {
						path: dom.makeOffsetPath(editable, sc),
						offset: so
					},
					e: {
						path: dom.makeOffsetPath(editable, ec),
						offset: eo
					}
				};
			};

			/**
			 * create offsetPath bookmark base on paragraph
			 *
			 * @param {Node[]} paras
			 */
			this.paraBookmark = function (paras) {
				return {
					s: {
						path: list.tail(dom.makeOffsetPath(list.head(paras), sc)),
						offset: so
					},
					e: {
						path: list.tail(dom.makeOffsetPath(list.last(paras), ec)),
						offset: eo
					}
				};
			};

			/**
			 * getClientRects
			 * @return {Rect[]}
			 */
			this.getClientRects = function () {
				var nativeRng = nativeRange();
				return nativeRng.getClientRects();
			};
		};

		/**
		 * @class core.range
		 *
		 * Data structure
		 *  * BoundaryPoint: a point of dom tree
		 *  * BoundaryPoints: two boundaryPoints corresponding to the start and the end of the Range
		 *
		 * See to http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level-2-Range-Position
		 *
		 * @singleton
		 * @alternateClassName range
		 */
		return {
			/**
			 * @method
			 * 
			 * create Range Object From arguments or Browser Selection
			 *
			 * @param {Node} sc - start container
			 * @param {Number} so - start offset
			 * @param {Node} ec - end container
			 * @param {Number} eo - end offset
			 * @return {WrappedRange}
			 */
			create: function (sc, so, ec, eo) {
				if (!arguments.length) { // from Browser Selection
					if (agent.isW3CRangeSupport) {
						var selection = document.getSelection();
						if (selection.rangeCount === 0) {
							return null;
						} else if (dom.isBody(selection.anchorNode)) {
							// Firefox: returns entire body as range on initialization. We won't never need it.
							return null;
						}

						var nativeRng = selection.getRangeAt(0);
						sc = nativeRng.startContainer;
						so = nativeRng.startOffset;
						ec = nativeRng.endContainer;
						eo = nativeRng.endOffset;
					} else { // IE8: TextRange
						var textRange = document.selection.createRange();
						var textRangeEnd = textRange.duplicate();
						textRangeEnd.collapse(false);
						var textRangeStart = textRange;
						textRangeStart.collapse(true);

						var startPoint = textRangeToPoint(textRangeStart, true),
						endPoint = textRangeToPoint(textRangeEnd, false);

						// same visible point case: range was collapsed.
						if (dom.isText(startPoint.node) && dom.isLeftEdgePoint(startPoint) &&
							dom.isTextNode(endPoint.node) && dom.isRightEdgePoint(endPoint) &&
							endPoint.node.nextSibling === startPoint.node) {
							startPoint = endPoint;
						}

						sc = startPoint.cont;
						so = startPoint.offset;
						ec = endPoint.cont;
						eo = endPoint.offset;
					}
				} else if (arguments.length === 2) { //collapsed
					ec = sc;
					eo = so;
				}
				return new WrappedRange(sc, so, ec, eo);
			},

			/**
			 * @method 
			 * 
			 * create WrappedRange from node
			 *
			 * @param {Node} node
			 * @return {WrappedRange}
			 */
			createFromNode: function (node) {
				var sc = node;
				var so = 0;
				var ec = node;
				var eo = dom.nodeLength(ec);

				// browsers can't target a picture or void node
				if (dom.isVoid(sc)) {
					so = dom.listPrev(sc).length - 1;
					sc = sc.parentNode;
				}
				if (dom.isBR(ec)) {
					eo = dom.listPrev(ec).length - 1;
					ec = ec.parentNode;
				} else if (dom.isVoid(ec)) {
					eo = dom.listPrev(ec).length;
					ec = ec.parentNode;
				}

				return this.create(sc, so, ec, eo);
			},

			/**
			 * @method 
			 * 
			 * create WrappedRange from bookmark
			 *
			 * @param {Node} editable
			 * @param {Object} bookmark
			 * @return {WrappedRange}
			 */
			createFromBookmark: function (editable, bookmark) {
				var sc = dom.fromOffsetPath(editable, bookmark.s.path);
				var so = bookmark.s.offset;
				var ec = dom.fromOffsetPath(editable, bookmark.e.path);
				var eo = bookmark.e.offset;
				return new WrappedRange(sc, so, ec, eo);
			},

			/**
			 * @method 
			 *
			 * create WrappedRange from paraBookmark
			 *
			 * @param {Object} bookmark
			 * @param {Node[]} paras
			 * @return {WrappedRange}
			 */
			createFromParaBookmark: function (bookmark, paras) {
				var so = bookmark.s.offset;
				var eo = bookmark.e.offset;
				var sc = dom.fromOffsetPath(list.head(paras), bookmark.s.path);
				var ec = dom.fromOffsetPath(list.last(paras), bookmark.e.path);

				return new WrappedRange(sc, so, ec, eo);
			}
		};
	})();

	/**
	 * @class defaults 
	 * 
	 * @singleton
	 */
	var defaults = {
		/** @property */
		version: '0.6.3',

		/**
		 * 
		 * for event options, reference to EventHandler.attach
		 * 
		 * @property {Object} options 
		 * @property {String/Number} [options.width=null] set editor width 
		 * @property {String/Number} [options.height=null] set editor height, ex) 300
		 * @property {String/Number} options.minHeight set minimum height of editor
		 * @property {String/Number} options.maxHeight
		 * @property {String/Number} options.focus 
		 * @property {Number} options.tabsize 
		 * @property {Boolean} options.styleWithSpan
		 * @property {Object} options.codemirror
		 * @property {Object} [options.codemirror.mode='text/html']
		 * @property {Object} [options.codemirror.htmlMode=true]
		 * @property {Object} [options.codemirror.lineNumbers=true]
		 * @property {String} [options.lang=en-US] language 'en-US', 'ko-KR', ...
		 * @property {String} [options.direction=null] text direction, ex) 'rtl'
		 * @property {Array} [options.toolbar]
		 * @property {Boolean} [options.airMode=false]
		 * @property {Array} [options.airPopover]
		 * @property {Fucntion} [options.onInit] initialize
		 * @property {Fucntion} [options.onsubmit]
		 */
		options: {
			width: null,                  // set editor width
			height: null,                 // set editor height, ex) 300

			minHeight: null,              // set minimum height of editor
			maxHeight: null,              // set maximum height of editor

			focus: false,                 // set focus to editable area after initializing summernote

			tabsize: 4,                   // size of tab ex) 2 or 4
			styleWithSpan: true,          // style with span (Chrome and FF only)

			disableLinkTarget: false,     // hide link Target Checkbox
			disableDragAndDrop: false,    // disable drag and drop event
			disableResizeEditor: false,   // disable resizing editor

			shortcuts: true,              // enable keyboard shortcuts

			placeholder: false,           // enable placeholder text
			prettifyHtml: true,           // enable prettifying html while toggling codeview

			iconPrefix: 'fa fa-',         // prefix for css icon classes

			codemirror: {                 // codemirror options
				mode: 'text/html',
				htmlMode: true,
				lineNumbers: true
			},

			// language
			lang: 'en-US',                // language 'en-US', 'ko-KR', ...
			direction: null,              // text direction, ex) 'rtl'

			// toolbar
			toolbar: [
			  ['style', ['style']],
			  ['font', ['bold', 'italic', 'underline', 'clear']],
			  ['fontname', ['fontname']],
			  ['color', ['color']],
			  ['para', ['ul', 'ol', 'paragraph']],
			  ['height', ['height']],
			  ['table', ['table']],
			  ['insert', ['link', 'picture', 'hr']],
			  ['view', ['fullscreen', 'codeview']],
			  ['help', ['help']]
			],

			// air mode: inline editor
			airMode: false,
			// airPopover: [
			//   ['style', ['style']],
			//   ['font', ['bold', 'italic', 'underline', 'clear']],
			//   ['fontname', ['fontname']],
			//   ['color', ['color']],
			//   ['para', ['ul', 'ol', 'paragraph']],
			//   ['height', ['height']],
			//   ['table', ['table']],
			//   ['insert', ['link', 'picture']],
			//   ['help', ['help']]
			// ],
			airPopover: [
			  ['color', ['color']],
			  ['font', ['bold', 'underline', 'clear']],
			  ['para', ['ul', 'paragraph']],
			  ['table', ['table']],
			  ['insert', ['link', 'picture']]
			],

			// style tag
			styleTags: ['p', 'blockquote', 'pre', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6'],

			// default fontName
			defaultFontName: 'Helvetica Neue',

			// fontName
			fontNames: [
			  'Arial', 'Arial Black', 'Comic Sans MS', 'Courier New',
			  'Helvetica Neue', 'Helvetica', 'Impact', 'Lucida Grande',
			  'Tahoma', 'Times New Roman', 'Verdana'
			],
			fontNamesIgnoreCheck: [],

			// pallete colors(n x n)
			colors: [
			  ['#000000', '#424242', '#636363', '#9C9C94', '#CEC6CE', '#EFEFEF', '#F7F7F7', '#FFFFFF'],
			  ['#FF0000', '#FF9C00', '#FFFF00', '#00FF00', '#00FFFF', '#0000FF', '#9C00FF', '#FF00FF'],
			  ['#F7C6CE', '#FFE7CE', '#FFEFC6', '#D6EFD6', '#CEDEE7', '#CEE7F7', '#D6D6E7', '#E7D6DE'],
			  ['#E79C9C', '#FFC69C', '#FFE79C', '#B5D6A5', '#A5C6CE', '#9CC6EF', '#B5A5D6', '#D6A5BD'],
			  ['#E76363', '#F7AD6B', '#FFD663', '#94BD7B', '#73A5AD', '#6BADDE', '#8C7BC6', '#C67BA5'],
			  ['#CE0000', '#E79439', '#EFC631', '#6BA54A', '#4A7B8C', '#3984C6', '#634AA5', '#A54A7B'],
			  ['#9C0000', '#B56308', '#BD9400', '#397B21', '#104A5A', '#085294', '#311873', '#731842'],
			  ['#630000', '#7B3900', '#846300', '#295218', '#083139', '#003163', '#21104A', '#4A1031']
			],

			// lineHeight
			lineHeights: ['1.0', '1.2', '1.4', '1.5', '1.6', '1.8', '2.0', '3.0'],

			// insertTable max size
			insertTableMaxSize: {
				col: 10,
				row: 10
			},

			// image
			maximumImageFileSize: null, // size in bytes, null = no limit

			// callbacks
			oninit: null,             // initialize
			onfocus: null,            // editable has focus
			onblur: null,             // editable out of focus
			onenter: null,            // enter key pressed
			onkeyup: null,            // keyup
			onkeydown: null,          // keydown
			onImageUpload: null,      // imageUpload
			onImageUploadError: null, // imageUploadError
			onMediaDelete: null,      // media delete
			onToolbarClick: null,
			onsubmit: null,

			/**
			 * manipulate link address when user create link
			 * @param {String} sLinkUrl
			 * @return {String}
			 */
			onCreateLink: function (sLinkUrl) {
				if (sLinkUrl.indexOf('@') !== -1 && sLinkUrl.indexOf(':') === -1) {
					sLinkUrl = 'mailto:' + sLinkUrl;
				} else if (sLinkUrl.indexOf('://') === -1) {
					sLinkUrl = 'http://' + sLinkUrl;
				}

				return sLinkUrl;
			},

			keyMap: {
				pc: {
					'ENTER': 'insertParagraph',
					'CTRL+Z': 'undo',
					'CTRL+Y': 'redo',
					'TAB': 'tab',
					'SHIFT+TAB': 'untab',
					'CTRL+B': 'bold',
					'CTRL+I': 'italic',
					'CTRL+U': 'underline',
					'CTRL+SHIFT+S': 'strikethrough',
					'CTRL+BACKSLASH': 'removeFormat',
					'CTRL+SHIFT+L': 'justifyLeft',
					'CTRL+SHIFT+E': 'justifyCenter',
					'CTRL+SHIFT+R': 'justifyRight',
					'CTRL+SHIFT+J': 'justifyFull',
					'CTRL+SHIFT+NUM7': 'insertUnorderedList',
					'CTRL+SHIFT+NUM8': 'insertOrderedList',
					'CTRL+LEFTBRACKET': 'outdent',
					'CTRL+RIGHTBRACKET': 'indent',
					'CTRL+NUM0': 'formatPara',
					'CTRL+NUM1': 'formatH1',
					'CTRL+NUM2': 'formatH2',
					'CTRL+NUM3': 'formatH3',
					'CTRL+NUM4': 'formatH4',
					'CTRL+NUM5': 'formatH5',
					'CTRL+NUM6': 'formatH6',
					'CTRL+ENTER': 'insertHorizontalRule',
					'CTRL+K': 'showLinkDialog'
				},

				mac: {
					'ENTER': 'insertParagraph',
					'CMD+Z': 'undo',
					'CMD+SHIFT+Z': 'redo',
					'TAB': 'tab',
					'SHIFT+TAB': 'untab',
					'CMD+B': 'bold',
					'CMD+I': 'italic',
					'CMD+U': 'underline',
					'CMD+SHIFT+S': 'strikethrough',
					'CMD+BACKSLASH': 'removeFormat',
					'CMD+SHIFT+L': 'justifyLeft',
					'CMD+SHIFT+E': 'justifyCenter',
					'CMD+SHIFT+R': 'justifyRight',
					'CMD+SHIFT+J': 'justifyFull',
					'CMD+SHIFT+NUM7': 'insertUnorderedList',
					'CMD+SHIFT+NUM8': 'insertOrderedList',
					'CMD+LEFTBRACKET': 'outdent',
					'CMD+RIGHTBRACKET': 'indent',
					'CMD+NUM0': 'formatPara',
					'CMD+NUM1': 'formatH1',
					'CMD+NUM2': 'formatH2',
					'CMD+NUM3': 'formatH3',
					'CMD+NUM4': 'formatH4',
					'CMD+NUM5': 'formatH5',
					'CMD+NUM6': 'formatH6',
					'CMD+ENTER': 'insertHorizontalRule',
					'CMD+K': 'showLinkDialog'
				}
			}
		},

		// default language: en-US
		lang: {
			'en-US': {
				font: {
					bold: 'Bold',
					italic: 'Italic',
					underline: 'Underline',
					clear: 'Remove Font Style',
					height: 'Line Height',
					name: 'Font Family'
				},
				image: {
					image: 'Picture',
					insert: 'Insert Image',
					resizeFull: 'Resize Full',
					resizeHalf: 'Resize Half',
					resizeQuarter: 'Resize Quarter',
					floatLeft: 'Float Left',
					floatRight: 'Float Right',
					floatNone: 'Float None',
					shapeRounded: 'Shape: Rounded',
					shapeCircle: 'Shape: Circle',
					shapeThumbnail: 'Shape: Thumbnail',
					shapeNone: 'Shape: None',
					dragImageHere: 'Drag image or text here',
					dropImage: 'Drop image or Text',
					selectFromFiles: 'Select from files',
					maximumFileSize: 'Maximum file size',
					maximumFileSizeError: 'Maximum file size exceeded.',
					url: 'Image URL',
					remove: 'Remove Image'
				},
				link: {
					link: 'Link',
					insert: 'Insert Link',
					unlink: 'Unlink',
					edit: 'Edit',
					textToDisplay: 'Text to display',
					url: 'To what URL should this link go?',
					openInNewWindow: 'Open in new window'
				},
				table: {
					table: 'Table'
				},
				hr: {
					insert: 'Insert Horizontal Rule'
				},
				style: {
					style: 'Style',
					normal: 'Normal',
					blockquote: 'Quote',
					pre: 'Code',
					h1: 'Header 1',
					h2: 'Header 2',
					h3: 'Header 3',
					h4: 'Header 4',
					h5: 'Header 5',
					h6: 'Header 6'
				},
				lists: {
					unordered: 'Unordered list',
					ordered: 'Ordered list'
				},
				options: {
					help: 'Help',
					fullscreen: 'Full Screen',
					codeview: 'Code View'
				},
				paragraph: {
					paragraph: 'Paragraph',
					outdent: 'Outdent',
					indent: 'Indent',
					left: 'Align left',
					center: 'Align center',
					right: 'Align right',
					justify: 'Justify full'
				},
				color: {
					recent: 'Recent Color',
					more: 'More Color',
					background: 'Background Color',
					foreground: 'Foreground Color',
					transparent: 'Transparent',
					setTransparent: 'Set transparent',
					reset: 'Reset',
					resetToDefault: 'Reset to default'
				},
				shortcut: {
					shortcuts: 'Keyboard shortcuts',
					close: 'Close',
					textFormatting: 'Text formatting',
					action: 'Action',
					paragraphFormatting: 'Paragraph formatting',
					documentStyle: 'Document Style',
					extraKeys: 'Extra keys'
				},
				history: {
					undo: 'Undo',
					redo: 'Redo'
				}
			}
		}
	};

	/**
	 * @class core.async
	 *
	 * Async functions which returns `Promise`
	 *
	 * @singleton
	 * @alternateClassName async
	 */
	var async = (function () {
		/**
		 * @method readFileAsDataURL
		 *
		 * read contents of file as representing URL
		 *
		 * @param {File} file
		 * @return {Promise} - then: sDataUrl
		 */
		var readFileAsDataURL = function (file) {
			return $.Deferred(function (deferred) {
				$.extend(new FileReader(), {
					onload: function (e) {
						var sDataURL = e.target.result;
						deferred.resolve(sDataURL);
					},
					onerror: function () {
						deferred.reject(this);
					}
				}).readAsDataURL(file);
			}).promise();
		};

		/**
		 * @method createImage
		 *
		 * create `<image>` from url string
		 *
		 * @param {String} sUrl
		 * @param {String} filename
		 * @return {Promise} - then: $image
		 */
		var createImage = function (sUrl, filename) {
			return $.Deferred(function (deferred) {
				var $img = $('<img>');

				$img.one('load', function () {
					$img.off('error abort');
					deferred.resolve($img);
				}).one('error abort', function () {
					$img.off('load').detach();
					deferred.reject($img);
				}).css({
					display: 'none'
				}).appendTo(document.body).attr({
					'src': sUrl,
					'data-filename': filename
				});
			}).promise();
		};

		return {
			readFileAsDataURL: readFileAsDataURL,
			createImage: createImage
		};
	})();

	/**
	 * @class core.key
	 *
	 * Object for keycodes.
	 *
	 * @singleton
	 * @alternateClassName key
	 */
	var key = {
		/**
		 * @method isEdit
		 *
		 * @param {Number} keyCode
		 * @return {Boolean}
		 */
		isEdit: function (keyCode) {
			return list.contains([8, 9, 13, 32], keyCode);
		},
		/**
		 * @property {Object} nameFromCode
		 * @property {String} nameFromCode.8 "BACKSPACE"
		 */
		nameFromCode: {
			'8': 'BACKSPACE',
			'9': 'TAB',
			'13': 'ENTER',
			'32': 'SPACE',

			// Number: 0-9
			'48': 'NUM0',
			'49': 'NUM1',
			'50': 'NUM2',
			'51': 'NUM3',
			'52': 'NUM4',
			'53': 'NUM5',
			'54': 'NUM6',
			'55': 'NUM7',
			'56': 'NUM8',

			// Alphabet: a-z
			'66': 'B',
			'69': 'E',
			'73': 'I',
			'74': 'J',
			'75': 'K',
			'76': 'L',
			'82': 'R',
			'83': 'S',
			'85': 'U',
			'89': 'Y',
			'90': 'Z',

			'191': 'SLASH',
			'219': 'LEFTBRACKET',
			'220': 'BACKSLASH',
			'221': 'RIGHTBRACKET'
		}
	};

	/**
	 * @class editing.History
	 *
	 * Editor History
	 *
	 */
	var History = function ($editable) {
		var stack = [], stackOffset = -1;
		var editable = $editable[0];

		var makeSnapshot = function () {
			var rng = range.create();
			var emptyBookmark = { s: { path: [], offset: 0 }, e: { path: [], offset: 0 } };

			return {
				contents: $editable.html(),
				bookmark: (rng ? rng.bookmark(editable) : emptyBookmark)
			};
		};

		var applySnapshot = function (snapshot) {
			if (snapshot.contents !== null) {
				$editable.html(snapshot.contents);
			}
			if (snapshot.bookmark !== null) {
				range.createFromBookmark(editable, snapshot.bookmark).select();
			}
		};

		/**
		 * undo
		 */
		this.undo = function () {
			if (0 < stackOffset) {
				stackOffset--;
				applySnapshot(stack[stackOffset]);
			}
		};

		/**
		 * redo
		 */
		this.redo = function () {
			if (stack.length - 1 > stackOffset) {
				stackOffset++;
				applySnapshot(stack[stackOffset]);
			}
		};

		/**
		 * recorded undo
		 */
		this.recordUndo = function () {
			stackOffset++;

			// Wash out stack after stackOffset
			if (stack.length > stackOffset) {
				stack = stack.slice(0, stackOffset);
			}

			// Create new snapshot and push it to the end
			stack.push(makeSnapshot());
		};

		// Create first undo stack
		this.recordUndo();
	};

	/**
	 * @class editing.Style
	 *
	 * Style
	 *
	 */
	var Style = function () {
		/**
		 * @method jQueryCSS
		 *
		 * passing an array of style properties to .css()
		 * will result in an object of property-value pairs.
		 * (compability with version < 1.9)
		 *
		 * @private
		 * @param  {jQuery} $obj
		 * @param  {Array} propertyNames - An array of one or more CSS properties.
		 * @return {Object}
		 */
		var jQueryCSS = function ($obj, propertyNames) {
			if (agent.jqueryVersion < 1.9) {
				var result = {};
				$.each(propertyNames, function (idx, propertyName) {
					result[propertyName] = $obj.css(propertyName);
				});
				return result;
			}
			return $obj.css.call($obj, propertyNames);
		};

		/**
		 * paragraph level style
		 *
		 * @param {WrappedRange} rng
		 * @param {Object} styleInfo
		 */
		this.stylePara = function (rng, styleInfo) {
			$.each(rng.nodes(dom.isPara, {
				includeAncestor: true
			}), function (idx, para) {
				$(para).css(styleInfo);
			});
		};

		/**
		 * insert and returns styleNodes on range.
		 *
		 * @param {WrappedRange} rng
		 * @param {Object} [options] - options for styleNodes
		 * @param {String} [options.nodeName] - default: `SPAN`
		 * @param {Boolean} [options.expandClosestSibling] - default: `false`
		 * @param {Boolean} [options.onlyPartialContains] - default: `false`
		 * @return {Node[]}
		 */
		this.styleNodes = function (rng, options) {
			rng = rng.splitText();

			var nodeName = options && options.nodeName || 'SPAN';
			var expandClosestSibling = !!(options && options.expandClosestSibling);
			var onlyPartialContains = !!(options && options.onlyPartialContains);

			if (rng.isCollapsed()) {
				return rng.insertNode(dom.create(nodeName));
			}

			var pred = dom.makePredByNodeName(nodeName);
			var nodes = $.map(rng.nodes(dom.isText, {
				fullyContains: true
			}), function (text) {
				return dom.singleChildAncestor(text, pred) || dom.wrap(text, nodeName);
			});

			if (expandClosestSibling) {
				if (onlyPartialContains) {
					var nodesInRange = rng.nodes();
					// compose with partial contains predication
					pred = func.and(pred, function (node) {
						return list.contains(nodesInRange, node);
					});
				}

				return $.map(nodes, function (node) {
					var siblings = dom.withClosestSiblings(node, pred);
					var head = list.head(siblings);
					var tails = list.tail(siblings);
					$.each(tails, function (idx, elem) {
						dom.appendChildNodes(head, elem.childNodes);
						dom.remove(elem);
					});
					return list.head(siblings);
				});
			} else {
				return nodes;
			}
		};

		/**
		 * get current style on cursor
		 *
		 * @param {WrappedRange} rng
		 * @param {Node} target - target element on event
		 * @return {Object} - object contains style properties.
		 */
		this.current = function (rng, target) {
			var $cont = $(dom.isText(rng.sc) ? rng.sc.parentNode : rng.sc);
			var properties = ['font-family', 'font-size', 'text-align', 'list-style-type', 'line-height'];
			var styleInfo = jQueryCSS($cont, properties) || {};

			styleInfo['font-size'] = parseInt(styleInfo['font-size'], 10);

			// document.queryCommandState for toggle state
			styleInfo['font-bold'] = document.queryCommandState('bold') ? 'bold' : 'normal';
			styleInfo['font-italic'] = document.queryCommandState('italic') ? 'italic' : 'normal';
			styleInfo['font-underline'] = document.queryCommandState('underline') ? 'underline' : 'normal';
			styleInfo['font-strikethrough'] = document.queryCommandState('strikeThrough') ? 'strikethrough' : 'normal';
			styleInfo['font-superscript'] = document.queryCommandState('superscript') ? 'superscript' : 'normal';
			styleInfo['font-subscript'] = document.queryCommandState('subscript') ? 'subscript' : 'normal';

			// list-style-type to list-style(unordered, ordered)
			if (!rng.isOnList()) {
				styleInfo['list-style'] = 'none';
			} else {
				var aOrderedType = ['circle', 'disc', 'disc-leading-zero', 'square'];
				var isUnordered = $.inArray(styleInfo['list-style-type'], aOrderedType) > -1;
				styleInfo['list-style'] = isUnordered ? 'unordered' : 'ordered';
			}

			var para = dom.ancestor(rng.sc, dom.isPara);
			if (para && para.style['line-height']) {
				styleInfo['line-height'] = para.style.lineHeight;
			} else {
				var lineHeight = parseInt(styleInfo['line-height'], 10) / parseInt(styleInfo['font-size'], 10);
				styleInfo['line-height'] = lineHeight.toFixed(1);
			}

			styleInfo.image = dom.isImg(target) && target;
			styleInfo.anchor = rng.isOnAnchor() && dom.ancestor(rng.sc, dom.isAnchor);
			styleInfo.ancestors = dom.listAncestor(rng.sc, dom.isEditable);
			styleInfo.range = rng;

			return styleInfo;
		};
	};


	/**
	 * @class editing.Typing
	 *
	 * Typing
	 *
	 */
	var Typing = function () {

		/**
		 * insert tab
		 *
		 * @param {jQuery} $editable
		 * @param {WrappedRange} rng
		 * @param {Number} tabsize
		 */
		this.insertTab = function ($editable, rng, tabsize) {
			var tab = dom.createText(new Array(tabsize + 1).join(dom.NBSP_CHAR));
			rng = rng.deleteContents();
			rng.insertNode(tab, true);

			rng = range.create(tab, tabsize);
			rng.select();
		};

		/**
		 * insert paragraph
		 */
		this.insertParagraph = function () {
			var rng = range.create();

			// deleteContents on range.
			rng = rng.deleteContents();

			// Wrap range if it needs to be wrapped by paragraph
			rng = rng.wrapBodyInlineWithPara();

			// finding paragraph
			var splitRoot = dom.ancestor(rng.sc, dom.isPara);

			var nextPara;
			// on paragraph: split paragraph
			if (splitRoot) {
				nextPara = dom.splitTree(splitRoot, rng.getStartPoint());

				var emptyAnchors = dom.listDescendant(splitRoot, dom.isEmptyAnchor);
				emptyAnchors = emptyAnchors.concat(dom.listDescendant(nextPara, dom.isEmptyAnchor));

				$.each(emptyAnchors, function (idx, anchor) {
					dom.remove(anchor);
				});
				// no paragraph: insert empty paragraph
			} else {
				var next = rng.sc.childNodes[rng.so];
				nextPara = $(dom.emptyPara)[0];
				if (next) {
					rng.sc.insertBefore(nextPara, next);
				} else {
					rng.sc.appendChild(nextPara);
				}
			}

			range.create(nextPara, 0).normalize().select();
		};

	};

	/**
	 * @class editing.Table
	 *
	 * Table
	 *
	 */
	var Table = function () {
		/**
		 * handle tab key
		 *
		 * @param {WrappedRange} rng
		 * @param {Boolean} isShift
		 */
		this.tab = function (rng, isShift) {
			var cell = dom.ancestor(rng.commonAncestor(), dom.isCell);
			var table = dom.ancestor(cell, dom.isTable);
			var cells = dom.listDescendant(table, dom.isCell);

			var nextCell = list[isShift ? 'prev' : 'next'](cells, cell);
			if (nextCell) {
				range.create(nextCell, 0).select();
			}
		};

		/**
		 * create empty table element
		 *
		 * @param {Number} rowCount
		 * @param {Number} colCount
		 * @return {Node}
		 */
		this.createTable = function (colCount, rowCount) {
			var tds = [], tdHTML;
			for (var idxCol = 0; idxCol < colCount; idxCol++) {
				tds.push('<td>' + dom.blank + '</td>');
			}
			tdHTML = tds.join('');

			var trs = [], trHTML;
			for (var idxRow = 0; idxRow < rowCount; idxRow++) {
				trs.push('<tr>' + tdHTML + '</tr>');
			}
			trHTML = trs.join('');
			return $('<table class="table table-bordered">' + trHTML + '</table>')[0];
		};
	};


	/**
	 * @class editing.Bullet
	 *
	 * @alternateClassName Bullet
	 */
	var Bullet = function () {
		/**
		 * @method insertOrderedList
		 *
		 * toggle ordered list
		 *
		 * @type command
		 */
		this.insertOrderedList = function () {
			this.toggleList('OL');
		};

		/**
		 * @method insertUnorderedList
		 *
		 * toggle unordered list
		 *
		 * @type command
		 */
		this.insertUnorderedList = function () {
			this.toggleList('UL');
		};

		/**
		 * @method indent
		 *
		 * indent
		 *
		 * @type command
		 */
		this.indent = function () {
			var self = this;
			var rng = range.create().wrapBodyInlineWithPara();

			var paras = rng.nodes(dom.isPara, { includeAncestor: true });
			var clustereds = list.clusterBy(paras, func.peq2('parentNode'));

			$.each(clustereds, function (idx, paras) {
				var head = list.head(paras);
				if (dom.isLi(head)) {
					self.wrapList(paras, head.parentNode.nodeName);
				} else {
					$.each(paras, function (idx, para) {
						$(para).css('marginLeft', function (idx, val) {
							return (parseInt(val, 10) || 0) + 25;
						});
					});
				}
			});

			rng.select();
		};

		/**
		 * @method outdent
		 *
		 * outdent
		 *
		 * @type command
		 */
		this.outdent = function () {
			var self = this;
			var rng = range.create().wrapBodyInlineWithPara();

			var paras = rng.nodes(dom.isPara, { includeAncestor: true });
			var clustereds = list.clusterBy(paras, func.peq2('parentNode'));

			$.each(clustereds, function (idx, paras) {
				var head = list.head(paras);
				if (dom.isLi(head)) {
					self.releaseList([paras]);
				} else {
					$.each(paras, function (idx, para) {
						$(para).css('marginLeft', function (idx, val) {
							val = (parseInt(val, 10) || 0);
							return val > 25 ? val - 25 : '';
						});
					});
				}
			});

			rng.select();
		};

		/**
		 * @method toggleList
		 *
		 * toggle list
		 *
		 * @param {String} listName - OL or UL
		 */
		this.toggleList = function (listName) {
			var self = this;
			var rng = range.create().wrapBodyInlineWithPara();

			var paras = rng.nodes(dom.isPara, { includeAncestor: true });
			var bookmark = rng.paraBookmark(paras);
			var clustereds = list.clusterBy(paras, func.peq2('parentNode'));

			// paragraph to list
			if (list.find(paras, dom.isPurePara)) {
				var wrappedParas = [];
				$.each(clustereds, function (idx, paras) {
					wrappedParas = wrappedParas.concat(self.wrapList(paras, listName));
				});
				paras = wrappedParas;
				// list to paragraph or change list style
			} else {
				var diffLists = rng.nodes(dom.isList, {
					includeAncestor: true
				}).filter(function (listNode) {
					return !$.nodeName(listNode, listName);
				});

				if (diffLists.length) {
					$.each(diffLists, function (idx, listNode) {
						dom.replace(listNode, listName);
					});
				} else {
					paras = this.releaseList(clustereds, true);
				}
			}

			range.createFromParaBookmark(bookmark, paras).select();
		};

		/**
		 * @method wrapList
		 *
		 * @param {Node[]} paras
		 * @param {String} listName
		 * @return {Node[]}
		 */
		this.wrapList = function (paras, listName) {
			var head = list.head(paras);
			var last = list.last(paras);

			var prevList = dom.isList(head.previousSibling) && head.previousSibling;
			var nextList = dom.isList(last.nextSibling) && last.nextSibling;

			var listNode = prevList || dom.insertAfter(dom.create(listName || 'UL'), last);

			// P to LI
			paras = $.map(paras, function (para) {
				return dom.isPurePara(para) ? dom.replace(para, 'LI') : para;
			});

			// append to list(<ul>, <ol>)
			dom.appendChildNodes(listNode, paras);

			if (nextList) {
				dom.appendChildNodes(listNode, list.from(nextList.childNodes));
				dom.remove(nextList);
			}

			return paras;
		};

		/**
		 * @method releaseList
		 *
		 * @param {Array[]} clustereds
		 * @param {Boolean} isEscapseToBody
		 * @return {Node[]}
		 */
		this.releaseList = function (clustereds, isEscapseToBody) {
			var releasedParas = [];

			$.each(clustereds, function (idx, paras) {
				var head = list.head(paras);
				var last = list.last(paras);

				var headList = isEscapseToBody ? dom.lastAncestor(head, dom.isList) :
												 head.parentNode;
				var lastList = headList.childNodes.length > 1 ? dom.splitTree(headList, {
					node: last.parentNode,
					offset: dom.position(last) + 1
				}, true) : null;

				var middleList = dom.splitTree(headList, {
					node: head.parentNode,
					offset: dom.position(head)
				}, true);

				paras = isEscapseToBody ? dom.listDescendant(middleList, dom.isLi) :
										  list.from(middleList.childNodes).filter(dom.isLi);

				// LI to P
				if (isEscapseToBody || !dom.isList(headList.parentNode)) {
					paras = $.map(paras, function (para) {
						return dom.replace(para, 'P');
					});
				}

				$.each(list.from(paras).reverse(), function (idx, para) {
					dom.insertAfter(para, headList);
				});

				// remove empty lists
				var rootLists = list.compact([headList, middleList, lastList]);
				$.each(rootLists, function (idx, rootList) {
					var listNodes = [rootList].concat(dom.listDescendant(rootList, dom.isList));
					$.each(listNodes.reverse(), function (idx, listNode) {
						if (!dom.nodeLength(listNode)) {
							dom.remove(listNode, true);
						}
					});
				});

				releasedParas = releasedParas.concat(paras);
			});

			return releasedParas;
		};
	};

	/**
	 * @class editing.Editor
	 *
	 * Editor
	 *
	 */
	var Editor = function () {

		var style = new Style();
		var table = new Table();
		var typing = new Typing();
		var bullet = new Bullet();

		/**
		 * @method createRange
		 *
		 * create range
		 *
		 * @param {jQuery} $editable
		 * @return {WrappedRange}
		 */
		this.createRange = function ($editable) {
			$editable.focus();
			return range.create();
		};

		/**
		 * @method saveRange
		 *
		 * save current range
		 *
		 * @param {jQuery} $editable
		 * @param {Boolean} [thenCollapse=false]
		 */
		this.saveRange = function ($editable, thenCollapse) {
			$editable.focus();
			$editable.data('range', range.create());
			if (thenCollapse) {
				range.create().collapse().select();
			}
		};

		/**
		 * @method saveRange
		 *
		 * save current node list to $editable.data('childNodes')
		 *
		 * @param {jQuery} $editable
		 */
		this.saveNode = function ($editable) {
			// copy child node reference
			var copy = [];
			for (var key = 0, len = $editable[0].childNodes.length; key < len; key++) {
				copy.push($editable[0].childNodes[key]);
			}
			$editable.data('childNodes', copy);
		};

		/**
		 * @method restoreRange
		 *
		 * restore lately range
		 *
		 * @param {jQuery} $editable
		 */
		this.restoreRange = function ($editable) {
			var rng = $editable.data('range');
			if (rng) {
				rng.select();
				$editable.focus();
			}
		};

		/**
		 * @method restoreNode
		 *
		 * restore lately node list
		 *
		 * @param {jQuery} $editable
		 */
		this.restoreNode = function ($editable) {
			$editable.html('');
			var child = $editable.data('childNodes');
			for (var index = 0, len = child.length; index < len; index++) {
				$editable[0].appendChild(child[index]);
			}
		};
		/**
		 * @method currentStyle
		 *
		 * current style
		 *
		 * @param {Node} target
		 * @return {Boolean} false if range is no
		 */
		this.currentStyle = function (target) {
			var rng = range.create();
			return rng ? rng.isOnEditable() && style.current(rng, target) : false;
		};

		var triggerOnBeforeChange = this.triggerOnBeforeChange = function ($editable) {
			var onBeforeChange = $editable.data('callbacks').onBeforeChange;
			if (onBeforeChange) {
				onBeforeChange($editable.html(), $editable);
			}
		};

		var triggerOnChange = this.triggerOnChange = function ($editable) {
			var onChange = $editable.data('callbacks').onChange;
			if (onChange) {
				onChange($editable.html(), $editable);
			}
		};

		/**
		 * @method undo
		 * undo
		 * @param {jQuery} $editable
		 */
		this.undo = function ($editable) {
			triggerOnBeforeChange($editable);
			$editable.data('NoteHistory').undo();
			triggerOnChange($editable);
		};

		/**
		 * @method redo
		 * redo
		 * @param {jQuery} $editable
		 */
		this.redo = function ($editable) {
			triggerOnBeforeChange($editable);
			$editable.data('NoteHistory').redo();
			triggerOnChange($editable);
		};

		/**
		 * @method beforeCommand
		 * before command
		 * @param {jQuery} $editable
		 */
		var beforeCommand = this.beforeCommand = function ($editable) {
			triggerOnBeforeChange($editable);
		};

		/**
		 * @method afterCommand
		 * after command
		 * @param {jQuery} $editable
		 */
		var afterCommand = this.afterCommand = function ($editable) {
			$editable.data('NoteHistory').recordUndo();
			triggerOnChange($editable);
		};

		/**
		 * @method bold
		 * @param {jQuery} $editable
		 * @param {Mixed} value
		 */

		/**
		 * @method italic
		 * @param {jQuery} $editable
		 * @param {Mixed} value
		 */

		/**
		 * @method underline
		 * @param {jQuery} $editable
		 * @param {Mixed} value
		 */

		/**
		 * @method strikethrough
		 * @param {jQuery} $editable
		 * @param {Mixed} value
		 */

		/**
		 * @method formatBlock
		 * @param {jQuery} $editable
		 * @param {Mixed} value
		 */

		/**
		 * @method superscript
		 * @param {jQuery} $editable
		 * @param {Mixed} value
		 */

		/**
		 * @method subscript
		 * @param {jQuery} $editable
		 * @param {Mixed} value
		 */

		/**
		 * @method justifyLeft
		 * @param {jQuery} $editable
		 * @param {Mixed} value
		 */

		/**
		 * @method justifyCenter
		 * @param {jQuery} $editable
		 * @param {Mixed} value
		 */

		/**
		 * @method justifyRight
		 * @param {jQuery} $editable
		 * @param {Mixed} value
		 */

		/**
		 * @method justifyFull
		 * @param {jQuery} $editable
		 * @param {Mixed} value
		 */

		/**
		 * @method formatBlock
		 * @param {jQuery} $editable
		 * @param {Mixed} value
		 */

		/**
		 * @method removeFormat
		 * @param {jQuery} $editable
		 * @param {Mixed} value
		 */

		/**
		 * @method backColor
		 * @param {jQuery} $editable
		 * @param {Mixed} value
		 */

		/**
		 * @method foreColor
		 * @param {jQuery} $editable
		 * @param {Mixed} value
		 */

		/**
		 * @method insertHorizontalRule
		 * @param {jQuery} $editable
		 * @param {Mixed} value
		 */

		/**
		 * @method fontName
		 *
		 * change font name
		 *
		 * @param {jQuery} $editable
		 * @param {Mixed} value
		 */

		/* jshint ignore:start */
		// native commands(with execCommand), generate function for execCommand
		var commands = ['bold', 'italic', 'underline', 'strikethrough', 'superscript', 'subscript',
						'justifyLeft', 'justifyCenter', 'justifyRight', 'justifyFull',
						'formatBlock', 'removeFormat',
						'backColor', 'foreColor', 'insertHorizontalRule', 'fontName'];

		for (var idx = 0, len = commands.length; idx < len; idx++) {
			this[commands[idx]] = (function (sCmd) {
				return function ($editable, value) {
					beforeCommand($editable);

					document.execCommand(sCmd, false, value);

					afterCommand($editable);
				};
			})(commands[idx]);
		}
		/* jshint ignore:end */

		/**
		 * @method tab
		 *
		 * handle tab key
		 *
		 * @param {jQuery} $editable
		 * @param {Object} options
		 */
		this.tab = function ($editable, options) {
			var rng = range.create();
			if (rng.isCollapsed() && rng.isOnCell()) {
				table.tab(rng);
			} else {
				beforeCommand($editable);
				typing.insertTab($editable, rng, options.tabsize);
				afterCommand($editable);
			}
		};

		/**
		 * @method untab
		 *
		 * handle shift+tab key
		 *
		 */
		this.untab = function () {
			var rng = range.create();
			if (rng.isCollapsed() && rng.isOnCell()) {
				table.tab(rng, true);
			}
		};

		/**
		 * @method insertParagraph
		 *
		 * insert paragraph
		 *
		 * @param {Node} $editable
		 */
		this.insertParagraph = function ($editable) {
			beforeCommand($editable);
			typing.insertParagraph($editable);
			afterCommand($editable);
		};

		/**
		 * @method insertOrderedList
		 *
		 * @param {jQuery} $editable
		 */
		this.insertOrderedList = function ($editable) {
			beforeCommand($editable);
			bullet.insertOrderedList($editable);
			afterCommand($editable);
		};

		/**
		 * @param {jQuery} $editable
		 */
		this.insertUnorderedList = function ($editable) {
			beforeCommand($editable);
			bullet.insertUnorderedList($editable);
			afterCommand($editable);
		};

		/**
		 * @param {jQuery} $editable
		 */
		this.indent = function ($editable) {
			beforeCommand($editable);
			bullet.indent($editable);
			afterCommand($editable);
		};

		/**
		 * @param {jQuery} $editable
		 */
		this.outdent = function ($editable) {
			beforeCommand($editable);
			bullet.outdent($editable);
			afterCommand($editable);
		};

		/**
		 * insert image
		 *
		 * @param {jQuery} $editable
		 * @param {String} sUrl
		 */
		this.insertImage = function ($editable, sUrl, filename) {
			async.createImage(sUrl, filename).then(function ($image) {
				beforeCommand($editable);
				$image.css({
					display: '',
					width: Math.min($editable.width(), $image.width())
				});
				range.create().insertNode($image[0]);
				range.createFromNode($image[0]).collapse().select();
				afterCommand($editable);
			}).fail(function () {
				var callbacks = $editable.data('callbacks');
				if (callbacks.onImageUploadError) {
					callbacks.onImageUploadError();
				}
			});
		};

		/**
		 * @method insertNode
		 * insert node
		 * @param {Node} $editable
		 * @param {Node} node
		 */
		this.insertNode = function ($editable, node) {
			beforeCommand($editable);
			var rng = this.createRange($editable);
			rng.insertNode(node);
			range.createFromNode(node).collapse().select();
			afterCommand($editable);
		};

		/**
		 * insert text
		 * @param {Node} $editable
		 * @param {String} text
		 */
		this.insertText = function ($editable, text) {
			beforeCommand($editable);
			var rng = this.createRange($editable);
			var textNode = rng.insertNode(dom.createText(text));
			range.create(textNode, dom.nodeLength(textNode)).select();
			afterCommand($editable);
		};

		/**
		 * formatBlock
		 *
		 * @param {jQuery} $editable
		 * @param {String} tagName
		 */
		this.formatBlock = function ($editable, tagName) {
			beforeCommand($editable);
			tagName = agent.isMSIE ? '<' + tagName + '>' : tagName;
			document.execCommand('FormatBlock', false, tagName);
			afterCommand($editable);
		};

		this.formatPara = function ($editable) {
			beforeCommand($editable);
			this.formatBlock($editable, 'P');
			afterCommand($editable);
		};

		/* jshint ignore:start */
		for (var idx = 1; idx <= 6; idx++) {
			this['formatH' + idx] = function (idx) {
				return function ($editable) {
					this.formatBlock($editable, 'H' + idx);
				};
			}(idx);
		};
		/* jshint ignore:end */

		/**
		 * fontsize
		 *
		 * @param {jQuery} $editable
		 * @param {String} value - px
		 */
		this.fontSize = function ($editable, value) {
			beforeCommand($editable);

			var rng = this.createRange($editable);
			var spans = style.styleNodes(rng);
			$.each(spans, function (idx, span) {
				$(span).css({
					'font-size': value + 'px'
				});
			});

			afterCommand($editable);
		};

		/**
		 * lineHeight
		 * @param {jQuery} $editable
		 * @param {String} value
		 */
		this.lineHeight = function ($editable, value) {
			beforeCommand($editable);
			style.stylePara(range.create(), {
				lineHeight: value
			});
			afterCommand($editable);
		};

		/**
		 * unlink
		 *
		 * @type command
		 *
		 * @param {jQuery} $editable
		 */
		this.unlink = function ($editable) {
			var rng = range.create();
			if (rng.isOnAnchor()) {
				var anchor = dom.ancestor(rng.sc, dom.isAnchor);
				rng = range.createFromNode(anchor);
				rng.select();

				beforeCommand($editable);
				document.execCommand('unlink');
				afterCommand($editable);
			}
		};

		/**
		 * create link (command)
		 *
		 * @param {jQuery} $editable
		 * @param {Object} linkInfo
		 * @param {Object} options
		 */
		this.createLink = function ($editable, linkInfo, options) {
			var linkUrl = linkInfo.url;
			var linkText = linkInfo.text;
			var isNewWindow = linkInfo.newWindow;
			var rng = linkInfo.range;
			var isTextChanged = rng.toString() !== linkText;

			beforeCommand($editable);

			if (options.onCreateLink) {
				linkUrl = options.onCreateLink(linkUrl);
			}

			var anchors;
			if (isTextChanged) {
				// Create a new link when text changed.
				var anchor = rng.insertNode($('<A>' + linkText + '</A>')[0]);
				anchors = [anchor];
			} else {
				anchors = style.styleNodes(rng, {
					nodeName: 'A',
					expandClosestSibling: true,
					onlyPartialContains: true
				});
			}

			$.each(anchors, function (idx, anchor) {
				$(anchor).attr('href', linkUrl);
				if (isNewWindow) {
					$(anchor).attr('target', '_blank');
				} else {
					$(anchor).removeAttr('target');
				}
			});

			var startRange = range.createFromNode(list.head(anchors)).collapse(true);
			var startPoint = startRange.getStartPoint();
			var endRange = range.createFromNode(list.last(anchors)).collapse();
			var endPoint = endRange.getEndPoint();

			range.create(
			  startPoint.node,
			  startPoint.offset,
			  endPoint.node,
			  endPoint.offset
			).select();

			afterCommand($editable);
		};

		/**
		 * returns link info
		 *
		 * @return {Object}
		 * @return {WrappedRange} return.range
		 * @return {String} return.text
		 * @return {Boolean} [return.isNewWindow=true]
		 * @return {String} [return.url=""]
		 */
		this.getLinkInfo = function ($editable) {
			$editable.focus();

			var rng = range.create().expand(dom.isAnchor);

			// Get the first anchor on range(for edit).
			var $anchor = $(list.head(rng.nodes(dom.isAnchor)));

			return {
				range: rng,
				text: rng.toString(),
				isNewWindow: $anchor.length ? $anchor.attr('target') === '_blank' : false,
				url: $anchor.length ? $anchor.attr('href') : ''
			};
		};

		/**
		 * setting color
		 *
		 * @param {Node} $editable
		 * @param {Object} sObjColor  color code
		 * @param {String} sObjColor.foreColor foreground color
		 * @param {String} sObjColor.backColor background color
		 */
		this.color = function ($editable, sObjColor) {
			var oColor = JSON.parse(sObjColor);
			var foreColor = oColor.foreColor, backColor = oColor.backColor;

			beforeCommand($editable);

			if (foreColor) { document.execCommand('foreColor', false, foreColor); }
			if (backColor) { document.execCommand('backColor', false, backColor); }

			afterCommand($editable);
		};

		/**
		 * insert Table
		 *
		 * @param {Node} $editable
		 * @param {String} sDim dimension of table (ex : "5x5")
		 */
		this.insertTable = function ($editable, sDim) {
			var dimension = sDim.split('x');
			beforeCommand($editable);

			var rng = range.create();
			rng = rng.deleteContents();
			rng.insertNode(table.createTable(dimension[0], dimension[1]));
			afterCommand($editable);
		};

		/**
		 * float me
		 *
		 * @param {jQuery} $editable
		 * @param {String} value
		 * @param {jQuery} $target
		 */
		this.floatMe = function ($editable, value, $target) {
			beforeCommand($editable);
			$target.css('float', value);
			afterCommand($editable);
		};

		/**
		 * change image shape
		 *
		 * @param {jQuery} $editable
		 * @param {String} value css class
		 * @param {Node} $target
		 */
		this.imageShape = function ($editable, value, $target) {
			beforeCommand($editable);

			$target.removeClass('img-rounded img-circle img-thumbnail');

			if (value) {
				$target.addClass(value);
			}

			afterCommand($editable);
		};

		/**
		 * resize overlay element
		 * @param {jQuery} $editable
		 * @param {String} value
		 * @param {jQuery} $target - target element
		 */
		this.resize = function ($editable, value, $target) {
			beforeCommand($editable);

			$target.css({
				width: value * 100 + '%',
				height: ''
			});

			afterCommand($editable);
		};

		/**
		 * @param {Position} pos
		 * @param {jQuery} $target - target element
		 * @param {Boolean} [bKeepRatio] - keep ratio
		 */
		this.resizeTo = function (pos, $target, bKeepRatio) {
			var imageSize;
			if (bKeepRatio) {
				var newRatio = pos.y / pos.x;
				var ratio = $target.data('ratio');
				imageSize = {
					width: ratio > newRatio ? pos.x : pos.y / ratio,
					height: ratio > newRatio ? pos.x * ratio : pos.y
				};
			} else {
				imageSize = {
					width: pos.x,
					height: pos.y
				};
			}

			$target.css(imageSize);
		};

		/**
		 * remove media object
		 *
		 * @param {jQuery} $editable
		 * @param {String} value - dummy argument (for keep interface)
		 * @param {jQuery} $target - target element
		 */
		this.removeMedia = function ($editable, value, $target) {
			beforeCommand($editable);
			$target.detach();

			var callbacks = $editable.data('callbacks');
			if (callbacks && callbacks.onMediaDelete) {
				callbacks.onMediaDelete($target, this, $editable);
			}

			afterCommand($editable);
		};

		/**
		 * set focus
		 *
		 * @param $editable
		 */
		this.focus = function ($editable) {
			$editable.focus();
		};
	};

	/**
	 * @class module.Button
	 *
	 * Button
	 */
	var Button = function () {
		/**
		 * update button status
		 *
		 * @param {jQuery} $container
		 * @param {Object} styleInfo
		 */
		this.update = function ($container, styleInfo) {
			/**
			 * handle dropdown's check mark (for fontname, fontsize, lineHeight).
			 * @param {jQuery} $btn
			 * @param {Number} value
			 */
			var checkDropdownMenu = function ($btn, value) {
				$btn.find('.dropdown-menu li a').each(function () {
					// always compare string to avoid creating another func.
					var isChecked = ($(this).data('value') + '') === (value + '');
					this.className = isChecked ? 'checked' : '';
				});
			};

			/**
			 * update button state(active or not).
			 *
			 * @private
			 * @param {String} selector
			 * @param {Function} pred
			 */
			var btnState = function (selector, pred) {
				var $btn = $container.find(selector);
				$btn.toggleClass('active', pred());
			};

			if (styleInfo.image) {
				var $img = $(styleInfo.image);

				btnState('button[data-event="imageShape"][data-value="img-rounded"]', function () {
					return $img.hasClass('img-rounded');
				});
				btnState('button[data-event="imageShape"][data-value="img-circle"]', function () {
					return $img.hasClass('img-circle');
				});
				btnState('button[data-event="imageShape"][data-value="img-thumbnail"]', function () {
					return $img.hasClass('img-thumbnail');
				});
				btnState('button[data-event="imageShape"]:not([data-value])', function () {
					return !$img.is('.img-rounded, .img-circle, .img-thumbnail');
				});

				var imgFloat = $img.css('float');
				btnState('button[data-event="floatMe"][data-value="left"]', function () {
					return imgFloat === 'left';
				});
				btnState('button[data-event="floatMe"][data-value="right"]', function () {
					return imgFloat === 'right';
				});
				btnState('button[data-event="floatMe"][data-value="none"]', function () {
					return imgFloat !== 'left' && imgFloat !== 'right';
				});

				var style = $img.attr('style');
				btnState('button[data-event="resize"][data-value="1"]', function () {
					return !!/(^|\s)(max-)?width\s*:\s*100%/.test(style);
				});
				btnState('button[data-event="resize"][data-value="0.5"]', function () {
					return !!/(^|\s)(max-)?width\s*:\s*50%/.test(style);
				});
				btnState('button[data-event="resize"][data-value="0.25"]', function () {
					return !!/(^|\s)(max-)?width\s*:\s*25%/.test(style);
				});
				return;
			}

			// fontname
			var $fontname = $container.find('.note-fontname');
			if ($fontname.length) {
				var selectedFont = styleInfo['font-family'];
				if (!!selectedFont) {

					var list = selectedFont.split(',');
					for (var i = 0, len = list.length; i < len; i++) {
						selectedFont = list[i].replace(/[\'\"]/g, '').replace(/\s+$/, '').replace(/^\s+/, '');
						if (agent.isFontInstalled(selectedFont)) {
							break;
						}
					}

					$fontname.find('.note-current-fontname').text(selectedFont);
					checkDropdownMenu($fontname, selectedFont);

				}
			}

			// fontsize
			var $fontsize = $container.find('.note-fontsize');
			$fontsize.find('.note-current-fontsize').text(styleInfo['font-size']);
			checkDropdownMenu($fontsize, parseFloat(styleInfo['font-size']));

			// lineheight
			var $lineHeight = $container.find('.note-height');
			checkDropdownMenu($lineHeight, parseFloat(styleInfo['line-height']));

			btnState('button[data-event="bold"]', function () {
				return styleInfo['font-bold'] === 'bold';
			});
			btnState('button[data-event="italic"]', function () {
				return styleInfo['font-italic'] === 'italic';
			});
			btnState('button[data-event="underline"]', function () {
				return styleInfo['font-underline'] === 'underline';
			});
			btnState('button[data-event="strikethrough"]', function () {
				return styleInfo['font-strikethrough'] === 'strikethrough';
			});
			btnState('button[data-event="superscript"]', function () {
				return styleInfo['font-superscript'] === 'superscript';
			});
			btnState('button[data-event="subscript"]', function () {
				return styleInfo['font-subscript'] === 'subscript';
			});
			btnState('button[data-event="justifyLeft"]', function () {
				return styleInfo['text-align'] === 'left' || styleInfo['text-align'] === 'start';
			});
			btnState('button[data-event="justifyCenter"]', function () {
				return styleInfo['text-align'] === 'center';
			});
			btnState('button[data-event="justifyRight"]', function () {
				return styleInfo['text-align'] === 'right';
			});
			btnState('button[data-event="justifyFull"]', function () {
				return styleInfo['text-align'] === 'justify';
			});
			btnState('button[data-event="insertUnorderedList"]', function () {
				return styleInfo['list-style'] === 'unordered';
			});
			btnState('button[data-event="insertOrderedList"]', function () {
				return styleInfo['list-style'] === 'ordered';
			});
		};

		/**
		 * update recent color
		 *
		 * @param {Node} button
		 * @param {String} eventName
		 * @param {Mixed} value
		 */
		this.updateRecentColor = function (button, eventName, value) {
			var $color = $(button).closest('.note-color');
			var $recentColor = $color.find('.note-recent-color');
			var colorInfo = JSON.parse($recentColor.attr('data-value'));
			colorInfo[eventName] = value;
			$recentColor.attr('data-value', JSON.stringify(colorInfo));
			var sKey = eventName === 'backColor' ? 'background-color' : 'color';
			$recentColor.find('i').css(sKey, value);
		};
	};

	/**
	 * @class module.Toolbar
	 *
	 * Toolbar
	 */
	var Toolbar = function () {
		var button = new Button();

		this.update = function ($toolbar, styleInfo) {
			button.update($toolbar, styleInfo);
		};

		/**
		 * @param {Node} button
		 * @param {String} eventName
		 * @param {String} value
		 */
		this.updateRecentColor = function (buttonNode, eventName, value) {
			button.updateRecentColor(buttonNode, eventName, value);
		};

		/**
		 * activate buttons exclude codeview
		 * @param {jQuery} $toolbar
		 */
		this.activate = function ($toolbar) {
			$toolbar.find('button')
					.not('button[data-event="codeview"]')
					.removeClass('disabled');
		};

		/**
		 * deactivate buttons exclude codeview
		 * @param {jQuery} $toolbar
		 */
		this.deactivate = function ($toolbar) {
			$toolbar.find('button')
					.not('button[data-event="codeview"]')
					.addClass('disabled');
		};

		/**
		 * @param {jQuery} $container
		 * @param {Boolean} [bFullscreen=false]
		 */
		this.updateFullscreen = function ($container, bFullscreen) {
			var $btn = $container.find('button[data-event="fullscreen"]');
			$btn.toggleClass('active', bFullscreen);
		};

		/**
		 * @param {jQuery} $container
		 * @param {Boolean} [isCodeview=false]
		 */
		this.updateCodeview = function ($container, isCodeview) {
			var $btn = $container.find('button[data-event="codeview"]');
			$btn.toggleClass('active', isCodeview);

			if (isCodeview) {
				this.deactivate($container);
			} else {
				this.activate($container);
			}
		};

		/**
		 * get button in toolbar 
		 *
		 * @param {jQuery} $editable
		 * @param {String} name
		 * @return {jQuery}
		 */
		this.get = function ($editable, name) {
			var $toolbar = dom.makeLayoutInfo($editable).toolbar();

			return $toolbar.find('[data-name=' + name + ']');
		};

		/**
		 * set button state
		 * @param {jQuery} $editable
		 * @param {String} name
		 * @param {Boolean} [isActive=true]
		 */
		this.setButtonState = function ($editable, name, isActive) {
			isActive = (isActive === false) ? false : true;

			var $button = this.get($editable, name);
			$button.toggleClass('active', isActive);
		};
	};

	var EDITABLE_PADDING = 24;

	var Statusbar = function () {
		var $document = $(document);

		this.attach = function (layoutInfo, options) {
			if (!options.disableResizeEditor) {
				layoutInfo.statusbar().on('mousedown', hStatusbarMousedown);
			}
		};

		/**
		 * `mousedown` event handler on statusbar
		 *
		 * @param {MouseEvent} event
		 */
		var hStatusbarMousedown = function (event) {
			event.preventDefault();
			event.stopPropagation();

			var $editable = dom.makeLayoutInfo(event.target).editable();
			var editableTop = $editable.offset().top - $document.scrollTop();

			var layoutInfo = dom.makeLayoutInfo(event.currentTarget || event.target);
			var options = layoutInfo.editor().data('options');

			$document.on('mousemove', function (event) {
				var nHeight = event.clientY - (editableTop + EDITABLE_PADDING);

				nHeight = (options.minHeight > 0) ? Math.max(nHeight, options.minHeight) : nHeight;
				nHeight = (options.maxHeight > 0) ? Math.min(nHeight, options.maxHeight) : nHeight;

				$editable.height(nHeight);
			}).one('mouseup', function () {
				$document.off('mousemove');
			});
		};
	};

	/**
	 * @class module.Popover
	 *
	 * Popover (http://getbootstrap.com/javascript/#popovers)
	 *
	 */
	var Popover = function () {
		var button = new Button();

		/**
		 * returns position from placeholder
		 *
		 * @private
		 * @param {Node} placeholder
		 * @param {Boolean} isAirMode
		 * @return {Object}
		 * @return {Number} return.left
		 * @return {Number} return.top
		 */
		var posFromPlaceholder = function (placeholder, isAirMode) {
			var $placeholder = $(placeholder);
			var pos = isAirMode ? $placeholder.offset() : $placeholder.position();
			var height = $placeholder.outerHeight(true); // include margin

			// popover below placeholder.
			return {
				left: pos.left,
				top: pos.top + height
			};
		};

		/**
		 * show popover
		 *
		 * @private
		 * @param {jQuery} popover
		 * @param {Position} pos
		 */
		var showPopover = function ($popover, pos) {
			$popover.css({
				display: 'block',
				left: pos.left,
				top: pos.top
			});
		};

		var PX_POPOVER_ARROW_OFFSET_X = 20;

		/**
		 * update current state
		 * @param {jQuery} $popover - popover container
		 * @param {Object} styleInfo - style object
		 * @param {Boolean} isAirMode
		 */
		this.update = function ($popover, styleInfo, isAirMode) {
			button.update($popover, styleInfo);

			var $linkPopover = $popover.find('.note-link-popover');
			if (styleInfo.anchor) {
				var $anchor = $linkPopover.find('a');
				var href = $(styleInfo.anchor).attr('href');
				var target = $(styleInfo.anchor).attr('target');
				$anchor.attr('href', href).html(href);
				if (!target) {
					$anchor.removeAttr('target');
				} else {
					$anchor.attr('target', '_blank');
				}
				showPopover($linkPopover, posFromPlaceholder(styleInfo.anchor, isAirMode));
			} else {
				$linkPopover.hide();
			}

			var $imagePopover = $popover.find('.note-image-popover');
			if (styleInfo.image) {
				showPopover($imagePopover, posFromPlaceholder(styleInfo.image, isAirMode));
			} else {
				$imagePopover.hide();
			}

			var $airPopover = $popover.find('.note-air-popover');
			if (isAirMode && !styleInfo.range.isCollapsed()) {
				var rect = list.last(styleInfo.range.getClientRects());
				if (rect) {
					var bnd = func.rect2bnd(rect);
					showPopover($airPopover, {
						left: Math.max(bnd.left + bnd.width / 2 - PX_POPOVER_ARROW_OFFSET_X, 0),
						top: bnd.top + bnd.height
					});
				}
			} else {
				$airPopover.hide();
			}
		};

		/**
		 * @param {Node} button
		 * @param {String} eventName
		 * @param {String} value
		 */
		this.updateRecentColor = function (button, eventName, value) {
			button.updateRecentColor(button, eventName, value);
		};

		/**
		 * hide all popovers
		 * @param {jQuery} $popover - popover container
		 */
		this.hide = function ($popover) {
			$popover.children().hide();
		};
	};

	/**
	 * @class module.Handle
	 *
	 * Handle
	 */
	var Handle = function (handler) {
		var $document = $(document);

		/**
		 * `mousedown` event handler on $handle
		 *  - controlSizing: resize image
		 *
		 * @param {MouseEvent} event
		 */
		var hHandleMousedown = function (event) {
			if (dom.isControlSizing(event.target)) {
				event.preventDefault();
				event.stopPropagation();

				var layoutInfo = dom.makeLayoutInfo(event.target),
					$handle = layoutInfo.handle(),
					$popover = layoutInfo.popover(),
					$editable = layoutInfo.editable(),
					$editor = layoutInfo.editor();

				var target = $handle.find('.note-control-selection').data('target'),
					$target = $(target), posStart = $target.offset(),
					scrollTop = $document.scrollTop();

				var isAirMode = $editor.data('options').airMode;

				$document.on('mousemove', function (event) {
					handler.invoke('editor.resizeTo', {
						x: event.clientX - posStart.left,
						y: event.clientY - (posStart.top - scrollTop)
					}, $target, !event.shiftKey);

					handler.invoke('handle.update', $handle, { image: target }, isAirMode);
					handler.invoke('popover.update', $popover, { image: target }, isAirMode);
				}).one('mouseup', function () {
					$document.off('mousemove');
					handler.invoke('editor.afterCommand', $editable);
				});

				if (!$target.data('ratio')) { // original ratio.
					$target.data('ratio', $target.height() / $target.width());
				}
			}
		};

		this.attach = function (layoutInfo) {
			layoutInfo.handle().on('mousedown', hHandleMousedown);
		};

		/**
		 * update handle
		 * @param {jQuery} $handle
		 * @param {Object} styleInfo
		 * @param {Boolean} isAirMode
		 */
		this.update = function ($handle, styleInfo, isAirMode) {
			var $selection = $handle.find('.note-control-selection');
			if (styleInfo.image) {
				var $image = $(styleInfo.image);
				var pos = isAirMode ? $image.offset() : $image.position();

				// include margin
				var imageSize = {
					w: $image.outerWidth(true),
					h: $image.outerHeight(true)
				};

				$selection.css({
					display: 'block',
					left: pos.left,
					top: pos.top,
					width: imageSize.w,
					height: imageSize.h
				}).data('target', styleInfo.image); // save current image element.
				var sizingText = imageSize.w + 'x' + imageSize.h;
				$selection.find('.note-control-selection-info').text(sizingText);
			} else {
				$selection.hide();
			}
		};

		/**
		 * hide
		 *
		 * @param {jQuery} $handle
		 */
		this.hide = function ($handle) {
			$handle.children().hide();
		};
	};

	var Fullscreen = function (handler) {
		var $window = $(window);
		var $scrollbar = $('html, body');

		/**
		 * toggle fullscreen
		 *
		 * @param {Object} layoutInfo
		 */
		this.toggle = function (layoutInfo) {

			var $editor = layoutInfo.editor(),
				$toolbar = layoutInfo.toolbar(),
				$editable = layoutInfo.editable(),
				$codable = layoutInfo.codable();

			var resize = function (size) {
				$editable.css('height', size.h);
				$codable.css('height', size.h);
				if ($codable.data('cmeditor')) {
					$codable.data('cmeditor').setsize(null, size.h);
				}
			};

			$editor.toggleClass('fullscreen');
			var isFullscreen = $editor.hasClass('fullscreen');
			if (isFullscreen) {
				$editable.data('orgheight', $editable.css('height'));

				$window.on('resize', function () {
					resize({
						h: $window.height() - $toolbar.outerHeight() - 142
				});
				}).trigger('resize');

				$scrollbar.css('overflow', 'hidden');
			} else {
				$window.off('resize');
				resize({
					h: $editable.data('orgheight')
				});
				$scrollbar.css('overflow', 'visible');
			}

			handler.invoke('toolbar.updateFullscreen', $toolbar, isFullscreen);
		};
	};


	var CodeMirror;
	if (agent.hasCodeMirror) {
		if (agent.isSupportAmd) {
			__browserify_shim_require__(['CodeMirror'], function (cm) {
				CodeMirror = cm;
			});
		} else {
			CodeMirror = window.CodeMirror;
		}
	}

	/**
	 * @class Codeview
	 */
	var Codeview = function (handler) {

		this.sync = function (layoutInfo) {
			var isCodeview = handler.invoke('codeview.isActivated', layoutInfo);
			if (isCodeview && agent.hasCodeMirror) {
				layoutInfo.codable().data('cmEditor').save();
			}
		};

		/**
		 * @param {Object} layoutInfo
		 * @return {Boolean}
		 */
		this.isActivated = function (layoutInfo) {
			var $editor = layoutInfo.editor();
			return $editor.hasClass('codeview');
		};

		/**
		 * toggle codeview
		 *
		 * @param {Object} layoutInfo
		 */
		this.toggle = function (layoutInfo) {
			if (this.isActivated(layoutInfo)) {
				this.deactivate(layoutInfo);
			} else {
				this.activate(layoutInfo);
			}
		};

		/**
		 * activate code view
		 *
		 * @param {Object} layoutInfo
		 */
		this.activate = function (layoutInfo) {
			var $editor = layoutInfo.editor(),
				$toolbar = layoutInfo.toolbar(),
				$editable = layoutInfo.editable(),
				$codable = layoutInfo.codable(),
				$popover = layoutInfo.popover(),
				$handle = layoutInfo.handle();

			var options = $editor.data('options');

			$codable.val(dom.html($editable, options.prettifyHtml));

            // uncomment script tags so they're correct in code view
			$codable.val($codable.val().replace('<!--<script', '<script'));
			$codable.val($codable.val().replace('</script>-->', '</script>'));

			$codable.height($editable.height());

			handler.invoke('toolbar.updateCodeview', $toolbar, true);
			handler.invoke('popover.hide', $popover);
			handler.invoke('handle.hide', $handle);

			$editor.addClass('codeview');

			$codable.focus();

			// activate CodeMirror as codable
			if (agent.hasCodeMirror) {
				var cmEditor = CodeMirror.fromTextArea($codable[0], options.codemirror);

				// CodeMirror TernServer
				if (options.codemirror.tern) {
					var server = new CodeMirror.TernServer(options.codemirror.tern);
					cmEditor.ternServer = server;
					cmEditor.on('cursorActivity', function (cm) {
						server.updateArgHints(cm);
					});
				}

				// CodeMirror hasn't Padding.
				cmEditor.setSize(null, $editable.outerHeight());
				$codable.data('cmEditor', cmEditor);
			}
		};

		/**
		 * deactivate code view
		 *
		 * @param {Object} layoutInfo
		 */
		this.deactivate = function (layoutInfo) {
			var $editor = layoutInfo.editor(),
				$toolbar = layoutInfo.toolbar(),
				$editable = layoutInfo.editable(),
				$codable = layoutInfo.codable();

			var options = $editor.data('options');

			// deactivate CodeMirror as codable
			if (agent.hasCodeMirror) {
				var cmEditor = $codable.data('cmEditor');
				$codable.val(cmEditor.getValue());
				cmEditor.toTextArea();
			}

			$editable.html(dom.value($codable, options.prettifyHtml) || dom.emptyPara);

		    // replace script tags so they're not executed when loaded in admin
			var codeToReplace = $editable.html();

			codeToReplace = codeToReplace.replace('<script', '<!--<script');
			codeToReplace = codeToReplace.replace('</script>', '</script>-->');

			$editable.html(codeToReplace);

			$editable.height(options.height ? $codable.height() : 'auto');
			$editor.removeClass('codeview');

			$editable.focus();

			handler.invoke('toolbar.updateCodeview', $toolbar, false);

            window.stop();
		};
	};

	var DragAndDrop = function (handler) {
		var $document = $(document);

		/**
		 * attach Drag and Drop Events
		 *
		 * @param {Object} layoutInfo - layout Informations
		 * @param {Object} options
		 */
		this.attach = function (layoutInfo, options) {
			if (options.airMode || options.disableDragAndDrop) {
				// prevent default drop event
				$document.on('drop', function (e) {
					e.preventDefault();
				});
			} else {
				this.attachDragAndDropEvent(layoutInfo, options);
			}
		};

		/**
		 * attach Drag and Drop Events
		 *
		 * @param {Object} layoutInfo - layout Informations
		 * @param {Object} options
		 */
		this.attachDragAndDropEvent = function (layoutInfo, options) {
			var collection = $(),
				$editor = layoutInfo.editor(),
				$dropzone = layoutInfo.dropzone(),
				$dropzoneMessage = $dropzone.find('.note-dropzone-message');

			// show dropzone on dragenter when dragging a object to document
			// -but only if the editor is visible, i.e. has a positive width and height
			$document.on('dragenter', function (e) {
				var isCodeview = handler.invoke('codeview.isActivated', layoutInfo);
				var hasEditorSize = $editor.width() > 0 && $editor.height() > 0;
				if (!isCodeview && !collection.length && hasEditorSize) {
					$editor.addClass('dragover');
					$dropzone.width($editor.width());
					$dropzone.height($editor.height());
					$dropzoneMessage.text(options.langInfo.image.dragImageHere);
				}
				collection = collection.add(e.target);
			}).on('dragleave', function (e) {
				collection = collection.not(e.target);
				if (!collection.length) {
					$editor.removeClass('dragover');
				}
			}).on('drop', function () {
				collection = $();
				$editor.removeClass('dragover');
			});

			// change dropzone's message on hover.
			$dropzone.on('dragenter', function () {
				$dropzone.addClass('hover');
				$dropzoneMessage.text(options.langInfo.image.dropImage);
			}).on('dragleave', function () {
				$dropzone.removeClass('hover');
				$dropzoneMessage.text(options.langInfo.image.dragImageHere);
			});

			// attach dropImage
			$dropzone.on('drop', function (event) {
				event.preventDefault();

				var dataTransfer = event.originalEvent.dataTransfer;
				var html = dataTransfer.getData('text/html');
				var text = dataTransfer.getData('text/plain');

				var layoutInfo = dom.makeLayoutInfo(event.currentTarget || event.target);

				if (dataTransfer && dataTransfer.files && dataTransfer.files.length) {
					layoutInfo.editable().focus();
					handler.insertImages(layoutInfo, dataTransfer.files);
				} else if (html) {
					$(html).each(function () {
						layoutInfo.editable().focus();
						handler.invoke('editor.insertNode', layoutInfo.editable(), this);
					});
				} else if (text) {
					layoutInfo.editable().focus();
					handler.invoke('editor.insertText', layoutInfo.editable(), text);
				}
			}).on('dragover', false); // prevent default dragover event
		};
	};

	var Clipboard = function (handler) {

		this.attach = function (layoutInfo) {
			layoutInfo.editable().on('paste', hPasteClipboardImage);
		};

		/**
		 * paste clipboard image
		 *
		 * @param {Event} event
		 */
		var hPasteClipboardImage = function (event) {
			var clipboardData = event.originalEvent.clipboardData;
			var layoutInfo = dom.makeLayoutInfo(event.currentTarget || event.target);
			var $editable = layoutInfo.editable();

			if (!clipboardData || !clipboardData.items || !clipboardData.items.length) {
				var callbacks = $editable.data('callbacks');
				// only can run if it has onImageUpload method
				if (!callbacks.onImageUpload) {
					return;
				}

				// save cursor
				handler.invoke('editor.saveNode', $editable);
				handler.invoke('editor.saveRange', $editable);

				$editable.html('');

				setTimeout(function () {
					var $img = $editable.find('img');

					// if img is no in clipboard, insert text or dom
					if (!$img.length || $img[0].src.indexOf('data:') === -1) {
						var html = $editable.html();

						handler.invoke('editor.restoreNode', $editable);
						handler.invoke('editor.restoreRange', $editable);

						try {
							// insert normal dom code
							$(html).each(function () {
								$editable.focus();
								handler.invoke('editor.insertNode', $editable, this);
							});
						} catch (ex) {
							// insert text
							$editable.focus();
							handler.invoke('editor.insertText', $editable, html);
						}
						return;
					}

					var datauri = $img[0].src;

					var data = atob(datauri.split(',')[1]);
					var array = new Uint8Array(data.length);
					for (var i = 0; i < data.length; i++) {
						array[i] = data.charCodeAt(i);
					}

					var blob = new Blob([array], { type: 'image/png' });
					blob.name = 'clipboard.png';

					handler.invoke('editor.restoreNode', $editable);
					handler.invoke('editor.restoreRange', $editable);
					handler.insertImages(layoutInfo, [blob]);

					handler.invoke('editor.afterCommand', $editable);
				}, 0);

				return;
			}

			var item = list.head(clipboardData.items);
			var isClipboardImage = item.kind === 'file' && item.type.indexOf('image/') !== -1;

			if (isClipboardImage) {
				handler.insertImages(layoutInfo, [item.getAsFile()]);
			}

			handler.invoke('editor.afterCommand', $editable);
		};
	};

	var LinkDialog = function (handler) {

		/**
		 * toggle button status
		 *
		 * @private
		 * @param {jQuery} $btn
		 * @param {Boolean} isEnable
		 */
		var toggleBtn = function ($btn, isEnable) {
			$btn.toggleClass('disabled', !isEnable);
			$btn.attr('disabled', !isEnable);
		};

		/**
		 * Show link dialog and set event handlers on dialog controls.
		 *
		 * @param {jQuery} $editable
		 * @param {jQuery} $dialog
		 * @param {Object} linkInfo
		 * @return {Promise}
		 */
		this.showLinkDialog = function ($editable, $dialog, linkInfo) {
			return $.Deferred(function (deferred) {
				var $linkDialog = $dialog.find('.note-link-dialog');

				var $linkText = $linkDialog.find('.note-link-text'),
				$linkUrl = $linkDialog.find('.note-link-url'),
				$linkBtn = $linkDialog.find('.note-link-btn'),
				$openInNewWindow = $linkDialog.find('input[type=checkbox]');

				$linkDialog.one('shown.bs.modal', function () {
					$linkText.val(linkInfo.text);

					$linkText.on('input', function () {
						// if linktext was modified by keyup,
						// stop cloning text from linkUrl
						linkInfo.text = $linkText.val();
					});

					// if no url was given, copy text to url
					if (!linkInfo.url) {
						linkInfo.url = linkInfo.text;
						toggleBtn($linkBtn, linkInfo.text);
					}

					$linkUrl.on('input', function () {
						toggleBtn($linkBtn, $linkUrl.val());
						// display same link on `Text to display` input
						// when create a new link
						if (!linkInfo.text) {
							$linkText.val($linkUrl.val());
						}
					}).val(linkInfo.url).trigger('focus').trigger('select');

					$openInNewWindow.prop('checked', linkInfo.newWindow);

					$linkBtn.one('click', function (event) {
						event.preventDefault();

						deferred.resolve({
							range: linkInfo.range,
							url: $linkUrl.val(),
							text: $linkText.val(),
							newWindow: $openInNewWindow.is(':checked')
						});
						$linkDialog.modal('hide');
					});
				}).one('hidden.bs.modal', function () {
					// detach events
					$linkText.off('input');
					$linkUrl.off('input');
					$linkBtn.off('click');

					if (deferred.state() === 'pending') {
						deferred.reject();
					}
				}).modal('show');
			}).promise();
		};

		/**
		 * @param {Object} layoutInfo
		 */
		this.show = function (layoutInfo) {
			var $editor = layoutInfo.editor(),
				$dialog = layoutInfo.dialog(),
				$editable = layoutInfo.editable(),
				$popover = layoutInfo.popover(),
				linkInfo = handler.invoke('editor.getLinkInfo', $editable);

			var options = $editor.data('options');

			handler.invoke('editor.saveRange', $editable);
			this.showLinkDialog($editable, $dialog, linkInfo).then(function (linkInfo) {
				handler.invoke('editor.restoreRange', $editable);
				handler.invoke('editor.createLink', $editable, linkInfo, options);
				// hide popover after creating link
				handler.invoke('popover.hide', $popover);
			}).fail(function () {
				handler.invoke('editor.restoreRange', $editable);
			});
		};
	};

	var ImageDialog = function (handler) {
		/**
		 * toggle button status
		 *
		 * @private
		 * @param {jQuery} $btn
		 * @param {Boolean} isEnable
		 */
		var toggleBtn = function ($btn, isEnable) {
			$btn.toggleClass('disabled', !isEnable);
			$btn.attr('disabled', !isEnable);
		};

		this.show = function (layoutInfo) {
			var $dialog = layoutInfo.dialog(),
				$editable = layoutInfo.editable();

			handler.invoke('editor.saveRange', $editable);
			this.showImageDialog($editable, $dialog).then(function (data) {
				handler.invoke('editor.restoreRange', $editable);

				if (typeof data === 'string') {
					// image url
					handler.invoke('editor.insertImage', $editable, data);
				} else {
					// array of files
					handler.insertImages(layoutInfo, data);
				}
			}).fail(function () {
				handler.invoke('editor.restoreRange', $editable);
			});
		};

		/**
		 * show image dialog
		 *
		 * @param {jQuery} $editable
		 * @param {jQuery} $dialog
		 * @return {Promise}
		 */
		this.showImageDialog = function ($editable, $dialog) {
			return $.Deferred(function (deferred) {
				var $imageDialog = $dialog.find('.note-image-dialog');

				var $imageInput = $dialog.find('.note-image-input'),
					$imageUrl = $dialog.find('.note-image-url'),
					$imageBtn = $dialog.find('.note-image-btn');

				$imageDialog.one('shown.bs.modal', function () {
					// Cloning imageInput to clear element.
					$imageInput.replaceWith($imageInput.clone()
					  .on('change', function () {
					  	deferred.resolve(this.files || this.value);
					  	$imageDialog.modal('hide');
					  })
					  .val('')
					);

					$imageBtn.click(function (event) {
						event.preventDefault();

						deferred.resolve($imageUrl.val());
						$imageDialog.modal('hide');
					});

					$imageUrl.on('keyup paste', function (event) {
						var url;

						if (event.type === 'paste') {
							url = event.originalEvent.clipboardData.getData('text');
						} else {
							url = $imageUrl.val();
						}

						toggleBtn($imageBtn, url);
					}).val('').trigger('focus');
				}).one('hidden.bs.modal', function () {
					$imageInput.off('change');
					$imageUrl.off('keyup paste');
					$imageBtn.off('click');

					if (deferred.state() === 'pending') {
						deferred.reject();
					}
				}).modal('show');
			});
		};
	};

	var HelpDialog = function (handler) {
		/**
		 * show help dialog
		 *
		 * @param {jQuery} $editable
		 * @param {jQuery} $dialog
		 * @return {Promise}
		 */
		this.showHelpDialog = function ($editable, $dialog) {
			return $.Deferred(function (deferred) {
				var $helpDialog = $dialog.find('.note-help-dialog');

				$helpDialog.one('hidden.bs.modal', function () {
					deferred.resolve();
				}).modal('show');
			}).promise();
		};

		/**
		 * @param {Object} layoutInfo
		 */
		this.show = function (layoutInfo) {
			var $dialog = layoutInfo.dialog(),
				$editable = layoutInfo.editable();

			handler.invoke('editor.saveRange', $editable, true);
			this.showHelpDialog($editable, $dialog).then(function () {
				handler.invoke('editor.restoreRange', $editable);
			});
		};
	};


	/**
	 * @class EventHandler
	 *
	 * EventHandler
	 *  - TODO: new instance per a editor
	 *  - TODO: rename EventHandler
	 */
	var EventHandler = function () {
		/**
		 * Modules
		 */
		var modules = this.modules = {
			editor: new Editor(this),
			toolbar: new Toolbar(this),
			statusbar: new Statusbar(this),
			popover: new Popover(this),
			handle: new Handle(this),
			fullscreen: new Fullscreen(this),
			codeview: new Codeview(this),
			dragAndDrop: new DragAndDrop(this),
			clipboard: new Clipboard(this),
			linkDialog: new LinkDialog(this),
			imageDialog: new ImageDialog(this),
			helpDialog: new HelpDialog(this)
		};

		// TODO refactor modules and eventHandler
		//  - remove this method and use custom event from $holder instead
		this.invoke = function () {
			var moduleAndMethod = list.head(list.from(arguments));
			var args = list.tail(list.from(arguments));

			var splits = moduleAndMethod.split('.');
			var hasSeparator = splits.length > 1;
			var moduleName = hasSeparator && list.head(splits);
			var methodName = hasSeparator ? list.last(splits) : list.head(splits);

			var module = this.getModule(moduleName);
			var method = module[methodName];

			return method && method.apply(module, args);
		};

		/**
		 * returns module
		 *
		 * @param {String} moduleName - name of module
		 * @return {Module} - defaults is editor
		 */
		this.getModule = function (moduleName) {
			return this.modules[moduleName] || this.modules.editor;
		};

		/**
		 * insert Images from file array.
		 *
		 * @private
		 * @param {Object} layoutInfo
		 * @param {File[]} files
		 */
		this.insertImages = function (layoutInfo, files) {
			var $editor = layoutInfo.editor(),
				$editable = layoutInfo.editable(),
				$holder = layoutInfo.holder();

			var callbacks = $editable.data('callbacks');
			var options = $editor.data('options');

			// If onImageUpload options setted
			if (callbacks.onImageUpload) {
				callbacks.onImageUpload(files, modules.editor, $editable);
				bindCustomEvent($holder, 'image.upload')([files]);
				// else insert Image as dataURL
			} else {
				$.each(files, function (idx, file) {
					var filename = file.name;
					if (options.maximumImageFileSize && options.maximumImageFileSize < file.size) {
						if (callbacks.onImageUploadError) {
							callbacks.onImageUploadError(options.langInfo.image.maximumFileSizeError);
							bindCustomEvent($holder, 'image.upload.error')(options.langInfo.image.maximumFileSizeError);
						} else {
							alert(options.langInfo.image.maximumFileSizeError);
						}
					} else {
						async.readFileAsDataURL(file).then(function (sDataURL) {
							modules.editor.insertImage($editable, sDataURL, filename);
						}).fail(function () {
							if (callbacks.onImageUploadError) {
								callbacks.onImageUploadError();
								bindCustomEvent($holder, 'image.upload.error')(options.langInfo.image.maximumFileSizeError);
							}
						});
					}
				});
			}
		};

		var commands = {
			/**
			 * @param {Object} layoutInfo
			 */
			showLinkDialog: function (layoutInfo) {
				modules.linkDialog.show(layoutInfo);
			},

			/**
			 * @param {Object} layoutInfo
			 */
			showImageDialog: function (layoutInfo) {
				modules.imageDialog.show(layoutInfo);
			},

			/**
			 * @param {Object} layoutInfo
			 */
			showHelpDialog: function (layoutInfo) {
				modules.helpDialog.show(layoutInfo);
			},

			/**
			 * @param {Object} layoutInfo
			 */
			fullscreen: function (layoutInfo) {
				modules.fullscreen.toggle(layoutInfo);
			},

			/**
			 * @param {Object} layoutInfo
			 */
			codeview: function (layoutInfo) {
				modules.codeview.toggle(layoutInfo);
			}
		};

		var hMousedown = function (event) {
			//preventDefault Selection for FF, IE8+
			if (dom.isImg(event.target)) {
				event.preventDefault();
			}
		};

		var hToolbarAndPopoverUpdate = function (event) {
			// delay for range after mouseup
			setTimeout(function () {
				var layoutInfo = dom.makeLayoutInfo(event.currentTarget || event.target);
				var styleInfo = modules.editor.currentStyle(event.target);
				if (!styleInfo) { return; }

				var isAirMode = layoutInfo.editor().data('options').airMode;
				if (!isAirMode) {
					modules.toolbar.update(layoutInfo.toolbar(), styleInfo);
				}

				modules.popover.update(layoutInfo.popover(), styleInfo, isAirMode);
				modules.handle.update(layoutInfo.handle(), styleInfo, isAirMode);
			}, 0);
		};

		var hScroll = function (event) {
			var layoutInfo = dom.makeLayoutInfo(event.currentTarget || event.target);
			//hide popover and handle when scrolled
			modules.popover.hide(layoutInfo.popover());
			modules.handle.hide(layoutInfo.handle());
		};

		var hToolbarAndPopoverMousedown = function (event) {
			// prevent default event when insertTable (FF, Webkit)
			var $btn = $(event.target).closest('[data-event]');
			if ($btn.length) {
				event.preventDefault();
			}
		};

		var hToolbarAndPopoverClick = function (event) {
			var $btn = $(event.target).closest('[data-event]');

			if ($btn.length) {
				var eventName = $btn.attr('data-event'),
					value = $btn.attr('data-value'),
					hide = $btn.attr('data-hide');

				var layoutInfo = dom.makeLayoutInfo(event.target);

				// before command: detect control selection element($target)
				var $target;
				if ($.inArray(eventName, ['resize', 'floatMe', 'removeMedia', 'imageShape']) !== -1) {
					var $selection = layoutInfo.handle().find('.note-control-selection');
					$target = $($selection.data('target'));
				}

				// If requested, hide the popover when the button is clicked.
				// Useful for things like showHelpDialog.
				if (hide) {
					$btn.parents('.popover').hide();
				}

				if ($.isFunction($.summernote.pluginEvents[eventName])) {
					$.summernote.pluginEvents[eventName](event, modules.editor, layoutInfo, value);
				} else if (modules.editor[eventName]) { // on command
					var $editable = layoutInfo.editable();
					$editable.focus();
					modules.editor[eventName]($editable, value, $target);
					event.preventDefault();
				} else if (commands[eventName]) {
					commands[eventName].call(this, layoutInfo);
					event.preventDefault();
				}

				// after command
				if ($.inArray(eventName, ['backColor', 'foreColor']) !== -1) {
					var options = layoutInfo.editor().data('options', options);
					var module = options.airMode ? modules.popover : modules.toolbar;
					module.updateRecentColor(list.head($btn), eventName, value);
				}

				hToolbarAndPopoverUpdate(event);
			}
		};

		var PX_PER_EM = 18;
		var hDimensionPickerMove = function (event, options) {
			var $picker = $(event.target.parentNode); // target is mousecatcher
			var $dimensionDisplay = $picker.next();
			var $catcher = $picker.find('.note-dimension-picker-mousecatcher');
			var $highlighted = $picker.find('.note-dimension-picker-highlighted');
			var $unhighlighted = $picker.find('.note-dimension-picker-unhighlighted');

			var posOffset;
			// HTML5 with jQuery - e.offsetX is undefined in Firefox
			if (event.offsetX === undefined) {
				var posCatcher = $(event.target).offset();
				posOffset = {
					x: event.pageX - posCatcher.left,
					y: event.pageY - posCatcher.top
				};
			} else {
				posOffset = {
					x: event.offsetX,
					y: event.offsetY
				};
			}

			var dim = {
				c: Math.ceil(posOffset.x / PX_PER_EM) || 1,
				r: Math.ceil(posOffset.y / PX_PER_EM) || 1
			};

			$highlighted.css({ width: dim.c + 'em', height: dim.r + 'em' });
			$catcher.attr('data-value', dim.c + 'x' + dim.r);

			if (3 < dim.c && dim.c < options.insertTableMaxSize.col) {
				$unhighlighted.css({ width: dim.c + 1 + 'em' });
			}

			if (3 < dim.r && dim.r < options.insertTableMaxSize.row) {
				$unhighlighted.css({ height: dim.r + 1 + 'em' });
			}

			$dimensionDisplay.html(dim.c + ' x ' + dim.r);
		};

		var bindCustomEvent = function ($holder, eventName) {
			return function () {
				return $holder.trigger('summernote.' + eventName, arguments);
			};
		};

		/**
		 * bind KeyMap on keydown
		 *
		 * @param {Object} layoutInfo
		 * @param {Object} keyMap
		 */
		this.bindKeyMap = function (layoutInfo, keyMap) {
			var $editor = layoutInfo.editor();
			var $editable = layoutInfo.editable();

			$editable.on('keydown', function (event) {
				var keys = [];

				// modifier
				if (event.metaKey) { keys.push('CMD'); }
				if (event.ctrlKey && !event.altKey) { keys.push('CTRL'); }
				if (event.shiftKey) { keys.push('SHIFT'); }

				// keycode
				var keyName = key.nameFromCode[event.keyCode];
				if (keyName) {
					keys.push(keyName);
				}

				var eventName = keyMap[keys.join('+')];
				if (eventName) {
					if ($.summernote.pluginEvents[eventName]) {
						var plugin = $.summernote.pluginEvents[eventName];
						if ($.isFunction(plugin)) {
							plugin(event, modules.editor, layoutInfo);
						}
					} else if (modules.editor[eventName]) {
						modules.editor[eventName]($editable, $editor.data('options'));
						event.preventDefault();
					} else if (commands[eventName]) {
						commands[eventName].call(this, layoutInfo);
						event.preventDefault();
					}
				} else if (key.isEdit(event.keyCode)) {
					modules.editor.afterCommand($editable);
				}
			});
		};

		/**
		 * attach eventhandler
		 *
		 * @param {Object} layoutInfo - layout Informations
		 * @param {Object} options - user options include custom event handlers
		 * @param {function(event)} [options.onenter] - enter key handler
		 * @param {function(event)} [options.onfocus]
		 * @param {function(event)} [options.onblur]
		 * @param {function(event)} [options.onkeyup]
		 * @param {function(event)} [options.onkeydown]
		 * @param {function(event)} [options.onpaste]
		 * @param {function(event)} [options.onToolBarclick]
		 * @param {function(event)} [options.onChange]
		 */
		this.attach = function (layoutInfo, options) {
			// handlers for editable
			if (options.shortcuts) {
				this.bindKeyMap(layoutInfo, options.keyMap[agent.isMac ? 'mac' : 'pc']);
			}
			layoutInfo.editable().on('mousedown', hMousedown);
			layoutInfo.editable().on('keyup mouseup', hToolbarAndPopoverUpdate);
			layoutInfo.editable().on('scroll', hScroll);
			modules.clipboard.attach(layoutInfo, options);

			// handler for handle and popover
			modules.handle.attach(layoutInfo, options);
			layoutInfo.popover().on('click', hToolbarAndPopoverClick);
			layoutInfo.popover().on('mousedown', hToolbarAndPopoverMousedown);

			// handler for drag and drop
			modules.dragAndDrop.attach(layoutInfo, options);

			// handlers for frame mode (toolbar, statusbar)
			if (!options.airMode) {
				// handler for toolbar
				layoutInfo.toolbar().on('click', hToolbarAndPopoverClick);
				layoutInfo.toolbar().on('mousedown', hToolbarAndPopoverMousedown);

				// handler for statusbar
				modules.statusbar.attach(layoutInfo, options);
			}

			// handler for table dimension
			var $catcherContainer = options.airMode ? layoutInfo.popover() :
													  layoutInfo.toolbar();
			var $catcher = $catcherContainer.find('.note-dimension-picker-mousecatcher');
			$catcher.css({
				width: options.insertTableMaxSize.col + 'em',
				height: options.insertTableMaxSize.row + 'em'
			}).on('mousemove', function (event) {
				hDimensionPickerMove(event, options);
			});

			// save options on editor
			layoutInfo.editor().data('options', options);

			// ret styleWithCSS for backColor / foreColor clearing with 'inherit'.
			if (!agent.isMSIE) {
				// protect FF Error: NS_ERROR_FAILURE: Failure
				setTimeout(function () {
					document.execCommand('styleWithCSS', 0, options.styleWithSpan);
				}, 0);
			}

			// History
			var history = new History(layoutInfo.editable());
			layoutInfo.editable().data('NoteHistory', history);

			// basic event callbacks (lowercase)
			// enter, focus, blur, keyup, keydown
			if (options.onenter) {
				layoutInfo.editable().keypress(function (event) {
					if (event.keyCode === key.ENTER) { options.onenter(event); }
				});
			}

			if (options.onfocus) { layoutInfo.editable().focus(options.onfocus); }
			if (options.onblur) { layoutInfo.editable().blur(options.onblur); }
			if (options.onkeyup) { layoutInfo.editable().keyup(options.onkeyup); }
			if (options.onkeydown) { layoutInfo.editable().keydown(options.onkeydown); }
			if (options.onpaste) { layoutInfo.editable().on('paste', options.onpaste); }

			// callbacks for advanced features (camel)

			// onToolbarClick
			if (options.onToolbarClick) {
				layoutInfo.toolbar().click(options.onToolbarClick);
			}

			// onChange
			if (options.onChange) {
				var hChange = function () {
					modules.editor.triggerOnChange(layoutInfo.editable());
				};

				if (agent.isMSIE) {
					var sDomEvents = 'DOMCharacterDataModified DOMSubtreeModified DOMNodeInserted';
					layoutInfo.editable().on(sDomEvents, hChange);
				} else {
					layoutInfo.editable().on('input', hChange);
				}
			}

			// All editor status will be saved on editable with jquery's data
			// for support multiple editor with singleton object.
			layoutInfo.editable().data('callbacks', {
				onBeforeChange: options.onBeforeChange,
				onChange: options.onChange,
				onAutoSave: options.onAutoSave,
				onImageUpload: options.onImageUpload,
				onImageUploadError: options.onImageUploadError,
				onFileUpload: options.onFileUpload,
				onFileUploadError: options.onFileUpload,
				onMediaDelete: options.onMediaDelete
			});

			// Textarea: auto filling the code before form submit.
			if (dom.isTextarea(list.head(layoutInfo.holder()))) {
				layoutInfo.holder().closest('form').submit(function () {
					var contents = layoutInfo.holder().code();
					layoutInfo.holder().val(contents);

					// callback on submit
					if (options.onsubmit) {
						options.onsubmit(contents);
					}
				});
			}
		};

		/**
		 * attach jquery custom event
		 *
		 * @param {Object} layoutInfo - layout Informations
		 */
		this.attachCustomEvent = function (layoutInfo, options) {
			var $holder = layoutInfo.holder();
			var $editable = layoutInfo.editable();

			$editable.on('mousedown', bindCustomEvent($holder, 'mousedown'));
			$editable.on('keyup mouseup', bindCustomEvent($holder, 'update'));
			$editable.on('scroll', bindCustomEvent($holder, 'scroll'));

			// basic event callbacks (lowercase)
			// enter, focus, blur, keyup, keydown
			$editable.keypress(function (event) {
				if (event.keyCode === key.ENTER) {
					bindCustomEvent($holder, 'enter').call(this, event);
				}
			});

			$editable.focus(bindCustomEvent($holder, 'focus'));
			$editable.blur(bindCustomEvent($holder, 'blur'));
			$editable.keyup(bindCustomEvent($holder, 'keyup'));
			$editable.keydown(bindCustomEvent($holder, 'keydown'));
			$editable.on('paste', bindCustomEvent($holder, 'paste'));

			// callbacks for advanced features (camel)
			if (!options.airMode) {
				layoutInfo.toolbar().click(bindCustomEvent($holder, 'toolbar.click'));
				layoutInfo.popover().click(bindCustomEvent($holder, 'popover.click'));
			}

			if (agent.isMSIE) {
				var sDomEvents = 'DOMCharacterDataModified DOMSubtreeModified DOMNodeInserted';
				$editable.on(sDomEvents, bindCustomEvent($holder, 'change'));
			} else {
				$editable.on('input', bindCustomEvent($holder, 'change'));
			}

			// Textarea: auto filling the code before form submit.
			if (dom.isTextarea(list.head($holder))) {
				$holder.closest('form').submit(function (e) {
					var contents = $holder.code();
					bindCustomEvent($holder, 'submit').call(this, e, contents);
				});
			}

			// fire init event
			bindCustomEvent($holder, 'init')();

			// fire plugin init event
			for (var i = 0, len = $.summernote.plugins.length; i < len; i++) {
				if ($.isFunction($.summernote.plugins[i].init)) {
					$.summernote.plugins[i].init(layoutInfo);
				}
			}
		};

		this.detach = function (layoutInfo, options) {
			layoutInfo.holder().off();
			layoutInfo.editable().off();

			layoutInfo.popover().off();
			layoutInfo.handle().off();
			layoutInfo.dialog().off();

			if (!options.airMode) {
				layoutInfo.dropzone().off();
				layoutInfo.toolbar().off();
				layoutInfo.statusbar().off();
			}
		};
	};

	/**
	 * @class Renderer
	 *
	 * renderer
	 *
	 * rendering toolbar and editable
	 */
	var Renderer = function () {

		/**
		 * bootstrap button template
		 * @private
		 * @param {String} label button name
		 * @param {Object} [options] button options
		 * @param {String} [options.event] data-event
		 * @param {String} [options.className] button's class name
		 * @param {String} [options.value] data-value
		 * @param {String} [options.title] button's title for popup
		 * @param {String} [options.dropdown] dropdown html
		 * @param {String} [options.hide] data-hide
		 */
		var tplButton = function (label, options) {
			var event = options.event;
			var value = options.value;
			var title = options.title;
			var className = options.className;
			var dropdown = options.dropdown;
			var hide = options.hide;

			return '<button type="button"' +
					   ' class="btn btn-default btn-sm btn-small' +
						 (className ? ' ' + className : '') +
						 (dropdown ? ' dropdown-toggle' : '') +
					   '"' +
					   (dropdown ? ' data-toggle="dropdown"' : '') +
					   (title ? ' title="' + title + '"' : '') +
					   (event ? ' data-event="' + event + '"' : '') +
					   (value ? ' data-value=\'' + value + '\'' : '') +
					   (hide ? ' data-hide=\'' + hide + '\'' : '') +
					   ' tabindex="-1">' +
					 label +
					 (dropdown ? ' <span class="caret"></span>' : '') +
				   '</button>' +
				   (dropdown || '');
		};

		/**
		 * bootstrap icon button template
		 * @private
		 * @param {String} iconClassName
		 * @param {Object} [options]
		 * @param {String} [options.event]
		 * @param {String} [options.value]
		 * @param {String} [options.title]
		 * @param {String} [options.dropdown]
		 */
		var tplIconButton = function (iconClassName, options) {
			var label = '<i class="' + iconClassName + '"></i>';
			return tplButton(label, options);
		};

		/**
		 * bootstrap popover template
		 * @private
		 * @param {String} className
		 * @param {String} content
		 */
		var tplPopover = function (className, content) {
			var $popover = $('<div class="' + className + ' popover bottom in" style="display: none;">' +
					 '<div class="arrow"></div>' +
					 '<div class="popover-content">' +
					 '</div>' +
				   '</div>');

			$popover.find('.popover-content').append(content);
			return $popover;
		};

		/**
		 * bootstrap dialog template
		 *
		 * @param {String} className
		 * @param {String} [title='']
		 * @param {String} body
		 * @param {String} [footer='']
		 */
		var tplDialog = function (className, title, body, footer) {
			return '<div class="' + className + ' modal" aria-hidden="false">' +
					 '<div class="modal-dialog">' +
					   '<div class="modal-content">' +
						 (title ?
						 '<div class="modal-header">' +
						   '<button type="button" class="close" aria-hidden="true" tabindex="-1">&times;</button>' +
						   '<h4 class="modal-title">' + title + '</h4>' +
						 '</div>' : ''
						 ) +
						 '<form class="note-modal-form">' +
						   '<div class="modal-body">' + body + '</div>' +
						   (footer ?
						   '<div class="modal-footer">' + footer + '</div>' : ''
						   ) +
						 '</form>' +
					   '</div>' +
					 '</div>' +
				   '</div>';
		};

		var tplButtonInfo = {
			picture: function (lang, options) {
				return tplIconButton(options.iconPrefix + 'picture-o', {
					event: 'showImageDialog',
					title: lang.image.image,
					hide: true
				});
			},
			link: function (lang, options) {
				return tplIconButton(options.iconPrefix + 'link', {
					event: 'showLinkDialog',
					title: lang.link.link,
					hide: true
				});
			},
			table: function (lang, options) {
				var dropdown = '<ul class="note-table dropdown-menu">' +
								 '<div class="note-dimension-picker">' +
								   '<div class="note-dimension-picker-mousecatcher" data-event="insertTable" data-value="1x1"></div>' +
								   '<div class="note-dimension-picker-highlighted"></div>' +
								   '<div class="note-dimension-picker-unhighlighted"></div>' +
								 '</div>' +
								 '<div class="note-dimension-display"> 1 x 1 </div>' +
							   '</ul>';
				return tplIconButton(options.iconPrefix + 'table', {
					title: lang.table.table,
					dropdown: dropdown
				});
			},
			style: function (lang, options) {
				var items = options.styleTags.reduce(function (memo, v) {
					var label = lang.style[v === 'p' ? 'normal' : v];
					return memo + '<li><a data-event="formatBlock" href="#" data-value="' + v + '">' +
							 (
							   (v === 'p' || v === 'pre') ? label :
							   '<' + v + '>' + label + '</' + v + '>'
							 ) +
						   '</a></li>';
				}, '');

				return tplIconButton(options.iconPrefix + 'magic', {
					title: lang.style.style,
					dropdown: '<ul class="dropdown-menu">' + items + '</ul>'
				});
			},
			fontname: function (lang, options) {
				var realFontList = [];
				var items = options.fontNames.reduce(function (memo, v) {
					if (!agent.isFontInstalled(v) && options.fontNamesIgnoreCheck.indexOf(v) === -1) {
						return memo;
					}
					realFontList.push(v);
					return memo + '<li><a data-event="fontName" href="#" data-value="' + v + '" style="font-family:\'' + v + '\'">' +
									'<i class="' + options.iconPrefix + 'check"></i> ' + v +
								  '</a></li>';
				}, '');

				var hasDefaultFont = agent.isFontInstalled(options.defaultFontName);
				var defaultFontName = (hasDefaultFont) ? options.defaultFontName : realFontList[0];

				var label = '<span class="note-current-fontname">' +
								defaultFontName +
							 '</span>';
				return tplButton(label, {
					title: lang.font.name,
					dropdown: '<ul class="dropdown-menu">' + items + '</ul>'
				});
			},
			color: function (lang, options) {
				var colorButtonLabel = '<i class="' + options.iconPrefix + 'font" style="color:black;background-color:yellow;"></i>';
				var colorButton = tplButton(colorButtonLabel, {
					className: 'note-recent-color',
					title: lang.color.recent,
					event: 'color',
					value: '{"backColor":"yellow"}'
				});

				var dropdown = '<ul class="dropdown-menu">' +
								 '<li>' +
								   '<div class="btn-group">' +
									 '<div class="note-palette-title">' + lang.color.background + '</div>' +
									 '<div class="note-color-reset" data-event="backColor"' +
									   ' data-value="inherit" title="' + lang.color.transparent + '">' +
									   lang.color.setTransparent +
									 '</div>' +
									 '<div class="note-color-palette" data-target-event="backColor"></div>' +
								   '</div>' +
								   '<div class="btn-group">' +
									 '<div class="note-palette-title">' + lang.color.foreground + '</div>' +
									 '<div class="note-color-reset" data-event="foreColor" data-value="inherit" title="' + lang.color.reset + '">' +
									   lang.color.resetToDefault +
									 '</div>' +
									 '<div class="note-color-palette" data-target-event="foreColor"></div>' +
								   '</div>' +
								 '</li>' +
							   '</ul>';

				var moreButton = tplButton('', {
					title: lang.color.more,
					dropdown: dropdown
				});

				return colorButton + moreButton;
			},
			bold: function (lang, options) {
				return tplIconButton(options.iconPrefix + 'bold', {
					event: 'bold',
					title: lang.font.bold
				});
			},
			italic: function (lang, options) {
				return tplIconButton(options.iconPrefix + 'italic', {
					event: 'italic',
					title: lang.font.italic
				});
			},
			underline: function (lang, options) {
				return tplIconButton(options.iconPrefix + 'underline', {
					event: 'underline',
					title: lang.font.underline
				});
			},
			clear: function (lang, options) {
				return tplIconButton(options.iconPrefix + 'eraser', {
					event: 'removeFormat',
					title: lang.font.clear
				});
			},
			ul: function (lang, options) {
				return tplIconButton(options.iconPrefix + 'list-ul', {
					event: 'insertUnorderedList',
					title: lang.lists.unordered
				});
			},
			ol: function (lang, options) {
				return tplIconButton(options.iconPrefix + 'list-ol', {
					event: 'insertOrderedList',
					title: lang.lists.ordered
				});
			},
			paragraph: function (lang, options) {
				var leftButton = tplIconButton(options.iconPrefix + 'align-left', {
					title: lang.paragraph.left,
					event: 'justifyLeft'
				});
				var centerButton = tplIconButton(options.iconPrefix + 'align-center', {
					title: lang.paragraph.center,
					event: 'justifyCenter'
				});
				var rightButton = tplIconButton(options.iconPrefix + 'align-right', {
					title: lang.paragraph.right,
					event: 'justifyRight'
				});
				var justifyButton = tplIconButton(options.iconPrefix + 'align-justify', {
					title: lang.paragraph.justify,
					event: 'justifyFull'
				});

				var outdentButton = tplIconButton(options.iconPrefix + 'outdent', {
					title: lang.paragraph.outdent,
					event: 'outdent'
				});
				var indentButton = tplIconButton(options.iconPrefix + 'indent', {
					title: lang.paragraph.indent,
					event: 'indent'
				});

				var dropdown = '<div class="dropdown-menu">' +
								 '<div class="note-align btn-group">' +
								   leftButton + centerButton + rightButton + justifyButton +
								 '</div>' +
								 '<div class="note-list btn-group">' +
								   indentButton + outdentButton +
								 '</div>' +
							   '</div>';

				return tplIconButton(options.iconPrefix + 'align-left', {
					title: lang.paragraph.paragraph,
					dropdown: dropdown
				});
			},
			height: function (lang, options) {
				var items = options.lineHeights.reduce(function (memo, v) {
					return memo + '<li><a data-event="lineHeight" href="#" data-value="' + parseFloat(v) + '">' +
									'<i class="' + options.iconPrefix + 'check"></i> ' + v +
								  '</a></li>';
				}, '');

				return tplIconButton(options.iconPrefix + 'text-height', {
					title: lang.font.height,
					dropdown: '<ul class="dropdown-menu">' + items + '</ul>'
				});

			},
			help: function (lang, options) {
				return tplIconButton(options.iconPrefix + 'question', {
					event: 'showHelpDialog',
					title: lang.options.help,
					hide: true
				});
			},
			fullscreen: function (lang, options) {
				return tplIconButton(options.iconPrefix + 'arrows-alt', {
					event: 'fullscreen',
					title: lang.options.fullscreen
				});
			},
			codeview: function (lang, options) {
				return tplIconButton(options.iconPrefix + 'code', {
					event: 'codeview',
					title: lang.options.codeview
				});
			},
			undo: function (lang, options) {
				return tplIconButton(options.iconPrefix + 'undo', {
					event: 'undo',
					title: lang.history.undo
				});
			},
			redo: function (lang, options) {
				return tplIconButton(options.iconPrefix + 'repeat', {
					event: 'redo',
					title: lang.history.redo
				});
			},
			hr: function (lang, options) {
				return tplIconButton(options.iconPrefix + 'minus', {
					event: 'insertHorizontalRule',
					title: lang.hr.insert
				});
			}
		};

		var tplPopovers = function (lang, options) {
			var tplLinkPopover = function () {
				var linkButton = tplIconButton(options.iconPrefix + 'edit', {
					title: lang.link.edit,
					event: 'showLinkDialog',
					hide: true
				});
				var unlinkButton = tplIconButton(options.iconPrefix + 'unlink', {
					title: lang.link.unlink,
					event: 'unlink'
				});
				var content = '<a href="http://www.google.com" target="_blank">www.google.com</a>&nbsp;&nbsp;' +
							  '<div class="note-insert btn-group">' +
								linkButton + unlinkButton +
							  '</div>';
				return tplPopover('note-link-popover', content);
			};

			var tplImagePopover = function () {
				var fullButton = tplButton('<span class="note-fontsize-10">100%</span>', {
					title: lang.image.resizeFull,
					event: 'resize',
					value: '1'
				});
				var halfButton = tplButton('<span class="note-fontsize-10">50%</span>', {
					title: lang.image.resizeHalf,
					event: 'resize',
					value: '0.5'
				});
				var quarterButton = tplButton('<span class="note-fontsize-10">25%</span>', {
					title: lang.image.resizeQuarter,
					event: 'resize',
					value: '0.25'
				});

				var leftButton = tplIconButton(options.iconPrefix + 'align-left', {
					title: lang.image.floatLeft,
					event: 'floatMe',
					value: 'left'
				});
				var rightButton = tplIconButton(options.iconPrefix + 'align-right', {
					title: lang.image.floatRight,
					event: 'floatMe',
					value: 'right'
				});
				var justifyButton = tplIconButton(options.iconPrefix + 'align-justify', {
					title: lang.image.floatNone,
					event: 'floatMe',
					value: 'none'
				});

				var roundedButton = tplIconButton(options.iconPrefix + 'square', {
					title: lang.image.shapeRounded,
					event: 'imageShape',
					value: 'img-rounded'
				});
				var circleButton = tplIconButton(options.iconPrefix + 'circle-o', {
					title: lang.image.shapeCircle,
					event: 'imageShape',
					value: 'img-circle'
				});
				var thumbnailButton = tplIconButton(options.iconPrefix + 'picture-o', {
					title: lang.image.shapeThumbnail,
					event: 'imageShape',
					value: 'img-thumbnail'
				});
				var noneButton = tplIconButton(options.iconPrefix + 'times', {
					title: lang.image.shapeNone,
					event: 'imageShape',
					value: ''
				});

				var removeButton = tplIconButton(options.iconPrefix + 'trash-o', {
					title: lang.image.remove,
					event: 'removeMedia',
					value: 'none'
				});

				var content = '<div class="btn-group">' + fullButton + halfButton + quarterButton + '</div>' +
							  '<div class="btn-group">' + leftButton + rightButton + justifyButton + '</div>' +
							  '<div class="btn-group">' + roundedButton + circleButton + thumbnailButton + noneButton + '</div>' +
							  '<div class="btn-group">' + removeButton + '</div>';
				return tplPopover('note-image-popover', content);
			};

			var tplAirPopover = function () {
				var $content = $('<div />');
				for (var idx = 0, len = options.airPopover.length; idx < len; idx++) {
					var group = options.airPopover[idx];

					var $group = $('<div class="note-' + group[0] + ' btn-group">');
					for (var i = 0, lenGroup = group[1].length; i < lenGroup; i++) {
						var $button = $(tplButtonInfo[group[1][i]](lang, options));

						$button.attr('data-name', group[1][i]);

						$group.append($button);
					}
					$content.append($group);
				}

				return tplPopover('note-air-popover', $content.children());
			};

			var $notePopover = $('<div class="note-popover" />');

			$notePopover.append(tplLinkPopover());
			$notePopover.append(tplImagePopover());

			if (options.airMode) {
				$notePopover.append(tplAirPopover());
			}

			return $notePopover;
		};

		var tplHandles = function () {
			return '<div class="note-handle">' +
					 '<div class="note-control-selection">' +
					   '<div class="note-control-selection-bg"></div>' +
					   '<div class="note-control-holder note-control-nw"></div>' +
					   '<div class="note-control-holder note-control-ne"></div>' +
					   '<div class="note-control-holder note-control-sw"></div>' +
					   '<div class="note-control-sizing note-control-se"></div>' +
					   '<div class="note-control-selection-info"></div>' +
					 '</div>' +
				   '</div>';
		};

		/**
		 * shortcut table template
		 * @param {String} title
		 * @param {String} body
		 */
		var tplShortcut = function (title, keys) {
			var keyClass = 'note-shortcut-col col-xs-6 note-shortcut-';
			var body = [];

			for (var i in keys) {
				if (keys.hasOwnProperty(i)) {
					body.push(
					  '<div class="' + keyClass + 'key">' + keys[i].kbd + '</div>' +
					  '<div class="' + keyClass + 'name">' + keys[i].text + '</div>'
					  );
				}
			}

			return '<div class="note-shortcut-row row"><div class="' + keyClass + 'title col-xs-offset-6">' + title + '</div></div>' +
				   '<div class="note-shortcut-row row">' + body.join('</div><div class="note-shortcut-row row">') + '</div>';
		};

		var tplShortcutText = function (lang) {
			var keys = [
			  { kbd: '⌘ + B', text: lang.font.bold },
			  { kbd: '⌘ + I', text: lang.font.italic },
			  { kbd: '⌘ + U', text: lang.font.underline },
			  { kbd: '⌘ + \\', text: lang.font.clear }
			];

			return tplShortcut(lang.shortcut.textFormatting, keys);
		};

		var tplShortcutAction = function (lang) {
			var keys = [
			  { kbd: '⌘ + Z', text: lang.history.undo },
			  { kbd: '⌘ + ⇧ + Z', text: lang.history.redo },
			  { kbd: '⌘ + ]', text: lang.paragraph.indent },
			  { kbd: '⌘ + [', text: lang.paragraph.outdent },
			  { kbd: '⌘ + ENTER', text: lang.hr.insert }
			];

			return tplShortcut(lang.shortcut.action, keys);
		};

		var tplShortcutPara = function (lang) {
			var keys = [
			  { kbd: '⌘ + ⇧ + L', text: lang.paragraph.left },
			  { kbd: '⌘ + ⇧ + E', text: lang.paragraph.center },
			  { kbd: '⌘ + ⇧ + R', text: lang.paragraph.right },
			  { kbd: '⌘ + ⇧ + J', text: lang.paragraph.justify },
			  { kbd: '⌘ + ⇧ + NUM7', text: lang.lists.ordered },
			  { kbd: '⌘ + ⇧ + NUM8', text: lang.lists.unordered }
			];

			return tplShortcut(lang.shortcut.paragraphFormatting, keys);
		};

		var tplShortcutStyle = function (lang) {
			var keys = [
			  { kbd: '⌘ + NUM0', text: lang.style.normal },
			  { kbd: '⌘ + NUM1', text: lang.style.h1 },
			  { kbd: '⌘ + NUM2', text: lang.style.h2 },
			  { kbd: '⌘ + NUM3', text: lang.style.h3 },
			  { kbd: '⌘ + NUM4', text: lang.style.h4 },
			  { kbd: '⌘ + NUM5', text: lang.style.h5 },
			  { kbd: '⌘ + NUM6', text: lang.style.h6 }
			];

			return tplShortcut(lang.shortcut.documentStyle, keys);
		};

		var tplExtraShortcuts = function (lang, options) {
			var extraKeys = options.extraKeys;
			var keys = [];

			for (var key in extraKeys) {
				if (extraKeys.hasOwnProperty(key)) {
					keys.push({ kbd: key, text: extraKeys[key] });
				}
			}

			return tplShortcut(lang.shortcut.extraKeys, keys);
		};

		var tplShortcutTable = function (lang, options) {
			var colClass = 'class="note-shortcut note-shortcut-col col-sm-6 col-xs-12"';
			var template = [
			  '<div ' + colClass + '>' + tplShortcutAction(lang, options) + '</div>' +
			  '<div ' + colClass + '>' + tplShortcutText(lang, options) + '</div>',
			  '<div ' + colClass + '>' + tplShortcutStyle(lang, options) + '</div>' +
			  '<div ' + colClass + '>' + tplShortcutPara(lang, options) + '</div>'
			];

			if (options.extraKeys) {
				template.push('<div ' + colClass + '>' + tplExtraShortcuts(lang, options) + '</div>');
			}

			return '<div class="note-shortcut-row row">' +
					 template.join('</div><div class="note-shortcut-row row">') +
				   '</div>';
		};

		var replaceMacKeys = function (sHtml) {
			return sHtml.replace(/⌘/g, 'Ctrl').replace(/⇧/g, 'Shift');
		};

		var tplDialogInfo = {
			image: function (lang, options) {
				var imageLimitation = '';
				if (options.maximumImageFileSize) {
					var unit = Math.floor(Math.log(options.maximumImageFileSize) / Math.log(1024));
					var readableSize = (options.maximumImageFileSize / Math.pow(1024, unit)).toFixed(2) * 1 +
									   ' ' + ' KMGTP'[unit] + 'B';
					imageLimitation = '<small>' + lang.image.maximumFileSize + ' : ' + readableSize + '</small>';
				}

				var body = '<div class="form-group row-fluid note-group-select-from-files">' +
							 '<label>' + lang.image.selectFromFiles + '</label>' +
							 '<input class="note-image-input" type="file" name="files" accept="image/*" multiple="multiple" />' +
							 imageLimitation +
						   '</div>' +
						   '<div class="form-group row-fluid">' +
							 '<label>' + lang.image.url + '</label>' +
							 '<input class="note-image-url form-control span12" type="text" />' +
						   '</div>';
				var footer = '<button href="#" class="btn btn-primary note-image-btn disabled" disabled>' + lang.image.insert + '</button>';
				return tplDialog('note-image-dialog', lang.image.insert, body, footer);
			},

			link: function (lang, options) {
				var body = '<div class="form-group row-fluid">' +
							 '<label>' + lang.link.textToDisplay + '</label>' +
							 '<input class="note-link-text form-control span12" type="text" />' +
						   '</div>' +
						   '<div class="form-group row-fluid">' +
							 '<label>' + lang.link.url + '</label>' +
							 '<input class="note-link-url form-control span12" type="text" />' +
						   '</div>' +
						   (!options.disableLinkTarget ?
							 '<div class="checkbox">' +
							   '<label>' + '<input type="checkbox" checked> ' +
								 lang.link.openInNewWindow +
							   '</label>' +
							 '</div>' : ''
						   );
				var footer = '<button href="#" class="btn btn-primary note-link-btn disabled" disabled>' + lang.link.insert + '</button>';
				return tplDialog('note-link-dialog', lang.link.insert, body, footer);
			},

			help: function (lang, options) {
				var body = '<a class="modal-close pull-right" aria-hidden="true" tabindex="-1">' + lang.shortcut.close + '</a>' +
						   '<div class="title">' + lang.shortcut.shortcuts + '</div>' +
						   (agent.isMac ? tplShortcutTable(lang, options) : replaceMacKeys(tplShortcutTable(lang, options))) +
						   '<p class="text-center">' +
							 '<a href="//summernote.org/" target="_blank">Summernote 0.6.3</a> · ' +
							 '<a href="//github.com/summernote/summernote" target="_blank">Project</a> · ' +
							 '<a href="//github.com/summernote/summernote/issues" target="_blank">Issues</a>' +
						   '</p>';
				return tplDialog('note-help-dialog', '', body, '');
			}
		};

		var tplDialogs = function (lang, options) {
			var dialogs = '';

			$.each(tplDialogInfo, function (idx, tplDialog) {
				dialogs += tplDialog(lang, options);
			});

			return '<div class="note-dialog">' + dialogs + '</div>';
		};

		var tplStatusbar = function () {
			return '<div class="note-resizebar">' +
					 '<div class="note-icon-bar"></div>' +
					 '<div class="note-icon-bar"></div>' +
					 '<div class="note-icon-bar"></div>' +
				   '</div>';
		};

		var representShortcut = function (str) {
			if (agent.isMac) {
				str = str.replace('CMD', '⌘').replace('SHIFT', '⇧');
			}

			return str.replace('BACKSLASH', '\\')
					  .replace('SLASH', '/')
					  .replace('LEFTBRACKET', '[')
					  .replace('RIGHTBRACKET', ']');
		};

		/**
		 * createTooltip
		 *
		 * @param {jQuery} $container
		 * @param {Object} keyMap
		 * @param {String} [sPlacement]
		 */
		var createTooltip = function ($container, keyMap, sPlacement) {
			var invertedKeyMap = func.invertObject(keyMap);
			var $buttons = $container.find('button');

			$buttons.each(function (i, elBtn) {
				var $btn = $(elBtn);
				var sShortcut = invertedKeyMap[$btn.data('event')];
				if (sShortcut) {
					$btn.attr('title', function (i, v) {
						return v + ' (' + representShortcut(sShortcut) + ')';
					});
				}
				// bootstrap tooltip on btn-group bug
				// https://github.com/twbs/bootstrap/issues/5687
			}).tooltip({
				container: 'body',
				trigger: 'hover',
				placement: sPlacement || 'top'
			}).on('click', function () {
				$(this).tooltip('hide');
			});
		};

		// createPalette
		var createPalette = function ($container, options) {
			var colorInfo = options.colors;
			$container.find('.note-color-palette').each(function () {
				var $palette = $(this), eventName = $palette.attr('data-target-event');
				var paletteContents = [];
				for (var row = 0, lenRow = colorInfo.length; row < lenRow; row++) {
					var colors = colorInfo[row];
					var buttons = [];
					for (var col = 0, lenCol = colors.length; col < lenCol; col++) {
						var color = colors[col];
						buttons.push(['<button type="button" class="note-color-btn" style="background-color:', color,
									   ';" data-event="', eventName,
									   '" data-value="', color,
									   '" title="', color,
									   '" data-toggle="button" tabindex="-1"></button>'].join(''));
					}
					paletteContents.push('<div class="note-color-row">' + buttons.join('') + '</div>');
				}
				$palette.html(paletteContents.join(''));
			});
		};

		/**
		 * create summernote layout (air mode)
		 *
		 * @param {jQuery} $holder
		 * @param {Object} options
		 */
		this.createLayoutByAirMode = function ($holder, options) {
			var langInfo = options.langInfo;
			var keyMap = options.keyMap[agent.isMac ? 'mac' : 'pc'];
			var id = func.uniqueId();

			$holder.addClass('note-air-editor note-editable');
			$holder.attr({
				'id': 'note-editor-' + id,
				'contentEditable': true
			});

			var body = document.body;

			// create Popover
			var $popover = $(tplPopovers(langInfo, options));
			$popover.addClass('note-air-layout');
			$popover.attr('id', 'note-popover-' + id);
			$popover.appendTo(body);
			createTooltip($popover, keyMap);
			createPalette($popover, options);

			// create Handle
			var $handle = $(tplHandles());
			$handle.addClass('note-air-layout');
			$handle.attr('id', 'note-handle-' + id);
			$handle.appendTo(body);

			// create Dialog
			var $dialog = $(tplDialogs(langInfo, options));
			$dialog.addClass('note-air-layout');
			$dialog.attr('id', 'note-dialog-' + id);
			$dialog.find('button.close, a.modal-close').click(function () {
				$(this).closest('.modal').modal('hide');
			});
			$dialog.appendTo(body);
		};

		/**
		 * create summernote layout (normal mode)
		 *
		 * @param {jQuery} $holder
		 * @param {Object} options
		 */
		this.createLayoutByFrame = function ($holder, options) {
			var langInfo = options.langInfo;

			var isContentEditable = !$holder.is(':disabled');

			//01. create Editor
			var $editor = $('<div class="note-editor editable-' + isContentEditable + '"></div>');
			if (options.width) {
				$editor.width(options.width);
			}

			//02. statusbar (resizebar)
			if (options.height > 0) {
				$('<div class="note-statusbar">' + (options.disableResizeEditor ? '' : tplStatusbar()) + '</div>').prependTo($editor);
			}

			//03. create Editable

			var $editable = $('<div class="note-editable" contentEditable="' + isContentEditable + '"></div>')
				.prependTo($editor);
			if (options.height) {
				$editable.height(options.height);
			}
			if (options.direction) {
				$editable.attr('dir', options.direction);
			}
			var placeholder = $holder.attr('placeholder') || options.placeholder;
			if (placeholder) {
				$editable.attr('data-placeholder', placeholder);
			}

			$editable.html(dom.html($holder));

			//031. create codable
			$('<textarea class="note-codable"></textarea>').prependTo($editor);

			//04. create Toolbar
			var $toolbar = $('<div class="note-toolbar btn-toolbar" />');
			for (var idx = 0, len = options.toolbar.length; idx < len; idx++) {
				var groupName = options.toolbar[idx][0];
				var groupButtons = options.toolbar[idx][1];

				var $group = $('<div class="note-' + groupName + ' btn-group" />');
				for (var i = 0, btnLength = groupButtons.length; i < btnLength; i++) {
					var buttonInfo = tplButtonInfo[groupButtons[i]];
					// continue creating toolbar even if a button doesn't exist
					if (!$.isFunction(buttonInfo)) { continue; }

					var $button = $(buttonInfo(langInfo, options));
					$button.attr('data-name', groupButtons[i]);  // set button's alias, becuase to get button element from $toolbar
					$group.append($button);
				}
				$toolbar.append($group);
			}

			$toolbar.prependTo($editor);
			var keyMap = options.keyMap[agent.isMac ? 'mac' : 'pc'];
			createPalette($toolbar, options);
			createTooltip($toolbar, keyMap, 'bottom');

			//05. create Popover
			var $popover = $(tplPopovers(langInfo, options)).prependTo($editor);
			createPalette($popover, options);
			createTooltip($popover, keyMap);

			//06. handle(control selection, ...)
			$(tplHandles()).prependTo($editor);

			//07. create Dialog
			var $dialog = $(tplDialogs(langInfo, options)).prependTo($editor);
			$dialog.find('button.close, a.modal-close').click(function () {
				$(this).closest('.modal').modal('hide');
			});

			//08. create Dropzone
			$('<div class="note-dropzone"><div class="note-dropzone-message"></div></div>').prependTo($editor);

			//09. Editor/Holder switch
			$editor.insertAfter($holder);
			$holder.hide();
		};

		this.hasNoteEditor = function ($holder) {
			return this.noteEditorFromHolder($holder).length > 0;
		};

		this.noteEditorFromHolder = function ($holder) {
			if ($holder.hasClass('note-air-editor')) {
				return $holder;
			} else if ($holder.next().hasClass('note-editor')) {
				return $holder.next();
			} else {
				return $();
			}
		};

		/**
		 * create summernote layout
		 *
		 * @param {jQuery} $holder
		 * @param {Object} options
		 */
		this.createLayout = function ($holder, options) {
			if (options.airMode) {
				this.createLayoutByAirMode($holder, options);
			} else {
				this.createLayoutByFrame($holder, options);
			}
		};

		/**
		 * returns layoutInfo from holder
		 *
		 * @param {jQuery} $holder - placeholder
		 * @return {Object}
		 */
		this.layoutInfoFromHolder = function ($holder) {
			var $editor = this.noteEditorFromHolder($holder);
			if (!$editor.length) {
				return;
			}

			// connect $holder to $editor
			$editor.data('holder', $holder);

			return dom.buildLayoutInfo($editor);
		};

		/**
		 * removeLayout
		 *
		 * @param {jQuery} $holder - placeholder
		 * @param {Object} layoutInfo
		 * @param {Object} options
		 *
		 */
		this.removeLayout = function ($holder, layoutInfo, options) {
			if (options.airMode) {
				$holder.removeClass('note-air-editor note-editable')
					   .removeAttr('id contentEditable');

				layoutInfo.popover().remove();
				layoutInfo.handle().remove();
				layoutInfo.dialog().remove();
			} else {
				$holder.html(layoutInfo.editable().html());

				layoutInfo.editor().remove();
				$holder.show();
			}
		};

		/**
		 *
		 * @return {Object}
		 * @return {function(label, options=):string} return.button {@link #tplButton function to make text button}
		 * @return {function(iconClass, options=):string} return.iconButton {@link #tplIconButton function to make icon button}
		 * @return {function(className, title=, body=, footer=):string} return.dialog {@link #tplDialog function to make dialog}
		 */
		this.getTemplate = function () {
			return {
				button: tplButton,
				iconButton: tplIconButton,
				dialog: tplDialog
			};
		};

		/**
		 * add button information
		 *
		 * @param {String} name button name
		 * @param {Function} buttonInfo function to make button, reference to {@link #tplButton},{@link #tplIconButton}
		 */
		this.addButtonInfo = function (name, buttonInfo) {
			tplButtonInfo[name] = buttonInfo;
		};

		/**
		 *
		 * @param {String} name
		 * @param {Function} dialogInfo function to make dialog, reference to {@link #tplDialog}
		 */
		this.addDialogInfo = function (name, dialogInfo) {
			tplDialogInfo[name] = dialogInfo;
		};
	};


	// jQuery namespace for summernote
	/**
	 * @class $.summernote 
	 * 
	 * summernote attribute  
	 * 
	 * @mixin defaults
	 * @singleton  
	 * 
	 */
	$.summernote = $.summernote || {};

	// extends default settings
	//  - $.summernote.version
	//  - $.summernote.options
	//  - $.summernote.lang
	$.extend($.summernote, defaults);

	var renderer = new Renderer();
	var eventHandler = new EventHandler();

	$.extend($.summernote, {
		/** @property {Renderer} */
		renderer: renderer,
		/** @property {EventHandler} */
		eventHandler: eventHandler,
		/** 
		 * @property {Object} core 
		 * @property {core.agent} core.agent 
		 * @property {core.dom} core.dom
		 * @property {core.range} core.range 
		 */
		core: {
			agent: agent,
			dom: dom,
			range: range
		},
		/** 
		 * @property {Object} 
		 * pluginEvents event list for plugins
		 * event has name and callback function.
		 * 
		 * ``` 
		 * $.summernote.addPlugin({
		 *     events : {
		 *          'hello' : function(layoutInfo, value, $target) {
		 *              console.log('event name is hello, value is ' + value );
		 *          }
		 *     }     
		 * })
		 * ```
		 * 
		 * * event name is data-event property.
		 * * layoutInfo is a summernote layout information.
		 * * value is data-value property.
		 */
		pluginEvents: {},

		plugins: []
	});

	/**
	 * @method addPlugin
	 *
	 * add Plugin in Summernote 
	 * 
	 * Summernote can make a own plugin.
	 *
	 * ### Define plugin
	 * ```
	 * // get template function  
	 * var tmpl = $.summernote.renderer.getTemplate();
	 * 
	 * // add a button   
	 * $.summernote.addPlugin({
	 *     buttons : {
	 *        // "hello"  is button's namespace.      
	 *        "hello" : function(lang, options) {
	 *            // make icon button by template function          
	 *            return tmpl.iconButton('fa fa-header', {
	 *                // callback function name when button clicked 
	 *                event : 'hello',
	 *                // set data-value property                 
	 *                value : 'hello',                
	 *                hide : true
	 *            });           
	 *        }
	 *     
	 *     }, 
	 *     
	 *     events : {
	 *        "hello" : function(layoutInfo, value) {
	 *            // here is event code 
	 *        }
	 *     }     
	 * });
	 * ``` 
	 * ### Use a plugin in toolbar
	 * 
	 * ``` 
	 *    $("#editor").summernote({
	 *    ...
	 *    toolbar : [
	 *        // display hello plugin in toolbar     
	 *        ['group', [ 'hello' ]]
	 *    ]
	 *    ...    
	 *    });
	 * ```
	 *  
	 *  
	 * @param {Object} plugin
	 * @param {Object} [plugin.buttons] define plugin button. for detail, see to Renderer.addButtonInfo
	 * @param {Object} [plugin.dialogs] define plugin dialog. for detail, see to Renderer.addDialogInfo
	 * @param {Object} [plugin.events] add event in $.summernote.pluginEvents 
	 * @param {Object} [plugin.langs] update $.summernote.lang
	 * @param {Object} [plugin.options] update $.summernote.options
	 */
	$.summernote.addPlugin = function (plugin) {

		// save plugin list
		$.summernote.plugins.push(plugin);

		if (plugin.buttons) {
			$.each(plugin.buttons, function (name, button) {
				renderer.addButtonInfo(name, button);
			});
		}

		if (plugin.dialogs) {
			$.each(plugin.dialogs, function (name, dialog) {
				renderer.addDialogInfo(name, dialog);
			});
		}

		if (plugin.events) {
			$.each(plugin.events, function (name, event) {
				$.summernote.pluginEvents[name] = event;
			});
		}

		if (plugin.langs) {
			$.each(plugin.langs, function (locale, lang) {
				if ($.summernote.lang[locale]) {
					$.extend($.summernote.lang[locale], lang);
				}
			});
		}

		if (plugin.options) {
			$.extend($.summernote.options, plugin.options);
		}
	};

	/*
	 * extend $.fn
	 */
	$.fn.extend({
		/**
		 * @method
		 * Initialize summernote
		 *  - create editor layout and attach Mouse and keyboard events.
		 * 
		 * ```
		 * $("#summernote").summernote( { options ..} );
		 * ```
		 *   
		 * @member $.fn
		 * @param {Object|String} options reference to $.summernote.options
		 * @return {this}
		 */
		summernote: function () {
			// check first argument's type
			//  - {String}: External API call {{module}}.{{method}}
			//  - {Object}: init options
			var type = $.type(list.head(arguments));
			var isExternalAPICalled = type === 'string';
			var isInitOptions = type === 'object';

			// extend default options with custom user options
			var options = isInitOptions ? list.head(arguments) : {};
			options = $.extend(true, {}, $.summernote.options, options);

			// Include langInfo in options for later use, e.g. for image drag-n-drop
			// Setup language info with en-US as default
			options.langInfo = $.extend(true, {}, $.summernote.lang['en-US'], $.summernote.lang[options.lang]);

			this.each(function (idx, holder) {
				var $holder = $(holder);

				// if layout isn't created yet, createLayout and attach events
				if (!renderer.hasNoteEditor($holder)) {
					renderer.createLayout($holder, options);

					var layoutInfo = renderer.layoutInfoFromHolder($holder);

					eventHandler.attach(layoutInfo, options);
					eventHandler.attachCustomEvent(layoutInfo, options);

				}
			});

			// callback on init
			if (!isExternalAPICalled && this.length && options.oninit) {
				options.oninit();
			}

			var $first = this.first();
			if ($first.length) {
				var layoutInfo = renderer.layoutInfoFromHolder($first);

				// external API
				if (isExternalAPICalled) {
					var moduleAndMethod = list.head(list.from(arguments));
					var args = list.tail(list.from(arguments));

					// TODO now external API only works for editor
					var params = [moduleAndMethod, layoutInfo.editable()].concat(args);
					return eventHandler.invoke.apply(eventHandler, params);
				} else if (options.focus) {
					// focus on first editable element for initialize editor
					layoutInfo.editable().focus();
				}
			}

			return this;
		},

		/**
		 * @method 
		 * 
		 * get the HTML contents of note or set the HTML contents of note.
		 *
		 * * get contents 
		 * ```
		 * var content = $("#summernote").code();
		 * ```
		 * * set contents 
		 *
		 * ```
		 * $("#summernote").code(html);
		 * ```
		 *
		 * @member $.fn 
		 * @param {String} [html] - HTML contents(optional, set)
		 * @return {this|String} - context(set) or HTML contents of note(get).
		 */
		code: function (html) {
			// get the HTML contents of note
			if (html === undefined) {
				var $holder = this.first();
				if (!$holder.length) {
					return;
				}

				var layoutInfo = renderer.layoutInfoFromHolder($holder);
				var $editable = layoutInfo && layoutInfo.editable();

				if ($editable && $editable.length) {
					var isCodeview = eventHandler.invoke('codeview.isActivated', layoutInfo);
					eventHandler.invoke('codeview.sync', layoutInfo);
					return isCodeview ? layoutInfo.codable().val() :
										layoutInfo.editable().html();
				}
				return dom.isTextarea($holder[0]) ? $holder.val() : $holder.html();
			}

			// set the HTML contents of note
			this.each(function (i, holder) {
				var layoutInfo = renderer.layoutInfoFromHolder($(holder));
				var $editable = layoutInfo && layoutInfo.editable();
				if ($editable) {
					$editable.html(html);
				}
			});

			return this;
		},

		/**
		 * @method
		 * 
		 * destroy Editor Layout and detach Key and Mouse Event
		 *
		 * @member $.fn
		 * @return {this}
		 */
		destroy: function () {
			this.each(function (idx, holder) {
				var $holder = $(holder);

				if (!renderer.hasNoteEditor($holder)) {
					return;
				}

				var info = renderer.layoutInfoFromHolder($holder);
				var options = info.editor().data('options');

				eventHandler.detach(info, options);
				renderer.removeLayout($holder, info, options);
			});

			return this;
		}
	});
}));

}).call(global, module, undefined, undefined);

}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlNjcmlwdHMvbGliL3N1bW1lcm5vdGUuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJcbjsgalF1ZXJ5ID0gZ2xvYmFsLmpRdWVyeSA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XG47IHZhciBfX2Jyb3dzZXJpZnlfc2hpbV9yZXF1aXJlX189cmVxdWlyZTsoZnVuY3Rpb24gYnJvd3NlcmlmeVNoaW0obW9kdWxlLCBkZWZpbmUsIHJlcXVpcmUpIHtcbi8qKlxuICogU3VwZXIgc2ltcGxlIHd5c2l3eWcgZWRpdG9yIG9uIEJvb3RzdHJhcCB2MC42LjNcbiAqIGh0dHA6Ly9zdW1tZXJub3RlLm9yZy9cbiAqXG4gKiBzdW1tZXJub3RlLmpzXG4gKiBDb3B5cmlnaHQgMjAxMy0yMDE1IEFsYW4gSG9uZy4gYW5kIG90aGVyIGNvbnRyaWJ1dG9yc1xuICogc3VtbWVybm90ZSBtYXkgYmUgZnJlZWx5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS4vXG4gKlxuICogRGF0ZTogMjAxNS0wNC0wOFQxMzoyOFpcbiAqL1xuKGZ1bmN0aW9uIChmYWN0b3J5KSB7XG5cdC8qIGdsb2JhbCBkZWZpbmUgKi9cblx0aWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkge1xuXHRcdC8vIEFNRC4gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIG1vZHVsZS5cblx0XHRkZWZpbmUoWydqcXVlcnknXSwgZmFjdG9yeSk7XG5cdH0gZWxzZSB7XG5cdFx0Ly8gQnJvd3NlciBnbG9iYWxzOiBqUXVlcnlcblx0XHRmYWN0b3J5KHdpbmRvdy5qUXVlcnkpO1xuXHR9XG59KGZ1bmN0aW9uICgkKSB7XG5cblxuXG5cdGlmICghQXJyYXkucHJvdG90eXBlLnJlZHVjZSkge1xuXHRcdC8qKlxuXHRcdCAqIEFycmF5LnByb3RvdHlwZS5yZWR1Y2UgcG9seWZpbGxcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG5cdFx0ICogQHBhcmFtIHtWYWx1ZX0gW2luaXRpYWxWYWx1ZV1cblx0XHQgKiBAcmV0dXJuIHtWYWx1ZX1cblx0XHQgKlxuXHRcdCAqIEBzZWUgaHR0cDovL2dvby5nbC9XTnJpUURcblx0XHQgKi9cblx0XHRBcnJheS5wcm90b3R5cGUucmVkdWNlID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG5cdFx0XHR2YXIgdCA9IE9iamVjdCh0aGlzKSwgbGVuID0gdC5sZW5ndGggPj4+IDAsIGsgPSAwLCB2YWx1ZTtcblx0XHRcdGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyKSB7XG5cdFx0XHRcdHZhbHVlID0gYXJndW1lbnRzWzFdO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0d2hpbGUgKGsgPCBsZW4gJiYgIShrIGluIHQpKSB7XG5cdFx0XHRcdFx0aysrO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChrID49IGxlbikge1xuXHRcdFx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ1JlZHVjZSBvZiBlbXB0eSBhcnJheSB3aXRoIG5vIGluaXRpYWwgdmFsdWUnKTtcblx0XHRcdFx0fVxuXHRcdFx0XHR2YWx1ZSA9IHRbaysrXTtcblx0XHRcdH1cblx0XHRcdGZvciAoOyBrIDwgbGVuOyBrKyspIHtcblx0XHRcdFx0aWYgKGsgaW4gdCkge1xuXHRcdFx0XHRcdHZhbHVlID0gY2FsbGJhY2sodmFsdWUsIHRba10sIGssIHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0fTtcblx0fVxuXG5cdGlmICgnZnVuY3Rpb24nICE9PSB0eXBlb2YgQXJyYXkucHJvdG90eXBlLmZpbHRlcikge1xuXHRcdC8qKlxuXHRcdCAqIEFycmF5LnByb3RvdHlwZS5maWx0ZXIgcG9seWZpbGxcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmNcblx0XHQgKiBAcmV0dXJuIHtBcnJheX1cblx0XHQgKlxuXHRcdCAqIEBzZWUgaHR0cDovL2dvby5nbC9UMUtGbnFcblx0XHQgKi9cblx0XHRBcnJheS5wcm90b3R5cGUuZmlsdGVyID0gZnVuY3Rpb24gKGZ1bmMpIHtcblx0XHRcdHZhciB0ID0gT2JqZWN0KHRoaXMpLCBsZW4gPSB0Lmxlbmd0aCA+Pj4gMDtcblxuXHRcdFx0dmFyIHJlcyA9IFtdO1xuXHRcdFx0dmFyIHRoaXNBcmcgPSBhcmd1bWVudHMubGVuZ3RoID49IDIgPyBhcmd1bWVudHNbMV0gOiB2b2lkIDA7XG5cdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0XHRcdGlmIChpIGluIHQpIHtcblx0XHRcdFx0XHR2YXIgdmFsID0gdFtpXTtcblx0XHRcdFx0XHRpZiAoZnVuYy5jYWxsKHRoaXNBcmcsIHZhbCwgaSwgdCkpIHtcblx0XHRcdFx0XHRcdHJlcy5wdXNoKHZhbCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiByZXM7XG5cdFx0fTtcblx0fVxuXG5cdHZhciBpc1N1cHBvcnRBbWQgPSB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQ7XG5cblx0LyoqXG5cdCAqIHJldHVybnMgd2hldGhlciBmb250IGlzIGluc3RhbGxlZCBvciBub3QuXG5cdCAqXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBmb250TmFtZVxuXHQgKiBAcmV0dXJuIHtCb29sZWFufVxuXHQgKi9cblx0dmFyIGlzRm9udEluc3RhbGxlZCA9IGZ1bmN0aW9uIChmb250TmFtZSkge1xuXHRcdHZhciB0ZXN0Rm9udE5hbWUgPSBmb250TmFtZSA9PT0gJ0NvbWljIFNhbnMgTVMnID8gJ0NvdXJpZXIgTmV3JyA6ICdDb21pYyBTYW5zIE1TJztcblx0XHR2YXIgJHRlc3RlciA9ICQoJzxkaXY+JykuY3NzKHtcblx0XHRcdHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuXHRcdFx0bGVmdDogJy05OTk5cHgnLFxuXHRcdFx0dG9wOiAnLTk5OTlweCcsXG5cdFx0XHRmb250U2l6ZTogJzIwMHB4J1xuXHRcdH0pLnRleHQoJ21tbW1tbW1tbXd3d3d3d3cnKS5hcHBlbmRUbyhkb2N1bWVudC5ib2R5KTtcblxuXHRcdHZhciBvcmlnaW5hbFdpZHRoID0gJHRlc3Rlci5jc3MoJ2ZvbnRGYW1pbHknLCB0ZXN0Rm9udE5hbWUpLndpZHRoKCk7XG5cdFx0dmFyIHdpZHRoID0gJHRlc3Rlci5jc3MoJ2ZvbnRGYW1pbHknLCBmb250TmFtZSArICcsJyArIHRlc3RGb250TmFtZSkud2lkdGgoKTtcblxuXHRcdCR0ZXN0ZXIucmVtb3ZlKCk7XG5cblx0XHRyZXR1cm4gb3JpZ2luYWxXaWR0aCAhPT0gd2lkdGg7XG5cdH07XG5cblx0LyoqXG5cdCAqIEBjbGFzcyBjb3JlLmFnZW50XG5cdCAqXG5cdCAqIE9iamVjdCB3aGljaCBjaGVjayBwbGF0Zm9ybSBhbmQgYWdlbnRcblx0ICpcblx0ICogQHNpbmdsZXRvblxuXHQgKiBAYWx0ZXJuYXRlQ2xhc3NOYW1lIGFnZW50XG5cdCAqL1xuXHR2YXIgYWdlbnQgPSB7XG5cdFx0LyoqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gW2lzTWFjPWZhbHNlXSB0cnVlIGlmIHRoaXMgYWdlbnQgaXMgTWFjICAqL1xuXHRcdGlzTWFjOiBuYXZpZ2F0b3IuYXBwVmVyc2lvbi5pbmRleE9mKCdNYWMnKSA+IC0xLFxuXHRcdC8qKiBAcHJvcGVydHkge0Jvb2xlYW59IFtpc01TSUU9ZmFsc2VdIHRydWUgaWYgdGhpcyBhZ2VudCBpcyBhIEludGVybmV0IEV4cGxvcmVyICAqL1xuXHRcdGlzTVNJRTogbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdNU0lFJykgPiAtMSB8fCBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ1RyaWRlbnQnKSA+IC0xLFxuXHRcdC8qKiBAcHJvcGVydHkge0Jvb2xlYW59IFtpc0ZGPWZhbHNlXSB0cnVlIGlmIHRoaXMgYWdlbnQgaXMgYSBGaXJlZm94ICAqL1xuXHRcdGlzRkY6IG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignRmlyZWZveCcpID4gLTEsXG5cdFx0LyoqIEBwcm9wZXJ0eSB7U3RyaW5nfSBqcXVlcnlWZXJzaW9uIGN1cnJlbnQgalF1ZXJ5IHZlcnNpb24gc3RyaW5nICAqL1xuXHRcdGpxdWVyeVZlcnNpb246IHBhcnNlRmxvYXQoJC5mbi5qcXVlcnkpLFxuXHRcdGlzU3VwcG9ydEFtZDogaXNTdXBwb3J0QW1kLFxuXHRcdGhhc0NvZGVNaXJyb3I6IGlzU3VwcG9ydEFtZCA/IHJlcXVpcmUuc3BlY2lmaWVkKCdDb2RlTWlycm9yJykgOiAhIXdpbmRvdy5Db2RlTWlycm9yLFxuXHRcdGlzRm9udEluc3RhbGxlZDogaXNGb250SW5zdGFsbGVkLFxuXHRcdGlzVzNDUmFuZ2VTdXBwb3J0OiAhIWRvY3VtZW50LmNyZWF0ZVJhbmdlXG5cdH07XG5cblx0LyoqXG5cdCAqIEBjbGFzcyBjb3JlLmZ1bmNcblx0ICpcblx0ICogZnVuYyB1dGlscyAoZm9yIGhpZ2gtb3JkZXIgZnVuYydzIGFyZylcblx0ICpcblx0ICogQHNpbmdsZXRvblxuXHQgKiBAYWx0ZXJuYXRlQ2xhc3NOYW1lIGZ1bmNcblx0ICovXG5cdHZhciBmdW5jID0gKGZ1bmN0aW9uICgpIHtcblx0XHR2YXIgZXEgPSBmdW5jdGlvbiAoaXRlbUEpIHtcblx0XHRcdHJldHVybiBmdW5jdGlvbiAoaXRlbUIpIHtcblx0XHRcdFx0cmV0dXJuIGl0ZW1BID09PSBpdGVtQjtcblx0XHRcdH07XG5cdFx0fTtcblxuXHRcdHZhciBlcTIgPSBmdW5jdGlvbiAoaXRlbUEsIGl0ZW1CKSB7XG5cdFx0XHRyZXR1cm4gaXRlbUEgPT09IGl0ZW1CO1xuXHRcdH07XG5cblx0XHR2YXIgcGVxMiA9IGZ1bmN0aW9uIChwcm9wTmFtZSkge1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uIChpdGVtQSwgaXRlbUIpIHtcblx0XHRcdFx0cmV0dXJuIGl0ZW1BW3Byb3BOYW1lXSA9PT0gaXRlbUJbcHJvcE5hbWVdO1xuXHRcdFx0fTtcblx0XHR9O1xuXG5cdFx0dmFyIG9rID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fTtcblxuXHRcdHZhciBmYWlsID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH07XG5cblx0XHR2YXIgbm90ID0gZnVuY3Rpb24gKGYpIHtcblx0XHRcdHJldHVybiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHJldHVybiAhZi5hcHBseShmLCBhcmd1bWVudHMpO1xuXHRcdFx0fTtcblx0XHR9O1xuXG5cdFx0dmFyIGFuZCA9IGZ1bmN0aW9uIChmQSwgZkIpIHtcblx0XHRcdHJldHVybiBmdW5jdGlvbiAoaXRlbSkge1xuXHRcdFx0XHRyZXR1cm4gZkEoaXRlbSkgJiYgZkIoaXRlbSk7XG5cdFx0XHR9O1xuXHRcdH07XG5cblx0XHR2YXIgc2VsZiA9IGZ1bmN0aW9uIChhKSB7XG5cdFx0XHRyZXR1cm4gYTtcblx0XHR9O1xuXG5cdFx0dmFyIGlkQ291bnRlciA9IDA7XG5cblx0XHQvKipcblx0XHQgKiBnZW5lcmF0ZSBhIGdsb2JhbGx5LXVuaXF1ZSBpZFxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IFtwcmVmaXhdXG5cdFx0ICovXG5cdFx0dmFyIHVuaXF1ZUlkID0gZnVuY3Rpb24gKHByZWZpeCkge1xuXHRcdFx0dmFyIGlkID0gKytpZENvdW50ZXIgKyAnJztcblx0XHRcdHJldHVybiBwcmVmaXggPyBwcmVmaXggKyBpZCA6IGlkO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiByZXR1cm5zIGJuZCAoYm91bmRzKSBmcm9tIHJlY3Rcblx0XHQgKlxuXHRcdCAqIC0gSUUgQ29tcGF0YWJpbGl0eSBJc3N1ZTogaHR0cDovL2dvby5nbC9zUkxPQW9cblx0XHQgKiAtIFNjcm9sbCBJc3N1ZTogaHR0cDovL2dvby5nbC9zTmpVY1xuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtSZWN0fSByZWN0XG5cdFx0ICogQHJldHVybiB7T2JqZWN0fSBib3VuZHNcblx0XHQgKiBAcmV0dXJuIHtOdW1iZXJ9IGJvdW5kcy50b3Bcblx0XHQgKiBAcmV0dXJuIHtOdW1iZXJ9IGJvdW5kcy5sZWZ0XG5cdFx0ICogQHJldHVybiB7TnVtYmVyfSBib3VuZHMud2lkdGhcblx0XHQgKiBAcmV0dXJuIHtOdW1iZXJ9IGJvdW5kcy5oZWlnaHRcblx0XHQgKi9cblx0XHR2YXIgcmVjdDJibmQgPSBmdW5jdGlvbiAocmVjdCkge1xuXHRcdFx0dmFyICRkb2N1bWVudCA9ICQoZG9jdW1lbnQpO1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0dG9wOiByZWN0LnRvcCArICRkb2N1bWVudC5zY3JvbGxUb3AoKSxcblx0XHRcdFx0bGVmdDogcmVjdC5sZWZ0ICsgJGRvY3VtZW50LnNjcm9sbExlZnQoKSxcblx0XHRcdFx0d2lkdGg6IHJlY3QucmlnaHQgLSByZWN0LmxlZnQsXG5cdFx0XHRcdGhlaWdodDogcmVjdC5ib3R0b20gLSByZWN0LnRvcFxuXHRcdFx0fTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogcmV0dXJucyBhIGNvcHkgb2YgdGhlIG9iamVjdCB3aGVyZSB0aGUga2V5cyBoYXZlIGJlY29tZSB0aGUgdmFsdWVzIGFuZCB0aGUgdmFsdWVzIHRoZSBrZXlzLlxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcblx0XHQgKiBAcmV0dXJuIHtPYmplY3R9XG5cdFx0ICovXG5cdFx0dmFyIGludmVydE9iamVjdCA9IGZ1bmN0aW9uIChvYmopIHtcblx0XHRcdHZhciBpbnZlcnRlZCA9IHt9O1xuXHRcdFx0Zm9yICh2YXIga2V5IGluIG9iaikge1xuXHRcdFx0XHRpZiAob2JqLmhhc093blByb3BlcnR5KGtleSkpIHtcblx0XHRcdFx0XHRpbnZlcnRlZFtvYmpba2V5XV0gPSBrZXk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBpbnZlcnRlZDtcblx0XHR9O1xuXG5cdFx0cmV0dXJuIHtcblx0XHRcdGVxOiBlcSxcblx0XHRcdGVxMjogZXEyLFxuXHRcdFx0cGVxMjogcGVxMixcblx0XHRcdG9rOiBvayxcblx0XHRcdGZhaWw6IGZhaWwsXG5cdFx0XHRzZWxmOiBzZWxmLFxuXHRcdFx0bm90OiBub3QsXG5cdFx0XHRhbmQ6IGFuZCxcblx0XHRcdHVuaXF1ZUlkOiB1bmlxdWVJZCxcblx0XHRcdHJlY3QyYm5kOiByZWN0MmJuZCxcblx0XHRcdGludmVydE9iamVjdDogaW52ZXJ0T2JqZWN0XG5cdFx0fTtcblx0fSkoKTtcblxuXHQvKipcblx0ICogQGNsYXNzIGNvcmUubGlzdFxuXHQgKlxuXHQgKiBsaXN0IHV0aWxzXG5cdCAqXG5cdCAqIEBzaW5nbGV0b25cblx0ICogQGFsdGVybmF0ZUNsYXNzTmFtZSBsaXN0XG5cdCAqL1xuXHR2YXIgbGlzdCA9IChmdW5jdGlvbiAoKSB7XG5cdFx0LyoqXG5cdFx0ICogcmV0dXJucyB0aGUgZmlyc3QgaXRlbSBvZiBhbiBhcnJheS5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7QXJyYXl9IGFycmF5XG5cdFx0ICovXG5cdFx0dmFyIGhlYWQgPSBmdW5jdGlvbiAoYXJyYXkpIHtcblx0XHRcdHJldHVybiBhcnJheVswXTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogcmV0dXJucyB0aGUgbGFzdCBpdGVtIG9mIGFuIGFycmF5LlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtBcnJheX0gYXJyYXlcblx0XHQgKi9cblx0XHR2YXIgbGFzdCA9IGZ1bmN0aW9uIChhcnJheSkge1xuXHRcdFx0cmV0dXJuIGFycmF5W2FycmF5Lmxlbmd0aCAtIDFdO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiByZXR1cm5zIGV2ZXJ5dGhpbmcgYnV0IHRoZSBsYXN0IGVudHJ5IG9mIHRoZSBhcnJheS5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7QXJyYXl9IGFycmF5XG5cdFx0ICovXG5cdFx0dmFyIGluaXRpYWwgPSBmdW5jdGlvbiAoYXJyYXkpIHtcblx0XHRcdHJldHVybiBhcnJheS5zbGljZSgwLCBhcnJheS5sZW5ndGggLSAxKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogcmV0dXJucyB0aGUgcmVzdCBvZiB0aGUgaXRlbXMgaW4gYW4gYXJyYXkuXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge0FycmF5fSBhcnJheVxuXHRcdCAqL1xuXHRcdHZhciB0YWlsID0gZnVuY3Rpb24gKGFycmF5KSB7XG5cdFx0XHRyZXR1cm4gYXJyYXkuc2xpY2UoMSk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIHJldHVybnMgaXRlbSBvZiBhcnJheVxuXHRcdCAqL1xuXHRcdHZhciBmaW5kID0gZnVuY3Rpb24gKGFycmF5LCBwcmVkKSB7XG5cdFx0XHRmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBhcnJheS5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcblx0XHRcdFx0dmFyIGl0ZW0gPSBhcnJheVtpZHhdO1xuXHRcdFx0XHRpZiAocHJlZChpdGVtKSkge1xuXHRcdFx0XHRcdHJldHVybiBpdGVtO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIHJldHVybnMgdHJ1ZSBpZiBhbGwgb2YgdGhlIHZhbHVlcyBpbiB0aGUgYXJyYXkgcGFzcyB0aGUgcHJlZGljYXRlIHRydXRoIHRlc3QuXG5cdFx0ICovXG5cdFx0dmFyIGFsbCA9IGZ1bmN0aW9uIChhcnJheSwgcHJlZCkge1xuXHRcdFx0Zm9yICh2YXIgaWR4ID0gMCwgbGVuID0gYXJyYXkubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG5cdFx0XHRcdGlmICghcHJlZChhcnJheVtpZHhdKSkge1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIHJldHVybnMgdHJ1ZSBpZiB0aGUgdmFsdWUgaXMgcHJlc2VudCBpbiB0aGUgbGlzdC5cblx0XHQgKi9cblx0XHR2YXIgY29udGFpbnMgPSBmdW5jdGlvbiAoYXJyYXksIGl0ZW0pIHtcblx0XHRcdHJldHVybiAkLmluQXJyYXkoaXRlbSwgYXJyYXkpICE9PSAtMTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogZ2V0IHN1bSBmcm9tIGEgbGlzdFxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtBcnJheX0gYXJyYXkgLSBhcnJheVxuXHRcdCAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIC0gaXRlcmF0b3Jcblx0XHQgKi9cblx0XHR2YXIgc3VtID0gZnVuY3Rpb24gKGFycmF5LCBmbikge1xuXHRcdFx0Zm4gPSBmbiB8fCBmdW5jLnNlbGY7XG5cdFx0XHRyZXR1cm4gYXJyYXkucmVkdWNlKGZ1bmN0aW9uIChtZW1vLCB2KSB7XG5cdFx0XHRcdHJldHVybiBtZW1vICsgZm4odik7XG5cdFx0XHR9LCAwKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogcmV0dXJucyBhIGNvcHkgb2YgdGhlIGNvbGxlY3Rpb24gd2l0aCBhcnJheSB0eXBlLlxuXHRcdCAqIEBwYXJhbSB7Q29sbGVjdGlvbn0gY29sbGVjdGlvbiAtIGNvbGxlY3Rpb24gZWcpIG5vZGUuY2hpbGROb2RlcywgLi4uXG5cdFx0ICovXG5cdFx0dmFyIGZyb20gPSBmdW5jdGlvbiAoY29sbGVjdGlvbikge1xuXHRcdFx0dmFyIHJlc3VsdCA9IFtdLCBpZHggPSAtMSwgbGVuZ3RoID0gY29sbGVjdGlvbi5sZW5ndGg7XG5cdFx0XHR3aGlsZSAoKytpZHggPCBsZW5ndGgpIHtcblx0XHRcdFx0cmVzdWx0W2lkeF0gPSBjb2xsZWN0aW9uW2lkeF07XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBjbHVzdGVyIGVsZW1lbnRzIGJ5IHByZWRpY2F0ZSBmdW5jdGlvbi5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IC0gYXJyYXlcblx0XHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiAtIHByZWRpY2F0ZSBmdW5jdGlvbiBmb3IgY2x1c3RlciBydWxlXG5cdFx0ICogQHBhcmFtIHtBcnJheVtdfVxuXHRcdCAqL1xuXHRcdHZhciBjbHVzdGVyQnkgPSBmdW5jdGlvbiAoYXJyYXksIGZuKSB7XG5cdFx0XHRpZiAoIWFycmF5Lmxlbmd0aCkgeyByZXR1cm4gW107IH1cblx0XHRcdHZhciBhVGFpbCA9IHRhaWwoYXJyYXkpO1xuXHRcdFx0cmV0dXJuIGFUYWlsLnJlZHVjZShmdW5jdGlvbiAobWVtbywgdikge1xuXHRcdFx0XHR2YXIgYUxhc3QgPSBsYXN0KG1lbW8pO1xuXHRcdFx0XHRpZiAoZm4obGFzdChhTGFzdCksIHYpKSB7XG5cdFx0XHRcdFx0YUxhc3RbYUxhc3QubGVuZ3RoXSA9IHY7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bWVtb1ttZW1vLmxlbmd0aF0gPSBbdl07XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIG1lbW87XG5cdFx0XHR9LCBbW2hlYWQoYXJyYXkpXV0pO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiByZXR1cm5zIGEgY29weSBvZiB0aGUgYXJyYXkgd2l0aCBhbGwgZmFsc3kgdmFsdWVzIHJlbW92ZWRcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IC0gYXJyYXlcblx0XHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiAtIHByZWRpY2F0ZSBmdW5jdGlvbiBmb3IgY2x1c3RlciBydWxlXG5cdFx0ICovXG5cdFx0dmFyIGNvbXBhY3QgPSBmdW5jdGlvbiAoYXJyYXkpIHtcblx0XHRcdHZhciBhUmVzdWx0ID0gW107XG5cdFx0XHRmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBhcnJheS5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcblx0XHRcdFx0aWYgKGFycmF5W2lkeF0pIHsgYVJlc3VsdC5wdXNoKGFycmF5W2lkeF0pOyB9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gYVJlc3VsdDtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogcHJvZHVjZXMgYSBkdXBsaWNhdGUtZnJlZSB2ZXJzaW9uIG9mIHRoZSBhcnJheVxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtBcnJheX0gYXJyYXlcblx0XHQgKi9cblx0XHR2YXIgdW5pcXVlID0gZnVuY3Rpb24gKGFycmF5KSB7XG5cdFx0XHR2YXIgcmVzdWx0cyA9IFtdO1xuXG5cdFx0XHRmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBhcnJheS5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcblx0XHRcdFx0aWYgKCFjb250YWlucyhyZXN1bHRzLCBhcnJheVtpZHhdKSkge1xuXHRcdFx0XHRcdHJlc3VsdHMucHVzaChhcnJheVtpZHhdKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gcmVzdWx0cztcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogcmV0dXJucyBuZXh0IGl0ZW0uXG5cdFx0ICogQHBhcmFtIHtBcnJheX0gYXJyYXlcblx0XHQgKi9cblx0XHR2YXIgbmV4dCA9IGZ1bmN0aW9uIChhcnJheSwgaXRlbSkge1xuXHRcdFx0dmFyIGlkeCA9IGFycmF5LmluZGV4T2YoaXRlbSk7XG5cdFx0XHRpZiAoaWR4ID09PSAtMSkgeyByZXR1cm4gbnVsbDsgfVxuXG5cdFx0XHRyZXR1cm4gYXJyYXlbaWR4ICsgMV07XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIHJldHVybnMgcHJldiBpdGVtLlxuXHRcdCAqIEBwYXJhbSB7QXJyYXl9IGFycmF5XG5cdFx0ICovXG5cdFx0dmFyIHByZXYgPSBmdW5jdGlvbiAoYXJyYXksIGl0ZW0pIHtcblx0XHRcdHZhciBpZHggPSBhcnJheS5pbmRleE9mKGl0ZW0pO1xuXHRcdFx0aWYgKGlkeCA9PT0gLTEpIHsgcmV0dXJuIG51bGw7IH1cblxuXHRcdFx0cmV0dXJuIGFycmF5W2lkeCAtIDFdO1xuXHRcdH07XG5cblxuXHRcdHJldHVybiB7XG5cdFx0XHRoZWFkOiBoZWFkLCBsYXN0OiBsYXN0LCBpbml0aWFsOiBpbml0aWFsLCB0YWlsOiB0YWlsLFxuXHRcdFx0cHJldjogcHJldiwgbmV4dDogbmV4dCwgZmluZDogZmluZCwgY29udGFpbnM6IGNvbnRhaW5zLFxuXHRcdFx0YWxsOiBhbGwsIHN1bTogc3VtLCBmcm9tOiBmcm9tLFxuXHRcdFx0Y2x1c3RlckJ5OiBjbHVzdGVyQnksIGNvbXBhY3Q6IGNvbXBhY3QsIHVuaXF1ZTogdW5pcXVlXG5cdFx0fTtcblx0fSkoKTtcblxuXG5cdHZhciBOQlNQX0NIQVIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCk7XG5cdHZhciBaRVJPX1dJRFRIX05CU1BfQ0hBUiA9ICdcXHVmZWZmJztcblxuXHQvKipcblx0ICogQGNsYXNzIGNvcmUuZG9tXG5cdCAqXG5cdCAqIERvbSBmdW5jdGlvbnNcblx0ICpcblx0ICogQHNpbmdsZXRvblxuXHQgKiBAYWx0ZXJuYXRlQ2xhc3NOYW1lIGRvbVxuXHQgKi9cblx0dmFyIGRvbSA9IChmdW5jdGlvbiAoKSB7XG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCBpc0VkaXRhYmxlXG5cdFx0ICpcblx0XHQgKiByZXR1cm5zIHdoZXRoZXIgbm9kZSBpcyBgbm90ZS1lZGl0YWJsZWAgb3Igbm90LlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtOb2RlfSBub2RlXG5cdFx0ICogQHJldHVybiB7Qm9vbGVhbn1cblx0XHQgKi9cblx0XHR2YXIgaXNFZGl0YWJsZSA9IGZ1bmN0aW9uIChub2RlKSB7XG5cdFx0XHRyZXR1cm4gbm9kZSAmJiAkKG5vZGUpLmhhc0NsYXNzKCdub3RlLWVkaXRhYmxlJyk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2QgaXNDb250cm9sU2l6aW5nXG5cdFx0ICpcblx0XHQgKiByZXR1cm5zIHdoZXRoZXIgbm9kZSBpcyBgbm90ZS1jb250cm9sLXNpemluZ2Agb3Igbm90LlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtOb2RlfSBub2RlXG5cdFx0ICogQHJldHVybiB7Qm9vbGVhbn1cblx0XHQgKi9cblx0XHR2YXIgaXNDb250cm9sU2l6aW5nID0gZnVuY3Rpb24gKG5vZGUpIHtcblx0XHRcdHJldHVybiBub2RlICYmICQobm9kZSkuaGFzQ2xhc3MoJ25vdGUtY29udHJvbC1zaXppbmcnKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCAgYnVpbGRMYXlvdXRJbmZvXG5cdFx0ICpcblx0XHQgKiBidWlsZCBsYXlvdXRJbmZvIGZyb20gJGVkaXRvcigubm90ZS1lZGl0b3IpXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGVkaXRvclxuXHRcdCAqIEByZXR1cm4ge09iamVjdH1cblx0XHQgKiBAcmV0dXJuIHtGdW5jdGlvbn0gcmV0dXJuLmVkaXRvclxuXHRcdCAqIEByZXR1cm4ge05vZGV9IHJldHVybi5kcm9wem9uZVxuXHRcdCAqIEByZXR1cm4ge05vZGV9IHJldHVybi50b29sYmFyXG5cdFx0ICogQHJldHVybiB7Tm9kZX0gcmV0dXJuLmVkaXRhYmxlXG5cdFx0ICogQHJldHVybiB7Tm9kZX0gcmV0dXJuLmNvZGFibGVcblx0XHQgKiBAcmV0dXJuIHtOb2RlfSByZXR1cm4ucG9wb3ZlclxuXHRcdCAqIEByZXR1cm4ge05vZGV9IHJldHVybi5oYW5kbGVcblx0XHQgKiBAcmV0dXJuIHtOb2RlfSByZXR1cm4uZGlhbG9nXG5cdFx0ICovXG5cdFx0dmFyIGJ1aWxkTGF5b3V0SW5mbyA9IGZ1bmN0aW9uICgkZWRpdG9yKSB7XG5cdFx0XHR2YXIgbWFrZUZpbmRlcjtcblxuXHRcdFx0Ly8gYWlyIG1vZGVcblx0XHRcdGlmICgkZWRpdG9yLmhhc0NsYXNzKCdub3RlLWFpci1lZGl0b3InKSkge1xuXHRcdFx0XHR2YXIgaWQgPSBsaXN0Lmxhc3QoJGVkaXRvci5hdHRyKCdpZCcpLnNwbGl0KCctJykpO1xuXHRcdFx0XHRtYWtlRmluZGVyID0gZnVuY3Rpb24gKHNJZFByZWZpeCkge1xuXHRcdFx0XHRcdHJldHVybiBmdW5jdGlvbiAoKSB7IHJldHVybiAkKHNJZFByZWZpeCArIGlkKTsgfTtcblx0XHRcdFx0fTtcblxuXHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdGVkaXRvcjogZnVuY3Rpb24gKCkgeyByZXR1cm4gJGVkaXRvcjsgfSxcblx0XHRcdFx0XHRob2xkZXI6IGZ1bmN0aW9uICgpIHsgcmV0dXJuICRlZGl0b3IuZGF0YSgnaG9sZGVyJyk7IH0sXG5cdFx0XHRcdFx0ZWRpdGFibGU6IGZ1bmN0aW9uICgpIHsgcmV0dXJuICRlZGl0b3I7IH0sXG5cdFx0XHRcdFx0cG9wb3ZlcjogbWFrZUZpbmRlcignI25vdGUtcG9wb3Zlci0nKSxcblx0XHRcdFx0XHRoYW5kbGU6IG1ha2VGaW5kZXIoJyNub3RlLWhhbmRsZS0nKSxcblx0XHRcdFx0XHRkaWFsb2c6IG1ha2VGaW5kZXIoJyNub3RlLWRpYWxvZy0nKVxuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdC8vIGZyYW1lIG1vZGVcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG1ha2VGaW5kZXIgPSBmdW5jdGlvbiAoc0NsYXNzTmFtZSkge1xuXHRcdFx0XHRcdHJldHVybiBmdW5jdGlvbiAoKSB7IHJldHVybiAkZWRpdG9yLmZpbmQoc0NsYXNzTmFtZSk7IH07XG5cdFx0XHRcdH07XG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0ZWRpdG9yOiBmdW5jdGlvbiAoKSB7IHJldHVybiAkZWRpdG9yOyB9LFxuXHRcdFx0XHRcdGhvbGRlcjogZnVuY3Rpb24gKCkgeyByZXR1cm4gJGVkaXRvci5kYXRhKCdob2xkZXInKTsgfSxcblx0XHRcdFx0XHRkcm9wem9uZTogbWFrZUZpbmRlcignLm5vdGUtZHJvcHpvbmUnKSxcblx0XHRcdFx0XHR0b29sYmFyOiBtYWtlRmluZGVyKCcubm90ZS10b29sYmFyJyksXG5cdFx0XHRcdFx0ZWRpdGFibGU6IG1ha2VGaW5kZXIoJy5ub3RlLWVkaXRhYmxlJyksXG5cdFx0XHRcdFx0Y29kYWJsZTogbWFrZUZpbmRlcignLm5vdGUtY29kYWJsZScpLFxuXHRcdFx0XHRcdHN0YXR1c2JhcjogbWFrZUZpbmRlcignLm5vdGUtc3RhdHVzYmFyJyksXG5cdFx0XHRcdFx0cG9wb3ZlcjogbWFrZUZpbmRlcignLm5vdGUtcG9wb3ZlcicpLFxuXHRcdFx0XHRcdGhhbmRsZTogbWFrZUZpbmRlcignLm5vdGUtaGFuZGxlJyksXG5cdFx0XHRcdFx0ZGlhbG9nOiBtYWtlRmluZGVyKCcubm90ZS1kaWFsb2cnKVxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiByZXR1cm5zIG1ha2VMYXlvdXRJbmZvIGZyb20gZWRpdG9yJ3MgZGVzY2VuZGFudCBub2RlLlxuXHRcdCAqXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKiBAcGFyYW0ge05vZGV9IGRlc2NlbmRhbnRcblx0XHQgKiBAcmV0dXJuIHtPYmplY3R9XG5cdFx0ICovXG5cdFx0dmFyIG1ha2VMYXlvdXRJbmZvID0gZnVuY3Rpb24gKGRlc2NlbmRhbnQpIHtcblx0XHRcdHZhciAkdGFyZ2V0ID0gJChkZXNjZW5kYW50KS5jbG9zZXN0KCcubm90ZS1lZGl0b3IsIC5ub3RlLWFpci1lZGl0b3IsIC5ub3RlLWFpci1sYXlvdXQnKTtcblxuXHRcdFx0aWYgKCEkdGFyZ2V0Lmxlbmd0aCkge1xuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdH1cblxuXHRcdFx0dmFyICRlZGl0b3I7XG5cdFx0XHRpZiAoJHRhcmdldC5pcygnLm5vdGUtZWRpdG9yLCAubm90ZS1haXItZWRpdG9yJykpIHtcblx0XHRcdFx0JGVkaXRvciA9ICR0YXJnZXQ7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQkZWRpdG9yID0gJCgnI25vdGUtZWRpdG9yLScgKyBsaXN0Lmxhc3QoJHRhcmdldC5hdHRyKCdpZCcpLnNwbGl0KCctJykpKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGJ1aWxkTGF5b3V0SW5mbygkZWRpdG9yKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCBtYWtlUHJlZEJ5Tm9kZU5hbWVcblx0XHQgKlxuXHRcdCAqIHJldHVybnMgcHJlZGljYXRlIHdoaWNoIGp1ZGdlIHdoZXRoZXIgbm9kZU5hbWUgaXMgc2FtZVxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IG5vZGVOYW1lXG5cdFx0ICogQHJldHVybiB7RnVuY3Rpb259XG5cdFx0ICovXG5cdFx0dmFyIG1ha2VQcmVkQnlOb2RlTmFtZSA9IGZ1bmN0aW9uIChub2RlTmFtZSkge1xuXHRcdFx0bm9kZU5hbWUgPSBub2RlTmFtZS50b1VwcGVyQ2FzZSgpO1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uIChub2RlKSB7XG5cdFx0XHRcdHJldHVybiBub2RlICYmIG5vZGUubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gbm9kZU5hbWU7XG5cdFx0XHR9O1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIGlzVGV4dFxuXHRcdCAqXG5cdFx0ICpcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuXHRcdCAqIEByZXR1cm4ge0Jvb2xlYW59IHRydWUgaWYgbm9kZSdzIHR5cGUgaXMgdGV4dCgzKVxuXHRcdCAqL1xuXHRcdHZhciBpc1RleHQgPSBmdW5jdGlvbiAobm9kZSkge1xuXHRcdFx0cmV0dXJuIG5vZGUgJiYgbm9kZS5ub2RlVHlwZSA9PT0gMztcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogZXgpIGJyLCBjb2wsIGVtYmVkLCBociwgaW1nLCBpbnB1dCwgLi4uXG5cdFx0ICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9odG1sL3dnL2RyYWZ0cy9odG1sL21hc3Rlci9zeW50YXguaHRtbCN2b2lkLWVsZW1lbnRzXG5cdFx0ICovXG5cdFx0dmFyIGlzVm9pZCA9IGZ1bmN0aW9uIChub2RlKSB7XG5cdFx0XHRyZXR1cm4gbm9kZSAmJiAvXkJSfF5JTUd8XkhSLy50ZXN0KG5vZGUubm9kZU5hbWUudG9VcHBlckNhc2UoKSk7XG5cdFx0fTtcblxuXHRcdHZhciBpc1BhcmEgPSBmdW5jdGlvbiAobm9kZSkge1xuXHRcdFx0aWYgKGlzRWRpdGFibGUobm9kZSkpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDaHJvbWUodjMxLjApLCBGRih2MjUuMC4xKSB1c2UgRElWIGZvciBwYXJhZ3JhcGhcblx0XHRcdHJldHVybiBub2RlICYmIC9eRElWfF5QfF5MSXxeSFsxLTddLy50ZXN0KG5vZGUubm9kZU5hbWUudG9VcHBlckNhc2UoKSk7XG5cdFx0fTtcblxuXHRcdHZhciBpc0xpID0gbWFrZVByZWRCeU5vZGVOYW1lKCdMSScpO1xuXG5cdFx0dmFyIGlzUHVyZVBhcmEgPSBmdW5jdGlvbiAobm9kZSkge1xuXHRcdFx0cmV0dXJuIGlzUGFyYShub2RlKSAmJiAhaXNMaShub2RlKTtcblx0XHR9O1xuXG5cdFx0dmFyIGlzVGFibGUgPSBtYWtlUHJlZEJ5Tm9kZU5hbWUoJ1RBQkxFJyk7XG5cblx0XHR2YXIgaXNJbmxpbmUgPSBmdW5jdGlvbiAobm9kZSkge1xuXHRcdFx0cmV0dXJuICFpc0JvZHlDb250YWluZXIobm9kZSkgJiZcblx0XHRcdFx0ICAgIWlzTGlzdChub2RlKSAmJlxuXHRcdFx0XHQgICAhaXNQYXJhKG5vZGUpICYmXG5cdFx0XHRcdCAgICFpc1RhYmxlKG5vZGUpICYmXG5cdFx0XHRcdCAgICFpc0Jsb2NrcXVvdGUobm9kZSk7XG5cdFx0fTtcblxuXHRcdHZhciBpc0xpc3QgPSBmdW5jdGlvbiAobm9kZSkge1xuXHRcdFx0cmV0dXJuIG5vZGUgJiYgL15VTHxeT0wvLnRlc3Qobm9kZS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpKTtcblx0XHR9O1xuXG5cdFx0dmFyIGlzQ2VsbCA9IGZ1bmN0aW9uIChub2RlKSB7XG5cdFx0XHRyZXR1cm4gbm9kZSAmJiAvXlREfF5USC8udGVzdChub2RlLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkpO1xuXHRcdH07XG5cblx0XHR2YXIgaXNCbG9ja3F1b3RlID0gbWFrZVByZWRCeU5vZGVOYW1lKCdCTE9DS1FVT1RFJyk7XG5cblx0XHR2YXIgaXNCb2R5Q29udGFpbmVyID0gZnVuY3Rpb24gKG5vZGUpIHtcblx0XHRcdHJldHVybiBpc0NlbGwobm9kZSkgfHwgaXNCbG9ja3F1b3RlKG5vZGUpIHx8IGlzRWRpdGFibGUobm9kZSk7XG5cdFx0fTtcblxuXHRcdHZhciBpc0FuY2hvciA9IG1ha2VQcmVkQnlOb2RlTmFtZSgnQScpO1xuXG5cdFx0dmFyIGlzUGFyYUlubGluZSA9IGZ1bmN0aW9uIChub2RlKSB7XG5cdFx0XHRyZXR1cm4gaXNJbmxpbmUobm9kZSkgJiYgISFhbmNlc3Rvcihub2RlLCBpc1BhcmEpO1xuXHRcdH07XG5cblx0XHR2YXIgaXNCb2R5SW5saW5lID0gZnVuY3Rpb24gKG5vZGUpIHtcblx0XHRcdHJldHVybiBpc0lubGluZShub2RlKSAmJiAhYW5jZXN0b3Iobm9kZSwgaXNQYXJhKTtcblx0XHR9O1xuXG5cdFx0dmFyIGlzQm9keSA9IG1ha2VQcmVkQnlOb2RlTmFtZSgnQk9EWScpO1xuXG5cdFx0LyoqXG5cdFx0ICogcmV0dXJucyB3aGV0aGVyIG5vZGVCIGlzIGNsb3Nlc3Qgc2libGluZyBvZiBub2RlQVxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtOb2RlfSBub2RlQVxuXHRcdCAqIEBwYXJhbSB7Tm9kZX0gbm9kZUJcblx0XHQgKiBAcmV0dXJuIHtCb29sZWFufVxuXHRcdCAqL1xuXHRcdHZhciBpc0Nsb3Nlc3RTaWJsaW5nID0gZnVuY3Rpb24gKG5vZGVBLCBub2RlQikge1xuXHRcdFx0cmV0dXJuIG5vZGVBLm5leHRTaWJsaW5nID09PSBub2RlQiB8fFxuXHRcdFx0XHQgICBub2RlQS5wcmV2aW91c1NpYmxpbmcgPT09IG5vZGVCO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiByZXR1cm5zIGFycmF5IG9mIGNsb3Nlc3Qgc2libGluZ3Mgd2l0aCBub2RlXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge05vZGV9IG5vZGVcblx0XHQgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbcHJlZF0gLSBwcmVkaWNhdGUgZnVuY3Rpb25cblx0XHQgKiBAcmV0dXJuIHtOb2RlW119XG5cdFx0ICovXG5cdFx0dmFyIHdpdGhDbG9zZXN0U2libGluZ3MgPSBmdW5jdGlvbiAobm9kZSwgcHJlZCkge1xuXHRcdFx0cHJlZCA9IHByZWQgfHwgZnVuYy5vaztcblxuXHRcdFx0dmFyIHNpYmxpbmdzID0gW107XG5cdFx0XHRpZiAobm9kZS5wcmV2aW91c1NpYmxpbmcgJiYgcHJlZChub2RlLnByZXZpb3VzU2libGluZykpIHtcblx0XHRcdFx0c2libGluZ3MucHVzaChub2RlLnByZXZpb3VzU2libGluZyk7XG5cdFx0XHR9XG5cdFx0XHRzaWJsaW5ncy5wdXNoKG5vZGUpO1xuXHRcdFx0aWYgKG5vZGUubmV4dFNpYmxpbmcgJiYgcHJlZChub2RlLm5leHRTaWJsaW5nKSkge1xuXHRcdFx0XHRzaWJsaW5ncy5wdXNoKG5vZGUubmV4dFNpYmxpbmcpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHNpYmxpbmdzO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBibGFuayBIVE1MIGZvciBjdXJzb3IgcG9zaXRpb25cblx0XHQgKi9cblx0XHR2YXIgYmxhbmtIVE1MID0gYWdlbnQuaXNNU0lFID8gJyZuYnNwOycgOiAnPGJyPic7XG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIG5vZGVMZW5ndGhcblx0XHQgKlxuXHRcdCAqIHJldHVybnMgI3RleHQncyB0ZXh0IHNpemUgb3IgZWxlbWVudCdzIGNoaWxkTm9kZXMgc2l6ZVxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtOb2RlfSBub2RlXG5cdFx0ICovXG5cdFx0dmFyIG5vZGVMZW5ndGggPSBmdW5jdGlvbiAobm9kZSkge1xuXHRcdFx0aWYgKGlzVGV4dChub2RlKSkge1xuXHRcdFx0XHRyZXR1cm4gbm9kZS5ub2RlVmFsdWUubGVuZ3RoO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gbm9kZS5jaGlsZE5vZGVzLmxlbmd0aDtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogcmV0dXJucyB3aGV0aGVyIG5vZGUgaXMgZW1wdHkgb3Igbm90LlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtOb2RlfSBub2RlXG5cdFx0ICogQHJldHVybiB7Qm9vbGVhbn1cblx0XHQgKi9cblx0XHR2YXIgaXNFbXB0eSA9IGZ1bmN0aW9uIChub2RlKSB7XG5cdFx0XHR2YXIgbGVuID0gbm9kZUxlbmd0aChub2RlKTtcblxuXHRcdFx0aWYgKGxlbiA9PT0gMCkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH0gZWxzZSBpZiAoIWRvbS5pc1RleHQobm9kZSkgJiYgbGVuID09PSAxICYmIG5vZGUuaW5uZXJIVE1MID09PSBibGFua0hUTUwpIHtcblx0XHRcdFx0Ly8gZXgpIDxwPjxicj48L3A+LCA8c3Bhbj48YnI+PC9zcGFuPlxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBwYWRkaW5nIGJsYW5rSFRNTCBpZiBub2RlIGlzIGVtcHR5IChmb3IgY3Vyc29yIHBvc2l0aW9uKVxuXHRcdCAqL1xuXHRcdHZhciBwYWRkaW5nQmxhbmtIVE1MID0gZnVuY3Rpb24gKG5vZGUpIHtcblx0XHRcdGlmICghaXNWb2lkKG5vZGUpICYmICFub2RlTGVuZ3RoKG5vZGUpKSB7XG5cdFx0XHRcdG5vZGUuaW5uZXJIVE1MID0gYmxhbmtIVE1MO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBmaW5kIG5lYXJlc3QgYW5jZXN0b3IgcHJlZGljYXRlIGhpdFxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtOb2RlfSBub2RlXG5cdFx0ICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZCAtIHByZWRpY2F0ZSBmdW5jdGlvblxuXHRcdCAqL1xuXHRcdHZhciBhbmNlc3RvciA9IGZ1bmN0aW9uIChub2RlLCBwcmVkKSB7XG5cdFx0XHR3aGlsZSAobm9kZSkge1xuXHRcdFx0XHRpZiAocHJlZChub2RlKSkgeyByZXR1cm4gbm9kZTsgfVxuXHRcdFx0XHRpZiAoaXNFZGl0YWJsZShub2RlKSkgeyBicmVhazsgfVxuXG5cdFx0XHRcdG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogZmluZCBuZWFyZXN0IGFuY2VzdG9yIG9ubHkgc2luZ2xlIGNoaWxkIGJsb29kIGxpbmUgYW5kIHByZWRpY2F0ZSBoaXRcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuXHRcdCAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWQgLSBwcmVkaWNhdGUgZnVuY3Rpb25cblx0XHQgKi9cblx0XHR2YXIgc2luZ2xlQ2hpbGRBbmNlc3RvciA9IGZ1bmN0aW9uIChub2RlLCBwcmVkKSB7XG5cdFx0XHRub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuXG5cdFx0XHR3aGlsZSAobm9kZSkge1xuXHRcdFx0XHRpZiAobm9kZUxlbmd0aChub2RlKSAhPT0gMSkgeyBicmVhazsgfVxuXHRcdFx0XHRpZiAocHJlZChub2RlKSkgeyByZXR1cm4gbm9kZTsgfVxuXHRcdFx0XHRpZiAoaXNFZGl0YWJsZShub2RlKSkgeyBicmVhazsgfVxuXG5cdFx0XHRcdG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogcmV0dXJucyBuZXcgYXJyYXkgb2YgYW5jZXN0b3Igbm9kZXMgKHVudGlsIHByZWRpY2F0ZSBoaXQpLlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtOb2RlfSBub2RlXG5cdFx0ICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbmFsXSBwcmVkIC0gcHJlZGljYXRlIGZ1bmN0aW9uXG5cdFx0ICovXG5cdFx0dmFyIGxpc3RBbmNlc3RvciA9IGZ1bmN0aW9uIChub2RlLCBwcmVkKSB7XG5cdFx0XHRwcmVkID0gcHJlZCB8fCBmdW5jLmZhaWw7XG5cblx0XHRcdHZhciBhbmNlc3RvcnMgPSBbXTtcblx0XHRcdGFuY2VzdG9yKG5vZGUsIGZ1bmN0aW9uIChlbCkge1xuXHRcdFx0XHRpZiAoIWlzRWRpdGFibGUoZWwpKSB7XG5cdFx0XHRcdFx0YW5jZXN0b3JzLnB1c2goZWwpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHByZWQoZWwpO1xuXHRcdFx0fSk7XG5cdFx0XHRyZXR1cm4gYW5jZXN0b3JzO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBmaW5kIGZhcnRoZXN0IGFuY2VzdG9yIHByZWRpY2F0ZSBoaXRcblx0XHQgKi9cblx0XHR2YXIgbGFzdEFuY2VzdG9yID0gZnVuY3Rpb24gKG5vZGUsIHByZWQpIHtcblx0XHRcdHZhciBhbmNlc3RvcnMgPSBsaXN0QW5jZXN0b3Iobm9kZSk7XG5cdFx0XHRyZXR1cm4gbGlzdC5sYXN0KGFuY2VzdG9ycy5maWx0ZXIocHJlZCkpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiByZXR1cm5zIGNvbW1vbiBhbmNlc3RvciBub2RlIGJldHdlZW4gdHdvIG5vZGVzLlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtOb2RlfSBub2RlQVxuXHRcdCAqIEBwYXJhbSB7Tm9kZX0gbm9kZUJcblx0XHQgKi9cblx0XHR2YXIgY29tbW9uQW5jZXN0b3IgPSBmdW5jdGlvbiAobm9kZUEsIG5vZGVCKSB7XG5cdFx0XHR2YXIgYW5jZXN0b3JzID0gbGlzdEFuY2VzdG9yKG5vZGVBKTtcblx0XHRcdGZvciAodmFyIG4gPSBub2RlQjsgbjsgbiA9IG4ucGFyZW50Tm9kZSkge1xuXHRcdFx0XHRpZiAoJC5pbkFycmF5KG4sIGFuY2VzdG9ycykgPiAtMSkgeyByZXR1cm4gbjsgfVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG51bGw7IC8vIGRpZmZlcmVuY2UgZG9jdW1lbnQgYXJlYVxuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBsaXN0aW5nIGFsbCBwcmV2aW91cyBzaWJsaW5ncyAodW50aWwgcHJlZGljYXRlIGhpdCkuXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge05vZGV9IG5vZGVcblx0XHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9uYWxdIHByZWQgLSBwcmVkaWNhdGUgZnVuY3Rpb25cblx0XHQgKi9cblx0XHR2YXIgbGlzdFByZXYgPSBmdW5jdGlvbiAobm9kZSwgcHJlZCkge1xuXHRcdFx0cHJlZCA9IHByZWQgfHwgZnVuYy5mYWlsO1xuXG5cdFx0XHR2YXIgbm9kZXMgPSBbXTtcblx0XHRcdHdoaWxlIChub2RlKSB7XG5cdFx0XHRcdGlmIChwcmVkKG5vZGUpKSB7IGJyZWFrOyB9XG5cdFx0XHRcdG5vZGVzLnB1c2gobm9kZSk7XG5cdFx0XHRcdG5vZGUgPSBub2RlLnByZXZpb3VzU2libGluZztcblx0XHRcdH1cblx0XHRcdHJldHVybiBub2Rlcztcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogbGlzdGluZyBuZXh0IHNpYmxpbmdzICh1bnRpbCBwcmVkaWNhdGUgaGl0KS5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuXHRcdCAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkXSAtIHByZWRpY2F0ZSBmdW5jdGlvblxuXHRcdCAqL1xuXHRcdHZhciBsaXN0TmV4dCA9IGZ1bmN0aW9uIChub2RlLCBwcmVkKSB7XG5cdFx0XHRwcmVkID0gcHJlZCB8fCBmdW5jLmZhaWw7XG5cblx0XHRcdHZhciBub2RlcyA9IFtdO1xuXHRcdFx0d2hpbGUgKG5vZGUpIHtcblx0XHRcdFx0aWYgKHByZWQobm9kZSkpIHsgYnJlYWs7IH1cblx0XHRcdFx0bm9kZXMucHVzaChub2RlKTtcblx0XHRcdFx0bm9kZSA9IG5vZGUubmV4dFNpYmxpbmc7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbm9kZXM7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIGxpc3RpbmcgZGVzY2VuZGFudCBub2Rlc1xuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtOb2RlfSBub2RlXG5cdFx0ICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRdIC0gcHJlZGljYXRlIGZ1bmN0aW9uXG5cdFx0ICovXG5cdFx0dmFyIGxpc3REZXNjZW5kYW50ID0gZnVuY3Rpb24gKG5vZGUsIHByZWQpIHtcblx0XHRcdHZhciBkZXNjZW5kZW50cyA9IFtdO1xuXHRcdFx0cHJlZCA9IHByZWQgfHwgZnVuYy5vaztcblxuXHRcdFx0Ly8gc3RhcnQgREZTKGRlcHRoIGZpcnN0IHNlYXJjaCkgd2l0aCBub2RlXG5cdFx0XHQoZnVuY3Rpb24gZm5XYWxrKGN1cnJlbnQpIHtcblx0XHRcdFx0aWYgKG5vZGUgIT09IGN1cnJlbnQgJiYgcHJlZChjdXJyZW50KSkge1xuXHRcdFx0XHRcdGRlc2NlbmRlbnRzLnB1c2goY3VycmVudCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Zm9yICh2YXIgaWR4ID0gMCwgbGVuID0gY3VycmVudC5jaGlsZE5vZGVzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuXHRcdFx0XHRcdGZuV2FsayhjdXJyZW50LmNoaWxkTm9kZXNbaWR4XSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pKG5vZGUpO1xuXG5cdFx0XHRyZXR1cm4gZGVzY2VuZGVudHM7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIHdyYXAgbm9kZSB3aXRoIG5ldyB0YWcuXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge05vZGV9IG5vZGVcblx0XHQgKiBAcGFyYW0ge05vZGV9IHRhZ05hbWUgb2Ygd3JhcHBlclxuXHRcdCAqIEByZXR1cm4ge05vZGV9IC0gd3JhcHBlclxuXHRcdCAqL1xuXHRcdHZhciB3cmFwID0gZnVuY3Rpb24gKG5vZGUsIHdyYXBwZXJOYW1lKSB7XG5cdFx0XHR2YXIgcGFyZW50ID0gbm9kZS5wYXJlbnROb2RlO1xuXHRcdFx0dmFyIHdyYXBwZXIgPSAkKCc8JyArIHdyYXBwZXJOYW1lICsgJz4nKVswXTtcblxuXHRcdFx0cGFyZW50Lmluc2VydEJlZm9yZSh3cmFwcGVyLCBub2RlKTtcblx0XHRcdHdyYXBwZXIuYXBwZW5kQ2hpbGQobm9kZSk7XG5cblx0XHRcdHJldHVybiB3cmFwcGVyO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBpbnNlcnQgbm9kZSBhZnRlciBwcmVjZWRpbmdcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuXHRcdCAqIEBwYXJhbSB7Tm9kZX0gcHJlY2VkaW5nIC0gcHJlZGljYXRlIGZ1bmN0aW9uXG5cdFx0ICovXG5cdFx0dmFyIGluc2VydEFmdGVyID0gZnVuY3Rpb24gKG5vZGUsIHByZWNlZGluZykge1xuXHRcdFx0dmFyIG5leHQgPSBwcmVjZWRpbmcubmV4dFNpYmxpbmcsIHBhcmVudCA9IHByZWNlZGluZy5wYXJlbnROb2RlO1xuXHRcdFx0aWYgKG5leHQpIHtcblx0XHRcdFx0cGFyZW50Lmluc2VydEJlZm9yZShub2RlLCBuZXh0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHBhcmVudC5hcHBlbmRDaGlsZChub2RlKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBub2RlO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBhcHBlbmQgZWxlbWVudHMuXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge05vZGV9IG5vZGVcblx0XHQgKiBAcGFyYW0ge0NvbGxlY3Rpb259IGFDaGlsZFxuXHRcdCAqL1xuXHRcdHZhciBhcHBlbmRDaGlsZE5vZGVzID0gZnVuY3Rpb24gKG5vZGUsIGFDaGlsZCkge1xuXHRcdFx0JC5lYWNoKGFDaGlsZCwgZnVuY3Rpb24gKGlkeCwgY2hpbGQpIHtcblx0XHRcdFx0bm9kZS5hcHBlbmRDaGlsZChjaGlsZCk7XG5cdFx0XHR9KTtcblx0XHRcdHJldHVybiBub2RlO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiByZXR1cm5zIHdoZXRoZXIgYm91bmRhcnlQb2ludCBpcyBsZWZ0IGVkZ2Ugb3Igbm90LlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtCb3VuZGFyeVBvaW50fSBwb2ludFxuXHRcdCAqIEByZXR1cm4ge0Jvb2xlYW59XG5cdFx0ICovXG5cdFx0dmFyIGlzTGVmdEVkZ2VQb2ludCA9IGZ1bmN0aW9uIChwb2ludCkge1xuXHRcdFx0cmV0dXJuIHBvaW50Lm9mZnNldCA9PT0gMDtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogcmV0dXJucyB3aGV0aGVyIGJvdW5kYXJ5UG9pbnQgaXMgcmlnaHQgZWRnZSBvciBub3QuXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge0JvdW5kYXJ5UG9pbnR9IHBvaW50XG5cdFx0ICogQHJldHVybiB7Qm9vbGVhbn1cblx0XHQgKi9cblx0XHR2YXIgaXNSaWdodEVkZ2VQb2ludCA9IGZ1bmN0aW9uIChwb2ludCkge1xuXHRcdFx0cmV0dXJuIHBvaW50Lm9mZnNldCA9PT0gbm9kZUxlbmd0aChwb2ludC5ub2RlKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogcmV0dXJucyB3aGV0aGVyIGJvdW5kYXJ5UG9pbnQgaXMgZWRnZSBvciBub3QuXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge0JvdW5kYXJ5UG9pbnR9IHBvaW50XG5cdFx0ICogQHJldHVybiB7Qm9vbGVhbn1cblx0XHQgKi9cblx0XHR2YXIgaXNFZGdlUG9pbnQgPSBmdW5jdGlvbiAocG9pbnQpIHtcblx0XHRcdHJldHVybiBpc0xlZnRFZGdlUG9pbnQocG9pbnQpIHx8IGlzUmlnaHRFZGdlUG9pbnQocG9pbnQpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiByZXR1cm5zIHdoZXRlciBub2RlIGlzIGxlZnQgZWRnZSBvZiBhbmNlc3RvciBvciBub3QuXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge05vZGV9IG5vZGVcblx0XHQgKiBAcGFyYW0ge05vZGV9IGFuY2VzdG9yXG5cdFx0ICogQHJldHVybiB7Qm9vbGVhbn1cblx0XHQgKi9cblx0XHR2YXIgaXNMZWZ0RWRnZU9mID0gZnVuY3Rpb24gKG5vZGUsIGFuY2VzdG9yKSB7XG5cdFx0XHR3aGlsZSAobm9kZSAmJiBub2RlICE9PSBhbmNlc3Rvcikge1xuXHRcdFx0XHRpZiAocG9zaXRpb24obm9kZSkgIT09IDApIHtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdFx0bm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIHJldHVybnMgd2hldGhlciBub2RlIGlzIHJpZ2h0IGVkZ2Ugb2YgYW5jZXN0b3Igb3Igbm90LlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtOb2RlfSBub2RlXG5cdFx0ICogQHBhcmFtIHtOb2RlfSBhbmNlc3RvclxuXHRcdCAqIEByZXR1cm4ge0Jvb2xlYW59XG5cdFx0ICovXG5cdFx0dmFyIGlzUmlnaHRFZGdlT2YgPSBmdW5jdGlvbiAobm9kZSwgYW5jZXN0b3IpIHtcblx0XHRcdHdoaWxlIChub2RlICYmIG5vZGUgIT09IGFuY2VzdG9yKSB7XG5cdFx0XHRcdGlmIChwb3NpdGlvbihub2RlKSAhPT0gbm9kZUxlbmd0aChub2RlLnBhcmVudE5vZGUpIC0gMSkge1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogcmV0dXJucyBvZmZzZXQgZnJvbSBwYXJlbnQuXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge05vZGV9IG5vZGVcblx0XHQgKi9cblx0XHR2YXIgcG9zaXRpb24gPSBmdW5jdGlvbiAobm9kZSkge1xuXHRcdFx0dmFyIG9mZnNldCA9IDA7XG5cdFx0XHR3aGlsZSAoKG5vZGUgPSBub2RlLnByZXZpb3VzU2libGluZykpIHtcblx0XHRcdFx0b2Zmc2V0ICs9IDE7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gb2Zmc2V0O1xuXHRcdH07XG5cblx0XHR2YXIgaGFzQ2hpbGRyZW4gPSBmdW5jdGlvbiAobm9kZSkge1xuXHRcdFx0cmV0dXJuICEhKG5vZGUgJiYgbm9kZS5jaGlsZE5vZGVzICYmIG5vZGUuY2hpbGROb2Rlcy5sZW5ndGgpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiByZXR1cm5zIHByZXZpb3VzIGJvdW5kYXJ5UG9pbnRcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7Qm91bmRhcnlQb2ludH0gcG9pbnRcblx0XHQgKiBAcGFyYW0ge0Jvb2xlYW59IGlzU2tpcElubmVyT2Zmc2V0XG5cdFx0ICogQHJldHVybiB7Qm91bmRhcnlQb2ludH1cblx0XHQgKi9cblx0XHR2YXIgcHJldlBvaW50ID0gZnVuY3Rpb24gKHBvaW50LCBpc1NraXBJbm5lck9mZnNldCkge1xuXHRcdFx0dmFyIG5vZGUsIG9mZnNldDtcblxuXHRcdFx0aWYgKHBvaW50Lm9mZnNldCA9PT0gMCkge1xuXHRcdFx0XHRpZiAoaXNFZGl0YWJsZShwb2ludC5ub2RlKSkge1xuXHRcdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0bm9kZSA9IHBvaW50Lm5vZGUucGFyZW50Tm9kZTtcblx0XHRcdFx0b2Zmc2V0ID0gcG9zaXRpb24ocG9pbnQubm9kZSk7XG5cdFx0XHR9IGVsc2UgaWYgKGhhc0NoaWxkcmVuKHBvaW50Lm5vZGUpKSB7XG5cdFx0XHRcdG5vZGUgPSBwb2ludC5ub2RlLmNoaWxkTm9kZXNbcG9pbnQub2Zmc2V0IC0gMV07XG5cdFx0XHRcdG9mZnNldCA9IG5vZGVMZW5ndGgobm9kZSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRub2RlID0gcG9pbnQubm9kZTtcblx0XHRcdFx0b2Zmc2V0ID0gaXNTa2lwSW5uZXJPZmZzZXQgPyAwIDogcG9pbnQub2Zmc2V0IC0gMTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0bm9kZTogbm9kZSxcblx0XHRcdFx0b2Zmc2V0OiBvZmZzZXRcblx0XHRcdH07XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIHJldHVybnMgbmV4dCBib3VuZGFyeVBvaW50XG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge0JvdW5kYXJ5UG9pbnR9IHBvaW50XG5cdFx0ICogQHBhcmFtIHtCb29sZWFufSBpc1NraXBJbm5lck9mZnNldFxuXHRcdCAqIEByZXR1cm4ge0JvdW5kYXJ5UG9pbnR9XG5cdFx0ICovXG5cdFx0dmFyIG5leHRQb2ludCA9IGZ1bmN0aW9uIChwb2ludCwgaXNTa2lwSW5uZXJPZmZzZXQpIHtcblx0XHRcdHZhciBub2RlLCBvZmZzZXQ7XG5cblx0XHRcdGlmIChub2RlTGVuZ3RoKHBvaW50Lm5vZGUpID09PSBwb2ludC5vZmZzZXQpIHtcblx0XHRcdFx0aWYgKGlzRWRpdGFibGUocG9pbnQubm9kZSkpIHtcblx0XHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdG5vZGUgPSBwb2ludC5ub2RlLnBhcmVudE5vZGU7XG5cdFx0XHRcdG9mZnNldCA9IHBvc2l0aW9uKHBvaW50Lm5vZGUpICsgMTtcblx0XHRcdH0gZWxzZSBpZiAoaGFzQ2hpbGRyZW4ocG9pbnQubm9kZSkpIHtcblx0XHRcdFx0bm9kZSA9IHBvaW50Lm5vZGUuY2hpbGROb2Rlc1twb2ludC5vZmZzZXRdO1xuXHRcdFx0XHRvZmZzZXQgPSAwO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bm9kZSA9IHBvaW50Lm5vZGU7XG5cdFx0XHRcdG9mZnNldCA9IGlzU2tpcElubmVyT2Zmc2V0ID8gbm9kZUxlbmd0aChwb2ludC5ub2RlKSA6IHBvaW50Lm9mZnNldCArIDE7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdG5vZGU6IG5vZGUsXG5cdFx0XHRcdG9mZnNldDogb2Zmc2V0XG5cdFx0XHR9O1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiByZXR1cm5zIHdoZXRoZXIgcG9pbnRBIGFuZCBwb2ludEIgaXMgc2FtZSBvciBub3QuXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge0JvdW5kYXJ5UG9pbnR9IHBvaW50QVxuXHRcdCAqIEBwYXJhbSB7Qm91bmRhcnlQb2ludH0gcG9pbnRCXG5cdFx0ICogQHJldHVybiB7Qm9vbGVhbn1cblx0XHQgKi9cblx0XHR2YXIgaXNTYW1lUG9pbnQgPSBmdW5jdGlvbiAocG9pbnRBLCBwb2ludEIpIHtcblx0XHRcdHJldHVybiBwb2ludEEubm9kZSA9PT0gcG9pbnRCLm5vZGUgJiYgcG9pbnRBLm9mZnNldCA9PT0gcG9pbnRCLm9mZnNldDtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogcmV0dXJucyB3aGV0aGVyIHBvaW50IGlzIHZpc2libGUgKGNhbiBzZXQgY3Vyc29yKSBvciBub3QuXG5cdFx0ICogXG5cdFx0ICogQHBhcmFtIHtCb3VuZGFyeVBvaW50fSBwb2ludFxuXHRcdCAqIEByZXR1cm4ge0Jvb2xlYW59XG5cdFx0ICovXG5cdFx0dmFyIGlzVmlzaWJsZVBvaW50ID0gZnVuY3Rpb24gKHBvaW50KSB7XG5cdFx0XHRpZiAoaXNUZXh0KHBvaW50Lm5vZGUpIHx8ICFoYXNDaGlsZHJlbihwb2ludC5ub2RlKSB8fCBpc0VtcHR5KHBvaW50Lm5vZGUpKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXG5cdFx0XHR2YXIgbGVmdE5vZGUgPSBwb2ludC5ub2RlLmNoaWxkTm9kZXNbcG9pbnQub2Zmc2V0IC0gMV07XG5cdFx0XHR2YXIgcmlnaHROb2RlID0gcG9pbnQubm9kZS5jaGlsZE5vZGVzW3BvaW50Lm9mZnNldF07XG5cdFx0XHRpZiAoKCFsZWZ0Tm9kZSB8fCBpc1ZvaWQobGVmdE5vZGUpKSAmJiAoIXJpZ2h0Tm9kZSB8fCBpc1ZvaWQocmlnaHROb2RlKSkpIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCBwcmV2UG9pbnRVdGlsXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge0JvdW5kYXJ5UG9pbnR9IHBvaW50XG5cdFx0ICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZFxuXHRcdCAqIEByZXR1cm4ge0JvdW5kYXJ5UG9pbnR9XG5cdFx0ICovXG5cdFx0dmFyIHByZXZQb2ludFVudGlsID0gZnVuY3Rpb24gKHBvaW50LCBwcmVkKSB7XG5cdFx0XHR3aGlsZSAocG9pbnQpIHtcblx0XHRcdFx0aWYgKHByZWQocG9pbnQpKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHBvaW50O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cG9pbnQgPSBwcmV2UG9pbnQocG9pbnQpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCBuZXh0UG9pbnRVbnRpbFxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtCb3VuZGFyeVBvaW50fSBwb2ludFxuXHRcdCAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRcblx0XHQgKiBAcmV0dXJuIHtCb3VuZGFyeVBvaW50fVxuXHRcdCAqL1xuXHRcdHZhciBuZXh0UG9pbnRVbnRpbCA9IGZ1bmN0aW9uIChwb2ludCwgcHJlZCkge1xuXHRcdFx0d2hpbGUgKHBvaW50KSB7XG5cdFx0XHRcdGlmIChwcmVkKHBvaW50KSkge1xuXHRcdFx0XHRcdHJldHVybiBwb2ludDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHBvaW50ID0gbmV4dFBvaW50KHBvaW50KTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2Qgd2Fsa1BvaW50XG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge0JvdW5kYXJ5UG9pbnR9IHN0YXJ0UG9pbnRcblx0XHQgKiBAcGFyYW0ge0JvdW5kYXJ5UG9pbnR9IGVuZFBvaW50XG5cdFx0ICogQHBhcmFtIHtGdW5jdGlvbn0gaGFuZGxlclxuXHRcdCAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNTa2lwSW5uZXJPZmZzZXRcblx0XHQgKi9cblx0XHR2YXIgd2Fsa1BvaW50ID0gZnVuY3Rpb24gKHN0YXJ0UG9pbnQsIGVuZFBvaW50LCBoYW5kbGVyLCBpc1NraXBJbm5lck9mZnNldCkge1xuXHRcdFx0dmFyIHBvaW50ID0gc3RhcnRQb2ludDtcblxuXHRcdFx0d2hpbGUgKHBvaW50KSB7XG5cdFx0XHRcdGhhbmRsZXIocG9pbnQpO1xuXG5cdFx0XHRcdGlmIChpc1NhbWVQb2ludChwb2ludCwgZW5kUG9pbnQpKSB7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR2YXIgaXNTa2lwT2Zmc2V0ID0gaXNTa2lwSW5uZXJPZmZzZXQgJiZcblx0XHRcdFx0XHRcdFx0XHQgICBzdGFydFBvaW50Lm5vZGUgIT09IHBvaW50Lm5vZGUgJiZcblx0XHRcdFx0XHRcdFx0XHQgICBlbmRQb2ludC5ub2RlICE9PSBwb2ludC5ub2RlO1xuXHRcdFx0XHRwb2ludCA9IG5leHRQb2ludChwb2ludCwgaXNTa2lwT2Zmc2V0KTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCBtYWtlT2Zmc2V0UGF0aFxuXHRcdCAqXG5cdFx0ICogcmV0dXJuIG9mZnNldFBhdGgoYXJyYXkgb2Ygb2Zmc2V0KSBmcm9tIGFuY2VzdG9yXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge05vZGV9IGFuY2VzdG9yIC0gYW5jZXN0b3Igbm9kZVxuXHRcdCAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuXHRcdCAqL1xuXHRcdHZhciBtYWtlT2Zmc2V0UGF0aCA9IGZ1bmN0aW9uIChhbmNlc3Rvciwgbm9kZSkge1xuXHRcdFx0dmFyIGFuY2VzdG9ycyA9IGxpc3RBbmNlc3Rvcihub2RlLCBmdW5jLmVxKGFuY2VzdG9yKSk7XG5cdFx0XHRyZXR1cm4gJC5tYXAoYW5jZXN0b3JzLCBwb3NpdGlvbikucmV2ZXJzZSgpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIGZyb21PZmZzZXRQYXRoXG5cdFx0ICpcblx0XHQgKiByZXR1cm4gZWxlbWVudCBmcm9tIG9mZnNldFBhdGgoYXJyYXkgb2Ygb2Zmc2V0KVxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtOb2RlfSBhbmNlc3RvciAtIGFuY2VzdG9yIG5vZGVcblx0XHQgKiBAcGFyYW0ge2FycmF5fSBvZmZzZXRzIC0gb2Zmc2V0UGF0aFxuXHRcdCAqL1xuXHRcdHZhciBmcm9tT2Zmc2V0UGF0aCA9IGZ1bmN0aW9uIChhbmNlc3Rvciwgb2Zmc2V0cykge1xuXHRcdFx0dmFyIGN1cnJlbnQgPSBhbmNlc3Rvcjtcblx0XHRcdGZvciAodmFyIGkgPSAwLCBsZW4gPSBvZmZzZXRzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0XHRcdGlmIChjdXJyZW50LmNoaWxkTm9kZXMubGVuZ3RoIDw9IG9mZnNldHNbaV0pIHtcblx0XHRcdFx0XHRjdXJyZW50ID0gY3VycmVudC5jaGlsZE5vZGVzW2N1cnJlbnQuY2hpbGROb2Rlcy5sZW5ndGggLSAxXTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRjdXJyZW50ID0gY3VycmVudC5jaGlsZE5vZGVzW29mZnNldHNbaV1dO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gY3VycmVudDtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCBzcGxpdE5vZGVcblx0XHQgKlxuXHRcdCAqIHNwbGl0IGVsZW1lbnQgb3IgI3RleHRcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7Qm91bmRhcnlQb2ludH0gcG9pbnRcblx0XHQgKiBAcGFyYW0ge0Jvb2xlYW59IFtpc1NraXBQYWRkaW5nQmxhbmtIVE1MXVxuXHRcdCAqIEByZXR1cm4ge05vZGV9IHJpZ2h0IG5vZGUgb2YgYm91bmRhcnlQb2ludFxuXHRcdCAqL1xuXHRcdHZhciBzcGxpdE5vZGUgPSBmdW5jdGlvbiAocG9pbnQsIGlzU2tpcFBhZGRpbmdCbGFua0hUTUwpIHtcblx0XHRcdC8vIHNwbGl0ICN0ZXh0XG5cdFx0XHRpZiAoaXNUZXh0KHBvaW50Lm5vZGUpKSB7XG5cdFx0XHRcdC8vIGVkZ2UgY2FzZVxuXHRcdFx0XHRpZiAoaXNMZWZ0RWRnZVBvaW50KHBvaW50KSkge1xuXHRcdFx0XHRcdHJldHVybiBwb2ludC5ub2RlO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGlzUmlnaHRFZGdlUG9pbnQocG9pbnQpKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHBvaW50Lm5vZGUubmV4dFNpYmxpbmc7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gcG9pbnQubm9kZS5zcGxpdFRleHQocG9pbnQub2Zmc2V0KTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gc3BsaXQgZWxlbWVudFxuXHRcdFx0dmFyIGNoaWxkTm9kZSA9IHBvaW50Lm5vZGUuY2hpbGROb2Rlc1twb2ludC5vZmZzZXRdO1xuXHRcdFx0dmFyIGNsb25lID0gaW5zZXJ0QWZ0ZXIocG9pbnQubm9kZS5jbG9uZU5vZGUoZmFsc2UpLCBwb2ludC5ub2RlKTtcblx0XHRcdGFwcGVuZENoaWxkTm9kZXMoY2xvbmUsIGxpc3ROZXh0KGNoaWxkTm9kZSkpO1xuXG5cdFx0XHRpZiAoIWlzU2tpcFBhZGRpbmdCbGFua0hUTUwpIHtcblx0XHRcdFx0cGFkZGluZ0JsYW5rSFRNTChwb2ludC5ub2RlKTtcblx0XHRcdFx0cGFkZGluZ0JsYW5rSFRNTChjbG9uZSk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBjbG9uZTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCBzcGxpdFRyZWVcblx0XHQgKlxuXHRcdCAqIHNwbGl0IHRyZWUgYnkgcG9pbnRcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7Tm9kZX0gcm9vdCAtIHNwbGl0IHJvb3Rcblx0XHQgKiBAcGFyYW0ge0JvdW5kYXJ5UG9pbnR9IHBvaW50XG5cdFx0ICogQHBhcmFtIHtCb29sZWFufSBbaXNTa2lwUGFkZGluZ0JsYW5rSFRNTF1cblx0XHQgKiBAcmV0dXJuIHtOb2RlfSByaWdodCBub2RlIG9mIGJvdW5kYXJ5UG9pbnRcblx0XHQgKi9cblx0XHR2YXIgc3BsaXRUcmVlID0gZnVuY3Rpb24gKHJvb3QsIHBvaW50LCBpc1NraXBQYWRkaW5nQmxhbmtIVE1MKSB7XG5cdFx0XHQvLyBleCkgWyN0ZXh0LCA8c3Bhbj4sIDxwPl1cblx0XHRcdHZhciBhbmNlc3RvcnMgPSBsaXN0QW5jZXN0b3IocG9pbnQubm9kZSwgZnVuYy5lcShyb290KSk7XG5cblx0XHRcdGlmICghYW5jZXN0b3JzLmxlbmd0aCkge1xuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdH0gZWxzZSBpZiAoYW5jZXN0b3JzLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0XHRyZXR1cm4gc3BsaXROb2RlKHBvaW50LCBpc1NraXBQYWRkaW5nQmxhbmtIVE1MKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGFuY2VzdG9ycy5yZWR1Y2UoZnVuY3Rpb24gKG5vZGUsIHBhcmVudCkge1xuXHRcdFx0XHR2YXIgY2xvbmUgPSBpbnNlcnRBZnRlcihwYXJlbnQuY2xvbmVOb2RlKGZhbHNlKSwgcGFyZW50KTtcblxuXHRcdFx0XHRpZiAobm9kZSA9PT0gcG9pbnQubm9kZSkge1xuXHRcdFx0XHRcdG5vZGUgPSBzcGxpdE5vZGUocG9pbnQsIGlzU2tpcFBhZGRpbmdCbGFua0hUTUwpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0YXBwZW5kQ2hpbGROb2RlcyhjbG9uZSwgbGlzdE5leHQobm9kZSkpO1xuXG5cdFx0XHRcdGlmICghaXNTa2lwUGFkZGluZ0JsYW5rSFRNTCkge1xuXHRcdFx0XHRcdHBhZGRpbmdCbGFua0hUTUwocGFyZW50KTtcblx0XHRcdFx0XHRwYWRkaW5nQmxhbmtIVE1MKGNsb25lKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gY2xvbmU7XG5cdFx0XHR9KTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogc3BsaXQgcG9pbnRcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7UG9pbnR9IHBvaW50XG5cdFx0ICogQHBhcmFtIHtCb29sZWFufSBpc0lubGluZVxuXHRcdCAqIEByZXR1cm4ge09iamVjdH1cblx0XHQgKi9cblx0XHR2YXIgc3BsaXRQb2ludCA9IGZ1bmN0aW9uIChwb2ludCwgaXNJbmxpbmUpIHtcblx0XHRcdC8vIGZpbmQgc3BsaXRSb290LCBjb250YWluZXJcblx0XHRcdC8vICAtIGlubGluZTogc3BsaXRSb290IGlzIGEgY2hpbGQgb2YgcGFyYWdyYXBoXG5cdFx0XHQvLyAgLSBibG9jazogc3BsaXRSb290IGlzIGEgY2hpbGQgb2YgYm9keUNvbnRhaW5lclxuXHRcdFx0dmFyIHByZWQgPSBpc0lubGluZSA/IGlzUGFyYSA6IGlzQm9keUNvbnRhaW5lcjtcblx0XHRcdHZhciBhbmNlc3RvcnMgPSBsaXN0QW5jZXN0b3IocG9pbnQubm9kZSwgcHJlZCk7XG5cdFx0XHR2YXIgdG9wQW5jZXN0b3IgPSBsaXN0Lmxhc3QoYW5jZXN0b3JzKSB8fCBwb2ludC5ub2RlO1xuXG5cdFx0XHR2YXIgc3BsaXRSb290LCBjb250YWluZXI7XG5cdFx0XHRpZiAocHJlZCh0b3BBbmNlc3RvcikpIHtcblx0XHRcdFx0c3BsaXRSb290ID0gYW5jZXN0b3JzW2FuY2VzdG9ycy5sZW5ndGggLSAyXTtcblx0XHRcdFx0Y29udGFpbmVyID0gdG9wQW5jZXN0b3I7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzcGxpdFJvb3QgPSB0b3BBbmNlc3Rvcjtcblx0XHRcdFx0Y29udGFpbmVyID0gc3BsaXRSb290LnBhcmVudE5vZGU7XG5cdFx0XHR9XG5cblx0XHRcdC8vIHNwbGl0IHdpdGggc3BsaXRUcmVlXG5cdFx0XHR2YXIgcGl2b3QgPSBzcGxpdFJvb3QgJiYgc3BsaXRUcmVlKHNwbGl0Um9vdCwgcG9pbnQsIGlzSW5saW5lKTtcblxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0cmlnaHROb2RlOiBwaXZvdCxcblx0XHRcdFx0Y29udGFpbmVyOiBjb250YWluZXJcblx0XHRcdH07XG5cdFx0fTtcblxuXHRcdHZhciBjcmVhdGUgPSBmdW5jdGlvbiAobm9kZU5hbWUpIHtcblx0XHRcdHJldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KG5vZGVOYW1lKTtcblx0XHR9O1xuXG5cdFx0dmFyIGNyZWF0ZVRleHQgPSBmdW5jdGlvbiAodGV4dCkge1xuXHRcdFx0cmV0dXJuIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRleHQpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIHJlbW92ZVxuXHRcdCAqXG5cdFx0ICogcmVtb3ZlIG5vZGUsIChpc1JlbW92ZUNoaWxkOiByZW1vdmUgY2hpbGQgb3Igbm90KVxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtOb2RlfSBub2RlXG5cdFx0ICogQHBhcmFtIHtCb29sZWFufSBpc1JlbW92ZUNoaWxkXG5cdFx0ICovXG5cdFx0dmFyIHJlbW92ZSA9IGZ1bmN0aW9uIChub2RlLCBpc1JlbW92ZUNoaWxkKSB7XG5cdFx0XHRpZiAoIW5vZGUgfHwgIW5vZGUucGFyZW50Tm9kZSkgeyByZXR1cm47IH1cblx0XHRcdGlmIChub2RlLnJlbW92ZU5vZGUpIHsgcmV0dXJuIG5vZGUucmVtb3ZlTm9kZShpc1JlbW92ZUNoaWxkKTsgfVxuXG5cdFx0XHR2YXIgcGFyZW50ID0gbm9kZS5wYXJlbnROb2RlO1xuXHRcdFx0aWYgKCFpc1JlbW92ZUNoaWxkKSB7XG5cdFx0XHRcdHZhciBub2RlcyA9IFtdO1xuXHRcdFx0XHR2YXIgaSwgbGVuO1xuXHRcdFx0XHRmb3IgKGkgPSAwLCBsZW4gPSBub2RlLmNoaWxkTm9kZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcblx0XHRcdFx0XHRub2Rlcy5wdXNoKG5vZGUuY2hpbGROb2Rlc1tpXSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRmb3IgKGkgPSAwLCBsZW4gPSBub2Rlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuXHRcdFx0XHRcdHBhcmVudC5pbnNlcnRCZWZvcmUobm9kZXNbaV0sIG5vZGUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHBhcmVudC5yZW1vdmVDaGlsZChub2RlKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCByZW1vdmVXaGlsZVxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtOb2RlfSBub2RlXG5cdFx0ICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZFxuXHRcdCAqL1xuXHRcdHZhciByZW1vdmVXaGlsZSA9IGZ1bmN0aW9uIChub2RlLCBwcmVkKSB7XG5cdFx0XHR3aGlsZSAobm9kZSkge1xuXHRcdFx0XHRpZiAoaXNFZGl0YWJsZShub2RlKSB8fCAhcHJlZChub2RlKSkge1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dmFyIHBhcmVudCA9IG5vZGUucGFyZW50Tm9kZTtcblx0XHRcdFx0cmVtb3ZlKG5vZGUpO1xuXHRcdFx0XHRub2RlID0gcGFyZW50O1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIHJlcGxhY2Vcblx0XHQgKlxuXHRcdCAqIHJlcGxhY2Ugbm9kZSB3aXRoIHByb3ZpZGVkIG5vZGVOYW1lXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge05vZGV9IG5vZGVcblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gbm9kZU5hbWVcblx0XHQgKiBAcmV0dXJuIHtOb2RlfSAtIG5ldyBub2RlXG5cdFx0ICovXG5cdFx0dmFyIHJlcGxhY2UgPSBmdW5jdGlvbiAobm9kZSwgbm9kZU5hbWUpIHtcblx0XHRcdGlmIChub2RlLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IG5vZGVOYW1lLnRvVXBwZXJDYXNlKCkpIHtcblx0XHRcdFx0cmV0dXJuIG5vZGU7XG5cdFx0XHR9XG5cblx0XHRcdHZhciBuZXdOb2RlID0gY3JlYXRlKG5vZGVOYW1lKTtcblxuXHRcdFx0aWYgKG5vZGUuc3R5bGUuY3NzVGV4dCkge1xuXHRcdFx0XHRuZXdOb2RlLnN0eWxlLmNzc1RleHQgPSBub2RlLnN0eWxlLmNzc1RleHQ7XG5cdFx0XHR9XG5cblx0XHRcdGFwcGVuZENoaWxkTm9kZXMobmV3Tm9kZSwgbGlzdC5mcm9tKG5vZGUuY2hpbGROb2RlcykpO1xuXHRcdFx0aW5zZXJ0QWZ0ZXIobmV3Tm9kZSwgbm9kZSk7XG5cdFx0XHRyZW1vdmUobm9kZSk7XG5cblx0XHRcdHJldHVybiBuZXdOb2RlO1xuXHRcdH07XG5cblx0XHR2YXIgaXNUZXh0YXJlYSA9IG1ha2VQcmVkQnlOb2RlTmFtZSgnVEVYVEFSRUEnKTtcblxuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2QgaHRtbFxuXHRcdCAqXG5cdFx0ICogZ2V0IHRoZSBIVE1MIGNvbnRlbnRzIG9mIG5vZGVcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkbm9kZVxuXHRcdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW2lzTmV3bGluZU9uQmxvY2tdXG5cdFx0ICovXG5cdFx0dmFyIGh0bWwgPSBmdW5jdGlvbiAoJG5vZGUsIGlzTmV3bGluZU9uQmxvY2spIHtcblx0XHRcdHZhciBtYXJrdXAgPSBpc1RleHRhcmVhKCRub2RlWzBdKSA/ICRub2RlLnZhbCgpIDogJG5vZGUuaHRtbCgpO1xuXG5cdFx0XHRpZiAoaXNOZXdsaW5lT25CbG9jaykge1xuXHRcdFx0XHR2YXIgcmVnZXhUYWcgPSAvPChcXC8/KShcXGIoPyEhKVtePlxcc10qKSguKj8pKFxccypcXC8/PikvZztcblx0XHRcdFx0bWFya3VwID0gbWFya3VwLnJlcGxhY2UocmVnZXhUYWcsIGZ1bmN0aW9uIChtYXRjaCwgZW5kU2xhc2gsIG5hbWUpIHtcblx0XHRcdFx0XHRuYW1lID0gbmFtZS50b1VwcGVyQ2FzZSgpO1xuXHRcdFx0XHRcdHZhciBpc0VuZE9mSW5saW5lQ29udGFpbmVyID0gL15ESVZ8XlREfF5USHxeUHxeTEl8XkhbMS03XS8udGVzdChuYW1lKSAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ICEhZW5kU2xhc2g7XG5cdFx0XHRcdFx0dmFyIGlzQmxvY2tOb2RlID0gL15CTE9DS1FVT1RFfF5UQUJMRXxeVEJPRFl8XlRSfF5IUnxeVUx8Xk9MLy50ZXN0KG5hbWUpO1xuXG5cdFx0XHRcdFx0cmV0dXJuIG1hdGNoICsgKChpc0VuZE9mSW5saW5lQ29udGFpbmVyIHx8IGlzQmxvY2tOb2RlKSA/ICdcXG4nIDogJycpO1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0bWFya3VwID0gJC50cmltKG1hcmt1cCk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBtYXJrdXA7XG5cdFx0fTtcblxuXHRcdHZhciB2YWx1ZSA9IGZ1bmN0aW9uICgkdGV4dGFyZWEsIHN0cmlwTGluZWJyZWFrcykge1xuXHRcdFx0dmFyIHZhbCA9ICR0ZXh0YXJlYS52YWwoKTtcblx0XHRcdGlmIChzdHJpcExpbmVicmVha3MpIHtcblx0XHRcdFx0cmV0dXJuIHZhbC5yZXBsYWNlKC9bXFxuXFxyXS9nLCAnJyk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdmFsO1xuXHRcdH07XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0LyoqIEBwcm9wZXJ0eSB7U3RyaW5nfSBOQlNQX0NIQVIgKi9cblx0XHRcdE5CU1BfQ0hBUjogTkJTUF9DSEFSLFxuXHRcdFx0LyoqIEBwcm9wZXJ0eSB7U3RyaW5nfSBaRVJPX1dJRFRIX05CU1BfQ0hBUiAqL1xuXHRcdFx0WkVST19XSURUSF9OQlNQX0NIQVI6IFpFUk9fV0lEVEhfTkJTUF9DSEFSLFxuXHRcdFx0LyoqIEBwcm9wZXJ0eSB7U3RyaW5nfSBibGFuayAqL1xuXHRcdFx0Ymxhbms6IGJsYW5rSFRNTCxcblx0XHRcdC8qKiBAcHJvcGVydHkge1N0cmluZ30gZW1wdHlQYXJhICovXG5cdFx0XHRlbXB0eVBhcmE6ICc8cD4nICsgYmxhbmtIVE1MICsgJzwvcD4nLFxuXHRcdFx0bWFrZVByZWRCeU5vZGVOYW1lOiBtYWtlUHJlZEJ5Tm9kZU5hbWUsXG5cdFx0XHRpc0VkaXRhYmxlOiBpc0VkaXRhYmxlLFxuXHRcdFx0aXNDb250cm9sU2l6aW5nOiBpc0NvbnRyb2xTaXppbmcsXG5cdFx0XHRidWlsZExheW91dEluZm86IGJ1aWxkTGF5b3V0SW5mbyxcblx0XHRcdG1ha2VMYXlvdXRJbmZvOiBtYWtlTGF5b3V0SW5mbyxcblx0XHRcdGlzVGV4dDogaXNUZXh0LFxuXHRcdFx0aXNWb2lkOiBpc1ZvaWQsXG5cdFx0XHRpc1BhcmE6IGlzUGFyYSxcblx0XHRcdGlzUHVyZVBhcmE6IGlzUHVyZVBhcmEsXG5cdFx0XHRpc0lubGluZTogaXNJbmxpbmUsXG5cdFx0XHRpc0JvZHlJbmxpbmU6IGlzQm9keUlubGluZSxcblx0XHRcdGlzQm9keTogaXNCb2R5LFxuXHRcdFx0aXNQYXJhSW5saW5lOiBpc1BhcmFJbmxpbmUsXG5cdFx0XHRpc0xpc3Q6IGlzTGlzdCxcblx0XHRcdGlzVGFibGU6IGlzVGFibGUsXG5cdFx0XHRpc0NlbGw6IGlzQ2VsbCxcblx0XHRcdGlzQmxvY2txdW90ZTogaXNCbG9ja3F1b3RlLFxuXHRcdFx0aXNCb2R5Q29udGFpbmVyOiBpc0JvZHlDb250YWluZXIsXG5cdFx0XHRpc0FuY2hvcjogaXNBbmNob3IsXG5cdFx0XHRpc0RpdjogbWFrZVByZWRCeU5vZGVOYW1lKCdESVYnKSxcblx0XHRcdGlzTGk6IGlzTGksXG5cdFx0XHRpc0JSOiBtYWtlUHJlZEJ5Tm9kZU5hbWUoJ0JSJyksXG5cdFx0XHRpc1NwYW46IG1ha2VQcmVkQnlOb2RlTmFtZSgnU1BBTicpLFxuXHRcdFx0aXNCOiBtYWtlUHJlZEJ5Tm9kZU5hbWUoJ0InKSxcblx0XHRcdGlzVTogbWFrZVByZWRCeU5vZGVOYW1lKCdVJyksXG5cdFx0XHRpc1M6IG1ha2VQcmVkQnlOb2RlTmFtZSgnUycpLFxuXHRcdFx0aXNJOiBtYWtlUHJlZEJ5Tm9kZU5hbWUoJ0knKSxcblx0XHRcdGlzSW1nOiBtYWtlUHJlZEJ5Tm9kZU5hbWUoJ0lNRycpLFxuXHRcdFx0aXNUZXh0YXJlYTogaXNUZXh0YXJlYSxcblx0XHRcdGlzRW1wdHk6IGlzRW1wdHksXG5cdFx0XHRpc0VtcHR5QW5jaG9yOiBmdW5jLmFuZChpc0FuY2hvciwgaXNFbXB0eSksXG5cdFx0XHRpc0Nsb3Nlc3RTaWJsaW5nOiBpc0Nsb3Nlc3RTaWJsaW5nLFxuXHRcdFx0d2l0aENsb3Nlc3RTaWJsaW5nczogd2l0aENsb3Nlc3RTaWJsaW5ncyxcblx0XHRcdG5vZGVMZW5ndGg6IG5vZGVMZW5ndGgsXG5cdFx0XHRpc0xlZnRFZGdlUG9pbnQ6IGlzTGVmdEVkZ2VQb2ludCxcblx0XHRcdGlzUmlnaHRFZGdlUG9pbnQ6IGlzUmlnaHRFZGdlUG9pbnQsXG5cdFx0XHRpc0VkZ2VQb2ludDogaXNFZGdlUG9pbnQsXG5cdFx0XHRpc0xlZnRFZGdlT2Y6IGlzTGVmdEVkZ2VPZixcblx0XHRcdGlzUmlnaHRFZGdlT2Y6IGlzUmlnaHRFZGdlT2YsXG5cdFx0XHRwcmV2UG9pbnQ6IHByZXZQb2ludCxcblx0XHRcdG5leHRQb2ludDogbmV4dFBvaW50LFxuXHRcdFx0aXNTYW1lUG9pbnQ6IGlzU2FtZVBvaW50LFxuXHRcdFx0aXNWaXNpYmxlUG9pbnQ6IGlzVmlzaWJsZVBvaW50LFxuXHRcdFx0cHJldlBvaW50VW50aWw6IHByZXZQb2ludFVudGlsLFxuXHRcdFx0bmV4dFBvaW50VW50aWw6IG5leHRQb2ludFVudGlsLFxuXHRcdFx0d2Fsa1BvaW50OiB3YWxrUG9pbnQsXG5cdFx0XHRhbmNlc3RvcjogYW5jZXN0b3IsXG5cdFx0XHRzaW5nbGVDaGlsZEFuY2VzdG9yOiBzaW5nbGVDaGlsZEFuY2VzdG9yLFxuXHRcdFx0bGlzdEFuY2VzdG9yOiBsaXN0QW5jZXN0b3IsXG5cdFx0XHRsYXN0QW5jZXN0b3I6IGxhc3RBbmNlc3Rvcixcblx0XHRcdGxpc3ROZXh0OiBsaXN0TmV4dCxcblx0XHRcdGxpc3RQcmV2OiBsaXN0UHJldixcblx0XHRcdGxpc3REZXNjZW5kYW50OiBsaXN0RGVzY2VuZGFudCxcblx0XHRcdGNvbW1vbkFuY2VzdG9yOiBjb21tb25BbmNlc3Rvcixcblx0XHRcdHdyYXA6IHdyYXAsXG5cdFx0XHRpbnNlcnRBZnRlcjogaW5zZXJ0QWZ0ZXIsXG5cdFx0XHRhcHBlbmRDaGlsZE5vZGVzOiBhcHBlbmRDaGlsZE5vZGVzLFxuXHRcdFx0cG9zaXRpb246IHBvc2l0aW9uLFxuXHRcdFx0aGFzQ2hpbGRyZW46IGhhc0NoaWxkcmVuLFxuXHRcdFx0bWFrZU9mZnNldFBhdGg6IG1ha2VPZmZzZXRQYXRoLFxuXHRcdFx0ZnJvbU9mZnNldFBhdGg6IGZyb21PZmZzZXRQYXRoLFxuXHRcdFx0c3BsaXRUcmVlOiBzcGxpdFRyZWUsXG5cdFx0XHRzcGxpdFBvaW50OiBzcGxpdFBvaW50LFxuXHRcdFx0Y3JlYXRlOiBjcmVhdGUsXG5cdFx0XHRjcmVhdGVUZXh0OiBjcmVhdGVUZXh0LFxuXHRcdFx0cmVtb3ZlOiByZW1vdmUsXG5cdFx0XHRyZW1vdmVXaGlsZTogcmVtb3ZlV2hpbGUsXG5cdFx0XHRyZXBsYWNlOiByZXBsYWNlLFxuXHRcdFx0aHRtbDogaHRtbCxcblx0XHRcdHZhbHVlOiB2YWx1ZVxuXHRcdH07XG5cdH0pKCk7XG5cblxuXHR2YXIgcmFuZ2UgPSAoZnVuY3Rpb24gKCkge1xuXG5cdFx0LyoqXG5cdFx0ICogcmV0dXJuIGJvdW5kYXJ5UG9pbnQgZnJvbSBUZXh0UmFuZ2UsIGluc3BpcmVkIGJ5IEFuZHkgTmEncyBIdXNreVJhbmdlLmpzXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge1RleHRSYW5nZX0gdGV4dFJhbmdlXG5cdFx0ICogQHBhcmFtIHtCb29sZWFufSBpc1N0YXJ0XG5cdFx0ICogQHJldHVybiB7Qm91bmRhcnlQb2ludH1cblx0XHQgKlxuXHRcdCAqIEBzZWUgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2llL21zNTM1ODcyKHY9dnMuODUpLmFzcHhcblx0XHQgKi9cblx0XHR2YXIgdGV4dFJhbmdlVG9Qb2ludCA9IGZ1bmN0aW9uICh0ZXh0UmFuZ2UsIGlzU3RhcnQpIHtcblx0XHRcdHZhciBjb250YWluZXIgPSB0ZXh0UmFuZ2UucGFyZW50RWxlbWVudCgpLCBvZmZzZXQ7XG5cblx0XHRcdHZhciB0ZXN0ZXIgPSBkb2N1bWVudC5ib2R5LmNyZWF0ZVRleHRSYW5nZSgpLCBwcmV2Q29udGFpbmVyO1xuXHRcdFx0dmFyIGNoaWxkTm9kZXMgPSBsaXN0LmZyb20oY29udGFpbmVyLmNoaWxkTm9kZXMpO1xuXHRcdFx0Zm9yIChvZmZzZXQgPSAwOyBvZmZzZXQgPCBjaGlsZE5vZGVzLmxlbmd0aDsgb2Zmc2V0KyspIHtcblx0XHRcdFx0aWYgKGRvbS5pc1RleHQoY2hpbGROb2Rlc1tvZmZzZXRdKSkge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRlc3Rlci5tb3ZlVG9FbGVtZW50VGV4dChjaGlsZE5vZGVzW29mZnNldF0pO1xuXHRcdFx0XHRpZiAodGVzdGVyLmNvbXBhcmVFbmRQb2ludHMoJ1N0YXJ0VG9TdGFydCcsIHRleHRSYW5nZSkgPj0gMCkge1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHByZXZDb250YWluZXIgPSBjaGlsZE5vZGVzW29mZnNldF07XG5cdFx0XHR9XG5cblx0XHRcdGlmIChvZmZzZXQgIT09IDAgJiYgZG9tLmlzVGV4dChjaGlsZE5vZGVzW29mZnNldCAtIDFdKSkge1xuXHRcdFx0XHR2YXIgdGV4dFJhbmdlU3RhcnQgPSBkb2N1bWVudC5ib2R5LmNyZWF0ZVRleHRSYW5nZSgpLCBjdXJUZXh0Tm9kZSA9IG51bGw7XG5cdFx0XHRcdHRleHRSYW5nZVN0YXJ0Lm1vdmVUb0VsZW1lbnRUZXh0KHByZXZDb250YWluZXIgfHwgY29udGFpbmVyKTtcblx0XHRcdFx0dGV4dFJhbmdlU3RhcnQuY29sbGFwc2UoIXByZXZDb250YWluZXIpO1xuXHRcdFx0XHRjdXJUZXh0Tm9kZSA9IHByZXZDb250YWluZXIgPyBwcmV2Q29udGFpbmVyLm5leHRTaWJsaW5nIDogY29udGFpbmVyLmZpcnN0Q2hpbGQ7XG5cblx0XHRcdFx0dmFyIHBvaW50VGVzdGVyID0gdGV4dFJhbmdlLmR1cGxpY2F0ZSgpO1xuXHRcdFx0XHRwb2ludFRlc3Rlci5zZXRFbmRQb2ludCgnU3RhcnRUb1N0YXJ0JywgdGV4dFJhbmdlU3RhcnQpO1xuXHRcdFx0XHR2YXIgdGV4dENvdW50ID0gcG9pbnRUZXN0ZXIudGV4dC5yZXBsYWNlKC9bXFxyXFxuXS9nLCAnJykubGVuZ3RoO1xuXG5cdFx0XHRcdHdoaWxlICh0ZXh0Q291bnQgPiBjdXJUZXh0Tm9kZS5ub2RlVmFsdWUubGVuZ3RoICYmIGN1clRleHROb2RlLm5leHRTaWJsaW5nKSB7XG5cdFx0XHRcdFx0dGV4dENvdW50IC09IGN1clRleHROb2RlLm5vZGVWYWx1ZS5sZW5ndGg7XG5cdFx0XHRcdFx0Y3VyVGV4dE5vZGUgPSBjdXJUZXh0Tm9kZS5uZXh0U2libGluZztcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cblx0XHRcdFx0dmFyIGR1bW15ID0gY3VyVGV4dE5vZGUubm9kZVZhbHVlOyAvLyBlbmZvcmNlIElFIHRvIHJlLXJlZmVyZW5jZSBjdXJUZXh0Tm9kZSwgaGFja1xuXHRcdFx0XHQvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuXG5cdFx0XHRcdGlmIChpc1N0YXJ0ICYmIGN1clRleHROb2RlLm5leHRTaWJsaW5nICYmIGRvbS5pc1RleHQoY3VyVGV4dE5vZGUubmV4dFNpYmxpbmcpICYmXG5cdFx0XHRcdFx0dGV4dENvdW50ID09PSBjdXJUZXh0Tm9kZS5ub2RlVmFsdWUubGVuZ3RoKSB7XG5cdFx0XHRcdFx0dGV4dENvdW50IC09IGN1clRleHROb2RlLm5vZGVWYWx1ZS5sZW5ndGg7XG5cdFx0XHRcdFx0Y3VyVGV4dE5vZGUgPSBjdXJUZXh0Tm9kZS5uZXh0U2libGluZztcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnRhaW5lciA9IGN1clRleHROb2RlO1xuXHRcdFx0XHRvZmZzZXQgPSB0ZXh0Q291bnQ7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGNvbnQ6IGNvbnRhaW5lcixcblx0XHRcdFx0b2Zmc2V0OiBvZmZzZXRcblx0XHRcdH07XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIHJldHVybiBUZXh0UmFuZ2UgZnJvbSBib3VuZGFyeSBwb2ludCAoaW5zcGlyZWQgYnkgZ29vZ2xlIGNsb3N1cmUtbGlicmFyeSlcblx0XHQgKiBAcGFyYW0ge0JvdW5kYXJ5UG9pbnR9IHBvaW50XG5cdFx0ICogQHJldHVybiB7VGV4dFJhbmdlfVxuXHRcdCAqL1xuXHRcdHZhciBwb2ludFRvVGV4dFJhbmdlID0gZnVuY3Rpb24gKHBvaW50KSB7XG5cdFx0XHR2YXIgdGV4dFJhbmdlSW5mbyA9IGZ1bmN0aW9uIChjb250YWluZXIsIG9mZnNldCkge1xuXHRcdFx0XHR2YXIgbm9kZSwgaXNDb2xsYXBzZVRvU3RhcnQ7XG5cblx0XHRcdFx0aWYgKGRvbS5pc1RleHQoY29udGFpbmVyKSkge1xuXHRcdFx0XHRcdHZhciBwcmV2VGV4dE5vZGVzID0gZG9tLmxpc3RQcmV2KGNvbnRhaW5lciwgZnVuYy5ub3QoZG9tLmlzVGV4dCkpO1xuXHRcdFx0XHRcdHZhciBwcmV2Q29udGFpbmVyID0gbGlzdC5sYXN0KHByZXZUZXh0Tm9kZXMpLnByZXZpb3VzU2libGluZztcblx0XHRcdFx0XHRub2RlID0gcHJldkNvbnRhaW5lciB8fCBjb250YWluZXIucGFyZW50Tm9kZTtcblx0XHRcdFx0XHRvZmZzZXQgKz0gbGlzdC5zdW0obGlzdC50YWlsKHByZXZUZXh0Tm9kZXMpLCBkb20ubm9kZUxlbmd0aCk7XG5cdFx0XHRcdFx0aXNDb2xsYXBzZVRvU3RhcnQgPSAhcHJldkNvbnRhaW5lcjtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRub2RlID0gY29udGFpbmVyLmNoaWxkTm9kZXNbb2Zmc2V0XSB8fCBjb250YWluZXI7XG5cdFx0XHRcdFx0aWYgKGRvbS5pc1RleHQobm9kZSkpIHtcblx0XHRcdFx0XHRcdHJldHVybiB0ZXh0UmFuZ2VJbmZvKG5vZGUsIDApO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdG9mZnNldCA9IDA7XG5cdFx0XHRcdFx0aXNDb2xsYXBzZVRvU3RhcnQgPSBmYWxzZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0bm9kZTogbm9kZSxcblx0XHRcdFx0XHRjb2xsYXBzZVRvU3RhcnQ6IGlzQ29sbGFwc2VUb1N0YXJ0LFxuXHRcdFx0XHRcdG9mZnNldDogb2Zmc2V0XG5cdFx0XHRcdH07XG5cdFx0XHR9O1xuXG5cdFx0XHR2YXIgdGV4dFJhbmdlID0gZG9jdW1lbnQuYm9keS5jcmVhdGVUZXh0UmFuZ2UoKTtcblx0XHRcdHZhciBpbmZvID0gdGV4dFJhbmdlSW5mbyhwb2ludC5ub2RlLCBwb2ludC5vZmZzZXQpO1xuXG5cdFx0XHR0ZXh0UmFuZ2UubW92ZVRvRWxlbWVudFRleHQoaW5mby5ub2RlKTtcblx0XHRcdHRleHRSYW5nZS5jb2xsYXBzZShpbmZvLmNvbGxhcHNlVG9TdGFydCk7XG5cdFx0XHR0ZXh0UmFuZ2UubW92ZVN0YXJ0KCdjaGFyYWN0ZXInLCBpbmZvLm9mZnNldCk7XG5cdFx0XHRyZXR1cm4gdGV4dFJhbmdlO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBXcmFwcGVkIFJhbmdlXG5cdFx0ICpcblx0XHQgKiBAY29uc3RydWN0b3Jcblx0XHQgKiBAcGFyYW0ge05vZGV9IHNjIC0gc3RhcnQgY29udGFpbmVyXG5cdFx0ICogQHBhcmFtIHtOdW1iZXJ9IHNvIC0gc3RhcnQgb2Zmc2V0XG5cdFx0ICogQHBhcmFtIHtOb2RlfSBlYyAtIGVuZCBjb250YWluZXJcblx0XHQgKiBAcGFyYW0ge051bWJlcn0gZW8gLSBlbmQgb2Zmc2V0XG5cdFx0ICovXG5cdFx0dmFyIFdyYXBwZWRSYW5nZSA9IGZ1bmN0aW9uIChzYywgc28sIGVjLCBlbykge1xuXHRcdFx0dGhpcy5zYyA9IHNjO1xuXHRcdFx0dGhpcy5zbyA9IHNvO1xuXHRcdFx0dGhpcy5lYyA9IGVjO1xuXHRcdFx0dGhpcy5lbyA9IGVvO1xuXG5cdFx0XHQvLyBuYXRpdmVSYW5nZTogZ2V0IG5hdGl2ZVJhbmdlIGZyb20gc2MsIHNvLCBlYywgZW9cblx0XHRcdHZhciBuYXRpdmVSYW5nZSA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0aWYgKGFnZW50LmlzVzNDUmFuZ2VTdXBwb3J0KSB7XG5cdFx0XHRcdFx0dmFyIHczY1JhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcblx0XHRcdFx0XHR3M2NSYW5nZS5zZXRTdGFydChzYywgc28pO1xuXHRcdFx0XHRcdHczY1JhbmdlLnNldEVuZChlYywgZW8pO1xuXG5cdFx0XHRcdFx0cmV0dXJuIHczY1JhbmdlO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHZhciB0ZXh0UmFuZ2UgPSBwb2ludFRvVGV4dFJhbmdlKHtcblx0XHRcdFx0XHRcdG5vZGU6IHNjLFxuXHRcdFx0XHRcdFx0b2Zmc2V0OiBzb1xuXHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0dGV4dFJhbmdlLnNldEVuZFBvaW50KCdFbmRUb0VuZCcsIHBvaW50VG9UZXh0UmFuZ2Uoe1xuXHRcdFx0XHRcdFx0bm9kZTogZWMsXG5cdFx0XHRcdFx0XHRvZmZzZXQ6IGVvXG5cdFx0XHRcdFx0fSkpO1xuXG5cdFx0XHRcdFx0cmV0dXJuIHRleHRSYW5nZTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblxuXHRcdFx0dGhpcy5nZXRQb2ludHMgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0c2M6IHNjLFxuXHRcdFx0XHRcdHNvOiBzbyxcblx0XHRcdFx0XHRlYzogZWMsXG5cdFx0XHRcdFx0ZW86IGVvXG5cdFx0XHRcdH07XG5cdFx0XHR9O1xuXG5cdFx0XHR0aGlzLmdldFN0YXJ0UG9pbnQgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0bm9kZTogc2MsXG5cdFx0XHRcdFx0b2Zmc2V0OiBzb1xuXHRcdFx0XHR9O1xuXHRcdFx0fTtcblxuXHRcdFx0dGhpcy5nZXRFbmRQb2ludCA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRub2RlOiBlYyxcblx0XHRcdFx0XHRvZmZzZXQ6IGVvXG5cdFx0XHRcdH07XG5cdFx0XHR9O1xuXG5cdFx0XHQvKipcblx0XHRcdCAqIHNlbGVjdCB1cGRhdGUgdmlzaWJsZSByYW5nZVxuXHRcdFx0ICovXG5cdFx0XHR0aGlzLnNlbGVjdCA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0dmFyIG5hdGl2ZVJuZyA9IG5hdGl2ZVJhbmdlKCk7XG5cdFx0XHRcdGlmIChhZ2VudC5pc1czQ1JhbmdlU3VwcG9ydCkge1xuXHRcdFx0XHRcdHZhciBzZWxlY3Rpb24gPSBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKTtcblx0XHRcdFx0XHRpZiAoc2VsZWN0aW9uLnJhbmdlQ291bnQgPiAwKSB7XG5cdFx0XHRcdFx0XHRzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHNlbGVjdGlvbi5hZGRSYW5nZShuYXRpdmVSbmcpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG5hdGl2ZVJuZy5zZWxlY3QoKTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblxuXHRcdFx0LyoqXG5cdFx0XHQgKiBAcmV0dXJuIHtXcmFwcGVkUmFuZ2V9XG5cdFx0XHQgKi9cblx0XHRcdHRoaXMubm9ybWFsaXplID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRcdC8qKlxuXHRcdFx0XHQgKiBAcGFyYW0ge0JvdW5kYXJ5UG9pbnR9IHBvaW50XG5cdFx0XHRcdCAqIEByZXR1cm4ge0JvdW5kYXJ5UG9pbnR9XG5cdFx0XHRcdCAqL1xuXHRcdFx0XHR2YXIgZ2V0VmlzaWJsZVBvaW50ID0gZnVuY3Rpb24gKHBvaW50KSB7XG5cdFx0XHRcdFx0aWYgKCFkb20uaXNWaXNpYmxlUG9pbnQocG9pbnQpKSB7XG5cdFx0XHRcdFx0XHRpZiAoZG9tLmlzTGVmdEVkZ2VQb2ludChwb2ludCkpIHtcblx0XHRcdFx0XHRcdFx0cG9pbnQgPSBkb20ubmV4dFBvaW50VW50aWwocG9pbnQsIGRvbS5pc1Zpc2libGVQb2ludCk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRwb2ludCA9IGRvbS5wcmV2UG9pbnRVbnRpbChwb2ludCwgZG9tLmlzVmlzaWJsZVBvaW50KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIHBvaW50O1xuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdHZhciBzdGFydFBvaW50ID0gZ2V0VmlzaWJsZVBvaW50KHRoaXMuZ2V0U3RhcnRQb2ludCgpKTtcblx0XHRcdFx0dmFyIGVuZFBvaW50ID0gZ2V0VmlzaWJsZVBvaW50KHRoaXMuZ2V0RW5kUG9pbnQoKSk7XG5cblx0XHRcdFx0cmV0dXJuIG5ldyBXcmFwcGVkUmFuZ2UoXG5cdFx0XHRcdCAgc3RhcnRQb2ludC5ub2RlLFxuXHRcdFx0XHQgIHN0YXJ0UG9pbnQub2Zmc2V0LFxuXHRcdFx0XHQgIGVuZFBvaW50Lm5vZGUsXG5cdFx0XHRcdCAgZW5kUG9pbnQub2Zmc2V0XG5cdFx0XHRcdCk7XG5cdFx0XHR9O1xuXG5cdFx0XHQvKipcblx0XHRcdCAqIHJldHVybnMgbWF0Y2hlZCBub2RlcyBvbiByYW5nZVxuXHRcdFx0ICpcblx0XHRcdCAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkXSAtIHByZWRpY2F0ZSBmdW5jdGlvblxuXHRcdFx0ICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuXHRcdFx0ICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5pbmNsdWRlQW5jZXN0b3JdXG5cdFx0XHQgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmZ1bGx5Q29udGFpbnNdXG5cdFx0XHQgKiBAcmV0dXJuIHtOb2RlW119XG5cdFx0XHQgKi9cblx0XHRcdHRoaXMubm9kZXMgPSBmdW5jdGlvbiAocHJlZCwgb3B0aW9ucykge1xuXHRcdFx0XHRwcmVkID0gcHJlZCB8fCBmdW5jLm9rO1xuXG5cdFx0XHRcdHZhciBpbmNsdWRlQW5jZXN0b3IgPSBvcHRpb25zICYmIG9wdGlvbnMuaW5jbHVkZUFuY2VzdG9yO1xuXHRcdFx0XHR2YXIgZnVsbHlDb250YWlucyA9IG9wdGlvbnMgJiYgb3B0aW9ucy5mdWxseUNvbnRhaW5zO1xuXG5cdFx0XHRcdC8vIFRPRE8gY29tcGFyZSBwb2ludHMgYW5kIHNvcnRcblx0XHRcdFx0dmFyIHN0YXJ0UG9pbnQgPSB0aGlzLmdldFN0YXJ0UG9pbnQoKTtcblx0XHRcdFx0dmFyIGVuZFBvaW50ID0gdGhpcy5nZXRFbmRQb2ludCgpO1xuXG5cdFx0XHRcdHZhciBub2RlcyA9IFtdO1xuXHRcdFx0XHR2YXIgbGVmdEVkZ2VOb2RlcyA9IFtdO1xuXG5cdFx0XHRcdGRvbS53YWxrUG9pbnQoc3RhcnRQb2ludCwgZW5kUG9pbnQsIGZ1bmN0aW9uIChwb2ludCkge1xuXHRcdFx0XHRcdGlmIChkb20uaXNFZGl0YWJsZShwb2ludC5ub2RlKSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHZhciBub2RlO1xuXHRcdFx0XHRcdGlmIChmdWxseUNvbnRhaW5zKSB7XG5cdFx0XHRcdFx0XHRpZiAoZG9tLmlzTGVmdEVkZ2VQb2ludChwb2ludCkpIHtcblx0XHRcdFx0XHRcdFx0bGVmdEVkZ2VOb2Rlcy5wdXNoKHBvaW50Lm5vZGUpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKGRvbS5pc1JpZ2h0RWRnZVBvaW50KHBvaW50KSAmJiBsaXN0LmNvbnRhaW5zKGxlZnRFZGdlTm9kZXMsIHBvaW50Lm5vZGUpKSB7XG5cdFx0XHRcdFx0XHRcdG5vZGUgPSBwb2ludC5ub2RlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoaW5jbHVkZUFuY2VzdG9yKSB7XG5cdFx0XHRcdFx0XHRub2RlID0gZG9tLmFuY2VzdG9yKHBvaW50Lm5vZGUsIHByZWQpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRub2RlID0gcG9pbnQubm9kZTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAobm9kZSAmJiBwcmVkKG5vZGUpKSB7XG5cdFx0XHRcdFx0XHRub2Rlcy5wdXNoKG5vZGUpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSwgdHJ1ZSk7XG5cblx0XHRcdFx0cmV0dXJuIGxpc3QudW5pcXVlKG5vZGVzKTtcblx0XHRcdH07XG5cblx0XHRcdC8qKlxuXHRcdFx0ICogcmV0dXJucyBjb21tb25BbmNlc3RvciBvZiByYW5nZVxuXHRcdFx0ICogQHJldHVybiB7RWxlbWVudH0gLSBjb21tb25BbmNlc3RvclxuXHRcdFx0ICovXG5cdFx0XHR0aGlzLmNvbW1vbkFuY2VzdG9yID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRyZXR1cm4gZG9tLmNvbW1vbkFuY2VzdG9yKHNjLCBlYyk7XG5cdFx0XHR9O1xuXG5cdFx0XHQvKipcblx0XHRcdCAqIHJldHVybnMgZXhwYW5kZWQgcmFuZ2UgYnkgcHJlZFxuXHRcdFx0ICpcblx0XHRcdCAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWQgLSBwcmVkaWNhdGUgZnVuY3Rpb25cblx0XHRcdCAqIEByZXR1cm4ge1dyYXBwZWRSYW5nZX1cblx0XHRcdCAqL1xuXHRcdFx0dGhpcy5leHBhbmQgPSBmdW5jdGlvbiAocHJlZCkge1xuXHRcdFx0XHR2YXIgc3RhcnRBbmNlc3RvciA9IGRvbS5hbmNlc3RvcihzYywgcHJlZCk7XG5cdFx0XHRcdHZhciBlbmRBbmNlc3RvciA9IGRvbS5hbmNlc3RvcihlYywgcHJlZCk7XG5cblx0XHRcdFx0aWYgKCFzdGFydEFuY2VzdG9yICYmICFlbmRBbmNlc3Rvcikge1xuXHRcdFx0XHRcdHJldHVybiBuZXcgV3JhcHBlZFJhbmdlKHNjLCBzbywgZWMsIGVvKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHZhciBib3VuZGFyeVBvaW50cyA9IHRoaXMuZ2V0UG9pbnRzKCk7XG5cblx0XHRcdFx0aWYgKHN0YXJ0QW5jZXN0b3IpIHtcblx0XHRcdFx0XHRib3VuZGFyeVBvaW50cy5zYyA9IHN0YXJ0QW5jZXN0b3I7XG5cdFx0XHRcdFx0Ym91bmRhcnlQb2ludHMuc28gPSAwO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKGVuZEFuY2VzdG9yKSB7XG5cdFx0XHRcdFx0Ym91bmRhcnlQb2ludHMuZWMgPSBlbmRBbmNlc3Rvcjtcblx0XHRcdFx0XHRib3VuZGFyeVBvaW50cy5lbyA9IGRvbS5ub2RlTGVuZ3RoKGVuZEFuY2VzdG9yKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBuZXcgV3JhcHBlZFJhbmdlKFxuXHRcdFx0XHQgIGJvdW5kYXJ5UG9pbnRzLnNjLFxuXHRcdFx0XHQgIGJvdW5kYXJ5UG9pbnRzLnNvLFxuXHRcdFx0XHQgIGJvdW5kYXJ5UG9pbnRzLmVjLFxuXHRcdFx0XHQgIGJvdW5kYXJ5UG9pbnRzLmVvXG5cdFx0XHRcdCk7XG5cdFx0XHR9O1xuXG5cdFx0XHQvKipcblx0XHRcdCAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNDb2xsYXBzZVRvU3RhcnRcblx0XHRcdCAqIEByZXR1cm4ge1dyYXBwZWRSYW5nZX1cblx0XHRcdCAqL1xuXHRcdFx0dGhpcy5jb2xsYXBzZSA9IGZ1bmN0aW9uIChpc0NvbGxhcHNlVG9TdGFydCkge1xuXHRcdFx0XHRpZiAoaXNDb2xsYXBzZVRvU3RhcnQpIHtcblx0XHRcdFx0XHRyZXR1cm4gbmV3IFdyYXBwZWRSYW5nZShzYywgc28sIHNjLCBzbyk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmV0dXJuIG5ldyBXcmFwcGVkUmFuZ2UoZWMsIGVvLCBlYywgZW8pO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXG5cdFx0XHQvKipcblx0XHRcdCAqIHNwbGl0VGV4dCBvbiByYW5nZVxuXHRcdFx0ICovXG5cdFx0XHR0aGlzLnNwbGl0VGV4dCA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0dmFyIGlzU2FtZUNvbnRhaW5lciA9IHNjID09PSBlYztcblx0XHRcdFx0dmFyIGJvdW5kYXJ5UG9pbnRzID0gdGhpcy5nZXRQb2ludHMoKTtcblxuXHRcdFx0XHRpZiAoZG9tLmlzVGV4dChlYykgJiYgIWRvbS5pc0VkZ2VQb2ludCh0aGlzLmdldEVuZFBvaW50KCkpKSB7XG5cdFx0XHRcdFx0ZWMuc3BsaXRUZXh0KGVvKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChkb20uaXNUZXh0KHNjKSAmJiAhZG9tLmlzRWRnZVBvaW50KHRoaXMuZ2V0U3RhcnRQb2ludCgpKSkge1xuXHRcdFx0XHRcdGJvdW5kYXJ5UG9pbnRzLnNjID0gc2Muc3BsaXRUZXh0KHNvKTtcblx0XHRcdFx0XHRib3VuZGFyeVBvaW50cy5zbyA9IDA7XG5cblx0XHRcdFx0XHRpZiAoaXNTYW1lQ29udGFpbmVyKSB7XG5cdFx0XHRcdFx0XHRib3VuZGFyeVBvaW50cy5lYyA9IGJvdW5kYXJ5UG9pbnRzLnNjO1xuXHRcdFx0XHRcdFx0Ym91bmRhcnlQb2ludHMuZW8gPSBlbyAtIHNvO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBuZXcgV3JhcHBlZFJhbmdlKFxuXHRcdFx0XHQgIGJvdW5kYXJ5UG9pbnRzLnNjLFxuXHRcdFx0XHQgIGJvdW5kYXJ5UG9pbnRzLnNvLFxuXHRcdFx0XHQgIGJvdW5kYXJ5UG9pbnRzLmVjLFxuXHRcdFx0XHQgIGJvdW5kYXJ5UG9pbnRzLmVvXG5cdFx0XHRcdCk7XG5cdFx0XHR9O1xuXG5cdFx0XHQvKipcblx0XHRcdCAqIGRlbGV0ZSBjb250ZW50cyBvbiByYW5nZVxuXHRcdFx0ICogQHJldHVybiB7V3JhcHBlZFJhbmdlfVxuXHRcdFx0ICovXG5cdFx0XHR0aGlzLmRlbGV0ZUNvbnRlbnRzID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRpZiAodGhpcy5pc0NvbGxhcHNlZCgpKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR2YXIgcm5nID0gdGhpcy5zcGxpdFRleHQoKTtcblx0XHRcdFx0dmFyIG5vZGVzID0gcm5nLm5vZGVzKG51bGwsIHtcblx0XHRcdFx0XHRmdWxseUNvbnRhaW5zOiB0cnVlXG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdC8vIGZpbmQgbmV3IGN1cnNvciBwb2ludFxuXHRcdFx0XHR2YXIgcG9pbnQgPSBkb20ucHJldlBvaW50VW50aWwocm5nLmdldFN0YXJ0UG9pbnQoKSwgZnVuY3Rpb24gKHBvaW50KSB7XG5cdFx0XHRcdFx0cmV0dXJuICFsaXN0LmNvbnRhaW5zKG5vZGVzLCBwb2ludC5ub2RlKTtcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0dmFyIGVtcHR5UGFyZW50cyA9IFtdO1xuXHRcdFx0XHQkLmVhY2gobm9kZXMsIGZ1bmN0aW9uIChpZHgsIG5vZGUpIHtcblx0XHRcdFx0XHQvLyBmaW5kIGVtcHR5IHBhcmVudHNcblx0XHRcdFx0XHR2YXIgcGFyZW50ID0gbm9kZS5wYXJlbnROb2RlO1xuXHRcdFx0XHRcdGlmIChwb2ludC5ub2RlICE9PSBwYXJlbnQgJiYgZG9tLm5vZGVMZW5ndGgocGFyZW50KSA9PT0gMSkge1xuXHRcdFx0XHRcdFx0ZW1wdHlQYXJlbnRzLnB1c2gocGFyZW50KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZG9tLnJlbW92ZShub2RlLCBmYWxzZSk7XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdC8vIHJlbW92ZSBlbXB0eSBwYXJlbnRzXG5cdFx0XHRcdCQuZWFjaChlbXB0eVBhcmVudHMsIGZ1bmN0aW9uIChpZHgsIG5vZGUpIHtcblx0XHRcdFx0XHRkb20ucmVtb3ZlKG5vZGUsIGZhbHNlKTtcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0cmV0dXJuIG5ldyBXcmFwcGVkUmFuZ2UoXG5cdFx0XHRcdCAgcG9pbnQubm9kZSxcblx0XHRcdFx0ICBwb2ludC5vZmZzZXQsXG5cdFx0XHRcdCAgcG9pbnQubm9kZSxcblx0XHRcdFx0ICBwb2ludC5vZmZzZXRcblx0XHRcdFx0KS5ub3JtYWxpemUoKTtcblx0XHRcdH07XG5cblx0XHRcdC8qKlxuXHRcdFx0ICogbWFrZUlzT246IHJldHVybiBpc09uKHByZWQpIGZ1bmN0aW9uXG5cdFx0XHQgKi9cblx0XHRcdHZhciBtYWtlSXNPbiA9IGZ1bmN0aW9uIChwcmVkKSB7XG5cdFx0XHRcdHJldHVybiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0dmFyIGFuY2VzdG9yID0gZG9tLmFuY2VzdG9yKHNjLCBwcmVkKTtcblx0XHRcdFx0XHRyZXR1cm4gISFhbmNlc3RvciAmJiAoYW5jZXN0b3IgPT09IGRvbS5hbmNlc3RvcihlYywgcHJlZCkpO1xuXHRcdFx0XHR9O1xuXHRcdFx0fTtcblxuXHRcdFx0Ly8gaXNPbkVkaXRhYmxlOiBqdWRnZSB3aGV0aGVyIHJhbmdlIGlzIG9uIGVkaXRhYmxlIG9yIG5vdFxuXHRcdFx0dGhpcy5pc09uRWRpdGFibGUgPSBtYWtlSXNPbihkb20uaXNFZGl0YWJsZSk7XG5cdFx0XHQvLyBpc09uTGlzdDoganVkZ2Ugd2hldGhlciByYW5nZSBpcyBvbiBsaXN0IG5vZGUgb3Igbm90XG5cdFx0XHR0aGlzLmlzT25MaXN0ID0gbWFrZUlzT24oZG9tLmlzTGlzdCk7XG5cdFx0XHQvLyBpc09uQW5jaG9yOiBqdWRnZSB3aGV0aGVyIHJhbmdlIGlzIG9uIGFuY2hvciBub2RlIG9yIG5vdFxuXHRcdFx0dGhpcy5pc09uQW5jaG9yID0gbWFrZUlzT24oZG9tLmlzQW5jaG9yKTtcblx0XHRcdC8vIGlzT25BbmNob3I6IGp1ZGdlIHdoZXRoZXIgcmFuZ2UgaXMgb24gY2VsbCBub2RlIG9yIG5vdFxuXHRcdFx0dGhpcy5pc09uQ2VsbCA9IG1ha2VJc09uKGRvbS5pc0NlbGwpO1xuXG5cdFx0XHQvKipcblx0XHRcdCAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRcblx0XHRcdCAqIEByZXR1cm4ge0Jvb2xlYW59XG5cdFx0XHQgKi9cblx0XHRcdHRoaXMuaXNMZWZ0RWRnZU9mID0gZnVuY3Rpb24gKHByZWQpIHtcblx0XHRcdFx0aWYgKCFkb20uaXNMZWZ0RWRnZVBvaW50KHRoaXMuZ2V0U3RhcnRQb2ludCgpKSkge1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHZhciBub2RlID0gZG9tLmFuY2VzdG9yKHRoaXMuc2MsIHByZWQpO1xuXHRcdFx0XHRyZXR1cm4gbm9kZSAmJiBkb20uaXNMZWZ0RWRnZU9mKHRoaXMuc2MsIG5vZGUpO1xuXHRcdFx0fTtcblxuXHRcdFx0LyoqXG5cdFx0XHQgKiByZXR1cm5zIHdoZXRoZXIgcmFuZ2Ugd2FzIGNvbGxhcHNlZCBvciBub3Rcblx0XHRcdCAqL1xuXHRcdFx0dGhpcy5pc0NvbGxhcHNlZCA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0cmV0dXJuIHNjID09PSBlYyAmJiBzbyA9PT0gZW87XG5cdFx0XHR9O1xuXG5cdFx0XHQvKipcblx0XHRcdCAqIHdyYXAgaW5saW5lIG5vZGVzIHdoaWNoIGNoaWxkcmVuIG9mIGJvZHkgd2l0aCBwYXJhZ3JhcGhcblx0XHRcdCAqXG5cdFx0XHQgKiBAcmV0dXJuIHtXcmFwcGVkUmFuZ2V9XG5cdFx0XHQgKi9cblx0XHRcdHRoaXMud3JhcEJvZHlJbmxpbmVXaXRoUGFyYSA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0aWYgKGRvbS5pc0JvZHlDb250YWluZXIoc2MpICYmIGRvbS5pc0VtcHR5KHNjKSkge1xuXHRcdFx0XHRcdHNjLmlubmVySFRNTCA9IGRvbS5lbXB0eVBhcmE7XG5cdFx0XHRcdFx0cmV0dXJuIG5ldyBXcmFwcGVkUmFuZ2Uoc2MuZmlyc3RDaGlsZCwgMCwgc2MuZmlyc3RDaGlsZCwgMCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoZG9tLmlzUGFyYUlubGluZShzYykgfHwgZG9tLmlzUGFyYShzYykpIHtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5ub3JtYWxpemUoKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIGZpbmQgaW5saW5lIHRvcCBhbmNlc3RvclxuXHRcdFx0XHR2YXIgdG9wQW5jZXN0b3I7XG5cdFx0XHRcdGlmIChkb20uaXNJbmxpbmUoc2MpKSB7XG5cdFx0XHRcdFx0dmFyIGFuY2VzdG9ycyA9IGRvbS5saXN0QW5jZXN0b3Ioc2MsIGZ1bmMubm90KGRvbS5pc0lubGluZSkpO1xuXHRcdFx0XHRcdHRvcEFuY2VzdG9yID0gbGlzdC5sYXN0KGFuY2VzdG9ycyk7XG5cdFx0XHRcdFx0aWYgKCFkb20uaXNJbmxpbmUodG9wQW5jZXN0b3IpKSB7XG5cdFx0XHRcdFx0XHR0b3BBbmNlc3RvciA9IGFuY2VzdG9yc1thbmNlc3RvcnMubGVuZ3RoIC0gMl0gfHwgc2MuY2hpbGROb2Rlc1tzb107XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRvcEFuY2VzdG9yID0gc2MuY2hpbGROb2Rlc1tzbyA+IDAgPyBzbyAtIDEgOiAwXTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIHNpYmxpbmdzIG5vdCBpbiBwYXJhZ3JhcGhcblx0XHRcdFx0dmFyIGlubGluZVNpYmxpbmdzID0gZG9tLmxpc3RQcmV2KHRvcEFuY2VzdG9yLCBkb20uaXNQYXJhSW5saW5lKS5yZXZlcnNlKCk7XG5cdFx0XHRcdGlubGluZVNpYmxpbmdzID0gaW5saW5lU2libGluZ3MuY29uY2F0KGRvbS5saXN0TmV4dCh0b3BBbmNlc3Rvci5uZXh0U2libGluZywgZG9tLmlzUGFyYUlubGluZSkpO1xuXG5cdFx0XHRcdC8vIHdyYXAgd2l0aCBwYXJhZ3JhcGhcblx0XHRcdFx0aWYgKGlubGluZVNpYmxpbmdzLmxlbmd0aCkge1xuXHRcdFx0XHRcdHZhciBwYXJhID0gZG9tLndyYXAobGlzdC5oZWFkKGlubGluZVNpYmxpbmdzKSwgJ3AnKTtcblx0XHRcdFx0XHRkb20uYXBwZW5kQ2hpbGROb2RlcyhwYXJhLCBsaXN0LnRhaWwoaW5saW5lU2libGluZ3MpKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiB0aGlzLm5vcm1hbGl6ZSgpO1xuXHRcdFx0fTtcblxuXHRcdFx0LyoqXG5cdFx0XHQgKiBpbnNlcnQgbm9kZSBhdCBjdXJyZW50IGN1cnNvclxuXHRcdFx0ICpcblx0XHRcdCAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuXHRcdFx0ICogQHJldHVybiB7Tm9kZX1cblx0XHRcdCAqL1xuXHRcdFx0dGhpcy5pbnNlcnROb2RlID0gZnVuY3Rpb24gKG5vZGUpIHtcblx0XHRcdFx0dmFyIHJuZyA9IHRoaXMud3JhcEJvZHlJbmxpbmVXaXRoUGFyYSgpLmRlbGV0ZUNvbnRlbnRzKCk7XG5cdFx0XHRcdHZhciBpbmZvID0gZG9tLnNwbGl0UG9pbnQocm5nLmdldFN0YXJ0UG9pbnQoKSwgZG9tLmlzSW5saW5lKG5vZGUpKTtcblxuXHRcdFx0XHRpZiAoaW5mby5yaWdodE5vZGUpIHtcblx0XHRcdFx0XHRpbmZvLnJpZ2h0Tm9kZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShub2RlLCBpbmZvLnJpZ2h0Tm9kZSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0aW5mby5jb250YWluZXIuYXBwZW5kQ2hpbGQobm9kZSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gbm9kZTtcblx0XHRcdH07XG5cblx0XHRcdC8qKlxuXHRcdFx0ICogcmV0dXJucyB0ZXh0IGluIHJhbmdlXG5cdFx0XHQgKlxuXHRcdFx0ICogQHJldHVybiB7U3RyaW5nfVxuXHRcdFx0ICovXG5cdFx0XHR0aGlzLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0XHR2YXIgbmF0aXZlUm5nID0gbmF0aXZlUmFuZ2UoKTtcblx0XHRcdFx0cmV0dXJuIGFnZW50LmlzVzNDUmFuZ2VTdXBwb3J0ID8gbmF0aXZlUm5nLnRvU3RyaW5nKCkgOiBuYXRpdmVSbmcudGV4dDtcblx0XHRcdH07XG5cblx0XHRcdC8qKlxuXHRcdFx0ICogY3JlYXRlIG9mZnNldFBhdGggYm9va21hcmtcblx0XHRcdCAqXG5cdFx0XHQgKiBAcGFyYW0ge05vZGV9IGVkaXRhYmxlXG5cdFx0XHQgKi9cblx0XHRcdHRoaXMuYm9va21hcmsgPSBmdW5jdGlvbiAoZWRpdGFibGUpIHtcblx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRzOiB7XG5cdFx0XHRcdFx0XHRwYXRoOiBkb20ubWFrZU9mZnNldFBhdGgoZWRpdGFibGUsIHNjKSxcblx0XHRcdFx0XHRcdG9mZnNldDogc29cblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdGU6IHtcblx0XHRcdFx0XHRcdHBhdGg6IGRvbS5tYWtlT2Zmc2V0UGF0aChlZGl0YWJsZSwgZWMpLFxuXHRcdFx0XHRcdFx0b2Zmc2V0OiBlb1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblx0XHRcdH07XG5cblx0XHRcdC8qKlxuXHRcdFx0ICogY3JlYXRlIG9mZnNldFBhdGggYm9va21hcmsgYmFzZSBvbiBwYXJhZ3JhcGhcblx0XHRcdCAqXG5cdFx0XHQgKiBAcGFyYW0ge05vZGVbXX0gcGFyYXNcblx0XHRcdCAqL1xuXHRcdFx0dGhpcy5wYXJhQm9va21hcmsgPSBmdW5jdGlvbiAocGFyYXMpIHtcblx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRzOiB7XG5cdFx0XHRcdFx0XHRwYXRoOiBsaXN0LnRhaWwoZG9tLm1ha2VPZmZzZXRQYXRoKGxpc3QuaGVhZChwYXJhcyksIHNjKSksXG5cdFx0XHRcdFx0XHRvZmZzZXQ6IHNvXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRlOiB7XG5cdFx0XHRcdFx0XHRwYXRoOiBsaXN0LnRhaWwoZG9tLm1ha2VPZmZzZXRQYXRoKGxpc3QubGFzdChwYXJhcyksIGVjKSksXG5cdFx0XHRcdFx0XHRvZmZzZXQ6IGVvXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXHRcdFx0fTtcblxuXHRcdFx0LyoqXG5cdFx0XHQgKiBnZXRDbGllbnRSZWN0c1xuXHRcdFx0ICogQHJldHVybiB7UmVjdFtdfVxuXHRcdFx0ICovXG5cdFx0XHR0aGlzLmdldENsaWVudFJlY3RzID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0XHR2YXIgbmF0aXZlUm5nID0gbmF0aXZlUmFuZ2UoKTtcblx0XHRcdFx0cmV0dXJuIG5hdGl2ZVJuZy5nZXRDbGllbnRSZWN0cygpO1xuXHRcdFx0fTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogQGNsYXNzIGNvcmUucmFuZ2Vcblx0XHQgKlxuXHRcdCAqIERhdGEgc3RydWN0dXJlXG5cdFx0ICogICogQm91bmRhcnlQb2ludDogYSBwb2ludCBvZiBkb20gdHJlZVxuXHRcdCAqICAqIEJvdW5kYXJ5UG9pbnRzOiB0d28gYm91bmRhcnlQb2ludHMgY29ycmVzcG9uZGluZyB0byB0aGUgc3RhcnQgYW5kIHRoZSBlbmQgb2YgdGhlIFJhbmdlXG5cdFx0ICpcblx0XHQgKiBTZWUgdG8gaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTItVHJhdmVyc2FsLVJhbmdlL3Jhbmdlcy5odG1sI0xldmVsLTItUmFuZ2UtUG9zaXRpb25cblx0XHQgKlxuXHRcdCAqIEBzaW5nbGV0b25cblx0XHQgKiBAYWx0ZXJuYXRlQ2xhc3NOYW1lIHJhbmdlXG5cdFx0ICovXG5cdFx0cmV0dXJuIHtcblx0XHRcdC8qKlxuXHRcdFx0ICogQG1ldGhvZFxuXHRcdFx0ICogXG5cdFx0XHQgKiBjcmVhdGUgUmFuZ2UgT2JqZWN0IEZyb20gYXJndW1lbnRzIG9yIEJyb3dzZXIgU2VsZWN0aW9uXG5cdFx0XHQgKlxuXHRcdFx0ICogQHBhcmFtIHtOb2RlfSBzYyAtIHN0YXJ0IGNvbnRhaW5lclxuXHRcdFx0ICogQHBhcmFtIHtOdW1iZXJ9IHNvIC0gc3RhcnQgb2Zmc2V0XG5cdFx0XHQgKiBAcGFyYW0ge05vZGV9IGVjIC0gZW5kIGNvbnRhaW5lclxuXHRcdFx0ICogQHBhcmFtIHtOdW1iZXJ9IGVvIC0gZW5kIG9mZnNldFxuXHRcdFx0ICogQHJldHVybiB7V3JhcHBlZFJhbmdlfVxuXHRcdFx0ICovXG5cdFx0XHRjcmVhdGU6IGZ1bmN0aW9uIChzYywgc28sIGVjLCBlbykge1xuXHRcdFx0XHRpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHsgLy8gZnJvbSBCcm93c2VyIFNlbGVjdGlvblxuXHRcdFx0XHRcdGlmIChhZ2VudC5pc1czQ1JhbmdlU3VwcG9ydCkge1xuXHRcdFx0XHRcdFx0dmFyIHNlbGVjdGlvbiA9IGRvY3VtZW50LmdldFNlbGVjdGlvbigpO1xuXHRcdFx0XHRcdFx0aWYgKHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChkb20uaXNCb2R5KHNlbGVjdGlvbi5hbmNob3JOb2RlKSkge1xuXHRcdFx0XHRcdFx0XHQvLyBGaXJlZm94OiByZXR1cm5zIGVudGlyZSBib2R5IGFzIHJhbmdlIG9uIGluaXRpYWxpemF0aW9uLiBXZSB3b24ndCBuZXZlciBuZWVkIGl0LlxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0dmFyIG5hdGl2ZVJuZyA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xuXHRcdFx0XHRcdFx0c2MgPSBuYXRpdmVSbmcuc3RhcnRDb250YWluZXI7XG5cdFx0XHRcdFx0XHRzbyA9IG5hdGl2ZVJuZy5zdGFydE9mZnNldDtcblx0XHRcdFx0XHRcdGVjID0gbmF0aXZlUm5nLmVuZENvbnRhaW5lcjtcblx0XHRcdFx0XHRcdGVvID0gbmF0aXZlUm5nLmVuZE9mZnNldDtcblx0XHRcdFx0XHR9IGVsc2UgeyAvLyBJRTg6IFRleHRSYW5nZVxuXHRcdFx0XHRcdFx0dmFyIHRleHRSYW5nZSA9IGRvY3VtZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpO1xuXHRcdFx0XHRcdFx0dmFyIHRleHRSYW5nZUVuZCA9IHRleHRSYW5nZS5kdXBsaWNhdGUoKTtcblx0XHRcdFx0XHRcdHRleHRSYW5nZUVuZC5jb2xsYXBzZShmYWxzZSk7XG5cdFx0XHRcdFx0XHR2YXIgdGV4dFJhbmdlU3RhcnQgPSB0ZXh0UmFuZ2U7XG5cdFx0XHRcdFx0XHR0ZXh0UmFuZ2VTdGFydC5jb2xsYXBzZSh0cnVlKTtcblxuXHRcdFx0XHRcdFx0dmFyIHN0YXJ0UG9pbnQgPSB0ZXh0UmFuZ2VUb1BvaW50KHRleHRSYW5nZVN0YXJ0LCB0cnVlKSxcblx0XHRcdFx0XHRcdGVuZFBvaW50ID0gdGV4dFJhbmdlVG9Qb2ludCh0ZXh0UmFuZ2VFbmQsIGZhbHNlKTtcblxuXHRcdFx0XHRcdFx0Ly8gc2FtZSB2aXNpYmxlIHBvaW50IGNhc2U6IHJhbmdlIHdhcyBjb2xsYXBzZWQuXG5cdFx0XHRcdFx0XHRpZiAoZG9tLmlzVGV4dChzdGFydFBvaW50Lm5vZGUpICYmIGRvbS5pc0xlZnRFZGdlUG9pbnQoc3RhcnRQb2ludCkgJiZcblx0XHRcdFx0XHRcdFx0ZG9tLmlzVGV4dE5vZGUoZW5kUG9pbnQubm9kZSkgJiYgZG9tLmlzUmlnaHRFZGdlUG9pbnQoZW5kUG9pbnQpICYmXG5cdFx0XHRcdFx0XHRcdGVuZFBvaW50Lm5vZGUubmV4dFNpYmxpbmcgPT09IHN0YXJ0UG9pbnQubm9kZSkge1xuXHRcdFx0XHRcdFx0XHRzdGFydFBvaW50ID0gZW5kUG9pbnQ7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdHNjID0gc3RhcnRQb2ludC5jb250O1xuXHRcdFx0XHRcdFx0c28gPSBzdGFydFBvaW50Lm9mZnNldDtcblx0XHRcdFx0XHRcdGVjID0gZW5kUG9pbnQuY29udDtcblx0XHRcdFx0XHRcdGVvID0gZW5kUG9pbnQub2Zmc2V0O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyKSB7IC8vY29sbGFwc2VkXG5cdFx0XHRcdFx0ZWMgPSBzYztcblx0XHRcdFx0XHRlbyA9IHNvO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBuZXcgV3JhcHBlZFJhbmdlKHNjLCBzbywgZWMsIGVvKTtcblx0XHRcdH0sXG5cblx0XHRcdC8qKlxuXHRcdFx0ICogQG1ldGhvZCBcblx0XHRcdCAqIFxuXHRcdFx0ICogY3JlYXRlIFdyYXBwZWRSYW5nZSBmcm9tIG5vZGVcblx0XHRcdCAqXG5cdFx0XHQgKiBAcGFyYW0ge05vZGV9IG5vZGVcblx0XHRcdCAqIEByZXR1cm4ge1dyYXBwZWRSYW5nZX1cblx0XHRcdCAqL1xuXHRcdFx0Y3JlYXRlRnJvbU5vZGU6IGZ1bmN0aW9uIChub2RlKSB7XG5cdFx0XHRcdHZhciBzYyA9IG5vZGU7XG5cdFx0XHRcdHZhciBzbyA9IDA7XG5cdFx0XHRcdHZhciBlYyA9IG5vZGU7XG5cdFx0XHRcdHZhciBlbyA9IGRvbS5ub2RlTGVuZ3RoKGVjKTtcblxuXHRcdFx0XHQvLyBicm93c2VycyBjYW4ndCB0YXJnZXQgYSBwaWN0dXJlIG9yIHZvaWQgbm9kZVxuXHRcdFx0XHRpZiAoZG9tLmlzVm9pZChzYykpIHtcblx0XHRcdFx0XHRzbyA9IGRvbS5saXN0UHJldihzYykubGVuZ3RoIC0gMTtcblx0XHRcdFx0XHRzYyA9IHNjLnBhcmVudE5vZGU7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGRvbS5pc0JSKGVjKSkge1xuXHRcdFx0XHRcdGVvID0gZG9tLmxpc3RQcmV2KGVjKS5sZW5ndGggLSAxO1xuXHRcdFx0XHRcdGVjID0gZWMucGFyZW50Tm9kZTtcblx0XHRcdFx0fSBlbHNlIGlmIChkb20uaXNWb2lkKGVjKSkge1xuXHRcdFx0XHRcdGVvID0gZG9tLmxpc3RQcmV2KGVjKS5sZW5ndGg7XG5cdFx0XHRcdFx0ZWMgPSBlYy5wYXJlbnROb2RlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHRoaXMuY3JlYXRlKHNjLCBzbywgZWMsIGVvKTtcblx0XHRcdH0sXG5cblx0XHRcdC8qKlxuXHRcdFx0ICogQG1ldGhvZCBcblx0XHRcdCAqIFxuXHRcdFx0ICogY3JlYXRlIFdyYXBwZWRSYW5nZSBmcm9tIGJvb2ttYXJrXG5cdFx0XHQgKlxuXHRcdFx0ICogQHBhcmFtIHtOb2RlfSBlZGl0YWJsZVxuXHRcdFx0ICogQHBhcmFtIHtPYmplY3R9IGJvb2ttYXJrXG5cdFx0XHQgKiBAcmV0dXJuIHtXcmFwcGVkUmFuZ2V9XG5cdFx0XHQgKi9cblx0XHRcdGNyZWF0ZUZyb21Cb29rbWFyazogZnVuY3Rpb24gKGVkaXRhYmxlLCBib29rbWFyaykge1xuXHRcdFx0XHR2YXIgc2MgPSBkb20uZnJvbU9mZnNldFBhdGgoZWRpdGFibGUsIGJvb2ttYXJrLnMucGF0aCk7XG5cdFx0XHRcdHZhciBzbyA9IGJvb2ttYXJrLnMub2Zmc2V0O1xuXHRcdFx0XHR2YXIgZWMgPSBkb20uZnJvbU9mZnNldFBhdGgoZWRpdGFibGUsIGJvb2ttYXJrLmUucGF0aCk7XG5cdFx0XHRcdHZhciBlbyA9IGJvb2ttYXJrLmUub2Zmc2V0O1xuXHRcdFx0XHRyZXR1cm4gbmV3IFdyYXBwZWRSYW5nZShzYywgc28sIGVjLCBlbyk7XG5cdFx0XHR9LFxuXG5cdFx0XHQvKipcblx0XHRcdCAqIEBtZXRob2QgXG5cdFx0XHQgKlxuXHRcdFx0ICogY3JlYXRlIFdyYXBwZWRSYW5nZSBmcm9tIHBhcmFCb29rbWFya1xuXHRcdFx0ICpcblx0XHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBib29rbWFya1xuXHRcdFx0ICogQHBhcmFtIHtOb2RlW119IHBhcmFzXG5cdFx0XHQgKiBAcmV0dXJuIHtXcmFwcGVkUmFuZ2V9XG5cdFx0XHQgKi9cblx0XHRcdGNyZWF0ZUZyb21QYXJhQm9va21hcms6IGZ1bmN0aW9uIChib29rbWFyaywgcGFyYXMpIHtcblx0XHRcdFx0dmFyIHNvID0gYm9va21hcmsucy5vZmZzZXQ7XG5cdFx0XHRcdHZhciBlbyA9IGJvb2ttYXJrLmUub2Zmc2V0O1xuXHRcdFx0XHR2YXIgc2MgPSBkb20uZnJvbU9mZnNldFBhdGgobGlzdC5oZWFkKHBhcmFzKSwgYm9va21hcmsucy5wYXRoKTtcblx0XHRcdFx0dmFyIGVjID0gZG9tLmZyb21PZmZzZXRQYXRoKGxpc3QubGFzdChwYXJhcyksIGJvb2ttYXJrLmUucGF0aCk7XG5cblx0XHRcdFx0cmV0dXJuIG5ldyBXcmFwcGVkUmFuZ2Uoc2MsIHNvLCBlYywgZW8pO1xuXHRcdFx0fVxuXHRcdH07XG5cdH0pKCk7XG5cblx0LyoqXG5cdCAqIEBjbGFzcyBkZWZhdWx0cyBcblx0ICogXG5cdCAqIEBzaW5nbGV0b25cblx0ICovXG5cdHZhciBkZWZhdWx0cyA9IHtcblx0XHQvKiogQHByb3BlcnR5ICovXG5cdFx0dmVyc2lvbjogJzAuNi4zJyxcblxuXHRcdC8qKlxuXHRcdCAqIFxuXHRcdCAqIGZvciBldmVudCBvcHRpb25zLCByZWZlcmVuY2UgdG8gRXZlbnRIYW5kbGVyLmF0dGFjaFxuXHRcdCAqIFxuXHRcdCAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBvcHRpb25zIFxuXHRcdCAqIEBwcm9wZXJ0eSB7U3RyaW5nL051bWJlcn0gW29wdGlvbnMud2lkdGg9bnVsbF0gc2V0IGVkaXRvciB3aWR0aCBcblx0XHQgKiBAcHJvcGVydHkge1N0cmluZy9OdW1iZXJ9IFtvcHRpb25zLmhlaWdodD1udWxsXSBzZXQgZWRpdG9yIGhlaWdodCwgZXgpIDMwMFxuXHRcdCAqIEBwcm9wZXJ0eSB7U3RyaW5nL051bWJlcn0gb3B0aW9ucy5taW5IZWlnaHQgc2V0IG1pbmltdW0gaGVpZ2h0IG9mIGVkaXRvclxuXHRcdCAqIEBwcm9wZXJ0eSB7U3RyaW5nL051bWJlcn0gb3B0aW9ucy5tYXhIZWlnaHRcblx0XHQgKiBAcHJvcGVydHkge1N0cmluZy9OdW1iZXJ9IG9wdGlvbnMuZm9jdXMgXG5cdFx0ICogQHByb3BlcnR5IHtOdW1iZXJ9IG9wdGlvbnMudGFic2l6ZSBcblx0XHQgKiBAcHJvcGVydHkge0Jvb2xlYW59IG9wdGlvbnMuc3R5bGVXaXRoU3BhblxuXHRcdCAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBvcHRpb25zLmNvZGVtaXJyb3Jcblx0XHQgKiBAcHJvcGVydHkge09iamVjdH0gW29wdGlvbnMuY29kZW1pcnJvci5tb2RlPSd0ZXh0L2h0bWwnXVxuXHRcdCAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBbb3B0aW9ucy5jb2RlbWlycm9yLmh0bWxNb2RlPXRydWVdXG5cdFx0ICogQHByb3BlcnR5IHtPYmplY3R9IFtvcHRpb25zLmNvZGVtaXJyb3IubGluZU51bWJlcnM9dHJ1ZV1cblx0XHQgKiBAcHJvcGVydHkge1N0cmluZ30gW29wdGlvbnMubGFuZz1lbi1VU10gbGFuZ3VhZ2UgJ2VuLVVTJywgJ2tvLUtSJywgLi4uXG5cdFx0ICogQHByb3BlcnR5IHtTdHJpbmd9IFtvcHRpb25zLmRpcmVjdGlvbj1udWxsXSB0ZXh0IGRpcmVjdGlvbiwgZXgpICdydGwnXG5cdFx0ICogQHByb3BlcnR5IHtBcnJheX0gW29wdGlvbnMudG9vbGJhcl1cblx0XHQgKiBAcHJvcGVydHkge0Jvb2xlYW59IFtvcHRpb25zLmFpck1vZGU9ZmFsc2VdXG5cdFx0ICogQHByb3BlcnR5IHtBcnJheX0gW29wdGlvbnMuYWlyUG9wb3Zlcl1cblx0XHQgKiBAcHJvcGVydHkge0Z1Y250aW9ufSBbb3B0aW9ucy5vbkluaXRdIGluaXRpYWxpemVcblx0XHQgKiBAcHJvcGVydHkge0Z1Y250aW9ufSBbb3B0aW9ucy5vbnN1Ym1pdF1cblx0XHQgKi9cblx0XHRvcHRpb25zOiB7XG5cdFx0XHR3aWR0aDogbnVsbCwgICAgICAgICAgICAgICAgICAvLyBzZXQgZWRpdG9yIHdpZHRoXG5cdFx0XHRoZWlnaHQ6IG51bGwsICAgICAgICAgICAgICAgICAvLyBzZXQgZWRpdG9yIGhlaWdodCwgZXgpIDMwMFxuXG5cdFx0XHRtaW5IZWlnaHQ6IG51bGwsICAgICAgICAgICAgICAvLyBzZXQgbWluaW11bSBoZWlnaHQgb2YgZWRpdG9yXG5cdFx0XHRtYXhIZWlnaHQ6IG51bGwsICAgICAgICAgICAgICAvLyBzZXQgbWF4aW11bSBoZWlnaHQgb2YgZWRpdG9yXG5cblx0XHRcdGZvY3VzOiBmYWxzZSwgICAgICAgICAgICAgICAgIC8vIHNldCBmb2N1cyB0byBlZGl0YWJsZSBhcmVhIGFmdGVyIGluaXRpYWxpemluZyBzdW1tZXJub3RlXG5cblx0XHRcdHRhYnNpemU6IDQsICAgICAgICAgICAgICAgICAgIC8vIHNpemUgb2YgdGFiIGV4KSAyIG9yIDRcblx0XHRcdHN0eWxlV2l0aFNwYW46IHRydWUsICAgICAgICAgIC8vIHN0eWxlIHdpdGggc3BhbiAoQ2hyb21lIGFuZCBGRiBvbmx5KVxuXG5cdFx0XHRkaXNhYmxlTGlua1RhcmdldDogZmFsc2UsICAgICAvLyBoaWRlIGxpbmsgVGFyZ2V0IENoZWNrYm94XG5cdFx0XHRkaXNhYmxlRHJhZ0FuZERyb3A6IGZhbHNlLCAgICAvLyBkaXNhYmxlIGRyYWcgYW5kIGRyb3AgZXZlbnRcblx0XHRcdGRpc2FibGVSZXNpemVFZGl0b3I6IGZhbHNlLCAgIC8vIGRpc2FibGUgcmVzaXppbmcgZWRpdG9yXG5cblx0XHRcdHNob3J0Y3V0czogdHJ1ZSwgICAgICAgICAgICAgIC8vIGVuYWJsZSBrZXlib2FyZCBzaG9ydGN1dHNcblxuXHRcdFx0cGxhY2Vob2xkZXI6IGZhbHNlLCAgICAgICAgICAgLy8gZW5hYmxlIHBsYWNlaG9sZGVyIHRleHRcblx0XHRcdHByZXR0aWZ5SHRtbDogdHJ1ZSwgICAgICAgICAgIC8vIGVuYWJsZSBwcmV0dGlmeWluZyBodG1sIHdoaWxlIHRvZ2dsaW5nIGNvZGV2aWV3XG5cblx0XHRcdGljb25QcmVmaXg6ICdmYSBmYS0nLCAgICAgICAgIC8vIHByZWZpeCBmb3IgY3NzIGljb24gY2xhc3Nlc1xuXG5cdFx0XHRjb2RlbWlycm9yOiB7ICAgICAgICAgICAgICAgICAvLyBjb2RlbWlycm9yIG9wdGlvbnNcblx0XHRcdFx0bW9kZTogJ3RleHQvaHRtbCcsXG5cdFx0XHRcdGh0bWxNb2RlOiB0cnVlLFxuXHRcdFx0XHRsaW5lTnVtYmVyczogdHJ1ZVxuXHRcdFx0fSxcblxuXHRcdFx0Ly8gbGFuZ3VhZ2Vcblx0XHRcdGxhbmc6ICdlbi1VUycsICAgICAgICAgICAgICAgIC8vIGxhbmd1YWdlICdlbi1VUycsICdrby1LUicsIC4uLlxuXHRcdFx0ZGlyZWN0aW9uOiBudWxsLCAgICAgICAgICAgICAgLy8gdGV4dCBkaXJlY3Rpb24sIGV4KSAncnRsJ1xuXG5cdFx0XHQvLyB0b29sYmFyXG5cdFx0XHR0b29sYmFyOiBbXG5cdFx0XHQgIFsnc3R5bGUnLCBbJ3N0eWxlJ11dLFxuXHRcdFx0ICBbJ2ZvbnQnLCBbJ2JvbGQnLCAnaXRhbGljJywgJ3VuZGVybGluZScsICdjbGVhciddXSxcblx0XHRcdCAgWydmb250bmFtZScsIFsnZm9udG5hbWUnXV0sXG5cdFx0XHQgIFsnY29sb3InLCBbJ2NvbG9yJ11dLFxuXHRcdFx0ICBbJ3BhcmEnLCBbJ3VsJywgJ29sJywgJ3BhcmFncmFwaCddXSxcblx0XHRcdCAgWydoZWlnaHQnLCBbJ2hlaWdodCddXSxcblx0XHRcdCAgWyd0YWJsZScsIFsndGFibGUnXV0sXG5cdFx0XHQgIFsnaW5zZXJ0JywgWydsaW5rJywgJ3BpY3R1cmUnLCAnaHInXV0sXG5cdFx0XHQgIFsndmlldycsIFsnZnVsbHNjcmVlbicsICdjb2RldmlldyddXSxcblx0XHRcdCAgWydoZWxwJywgWydoZWxwJ11dXG5cdFx0XHRdLFxuXG5cdFx0XHQvLyBhaXIgbW9kZTogaW5saW5lIGVkaXRvclxuXHRcdFx0YWlyTW9kZTogZmFsc2UsXG5cdFx0XHQvLyBhaXJQb3BvdmVyOiBbXG5cdFx0XHQvLyAgIFsnc3R5bGUnLCBbJ3N0eWxlJ11dLFxuXHRcdFx0Ly8gICBbJ2ZvbnQnLCBbJ2JvbGQnLCAnaXRhbGljJywgJ3VuZGVybGluZScsICdjbGVhciddXSxcblx0XHRcdC8vICAgWydmb250bmFtZScsIFsnZm9udG5hbWUnXV0sXG5cdFx0XHQvLyAgIFsnY29sb3InLCBbJ2NvbG9yJ11dLFxuXHRcdFx0Ly8gICBbJ3BhcmEnLCBbJ3VsJywgJ29sJywgJ3BhcmFncmFwaCddXSxcblx0XHRcdC8vICAgWydoZWlnaHQnLCBbJ2hlaWdodCddXSxcblx0XHRcdC8vICAgWyd0YWJsZScsIFsndGFibGUnXV0sXG5cdFx0XHQvLyAgIFsnaW5zZXJ0JywgWydsaW5rJywgJ3BpY3R1cmUnXV0sXG5cdFx0XHQvLyAgIFsnaGVscCcsIFsnaGVscCddXVxuXHRcdFx0Ly8gXSxcblx0XHRcdGFpclBvcG92ZXI6IFtcblx0XHRcdCAgWydjb2xvcicsIFsnY29sb3InXV0sXG5cdFx0XHQgIFsnZm9udCcsIFsnYm9sZCcsICd1bmRlcmxpbmUnLCAnY2xlYXInXV0sXG5cdFx0XHQgIFsncGFyYScsIFsndWwnLCAncGFyYWdyYXBoJ11dLFxuXHRcdFx0ICBbJ3RhYmxlJywgWyd0YWJsZSddXSxcblx0XHRcdCAgWydpbnNlcnQnLCBbJ2xpbmsnLCAncGljdHVyZSddXVxuXHRcdFx0XSxcblxuXHRcdFx0Ly8gc3R5bGUgdGFnXG5cdFx0XHRzdHlsZVRhZ3M6IFsncCcsICdibG9ja3F1b3RlJywgJ3ByZScsICdoMScsICdoMicsICdoMycsICdoNCcsICdoNScsICdoNiddLFxuXG5cdFx0XHQvLyBkZWZhdWx0IGZvbnROYW1lXG5cdFx0XHRkZWZhdWx0Rm9udE5hbWU6ICdIZWx2ZXRpY2EgTmV1ZScsXG5cblx0XHRcdC8vIGZvbnROYW1lXG5cdFx0XHRmb250TmFtZXM6IFtcblx0XHRcdCAgJ0FyaWFsJywgJ0FyaWFsIEJsYWNrJywgJ0NvbWljIFNhbnMgTVMnLCAnQ291cmllciBOZXcnLFxuXHRcdFx0ICAnSGVsdmV0aWNhIE5ldWUnLCAnSGVsdmV0aWNhJywgJ0ltcGFjdCcsICdMdWNpZGEgR3JhbmRlJyxcblx0XHRcdCAgJ1RhaG9tYScsICdUaW1lcyBOZXcgUm9tYW4nLCAnVmVyZGFuYSdcblx0XHRcdF0sXG5cdFx0XHRmb250TmFtZXNJZ25vcmVDaGVjazogW10sXG5cblx0XHRcdC8vIHBhbGxldGUgY29sb3JzKG4geCBuKVxuXHRcdFx0Y29sb3JzOiBbXG5cdFx0XHQgIFsnIzAwMDAwMCcsICcjNDI0MjQyJywgJyM2MzYzNjMnLCAnIzlDOUM5NCcsICcjQ0VDNkNFJywgJyNFRkVGRUYnLCAnI0Y3RjdGNycsICcjRkZGRkZGJ10sXG5cdFx0XHQgIFsnI0ZGMDAwMCcsICcjRkY5QzAwJywgJyNGRkZGMDAnLCAnIzAwRkYwMCcsICcjMDBGRkZGJywgJyMwMDAwRkYnLCAnIzlDMDBGRicsICcjRkYwMEZGJ10sXG5cdFx0XHQgIFsnI0Y3QzZDRScsICcjRkZFN0NFJywgJyNGRkVGQzYnLCAnI0Q2RUZENicsICcjQ0VERUU3JywgJyNDRUU3RjcnLCAnI0Q2RDZFNycsICcjRTdENkRFJ10sXG5cdFx0XHQgIFsnI0U3OUM5QycsICcjRkZDNjlDJywgJyNGRkU3OUMnLCAnI0I1RDZBNScsICcjQTVDNkNFJywgJyM5Q0M2RUYnLCAnI0I1QTVENicsICcjRDZBNUJEJ10sXG5cdFx0XHQgIFsnI0U3NjM2MycsICcjRjdBRDZCJywgJyNGRkQ2NjMnLCAnIzk0QkQ3QicsICcjNzNBNUFEJywgJyM2QkFEREUnLCAnIzhDN0JDNicsICcjQzY3QkE1J10sXG5cdFx0XHQgIFsnI0NFMDAwMCcsICcjRTc5NDM5JywgJyNFRkM2MzEnLCAnIzZCQTU0QScsICcjNEE3QjhDJywgJyMzOTg0QzYnLCAnIzYzNEFBNScsICcjQTU0QTdCJ10sXG5cdFx0XHQgIFsnIzlDMDAwMCcsICcjQjU2MzA4JywgJyNCRDk0MDAnLCAnIzM5N0IyMScsICcjMTA0QTVBJywgJyMwODUyOTQnLCAnIzMxMTg3MycsICcjNzMxODQyJ10sXG5cdFx0XHQgIFsnIzYzMDAwMCcsICcjN0IzOTAwJywgJyM4NDYzMDAnLCAnIzI5NTIxOCcsICcjMDgzMTM5JywgJyMwMDMxNjMnLCAnIzIxMTA0QScsICcjNEExMDMxJ11cblx0XHRcdF0sXG5cblx0XHRcdC8vIGxpbmVIZWlnaHRcblx0XHRcdGxpbmVIZWlnaHRzOiBbJzEuMCcsICcxLjInLCAnMS40JywgJzEuNScsICcxLjYnLCAnMS44JywgJzIuMCcsICczLjAnXSxcblxuXHRcdFx0Ly8gaW5zZXJ0VGFibGUgbWF4IHNpemVcblx0XHRcdGluc2VydFRhYmxlTWF4U2l6ZToge1xuXHRcdFx0XHRjb2w6IDEwLFxuXHRcdFx0XHRyb3c6IDEwXG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBpbWFnZVxuXHRcdFx0bWF4aW11bUltYWdlRmlsZVNpemU6IG51bGwsIC8vIHNpemUgaW4gYnl0ZXMsIG51bGwgPSBubyBsaW1pdFxuXG5cdFx0XHQvLyBjYWxsYmFja3Ncblx0XHRcdG9uaW5pdDogbnVsbCwgICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZVxuXHRcdFx0b25mb2N1czogbnVsbCwgICAgICAgICAgICAvLyBlZGl0YWJsZSBoYXMgZm9jdXNcblx0XHRcdG9uYmx1cjogbnVsbCwgICAgICAgICAgICAgLy8gZWRpdGFibGUgb3V0IG9mIGZvY3VzXG5cdFx0XHRvbmVudGVyOiBudWxsLCAgICAgICAgICAgIC8vIGVudGVyIGtleSBwcmVzc2VkXG5cdFx0XHRvbmtleXVwOiBudWxsLCAgICAgICAgICAgIC8vIGtleXVwXG5cdFx0XHRvbmtleWRvd246IG51bGwsICAgICAgICAgIC8vIGtleWRvd25cblx0XHRcdG9uSW1hZ2VVcGxvYWQ6IG51bGwsICAgICAgLy8gaW1hZ2VVcGxvYWRcblx0XHRcdG9uSW1hZ2VVcGxvYWRFcnJvcjogbnVsbCwgLy8gaW1hZ2VVcGxvYWRFcnJvclxuXHRcdFx0b25NZWRpYURlbGV0ZTogbnVsbCwgICAgICAvLyBtZWRpYSBkZWxldGVcblx0XHRcdG9uVG9vbGJhckNsaWNrOiBudWxsLFxuXHRcdFx0b25zdWJtaXQ6IG51bGwsXG5cblx0XHRcdC8qKlxuXHRcdFx0ICogbWFuaXB1bGF0ZSBsaW5rIGFkZHJlc3Mgd2hlbiB1c2VyIGNyZWF0ZSBsaW5rXG5cdFx0XHQgKiBAcGFyYW0ge1N0cmluZ30gc0xpbmtVcmxcblx0XHRcdCAqIEByZXR1cm4ge1N0cmluZ31cblx0XHRcdCAqL1xuXHRcdFx0b25DcmVhdGVMaW5rOiBmdW5jdGlvbiAoc0xpbmtVcmwpIHtcblx0XHRcdFx0aWYgKHNMaW5rVXJsLmluZGV4T2YoJ0AnKSAhPT0gLTEgJiYgc0xpbmtVcmwuaW5kZXhPZignOicpID09PSAtMSkge1xuXHRcdFx0XHRcdHNMaW5rVXJsID0gJ21haWx0bzonICsgc0xpbmtVcmw7XG5cdFx0XHRcdH0gZWxzZSBpZiAoc0xpbmtVcmwuaW5kZXhPZignOi8vJykgPT09IC0xKSB7XG5cdFx0XHRcdFx0c0xpbmtVcmwgPSAnaHR0cDovLycgKyBzTGlua1VybDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBzTGlua1VybDtcblx0XHRcdH0sXG5cblx0XHRcdGtleU1hcDoge1xuXHRcdFx0XHRwYzoge1xuXHRcdFx0XHRcdCdFTlRFUic6ICdpbnNlcnRQYXJhZ3JhcGgnLFxuXHRcdFx0XHRcdCdDVFJMK1onOiAndW5kbycsXG5cdFx0XHRcdFx0J0NUUkwrWSc6ICdyZWRvJyxcblx0XHRcdFx0XHQnVEFCJzogJ3RhYicsXG5cdFx0XHRcdFx0J1NISUZUK1RBQic6ICd1bnRhYicsXG5cdFx0XHRcdFx0J0NUUkwrQic6ICdib2xkJyxcblx0XHRcdFx0XHQnQ1RSTCtJJzogJ2l0YWxpYycsXG5cdFx0XHRcdFx0J0NUUkwrVSc6ICd1bmRlcmxpbmUnLFxuXHRcdFx0XHRcdCdDVFJMK1NISUZUK1MnOiAnc3RyaWtldGhyb3VnaCcsXG5cdFx0XHRcdFx0J0NUUkwrQkFDS1NMQVNIJzogJ3JlbW92ZUZvcm1hdCcsXG5cdFx0XHRcdFx0J0NUUkwrU0hJRlQrTCc6ICdqdXN0aWZ5TGVmdCcsXG5cdFx0XHRcdFx0J0NUUkwrU0hJRlQrRSc6ICdqdXN0aWZ5Q2VudGVyJyxcblx0XHRcdFx0XHQnQ1RSTCtTSElGVCtSJzogJ2p1c3RpZnlSaWdodCcsXG5cdFx0XHRcdFx0J0NUUkwrU0hJRlQrSic6ICdqdXN0aWZ5RnVsbCcsXG5cdFx0XHRcdFx0J0NUUkwrU0hJRlQrTlVNNyc6ICdpbnNlcnRVbm9yZGVyZWRMaXN0Jyxcblx0XHRcdFx0XHQnQ1RSTCtTSElGVCtOVU04JzogJ2luc2VydE9yZGVyZWRMaXN0Jyxcblx0XHRcdFx0XHQnQ1RSTCtMRUZUQlJBQ0tFVCc6ICdvdXRkZW50Jyxcblx0XHRcdFx0XHQnQ1RSTCtSSUdIVEJSQUNLRVQnOiAnaW5kZW50Jyxcblx0XHRcdFx0XHQnQ1RSTCtOVU0wJzogJ2Zvcm1hdFBhcmEnLFxuXHRcdFx0XHRcdCdDVFJMK05VTTEnOiAnZm9ybWF0SDEnLFxuXHRcdFx0XHRcdCdDVFJMK05VTTInOiAnZm9ybWF0SDInLFxuXHRcdFx0XHRcdCdDVFJMK05VTTMnOiAnZm9ybWF0SDMnLFxuXHRcdFx0XHRcdCdDVFJMK05VTTQnOiAnZm9ybWF0SDQnLFxuXHRcdFx0XHRcdCdDVFJMK05VTTUnOiAnZm9ybWF0SDUnLFxuXHRcdFx0XHRcdCdDVFJMK05VTTYnOiAnZm9ybWF0SDYnLFxuXHRcdFx0XHRcdCdDVFJMK0VOVEVSJzogJ2luc2VydEhvcml6b250YWxSdWxlJyxcblx0XHRcdFx0XHQnQ1RSTCtLJzogJ3Nob3dMaW5rRGlhbG9nJ1xuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdG1hYzoge1xuXHRcdFx0XHRcdCdFTlRFUic6ICdpbnNlcnRQYXJhZ3JhcGgnLFxuXHRcdFx0XHRcdCdDTUQrWic6ICd1bmRvJyxcblx0XHRcdFx0XHQnQ01EK1NISUZUK1onOiAncmVkbycsXG5cdFx0XHRcdFx0J1RBQic6ICd0YWInLFxuXHRcdFx0XHRcdCdTSElGVCtUQUInOiAndW50YWInLFxuXHRcdFx0XHRcdCdDTUQrQic6ICdib2xkJyxcblx0XHRcdFx0XHQnQ01EK0knOiAnaXRhbGljJyxcblx0XHRcdFx0XHQnQ01EK1UnOiAndW5kZXJsaW5lJyxcblx0XHRcdFx0XHQnQ01EK1NISUZUK1MnOiAnc3RyaWtldGhyb3VnaCcsXG5cdFx0XHRcdFx0J0NNRCtCQUNLU0xBU0gnOiAncmVtb3ZlRm9ybWF0Jyxcblx0XHRcdFx0XHQnQ01EK1NISUZUK0wnOiAnanVzdGlmeUxlZnQnLFxuXHRcdFx0XHRcdCdDTUQrU0hJRlQrRSc6ICdqdXN0aWZ5Q2VudGVyJyxcblx0XHRcdFx0XHQnQ01EK1NISUZUK1InOiAnanVzdGlmeVJpZ2h0Jyxcblx0XHRcdFx0XHQnQ01EK1NISUZUK0onOiAnanVzdGlmeUZ1bGwnLFxuXHRcdFx0XHRcdCdDTUQrU0hJRlQrTlVNNyc6ICdpbnNlcnRVbm9yZGVyZWRMaXN0Jyxcblx0XHRcdFx0XHQnQ01EK1NISUZUK05VTTgnOiAnaW5zZXJ0T3JkZXJlZExpc3QnLFxuXHRcdFx0XHRcdCdDTUQrTEVGVEJSQUNLRVQnOiAnb3V0ZGVudCcsXG5cdFx0XHRcdFx0J0NNRCtSSUdIVEJSQUNLRVQnOiAnaW5kZW50Jyxcblx0XHRcdFx0XHQnQ01EK05VTTAnOiAnZm9ybWF0UGFyYScsXG5cdFx0XHRcdFx0J0NNRCtOVU0xJzogJ2Zvcm1hdEgxJyxcblx0XHRcdFx0XHQnQ01EK05VTTInOiAnZm9ybWF0SDInLFxuXHRcdFx0XHRcdCdDTUQrTlVNMyc6ICdmb3JtYXRIMycsXG5cdFx0XHRcdFx0J0NNRCtOVU00JzogJ2Zvcm1hdEg0Jyxcblx0XHRcdFx0XHQnQ01EK05VTTUnOiAnZm9ybWF0SDUnLFxuXHRcdFx0XHRcdCdDTUQrTlVNNic6ICdmb3JtYXRINicsXG5cdFx0XHRcdFx0J0NNRCtFTlRFUic6ICdpbnNlcnRIb3Jpem9udGFsUnVsZScsXG5cdFx0XHRcdFx0J0NNRCtLJzogJ3Nob3dMaW5rRGlhbG9nJ1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdC8vIGRlZmF1bHQgbGFuZ3VhZ2U6IGVuLVVTXG5cdFx0bGFuZzoge1xuXHRcdFx0J2VuLVVTJzoge1xuXHRcdFx0XHRmb250OiB7XG5cdFx0XHRcdFx0Ym9sZDogJ0JvbGQnLFxuXHRcdFx0XHRcdGl0YWxpYzogJ0l0YWxpYycsXG5cdFx0XHRcdFx0dW5kZXJsaW5lOiAnVW5kZXJsaW5lJyxcblx0XHRcdFx0XHRjbGVhcjogJ1JlbW92ZSBGb250IFN0eWxlJyxcblx0XHRcdFx0XHRoZWlnaHQ6ICdMaW5lIEhlaWdodCcsXG5cdFx0XHRcdFx0bmFtZTogJ0ZvbnQgRmFtaWx5J1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRpbWFnZToge1xuXHRcdFx0XHRcdGltYWdlOiAnUGljdHVyZScsXG5cdFx0XHRcdFx0aW5zZXJ0OiAnSW5zZXJ0IEltYWdlJyxcblx0XHRcdFx0XHRyZXNpemVGdWxsOiAnUmVzaXplIEZ1bGwnLFxuXHRcdFx0XHRcdHJlc2l6ZUhhbGY6ICdSZXNpemUgSGFsZicsXG5cdFx0XHRcdFx0cmVzaXplUXVhcnRlcjogJ1Jlc2l6ZSBRdWFydGVyJyxcblx0XHRcdFx0XHRmbG9hdExlZnQ6ICdGbG9hdCBMZWZ0Jyxcblx0XHRcdFx0XHRmbG9hdFJpZ2h0OiAnRmxvYXQgUmlnaHQnLFxuXHRcdFx0XHRcdGZsb2F0Tm9uZTogJ0Zsb2F0IE5vbmUnLFxuXHRcdFx0XHRcdHNoYXBlUm91bmRlZDogJ1NoYXBlOiBSb3VuZGVkJyxcblx0XHRcdFx0XHRzaGFwZUNpcmNsZTogJ1NoYXBlOiBDaXJjbGUnLFxuXHRcdFx0XHRcdHNoYXBlVGh1bWJuYWlsOiAnU2hhcGU6IFRodW1ibmFpbCcsXG5cdFx0XHRcdFx0c2hhcGVOb25lOiAnU2hhcGU6IE5vbmUnLFxuXHRcdFx0XHRcdGRyYWdJbWFnZUhlcmU6ICdEcmFnIGltYWdlIG9yIHRleHQgaGVyZScsXG5cdFx0XHRcdFx0ZHJvcEltYWdlOiAnRHJvcCBpbWFnZSBvciBUZXh0Jyxcblx0XHRcdFx0XHRzZWxlY3RGcm9tRmlsZXM6ICdTZWxlY3QgZnJvbSBmaWxlcycsXG5cdFx0XHRcdFx0bWF4aW11bUZpbGVTaXplOiAnTWF4aW11bSBmaWxlIHNpemUnLFxuXHRcdFx0XHRcdG1heGltdW1GaWxlU2l6ZUVycm9yOiAnTWF4aW11bSBmaWxlIHNpemUgZXhjZWVkZWQuJyxcblx0XHRcdFx0XHR1cmw6ICdJbWFnZSBVUkwnLFxuXHRcdFx0XHRcdHJlbW92ZTogJ1JlbW92ZSBJbWFnZSdcblx0XHRcdFx0fSxcblx0XHRcdFx0bGluazoge1xuXHRcdFx0XHRcdGxpbms6ICdMaW5rJyxcblx0XHRcdFx0XHRpbnNlcnQ6ICdJbnNlcnQgTGluaycsXG5cdFx0XHRcdFx0dW5saW5rOiAnVW5saW5rJyxcblx0XHRcdFx0XHRlZGl0OiAnRWRpdCcsXG5cdFx0XHRcdFx0dGV4dFRvRGlzcGxheTogJ1RleHQgdG8gZGlzcGxheScsXG5cdFx0XHRcdFx0dXJsOiAnVG8gd2hhdCBVUkwgc2hvdWxkIHRoaXMgbGluayBnbz8nLFxuXHRcdFx0XHRcdG9wZW5Jbk5ld1dpbmRvdzogJ09wZW4gaW4gbmV3IHdpbmRvdydcblx0XHRcdFx0fSxcblx0XHRcdFx0dGFibGU6IHtcblx0XHRcdFx0XHR0YWJsZTogJ1RhYmxlJ1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRocjoge1xuXHRcdFx0XHRcdGluc2VydDogJ0luc2VydCBIb3Jpem9udGFsIFJ1bGUnXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHN0eWxlOiB7XG5cdFx0XHRcdFx0c3R5bGU6ICdTdHlsZScsXG5cdFx0XHRcdFx0bm9ybWFsOiAnTm9ybWFsJyxcblx0XHRcdFx0XHRibG9ja3F1b3RlOiAnUXVvdGUnLFxuXHRcdFx0XHRcdHByZTogJ0NvZGUnLFxuXHRcdFx0XHRcdGgxOiAnSGVhZGVyIDEnLFxuXHRcdFx0XHRcdGgyOiAnSGVhZGVyIDInLFxuXHRcdFx0XHRcdGgzOiAnSGVhZGVyIDMnLFxuXHRcdFx0XHRcdGg0OiAnSGVhZGVyIDQnLFxuXHRcdFx0XHRcdGg1OiAnSGVhZGVyIDUnLFxuXHRcdFx0XHRcdGg2OiAnSGVhZGVyIDYnXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGxpc3RzOiB7XG5cdFx0XHRcdFx0dW5vcmRlcmVkOiAnVW5vcmRlcmVkIGxpc3QnLFxuXHRcdFx0XHRcdG9yZGVyZWQ6ICdPcmRlcmVkIGxpc3QnXG5cdFx0XHRcdH0sXG5cdFx0XHRcdG9wdGlvbnM6IHtcblx0XHRcdFx0XHRoZWxwOiAnSGVscCcsXG5cdFx0XHRcdFx0ZnVsbHNjcmVlbjogJ0Z1bGwgU2NyZWVuJyxcblx0XHRcdFx0XHRjb2RldmlldzogJ0NvZGUgVmlldydcblx0XHRcdFx0fSxcblx0XHRcdFx0cGFyYWdyYXBoOiB7XG5cdFx0XHRcdFx0cGFyYWdyYXBoOiAnUGFyYWdyYXBoJyxcblx0XHRcdFx0XHRvdXRkZW50OiAnT3V0ZGVudCcsXG5cdFx0XHRcdFx0aW5kZW50OiAnSW5kZW50Jyxcblx0XHRcdFx0XHRsZWZ0OiAnQWxpZ24gbGVmdCcsXG5cdFx0XHRcdFx0Y2VudGVyOiAnQWxpZ24gY2VudGVyJyxcblx0XHRcdFx0XHRyaWdodDogJ0FsaWduIHJpZ2h0Jyxcblx0XHRcdFx0XHRqdXN0aWZ5OiAnSnVzdGlmeSBmdWxsJ1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRjb2xvcjoge1xuXHRcdFx0XHRcdHJlY2VudDogJ1JlY2VudCBDb2xvcicsXG5cdFx0XHRcdFx0bW9yZTogJ01vcmUgQ29sb3InLFxuXHRcdFx0XHRcdGJhY2tncm91bmQ6ICdCYWNrZ3JvdW5kIENvbG9yJyxcblx0XHRcdFx0XHRmb3JlZ3JvdW5kOiAnRm9yZWdyb3VuZCBDb2xvcicsXG5cdFx0XHRcdFx0dHJhbnNwYXJlbnQ6ICdUcmFuc3BhcmVudCcsXG5cdFx0XHRcdFx0c2V0VHJhbnNwYXJlbnQ6ICdTZXQgdHJhbnNwYXJlbnQnLFxuXHRcdFx0XHRcdHJlc2V0OiAnUmVzZXQnLFxuXHRcdFx0XHRcdHJlc2V0VG9EZWZhdWx0OiAnUmVzZXQgdG8gZGVmYXVsdCdcblx0XHRcdFx0fSxcblx0XHRcdFx0c2hvcnRjdXQ6IHtcblx0XHRcdFx0XHRzaG9ydGN1dHM6ICdLZXlib2FyZCBzaG9ydGN1dHMnLFxuXHRcdFx0XHRcdGNsb3NlOiAnQ2xvc2UnLFxuXHRcdFx0XHRcdHRleHRGb3JtYXR0aW5nOiAnVGV4dCBmb3JtYXR0aW5nJyxcblx0XHRcdFx0XHRhY3Rpb246ICdBY3Rpb24nLFxuXHRcdFx0XHRcdHBhcmFncmFwaEZvcm1hdHRpbmc6ICdQYXJhZ3JhcGggZm9ybWF0dGluZycsXG5cdFx0XHRcdFx0ZG9jdW1lbnRTdHlsZTogJ0RvY3VtZW50IFN0eWxlJyxcblx0XHRcdFx0XHRleHRyYUtleXM6ICdFeHRyYSBrZXlzJ1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRoaXN0b3J5OiB7XG5cdFx0XHRcdFx0dW5kbzogJ1VuZG8nLFxuXHRcdFx0XHRcdHJlZG86ICdSZWRvJ1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXG5cdC8qKlxuXHQgKiBAY2xhc3MgY29yZS5hc3luY1xuXHQgKlxuXHQgKiBBc3luYyBmdW5jdGlvbnMgd2hpY2ggcmV0dXJucyBgUHJvbWlzZWBcblx0ICpcblx0ICogQHNpbmdsZXRvblxuXHQgKiBAYWx0ZXJuYXRlQ2xhc3NOYW1lIGFzeW5jXG5cdCAqL1xuXHR2YXIgYXN5bmMgPSAoZnVuY3Rpb24gKCkge1xuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2QgcmVhZEZpbGVBc0RhdGFVUkxcblx0XHQgKlxuXHRcdCAqIHJlYWQgY29udGVudHMgb2YgZmlsZSBhcyByZXByZXNlbnRpbmcgVVJMXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge0ZpbGV9IGZpbGVcblx0XHQgKiBAcmV0dXJuIHtQcm9taXNlfSAtIHRoZW46IHNEYXRhVXJsXG5cdFx0ICovXG5cdFx0dmFyIHJlYWRGaWxlQXNEYXRhVVJMID0gZnVuY3Rpb24gKGZpbGUpIHtcblx0XHRcdHJldHVybiAkLkRlZmVycmVkKGZ1bmN0aW9uIChkZWZlcnJlZCkge1xuXHRcdFx0XHQkLmV4dGVuZChuZXcgRmlsZVJlYWRlcigpLCB7XG5cdFx0XHRcdFx0b25sb2FkOiBmdW5jdGlvbiAoZSkge1xuXHRcdFx0XHRcdFx0dmFyIHNEYXRhVVJMID0gZS50YXJnZXQucmVzdWx0O1xuXHRcdFx0XHRcdFx0ZGVmZXJyZWQucmVzb2x2ZShzRGF0YVVSTCk7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRvbmVycm9yOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRkZWZlcnJlZC5yZWplY3QodGhpcyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KS5yZWFkQXNEYXRhVVJMKGZpbGUpO1xuXHRcdFx0fSkucHJvbWlzZSgpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIGNyZWF0ZUltYWdlXG5cdFx0ICpcblx0XHQgKiBjcmVhdGUgYDxpbWFnZT5gIGZyb20gdXJsIHN0cmluZ1xuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IHNVcmxcblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gZmlsZW5hbWVcblx0XHQgKiBAcmV0dXJuIHtQcm9taXNlfSAtIHRoZW46ICRpbWFnZVxuXHRcdCAqL1xuXHRcdHZhciBjcmVhdGVJbWFnZSA9IGZ1bmN0aW9uIChzVXJsLCBmaWxlbmFtZSkge1xuXHRcdFx0cmV0dXJuICQuRGVmZXJyZWQoZnVuY3Rpb24gKGRlZmVycmVkKSB7XG5cdFx0XHRcdHZhciAkaW1nID0gJCgnPGltZz4nKTtcblxuXHRcdFx0XHQkaW1nLm9uZSgnbG9hZCcsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHQkaW1nLm9mZignZXJyb3IgYWJvcnQnKTtcblx0XHRcdFx0XHRkZWZlcnJlZC5yZXNvbHZlKCRpbWcpO1xuXHRcdFx0XHR9KS5vbmUoJ2Vycm9yIGFib3J0JywgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdCRpbWcub2ZmKCdsb2FkJykuZGV0YWNoKCk7XG5cdFx0XHRcdFx0ZGVmZXJyZWQucmVqZWN0KCRpbWcpO1xuXHRcdFx0XHR9KS5jc3Moe1xuXHRcdFx0XHRcdGRpc3BsYXk6ICdub25lJ1xuXHRcdFx0XHR9KS5hcHBlbmRUbyhkb2N1bWVudC5ib2R5KS5hdHRyKHtcblx0XHRcdFx0XHQnc3JjJzogc1VybCxcblx0XHRcdFx0XHQnZGF0YS1maWxlbmFtZSc6IGZpbGVuYW1lXG5cdFx0XHRcdH0pO1xuXHRcdFx0fSkucHJvbWlzZSgpO1xuXHRcdH07XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0cmVhZEZpbGVBc0RhdGFVUkw6IHJlYWRGaWxlQXNEYXRhVVJMLFxuXHRcdFx0Y3JlYXRlSW1hZ2U6IGNyZWF0ZUltYWdlXG5cdFx0fTtcblx0fSkoKTtcblxuXHQvKipcblx0ICogQGNsYXNzIGNvcmUua2V5XG5cdCAqXG5cdCAqIE9iamVjdCBmb3Iga2V5Y29kZXMuXG5cdCAqXG5cdCAqIEBzaW5nbGV0b25cblx0ICogQGFsdGVybmF0ZUNsYXNzTmFtZSBrZXlcblx0ICovXG5cdHZhciBrZXkgPSB7XG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCBpc0VkaXRcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7TnVtYmVyfSBrZXlDb2RlXG5cdFx0ICogQHJldHVybiB7Qm9vbGVhbn1cblx0XHQgKi9cblx0XHRpc0VkaXQ6IGZ1bmN0aW9uIChrZXlDb2RlKSB7XG5cdFx0XHRyZXR1cm4gbGlzdC5jb250YWlucyhbOCwgOSwgMTMsIDMyXSwga2V5Q29kZSk7XG5cdFx0fSxcblx0XHQvKipcblx0XHQgKiBAcHJvcGVydHkge09iamVjdH0gbmFtZUZyb21Db2RlXG5cdFx0ICogQHByb3BlcnR5IHtTdHJpbmd9IG5hbWVGcm9tQ29kZS44IFwiQkFDS1NQQUNFXCJcblx0XHQgKi9cblx0XHRuYW1lRnJvbUNvZGU6IHtcblx0XHRcdCc4JzogJ0JBQ0tTUEFDRScsXG5cdFx0XHQnOSc6ICdUQUInLFxuXHRcdFx0JzEzJzogJ0VOVEVSJyxcblx0XHRcdCczMic6ICdTUEFDRScsXG5cblx0XHRcdC8vIE51bWJlcjogMC05XG5cdFx0XHQnNDgnOiAnTlVNMCcsXG5cdFx0XHQnNDknOiAnTlVNMScsXG5cdFx0XHQnNTAnOiAnTlVNMicsXG5cdFx0XHQnNTEnOiAnTlVNMycsXG5cdFx0XHQnNTInOiAnTlVNNCcsXG5cdFx0XHQnNTMnOiAnTlVNNScsXG5cdFx0XHQnNTQnOiAnTlVNNicsXG5cdFx0XHQnNTUnOiAnTlVNNycsXG5cdFx0XHQnNTYnOiAnTlVNOCcsXG5cblx0XHRcdC8vIEFscGhhYmV0OiBhLXpcblx0XHRcdCc2Nic6ICdCJyxcblx0XHRcdCc2OSc6ICdFJyxcblx0XHRcdCc3Myc6ICdJJyxcblx0XHRcdCc3NCc6ICdKJyxcblx0XHRcdCc3NSc6ICdLJyxcblx0XHRcdCc3Nic6ICdMJyxcblx0XHRcdCc4Mic6ICdSJyxcblx0XHRcdCc4Myc6ICdTJyxcblx0XHRcdCc4NSc6ICdVJyxcblx0XHRcdCc4OSc6ICdZJyxcblx0XHRcdCc5MCc6ICdaJyxcblxuXHRcdFx0JzE5MSc6ICdTTEFTSCcsXG5cdFx0XHQnMjE5JzogJ0xFRlRCUkFDS0VUJyxcblx0XHRcdCcyMjAnOiAnQkFDS1NMQVNIJyxcblx0XHRcdCcyMjEnOiAnUklHSFRCUkFDS0VUJ1xuXHRcdH1cblx0fTtcblxuXHQvKipcblx0ICogQGNsYXNzIGVkaXRpbmcuSGlzdG9yeVxuXHQgKlxuXHQgKiBFZGl0b3IgSGlzdG9yeVxuXHQgKlxuXHQgKi9cblx0dmFyIEhpc3RvcnkgPSBmdW5jdGlvbiAoJGVkaXRhYmxlKSB7XG5cdFx0dmFyIHN0YWNrID0gW10sIHN0YWNrT2Zmc2V0ID0gLTE7XG5cdFx0dmFyIGVkaXRhYmxlID0gJGVkaXRhYmxlWzBdO1xuXG5cdFx0dmFyIG1ha2VTbmFwc2hvdCA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdHZhciBybmcgPSByYW5nZS5jcmVhdGUoKTtcblx0XHRcdHZhciBlbXB0eUJvb2ttYXJrID0geyBzOiB7IHBhdGg6IFtdLCBvZmZzZXQ6IDAgfSwgZTogeyBwYXRoOiBbXSwgb2Zmc2V0OiAwIH0gfTtcblxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0Y29udGVudHM6ICRlZGl0YWJsZS5odG1sKCksXG5cdFx0XHRcdGJvb2ttYXJrOiAocm5nID8gcm5nLmJvb2ttYXJrKGVkaXRhYmxlKSA6IGVtcHR5Qm9va21hcmspXG5cdFx0XHR9O1xuXHRcdH07XG5cblx0XHR2YXIgYXBwbHlTbmFwc2hvdCA9IGZ1bmN0aW9uIChzbmFwc2hvdCkge1xuXHRcdFx0aWYgKHNuYXBzaG90LmNvbnRlbnRzICE9PSBudWxsKSB7XG5cdFx0XHRcdCRlZGl0YWJsZS5odG1sKHNuYXBzaG90LmNvbnRlbnRzKTtcblx0XHRcdH1cblx0XHRcdGlmIChzbmFwc2hvdC5ib29rbWFyayAhPT0gbnVsbCkge1xuXHRcdFx0XHRyYW5nZS5jcmVhdGVGcm9tQm9va21hcmsoZWRpdGFibGUsIHNuYXBzaG90LmJvb2ttYXJrKS5zZWxlY3QoKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogdW5kb1xuXHRcdCAqL1xuXHRcdHRoaXMudW5kbyA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdGlmICgwIDwgc3RhY2tPZmZzZXQpIHtcblx0XHRcdFx0c3RhY2tPZmZzZXQtLTtcblx0XHRcdFx0YXBwbHlTbmFwc2hvdChzdGFja1tzdGFja09mZnNldF0pO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiByZWRvXG5cdFx0ICovXG5cdFx0dGhpcy5yZWRvID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0aWYgKHN0YWNrLmxlbmd0aCAtIDEgPiBzdGFja09mZnNldCkge1xuXHRcdFx0XHRzdGFja09mZnNldCsrO1xuXHRcdFx0XHRhcHBseVNuYXBzaG90KHN0YWNrW3N0YWNrT2Zmc2V0XSk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIHJlY29yZGVkIHVuZG9cblx0XHQgKi9cblx0XHR0aGlzLnJlY29yZFVuZG8gPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRzdGFja09mZnNldCsrO1xuXG5cdFx0XHQvLyBXYXNoIG91dCBzdGFjayBhZnRlciBzdGFja09mZnNldFxuXHRcdFx0aWYgKHN0YWNrLmxlbmd0aCA+IHN0YWNrT2Zmc2V0KSB7XG5cdFx0XHRcdHN0YWNrID0gc3RhY2suc2xpY2UoMCwgc3RhY2tPZmZzZXQpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDcmVhdGUgbmV3IHNuYXBzaG90IGFuZCBwdXNoIGl0IHRvIHRoZSBlbmRcblx0XHRcdHN0YWNrLnB1c2gobWFrZVNuYXBzaG90KCkpO1xuXHRcdH07XG5cblx0XHQvLyBDcmVhdGUgZmlyc3QgdW5kbyBzdGFja1xuXHRcdHRoaXMucmVjb3JkVW5kbygpO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBAY2xhc3MgZWRpdGluZy5TdHlsZVxuXHQgKlxuXHQgKiBTdHlsZVxuXHQgKlxuXHQgKi9cblx0dmFyIFN0eWxlID0gZnVuY3Rpb24gKCkge1xuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2QgalF1ZXJ5Q1NTXG5cdFx0ICpcblx0XHQgKiBwYXNzaW5nIGFuIGFycmF5IG9mIHN0eWxlIHByb3BlcnRpZXMgdG8gLmNzcygpXG5cdFx0ICogd2lsbCByZXN1bHQgaW4gYW4gb2JqZWN0IG9mIHByb3BlcnR5LXZhbHVlIHBhaXJzLlxuXHRcdCAqIChjb21wYWJpbGl0eSB3aXRoIHZlcnNpb24gPCAxLjkpXG5cdFx0ICpcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqIEBwYXJhbSAge2pRdWVyeX0gJG9ialxuXHRcdCAqIEBwYXJhbSAge0FycmF5fSBwcm9wZXJ0eU5hbWVzIC0gQW4gYXJyYXkgb2Ygb25lIG9yIG1vcmUgQ1NTIHByb3BlcnRpZXMuXG5cdFx0ICogQHJldHVybiB7T2JqZWN0fVxuXHRcdCAqL1xuXHRcdHZhciBqUXVlcnlDU1MgPSBmdW5jdGlvbiAoJG9iaiwgcHJvcGVydHlOYW1lcykge1xuXHRcdFx0aWYgKGFnZW50LmpxdWVyeVZlcnNpb24gPCAxLjkpIHtcblx0XHRcdFx0dmFyIHJlc3VsdCA9IHt9O1xuXHRcdFx0XHQkLmVhY2gocHJvcGVydHlOYW1lcywgZnVuY3Rpb24gKGlkeCwgcHJvcGVydHlOYW1lKSB7XG5cdFx0XHRcdFx0cmVzdWx0W3Byb3BlcnR5TmFtZV0gPSAkb2JqLmNzcyhwcm9wZXJ0eU5hbWUpO1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHRcdH1cblx0XHRcdHJldHVybiAkb2JqLmNzcy5jYWxsKCRvYmosIHByb3BlcnR5TmFtZXMpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBwYXJhZ3JhcGggbGV2ZWwgc3R5bGVcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7V3JhcHBlZFJhbmdlfSBybmdcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gc3R5bGVJbmZvXG5cdFx0ICovXG5cdFx0dGhpcy5zdHlsZVBhcmEgPSBmdW5jdGlvbiAocm5nLCBzdHlsZUluZm8pIHtcblx0XHRcdCQuZWFjaChybmcubm9kZXMoZG9tLmlzUGFyYSwge1xuXHRcdFx0XHRpbmNsdWRlQW5jZXN0b3I6IHRydWVcblx0XHRcdH0pLCBmdW5jdGlvbiAoaWR4LCBwYXJhKSB7XG5cdFx0XHRcdCQocGFyYSkuY3NzKHN0eWxlSW5mbyk7XG5cdFx0XHR9KTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogaW5zZXJ0IGFuZCByZXR1cm5zIHN0eWxlTm9kZXMgb24gcmFuZ2UuXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge1dyYXBwZWRSYW5nZX0gcm5nXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIG9wdGlvbnMgZm9yIHN0eWxlTm9kZXNcblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMubm9kZU5hbWVdIC0gZGVmYXVsdDogYFNQQU5gXG5cdFx0ICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5leHBhbmRDbG9zZXN0U2libGluZ10gLSBkZWZhdWx0OiBgZmFsc2VgXG5cdFx0ICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5vbmx5UGFydGlhbENvbnRhaW5zXSAtIGRlZmF1bHQ6IGBmYWxzZWBcblx0XHQgKiBAcmV0dXJuIHtOb2RlW119XG5cdFx0ICovXG5cdFx0dGhpcy5zdHlsZU5vZGVzID0gZnVuY3Rpb24gKHJuZywgb3B0aW9ucykge1xuXHRcdFx0cm5nID0gcm5nLnNwbGl0VGV4dCgpO1xuXG5cdFx0XHR2YXIgbm9kZU5hbWUgPSBvcHRpb25zICYmIG9wdGlvbnMubm9kZU5hbWUgfHwgJ1NQQU4nO1xuXHRcdFx0dmFyIGV4cGFuZENsb3Nlc3RTaWJsaW5nID0gISEob3B0aW9ucyAmJiBvcHRpb25zLmV4cGFuZENsb3Nlc3RTaWJsaW5nKTtcblx0XHRcdHZhciBvbmx5UGFydGlhbENvbnRhaW5zID0gISEob3B0aW9ucyAmJiBvcHRpb25zLm9ubHlQYXJ0aWFsQ29udGFpbnMpO1xuXG5cdFx0XHRpZiAocm5nLmlzQ29sbGFwc2VkKCkpIHtcblx0XHRcdFx0cmV0dXJuIHJuZy5pbnNlcnROb2RlKGRvbS5jcmVhdGUobm9kZU5hbWUpKTtcblx0XHRcdH1cblxuXHRcdFx0dmFyIHByZWQgPSBkb20ubWFrZVByZWRCeU5vZGVOYW1lKG5vZGVOYW1lKTtcblx0XHRcdHZhciBub2RlcyA9ICQubWFwKHJuZy5ub2Rlcyhkb20uaXNUZXh0LCB7XG5cdFx0XHRcdGZ1bGx5Q29udGFpbnM6IHRydWVcblx0XHRcdH0pLCBmdW5jdGlvbiAodGV4dCkge1xuXHRcdFx0XHRyZXR1cm4gZG9tLnNpbmdsZUNoaWxkQW5jZXN0b3IodGV4dCwgcHJlZCkgfHwgZG9tLndyYXAodGV4dCwgbm9kZU5hbWUpO1xuXHRcdFx0fSk7XG5cblx0XHRcdGlmIChleHBhbmRDbG9zZXN0U2libGluZykge1xuXHRcdFx0XHRpZiAob25seVBhcnRpYWxDb250YWlucykge1xuXHRcdFx0XHRcdHZhciBub2Rlc0luUmFuZ2UgPSBybmcubm9kZXMoKTtcblx0XHRcdFx0XHQvLyBjb21wb3NlIHdpdGggcGFydGlhbCBjb250YWlucyBwcmVkaWNhdGlvblxuXHRcdFx0XHRcdHByZWQgPSBmdW5jLmFuZChwcmVkLCBmdW5jdGlvbiAobm9kZSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGxpc3QuY29udGFpbnMobm9kZXNJblJhbmdlLCBub2RlKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiAkLm1hcChub2RlcywgZnVuY3Rpb24gKG5vZGUpIHtcblx0XHRcdFx0XHR2YXIgc2libGluZ3MgPSBkb20ud2l0aENsb3Nlc3RTaWJsaW5ncyhub2RlLCBwcmVkKTtcblx0XHRcdFx0XHR2YXIgaGVhZCA9IGxpc3QuaGVhZChzaWJsaW5ncyk7XG5cdFx0XHRcdFx0dmFyIHRhaWxzID0gbGlzdC50YWlsKHNpYmxpbmdzKTtcblx0XHRcdFx0XHQkLmVhY2godGFpbHMsIGZ1bmN0aW9uIChpZHgsIGVsZW0pIHtcblx0XHRcdFx0XHRcdGRvbS5hcHBlbmRDaGlsZE5vZGVzKGhlYWQsIGVsZW0uY2hpbGROb2Rlcyk7XG5cdFx0XHRcdFx0XHRkb20ucmVtb3ZlKGVsZW0pO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdHJldHVybiBsaXN0LmhlYWQoc2libGluZ3MpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiBub2Rlcztcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogZ2V0IGN1cnJlbnQgc3R5bGUgb24gY3Vyc29yXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge1dyYXBwZWRSYW5nZX0gcm5nXG5cdFx0ICogQHBhcmFtIHtOb2RlfSB0YXJnZXQgLSB0YXJnZXQgZWxlbWVudCBvbiBldmVudFxuXHRcdCAqIEByZXR1cm4ge09iamVjdH0gLSBvYmplY3QgY29udGFpbnMgc3R5bGUgcHJvcGVydGllcy5cblx0XHQgKi9cblx0XHR0aGlzLmN1cnJlbnQgPSBmdW5jdGlvbiAocm5nLCB0YXJnZXQpIHtcblx0XHRcdHZhciAkY29udCA9ICQoZG9tLmlzVGV4dChybmcuc2MpID8gcm5nLnNjLnBhcmVudE5vZGUgOiBybmcuc2MpO1xuXHRcdFx0dmFyIHByb3BlcnRpZXMgPSBbJ2ZvbnQtZmFtaWx5JywgJ2ZvbnQtc2l6ZScsICd0ZXh0LWFsaWduJywgJ2xpc3Qtc3R5bGUtdHlwZScsICdsaW5lLWhlaWdodCddO1xuXHRcdFx0dmFyIHN0eWxlSW5mbyA9IGpRdWVyeUNTUygkY29udCwgcHJvcGVydGllcykgfHwge307XG5cblx0XHRcdHN0eWxlSW5mb1snZm9udC1zaXplJ10gPSBwYXJzZUludChzdHlsZUluZm9bJ2ZvbnQtc2l6ZSddLCAxMCk7XG5cblx0XHRcdC8vIGRvY3VtZW50LnF1ZXJ5Q29tbWFuZFN0YXRlIGZvciB0b2dnbGUgc3RhdGVcblx0XHRcdHN0eWxlSW5mb1snZm9udC1ib2xkJ10gPSBkb2N1bWVudC5xdWVyeUNvbW1hbmRTdGF0ZSgnYm9sZCcpID8gJ2JvbGQnIDogJ25vcm1hbCc7XG5cdFx0XHRzdHlsZUluZm9bJ2ZvbnQtaXRhbGljJ10gPSBkb2N1bWVudC5xdWVyeUNvbW1hbmRTdGF0ZSgnaXRhbGljJykgPyAnaXRhbGljJyA6ICdub3JtYWwnO1xuXHRcdFx0c3R5bGVJbmZvWydmb250LXVuZGVybGluZSddID0gZG9jdW1lbnQucXVlcnlDb21tYW5kU3RhdGUoJ3VuZGVybGluZScpID8gJ3VuZGVybGluZScgOiAnbm9ybWFsJztcblx0XHRcdHN0eWxlSW5mb1snZm9udC1zdHJpa2V0aHJvdWdoJ10gPSBkb2N1bWVudC5xdWVyeUNvbW1hbmRTdGF0ZSgnc3RyaWtlVGhyb3VnaCcpID8gJ3N0cmlrZXRocm91Z2gnIDogJ25vcm1hbCc7XG5cdFx0XHRzdHlsZUluZm9bJ2ZvbnQtc3VwZXJzY3JpcHQnXSA9IGRvY3VtZW50LnF1ZXJ5Q29tbWFuZFN0YXRlKCdzdXBlcnNjcmlwdCcpID8gJ3N1cGVyc2NyaXB0JyA6ICdub3JtYWwnO1xuXHRcdFx0c3R5bGVJbmZvWydmb250LXN1YnNjcmlwdCddID0gZG9jdW1lbnQucXVlcnlDb21tYW5kU3RhdGUoJ3N1YnNjcmlwdCcpID8gJ3N1YnNjcmlwdCcgOiAnbm9ybWFsJztcblxuXHRcdFx0Ly8gbGlzdC1zdHlsZS10eXBlIHRvIGxpc3Qtc3R5bGUodW5vcmRlcmVkLCBvcmRlcmVkKVxuXHRcdFx0aWYgKCFybmcuaXNPbkxpc3QoKSkge1xuXHRcdFx0XHRzdHlsZUluZm9bJ2xpc3Qtc3R5bGUnXSA9ICdub25lJztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHZhciBhT3JkZXJlZFR5cGUgPSBbJ2NpcmNsZScsICdkaXNjJywgJ2Rpc2MtbGVhZGluZy16ZXJvJywgJ3NxdWFyZSddO1xuXHRcdFx0XHR2YXIgaXNVbm9yZGVyZWQgPSAkLmluQXJyYXkoc3R5bGVJbmZvWydsaXN0LXN0eWxlLXR5cGUnXSwgYU9yZGVyZWRUeXBlKSA+IC0xO1xuXHRcdFx0XHRzdHlsZUluZm9bJ2xpc3Qtc3R5bGUnXSA9IGlzVW5vcmRlcmVkID8gJ3Vub3JkZXJlZCcgOiAnb3JkZXJlZCc7XG5cdFx0XHR9XG5cblx0XHRcdHZhciBwYXJhID0gZG9tLmFuY2VzdG9yKHJuZy5zYywgZG9tLmlzUGFyYSk7XG5cdFx0XHRpZiAocGFyYSAmJiBwYXJhLnN0eWxlWydsaW5lLWhlaWdodCddKSB7XG5cdFx0XHRcdHN0eWxlSW5mb1snbGluZS1oZWlnaHQnXSA9IHBhcmEuc3R5bGUubGluZUhlaWdodDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHZhciBsaW5lSGVpZ2h0ID0gcGFyc2VJbnQoc3R5bGVJbmZvWydsaW5lLWhlaWdodCddLCAxMCkgLyBwYXJzZUludChzdHlsZUluZm9bJ2ZvbnQtc2l6ZSddLCAxMCk7XG5cdFx0XHRcdHN0eWxlSW5mb1snbGluZS1oZWlnaHQnXSA9IGxpbmVIZWlnaHQudG9GaXhlZCgxKTtcblx0XHRcdH1cblxuXHRcdFx0c3R5bGVJbmZvLmltYWdlID0gZG9tLmlzSW1nKHRhcmdldCkgJiYgdGFyZ2V0O1xuXHRcdFx0c3R5bGVJbmZvLmFuY2hvciA9IHJuZy5pc09uQW5jaG9yKCkgJiYgZG9tLmFuY2VzdG9yKHJuZy5zYywgZG9tLmlzQW5jaG9yKTtcblx0XHRcdHN0eWxlSW5mby5hbmNlc3RvcnMgPSBkb20ubGlzdEFuY2VzdG9yKHJuZy5zYywgZG9tLmlzRWRpdGFibGUpO1xuXHRcdFx0c3R5bGVJbmZvLnJhbmdlID0gcm5nO1xuXG5cdFx0XHRyZXR1cm4gc3R5bGVJbmZvO1xuXHRcdH07XG5cdH07XG5cblxuXHQvKipcblx0ICogQGNsYXNzIGVkaXRpbmcuVHlwaW5nXG5cdCAqXG5cdCAqIFR5cGluZ1xuXHQgKlxuXHQgKi9cblx0dmFyIFR5cGluZyA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8qKlxuXHRcdCAqIGluc2VydCB0YWJcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkZWRpdGFibGVcblx0XHQgKiBAcGFyYW0ge1dyYXBwZWRSYW5nZX0gcm5nXG5cdFx0ICogQHBhcmFtIHtOdW1iZXJ9IHRhYnNpemVcblx0XHQgKi9cblx0XHR0aGlzLmluc2VydFRhYiA9IGZ1bmN0aW9uICgkZWRpdGFibGUsIHJuZywgdGFic2l6ZSkge1xuXHRcdFx0dmFyIHRhYiA9IGRvbS5jcmVhdGVUZXh0KG5ldyBBcnJheSh0YWJzaXplICsgMSkuam9pbihkb20uTkJTUF9DSEFSKSk7XG5cdFx0XHRybmcgPSBybmcuZGVsZXRlQ29udGVudHMoKTtcblx0XHRcdHJuZy5pbnNlcnROb2RlKHRhYiwgdHJ1ZSk7XG5cblx0XHRcdHJuZyA9IHJhbmdlLmNyZWF0ZSh0YWIsIHRhYnNpemUpO1xuXHRcdFx0cm5nLnNlbGVjdCgpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBpbnNlcnQgcGFyYWdyYXBoXG5cdFx0ICovXG5cdFx0dGhpcy5pbnNlcnRQYXJhZ3JhcGggPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHR2YXIgcm5nID0gcmFuZ2UuY3JlYXRlKCk7XG5cblx0XHRcdC8vIGRlbGV0ZUNvbnRlbnRzIG9uIHJhbmdlLlxuXHRcdFx0cm5nID0gcm5nLmRlbGV0ZUNvbnRlbnRzKCk7XG5cblx0XHRcdC8vIFdyYXAgcmFuZ2UgaWYgaXQgbmVlZHMgdG8gYmUgd3JhcHBlZCBieSBwYXJhZ3JhcGhcblx0XHRcdHJuZyA9IHJuZy53cmFwQm9keUlubGluZVdpdGhQYXJhKCk7XG5cblx0XHRcdC8vIGZpbmRpbmcgcGFyYWdyYXBoXG5cdFx0XHR2YXIgc3BsaXRSb290ID0gZG9tLmFuY2VzdG9yKHJuZy5zYywgZG9tLmlzUGFyYSk7XG5cblx0XHRcdHZhciBuZXh0UGFyYTtcblx0XHRcdC8vIG9uIHBhcmFncmFwaDogc3BsaXQgcGFyYWdyYXBoXG5cdFx0XHRpZiAoc3BsaXRSb290KSB7XG5cdFx0XHRcdG5leHRQYXJhID0gZG9tLnNwbGl0VHJlZShzcGxpdFJvb3QsIHJuZy5nZXRTdGFydFBvaW50KCkpO1xuXG5cdFx0XHRcdHZhciBlbXB0eUFuY2hvcnMgPSBkb20ubGlzdERlc2NlbmRhbnQoc3BsaXRSb290LCBkb20uaXNFbXB0eUFuY2hvcik7XG5cdFx0XHRcdGVtcHR5QW5jaG9ycyA9IGVtcHR5QW5jaG9ycy5jb25jYXQoZG9tLmxpc3REZXNjZW5kYW50KG5leHRQYXJhLCBkb20uaXNFbXB0eUFuY2hvcikpO1xuXG5cdFx0XHRcdCQuZWFjaChlbXB0eUFuY2hvcnMsIGZ1bmN0aW9uIChpZHgsIGFuY2hvcikge1xuXHRcdFx0XHRcdGRvbS5yZW1vdmUoYW5jaG9yKTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdC8vIG5vIHBhcmFncmFwaDogaW5zZXJ0IGVtcHR5IHBhcmFncmFwaFxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dmFyIG5leHQgPSBybmcuc2MuY2hpbGROb2Rlc1tybmcuc29dO1xuXHRcdFx0XHRuZXh0UGFyYSA9ICQoZG9tLmVtcHR5UGFyYSlbMF07XG5cdFx0XHRcdGlmIChuZXh0KSB7XG5cdFx0XHRcdFx0cm5nLnNjLmluc2VydEJlZm9yZShuZXh0UGFyYSwgbmV4dCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cm5nLnNjLmFwcGVuZENoaWxkKG5leHRQYXJhKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyYW5nZS5jcmVhdGUobmV4dFBhcmEsIDApLm5vcm1hbGl6ZSgpLnNlbGVjdCgpO1xuXHRcdH07XG5cblx0fTtcblxuXHQvKipcblx0ICogQGNsYXNzIGVkaXRpbmcuVGFibGVcblx0ICpcblx0ICogVGFibGVcblx0ICpcblx0ICovXG5cdHZhciBUYWJsZSA9IGZ1bmN0aW9uICgpIHtcblx0XHQvKipcblx0XHQgKiBoYW5kbGUgdGFiIGtleVxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtXcmFwcGVkUmFuZ2V9IHJuZ1xuXHRcdCAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNTaGlmdFxuXHRcdCAqL1xuXHRcdHRoaXMudGFiID0gZnVuY3Rpb24gKHJuZywgaXNTaGlmdCkge1xuXHRcdFx0dmFyIGNlbGwgPSBkb20uYW5jZXN0b3Iocm5nLmNvbW1vbkFuY2VzdG9yKCksIGRvbS5pc0NlbGwpO1xuXHRcdFx0dmFyIHRhYmxlID0gZG9tLmFuY2VzdG9yKGNlbGwsIGRvbS5pc1RhYmxlKTtcblx0XHRcdHZhciBjZWxscyA9IGRvbS5saXN0RGVzY2VuZGFudCh0YWJsZSwgZG9tLmlzQ2VsbCk7XG5cblx0XHRcdHZhciBuZXh0Q2VsbCA9IGxpc3RbaXNTaGlmdCA/ICdwcmV2JyA6ICduZXh0J10oY2VsbHMsIGNlbGwpO1xuXHRcdFx0aWYgKG5leHRDZWxsKSB7XG5cdFx0XHRcdHJhbmdlLmNyZWF0ZShuZXh0Q2VsbCwgMCkuc2VsZWN0KCk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIGNyZWF0ZSBlbXB0eSB0YWJsZSBlbGVtZW50XG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge051bWJlcn0gcm93Q291bnRcblx0XHQgKiBAcGFyYW0ge051bWJlcn0gY29sQ291bnRcblx0XHQgKiBAcmV0dXJuIHtOb2RlfVxuXHRcdCAqL1xuXHRcdHRoaXMuY3JlYXRlVGFibGUgPSBmdW5jdGlvbiAoY29sQ291bnQsIHJvd0NvdW50KSB7XG5cdFx0XHR2YXIgdGRzID0gW10sIHRkSFRNTDtcblx0XHRcdGZvciAodmFyIGlkeENvbCA9IDA7IGlkeENvbCA8IGNvbENvdW50OyBpZHhDb2wrKykge1xuXHRcdFx0XHR0ZHMucHVzaCgnPHRkPicgKyBkb20uYmxhbmsgKyAnPC90ZD4nKTtcblx0XHRcdH1cblx0XHRcdHRkSFRNTCA9IHRkcy5qb2luKCcnKTtcblxuXHRcdFx0dmFyIHRycyA9IFtdLCB0ckhUTUw7XG5cdFx0XHRmb3IgKHZhciBpZHhSb3cgPSAwOyBpZHhSb3cgPCByb3dDb3VudDsgaWR4Um93KyspIHtcblx0XHRcdFx0dHJzLnB1c2goJzx0cj4nICsgdGRIVE1MICsgJzwvdHI+Jyk7XG5cdFx0XHR9XG5cdFx0XHR0ckhUTUwgPSB0cnMuam9pbignJyk7XG5cdFx0XHRyZXR1cm4gJCgnPHRhYmxlIGNsYXNzPVwidGFibGUgdGFibGUtYm9yZGVyZWRcIj4nICsgdHJIVE1MICsgJzwvdGFibGU+JylbMF07XG5cdFx0fTtcblx0fTtcblxuXG5cdC8qKlxuXHQgKiBAY2xhc3MgZWRpdGluZy5CdWxsZXRcblx0ICpcblx0ICogQGFsdGVybmF0ZUNsYXNzTmFtZSBCdWxsZXRcblx0ICovXG5cdHZhciBCdWxsZXQgPSBmdW5jdGlvbiAoKSB7XG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCBpbnNlcnRPcmRlcmVkTGlzdFxuXHRcdCAqXG5cdFx0ICogdG9nZ2xlIG9yZGVyZWQgbGlzdFxuXHRcdCAqXG5cdFx0ICogQHR5cGUgY29tbWFuZFxuXHRcdCAqL1xuXHRcdHRoaXMuaW5zZXJ0T3JkZXJlZExpc3QgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHR0aGlzLnRvZ2dsZUxpc3QoJ09MJyk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2QgaW5zZXJ0VW5vcmRlcmVkTGlzdFxuXHRcdCAqXG5cdFx0ICogdG9nZ2xlIHVub3JkZXJlZCBsaXN0XG5cdFx0ICpcblx0XHQgKiBAdHlwZSBjb21tYW5kXG5cdFx0ICovXG5cdFx0dGhpcy5pbnNlcnRVbm9yZGVyZWRMaXN0ID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0dGhpcy50b2dnbGVMaXN0KCdVTCcpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIGluZGVudFxuXHRcdCAqXG5cdFx0ICogaW5kZW50XG5cdFx0ICpcblx0XHQgKiBAdHlwZSBjb21tYW5kXG5cdFx0ICovXG5cdFx0dGhpcy5pbmRlbnQgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHR2YXIgc2VsZiA9IHRoaXM7XG5cdFx0XHR2YXIgcm5nID0gcmFuZ2UuY3JlYXRlKCkud3JhcEJvZHlJbmxpbmVXaXRoUGFyYSgpO1xuXG5cdFx0XHR2YXIgcGFyYXMgPSBybmcubm9kZXMoZG9tLmlzUGFyYSwgeyBpbmNsdWRlQW5jZXN0b3I6IHRydWUgfSk7XG5cdFx0XHR2YXIgY2x1c3RlcmVkcyA9IGxpc3QuY2x1c3RlckJ5KHBhcmFzLCBmdW5jLnBlcTIoJ3BhcmVudE5vZGUnKSk7XG5cblx0XHRcdCQuZWFjaChjbHVzdGVyZWRzLCBmdW5jdGlvbiAoaWR4LCBwYXJhcykge1xuXHRcdFx0XHR2YXIgaGVhZCA9IGxpc3QuaGVhZChwYXJhcyk7XG5cdFx0XHRcdGlmIChkb20uaXNMaShoZWFkKSkge1xuXHRcdFx0XHRcdHNlbGYud3JhcExpc3QocGFyYXMsIGhlYWQucGFyZW50Tm9kZS5ub2RlTmFtZSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0JC5lYWNoKHBhcmFzLCBmdW5jdGlvbiAoaWR4LCBwYXJhKSB7XG5cdFx0XHRcdFx0XHQkKHBhcmEpLmNzcygnbWFyZ2luTGVmdCcsIGZ1bmN0aW9uIChpZHgsIHZhbCkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gKHBhcnNlSW50KHZhbCwgMTApIHx8IDApICsgMjU7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cblx0XHRcdHJuZy5zZWxlY3QoKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCBvdXRkZW50XG5cdFx0ICpcblx0XHQgKiBvdXRkZW50XG5cdFx0ICpcblx0XHQgKiBAdHlwZSBjb21tYW5kXG5cdFx0ICovXG5cdFx0dGhpcy5vdXRkZW50ID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0dmFyIHNlbGYgPSB0aGlzO1xuXHRcdFx0dmFyIHJuZyA9IHJhbmdlLmNyZWF0ZSgpLndyYXBCb2R5SW5saW5lV2l0aFBhcmEoKTtcblxuXHRcdFx0dmFyIHBhcmFzID0gcm5nLm5vZGVzKGRvbS5pc1BhcmEsIHsgaW5jbHVkZUFuY2VzdG9yOiB0cnVlIH0pO1xuXHRcdFx0dmFyIGNsdXN0ZXJlZHMgPSBsaXN0LmNsdXN0ZXJCeShwYXJhcywgZnVuYy5wZXEyKCdwYXJlbnROb2RlJykpO1xuXG5cdFx0XHQkLmVhY2goY2x1c3RlcmVkcywgZnVuY3Rpb24gKGlkeCwgcGFyYXMpIHtcblx0XHRcdFx0dmFyIGhlYWQgPSBsaXN0LmhlYWQocGFyYXMpO1xuXHRcdFx0XHRpZiAoZG9tLmlzTGkoaGVhZCkpIHtcblx0XHRcdFx0XHRzZWxmLnJlbGVhc2VMaXN0KFtwYXJhc10pO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdCQuZWFjaChwYXJhcywgZnVuY3Rpb24gKGlkeCwgcGFyYSkge1xuXHRcdFx0XHRcdFx0JChwYXJhKS5jc3MoJ21hcmdpbkxlZnQnLCBmdW5jdGlvbiAoaWR4LCB2YWwpIHtcblx0XHRcdFx0XHRcdFx0dmFsID0gKHBhcnNlSW50KHZhbCwgMTApIHx8IDApO1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdmFsID4gMjUgPyB2YWwgLSAyNSA6ICcnO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0XHRybmcuc2VsZWN0KCk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2QgdG9nZ2xlTGlzdFxuXHRcdCAqXG5cdFx0ICogdG9nZ2xlIGxpc3Rcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSBsaXN0TmFtZSAtIE9MIG9yIFVMXG5cdFx0ICovXG5cdFx0dGhpcy50b2dnbGVMaXN0ID0gZnVuY3Rpb24gKGxpc3ROYW1lKSB7XG5cdFx0XHR2YXIgc2VsZiA9IHRoaXM7XG5cdFx0XHR2YXIgcm5nID0gcmFuZ2UuY3JlYXRlKCkud3JhcEJvZHlJbmxpbmVXaXRoUGFyYSgpO1xuXG5cdFx0XHR2YXIgcGFyYXMgPSBybmcubm9kZXMoZG9tLmlzUGFyYSwgeyBpbmNsdWRlQW5jZXN0b3I6IHRydWUgfSk7XG5cdFx0XHR2YXIgYm9va21hcmsgPSBybmcucGFyYUJvb2ttYXJrKHBhcmFzKTtcblx0XHRcdHZhciBjbHVzdGVyZWRzID0gbGlzdC5jbHVzdGVyQnkocGFyYXMsIGZ1bmMucGVxMigncGFyZW50Tm9kZScpKTtcblxuXHRcdFx0Ly8gcGFyYWdyYXBoIHRvIGxpc3Rcblx0XHRcdGlmIChsaXN0LmZpbmQocGFyYXMsIGRvbS5pc1B1cmVQYXJhKSkge1xuXHRcdFx0XHR2YXIgd3JhcHBlZFBhcmFzID0gW107XG5cdFx0XHRcdCQuZWFjaChjbHVzdGVyZWRzLCBmdW5jdGlvbiAoaWR4LCBwYXJhcykge1xuXHRcdFx0XHRcdHdyYXBwZWRQYXJhcyA9IHdyYXBwZWRQYXJhcy5jb25jYXQoc2VsZi53cmFwTGlzdChwYXJhcywgbGlzdE5hbWUpKTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHBhcmFzID0gd3JhcHBlZFBhcmFzO1xuXHRcdFx0XHQvLyBsaXN0IHRvIHBhcmFncmFwaCBvciBjaGFuZ2UgbGlzdCBzdHlsZVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dmFyIGRpZmZMaXN0cyA9IHJuZy5ub2Rlcyhkb20uaXNMaXN0LCB7XG5cdFx0XHRcdFx0aW5jbHVkZUFuY2VzdG9yOiB0cnVlXG5cdFx0XHRcdH0pLmZpbHRlcihmdW5jdGlvbiAobGlzdE5vZGUpIHtcblx0XHRcdFx0XHRyZXR1cm4gISQubm9kZU5hbWUobGlzdE5vZGUsIGxpc3ROYW1lKTtcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0aWYgKGRpZmZMaXN0cy5sZW5ndGgpIHtcblx0XHRcdFx0XHQkLmVhY2goZGlmZkxpc3RzLCBmdW5jdGlvbiAoaWR4LCBsaXN0Tm9kZSkge1xuXHRcdFx0XHRcdFx0ZG9tLnJlcGxhY2UobGlzdE5vZGUsIGxpc3ROYW1lKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRwYXJhcyA9IHRoaXMucmVsZWFzZUxpc3QoY2x1c3RlcmVkcywgdHJ1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmFuZ2UuY3JlYXRlRnJvbVBhcmFCb29rbWFyayhib29rbWFyaywgcGFyYXMpLnNlbGVjdCgpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIHdyYXBMaXN0XG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge05vZGVbXX0gcGFyYXNcblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gbGlzdE5hbWVcblx0XHQgKiBAcmV0dXJuIHtOb2RlW119XG5cdFx0ICovXG5cdFx0dGhpcy53cmFwTGlzdCA9IGZ1bmN0aW9uIChwYXJhcywgbGlzdE5hbWUpIHtcblx0XHRcdHZhciBoZWFkID0gbGlzdC5oZWFkKHBhcmFzKTtcblx0XHRcdHZhciBsYXN0ID0gbGlzdC5sYXN0KHBhcmFzKTtcblxuXHRcdFx0dmFyIHByZXZMaXN0ID0gZG9tLmlzTGlzdChoZWFkLnByZXZpb3VzU2libGluZykgJiYgaGVhZC5wcmV2aW91c1NpYmxpbmc7XG5cdFx0XHR2YXIgbmV4dExpc3QgPSBkb20uaXNMaXN0KGxhc3QubmV4dFNpYmxpbmcpICYmIGxhc3QubmV4dFNpYmxpbmc7XG5cblx0XHRcdHZhciBsaXN0Tm9kZSA9IHByZXZMaXN0IHx8IGRvbS5pbnNlcnRBZnRlcihkb20uY3JlYXRlKGxpc3ROYW1lIHx8ICdVTCcpLCBsYXN0KTtcblxuXHRcdFx0Ly8gUCB0byBMSVxuXHRcdFx0cGFyYXMgPSAkLm1hcChwYXJhcywgZnVuY3Rpb24gKHBhcmEpIHtcblx0XHRcdFx0cmV0dXJuIGRvbS5pc1B1cmVQYXJhKHBhcmEpID8gZG9tLnJlcGxhY2UocGFyYSwgJ0xJJykgOiBwYXJhO1xuXHRcdFx0fSk7XG5cblx0XHRcdC8vIGFwcGVuZCB0byBsaXN0KDx1bD4sIDxvbD4pXG5cdFx0XHRkb20uYXBwZW5kQ2hpbGROb2RlcyhsaXN0Tm9kZSwgcGFyYXMpO1xuXG5cdFx0XHRpZiAobmV4dExpc3QpIHtcblx0XHRcdFx0ZG9tLmFwcGVuZENoaWxkTm9kZXMobGlzdE5vZGUsIGxpc3QuZnJvbShuZXh0TGlzdC5jaGlsZE5vZGVzKSk7XG5cdFx0XHRcdGRvbS5yZW1vdmUobmV4dExpc3QpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gcGFyYXM7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2QgcmVsZWFzZUxpc3Rcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7QXJyYXlbXX0gY2x1c3RlcmVkc1xuXHRcdCAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNFc2NhcHNlVG9Cb2R5XG5cdFx0ICogQHJldHVybiB7Tm9kZVtdfVxuXHRcdCAqL1xuXHRcdHRoaXMucmVsZWFzZUxpc3QgPSBmdW5jdGlvbiAoY2x1c3RlcmVkcywgaXNFc2NhcHNlVG9Cb2R5KSB7XG5cdFx0XHR2YXIgcmVsZWFzZWRQYXJhcyA9IFtdO1xuXG5cdFx0XHQkLmVhY2goY2x1c3RlcmVkcywgZnVuY3Rpb24gKGlkeCwgcGFyYXMpIHtcblx0XHRcdFx0dmFyIGhlYWQgPSBsaXN0LmhlYWQocGFyYXMpO1xuXHRcdFx0XHR2YXIgbGFzdCA9IGxpc3QubGFzdChwYXJhcyk7XG5cblx0XHRcdFx0dmFyIGhlYWRMaXN0ID0gaXNFc2NhcHNlVG9Cb2R5ID8gZG9tLmxhc3RBbmNlc3RvcihoZWFkLCBkb20uaXNMaXN0KSA6XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgaGVhZC5wYXJlbnROb2RlO1xuXHRcdFx0XHR2YXIgbGFzdExpc3QgPSBoZWFkTGlzdC5jaGlsZE5vZGVzLmxlbmd0aCA+IDEgPyBkb20uc3BsaXRUcmVlKGhlYWRMaXN0LCB7XG5cdFx0XHRcdFx0bm9kZTogbGFzdC5wYXJlbnROb2RlLFxuXHRcdFx0XHRcdG9mZnNldDogZG9tLnBvc2l0aW9uKGxhc3QpICsgMVxuXHRcdFx0XHR9LCB0cnVlKSA6IG51bGw7XG5cblx0XHRcdFx0dmFyIG1pZGRsZUxpc3QgPSBkb20uc3BsaXRUcmVlKGhlYWRMaXN0LCB7XG5cdFx0XHRcdFx0bm9kZTogaGVhZC5wYXJlbnROb2RlLFxuXHRcdFx0XHRcdG9mZnNldDogZG9tLnBvc2l0aW9uKGhlYWQpXG5cdFx0XHRcdH0sIHRydWUpO1xuXG5cdFx0XHRcdHBhcmFzID0gaXNFc2NhcHNlVG9Cb2R5ID8gZG9tLmxpc3REZXNjZW5kYW50KG1pZGRsZUxpc3QsIGRvbS5pc0xpKSA6XG5cdFx0XHRcdFx0XHRcdFx0XHRcdCAgbGlzdC5mcm9tKG1pZGRsZUxpc3QuY2hpbGROb2RlcykuZmlsdGVyKGRvbS5pc0xpKTtcblxuXHRcdFx0XHQvLyBMSSB0byBQXG5cdFx0XHRcdGlmIChpc0VzY2Fwc2VUb0JvZHkgfHwgIWRvbS5pc0xpc3QoaGVhZExpc3QucGFyZW50Tm9kZSkpIHtcblx0XHRcdFx0XHRwYXJhcyA9ICQubWFwKHBhcmFzLCBmdW5jdGlvbiAocGFyYSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGRvbS5yZXBsYWNlKHBhcmEsICdQJyk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQkLmVhY2gobGlzdC5mcm9tKHBhcmFzKS5yZXZlcnNlKCksIGZ1bmN0aW9uIChpZHgsIHBhcmEpIHtcblx0XHRcdFx0XHRkb20uaW5zZXJ0QWZ0ZXIocGFyYSwgaGVhZExpc3QpO1xuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHQvLyByZW1vdmUgZW1wdHkgbGlzdHNcblx0XHRcdFx0dmFyIHJvb3RMaXN0cyA9IGxpc3QuY29tcGFjdChbaGVhZExpc3QsIG1pZGRsZUxpc3QsIGxhc3RMaXN0XSk7XG5cdFx0XHRcdCQuZWFjaChyb290TGlzdHMsIGZ1bmN0aW9uIChpZHgsIHJvb3RMaXN0KSB7XG5cdFx0XHRcdFx0dmFyIGxpc3ROb2RlcyA9IFtyb290TGlzdF0uY29uY2F0KGRvbS5saXN0RGVzY2VuZGFudChyb290TGlzdCwgZG9tLmlzTGlzdCkpO1xuXHRcdFx0XHRcdCQuZWFjaChsaXN0Tm9kZXMucmV2ZXJzZSgpLCBmdW5jdGlvbiAoaWR4LCBsaXN0Tm9kZSkge1xuXHRcdFx0XHRcdFx0aWYgKCFkb20ubm9kZUxlbmd0aChsaXN0Tm9kZSkpIHtcblx0XHRcdFx0XHRcdFx0ZG9tLnJlbW92ZShsaXN0Tm9kZSwgdHJ1ZSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdHJlbGVhc2VkUGFyYXMgPSByZWxlYXNlZFBhcmFzLmNvbmNhdChwYXJhcyk7XG5cdFx0XHR9KTtcblxuXHRcdFx0cmV0dXJuIHJlbGVhc2VkUGFyYXM7XG5cdFx0fTtcblx0fTtcblxuXHQvKipcblx0ICogQGNsYXNzIGVkaXRpbmcuRWRpdG9yXG5cdCAqXG5cdCAqIEVkaXRvclxuXHQgKlxuXHQgKi9cblx0dmFyIEVkaXRvciA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBzdHlsZSA9IG5ldyBTdHlsZSgpO1xuXHRcdHZhciB0YWJsZSA9IG5ldyBUYWJsZSgpO1xuXHRcdHZhciB0eXBpbmcgPSBuZXcgVHlwaW5nKCk7XG5cdFx0dmFyIGJ1bGxldCA9IG5ldyBCdWxsZXQoKTtcblxuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2QgY3JlYXRlUmFuZ2Vcblx0XHQgKlxuXHRcdCAqIGNyZWF0ZSByYW5nZVxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRlZGl0YWJsZVxuXHRcdCAqIEByZXR1cm4ge1dyYXBwZWRSYW5nZX1cblx0XHQgKi9cblx0XHR0aGlzLmNyZWF0ZVJhbmdlID0gZnVuY3Rpb24gKCRlZGl0YWJsZSkge1xuXHRcdFx0JGVkaXRhYmxlLmZvY3VzKCk7XG5cdFx0XHRyZXR1cm4gcmFuZ2UuY3JlYXRlKCk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2Qgc2F2ZVJhbmdlXG5cdFx0ICpcblx0XHQgKiBzYXZlIGN1cnJlbnQgcmFuZ2Vcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkZWRpdGFibGVcblx0XHQgKiBAcGFyYW0ge0Jvb2xlYW59IFt0aGVuQ29sbGFwc2U9ZmFsc2VdXG5cdFx0ICovXG5cdFx0dGhpcy5zYXZlUmFuZ2UgPSBmdW5jdGlvbiAoJGVkaXRhYmxlLCB0aGVuQ29sbGFwc2UpIHtcblx0XHRcdCRlZGl0YWJsZS5mb2N1cygpO1xuXHRcdFx0JGVkaXRhYmxlLmRhdGEoJ3JhbmdlJywgcmFuZ2UuY3JlYXRlKCkpO1xuXHRcdFx0aWYgKHRoZW5Db2xsYXBzZSkge1xuXHRcdFx0XHRyYW5nZS5jcmVhdGUoKS5jb2xsYXBzZSgpLnNlbGVjdCgpO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIHNhdmVSYW5nZVxuXHRcdCAqXG5cdFx0ICogc2F2ZSBjdXJyZW50IG5vZGUgbGlzdCB0byAkZWRpdGFibGUuZGF0YSgnY2hpbGROb2RlcycpXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGVkaXRhYmxlXG5cdFx0ICovXG5cdFx0dGhpcy5zYXZlTm9kZSA9IGZ1bmN0aW9uICgkZWRpdGFibGUpIHtcblx0XHRcdC8vIGNvcHkgY2hpbGQgbm9kZSByZWZlcmVuY2Vcblx0XHRcdHZhciBjb3B5ID0gW107XG5cdFx0XHRmb3IgKHZhciBrZXkgPSAwLCBsZW4gPSAkZWRpdGFibGVbMF0uY2hpbGROb2Rlcy5sZW5ndGg7IGtleSA8IGxlbjsga2V5KyspIHtcblx0XHRcdFx0Y29weS5wdXNoKCRlZGl0YWJsZVswXS5jaGlsZE5vZGVzW2tleV0pO1xuXHRcdFx0fVxuXHRcdFx0JGVkaXRhYmxlLmRhdGEoJ2NoaWxkTm9kZXMnLCBjb3B5KTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCByZXN0b3JlUmFuZ2Vcblx0XHQgKlxuXHRcdCAqIHJlc3RvcmUgbGF0ZWx5IHJhbmdlXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGVkaXRhYmxlXG5cdFx0ICovXG5cdFx0dGhpcy5yZXN0b3JlUmFuZ2UgPSBmdW5jdGlvbiAoJGVkaXRhYmxlKSB7XG5cdFx0XHR2YXIgcm5nID0gJGVkaXRhYmxlLmRhdGEoJ3JhbmdlJyk7XG5cdFx0XHRpZiAocm5nKSB7XG5cdFx0XHRcdHJuZy5zZWxlY3QoKTtcblx0XHRcdFx0JGVkaXRhYmxlLmZvY3VzKCk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2QgcmVzdG9yZU5vZGVcblx0XHQgKlxuXHRcdCAqIHJlc3RvcmUgbGF0ZWx5IG5vZGUgbGlzdFxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRlZGl0YWJsZVxuXHRcdCAqL1xuXHRcdHRoaXMucmVzdG9yZU5vZGUgPSBmdW5jdGlvbiAoJGVkaXRhYmxlKSB7XG5cdFx0XHQkZWRpdGFibGUuaHRtbCgnJyk7XG5cdFx0XHR2YXIgY2hpbGQgPSAkZWRpdGFibGUuZGF0YSgnY2hpbGROb2RlcycpO1xuXHRcdFx0Zm9yICh2YXIgaW5kZXggPSAwLCBsZW4gPSBjaGlsZC5sZW5ndGg7IGluZGV4IDwgbGVuOyBpbmRleCsrKSB7XG5cdFx0XHRcdCRlZGl0YWJsZVswXS5hcHBlbmRDaGlsZChjaGlsZFtpbmRleF0pO1xuXHRcdFx0fVxuXHRcdH07XG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCBjdXJyZW50U3R5bGVcblx0XHQgKlxuXHRcdCAqIGN1cnJlbnQgc3R5bGVcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG5cdFx0ICogQHJldHVybiB7Qm9vbGVhbn0gZmFsc2UgaWYgcmFuZ2UgaXMgbm9cblx0XHQgKi9cblx0XHR0aGlzLmN1cnJlbnRTdHlsZSA9IGZ1bmN0aW9uICh0YXJnZXQpIHtcblx0XHRcdHZhciBybmcgPSByYW5nZS5jcmVhdGUoKTtcblx0XHRcdHJldHVybiBybmcgPyBybmcuaXNPbkVkaXRhYmxlKCkgJiYgc3R5bGUuY3VycmVudChybmcsIHRhcmdldCkgOiBmYWxzZTtcblx0XHR9O1xuXG5cdFx0dmFyIHRyaWdnZXJPbkJlZm9yZUNoYW5nZSA9IHRoaXMudHJpZ2dlck9uQmVmb3JlQ2hhbmdlID0gZnVuY3Rpb24gKCRlZGl0YWJsZSkge1xuXHRcdFx0dmFyIG9uQmVmb3JlQ2hhbmdlID0gJGVkaXRhYmxlLmRhdGEoJ2NhbGxiYWNrcycpLm9uQmVmb3JlQ2hhbmdlO1xuXHRcdFx0aWYgKG9uQmVmb3JlQ2hhbmdlKSB7XG5cdFx0XHRcdG9uQmVmb3JlQ2hhbmdlKCRlZGl0YWJsZS5odG1sKCksICRlZGl0YWJsZSk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdHZhciB0cmlnZ2VyT25DaGFuZ2UgPSB0aGlzLnRyaWdnZXJPbkNoYW5nZSA9IGZ1bmN0aW9uICgkZWRpdGFibGUpIHtcblx0XHRcdHZhciBvbkNoYW5nZSA9ICRlZGl0YWJsZS5kYXRhKCdjYWxsYmFja3MnKS5vbkNoYW5nZTtcblx0XHRcdGlmIChvbkNoYW5nZSkge1xuXHRcdFx0XHRvbkNoYW5nZSgkZWRpdGFibGUuaHRtbCgpLCAkZWRpdGFibGUpO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIHVuZG9cblx0XHQgKiB1bmRvXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRlZGl0YWJsZVxuXHRcdCAqL1xuXHRcdHRoaXMudW5kbyA9IGZ1bmN0aW9uICgkZWRpdGFibGUpIHtcblx0XHRcdHRyaWdnZXJPbkJlZm9yZUNoYW5nZSgkZWRpdGFibGUpO1xuXHRcdFx0JGVkaXRhYmxlLmRhdGEoJ05vdGVIaXN0b3J5JykudW5kbygpO1xuXHRcdFx0dHJpZ2dlck9uQ2hhbmdlKCRlZGl0YWJsZSk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2QgcmVkb1xuXHRcdCAqIHJlZG9cblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGVkaXRhYmxlXG5cdFx0ICovXG5cdFx0dGhpcy5yZWRvID0gZnVuY3Rpb24gKCRlZGl0YWJsZSkge1xuXHRcdFx0dHJpZ2dlck9uQmVmb3JlQ2hhbmdlKCRlZGl0YWJsZSk7XG5cdFx0XHQkZWRpdGFibGUuZGF0YSgnTm90ZUhpc3RvcnknKS5yZWRvKCk7XG5cdFx0XHR0cmlnZ2VyT25DaGFuZ2UoJGVkaXRhYmxlKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCBiZWZvcmVDb21tYW5kXG5cdFx0ICogYmVmb3JlIGNvbW1hbmRcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGVkaXRhYmxlXG5cdFx0ICovXG5cdFx0dmFyIGJlZm9yZUNvbW1hbmQgPSB0aGlzLmJlZm9yZUNvbW1hbmQgPSBmdW5jdGlvbiAoJGVkaXRhYmxlKSB7XG5cdFx0XHR0cmlnZ2VyT25CZWZvcmVDaGFuZ2UoJGVkaXRhYmxlKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCBhZnRlckNvbW1hbmRcblx0XHQgKiBhZnRlciBjb21tYW5kXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRlZGl0YWJsZVxuXHRcdCAqL1xuXHRcdHZhciBhZnRlckNvbW1hbmQgPSB0aGlzLmFmdGVyQ29tbWFuZCA9IGZ1bmN0aW9uICgkZWRpdGFibGUpIHtcblx0XHRcdCRlZGl0YWJsZS5kYXRhKCdOb3RlSGlzdG9yeScpLnJlY29yZFVuZG8oKTtcblx0XHRcdHRyaWdnZXJPbkNoYW5nZSgkZWRpdGFibGUpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIGJvbGRcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGVkaXRhYmxlXG5cdFx0ICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcblx0XHQgKi9cblxuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2QgaXRhbGljXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRlZGl0YWJsZVxuXHRcdCAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlXG5cdFx0ICovXG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIHVuZGVybGluZVxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkZWRpdGFibGVcblx0XHQgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuXHRcdCAqL1xuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCBzdHJpa2V0aHJvdWdoXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRlZGl0YWJsZVxuXHRcdCAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlXG5cdFx0ICovXG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIGZvcm1hdEJsb2NrXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRlZGl0YWJsZVxuXHRcdCAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlXG5cdFx0ICovXG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIHN1cGVyc2NyaXB0XG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRlZGl0YWJsZVxuXHRcdCAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlXG5cdFx0ICovXG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIHN1YnNjcmlwdFxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkZWRpdGFibGVcblx0XHQgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuXHRcdCAqL1xuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCBqdXN0aWZ5TGVmdFxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkZWRpdGFibGVcblx0XHQgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuXHRcdCAqL1xuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCBqdXN0aWZ5Q2VudGVyXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRlZGl0YWJsZVxuXHRcdCAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlXG5cdFx0ICovXG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIGp1c3RpZnlSaWdodFxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkZWRpdGFibGVcblx0XHQgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuXHRcdCAqL1xuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCBqdXN0aWZ5RnVsbFxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkZWRpdGFibGVcblx0XHQgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuXHRcdCAqL1xuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCBmb3JtYXRCbG9ja1xuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkZWRpdGFibGVcblx0XHQgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuXHRcdCAqL1xuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCByZW1vdmVGb3JtYXRcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGVkaXRhYmxlXG5cdFx0ICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcblx0XHQgKi9cblxuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2QgYmFja0NvbG9yXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRlZGl0YWJsZVxuXHRcdCAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlXG5cdFx0ICovXG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIGZvcmVDb2xvclxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkZWRpdGFibGVcblx0XHQgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuXHRcdCAqL1xuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCBpbnNlcnRIb3Jpem9udGFsUnVsZVxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkZWRpdGFibGVcblx0XHQgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuXHRcdCAqL1xuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCBmb250TmFtZVxuXHRcdCAqXG5cdFx0ICogY2hhbmdlIGZvbnQgbmFtZVxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRlZGl0YWJsZVxuXHRcdCAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlXG5cdFx0ICovXG5cblx0XHQvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG5cdFx0Ly8gbmF0aXZlIGNvbW1hbmRzKHdpdGggZXhlY0NvbW1hbmQpLCBnZW5lcmF0ZSBmdW5jdGlvbiBmb3IgZXhlY0NvbW1hbmRcblx0XHR2YXIgY29tbWFuZHMgPSBbJ2JvbGQnLCAnaXRhbGljJywgJ3VuZGVybGluZScsICdzdHJpa2V0aHJvdWdoJywgJ3N1cGVyc2NyaXB0JywgJ3N1YnNjcmlwdCcsXG5cdFx0XHRcdFx0XHQnanVzdGlmeUxlZnQnLCAnanVzdGlmeUNlbnRlcicsICdqdXN0aWZ5UmlnaHQnLCAnanVzdGlmeUZ1bGwnLFxuXHRcdFx0XHRcdFx0J2Zvcm1hdEJsb2NrJywgJ3JlbW92ZUZvcm1hdCcsXG5cdFx0XHRcdFx0XHQnYmFja0NvbG9yJywgJ2ZvcmVDb2xvcicsICdpbnNlcnRIb3Jpem9udGFsUnVsZScsICdmb250TmFtZSddO1xuXG5cdFx0Zm9yICh2YXIgaWR4ID0gMCwgbGVuID0gY29tbWFuZHMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG5cdFx0XHR0aGlzW2NvbW1hbmRzW2lkeF1dID0gKGZ1bmN0aW9uIChzQ21kKSB7XG5cdFx0XHRcdHJldHVybiBmdW5jdGlvbiAoJGVkaXRhYmxlLCB2YWx1ZSkge1xuXHRcdFx0XHRcdGJlZm9yZUNvbW1hbmQoJGVkaXRhYmxlKTtcblxuXHRcdFx0XHRcdGRvY3VtZW50LmV4ZWNDb21tYW5kKHNDbWQsIGZhbHNlLCB2YWx1ZSk7XG5cblx0XHRcdFx0XHRhZnRlckNvbW1hbmQoJGVkaXRhYmxlKTtcblx0XHRcdFx0fTtcblx0XHRcdH0pKGNvbW1hbmRzW2lkeF0pO1xuXHRcdH1cblx0XHQvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCB0YWJcblx0XHQgKlxuXHRcdCAqIGhhbmRsZSB0YWIga2V5XG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGVkaXRhYmxlXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcblx0XHQgKi9cblx0XHR0aGlzLnRhYiA9IGZ1bmN0aW9uICgkZWRpdGFibGUsIG9wdGlvbnMpIHtcblx0XHRcdHZhciBybmcgPSByYW5nZS5jcmVhdGUoKTtcblx0XHRcdGlmIChybmcuaXNDb2xsYXBzZWQoKSAmJiBybmcuaXNPbkNlbGwoKSkge1xuXHRcdFx0XHR0YWJsZS50YWIocm5nKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGJlZm9yZUNvbW1hbmQoJGVkaXRhYmxlKTtcblx0XHRcdFx0dHlwaW5nLmluc2VydFRhYigkZWRpdGFibGUsIHJuZywgb3B0aW9ucy50YWJzaXplKTtcblx0XHRcdFx0YWZ0ZXJDb21tYW5kKCRlZGl0YWJsZSk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2QgdW50YWJcblx0XHQgKlxuXHRcdCAqIGhhbmRsZSBzaGlmdCt0YWIga2V5XG5cdFx0ICpcblx0XHQgKi9cblx0XHR0aGlzLnVudGFiID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0dmFyIHJuZyA9IHJhbmdlLmNyZWF0ZSgpO1xuXHRcdFx0aWYgKHJuZy5pc0NvbGxhcHNlZCgpICYmIHJuZy5pc09uQ2VsbCgpKSB7XG5cdFx0XHRcdHRhYmxlLnRhYihybmcsIHRydWUpO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIGluc2VydFBhcmFncmFwaFxuXHRcdCAqXG5cdFx0ICogaW5zZXJ0IHBhcmFncmFwaFxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtOb2RlfSAkZWRpdGFibGVcblx0XHQgKi9cblx0XHR0aGlzLmluc2VydFBhcmFncmFwaCA9IGZ1bmN0aW9uICgkZWRpdGFibGUpIHtcblx0XHRcdGJlZm9yZUNvbW1hbmQoJGVkaXRhYmxlKTtcblx0XHRcdHR5cGluZy5pbnNlcnRQYXJhZ3JhcGgoJGVkaXRhYmxlKTtcblx0XHRcdGFmdGVyQ29tbWFuZCgkZWRpdGFibGUpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIGluc2VydE9yZGVyZWRMaXN0XG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGVkaXRhYmxlXG5cdFx0ICovXG5cdFx0dGhpcy5pbnNlcnRPcmRlcmVkTGlzdCA9IGZ1bmN0aW9uICgkZWRpdGFibGUpIHtcblx0XHRcdGJlZm9yZUNvbW1hbmQoJGVkaXRhYmxlKTtcblx0XHRcdGJ1bGxldC5pbnNlcnRPcmRlcmVkTGlzdCgkZWRpdGFibGUpO1xuXHRcdFx0YWZ0ZXJDb21tYW5kKCRlZGl0YWJsZSk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkZWRpdGFibGVcblx0XHQgKi9cblx0XHR0aGlzLmluc2VydFVub3JkZXJlZExpc3QgPSBmdW5jdGlvbiAoJGVkaXRhYmxlKSB7XG5cdFx0XHRiZWZvcmVDb21tYW5kKCRlZGl0YWJsZSk7XG5cdFx0XHRidWxsZXQuaW5zZXJ0VW5vcmRlcmVkTGlzdCgkZWRpdGFibGUpO1xuXHRcdFx0YWZ0ZXJDb21tYW5kKCRlZGl0YWJsZSk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkZWRpdGFibGVcblx0XHQgKi9cblx0XHR0aGlzLmluZGVudCA9IGZ1bmN0aW9uICgkZWRpdGFibGUpIHtcblx0XHRcdGJlZm9yZUNvbW1hbmQoJGVkaXRhYmxlKTtcblx0XHRcdGJ1bGxldC5pbmRlbnQoJGVkaXRhYmxlKTtcblx0XHRcdGFmdGVyQ29tbWFuZCgkZWRpdGFibGUpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGVkaXRhYmxlXG5cdFx0ICovXG5cdFx0dGhpcy5vdXRkZW50ID0gZnVuY3Rpb24gKCRlZGl0YWJsZSkge1xuXHRcdFx0YmVmb3JlQ29tbWFuZCgkZWRpdGFibGUpO1xuXHRcdFx0YnVsbGV0Lm91dGRlbnQoJGVkaXRhYmxlKTtcblx0XHRcdGFmdGVyQ29tbWFuZCgkZWRpdGFibGUpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBpbnNlcnQgaW1hZ2Vcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkZWRpdGFibGVcblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gc1VybFxuXHRcdCAqL1xuXHRcdHRoaXMuaW5zZXJ0SW1hZ2UgPSBmdW5jdGlvbiAoJGVkaXRhYmxlLCBzVXJsLCBmaWxlbmFtZSkge1xuXHRcdFx0YXN5bmMuY3JlYXRlSW1hZ2Uoc1VybCwgZmlsZW5hbWUpLnRoZW4oZnVuY3Rpb24gKCRpbWFnZSkge1xuXHRcdFx0XHRiZWZvcmVDb21tYW5kKCRlZGl0YWJsZSk7XG5cdFx0XHRcdCRpbWFnZS5jc3Moe1xuXHRcdFx0XHRcdGRpc3BsYXk6ICcnLFxuXHRcdFx0XHRcdHdpZHRoOiBNYXRoLm1pbigkZWRpdGFibGUud2lkdGgoKSwgJGltYWdlLndpZHRoKCkpXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRyYW5nZS5jcmVhdGUoKS5pbnNlcnROb2RlKCRpbWFnZVswXSk7XG5cdFx0XHRcdHJhbmdlLmNyZWF0ZUZyb21Ob2RlKCRpbWFnZVswXSkuY29sbGFwc2UoKS5zZWxlY3QoKTtcblx0XHRcdFx0YWZ0ZXJDb21tYW5kKCRlZGl0YWJsZSk7XG5cdFx0XHR9KS5mYWlsKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0dmFyIGNhbGxiYWNrcyA9ICRlZGl0YWJsZS5kYXRhKCdjYWxsYmFja3MnKTtcblx0XHRcdFx0aWYgKGNhbGxiYWNrcy5vbkltYWdlVXBsb2FkRXJyb3IpIHtcblx0XHRcdFx0XHRjYWxsYmFja3Mub25JbWFnZVVwbG9hZEVycm9yKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIGluc2VydE5vZGVcblx0XHQgKiBpbnNlcnQgbm9kZVxuXHRcdCAqIEBwYXJhbSB7Tm9kZX0gJGVkaXRhYmxlXG5cdFx0ICogQHBhcmFtIHtOb2RlfSBub2RlXG5cdFx0ICovXG5cdFx0dGhpcy5pbnNlcnROb2RlID0gZnVuY3Rpb24gKCRlZGl0YWJsZSwgbm9kZSkge1xuXHRcdFx0YmVmb3JlQ29tbWFuZCgkZWRpdGFibGUpO1xuXHRcdFx0dmFyIHJuZyA9IHRoaXMuY3JlYXRlUmFuZ2UoJGVkaXRhYmxlKTtcblx0XHRcdHJuZy5pbnNlcnROb2RlKG5vZGUpO1xuXHRcdFx0cmFuZ2UuY3JlYXRlRnJvbU5vZGUobm9kZSkuY29sbGFwc2UoKS5zZWxlY3QoKTtcblx0XHRcdGFmdGVyQ29tbWFuZCgkZWRpdGFibGUpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBpbnNlcnQgdGV4dFxuXHRcdCAqIEBwYXJhbSB7Tm9kZX0gJGVkaXRhYmxlXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IHRleHRcblx0XHQgKi9cblx0XHR0aGlzLmluc2VydFRleHQgPSBmdW5jdGlvbiAoJGVkaXRhYmxlLCB0ZXh0KSB7XG5cdFx0XHRiZWZvcmVDb21tYW5kKCRlZGl0YWJsZSk7XG5cdFx0XHR2YXIgcm5nID0gdGhpcy5jcmVhdGVSYW5nZSgkZWRpdGFibGUpO1xuXHRcdFx0dmFyIHRleHROb2RlID0gcm5nLmluc2VydE5vZGUoZG9tLmNyZWF0ZVRleHQodGV4dCkpO1xuXHRcdFx0cmFuZ2UuY3JlYXRlKHRleHROb2RlLCBkb20ubm9kZUxlbmd0aCh0ZXh0Tm9kZSkpLnNlbGVjdCgpO1xuXHRcdFx0YWZ0ZXJDb21tYW5kKCRlZGl0YWJsZSk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIGZvcm1hdEJsb2NrXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGVkaXRhYmxlXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IHRhZ05hbWVcblx0XHQgKi9cblx0XHR0aGlzLmZvcm1hdEJsb2NrID0gZnVuY3Rpb24gKCRlZGl0YWJsZSwgdGFnTmFtZSkge1xuXHRcdFx0YmVmb3JlQ29tbWFuZCgkZWRpdGFibGUpO1xuXHRcdFx0dGFnTmFtZSA9IGFnZW50LmlzTVNJRSA/ICc8JyArIHRhZ05hbWUgKyAnPicgOiB0YWdOYW1lO1xuXHRcdFx0ZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ0Zvcm1hdEJsb2NrJywgZmFsc2UsIHRhZ05hbWUpO1xuXHRcdFx0YWZ0ZXJDb21tYW5kKCRlZGl0YWJsZSk7XG5cdFx0fTtcblxuXHRcdHRoaXMuZm9ybWF0UGFyYSA9IGZ1bmN0aW9uICgkZWRpdGFibGUpIHtcblx0XHRcdGJlZm9yZUNvbW1hbmQoJGVkaXRhYmxlKTtcblx0XHRcdHRoaXMuZm9ybWF0QmxvY2soJGVkaXRhYmxlLCAnUCcpO1xuXHRcdFx0YWZ0ZXJDb21tYW5kKCRlZGl0YWJsZSk7XG5cdFx0fTtcblxuXHRcdC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cblx0XHRmb3IgKHZhciBpZHggPSAxOyBpZHggPD0gNjsgaWR4KyspIHtcblx0XHRcdHRoaXNbJ2Zvcm1hdEgnICsgaWR4XSA9IGZ1bmN0aW9uIChpZHgpIHtcblx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uICgkZWRpdGFibGUpIHtcblx0XHRcdFx0XHR0aGlzLmZvcm1hdEJsb2NrKCRlZGl0YWJsZSwgJ0gnICsgaWR4KTtcblx0XHRcdFx0fTtcblx0XHRcdH0oaWR4KTtcblx0XHR9O1xuXHRcdC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG5cblx0XHQvKipcblx0XHQgKiBmb250c2l6ZVxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRlZGl0YWJsZVxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSB2YWx1ZSAtIHB4XG5cdFx0ICovXG5cdFx0dGhpcy5mb250U2l6ZSA9IGZ1bmN0aW9uICgkZWRpdGFibGUsIHZhbHVlKSB7XG5cdFx0XHRiZWZvcmVDb21tYW5kKCRlZGl0YWJsZSk7XG5cblx0XHRcdHZhciBybmcgPSB0aGlzLmNyZWF0ZVJhbmdlKCRlZGl0YWJsZSk7XG5cdFx0XHR2YXIgc3BhbnMgPSBzdHlsZS5zdHlsZU5vZGVzKHJuZyk7XG5cdFx0XHQkLmVhY2goc3BhbnMsIGZ1bmN0aW9uIChpZHgsIHNwYW4pIHtcblx0XHRcdFx0JChzcGFuKS5jc3Moe1xuXHRcdFx0XHRcdCdmb250LXNpemUnOiB2YWx1ZSArICdweCdcblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblxuXHRcdFx0YWZ0ZXJDb21tYW5kKCRlZGl0YWJsZSk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIGxpbmVIZWlnaHRcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGVkaXRhYmxlXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlXG5cdFx0ICovXG5cdFx0dGhpcy5saW5lSGVpZ2h0ID0gZnVuY3Rpb24gKCRlZGl0YWJsZSwgdmFsdWUpIHtcblx0XHRcdGJlZm9yZUNvbW1hbmQoJGVkaXRhYmxlKTtcblx0XHRcdHN0eWxlLnN0eWxlUGFyYShyYW5nZS5jcmVhdGUoKSwge1xuXHRcdFx0XHRsaW5lSGVpZ2h0OiB2YWx1ZVxuXHRcdFx0fSk7XG5cdFx0XHRhZnRlckNvbW1hbmQoJGVkaXRhYmxlKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogdW5saW5rXG5cdFx0ICpcblx0XHQgKiBAdHlwZSBjb21tYW5kXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGVkaXRhYmxlXG5cdFx0ICovXG5cdFx0dGhpcy51bmxpbmsgPSBmdW5jdGlvbiAoJGVkaXRhYmxlKSB7XG5cdFx0XHR2YXIgcm5nID0gcmFuZ2UuY3JlYXRlKCk7XG5cdFx0XHRpZiAocm5nLmlzT25BbmNob3IoKSkge1xuXHRcdFx0XHR2YXIgYW5jaG9yID0gZG9tLmFuY2VzdG9yKHJuZy5zYywgZG9tLmlzQW5jaG9yKTtcblx0XHRcdFx0cm5nID0gcmFuZ2UuY3JlYXRlRnJvbU5vZGUoYW5jaG9yKTtcblx0XHRcdFx0cm5nLnNlbGVjdCgpO1xuXG5cdFx0XHRcdGJlZm9yZUNvbW1hbmQoJGVkaXRhYmxlKTtcblx0XHRcdFx0ZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ3VubGluaycpO1xuXHRcdFx0XHRhZnRlckNvbW1hbmQoJGVkaXRhYmxlKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogY3JlYXRlIGxpbmsgKGNvbW1hbmQpXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGVkaXRhYmxlXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IGxpbmtJbmZvXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcblx0XHQgKi9cblx0XHR0aGlzLmNyZWF0ZUxpbmsgPSBmdW5jdGlvbiAoJGVkaXRhYmxlLCBsaW5rSW5mbywgb3B0aW9ucykge1xuXHRcdFx0dmFyIGxpbmtVcmwgPSBsaW5rSW5mby51cmw7XG5cdFx0XHR2YXIgbGlua1RleHQgPSBsaW5rSW5mby50ZXh0O1xuXHRcdFx0dmFyIGlzTmV3V2luZG93ID0gbGlua0luZm8ubmV3V2luZG93O1xuXHRcdFx0dmFyIHJuZyA9IGxpbmtJbmZvLnJhbmdlO1xuXHRcdFx0dmFyIGlzVGV4dENoYW5nZWQgPSBybmcudG9TdHJpbmcoKSAhPT0gbGlua1RleHQ7XG5cblx0XHRcdGJlZm9yZUNvbW1hbmQoJGVkaXRhYmxlKTtcblxuXHRcdFx0aWYgKG9wdGlvbnMub25DcmVhdGVMaW5rKSB7XG5cdFx0XHRcdGxpbmtVcmwgPSBvcHRpb25zLm9uQ3JlYXRlTGluayhsaW5rVXJsKTtcblx0XHRcdH1cblxuXHRcdFx0dmFyIGFuY2hvcnM7XG5cdFx0XHRpZiAoaXNUZXh0Q2hhbmdlZCkge1xuXHRcdFx0XHQvLyBDcmVhdGUgYSBuZXcgbGluayB3aGVuIHRleHQgY2hhbmdlZC5cblx0XHRcdFx0dmFyIGFuY2hvciA9IHJuZy5pbnNlcnROb2RlKCQoJzxBPicgKyBsaW5rVGV4dCArICc8L0E+JylbMF0pO1xuXHRcdFx0XHRhbmNob3JzID0gW2FuY2hvcl07XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRhbmNob3JzID0gc3R5bGUuc3R5bGVOb2RlcyhybmcsIHtcblx0XHRcdFx0XHRub2RlTmFtZTogJ0EnLFxuXHRcdFx0XHRcdGV4cGFuZENsb3Nlc3RTaWJsaW5nOiB0cnVlLFxuXHRcdFx0XHRcdG9ubHlQYXJ0aWFsQ29udGFpbnM6IHRydWVcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cblx0XHRcdCQuZWFjaChhbmNob3JzLCBmdW5jdGlvbiAoaWR4LCBhbmNob3IpIHtcblx0XHRcdFx0JChhbmNob3IpLmF0dHIoJ2hyZWYnLCBsaW5rVXJsKTtcblx0XHRcdFx0aWYgKGlzTmV3V2luZG93KSB7XG5cdFx0XHRcdFx0JChhbmNob3IpLmF0dHIoJ3RhcmdldCcsICdfYmxhbmsnKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQkKGFuY2hvcikucmVtb3ZlQXR0cigndGFyZ2V0Jyk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0XHR2YXIgc3RhcnRSYW5nZSA9IHJhbmdlLmNyZWF0ZUZyb21Ob2RlKGxpc3QuaGVhZChhbmNob3JzKSkuY29sbGFwc2UodHJ1ZSk7XG5cdFx0XHR2YXIgc3RhcnRQb2ludCA9IHN0YXJ0UmFuZ2UuZ2V0U3RhcnRQb2ludCgpO1xuXHRcdFx0dmFyIGVuZFJhbmdlID0gcmFuZ2UuY3JlYXRlRnJvbU5vZGUobGlzdC5sYXN0KGFuY2hvcnMpKS5jb2xsYXBzZSgpO1xuXHRcdFx0dmFyIGVuZFBvaW50ID0gZW5kUmFuZ2UuZ2V0RW5kUG9pbnQoKTtcblxuXHRcdFx0cmFuZ2UuY3JlYXRlKFxuXHRcdFx0ICBzdGFydFBvaW50Lm5vZGUsXG5cdFx0XHQgIHN0YXJ0UG9pbnQub2Zmc2V0LFxuXHRcdFx0ICBlbmRQb2ludC5ub2RlLFxuXHRcdFx0ICBlbmRQb2ludC5vZmZzZXRcblx0XHRcdCkuc2VsZWN0KCk7XG5cblx0XHRcdGFmdGVyQ29tbWFuZCgkZWRpdGFibGUpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiByZXR1cm5zIGxpbmsgaW5mb1xuXHRcdCAqXG5cdFx0ICogQHJldHVybiB7T2JqZWN0fVxuXHRcdCAqIEByZXR1cm4ge1dyYXBwZWRSYW5nZX0gcmV0dXJuLnJhbmdlXG5cdFx0ICogQHJldHVybiB7U3RyaW5nfSByZXR1cm4udGV4dFxuXHRcdCAqIEByZXR1cm4ge0Jvb2xlYW59IFtyZXR1cm4uaXNOZXdXaW5kb3c9dHJ1ZV1cblx0XHQgKiBAcmV0dXJuIHtTdHJpbmd9IFtyZXR1cm4udXJsPVwiXCJdXG5cdFx0ICovXG5cdFx0dGhpcy5nZXRMaW5rSW5mbyA9IGZ1bmN0aW9uICgkZWRpdGFibGUpIHtcblx0XHRcdCRlZGl0YWJsZS5mb2N1cygpO1xuXG5cdFx0XHR2YXIgcm5nID0gcmFuZ2UuY3JlYXRlKCkuZXhwYW5kKGRvbS5pc0FuY2hvcik7XG5cblx0XHRcdC8vIEdldCB0aGUgZmlyc3QgYW5jaG9yIG9uIHJhbmdlKGZvciBlZGl0KS5cblx0XHRcdHZhciAkYW5jaG9yID0gJChsaXN0LmhlYWQocm5nLm5vZGVzKGRvbS5pc0FuY2hvcikpKTtcblxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0cmFuZ2U6IHJuZyxcblx0XHRcdFx0dGV4dDogcm5nLnRvU3RyaW5nKCksXG5cdFx0XHRcdGlzTmV3V2luZG93OiAkYW5jaG9yLmxlbmd0aCA/ICRhbmNob3IuYXR0cigndGFyZ2V0JykgPT09ICdfYmxhbmsnIDogZmFsc2UsXG5cdFx0XHRcdHVybDogJGFuY2hvci5sZW5ndGggPyAkYW5jaG9yLmF0dHIoJ2hyZWYnKSA6ICcnXG5cdFx0XHR9O1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBzZXR0aW5nIGNvbG9yXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge05vZGV9ICRlZGl0YWJsZVxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBzT2JqQ29sb3IgIGNvbG9yIGNvZGVcblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gc09iakNvbG9yLmZvcmVDb2xvciBmb3JlZ3JvdW5kIGNvbG9yXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IHNPYmpDb2xvci5iYWNrQ29sb3IgYmFja2dyb3VuZCBjb2xvclxuXHRcdCAqL1xuXHRcdHRoaXMuY29sb3IgPSBmdW5jdGlvbiAoJGVkaXRhYmxlLCBzT2JqQ29sb3IpIHtcblx0XHRcdHZhciBvQ29sb3IgPSBKU09OLnBhcnNlKHNPYmpDb2xvcik7XG5cdFx0XHR2YXIgZm9yZUNvbG9yID0gb0NvbG9yLmZvcmVDb2xvciwgYmFja0NvbG9yID0gb0NvbG9yLmJhY2tDb2xvcjtcblxuXHRcdFx0YmVmb3JlQ29tbWFuZCgkZWRpdGFibGUpO1xuXG5cdFx0XHRpZiAoZm9yZUNvbG9yKSB7IGRvY3VtZW50LmV4ZWNDb21tYW5kKCdmb3JlQ29sb3InLCBmYWxzZSwgZm9yZUNvbG9yKTsgfVxuXHRcdFx0aWYgKGJhY2tDb2xvcikgeyBkb2N1bWVudC5leGVjQ29tbWFuZCgnYmFja0NvbG9yJywgZmFsc2UsIGJhY2tDb2xvcik7IH1cblxuXHRcdFx0YWZ0ZXJDb21tYW5kKCRlZGl0YWJsZSk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIGluc2VydCBUYWJsZVxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtOb2RlfSAkZWRpdGFibGVcblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gc0RpbSBkaW1lbnNpb24gb2YgdGFibGUgKGV4IDogXCI1eDVcIilcblx0XHQgKi9cblx0XHR0aGlzLmluc2VydFRhYmxlID0gZnVuY3Rpb24gKCRlZGl0YWJsZSwgc0RpbSkge1xuXHRcdFx0dmFyIGRpbWVuc2lvbiA9IHNEaW0uc3BsaXQoJ3gnKTtcblx0XHRcdGJlZm9yZUNvbW1hbmQoJGVkaXRhYmxlKTtcblxuXHRcdFx0dmFyIHJuZyA9IHJhbmdlLmNyZWF0ZSgpO1xuXHRcdFx0cm5nID0gcm5nLmRlbGV0ZUNvbnRlbnRzKCk7XG5cdFx0XHRybmcuaW5zZXJ0Tm9kZSh0YWJsZS5jcmVhdGVUYWJsZShkaW1lbnNpb25bMF0sIGRpbWVuc2lvblsxXSkpO1xuXHRcdFx0YWZ0ZXJDb21tYW5kKCRlZGl0YWJsZSk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIGZsb2F0IG1lXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGVkaXRhYmxlXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICR0YXJnZXRcblx0XHQgKi9cblx0XHR0aGlzLmZsb2F0TWUgPSBmdW5jdGlvbiAoJGVkaXRhYmxlLCB2YWx1ZSwgJHRhcmdldCkge1xuXHRcdFx0YmVmb3JlQ29tbWFuZCgkZWRpdGFibGUpO1xuXHRcdFx0JHRhcmdldC5jc3MoJ2Zsb2F0JywgdmFsdWUpO1xuXHRcdFx0YWZ0ZXJDb21tYW5kKCRlZGl0YWJsZSk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIGNoYW5nZSBpbWFnZSBzaGFwZVxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRlZGl0YWJsZVxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSB2YWx1ZSBjc3MgY2xhc3Ncblx0XHQgKiBAcGFyYW0ge05vZGV9ICR0YXJnZXRcblx0XHQgKi9cblx0XHR0aGlzLmltYWdlU2hhcGUgPSBmdW5jdGlvbiAoJGVkaXRhYmxlLCB2YWx1ZSwgJHRhcmdldCkge1xuXHRcdFx0YmVmb3JlQ29tbWFuZCgkZWRpdGFibGUpO1xuXG5cdFx0XHQkdGFyZ2V0LnJlbW92ZUNsYXNzKCdpbWctcm91bmRlZCBpbWctY2lyY2xlIGltZy10aHVtYm5haWwnKTtcblxuXHRcdFx0aWYgKHZhbHVlKSB7XG5cdFx0XHRcdCR0YXJnZXQuYWRkQ2xhc3ModmFsdWUpO1xuXHRcdFx0fVxuXG5cdFx0XHRhZnRlckNvbW1hbmQoJGVkaXRhYmxlKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogcmVzaXplIG92ZXJsYXkgZWxlbWVudFxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkZWRpdGFibGVcblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gdmFsdWVcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJHRhcmdldCAtIHRhcmdldCBlbGVtZW50XG5cdFx0ICovXG5cdFx0dGhpcy5yZXNpemUgPSBmdW5jdGlvbiAoJGVkaXRhYmxlLCB2YWx1ZSwgJHRhcmdldCkge1xuXHRcdFx0YmVmb3JlQ29tbWFuZCgkZWRpdGFibGUpO1xuXG5cdFx0XHQkdGFyZ2V0LmNzcyh7XG5cdFx0XHRcdHdpZHRoOiB2YWx1ZSAqIDEwMCArICclJyxcblx0XHRcdFx0aGVpZ2h0OiAnJ1xuXHRcdFx0fSk7XG5cblx0XHRcdGFmdGVyQ29tbWFuZCgkZWRpdGFibGUpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBAcGFyYW0ge1Bvc2l0aW9ufSBwb3Ncblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJHRhcmdldCAtIHRhcmdldCBlbGVtZW50XG5cdFx0ICogQHBhcmFtIHtCb29sZWFufSBbYktlZXBSYXRpb10gLSBrZWVwIHJhdGlvXG5cdFx0ICovXG5cdFx0dGhpcy5yZXNpemVUbyA9IGZ1bmN0aW9uIChwb3MsICR0YXJnZXQsIGJLZWVwUmF0aW8pIHtcblx0XHRcdHZhciBpbWFnZVNpemU7XG5cdFx0XHRpZiAoYktlZXBSYXRpbykge1xuXHRcdFx0XHR2YXIgbmV3UmF0aW8gPSBwb3MueSAvIHBvcy54O1xuXHRcdFx0XHR2YXIgcmF0aW8gPSAkdGFyZ2V0LmRhdGEoJ3JhdGlvJyk7XG5cdFx0XHRcdGltYWdlU2l6ZSA9IHtcblx0XHRcdFx0XHR3aWR0aDogcmF0aW8gPiBuZXdSYXRpbyA/IHBvcy54IDogcG9zLnkgLyByYXRpbyxcblx0XHRcdFx0XHRoZWlnaHQ6IHJhdGlvID4gbmV3UmF0aW8gPyBwb3MueCAqIHJhdGlvIDogcG9zLnlcblx0XHRcdFx0fTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGltYWdlU2l6ZSA9IHtcblx0XHRcdFx0XHR3aWR0aDogcG9zLngsXG5cdFx0XHRcdFx0aGVpZ2h0OiBwb3MueVxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXG5cdFx0XHQkdGFyZ2V0LmNzcyhpbWFnZVNpemUpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiByZW1vdmUgbWVkaWEgb2JqZWN0XG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGVkaXRhYmxlXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlIC0gZHVtbXkgYXJndW1lbnQgKGZvciBrZWVwIGludGVyZmFjZSlcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJHRhcmdldCAtIHRhcmdldCBlbGVtZW50XG5cdFx0ICovXG5cdFx0dGhpcy5yZW1vdmVNZWRpYSA9IGZ1bmN0aW9uICgkZWRpdGFibGUsIHZhbHVlLCAkdGFyZ2V0KSB7XG5cdFx0XHRiZWZvcmVDb21tYW5kKCRlZGl0YWJsZSk7XG5cdFx0XHQkdGFyZ2V0LmRldGFjaCgpO1xuXG5cdFx0XHR2YXIgY2FsbGJhY2tzID0gJGVkaXRhYmxlLmRhdGEoJ2NhbGxiYWNrcycpO1xuXHRcdFx0aWYgKGNhbGxiYWNrcyAmJiBjYWxsYmFja3Mub25NZWRpYURlbGV0ZSkge1xuXHRcdFx0XHRjYWxsYmFja3Mub25NZWRpYURlbGV0ZSgkdGFyZ2V0LCB0aGlzLCAkZWRpdGFibGUpO1xuXHRcdFx0fVxuXG5cdFx0XHRhZnRlckNvbW1hbmQoJGVkaXRhYmxlKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogc2V0IGZvY3VzXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0gJGVkaXRhYmxlXG5cdFx0ICovXG5cdFx0dGhpcy5mb2N1cyA9IGZ1bmN0aW9uICgkZWRpdGFibGUpIHtcblx0XHRcdCRlZGl0YWJsZS5mb2N1cygpO1xuXHRcdH07XG5cdH07XG5cblx0LyoqXG5cdCAqIEBjbGFzcyBtb2R1bGUuQnV0dG9uXG5cdCAqXG5cdCAqIEJ1dHRvblxuXHQgKi9cblx0dmFyIEJ1dHRvbiA9IGZ1bmN0aW9uICgpIHtcblx0XHQvKipcblx0XHQgKiB1cGRhdGUgYnV0dG9uIHN0YXR1c1xuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRjb250YWluZXJcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gc3R5bGVJbmZvXG5cdFx0ICovXG5cdFx0dGhpcy51cGRhdGUgPSBmdW5jdGlvbiAoJGNvbnRhaW5lciwgc3R5bGVJbmZvKSB7XG5cdFx0XHQvKipcblx0XHRcdCAqIGhhbmRsZSBkcm9wZG93bidzIGNoZWNrIG1hcmsgKGZvciBmb250bmFtZSwgZm9udHNpemUsIGxpbmVIZWlnaHQpLlxuXHRcdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRidG5cblx0XHRcdCAqIEBwYXJhbSB7TnVtYmVyfSB2YWx1ZVxuXHRcdFx0ICovXG5cdFx0XHR2YXIgY2hlY2tEcm9wZG93bk1lbnUgPSBmdW5jdGlvbiAoJGJ0biwgdmFsdWUpIHtcblx0XHRcdFx0JGJ0bi5maW5kKCcuZHJvcGRvd24tbWVudSBsaSBhJykuZWFjaChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0Ly8gYWx3YXlzIGNvbXBhcmUgc3RyaW5nIHRvIGF2b2lkIGNyZWF0aW5nIGFub3RoZXIgZnVuYy5cblx0XHRcdFx0XHR2YXIgaXNDaGVja2VkID0gKCQodGhpcykuZGF0YSgndmFsdWUnKSArICcnKSA9PT0gKHZhbHVlICsgJycpO1xuXHRcdFx0XHRcdHRoaXMuY2xhc3NOYW1lID0gaXNDaGVja2VkID8gJ2NoZWNrZWQnIDogJyc7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fTtcblxuXHRcdFx0LyoqXG5cdFx0XHQgKiB1cGRhdGUgYnV0dG9uIHN0YXRlKGFjdGl2ZSBvciBub3QpLlxuXHRcdFx0ICpcblx0XHRcdCAqIEBwcml2YXRlXG5cdFx0XHQgKiBAcGFyYW0ge1N0cmluZ30gc2VsZWN0b3Jcblx0XHRcdCAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRcblx0XHRcdCAqL1xuXHRcdFx0dmFyIGJ0blN0YXRlID0gZnVuY3Rpb24gKHNlbGVjdG9yLCBwcmVkKSB7XG5cdFx0XHRcdHZhciAkYnRuID0gJGNvbnRhaW5lci5maW5kKHNlbGVjdG9yKTtcblx0XHRcdFx0JGJ0bi50b2dnbGVDbGFzcygnYWN0aXZlJywgcHJlZCgpKTtcblx0XHRcdH07XG5cblx0XHRcdGlmIChzdHlsZUluZm8uaW1hZ2UpIHtcblx0XHRcdFx0dmFyICRpbWcgPSAkKHN0eWxlSW5mby5pbWFnZSk7XG5cblx0XHRcdFx0YnRuU3RhdGUoJ2J1dHRvbltkYXRhLWV2ZW50PVwiaW1hZ2VTaGFwZVwiXVtkYXRhLXZhbHVlPVwiaW1nLXJvdW5kZWRcIl0nLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0cmV0dXJuICRpbWcuaGFzQ2xhc3MoJ2ltZy1yb3VuZGVkJyk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRidG5TdGF0ZSgnYnV0dG9uW2RhdGEtZXZlbnQ9XCJpbWFnZVNoYXBlXCJdW2RhdGEtdmFsdWU9XCJpbWctY2lyY2xlXCJdJywgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdHJldHVybiAkaW1nLmhhc0NsYXNzKCdpbWctY2lyY2xlJyk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRidG5TdGF0ZSgnYnV0dG9uW2RhdGEtZXZlbnQ9XCJpbWFnZVNoYXBlXCJdW2RhdGEtdmFsdWU9XCJpbWctdGh1bWJuYWlsXCJdJywgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdHJldHVybiAkaW1nLmhhc0NsYXNzKCdpbWctdGh1bWJuYWlsJyk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRidG5TdGF0ZSgnYnV0dG9uW2RhdGEtZXZlbnQ9XCJpbWFnZVNoYXBlXCJdOm5vdChbZGF0YS12YWx1ZV0pJywgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdHJldHVybiAhJGltZy5pcygnLmltZy1yb3VuZGVkLCAuaW1nLWNpcmNsZSwgLmltZy10aHVtYm5haWwnKTtcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0dmFyIGltZ0Zsb2F0ID0gJGltZy5jc3MoJ2Zsb2F0Jyk7XG5cdFx0XHRcdGJ0blN0YXRlKCdidXR0b25bZGF0YS1ldmVudD1cImZsb2F0TWVcIl1bZGF0YS12YWx1ZT1cImxlZnRcIl0nLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGltZ0Zsb2F0ID09PSAnbGVmdCc7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRidG5TdGF0ZSgnYnV0dG9uW2RhdGEtZXZlbnQ9XCJmbG9hdE1lXCJdW2RhdGEtdmFsdWU9XCJyaWdodFwiXScsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRyZXR1cm4gaW1nRmxvYXQgPT09ICdyaWdodCc7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRidG5TdGF0ZSgnYnV0dG9uW2RhdGEtZXZlbnQ9XCJmbG9hdE1lXCJdW2RhdGEtdmFsdWU9XCJub25lXCJdJywgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdHJldHVybiBpbWdGbG9hdCAhPT0gJ2xlZnQnICYmIGltZ0Zsb2F0ICE9PSAncmlnaHQnO1xuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHR2YXIgc3R5bGUgPSAkaW1nLmF0dHIoJ3N0eWxlJyk7XG5cdFx0XHRcdGJ0blN0YXRlKCdidXR0b25bZGF0YS1ldmVudD1cInJlc2l6ZVwiXVtkYXRhLXZhbHVlPVwiMVwiXScsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRyZXR1cm4gISEvKF58XFxzKShtYXgtKT93aWR0aFxccyo6XFxzKjEwMCUvLnRlc3Qoc3R5bGUpO1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0YnRuU3RhdGUoJ2J1dHRvbltkYXRhLWV2ZW50PVwicmVzaXplXCJdW2RhdGEtdmFsdWU9XCIwLjVcIl0nLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0cmV0dXJuICEhLyhefFxccykobWF4LSk/d2lkdGhcXHMqOlxccyo1MCUvLnRlc3Qoc3R5bGUpO1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0YnRuU3RhdGUoJ2J1dHRvbltkYXRhLWV2ZW50PVwicmVzaXplXCJdW2RhdGEtdmFsdWU9XCIwLjI1XCJdJywgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdHJldHVybiAhIS8oXnxcXHMpKG1heC0pP3dpZHRoXFxzKjpcXHMqMjUlLy50ZXN0KHN0eWxlKTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gZm9udG5hbWVcblx0XHRcdHZhciAkZm9udG5hbWUgPSAkY29udGFpbmVyLmZpbmQoJy5ub3RlLWZvbnRuYW1lJyk7XG5cdFx0XHRpZiAoJGZvbnRuYW1lLmxlbmd0aCkge1xuXHRcdFx0XHR2YXIgc2VsZWN0ZWRGb250ID0gc3R5bGVJbmZvWydmb250LWZhbWlseSddO1xuXHRcdFx0XHRpZiAoISFzZWxlY3RlZEZvbnQpIHtcblxuXHRcdFx0XHRcdHZhciBsaXN0ID0gc2VsZWN0ZWRGb250LnNwbGl0KCcsJyk7XG5cdFx0XHRcdFx0Zm9yICh2YXIgaSA9IDAsIGxlbiA9IGxpc3QubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcblx0XHRcdFx0XHRcdHNlbGVjdGVkRm9udCA9IGxpc3RbaV0ucmVwbGFjZSgvW1xcJ1xcXCJdL2csICcnKS5yZXBsYWNlKC9cXHMrJC8sICcnKS5yZXBsYWNlKC9eXFxzKy8sICcnKTtcblx0XHRcdFx0XHRcdGlmIChhZ2VudC5pc0ZvbnRJbnN0YWxsZWQoc2VsZWN0ZWRGb250KSkge1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQkZm9udG5hbWUuZmluZCgnLm5vdGUtY3VycmVudC1mb250bmFtZScpLnRleHQoc2VsZWN0ZWRGb250KTtcblx0XHRcdFx0XHRjaGVja0Ryb3Bkb3duTWVudSgkZm9udG5hbWUsIHNlbGVjdGVkRm9udCk7XG5cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBmb250c2l6ZVxuXHRcdFx0dmFyICRmb250c2l6ZSA9ICRjb250YWluZXIuZmluZCgnLm5vdGUtZm9udHNpemUnKTtcblx0XHRcdCRmb250c2l6ZS5maW5kKCcubm90ZS1jdXJyZW50LWZvbnRzaXplJykudGV4dChzdHlsZUluZm9bJ2ZvbnQtc2l6ZSddKTtcblx0XHRcdGNoZWNrRHJvcGRvd25NZW51KCRmb250c2l6ZSwgcGFyc2VGbG9hdChzdHlsZUluZm9bJ2ZvbnQtc2l6ZSddKSk7XG5cblx0XHRcdC8vIGxpbmVoZWlnaHRcblx0XHRcdHZhciAkbGluZUhlaWdodCA9ICRjb250YWluZXIuZmluZCgnLm5vdGUtaGVpZ2h0Jyk7XG5cdFx0XHRjaGVja0Ryb3Bkb3duTWVudSgkbGluZUhlaWdodCwgcGFyc2VGbG9hdChzdHlsZUluZm9bJ2xpbmUtaGVpZ2h0J10pKTtcblxuXHRcdFx0YnRuU3RhdGUoJ2J1dHRvbltkYXRhLWV2ZW50PVwiYm9sZFwiXScsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0cmV0dXJuIHN0eWxlSW5mb1snZm9udC1ib2xkJ10gPT09ICdib2xkJztcblx0XHRcdH0pO1xuXHRcdFx0YnRuU3RhdGUoJ2J1dHRvbltkYXRhLWV2ZW50PVwiaXRhbGljXCJdJywgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRyZXR1cm4gc3R5bGVJbmZvWydmb250LWl0YWxpYyddID09PSAnaXRhbGljJztcblx0XHRcdH0pO1xuXHRcdFx0YnRuU3RhdGUoJ2J1dHRvbltkYXRhLWV2ZW50PVwidW5kZXJsaW5lXCJdJywgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRyZXR1cm4gc3R5bGVJbmZvWydmb250LXVuZGVybGluZSddID09PSAndW5kZXJsaW5lJztcblx0XHRcdH0pO1xuXHRcdFx0YnRuU3RhdGUoJ2J1dHRvbltkYXRhLWV2ZW50PVwic3RyaWtldGhyb3VnaFwiXScsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0cmV0dXJuIHN0eWxlSW5mb1snZm9udC1zdHJpa2V0aHJvdWdoJ10gPT09ICdzdHJpa2V0aHJvdWdoJztcblx0XHRcdH0pO1xuXHRcdFx0YnRuU3RhdGUoJ2J1dHRvbltkYXRhLWV2ZW50PVwic3VwZXJzY3JpcHRcIl0nLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHJldHVybiBzdHlsZUluZm9bJ2ZvbnQtc3VwZXJzY3JpcHQnXSA9PT0gJ3N1cGVyc2NyaXB0Jztcblx0XHRcdH0pO1xuXHRcdFx0YnRuU3RhdGUoJ2J1dHRvbltkYXRhLWV2ZW50PVwic3Vic2NyaXB0XCJdJywgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRyZXR1cm4gc3R5bGVJbmZvWydmb250LXN1YnNjcmlwdCddID09PSAnc3Vic2NyaXB0Jztcblx0XHRcdH0pO1xuXHRcdFx0YnRuU3RhdGUoJ2J1dHRvbltkYXRhLWV2ZW50PVwianVzdGlmeUxlZnRcIl0nLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHJldHVybiBzdHlsZUluZm9bJ3RleHQtYWxpZ24nXSA9PT0gJ2xlZnQnIHx8IHN0eWxlSW5mb1sndGV4dC1hbGlnbiddID09PSAnc3RhcnQnO1xuXHRcdFx0fSk7XG5cdFx0XHRidG5TdGF0ZSgnYnV0dG9uW2RhdGEtZXZlbnQ9XCJqdXN0aWZ5Q2VudGVyXCJdJywgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRyZXR1cm4gc3R5bGVJbmZvWyd0ZXh0LWFsaWduJ10gPT09ICdjZW50ZXInO1xuXHRcdFx0fSk7XG5cdFx0XHRidG5TdGF0ZSgnYnV0dG9uW2RhdGEtZXZlbnQ9XCJqdXN0aWZ5UmlnaHRcIl0nLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHJldHVybiBzdHlsZUluZm9bJ3RleHQtYWxpZ24nXSA9PT0gJ3JpZ2h0Jztcblx0XHRcdH0pO1xuXHRcdFx0YnRuU3RhdGUoJ2J1dHRvbltkYXRhLWV2ZW50PVwianVzdGlmeUZ1bGxcIl0nLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHJldHVybiBzdHlsZUluZm9bJ3RleHQtYWxpZ24nXSA9PT0gJ2p1c3RpZnknO1xuXHRcdFx0fSk7XG5cdFx0XHRidG5TdGF0ZSgnYnV0dG9uW2RhdGEtZXZlbnQ9XCJpbnNlcnRVbm9yZGVyZWRMaXN0XCJdJywgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRyZXR1cm4gc3R5bGVJbmZvWydsaXN0LXN0eWxlJ10gPT09ICd1bm9yZGVyZWQnO1xuXHRcdFx0fSk7XG5cdFx0XHRidG5TdGF0ZSgnYnV0dG9uW2RhdGEtZXZlbnQ9XCJpbnNlcnRPcmRlcmVkTGlzdFwiXScsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0cmV0dXJuIHN0eWxlSW5mb1snbGlzdC1zdHlsZSddID09PSAnb3JkZXJlZCc7XG5cdFx0XHR9KTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogdXBkYXRlIHJlY2VudCBjb2xvclxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtOb2RlfSBidXR0b25cblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gZXZlbnROYW1lXG5cdFx0ICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcblx0XHQgKi9cblx0XHR0aGlzLnVwZGF0ZVJlY2VudENvbG9yID0gZnVuY3Rpb24gKGJ1dHRvbiwgZXZlbnROYW1lLCB2YWx1ZSkge1xuXHRcdFx0dmFyICRjb2xvciA9ICQoYnV0dG9uKS5jbG9zZXN0KCcubm90ZS1jb2xvcicpO1xuXHRcdFx0dmFyICRyZWNlbnRDb2xvciA9ICRjb2xvci5maW5kKCcubm90ZS1yZWNlbnQtY29sb3InKTtcblx0XHRcdHZhciBjb2xvckluZm8gPSBKU09OLnBhcnNlKCRyZWNlbnRDb2xvci5hdHRyKCdkYXRhLXZhbHVlJykpO1xuXHRcdFx0Y29sb3JJbmZvW2V2ZW50TmFtZV0gPSB2YWx1ZTtcblx0XHRcdCRyZWNlbnRDb2xvci5hdHRyKCdkYXRhLXZhbHVlJywgSlNPTi5zdHJpbmdpZnkoY29sb3JJbmZvKSk7XG5cdFx0XHR2YXIgc0tleSA9IGV2ZW50TmFtZSA9PT0gJ2JhY2tDb2xvcicgPyAnYmFja2dyb3VuZC1jb2xvcicgOiAnY29sb3InO1xuXHRcdFx0JHJlY2VudENvbG9yLmZpbmQoJ2knKS5jc3Moc0tleSwgdmFsdWUpO1xuXHRcdH07XG5cdH07XG5cblx0LyoqXG5cdCAqIEBjbGFzcyBtb2R1bGUuVG9vbGJhclxuXHQgKlxuXHQgKiBUb29sYmFyXG5cdCAqL1xuXHR2YXIgVG9vbGJhciA9IGZ1bmN0aW9uICgpIHtcblx0XHR2YXIgYnV0dG9uID0gbmV3IEJ1dHRvbigpO1xuXG5cdFx0dGhpcy51cGRhdGUgPSBmdW5jdGlvbiAoJHRvb2xiYXIsIHN0eWxlSW5mbykge1xuXHRcdFx0YnV0dG9uLnVwZGF0ZSgkdG9vbGJhciwgc3R5bGVJbmZvKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogQHBhcmFtIHtOb2RlfSBidXR0b25cblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gZXZlbnROYW1lXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlXG5cdFx0ICovXG5cdFx0dGhpcy51cGRhdGVSZWNlbnRDb2xvciA9IGZ1bmN0aW9uIChidXR0b25Ob2RlLCBldmVudE5hbWUsIHZhbHVlKSB7XG5cdFx0XHRidXR0b24udXBkYXRlUmVjZW50Q29sb3IoYnV0dG9uTm9kZSwgZXZlbnROYW1lLCB2YWx1ZSk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIGFjdGl2YXRlIGJ1dHRvbnMgZXhjbHVkZSBjb2Rldmlld1xuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkdG9vbGJhclxuXHRcdCAqL1xuXHRcdHRoaXMuYWN0aXZhdGUgPSBmdW5jdGlvbiAoJHRvb2xiYXIpIHtcblx0XHRcdCR0b29sYmFyLmZpbmQoJ2J1dHRvbicpXG5cdFx0XHRcdFx0Lm5vdCgnYnV0dG9uW2RhdGEtZXZlbnQ9XCJjb2Rldmlld1wiXScpXG5cdFx0XHRcdFx0LnJlbW92ZUNsYXNzKCdkaXNhYmxlZCcpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBkZWFjdGl2YXRlIGJ1dHRvbnMgZXhjbHVkZSBjb2Rldmlld1xuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkdG9vbGJhclxuXHRcdCAqL1xuXHRcdHRoaXMuZGVhY3RpdmF0ZSA9IGZ1bmN0aW9uICgkdG9vbGJhcikge1xuXHRcdFx0JHRvb2xiYXIuZmluZCgnYnV0dG9uJylcblx0XHRcdFx0XHQubm90KCdidXR0b25bZGF0YS1ldmVudD1cImNvZGV2aWV3XCJdJylcblx0XHRcdFx0XHQuYWRkQ2xhc3MoJ2Rpc2FibGVkJyk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkY29udGFpbmVyXG5cdFx0ICogQHBhcmFtIHtCb29sZWFufSBbYkZ1bGxzY3JlZW49ZmFsc2VdXG5cdFx0ICovXG5cdFx0dGhpcy51cGRhdGVGdWxsc2NyZWVuID0gZnVuY3Rpb24gKCRjb250YWluZXIsIGJGdWxsc2NyZWVuKSB7XG5cdFx0XHR2YXIgJGJ0biA9ICRjb250YWluZXIuZmluZCgnYnV0dG9uW2RhdGEtZXZlbnQ9XCJmdWxsc2NyZWVuXCJdJyk7XG5cdFx0XHQkYnRuLnRvZ2dsZUNsYXNzKCdhY3RpdmUnLCBiRnVsbHNjcmVlbik7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkY29udGFpbmVyXG5cdFx0ICogQHBhcmFtIHtCb29sZWFufSBbaXNDb2Rldmlldz1mYWxzZV1cblx0XHQgKi9cblx0XHR0aGlzLnVwZGF0ZUNvZGV2aWV3ID0gZnVuY3Rpb24gKCRjb250YWluZXIsIGlzQ29kZXZpZXcpIHtcblx0XHRcdHZhciAkYnRuID0gJGNvbnRhaW5lci5maW5kKCdidXR0b25bZGF0YS1ldmVudD1cImNvZGV2aWV3XCJdJyk7XG5cdFx0XHQkYnRuLnRvZ2dsZUNsYXNzKCdhY3RpdmUnLCBpc0NvZGV2aWV3KTtcblxuXHRcdFx0aWYgKGlzQ29kZXZpZXcpIHtcblx0XHRcdFx0dGhpcy5kZWFjdGl2YXRlKCRjb250YWluZXIpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5hY3RpdmF0ZSgkY29udGFpbmVyKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogZ2V0IGJ1dHRvbiBpbiB0b29sYmFyIFxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRlZGl0YWJsZVxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG5cdFx0ICogQHJldHVybiB7alF1ZXJ5fVxuXHRcdCAqL1xuXHRcdHRoaXMuZ2V0ID0gZnVuY3Rpb24gKCRlZGl0YWJsZSwgbmFtZSkge1xuXHRcdFx0dmFyICR0b29sYmFyID0gZG9tLm1ha2VMYXlvdXRJbmZvKCRlZGl0YWJsZSkudG9vbGJhcigpO1xuXG5cdFx0XHRyZXR1cm4gJHRvb2xiYXIuZmluZCgnW2RhdGEtbmFtZT0nICsgbmFtZSArICddJyk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIHNldCBidXR0b24gc3RhdGVcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGVkaXRhYmxlXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcblx0XHQgKiBAcGFyYW0ge0Jvb2xlYW59IFtpc0FjdGl2ZT10cnVlXVxuXHRcdCAqL1xuXHRcdHRoaXMuc2V0QnV0dG9uU3RhdGUgPSBmdW5jdGlvbiAoJGVkaXRhYmxlLCBuYW1lLCBpc0FjdGl2ZSkge1xuXHRcdFx0aXNBY3RpdmUgPSAoaXNBY3RpdmUgPT09IGZhbHNlKSA/IGZhbHNlIDogdHJ1ZTtcblxuXHRcdFx0dmFyICRidXR0b24gPSB0aGlzLmdldCgkZWRpdGFibGUsIG5hbWUpO1xuXHRcdFx0JGJ1dHRvbi50b2dnbGVDbGFzcygnYWN0aXZlJywgaXNBY3RpdmUpO1xuXHRcdH07XG5cdH07XG5cblx0dmFyIEVESVRBQkxFX1BBRERJTkcgPSAyNDtcblxuXHR2YXIgU3RhdHVzYmFyID0gZnVuY3Rpb24gKCkge1xuXHRcdHZhciAkZG9jdW1lbnQgPSAkKGRvY3VtZW50KTtcblxuXHRcdHRoaXMuYXR0YWNoID0gZnVuY3Rpb24gKGxheW91dEluZm8sIG9wdGlvbnMpIHtcblx0XHRcdGlmICghb3B0aW9ucy5kaXNhYmxlUmVzaXplRWRpdG9yKSB7XG5cdFx0XHRcdGxheW91dEluZm8uc3RhdHVzYmFyKCkub24oJ21vdXNlZG93bicsIGhTdGF0dXNiYXJNb3VzZWRvd24pO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBgbW91c2Vkb3duYCBldmVudCBoYW5kbGVyIG9uIHN0YXR1c2JhclxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtNb3VzZUV2ZW50fSBldmVudFxuXHRcdCAqL1xuXHRcdHZhciBoU3RhdHVzYmFyTW91c2Vkb3duID0gZnVuY3Rpb24gKGV2ZW50KSB7XG5cdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cblx0XHRcdHZhciAkZWRpdGFibGUgPSBkb20ubWFrZUxheW91dEluZm8oZXZlbnQudGFyZ2V0KS5lZGl0YWJsZSgpO1xuXHRcdFx0dmFyIGVkaXRhYmxlVG9wID0gJGVkaXRhYmxlLm9mZnNldCgpLnRvcCAtICRkb2N1bWVudC5zY3JvbGxUb3AoKTtcblxuXHRcdFx0dmFyIGxheW91dEluZm8gPSBkb20ubWFrZUxheW91dEluZm8oZXZlbnQuY3VycmVudFRhcmdldCB8fCBldmVudC50YXJnZXQpO1xuXHRcdFx0dmFyIG9wdGlvbnMgPSBsYXlvdXRJbmZvLmVkaXRvcigpLmRhdGEoJ29wdGlvbnMnKTtcblxuXHRcdFx0JGRvY3VtZW50Lm9uKCdtb3VzZW1vdmUnLCBmdW5jdGlvbiAoZXZlbnQpIHtcblx0XHRcdFx0dmFyIG5IZWlnaHQgPSBldmVudC5jbGllbnRZIC0gKGVkaXRhYmxlVG9wICsgRURJVEFCTEVfUEFERElORyk7XG5cblx0XHRcdFx0bkhlaWdodCA9IChvcHRpb25zLm1pbkhlaWdodCA+IDApID8gTWF0aC5tYXgobkhlaWdodCwgb3B0aW9ucy5taW5IZWlnaHQpIDogbkhlaWdodDtcblx0XHRcdFx0bkhlaWdodCA9IChvcHRpb25zLm1heEhlaWdodCA+IDApID8gTWF0aC5taW4obkhlaWdodCwgb3B0aW9ucy5tYXhIZWlnaHQpIDogbkhlaWdodDtcblxuXHRcdFx0XHQkZWRpdGFibGUuaGVpZ2h0KG5IZWlnaHQpO1xuXHRcdFx0fSkub25lKCdtb3VzZXVwJywgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHQkZG9jdW1lbnQub2ZmKCdtb3VzZW1vdmUnKTtcblx0XHRcdH0pO1xuXHRcdH07XG5cdH07XG5cblx0LyoqXG5cdCAqIEBjbGFzcyBtb2R1bGUuUG9wb3ZlclxuXHQgKlxuXHQgKiBQb3BvdmVyIChodHRwOi8vZ2V0Ym9vdHN0cmFwLmNvbS9qYXZhc2NyaXB0LyNwb3BvdmVycylcblx0ICpcblx0ICovXG5cdHZhciBQb3BvdmVyID0gZnVuY3Rpb24gKCkge1xuXHRcdHZhciBidXR0b24gPSBuZXcgQnV0dG9uKCk7XG5cblx0XHQvKipcblx0XHQgKiByZXR1cm5zIHBvc2l0aW9uIGZyb20gcGxhY2Vob2xkZXJcblx0XHQgKlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICogQHBhcmFtIHtOb2RlfSBwbGFjZWhvbGRlclxuXHRcdCAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNBaXJNb2RlXG5cdFx0ICogQHJldHVybiB7T2JqZWN0fVxuXHRcdCAqIEByZXR1cm4ge051bWJlcn0gcmV0dXJuLmxlZnRcblx0XHQgKiBAcmV0dXJuIHtOdW1iZXJ9IHJldHVybi50b3Bcblx0XHQgKi9cblx0XHR2YXIgcG9zRnJvbVBsYWNlaG9sZGVyID0gZnVuY3Rpb24gKHBsYWNlaG9sZGVyLCBpc0Fpck1vZGUpIHtcblx0XHRcdHZhciAkcGxhY2Vob2xkZXIgPSAkKHBsYWNlaG9sZGVyKTtcblx0XHRcdHZhciBwb3MgPSBpc0Fpck1vZGUgPyAkcGxhY2Vob2xkZXIub2Zmc2V0KCkgOiAkcGxhY2Vob2xkZXIucG9zaXRpb24oKTtcblx0XHRcdHZhciBoZWlnaHQgPSAkcGxhY2Vob2xkZXIub3V0ZXJIZWlnaHQodHJ1ZSk7IC8vIGluY2x1ZGUgbWFyZ2luXG5cblx0XHRcdC8vIHBvcG92ZXIgYmVsb3cgcGxhY2Vob2xkZXIuXG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRsZWZ0OiBwb3MubGVmdCxcblx0XHRcdFx0dG9wOiBwb3MudG9wICsgaGVpZ2h0XG5cdFx0XHR9O1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBzaG93IHBvcG92ZXJcblx0XHQgKlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9IHBvcG92ZXJcblx0XHQgKiBAcGFyYW0ge1Bvc2l0aW9ufSBwb3Ncblx0XHQgKi9cblx0XHR2YXIgc2hvd1BvcG92ZXIgPSBmdW5jdGlvbiAoJHBvcG92ZXIsIHBvcykge1xuXHRcdFx0JHBvcG92ZXIuY3NzKHtcblx0XHRcdFx0ZGlzcGxheTogJ2Jsb2NrJyxcblx0XHRcdFx0bGVmdDogcG9zLmxlZnQsXG5cdFx0XHRcdHRvcDogcG9zLnRvcFxuXHRcdFx0fSk7XG5cdFx0fTtcblxuXHRcdHZhciBQWF9QT1BPVkVSX0FSUk9XX09GRlNFVF9YID0gMjA7XG5cblx0XHQvKipcblx0XHQgKiB1cGRhdGUgY3VycmVudCBzdGF0ZVxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkcG9wb3ZlciAtIHBvcG92ZXIgY29udGFpbmVyXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IHN0eWxlSW5mbyAtIHN0eWxlIG9iamVjdFxuXHRcdCAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNBaXJNb2RlXG5cdFx0ICovXG5cdFx0dGhpcy51cGRhdGUgPSBmdW5jdGlvbiAoJHBvcG92ZXIsIHN0eWxlSW5mbywgaXNBaXJNb2RlKSB7XG5cdFx0XHRidXR0b24udXBkYXRlKCRwb3BvdmVyLCBzdHlsZUluZm8pO1xuXG5cdFx0XHR2YXIgJGxpbmtQb3BvdmVyID0gJHBvcG92ZXIuZmluZCgnLm5vdGUtbGluay1wb3BvdmVyJyk7XG5cdFx0XHRpZiAoc3R5bGVJbmZvLmFuY2hvcikge1xuXHRcdFx0XHR2YXIgJGFuY2hvciA9ICRsaW5rUG9wb3Zlci5maW5kKCdhJyk7XG5cdFx0XHRcdHZhciBocmVmID0gJChzdHlsZUluZm8uYW5jaG9yKS5hdHRyKCdocmVmJyk7XG5cdFx0XHRcdHZhciB0YXJnZXQgPSAkKHN0eWxlSW5mby5hbmNob3IpLmF0dHIoJ3RhcmdldCcpO1xuXHRcdFx0XHQkYW5jaG9yLmF0dHIoJ2hyZWYnLCBocmVmKS5odG1sKGhyZWYpO1xuXHRcdFx0XHRpZiAoIXRhcmdldCkge1xuXHRcdFx0XHRcdCRhbmNob3IucmVtb3ZlQXR0cigndGFyZ2V0Jyk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0JGFuY2hvci5hdHRyKCd0YXJnZXQnLCAnX2JsYW5rJyk7XG5cdFx0XHRcdH1cblx0XHRcdFx0c2hvd1BvcG92ZXIoJGxpbmtQb3BvdmVyLCBwb3NGcm9tUGxhY2Vob2xkZXIoc3R5bGVJbmZvLmFuY2hvciwgaXNBaXJNb2RlKSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQkbGlua1BvcG92ZXIuaGlkZSgpO1xuXHRcdFx0fVxuXG5cdFx0XHR2YXIgJGltYWdlUG9wb3ZlciA9ICRwb3BvdmVyLmZpbmQoJy5ub3RlLWltYWdlLXBvcG92ZXInKTtcblx0XHRcdGlmIChzdHlsZUluZm8uaW1hZ2UpIHtcblx0XHRcdFx0c2hvd1BvcG92ZXIoJGltYWdlUG9wb3ZlciwgcG9zRnJvbVBsYWNlaG9sZGVyKHN0eWxlSW5mby5pbWFnZSwgaXNBaXJNb2RlKSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQkaW1hZ2VQb3BvdmVyLmhpZGUoKTtcblx0XHRcdH1cblxuXHRcdFx0dmFyICRhaXJQb3BvdmVyID0gJHBvcG92ZXIuZmluZCgnLm5vdGUtYWlyLXBvcG92ZXInKTtcblx0XHRcdGlmIChpc0Fpck1vZGUgJiYgIXN0eWxlSW5mby5yYW5nZS5pc0NvbGxhcHNlZCgpKSB7XG5cdFx0XHRcdHZhciByZWN0ID0gbGlzdC5sYXN0KHN0eWxlSW5mby5yYW5nZS5nZXRDbGllbnRSZWN0cygpKTtcblx0XHRcdFx0aWYgKHJlY3QpIHtcblx0XHRcdFx0XHR2YXIgYm5kID0gZnVuYy5yZWN0MmJuZChyZWN0KTtcblx0XHRcdFx0XHRzaG93UG9wb3ZlcigkYWlyUG9wb3Zlciwge1xuXHRcdFx0XHRcdFx0bGVmdDogTWF0aC5tYXgoYm5kLmxlZnQgKyBibmQud2lkdGggLyAyIC0gUFhfUE9QT1ZFUl9BUlJPV19PRkZTRVRfWCwgMCksXG5cdFx0XHRcdFx0XHR0b3A6IGJuZC50b3AgKyBibmQuaGVpZ2h0XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdCRhaXJQb3BvdmVyLmhpZGUoKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogQHBhcmFtIHtOb2RlfSBidXR0b25cblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gZXZlbnROYW1lXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlXG5cdFx0ICovXG5cdFx0dGhpcy51cGRhdGVSZWNlbnRDb2xvciA9IGZ1bmN0aW9uIChidXR0b24sIGV2ZW50TmFtZSwgdmFsdWUpIHtcblx0XHRcdGJ1dHRvbi51cGRhdGVSZWNlbnRDb2xvcihidXR0b24sIGV2ZW50TmFtZSwgdmFsdWUpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBoaWRlIGFsbCBwb3BvdmVyc1xuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkcG9wb3ZlciAtIHBvcG92ZXIgY29udGFpbmVyXG5cdFx0ICovXG5cdFx0dGhpcy5oaWRlID0gZnVuY3Rpb24gKCRwb3BvdmVyKSB7XG5cdFx0XHQkcG9wb3Zlci5jaGlsZHJlbigpLmhpZGUoKTtcblx0XHR9O1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBAY2xhc3MgbW9kdWxlLkhhbmRsZVxuXHQgKlxuXHQgKiBIYW5kbGVcblx0ICovXG5cdHZhciBIYW5kbGUgPSBmdW5jdGlvbiAoaGFuZGxlcikge1xuXHRcdHZhciAkZG9jdW1lbnQgPSAkKGRvY3VtZW50KTtcblxuXHRcdC8qKlxuXHRcdCAqIGBtb3VzZWRvd25gIGV2ZW50IGhhbmRsZXIgb24gJGhhbmRsZVxuXHRcdCAqICAtIGNvbnRyb2xTaXppbmc6IHJlc2l6ZSBpbWFnZVxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtNb3VzZUV2ZW50fSBldmVudFxuXHRcdCAqL1xuXHRcdHZhciBoSGFuZGxlTW91c2Vkb3duID0gZnVuY3Rpb24gKGV2ZW50KSB7XG5cdFx0XHRpZiAoZG9tLmlzQ29udHJvbFNpemluZyhldmVudC50YXJnZXQpKSB7XG5cdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG5cdFx0XHRcdHZhciBsYXlvdXRJbmZvID0gZG9tLm1ha2VMYXlvdXRJbmZvKGV2ZW50LnRhcmdldCksXG5cdFx0XHRcdFx0JGhhbmRsZSA9IGxheW91dEluZm8uaGFuZGxlKCksXG5cdFx0XHRcdFx0JHBvcG92ZXIgPSBsYXlvdXRJbmZvLnBvcG92ZXIoKSxcblx0XHRcdFx0XHQkZWRpdGFibGUgPSBsYXlvdXRJbmZvLmVkaXRhYmxlKCksXG5cdFx0XHRcdFx0JGVkaXRvciA9IGxheW91dEluZm8uZWRpdG9yKCk7XG5cblx0XHRcdFx0dmFyIHRhcmdldCA9ICRoYW5kbGUuZmluZCgnLm5vdGUtY29udHJvbC1zZWxlY3Rpb24nKS5kYXRhKCd0YXJnZXQnKSxcblx0XHRcdFx0XHQkdGFyZ2V0ID0gJCh0YXJnZXQpLCBwb3NTdGFydCA9ICR0YXJnZXQub2Zmc2V0KCksXG5cdFx0XHRcdFx0c2Nyb2xsVG9wID0gJGRvY3VtZW50LnNjcm9sbFRvcCgpO1xuXG5cdFx0XHRcdHZhciBpc0Fpck1vZGUgPSAkZWRpdG9yLmRhdGEoJ29wdGlvbnMnKS5haXJNb2RlO1xuXG5cdFx0XHRcdCRkb2N1bWVudC5vbignbW91c2Vtb3ZlJywgZnVuY3Rpb24gKGV2ZW50KSB7XG5cdFx0XHRcdFx0aGFuZGxlci5pbnZva2UoJ2VkaXRvci5yZXNpemVUbycsIHtcblx0XHRcdFx0XHRcdHg6IGV2ZW50LmNsaWVudFggLSBwb3NTdGFydC5sZWZ0LFxuXHRcdFx0XHRcdFx0eTogZXZlbnQuY2xpZW50WSAtIChwb3NTdGFydC50b3AgLSBzY3JvbGxUb3ApXG5cdFx0XHRcdFx0fSwgJHRhcmdldCwgIWV2ZW50LnNoaWZ0S2V5KTtcblxuXHRcdFx0XHRcdGhhbmRsZXIuaW52b2tlKCdoYW5kbGUudXBkYXRlJywgJGhhbmRsZSwgeyBpbWFnZTogdGFyZ2V0IH0sIGlzQWlyTW9kZSk7XG5cdFx0XHRcdFx0aGFuZGxlci5pbnZva2UoJ3BvcG92ZXIudXBkYXRlJywgJHBvcG92ZXIsIHsgaW1hZ2U6IHRhcmdldCB9LCBpc0Fpck1vZGUpO1xuXHRcdFx0XHR9KS5vbmUoJ21vdXNldXAnLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0JGRvY3VtZW50Lm9mZignbW91c2Vtb3ZlJyk7XG5cdFx0XHRcdFx0aGFuZGxlci5pbnZva2UoJ2VkaXRvci5hZnRlckNvbW1hbmQnLCAkZWRpdGFibGUpO1xuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHRpZiAoISR0YXJnZXQuZGF0YSgncmF0aW8nKSkgeyAvLyBvcmlnaW5hbCByYXRpby5cblx0XHRcdFx0XHQkdGFyZ2V0LmRhdGEoJ3JhdGlvJywgJHRhcmdldC5oZWlnaHQoKSAvICR0YXJnZXQud2lkdGgoKSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0dGhpcy5hdHRhY2ggPSBmdW5jdGlvbiAobGF5b3V0SW5mbykge1xuXHRcdFx0bGF5b3V0SW5mby5oYW5kbGUoKS5vbignbW91c2Vkb3duJywgaEhhbmRsZU1vdXNlZG93bik7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIHVwZGF0ZSBoYW5kbGVcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGhhbmRsZVxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBzdHlsZUluZm9cblx0XHQgKiBAcGFyYW0ge0Jvb2xlYW59IGlzQWlyTW9kZVxuXHRcdCAqL1xuXHRcdHRoaXMudXBkYXRlID0gZnVuY3Rpb24gKCRoYW5kbGUsIHN0eWxlSW5mbywgaXNBaXJNb2RlKSB7XG5cdFx0XHR2YXIgJHNlbGVjdGlvbiA9ICRoYW5kbGUuZmluZCgnLm5vdGUtY29udHJvbC1zZWxlY3Rpb24nKTtcblx0XHRcdGlmIChzdHlsZUluZm8uaW1hZ2UpIHtcblx0XHRcdFx0dmFyICRpbWFnZSA9ICQoc3R5bGVJbmZvLmltYWdlKTtcblx0XHRcdFx0dmFyIHBvcyA9IGlzQWlyTW9kZSA/ICRpbWFnZS5vZmZzZXQoKSA6ICRpbWFnZS5wb3NpdGlvbigpO1xuXG5cdFx0XHRcdC8vIGluY2x1ZGUgbWFyZ2luXG5cdFx0XHRcdHZhciBpbWFnZVNpemUgPSB7XG5cdFx0XHRcdFx0dzogJGltYWdlLm91dGVyV2lkdGgodHJ1ZSksXG5cdFx0XHRcdFx0aDogJGltYWdlLm91dGVySGVpZ2h0KHRydWUpXG5cdFx0XHRcdH07XG5cblx0XHRcdFx0JHNlbGVjdGlvbi5jc3Moe1xuXHRcdFx0XHRcdGRpc3BsYXk6ICdibG9jaycsXG5cdFx0XHRcdFx0bGVmdDogcG9zLmxlZnQsXG5cdFx0XHRcdFx0dG9wOiBwb3MudG9wLFxuXHRcdFx0XHRcdHdpZHRoOiBpbWFnZVNpemUudyxcblx0XHRcdFx0XHRoZWlnaHQ6IGltYWdlU2l6ZS5oXG5cdFx0XHRcdH0pLmRhdGEoJ3RhcmdldCcsIHN0eWxlSW5mby5pbWFnZSk7IC8vIHNhdmUgY3VycmVudCBpbWFnZSBlbGVtZW50LlxuXHRcdFx0XHR2YXIgc2l6aW5nVGV4dCA9IGltYWdlU2l6ZS53ICsgJ3gnICsgaW1hZ2VTaXplLmg7XG5cdFx0XHRcdCRzZWxlY3Rpb24uZmluZCgnLm5vdGUtY29udHJvbC1zZWxlY3Rpb24taW5mbycpLnRleHQoc2l6aW5nVGV4dCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQkc2VsZWN0aW9uLmhpZGUoKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogaGlkZVxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRoYW5kbGVcblx0XHQgKi9cblx0XHR0aGlzLmhpZGUgPSBmdW5jdGlvbiAoJGhhbmRsZSkge1xuXHRcdFx0JGhhbmRsZS5jaGlsZHJlbigpLmhpZGUoKTtcblx0XHR9O1xuXHR9O1xuXG5cdHZhciBGdWxsc2NyZWVuID0gZnVuY3Rpb24gKGhhbmRsZXIpIHtcblx0XHR2YXIgJHdpbmRvdyA9ICQod2luZG93KTtcblx0XHR2YXIgJHNjcm9sbGJhciA9ICQoJ2h0bWwsIGJvZHknKTtcblxuXHRcdC8qKlxuXHRcdCAqIHRvZ2dsZSBmdWxsc2NyZWVuXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gbGF5b3V0SW5mb1xuXHRcdCAqL1xuXHRcdHRoaXMudG9nZ2xlID0gZnVuY3Rpb24gKGxheW91dEluZm8pIHtcblxuXHRcdFx0dmFyICRlZGl0b3IgPSBsYXlvdXRJbmZvLmVkaXRvcigpLFxuXHRcdFx0XHQkdG9vbGJhciA9IGxheW91dEluZm8udG9vbGJhcigpLFxuXHRcdFx0XHQkZWRpdGFibGUgPSBsYXlvdXRJbmZvLmVkaXRhYmxlKCksXG5cdFx0XHRcdCRjb2RhYmxlID0gbGF5b3V0SW5mby5jb2RhYmxlKCk7XG5cblx0XHRcdHZhciByZXNpemUgPSBmdW5jdGlvbiAoc2l6ZSkge1xuXHRcdFx0XHQkZWRpdGFibGUuY3NzKCdoZWlnaHQnLCBzaXplLmgpO1xuXHRcdFx0XHQkY29kYWJsZS5jc3MoJ2hlaWdodCcsIHNpemUuaCk7XG5cdFx0XHRcdGlmICgkY29kYWJsZS5kYXRhKCdjbWVkaXRvcicpKSB7XG5cdFx0XHRcdFx0JGNvZGFibGUuZGF0YSgnY21lZGl0b3InKS5zZXRzaXplKG51bGwsIHNpemUuaCk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cblx0XHRcdCRlZGl0b3IudG9nZ2xlQ2xhc3MoJ2Z1bGxzY3JlZW4nKTtcblx0XHRcdHZhciBpc0Z1bGxzY3JlZW4gPSAkZWRpdG9yLmhhc0NsYXNzKCdmdWxsc2NyZWVuJyk7XG5cdFx0XHRpZiAoaXNGdWxsc2NyZWVuKSB7XG5cdFx0XHRcdCRlZGl0YWJsZS5kYXRhKCdvcmdoZWlnaHQnLCAkZWRpdGFibGUuY3NzKCdoZWlnaHQnKSk7XG5cblx0XHRcdFx0JHdpbmRvdy5vbigncmVzaXplJywgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdHJlc2l6ZSh7XG5cdFx0XHRcdFx0XHRoOiAkd2luZG93LmhlaWdodCgpIC0gJHRvb2xiYXIub3V0ZXJIZWlnaHQoKSAtIDE0MlxuXHRcdFx0XHR9KTtcblx0XHRcdFx0fSkudHJpZ2dlcigncmVzaXplJyk7XG5cblx0XHRcdFx0JHNjcm9sbGJhci5jc3MoJ292ZXJmbG93JywgJ2hpZGRlbicpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0JHdpbmRvdy5vZmYoJ3Jlc2l6ZScpO1xuXHRcdFx0XHRyZXNpemUoe1xuXHRcdFx0XHRcdGg6ICRlZGl0YWJsZS5kYXRhKCdvcmdoZWlnaHQnKVxuXHRcdFx0XHR9KTtcblx0XHRcdFx0JHNjcm9sbGJhci5jc3MoJ292ZXJmbG93JywgJ3Zpc2libGUnKTtcblx0XHRcdH1cblxuXHRcdFx0aGFuZGxlci5pbnZva2UoJ3Rvb2xiYXIudXBkYXRlRnVsbHNjcmVlbicsICR0b29sYmFyLCBpc0Z1bGxzY3JlZW4pO1xuXHRcdH07XG5cdH07XG5cblxuXHR2YXIgQ29kZU1pcnJvcjtcblx0aWYgKGFnZW50Lmhhc0NvZGVNaXJyb3IpIHtcblx0XHRpZiAoYWdlbnQuaXNTdXBwb3J0QW1kKSB7XG5cdFx0XHRfX2Jyb3dzZXJpZnlfc2hpbV9yZXF1aXJlX18oWydDb2RlTWlycm9yJ10sIGZ1bmN0aW9uIChjbSkge1xuXHRcdFx0XHRDb2RlTWlycm9yID0gY207XG5cdFx0XHR9KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Q29kZU1pcnJvciA9IHdpbmRvdy5Db2RlTWlycm9yO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBAY2xhc3MgQ29kZXZpZXdcblx0ICovXG5cdHZhciBDb2RldmlldyA9IGZ1bmN0aW9uIChoYW5kbGVyKSB7XG5cblx0XHR0aGlzLnN5bmMgPSBmdW5jdGlvbiAobGF5b3V0SW5mbykge1xuXHRcdFx0dmFyIGlzQ29kZXZpZXcgPSBoYW5kbGVyLmludm9rZSgnY29kZXZpZXcuaXNBY3RpdmF0ZWQnLCBsYXlvdXRJbmZvKTtcblx0XHRcdGlmIChpc0NvZGV2aWV3ICYmIGFnZW50Lmhhc0NvZGVNaXJyb3IpIHtcblx0XHRcdFx0bGF5b3V0SW5mby5jb2RhYmxlKCkuZGF0YSgnY21FZGl0b3InKS5zYXZlKCk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBsYXlvdXRJbmZvXG5cdFx0ICogQHJldHVybiB7Qm9vbGVhbn1cblx0XHQgKi9cblx0XHR0aGlzLmlzQWN0aXZhdGVkID0gZnVuY3Rpb24gKGxheW91dEluZm8pIHtcblx0XHRcdHZhciAkZWRpdG9yID0gbGF5b3V0SW5mby5lZGl0b3IoKTtcblx0XHRcdHJldHVybiAkZWRpdG9yLmhhc0NsYXNzKCdjb2RldmlldycpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiB0b2dnbGUgY29kZXZpZXdcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBsYXlvdXRJbmZvXG5cdFx0ICovXG5cdFx0dGhpcy50b2dnbGUgPSBmdW5jdGlvbiAobGF5b3V0SW5mbykge1xuXHRcdFx0aWYgKHRoaXMuaXNBY3RpdmF0ZWQobGF5b3V0SW5mbykpIHtcblx0XHRcdFx0dGhpcy5kZWFjdGl2YXRlKGxheW91dEluZm8pO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5hY3RpdmF0ZShsYXlvdXRJbmZvKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogYWN0aXZhdGUgY29kZSB2aWV3XG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gbGF5b3V0SW5mb1xuXHRcdCAqL1xuXHRcdHRoaXMuYWN0aXZhdGUgPSBmdW5jdGlvbiAobGF5b3V0SW5mbykge1xuXHRcdFx0dmFyICRlZGl0b3IgPSBsYXlvdXRJbmZvLmVkaXRvcigpLFxuXHRcdFx0XHQkdG9vbGJhciA9IGxheW91dEluZm8udG9vbGJhcigpLFxuXHRcdFx0XHQkZWRpdGFibGUgPSBsYXlvdXRJbmZvLmVkaXRhYmxlKCksXG5cdFx0XHRcdCRjb2RhYmxlID0gbGF5b3V0SW5mby5jb2RhYmxlKCksXG5cdFx0XHRcdCRwb3BvdmVyID0gbGF5b3V0SW5mby5wb3BvdmVyKCksXG5cdFx0XHRcdCRoYW5kbGUgPSBsYXlvdXRJbmZvLmhhbmRsZSgpO1xuXG5cdFx0XHR2YXIgb3B0aW9ucyA9ICRlZGl0b3IuZGF0YSgnb3B0aW9ucycpO1xuXG5cdFx0XHQkY29kYWJsZS52YWwoZG9tLmh0bWwoJGVkaXRhYmxlLCBvcHRpb25zLnByZXR0aWZ5SHRtbCkpO1xuXG4gICAgICAgICAgICAvLyB1bmNvbW1lbnQgc2NyaXB0IHRhZ3Mgc28gdGhleSdyZSBjb3JyZWN0IGluIGNvZGUgdmlld1xuXHRcdFx0JGNvZGFibGUudmFsKCRjb2RhYmxlLnZhbCgpLnJlcGxhY2UoJzwhLS08c2NyaXB0JywgJzxzY3JpcHQnKSk7XHJcblx0XHRcdCRjb2RhYmxlLnZhbCgkY29kYWJsZS52YWwoKS5yZXBsYWNlKCc8L3NjcmlwdD4tLT4nLCAnPC9zY3JpcHQ+JykpO1xuXG5cdFx0XHQkY29kYWJsZS5oZWlnaHQoJGVkaXRhYmxlLmhlaWdodCgpKTtcblxuXHRcdFx0aGFuZGxlci5pbnZva2UoJ3Rvb2xiYXIudXBkYXRlQ29kZXZpZXcnLCAkdG9vbGJhciwgdHJ1ZSk7XG5cdFx0XHRoYW5kbGVyLmludm9rZSgncG9wb3Zlci5oaWRlJywgJHBvcG92ZXIpO1xuXHRcdFx0aGFuZGxlci5pbnZva2UoJ2hhbmRsZS5oaWRlJywgJGhhbmRsZSk7XG5cblx0XHRcdCRlZGl0b3IuYWRkQ2xhc3MoJ2NvZGV2aWV3Jyk7XG5cblx0XHRcdCRjb2RhYmxlLmZvY3VzKCk7XG5cblx0XHRcdC8vIGFjdGl2YXRlIENvZGVNaXJyb3IgYXMgY29kYWJsZVxuXHRcdFx0aWYgKGFnZW50Lmhhc0NvZGVNaXJyb3IpIHtcblx0XHRcdFx0dmFyIGNtRWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoJGNvZGFibGVbMF0sIG9wdGlvbnMuY29kZW1pcnJvcik7XG5cblx0XHRcdFx0Ly8gQ29kZU1pcnJvciBUZXJuU2VydmVyXG5cdFx0XHRcdGlmIChvcHRpb25zLmNvZGVtaXJyb3IudGVybikge1xuXHRcdFx0XHRcdHZhciBzZXJ2ZXIgPSBuZXcgQ29kZU1pcnJvci5UZXJuU2VydmVyKG9wdGlvbnMuY29kZW1pcnJvci50ZXJuKTtcblx0XHRcdFx0XHRjbUVkaXRvci50ZXJuU2VydmVyID0gc2VydmVyO1xuXHRcdFx0XHRcdGNtRWRpdG9yLm9uKCdjdXJzb3JBY3Rpdml0eScsIGZ1bmN0aW9uIChjbSkge1xuXHRcdFx0XHRcdFx0c2VydmVyLnVwZGF0ZUFyZ0hpbnRzKGNtKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIENvZGVNaXJyb3IgaGFzbid0IFBhZGRpbmcuXG5cdFx0XHRcdGNtRWRpdG9yLnNldFNpemUobnVsbCwgJGVkaXRhYmxlLm91dGVySGVpZ2h0KCkpO1xuXHRcdFx0XHQkY29kYWJsZS5kYXRhKCdjbUVkaXRvcicsIGNtRWRpdG9yKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogZGVhY3RpdmF0ZSBjb2RlIHZpZXdcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBsYXlvdXRJbmZvXG5cdFx0ICovXG5cdFx0dGhpcy5kZWFjdGl2YXRlID0gZnVuY3Rpb24gKGxheW91dEluZm8pIHtcblx0XHRcdHZhciAkZWRpdG9yID0gbGF5b3V0SW5mby5lZGl0b3IoKSxcblx0XHRcdFx0JHRvb2xiYXIgPSBsYXlvdXRJbmZvLnRvb2xiYXIoKSxcblx0XHRcdFx0JGVkaXRhYmxlID0gbGF5b3V0SW5mby5lZGl0YWJsZSgpLFxuXHRcdFx0XHQkY29kYWJsZSA9IGxheW91dEluZm8uY29kYWJsZSgpO1xuXG5cdFx0XHR2YXIgb3B0aW9ucyA9ICRlZGl0b3IuZGF0YSgnb3B0aW9ucycpO1xuXG5cdFx0XHQvLyBkZWFjdGl2YXRlIENvZGVNaXJyb3IgYXMgY29kYWJsZVxuXHRcdFx0aWYgKGFnZW50Lmhhc0NvZGVNaXJyb3IpIHtcblx0XHRcdFx0dmFyIGNtRWRpdG9yID0gJGNvZGFibGUuZGF0YSgnY21FZGl0b3InKTtcblx0XHRcdFx0JGNvZGFibGUudmFsKGNtRWRpdG9yLmdldFZhbHVlKCkpO1xuXHRcdFx0XHRjbUVkaXRvci50b1RleHRBcmVhKCk7XG5cdFx0XHR9XG5cblx0XHRcdCRlZGl0YWJsZS5odG1sKGRvbS52YWx1ZSgkY29kYWJsZSwgb3B0aW9ucy5wcmV0dGlmeUh0bWwpIHx8IGRvbS5lbXB0eVBhcmEpO1xuXG5cdFx0ICAgIC8vIHJlcGxhY2Ugc2NyaXB0IHRhZ3Mgc28gdGhleSdyZSBub3QgZXhlY3V0ZWQgd2hlbiBsb2FkZWQgaW4gYWRtaW5cblx0XHRcdHZhciBjb2RlVG9SZXBsYWNlID0gJGVkaXRhYmxlLmh0bWwoKTtcclxuXHJcblx0XHRcdGNvZGVUb1JlcGxhY2UgPSBjb2RlVG9SZXBsYWNlLnJlcGxhY2UoJzxzY3JpcHQnLCAnPCEtLTxzY3JpcHQnKTtcclxuXHRcdFx0Y29kZVRvUmVwbGFjZSA9IGNvZGVUb1JlcGxhY2UucmVwbGFjZSgnPC9zY3JpcHQ+JywgJzwvc2NyaXB0Pi0tPicpO1xyXG5cclxuXHRcdFx0JGVkaXRhYmxlLmh0bWwoY29kZVRvUmVwbGFjZSk7XG5cblx0XHRcdCRlZGl0YWJsZS5oZWlnaHQob3B0aW9ucy5oZWlnaHQgPyAkY29kYWJsZS5oZWlnaHQoKSA6ICdhdXRvJyk7XG5cdFx0XHQkZWRpdG9yLnJlbW92ZUNsYXNzKCdjb2RldmlldycpO1xuXG5cdFx0XHQkZWRpdGFibGUuZm9jdXMoKTtcblxuXHRcdFx0aGFuZGxlci5pbnZva2UoJ3Rvb2xiYXIudXBkYXRlQ29kZXZpZXcnLCAkdG9vbGJhciwgZmFsc2UpO1xuXG4gICAgICAgICAgICB3aW5kb3cuc3RvcCgpO1xuXHRcdH07XG5cdH07XG5cblx0dmFyIERyYWdBbmREcm9wID0gZnVuY3Rpb24gKGhhbmRsZXIpIHtcblx0XHR2YXIgJGRvY3VtZW50ID0gJChkb2N1bWVudCk7XG5cblx0XHQvKipcblx0XHQgKiBhdHRhY2ggRHJhZyBhbmQgRHJvcCBFdmVudHNcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBsYXlvdXRJbmZvIC0gbGF5b3V0IEluZm9ybWF0aW9uc1xuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG5cdFx0ICovXG5cdFx0dGhpcy5hdHRhY2ggPSBmdW5jdGlvbiAobGF5b3V0SW5mbywgb3B0aW9ucykge1xuXHRcdFx0aWYgKG9wdGlvbnMuYWlyTW9kZSB8fCBvcHRpb25zLmRpc2FibGVEcmFnQW5kRHJvcCkge1xuXHRcdFx0XHQvLyBwcmV2ZW50IGRlZmF1bHQgZHJvcCBldmVudFxuXHRcdFx0XHQkZG9jdW1lbnQub24oJ2Ryb3AnLCBmdW5jdGlvbiAoZSkge1xuXHRcdFx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGlzLmF0dGFjaERyYWdBbmREcm9wRXZlbnQobGF5b3V0SW5mbywgb3B0aW9ucyk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIGF0dGFjaCBEcmFnIGFuZCBEcm9wIEV2ZW50c1xuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IGxheW91dEluZm8gLSBsYXlvdXQgSW5mb3JtYXRpb25zXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcblx0XHQgKi9cblx0XHR0aGlzLmF0dGFjaERyYWdBbmREcm9wRXZlbnQgPSBmdW5jdGlvbiAobGF5b3V0SW5mbywgb3B0aW9ucykge1xuXHRcdFx0dmFyIGNvbGxlY3Rpb24gPSAkKCksXG5cdFx0XHRcdCRlZGl0b3IgPSBsYXlvdXRJbmZvLmVkaXRvcigpLFxuXHRcdFx0XHQkZHJvcHpvbmUgPSBsYXlvdXRJbmZvLmRyb3B6b25lKCksXG5cdFx0XHRcdCRkcm9wem9uZU1lc3NhZ2UgPSAkZHJvcHpvbmUuZmluZCgnLm5vdGUtZHJvcHpvbmUtbWVzc2FnZScpO1xuXG5cdFx0XHQvLyBzaG93IGRyb3B6b25lIG9uIGRyYWdlbnRlciB3aGVuIGRyYWdnaW5nIGEgb2JqZWN0IHRvIGRvY3VtZW50XG5cdFx0XHQvLyAtYnV0IG9ubHkgaWYgdGhlIGVkaXRvciBpcyB2aXNpYmxlLCBpLmUuIGhhcyBhIHBvc2l0aXZlIHdpZHRoIGFuZCBoZWlnaHRcblx0XHRcdCRkb2N1bWVudC5vbignZHJhZ2VudGVyJywgZnVuY3Rpb24gKGUpIHtcblx0XHRcdFx0dmFyIGlzQ29kZXZpZXcgPSBoYW5kbGVyLmludm9rZSgnY29kZXZpZXcuaXNBY3RpdmF0ZWQnLCBsYXlvdXRJbmZvKTtcblx0XHRcdFx0dmFyIGhhc0VkaXRvclNpemUgPSAkZWRpdG9yLndpZHRoKCkgPiAwICYmICRlZGl0b3IuaGVpZ2h0KCkgPiAwO1xuXHRcdFx0XHRpZiAoIWlzQ29kZXZpZXcgJiYgIWNvbGxlY3Rpb24ubGVuZ3RoICYmIGhhc0VkaXRvclNpemUpIHtcblx0XHRcdFx0XHQkZWRpdG9yLmFkZENsYXNzKCdkcmFnb3ZlcicpO1xuXHRcdFx0XHRcdCRkcm9wem9uZS53aWR0aCgkZWRpdG9yLndpZHRoKCkpO1xuXHRcdFx0XHRcdCRkcm9wem9uZS5oZWlnaHQoJGVkaXRvci5oZWlnaHQoKSk7XG5cdFx0XHRcdFx0JGRyb3B6b25lTWVzc2FnZS50ZXh0KG9wdGlvbnMubGFuZ0luZm8uaW1hZ2UuZHJhZ0ltYWdlSGVyZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29sbGVjdGlvbiA9IGNvbGxlY3Rpb24uYWRkKGUudGFyZ2V0KTtcblx0XHRcdH0pLm9uKCdkcmFnbGVhdmUnLCBmdW5jdGlvbiAoZSkge1xuXHRcdFx0XHRjb2xsZWN0aW9uID0gY29sbGVjdGlvbi5ub3QoZS50YXJnZXQpO1xuXHRcdFx0XHRpZiAoIWNvbGxlY3Rpb24ubGVuZ3RoKSB7XG5cdFx0XHRcdFx0JGVkaXRvci5yZW1vdmVDbGFzcygnZHJhZ292ZXInKTtcblx0XHRcdFx0fVxuXHRcdFx0fSkub24oJ2Ryb3AnLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdGNvbGxlY3Rpb24gPSAkKCk7XG5cdFx0XHRcdCRlZGl0b3IucmVtb3ZlQ2xhc3MoJ2RyYWdvdmVyJyk7XG5cdFx0XHR9KTtcblxuXHRcdFx0Ly8gY2hhbmdlIGRyb3B6b25lJ3MgbWVzc2FnZSBvbiBob3Zlci5cblx0XHRcdCRkcm9wem9uZS5vbignZHJhZ2VudGVyJywgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHQkZHJvcHpvbmUuYWRkQ2xhc3MoJ2hvdmVyJyk7XG5cdFx0XHRcdCRkcm9wem9uZU1lc3NhZ2UudGV4dChvcHRpb25zLmxhbmdJbmZvLmltYWdlLmRyb3BJbWFnZSk7XG5cdFx0XHR9KS5vbignZHJhZ2xlYXZlJywgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHQkZHJvcHpvbmUucmVtb3ZlQ2xhc3MoJ2hvdmVyJyk7XG5cdFx0XHRcdCRkcm9wem9uZU1lc3NhZ2UudGV4dChvcHRpb25zLmxhbmdJbmZvLmltYWdlLmRyYWdJbWFnZUhlcmUpO1xuXHRcdFx0fSk7XG5cblx0XHRcdC8vIGF0dGFjaCBkcm9wSW1hZ2Vcblx0XHRcdCRkcm9wem9uZS5vbignZHJvcCcsIGZ1bmN0aW9uIChldmVudCkge1xuXHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG5cdFx0XHRcdHZhciBkYXRhVHJhbnNmZXIgPSBldmVudC5vcmlnaW5hbEV2ZW50LmRhdGFUcmFuc2Zlcjtcblx0XHRcdFx0dmFyIGh0bWwgPSBkYXRhVHJhbnNmZXIuZ2V0RGF0YSgndGV4dC9odG1sJyk7XG5cdFx0XHRcdHZhciB0ZXh0ID0gZGF0YVRyYW5zZmVyLmdldERhdGEoJ3RleHQvcGxhaW4nKTtcblxuXHRcdFx0XHR2YXIgbGF5b3V0SW5mbyA9IGRvbS5tYWtlTGF5b3V0SW5mbyhldmVudC5jdXJyZW50VGFyZ2V0IHx8IGV2ZW50LnRhcmdldCk7XG5cblx0XHRcdFx0aWYgKGRhdGFUcmFuc2ZlciAmJiBkYXRhVHJhbnNmZXIuZmlsZXMgJiYgZGF0YVRyYW5zZmVyLmZpbGVzLmxlbmd0aCkge1xuXHRcdFx0XHRcdGxheW91dEluZm8uZWRpdGFibGUoKS5mb2N1cygpO1xuXHRcdFx0XHRcdGhhbmRsZXIuaW5zZXJ0SW1hZ2VzKGxheW91dEluZm8sIGRhdGFUcmFuc2Zlci5maWxlcyk7XG5cdFx0XHRcdH0gZWxzZSBpZiAoaHRtbCkge1xuXHRcdFx0XHRcdCQoaHRtbCkuZWFjaChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRsYXlvdXRJbmZvLmVkaXRhYmxlKCkuZm9jdXMoKTtcblx0XHRcdFx0XHRcdGhhbmRsZXIuaW52b2tlKCdlZGl0b3IuaW5zZXJ0Tm9kZScsIGxheW91dEluZm8uZWRpdGFibGUoKSwgdGhpcyk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0gZWxzZSBpZiAodGV4dCkge1xuXHRcdFx0XHRcdGxheW91dEluZm8uZWRpdGFibGUoKS5mb2N1cygpO1xuXHRcdFx0XHRcdGhhbmRsZXIuaW52b2tlKCdlZGl0b3IuaW5zZXJ0VGV4dCcsIGxheW91dEluZm8uZWRpdGFibGUoKSwgdGV4dCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pLm9uKCdkcmFnb3ZlcicsIGZhbHNlKTsgLy8gcHJldmVudCBkZWZhdWx0IGRyYWdvdmVyIGV2ZW50XG5cdFx0fTtcblx0fTtcblxuXHR2YXIgQ2xpcGJvYXJkID0gZnVuY3Rpb24gKGhhbmRsZXIpIHtcblxuXHRcdHRoaXMuYXR0YWNoID0gZnVuY3Rpb24gKGxheW91dEluZm8pIHtcblx0XHRcdGxheW91dEluZm8uZWRpdGFibGUoKS5vbigncGFzdGUnLCBoUGFzdGVDbGlwYm9hcmRJbWFnZSk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIHBhc3RlIGNsaXBib2FyZCBpbWFnZVxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtFdmVudH0gZXZlbnRcblx0XHQgKi9cblx0XHR2YXIgaFBhc3RlQ2xpcGJvYXJkSW1hZ2UgPSBmdW5jdGlvbiAoZXZlbnQpIHtcblx0XHRcdHZhciBjbGlwYm9hcmREYXRhID0gZXZlbnQub3JpZ2luYWxFdmVudC5jbGlwYm9hcmREYXRhO1xuXHRcdFx0dmFyIGxheW91dEluZm8gPSBkb20ubWFrZUxheW91dEluZm8oZXZlbnQuY3VycmVudFRhcmdldCB8fCBldmVudC50YXJnZXQpO1xuXHRcdFx0dmFyICRlZGl0YWJsZSA9IGxheW91dEluZm8uZWRpdGFibGUoKTtcblxuXHRcdFx0aWYgKCFjbGlwYm9hcmREYXRhIHx8ICFjbGlwYm9hcmREYXRhLml0ZW1zIHx8ICFjbGlwYm9hcmREYXRhLml0ZW1zLmxlbmd0aCkge1xuXHRcdFx0XHR2YXIgY2FsbGJhY2tzID0gJGVkaXRhYmxlLmRhdGEoJ2NhbGxiYWNrcycpO1xuXHRcdFx0XHQvLyBvbmx5IGNhbiBydW4gaWYgaXQgaGFzIG9uSW1hZ2VVcGxvYWQgbWV0aG9kXG5cdFx0XHRcdGlmICghY2FsbGJhY2tzLm9uSW1hZ2VVcGxvYWQpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBzYXZlIGN1cnNvclxuXHRcdFx0XHRoYW5kbGVyLmludm9rZSgnZWRpdG9yLnNhdmVOb2RlJywgJGVkaXRhYmxlKTtcblx0XHRcdFx0aGFuZGxlci5pbnZva2UoJ2VkaXRvci5zYXZlUmFuZ2UnLCAkZWRpdGFibGUpO1xuXG5cdFx0XHRcdCRlZGl0YWJsZS5odG1sKCcnKTtcblxuXHRcdFx0XHRzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHR2YXIgJGltZyA9ICRlZGl0YWJsZS5maW5kKCdpbWcnKTtcblxuXHRcdFx0XHRcdC8vIGlmIGltZyBpcyBubyBpbiBjbGlwYm9hcmQsIGluc2VydCB0ZXh0IG9yIGRvbVxuXHRcdFx0XHRcdGlmICghJGltZy5sZW5ndGggfHwgJGltZ1swXS5zcmMuaW5kZXhPZignZGF0YTonKSA9PT0gLTEpIHtcblx0XHRcdFx0XHRcdHZhciBodG1sID0gJGVkaXRhYmxlLmh0bWwoKTtcblxuXHRcdFx0XHRcdFx0aGFuZGxlci5pbnZva2UoJ2VkaXRvci5yZXN0b3JlTm9kZScsICRlZGl0YWJsZSk7XG5cdFx0XHRcdFx0XHRoYW5kbGVyLmludm9rZSgnZWRpdG9yLnJlc3RvcmVSYW5nZScsICRlZGl0YWJsZSk7XG5cblx0XHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRcdC8vIGluc2VydCBub3JtYWwgZG9tIGNvZGVcblx0XHRcdFx0XHRcdFx0JChodG1sKS5lYWNoKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHQkZWRpdGFibGUuZm9jdXMoKTtcblx0XHRcdFx0XHRcdFx0XHRoYW5kbGVyLmludm9rZSgnZWRpdG9yLmluc2VydE5vZGUnLCAkZWRpdGFibGUsIHRoaXMpO1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH0gY2F0Y2ggKGV4KSB7XG5cdFx0XHRcdFx0XHRcdC8vIGluc2VydCB0ZXh0XG5cdFx0XHRcdFx0XHRcdCRlZGl0YWJsZS5mb2N1cygpO1xuXHRcdFx0XHRcdFx0XHRoYW5kbGVyLmludm9rZSgnZWRpdG9yLmluc2VydFRleHQnLCAkZWRpdGFibGUsIGh0bWwpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHZhciBkYXRhdXJpID0gJGltZ1swXS5zcmM7XG5cblx0XHRcdFx0XHR2YXIgZGF0YSA9IGF0b2IoZGF0YXVyaS5zcGxpdCgnLCcpWzFdKTtcblx0XHRcdFx0XHR2YXIgYXJyYXkgPSBuZXcgVWludDhBcnJheShkYXRhLmxlbmd0aCk7XG5cdFx0XHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0XHRhcnJheVtpXSA9IGRhdGEuY2hhckNvZGVBdChpKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR2YXIgYmxvYiA9IG5ldyBCbG9iKFthcnJheV0sIHsgdHlwZTogJ2ltYWdlL3BuZycgfSk7XG5cdFx0XHRcdFx0YmxvYi5uYW1lID0gJ2NsaXBib2FyZC5wbmcnO1xuXG5cdFx0XHRcdFx0aGFuZGxlci5pbnZva2UoJ2VkaXRvci5yZXN0b3JlTm9kZScsICRlZGl0YWJsZSk7XG5cdFx0XHRcdFx0aGFuZGxlci5pbnZva2UoJ2VkaXRvci5yZXN0b3JlUmFuZ2UnLCAkZWRpdGFibGUpO1xuXHRcdFx0XHRcdGhhbmRsZXIuaW5zZXJ0SW1hZ2VzKGxheW91dEluZm8sIFtibG9iXSk7XG5cblx0XHRcdFx0XHRoYW5kbGVyLmludm9rZSgnZWRpdG9yLmFmdGVyQ29tbWFuZCcsICRlZGl0YWJsZSk7XG5cdFx0XHRcdH0sIDApO1xuXG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0dmFyIGl0ZW0gPSBsaXN0LmhlYWQoY2xpcGJvYXJkRGF0YS5pdGVtcyk7XG5cdFx0XHR2YXIgaXNDbGlwYm9hcmRJbWFnZSA9IGl0ZW0ua2luZCA9PT0gJ2ZpbGUnICYmIGl0ZW0udHlwZS5pbmRleE9mKCdpbWFnZS8nKSAhPT0gLTE7XG5cblx0XHRcdGlmIChpc0NsaXBib2FyZEltYWdlKSB7XG5cdFx0XHRcdGhhbmRsZXIuaW5zZXJ0SW1hZ2VzKGxheW91dEluZm8sIFtpdGVtLmdldEFzRmlsZSgpXSk7XG5cdFx0XHR9XG5cblx0XHRcdGhhbmRsZXIuaW52b2tlKCdlZGl0b3IuYWZ0ZXJDb21tYW5kJywgJGVkaXRhYmxlKTtcblx0XHR9O1xuXHR9O1xuXG5cdHZhciBMaW5rRGlhbG9nID0gZnVuY3Rpb24gKGhhbmRsZXIpIHtcblxuXHRcdC8qKlxuXHRcdCAqIHRvZ2dsZSBidXR0b24gc3RhdHVzXG5cdFx0ICpcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkYnRuXG5cdFx0ICogQHBhcmFtIHtCb29sZWFufSBpc0VuYWJsZVxuXHRcdCAqL1xuXHRcdHZhciB0b2dnbGVCdG4gPSBmdW5jdGlvbiAoJGJ0biwgaXNFbmFibGUpIHtcblx0XHRcdCRidG4udG9nZ2xlQ2xhc3MoJ2Rpc2FibGVkJywgIWlzRW5hYmxlKTtcblx0XHRcdCRidG4uYXR0cignZGlzYWJsZWQnLCAhaXNFbmFibGUpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBTaG93IGxpbmsgZGlhbG9nIGFuZCBzZXQgZXZlbnQgaGFuZGxlcnMgb24gZGlhbG9nIGNvbnRyb2xzLlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRlZGl0YWJsZVxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkZGlhbG9nXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IGxpbmtJbmZvXG5cdFx0ICogQHJldHVybiB7UHJvbWlzZX1cblx0XHQgKi9cblx0XHR0aGlzLnNob3dMaW5rRGlhbG9nID0gZnVuY3Rpb24gKCRlZGl0YWJsZSwgJGRpYWxvZywgbGlua0luZm8pIHtcblx0XHRcdHJldHVybiAkLkRlZmVycmVkKGZ1bmN0aW9uIChkZWZlcnJlZCkge1xuXHRcdFx0XHR2YXIgJGxpbmtEaWFsb2cgPSAkZGlhbG9nLmZpbmQoJy5ub3RlLWxpbmstZGlhbG9nJyk7XG5cblx0XHRcdFx0dmFyICRsaW5rVGV4dCA9ICRsaW5rRGlhbG9nLmZpbmQoJy5ub3RlLWxpbmstdGV4dCcpLFxuXHRcdFx0XHQkbGlua1VybCA9ICRsaW5rRGlhbG9nLmZpbmQoJy5ub3RlLWxpbmstdXJsJyksXG5cdFx0XHRcdCRsaW5rQnRuID0gJGxpbmtEaWFsb2cuZmluZCgnLm5vdGUtbGluay1idG4nKSxcblx0XHRcdFx0JG9wZW5Jbk5ld1dpbmRvdyA9ICRsaW5rRGlhbG9nLmZpbmQoJ2lucHV0W3R5cGU9Y2hlY2tib3hdJyk7XG5cblx0XHRcdFx0JGxpbmtEaWFsb2cub25lKCdzaG93bi5icy5tb2RhbCcsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHQkbGlua1RleHQudmFsKGxpbmtJbmZvLnRleHQpO1xuXG5cdFx0XHRcdFx0JGxpbmtUZXh0Lm9uKCdpbnB1dCcsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdC8vIGlmIGxpbmt0ZXh0IHdhcyBtb2RpZmllZCBieSBrZXl1cCxcblx0XHRcdFx0XHRcdC8vIHN0b3AgY2xvbmluZyB0ZXh0IGZyb20gbGlua1VybFxuXHRcdFx0XHRcdFx0bGlua0luZm8udGV4dCA9ICRsaW5rVGV4dC52YWwoKTtcblx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHRcdC8vIGlmIG5vIHVybCB3YXMgZ2l2ZW4sIGNvcHkgdGV4dCB0byB1cmxcblx0XHRcdFx0XHRpZiAoIWxpbmtJbmZvLnVybCkge1xuXHRcdFx0XHRcdFx0bGlua0luZm8udXJsID0gbGlua0luZm8udGV4dDtcblx0XHRcdFx0XHRcdHRvZ2dsZUJ0bigkbGlua0J0biwgbGlua0luZm8udGV4dCk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0JGxpbmtVcmwub24oJ2lucHV0JywgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0dG9nZ2xlQnRuKCRsaW5rQnRuLCAkbGlua1VybC52YWwoKSk7XG5cdFx0XHRcdFx0XHQvLyBkaXNwbGF5IHNhbWUgbGluayBvbiBgVGV4dCB0byBkaXNwbGF5YCBpbnB1dFxuXHRcdFx0XHRcdFx0Ly8gd2hlbiBjcmVhdGUgYSBuZXcgbGlua1xuXHRcdFx0XHRcdFx0aWYgKCFsaW5rSW5mby50ZXh0KSB7XG5cdFx0XHRcdFx0XHRcdCRsaW5rVGV4dC52YWwoJGxpbmtVcmwudmFsKCkpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pLnZhbChsaW5rSW5mby51cmwpLnRyaWdnZXIoJ2ZvY3VzJykudHJpZ2dlcignc2VsZWN0Jyk7XG5cblx0XHRcdFx0XHQkb3BlbkluTmV3V2luZG93LnByb3AoJ2NoZWNrZWQnLCBsaW5rSW5mby5uZXdXaW5kb3cpO1xuXG5cdFx0XHRcdFx0JGxpbmtCdG4ub25lKCdjbGljaycsIGZ1bmN0aW9uIChldmVudCkge1xuXHRcdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuXHRcdFx0XHRcdFx0ZGVmZXJyZWQucmVzb2x2ZSh7XG5cdFx0XHRcdFx0XHRcdHJhbmdlOiBsaW5rSW5mby5yYW5nZSxcblx0XHRcdFx0XHRcdFx0dXJsOiAkbGlua1VybC52YWwoKSxcblx0XHRcdFx0XHRcdFx0dGV4dDogJGxpbmtUZXh0LnZhbCgpLFxuXHRcdFx0XHRcdFx0XHRuZXdXaW5kb3c6ICRvcGVuSW5OZXdXaW5kb3cuaXMoJzpjaGVja2VkJylcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0JGxpbmtEaWFsb2cubW9kYWwoJ2hpZGUnKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSkub25lKCdoaWRkZW4uYnMubW9kYWwnLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0Ly8gZGV0YWNoIGV2ZW50c1xuXHRcdFx0XHRcdCRsaW5rVGV4dC5vZmYoJ2lucHV0Jyk7XG5cdFx0XHRcdFx0JGxpbmtVcmwub2ZmKCdpbnB1dCcpO1xuXHRcdFx0XHRcdCRsaW5rQnRuLm9mZignY2xpY2snKTtcblxuXHRcdFx0XHRcdGlmIChkZWZlcnJlZC5zdGF0ZSgpID09PSAncGVuZGluZycpIHtcblx0XHRcdFx0XHRcdGRlZmVycmVkLnJlamVjdCgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSkubW9kYWwoJ3Nob3cnKTtcblx0XHRcdH0pLnByb21pc2UoKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IGxheW91dEluZm9cblx0XHQgKi9cblx0XHR0aGlzLnNob3cgPSBmdW5jdGlvbiAobGF5b3V0SW5mbykge1xuXHRcdFx0dmFyICRlZGl0b3IgPSBsYXlvdXRJbmZvLmVkaXRvcigpLFxuXHRcdFx0XHQkZGlhbG9nID0gbGF5b3V0SW5mby5kaWFsb2coKSxcblx0XHRcdFx0JGVkaXRhYmxlID0gbGF5b3V0SW5mby5lZGl0YWJsZSgpLFxuXHRcdFx0XHQkcG9wb3ZlciA9IGxheW91dEluZm8ucG9wb3ZlcigpLFxuXHRcdFx0XHRsaW5rSW5mbyA9IGhhbmRsZXIuaW52b2tlKCdlZGl0b3IuZ2V0TGlua0luZm8nLCAkZWRpdGFibGUpO1xuXG5cdFx0XHR2YXIgb3B0aW9ucyA9ICRlZGl0b3IuZGF0YSgnb3B0aW9ucycpO1xuXG5cdFx0XHRoYW5kbGVyLmludm9rZSgnZWRpdG9yLnNhdmVSYW5nZScsICRlZGl0YWJsZSk7XG5cdFx0XHR0aGlzLnNob3dMaW5rRGlhbG9nKCRlZGl0YWJsZSwgJGRpYWxvZywgbGlua0luZm8pLnRoZW4oZnVuY3Rpb24gKGxpbmtJbmZvKSB7XG5cdFx0XHRcdGhhbmRsZXIuaW52b2tlKCdlZGl0b3IucmVzdG9yZVJhbmdlJywgJGVkaXRhYmxlKTtcblx0XHRcdFx0aGFuZGxlci5pbnZva2UoJ2VkaXRvci5jcmVhdGVMaW5rJywgJGVkaXRhYmxlLCBsaW5rSW5mbywgb3B0aW9ucyk7XG5cdFx0XHRcdC8vIGhpZGUgcG9wb3ZlciBhZnRlciBjcmVhdGluZyBsaW5rXG5cdFx0XHRcdGhhbmRsZXIuaW52b2tlKCdwb3BvdmVyLmhpZGUnLCAkcG9wb3Zlcik7XG5cdFx0XHR9KS5mYWlsKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0aGFuZGxlci5pbnZva2UoJ2VkaXRvci5yZXN0b3JlUmFuZ2UnLCAkZWRpdGFibGUpO1xuXHRcdFx0fSk7XG5cdFx0fTtcblx0fTtcblxuXHR2YXIgSW1hZ2VEaWFsb2cgPSBmdW5jdGlvbiAoaGFuZGxlcikge1xuXHRcdC8qKlxuXHRcdCAqIHRvZ2dsZSBidXR0b24gc3RhdHVzXG5cdFx0ICpcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkYnRuXG5cdFx0ICogQHBhcmFtIHtCb29sZWFufSBpc0VuYWJsZVxuXHRcdCAqL1xuXHRcdHZhciB0b2dnbGVCdG4gPSBmdW5jdGlvbiAoJGJ0biwgaXNFbmFibGUpIHtcblx0XHRcdCRidG4udG9nZ2xlQ2xhc3MoJ2Rpc2FibGVkJywgIWlzRW5hYmxlKTtcblx0XHRcdCRidG4uYXR0cignZGlzYWJsZWQnLCAhaXNFbmFibGUpO1xuXHRcdH07XG5cblx0XHR0aGlzLnNob3cgPSBmdW5jdGlvbiAobGF5b3V0SW5mbykge1xuXHRcdFx0dmFyICRkaWFsb2cgPSBsYXlvdXRJbmZvLmRpYWxvZygpLFxuXHRcdFx0XHQkZWRpdGFibGUgPSBsYXlvdXRJbmZvLmVkaXRhYmxlKCk7XG5cblx0XHRcdGhhbmRsZXIuaW52b2tlKCdlZGl0b3Iuc2F2ZVJhbmdlJywgJGVkaXRhYmxlKTtcblx0XHRcdHRoaXMuc2hvd0ltYWdlRGlhbG9nKCRlZGl0YWJsZSwgJGRpYWxvZykudGhlbihmdW5jdGlvbiAoZGF0YSkge1xuXHRcdFx0XHRoYW5kbGVyLmludm9rZSgnZWRpdG9yLnJlc3RvcmVSYW5nZScsICRlZGl0YWJsZSk7XG5cblx0XHRcdFx0aWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuXHRcdFx0XHRcdC8vIGltYWdlIHVybFxuXHRcdFx0XHRcdGhhbmRsZXIuaW52b2tlKCdlZGl0b3IuaW5zZXJ0SW1hZ2UnLCAkZWRpdGFibGUsIGRhdGEpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIGFycmF5IG9mIGZpbGVzXG5cdFx0XHRcdFx0aGFuZGxlci5pbnNlcnRJbWFnZXMobGF5b3V0SW5mbywgZGF0YSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pLmZhaWwoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRoYW5kbGVyLmludm9rZSgnZWRpdG9yLnJlc3RvcmVSYW5nZScsICRlZGl0YWJsZSk7XG5cdFx0XHR9KTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogc2hvdyBpbWFnZSBkaWFsb2dcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkZWRpdGFibGVcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGRpYWxvZ1xuXHRcdCAqIEByZXR1cm4ge1Byb21pc2V9XG5cdFx0ICovXG5cdFx0dGhpcy5zaG93SW1hZ2VEaWFsb2cgPSBmdW5jdGlvbiAoJGVkaXRhYmxlLCAkZGlhbG9nKSB7XG5cdFx0XHRyZXR1cm4gJC5EZWZlcnJlZChmdW5jdGlvbiAoZGVmZXJyZWQpIHtcblx0XHRcdFx0dmFyICRpbWFnZURpYWxvZyA9ICRkaWFsb2cuZmluZCgnLm5vdGUtaW1hZ2UtZGlhbG9nJyk7XG5cblx0XHRcdFx0dmFyICRpbWFnZUlucHV0ID0gJGRpYWxvZy5maW5kKCcubm90ZS1pbWFnZS1pbnB1dCcpLFxuXHRcdFx0XHRcdCRpbWFnZVVybCA9ICRkaWFsb2cuZmluZCgnLm5vdGUtaW1hZ2UtdXJsJyksXG5cdFx0XHRcdFx0JGltYWdlQnRuID0gJGRpYWxvZy5maW5kKCcubm90ZS1pbWFnZS1idG4nKTtcblxuXHRcdFx0XHQkaW1hZ2VEaWFsb2cub25lKCdzaG93bi5icy5tb2RhbCcsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHQvLyBDbG9uaW5nIGltYWdlSW5wdXQgdG8gY2xlYXIgZWxlbWVudC5cblx0XHRcdFx0XHQkaW1hZ2VJbnB1dC5yZXBsYWNlV2l0aCgkaW1hZ2VJbnB1dC5jbG9uZSgpXG5cdFx0XHRcdFx0ICAub24oJ2NoYW5nZScsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHQgIFx0ZGVmZXJyZWQucmVzb2x2ZSh0aGlzLmZpbGVzIHx8IHRoaXMudmFsdWUpO1xuXHRcdFx0XHRcdCAgXHQkaW1hZ2VEaWFsb2cubW9kYWwoJ2hpZGUnKTtcblx0XHRcdFx0XHQgIH0pXG5cdFx0XHRcdFx0ICAudmFsKCcnKVxuXHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHQkaW1hZ2VCdG4uY2xpY2soZnVuY3Rpb24gKGV2ZW50KSB7XG5cdFx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG5cdFx0XHRcdFx0XHRkZWZlcnJlZC5yZXNvbHZlKCRpbWFnZVVybC52YWwoKSk7XG5cdFx0XHRcdFx0XHQkaW1hZ2VEaWFsb2cubW9kYWwoJ2hpZGUnKTtcblx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHRcdCRpbWFnZVVybC5vbigna2V5dXAgcGFzdGUnLCBmdW5jdGlvbiAoZXZlbnQpIHtcblx0XHRcdFx0XHRcdHZhciB1cmw7XG5cblx0XHRcdFx0XHRcdGlmIChldmVudC50eXBlID09PSAncGFzdGUnKSB7XG5cdFx0XHRcdFx0XHRcdHVybCA9IGV2ZW50Lm9yaWdpbmFsRXZlbnQuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0Jyk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHR1cmwgPSAkaW1hZ2VVcmwudmFsKCk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdHRvZ2dsZUJ0bigkaW1hZ2VCdG4sIHVybCk7XG5cdFx0XHRcdFx0fSkudmFsKCcnKS50cmlnZ2VyKCdmb2N1cycpO1xuXHRcdFx0XHR9KS5vbmUoJ2hpZGRlbi5icy5tb2RhbCcsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHQkaW1hZ2VJbnB1dC5vZmYoJ2NoYW5nZScpO1xuXHRcdFx0XHRcdCRpbWFnZVVybC5vZmYoJ2tleXVwIHBhc3RlJyk7XG5cdFx0XHRcdFx0JGltYWdlQnRuLm9mZignY2xpY2snKTtcblxuXHRcdFx0XHRcdGlmIChkZWZlcnJlZC5zdGF0ZSgpID09PSAncGVuZGluZycpIHtcblx0XHRcdFx0XHRcdGRlZmVycmVkLnJlamVjdCgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSkubW9kYWwoJ3Nob3cnKTtcblx0XHRcdH0pO1xuXHRcdH07XG5cdH07XG5cblx0dmFyIEhlbHBEaWFsb2cgPSBmdW5jdGlvbiAoaGFuZGxlcikge1xuXHRcdC8qKlxuXHRcdCAqIHNob3cgaGVscCBkaWFsb2dcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkZWRpdGFibGVcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGRpYWxvZ1xuXHRcdCAqIEByZXR1cm4ge1Byb21pc2V9XG5cdFx0ICovXG5cdFx0dGhpcy5zaG93SGVscERpYWxvZyA9IGZ1bmN0aW9uICgkZWRpdGFibGUsICRkaWFsb2cpIHtcblx0XHRcdHJldHVybiAkLkRlZmVycmVkKGZ1bmN0aW9uIChkZWZlcnJlZCkge1xuXHRcdFx0XHR2YXIgJGhlbHBEaWFsb2cgPSAkZGlhbG9nLmZpbmQoJy5ub3RlLWhlbHAtZGlhbG9nJyk7XG5cblx0XHRcdFx0JGhlbHBEaWFsb2cub25lKCdoaWRkZW4uYnMubW9kYWwnLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0ZGVmZXJyZWQucmVzb2x2ZSgpO1xuXHRcdFx0XHR9KS5tb2RhbCgnc2hvdycpO1xuXHRcdFx0fSkucHJvbWlzZSgpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gbGF5b3V0SW5mb1xuXHRcdCAqL1xuXHRcdHRoaXMuc2hvdyA9IGZ1bmN0aW9uIChsYXlvdXRJbmZvKSB7XG5cdFx0XHR2YXIgJGRpYWxvZyA9IGxheW91dEluZm8uZGlhbG9nKCksXG5cdFx0XHRcdCRlZGl0YWJsZSA9IGxheW91dEluZm8uZWRpdGFibGUoKTtcblxuXHRcdFx0aGFuZGxlci5pbnZva2UoJ2VkaXRvci5zYXZlUmFuZ2UnLCAkZWRpdGFibGUsIHRydWUpO1xuXHRcdFx0dGhpcy5zaG93SGVscERpYWxvZygkZWRpdGFibGUsICRkaWFsb2cpLnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRoYW5kbGVyLmludm9rZSgnZWRpdG9yLnJlc3RvcmVSYW5nZScsICRlZGl0YWJsZSk7XG5cdFx0XHR9KTtcblx0XHR9O1xuXHR9O1xuXG5cblx0LyoqXG5cdCAqIEBjbGFzcyBFdmVudEhhbmRsZXJcblx0ICpcblx0ICogRXZlbnRIYW5kbGVyXG5cdCAqICAtIFRPRE86IG5ldyBpbnN0YW5jZSBwZXIgYSBlZGl0b3Jcblx0ICogIC0gVE9ETzogcmVuYW1lIEV2ZW50SGFuZGxlclxuXHQgKi9cblx0dmFyIEV2ZW50SGFuZGxlciA9IGZ1bmN0aW9uICgpIHtcblx0XHQvKipcblx0XHQgKiBNb2R1bGVzXG5cdFx0ICovXG5cdFx0dmFyIG1vZHVsZXMgPSB0aGlzLm1vZHVsZXMgPSB7XG5cdFx0XHRlZGl0b3I6IG5ldyBFZGl0b3IodGhpcyksXG5cdFx0XHR0b29sYmFyOiBuZXcgVG9vbGJhcih0aGlzKSxcblx0XHRcdHN0YXR1c2JhcjogbmV3IFN0YXR1c2Jhcih0aGlzKSxcblx0XHRcdHBvcG92ZXI6IG5ldyBQb3BvdmVyKHRoaXMpLFxuXHRcdFx0aGFuZGxlOiBuZXcgSGFuZGxlKHRoaXMpLFxuXHRcdFx0ZnVsbHNjcmVlbjogbmV3IEZ1bGxzY3JlZW4odGhpcyksXG5cdFx0XHRjb2RldmlldzogbmV3IENvZGV2aWV3KHRoaXMpLFxuXHRcdFx0ZHJhZ0FuZERyb3A6IG5ldyBEcmFnQW5kRHJvcCh0aGlzKSxcblx0XHRcdGNsaXBib2FyZDogbmV3IENsaXBib2FyZCh0aGlzKSxcblx0XHRcdGxpbmtEaWFsb2c6IG5ldyBMaW5rRGlhbG9nKHRoaXMpLFxuXHRcdFx0aW1hZ2VEaWFsb2c6IG5ldyBJbWFnZURpYWxvZyh0aGlzKSxcblx0XHRcdGhlbHBEaWFsb2c6IG5ldyBIZWxwRGlhbG9nKHRoaXMpXG5cdFx0fTtcblxuXHRcdC8vIFRPRE8gcmVmYWN0b3IgbW9kdWxlcyBhbmQgZXZlbnRIYW5kbGVyXG5cdFx0Ly8gIC0gcmVtb3ZlIHRoaXMgbWV0aG9kIGFuZCB1c2UgY3VzdG9tIGV2ZW50IGZyb20gJGhvbGRlciBpbnN0ZWFkXG5cdFx0dGhpcy5pbnZva2UgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHR2YXIgbW9kdWxlQW5kTWV0aG9kID0gbGlzdC5oZWFkKGxpc3QuZnJvbShhcmd1bWVudHMpKTtcblx0XHRcdHZhciBhcmdzID0gbGlzdC50YWlsKGxpc3QuZnJvbShhcmd1bWVudHMpKTtcblxuXHRcdFx0dmFyIHNwbGl0cyA9IG1vZHVsZUFuZE1ldGhvZC5zcGxpdCgnLicpO1xuXHRcdFx0dmFyIGhhc1NlcGFyYXRvciA9IHNwbGl0cy5sZW5ndGggPiAxO1xuXHRcdFx0dmFyIG1vZHVsZU5hbWUgPSBoYXNTZXBhcmF0b3IgJiYgbGlzdC5oZWFkKHNwbGl0cyk7XG5cdFx0XHR2YXIgbWV0aG9kTmFtZSA9IGhhc1NlcGFyYXRvciA/IGxpc3QubGFzdChzcGxpdHMpIDogbGlzdC5oZWFkKHNwbGl0cyk7XG5cblx0XHRcdHZhciBtb2R1bGUgPSB0aGlzLmdldE1vZHVsZShtb2R1bGVOYW1lKTtcblx0XHRcdHZhciBtZXRob2QgPSBtb2R1bGVbbWV0aG9kTmFtZV07XG5cblx0XHRcdHJldHVybiBtZXRob2QgJiYgbWV0aG9kLmFwcGx5KG1vZHVsZSwgYXJncyk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIHJldHVybnMgbW9kdWxlXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gbW9kdWxlTmFtZSAtIG5hbWUgb2YgbW9kdWxlXG5cdFx0ICogQHJldHVybiB7TW9kdWxlfSAtIGRlZmF1bHRzIGlzIGVkaXRvclxuXHRcdCAqL1xuXHRcdHRoaXMuZ2V0TW9kdWxlID0gZnVuY3Rpb24gKG1vZHVsZU5hbWUpIHtcblx0XHRcdHJldHVybiB0aGlzLm1vZHVsZXNbbW9kdWxlTmFtZV0gfHwgdGhpcy5tb2R1bGVzLmVkaXRvcjtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogaW5zZXJ0IEltYWdlcyBmcm9tIGZpbGUgYXJyYXkuXG5cdFx0ICpcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBsYXlvdXRJbmZvXG5cdFx0ICogQHBhcmFtIHtGaWxlW119IGZpbGVzXG5cdFx0ICovXG5cdFx0dGhpcy5pbnNlcnRJbWFnZXMgPSBmdW5jdGlvbiAobGF5b3V0SW5mbywgZmlsZXMpIHtcblx0XHRcdHZhciAkZWRpdG9yID0gbGF5b3V0SW5mby5lZGl0b3IoKSxcblx0XHRcdFx0JGVkaXRhYmxlID0gbGF5b3V0SW5mby5lZGl0YWJsZSgpLFxuXHRcdFx0XHQkaG9sZGVyID0gbGF5b3V0SW5mby5ob2xkZXIoKTtcblxuXHRcdFx0dmFyIGNhbGxiYWNrcyA9ICRlZGl0YWJsZS5kYXRhKCdjYWxsYmFja3MnKTtcblx0XHRcdHZhciBvcHRpb25zID0gJGVkaXRvci5kYXRhKCdvcHRpb25zJyk7XG5cblx0XHRcdC8vIElmIG9uSW1hZ2VVcGxvYWQgb3B0aW9ucyBzZXR0ZWRcblx0XHRcdGlmIChjYWxsYmFja3Mub25JbWFnZVVwbG9hZCkge1xuXHRcdFx0XHRjYWxsYmFja3Mub25JbWFnZVVwbG9hZChmaWxlcywgbW9kdWxlcy5lZGl0b3IsICRlZGl0YWJsZSk7XG5cdFx0XHRcdGJpbmRDdXN0b21FdmVudCgkaG9sZGVyLCAnaW1hZ2UudXBsb2FkJykoW2ZpbGVzXSk7XG5cdFx0XHRcdC8vIGVsc2UgaW5zZXJ0IEltYWdlIGFzIGRhdGFVUkxcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdCQuZWFjaChmaWxlcywgZnVuY3Rpb24gKGlkeCwgZmlsZSkge1xuXHRcdFx0XHRcdHZhciBmaWxlbmFtZSA9IGZpbGUubmFtZTtcblx0XHRcdFx0XHRpZiAob3B0aW9ucy5tYXhpbXVtSW1hZ2VGaWxlU2l6ZSAmJiBvcHRpb25zLm1heGltdW1JbWFnZUZpbGVTaXplIDwgZmlsZS5zaXplKSB7XG5cdFx0XHRcdFx0XHRpZiAoY2FsbGJhY2tzLm9uSW1hZ2VVcGxvYWRFcnJvcikge1xuXHRcdFx0XHRcdFx0XHRjYWxsYmFja3Mub25JbWFnZVVwbG9hZEVycm9yKG9wdGlvbnMubGFuZ0luZm8uaW1hZ2UubWF4aW11bUZpbGVTaXplRXJyb3IpO1xuXHRcdFx0XHRcdFx0XHRiaW5kQ3VzdG9tRXZlbnQoJGhvbGRlciwgJ2ltYWdlLnVwbG9hZC5lcnJvcicpKG9wdGlvbnMubGFuZ0luZm8uaW1hZ2UubWF4aW11bUZpbGVTaXplRXJyb3IpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0YWxlcnQob3B0aW9ucy5sYW5nSW5mby5pbWFnZS5tYXhpbXVtRmlsZVNpemVFcnJvcik7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGFzeW5jLnJlYWRGaWxlQXNEYXRhVVJMKGZpbGUpLnRoZW4oZnVuY3Rpb24gKHNEYXRhVVJMKSB7XG5cdFx0XHRcdFx0XHRcdG1vZHVsZXMuZWRpdG9yLmluc2VydEltYWdlKCRlZGl0YWJsZSwgc0RhdGFVUkwsIGZpbGVuYW1lKTtcblx0XHRcdFx0XHRcdH0pLmZhaWwoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRpZiAoY2FsbGJhY2tzLm9uSW1hZ2VVcGxvYWRFcnJvcikge1xuXHRcdFx0XHRcdFx0XHRcdGNhbGxiYWNrcy5vbkltYWdlVXBsb2FkRXJyb3IoKTtcblx0XHRcdFx0XHRcdFx0XHRiaW5kQ3VzdG9tRXZlbnQoJGhvbGRlciwgJ2ltYWdlLnVwbG9hZC5lcnJvcicpKG9wdGlvbnMubGFuZ0luZm8uaW1hZ2UubWF4aW11bUZpbGVTaXplRXJyb3IpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHR2YXIgY29tbWFuZHMgPSB7XG5cdFx0XHQvKipcblx0XHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBsYXlvdXRJbmZvXG5cdFx0XHQgKi9cblx0XHRcdHNob3dMaW5rRGlhbG9nOiBmdW5jdGlvbiAobGF5b3V0SW5mbykge1xuXHRcdFx0XHRtb2R1bGVzLmxpbmtEaWFsb2cuc2hvdyhsYXlvdXRJbmZvKTtcblx0XHRcdH0sXG5cblx0XHRcdC8qKlxuXHRcdFx0ICogQHBhcmFtIHtPYmplY3R9IGxheW91dEluZm9cblx0XHRcdCAqL1xuXHRcdFx0c2hvd0ltYWdlRGlhbG9nOiBmdW5jdGlvbiAobGF5b3V0SW5mbykge1xuXHRcdFx0XHRtb2R1bGVzLmltYWdlRGlhbG9nLnNob3cobGF5b3V0SW5mbyk7XG5cdFx0XHR9LFxuXG5cdFx0XHQvKipcblx0XHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBsYXlvdXRJbmZvXG5cdFx0XHQgKi9cblx0XHRcdHNob3dIZWxwRGlhbG9nOiBmdW5jdGlvbiAobGF5b3V0SW5mbykge1xuXHRcdFx0XHRtb2R1bGVzLmhlbHBEaWFsb2cuc2hvdyhsYXlvdXRJbmZvKTtcblx0XHRcdH0sXG5cblx0XHRcdC8qKlxuXHRcdFx0ICogQHBhcmFtIHtPYmplY3R9IGxheW91dEluZm9cblx0XHRcdCAqL1xuXHRcdFx0ZnVsbHNjcmVlbjogZnVuY3Rpb24gKGxheW91dEluZm8pIHtcblx0XHRcdFx0bW9kdWxlcy5mdWxsc2NyZWVuLnRvZ2dsZShsYXlvdXRJbmZvKTtcblx0XHRcdH0sXG5cblx0XHRcdC8qKlxuXHRcdFx0ICogQHBhcmFtIHtPYmplY3R9IGxheW91dEluZm9cblx0XHRcdCAqL1xuXHRcdFx0Y29kZXZpZXc6IGZ1bmN0aW9uIChsYXlvdXRJbmZvKSB7XG5cdFx0XHRcdG1vZHVsZXMuY29kZXZpZXcudG9nZ2xlKGxheW91dEluZm8pO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHR2YXIgaE1vdXNlZG93biA9IGZ1bmN0aW9uIChldmVudCkge1xuXHRcdFx0Ly9wcmV2ZW50RGVmYXVsdCBTZWxlY3Rpb24gZm9yIEZGLCBJRTgrXG5cdFx0XHRpZiAoZG9tLmlzSW1nKGV2ZW50LnRhcmdldCkpIHtcblx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0dmFyIGhUb29sYmFyQW5kUG9wb3ZlclVwZGF0ZSA9IGZ1bmN0aW9uIChldmVudCkge1xuXHRcdFx0Ly8gZGVsYXkgZm9yIHJhbmdlIGFmdGVyIG1vdXNldXBcblx0XHRcdHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHR2YXIgbGF5b3V0SW5mbyA9IGRvbS5tYWtlTGF5b3V0SW5mbyhldmVudC5jdXJyZW50VGFyZ2V0IHx8IGV2ZW50LnRhcmdldCk7XG5cdFx0XHRcdHZhciBzdHlsZUluZm8gPSBtb2R1bGVzLmVkaXRvci5jdXJyZW50U3R5bGUoZXZlbnQudGFyZ2V0KTtcblx0XHRcdFx0aWYgKCFzdHlsZUluZm8pIHsgcmV0dXJuOyB9XG5cblx0XHRcdFx0dmFyIGlzQWlyTW9kZSA9IGxheW91dEluZm8uZWRpdG9yKCkuZGF0YSgnb3B0aW9ucycpLmFpck1vZGU7XG5cdFx0XHRcdGlmICghaXNBaXJNb2RlKSB7XG5cdFx0XHRcdFx0bW9kdWxlcy50b29sYmFyLnVwZGF0ZShsYXlvdXRJbmZvLnRvb2xiYXIoKSwgc3R5bGVJbmZvKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdG1vZHVsZXMucG9wb3Zlci51cGRhdGUobGF5b3V0SW5mby5wb3BvdmVyKCksIHN0eWxlSW5mbywgaXNBaXJNb2RlKTtcblx0XHRcdFx0bW9kdWxlcy5oYW5kbGUudXBkYXRlKGxheW91dEluZm8uaGFuZGxlKCksIHN0eWxlSW5mbywgaXNBaXJNb2RlKTtcblx0XHRcdH0sIDApO1xuXHRcdH07XG5cblx0XHR2YXIgaFNjcm9sbCA9IGZ1bmN0aW9uIChldmVudCkge1xuXHRcdFx0dmFyIGxheW91dEluZm8gPSBkb20ubWFrZUxheW91dEluZm8oZXZlbnQuY3VycmVudFRhcmdldCB8fCBldmVudC50YXJnZXQpO1xuXHRcdFx0Ly9oaWRlIHBvcG92ZXIgYW5kIGhhbmRsZSB3aGVuIHNjcm9sbGVkXG5cdFx0XHRtb2R1bGVzLnBvcG92ZXIuaGlkZShsYXlvdXRJbmZvLnBvcG92ZXIoKSk7XG5cdFx0XHRtb2R1bGVzLmhhbmRsZS5oaWRlKGxheW91dEluZm8uaGFuZGxlKCkpO1xuXHRcdH07XG5cblx0XHR2YXIgaFRvb2xiYXJBbmRQb3BvdmVyTW91c2Vkb3duID0gZnVuY3Rpb24gKGV2ZW50KSB7XG5cdFx0XHQvLyBwcmV2ZW50IGRlZmF1bHQgZXZlbnQgd2hlbiBpbnNlcnRUYWJsZSAoRkYsIFdlYmtpdClcblx0XHRcdHZhciAkYnRuID0gJChldmVudC50YXJnZXQpLmNsb3Nlc3QoJ1tkYXRhLWV2ZW50XScpO1xuXHRcdFx0aWYgKCRidG4ubGVuZ3RoKSB7XG5cdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdHZhciBoVG9vbGJhckFuZFBvcG92ZXJDbGljayA9IGZ1bmN0aW9uIChldmVudCkge1xuXHRcdFx0dmFyICRidG4gPSAkKGV2ZW50LnRhcmdldCkuY2xvc2VzdCgnW2RhdGEtZXZlbnRdJyk7XG5cblx0XHRcdGlmICgkYnRuLmxlbmd0aCkge1xuXHRcdFx0XHR2YXIgZXZlbnROYW1lID0gJGJ0bi5hdHRyKCdkYXRhLWV2ZW50JyksXG5cdFx0XHRcdFx0dmFsdWUgPSAkYnRuLmF0dHIoJ2RhdGEtdmFsdWUnKSxcblx0XHRcdFx0XHRoaWRlID0gJGJ0bi5hdHRyKCdkYXRhLWhpZGUnKTtcblxuXHRcdFx0XHR2YXIgbGF5b3V0SW5mbyA9IGRvbS5tYWtlTGF5b3V0SW5mbyhldmVudC50YXJnZXQpO1xuXG5cdFx0XHRcdC8vIGJlZm9yZSBjb21tYW5kOiBkZXRlY3QgY29udHJvbCBzZWxlY3Rpb24gZWxlbWVudCgkdGFyZ2V0KVxuXHRcdFx0XHR2YXIgJHRhcmdldDtcblx0XHRcdFx0aWYgKCQuaW5BcnJheShldmVudE5hbWUsIFsncmVzaXplJywgJ2Zsb2F0TWUnLCAncmVtb3ZlTWVkaWEnLCAnaW1hZ2VTaGFwZSddKSAhPT0gLTEpIHtcblx0XHRcdFx0XHR2YXIgJHNlbGVjdGlvbiA9IGxheW91dEluZm8uaGFuZGxlKCkuZmluZCgnLm5vdGUtY29udHJvbC1zZWxlY3Rpb24nKTtcblx0XHRcdFx0XHQkdGFyZ2V0ID0gJCgkc2VsZWN0aW9uLmRhdGEoJ3RhcmdldCcpKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIElmIHJlcXVlc3RlZCwgaGlkZSB0aGUgcG9wb3ZlciB3aGVuIHRoZSBidXR0b24gaXMgY2xpY2tlZC5cblx0XHRcdFx0Ly8gVXNlZnVsIGZvciB0aGluZ3MgbGlrZSBzaG93SGVscERpYWxvZy5cblx0XHRcdFx0aWYgKGhpZGUpIHtcblx0XHRcdFx0XHQkYnRuLnBhcmVudHMoJy5wb3BvdmVyJykuaGlkZSgpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCQuaXNGdW5jdGlvbigkLnN1bW1lcm5vdGUucGx1Z2luRXZlbnRzW2V2ZW50TmFtZV0pKSB7XG5cdFx0XHRcdFx0JC5zdW1tZXJub3RlLnBsdWdpbkV2ZW50c1tldmVudE5hbWVdKGV2ZW50LCBtb2R1bGVzLmVkaXRvciwgbGF5b3V0SW5mbywgdmFsdWUpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKG1vZHVsZXMuZWRpdG9yW2V2ZW50TmFtZV0pIHsgLy8gb24gY29tbWFuZFxuXHRcdFx0XHRcdHZhciAkZWRpdGFibGUgPSBsYXlvdXRJbmZvLmVkaXRhYmxlKCk7XG5cdFx0XHRcdFx0JGVkaXRhYmxlLmZvY3VzKCk7XG5cdFx0XHRcdFx0bW9kdWxlcy5lZGl0b3JbZXZlbnROYW1lXSgkZWRpdGFibGUsIHZhbHVlLCAkdGFyZ2V0KTtcblx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGNvbW1hbmRzW2V2ZW50TmFtZV0pIHtcblx0XHRcdFx0XHRjb21tYW5kc1tldmVudE5hbWVdLmNhbGwodGhpcywgbGF5b3V0SW5mbyk7XG5cdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIGFmdGVyIGNvbW1hbmRcblx0XHRcdFx0aWYgKCQuaW5BcnJheShldmVudE5hbWUsIFsnYmFja0NvbG9yJywgJ2ZvcmVDb2xvciddKSAhPT0gLTEpIHtcblx0XHRcdFx0XHR2YXIgb3B0aW9ucyA9IGxheW91dEluZm8uZWRpdG9yKCkuZGF0YSgnb3B0aW9ucycsIG9wdGlvbnMpO1xuXHRcdFx0XHRcdHZhciBtb2R1bGUgPSBvcHRpb25zLmFpck1vZGUgPyBtb2R1bGVzLnBvcG92ZXIgOiBtb2R1bGVzLnRvb2xiYXI7XG5cdFx0XHRcdFx0bW9kdWxlLnVwZGF0ZVJlY2VudENvbG9yKGxpc3QuaGVhZCgkYnRuKSwgZXZlbnROYW1lLCB2YWx1ZSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRoVG9vbGJhckFuZFBvcG92ZXJVcGRhdGUoZXZlbnQpO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHR2YXIgUFhfUEVSX0VNID0gMTg7XG5cdFx0dmFyIGhEaW1lbnNpb25QaWNrZXJNb3ZlID0gZnVuY3Rpb24gKGV2ZW50LCBvcHRpb25zKSB7XG5cdFx0XHR2YXIgJHBpY2tlciA9ICQoZXZlbnQudGFyZ2V0LnBhcmVudE5vZGUpOyAvLyB0YXJnZXQgaXMgbW91c2VjYXRjaGVyXG5cdFx0XHR2YXIgJGRpbWVuc2lvbkRpc3BsYXkgPSAkcGlja2VyLm5leHQoKTtcblx0XHRcdHZhciAkY2F0Y2hlciA9ICRwaWNrZXIuZmluZCgnLm5vdGUtZGltZW5zaW9uLXBpY2tlci1tb3VzZWNhdGNoZXInKTtcblx0XHRcdHZhciAkaGlnaGxpZ2h0ZWQgPSAkcGlja2VyLmZpbmQoJy5ub3RlLWRpbWVuc2lvbi1waWNrZXItaGlnaGxpZ2h0ZWQnKTtcblx0XHRcdHZhciAkdW5oaWdobGlnaHRlZCA9ICRwaWNrZXIuZmluZCgnLm5vdGUtZGltZW5zaW9uLXBpY2tlci11bmhpZ2hsaWdodGVkJyk7XG5cblx0XHRcdHZhciBwb3NPZmZzZXQ7XG5cdFx0XHQvLyBIVE1MNSB3aXRoIGpRdWVyeSAtIGUub2Zmc2V0WCBpcyB1bmRlZmluZWQgaW4gRmlyZWZveFxuXHRcdFx0aWYgKGV2ZW50Lm9mZnNldFggPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHR2YXIgcG9zQ2F0Y2hlciA9ICQoZXZlbnQudGFyZ2V0KS5vZmZzZXQoKTtcblx0XHRcdFx0cG9zT2Zmc2V0ID0ge1xuXHRcdFx0XHRcdHg6IGV2ZW50LnBhZ2VYIC0gcG9zQ2F0Y2hlci5sZWZ0LFxuXHRcdFx0XHRcdHk6IGV2ZW50LnBhZ2VZIC0gcG9zQ2F0Y2hlci50b3Bcblx0XHRcdFx0fTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHBvc09mZnNldCA9IHtcblx0XHRcdFx0XHR4OiBldmVudC5vZmZzZXRYLFxuXHRcdFx0XHRcdHk6IGV2ZW50Lm9mZnNldFlcblx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0dmFyIGRpbSA9IHtcblx0XHRcdFx0YzogTWF0aC5jZWlsKHBvc09mZnNldC54IC8gUFhfUEVSX0VNKSB8fCAxLFxuXHRcdFx0XHRyOiBNYXRoLmNlaWwocG9zT2Zmc2V0LnkgLyBQWF9QRVJfRU0pIHx8IDFcblx0XHRcdH07XG5cblx0XHRcdCRoaWdobGlnaHRlZC5jc3MoeyB3aWR0aDogZGltLmMgKyAnZW0nLCBoZWlnaHQ6IGRpbS5yICsgJ2VtJyB9KTtcblx0XHRcdCRjYXRjaGVyLmF0dHIoJ2RhdGEtdmFsdWUnLCBkaW0uYyArICd4JyArIGRpbS5yKTtcblxuXHRcdFx0aWYgKDMgPCBkaW0uYyAmJiBkaW0uYyA8IG9wdGlvbnMuaW5zZXJ0VGFibGVNYXhTaXplLmNvbCkge1xuXHRcdFx0XHQkdW5oaWdobGlnaHRlZC5jc3MoeyB3aWR0aDogZGltLmMgKyAxICsgJ2VtJyB9KTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKDMgPCBkaW0uciAmJiBkaW0uciA8IG9wdGlvbnMuaW5zZXJ0VGFibGVNYXhTaXplLnJvdykge1xuXHRcdFx0XHQkdW5oaWdobGlnaHRlZC5jc3MoeyBoZWlnaHQ6IGRpbS5yICsgMSArICdlbScgfSk7XG5cdFx0XHR9XG5cblx0XHRcdCRkaW1lbnNpb25EaXNwbGF5Lmh0bWwoZGltLmMgKyAnIHggJyArIGRpbS5yKTtcblx0XHR9O1xuXG5cdFx0dmFyIGJpbmRDdXN0b21FdmVudCA9IGZ1bmN0aW9uICgkaG9sZGVyLCBldmVudE5hbWUpIHtcblx0XHRcdHJldHVybiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHJldHVybiAkaG9sZGVyLnRyaWdnZXIoJ3N1bW1lcm5vdGUuJyArIGV2ZW50TmFtZSwgYXJndW1lbnRzKTtcblx0XHRcdH07XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIGJpbmQgS2V5TWFwIG9uIGtleWRvd25cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBsYXlvdXRJbmZvXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IGtleU1hcFxuXHRcdCAqL1xuXHRcdHRoaXMuYmluZEtleU1hcCA9IGZ1bmN0aW9uIChsYXlvdXRJbmZvLCBrZXlNYXApIHtcblx0XHRcdHZhciAkZWRpdG9yID0gbGF5b3V0SW5mby5lZGl0b3IoKTtcblx0XHRcdHZhciAkZWRpdGFibGUgPSBsYXlvdXRJbmZvLmVkaXRhYmxlKCk7XG5cblx0XHRcdCRlZGl0YWJsZS5vbigna2V5ZG93bicsIGZ1bmN0aW9uIChldmVudCkge1xuXHRcdFx0XHR2YXIga2V5cyA9IFtdO1xuXG5cdFx0XHRcdC8vIG1vZGlmaWVyXG5cdFx0XHRcdGlmIChldmVudC5tZXRhS2V5KSB7IGtleXMucHVzaCgnQ01EJyk7IH1cblx0XHRcdFx0aWYgKGV2ZW50LmN0cmxLZXkgJiYgIWV2ZW50LmFsdEtleSkgeyBrZXlzLnB1c2goJ0NUUkwnKTsgfVxuXHRcdFx0XHRpZiAoZXZlbnQuc2hpZnRLZXkpIHsga2V5cy5wdXNoKCdTSElGVCcpOyB9XG5cblx0XHRcdFx0Ly8ga2V5Y29kZVxuXHRcdFx0XHR2YXIga2V5TmFtZSA9IGtleS5uYW1lRnJvbUNvZGVbZXZlbnQua2V5Q29kZV07XG5cdFx0XHRcdGlmIChrZXlOYW1lKSB7XG5cdFx0XHRcdFx0a2V5cy5wdXNoKGtleU5hbWUpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dmFyIGV2ZW50TmFtZSA9IGtleU1hcFtrZXlzLmpvaW4oJysnKV07XG5cdFx0XHRcdGlmIChldmVudE5hbWUpIHtcblx0XHRcdFx0XHRpZiAoJC5zdW1tZXJub3RlLnBsdWdpbkV2ZW50c1tldmVudE5hbWVdKSB7XG5cdFx0XHRcdFx0XHR2YXIgcGx1Z2luID0gJC5zdW1tZXJub3RlLnBsdWdpbkV2ZW50c1tldmVudE5hbWVdO1xuXHRcdFx0XHRcdFx0aWYgKCQuaXNGdW5jdGlvbihwbHVnaW4pKSB7XG5cdFx0XHRcdFx0XHRcdHBsdWdpbihldmVudCwgbW9kdWxlcy5lZGl0b3IsIGxheW91dEluZm8pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSBpZiAobW9kdWxlcy5lZGl0b3JbZXZlbnROYW1lXSkge1xuXHRcdFx0XHRcdFx0bW9kdWxlcy5lZGl0b3JbZXZlbnROYW1lXSgkZWRpdGFibGUsICRlZGl0b3IuZGF0YSgnb3B0aW9ucycpKTtcblx0XHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChjb21tYW5kc1tldmVudE5hbWVdKSB7XG5cdFx0XHRcdFx0XHRjb21tYW5kc1tldmVudE5hbWVdLmNhbGwodGhpcywgbGF5b3V0SW5mbyk7XG5cdFx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmIChrZXkuaXNFZGl0KGV2ZW50LmtleUNvZGUpKSB7XG5cdFx0XHRcdFx0bW9kdWxlcy5lZGl0b3IuYWZ0ZXJDb21tYW5kKCRlZGl0YWJsZSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBhdHRhY2ggZXZlbnRoYW5kbGVyXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gbGF5b3V0SW5mbyAtIGxheW91dCBJbmZvcm1hdGlvbnNcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIHVzZXIgb3B0aW9ucyBpbmNsdWRlIGN1c3RvbSBldmVudCBoYW5kbGVyc1xuXHRcdCAqIEBwYXJhbSB7ZnVuY3Rpb24oZXZlbnQpfSBbb3B0aW9ucy5vbmVudGVyXSAtIGVudGVyIGtleSBoYW5kbGVyXG5cdFx0ICogQHBhcmFtIHtmdW5jdGlvbihldmVudCl9IFtvcHRpb25zLm9uZm9jdXNdXG5cdFx0ICogQHBhcmFtIHtmdW5jdGlvbihldmVudCl9IFtvcHRpb25zLm9uYmx1cl1cblx0XHQgKiBAcGFyYW0ge2Z1bmN0aW9uKGV2ZW50KX0gW29wdGlvbnMub25rZXl1cF1cblx0XHQgKiBAcGFyYW0ge2Z1bmN0aW9uKGV2ZW50KX0gW29wdGlvbnMub25rZXlkb3duXVxuXHRcdCAqIEBwYXJhbSB7ZnVuY3Rpb24oZXZlbnQpfSBbb3B0aW9ucy5vbnBhc3RlXVxuXHRcdCAqIEBwYXJhbSB7ZnVuY3Rpb24oZXZlbnQpfSBbb3B0aW9ucy5vblRvb2xCYXJjbGlja11cblx0XHQgKiBAcGFyYW0ge2Z1bmN0aW9uKGV2ZW50KX0gW29wdGlvbnMub25DaGFuZ2VdXG5cdFx0ICovXG5cdFx0dGhpcy5hdHRhY2ggPSBmdW5jdGlvbiAobGF5b3V0SW5mbywgb3B0aW9ucykge1xuXHRcdFx0Ly8gaGFuZGxlcnMgZm9yIGVkaXRhYmxlXG5cdFx0XHRpZiAob3B0aW9ucy5zaG9ydGN1dHMpIHtcblx0XHRcdFx0dGhpcy5iaW5kS2V5TWFwKGxheW91dEluZm8sIG9wdGlvbnMua2V5TWFwW2FnZW50LmlzTWFjID8gJ21hYycgOiAncGMnXSk7XG5cdFx0XHR9XG5cdFx0XHRsYXlvdXRJbmZvLmVkaXRhYmxlKCkub24oJ21vdXNlZG93bicsIGhNb3VzZWRvd24pO1xuXHRcdFx0bGF5b3V0SW5mby5lZGl0YWJsZSgpLm9uKCdrZXl1cCBtb3VzZXVwJywgaFRvb2xiYXJBbmRQb3BvdmVyVXBkYXRlKTtcblx0XHRcdGxheW91dEluZm8uZWRpdGFibGUoKS5vbignc2Nyb2xsJywgaFNjcm9sbCk7XG5cdFx0XHRtb2R1bGVzLmNsaXBib2FyZC5hdHRhY2gobGF5b3V0SW5mbywgb3B0aW9ucyk7XG5cblx0XHRcdC8vIGhhbmRsZXIgZm9yIGhhbmRsZSBhbmQgcG9wb3ZlclxuXHRcdFx0bW9kdWxlcy5oYW5kbGUuYXR0YWNoKGxheW91dEluZm8sIG9wdGlvbnMpO1xuXHRcdFx0bGF5b3V0SW5mby5wb3BvdmVyKCkub24oJ2NsaWNrJywgaFRvb2xiYXJBbmRQb3BvdmVyQ2xpY2spO1xuXHRcdFx0bGF5b3V0SW5mby5wb3BvdmVyKCkub24oJ21vdXNlZG93bicsIGhUb29sYmFyQW5kUG9wb3Zlck1vdXNlZG93bik7XG5cblx0XHRcdC8vIGhhbmRsZXIgZm9yIGRyYWcgYW5kIGRyb3Bcblx0XHRcdG1vZHVsZXMuZHJhZ0FuZERyb3AuYXR0YWNoKGxheW91dEluZm8sIG9wdGlvbnMpO1xuXG5cdFx0XHQvLyBoYW5kbGVycyBmb3IgZnJhbWUgbW9kZSAodG9vbGJhciwgc3RhdHVzYmFyKVxuXHRcdFx0aWYgKCFvcHRpb25zLmFpck1vZGUpIHtcblx0XHRcdFx0Ly8gaGFuZGxlciBmb3IgdG9vbGJhclxuXHRcdFx0XHRsYXlvdXRJbmZvLnRvb2xiYXIoKS5vbignY2xpY2snLCBoVG9vbGJhckFuZFBvcG92ZXJDbGljayk7XG5cdFx0XHRcdGxheW91dEluZm8udG9vbGJhcigpLm9uKCdtb3VzZWRvd24nLCBoVG9vbGJhckFuZFBvcG92ZXJNb3VzZWRvd24pO1xuXG5cdFx0XHRcdC8vIGhhbmRsZXIgZm9yIHN0YXR1c2JhclxuXHRcdFx0XHRtb2R1bGVzLnN0YXR1c2Jhci5hdHRhY2gobGF5b3V0SW5mbywgb3B0aW9ucyk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIGhhbmRsZXIgZm9yIHRhYmxlIGRpbWVuc2lvblxuXHRcdFx0dmFyICRjYXRjaGVyQ29udGFpbmVyID0gb3B0aW9ucy5haXJNb2RlID8gbGF5b3V0SW5mby5wb3BvdmVyKCkgOlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgIGxheW91dEluZm8udG9vbGJhcigpO1xuXHRcdFx0dmFyICRjYXRjaGVyID0gJGNhdGNoZXJDb250YWluZXIuZmluZCgnLm5vdGUtZGltZW5zaW9uLXBpY2tlci1tb3VzZWNhdGNoZXInKTtcblx0XHRcdCRjYXRjaGVyLmNzcyh7XG5cdFx0XHRcdHdpZHRoOiBvcHRpb25zLmluc2VydFRhYmxlTWF4U2l6ZS5jb2wgKyAnZW0nLFxuXHRcdFx0XHRoZWlnaHQ6IG9wdGlvbnMuaW5zZXJ0VGFibGVNYXhTaXplLnJvdyArICdlbSdcblx0XHRcdH0pLm9uKCdtb3VzZW1vdmUnLCBmdW5jdGlvbiAoZXZlbnQpIHtcblx0XHRcdFx0aERpbWVuc2lvblBpY2tlck1vdmUoZXZlbnQsIG9wdGlvbnMpO1xuXHRcdFx0fSk7XG5cblx0XHRcdC8vIHNhdmUgb3B0aW9ucyBvbiBlZGl0b3Jcblx0XHRcdGxheW91dEluZm8uZWRpdG9yKCkuZGF0YSgnb3B0aW9ucycsIG9wdGlvbnMpO1xuXG5cdFx0XHQvLyByZXQgc3R5bGVXaXRoQ1NTIGZvciBiYWNrQ29sb3IgLyBmb3JlQ29sb3IgY2xlYXJpbmcgd2l0aCAnaW5oZXJpdCcuXG5cdFx0XHRpZiAoIWFnZW50LmlzTVNJRSkge1xuXHRcdFx0XHQvLyBwcm90ZWN0IEZGIEVycm9yOiBOU19FUlJPUl9GQUlMVVJFOiBGYWlsdXJlXG5cdFx0XHRcdHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdGRvY3VtZW50LmV4ZWNDb21tYW5kKCdzdHlsZVdpdGhDU1MnLCAwLCBvcHRpb25zLnN0eWxlV2l0aFNwYW4pO1xuXHRcdFx0XHR9LCAwKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gSGlzdG9yeVxuXHRcdFx0dmFyIGhpc3RvcnkgPSBuZXcgSGlzdG9yeShsYXlvdXRJbmZvLmVkaXRhYmxlKCkpO1xuXHRcdFx0bGF5b3V0SW5mby5lZGl0YWJsZSgpLmRhdGEoJ05vdGVIaXN0b3J5JywgaGlzdG9yeSk7XG5cblx0XHRcdC8vIGJhc2ljIGV2ZW50IGNhbGxiYWNrcyAobG93ZXJjYXNlKVxuXHRcdFx0Ly8gZW50ZXIsIGZvY3VzLCBibHVyLCBrZXl1cCwga2V5ZG93blxuXHRcdFx0aWYgKG9wdGlvbnMub25lbnRlcikge1xuXHRcdFx0XHRsYXlvdXRJbmZvLmVkaXRhYmxlKCkua2V5cHJlc3MoZnVuY3Rpb24gKGV2ZW50KSB7XG5cdFx0XHRcdFx0aWYgKGV2ZW50LmtleUNvZGUgPT09IGtleS5FTlRFUikgeyBvcHRpb25zLm9uZW50ZXIoZXZlbnQpOyB9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAob3B0aW9ucy5vbmZvY3VzKSB7IGxheW91dEluZm8uZWRpdGFibGUoKS5mb2N1cyhvcHRpb25zLm9uZm9jdXMpOyB9XG5cdFx0XHRpZiAob3B0aW9ucy5vbmJsdXIpIHsgbGF5b3V0SW5mby5lZGl0YWJsZSgpLmJsdXIob3B0aW9ucy5vbmJsdXIpOyB9XG5cdFx0XHRpZiAob3B0aW9ucy5vbmtleXVwKSB7IGxheW91dEluZm8uZWRpdGFibGUoKS5rZXl1cChvcHRpb25zLm9ua2V5dXApOyB9XG5cdFx0XHRpZiAob3B0aW9ucy5vbmtleWRvd24pIHsgbGF5b3V0SW5mby5lZGl0YWJsZSgpLmtleWRvd24ob3B0aW9ucy5vbmtleWRvd24pOyB9XG5cdFx0XHRpZiAob3B0aW9ucy5vbnBhc3RlKSB7IGxheW91dEluZm8uZWRpdGFibGUoKS5vbigncGFzdGUnLCBvcHRpb25zLm9ucGFzdGUpOyB9XG5cblx0XHRcdC8vIGNhbGxiYWNrcyBmb3IgYWR2YW5jZWQgZmVhdHVyZXMgKGNhbWVsKVxuXG5cdFx0XHQvLyBvblRvb2xiYXJDbGlja1xuXHRcdFx0aWYgKG9wdGlvbnMub25Ub29sYmFyQ2xpY2spIHtcblx0XHRcdFx0bGF5b3V0SW5mby50b29sYmFyKCkuY2xpY2sob3B0aW9ucy5vblRvb2xiYXJDbGljayk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIG9uQ2hhbmdlXG5cdFx0XHRpZiAob3B0aW9ucy5vbkNoYW5nZSkge1xuXHRcdFx0XHR2YXIgaENoYW5nZSA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRtb2R1bGVzLmVkaXRvci50cmlnZ2VyT25DaGFuZ2UobGF5b3V0SW5mby5lZGl0YWJsZSgpKTtcblx0XHRcdFx0fTtcblxuXHRcdFx0XHRpZiAoYWdlbnQuaXNNU0lFKSB7XG5cdFx0XHRcdFx0dmFyIHNEb21FdmVudHMgPSAnRE9NQ2hhcmFjdGVyRGF0YU1vZGlmaWVkIERPTVN1YnRyZWVNb2RpZmllZCBET01Ob2RlSW5zZXJ0ZWQnO1xuXHRcdFx0XHRcdGxheW91dEluZm8uZWRpdGFibGUoKS5vbihzRG9tRXZlbnRzLCBoQ2hhbmdlKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRsYXlvdXRJbmZvLmVkaXRhYmxlKCkub24oJ2lucHV0JywgaENoYW5nZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gQWxsIGVkaXRvciBzdGF0dXMgd2lsbCBiZSBzYXZlZCBvbiBlZGl0YWJsZSB3aXRoIGpxdWVyeSdzIGRhdGFcblx0XHRcdC8vIGZvciBzdXBwb3J0IG11bHRpcGxlIGVkaXRvciB3aXRoIHNpbmdsZXRvbiBvYmplY3QuXG5cdFx0XHRsYXlvdXRJbmZvLmVkaXRhYmxlKCkuZGF0YSgnY2FsbGJhY2tzJywge1xuXHRcdFx0XHRvbkJlZm9yZUNoYW5nZTogb3B0aW9ucy5vbkJlZm9yZUNoYW5nZSxcblx0XHRcdFx0b25DaGFuZ2U6IG9wdGlvbnMub25DaGFuZ2UsXG5cdFx0XHRcdG9uQXV0b1NhdmU6IG9wdGlvbnMub25BdXRvU2F2ZSxcblx0XHRcdFx0b25JbWFnZVVwbG9hZDogb3B0aW9ucy5vbkltYWdlVXBsb2FkLFxuXHRcdFx0XHRvbkltYWdlVXBsb2FkRXJyb3I6IG9wdGlvbnMub25JbWFnZVVwbG9hZEVycm9yLFxuXHRcdFx0XHRvbkZpbGVVcGxvYWQ6IG9wdGlvbnMub25GaWxlVXBsb2FkLFxuXHRcdFx0XHRvbkZpbGVVcGxvYWRFcnJvcjogb3B0aW9ucy5vbkZpbGVVcGxvYWQsXG5cdFx0XHRcdG9uTWVkaWFEZWxldGU6IG9wdGlvbnMub25NZWRpYURlbGV0ZVxuXHRcdFx0fSk7XG5cblx0XHRcdC8vIFRleHRhcmVhOiBhdXRvIGZpbGxpbmcgdGhlIGNvZGUgYmVmb3JlIGZvcm0gc3VibWl0LlxuXHRcdFx0aWYgKGRvbS5pc1RleHRhcmVhKGxpc3QuaGVhZChsYXlvdXRJbmZvLmhvbGRlcigpKSkpIHtcblx0XHRcdFx0bGF5b3V0SW5mby5ob2xkZXIoKS5jbG9zZXN0KCdmb3JtJykuc3VibWl0KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHR2YXIgY29udGVudHMgPSBsYXlvdXRJbmZvLmhvbGRlcigpLmNvZGUoKTtcblx0XHRcdFx0XHRsYXlvdXRJbmZvLmhvbGRlcigpLnZhbChjb250ZW50cyk7XG5cblx0XHRcdFx0XHQvLyBjYWxsYmFjayBvbiBzdWJtaXRcblx0XHRcdFx0XHRpZiAob3B0aW9ucy5vbnN1Ym1pdCkge1xuXHRcdFx0XHRcdFx0b3B0aW9ucy5vbnN1Ym1pdChjb250ZW50cyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogYXR0YWNoIGpxdWVyeSBjdXN0b20gZXZlbnRcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBsYXlvdXRJbmZvIC0gbGF5b3V0IEluZm9ybWF0aW9uc1xuXHRcdCAqL1xuXHRcdHRoaXMuYXR0YWNoQ3VzdG9tRXZlbnQgPSBmdW5jdGlvbiAobGF5b3V0SW5mbywgb3B0aW9ucykge1xuXHRcdFx0dmFyICRob2xkZXIgPSBsYXlvdXRJbmZvLmhvbGRlcigpO1xuXHRcdFx0dmFyICRlZGl0YWJsZSA9IGxheW91dEluZm8uZWRpdGFibGUoKTtcblxuXHRcdFx0JGVkaXRhYmxlLm9uKCdtb3VzZWRvd24nLCBiaW5kQ3VzdG9tRXZlbnQoJGhvbGRlciwgJ21vdXNlZG93bicpKTtcblx0XHRcdCRlZGl0YWJsZS5vbigna2V5dXAgbW91c2V1cCcsIGJpbmRDdXN0b21FdmVudCgkaG9sZGVyLCAndXBkYXRlJykpO1xuXHRcdFx0JGVkaXRhYmxlLm9uKCdzY3JvbGwnLCBiaW5kQ3VzdG9tRXZlbnQoJGhvbGRlciwgJ3Njcm9sbCcpKTtcblxuXHRcdFx0Ly8gYmFzaWMgZXZlbnQgY2FsbGJhY2tzIChsb3dlcmNhc2UpXG5cdFx0XHQvLyBlbnRlciwgZm9jdXMsIGJsdXIsIGtleXVwLCBrZXlkb3duXG5cdFx0XHQkZWRpdGFibGUua2V5cHJlc3MoZnVuY3Rpb24gKGV2ZW50KSB7XG5cdFx0XHRcdGlmIChldmVudC5rZXlDb2RlID09PSBrZXkuRU5URVIpIHtcblx0XHRcdFx0XHRiaW5kQ3VzdG9tRXZlbnQoJGhvbGRlciwgJ2VudGVyJykuY2FsbCh0aGlzLCBldmVudCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0XHQkZWRpdGFibGUuZm9jdXMoYmluZEN1c3RvbUV2ZW50KCRob2xkZXIsICdmb2N1cycpKTtcblx0XHRcdCRlZGl0YWJsZS5ibHVyKGJpbmRDdXN0b21FdmVudCgkaG9sZGVyLCAnYmx1cicpKTtcblx0XHRcdCRlZGl0YWJsZS5rZXl1cChiaW5kQ3VzdG9tRXZlbnQoJGhvbGRlciwgJ2tleXVwJykpO1xuXHRcdFx0JGVkaXRhYmxlLmtleWRvd24oYmluZEN1c3RvbUV2ZW50KCRob2xkZXIsICdrZXlkb3duJykpO1xuXHRcdFx0JGVkaXRhYmxlLm9uKCdwYXN0ZScsIGJpbmRDdXN0b21FdmVudCgkaG9sZGVyLCAncGFzdGUnKSk7XG5cblx0XHRcdC8vIGNhbGxiYWNrcyBmb3IgYWR2YW5jZWQgZmVhdHVyZXMgKGNhbWVsKVxuXHRcdFx0aWYgKCFvcHRpb25zLmFpck1vZGUpIHtcblx0XHRcdFx0bGF5b3V0SW5mby50b29sYmFyKCkuY2xpY2soYmluZEN1c3RvbUV2ZW50KCRob2xkZXIsICd0b29sYmFyLmNsaWNrJykpO1xuXHRcdFx0XHRsYXlvdXRJbmZvLnBvcG92ZXIoKS5jbGljayhiaW5kQ3VzdG9tRXZlbnQoJGhvbGRlciwgJ3BvcG92ZXIuY2xpY2snKSk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChhZ2VudC5pc01TSUUpIHtcblx0XHRcdFx0dmFyIHNEb21FdmVudHMgPSAnRE9NQ2hhcmFjdGVyRGF0YU1vZGlmaWVkIERPTVN1YnRyZWVNb2RpZmllZCBET01Ob2RlSW5zZXJ0ZWQnO1xuXHRcdFx0XHQkZWRpdGFibGUub24oc0RvbUV2ZW50cywgYmluZEN1c3RvbUV2ZW50KCRob2xkZXIsICdjaGFuZ2UnKSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQkZWRpdGFibGUub24oJ2lucHV0JywgYmluZEN1c3RvbUV2ZW50KCRob2xkZXIsICdjaGFuZ2UnKSk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFRleHRhcmVhOiBhdXRvIGZpbGxpbmcgdGhlIGNvZGUgYmVmb3JlIGZvcm0gc3VibWl0LlxuXHRcdFx0aWYgKGRvbS5pc1RleHRhcmVhKGxpc3QuaGVhZCgkaG9sZGVyKSkpIHtcblx0XHRcdFx0JGhvbGRlci5jbG9zZXN0KCdmb3JtJykuc3VibWl0KGZ1bmN0aW9uIChlKSB7XG5cdFx0XHRcdFx0dmFyIGNvbnRlbnRzID0gJGhvbGRlci5jb2RlKCk7XG5cdFx0XHRcdFx0YmluZEN1c3RvbUV2ZW50KCRob2xkZXIsICdzdWJtaXQnKS5jYWxsKHRoaXMsIGUsIGNvbnRlbnRzKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIGZpcmUgaW5pdCBldmVudFxuXHRcdFx0YmluZEN1c3RvbUV2ZW50KCRob2xkZXIsICdpbml0JykoKTtcblxuXHRcdFx0Ly8gZmlyZSBwbHVnaW4gaW5pdCBldmVudFxuXHRcdFx0Zm9yICh2YXIgaSA9IDAsIGxlbiA9ICQuc3VtbWVybm90ZS5wbHVnaW5zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0XHRcdGlmICgkLmlzRnVuY3Rpb24oJC5zdW1tZXJub3RlLnBsdWdpbnNbaV0uaW5pdCkpIHtcblx0XHRcdFx0XHQkLnN1bW1lcm5vdGUucGx1Z2luc1tpXS5pbml0KGxheW91dEluZm8pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdHRoaXMuZGV0YWNoID0gZnVuY3Rpb24gKGxheW91dEluZm8sIG9wdGlvbnMpIHtcblx0XHRcdGxheW91dEluZm8uaG9sZGVyKCkub2ZmKCk7XG5cdFx0XHRsYXlvdXRJbmZvLmVkaXRhYmxlKCkub2ZmKCk7XG5cblx0XHRcdGxheW91dEluZm8ucG9wb3ZlcigpLm9mZigpO1xuXHRcdFx0bGF5b3V0SW5mby5oYW5kbGUoKS5vZmYoKTtcblx0XHRcdGxheW91dEluZm8uZGlhbG9nKCkub2ZmKCk7XG5cblx0XHRcdGlmICghb3B0aW9ucy5haXJNb2RlKSB7XG5cdFx0XHRcdGxheW91dEluZm8uZHJvcHpvbmUoKS5vZmYoKTtcblx0XHRcdFx0bGF5b3V0SW5mby50b29sYmFyKCkub2ZmKCk7XG5cdFx0XHRcdGxheW91dEluZm8uc3RhdHVzYmFyKCkub2ZmKCk7XG5cdFx0XHR9XG5cdFx0fTtcblx0fTtcblxuXHQvKipcblx0ICogQGNsYXNzIFJlbmRlcmVyXG5cdCAqXG5cdCAqIHJlbmRlcmVyXG5cdCAqXG5cdCAqIHJlbmRlcmluZyB0b29sYmFyIGFuZCBlZGl0YWJsZVxuXHQgKi9cblx0dmFyIFJlbmRlcmVyID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0LyoqXG5cdFx0ICogYm9vdHN0cmFwIGJ1dHRvbiB0ZW1wbGF0ZVxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IGxhYmVsIGJ1dHRvbiBuYW1lXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBidXR0b24gb3B0aW9uc1xuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5ldmVudF0gZGF0YS1ldmVudFxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5jbGFzc05hbWVdIGJ1dHRvbidzIGNsYXNzIG5hbWVcblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMudmFsdWVdIGRhdGEtdmFsdWVcblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMudGl0bGVdIGJ1dHRvbidzIHRpdGxlIGZvciBwb3B1cFxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5kcm9wZG93bl0gZHJvcGRvd24gaHRtbFxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5oaWRlXSBkYXRhLWhpZGVcblx0XHQgKi9cblx0XHR2YXIgdHBsQnV0dG9uID0gZnVuY3Rpb24gKGxhYmVsLCBvcHRpb25zKSB7XG5cdFx0XHR2YXIgZXZlbnQgPSBvcHRpb25zLmV2ZW50O1xuXHRcdFx0dmFyIHZhbHVlID0gb3B0aW9ucy52YWx1ZTtcblx0XHRcdHZhciB0aXRsZSA9IG9wdGlvbnMudGl0bGU7XG5cdFx0XHR2YXIgY2xhc3NOYW1lID0gb3B0aW9ucy5jbGFzc05hbWU7XG5cdFx0XHR2YXIgZHJvcGRvd24gPSBvcHRpb25zLmRyb3Bkb3duO1xuXHRcdFx0dmFyIGhpZGUgPSBvcHRpb25zLmhpZGU7XG5cblx0XHRcdHJldHVybiAnPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCInICtcblx0XHRcdFx0XHQgICAnIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0IGJ0bi1zbSBidG4tc21hbGwnICtcblx0XHRcdFx0XHRcdCAoY2xhc3NOYW1lID8gJyAnICsgY2xhc3NOYW1lIDogJycpICtcblx0XHRcdFx0XHRcdCAoZHJvcGRvd24gPyAnIGRyb3Bkb3duLXRvZ2dsZScgOiAnJykgK1xuXHRcdFx0XHRcdCAgICdcIicgK1xuXHRcdFx0XHRcdCAgIChkcm9wZG93biA/ICcgZGF0YS10b2dnbGU9XCJkcm9wZG93blwiJyA6ICcnKSArXG5cdFx0XHRcdFx0ICAgKHRpdGxlID8gJyB0aXRsZT1cIicgKyB0aXRsZSArICdcIicgOiAnJykgK1xuXHRcdFx0XHRcdCAgIChldmVudCA/ICcgZGF0YS1ldmVudD1cIicgKyBldmVudCArICdcIicgOiAnJykgK1xuXHRcdFx0XHRcdCAgICh2YWx1ZSA/ICcgZGF0YS12YWx1ZT1cXCcnICsgdmFsdWUgKyAnXFwnJyA6ICcnKSArXG5cdFx0XHRcdFx0ICAgKGhpZGUgPyAnIGRhdGEtaGlkZT1cXCcnICsgaGlkZSArICdcXCcnIDogJycpICtcblx0XHRcdFx0XHQgICAnIHRhYmluZGV4PVwiLTFcIj4nICtcblx0XHRcdFx0XHQgbGFiZWwgK1xuXHRcdFx0XHRcdCAoZHJvcGRvd24gPyAnIDxzcGFuIGNsYXNzPVwiY2FyZXRcIj48L3NwYW4+JyA6ICcnKSArXG5cdFx0XHRcdCAgICc8L2J1dHRvbj4nICtcblx0XHRcdFx0ICAgKGRyb3Bkb3duIHx8ICcnKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogYm9vdHN0cmFwIGljb24gYnV0dG9uIHRlbXBsYXRlXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gaWNvbkNsYXNzTmFtZVxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuZXZlbnRdXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnZhbHVlXVxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy50aXRsZV1cblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuZHJvcGRvd25dXG5cdFx0ICovXG5cdFx0dmFyIHRwbEljb25CdXR0b24gPSBmdW5jdGlvbiAoaWNvbkNsYXNzTmFtZSwgb3B0aW9ucykge1xuXHRcdFx0dmFyIGxhYmVsID0gJzxpIGNsYXNzPVwiJyArIGljb25DbGFzc05hbWUgKyAnXCI+PC9pPic7XG5cdFx0XHRyZXR1cm4gdHBsQnV0dG9uKGxhYmVsLCBvcHRpb25zKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogYm9vdHN0cmFwIHBvcG92ZXIgdGVtcGxhdGVcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSBjbGFzc05hbWVcblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gY29udGVudFxuXHRcdCAqL1xuXHRcdHZhciB0cGxQb3BvdmVyID0gZnVuY3Rpb24gKGNsYXNzTmFtZSwgY29udGVudCkge1xuXHRcdFx0dmFyICRwb3BvdmVyID0gJCgnPGRpdiBjbGFzcz1cIicgKyBjbGFzc05hbWUgKyAnIHBvcG92ZXIgYm90dG9tIGluXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiPicgK1xuXHRcdFx0XHRcdCAnPGRpdiBjbGFzcz1cImFycm93XCI+PC9kaXY+JyArXG5cdFx0XHRcdFx0ICc8ZGl2IGNsYXNzPVwicG9wb3Zlci1jb250ZW50XCI+JyArXG5cdFx0XHRcdFx0ICc8L2Rpdj4nICtcblx0XHRcdFx0ICAgJzwvZGl2PicpO1xuXG5cdFx0XHQkcG9wb3Zlci5maW5kKCcucG9wb3Zlci1jb250ZW50JykuYXBwZW5kKGNvbnRlbnQpO1xuXHRcdFx0cmV0dXJuICRwb3BvdmVyO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBib290c3RyYXAgZGlhbG9nIHRlbXBsYXRlXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gY2xhc3NOYW1lXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IFt0aXRsZT0nJ11cblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gYm9keVxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSBbZm9vdGVyPScnXVxuXHRcdCAqL1xuXHRcdHZhciB0cGxEaWFsb2cgPSBmdW5jdGlvbiAoY2xhc3NOYW1lLCB0aXRsZSwgYm9keSwgZm9vdGVyKSB7XG5cdFx0XHRyZXR1cm4gJzxkaXYgY2xhc3M9XCInICsgY2xhc3NOYW1lICsgJyBtb2RhbFwiIGFyaWEtaGlkZGVuPVwiZmFsc2VcIj4nICtcblx0XHRcdFx0XHQgJzxkaXYgY2xhc3M9XCJtb2RhbC1kaWFsb2dcIj4nICtcblx0XHRcdFx0XHQgICAnPGRpdiBjbGFzcz1cIm1vZGFsLWNvbnRlbnRcIj4nICtcblx0XHRcdFx0XHRcdCAodGl0bGUgP1xuXHRcdFx0XHRcdFx0ICc8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+JyArXG5cdFx0XHRcdFx0XHQgICAnPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjbG9zZVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIHRhYmluZGV4PVwiLTFcIj4mdGltZXM7PC9idXR0b24+JyArXG5cdFx0XHRcdFx0XHQgICAnPGg0IGNsYXNzPVwibW9kYWwtdGl0bGVcIj4nICsgdGl0bGUgKyAnPC9oND4nICtcblx0XHRcdFx0XHRcdCAnPC9kaXY+JyA6ICcnXG5cdFx0XHRcdFx0XHQgKSArXG5cdFx0XHRcdFx0XHQgJzxmb3JtIGNsYXNzPVwibm90ZS1tb2RhbC1mb3JtXCI+JyArXG5cdFx0XHRcdFx0XHQgICAnPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIj4nICsgYm9keSArICc8L2Rpdj4nICtcblx0XHRcdFx0XHRcdCAgIChmb290ZXIgP1xuXHRcdFx0XHRcdFx0ICAgJzxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj4nICsgZm9vdGVyICsgJzwvZGl2PicgOiAnJ1xuXHRcdFx0XHRcdFx0ICAgKSArXG5cdFx0XHRcdFx0XHQgJzwvZm9ybT4nICtcblx0XHRcdFx0XHQgICAnPC9kaXY+JyArXG5cdFx0XHRcdFx0ICc8L2Rpdj4nICtcblx0XHRcdFx0ICAgJzwvZGl2Pic7XG5cdFx0fTtcblxuXHRcdHZhciB0cGxCdXR0b25JbmZvID0ge1xuXHRcdFx0cGljdHVyZTogZnVuY3Rpb24gKGxhbmcsIG9wdGlvbnMpIHtcblx0XHRcdFx0cmV0dXJuIHRwbEljb25CdXR0b24ob3B0aW9ucy5pY29uUHJlZml4ICsgJ3BpY3R1cmUtbycsIHtcblx0XHRcdFx0XHRldmVudDogJ3Nob3dJbWFnZURpYWxvZycsXG5cdFx0XHRcdFx0dGl0bGU6IGxhbmcuaW1hZ2UuaW1hZ2UsXG5cdFx0XHRcdFx0aGlkZTogdHJ1ZVxuXHRcdFx0XHR9KTtcblx0XHRcdH0sXG5cdFx0XHRsaW5rOiBmdW5jdGlvbiAobGFuZywgb3B0aW9ucykge1xuXHRcdFx0XHRyZXR1cm4gdHBsSWNvbkJ1dHRvbihvcHRpb25zLmljb25QcmVmaXggKyAnbGluaycsIHtcblx0XHRcdFx0XHRldmVudDogJ3Nob3dMaW5rRGlhbG9nJyxcblx0XHRcdFx0XHR0aXRsZTogbGFuZy5saW5rLmxpbmssXG5cdFx0XHRcdFx0aGlkZTogdHJ1ZVxuXHRcdFx0XHR9KTtcblx0XHRcdH0sXG5cdFx0XHR0YWJsZTogZnVuY3Rpb24gKGxhbmcsIG9wdGlvbnMpIHtcblx0XHRcdFx0dmFyIGRyb3Bkb3duID0gJzx1bCBjbGFzcz1cIm5vdGUtdGFibGUgZHJvcGRvd24tbWVudVwiPicgK1xuXHRcdFx0XHRcdFx0XHRcdCAnPGRpdiBjbGFzcz1cIm5vdGUtZGltZW5zaW9uLXBpY2tlclwiPicgK1xuXHRcdFx0XHRcdFx0XHRcdCAgICc8ZGl2IGNsYXNzPVwibm90ZS1kaW1lbnNpb24tcGlja2VyLW1vdXNlY2F0Y2hlclwiIGRhdGEtZXZlbnQ9XCJpbnNlcnRUYWJsZVwiIGRhdGEtdmFsdWU9XCIxeDFcIj48L2Rpdj4nICtcblx0XHRcdFx0XHRcdFx0XHQgICAnPGRpdiBjbGFzcz1cIm5vdGUtZGltZW5zaW9uLXBpY2tlci1oaWdobGlnaHRlZFwiPjwvZGl2PicgK1xuXHRcdFx0XHRcdFx0XHRcdCAgICc8ZGl2IGNsYXNzPVwibm90ZS1kaW1lbnNpb24tcGlja2VyLXVuaGlnaGxpZ2h0ZWRcIj48L2Rpdj4nICtcblx0XHRcdFx0XHRcdFx0XHQgJzwvZGl2PicgK1xuXHRcdFx0XHRcdFx0XHRcdCAnPGRpdiBjbGFzcz1cIm5vdGUtZGltZW5zaW9uLWRpc3BsYXlcIj4gMSB4IDEgPC9kaXY+JyArXG5cdFx0XHRcdFx0XHRcdCAgICc8L3VsPic7XG5cdFx0XHRcdHJldHVybiB0cGxJY29uQnV0dG9uKG9wdGlvbnMuaWNvblByZWZpeCArICd0YWJsZScsIHtcblx0XHRcdFx0XHR0aXRsZTogbGFuZy50YWJsZS50YWJsZSxcblx0XHRcdFx0XHRkcm9wZG93bjogZHJvcGRvd25cblx0XHRcdFx0fSk7XG5cdFx0XHR9LFxuXHRcdFx0c3R5bGU6IGZ1bmN0aW9uIChsYW5nLCBvcHRpb25zKSB7XG5cdFx0XHRcdHZhciBpdGVtcyA9IG9wdGlvbnMuc3R5bGVUYWdzLnJlZHVjZShmdW5jdGlvbiAobWVtbywgdikge1xuXHRcdFx0XHRcdHZhciBsYWJlbCA9IGxhbmcuc3R5bGVbdiA9PT0gJ3AnID8gJ25vcm1hbCcgOiB2XTtcblx0XHRcdFx0XHRyZXR1cm4gbWVtbyArICc8bGk+PGEgZGF0YS1ldmVudD1cImZvcm1hdEJsb2NrXCIgaHJlZj1cIiNcIiBkYXRhLXZhbHVlPVwiJyArIHYgKyAnXCI+JyArXG5cdFx0XHRcdFx0XHRcdCAoXG5cdFx0XHRcdFx0XHRcdCAgICh2ID09PSAncCcgfHwgdiA9PT0gJ3ByZScpID8gbGFiZWwgOlxuXHRcdFx0XHRcdFx0XHQgICAnPCcgKyB2ICsgJz4nICsgbGFiZWwgKyAnPC8nICsgdiArICc+J1xuXHRcdFx0XHRcdFx0XHQgKSArXG5cdFx0XHRcdFx0XHQgICAnPC9hPjwvbGk+Jztcblx0XHRcdFx0fSwgJycpO1xuXG5cdFx0XHRcdHJldHVybiB0cGxJY29uQnV0dG9uKG9wdGlvbnMuaWNvblByZWZpeCArICdtYWdpYycsIHtcblx0XHRcdFx0XHR0aXRsZTogbGFuZy5zdHlsZS5zdHlsZSxcblx0XHRcdFx0XHRkcm9wZG93bjogJzx1bCBjbGFzcz1cImRyb3Bkb3duLW1lbnVcIj4nICsgaXRlbXMgKyAnPC91bD4nXG5cdFx0XHRcdH0pO1xuXHRcdFx0fSxcblx0XHRcdGZvbnRuYW1lOiBmdW5jdGlvbiAobGFuZywgb3B0aW9ucykge1xuXHRcdFx0XHR2YXIgcmVhbEZvbnRMaXN0ID0gW107XG5cdFx0XHRcdHZhciBpdGVtcyA9IG9wdGlvbnMuZm9udE5hbWVzLnJlZHVjZShmdW5jdGlvbiAobWVtbywgdikge1xuXHRcdFx0XHRcdGlmICghYWdlbnQuaXNGb250SW5zdGFsbGVkKHYpICYmIG9wdGlvbnMuZm9udE5hbWVzSWdub3JlQ2hlY2suaW5kZXhPZih2KSA9PT0gLTEpIHtcblx0XHRcdFx0XHRcdHJldHVybiBtZW1vO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZWFsRm9udExpc3QucHVzaCh2KTtcblx0XHRcdFx0XHRyZXR1cm4gbWVtbyArICc8bGk+PGEgZGF0YS1ldmVudD1cImZvbnROYW1lXCIgaHJlZj1cIiNcIiBkYXRhLXZhbHVlPVwiJyArIHYgKyAnXCIgc3R5bGU9XCJmb250LWZhbWlseTpcXCcnICsgdiArICdcXCdcIj4nICtcblx0XHRcdFx0XHRcdFx0XHRcdCc8aSBjbGFzcz1cIicgKyBvcHRpb25zLmljb25QcmVmaXggKyAnY2hlY2tcIj48L2k+ICcgKyB2ICtcblx0XHRcdFx0XHRcdFx0XHQgICc8L2E+PC9saT4nO1xuXHRcdFx0XHR9LCAnJyk7XG5cblx0XHRcdFx0dmFyIGhhc0RlZmF1bHRGb250ID0gYWdlbnQuaXNGb250SW5zdGFsbGVkKG9wdGlvbnMuZGVmYXVsdEZvbnROYW1lKTtcblx0XHRcdFx0dmFyIGRlZmF1bHRGb250TmFtZSA9IChoYXNEZWZhdWx0Rm9udCkgPyBvcHRpb25zLmRlZmF1bHRGb250TmFtZSA6IHJlYWxGb250TGlzdFswXTtcblxuXHRcdFx0XHR2YXIgbGFiZWwgPSAnPHNwYW4gY2xhc3M9XCJub3RlLWN1cnJlbnQtZm9udG5hbWVcIj4nICtcblx0XHRcdFx0XHRcdFx0XHRkZWZhdWx0Rm9udE5hbWUgK1xuXHRcdFx0XHRcdFx0XHQgJzwvc3Bhbj4nO1xuXHRcdFx0XHRyZXR1cm4gdHBsQnV0dG9uKGxhYmVsLCB7XG5cdFx0XHRcdFx0dGl0bGU6IGxhbmcuZm9udC5uYW1lLFxuXHRcdFx0XHRcdGRyb3Bkb3duOiAnPHVsIGNsYXNzPVwiZHJvcGRvd24tbWVudVwiPicgKyBpdGVtcyArICc8L3VsPidcblx0XHRcdFx0fSk7XG5cdFx0XHR9LFxuXHRcdFx0Y29sb3I6IGZ1bmN0aW9uIChsYW5nLCBvcHRpb25zKSB7XG5cdFx0XHRcdHZhciBjb2xvckJ1dHRvbkxhYmVsID0gJzxpIGNsYXNzPVwiJyArIG9wdGlvbnMuaWNvblByZWZpeCArICdmb250XCIgc3R5bGU9XCJjb2xvcjpibGFjaztiYWNrZ3JvdW5kLWNvbG9yOnllbGxvdztcIj48L2k+Jztcblx0XHRcdFx0dmFyIGNvbG9yQnV0dG9uID0gdHBsQnV0dG9uKGNvbG9yQnV0dG9uTGFiZWwsIHtcblx0XHRcdFx0XHRjbGFzc05hbWU6ICdub3RlLXJlY2VudC1jb2xvcicsXG5cdFx0XHRcdFx0dGl0bGU6IGxhbmcuY29sb3IucmVjZW50LFxuXHRcdFx0XHRcdGV2ZW50OiAnY29sb3InLFxuXHRcdFx0XHRcdHZhbHVlOiAne1wiYmFja0NvbG9yXCI6XCJ5ZWxsb3dcIn0nXG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdHZhciBkcm9wZG93biA9ICc8dWwgY2xhc3M9XCJkcm9wZG93bi1tZW51XCI+JyArXG5cdFx0XHRcdFx0XHRcdFx0ICc8bGk+JyArXG5cdFx0XHRcdFx0XHRcdFx0ICAgJzxkaXYgY2xhc3M9XCJidG4tZ3JvdXBcIj4nICtcblx0XHRcdFx0XHRcdFx0XHRcdCAnPGRpdiBjbGFzcz1cIm5vdGUtcGFsZXR0ZS10aXRsZVwiPicgKyBsYW5nLmNvbG9yLmJhY2tncm91bmQgKyAnPC9kaXY+JyArXG5cdFx0XHRcdFx0XHRcdFx0XHQgJzxkaXYgY2xhc3M9XCJub3RlLWNvbG9yLXJlc2V0XCIgZGF0YS1ldmVudD1cImJhY2tDb2xvclwiJyArXG5cdFx0XHRcdFx0XHRcdFx0XHQgICAnIGRhdGEtdmFsdWU9XCJpbmhlcml0XCIgdGl0bGU9XCInICsgbGFuZy5jb2xvci50cmFuc3BhcmVudCArICdcIj4nICtcblx0XHRcdFx0XHRcdFx0XHRcdCAgIGxhbmcuY29sb3Iuc2V0VHJhbnNwYXJlbnQgK1xuXHRcdFx0XHRcdFx0XHRcdFx0ICc8L2Rpdj4nICtcblx0XHRcdFx0XHRcdFx0XHRcdCAnPGRpdiBjbGFzcz1cIm5vdGUtY29sb3ItcGFsZXR0ZVwiIGRhdGEtdGFyZ2V0LWV2ZW50PVwiYmFja0NvbG9yXCI+PC9kaXY+JyArXG5cdFx0XHRcdFx0XHRcdFx0ICAgJzwvZGl2PicgK1xuXHRcdFx0XHRcdFx0XHRcdCAgICc8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwXCI+JyArXG5cdFx0XHRcdFx0XHRcdFx0XHQgJzxkaXYgY2xhc3M9XCJub3RlLXBhbGV0dGUtdGl0bGVcIj4nICsgbGFuZy5jb2xvci5mb3JlZ3JvdW5kICsgJzwvZGl2PicgK1xuXHRcdFx0XHRcdFx0XHRcdFx0ICc8ZGl2IGNsYXNzPVwibm90ZS1jb2xvci1yZXNldFwiIGRhdGEtZXZlbnQ9XCJmb3JlQ29sb3JcIiBkYXRhLXZhbHVlPVwiaW5oZXJpdFwiIHRpdGxlPVwiJyArIGxhbmcuY29sb3IucmVzZXQgKyAnXCI+JyArXG5cdFx0XHRcdFx0XHRcdFx0XHQgICBsYW5nLmNvbG9yLnJlc2V0VG9EZWZhdWx0ICtcblx0XHRcdFx0XHRcdFx0XHRcdCAnPC9kaXY+JyArXG5cdFx0XHRcdFx0XHRcdFx0XHQgJzxkaXYgY2xhc3M9XCJub3RlLWNvbG9yLXBhbGV0dGVcIiBkYXRhLXRhcmdldC1ldmVudD1cImZvcmVDb2xvclwiPjwvZGl2PicgK1xuXHRcdFx0XHRcdFx0XHRcdCAgICc8L2Rpdj4nICtcblx0XHRcdFx0XHRcdFx0XHQgJzwvbGk+JyArXG5cdFx0XHRcdFx0XHRcdCAgICc8L3VsPic7XG5cblx0XHRcdFx0dmFyIG1vcmVCdXR0b24gPSB0cGxCdXR0b24oJycsIHtcblx0XHRcdFx0XHR0aXRsZTogbGFuZy5jb2xvci5tb3JlLFxuXHRcdFx0XHRcdGRyb3Bkb3duOiBkcm9wZG93blxuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHRyZXR1cm4gY29sb3JCdXR0b24gKyBtb3JlQnV0dG9uO1xuXHRcdFx0fSxcblx0XHRcdGJvbGQ6IGZ1bmN0aW9uIChsYW5nLCBvcHRpb25zKSB7XG5cdFx0XHRcdHJldHVybiB0cGxJY29uQnV0dG9uKG9wdGlvbnMuaWNvblByZWZpeCArICdib2xkJywge1xuXHRcdFx0XHRcdGV2ZW50OiAnYm9sZCcsXG5cdFx0XHRcdFx0dGl0bGU6IGxhbmcuZm9udC5ib2xkXG5cdFx0XHRcdH0pO1xuXHRcdFx0fSxcblx0XHRcdGl0YWxpYzogZnVuY3Rpb24gKGxhbmcsIG9wdGlvbnMpIHtcblx0XHRcdFx0cmV0dXJuIHRwbEljb25CdXR0b24ob3B0aW9ucy5pY29uUHJlZml4ICsgJ2l0YWxpYycsIHtcblx0XHRcdFx0XHRldmVudDogJ2l0YWxpYycsXG5cdFx0XHRcdFx0dGl0bGU6IGxhbmcuZm9udC5pdGFsaWNcblx0XHRcdFx0fSk7XG5cdFx0XHR9LFxuXHRcdFx0dW5kZXJsaW5lOiBmdW5jdGlvbiAobGFuZywgb3B0aW9ucykge1xuXHRcdFx0XHRyZXR1cm4gdHBsSWNvbkJ1dHRvbihvcHRpb25zLmljb25QcmVmaXggKyAndW5kZXJsaW5lJywge1xuXHRcdFx0XHRcdGV2ZW50OiAndW5kZXJsaW5lJyxcblx0XHRcdFx0XHR0aXRsZTogbGFuZy5mb250LnVuZGVybGluZVxuXHRcdFx0XHR9KTtcblx0XHRcdH0sXG5cdFx0XHRjbGVhcjogZnVuY3Rpb24gKGxhbmcsIG9wdGlvbnMpIHtcblx0XHRcdFx0cmV0dXJuIHRwbEljb25CdXR0b24ob3B0aW9ucy5pY29uUHJlZml4ICsgJ2VyYXNlcicsIHtcblx0XHRcdFx0XHRldmVudDogJ3JlbW92ZUZvcm1hdCcsXG5cdFx0XHRcdFx0dGl0bGU6IGxhbmcuZm9udC5jbGVhclxuXHRcdFx0XHR9KTtcblx0XHRcdH0sXG5cdFx0XHR1bDogZnVuY3Rpb24gKGxhbmcsIG9wdGlvbnMpIHtcblx0XHRcdFx0cmV0dXJuIHRwbEljb25CdXR0b24ob3B0aW9ucy5pY29uUHJlZml4ICsgJ2xpc3QtdWwnLCB7XG5cdFx0XHRcdFx0ZXZlbnQ6ICdpbnNlcnRVbm9yZGVyZWRMaXN0Jyxcblx0XHRcdFx0XHR0aXRsZTogbGFuZy5saXN0cy51bm9yZGVyZWRcblx0XHRcdFx0fSk7XG5cdFx0XHR9LFxuXHRcdFx0b2w6IGZ1bmN0aW9uIChsYW5nLCBvcHRpb25zKSB7XG5cdFx0XHRcdHJldHVybiB0cGxJY29uQnV0dG9uKG9wdGlvbnMuaWNvblByZWZpeCArICdsaXN0LW9sJywge1xuXHRcdFx0XHRcdGV2ZW50OiAnaW5zZXJ0T3JkZXJlZExpc3QnLFxuXHRcdFx0XHRcdHRpdGxlOiBsYW5nLmxpc3RzLm9yZGVyZWRcblx0XHRcdFx0fSk7XG5cdFx0XHR9LFxuXHRcdFx0cGFyYWdyYXBoOiBmdW5jdGlvbiAobGFuZywgb3B0aW9ucykge1xuXHRcdFx0XHR2YXIgbGVmdEJ1dHRvbiA9IHRwbEljb25CdXR0b24ob3B0aW9ucy5pY29uUHJlZml4ICsgJ2FsaWduLWxlZnQnLCB7XG5cdFx0XHRcdFx0dGl0bGU6IGxhbmcucGFyYWdyYXBoLmxlZnQsXG5cdFx0XHRcdFx0ZXZlbnQ6ICdqdXN0aWZ5TGVmdCdcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHZhciBjZW50ZXJCdXR0b24gPSB0cGxJY29uQnV0dG9uKG9wdGlvbnMuaWNvblByZWZpeCArICdhbGlnbi1jZW50ZXInLCB7XG5cdFx0XHRcdFx0dGl0bGU6IGxhbmcucGFyYWdyYXBoLmNlbnRlcixcblx0XHRcdFx0XHRldmVudDogJ2p1c3RpZnlDZW50ZXInXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR2YXIgcmlnaHRCdXR0b24gPSB0cGxJY29uQnV0dG9uKG9wdGlvbnMuaWNvblByZWZpeCArICdhbGlnbi1yaWdodCcsIHtcblx0XHRcdFx0XHR0aXRsZTogbGFuZy5wYXJhZ3JhcGgucmlnaHQsXG5cdFx0XHRcdFx0ZXZlbnQ6ICdqdXN0aWZ5UmlnaHQnXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR2YXIganVzdGlmeUJ1dHRvbiA9IHRwbEljb25CdXR0b24ob3B0aW9ucy5pY29uUHJlZml4ICsgJ2FsaWduLWp1c3RpZnknLCB7XG5cdFx0XHRcdFx0dGl0bGU6IGxhbmcucGFyYWdyYXBoLmp1c3RpZnksXG5cdFx0XHRcdFx0ZXZlbnQ6ICdqdXN0aWZ5RnVsbCdcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0dmFyIG91dGRlbnRCdXR0b24gPSB0cGxJY29uQnV0dG9uKG9wdGlvbnMuaWNvblByZWZpeCArICdvdXRkZW50Jywge1xuXHRcdFx0XHRcdHRpdGxlOiBsYW5nLnBhcmFncmFwaC5vdXRkZW50LFxuXHRcdFx0XHRcdGV2ZW50OiAnb3V0ZGVudCdcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHZhciBpbmRlbnRCdXR0b24gPSB0cGxJY29uQnV0dG9uKG9wdGlvbnMuaWNvblByZWZpeCArICdpbmRlbnQnLCB7XG5cdFx0XHRcdFx0dGl0bGU6IGxhbmcucGFyYWdyYXBoLmluZGVudCxcblx0XHRcdFx0XHRldmVudDogJ2luZGVudCdcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0dmFyIGRyb3Bkb3duID0gJzxkaXYgY2xhc3M9XCJkcm9wZG93bi1tZW51XCI+JyArXG5cdFx0XHRcdFx0XHRcdFx0ICc8ZGl2IGNsYXNzPVwibm90ZS1hbGlnbiBidG4tZ3JvdXBcIj4nICtcblx0XHRcdFx0XHRcdFx0XHQgICBsZWZ0QnV0dG9uICsgY2VudGVyQnV0dG9uICsgcmlnaHRCdXR0b24gKyBqdXN0aWZ5QnV0dG9uICtcblx0XHRcdFx0XHRcdFx0XHQgJzwvZGl2PicgK1xuXHRcdFx0XHRcdFx0XHRcdCAnPGRpdiBjbGFzcz1cIm5vdGUtbGlzdCBidG4tZ3JvdXBcIj4nICtcblx0XHRcdFx0XHRcdFx0XHQgICBpbmRlbnRCdXR0b24gKyBvdXRkZW50QnV0dG9uICtcblx0XHRcdFx0XHRcdFx0XHQgJzwvZGl2PicgK1xuXHRcdFx0XHRcdFx0XHQgICAnPC9kaXY+JztcblxuXHRcdFx0XHRyZXR1cm4gdHBsSWNvbkJ1dHRvbihvcHRpb25zLmljb25QcmVmaXggKyAnYWxpZ24tbGVmdCcsIHtcblx0XHRcdFx0XHR0aXRsZTogbGFuZy5wYXJhZ3JhcGgucGFyYWdyYXBoLFxuXHRcdFx0XHRcdGRyb3Bkb3duOiBkcm9wZG93blxuXHRcdFx0XHR9KTtcblx0XHRcdH0sXG5cdFx0XHRoZWlnaHQ6IGZ1bmN0aW9uIChsYW5nLCBvcHRpb25zKSB7XG5cdFx0XHRcdHZhciBpdGVtcyA9IG9wdGlvbnMubGluZUhlaWdodHMucmVkdWNlKGZ1bmN0aW9uIChtZW1vLCB2KSB7XG5cdFx0XHRcdFx0cmV0dXJuIG1lbW8gKyAnPGxpPjxhIGRhdGEtZXZlbnQ9XCJsaW5lSGVpZ2h0XCIgaHJlZj1cIiNcIiBkYXRhLXZhbHVlPVwiJyArIHBhcnNlRmxvYXQodikgKyAnXCI+JyArXG5cdFx0XHRcdFx0XHRcdFx0XHQnPGkgY2xhc3M9XCInICsgb3B0aW9ucy5pY29uUHJlZml4ICsgJ2NoZWNrXCI+PC9pPiAnICsgdiArXG5cdFx0XHRcdFx0XHRcdFx0ICAnPC9hPjwvbGk+Jztcblx0XHRcdFx0fSwgJycpO1xuXG5cdFx0XHRcdHJldHVybiB0cGxJY29uQnV0dG9uKG9wdGlvbnMuaWNvblByZWZpeCArICd0ZXh0LWhlaWdodCcsIHtcblx0XHRcdFx0XHR0aXRsZTogbGFuZy5mb250LmhlaWdodCxcblx0XHRcdFx0XHRkcm9wZG93bjogJzx1bCBjbGFzcz1cImRyb3Bkb3duLW1lbnVcIj4nICsgaXRlbXMgKyAnPC91bD4nXG5cdFx0XHRcdH0pO1xuXG5cdFx0XHR9LFxuXHRcdFx0aGVscDogZnVuY3Rpb24gKGxhbmcsIG9wdGlvbnMpIHtcblx0XHRcdFx0cmV0dXJuIHRwbEljb25CdXR0b24ob3B0aW9ucy5pY29uUHJlZml4ICsgJ3F1ZXN0aW9uJywge1xuXHRcdFx0XHRcdGV2ZW50OiAnc2hvd0hlbHBEaWFsb2cnLFxuXHRcdFx0XHRcdHRpdGxlOiBsYW5nLm9wdGlvbnMuaGVscCxcblx0XHRcdFx0XHRoaWRlOiB0cnVlXG5cdFx0XHRcdH0pO1xuXHRcdFx0fSxcblx0XHRcdGZ1bGxzY3JlZW46IGZ1bmN0aW9uIChsYW5nLCBvcHRpb25zKSB7XG5cdFx0XHRcdHJldHVybiB0cGxJY29uQnV0dG9uKG9wdGlvbnMuaWNvblByZWZpeCArICdhcnJvd3MtYWx0Jywge1xuXHRcdFx0XHRcdGV2ZW50OiAnZnVsbHNjcmVlbicsXG5cdFx0XHRcdFx0dGl0bGU6IGxhbmcub3B0aW9ucy5mdWxsc2NyZWVuXG5cdFx0XHRcdH0pO1xuXHRcdFx0fSxcblx0XHRcdGNvZGV2aWV3OiBmdW5jdGlvbiAobGFuZywgb3B0aW9ucykge1xuXHRcdFx0XHRyZXR1cm4gdHBsSWNvbkJ1dHRvbihvcHRpb25zLmljb25QcmVmaXggKyAnY29kZScsIHtcblx0XHRcdFx0XHRldmVudDogJ2NvZGV2aWV3Jyxcblx0XHRcdFx0XHR0aXRsZTogbGFuZy5vcHRpb25zLmNvZGV2aWV3XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSxcblx0XHRcdHVuZG86IGZ1bmN0aW9uIChsYW5nLCBvcHRpb25zKSB7XG5cdFx0XHRcdHJldHVybiB0cGxJY29uQnV0dG9uKG9wdGlvbnMuaWNvblByZWZpeCArICd1bmRvJywge1xuXHRcdFx0XHRcdGV2ZW50OiAndW5kbycsXG5cdFx0XHRcdFx0dGl0bGU6IGxhbmcuaGlzdG9yeS51bmRvXG5cdFx0XHRcdH0pO1xuXHRcdFx0fSxcblx0XHRcdHJlZG86IGZ1bmN0aW9uIChsYW5nLCBvcHRpb25zKSB7XG5cdFx0XHRcdHJldHVybiB0cGxJY29uQnV0dG9uKG9wdGlvbnMuaWNvblByZWZpeCArICdyZXBlYXQnLCB7XG5cdFx0XHRcdFx0ZXZlbnQ6ICdyZWRvJyxcblx0XHRcdFx0XHR0aXRsZTogbGFuZy5oaXN0b3J5LnJlZG9cblx0XHRcdFx0fSk7XG5cdFx0XHR9LFxuXHRcdFx0aHI6IGZ1bmN0aW9uIChsYW5nLCBvcHRpb25zKSB7XG5cdFx0XHRcdHJldHVybiB0cGxJY29uQnV0dG9uKG9wdGlvbnMuaWNvblByZWZpeCArICdtaW51cycsIHtcblx0XHRcdFx0XHRldmVudDogJ2luc2VydEhvcml6b250YWxSdWxlJyxcblx0XHRcdFx0XHR0aXRsZTogbGFuZy5oci5pbnNlcnRcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdHZhciB0cGxQb3BvdmVycyA9IGZ1bmN0aW9uIChsYW5nLCBvcHRpb25zKSB7XG5cdFx0XHR2YXIgdHBsTGlua1BvcG92ZXIgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHZhciBsaW5rQnV0dG9uID0gdHBsSWNvbkJ1dHRvbihvcHRpb25zLmljb25QcmVmaXggKyAnZWRpdCcsIHtcblx0XHRcdFx0XHR0aXRsZTogbGFuZy5saW5rLmVkaXQsXG5cdFx0XHRcdFx0ZXZlbnQ6ICdzaG93TGlua0RpYWxvZycsXG5cdFx0XHRcdFx0aGlkZTogdHJ1ZVxuXHRcdFx0XHR9KTtcblx0XHRcdFx0dmFyIHVubGlua0J1dHRvbiA9IHRwbEljb25CdXR0b24ob3B0aW9ucy5pY29uUHJlZml4ICsgJ3VubGluaycsIHtcblx0XHRcdFx0XHR0aXRsZTogbGFuZy5saW5rLnVubGluayxcblx0XHRcdFx0XHRldmVudDogJ3VubGluaydcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHZhciBjb250ZW50ID0gJzxhIGhyZWY9XCJodHRwOi8vd3d3Lmdvb2dsZS5jb21cIiB0YXJnZXQ9XCJfYmxhbmtcIj53d3cuZ29vZ2xlLmNvbTwvYT4mbmJzcDsmbmJzcDsnICtcblx0XHRcdFx0XHRcdFx0ICAnPGRpdiBjbGFzcz1cIm5vdGUtaW5zZXJ0IGJ0bi1ncm91cFwiPicgK1xuXHRcdFx0XHRcdFx0XHRcdGxpbmtCdXR0b24gKyB1bmxpbmtCdXR0b24gK1xuXHRcdFx0XHRcdFx0XHQgICc8L2Rpdj4nO1xuXHRcdFx0XHRyZXR1cm4gdHBsUG9wb3Zlcignbm90ZS1saW5rLXBvcG92ZXInLCBjb250ZW50KTtcblx0XHRcdH07XG5cblx0XHRcdHZhciB0cGxJbWFnZVBvcG92ZXIgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHZhciBmdWxsQnV0dG9uID0gdHBsQnV0dG9uKCc8c3BhbiBjbGFzcz1cIm5vdGUtZm9udHNpemUtMTBcIj4xMDAlPC9zcGFuPicsIHtcblx0XHRcdFx0XHR0aXRsZTogbGFuZy5pbWFnZS5yZXNpemVGdWxsLFxuXHRcdFx0XHRcdGV2ZW50OiAncmVzaXplJyxcblx0XHRcdFx0XHR2YWx1ZTogJzEnXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR2YXIgaGFsZkJ1dHRvbiA9IHRwbEJ1dHRvbignPHNwYW4gY2xhc3M9XCJub3RlLWZvbnRzaXplLTEwXCI+NTAlPC9zcGFuPicsIHtcblx0XHRcdFx0XHR0aXRsZTogbGFuZy5pbWFnZS5yZXNpemVIYWxmLFxuXHRcdFx0XHRcdGV2ZW50OiAncmVzaXplJyxcblx0XHRcdFx0XHR2YWx1ZTogJzAuNSdcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHZhciBxdWFydGVyQnV0dG9uID0gdHBsQnV0dG9uKCc8c3BhbiBjbGFzcz1cIm5vdGUtZm9udHNpemUtMTBcIj4yNSU8L3NwYW4+Jywge1xuXHRcdFx0XHRcdHRpdGxlOiBsYW5nLmltYWdlLnJlc2l6ZVF1YXJ0ZXIsXG5cdFx0XHRcdFx0ZXZlbnQ6ICdyZXNpemUnLFxuXHRcdFx0XHRcdHZhbHVlOiAnMC4yNSdcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0dmFyIGxlZnRCdXR0b24gPSB0cGxJY29uQnV0dG9uKG9wdGlvbnMuaWNvblByZWZpeCArICdhbGlnbi1sZWZ0Jywge1xuXHRcdFx0XHRcdHRpdGxlOiBsYW5nLmltYWdlLmZsb2F0TGVmdCxcblx0XHRcdFx0XHRldmVudDogJ2Zsb2F0TWUnLFxuXHRcdFx0XHRcdHZhbHVlOiAnbGVmdCdcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHZhciByaWdodEJ1dHRvbiA9IHRwbEljb25CdXR0b24ob3B0aW9ucy5pY29uUHJlZml4ICsgJ2FsaWduLXJpZ2h0Jywge1xuXHRcdFx0XHRcdHRpdGxlOiBsYW5nLmltYWdlLmZsb2F0UmlnaHQsXG5cdFx0XHRcdFx0ZXZlbnQ6ICdmbG9hdE1lJyxcblx0XHRcdFx0XHR2YWx1ZTogJ3JpZ2h0J1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0dmFyIGp1c3RpZnlCdXR0b24gPSB0cGxJY29uQnV0dG9uKG9wdGlvbnMuaWNvblByZWZpeCArICdhbGlnbi1qdXN0aWZ5Jywge1xuXHRcdFx0XHRcdHRpdGxlOiBsYW5nLmltYWdlLmZsb2F0Tm9uZSxcblx0XHRcdFx0XHRldmVudDogJ2Zsb2F0TWUnLFxuXHRcdFx0XHRcdHZhbHVlOiAnbm9uZSdcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0dmFyIHJvdW5kZWRCdXR0b24gPSB0cGxJY29uQnV0dG9uKG9wdGlvbnMuaWNvblByZWZpeCArICdzcXVhcmUnLCB7XG5cdFx0XHRcdFx0dGl0bGU6IGxhbmcuaW1hZ2Uuc2hhcGVSb3VuZGVkLFxuXHRcdFx0XHRcdGV2ZW50OiAnaW1hZ2VTaGFwZScsXG5cdFx0XHRcdFx0dmFsdWU6ICdpbWctcm91bmRlZCdcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHZhciBjaXJjbGVCdXR0b24gPSB0cGxJY29uQnV0dG9uKG9wdGlvbnMuaWNvblByZWZpeCArICdjaXJjbGUtbycsIHtcblx0XHRcdFx0XHR0aXRsZTogbGFuZy5pbWFnZS5zaGFwZUNpcmNsZSxcblx0XHRcdFx0XHRldmVudDogJ2ltYWdlU2hhcGUnLFxuXHRcdFx0XHRcdHZhbHVlOiAnaW1nLWNpcmNsZSdcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHZhciB0aHVtYm5haWxCdXR0b24gPSB0cGxJY29uQnV0dG9uKG9wdGlvbnMuaWNvblByZWZpeCArICdwaWN0dXJlLW8nLCB7XG5cdFx0XHRcdFx0dGl0bGU6IGxhbmcuaW1hZ2Uuc2hhcGVUaHVtYm5haWwsXG5cdFx0XHRcdFx0ZXZlbnQ6ICdpbWFnZVNoYXBlJyxcblx0XHRcdFx0XHR2YWx1ZTogJ2ltZy10aHVtYm5haWwnXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR2YXIgbm9uZUJ1dHRvbiA9IHRwbEljb25CdXR0b24ob3B0aW9ucy5pY29uUHJlZml4ICsgJ3RpbWVzJywge1xuXHRcdFx0XHRcdHRpdGxlOiBsYW5nLmltYWdlLnNoYXBlTm9uZSxcblx0XHRcdFx0XHRldmVudDogJ2ltYWdlU2hhcGUnLFxuXHRcdFx0XHRcdHZhbHVlOiAnJ1xuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHR2YXIgcmVtb3ZlQnV0dG9uID0gdHBsSWNvbkJ1dHRvbihvcHRpb25zLmljb25QcmVmaXggKyAndHJhc2gtbycsIHtcblx0XHRcdFx0XHR0aXRsZTogbGFuZy5pbWFnZS5yZW1vdmUsXG5cdFx0XHRcdFx0ZXZlbnQ6ICdyZW1vdmVNZWRpYScsXG5cdFx0XHRcdFx0dmFsdWU6ICdub25lJ1xuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHR2YXIgY29udGVudCA9ICc8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwXCI+JyArIGZ1bGxCdXR0b24gKyBoYWxmQnV0dG9uICsgcXVhcnRlckJ1dHRvbiArICc8L2Rpdj4nICtcblx0XHRcdFx0XHRcdFx0ICAnPGRpdiBjbGFzcz1cImJ0bi1ncm91cFwiPicgKyBsZWZ0QnV0dG9uICsgcmlnaHRCdXR0b24gKyBqdXN0aWZ5QnV0dG9uICsgJzwvZGl2PicgK1xuXHRcdFx0XHRcdFx0XHQgICc8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwXCI+JyArIHJvdW5kZWRCdXR0b24gKyBjaXJjbGVCdXR0b24gKyB0aHVtYm5haWxCdXR0b24gKyBub25lQnV0dG9uICsgJzwvZGl2PicgK1xuXHRcdFx0XHRcdFx0XHQgICc8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwXCI+JyArIHJlbW92ZUJ1dHRvbiArICc8L2Rpdj4nO1xuXHRcdFx0XHRyZXR1cm4gdHBsUG9wb3Zlcignbm90ZS1pbWFnZS1wb3BvdmVyJywgY29udGVudCk7XG5cdFx0XHR9O1xuXG5cdFx0XHR2YXIgdHBsQWlyUG9wb3ZlciA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0dmFyICRjb250ZW50ID0gJCgnPGRpdiAvPicpO1xuXHRcdFx0XHRmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBvcHRpb25zLmFpclBvcG92ZXIubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG5cdFx0XHRcdFx0dmFyIGdyb3VwID0gb3B0aW9ucy5haXJQb3BvdmVyW2lkeF07XG5cblx0XHRcdFx0XHR2YXIgJGdyb3VwID0gJCgnPGRpdiBjbGFzcz1cIm5vdGUtJyArIGdyb3VwWzBdICsgJyBidG4tZ3JvdXBcIj4nKTtcblx0XHRcdFx0XHRmb3IgKHZhciBpID0gMCwgbGVuR3JvdXAgPSBncm91cFsxXS5sZW5ndGg7IGkgPCBsZW5Hcm91cDsgaSsrKSB7XG5cdFx0XHRcdFx0XHR2YXIgJGJ1dHRvbiA9ICQodHBsQnV0dG9uSW5mb1tncm91cFsxXVtpXV0obGFuZywgb3B0aW9ucykpO1xuXG5cdFx0XHRcdFx0XHQkYnV0dG9uLmF0dHIoJ2RhdGEtbmFtZScsIGdyb3VwWzFdW2ldKTtcblxuXHRcdFx0XHRcdFx0JGdyb3VwLmFwcGVuZCgkYnV0dG9uKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0JGNvbnRlbnQuYXBwZW5kKCRncm91cCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gdHBsUG9wb3Zlcignbm90ZS1haXItcG9wb3ZlcicsICRjb250ZW50LmNoaWxkcmVuKCkpO1xuXHRcdFx0fTtcblxuXHRcdFx0dmFyICRub3RlUG9wb3ZlciA9ICQoJzxkaXYgY2xhc3M9XCJub3RlLXBvcG92ZXJcIiAvPicpO1xuXG5cdFx0XHQkbm90ZVBvcG92ZXIuYXBwZW5kKHRwbExpbmtQb3BvdmVyKCkpO1xuXHRcdFx0JG5vdGVQb3BvdmVyLmFwcGVuZCh0cGxJbWFnZVBvcG92ZXIoKSk7XG5cblx0XHRcdGlmIChvcHRpb25zLmFpck1vZGUpIHtcblx0XHRcdFx0JG5vdGVQb3BvdmVyLmFwcGVuZCh0cGxBaXJQb3BvdmVyKCkpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gJG5vdGVQb3BvdmVyO1xuXHRcdH07XG5cblx0XHR2YXIgdHBsSGFuZGxlcyA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdHJldHVybiAnPGRpdiBjbGFzcz1cIm5vdGUtaGFuZGxlXCI+JyArXG5cdFx0XHRcdFx0ICc8ZGl2IGNsYXNzPVwibm90ZS1jb250cm9sLXNlbGVjdGlvblwiPicgK1xuXHRcdFx0XHRcdCAgICc8ZGl2IGNsYXNzPVwibm90ZS1jb250cm9sLXNlbGVjdGlvbi1iZ1wiPjwvZGl2PicgK1xuXHRcdFx0XHRcdCAgICc8ZGl2IGNsYXNzPVwibm90ZS1jb250cm9sLWhvbGRlciBub3RlLWNvbnRyb2wtbndcIj48L2Rpdj4nICtcblx0XHRcdFx0XHQgICAnPGRpdiBjbGFzcz1cIm5vdGUtY29udHJvbC1ob2xkZXIgbm90ZS1jb250cm9sLW5lXCI+PC9kaXY+JyArXG5cdFx0XHRcdFx0ICAgJzxkaXYgY2xhc3M9XCJub3RlLWNvbnRyb2wtaG9sZGVyIG5vdGUtY29udHJvbC1zd1wiPjwvZGl2PicgK1xuXHRcdFx0XHRcdCAgICc8ZGl2IGNsYXNzPVwibm90ZS1jb250cm9sLXNpemluZyBub3RlLWNvbnRyb2wtc2VcIj48L2Rpdj4nICtcblx0XHRcdFx0XHQgICAnPGRpdiBjbGFzcz1cIm5vdGUtY29udHJvbC1zZWxlY3Rpb24taW5mb1wiPjwvZGl2PicgK1xuXHRcdFx0XHRcdCAnPC9kaXY+JyArXG5cdFx0XHRcdCAgICc8L2Rpdj4nO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBzaG9ydGN1dCB0YWJsZSB0ZW1wbGF0ZVxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSB0aXRsZVxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSBib2R5XG5cdFx0ICovXG5cdFx0dmFyIHRwbFNob3J0Y3V0ID0gZnVuY3Rpb24gKHRpdGxlLCBrZXlzKSB7XG5cdFx0XHR2YXIga2V5Q2xhc3MgPSAnbm90ZS1zaG9ydGN1dC1jb2wgY29sLXhzLTYgbm90ZS1zaG9ydGN1dC0nO1xuXHRcdFx0dmFyIGJvZHkgPSBbXTtcblxuXHRcdFx0Zm9yICh2YXIgaSBpbiBrZXlzKSB7XG5cdFx0XHRcdGlmIChrZXlzLmhhc093blByb3BlcnR5KGkpKSB7XG5cdFx0XHRcdFx0Ym9keS5wdXNoKFxuXHRcdFx0XHRcdCAgJzxkaXYgY2xhc3M9XCInICsga2V5Q2xhc3MgKyAna2V5XCI+JyArIGtleXNbaV0ua2JkICsgJzwvZGl2PicgK1xuXHRcdFx0XHRcdCAgJzxkaXYgY2xhc3M9XCInICsga2V5Q2xhc3MgKyAnbmFtZVwiPicgKyBrZXlzW2ldLnRleHQgKyAnPC9kaXY+J1xuXHRcdFx0XHRcdCAgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gJzxkaXYgY2xhc3M9XCJub3RlLXNob3J0Y3V0LXJvdyByb3dcIj48ZGl2IGNsYXNzPVwiJyArIGtleUNsYXNzICsgJ3RpdGxlIGNvbC14cy1vZmZzZXQtNlwiPicgKyB0aXRsZSArICc8L2Rpdj48L2Rpdj4nICtcblx0XHRcdFx0ICAgJzxkaXYgY2xhc3M9XCJub3RlLXNob3J0Y3V0LXJvdyByb3dcIj4nICsgYm9keS5qb2luKCc8L2Rpdj48ZGl2IGNsYXNzPVwibm90ZS1zaG9ydGN1dC1yb3cgcm93XCI+JykgKyAnPC9kaXY+Jztcblx0XHR9O1xuXG5cdFx0dmFyIHRwbFNob3J0Y3V0VGV4dCA9IGZ1bmN0aW9uIChsYW5nKSB7XG5cdFx0XHR2YXIga2V5cyA9IFtcblx0XHRcdCAgeyBrYmQ6ICfijJggKyBCJywgdGV4dDogbGFuZy5mb250LmJvbGQgfSxcblx0XHRcdCAgeyBrYmQ6ICfijJggKyBJJywgdGV4dDogbGFuZy5mb250Lml0YWxpYyB9LFxuXHRcdFx0ICB7IGtiZDogJ+KMmCArIFUnLCB0ZXh0OiBsYW5nLmZvbnQudW5kZXJsaW5lIH0sXG5cdFx0XHQgIHsga2JkOiAn4oyYICsgXFxcXCcsIHRleHQ6IGxhbmcuZm9udC5jbGVhciB9XG5cdFx0XHRdO1xuXG5cdFx0XHRyZXR1cm4gdHBsU2hvcnRjdXQobGFuZy5zaG9ydGN1dC50ZXh0Rm9ybWF0dGluZywga2V5cyk7XG5cdFx0fTtcblxuXHRcdHZhciB0cGxTaG9ydGN1dEFjdGlvbiA9IGZ1bmN0aW9uIChsYW5nKSB7XG5cdFx0XHR2YXIga2V5cyA9IFtcblx0XHRcdCAgeyBrYmQ6ICfijJggKyBaJywgdGV4dDogbGFuZy5oaXN0b3J5LnVuZG8gfSxcblx0XHRcdCAgeyBrYmQ6ICfijJggKyDih6cgKyBaJywgdGV4dDogbGFuZy5oaXN0b3J5LnJlZG8gfSxcblx0XHRcdCAgeyBrYmQ6ICfijJggKyBdJywgdGV4dDogbGFuZy5wYXJhZ3JhcGguaW5kZW50IH0sXG5cdFx0XHQgIHsga2JkOiAn4oyYICsgWycsIHRleHQ6IGxhbmcucGFyYWdyYXBoLm91dGRlbnQgfSxcblx0XHRcdCAgeyBrYmQ6ICfijJggKyBFTlRFUicsIHRleHQ6IGxhbmcuaHIuaW5zZXJ0IH1cblx0XHRcdF07XG5cblx0XHRcdHJldHVybiB0cGxTaG9ydGN1dChsYW5nLnNob3J0Y3V0LmFjdGlvbiwga2V5cyk7XG5cdFx0fTtcblxuXHRcdHZhciB0cGxTaG9ydGN1dFBhcmEgPSBmdW5jdGlvbiAobGFuZykge1xuXHRcdFx0dmFyIGtleXMgPSBbXG5cdFx0XHQgIHsga2JkOiAn4oyYICsg4oenICsgTCcsIHRleHQ6IGxhbmcucGFyYWdyYXBoLmxlZnQgfSxcblx0XHRcdCAgeyBrYmQ6ICfijJggKyDih6cgKyBFJywgdGV4dDogbGFuZy5wYXJhZ3JhcGguY2VudGVyIH0sXG5cdFx0XHQgIHsga2JkOiAn4oyYICsg4oenICsgUicsIHRleHQ6IGxhbmcucGFyYWdyYXBoLnJpZ2h0IH0sXG5cdFx0XHQgIHsga2JkOiAn4oyYICsg4oenICsgSicsIHRleHQ6IGxhbmcucGFyYWdyYXBoLmp1c3RpZnkgfSxcblx0XHRcdCAgeyBrYmQ6ICfijJggKyDih6cgKyBOVU03JywgdGV4dDogbGFuZy5saXN0cy5vcmRlcmVkIH0sXG5cdFx0XHQgIHsga2JkOiAn4oyYICsg4oenICsgTlVNOCcsIHRleHQ6IGxhbmcubGlzdHMudW5vcmRlcmVkIH1cblx0XHRcdF07XG5cblx0XHRcdHJldHVybiB0cGxTaG9ydGN1dChsYW5nLnNob3J0Y3V0LnBhcmFncmFwaEZvcm1hdHRpbmcsIGtleXMpO1xuXHRcdH07XG5cblx0XHR2YXIgdHBsU2hvcnRjdXRTdHlsZSA9IGZ1bmN0aW9uIChsYW5nKSB7XG5cdFx0XHR2YXIga2V5cyA9IFtcblx0XHRcdCAgeyBrYmQ6ICfijJggKyBOVU0wJywgdGV4dDogbGFuZy5zdHlsZS5ub3JtYWwgfSxcblx0XHRcdCAgeyBrYmQ6ICfijJggKyBOVU0xJywgdGV4dDogbGFuZy5zdHlsZS5oMSB9LFxuXHRcdFx0ICB7IGtiZDogJ+KMmCArIE5VTTInLCB0ZXh0OiBsYW5nLnN0eWxlLmgyIH0sXG5cdFx0XHQgIHsga2JkOiAn4oyYICsgTlVNMycsIHRleHQ6IGxhbmcuc3R5bGUuaDMgfSxcblx0XHRcdCAgeyBrYmQ6ICfijJggKyBOVU00JywgdGV4dDogbGFuZy5zdHlsZS5oNCB9LFxuXHRcdFx0ICB7IGtiZDogJ+KMmCArIE5VTTUnLCB0ZXh0OiBsYW5nLnN0eWxlLmg1IH0sXG5cdFx0XHQgIHsga2JkOiAn4oyYICsgTlVNNicsIHRleHQ6IGxhbmcuc3R5bGUuaDYgfVxuXHRcdFx0XTtcblxuXHRcdFx0cmV0dXJuIHRwbFNob3J0Y3V0KGxhbmcuc2hvcnRjdXQuZG9jdW1lbnRTdHlsZSwga2V5cyk7XG5cdFx0fTtcblxuXHRcdHZhciB0cGxFeHRyYVNob3J0Y3V0cyA9IGZ1bmN0aW9uIChsYW5nLCBvcHRpb25zKSB7XG5cdFx0XHR2YXIgZXh0cmFLZXlzID0gb3B0aW9ucy5leHRyYUtleXM7XG5cdFx0XHR2YXIga2V5cyA9IFtdO1xuXG5cdFx0XHRmb3IgKHZhciBrZXkgaW4gZXh0cmFLZXlzKSB7XG5cdFx0XHRcdGlmIChleHRyYUtleXMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuXHRcdFx0XHRcdGtleXMucHVzaCh7IGtiZDoga2V5LCB0ZXh0OiBleHRyYUtleXNba2V5XSB9KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdHBsU2hvcnRjdXQobGFuZy5zaG9ydGN1dC5leHRyYUtleXMsIGtleXMpO1xuXHRcdH07XG5cblx0XHR2YXIgdHBsU2hvcnRjdXRUYWJsZSA9IGZ1bmN0aW9uIChsYW5nLCBvcHRpb25zKSB7XG5cdFx0XHR2YXIgY29sQ2xhc3MgPSAnY2xhc3M9XCJub3RlLXNob3J0Y3V0IG5vdGUtc2hvcnRjdXQtY29sIGNvbC1zbS02IGNvbC14cy0xMlwiJztcblx0XHRcdHZhciB0ZW1wbGF0ZSA9IFtcblx0XHRcdCAgJzxkaXYgJyArIGNvbENsYXNzICsgJz4nICsgdHBsU2hvcnRjdXRBY3Rpb24obGFuZywgb3B0aW9ucykgKyAnPC9kaXY+JyArXG5cdFx0XHQgICc8ZGl2ICcgKyBjb2xDbGFzcyArICc+JyArIHRwbFNob3J0Y3V0VGV4dChsYW5nLCBvcHRpb25zKSArICc8L2Rpdj4nLFxuXHRcdFx0ICAnPGRpdiAnICsgY29sQ2xhc3MgKyAnPicgKyB0cGxTaG9ydGN1dFN0eWxlKGxhbmcsIG9wdGlvbnMpICsgJzwvZGl2PicgK1xuXHRcdFx0ICAnPGRpdiAnICsgY29sQ2xhc3MgKyAnPicgKyB0cGxTaG9ydGN1dFBhcmEobGFuZywgb3B0aW9ucykgKyAnPC9kaXY+J1xuXHRcdFx0XTtcblxuXHRcdFx0aWYgKG9wdGlvbnMuZXh0cmFLZXlzKSB7XG5cdFx0XHRcdHRlbXBsYXRlLnB1c2goJzxkaXYgJyArIGNvbENsYXNzICsgJz4nICsgdHBsRXh0cmFTaG9ydGN1dHMobGFuZywgb3B0aW9ucykgKyAnPC9kaXY+Jyk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiAnPGRpdiBjbGFzcz1cIm5vdGUtc2hvcnRjdXQtcm93IHJvd1wiPicgK1xuXHRcdFx0XHRcdCB0ZW1wbGF0ZS5qb2luKCc8L2Rpdj48ZGl2IGNsYXNzPVwibm90ZS1zaG9ydGN1dC1yb3cgcm93XCI+JykgK1xuXHRcdFx0XHQgICAnPC9kaXY+Jztcblx0XHR9O1xuXG5cdFx0dmFyIHJlcGxhY2VNYWNLZXlzID0gZnVuY3Rpb24gKHNIdG1sKSB7XG5cdFx0XHRyZXR1cm4gc0h0bWwucmVwbGFjZSgv4oyYL2csICdDdHJsJykucmVwbGFjZSgv4oenL2csICdTaGlmdCcpO1xuXHRcdH07XG5cblx0XHR2YXIgdHBsRGlhbG9nSW5mbyA9IHtcblx0XHRcdGltYWdlOiBmdW5jdGlvbiAobGFuZywgb3B0aW9ucykge1xuXHRcdFx0XHR2YXIgaW1hZ2VMaW1pdGF0aW9uID0gJyc7XG5cdFx0XHRcdGlmIChvcHRpb25zLm1heGltdW1JbWFnZUZpbGVTaXplKSB7XG5cdFx0XHRcdFx0dmFyIHVuaXQgPSBNYXRoLmZsb29yKE1hdGgubG9nKG9wdGlvbnMubWF4aW11bUltYWdlRmlsZVNpemUpIC8gTWF0aC5sb2coMTAyNCkpO1xuXHRcdFx0XHRcdHZhciByZWFkYWJsZVNpemUgPSAob3B0aW9ucy5tYXhpbXVtSW1hZ2VGaWxlU2l6ZSAvIE1hdGgucG93KDEwMjQsIHVuaXQpKS50b0ZpeGVkKDIpICogMSArXG5cdFx0XHRcdFx0XHRcdFx0XHQgICAnICcgKyAnIEtNR1RQJ1t1bml0XSArICdCJztcblx0XHRcdFx0XHRpbWFnZUxpbWl0YXRpb24gPSAnPHNtYWxsPicgKyBsYW5nLmltYWdlLm1heGltdW1GaWxlU2l6ZSArICcgOiAnICsgcmVhZGFibGVTaXplICsgJzwvc21hbGw+Jztcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHZhciBib2R5ID0gJzxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvdy1mbHVpZCBub3RlLWdyb3VwLXNlbGVjdC1mcm9tLWZpbGVzXCI+JyArXG5cdFx0XHRcdFx0XHRcdCAnPGxhYmVsPicgKyBsYW5nLmltYWdlLnNlbGVjdEZyb21GaWxlcyArICc8L2xhYmVsPicgK1xuXHRcdFx0XHRcdFx0XHQgJzxpbnB1dCBjbGFzcz1cIm5vdGUtaW1hZ2UtaW5wdXRcIiB0eXBlPVwiZmlsZVwiIG5hbWU9XCJmaWxlc1wiIGFjY2VwdD1cImltYWdlLypcIiBtdWx0aXBsZT1cIm11bHRpcGxlXCIgLz4nICtcblx0XHRcdFx0XHRcdFx0IGltYWdlTGltaXRhdGlvbiArXG5cdFx0XHRcdFx0XHQgICAnPC9kaXY+JyArXG5cdFx0XHRcdFx0XHQgICAnPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93LWZsdWlkXCI+JyArXG5cdFx0XHRcdFx0XHRcdCAnPGxhYmVsPicgKyBsYW5nLmltYWdlLnVybCArICc8L2xhYmVsPicgK1xuXHRcdFx0XHRcdFx0XHQgJzxpbnB1dCBjbGFzcz1cIm5vdGUtaW1hZ2UtdXJsIGZvcm0tY29udHJvbCBzcGFuMTJcIiB0eXBlPVwidGV4dFwiIC8+JyArXG5cdFx0XHRcdFx0XHQgICAnPC9kaXY+Jztcblx0XHRcdFx0dmFyIGZvb3RlciA9ICc8YnV0dG9uIGhyZWY9XCIjXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgbm90ZS1pbWFnZS1idG4gZGlzYWJsZWRcIiBkaXNhYmxlZD4nICsgbGFuZy5pbWFnZS5pbnNlcnQgKyAnPC9idXR0b24+Jztcblx0XHRcdFx0cmV0dXJuIHRwbERpYWxvZygnbm90ZS1pbWFnZS1kaWFsb2cnLCBsYW5nLmltYWdlLmluc2VydCwgYm9keSwgZm9vdGVyKTtcblx0XHRcdH0sXG5cblx0XHRcdGxpbms6IGZ1bmN0aW9uIChsYW5nLCBvcHRpb25zKSB7XG5cdFx0XHRcdHZhciBib2R5ID0gJzxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvdy1mbHVpZFwiPicgK1xuXHRcdFx0XHRcdFx0XHQgJzxsYWJlbD4nICsgbGFuZy5saW5rLnRleHRUb0Rpc3BsYXkgKyAnPC9sYWJlbD4nICtcblx0XHRcdFx0XHRcdFx0ICc8aW5wdXQgY2xhc3M9XCJub3RlLWxpbmstdGV4dCBmb3JtLWNvbnRyb2wgc3BhbjEyXCIgdHlwZT1cInRleHRcIiAvPicgK1xuXHRcdFx0XHRcdFx0ICAgJzwvZGl2PicgK1xuXHRcdFx0XHRcdFx0ICAgJzxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvdy1mbHVpZFwiPicgK1xuXHRcdFx0XHRcdFx0XHQgJzxsYWJlbD4nICsgbGFuZy5saW5rLnVybCArICc8L2xhYmVsPicgK1xuXHRcdFx0XHRcdFx0XHQgJzxpbnB1dCBjbGFzcz1cIm5vdGUtbGluay11cmwgZm9ybS1jb250cm9sIHNwYW4xMlwiIHR5cGU9XCJ0ZXh0XCIgLz4nICtcblx0XHRcdFx0XHRcdCAgICc8L2Rpdj4nICtcblx0XHRcdFx0XHRcdCAgICghb3B0aW9ucy5kaXNhYmxlTGlua1RhcmdldCA/XG5cdFx0XHRcdFx0XHRcdCAnPGRpdiBjbGFzcz1cImNoZWNrYm94XCI+JyArXG5cdFx0XHRcdFx0XHRcdCAgICc8bGFiZWw+JyArICc8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2hlY2tlZD4gJyArXG5cdFx0XHRcdFx0XHRcdFx0IGxhbmcubGluay5vcGVuSW5OZXdXaW5kb3cgK1xuXHRcdFx0XHRcdFx0XHQgICAnPC9sYWJlbD4nICtcblx0XHRcdFx0XHRcdFx0ICc8L2Rpdj4nIDogJydcblx0XHRcdFx0XHRcdCAgICk7XG5cdFx0XHRcdHZhciBmb290ZXIgPSAnPGJ1dHRvbiBocmVmPVwiI1wiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IG5vdGUtbGluay1idG4gZGlzYWJsZWRcIiBkaXNhYmxlZD4nICsgbGFuZy5saW5rLmluc2VydCArICc8L2J1dHRvbj4nO1xuXHRcdFx0XHRyZXR1cm4gdHBsRGlhbG9nKCdub3RlLWxpbmstZGlhbG9nJywgbGFuZy5saW5rLmluc2VydCwgYm9keSwgZm9vdGVyKTtcblx0XHRcdH0sXG5cblx0XHRcdGhlbHA6IGZ1bmN0aW9uIChsYW5nLCBvcHRpb25zKSB7XG5cdFx0XHRcdHZhciBib2R5ID0gJzxhIGNsYXNzPVwibW9kYWwtY2xvc2UgcHVsbC1yaWdodFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIHRhYmluZGV4PVwiLTFcIj4nICsgbGFuZy5zaG9ydGN1dC5jbG9zZSArICc8L2E+JyArXG5cdFx0XHRcdFx0XHQgICAnPGRpdiBjbGFzcz1cInRpdGxlXCI+JyArIGxhbmcuc2hvcnRjdXQuc2hvcnRjdXRzICsgJzwvZGl2PicgK1xuXHRcdFx0XHRcdFx0ICAgKGFnZW50LmlzTWFjID8gdHBsU2hvcnRjdXRUYWJsZShsYW5nLCBvcHRpb25zKSA6IHJlcGxhY2VNYWNLZXlzKHRwbFNob3J0Y3V0VGFibGUobGFuZywgb3B0aW9ucykpKSArXG5cdFx0XHRcdFx0XHQgICAnPHAgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPicgK1xuXHRcdFx0XHRcdFx0XHQgJzxhIGhyZWY9XCIvL3N1bW1lcm5vdGUub3JnL1wiIHRhcmdldD1cIl9ibGFua1wiPlN1bW1lcm5vdGUgMC42LjM8L2E+IMK3ICcgK1xuXHRcdFx0XHRcdFx0XHQgJzxhIGhyZWY9XCIvL2dpdGh1Yi5jb20vc3VtbWVybm90ZS9zdW1tZXJub3RlXCIgdGFyZ2V0PVwiX2JsYW5rXCI+UHJvamVjdDwvYT4gwrcgJyArXG5cdFx0XHRcdFx0XHRcdCAnPGEgaHJlZj1cIi8vZ2l0aHViLmNvbS9zdW1tZXJub3RlL3N1bW1lcm5vdGUvaXNzdWVzXCIgdGFyZ2V0PVwiX2JsYW5rXCI+SXNzdWVzPC9hPicgK1xuXHRcdFx0XHRcdFx0ICAgJzwvcD4nO1xuXHRcdFx0XHRyZXR1cm4gdHBsRGlhbG9nKCdub3RlLWhlbHAtZGlhbG9nJywgJycsIGJvZHksICcnKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0dmFyIHRwbERpYWxvZ3MgPSBmdW5jdGlvbiAobGFuZywgb3B0aW9ucykge1xuXHRcdFx0dmFyIGRpYWxvZ3MgPSAnJztcblxuXHRcdFx0JC5lYWNoKHRwbERpYWxvZ0luZm8sIGZ1bmN0aW9uIChpZHgsIHRwbERpYWxvZykge1xuXHRcdFx0XHRkaWFsb2dzICs9IHRwbERpYWxvZyhsYW5nLCBvcHRpb25zKTtcblx0XHRcdH0pO1xuXG5cdFx0XHRyZXR1cm4gJzxkaXYgY2xhc3M9XCJub3RlLWRpYWxvZ1wiPicgKyBkaWFsb2dzICsgJzwvZGl2Pic7XG5cdFx0fTtcblxuXHRcdHZhciB0cGxTdGF0dXNiYXIgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRyZXR1cm4gJzxkaXYgY2xhc3M9XCJub3RlLXJlc2l6ZWJhclwiPicgK1xuXHRcdFx0XHRcdCAnPGRpdiBjbGFzcz1cIm5vdGUtaWNvbi1iYXJcIj48L2Rpdj4nICtcblx0XHRcdFx0XHQgJzxkaXYgY2xhc3M9XCJub3RlLWljb24tYmFyXCI+PC9kaXY+JyArXG5cdFx0XHRcdFx0ICc8ZGl2IGNsYXNzPVwibm90ZS1pY29uLWJhclwiPjwvZGl2PicgK1xuXHRcdFx0XHQgICAnPC9kaXY+Jztcblx0XHR9O1xuXG5cdFx0dmFyIHJlcHJlc2VudFNob3J0Y3V0ID0gZnVuY3Rpb24gKHN0cikge1xuXHRcdFx0aWYgKGFnZW50LmlzTWFjKSB7XG5cdFx0XHRcdHN0ciA9IHN0ci5yZXBsYWNlKCdDTUQnLCAn4oyYJykucmVwbGFjZSgnU0hJRlQnLCAn4oenJyk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBzdHIucmVwbGFjZSgnQkFDS1NMQVNIJywgJ1xcXFwnKVxuXHRcdFx0XHRcdCAgLnJlcGxhY2UoJ1NMQVNIJywgJy8nKVxuXHRcdFx0XHRcdCAgLnJlcGxhY2UoJ0xFRlRCUkFDS0VUJywgJ1snKVxuXHRcdFx0XHRcdCAgLnJlcGxhY2UoJ1JJR0hUQlJBQ0tFVCcsICddJyk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIGNyZWF0ZVRvb2x0aXBcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkY29udGFpbmVyXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IGtleU1hcFxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSBbc1BsYWNlbWVudF1cblx0XHQgKi9cblx0XHR2YXIgY3JlYXRlVG9vbHRpcCA9IGZ1bmN0aW9uICgkY29udGFpbmVyLCBrZXlNYXAsIHNQbGFjZW1lbnQpIHtcblx0XHRcdHZhciBpbnZlcnRlZEtleU1hcCA9IGZ1bmMuaW52ZXJ0T2JqZWN0KGtleU1hcCk7XG5cdFx0XHR2YXIgJGJ1dHRvbnMgPSAkY29udGFpbmVyLmZpbmQoJ2J1dHRvbicpO1xuXG5cdFx0XHQkYnV0dG9ucy5lYWNoKGZ1bmN0aW9uIChpLCBlbEJ0bikge1xuXHRcdFx0XHR2YXIgJGJ0biA9ICQoZWxCdG4pO1xuXHRcdFx0XHR2YXIgc1Nob3J0Y3V0ID0gaW52ZXJ0ZWRLZXlNYXBbJGJ0bi5kYXRhKCdldmVudCcpXTtcblx0XHRcdFx0aWYgKHNTaG9ydGN1dCkge1xuXHRcdFx0XHRcdCRidG4uYXR0cigndGl0bGUnLCBmdW5jdGlvbiAoaSwgdikge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHYgKyAnICgnICsgcmVwcmVzZW50U2hvcnRjdXQoc1Nob3J0Y3V0KSArICcpJztcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHQvLyBib290c3RyYXAgdG9vbHRpcCBvbiBidG4tZ3JvdXAgYnVnXG5cdFx0XHRcdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9pc3N1ZXMvNTY4N1xuXHRcdFx0fSkudG9vbHRpcCh7XG5cdFx0XHRcdGNvbnRhaW5lcjogJ2JvZHknLFxuXHRcdFx0XHR0cmlnZ2VyOiAnaG92ZXInLFxuXHRcdFx0XHRwbGFjZW1lbnQ6IHNQbGFjZW1lbnQgfHwgJ3RvcCdcblx0XHRcdH0pLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0JCh0aGlzKS50b29sdGlwKCdoaWRlJyk7XG5cdFx0XHR9KTtcblx0XHR9O1xuXG5cdFx0Ly8gY3JlYXRlUGFsZXR0ZVxuXHRcdHZhciBjcmVhdGVQYWxldHRlID0gZnVuY3Rpb24gKCRjb250YWluZXIsIG9wdGlvbnMpIHtcblx0XHRcdHZhciBjb2xvckluZm8gPSBvcHRpb25zLmNvbG9ycztcblx0XHRcdCRjb250YWluZXIuZmluZCgnLm5vdGUtY29sb3ItcGFsZXR0ZScpLmVhY2goZnVuY3Rpb24gKCkge1xuXHRcdFx0XHR2YXIgJHBhbGV0dGUgPSAkKHRoaXMpLCBldmVudE5hbWUgPSAkcGFsZXR0ZS5hdHRyKCdkYXRhLXRhcmdldC1ldmVudCcpO1xuXHRcdFx0XHR2YXIgcGFsZXR0ZUNvbnRlbnRzID0gW107XG5cdFx0XHRcdGZvciAodmFyIHJvdyA9IDAsIGxlblJvdyA9IGNvbG9ySW5mby5sZW5ndGg7IHJvdyA8IGxlblJvdzsgcm93KyspIHtcblx0XHRcdFx0XHR2YXIgY29sb3JzID0gY29sb3JJbmZvW3Jvd107XG5cdFx0XHRcdFx0dmFyIGJ1dHRvbnMgPSBbXTtcblx0XHRcdFx0XHRmb3IgKHZhciBjb2wgPSAwLCBsZW5Db2wgPSBjb2xvcnMubGVuZ3RoOyBjb2wgPCBsZW5Db2w7IGNvbCsrKSB7XG5cdFx0XHRcdFx0XHR2YXIgY29sb3IgPSBjb2xvcnNbY29sXTtcblx0XHRcdFx0XHRcdGJ1dHRvbnMucHVzaChbJzxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibm90ZS1jb2xvci1idG5cIiBzdHlsZT1cImJhY2tncm91bmQtY29sb3I6JywgY29sb3IsXG5cdFx0XHRcdFx0XHRcdFx0XHQgICAnO1wiIGRhdGEtZXZlbnQ9XCInLCBldmVudE5hbWUsXG5cdFx0XHRcdFx0XHRcdFx0XHQgICAnXCIgZGF0YS12YWx1ZT1cIicsIGNvbG9yLFxuXHRcdFx0XHRcdFx0XHRcdFx0ICAgJ1wiIHRpdGxlPVwiJywgY29sb3IsXG5cdFx0XHRcdFx0XHRcdFx0XHQgICAnXCIgZGF0YS10b2dnbGU9XCJidXR0b25cIiB0YWJpbmRleD1cIi0xXCI+PC9idXR0b24+J10uam9pbignJykpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRwYWxldHRlQ29udGVudHMucHVzaCgnPGRpdiBjbGFzcz1cIm5vdGUtY29sb3Itcm93XCI+JyArIGJ1dHRvbnMuam9pbignJykgKyAnPC9kaXY+Jyk7XG5cdFx0XHRcdH1cblx0XHRcdFx0JHBhbGV0dGUuaHRtbChwYWxldHRlQ29udGVudHMuam9pbignJykpO1xuXHRcdFx0fSk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIGNyZWF0ZSBzdW1tZXJub3RlIGxheW91dCAoYWlyIG1vZGUpXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGhvbGRlclxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG5cdFx0ICovXG5cdFx0dGhpcy5jcmVhdGVMYXlvdXRCeUFpck1vZGUgPSBmdW5jdGlvbiAoJGhvbGRlciwgb3B0aW9ucykge1xuXHRcdFx0dmFyIGxhbmdJbmZvID0gb3B0aW9ucy5sYW5nSW5mbztcblx0XHRcdHZhciBrZXlNYXAgPSBvcHRpb25zLmtleU1hcFthZ2VudC5pc01hYyA/ICdtYWMnIDogJ3BjJ107XG5cdFx0XHR2YXIgaWQgPSBmdW5jLnVuaXF1ZUlkKCk7XG5cblx0XHRcdCRob2xkZXIuYWRkQ2xhc3MoJ25vdGUtYWlyLWVkaXRvciBub3RlLWVkaXRhYmxlJyk7XG5cdFx0XHQkaG9sZGVyLmF0dHIoe1xuXHRcdFx0XHQnaWQnOiAnbm90ZS1lZGl0b3ItJyArIGlkLFxuXHRcdFx0XHQnY29udGVudEVkaXRhYmxlJzogdHJ1ZVxuXHRcdFx0fSk7XG5cblx0XHRcdHZhciBib2R5ID0gZG9jdW1lbnQuYm9keTtcblxuXHRcdFx0Ly8gY3JlYXRlIFBvcG92ZXJcblx0XHRcdHZhciAkcG9wb3ZlciA9ICQodHBsUG9wb3ZlcnMobGFuZ0luZm8sIG9wdGlvbnMpKTtcblx0XHRcdCRwb3BvdmVyLmFkZENsYXNzKCdub3RlLWFpci1sYXlvdXQnKTtcblx0XHRcdCRwb3BvdmVyLmF0dHIoJ2lkJywgJ25vdGUtcG9wb3Zlci0nICsgaWQpO1xuXHRcdFx0JHBvcG92ZXIuYXBwZW5kVG8oYm9keSk7XG5cdFx0XHRjcmVhdGVUb29sdGlwKCRwb3BvdmVyLCBrZXlNYXApO1xuXHRcdFx0Y3JlYXRlUGFsZXR0ZSgkcG9wb3Zlciwgb3B0aW9ucyk7XG5cblx0XHRcdC8vIGNyZWF0ZSBIYW5kbGVcblx0XHRcdHZhciAkaGFuZGxlID0gJCh0cGxIYW5kbGVzKCkpO1xuXHRcdFx0JGhhbmRsZS5hZGRDbGFzcygnbm90ZS1haXItbGF5b3V0Jyk7XG5cdFx0XHQkaGFuZGxlLmF0dHIoJ2lkJywgJ25vdGUtaGFuZGxlLScgKyBpZCk7XG5cdFx0XHQkaGFuZGxlLmFwcGVuZFRvKGJvZHkpO1xuXG5cdFx0XHQvLyBjcmVhdGUgRGlhbG9nXG5cdFx0XHR2YXIgJGRpYWxvZyA9ICQodHBsRGlhbG9ncyhsYW5nSW5mbywgb3B0aW9ucykpO1xuXHRcdFx0JGRpYWxvZy5hZGRDbGFzcygnbm90ZS1haXItbGF5b3V0Jyk7XG5cdFx0XHQkZGlhbG9nLmF0dHIoJ2lkJywgJ25vdGUtZGlhbG9nLScgKyBpZCk7XG5cdFx0XHQkZGlhbG9nLmZpbmQoJ2J1dHRvbi5jbG9zZSwgYS5tb2RhbC1jbG9zZScpLmNsaWNrKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0JCh0aGlzKS5jbG9zZXN0KCcubW9kYWwnKS5tb2RhbCgnaGlkZScpO1xuXHRcdFx0fSk7XG5cdFx0XHQkZGlhbG9nLmFwcGVuZFRvKGJvZHkpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBjcmVhdGUgc3VtbWVybm90ZSBsYXlvdXQgKG5vcm1hbCBtb2RlKVxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRob2xkZXJcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuXHRcdCAqL1xuXHRcdHRoaXMuY3JlYXRlTGF5b3V0QnlGcmFtZSA9IGZ1bmN0aW9uICgkaG9sZGVyLCBvcHRpb25zKSB7XG5cdFx0XHR2YXIgbGFuZ0luZm8gPSBvcHRpb25zLmxhbmdJbmZvO1xuXG5cdFx0XHR2YXIgaXNDb250ZW50RWRpdGFibGUgPSAhJGhvbGRlci5pcygnOmRpc2FibGVkJyk7XG5cblx0XHRcdC8vMDEuIGNyZWF0ZSBFZGl0b3Jcblx0XHRcdHZhciAkZWRpdG9yID0gJCgnPGRpdiBjbGFzcz1cIm5vdGUtZWRpdG9yIGVkaXRhYmxlLScgKyBpc0NvbnRlbnRFZGl0YWJsZSArICdcIj48L2Rpdj4nKTtcblx0XHRcdGlmIChvcHRpb25zLndpZHRoKSB7XG5cdFx0XHRcdCRlZGl0b3Iud2lkdGgob3B0aW9ucy53aWR0aCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vMDIuIHN0YXR1c2JhciAocmVzaXplYmFyKVxuXHRcdFx0aWYgKG9wdGlvbnMuaGVpZ2h0ID4gMCkge1xuXHRcdFx0XHQkKCc8ZGl2IGNsYXNzPVwibm90ZS1zdGF0dXNiYXJcIj4nICsgKG9wdGlvbnMuZGlzYWJsZVJlc2l6ZUVkaXRvciA/ICcnIDogdHBsU3RhdHVzYmFyKCkpICsgJzwvZGl2PicpLnByZXBlbmRUbygkZWRpdG9yKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8wMy4gY3JlYXRlIEVkaXRhYmxlXG5cblx0XHRcdHZhciAkZWRpdGFibGUgPSAkKCc8ZGl2IGNsYXNzPVwibm90ZS1lZGl0YWJsZVwiIGNvbnRlbnRFZGl0YWJsZT1cIicgKyBpc0NvbnRlbnRFZGl0YWJsZSArICdcIj48L2Rpdj4nKVxuXHRcdFx0XHQucHJlcGVuZFRvKCRlZGl0b3IpO1xuXHRcdFx0aWYgKG9wdGlvbnMuaGVpZ2h0KSB7XG5cdFx0XHRcdCRlZGl0YWJsZS5oZWlnaHQob3B0aW9ucy5oZWlnaHQpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG9wdGlvbnMuZGlyZWN0aW9uKSB7XG5cdFx0XHRcdCRlZGl0YWJsZS5hdHRyKCdkaXInLCBvcHRpb25zLmRpcmVjdGlvbik7XG5cdFx0XHR9XG5cdFx0XHR2YXIgcGxhY2Vob2xkZXIgPSAkaG9sZGVyLmF0dHIoJ3BsYWNlaG9sZGVyJykgfHwgb3B0aW9ucy5wbGFjZWhvbGRlcjtcblx0XHRcdGlmIChwbGFjZWhvbGRlcikge1xuXHRcdFx0XHQkZWRpdGFibGUuYXR0cignZGF0YS1wbGFjZWhvbGRlcicsIHBsYWNlaG9sZGVyKTtcblx0XHRcdH1cblxuXHRcdFx0JGVkaXRhYmxlLmh0bWwoZG9tLmh0bWwoJGhvbGRlcikpO1xuXG5cdFx0XHQvLzAzMS4gY3JlYXRlIGNvZGFibGVcblx0XHRcdCQoJzx0ZXh0YXJlYSBjbGFzcz1cIm5vdGUtY29kYWJsZVwiPjwvdGV4dGFyZWE+JykucHJlcGVuZFRvKCRlZGl0b3IpO1xuXG5cdFx0XHQvLzA0LiBjcmVhdGUgVG9vbGJhclxuXHRcdFx0dmFyICR0b29sYmFyID0gJCgnPGRpdiBjbGFzcz1cIm5vdGUtdG9vbGJhciBidG4tdG9vbGJhclwiIC8+Jyk7XG5cdFx0XHRmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBvcHRpb25zLnRvb2xiYXIubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG5cdFx0XHRcdHZhciBncm91cE5hbWUgPSBvcHRpb25zLnRvb2xiYXJbaWR4XVswXTtcblx0XHRcdFx0dmFyIGdyb3VwQnV0dG9ucyA9IG9wdGlvbnMudG9vbGJhcltpZHhdWzFdO1xuXG5cdFx0XHRcdHZhciAkZ3JvdXAgPSAkKCc8ZGl2IGNsYXNzPVwibm90ZS0nICsgZ3JvdXBOYW1lICsgJyBidG4tZ3JvdXBcIiAvPicpO1xuXHRcdFx0XHRmb3IgKHZhciBpID0gMCwgYnRuTGVuZ3RoID0gZ3JvdXBCdXR0b25zLmxlbmd0aDsgaSA8IGJ0bkxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0dmFyIGJ1dHRvbkluZm8gPSB0cGxCdXR0b25JbmZvW2dyb3VwQnV0dG9uc1tpXV07XG5cdFx0XHRcdFx0Ly8gY29udGludWUgY3JlYXRpbmcgdG9vbGJhciBldmVuIGlmIGEgYnV0dG9uIGRvZXNuJ3QgZXhpc3Rcblx0XHRcdFx0XHRpZiAoISQuaXNGdW5jdGlvbihidXR0b25JbmZvKSkgeyBjb250aW51ZTsgfVxuXG5cdFx0XHRcdFx0dmFyICRidXR0b24gPSAkKGJ1dHRvbkluZm8obGFuZ0luZm8sIG9wdGlvbnMpKTtcblx0XHRcdFx0XHQkYnV0dG9uLmF0dHIoJ2RhdGEtbmFtZScsIGdyb3VwQnV0dG9uc1tpXSk7ICAvLyBzZXQgYnV0dG9uJ3MgYWxpYXMsIGJlY3Vhc2UgdG8gZ2V0IGJ1dHRvbiBlbGVtZW50IGZyb20gJHRvb2xiYXJcblx0XHRcdFx0XHQkZ3JvdXAuYXBwZW5kKCRidXR0b24pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdCR0b29sYmFyLmFwcGVuZCgkZ3JvdXApO1xuXHRcdFx0fVxuXG5cdFx0XHQkdG9vbGJhci5wcmVwZW5kVG8oJGVkaXRvcik7XG5cdFx0XHR2YXIga2V5TWFwID0gb3B0aW9ucy5rZXlNYXBbYWdlbnQuaXNNYWMgPyAnbWFjJyA6ICdwYyddO1xuXHRcdFx0Y3JlYXRlUGFsZXR0ZSgkdG9vbGJhciwgb3B0aW9ucyk7XG5cdFx0XHRjcmVhdGVUb29sdGlwKCR0b29sYmFyLCBrZXlNYXAsICdib3R0b20nKTtcblxuXHRcdFx0Ly8wNS4gY3JlYXRlIFBvcG92ZXJcblx0XHRcdHZhciAkcG9wb3ZlciA9ICQodHBsUG9wb3ZlcnMobGFuZ0luZm8sIG9wdGlvbnMpKS5wcmVwZW5kVG8oJGVkaXRvcik7XG5cdFx0XHRjcmVhdGVQYWxldHRlKCRwb3BvdmVyLCBvcHRpb25zKTtcblx0XHRcdGNyZWF0ZVRvb2x0aXAoJHBvcG92ZXIsIGtleU1hcCk7XG5cblx0XHRcdC8vMDYuIGhhbmRsZShjb250cm9sIHNlbGVjdGlvbiwgLi4uKVxuXHRcdFx0JCh0cGxIYW5kbGVzKCkpLnByZXBlbmRUbygkZWRpdG9yKTtcblxuXHRcdFx0Ly8wNy4gY3JlYXRlIERpYWxvZ1xuXHRcdFx0dmFyICRkaWFsb2cgPSAkKHRwbERpYWxvZ3MobGFuZ0luZm8sIG9wdGlvbnMpKS5wcmVwZW5kVG8oJGVkaXRvcik7XG5cdFx0XHQkZGlhbG9nLmZpbmQoJ2J1dHRvbi5jbG9zZSwgYS5tb2RhbC1jbG9zZScpLmNsaWNrKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0JCh0aGlzKS5jbG9zZXN0KCcubW9kYWwnKS5tb2RhbCgnaGlkZScpO1xuXHRcdFx0fSk7XG5cblx0XHRcdC8vMDguIGNyZWF0ZSBEcm9wem9uZVxuXHRcdFx0JCgnPGRpdiBjbGFzcz1cIm5vdGUtZHJvcHpvbmVcIj48ZGl2IGNsYXNzPVwibm90ZS1kcm9wem9uZS1tZXNzYWdlXCI+PC9kaXY+PC9kaXY+JykucHJlcGVuZFRvKCRlZGl0b3IpO1xuXG5cdFx0XHQvLzA5LiBFZGl0b3IvSG9sZGVyIHN3aXRjaFxuXHRcdFx0JGVkaXRvci5pbnNlcnRBZnRlcigkaG9sZGVyKTtcblx0XHRcdCRob2xkZXIuaGlkZSgpO1xuXHRcdH07XG5cblx0XHR0aGlzLmhhc05vdGVFZGl0b3IgPSBmdW5jdGlvbiAoJGhvbGRlcikge1xuXHRcdFx0cmV0dXJuIHRoaXMubm90ZUVkaXRvckZyb21Ib2xkZXIoJGhvbGRlcikubGVuZ3RoID4gMDtcblx0XHR9O1xuXG5cdFx0dGhpcy5ub3RlRWRpdG9yRnJvbUhvbGRlciA9IGZ1bmN0aW9uICgkaG9sZGVyKSB7XG5cdFx0XHRpZiAoJGhvbGRlci5oYXNDbGFzcygnbm90ZS1haXItZWRpdG9yJykpIHtcblx0XHRcdFx0cmV0dXJuICRob2xkZXI7XG5cdFx0XHR9IGVsc2UgaWYgKCRob2xkZXIubmV4dCgpLmhhc0NsYXNzKCdub3RlLWVkaXRvcicpKSB7XG5cdFx0XHRcdHJldHVybiAkaG9sZGVyLm5leHQoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiAkKCk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIGNyZWF0ZSBzdW1tZXJub3RlIGxheW91dFxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRob2xkZXJcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuXHRcdCAqL1xuXHRcdHRoaXMuY3JlYXRlTGF5b3V0ID0gZnVuY3Rpb24gKCRob2xkZXIsIG9wdGlvbnMpIHtcblx0XHRcdGlmIChvcHRpb25zLmFpck1vZGUpIHtcblx0XHRcdFx0dGhpcy5jcmVhdGVMYXlvdXRCeUFpck1vZGUoJGhvbGRlciwgb3B0aW9ucyk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGlzLmNyZWF0ZUxheW91dEJ5RnJhbWUoJGhvbGRlciwgb3B0aW9ucyk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIHJldHVybnMgbGF5b3V0SW5mbyBmcm9tIGhvbGRlclxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRob2xkZXIgLSBwbGFjZWhvbGRlclxuXHRcdCAqIEByZXR1cm4ge09iamVjdH1cblx0XHQgKi9cblx0XHR0aGlzLmxheW91dEluZm9Gcm9tSG9sZGVyID0gZnVuY3Rpb24gKCRob2xkZXIpIHtcblx0XHRcdHZhciAkZWRpdG9yID0gdGhpcy5ub3RlRWRpdG9yRnJvbUhvbGRlcigkaG9sZGVyKTtcblx0XHRcdGlmICghJGVkaXRvci5sZW5ndGgpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBjb25uZWN0ICRob2xkZXIgdG8gJGVkaXRvclxuXHRcdFx0JGVkaXRvci5kYXRhKCdob2xkZXInLCAkaG9sZGVyKTtcblxuXHRcdFx0cmV0dXJuIGRvbS5idWlsZExheW91dEluZm8oJGVkaXRvcik7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIHJlbW92ZUxheW91dFxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRob2xkZXIgLSBwbGFjZWhvbGRlclxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBsYXlvdXRJbmZvXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcblx0XHQgKlxuXHRcdCAqL1xuXHRcdHRoaXMucmVtb3ZlTGF5b3V0ID0gZnVuY3Rpb24gKCRob2xkZXIsIGxheW91dEluZm8sIG9wdGlvbnMpIHtcblx0XHRcdGlmIChvcHRpb25zLmFpck1vZGUpIHtcblx0XHRcdFx0JGhvbGRlci5yZW1vdmVDbGFzcygnbm90ZS1haXItZWRpdG9yIG5vdGUtZWRpdGFibGUnKVxuXHRcdFx0XHRcdCAgIC5yZW1vdmVBdHRyKCdpZCBjb250ZW50RWRpdGFibGUnKTtcblxuXHRcdFx0XHRsYXlvdXRJbmZvLnBvcG92ZXIoKS5yZW1vdmUoKTtcblx0XHRcdFx0bGF5b3V0SW5mby5oYW5kbGUoKS5yZW1vdmUoKTtcblx0XHRcdFx0bGF5b3V0SW5mby5kaWFsb2coKS5yZW1vdmUoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdCRob2xkZXIuaHRtbChsYXlvdXRJbmZvLmVkaXRhYmxlKCkuaHRtbCgpKTtcblxuXHRcdFx0XHRsYXlvdXRJbmZvLmVkaXRvcigpLnJlbW92ZSgpO1xuXHRcdFx0XHQkaG9sZGVyLnNob3coKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICpcblx0XHQgKiBAcmV0dXJuIHtPYmplY3R9XG5cdFx0ICogQHJldHVybiB7ZnVuY3Rpb24obGFiZWwsIG9wdGlvbnM9KTpzdHJpbmd9IHJldHVybi5idXR0b24ge0BsaW5rICN0cGxCdXR0b24gZnVuY3Rpb24gdG8gbWFrZSB0ZXh0IGJ1dHRvbn1cblx0XHQgKiBAcmV0dXJuIHtmdW5jdGlvbihpY29uQ2xhc3MsIG9wdGlvbnM9KTpzdHJpbmd9IHJldHVybi5pY29uQnV0dG9uIHtAbGluayAjdHBsSWNvbkJ1dHRvbiBmdW5jdGlvbiB0byBtYWtlIGljb24gYnV0dG9ufVxuXHRcdCAqIEByZXR1cm4ge2Z1bmN0aW9uKGNsYXNzTmFtZSwgdGl0bGU9LCBib2R5PSwgZm9vdGVyPSk6c3RyaW5nfSByZXR1cm4uZGlhbG9nIHtAbGluayAjdHBsRGlhbG9nIGZ1bmN0aW9uIHRvIG1ha2UgZGlhbG9nfVxuXHRcdCAqL1xuXHRcdHRoaXMuZ2V0VGVtcGxhdGUgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRidXR0b246IHRwbEJ1dHRvbixcblx0XHRcdFx0aWNvbkJ1dHRvbjogdHBsSWNvbkJ1dHRvbixcblx0XHRcdFx0ZGlhbG9nOiB0cGxEaWFsb2dcblx0XHRcdH07XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIGFkZCBidXR0b24gaW5mb3JtYXRpb25cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIGJ1dHRvbiBuYW1lXG5cdFx0ICogQHBhcmFtIHtGdW5jdGlvbn0gYnV0dG9uSW5mbyBmdW5jdGlvbiB0byBtYWtlIGJ1dHRvbiwgcmVmZXJlbmNlIHRvIHtAbGluayAjdHBsQnV0dG9ufSx7QGxpbmsgI3RwbEljb25CdXR0b259XG5cdFx0ICovXG5cdFx0dGhpcy5hZGRCdXR0b25JbmZvID0gZnVuY3Rpb24gKG5hbWUsIGJ1dHRvbkluZm8pIHtcblx0XHRcdHRwbEJ1dHRvbkluZm9bbmFtZV0gPSBidXR0b25JbmZvO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG5cdFx0ICogQHBhcmFtIHtGdW5jdGlvbn0gZGlhbG9nSW5mbyBmdW5jdGlvbiB0byBtYWtlIGRpYWxvZywgcmVmZXJlbmNlIHRvIHtAbGluayAjdHBsRGlhbG9nfVxuXHRcdCAqL1xuXHRcdHRoaXMuYWRkRGlhbG9nSW5mbyA9IGZ1bmN0aW9uIChuYW1lLCBkaWFsb2dJbmZvKSB7XG5cdFx0XHR0cGxEaWFsb2dJbmZvW25hbWVdID0gZGlhbG9nSW5mbztcblx0XHR9O1xuXHR9O1xuXG5cblx0Ly8galF1ZXJ5IG5hbWVzcGFjZSBmb3Igc3VtbWVybm90ZVxuXHQvKipcblx0ICogQGNsYXNzICQuc3VtbWVybm90ZSBcblx0ICogXG5cdCAqIHN1bW1lcm5vdGUgYXR0cmlidXRlICBcblx0ICogXG5cdCAqIEBtaXhpbiBkZWZhdWx0c1xuXHQgKiBAc2luZ2xldG9uICBcblx0ICogXG5cdCAqL1xuXHQkLnN1bW1lcm5vdGUgPSAkLnN1bW1lcm5vdGUgfHwge307XG5cblx0Ly8gZXh0ZW5kcyBkZWZhdWx0IHNldHRpbmdzXG5cdC8vICAtICQuc3VtbWVybm90ZS52ZXJzaW9uXG5cdC8vICAtICQuc3VtbWVybm90ZS5vcHRpb25zXG5cdC8vICAtICQuc3VtbWVybm90ZS5sYW5nXG5cdCQuZXh0ZW5kKCQuc3VtbWVybm90ZSwgZGVmYXVsdHMpO1xuXG5cdHZhciByZW5kZXJlciA9IG5ldyBSZW5kZXJlcigpO1xuXHR2YXIgZXZlbnRIYW5kbGVyID0gbmV3IEV2ZW50SGFuZGxlcigpO1xuXG5cdCQuZXh0ZW5kKCQuc3VtbWVybm90ZSwge1xuXHRcdC8qKiBAcHJvcGVydHkge1JlbmRlcmVyfSAqL1xuXHRcdHJlbmRlcmVyOiByZW5kZXJlcixcblx0XHQvKiogQHByb3BlcnR5IHtFdmVudEhhbmRsZXJ9ICovXG5cdFx0ZXZlbnRIYW5kbGVyOiBldmVudEhhbmRsZXIsXG5cdFx0LyoqIFxuXHRcdCAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBjb3JlIFxuXHRcdCAqIEBwcm9wZXJ0eSB7Y29yZS5hZ2VudH0gY29yZS5hZ2VudCBcblx0XHQgKiBAcHJvcGVydHkge2NvcmUuZG9tfSBjb3JlLmRvbVxuXHRcdCAqIEBwcm9wZXJ0eSB7Y29yZS5yYW5nZX0gY29yZS5yYW5nZSBcblx0XHQgKi9cblx0XHRjb3JlOiB7XG5cdFx0XHRhZ2VudDogYWdlbnQsXG5cdFx0XHRkb206IGRvbSxcblx0XHRcdHJhbmdlOiByYW5nZVxuXHRcdH0sXG5cdFx0LyoqIFxuXHRcdCAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBcblx0XHQgKiBwbHVnaW5FdmVudHMgZXZlbnQgbGlzdCBmb3IgcGx1Z2luc1xuXHRcdCAqIGV2ZW50IGhhcyBuYW1lIGFuZCBjYWxsYmFjayBmdW5jdGlvbi5cblx0XHQgKiBcblx0XHQgKiBgYGAgXG5cdFx0ICogJC5zdW1tZXJub3RlLmFkZFBsdWdpbih7XG5cdFx0ICogICAgIGV2ZW50cyA6IHtcblx0XHQgKiAgICAgICAgICAnaGVsbG8nIDogZnVuY3Rpb24obGF5b3V0SW5mbywgdmFsdWUsICR0YXJnZXQpIHtcblx0XHQgKiAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2V2ZW50IG5hbWUgaXMgaGVsbG8sIHZhbHVlIGlzICcgKyB2YWx1ZSApO1xuXHRcdCAqICAgICAgICAgIH1cblx0XHQgKiAgICAgfSAgICAgXG5cdFx0ICogfSlcblx0XHQgKiBgYGBcblx0XHQgKiBcblx0XHQgKiAqIGV2ZW50IG5hbWUgaXMgZGF0YS1ldmVudCBwcm9wZXJ0eS5cblx0XHQgKiAqIGxheW91dEluZm8gaXMgYSBzdW1tZXJub3RlIGxheW91dCBpbmZvcm1hdGlvbi5cblx0XHQgKiAqIHZhbHVlIGlzIGRhdGEtdmFsdWUgcHJvcGVydHkuXG5cdFx0ICovXG5cdFx0cGx1Z2luRXZlbnRzOiB7fSxcblxuXHRcdHBsdWdpbnM6IFtdXG5cdH0pO1xuXG5cdC8qKlxuXHQgKiBAbWV0aG9kIGFkZFBsdWdpblxuXHQgKlxuXHQgKiBhZGQgUGx1Z2luIGluIFN1bW1lcm5vdGUgXG5cdCAqIFxuXHQgKiBTdW1tZXJub3RlIGNhbiBtYWtlIGEgb3duIHBsdWdpbi5cblx0ICpcblx0ICogIyMjIERlZmluZSBwbHVnaW5cblx0ICogYGBgXG5cdCAqIC8vIGdldCB0ZW1wbGF0ZSBmdW5jdGlvbiAgXG5cdCAqIHZhciB0bXBsID0gJC5zdW1tZXJub3RlLnJlbmRlcmVyLmdldFRlbXBsYXRlKCk7XG5cdCAqIFxuXHQgKiAvLyBhZGQgYSBidXR0b24gICBcblx0ICogJC5zdW1tZXJub3RlLmFkZFBsdWdpbih7XG5cdCAqICAgICBidXR0b25zIDoge1xuXHQgKiAgICAgICAgLy8gXCJoZWxsb1wiICBpcyBidXR0b24ncyBuYW1lc3BhY2UuICAgICAgXG5cdCAqICAgICAgICBcImhlbGxvXCIgOiBmdW5jdGlvbihsYW5nLCBvcHRpb25zKSB7XG5cdCAqICAgICAgICAgICAgLy8gbWFrZSBpY29uIGJ1dHRvbiBieSB0ZW1wbGF0ZSBmdW5jdGlvbiAgICAgICAgICBcblx0ICogICAgICAgICAgICByZXR1cm4gdG1wbC5pY29uQnV0dG9uKCdmYSBmYS1oZWFkZXInLCB7XG5cdCAqICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrIGZ1bmN0aW9uIG5hbWUgd2hlbiBidXR0b24gY2xpY2tlZCBcblx0ICogICAgICAgICAgICAgICAgZXZlbnQgOiAnaGVsbG8nLFxuXHQgKiAgICAgICAgICAgICAgICAvLyBzZXQgZGF0YS12YWx1ZSBwcm9wZXJ0eSAgICAgICAgICAgICAgICAgXG5cdCAqICAgICAgICAgICAgICAgIHZhbHVlIDogJ2hlbGxvJywgICAgICAgICAgICAgICAgXG5cdCAqICAgICAgICAgICAgICAgIGhpZGUgOiB0cnVlXG5cdCAqICAgICAgICAgICAgfSk7ICAgICAgICAgICBcblx0ICogICAgICAgIH1cblx0ICogICAgIFxuXHQgKiAgICAgfSwgXG5cdCAqICAgICBcblx0ICogICAgIGV2ZW50cyA6IHtcblx0ICogICAgICAgIFwiaGVsbG9cIiA6IGZ1bmN0aW9uKGxheW91dEluZm8sIHZhbHVlKSB7XG5cdCAqICAgICAgICAgICAgLy8gaGVyZSBpcyBldmVudCBjb2RlIFxuXHQgKiAgICAgICAgfVxuXHQgKiAgICAgfSAgICAgXG5cdCAqIH0pO1xuXHQgKiBgYGAgXG5cdCAqICMjIyBVc2UgYSBwbHVnaW4gaW4gdG9vbGJhclxuXHQgKiBcblx0ICogYGBgIFxuXHQgKiAgICAkKFwiI2VkaXRvclwiKS5zdW1tZXJub3RlKHtcblx0ICogICAgLi4uXG5cdCAqICAgIHRvb2xiYXIgOiBbXG5cdCAqICAgICAgICAvLyBkaXNwbGF5IGhlbGxvIHBsdWdpbiBpbiB0b29sYmFyICAgICBcblx0ICogICAgICAgIFsnZ3JvdXAnLCBbICdoZWxsbycgXV1cblx0ICogICAgXVxuXHQgKiAgICAuLi4gICAgXG5cdCAqICAgIH0pO1xuXHQgKiBgYGBcblx0ICogIFxuXHQgKiAgXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBwbHVnaW5cblx0ICogQHBhcmFtIHtPYmplY3R9IFtwbHVnaW4uYnV0dG9uc10gZGVmaW5lIHBsdWdpbiBidXR0b24uIGZvciBkZXRhaWwsIHNlZSB0byBSZW5kZXJlci5hZGRCdXR0b25JbmZvXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbcGx1Z2luLmRpYWxvZ3NdIGRlZmluZSBwbHVnaW4gZGlhbG9nLiBmb3IgZGV0YWlsLCBzZWUgdG8gUmVuZGVyZXIuYWRkRGlhbG9nSW5mb1xuXHQgKiBAcGFyYW0ge09iamVjdH0gW3BsdWdpbi5ldmVudHNdIGFkZCBldmVudCBpbiAkLnN1bW1lcm5vdGUucGx1Z2luRXZlbnRzIFxuXHQgKiBAcGFyYW0ge09iamVjdH0gW3BsdWdpbi5sYW5nc10gdXBkYXRlICQuc3VtbWVybm90ZS5sYW5nXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbcGx1Z2luLm9wdGlvbnNdIHVwZGF0ZSAkLnN1bW1lcm5vdGUub3B0aW9uc1xuXHQgKi9cblx0JC5zdW1tZXJub3RlLmFkZFBsdWdpbiA9IGZ1bmN0aW9uIChwbHVnaW4pIHtcblxuXHRcdC8vIHNhdmUgcGx1Z2luIGxpc3Rcblx0XHQkLnN1bW1lcm5vdGUucGx1Z2lucy5wdXNoKHBsdWdpbik7XG5cblx0XHRpZiAocGx1Z2luLmJ1dHRvbnMpIHtcblx0XHRcdCQuZWFjaChwbHVnaW4uYnV0dG9ucywgZnVuY3Rpb24gKG5hbWUsIGJ1dHRvbikge1xuXHRcdFx0XHRyZW5kZXJlci5hZGRCdXR0b25JbmZvKG5hbWUsIGJ1dHRvbik7XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRpZiAocGx1Z2luLmRpYWxvZ3MpIHtcblx0XHRcdCQuZWFjaChwbHVnaW4uZGlhbG9ncywgZnVuY3Rpb24gKG5hbWUsIGRpYWxvZykge1xuXHRcdFx0XHRyZW5kZXJlci5hZGREaWFsb2dJbmZvKG5hbWUsIGRpYWxvZyk7XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRpZiAocGx1Z2luLmV2ZW50cykge1xuXHRcdFx0JC5lYWNoKHBsdWdpbi5ldmVudHMsIGZ1bmN0aW9uIChuYW1lLCBldmVudCkge1xuXHRcdFx0XHQkLnN1bW1lcm5vdGUucGx1Z2luRXZlbnRzW25hbWVdID0gZXZlbnQ7XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRpZiAocGx1Z2luLmxhbmdzKSB7XG5cdFx0XHQkLmVhY2gocGx1Z2luLmxhbmdzLCBmdW5jdGlvbiAobG9jYWxlLCBsYW5nKSB7XG5cdFx0XHRcdGlmICgkLnN1bW1lcm5vdGUubGFuZ1tsb2NhbGVdKSB7XG5cdFx0XHRcdFx0JC5leHRlbmQoJC5zdW1tZXJub3RlLmxhbmdbbG9jYWxlXSwgbGFuZyk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdGlmIChwbHVnaW4ub3B0aW9ucykge1xuXHRcdFx0JC5leHRlbmQoJC5zdW1tZXJub3RlLm9wdGlvbnMsIHBsdWdpbi5vcHRpb25zKTtcblx0XHR9XG5cdH07XG5cblx0Lypcblx0ICogZXh0ZW5kICQuZm5cblx0ICovXG5cdCQuZm4uZXh0ZW5kKHtcblx0XHQvKipcblx0XHQgKiBAbWV0aG9kXG5cdFx0ICogSW5pdGlhbGl6ZSBzdW1tZXJub3RlXG5cdFx0ICogIC0gY3JlYXRlIGVkaXRvciBsYXlvdXQgYW5kIGF0dGFjaCBNb3VzZSBhbmQga2V5Ym9hcmQgZXZlbnRzLlxuXHRcdCAqIFxuXHRcdCAqIGBgYFxuXHRcdCAqICQoXCIjc3VtbWVybm90ZVwiKS5zdW1tZXJub3RlKCB7IG9wdGlvbnMgLi59ICk7XG5cdFx0ICogYGBgXG5cdFx0ICogICBcblx0XHQgKiBAbWVtYmVyICQuZm5cblx0XHQgKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IG9wdGlvbnMgcmVmZXJlbmNlIHRvICQuc3VtbWVybm90ZS5vcHRpb25zXG5cdFx0ICogQHJldHVybiB7dGhpc31cblx0XHQgKi9cblx0XHRzdW1tZXJub3RlOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHQvLyBjaGVjayBmaXJzdCBhcmd1bWVudCdzIHR5cGVcblx0XHRcdC8vICAtIHtTdHJpbmd9OiBFeHRlcm5hbCBBUEkgY2FsbCB7e21vZHVsZX19Lnt7bWV0aG9kfX1cblx0XHRcdC8vICAtIHtPYmplY3R9OiBpbml0IG9wdGlvbnNcblx0XHRcdHZhciB0eXBlID0gJC50eXBlKGxpc3QuaGVhZChhcmd1bWVudHMpKTtcblx0XHRcdHZhciBpc0V4dGVybmFsQVBJQ2FsbGVkID0gdHlwZSA9PT0gJ3N0cmluZyc7XG5cdFx0XHR2YXIgaXNJbml0T3B0aW9ucyA9IHR5cGUgPT09ICdvYmplY3QnO1xuXG5cdFx0XHQvLyBleHRlbmQgZGVmYXVsdCBvcHRpb25zIHdpdGggY3VzdG9tIHVzZXIgb3B0aW9uc1xuXHRcdFx0dmFyIG9wdGlvbnMgPSBpc0luaXRPcHRpb25zID8gbGlzdC5oZWFkKGFyZ3VtZW50cykgOiB7fTtcblx0XHRcdG9wdGlvbnMgPSAkLmV4dGVuZCh0cnVlLCB7fSwgJC5zdW1tZXJub3RlLm9wdGlvbnMsIG9wdGlvbnMpO1xuXG5cdFx0XHQvLyBJbmNsdWRlIGxhbmdJbmZvIGluIG9wdGlvbnMgZm9yIGxhdGVyIHVzZSwgZS5nLiBmb3IgaW1hZ2UgZHJhZy1uLWRyb3Bcblx0XHRcdC8vIFNldHVwIGxhbmd1YWdlIGluZm8gd2l0aCBlbi1VUyBhcyBkZWZhdWx0XG5cdFx0XHRvcHRpb25zLmxhbmdJbmZvID0gJC5leHRlbmQodHJ1ZSwge30sICQuc3VtbWVybm90ZS5sYW5nWydlbi1VUyddLCAkLnN1bW1lcm5vdGUubGFuZ1tvcHRpb25zLmxhbmddKTtcblxuXHRcdFx0dGhpcy5lYWNoKGZ1bmN0aW9uIChpZHgsIGhvbGRlcikge1xuXHRcdFx0XHR2YXIgJGhvbGRlciA9ICQoaG9sZGVyKTtcblxuXHRcdFx0XHQvLyBpZiBsYXlvdXQgaXNuJ3QgY3JlYXRlZCB5ZXQsIGNyZWF0ZUxheW91dCBhbmQgYXR0YWNoIGV2ZW50c1xuXHRcdFx0XHRpZiAoIXJlbmRlcmVyLmhhc05vdGVFZGl0b3IoJGhvbGRlcikpIHtcblx0XHRcdFx0XHRyZW5kZXJlci5jcmVhdGVMYXlvdXQoJGhvbGRlciwgb3B0aW9ucyk7XG5cblx0XHRcdFx0XHR2YXIgbGF5b3V0SW5mbyA9IHJlbmRlcmVyLmxheW91dEluZm9Gcm9tSG9sZGVyKCRob2xkZXIpO1xuXG5cdFx0XHRcdFx0ZXZlbnRIYW5kbGVyLmF0dGFjaChsYXlvdXRJbmZvLCBvcHRpb25zKTtcblx0XHRcdFx0XHRldmVudEhhbmRsZXIuYXR0YWNoQ3VzdG9tRXZlbnQobGF5b3V0SW5mbywgb3B0aW9ucyk7XG5cblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cblx0XHRcdC8vIGNhbGxiYWNrIG9uIGluaXRcblx0XHRcdGlmICghaXNFeHRlcm5hbEFQSUNhbGxlZCAmJiB0aGlzLmxlbmd0aCAmJiBvcHRpb25zLm9uaW5pdCkge1xuXHRcdFx0XHRvcHRpb25zLm9uaW5pdCgpO1xuXHRcdFx0fVxuXG5cdFx0XHR2YXIgJGZpcnN0ID0gdGhpcy5maXJzdCgpO1xuXHRcdFx0aWYgKCRmaXJzdC5sZW5ndGgpIHtcblx0XHRcdFx0dmFyIGxheW91dEluZm8gPSByZW5kZXJlci5sYXlvdXRJbmZvRnJvbUhvbGRlcigkZmlyc3QpO1xuXG5cdFx0XHRcdC8vIGV4dGVybmFsIEFQSVxuXHRcdFx0XHRpZiAoaXNFeHRlcm5hbEFQSUNhbGxlZCkge1xuXHRcdFx0XHRcdHZhciBtb2R1bGVBbmRNZXRob2QgPSBsaXN0LmhlYWQobGlzdC5mcm9tKGFyZ3VtZW50cykpO1xuXHRcdFx0XHRcdHZhciBhcmdzID0gbGlzdC50YWlsKGxpc3QuZnJvbShhcmd1bWVudHMpKTtcblxuXHRcdFx0XHRcdC8vIFRPRE8gbm93IGV4dGVybmFsIEFQSSBvbmx5IHdvcmtzIGZvciBlZGl0b3Jcblx0XHRcdFx0XHR2YXIgcGFyYW1zID0gW21vZHVsZUFuZE1ldGhvZCwgbGF5b3V0SW5mby5lZGl0YWJsZSgpXS5jb25jYXQoYXJncyk7XG5cdFx0XHRcdFx0cmV0dXJuIGV2ZW50SGFuZGxlci5pbnZva2UuYXBwbHkoZXZlbnRIYW5kbGVyLCBwYXJhbXMpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKG9wdGlvbnMuZm9jdXMpIHtcblx0XHRcdFx0XHQvLyBmb2N1cyBvbiBmaXJzdCBlZGl0YWJsZSBlbGVtZW50IGZvciBpbml0aWFsaXplIGVkaXRvclxuXHRcdFx0XHRcdGxheW91dEluZm8uZWRpdGFibGUoKS5mb2N1cygpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH0sXG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIFxuXHRcdCAqIFxuXHRcdCAqIGdldCB0aGUgSFRNTCBjb250ZW50cyBvZiBub3RlIG9yIHNldCB0aGUgSFRNTCBjb250ZW50cyBvZiBub3RlLlxuXHRcdCAqXG5cdFx0ICogKiBnZXQgY29udGVudHMgXG5cdFx0ICogYGBgXG5cdFx0ICogdmFyIGNvbnRlbnQgPSAkKFwiI3N1bW1lcm5vdGVcIikuY29kZSgpO1xuXHRcdCAqIGBgYFxuXHRcdCAqICogc2V0IGNvbnRlbnRzIFxuXHRcdCAqXG5cdFx0ICogYGBgXG5cdFx0ICogJChcIiNzdW1tZXJub3RlXCIpLmNvZGUoaHRtbCk7XG5cdFx0ICogYGBgXG5cdFx0ICpcblx0XHQgKiBAbWVtYmVyICQuZm4gXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IFtodG1sXSAtIEhUTUwgY29udGVudHMob3B0aW9uYWwsIHNldClcblx0XHQgKiBAcmV0dXJuIHt0aGlzfFN0cmluZ30gLSBjb250ZXh0KHNldCkgb3IgSFRNTCBjb250ZW50cyBvZiBub3RlKGdldCkuXG5cdFx0ICovXG5cdFx0Y29kZTogZnVuY3Rpb24gKGh0bWwpIHtcblx0XHRcdC8vIGdldCB0aGUgSFRNTCBjb250ZW50cyBvZiBub3RlXG5cdFx0XHRpZiAoaHRtbCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHZhciAkaG9sZGVyID0gdGhpcy5maXJzdCgpO1xuXHRcdFx0XHRpZiAoISRob2xkZXIubGVuZ3RoKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dmFyIGxheW91dEluZm8gPSByZW5kZXJlci5sYXlvdXRJbmZvRnJvbUhvbGRlcigkaG9sZGVyKTtcblx0XHRcdFx0dmFyICRlZGl0YWJsZSA9IGxheW91dEluZm8gJiYgbGF5b3V0SW5mby5lZGl0YWJsZSgpO1xuXG5cdFx0XHRcdGlmICgkZWRpdGFibGUgJiYgJGVkaXRhYmxlLmxlbmd0aCkge1xuXHRcdFx0XHRcdHZhciBpc0NvZGV2aWV3ID0gZXZlbnRIYW5kbGVyLmludm9rZSgnY29kZXZpZXcuaXNBY3RpdmF0ZWQnLCBsYXlvdXRJbmZvKTtcblx0XHRcdFx0XHRldmVudEhhbmRsZXIuaW52b2tlKCdjb2Rldmlldy5zeW5jJywgbGF5b3V0SW5mbyk7XG5cdFx0XHRcdFx0cmV0dXJuIGlzQ29kZXZpZXcgPyBsYXlvdXRJbmZvLmNvZGFibGUoKS52YWwoKSA6XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGxheW91dEluZm8uZWRpdGFibGUoKS5odG1sKCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGRvbS5pc1RleHRhcmVhKCRob2xkZXJbMF0pID8gJGhvbGRlci52YWwoKSA6ICRob2xkZXIuaHRtbCgpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBzZXQgdGhlIEhUTUwgY29udGVudHMgb2Ygbm90ZVxuXHRcdFx0dGhpcy5lYWNoKGZ1bmN0aW9uIChpLCBob2xkZXIpIHtcblx0XHRcdFx0dmFyIGxheW91dEluZm8gPSByZW5kZXJlci5sYXlvdXRJbmZvRnJvbUhvbGRlcigkKGhvbGRlcikpO1xuXHRcdFx0XHR2YXIgJGVkaXRhYmxlID0gbGF5b3V0SW5mbyAmJiBsYXlvdXRJbmZvLmVkaXRhYmxlKCk7XG5cdFx0XHRcdGlmICgkZWRpdGFibGUpIHtcblx0XHRcdFx0XHQkZWRpdGFibGUuaHRtbChodG1sKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH0sXG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kXG5cdFx0ICogXG5cdFx0ICogZGVzdHJveSBFZGl0b3IgTGF5b3V0IGFuZCBkZXRhY2ggS2V5IGFuZCBNb3VzZSBFdmVudFxuXHRcdCAqXG5cdFx0ICogQG1lbWJlciAkLmZuXG5cdFx0ICogQHJldHVybiB7dGhpc31cblx0XHQgKi9cblx0XHRkZXN0cm95OiBmdW5jdGlvbiAoKSB7XG5cdFx0XHR0aGlzLmVhY2goZnVuY3Rpb24gKGlkeCwgaG9sZGVyKSB7XG5cdFx0XHRcdHZhciAkaG9sZGVyID0gJChob2xkZXIpO1xuXG5cdFx0XHRcdGlmICghcmVuZGVyZXIuaGFzTm90ZUVkaXRvcigkaG9sZGVyKSkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHZhciBpbmZvID0gcmVuZGVyZXIubGF5b3V0SW5mb0Zyb21Ib2xkZXIoJGhvbGRlcik7XG5cdFx0XHRcdHZhciBvcHRpb25zID0gaW5mby5lZGl0b3IoKS5kYXRhKCdvcHRpb25zJyk7XG5cblx0XHRcdFx0ZXZlbnRIYW5kbGVyLmRldGFjaChpbmZvLCBvcHRpb25zKTtcblx0XHRcdFx0cmVuZGVyZXIucmVtb3ZlTGF5b3V0KCRob2xkZXIsIGluZm8sIG9wdGlvbnMpO1xuXHRcdFx0fSk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblx0fSk7XG59KSk7XG5cbn0pLmNhbGwoZ2xvYmFsLCBtb2R1bGUsIHVuZGVmaW5lZCwgdW5kZWZpbmVkKTtcbiJdfQ==
},{"jquery":109}],96:[function(require,module,exports){
// This file is autogenerated via the `commonjs` Grunt task. You can require() this file in a CommonJS environment.
require('../../js/transition.js')
require('../../js/alert.js')
require('../../js/button.js')
require('../../js/carousel.js')
require('../../js/collapse.js')
require('../../js/dropdown.js')
require('../../js/modal.js')
require('../../js/tooltip.js')
require('../../js/popover.js')
require('../../js/scrollspy.js')
require('../../js/tab.js')
require('../../js/affix.js')
},{"../../js/affix.js":97,"../../js/alert.js":98,"../../js/button.js":99,"../../js/carousel.js":100,"../../js/collapse.js":101,"../../js/dropdown.js":102,"../../js/modal.js":103,"../../js/popover.js":104,"../../js/scrollspy.js":105,"../../js/tab.js":106,"../../js/tooltip.js":107,"../../js/transition.js":108}],97:[function(require,module,exports){
/* ========================================================================
 * Bootstrap: affix.js v3.3.7
 * http://getbootstrap.com/javascript/#affix
 * ========================================================================
 * Copyright 2011-2016 Twitter, Inc.
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 * ======================================================================== */


+function ($) {
  'use strict';

  // AFFIX CLASS DEFINITION
  // ======================

  var Affix = function (element, options) {
    this.options = $.extend({}, Affix.DEFAULTS, options)

    this.$target = $(this.options.target)
      .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))
      .on('click.bs.affix.data-api',  $.proxy(this.checkPositionWithEventLoop, this))

    this.$element     = $(element)
    this.affixed      = null
    this.unpin        = null
    this.pinnedOffset = null

    this.checkPosition()
  }

  Affix.VERSION  = '3.3.7'

  Affix.RESET    = 'affix affix-top affix-bottom'

  Affix.DEFAULTS = {
    offset: 0,
    target: window
  }

  Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) {
    var scrollTop    = this.$target.scrollTop()
    var position     = this.$element.offset()
    var targetHeight = this.$target.height()

    if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false

    if (this.affixed == 'bottom') {
      if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom'
      return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom'
    }

    var initializing   = this.affixed == null
    var colliderTop    = initializing ? scrollTop : position.top
    var colliderHeight = initializing ? targetHeight : height

    if (offsetTop != null && scrollTop <= offsetTop) return 'top'
    if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom'

    return false
  }

  Affix.prototype.getPinnedOffset = function () {
    if (this.pinnedOffset) return this.pinnedOffset
    this.$element.removeClass(Affix.RESET).addClass('affix')
    var scrollTop = this.$target.scrollTop()
    var position  = this.$element.offset()
    return (this.pinnedOffset = position.top - scrollTop)
  }

  Affix.prototype.checkPositionWithEventLoop = function () {
    setTimeout($.proxy(this.checkPosition, this), 1)
  }

  Affix.prototype.checkPosition = function () {
    if (!this.$element.is(':visible')) return

    var height       = this.$element.height()
    var offset       = this.options.offset
    var offsetTop    = offset.top
    var offsetBottom = offset.bottom
    var scrollHeight = Math.max($(document).height(), $(document.body).height())

    if (typeof offset != 'object')         offsetBottom = offsetTop = offset
    if (typeof offsetTop == 'function')    offsetTop    = offset.top(this.$element)
    if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element)

    var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom)

    if (this.affixed != affix) {
      if (this.unpin != null) this.$element.css('top', '')

      var affixType = 'affix' + (affix ? '-' + affix : '')
      var e         = $.Event(affixType + '.bs.affix')

      this.$element.trigger(e)

      if (e.isDefaultPrevented()) return

      this.affixed = affix
      this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null

      this.$element
        .removeClass(Affix.RESET)
        .addClass(affixType)
        .trigger(affixType.replace('affix', 'affixed') + '.bs.affix')
    }

    if (affix == 'bottom') {
      this.$element.offset({
        top: scrollHeight - height - offsetBottom
      })
    }
  }


  // AFFIX PLUGIN DEFINITION
  // =======================

  function Plugin(option) {
    return this.each(function () {
      var $this   = $(this)
      var data    = $this.data('bs.affix')
      var options = typeof option == 'object' && option

      if (!data) $this.data('bs.affix', (data = new Affix(this, options)))
      if (typeof option == 'string') data[option]()
    })
  }

  var old = $.fn.affix

  $.fn.affix             = Plugin
  $.fn.affix.Constructor = Affix


  // AFFIX NO CONFLICT
  // =================

  $.fn.affix.noConflict = function () {
    $.fn.affix = old
    return this
  }


  // AFFIX DATA-API
  // ==============

  $(window).on('load', function () {
    $('[data-spy="affix"]').each(function () {
      var $spy = $(this)
      var data = $spy.data()

      data.offset = data.offset || {}

      if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom
      if (data.offsetTop    != null) data.offset.top    = data.offsetTop

      Plugin.call($spy, data)
    })
  })

}(jQuery);

},{}],98:[function(require,module,exports){
/* ========================================================================
 * Bootstrap: alert.js v3.3.7
 * http://getbootstrap.com/javascript/#alerts
 * ========================================================================
 * Copyright 2011-2016 Twitter, Inc.
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 * ======================================================================== */


+function ($) {
  'use strict';

  // ALERT CLASS DEFINITION
  // ======================

  var dismiss = '[data-dismiss="alert"]'
  var Alert   = function (el) {
    $(el).on('click', dismiss, this.close)
  }

  Alert.VERSION = '3.3.7'

  Alert.TRANSITION_DURATION = 150

  Alert.prototype.close = function (e) {
    var $this    = $(this)
    var selector = $this.attr('data-target')

    if (!selector) {
      selector = $this.attr('href')
      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
    }

    var $parent = $(selector === '#' ? [] : selector)

    if (e) e.preventDefault()

    if (!$parent.length) {
      $parent = $this.closest('.alert')
    }

    $parent.trigger(e = $.Event('close.bs.alert'))

    if (e.isDefaultPrevented()) return

    $parent.removeClass('in')

    function removeElement() {
      // detach from parent, fire event then clean up data
      $parent.detach().trigger('closed.bs.alert').remove()
    }

    $.support.transition && $parent.hasClass('fade') ?
      $parent
        .one('bsTransitionEnd', removeElement)
        .emulateTransitionEnd(Alert.TRANSITION_DURATION) :
      removeElement()
  }


  // ALERT PLUGIN DEFINITION
  // =======================

  function Plugin(option) {
    return this.each(function () {
      var $this = $(this)
      var data  = $this.data('bs.alert')

      if (!data) $this.data('bs.alert', (data = new Alert(this)))
      if (typeof option == 'string') data[option].call($this)
    })
  }

  var old = $.fn.alert

  $.fn.alert             = Plugin
  $.fn.alert.Constructor = Alert


  // ALERT NO CONFLICT
  // =================

  $.fn.alert.noConflict = function () {
    $.fn.alert = old
    return this
  }


  // ALERT DATA-API
  // ==============

  $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)

}(jQuery);

},{}],99:[function(require,module,exports){
/* ========================================================================
 * Bootstrap: button.js v3.3.7
 * http://getbootstrap.com/javascript/#buttons
 * ========================================================================
 * Copyright 2011-2016 Twitter, Inc.
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 * ======================================================================== */


+function ($) {
  'use strict';

  // BUTTON PUBLIC CLASS DEFINITION
  // ==============================

  var Button = function (element, options) {
    this.$element  = $(element)
    this.options   = $.extend({}, Button.DEFAULTS, options)
    this.isLoading = false
  }

  Button.VERSION  = '3.3.7'

  Button.DEFAULTS = {
    loadingText: 'loading...'
  }

  Button.prototype.setState = function (state) {
    var d    = 'disabled'
    var $el  = this.$element
    var val  = $el.is('input') ? 'val' : 'html'
    var data = $el.data()

    state += 'Text'

    if (data.resetText == null) $el.data('resetText', $el[val]())

    // push to event loop to allow forms to submit
    setTimeout($.proxy(function () {
      $el[val](data[state] == null ? this.options[state] : data[state])

      if (state == 'loadingText') {
        this.isLoading = true
        $el.addClass(d).attr(d, d).prop(d, true)
      } else if (this.isLoading) {
        this.isLoading = false
        $el.removeClass(d).removeAttr(d).prop(d, false)
      }
    }, this), 0)
  }

  Button.prototype.toggle = function () {
    var changed = true
    var $parent = this.$element.closest('[data-toggle="buttons"]')

    if ($parent.length) {
      var $input = this.$element.find('input')
      if ($input.prop('type') == 'radio') {
        if ($input.prop('checked')) changed = false
        $parent.find('.active').removeClass('active')
        this.$element.addClass('active')
      } else if ($input.prop('type') == 'checkbox') {
        if (($input.prop('checked')) !== this.$element.hasClass('active')) changed = false
        this.$element.toggleClass('active')
      }
      $input.prop('checked', this.$element.hasClass('active'))
      if (changed) $input.trigger('change')
    } else {
      this.$element.attr('aria-pressed', !this.$element.hasClass('active'))
      this.$element.toggleClass('active')
    }
  }


  // BUTTON PLUGIN DEFINITION
  // ========================

  function Plugin(option) {
    return this.each(function () {
      var $this   = $(this)
      var data    = $this.data('bs.button')
      var options = typeof option == 'object' && option

      if (!data) $this.data('bs.button', (data = new Button(this, options)))

      if (option == 'toggle') data.toggle()
      else if (option) data.setState(option)
    })
  }

  var old = $.fn.button

  $.fn.button             = Plugin
  $.fn.button.Constructor = Button


  // BUTTON NO CONFLICT
  // ==================

  $.fn.button.noConflict = function () {
    $.fn.button = old
    return this
  }


  // BUTTON DATA-API
  // ===============

  $(document)
    .on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) {
      var $btn = $(e.target).closest('.btn')
      Plugin.call($btn, 'toggle')
      if (!($(e.target).is('input[type="radio"], input[type="checkbox"]'))) {
        // Prevent double click on radios, and the double selections (so cancellation) on checkboxes
        e.preventDefault()
        // The target component still receive the focus
        if ($btn.is('input,button')) $btn.trigger('focus')
        else $btn.find('input:visible,button:visible').first().trigger('focus')
      }
    })
    .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) {
      $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type))
    })

}(jQuery);

},{}],100:[function(require,module,exports){
/* ========================================================================
 * Bootstrap: carousel.js v3.3.7
 * http://getbootstrap.com/javascript/#carousel
 * ========================================================================
 * Copyright 2011-2016 Twitter, Inc.
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 * ======================================================================== */


+function ($) {
  'use strict';

  // CAROUSEL CLASS DEFINITION
  // =========================

  var Carousel = function (element, options) {
    this.$element    = $(element)
    this.$indicators = this.$element.find('.carousel-indicators')
    this.options     = options
    this.paused      = null
    this.sliding     = null
    this.interval    = null
    this.$active     = null
    this.$items      = null

    this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this))

    this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element
      .on('mouseenter.bs.carousel', $.proxy(this.pause, this))
      .on('mouseleave.bs.carousel', $.proxy(this.cycle, this))
  }

  Carousel.VERSION  = '3.3.7'

  Carousel.TRANSITION_DURATION = 600

  Carousel.DEFAULTS = {
    interval: 5000,
    pause: 'hover',
    wrap: true,
    keyboard: true
  }

  Carousel.prototype.keydown = function (e) {
    if (/input|textarea/i.test(e.target.tagName)) return
    switch (e.which) {
      case 37: this.prev(); break
      case 39: this.next(); break
      default: return
    }

    e.preventDefault()
  }

  Carousel.prototype.cycle = function (e) {
    e || (this.paused = false)

    this.interval && clearInterval(this.interval)

    this.options.interval
      && !this.paused
      && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))

    return this
  }

  Carousel.prototype.getItemIndex = function (item) {
    this.$items = item.parent().children('.item')
    return this.$items.index(item || this.$active)
  }

  Carousel.prototype.getItemForDirection = function (direction, active) {
    var activeIndex = this.getItemIndex(active)
    var willWrap = (direction == 'prev' && activeIndex === 0)
                || (direction == 'next' && activeIndex == (this.$items.length - 1))
    if (willWrap && !this.options.wrap) return active
    var delta = direction == 'prev' ? -1 : 1
    var itemIndex = (activeIndex + delta) % this.$items.length
    return this.$items.eq(itemIndex)
  }

  Carousel.prototype.to = function (pos) {
    var that        = this
    var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active'))

    if (pos > (this.$items.length - 1) || pos < 0) return

    if (this.sliding)       return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid"
    if (activeIndex == pos) return this.pause().cycle()

    return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos))
  }

  Carousel.prototype.pause = function (e) {
    e || (this.paused = true)

    if (this.$element.find('.next, .prev').length && $.support.transition) {
      this.$element.trigger($.support.transition.end)
      this.cycle(true)
    }

    this.interval = clearInterval(this.interval)

    return this
  }

  Carousel.prototype.next = function () {
    if (this.sliding) return
    return this.slide('next')
  }

  Carousel.prototype.prev = function () {
    if (this.sliding) return
    return this.slide('prev')
  }

  Carousel.prototype.slide = function (type, next) {
    var $active   = this.$element.find('.item.active')
    var $next     = next || this.getItemForDirection(type, $active)
    var isCycling = this.interval
    var direction = type == 'next' ? 'left' : 'right'
    var that      = this

    if ($next.hasClass('active')) return (this.sliding = false)

    var relatedTarget = $next[0]
    var slideEvent = $.Event('slide.bs.carousel', {
      relatedTarget: relatedTarget,
      direction: direction
    })
    this.$element.trigger(slideEvent)
    if (slideEvent.isDefaultPrevented()) return

    this.sliding = true

    isCycling && this.pause()

    if (this.$indicators.length) {
      this.$indicators.find('.active').removeClass('active')
      var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)])
      $nextIndicator && $nextIndicator.addClass('active')
    }

    var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid"
    if ($.support.transition && this.$element.hasClass('slide')) {
      $next.addClass(type)
      $next[0].offsetWidth // force reflow
      $active.addClass(direction)
      $next.addClass(direction)
      $active
        .one('bsTransitionEnd', function () {
          $next.removeClass([type, direction].join(' ')).addClass('active')
          $active.removeClass(['active', direction].join(' '))
          that.sliding = false
          setTimeout(function () {
            that.$element.trigger(slidEvent)
          }, 0)
        })
        .emulateTransitionEnd(Carousel.TRANSITION_DURATION)
    } else {
      $active.removeClass('active')
      $next.addClass('active')
      this.sliding = false
      this.$element.trigger(slidEvent)
    }

    isCycling && this.cycle()

    return this
  }


  // CAROUSEL PLUGIN DEFINITION
  // ==========================

  function Plugin(option) {
    return this.each(function () {
      var $this   = $(this)
      var data    = $this.data('bs.carousel')
      var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)
      var action  = typeof option == 'string' ? option : options.slide

      if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))
      if (typeof option == 'number') data.to(option)
      else if (action) data[action]()
      else if (options.interval) data.pause().cycle()
    })
  }

  var old = $.fn.carousel

  $.fn.carousel             = Plugin
  $.fn.carousel.Constructor = Carousel


  // CAROUSEL NO CONFLICT
  // ====================

  $.fn.carousel.noConflict = function () {
    $.fn.carousel = old
    return this
  }


  // CAROUSEL DATA-API
  // =================

  var clickHandler = function (e) {
    var href
    var $this   = $(this)
    var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7
    if (!$target.hasClass('carousel')) return
    var options = $.extend({}, $target.data(), $this.data())
    var slideIndex = $this.attr('data-slide-to')
    if (slideIndex) options.interval = false

    Plugin.call($target, options)

    if (slideIndex) {
      $target.data('bs.carousel').to(slideIndex)
    }

    e.preventDefault()
  }

  $(document)
    .on('click.bs.carousel.data-api', '[data-slide]', clickHandler)
    .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler)

  $(window).on('load', function () {
    $('[data-ride="carousel"]').each(function () {
      var $carousel = $(this)
      Plugin.call($carousel, $carousel.data())
    })
  })

}(jQuery);

},{}],101:[function(require,module,exports){
/* ========================================================================
 * Bootstrap: collapse.js v3.3.7
 * http://getbootstrap.com/javascript/#collapse
 * ========================================================================
 * Copyright 2011-2016 Twitter, Inc.
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 * ======================================================================== */

/* jshint latedef: false */

+function ($) {
  'use strict';

  // COLLAPSE PUBLIC CLASS DEFINITION
  // ================================

  var Collapse = function (element, options) {
    this.$element      = $(element)
    this.options       = $.extend({}, Collapse.DEFAULTS, options)
    this.$trigger      = $('[data-toggle="collapse"][href="#' + element.id + '"],' +
                           '[data-toggle="collapse"][data-target="#' + element.id + '"]')
    this.transitioning = null

    if (this.options.parent) {
      this.$parent = this.getParent()
    } else {
      this.addAriaAndCollapsedClass(this.$element, this.$trigger)
    }

    if (this.options.toggle) this.toggle()
  }

  Collapse.VERSION  = '3.3.7'

  Collapse.TRANSITION_DURATION = 350

  Collapse.DEFAULTS = {
    toggle: true
  }

  Collapse.prototype.dimension = function () {
    var hasWidth = this.$element.hasClass('width')
    return hasWidth ? 'width' : 'height'
  }

  Collapse.prototype.show = function () {
    if (this.transitioning || this.$element.hasClass('in')) return

    var activesData
    var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing')

    if (actives && actives.length) {
      activesData = actives.data('bs.collapse')
      if (activesData && activesData.transitioning) return
    }

    var startEvent = $.Event('show.bs.collapse')
    this.$element.trigger(startEvent)
    if (startEvent.isDefaultPrevented()) return

    if (actives && actives.length) {
      Plugin.call(actives, 'hide')
      activesData || actives.data('bs.collapse', null)
    }

    var dimension = this.dimension()

    this.$element
      .removeClass('collapse')
      .addClass('collapsing')[dimension](0)
      .attr('aria-expanded', true)

    this.$trigger
      .removeClass('collapsed')
      .attr('aria-expanded', true)

    this.transitioning = 1

    var complete = function () {
      this.$element
        .removeClass('collapsing')
        .addClass('collapse in')[dimension]('')
      this.transitioning = 0
      this.$element
        .trigger('shown.bs.collapse')
    }

    if (!$.support.transition) return complete.call(this)

    var scrollSize = $.camelCase(['scroll', dimension].join('-'))

    this.$element
      .one('bsTransitionEnd', $.proxy(complete, this))
      .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize])
  }

  Collapse.prototype.hide = function () {
    if (this.transitioning || !this.$element.hasClass('in')) return

    var startEvent = $.Event('hide.bs.collapse')
    this.$element.trigger(startEvent)
    if (startEvent.isDefaultPrevented()) return

    var dimension = this.dimension()

    this.$element[dimension](this.$element[dimension]())[0].offsetHeight

    this.$element
      .addClass('collapsing')
      .removeClass('collapse in')
      .attr('aria-expanded', false)

    this.$trigger
      .addClass('collapsed')
      .attr('aria-expanded', false)

    this.transitioning = 1

    var complete = function () {
      this.transitioning = 0
      this.$element
        .removeClass('collapsing')
        .addClass('collapse')
        .trigger('hidden.bs.collapse')
    }

    if (!$.support.transition) return complete.call(this)

    this.$element
      [dimension](0)
      .one('bsTransitionEnd', $.proxy(complete, this))
      .emulateTransitionEnd(Collapse.TRANSITION_DURATION)
  }

  Collapse.prototype.toggle = function () {
    this[this.$element.hasClass('in') ? 'hide' : 'show']()
  }

  Collapse.prototype.getParent = function () {
    return $(this.options.parent)
      .find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]')
      .each($.proxy(function (i, element) {
        var $element = $(element)
        this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element)
      }, this))
      .end()
  }

  Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) {
    var isOpen = $element.hasClass('in')

    $element.attr('aria-expanded', isOpen)
    $trigger
      .toggleClass('collapsed', !isOpen)
      .attr('aria-expanded', isOpen)
  }

  function getTargetFromTrigger($trigger) {
    var href
    var target = $trigger.attr('data-target')
      || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7

    return $(target)
  }


  // COLLAPSE PLUGIN DEFINITION
  // ==========================

  function Plugin(option) {
    return this.each(function () {
      var $this   = $(this)
      var data    = $this.data('bs.collapse')
      var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)

      if (!data && options.toggle && /show|hide/.test(option)) options.toggle = false
      if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))
      if (typeof option == 'string') data[option]()
    })
  }

  var old = $.fn.collapse

  $.fn.collapse             = Plugin
  $.fn.collapse.Constructor = Collapse


  // COLLAPSE NO CONFLICT
  // ====================

  $.fn.collapse.noConflict = function () {
    $.fn.collapse = old
    return this
  }


  // COLLAPSE DATA-API
  // =================

  $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) {
    var $this   = $(this)

    if (!$this.attr('data-target')) e.preventDefault()

    var $target = getTargetFromTrigger($this)
    var data    = $target.data('bs.collapse')
    var option  = data ? 'toggle' : $this.data()

    Plugin.call($target, option)
  })

}(jQuery);

},{}],102:[function(require,module,exports){
/* ========================================================================
 * Bootstrap: dropdown.js v3.3.7
 * http://getbootstrap.com/javascript/#dropdowns
 * ========================================================================
 * Copyright 2011-2016 Twitter, Inc.
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 * ======================================================================== */


+function ($) {
  'use strict';

  // DROPDOWN CLASS DEFINITION
  // =========================

  var backdrop = '.dropdown-backdrop'
  var toggle   = '[data-toggle="dropdown"]'
  var Dropdown = function (element) {
    $(element).on('click.bs.dropdown', this.toggle)
  }

  Dropdown.VERSION = '3.3.7'

  function getParent($this) {
    var selector = $this.attr('data-target')

    if (!selector) {
      selector = $this.attr('href')
      selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
    }

    var $parent = selector && $(selector)

    return $parent && $parent.length ? $parent : $this.parent()
  }

  function clearMenus(e) {
    if (e && e.which === 3) return
    $(backdrop).remove()
    $(toggle).each(function () {
      var $this         = $(this)
      var $parent       = getParent($this)
      var relatedTarget = { relatedTarget: this }

      if (!$parent.hasClass('open')) return

      if (e && e.type == 'click' && /input|textarea/i.test(e.target.tagName) && $.contains($parent[0], e.target)) return

      $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))

      if (e.isDefaultPrevented()) return

      $this.attr('aria-expanded', 'false')
      $parent.removeClass('open').trigger($.Event('hidden.bs.dropdown', relatedTarget))
    })
  }

  Dropdown.prototype.toggle = function (e) {
    var $this = $(this)

    if ($this.is('.disabled, :disabled')) return

    var $parent  = getParent($this)
    var isActive = $parent.hasClass('open')

    clearMenus()

    if (!isActive) {
      if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {
        // if mobile we use a backdrop because click events don't delegate
        $(document.createElement('div'))
          .addClass('dropdown-backdrop')
          .insertAfter($(this))
          .on('click', clearMenus)
      }

      var relatedTarget = { relatedTarget: this }
      $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget))

      if (e.isDefaultPrevented()) return

      $this
        .trigger('focus')
        .attr('aria-expanded', 'true')

      $parent
        .toggleClass('open')
        .trigger($.Event('shown.bs.dropdown', relatedTarget))
    }

    return false
  }

  Dropdown.prototype.keydown = function (e) {
    if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return

    var $this = $(this)

    e.preventDefault()
    e.stopPropagation()

    if ($this.is('.disabled, :disabled')) return

    var $parent  = getParent($this)
    var isActive = $parent.hasClass('open')

    if (!isActive && e.which != 27 || isActive && e.which == 27) {
      if (e.which == 27) $parent.find(toggle).trigger('focus')
      return $this.trigger('click')
    }

    var desc = ' li:not(.disabled):visible a'
    var $items = $parent.find('.dropdown-menu' + desc)

    if (!$items.length) return

    var index = $items.index(e.target)

    if (e.which == 38 && index > 0)                 index--         // up
    if (e.which == 40 && index < $items.length - 1) index++         // down
    if (!~index)                                    index = 0

    $items.eq(index).trigger('focus')
  }


  // DROPDOWN PLUGIN DEFINITION
  // ==========================

  function Plugin(option) {
    return this.each(function () {
      var $this = $(this)
      var data  = $this.data('bs.dropdown')

      if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))
      if (typeof option == 'string') data[option].call($this)
    })
  }

  var old = $.fn.dropdown

  $.fn.dropdown             = Plugin
  $.fn.dropdown.Constructor = Dropdown


  // DROPDOWN NO CONFLICT
  // ====================

  $.fn.dropdown.noConflict = function () {
    $.fn.dropdown = old
    return this
  }


  // APPLY TO STANDARD DROPDOWN ELEMENTS
  // ===================================

  $(document)
    .on('click.bs.dropdown.data-api', clearMenus)
    .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
    .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)
    .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown)
    .on('keydown.bs.dropdown.data-api', '.dropdown-menu', Dropdown.prototype.keydown)

}(jQuery);

},{}],103:[function(require,module,exports){
/* ========================================================================
 * Bootstrap: modal.js v3.3.7
 * http://getbootstrap.com/javascript/#modals
 * ========================================================================
 * Copyright 2011-2016 Twitter, Inc.
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 * ======================================================================== */


+function ($) {
  'use strict';

  // MODAL CLASS DEFINITION
  // ======================

  var Modal = function (element, options) {
    this.options             = options
    this.$body               = $(document.body)
    this.$element            = $(element)
    this.$dialog             = this.$element.find('.modal-dialog')
    this.$backdrop           = null
    this.isShown             = null
    this.originalBodyPad     = null
    this.scrollbarWidth      = 0
    this.ignoreBackdropClick = false

    if (this.options.remote) {
      this.$element
        .find('.modal-content')
        .load(this.options.remote, $.proxy(function () {
          this.$element.trigger('loaded.bs.modal')
        }, this))
    }
  }

  Modal.VERSION  = '3.3.7'

  Modal.TRANSITION_DURATION = 300
  Modal.BACKDROP_TRANSITION_DURATION = 150

  Modal.DEFAULTS = {
    backdrop: true,
    keyboard: true,
    show: true
  }

  Modal.prototype.toggle = function (_relatedTarget) {
    return this.isShown ? this.hide() : this.show(_relatedTarget)
  }

  Modal.prototype.show = function (_relatedTarget) {
    var that = this
    var e    = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })

    this.$element.trigger(e)

    if (this.isShown || e.isDefaultPrevented()) return

    this.isShown = true

    this.checkScrollbar()
    this.setScrollbar()
    this.$body.addClass('modal-open')

    this.escape()
    this.resize()

    this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this))

    this.$dialog.on('mousedown.dismiss.bs.modal', function () {
      that.$element.one('mouseup.dismiss.bs.modal', function (e) {
        if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true
      })
    })

    this.backdrop(function () {
      var transition = $.support.transition && that.$element.hasClass('fade')

      if (!that.$element.parent().length) {
        that.$element.appendTo(that.$body) // don't move modals dom position
      }

      that.$element
        .show()
        .scrollTop(0)

      that.adjustDialog()

      if (transition) {
        that.$element[0].offsetWidth // force reflow
      }

      that.$element.addClass('in')

      that.enforceFocus()

      var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })

      transition ?
        that.$dialog // wait for modal to slide in
          .one('bsTransitionEnd', function () {
            that.$element.trigger('focus').trigger(e)
          })
          .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
        that.$element.trigger('focus').trigger(e)
    })
  }

  Modal.prototype.hide = function (e) {
    if (e) e.preventDefault()

    e = $.Event('hide.bs.modal')

    this.$element.trigger(e)

    if (!this.isShown || e.isDefaultPrevented()) return

    this.isShown = false

    this.escape()
    this.resize()

    $(document).off('focusin.bs.modal')

    this.$element
      .removeClass('in')
      .off('click.dismiss.bs.modal')
      .off('mouseup.dismiss.bs.modal')

    this.$dialog.off('mousedown.dismiss.bs.modal')

    $.support.transition && this.$element.hasClass('fade') ?
      this.$element
        .one('bsTransitionEnd', $.proxy(this.hideModal, this))
        .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
      this.hideModal()
  }

  Modal.prototype.enforceFocus = function () {
    $(document)
      .off('focusin.bs.modal') // guard against infinite focus loop
      .on('focusin.bs.modal', $.proxy(function (e) {
        if (document !== e.target &&
            this.$element[0] !== e.target &&
            !this.$element.has(e.target).length) {
          this.$element.trigger('focus')
        }
      }, this))
  }

  Modal.prototype.escape = function () {
    if (this.isShown && this.options.keyboard) {
      this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) {
        e.which == 27 && this.hide()
      }, this))
    } else if (!this.isShown) {
      this.$element.off('keydown.dismiss.bs.modal')
    }
  }

  Modal.prototype.resize = function () {
    if (this.isShown) {
      $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this))
    } else {
      $(window).off('resize.bs.modal')
    }
  }

  Modal.prototype.hideModal = function () {
    var that = this
    this.$element.hide()
    this.backdrop(function () {
      that.$body.removeClass('modal-open')
      that.resetAdjustments()
      that.resetScrollbar()
      that.$element.trigger('hidden.bs.modal')
    })
  }

  Modal.prototype.removeBackdrop = function () {
    this.$backdrop && this.$backdrop.remove()
    this.$backdrop = null
  }

  Modal.prototype.backdrop = function (callback) {
    var that = this
    var animate = this.$element.hasClass('fade') ? 'fade' : ''

    if (this.isShown && this.options.backdrop) {
      var doAnimate = $.support.transition && animate

      this.$backdrop = $(document.createElement('div'))
        .addClass('modal-backdrop ' + animate)
        .appendTo(this.$body)

      this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) {
        if (this.ignoreBackdropClick) {
          this.ignoreBackdropClick = false
          return
        }
        if (e.target !== e.currentTarget) return
        this.options.backdrop == 'static'
          ? this.$element[0].focus()
          : this.hide()
      }, this))

      if (doAnimate) this.$backdrop[0].offsetWidth // force reflow

      this.$backdrop.addClass('in')

      if (!callback) return

      doAnimate ?
        this.$backdrop
          .one('bsTransitionEnd', callback)
          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
        callback()

    } else if (!this.isShown && this.$backdrop) {
      this.$backdrop.removeClass('in')

      var callbackRemove = function () {
        that.removeBackdrop()
        callback && callback()
      }
      $.support.transition && this.$element.hasClass('fade') ?
        this.$backdrop
          .one('bsTransitionEnd', callbackRemove)
          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
        callbackRemove()

    } else if (callback) {
      callback()
    }
  }

  // these following methods are used to handle overflowing modals

  Modal.prototype.handleUpdate = function () {
    this.adjustDialog()
  }

  Modal.prototype.adjustDialog = function () {
    var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight

    this.$element.css({
      paddingLeft:  !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '',
      paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : ''
    })
  }

  Modal.prototype.resetAdjustments = function () {
    this.$element.css({
      paddingLeft: '',
      paddingRight: ''
    })
  }

  Modal.prototype.checkScrollbar = function () {
    var fullWindowWidth = window.innerWidth
    if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8
      var documentElementRect = document.documentElement.getBoundingClientRect()
      fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left)
    }
    this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth
    this.scrollbarWidth = this.measureScrollbar()
  }

  Modal.prototype.setScrollbar = function () {
    var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10)
    this.originalBodyPad = document.body.style.paddingRight || ''
    if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth)
  }

  Modal.prototype.resetScrollbar = function () {
    this.$body.css('padding-right', this.originalBodyPad)
  }

  Modal.prototype.measureScrollbar = function () { // thx walsh
    var scrollDiv = document.createElement('div')
    scrollDiv.className = 'modal-scrollbar-measure'
    this.$body.append(scrollDiv)
    var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth
    this.$body[0].removeChild(scrollDiv)
    return scrollbarWidth
  }


  // MODAL PLUGIN DEFINITION
  // =======================

  function Plugin(option, _relatedTarget) {
    return this.each(function () {
      var $this   = $(this)
      var data    = $this.data('bs.modal')
      var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)

      if (!data) $this.data('bs.modal', (data = new Modal(this, options)))
      if (typeof option == 'string') data[option](_relatedTarget)
      else if (options.show) data.show(_relatedTarget)
    })
  }

  var old = $.fn.modal

  $.fn.modal             = Plugin
  $.fn.modal.Constructor = Modal


  // MODAL NO CONFLICT
  // =================

  $.fn.modal.noConflict = function () {
    $.fn.modal = old
    return this
  }


  // MODAL DATA-API
  // ==============

  $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) {
    var $this   = $(this)
    var href    = $this.attr('href')
    var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7
    var option  = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())

    if ($this.is('a')) e.preventDefault()

    $target.one('show.bs.modal', function (showEvent) {
      if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown
      $target.one('hidden.bs.modal', function () {
        $this.is(':visible') && $this.trigger('focus')
      })
    })
    Plugin.call($target, option, this)
  })

}(jQuery);

},{}],104:[function(require,module,exports){
/* ========================================================================
 * Bootstrap: popover.js v3.3.7
 * http://getbootstrap.com/javascript/#popovers
 * ========================================================================
 * Copyright 2011-2016 Twitter, Inc.
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 * ======================================================================== */


+function ($) {
  'use strict';

  // POPOVER PUBLIC CLASS DEFINITION
  // ===============================

  var Popover = function (element, options) {
    this.init('popover', element, options)
  }

  if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')

  Popover.VERSION  = '3.3.7'

  Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {
    placement: 'right',
    trigger: 'click',
    content: '',
    template: '<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'
  })


  // NOTE: POPOVER EXTENDS tooltip.js
  // ================================

  Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)

  Popover.prototype.constructor = Popover

  Popover.prototype.getDefaults = function () {
    return Popover.DEFAULTS
  }

  Popover.prototype.setContent = function () {
    var $tip    = this.tip()
    var title   = this.getTitle()
    var content = this.getContent()

    $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
    $tip.find('.popover-content').children().detach().end()[ // we use append for html objects to maintain js events
      this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text'
    ](content)

    $tip.removeClass('fade top bottom left right in')

    // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do
    // this manually by checking the contents.
    if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()
  }

  Popover.prototype.hasContent = function () {
    return this.getTitle() || this.getContent()
  }

  Popover.prototype.getContent = function () {
    var $e = this.$element
    var o  = this.options

    return $e.attr('data-content')
      || (typeof o.content == 'function' ?
            o.content.call($e[0]) :
            o.content)
  }

  Popover.prototype.arrow = function () {
    return (this.$arrow = this.$arrow || this.tip().find('.arrow'))
  }


  // POPOVER PLUGIN DEFINITION
  // =========================

  function Plugin(option) {
    return this.each(function () {
      var $this   = $(this)
      var data    = $this.data('bs.popover')
      var options = typeof option == 'object' && option

      if (!data && /destroy|hide/.test(option)) return
      if (!data) $this.data('bs.popover', (data = new Popover(this, options)))
      if (typeof option == 'string') data[option]()
    })
  }

  var old = $.fn.popover

  $.fn.popover             = Plugin
  $.fn.popover.Constructor = Popover


  // POPOVER NO CONFLICT
  // ===================

  $.fn.popover.noConflict = function () {
    $.fn.popover = old
    return this
  }

}(jQuery);

},{}],105:[function(require,module,exports){
/* ========================================================================
 * Bootstrap: scrollspy.js v3.3.7
 * http://getbootstrap.com/javascript/#scrollspy
 * ========================================================================
 * Copyright 2011-2016 Twitter, Inc.
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 * ======================================================================== */


+function ($) {
  'use strict';

  // SCROLLSPY CLASS DEFINITION
  // ==========================

  function ScrollSpy(element, options) {
    this.$body          = $(document.body)
    this.$scrollElement = $(element).is(document.body) ? $(window) : $(element)
    this.options        = $.extend({}, ScrollSpy.DEFAULTS, options)
    this.selector       = (this.options.target || '') + ' .nav li > a'
    this.offsets        = []
    this.targets        = []
    this.activeTarget   = null
    this.scrollHeight   = 0

    this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this))
    this.refresh()
    this.process()
  }

  ScrollSpy.VERSION  = '3.3.7'

  ScrollSpy.DEFAULTS = {
    offset: 10
  }

  ScrollSpy.prototype.getScrollHeight = function () {
    return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight)
  }

  ScrollSpy.prototype.refresh = function () {
    var that          = this
    var offsetMethod  = 'offset'
    var offsetBase    = 0

    this.offsets      = []
    this.targets      = []
    this.scrollHeight = this.getScrollHeight()

    if (!$.isWindow(this.$scrollElement[0])) {
      offsetMethod = 'position'
      offsetBase   = this.$scrollElement.scrollTop()
    }

    this.$body
      .find(this.selector)
      .map(function () {
        var $el   = $(this)
        var href  = $el.data('target') || $el.attr('href')
        var $href = /^#./.test(href) && $(href)

        return ($href
          && $href.length
          && $href.is(':visible')
          && [[$href[offsetMethod]().top + offsetBase, href]]) || null
      })
      .sort(function (a, b) { return a[0] - b[0] })
      .each(function () {
        that.offsets.push(this[0])
        that.targets.push(this[1])
      })
  }

  ScrollSpy.prototype.process = function () {
    var scrollTop    = this.$scrollElement.scrollTop() + this.options.offset
    var scrollHeight = this.getScrollHeight()
    var maxScroll    = this.options.offset + scrollHeight - this.$scrollElement.height()
    var offsets      = this.offsets
    var targets      = this.targets
    var activeTarget = this.activeTarget
    var i

    if (this.scrollHeight != scrollHeight) {
      this.refresh()
    }

    if (scrollTop >= maxScroll) {
      return activeTarget != (i = targets[targets.length - 1]) && this.activate(i)
    }

    if (activeTarget && scrollTop < offsets[0]) {
      this.activeTarget = null
      return this.clear()
    }

    for (i = offsets.length; i--;) {
      activeTarget != targets[i]
        && scrollTop >= offsets[i]
        && (offsets[i + 1] === undefined || scrollTop < offsets[i + 1])
        && this.activate(targets[i])
    }
  }

  ScrollSpy.prototype.activate = function (target) {
    this.activeTarget = target

    this.clear()

    var selector = this.selector +
      '[data-target="' + target + '"],' +
      this.selector + '[href="' + target + '"]'

    var active = $(selector)
      .parents('li')
      .addClass('active')

    if (active.parent('.dropdown-menu').length) {
      active = active
        .closest('li.dropdown')
        .addClass('active')
    }

    active.trigger('activate.bs.scrollspy')
  }

  ScrollSpy.prototype.clear = function () {
    $(this.selector)
      .parentsUntil(this.options.target, '.active')
      .removeClass('active')
  }


  // SCROLLSPY PLUGIN DEFINITION
  // ===========================

  function Plugin(option) {
    return this.each(function () {
      var $this   = $(this)
      var data    = $this.data('bs.scrollspy')
      var options = typeof option == 'object' && option

      if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))
      if (typeof option == 'string') data[option]()
    })
  }

  var old = $.fn.scrollspy

  $.fn.scrollspy             = Plugin
  $.fn.scrollspy.Constructor = ScrollSpy


  // SCROLLSPY NO CONFLICT
  // =====================

  $.fn.scrollspy.noConflict = function () {
    $.fn.scrollspy = old
    return this
  }


  // SCROLLSPY DATA-API
  // ==================

  $(window).on('load.bs.scrollspy.data-api', function () {
    $('[data-spy="scroll"]').each(function () {
      var $spy = $(this)
      Plugin.call($spy, $spy.data())
    })
  })

}(jQuery);

},{}],106:[function(require,module,exports){
/* ========================================================================
 * Bootstrap: tab.js v3.3.7
 * http://getbootstrap.com/javascript/#tabs
 * ========================================================================
 * Copyright 2011-2016 Twitter, Inc.
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 * ======================================================================== */


+function ($) {
  'use strict';

  // TAB CLASS DEFINITION
  // ====================

  var Tab = function (element) {
    // jscs:disable requireDollarBeforejQueryAssignment
    this.element = $(element)
    // jscs:enable requireDollarBeforejQueryAssignment
  }

  Tab.VERSION = '3.3.7'

  Tab.TRANSITION_DURATION = 150

  Tab.prototype.show = function () {
    var $this    = this.element
    var $ul      = $this.closest('ul:not(.dropdown-menu)')
    var selector = $this.data('target')

    if (!selector) {
      selector = $this.attr('href')
      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
    }

    if ($this.parent('li').hasClass('active')) return

    var $previous = $ul.find('.active:last a')
    var hideEvent = $.Event('hide.bs.tab', {
      relatedTarget: $this[0]
    })
    var showEvent = $.Event('show.bs.tab', {
      relatedTarget: $previous[0]
    })

    $previous.trigger(hideEvent)
    $this.trigger(showEvent)

    if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return

    var $target = $(selector)

    this.activate($this.closest('li'), $ul)
    this.activate($target, $target.parent(), function () {
      $previous.trigger({
        type: 'hidden.bs.tab',
        relatedTarget: $this[0]
      })
      $this.trigger({
        type: 'shown.bs.tab',
        relatedTarget: $previous[0]
      })
    })
  }

  Tab.prototype.activate = function (element, container, callback) {
    var $active    = container.find('> .active')
    var transition = callback
      && $.support.transition
      && ($active.length && $active.hasClass('fade') || !!container.find('> .fade').length)

    function next() {
      $active
        .removeClass('active')
        .find('> .dropdown-menu > .active')
          .removeClass('active')
        .end()
        .find('[data-toggle="tab"]')
          .attr('aria-expanded', false)

      element
        .addClass('active')
        .find('[data-toggle="tab"]')
          .attr('aria-expanded', true)

      if (transition) {
        element[0].offsetWidth // reflow for transition
        element.addClass('in')
      } else {
        element.removeClass('fade')
      }

      if (element.parent('.dropdown-menu').length) {
        element
          .closest('li.dropdown')
            .addClass('active')
          .end()
          .find('[data-toggle="tab"]')
            .attr('aria-expanded', true)
      }

      callback && callback()
    }

    $active.length && transition ?
      $active
        .one('bsTransitionEnd', next)
        .emulateTransitionEnd(Tab.TRANSITION_DURATION) :
      next()

    $active.removeClass('in')
  }


  // TAB PLUGIN DEFINITION
  // =====================

  function Plugin(option) {
    return this.each(function () {
      var $this = $(this)
      var data  = $this.data('bs.tab')

      if (!data) $this.data('bs.tab', (data = new Tab(this)))
      if (typeof option == 'string') data[option]()
    })
  }

  var old = $.fn.tab

  $.fn.tab             = Plugin
  $.fn.tab.Constructor = Tab


  // TAB NO CONFLICT
  // ===============

  $.fn.tab.noConflict = function () {
    $.fn.tab = old
    return this
  }


  // TAB DATA-API
  // ============

  var clickHandler = function (e) {
    e.preventDefault()
    Plugin.call($(this), 'show')
  }

  $(document)
    .on('click.bs.tab.data-api', '[data-toggle="tab"]', clickHandler)
    .on('click.bs.tab.data-api', '[data-toggle="pill"]', clickHandler)

}(jQuery);

},{}],107:[function(require,module,exports){
/* ========================================================================
 * Bootstrap: tooltip.js v3.3.7
 * http://getbootstrap.com/javascript/#tooltip
 * Inspired by the original jQuery.tipsy by Jason Frame
 * ========================================================================
 * Copyright 2011-2016 Twitter, Inc.
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 * ======================================================================== */


+function ($) {
  'use strict';

  // TOOLTIP PUBLIC CLASS DEFINITION
  // ===============================

  var Tooltip = function (element, options) {
    this.type       = null
    this.options    = null
    this.enabled    = null
    this.timeout    = null
    this.hoverState = null
    this.$element   = null
    this.inState    = null

    this.init('tooltip', element, options)
  }

  Tooltip.VERSION  = '3.3.7'

  Tooltip.TRANSITION_DURATION = 150

  Tooltip.DEFAULTS = {
    animation: true,
    placement: 'top',
    selector: false,
    template: '<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',
    trigger: 'hover focus',
    title: '',
    delay: 0,
    html: false,
    container: false,
    viewport: {
      selector: 'body',
      padding: 0
    }
  }

  Tooltip.prototype.init = function (type, element, options) {
    this.enabled   = true
    this.type      = type
    this.$element  = $(element)
    this.options   = this.getOptions(options)
    this.$viewport = this.options.viewport && $($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport))
    this.inState   = { click: false, hover: false, focus: false }

    if (this.$element[0] instanceof document.constructor && !this.options.selector) {
      throw new Error('`selector` option must be specified when initializing ' + this.type + ' on the window.document object!')
    }

    var triggers = this.options.trigger.split(' ')

    for (var i = triggers.length; i--;) {
      var trigger = triggers[i]

      if (trigger == 'click') {
        this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
      } else if (trigger != 'manual') {
        var eventIn  = trigger == 'hover' ? 'mouseenter' : 'focusin'
        var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout'

        this.$element.on(eventIn  + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
        this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
      }
    }

    this.options.selector ?
      (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
      this.fixTitle()
  }

  Tooltip.prototype.getDefaults = function () {
    return Tooltip.DEFAULTS
  }

  Tooltip.prototype.getOptions = function (options) {
    options = $.extend({}, this.getDefaults(), this.$element.data(), options)

    if (options.delay && typeof options.delay == 'number') {
      options.delay = {
        show: options.delay,
        hide: options.delay
      }
    }

    return options
  }

  Tooltip.prototype.getDelegateOptions = function () {
    var options  = {}
    var defaults = this.getDefaults()

    this._options && $.each(this._options, function (key, value) {
      if (defaults[key] != value) options[key] = value
    })

    return options
  }

  Tooltip.prototype.enter = function (obj) {
    var self = obj instanceof this.constructor ?
      obj : $(obj.currentTarget).data('bs.' + this.type)

    if (!self) {
      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
      $(obj.currentTarget).data('bs.' + this.type, self)
    }

    if (obj instanceof $.Event) {
      self.inState[obj.type == 'focusin' ? 'focus' : 'hover'] = true
    }

    if (self.tip().hasClass('in') || self.hoverState == 'in') {
      self.hoverState = 'in'
      return
    }

    clearTimeout(self.timeout)

    self.hoverState = 'in'

    if (!self.options.delay || !self.options.delay.show) return self.show()

    self.timeout = setTimeout(function () {
      if (self.hoverState == 'in') self.show()
    }, self.options.delay.show)
  }

  Tooltip.prototype.isInStateTrue = function () {
    for (var key in this.inState) {
      if (this.inState[key]) return true
    }

    return false
  }

  Tooltip.prototype.leave = function (obj) {
    var self = obj instanceof this.constructor ?
      obj : $(obj.currentTarget).data('bs.' + this.type)

    if (!self) {
      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
      $(obj.currentTarget).data('bs.' + this.type, self)
    }

    if (obj instanceof $.Event) {
      self.inState[obj.type == 'focusout' ? 'focus' : 'hover'] = false
    }

    if (self.isInStateTrue()) return

    clearTimeout(self.timeout)

    self.hoverState = 'out'

    if (!self.options.delay || !self.options.delay.hide) return self.hide()

    self.timeout = setTimeout(function () {
      if (self.hoverState == 'out') self.hide()
    }, self.options.delay.hide)
  }

  Tooltip.prototype.show = function () {
    var e = $.Event('show.bs.' + this.type)

    if (this.hasContent() && this.enabled) {
      this.$element.trigger(e)

      var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0])
      if (e.isDefaultPrevented() || !inDom) return
      var that = this

      var $tip = this.tip()

      var tipId = this.getUID(this.type)

      this.setContent()
      $tip.attr('id', tipId)
      this.$element.attr('aria-describedby', tipId)

      if (this.options.animation) $tip.addClass('fade')

      var placement = typeof this.options.placement == 'function' ?
        this.options.placement.call(this, $tip[0], this.$element[0]) :
        this.options.placement

      var autoToken = /\s?auto?\s?/i
      var autoPlace = autoToken.test(placement)
      if (autoPlace) placement = placement.replace(autoToken, '') || 'top'

      $tip
        .detach()
        .css({ top: 0, left: 0, display: 'block' })
        .addClass(placement)
        .data('bs.' + this.type, this)

      this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)
      this.$element.trigger('inserted.bs.' + this.type)

      var pos          = this.getPosition()
      var actualWidth  = $tip[0].offsetWidth
      var actualHeight = $tip[0].offsetHeight

      if (autoPlace) {
        var orgPlacement = placement
        var viewportDim = this.getPosition(this.$viewport)

        placement = placement == 'bottom' && pos.bottom + actualHeight > viewportDim.bottom ? 'top'    :
                    placement == 'top'    && pos.top    - actualHeight < viewportDim.top    ? 'bottom' :
                    placement == 'right'  && pos.right  + actualWidth  > viewportDim.width  ? 'left'   :
                    placement == 'left'   && pos.left   - actualWidth  < viewportDim.left   ? 'right'  :
                    placement

        $tip
          .removeClass(orgPlacement)
          .addClass(placement)
      }

      var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)

      this.applyPlacement(calculatedOffset, placement)

      var complete = function () {
        var prevHoverState = that.hoverState
        that.$element.trigger('shown.bs.' + that.type)
        that.hoverState = null

        if (prevHoverState == 'out') that.leave(that)
      }

      $.support.transition && this.$tip.hasClass('fade') ?
        $tip
          .one('bsTransitionEnd', complete)
          .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
        complete()
    }
  }

  Tooltip.prototype.applyPlacement = function (offset, placement) {
    var $tip   = this.tip()
    var width  = $tip[0].offsetWidth
    var height = $tip[0].offsetHeight

    // manually read margins because getBoundingClientRect includes difference
    var marginTop = parseInt($tip.css('margin-top'), 10)
    var marginLeft = parseInt($tip.css('margin-left'), 10)

    // we must check for NaN for ie 8/9
    if (isNaN(marginTop))  marginTop  = 0
    if (isNaN(marginLeft)) marginLeft = 0

    offset.top  += marginTop
    offset.left += marginLeft

    // $.fn.offset doesn't round pixel values
    // so we use setOffset directly with our own function B-0
    $.offset.setOffset($tip[0], $.extend({
      using: function (props) {
        $tip.css({
          top: Math.round(props.top),
          left: Math.round(props.left)
        })
      }
    }, offset), 0)

    $tip.addClass('in')

    // check to see if placing tip in new offset caused the tip to resize itself
    var actualWidth  = $tip[0].offsetWidth
    var actualHeight = $tip[0].offsetHeight

    if (placement == 'top' && actualHeight != height) {
      offset.top = offset.top + height - actualHeight
    }

    var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight)

    if (delta.left) offset.left += delta.left
    else offset.top += delta.top

    var isVertical          = /top|bottom/.test(placement)
    var arrowDelta          = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight
    var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight'

    $tip.offset(offset)
    this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical)
  }

  Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) {
    this.arrow()
      .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%')
      .css(isVertical ? 'top' : 'left', '')
  }

  Tooltip.prototype.setContent = function () {
    var $tip  = this.tip()
    var title = this.getTitle()

    $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
    $tip.removeClass('fade in top bottom left right')
  }

  Tooltip.prototype.hide = function (callback) {
    var that = this
    var $tip = $(this.$tip)
    var e    = $.Event('hide.bs.' + this.type)

    function complete() {
      if (that.hoverState != 'in') $tip.detach()
      if (that.$element) { // TODO: Check whether guarding this code with this `if` is really necessary.
        that.$element
          .removeAttr('aria-describedby')
          .trigger('hidden.bs.' + that.type)
      }
      callback && callback()
    }

    this.$element.trigger(e)

    if (e.isDefaultPrevented()) return

    $tip.removeClass('in')

    $.support.transition && $tip.hasClass('fade') ?
      $tip
        .one('bsTransitionEnd', complete)
        .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
      complete()

    this.hoverState = null

    return this
  }

  Tooltip.prototype.fixTitle = function () {
    var $e = this.$element
    if ($e.attr('title') || typeof $e.attr('data-original-title') != 'string') {
      $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')
    }
  }

  Tooltip.prototype.hasContent = function () {
    return this.getTitle()
  }

  Tooltip.prototype.getPosition = function ($element) {
    $element   = $element || this.$element

    var el     = $element[0]
    var isBody = el.tagName == 'BODY'

    var elRect    = el.getBoundingClientRect()
    if (elRect.width == null) {
      // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093
      elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top })
    }
    var isSvg = window.SVGElement && el instanceof window.SVGElement
    // Avoid using $.offset() on SVGs since it gives incorrect results in jQuery 3.
    // See https://github.com/twbs/bootstrap/issues/20280
    var elOffset  = isBody ? { top: 0, left: 0 } : (isSvg ? null : $element.offset())
    var scroll    = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() }
    var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null

    return $.extend({}, elRect, scroll, outerDims, elOffset)
  }

  Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {
    return placement == 'bottom' ? { top: pos.top + pos.height,   left: pos.left + pos.width / 2 - actualWidth / 2 } :
           placement == 'top'    ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } :
           placement == 'left'   ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :
        /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width }

  }

  Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) {
    var delta = { top: 0, left: 0 }
    if (!this.$viewport) return delta

    var viewportPadding = this.options.viewport && this.options.viewport.padding || 0
    var viewportDimensions = this.getPosition(this.$viewport)

    if (/right|left/.test(placement)) {
      var topEdgeOffset    = pos.top - viewportPadding - viewportDimensions.scroll
      var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight
      if (topEdgeOffset < viewportDimensions.top) { // top overflow
        delta.top = viewportDimensions.top - topEdgeOffset
      } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow
        delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset
      }
    } else {
      var leftEdgeOffset  = pos.left - viewportPadding
      var rightEdgeOffset = pos.left + viewportPadding + actualWidth
      if (leftEdgeOffset < viewportDimensions.left) { // left overflow
        delta.left = viewportDimensions.left - leftEdgeOffset
      } else if (rightEdgeOffset > viewportDimensions.right) { // right overflow
        delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset
      }
    }

    return delta
  }

  Tooltip.prototype.getTitle = function () {
    var title
    var $e = this.$element
    var o  = this.options

    title = $e.attr('data-original-title')
      || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)

    return title
  }

  Tooltip.prototype.getUID = function (prefix) {
    do prefix += ~~(Math.random() * 1000000)
    while (document.getElementById(prefix))
    return prefix
  }

  Tooltip.prototype.tip = function () {
    if (!this.$tip) {
      this.$tip = $(this.options.template)
      if (this.$tip.length != 1) {
        throw new Error(this.type + ' `template` option must consist of exactly 1 top-level element!')
      }
    }
    return this.$tip
  }

  Tooltip.prototype.arrow = function () {
    return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow'))
  }

  Tooltip.prototype.enable = function () {
    this.enabled = true
  }

  Tooltip.prototype.disable = function () {
    this.enabled = false
  }

  Tooltip.prototype.toggleEnabled = function () {
    this.enabled = !this.enabled
  }

  Tooltip.prototype.toggle = function (e) {
    var self = this
    if (e) {
      self = $(e.currentTarget).data('bs.' + this.type)
      if (!self) {
        self = new this.constructor(e.currentTarget, this.getDelegateOptions())
        $(e.currentTarget).data('bs.' + this.type, self)
      }
    }

    if (e) {
      self.inState.click = !self.inState.click
      if (self.isInStateTrue()) self.enter(self)
      else self.leave(self)
    } else {
      self.tip().hasClass('in') ? self.leave(self) : self.enter(self)
    }
  }

  Tooltip.prototype.destroy = function () {
    var that = this
    clearTimeout(this.timeout)
    this.hide(function () {
      that.$element.off('.' + that.type).removeData('bs.' + that.type)
      if (that.$tip) {
        that.$tip.detach()
      }
      that.$tip = null
      that.$arrow = null
      that.$viewport = null
      that.$element = null
    })
  }


  // TOOLTIP PLUGIN DEFINITION
  // =========================

  function Plugin(option) {
    return this.each(function () {
      var $this   = $(this)
      var data    = $this.data('bs.tooltip')
      var options = typeof option == 'object' && option

      if (!data && /destroy|hide/.test(option)) return
      if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))
      if (typeof option == 'string') data[option]()
    })
  }

  var old = $.fn.tooltip

  $.fn.tooltip             = Plugin
  $.fn.tooltip.Constructor = Tooltip


  // TOOLTIP NO CONFLICT
  // ===================

  $.fn.tooltip.noConflict = function () {
    $.fn.tooltip = old
    return this
  }

}(jQuery);

},{}],108:[function(require,module,exports){
/* ========================================================================
 * Bootstrap: transition.js v3.3.7
 * http://getbootstrap.com/javascript/#transitions
 * ========================================================================
 * Copyright 2011-2016 Twitter, Inc.
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 * ======================================================================== */


+function ($) {
  'use strict';

  // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)
  // ============================================================

  function transitionEnd() {
    var el = document.createElement('bootstrap')

    var transEndEventNames = {
      WebkitTransition : 'webkitTransitionEnd',
      MozTransition    : 'transitionend',
      OTransition      : 'oTransitionEnd otransitionend',
      transition       : 'transitionend'
    }

    for (var name in transEndEventNames) {
      if (el.style[name] !== undefined) {
        return { end: transEndEventNames[name] }
      }
    }

    return false // explicit for ie8 (  ._.)
  }

  // http://blog.alexmaccaw.com/css-transitions
  $.fn.emulateTransitionEnd = function (duration) {
    var called = false
    var $el = this
    $(this).one('bsTransitionEnd', function () { called = true })
    var callback = function () { if (!called) $($el).trigger($.support.transition.end) }
    setTimeout(callback, duration)
    return this
  }

  $(function () {
    $.support.transition = transitionEnd()

    if (!$.support.transition) return

    $.event.special.bsTransitionEnd = {
      bindType: $.support.transition.end,
      delegateType: $.support.transition.end,
      handle: function (e) {
        if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments)
      }
    }
  })

}(jQuery);

},{}],109:[function(require,module,exports){
/*!
 * jQuery JavaScript Library v1.12.4
 * http://jquery.com/
 *
 * Includes Sizzle.js
 * http://sizzlejs.com/
 *
 * Copyright jQuery Foundation and other contributors
 * Released under the MIT license
 * http://jquery.org/license
 *
 * Date: 2016-05-20T17:17Z
 */

(function( global, factory ) {

	if ( typeof module === "object" && typeof module.exports === "object" ) {
		// For CommonJS and CommonJS-like environments where a proper `window`
		// is present, execute the factory and get jQuery.
		// For environments that do not have a `window` with a `document`
		// (such as Node.js), expose a factory as module.exports.
		// This accentuates the need for the creation of a real `window`.
		// e.g. var jQuery = require("jquery")(window);
		// See ticket #14549 for more info.
		module.exports = global.document ?
			factory( global, true ) :
			function( w ) {
				if ( !w.document ) {
					throw new Error( "jQuery requires a window with a document" );
				}
				return factory( w );
			};
	} else {
		factory( global );
	}

// Pass this if window is not defined yet
}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) {

// Support: Firefox 18+
// Can't be in strict mode, several libs including ASP.NET trace
// the stack via arguments.caller.callee and Firefox dies if
// you try to trace through "use strict" call chains. (#13335)
//"use strict";
var deletedIds = [];

var document = window.document;

var slice = deletedIds.slice;

var concat = deletedIds.concat;

var push = deletedIds.push;

var indexOf = deletedIds.indexOf;

var class2type = {};

var toString = class2type.toString;

var hasOwn = class2type.hasOwnProperty;

var support = {};



var
	version = "1.12.4",

	// Define a local copy of jQuery
	jQuery = function( selector, context ) {

		// The jQuery object is actually just the init constructor 'enhanced'
		// Need init if jQuery is called (just allow error to be thrown if not included)
		return new jQuery.fn.init( selector, context );
	},

	// Support: Android<4.1, IE<9
	// Make sure we trim BOM and NBSP
	rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,

	// Matches dashed string for camelizing
	rmsPrefix = /^-ms-/,
	rdashAlpha = /-([\da-z])/gi,

	// Used by jQuery.camelCase as callback to replace()
	fcamelCase = function( all, letter ) {
		return letter.toUpperCase();
	};

jQuery.fn = jQuery.prototype = {

	// The current version of jQuery being used
	jquery: version,

	constructor: jQuery,

	// Start with an empty selector
	selector: "",

	// The default length of a jQuery object is 0
	length: 0,

	toArray: function() {
		return slice.call( this );
	},

	// Get the Nth element in the matched element set OR
	// Get the whole matched element set as a clean array
	get: function( num ) {
		return num != null ?

			// Return just the one element from the set
			( num < 0 ? this[ num + this.length ] : this[ num ] ) :

			// Return all the elements in a clean array
			slice.call( this );
	},

	// Take an array of elements and push it onto the stack
	// (returning the new matched element set)
	pushStack: function( elems ) {

		// Build a new jQuery matched element set
		var ret = jQuery.merge( this.constructor(), elems );

		// Add the old object onto the stack (as a reference)
		ret.prevObject = this;
		ret.context = this.context;

		// Return the newly-formed element set
		return ret;
	},

	// Execute a callback for every element in the matched set.
	each: function( callback ) {
		return jQuery.each( this, callback );
	},

	map: function( callback ) {
		return this.pushStack( jQuery.map( this, function( elem, i ) {
			return callback.call( elem, i, elem );
		} ) );
	},

	slice: function() {
		return this.pushStack( slice.apply( this, arguments ) );
	},

	first: function() {
		return this.eq( 0 );
	},

	last: function() {
		return this.eq( -1 );
	},

	eq: function( i ) {
		var len = this.length,
			j = +i + ( i < 0 ? len : 0 );
		return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );
	},

	end: function() {
		return this.prevObject || this.constructor();
	},

	// For internal use only.
	// Behaves like an Array's method, not like a jQuery method.
	push: push,
	sort: deletedIds.sort,
	splice: deletedIds.splice
};

jQuery.extend = jQuery.fn.extend = function() {
	var src, copyIsArray, copy, name, options, clone,
		target = arguments[ 0 ] || {},
		i = 1,
		length = arguments.length,
		deep = false;

	// Handle a deep copy situation
	if ( typeof target === "boolean" ) {
		deep = target;

		// skip the boolean and the target
		target = arguments[ i ] || {};
		i++;
	}

	// Handle case when target is a string or something (possible in deep copy)
	if ( typeof target !== "object" && !jQuery.isFunction( target ) ) {
		target = {};
	}

	// extend jQuery itself if only one argument is passed
	if ( i === length ) {
		target = this;
		i--;
	}

	for ( ; i < length; i++ ) {

		// Only deal with non-null/undefined values
		if ( ( options = arguments[ i ] ) != null ) {

			// Extend the base object
			for ( name in options ) {
				src = target[ name ];
				copy = options[ name ];

				// Prevent never-ending loop
				if ( target === copy ) {
					continue;
				}

				// Recurse if we're merging plain objects or arrays
				if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
					( copyIsArray = jQuery.isArray( copy ) ) ) ) {

					if ( copyIsArray ) {
						copyIsArray = false;
						clone = src && jQuery.isArray( src ) ? src : [];

					} else {
						clone = src && jQuery.isPlainObject( src ) ? src : {};
					}

					// Never move original objects, clone them
					target[ name ] = jQuery.extend( deep, clone, copy );

				// Don't bring in undefined values
				} else if ( copy !== undefined ) {
					target[ name ] = copy;
				}
			}
		}
	}

	// Return the modified object
	return target;
};

jQuery.extend( {

	// Unique for each copy of jQuery on the page
	expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),

	// Assume jQuery is ready without the ready module
	isReady: true,

	error: function( msg ) {
		throw new Error( msg );
	},

	noop: function() {},

	// See test/unit/core.js for details concerning isFunction.
	// Since version 1.3, DOM methods and functions like alert
	// aren't supported. They return false on IE (#2968).
	isFunction: function( obj ) {
		return jQuery.type( obj ) === "function";
	},

	isArray: Array.isArray || function( obj ) {
		return jQuery.type( obj ) === "array";
	},

	isWindow: function( obj ) {
		/* jshint eqeqeq: false */
		return obj != null && obj == obj.window;
	},

	isNumeric: function( obj ) {

		// parseFloat NaNs numeric-cast false positives (null|true|false|"")
		// ...but misinterprets leading-number strings, particularly hex literals ("0x...")
		// subtraction forces infinities to NaN
		// adding 1 corrects loss of precision from parseFloat (#15100)
		var realStringObj = obj && obj.toString();
		return !jQuery.isArray( obj ) && ( realStringObj - parseFloat( realStringObj ) + 1 ) >= 0;
	},

	isEmptyObject: function( obj ) {
		var name;
		for ( name in obj ) {
			return false;
		}
		return true;
	},

	isPlainObject: function( obj ) {
		var key;

		// Must be an Object.
		// Because of IE, we also have to check the presence of the constructor property.
		// Make sure that DOM nodes and window objects don't pass through, as well
		if ( !obj || jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
			return false;
		}

		try {

			// Not own constructor property must be Object
			if ( obj.constructor &&
				!hasOwn.call( obj, "constructor" ) &&
				!hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) {
				return false;
			}
		} catch ( e ) {

			// IE8,9 Will throw exceptions on certain host objects #9897
			return false;
		}

		// Support: IE<9
		// Handle iteration over inherited properties before own properties.
		if ( !support.ownFirst ) {
			for ( key in obj ) {
				return hasOwn.call( obj, key );
			}
		}

		// Own properties are enumerated firstly, so to speed up,
		// if last one is own, then all properties are own.
		for ( key in obj ) {}

		return key === undefined || hasOwn.call( obj, key );
	},

	type: function( obj ) {
		if ( obj == null ) {
			return obj + "";
		}
		return typeof obj === "object" || typeof obj === "function" ?
			class2type[ toString.call( obj ) ] || "object" :
			typeof obj;
	},

	// Workarounds based on findings by Jim Driscoll
	// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
	globalEval: function( data ) {
		if ( data && jQuery.trim( data ) ) {

			// We use execScript on Internet Explorer
			// We use an anonymous function so that context is window
			// rather than jQuery in Firefox
			( window.execScript || function( data ) {
				window[ "eval" ].call( window, data ); // jscs:ignore requireDotNotation
			} )( data );
		}
	},

	// Convert dashed to camelCase; used by the css and data modules
	// Microsoft forgot to hump their vendor prefix (#9572)
	camelCase: function( string ) {
		return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
	},

	nodeName: function( elem, name ) {
		return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
	},

	each: function( obj, callback ) {
		var length, i = 0;

		if ( isArrayLike( obj ) ) {
			length = obj.length;
			for ( ; i < length; i++ ) {
				if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
					break;
				}
			}
		} else {
			for ( i in obj ) {
				if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
					break;
				}
			}
		}

		return obj;
	},

	// Support: Android<4.1, IE<9
	trim: function( text ) {
		return text == null ?
			"" :
			( text + "" ).replace( rtrim, "" );
	},

	// results is for internal usage only
	makeArray: function( arr, results ) {
		var ret = results || [];

		if ( arr != null ) {
			if ( isArrayLike( Object( arr ) ) ) {
				jQuery.merge( ret,
					typeof arr === "string" ?
					[ arr ] : arr
				);
			} else {
				push.call( ret, arr );
			}
		}

		return ret;
	},

	inArray: function( elem, arr, i ) {
		var len;

		if ( arr ) {
			if ( indexOf ) {
				return indexOf.call( arr, elem, i );
			}

			len = arr.length;
			i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;

			for ( ; i < len; i++ ) {

				// Skip accessing in sparse arrays
				if ( i in arr && arr[ i ] === elem ) {
					return i;
				}
			}
		}

		return -1;
	},

	merge: function( first, second ) {
		var len = +second.length,
			j = 0,
			i = first.length;

		while ( j < len ) {
			first[ i++ ] = second[ j++ ];
		}

		// Support: IE<9
		// Workaround casting of .length to NaN on otherwise arraylike objects (e.g., NodeLists)
		if ( len !== len ) {
			while ( second[ j ] !== undefined ) {
				first[ i++ ] = second[ j++ ];
			}
		}

		first.length = i;

		return first;
	},

	grep: function( elems, callback, invert ) {
		var callbackInverse,
			matches = [],
			i = 0,
			length = elems.length,
			callbackExpect = !invert;

		// Go through the array, only saving the items
		// that pass the validator function
		for ( ; i < length; i++ ) {
			callbackInverse = !callback( elems[ i ], i );
			if ( callbackInverse !== callbackExpect ) {
				matches.push( elems[ i ] );
			}
		}

		return matches;
	},

	// arg is for internal usage only
	map: function( elems, callback, arg ) {
		var length, value,
			i = 0,
			ret = [];

		// Go through the array, translating each of the items to their new values
		if ( isArrayLike( elems ) ) {
			length = elems.length;
			for ( ; i < length; i++ ) {
				value = callback( elems[ i ], i, arg );

				if ( value != null ) {
					ret.push( value );
				}
			}

		// Go through every key on the object,
		} else {
			for ( i in elems ) {
				value = callback( elems[ i ], i, arg );

				if ( value != null ) {
					ret.push( value );
				}
			}
		}

		// Flatten any nested arrays
		return concat.apply( [], ret );
	},

	// A global GUID counter for objects
	guid: 1,

	// Bind a function to a context, optionally partially applying any
	// arguments.
	proxy: function( fn, context ) {
		var args, proxy, tmp;

		if ( typeof context === "string" ) {
			tmp = fn[ context ];
			context = fn;
			fn = tmp;
		}

		// Quick check to determine if target is callable, in the spec
		// this throws a TypeError, but we will just return undefined.
		if ( !jQuery.isFunction( fn ) ) {
			return undefined;
		}

		// Simulated bind
		args = slice.call( arguments, 2 );
		proxy = function() {
			return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
		};

		// Set the guid of unique handler to the same of original handler, so it can be removed
		proxy.guid = fn.guid = fn.guid || jQuery.guid++;

		return proxy;
	},

	now: function() {
		return +( new Date() );
	},

	// jQuery.support is not used in Core but other projects attach their
	// properties to it so it needs to exist.
	support: support
} );

// JSHint would error on this code due to the Symbol not being defined in ES5.
// Defining this global in .jshintrc would create a danger of using the global
// unguarded in another place, it seems safer to just disable JSHint for these
// three lines.
/* jshint ignore: start */
if ( typeof Symbol === "function" ) {
	jQuery.fn[ Symbol.iterator ] = deletedIds[ Symbol.iterator ];
}
/* jshint ignore: end */

// Populate the class2type map
jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
function( i, name ) {
	class2type[ "[object " + name + "]" ] = name.toLowerCase();
} );

function isArrayLike( obj ) {

	// Support: iOS 8.2 (not reproducible in simulator)
	// `in` check used to prevent JIT error (gh-2145)
	// hasOwn isn't used here due to false negatives
	// regarding Nodelist length in IE
	var length = !!obj && "length" in obj && obj.length,
		type = jQuery.type( obj );

	if ( type === "function" || jQuery.isWindow( obj ) ) {
		return false;
	}

	return type === "array" || length === 0 ||
		typeof length === "number" && length > 0 && ( length - 1 ) in obj;
}
var Sizzle =
/*!
 * Sizzle CSS Selector Engine v2.2.1
 * http://sizzlejs.com/
 *
 * Copyright jQuery Foundation and other contributors
 * Released under the MIT license
 * http://jquery.org/license
 *
 * Date: 2015-10-17
 */
(function( window ) {

var i,
	support,
	Expr,
	getText,
	isXML,
	tokenize,
	compile,
	select,
	outermostContext,
	sortInput,
	hasDuplicate,

	// Local document vars
	setDocument,
	document,
	docElem,
	documentIsHTML,
	rbuggyQSA,
	rbuggyMatches,
	matches,
	contains,

	// Instance-specific data
	expando = "sizzle" + 1 * new Date(),
	preferredDoc = window.document,
	dirruns = 0,
	done = 0,
	classCache = createCache(),
	tokenCache = createCache(),
	compilerCache = createCache(),
	sortOrder = function( a, b ) {
		if ( a === b ) {
			hasDuplicate = true;
		}
		return 0;
	},

	// General-purpose constants
	MAX_NEGATIVE = 1 << 31,

	// Instance methods
	hasOwn = ({}).hasOwnProperty,
	arr = [],
	pop = arr.pop,
	push_native = arr.push,
	push = arr.push,
	slice = arr.slice,
	// Use a stripped-down indexOf as it's faster than native
	// http://jsperf.com/thor-indexof-vs-for/5
	indexOf = function( list, elem ) {
		var i = 0,
			len = list.length;
		for ( ; i < len; i++ ) {
			if ( list[i] === elem ) {
				return i;
			}
		}
		return -1;
	},

	booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",

	// Regular expressions

	// http://www.w3.org/TR/css3-selectors/#whitespace
	whitespace = "[\\x20\\t\\r\\n\\f]",

	// http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
	identifier = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",

	// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
	attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
		// Operator (capture 2)
		"*([*^$|!~]?=)" + whitespace +
		// "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
		"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
		"*\\]",

	pseudos = ":(" + identifier + ")(?:\\((" +
		// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
		// 1. quoted (capture 3; capture 4 or capture 5)
		"('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
		// 2. simple (capture 6)
		"((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
		// 3. anything else (capture 2)
		".*" +
		")\\)|)",

	// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
	rwhitespace = new RegExp( whitespace + "+", "g" ),
	rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),

	rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
	rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),

	rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ),

	rpseudo = new RegExp( pseudos ),
	ridentifier = new RegExp( "^" + identifier + "$" ),

	matchExpr = {
		"ID": new RegExp( "^#(" + identifier + ")" ),
		"CLASS": new RegExp( "^\\.(" + identifier + ")" ),
		"TAG": new RegExp( "^(" + identifier + "|[*])" ),
		"ATTR": new RegExp( "^" + attributes ),
		"PSEUDO": new RegExp( "^" + pseudos ),
		"CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
			"*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
			"*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
		"bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
		// For use in libraries implementing .is()
		// We use this for POS matching in `select`
		"needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
			whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
	},

	rinputs = /^(?:input|select|textarea|button)$/i,
	rheader = /^h\d$/i,

	rnative = /^[^{]+\{\s*\[native \w/,

	// Easily-parseable/retrievable ID or TAG or CLASS selectors
	rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,

	rsibling = /[+~]/,
	rescape = /'|\\/g,

	// CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
	runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
	funescape = function( _, escaped, escapedWhitespace ) {
		var high = "0x" + escaped - 0x10000;
		// NaN means non-codepoint
		// Support: Firefox<24
		// Workaround erroneous numeric interpretation of +"0x"
		return high !== high || escapedWhitespace ?
			escaped :
			high < 0 ?
				// BMP codepoint
				String.fromCharCode( high + 0x10000 ) :
				// Supplemental Plane codepoint (surrogate pair)
				String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
	},

	// Used for iframes
	// See setDocument()
	// Removing the function wrapper causes a "Permission Denied"
	// error in IE
	unloadHandler = function() {
		setDocument();
	};

// Optimize for push.apply( _, NodeList )
try {
	push.apply(
		(arr = slice.call( preferredDoc.childNodes )),
		preferredDoc.childNodes
	);
	// Support: Android<4.0
	// Detect silently failing push.apply
	arr[ preferredDoc.childNodes.length ].nodeType;
} catch ( e ) {
	push = { apply: arr.length ?

		// Leverage slice if possible
		function( target, els ) {
			push_native.apply( target, slice.call(els) );
		} :

		// Support: IE<9
		// Otherwise append directly
		function( target, els ) {
			var j = target.length,
				i = 0;
			// Can't trust NodeList.length
			while ( (target[j++] = els[i++]) ) {}
			target.length = j - 1;
		}
	};
}

function Sizzle( selector, context, results, seed ) {
	var m, i, elem, nid, nidselect, match, groups, newSelector,
		newContext = context && context.ownerDocument,

		// nodeType defaults to 9, since context defaults to document
		nodeType = context ? context.nodeType : 9;

	results = results || [];

	// Return early from calls with invalid selector or context
	if ( typeof selector !== "string" || !selector ||
		nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {

		return results;
	}

	// Try to shortcut find operations (as opposed to filters) in HTML documents
	if ( !seed ) {

		if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
			setDocument( context );
		}
		context = context || document;

		if ( documentIsHTML ) {

			// If the selector is sufficiently simple, try using a "get*By*" DOM method
			// (excepting DocumentFragment context, where the methods don't exist)
			if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {

				// ID selector
				if ( (m = match[1]) ) {

					// Document context
					if ( nodeType === 9 ) {
						if ( (elem = context.getElementById( m )) ) {

							// Support: IE, Opera, Webkit
							// TODO: identify versions
							// getElementById can match elements by name instead of ID
							if ( elem.id === m ) {
								results.push( elem );
								return results;
							}
						} else {
							return results;
						}

					// Element context
					} else {

						// Support: IE, Opera, Webkit
						// TODO: identify versions
						// getElementById can match elements by name instead of ID
						if ( newContext && (elem = newContext.getElementById( m )) &&
							contains( context, elem ) &&
							elem.id === m ) {

							results.push( elem );
							return results;
						}
					}

				// Type selector
				} else if ( match[2] ) {
					push.apply( results, context.getElementsByTagName( selector ) );
					return results;

				// Class selector
				} else if ( (m = match[3]) && support.getElementsByClassName &&
					context.getElementsByClassName ) {

					push.apply( results, context.getElementsByClassName( m ) );
					return results;
				}
			}

			// Take advantage of querySelectorAll
			if ( support.qsa &&
				!compilerCache[ selector + " " ] &&
				(!rbuggyQSA || !rbuggyQSA.test( selector )) ) {

				if ( nodeType !== 1 ) {
					newContext = context;
					newSelector = selector;

				// qSA looks outside Element context, which is not what we want
				// Thanks to Andrew Dupont for this workaround technique
				// Support: IE <=8
				// Exclude object elements
				} else if ( context.nodeName.toLowerCase() !== "object" ) {

					// Capture the context ID, setting it first if necessary
					if ( (nid = context.getAttribute( "id" )) ) {
						nid = nid.replace( rescape, "\\$&" );
					} else {
						context.setAttribute( "id", (nid = expando) );
					}

					// Prefix every selector in the list
					groups = tokenize( selector );
					i = groups.length;
					nidselect = ridentifier.test( nid ) ? "#" + nid : "[id='" + nid + "']";
					while ( i-- ) {
						groups[i] = nidselect + " " + toSelector( groups[i] );
					}
					newSelector = groups.join( "," );

					// Expand context for sibling selectors
					newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
						context;
				}

				if ( newSelector ) {
					try {
						push.apply( results,
							newContext.querySelectorAll( newSelector )
						);
						return results;
					} catch ( qsaError ) {
					} finally {
						if ( nid === expando ) {
							context.removeAttribute( "id" );
						}
					}
				}
			}
		}
	}

	// All others
	return select( selector.replace( rtrim, "$1" ), context, results, seed );
}

/**
 * Create key-value caches of limited size
 * @returns {function(string, object)} Returns the Object data after storing it on itself with
 *	property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
 *	deleting the oldest entry
 */
function createCache() {
	var keys = [];

	function cache( key, value ) {
		// Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
		if ( keys.push( key + " " ) > Expr.cacheLength ) {
			// Only keep the most recent entries
			delete cache[ keys.shift() ];
		}
		return (cache[ key + " " ] = value);
	}
	return cache;
}

/**
 * Mark a function for special use by Sizzle
 * @param {Function} fn The function to mark
 */
function markFunction( fn ) {
	fn[ expando ] = true;
	return fn;
}

/**
 * Support testing using an element
 * @param {Function} fn Passed the created div and expects a boolean result
 */
function assert( fn ) {
	var div = document.createElement("div");

	try {
		return !!fn( div );
	} catch (e) {
		return false;
	} finally {
		// Remove from its parent by default
		if ( div.parentNode ) {
			div.parentNode.removeChild( div );
		}
		// release memory in IE
		div = null;
	}
}

/**
 * Adds the same handler for all of the specified attrs
 * @param {String} attrs Pipe-separated list of attributes
 * @param {Function} handler The method that will be applied
 */
function addHandle( attrs, handler ) {
	var arr = attrs.split("|"),
		i = arr.length;

	while ( i-- ) {
		Expr.attrHandle[ arr[i] ] = handler;
	}
}

/**
 * Checks document order of two siblings
 * @param {Element} a
 * @param {Element} b
 * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
 */
function siblingCheck( a, b ) {
	var cur = b && a,
		diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
			( ~b.sourceIndex || MAX_NEGATIVE ) -
			( ~a.sourceIndex || MAX_NEGATIVE );

	// Use IE sourceIndex if available on both nodes
	if ( diff ) {
		return diff;
	}

	// Check if b follows a
	if ( cur ) {
		while ( (cur = cur.nextSibling) ) {
			if ( cur === b ) {
				return -1;
			}
		}
	}

	return a ? 1 : -1;
}

/**
 * Returns a function to use in pseudos for input types
 * @param {String} type
 */
function createInputPseudo( type ) {
	return function( elem ) {
		var name = elem.nodeName.toLowerCase();
		return name === "input" && elem.type === type;
	};
}

/**
 * Returns a function to use in pseudos for buttons
 * @param {String} type
 */
function createButtonPseudo( type ) {
	return function( elem ) {
		var name = elem.nodeName.toLowerCase();
		return (name === "input" || name === "button") && elem.type === type;
	};
}

/**
 * Returns a function to use in pseudos for positionals
 * @param {Function} fn
 */
function createPositionalPseudo( fn ) {
	return markFunction(function( argument ) {
		argument = +argument;
		return markFunction(function( seed, matches ) {
			var j,
				matchIndexes = fn( [], seed.length, argument ),
				i = matchIndexes.length;

			// Match elements found at the specified indexes
			while ( i-- ) {
				if ( seed[ (j = matchIndexes[i]) ] ) {
					seed[j] = !(matches[j] = seed[j]);
				}
			}
		});
	});
}

/**
 * Checks a node for validity as a Sizzle context
 * @param {Element|Object=} context
 * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
 */
function testContext( context ) {
	return context && typeof context.getElementsByTagName !== "undefined" && context;
}

// Expose support vars for convenience
support = Sizzle.support = {};

/**
 * Detects XML nodes
 * @param {Element|Object} elem An element or a document
 * @returns {Boolean} True iff elem is a non-HTML XML node
 */
isXML = Sizzle.isXML = function( elem ) {
	// documentElement is verified for cases where it doesn't yet exist
	// (such as loading iframes in IE - #4833)
	var documentElement = elem && (elem.ownerDocument || elem).documentElement;
	return documentElement ? documentElement.nodeName !== "HTML" : false;
};

/**
 * Sets document-related variables once based on the current document
 * @param {Element|Object} [doc] An element or document object to use to set the document
 * @returns {Object} Returns the current document
 */
setDocument = Sizzle.setDocument = function( node ) {
	var hasCompare, parent,
		doc = node ? node.ownerDocument || node : preferredDoc;

	// Return early if doc is invalid or already selected
	if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
		return document;
	}

	// Update global variables
	document = doc;
	docElem = document.documentElement;
	documentIsHTML = !isXML( document );

	// Support: IE 9-11, Edge
	// Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
	if ( (parent = document.defaultView) && parent.top !== parent ) {
		// Support: IE 11
		if ( parent.addEventListener ) {
			parent.addEventListener( "unload", unloadHandler, false );

		// Support: IE 9 - 10 only
		} else if ( parent.attachEvent ) {
			parent.attachEvent( "onunload", unloadHandler );
		}
	}

	/* Attributes
	---------------------------------------------------------------------- */

	// Support: IE<8
	// Verify that getAttribute really returns attributes and not properties
	// (excepting IE8 booleans)
	support.attributes = assert(function( div ) {
		div.className = "i";
		return !div.getAttribute("className");
	});

	/* getElement(s)By*
	---------------------------------------------------------------------- */

	// Check if getElementsByTagName("*") returns only elements
	support.getElementsByTagName = assert(function( div ) {
		div.appendChild( document.createComment("") );
		return !div.getElementsByTagName("*").length;
	});

	// Support: IE<9
	support.getElementsByClassName = rnative.test( document.getElementsByClassName );

	// Support: IE<10
	// Check if getElementById returns elements by name
	// The broken getElementById methods don't pick up programatically-set names,
	// so use a roundabout getElementsByName test
	support.getById = assert(function( div ) {
		docElem.appendChild( div ).id = expando;
		return !document.getElementsByName || !document.getElementsByName( expando ).length;
	});

	// ID find and filter
	if ( support.getById ) {
		Expr.find["ID"] = function( id, context ) {
			if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
				var m = context.getElementById( id );
				return m ? [ m ] : [];
			}
		};
		Expr.filter["ID"] = function( id ) {
			var attrId = id.replace( runescape, funescape );
			return function( elem ) {
				return elem.getAttribute("id") === attrId;
			};
		};
	} else {
		// Support: IE6/7
		// getElementById is not reliable as a find shortcut
		delete Expr.find["ID"];

		Expr.filter["ID"] =  function( id ) {
			var attrId = id.replace( runescape, funescape );
			return function( elem ) {
				var node = typeof elem.getAttributeNode !== "undefined" &&
					elem.getAttributeNode("id");
				return node && node.value === attrId;
			};
		};
	}

	// Tag
	Expr.find["TAG"] = support.getElementsByTagName ?
		function( tag, context ) {
			if ( typeof context.getElementsByTagName !== "undefined" ) {
				return context.getElementsByTagName( tag );

			// DocumentFragment nodes don't have gEBTN
			} else if ( support.qsa ) {
				return context.querySelectorAll( tag );
			}
		} :

		function( tag, context ) {
			var elem,
				tmp = [],
				i = 0,
				// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
				results = context.getElementsByTagName( tag );

			// Filter out possible comments
			if ( tag === "*" ) {
				while ( (elem = results[i++]) ) {
					if ( elem.nodeType === 1 ) {
						tmp.push( elem );
					}
				}

				return tmp;
			}
			return results;
		};

	// Class
	Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
		if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
			return context.getElementsByClassName( className );
		}
	};

	/* QSA/matchesSelector
	---------------------------------------------------------------------- */

	// QSA and matchesSelector support

	// matchesSelector(:active) reports false when true (IE9/Opera 11.5)
	rbuggyMatches = [];

	// qSa(:focus) reports false when true (Chrome 21)
	// We allow this because of a bug in IE8/9 that throws an error
	// whenever `document.activeElement` is accessed on an iframe
	// So, we allow :focus to pass through QSA all the time to avoid the IE error
	// See http://bugs.jquery.com/ticket/13378
	rbuggyQSA = [];

	if ( (support.qsa = rnative.test( document.querySelectorAll )) ) {
		// Build QSA regex
		// Regex strategy adopted from Diego Perini
		assert(function( div ) {
			// Select is set to empty string on purpose
			// This is to test IE's treatment of not explicitly
			// setting a boolean content attribute,
			// since its presence should be enough
			// http://bugs.jquery.com/ticket/12359
			docElem.appendChild( div ).innerHTML = "<a id='" + expando + "'></a>" +
				"<select id='" + expando + "-\r\\' msallowcapture=''>" +
				"<option selected=''></option></select>";

			// Support: IE8, Opera 11-12.16
			// Nothing should be selected when empty strings follow ^= or $= or *=
			// The test attribute must be unknown in Opera but "safe" for WinRT
			// http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
			if ( div.querySelectorAll("[msallowcapture^='']").length ) {
				rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
			}

			// Support: IE8
			// Boolean attributes and "value" are not treated correctly
			if ( !div.querySelectorAll("[selected]").length ) {
				rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
			}

			// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
			if ( !div.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
				rbuggyQSA.push("~=");
			}

			// Webkit/Opera - :checked should return selected option elements
			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
			// IE8 throws error here and will not see later tests
			if ( !div.querySelectorAll(":checked").length ) {
				rbuggyQSA.push(":checked");
			}

			// Support: Safari 8+, iOS 8+
			// https://bugs.webkit.org/show_bug.cgi?id=136851
			// In-page `selector#id sibing-combinator selector` fails
			if ( !div.querySelectorAll( "a#" + expando + "+*" ).length ) {
				rbuggyQSA.push(".#.+[+~]");
			}
		});

		assert(function( div ) {
			// Support: Windows 8 Native Apps
			// The type and name attributes are restricted during .innerHTML assignment
			var input = document.createElement("input");
			input.setAttribute( "type", "hidden" );
			div.appendChild( input ).setAttribute( "name", "D" );

			// Support: IE8
			// Enforce case-sensitivity of name attribute
			if ( div.querySelectorAll("[name=d]").length ) {
				rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
			}

			// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
			// IE8 throws error here and will not see later tests
			if ( !div.querySelectorAll(":enabled").length ) {
				rbuggyQSA.push( ":enabled", ":disabled" );
			}

			// Opera 10-11 does not throw on post-comma invalid pseudos
			div.querySelectorAll("*,:x");
			rbuggyQSA.push(",.*:");
		});
	}

	if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
		docElem.webkitMatchesSelector ||
		docElem.mozMatchesSelector ||
		docElem.oMatchesSelector ||
		docElem.msMatchesSelector) )) ) {

		assert(function( div ) {
			// Check to see if it's possible to do matchesSelector
			// on a disconnected node (IE 9)
			support.disconnectedMatch = matches.call( div, "div" );

			// This should fail with an exception
			// Gecko does not error, returns false instead
			matches.call( div, "[s!='']:x" );
			rbuggyMatches.push( "!=", pseudos );
		});
	}

	rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
	rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );

	/* Contains
	---------------------------------------------------------------------- */
	hasCompare = rnative.test( docElem.compareDocumentPosition );

	// Element contains another
	// Purposefully self-exclusive
	// As in, an element does not contain itself
	contains = hasCompare || rnative.test( docElem.contains ) ?
		function( a, b ) {
			var adown = a.nodeType === 9 ? a.documentElement : a,
				bup = b && b.parentNode;
			return a === bup || !!( bup && bup.nodeType === 1 && (
				adown.contains ?
					adown.contains( bup ) :
					a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
			));
		} :
		function( a, b ) {
			if ( b ) {
				while ( (b = b.parentNode) ) {
					if ( b === a ) {
						return true;
					}
				}
			}
			return false;
		};

	/* Sorting
	---------------------------------------------------------------------- */

	// Document order sorting
	sortOrder = hasCompare ?
	function( a, b ) {

		// Flag for duplicate removal
		if ( a === b ) {
			hasDuplicate = true;
			return 0;
		}

		// Sort on method existence if only one input has compareDocumentPosition
		var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
		if ( compare ) {
			return compare;
		}

		// Calculate position if both inputs belong to the same document
		compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
			a.compareDocumentPosition( b ) :

			// Otherwise we know they are disconnected
			1;

		// Disconnected nodes
		if ( compare & 1 ||
			(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {

			// Choose the first element that is related to our preferred document
			if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
				return -1;
			}
			if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
				return 1;
			}

			// Maintain original order
			return sortInput ?
				( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
				0;
		}

		return compare & 4 ? -1 : 1;
	} :
	function( a, b ) {
		// Exit early if the nodes are identical
		if ( a === b ) {
			hasDuplicate = true;
			return 0;
		}

		var cur,
			i = 0,
			aup = a.parentNode,
			bup = b.parentNode,
			ap = [ a ],
			bp = [ b ];

		// Parentless nodes are either documents or disconnected
		if ( !aup || !bup ) {
			return a === document ? -1 :
				b === document ? 1 :
				aup ? -1 :
				bup ? 1 :
				sortInput ?
				( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
				0;

		// If the nodes are siblings, we can do a quick check
		} else if ( aup === bup ) {
			return siblingCheck( a, b );
		}

		// Otherwise we need full lists of their ancestors for comparison
		cur = a;
		while ( (cur = cur.parentNode) ) {
			ap.unshift( cur );
		}
		cur = b;
		while ( (cur = cur.parentNode) ) {
			bp.unshift( cur );
		}

		// Walk down the tree looking for a discrepancy
		while ( ap[i] === bp[i] ) {
			i++;
		}

		return i ?
			// Do a sibling check if the nodes have a common ancestor
			siblingCheck( ap[i], bp[i] ) :

			// Otherwise nodes in our document sort first
			ap[i] === preferredDoc ? -1 :
			bp[i] === preferredDoc ? 1 :
			0;
	};

	return document;
};

Sizzle.matches = function( expr, elements ) {
	return Sizzle( expr, null, null, elements );
};

Sizzle.matchesSelector = function( elem, expr ) {
	// Set document vars if needed
	if ( ( elem.ownerDocument || elem ) !== document ) {
		setDocument( elem );
	}

	// Make sure that attribute selectors are quoted
	expr = expr.replace( rattributeQuotes, "='$1']" );

	if ( support.matchesSelector && documentIsHTML &&
		!compilerCache[ expr + " " ] &&
		( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
		( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {

		try {
			var ret = matches.call( elem, expr );

			// IE 9's matchesSelector returns false on disconnected nodes
			if ( ret || support.disconnectedMatch ||
					// As well, disconnected nodes are said to be in a document
					// fragment in IE 9
					elem.document && elem.document.nodeType !== 11 ) {
				return ret;
			}
		} catch (e) {}
	}

	return Sizzle( expr, document, null, [ elem ] ).length > 0;
};

Sizzle.contains = function( context, elem ) {
	// Set document vars if needed
	if ( ( context.ownerDocument || context ) !== document ) {
		setDocument( context );
	}
	return contains( context, elem );
};

Sizzle.attr = function( elem, name ) {
	// Set document vars if needed
	if ( ( elem.ownerDocument || elem ) !== document ) {
		setDocument( elem );
	}

	var fn = Expr.attrHandle[ name.toLowerCase() ],
		// Don't get fooled by Object.prototype properties (jQuery #13807)
		val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
			fn( elem, name, !documentIsHTML ) :
			undefined;

	return val !== undefined ?
		val :
		support.attributes || !documentIsHTML ?
			elem.getAttribute( name ) :
			(val = elem.getAttributeNode(name)) && val.specified ?
				val.value :
				null;
};

Sizzle.error = function( msg ) {
	throw new Error( "Syntax error, unrecognized expression: " + msg );
};

/**
 * Document sorting and removing duplicates
 * @param {ArrayLike} results
 */
Sizzle.uniqueSort = function( results ) {
	var elem,
		duplicates = [],
		j = 0,
		i = 0;

	// Unless we *know* we can detect duplicates, assume their presence
	hasDuplicate = !support.detectDuplicates;
	sortInput = !support.sortStable && results.slice( 0 );
	results.sort( sortOrder );

	if ( hasDuplicate ) {
		while ( (elem = results[i++]) ) {
			if ( elem === results[ i ] ) {
				j = duplicates.push( i );
			}
		}
		while ( j-- ) {
			results.splice( duplicates[ j ], 1 );
		}
	}

	// Clear input after sorting to release objects
	// See https://github.com/jquery/sizzle/pull/225
	sortInput = null;

	return results;
};

/**
 * Utility function for retrieving the text value of an array of DOM nodes
 * @param {Array|Element} elem
 */
getText = Sizzle.getText = function( elem ) {
	var node,
		ret = "",
		i = 0,
		nodeType = elem.nodeType;

	if ( !nodeType ) {
		// If no nodeType, this is expected to be an array
		while ( (node = elem[i++]) ) {
			// Do not traverse comment nodes
			ret += getText( node );
		}
	} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
		// Use textContent for elements
		// innerText usage removed for consistency of new lines (jQuery #11153)
		if ( typeof elem.textContent === "string" ) {
			return elem.textContent;
		} else {
			// Traverse its children
			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
				ret += getText( elem );
			}
		}
	} else if ( nodeType === 3 || nodeType === 4 ) {
		return elem.nodeValue;
	}
	// Do not include comment or processing instruction nodes

	return ret;
};

Expr = Sizzle.selectors = {

	// Can be adjusted by the user
	cacheLength: 50,

	createPseudo: markFunction,

	match: matchExpr,

	attrHandle: {},

	find: {},

	relative: {
		">": { dir: "parentNode", first: true },
		" ": { dir: "parentNode" },
		"+": { dir: "previousSibling", first: true },
		"~": { dir: "previousSibling" }
	},

	preFilter: {
		"ATTR": function( match ) {
			match[1] = match[1].replace( runescape, funescape );

			// Move the given value to match[3] whether quoted or unquoted
			match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );

			if ( match[2] === "~=" ) {
				match[3] = " " + match[3] + " ";
			}

			return match.slice( 0, 4 );
		},

		"CHILD": function( match ) {
			/* matches from matchExpr["CHILD"]
				1 type (only|nth|...)
				2 what (child|of-type)
				3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
				4 xn-component of xn+y argument ([+-]?\d*n|)
				5 sign of xn-component
				6 x of xn-component
				7 sign of y-component
				8 y of y-component
			*/
			match[1] = match[1].toLowerCase();

			if ( match[1].slice( 0, 3 ) === "nth" ) {
				// nth-* requires argument
				if ( !match[3] ) {
					Sizzle.error( match[0] );
				}

				// numeric x and y parameters for Expr.filter.CHILD
				// remember that false/true cast respectively to 0/1
				match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
				match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );

			// other types prohibit arguments
			} else if ( match[3] ) {
				Sizzle.error( match[0] );
			}

			return match;
		},

		"PSEUDO": function( match ) {
			var excess,
				unquoted = !match[6] && match[2];

			if ( matchExpr["CHILD"].test( match[0] ) ) {
				return null;
			}

			// Accept quoted arguments as-is
			if ( match[3] ) {
				match[2] = match[4] || match[5] || "";

			// Strip excess characters from unquoted arguments
			} else if ( unquoted && rpseudo.test( unquoted ) &&
				// Get excess from tokenize (recursively)
				(excess = tokenize( unquoted, true )) &&
				// advance to the next closing parenthesis
				(excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {

				// excess is a negative index
				match[0] = match[0].slice( 0, excess );
				match[2] = unquoted.slice( 0, excess );
			}

			// Return only captures needed by the pseudo filter method (type and argument)
			return match.slice( 0, 3 );
		}
	},

	filter: {

		"TAG": function( nodeNameSelector ) {
			var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
			return nodeNameSelector === "*" ?
				function() { return true; } :
				function( elem ) {
					return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
				};
		},

		"CLASS": function( className ) {
			var pattern = classCache[ className + " " ];

			return pattern ||
				(pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
				classCache( className, function( elem ) {
					return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" );
				});
		},

		"ATTR": function( name, operator, check ) {
			return function( elem ) {
				var result = Sizzle.attr( elem, name );

				if ( result == null ) {
					return operator === "!=";
				}
				if ( !operator ) {
					return true;
				}

				result += "";

				return operator === "=" ? result === check :
					operator === "!=" ? result !== check :
					operator === "^=" ? check && result.indexOf( check ) === 0 :
					operator === "*=" ? check && result.indexOf( check ) > -1 :
					operator === "$=" ? check && result.slice( -check.length ) === check :
					operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
					operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
					false;
			};
		},

		"CHILD": function( type, what, argument, first, last ) {
			var simple = type.slice( 0, 3 ) !== "nth",
				forward = type.slice( -4 ) !== "last",
				ofType = what === "of-type";

			return first === 1 && last === 0 ?

				// Shortcut for :nth-*(n)
				function( elem ) {
					return !!elem.parentNode;
				} :

				function( elem, context, xml ) {
					var cache, uniqueCache, outerCache, node, nodeIndex, start,
						dir = simple !== forward ? "nextSibling" : "previousSibling",
						parent = elem.parentNode,
						name = ofType && elem.nodeName.toLowerCase(),
						useCache = !xml && !ofType,
						diff = false;

					if ( parent ) {

						// :(first|last|only)-(child|of-type)
						if ( simple ) {
							while ( dir ) {
								node = elem;
								while ( (node = node[ dir ]) ) {
									if ( ofType ?
										node.nodeName.toLowerCase() === name :
										node.nodeType === 1 ) {

										return false;
									}
								}
								// Reverse direction for :only-* (if we haven't yet done so)
								start = dir = type === "only" && !start && "nextSibling";
							}
							return true;
						}

						start = [ forward ? parent.firstChild : parent.lastChild ];

						// non-xml :nth-child(...) stores cache data on `parent`
						if ( forward && useCache ) {

							// Seek `elem` from a previously-cached index

							// ...in a gzip-friendly way
							node = parent;
							outerCache = node[ expando ] || (node[ expando ] = {});

							// Support: IE <9 only
							// Defend against cloned attroperties (jQuery gh-1709)
							uniqueCache = outerCache[ node.uniqueID ] ||
								(outerCache[ node.uniqueID ] = {});

							cache = uniqueCache[ type ] || [];
							nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
							diff = nodeIndex && cache[ 2 ];
							node = nodeIndex && parent.childNodes[ nodeIndex ];

							while ( (node = ++nodeIndex && node && node[ dir ] ||

								// Fallback to seeking `elem` from the start
								(diff = nodeIndex = 0) || start.pop()) ) {

								// When found, cache indexes on `parent` and break
								if ( node.nodeType === 1 && ++diff && node === elem ) {
									uniqueCache[ type ] = [ dirruns, nodeIndex, diff ];
									break;
								}
							}

						} else {
							// Use previously-cached element index if available
							if ( useCache ) {
								// ...in a gzip-friendly way
								node = elem;
								outerCache = node[ expando ] || (node[ expando ] = {});

								// Support: IE <9 only
								// Defend against cloned attroperties (jQuery gh-1709)
								uniqueCache = outerCache[ node.uniqueID ] ||
									(outerCache[ node.uniqueID ] = {});

								cache = uniqueCache[ type ] || [];
								nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
								diff = nodeIndex;
							}

							// xml :nth-child(...)
							// or :nth-last-child(...) or :nth(-last)?-of-type(...)
							if ( diff === false ) {
								// Use the same loop as above to seek `elem` from the start
								while ( (node = ++nodeIndex && node && node[ dir ] ||
									(diff = nodeIndex = 0) || start.pop()) ) {

									if ( ( ofType ?
										node.nodeName.toLowerCase() === name :
										node.nodeType === 1 ) &&
										++diff ) {

										// Cache the index of each encountered element
										if ( useCache ) {
											outerCache = node[ expando ] || (node[ expando ] = {});

											// Support: IE <9 only
											// Defend against cloned attroperties (jQuery gh-1709)
											uniqueCache = outerCache[ node.uniqueID ] ||
												(outerCache[ node.uniqueID ] = {});

											uniqueCache[ type ] = [ dirruns, diff ];
										}

										if ( node === elem ) {
											break;
										}
									}
								}
							}
						}

						// Incorporate the offset, then check against cycle size
						diff -= last;
						return diff === first || ( diff % first === 0 && diff / first >= 0 );
					}
				};
		},

		"PSEUDO": function( pseudo, argument ) {
			// pseudo-class names are case-insensitive
			// http://www.w3.org/TR/selectors/#pseudo-classes
			// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
			// Remember that setFilters inherits from pseudos
			var args,
				fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
					Sizzle.error( "unsupported pseudo: " + pseudo );

			// The user may use createPseudo to indicate that
			// arguments are needed to create the filter function
			// just as Sizzle does
			if ( fn[ expando ] ) {
				return fn( argument );
			}

			// But maintain support for old signatures
			if ( fn.length > 1 ) {
				args = [ pseudo, pseudo, "", argument ];
				return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
					markFunction(function( seed, matches ) {
						var idx,
							matched = fn( seed, argument ),
							i = matched.length;
						while ( i-- ) {
							idx = indexOf( seed, matched[i] );
							seed[ idx ] = !( matches[ idx ] = matched[i] );
						}
					}) :
					function( elem ) {
						return fn( elem, 0, args );
					};
			}

			return fn;
		}
	},

	pseudos: {
		// Potentially complex pseudos
		"not": markFunction(function( selector ) {
			// Trim the selector passed to compile
			// to avoid treating leading and trailing
			// spaces as combinators
			var input = [],
				results = [],
				matcher = compile( selector.replace( rtrim, "$1" ) );

			return matcher[ expando ] ?
				markFunction(function( seed, matches, context, xml ) {
					var elem,
						unmatched = matcher( seed, null, xml, [] ),
						i = seed.length;

					// Match elements unmatched by `matcher`
					while ( i-- ) {
						if ( (elem = unmatched[i]) ) {
							seed[i] = !(matches[i] = elem);
						}
					}
				}) :
				function( elem, context, xml ) {
					input[0] = elem;
					matcher( input, null, xml, results );
					// Don't keep the element (issue #299)
					input[0] = null;
					return !results.pop();
				};
		}),

		"has": markFunction(function( selector ) {
			return function( elem ) {
				return Sizzle( selector, elem ).length > 0;
			};
		}),

		"contains": markFunction(function( text ) {
			text = text.replace( runescape, funescape );
			return function( elem ) {
				return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
			};
		}),

		// "Whether an element is represented by a :lang() selector
		// is based solely on the element's language value
		// being equal to the identifier C,
		// or beginning with the identifier C immediately followed by "-".
		// The matching of C against the element's language value is performed case-insensitively.
		// The identifier C does not have to be a valid language name."
		// http://www.w3.org/TR/selectors/#lang-pseudo
		"lang": markFunction( function( lang ) {
			// lang value must be a valid identifier
			if ( !ridentifier.test(lang || "") ) {
				Sizzle.error( "unsupported lang: " + lang );
			}
			lang = lang.replace( runescape, funescape ).toLowerCase();
			return function( elem ) {
				var elemLang;
				do {
					if ( (elemLang = documentIsHTML ?
						elem.lang :
						elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {

						elemLang = elemLang.toLowerCase();
						return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
					}
				} while ( (elem = elem.parentNode) && elem.nodeType === 1 );
				return false;
			};
		}),

		// Miscellaneous
		"target": function( elem ) {
			var hash = window.location && window.location.hash;
			return hash && hash.slice( 1 ) === elem.id;
		},

		"root": function( elem ) {
			return elem === docElem;
		},

		"focus": function( elem ) {
			return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
		},

		// Boolean properties
		"enabled": function( elem ) {
			return elem.disabled === false;
		},

		"disabled": function( elem ) {
			return elem.disabled === true;
		},

		"checked": function( elem ) {
			// In CSS3, :checked should return both checked and selected elements
			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
			var nodeName = elem.nodeName.toLowerCase();
			return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
		},

		"selected": function( elem ) {
			// Accessing this property makes selected-by-default
			// options in Safari work properly
			if ( elem.parentNode ) {
				elem.parentNode.selectedIndex;
			}

			return elem.selected === true;
		},

		// Contents
		"empty": function( elem ) {
			// http://www.w3.org/TR/selectors/#empty-pseudo
			// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
			//   but not by others (comment: 8; processing instruction: 7; etc.)
			// nodeType < 6 works because attributes (2) do not appear as children
			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
				if ( elem.nodeType < 6 ) {
					return false;
				}
			}
			return true;
		},

		"parent": function( elem ) {
			return !Expr.pseudos["empty"]( elem );
		},

		// Element/input types
		"header": function( elem ) {
			return rheader.test( elem.nodeName );
		},

		"input": function( elem ) {
			return rinputs.test( elem.nodeName );
		},

		"button": function( elem ) {
			var name = elem.nodeName.toLowerCase();
			return name === "input" && elem.type === "button" || name === "button";
		},

		"text": function( elem ) {
			var attr;
			return elem.nodeName.toLowerCase() === "input" &&
				elem.type === "text" &&

				// Support: IE<8
				// New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
				( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
		},

		// Position-in-collection
		"first": createPositionalPseudo(function() {
			return [ 0 ];
		}),

		"last": createPositionalPseudo(function( matchIndexes, length ) {
			return [ length - 1 ];
		}),

		"eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
			return [ argument < 0 ? argument + length : argument ];
		}),

		"even": createPositionalPseudo(function( matchIndexes, length ) {
			var i = 0;
			for ( ; i < length; i += 2 ) {
				matchIndexes.push( i );
			}
			return matchIndexes;
		}),

		"odd": createPositionalPseudo(function( matchIndexes, length ) {
			var i = 1;
			for ( ; i < length; i += 2 ) {
				matchIndexes.push( i );
			}
			return matchIndexes;
		}),

		"lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
			var i = argument < 0 ? argument + length : argument;
			for ( ; --i >= 0; ) {
				matchIndexes.push( i );
			}
			return matchIndexes;
		}),

		"gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
			var i = argument < 0 ? argument + length : argument;
			for ( ; ++i < length; ) {
				matchIndexes.push( i );
			}
			return matchIndexes;
		})
	}
};

Expr.pseudos["nth"] = Expr.pseudos["eq"];

// Add button/input type pseudos
for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
	Expr.pseudos[ i ] = createInputPseudo( i );
}
for ( i in { submit: true, reset: true } ) {
	Expr.pseudos[ i ] = createButtonPseudo( i );
}

// Easy API for creating new setFilters
function setFilters() {}
setFilters.prototype = Expr.filters = Expr.pseudos;
Expr.setFilters = new setFilters();

tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
	var matched, match, tokens, type,
		soFar, groups, preFilters,
		cached = tokenCache[ selector + " " ];

	if ( cached ) {
		return parseOnly ? 0 : cached.slice( 0 );
	}

	soFar = selector;
	groups = [];
	preFilters = Expr.preFilter;

	while ( soFar ) {

		// Comma and first run
		if ( !matched || (match = rcomma.exec( soFar )) ) {
			if ( match ) {
				// Don't consume trailing commas as valid
				soFar = soFar.slice( match[0].length ) || soFar;
			}
			groups.push( (tokens = []) );
		}

		matched = false;

		// Combinators
		if ( (match = rcombinators.exec( soFar )) ) {
			matched = match.shift();
			tokens.push({
				value: matched,
				// Cast descendant combinators to space
				type: match[0].replace( rtrim, " " )
			});
			soFar = soFar.slice( matched.length );
		}

		// Filters
		for ( type in Expr.filter ) {
			if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
				(match = preFilters[ type ]( match ))) ) {
				matched = match.shift();
				tokens.push({
					value: matched,
					type: type,
					matches: match
				});
				soFar = soFar.slice( matched.length );
			}
		}

		if ( !matched ) {
			break;
		}
	}

	// Return the length of the invalid excess
	// if we're just parsing
	// Otherwise, throw an error or return tokens
	return parseOnly ?
		soFar.length :
		soFar ?
			Sizzle.error( selector ) :
			// Cache the tokens
			tokenCache( selector, groups ).slice( 0 );
};

function toSelector( tokens ) {
	var i = 0,
		len = tokens.length,
		selector = "";
	for ( ; i < len; i++ ) {
		selector += tokens[i].value;
	}
	return selector;
}

function addCombinator( matcher, combinator, base ) {
	var dir = combinator.dir,
		checkNonElements = base && dir === "parentNode",
		doneName = done++;

	return combinator.first ?
		// Check against closest ancestor/preceding element
		function( elem, context, xml ) {
			while ( (elem = elem[ dir ]) ) {
				if ( elem.nodeType === 1 || checkNonElements ) {
					return matcher( elem, context, xml );
				}
			}
		} :

		// Check against all ancestor/preceding elements
		function( elem, context, xml ) {
			var oldCache, uniqueCache, outerCache,
				newCache = [ dirruns, doneName ];

			// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
			if ( xml ) {
				while ( (elem = elem[ dir ]) ) {
					if ( elem.nodeType === 1 || checkNonElements ) {
						if ( matcher( elem, context, xml ) ) {
							return true;
						}
					}
				}
			} else {
				while ( (elem = elem[ dir ]) ) {
					if ( elem.nodeType === 1 || checkNonElements ) {
						outerCache = elem[ expando ] || (elem[ expando ] = {});

						// Support: IE <9 only
						// Defend against cloned attroperties (jQuery gh-1709)
						uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});

						if ( (oldCache = uniqueCache[ dir ]) &&
							oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {

							// Assign to newCache so results back-propagate to previous elements
							return (newCache[ 2 ] = oldCache[ 2 ]);
						} else {
							// Reuse newcache so results back-propagate to previous elements
							uniqueCache[ dir ] = newCache;

							// A match means we're done; a fail means we have to keep checking
							if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
								return true;
							}
						}
					}
				}
			}
		};
}

function elementMatcher( matchers ) {
	return matchers.length > 1 ?
		function( elem, context, xml ) {
			var i = matchers.length;
			while ( i-- ) {
				if ( !matchers[i]( elem, context, xml ) ) {
					return false;
				}
			}
			return true;
		} :
		matchers[0];
}

function multipleContexts( selector, contexts, results ) {
	var i = 0,
		len = contexts.length;
	for ( ; i < len; i++ ) {
		Sizzle( selector, contexts[i], results );
	}
	return results;
}

function condense( unmatched, map, filter, context, xml ) {
	var elem,
		newUnmatched = [],
		i = 0,
		len = unmatched.length,
		mapped = map != null;

	for ( ; i < len; i++ ) {
		if ( (elem = unmatched[i]) ) {
			if ( !filter || filter( elem, context, xml ) ) {
				newUnmatched.push( elem );
				if ( mapped ) {
					map.push( i );
				}
			}
		}
	}

	return newUnmatched;
}

function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
	if ( postFilter && !postFilter[ expando ] ) {
		postFilter = setMatcher( postFilter );
	}
	if ( postFinder && !postFinder[ expando ] ) {
		postFinder = setMatcher( postFinder, postSelector );
	}
	return markFunction(function( seed, results, context, xml ) {
		var temp, i, elem,
			preMap = [],
			postMap = [],
			preexisting = results.length,

			// Get initial elements from seed or context
			elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),

			// Prefilter to get matcher input, preserving a map for seed-results synchronization
			matcherIn = preFilter && ( seed || !selector ) ?
				condense( elems, preMap, preFilter, context, xml ) :
				elems,

			matcherOut = matcher ?
				// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
				postFinder || ( seed ? preFilter : preexisting || postFilter ) ?

					// ...intermediate processing is necessary
					[] :

					// ...otherwise use results directly
					results :
				matcherIn;

		// Find primary matches
		if ( matcher ) {
			matcher( matcherIn, matcherOut, context, xml );
		}

		// Apply postFilter
		if ( postFilter ) {
			temp = condense( matcherOut, postMap );
			postFilter( temp, [], context, xml );

			// Un-match failing elements by moving them back to matcherIn
			i = temp.length;
			while ( i-- ) {
				if ( (elem = temp[i]) ) {
					matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
				}
			}
		}

		if ( seed ) {
			if ( postFinder || preFilter ) {
				if ( postFinder ) {
					// Get the final matcherOut by condensing this intermediate into postFinder contexts
					temp = [];
					i = matcherOut.length;
					while ( i-- ) {
						if ( (elem = matcherOut[i]) ) {
							// Restore matcherIn since elem is not yet a final match
							temp.push( (matcherIn[i] = elem) );
						}
					}
					postFinder( null, (matcherOut = []), temp, xml );
				}

				// Move matched elements from seed to results to keep them synchronized
				i = matcherOut.length;
				while ( i-- ) {
					if ( (elem = matcherOut[i]) &&
						(temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {

						seed[temp] = !(results[temp] = elem);
					}
				}
			}

		// Add elements to results, through postFinder if defined
		} else {
			matcherOut = condense(
				matcherOut === results ?
					matcherOut.splice( preexisting, matcherOut.length ) :
					matcherOut
			);
			if ( postFinder ) {
				postFinder( null, results, matcherOut, xml );
			} else {
				push.apply( results, matcherOut );
			}
		}
	});
}

function matcherFromTokens( tokens ) {
	var checkContext, matcher, j,
		len = tokens.length,
		leadingRelative = Expr.relative[ tokens[0].type ],
		implicitRelative = leadingRelative || Expr.relative[" "],
		i = leadingRelative ? 1 : 0,

		// The foundational matcher ensures that elements are reachable from top-level context(s)
		matchContext = addCombinator( function( elem ) {
			return elem === checkContext;
		}, implicitRelative, true ),
		matchAnyContext = addCombinator( function( elem ) {
			return indexOf( checkContext, elem ) > -1;
		}, implicitRelative, true ),
		matchers = [ function( elem, context, xml ) {
			var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
				(checkContext = context).nodeType ?
					matchContext( elem, context, xml ) :
					matchAnyContext( elem, context, xml ) );
			// Avoid hanging onto element (issue #299)
			checkContext = null;
			return ret;
		} ];

	for ( ; i < len; i++ ) {
		if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
			matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
		} else {
			matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );

			// Return special upon seeing a positional matcher
			if ( matcher[ expando ] ) {
				// Find the next relative operator (if any) for proper handling
				j = ++i;
				for ( ; j < len; j++ ) {
					if ( Expr.relative[ tokens[j].type ] ) {
						break;
					}
				}
				return setMatcher(
					i > 1 && elementMatcher( matchers ),
					i > 1 && toSelector(
						// If the preceding token was a descendant combinator, insert an implicit any-element `*`
						tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
					).replace( rtrim, "$1" ),
					matcher,
					i < j && matcherFromTokens( tokens.slice( i, j ) ),
					j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
					j < len && toSelector( tokens )
				);
			}
			matchers.push( matcher );
		}
	}

	return elementMatcher( matchers );
}

function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
	var bySet = setMatchers.length > 0,
		byElement = elementMatchers.length > 0,
		superMatcher = function( seed, context, xml, results, outermost ) {
			var elem, j, matcher,
				matchedCount = 0,
				i = "0",
				unmatched = seed && [],
				setMatched = [],
				contextBackup = outermostContext,
				// We must always have either seed elements or outermost context
				elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),
				// Use integer dirruns iff this is the outermost matcher
				dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
				len = elems.length;

			if ( outermost ) {
				outermostContext = context === document || context || outermost;
			}

			// Add elements passing elementMatchers directly to results
			// Support: IE<9, Safari
			// Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
			for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
				if ( byElement && elem ) {
					j = 0;
					if ( !context && elem.ownerDocument !== document ) {
						setDocument( elem );
						xml = !documentIsHTML;
					}
					while ( (matcher = elementMatchers[j++]) ) {
						if ( matcher( elem, context || document, xml) ) {
							results.push( elem );
							break;
						}
					}
					if ( outermost ) {
						dirruns = dirrunsUnique;
					}
				}

				// Track unmatched elements for set filters
				if ( bySet ) {
					// They will have gone through all possible matchers
					if ( (elem = !matcher && elem) ) {
						matchedCount--;
					}

					// Lengthen the array for every element, matched or not
					if ( seed ) {
						unmatched.push( elem );
					}
				}
			}

			// `i` is now the count of elements visited above, and adding it to `matchedCount`
			// makes the latter nonnegative.
			matchedCount += i;

			// Apply set filters to unmatched elements
			// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
			// equals `i`), unless we didn't visit _any_ elements in the above loop because we have
			// no element matchers and no seed.
			// Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
			// case, which will result in a "00" `matchedCount` that differs from `i` but is also
			// numerically zero.
			if ( bySet && i !== matchedCount ) {
				j = 0;
				while ( (matcher = setMatchers[j++]) ) {
					matcher( unmatched, setMatched, context, xml );
				}

				if ( seed ) {
					// Reintegrate element matches to eliminate the need for sorting
					if ( matchedCount > 0 ) {
						while ( i-- ) {
							if ( !(unmatched[i] || setMatched[i]) ) {
								setMatched[i] = pop.call( results );
							}
						}
					}

					// Discard index placeholder values to get only actual matches
					setMatched = condense( setMatched );
				}

				// Add matches to results
				push.apply( results, setMatched );

				// Seedless set matches succeeding multiple successful matchers stipulate sorting
				if ( outermost && !seed && setMatched.length > 0 &&
					( matchedCount + setMatchers.length ) > 1 ) {

					Sizzle.uniqueSort( results );
				}
			}

			// Override manipulation of globals by nested matchers
			if ( outermost ) {
				dirruns = dirrunsUnique;
				outermostContext = contextBackup;
			}

			return unmatched;
		};

	return bySet ?
		markFunction( superMatcher ) :
		superMatcher;
}

compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
	var i,
		setMatchers = [],
		elementMatchers = [],
		cached = compilerCache[ selector + " " ];

	if ( !cached ) {
		// Generate a function of recursive functions that can be used to check each element
		if ( !match ) {
			match = tokenize( selector );
		}
		i = match.length;
		while ( i-- ) {
			cached = matcherFromTokens( match[i] );
			if ( cached[ expando ] ) {
				setMatchers.push( cached );
			} else {
				elementMatchers.push( cached );
			}
		}

		// Cache the compiled function
		cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );

		// Save selector and tokenization
		cached.selector = selector;
	}
	return cached;
};

/**
 * A low-level selection function that works with Sizzle's compiled
 *  selector functions
 * @param {String|Function} selector A selector or a pre-compiled
 *  selector function built with Sizzle.compile
 * @param {Element} context
 * @param {Array} [results]
 * @param {Array} [seed] A set of elements to match against
 */
select = Sizzle.select = function( selector, context, results, seed ) {
	var i, tokens, token, type, find,
		compiled = typeof selector === "function" && selector,
		match = !seed && tokenize( (selector = compiled.selector || selector) );

	results = results || [];

	// Try to minimize operations if there is only one selector in the list and no seed
	// (the latter of which guarantees us context)
	if ( match.length === 1 ) {

		// Reduce context if the leading compound selector is an ID
		tokens = match[0] = match[0].slice( 0 );
		if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
				support.getById && context.nodeType === 9 && documentIsHTML &&
				Expr.relative[ tokens[1].type ] ) {

			context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
			if ( !context ) {
				return results;

			// Precompiled matchers will still verify ancestry, so step up a level
			} else if ( compiled ) {
				context = context.parentNode;
			}

			selector = selector.slice( tokens.shift().value.length );
		}

		// Fetch a seed set for right-to-left matching
		i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
		while ( i-- ) {
			token = tokens[i];

			// Abort if we hit a combinator
			if ( Expr.relative[ (type = token.type) ] ) {
				break;
			}
			if ( (find = Expr.find[ type ]) ) {
				// Search, expanding context for leading sibling combinators
				if ( (seed = find(
					token.matches[0].replace( runescape, funescape ),
					rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context
				)) ) {

					// If seed is empty or no tokens remain, we can return early
					tokens.splice( i, 1 );
					selector = seed.length && toSelector( tokens );
					if ( !selector ) {
						push.apply( results, seed );
						return results;
					}

					break;
				}
			}
		}
	}

	// Compile and execute a filtering function if one is not provided
	// Provide `match` to avoid retokenization if we modified the selector above
	( compiled || compile( selector, match ) )(
		seed,
		context,
		!documentIsHTML,
		results,
		!context || rsibling.test( selector ) && testContext( context.parentNode ) || context
	);
	return results;
};

// One-time assignments

// Sort stability
support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;

// Support: Chrome 14-35+
// Always assume duplicates if they aren't passed to the comparison function
support.detectDuplicates = !!hasDuplicate;

// Initialize against the default document
setDocument();

// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
// Detached nodes confoundingly follow *each other*
support.sortDetached = assert(function( div1 ) {
	// Should return 1, but returns 4 (following)
	return div1.compareDocumentPosition( document.createElement("div") ) & 1;
});

// Support: IE<8
// Prevent attribute/property "interpolation"
// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
if ( !assert(function( div ) {
	div.innerHTML = "<a href='#'></a>";
	return div.firstChild.getAttribute("href") === "#" ;
}) ) {
	addHandle( "type|href|height|width", function( elem, name, isXML ) {
		if ( !isXML ) {
			return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
		}
	});
}

// Support: IE<9
// Use defaultValue in place of getAttribute("value")
if ( !support.attributes || !assert(function( div ) {
	div.innerHTML = "<input/>";
	div.firstChild.setAttribute( "value", "" );
	return div.firstChild.getAttribute( "value" ) === "";
}) ) {
	addHandle( "value", function( elem, name, isXML ) {
		if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
			return elem.defaultValue;
		}
	});
}

// Support: IE<9
// Use getAttributeNode to fetch booleans when getAttribute lies
if ( !assert(function( div ) {
	return div.getAttribute("disabled") == null;
}) ) {
	addHandle( booleans, function( elem, name, isXML ) {
		var val;
		if ( !isXML ) {
			return elem[ name ] === true ? name.toLowerCase() :
					(val = elem.getAttributeNode( name )) && val.specified ?
					val.value :
				null;
		}
	});
}

return Sizzle;

})( window );



jQuery.find = Sizzle;
jQuery.expr = Sizzle.selectors;
jQuery.expr[ ":" ] = jQuery.expr.pseudos;
jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
jQuery.text = Sizzle.getText;
jQuery.isXMLDoc = Sizzle.isXML;
jQuery.contains = Sizzle.contains;



var dir = function( elem, dir, until ) {
	var matched = [],
		truncate = until !== undefined;

	while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {
		if ( elem.nodeType === 1 ) {
			if ( truncate && jQuery( elem ).is( until ) ) {
				break;
			}
			matched.push( elem );
		}
	}
	return matched;
};


var siblings = function( n, elem ) {
	var matched = [];

	for ( ; n; n = n.nextSibling ) {
		if ( n.nodeType === 1 && n !== elem ) {
			matched.push( n );
		}
	}

	return matched;
};


var rneedsContext = jQuery.expr.match.needsContext;

var rsingleTag = ( /^<([\w-]+)\s*\/?>(?:<\/\1>|)$/ );



var risSimple = /^.[^:#\[\.,]*$/;

// Implement the identical functionality for filter and not
function winnow( elements, qualifier, not ) {
	if ( jQuery.isFunction( qualifier ) ) {
		return jQuery.grep( elements, function( elem, i ) {
			/* jshint -W018 */
			return !!qualifier.call( elem, i, elem ) !== not;
		} );

	}

	if ( qualifier.nodeType ) {
		return jQuery.grep( elements, function( elem ) {
			return ( elem === qualifier ) !== not;
		} );

	}

	if ( typeof qualifier === "string" ) {
		if ( risSimple.test( qualifier ) ) {
			return jQuery.filter( qualifier, elements, not );
		}

		qualifier = jQuery.filter( qualifier, elements );
	}

	return jQuery.grep( elements, function( elem ) {
		return ( jQuery.inArray( elem, qualifier ) > -1 ) !== not;
	} );
}

jQuery.filter = function( expr, elems, not ) {
	var elem = elems[ 0 ];

	if ( not ) {
		expr = ":not(" + expr + ")";
	}

	return elems.length === 1 && elem.nodeType === 1 ?
		jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :
		jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
			return elem.nodeType === 1;
		} ) );
};

jQuery.fn.extend( {
	find: function( selector ) {
		var i,
			ret = [],
			self = this,
			len = self.length;

		if ( typeof selector !== "string" ) {
			return this.pushStack( jQuery( selector ).filter( function() {
				for ( i = 0; i < len; i++ ) {
					if ( jQuery.contains( self[ i ], this ) ) {
						return true;
					}
				}
			} ) );
		}

		for ( i = 0; i < len; i++ ) {
			jQuery.find( selector, self[ i ], ret );
		}

		// Needed because $( selector, context ) becomes $( context ).find( selector )
		ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );
		ret.selector = this.selector ? this.selector + " " + selector : selector;
		return ret;
	},
	filter: function( selector ) {
		return this.pushStack( winnow( this, selector || [], false ) );
	},
	not: function( selector ) {
		return this.pushStack( winnow( this, selector || [], true ) );
	},
	is: function( selector ) {
		return !!winnow(
			this,

			// If this is a positional/relative selector, check membership in the returned set
			// so $("p:first").is("p:last") won't return true for a doc with two "p".
			typeof selector === "string" && rneedsContext.test( selector ) ?
				jQuery( selector ) :
				selector || [],
			false
		).length;
	}
} );


// Initialize a jQuery object


// A central reference to the root jQuery(document)
var rootjQuery,

	// A simple way to check for HTML strings
	// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
	// Strict HTML recognition (#11290: must start with <)
	rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,

	init = jQuery.fn.init = function( selector, context, root ) {
		var match, elem;

		// HANDLE: $(""), $(null), $(undefined), $(false)
		if ( !selector ) {
			return this;
		}

		// init accepts an alternate rootjQuery
		// so migrate can support jQuery.sub (gh-2101)
		root = root || rootjQuery;

		// Handle HTML strings
		if ( typeof selector === "string" ) {
			if ( selector.charAt( 0 ) === "<" &&
				selector.charAt( selector.length - 1 ) === ">" &&
				selector.length >= 3 ) {

				// Assume that strings that start and end with <> are HTML and skip the regex check
				match = [ null, selector, null ];

			} else {
				match = rquickExpr.exec( selector );
			}

			// Match html or make sure no context is specified for #id
			if ( match && ( match[ 1 ] || !context ) ) {

				// HANDLE: $(html) -> $(array)
				if ( match[ 1 ] ) {
					context = context instanceof jQuery ? context[ 0 ] : context;

					// scripts is true for back-compat
					// Intentionally let the error be thrown if parseHTML is not present
					jQuery.merge( this, jQuery.parseHTML(
						match[ 1 ],
						context && context.nodeType ? context.ownerDocument || context : document,
						true
					) );

					// HANDLE: $(html, props)
					if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {
						for ( match in context ) {

							// Properties of context are called as methods if possible
							if ( jQuery.isFunction( this[ match ] ) ) {
								this[ match ]( context[ match ] );

							// ...and otherwise set as attributes
							} else {
								this.attr( match, context[ match ] );
							}
						}
					}

					return this;

				// HANDLE: $(#id)
				} else {
					elem = document.getElementById( match[ 2 ] );

					// Check parentNode to catch when Blackberry 4.6 returns
					// nodes that are no longer in the document #6963
					if ( elem && elem.parentNode ) {

						// Handle the case where IE and Opera return items
						// by name instead of ID
						if ( elem.id !== match[ 2 ] ) {
							return rootjQuery.find( selector );
						}

						// Otherwise, we inject the element directly into the jQuery object
						this.length = 1;
						this[ 0 ] = elem;
					}

					this.context = document;
					this.selector = selector;
					return this;
				}

			// HANDLE: $(expr, $(...))
			} else if ( !context || context.jquery ) {
				return ( context || root ).find( selector );

			// HANDLE: $(expr, context)
			// (which is just equivalent to: $(context).find(expr)
			} else {
				return this.constructor( context ).find( selector );
			}

		// HANDLE: $(DOMElement)
		} else if ( selector.nodeType ) {
			this.context = this[ 0 ] = selector;
			this.length = 1;
			return this;

		// HANDLE: $(function)
		// Shortcut for document ready
		} else if ( jQuery.isFunction( selector ) ) {
			return typeof root.ready !== "undefined" ?
				root.ready( selector ) :

				// Execute immediately if ready is not present
				selector( jQuery );
		}

		if ( selector.selector !== undefined ) {
			this.selector = selector.selector;
			this.context = selector.context;
		}

		return jQuery.makeArray( selector, this );
	};

// Give the init function the jQuery prototype for later instantiation
init.prototype = jQuery.fn;

// Initialize central reference
rootjQuery = jQuery( document );


var rparentsprev = /^(?:parents|prev(?:Until|All))/,

	// methods guaranteed to produce a unique set when starting from a unique set
	guaranteedUnique = {
		children: true,
		contents: true,
		next: true,
		prev: true
	};

jQuery.fn.extend( {
	has: function( target ) {
		var i,
			targets = jQuery( target, this ),
			len = targets.length;

		return this.filter( function() {
			for ( i = 0; i < len; i++ ) {
				if ( jQuery.contains( this, targets[ i ] ) ) {
					return true;
				}
			}
		} );
	},

	closest: function( selectors, context ) {
		var cur,
			i = 0,
			l = this.length,
			matched = [],
			pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
				jQuery( selectors, context || this.context ) :
				0;

		for ( ; i < l; i++ ) {
			for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {

				// Always skip document fragments
				if ( cur.nodeType < 11 && ( pos ?
					pos.index( cur ) > -1 :

					// Don't pass non-elements to Sizzle
					cur.nodeType === 1 &&
						jQuery.find.matchesSelector( cur, selectors ) ) ) {

					matched.push( cur );
					break;
				}
			}
		}

		return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );
	},

	// Determine the position of an element within
	// the matched set of elements
	index: function( elem ) {

		// No argument, return index in parent
		if ( !elem ) {
			return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
		}

		// index in selector
		if ( typeof elem === "string" ) {
			return jQuery.inArray( this[ 0 ], jQuery( elem ) );
		}

		// Locate the position of the desired element
		return jQuery.inArray(

			// If it receives a jQuery object, the first element is used
			elem.jquery ? elem[ 0 ] : elem, this );
	},

	add: function( selector, context ) {
		return this.pushStack(
			jQuery.uniqueSort(
				jQuery.merge( this.get(), jQuery( selector, context ) )
			)
		);
	},

	addBack: function( selector ) {
		return this.add( selector == null ?
			this.prevObject : this.prevObject.filter( selector )
		);
	}
} );

function sibling( cur, dir ) {
	do {
		cur = cur[ dir ];
	} while ( cur && cur.nodeType !== 1 );

	return cur;
}

jQuery.each( {
	parent: function( elem ) {
		var parent = elem.parentNode;
		return parent && parent.nodeType !== 11 ? parent : null;
	},
	parents: function( elem ) {
		return dir( elem, "parentNode" );
	},
	parentsUntil: function( elem, i, until ) {
		return dir( elem, "parentNode", until );
	},
	next: function( elem ) {
		return sibling( elem, "nextSibling" );
	},
	prev: function( elem ) {
		return sibling( elem, "previousSibling" );
	},
	nextAll: function( elem ) {
		return dir( elem, "nextSibling" );
	},
	prevAll: function( elem ) {
		return dir( elem, "previousSibling" );
	},
	nextUntil: function( elem, i, until ) {
		return dir( elem, "nextSibling", until );
	},
	prevUntil: function( elem, i, until ) {
		return dir( elem, "previousSibling", until );
	},
	siblings: function( elem ) {
		return siblings( ( elem.parentNode || {} ).firstChild, elem );
	},
	children: function( elem ) {
		return siblings( elem.firstChild );
	},
	contents: function( elem ) {
		return jQuery.nodeName( elem, "iframe" ) ?
			elem.contentDocument || elem.contentWindow.document :
			jQuery.merge( [], elem.childNodes );
	}
}, function( name, fn ) {
	jQuery.fn[ name ] = function( until, selector ) {
		var ret = jQuery.map( this, fn, until );

		if ( name.slice( -5 ) !== "Until" ) {
			selector = until;
		}

		if ( selector && typeof selector === "string" ) {
			ret = jQuery.filter( selector, ret );
		}

		if ( this.length > 1 ) {

			// Remove duplicates
			if ( !guaranteedUnique[ name ] ) {
				ret = jQuery.uniqueSort( ret );
			}

			// Reverse order for parents* and prev-derivatives
			if ( rparentsprev.test( name ) ) {
				ret = ret.reverse();
			}
		}

		return this.pushStack( ret );
	};
} );
var rnotwhite = ( /\S+/g );



// Convert String-formatted options into Object-formatted ones
function createOptions( options ) {
	var object = {};
	jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) {
		object[ flag ] = true;
	} );
	return object;
}

/*
 * Create a callback list using the following parameters:
 *
 *	options: an optional list of space-separated options that will change how
 *			the callback list behaves or a more traditional option object
 *
 * By default a callback list will act like an event callback list and can be
 * "fired" multiple times.
 *
 * Possible options:
 *
 *	once:			will ensure the callback list can only be fired once (like a Deferred)
 *
 *	memory:			will keep track of previous values and will call any callback added
 *					after the list has been fired right away with the latest "memorized"
 *					values (like a Deferred)
 *
 *	unique:			will ensure a callback can only be added once (no duplicate in the list)
 *
 *	stopOnFalse:	interrupt callings when a callback returns false
 *
 */
jQuery.Callbacks = function( options ) {

	// Convert options from String-formatted to Object-formatted if needed
	// (we check in cache first)
	options = typeof options === "string" ?
		createOptions( options ) :
		jQuery.extend( {}, options );

	var // Flag to know if list is currently firing
		firing,

		// Last fire value for non-forgettable lists
		memory,

		// Flag to know if list was already fired
		fired,

		// Flag to prevent firing
		locked,

		// Actual callback list
		list = [],

		// Queue of execution data for repeatable lists
		queue = [],

		// Index of currently firing callback (modified by add/remove as needed)
		firingIndex = -1,

		// Fire callbacks
		fire = function() {

			// Enforce single-firing
			locked = options.once;

			// Execute callbacks for all pending executions,
			// respecting firingIndex overrides and runtime changes
			fired = firing = true;
			for ( ; queue.length; firingIndex = -1 ) {
				memory = queue.shift();
				while ( ++firingIndex < list.length ) {

					// Run callback and check for early termination
					if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&
						options.stopOnFalse ) {

						// Jump to end and forget the data so .add doesn't re-fire
						firingIndex = list.length;
						memory = false;
					}
				}
			}

			// Forget the data if we're done with it
			if ( !options.memory ) {
				memory = false;
			}

			firing = false;

			// Clean up if we're done firing for good
			if ( locked ) {

				// Keep an empty list if we have data for future add calls
				if ( memory ) {
					list = [];

				// Otherwise, this object is spent
				} else {
					list = "";
				}
			}
		},

		// Actual Callbacks object
		self = {

			// Add a callback or a collection of callbacks to the list
			add: function() {
				if ( list ) {

					// If we have memory from a past run, we should fire after adding
					if ( memory && !firing ) {
						firingIndex = list.length - 1;
						queue.push( memory );
					}

					( function add( args ) {
						jQuery.each( args, function( _, arg ) {
							if ( jQuery.isFunction( arg ) ) {
								if ( !options.unique || !self.has( arg ) ) {
									list.push( arg );
								}
							} else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) {

								// Inspect recursively
								add( arg );
							}
						} );
					} )( arguments );

					if ( memory && !firing ) {
						fire();
					}
				}
				return this;
			},

			// Remove a callback from the list
			remove: function() {
				jQuery.each( arguments, function( _, arg ) {
					var index;
					while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
						list.splice( index, 1 );

						// Handle firing indexes
						if ( index <= firingIndex ) {
							firingIndex--;
						}
					}
				} );
				return this;
			},

			// Check if a given callback is in the list.
			// If no argument is given, return whether or not list has callbacks attached.
			has: function( fn ) {
				return fn ?
					jQuery.inArray( fn, list ) > -1 :
					list.length > 0;
			},

			// Remove all callbacks from the list
			empty: function() {
				if ( list ) {
					list = [];
				}
				return this;
			},

			// Disable .fire and .add
			// Abort any current/pending executions
			// Clear all callbacks and values
			disable: function() {
				locked = queue = [];
				list = memory = "";
				return this;
			},
			disabled: function() {
				return !list;
			},

			// Disable .fire
			// Also disable .add unless we have memory (since it would have no effect)
			// Abort any pending executions
			lock: function() {
				locked = true;
				if ( !memory ) {
					self.disable();
				}
				return this;
			},
			locked: function() {
				return !!locked;
			},

			// Call all callbacks with the given context and arguments
			fireWith: function( context, args ) {
				if ( !locked ) {
					args = args || [];
					args = [ context, args.slice ? args.slice() : args ];
					queue.push( args );
					if ( !firing ) {
						fire();
					}
				}
				return this;
			},

			// Call all the callbacks with the given arguments
			fire: function() {
				self.fireWith( this, arguments );
				return this;
			},

			// To know if the callbacks have already been called at least once
			fired: function() {
				return !!fired;
			}
		};

	return self;
};


jQuery.extend( {

	Deferred: function( func ) {
		var tuples = [

				// action, add listener, listener list, final state
				[ "resolve", "done", jQuery.Callbacks( "once memory" ), "resolved" ],
				[ "reject", "fail", jQuery.Callbacks( "once memory" ), "rejected" ],
				[ "notify", "progress", jQuery.Callbacks( "memory" ) ]
			],
			state = "pending",
			promise = {
				state: function() {
					return state;
				},
				always: function() {
					deferred.done( arguments ).fail( arguments );
					return this;
				},
				then: function( /* fnDone, fnFail, fnProgress */ ) {
					var fns = arguments;
					return jQuery.Deferred( function( newDefer ) {
						jQuery.each( tuples, function( i, tuple ) {
							var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];

							// deferred[ done | fail | progress ] for forwarding actions to newDefer
							deferred[ tuple[ 1 ] ]( function() {
								var returned = fn && fn.apply( this, arguments );
								if ( returned && jQuery.isFunction( returned.promise ) ) {
									returned.promise()
										.progress( newDefer.notify )
										.done( newDefer.resolve )
										.fail( newDefer.reject );
								} else {
									newDefer[ tuple[ 0 ] + "With" ](
										this === promise ? newDefer.promise() : this,
										fn ? [ returned ] : arguments
									);
								}
							} );
						} );
						fns = null;
					} ).promise();
				},

				// Get a promise for this deferred
				// If obj is provided, the promise aspect is added to the object
				promise: function( obj ) {
					return obj != null ? jQuery.extend( obj, promise ) : promise;
				}
			},
			deferred = {};

		// Keep pipe for back-compat
		promise.pipe = promise.then;

		// Add list-specific methods
		jQuery.each( tuples, function( i, tuple ) {
			var list = tuple[ 2 ],
				stateString = tuple[ 3 ];

			// promise[ done | fail | progress ] = list.add
			promise[ tuple[ 1 ] ] = list.add;

			// Handle state
			if ( stateString ) {
				list.add( function() {

					// state = [ resolved | rejected ]
					state = stateString;

				// [ reject_list | resolve_list ].disable; progress_list.lock
				}, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
			}

			// deferred[ resolve | reject | notify ]
			deferred[ tuple[ 0 ] ] = function() {
				deferred[ tuple[ 0 ] + "With" ]( this === deferred ? promise : this, arguments );
				return this;
			};
			deferred[ tuple[ 0 ] + "With" ] = list.fireWith;
		} );

		// Make the deferred a promise
		promise.promise( deferred );

		// Call given func if any
		if ( func ) {
			func.call( deferred, deferred );
		}

		// All done!
		return deferred;
	},

	// Deferred helper
	when: function( subordinate /* , ..., subordinateN */ ) {
		var i = 0,
			resolveValues = slice.call( arguments ),
			length = resolveValues.length,

			// the count of uncompleted subordinates
			remaining = length !== 1 ||
				( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,

			// the master Deferred.
			// If resolveValues consist of only a single Deferred, just use that.
			deferred = remaining === 1 ? subordinate : jQuery.Deferred(),

			// Update function for both resolve and progress values
			updateFunc = function( i, contexts, values ) {
				return function( value ) {
					contexts[ i ] = this;
					values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
					if ( values === progressValues ) {
						deferred.notifyWith( contexts, values );

					} else if ( !( --remaining ) ) {
						deferred.resolveWith( contexts, values );
					}
				};
			},

			progressValues, progressContexts, resolveContexts;

		// add listeners to Deferred subordinates; treat others as resolved
		if ( length > 1 ) {
			progressValues = new Array( length );
			progressContexts = new Array( length );
			resolveContexts = new Array( length );
			for ( ; i < length; i++ ) {
				if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
					resolveValues[ i ].promise()
						.progress( updateFunc( i, progressContexts, progressValues ) )
						.done( updateFunc( i, resolveContexts, resolveValues ) )
						.fail( deferred.reject );
				} else {
					--remaining;
				}
			}
		}

		// if we're not waiting on anything, resolve the master
		if ( !remaining ) {
			deferred.resolveWith( resolveContexts, resolveValues );
		}

		return deferred.promise();
	}
} );


// The deferred used on DOM ready
var readyList;

jQuery.fn.ready = function( fn ) {

	// Add the callback
	jQuery.ready.promise().done( fn );

	return this;
};

jQuery.extend( {

	// Is the DOM ready to be used? Set to true once it occurs.
	isReady: false,

	// A counter to track how many items to wait for before
	// the ready event fires. See #6781
	readyWait: 1,

	// Hold (or release) the ready event
	holdReady: function( hold ) {
		if ( hold ) {
			jQuery.readyWait++;
		} else {
			jQuery.ready( true );
		}
	},

	// Handle when the DOM is ready
	ready: function( wait ) {

		// Abort if there are pending holds or we're already ready
		if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
			return;
		}

		// Remember that the DOM is ready
		jQuery.isReady = true;

		// If a normal DOM Ready event fired, decrement, and wait if need be
		if ( wait !== true && --jQuery.readyWait > 0 ) {
			return;
		}

		// If there are functions bound, to execute
		readyList.resolveWith( document, [ jQuery ] );

		// Trigger any bound ready events
		if ( jQuery.fn.triggerHandler ) {
			jQuery( document ).triggerHandler( "ready" );
			jQuery( document ).off( "ready" );
		}
	}
} );

/**
 * Clean-up method for dom ready events
 */
function detach() {
	if ( document.addEventListener ) {
		document.removeEventListener( "DOMContentLoaded", completed );
		window.removeEventListener( "load", completed );

	} else {
		document.detachEvent( "onreadystatechange", completed );
		window.detachEvent( "onload", completed );
	}
}

/**
 * The ready event handler and self cleanup method
 */
function completed() {

	// readyState === "complete" is good enough for us to call the dom ready in oldIE
	if ( document.addEventListener ||
		window.event.type === "load" ||
		document.readyState === "complete" ) {

		detach();
		jQuery.ready();
	}
}

jQuery.ready.promise = function( obj ) {
	if ( !readyList ) {

		readyList = jQuery.Deferred();

		// Catch cases where $(document).ready() is called
		// after the browser event has already occurred.
		// Support: IE6-10
		// Older IE sometimes signals "interactive" too soon
		if ( document.readyState === "complete" ||
			( document.readyState !== "loading" && !document.documentElement.doScroll ) ) {

			// Handle it asynchronously to allow scripts the opportunity to delay ready
			window.setTimeout( jQuery.ready );

		// Standards-based browsers support DOMContentLoaded
		} else if ( document.addEventListener ) {

			// Use the handy event callback
			document.addEventListener( "DOMContentLoaded", completed );

			// A fallback to window.onload, that will always work
			window.addEventListener( "load", completed );

		// If IE event model is used
		} else {

			// Ensure firing before onload, maybe late but safe also for iframes
			document.attachEvent( "onreadystatechange", completed );

			// A fallback to window.onload, that will always work
			window.attachEvent( "onload", completed );

			// If IE and not a frame
			// continually check to see if the document is ready
			var top = false;

			try {
				top = window.frameElement == null && document.documentElement;
			} catch ( e ) {}

			if ( top && top.doScroll ) {
				( function doScrollCheck() {
					if ( !jQuery.isReady ) {

						try {

							// Use the trick by Diego Perini
							// http://javascript.nwbox.com/IEContentLoaded/
							top.doScroll( "left" );
						} catch ( e ) {
							return window.setTimeout( doScrollCheck, 50 );
						}

						// detach all dom ready events
						detach();

						// and execute any waiting functions
						jQuery.ready();
					}
				} )();
			}
		}
	}
	return readyList.promise( obj );
};

// Kick off the DOM ready check even if the user does not
jQuery.ready.promise();




// Support: IE<9
// Iteration over object's inherited properties before its own
var i;
for ( i in jQuery( support ) ) {
	break;
}
support.ownFirst = i === "0";

// Note: most support tests are defined in their respective modules.
// false until the test is run
support.inlineBlockNeedsLayout = false;

// Execute ASAP in case we need to set body.style.zoom
jQuery( function() {

	// Minified: var a,b,c,d
	var val, div, body, container;

	body = document.getElementsByTagName( "body" )[ 0 ];
	if ( !body || !body.style ) {

		// Return for frameset docs that don't have a body
		return;
	}

	// Setup
	div = document.createElement( "div" );
	container = document.createElement( "div" );
	container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px";
	body.appendChild( container ).appendChild( div );

	if ( typeof div.style.zoom !== "undefined" ) {

		// Support: IE<8
		// Check if natively block-level elements act like inline-block
		// elements when setting their display to 'inline' and giving
		// them layout
		div.style.cssText = "display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1";

		support.inlineBlockNeedsLayout = val = div.offsetWidth === 3;
		if ( val ) {

			// Prevent IE 6 from affecting layout for positioned elements #11048
			// Prevent IE from shrinking the body in IE 7 mode #12869
			// Support: IE<8
			body.style.zoom = 1;
		}
	}

	body.removeChild( container );
} );


( function() {
	var div = document.createElement( "div" );

	// Support: IE<9
	support.deleteExpando = true;
	try {
		delete div.test;
	} catch ( e ) {
		support.deleteExpando = false;
	}

	// Null elements to avoid leaks in IE.
	div = null;
} )();
var acceptData = function( elem ) {
	var noData = jQuery.noData[ ( elem.nodeName + " " ).toLowerCase() ],
		nodeType = +elem.nodeType || 1;

	// Do not set data on non-element DOM nodes because it will not be cleared (#8335).
	return nodeType !== 1 && nodeType !== 9 ?
		false :

		// Nodes accept data unless otherwise specified; rejection can be conditional
		!noData || noData !== true && elem.getAttribute( "classid" ) === noData;
};




var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
	rmultiDash = /([A-Z])/g;

function dataAttr( elem, key, data ) {

	// If nothing was found internally, try to fetch any
	// data from the HTML5 data-* attribute
	if ( data === undefined && elem.nodeType === 1 ) {

		var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();

		data = elem.getAttribute( name );

		if ( typeof data === "string" ) {
			try {
				data = data === "true" ? true :
					data === "false" ? false :
					data === "null" ? null :

					// Only convert to a number if it doesn't change the string
					+data + "" === data ? +data :
					rbrace.test( data ) ? jQuery.parseJSON( data ) :
					data;
			} catch ( e ) {}

			// Make sure we set the data so it isn't changed later
			jQuery.data( elem, key, data );

		} else {
			data = undefined;
		}
	}

	return data;
}

// checks a cache object for emptiness
function isEmptyDataObject( obj ) {
	var name;
	for ( name in obj ) {

		// if the public data object is empty, the private is still empty
		if ( name === "data" && jQuery.isEmptyObject( obj[ name ] ) ) {
			continue;
		}
		if ( name !== "toJSON" ) {
			return false;
		}
	}

	return true;
}

function internalData( elem, name, data, pvt /* Internal Use Only */ ) {
	if ( !acceptData( elem ) ) {
		return;
	}

	var ret, thisCache,
		internalKey = jQuery.expando,

		// We have to handle DOM nodes and JS objects differently because IE6-7
		// can't GC object references properly across the DOM-JS boundary
		isNode = elem.nodeType,

		// Only DOM nodes need the global jQuery cache; JS object data is
		// attached directly to the object so GC can occur automatically
		cache = isNode ? jQuery.cache : elem,

		// Only defining an ID for JS objects if its cache already exists allows
		// the code to shortcut on the same path as a DOM node with no cache
		id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;

	// Avoid doing any more work than we need to when trying to get data on an
	// object that has no data at all
	if ( ( !id || !cache[ id ] || ( !pvt && !cache[ id ].data ) ) &&
		data === undefined && typeof name === "string" ) {
		return;
	}

	if ( !id ) {

		// Only DOM nodes need a new unique ID for each element since their data
		// ends up in the global cache
		if ( isNode ) {
			id = elem[ internalKey ] = deletedIds.pop() || jQuery.guid++;
		} else {
			id = internalKey;
		}
	}

	if ( !cache[ id ] ) {

		// Avoid exposing jQuery metadata on plain JS objects when the object
		// is serialized using JSON.stringify
		cache[ id ] = isNode ? {} : { toJSON: jQuery.noop };
	}

	// An object can be passed to jQuery.data instead of a key/value pair; this gets
	// shallow copied over onto the existing cache
	if ( typeof name === "object" || typeof name === "function" ) {
		if ( pvt ) {
			cache[ id ] = jQuery.extend( cache[ id ], name );
		} else {
			cache[ id ].data = jQuery.extend( cache[ id ].data, name );
		}
	}

	thisCache = cache[ id ];

	// jQuery data() is stored in a separate object inside the object's internal data
	// cache in order to avoid key collisions between internal data and user-defined
	// data.
	if ( !pvt ) {
		if ( !thisCache.data ) {
			thisCache.data = {};
		}

		thisCache = thisCache.data;
	}

	if ( data !== undefined ) {
		thisCache[ jQuery.camelCase( name ) ] = data;
	}

	// Check for both converted-to-camel and non-converted data property names
	// If a data property was specified
	if ( typeof name === "string" ) {

		// First Try to find as-is property data
		ret = thisCache[ name ];

		// Test for null|undefined property data
		if ( ret == null ) {

			// Try to find the camelCased property
			ret = thisCache[ jQuery.camelCase( name ) ];
		}
	} else {
		ret = thisCache;
	}

	return ret;
}

function internalRemoveData( elem, name, pvt ) {
	if ( !acceptData( elem ) ) {
		return;
	}

	var thisCache, i,
		isNode = elem.nodeType,

		// See jQuery.data for more information
		cache = isNode ? jQuery.cache : elem,
		id = isNode ? elem[ jQuery.expando ] : jQuery.expando;

	// If there is already no cache entry for this object, there is no
	// purpose in continuing
	if ( !cache[ id ] ) {
		return;
	}

	if ( name ) {

		thisCache = pvt ? cache[ id ] : cache[ id ].data;

		if ( thisCache ) {

			// Support array or space separated string names for data keys
			if ( !jQuery.isArray( name ) ) {

				// try the string as a key before any manipulation
				if ( name in thisCache ) {
					name = [ name ];
				} else {

					// split the camel cased version by spaces unless a key with the spaces exists
					name = jQuery.camelCase( name );
					if ( name in thisCache ) {
						name = [ name ];
					} else {
						name = name.split( " " );
					}
				}
			} else {

				// If "name" is an array of keys...
				// When data is initially created, via ("key", "val") signature,
				// keys will be converted to camelCase.
				// Since there is no way to tell _how_ a key was added, remove
				// both plain key and camelCase key. #12786
				// This will only penalize the array argument path.
				name = name.concat( jQuery.map( name, jQuery.camelCase ) );
			}

			i = name.length;
			while ( i-- ) {
				delete thisCache[ name[ i ] ];
			}

			// If there is no data left in the cache, we want to continue
			// and let the cache object itself get destroyed
			if ( pvt ? !isEmptyDataObject( thisCache ) : !jQuery.isEmptyObject( thisCache ) ) {
				return;
			}
		}
	}

	// See jQuery.data for more information
	if ( !pvt ) {
		delete cache[ id ].data;

		// Don't destroy the parent cache unless the internal data object
		// had been the only thing left in it
		if ( !isEmptyDataObject( cache[ id ] ) ) {
			return;
		}
	}

	// Destroy the cache
	if ( isNode ) {
		jQuery.cleanData( [ elem ], true );

	// Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)
	/* jshint eqeqeq: false */
	} else if ( support.deleteExpando || cache != cache.window ) {
		/* jshint eqeqeq: true */
		delete cache[ id ];

	// When all else fails, undefined
	} else {
		cache[ id ] = undefined;
	}
}

jQuery.extend( {
	cache: {},

	// The following elements (space-suffixed to avoid Object.prototype collisions)
	// throw uncatchable exceptions if you attempt to set expando properties
	noData: {
		"applet ": true,
		"embed ": true,

		// ...but Flash objects (which have this classid) *can* handle expandos
		"object ": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
	},

	hasData: function( elem ) {
		elem = elem.nodeType ? jQuery.cache[ elem[ jQuery.expando ] ] : elem[ jQuery.expando ];
		return !!elem && !isEmptyDataObject( elem );
	},

	data: function( elem, name, data ) {
		return internalData( elem, name, data );
	},

	removeData: function( elem, name ) {
		return internalRemoveData( elem, name );
	},

	// For internal use only.
	_data: function( elem, name, data ) {
		return internalData( elem, name, data, true );
	},

	_removeData: function( elem, name ) {
		return internalRemoveData( elem, name, true );
	}
} );

jQuery.fn.extend( {
	data: function( key, value ) {
		var i, name, data,
			elem = this[ 0 ],
			attrs = elem && elem.attributes;

		// Special expections of .data basically thwart jQuery.access,
		// so implement the relevant behavior ourselves

		// Gets all values
		if ( key === undefined ) {
			if ( this.length ) {
				data = jQuery.data( elem );

				if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
					i = attrs.length;
					while ( i-- ) {

						// Support: IE11+
						// The attrs elements can be null (#14894)
						if ( attrs[ i ] ) {
							name = attrs[ i ].name;
							if ( name.indexOf( "data-" ) === 0 ) {
								name = jQuery.camelCase( name.slice( 5 ) );
								dataAttr( elem, name, data[ name ] );
							}
						}
					}
					jQuery._data( elem, "parsedAttrs", true );
				}
			}

			return data;
		}

		// Sets multiple values
		if ( typeof key === "object" ) {
			return this.each( function() {
				jQuery.data( this, key );
			} );
		}

		return arguments.length > 1 ?

			// Sets one value
			this.each( function() {
				jQuery.data( this, key, value );
			} ) :

			// Gets one value
			// Try to fetch any internally stored data first
			elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : undefined;
	},

	removeData: function( key ) {
		return this.each( function() {
			jQuery.removeData( this, key );
		} );
	}
} );


jQuery.extend( {
	queue: function( elem, type, data ) {
		var queue;

		if ( elem ) {
			type = ( type || "fx" ) + "queue";
			queue = jQuery._data( elem, type );

			// Speed up dequeue by getting out quickly if this is just a lookup
			if ( data ) {
				if ( !queue || jQuery.isArray( data ) ) {
					queue = jQuery._data( elem, type, jQuery.makeArray( data ) );
				} else {
					queue.push( data );
				}
			}
			return queue || [];
		}
	},

	dequeue: function( elem, type ) {
		type = type || "fx";

		var queue = jQuery.queue( elem, type ),
			startLength = queue.length,
			fn = queue.shift(),
			hooks = jQuery._queueHooks( elem, type ),
			next = function() {
				jQuery.dequeue( elem, type );
			};

		// If the fx queue is dequeued, always remove the progress sentinel
		if ( fn === "inprogress" ) {
			fn = queue.shift();
			startLength--;
		}

		if ( fn ) {

			// Add a progress sentinel to prevent the fx queue from being
			// automatically dequeued
			if ( type === "fx" ) {
				queue.unshift( "inprogress" );
			}

			// clear up the last queue stop function
			delete hooks.stop;
			fn.call( elem, next, hooks );
		}

		if ( !startLength && hooks ) {
			hooks.empty.fire();
		}
	},

	// not intended for public consumption - generates a queueHooks object,
	// or returns the current one
	_queueHooks: function( elem, type ) {
		var key = type + "queueHooks";
		return jQuery._data( elem, key ) || jQuery._data( elem, key, {
			empty: jQuery.Callbacks( "once memory" ).add( function() {
				jQuery._removeData( elem, type + "queue" );
				jQuery._removeData( elem, key );
			} )
		} );
	}
} );

jQuery.fn.extend( {
	queue: function( type, data ) {
		var setter = 2;

		if ( typeof type !== "string" ) {
			data = type;
			type = "fx";
			setter--;
		}

		if ( arguments.length < setter ) {
			return jQuery.queue( this[ 0 ], type );
		}

		return data === undefined ?
			this :
			this.each( function() {
				var queue = jQuery.queue( this, type, data );

				// ensure a hooks for this queue
				jQuery._queueHooks( this, type );

				if ( type === "fx" && queue[ 0 ] !== "inprogress" ) {
					jQuery.dequeue( this, type );
				}
			} );
	},
	dequeue: function( type ) {
		return this.each( function() {
			jQuery.dequeue( this, type );
		} );
	},
	clearQueue: function( type ) {
		return this.queue( type || "fx", [] );
	},

	// Get a promise resolved when queues of a certain type
	// are emptied (fx is the type by default)
	promise: function( type, obj ) {
		var tmp,
			count = 1,
			defer = jQuery.Deferred(),
			elements = this,
			i = this.length,
			resolve = function() {
				if ( !( --count ) ) {
					defer.resolveWith( elements, [ elements ] );
				}
			};

		if ( typeof type !== "string" ) {
			obj = type;
			type = undefined;
		}
		type = type || "fx";

		while ( i-- ) {
			tmp = jQuery._data( elements[ i ], type + "queueHooks" );
			if ( tmp && tmp.empty ) {
				count++;
				tmp.empty.add( resolve );
			}
		}
		resolve();
		return defer.promise( obj );
	}
} );


( function() {
	var shrinkWrapBlocksVal;

	support.shrinkWrapBlocks = function() {
		if ( shrinkWrapBlocksVal != null ) {
			return shrinkWrapBlocksVal;
		}

		// Will be changed later if needed.
		shrinkWrapBlocksVal = false;

		// Minified: var b,c,d
		var div, body, container;

		body = document.getElementsByTagName( "body" )[ 0 ];
		if ( !body || !body.style ) {

			// Test fired too early or in an unsupported environment, exit.
			return;
		}

		// Setup
		div = document.createElement( "div" );
		container = document.createElement( "div" );
		container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px";
		body.appendChild( container ).appendChild( div );

		// Support: IE6
		// Check if elements with layout shrink-wrap their children
		if ( typeof div.style.zoom !== "undefined" ) {

			// Reset CSS: box-sizing; display; margin; border
			div.style.cssText =

				// Support: Firefox<29, Android 2.3
				// Vendor-prefix box-sizing
				"-webkit-box-sizing:content-box;-moz-box-sizing:content-box;" +
				"box-sizing:content-box;display:block;margin:0;border:0;" +
				"padding:1px;width:1px;zoom:1";
			div.appendChild( document.createElement( "div" ) ).style.width = "5px";
			shrinkWrapBlocksVal = div.offsetWidth !== 3;
		}

		body.removeChild( container );

		return shrinkWrapBlocksVal;
	};

} )();
var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source;

var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" );


var cssExpand = [ "Top", "Right", "Bottom", "Left" ];

var isHidden = function( elem, el ) {

		// isHidden might be called from jQuery#filter function;
		// in that case, element will be second argument
		elem = el || elem;
		return jQuery.css( elem, "display" ) === "none" ||
			!jQuery.contains( elem.ownerDocument, elem );
	};



function adjustCSS( elem, prop, valueParts, tween ) {
	var adjusted,
		scale = 1,
		maxIterations = 20,
		currentValue = tween ?
			function() { return tween.cur(); } :
			function() { return jQuery.css( elem, prop, "" ); },
		initial = currentValue(),
		unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),

		// Starting value computation is required for potential unit mismatches
		initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
			rcssNum.exec( jQuery.css( elem, prop ) );

	if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {

		// Trust units reported by jQuery.css
		unit = unit || initialInUnit[ 3 ];

		// Make sure we update the tween properties later on
		valueParts = valueParts || [];

		// Iteratively approximate from a nonzero starting point
		initialInUnit = +initial || 1;

		do {

			// If previous iteration zeroed out, double until we get *something*.
			// Use string for doubling so we don't accidentally see scale as unchanged below
			scale = scale || ".5";

			// Adjust and apply
			initialInUnit = initialInUnit / scale;
			jQuery.style( elem, prop, initialInUnit + unit );

		// Update scale, tolerating zero or NaN from tween.cur()
		// Break the loop if scale is unchanged or perfect, or if we've just had enough.
		} while (
			scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations
		);
	}

	if ( valueParts ) {
		initialInUnit = +initialInUnit || +initial || 0;

		// Apply relative offset (+=/-=) if specified
		adjusted = valueParts[ 1 ] ?
			initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :
			+valueParts[ 2 ];
		if ( tween ) {
			tween.unit = unit;
			tween.start = initialInUnit;
			tween.end = adjusted;
		}
	}
	return adjusted;
}


// Multifunctional method to get and set values of a collection
// The value/s can optionally be executed if it's a function
var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
	var i = 0,
		length = elems.length,
		bulk = key == null;

	// Sets many values
	if ( jQuery.type( key ) === "object" ) {
		chainable = true;
		for ( i in key ) {
			access( elems, fn, i, key[ i ], true, emptyGet, raw );
		}

	// Sets one value
	} else if ( value !== undefined ) {
		chainable = true;

		if ( !jQuery.isFunction( value ) ) {
			raw = true;
		}

		if ( bulk ) {

			// Bulk operations run against the entire set
			if ( raw ) {
				fn.call( elems, value );
				fn = null;

			// ...except when executing function values
			} else {
				bulk = fn;
				fn = function( elem, key, value ) {
					return bulk.call( jQuery( elem ), value );
				};
			}
		}

		if ( fn ) {
			for ( ; i < length; i++ ) {
				fn(
					elems[ i ],
					key,
					raw ? value : value.call( elems[ i ], i, fn( elems[ i ], key ) )
				);
			}
		}
	}

	return chainable ?
		elems :

		// Gets
		bulk ?
			fn.call( elems ) :
			length ? fn( elems[ 0 ], key ) : emptyGet;
};
var rcheckableType = ( /^(?:checkbox|radio)$/i );

var rtagName = ( /<([\w:-]+)/ );

var rscriptType = ( /^$|\/(?:java|ecma)script/i );

var rleadingWhitespace = ( /^\s+/ );

var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|" +
		"details|dialog|figcaption|figure|footer|header|hgroup|main|" +
		"mark|meter|nav|output|picture|progress|section|summary|template|time|video";



function createSafeFragment( document ) {
	var list = nodeNames.split( "|" ),
		safeFrag = document.createDocumentFragment();

	if ( safeFrag.createElement ) {
		while ( list.length ) {
			safeFrag.createElement(
				list.pop()
			);
		}
	}
	return safeFrag;
}


( function() {
	var div = document.createElement( "div" ),
		fragment = document.createDocumentFragment(),
		input = document.createElement( "input" );

	// Setup
	div.innerHTML = "  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";

	// IE strips leading whitespace when .innerHTML is used
	support.leadingWhitespace = div.firstChild.nodeType === 3;

	// Make sure that tbody elements aren't automatically inserted
	// IE will insert them into empty tables
	support.tbody = !div.getElementsByTagName( "tbody" ).length;

	// Make sure that link elements get serialized correctly by innerHTML
	// This requires a wrapper element in IE
	support.htmlSerialize = !!div.getElementsByTagName( "link" ).length;

	// Makes sure cloning an html5 element does not cause problems
	// Where outerHTML is undefined, this still works
	support.html5Clone =
		document.createElement( "nav" ).cloneNode( true ).outerHTML !== "<:nav></:nav>";

	// Check if a disconnected checkbox will retain its checked
	// value of true after appended to the DOM (IE6/7)
	input.type = "checkbox";
	input.checked = true;
	fragment.appendChild( input );
	support.appendChecked = input.checked;

	// Make sure textarea (and checkbox) defaultValue is properly cloned
	// Support: IE6-IE11+
	div.innerHTML = "<textarea>x</textarea>";
	support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;

	// #11217 - WebKit loses check when the name is after the checked attribute
	fragment.appendChild( div );

	// Support: Windows Web Apps (WWA)
	// `name` and `type` must use .setAttribute for WWA (#14901)
	input = document.createElement( "input" );
	input.setAttribute( "type", "radio" );
	input.setAttribute( "checked", "checked" );
	input.setAttribute( "name", "t" );

	div.appendChild( input );

	// Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3
	// old WebKit doesn't clone checked state correctly in fragments
	support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;

	// Support: IE<9
	// Cloned elements keep attachEvent handlers, we use addEventListener on IE9+
	support.noCloneEvent = !!div.addEventListener;

	// Support: IE<9
	// Since attributes and properties are the same in IE,
	// cleanData must set properties to undefined rather than use removeAttribute
	div[ jQuery.expando ] = 1;
	support.attributes = !div.getAttribute( jQuery.expando );
} )();


// We have to close these tags to support XHTML (#13200)
var wrapMap = {
	option: [ 1, "<select multiple='multiple'>", "</select>" ],
	legend: [ 1, "<fieldset>", "</fieldset>" ],
	area: [ 1, "<map>", "</map>" ],

	// Support: IE8
	param: [ 1, "<object>", "</object>" ],
	thead: [ 1, "<table>", "</table>" ],
	tr: [ 2, "<table><tbody>", "</tbody></table>" ],
	col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
	td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],

	// IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,
	// unless wrapped in a div with non-breaking characters in front of it.
	_default: support.htmlSerialize ? [ 0, "", "" ] : [ 1, "X<div>", "</div>" ]
};

// Support: IE8-IE9
wrapMap.optgroup = wrapMap.option;

wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
wrapMap.th = wrapMap.td;


function getAll( context, tag ) {
	var elems, elem,
		i = 0,
		found = typeof context.getElementsByTagName !== "undefined" ?
			context.getElementsByTagName( tag || "*" ) :
			typeof context.querySelectorAll !== "undefined" ?
				context.querySelectorAll( tag || "*" ) :
				undefined;

	if ( !found ) {
		for ( found = [], elems = context.childNodes || context;
			( elem = elems[ i ] ) != null;
			i++
		) {
			if ( !tag || jQuery.nodeName( elem, tag ) ) {
				found.push( elem );
			} else {
				jQuery.merge( found, getAll( elem, tag ) );
			}
		}
	}

	return tag === undefined || tag && jQuery.nodeName( context, tag ) ?
		jQuery.merge( [ context ], found ) :
		found;
}


// Mark scripts as having already been evaluated
function setGlobalEval( elems, refElements ) {
	var elem,
		i = 0;
	for ( ; ( elem = elems[ i ] ) != null; i++ ) {
		jQuery._data(
			elem,
			"globalEval",
			!refElements || jQuery._data( refElements[ i ], "globalEval" )
		);
	}
}


var rhtml = /<|&#?\w+;/,
	rtbody = /<tbody/i;

function fixDefaultChecked( elem ) {
	if ( rcheckableType.test( elem.type ) ) {
		elem.defaultChecked = elem.checked;
	}
}

function buildFragment( elems, context, scripts, selection, ignored ) {
	var j, elem, contains,
		tmp, tag, tbody, wrap,
		l = elems.length,

		// Ensure a safe fragment
		safe = createSafeFragment( context ),

		nodes = [],
		i = 0;

	for ( ; i < l; i++ ) {
		elem = elems[ i ];

		if ( elem || elem === 0 ) {

			// Add nodes directly
			if ( jQuery.type( elem ) === "object" ) {
				jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );

			// Convert non-html into a text node
			} else if ( !rhtml.test( elem ) ) {
				nodes.push( context.createTextNode( elem ) );

			// Convert html into DOM nodes
			} else {
				tmp = tmp || safe.appendChild( context.createElement( "div" ) );

				// Deserialize a standard representation
				tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
				wrap = wrapMap[ tag ] || wrapMap._default;

				tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];

				// Descend through wrappers to the right content
				j = wrap[ 0 ];
				while ( j-- ) {
					tmp = tmp.lastChild;
				}

				// Manually add leading whitespace removed by IE
				if ( !support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
					nodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[ 0 ] ) );
				}

				// Remove IE's autoinserted <tbody> from table fragments
				if ( !support.tbody ) {

					// String was a <table>, *may* have spurious <tbody>
					elem = tag === "table" && !rtbody.test( elem ) ?
						tmp.firstChild :

						// String was a bare <thead> or <tfoot>
						wrap[ 1 ] === "<table>" && !rtbody.test( elem ) ?
							tmp :
							0;

					j = elem && elem.childNodes.length;
					while ( j-- ) {
						if ( jQuery.nodeName( ( tbody = elem.childNodes[ j ] ), "tbody" ) &&
							!tbody.childNodes.length ) {

							elem.removeChild( tbody );
						}
					}
				}

				jQuery.merge( nodes, tmp.childNodes );

				// Fix #12392 for WebKit and IE > 9
				tmp.textContent = "";

				// Fix #12392 for oldIE
				while ( tmp.firstChild ) {
					tmp.removeChild( tmp.firstChild );
				}

				// Remember the top-level container for proper cleanup
				tmp = safe.lastChild;
			}
		}
	}

	// Fix #11356: Clear elements from fragment
	if ( tmp ) {
		safe.removeChild( tmp );
	}

	// Reset defaultChecked for any radios and checkboxes
	// about to be appended to the DOM in IE 6/7 (#8060)
	if ( !support.appendChecked ) {
		jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked );
	}

	i = 0;
	while ( ( elem = nodes[ i++ ] ) ) {

		// Skip elements already in the context collection (trac-4087)
		if ( selection && jQuery.inArray( elem, selection ) > -1 ) {
			if ( ignored ) {
				ignored.push( elem );
			}

			continue;
		}

		contains = jQuery.contains( elem.ownerDocument, elem );

		// Append to fragment
		tmp = getAll( safe.appendChild( elem ), "script" );

		// Preserve script evaluation history
		if ( contains ) {
			setGlobalEval( tmp );
		}

		// Capture executables
		if ( scripts ) {
			j = 0;
			while ( ( elem = tmp[ j++ ] ) ) {
				if ( rscriptType.test( elem.type || "" ) ) {
					scripts.push( elem );
				}
			}
		}
	}

	tmp = null;

	return safe;
}


( function() {
	var i, eventName,
		div = document.createElement( "div" );

	// Support: IE<9 (lack submit/change bubble), Firefox (lack focus(in | out) events)
	for ( i in { submit: true, change: true, focusin: true } ) {
		eventName = "on" + i;

		if ( !( support[ i ] = eventName in window ) ) {

			// Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP)
			div.setAttribute( eventName, "t" );
			support[ i ] = div.attributes[ eventName ].expando === false;
		}
	}

	// Null elements to avoid leaks in IE.
	div = null;
} )();


var rformElems = /^(?:input|select|textarea)$/i,
	rkeyEvent = /^key/,
	rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
	rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
	rtypenamespace = /^([^.]*)(?:\.(.+)|)/;

function returnTrue() {
	return true;
}

function returnFalse() {
	return false;
}

// Support: IE9
// See #13393 for more info
function safeActiveElement() {
	try {
		return document.activeElement;
	} catch ( err ) { }
}

function on( elem, types, selector, data, fn, one ) {
	var origFn, type;

	// Types can be a map of types/handlers
	if ( typeof types === "object" ) {

		// ( types-Object, selector, data )
		if ( typeof selector !== "string" ) {

			// ( types-Object, data )
			data = data || selector;
			selector = undefined;
		}
		for ( type in types ) {
			on( elem, type, selector, data, types[ type ], one );
		}
		return elem;
	}

	if ( data == null && fn == null ) {

		// ( types, fn )
		fn = selector;
		data = selector = undefined;
	} else if ( fn == null ) {
		if ( typeof selector === "string" ) {

			// ( types, selector, fn )
			fn = data;
			data = undefined;
		} else {

			// ( types, data, fn )
			fn = data;
			data = selector;
			selector = undefined;
		}
	}
	if ( fn === false ) {
		fn = returnFalse;
	} else if ( !fn ) {
		return elem;
	}

	if ( one === 1 ) {
		origFn = fn;
		fn = function( event ) {

			// Can use an empty set, since event contains the info
			jQuery().off( event );
			return origFn.apply( this, arguments );
		};

		// Use same guid so caller can remove using origFn
		fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
	}
	return elem.each( function() {
		jQuery.event.add( this, types, fn, data, selector );
	} );
}

/*
 * Helper functions for managing events -- not part of the public interface.
 * Props to Dean Edwards' addEvent library for many of the ideas.
 */
jQuery.event = {

	global: {},

	add: function( elem, types, handler, data, selector ) {
		var tmp, events, t, handleObjIn,
			special, eventHandle, handleObj,
			handlers, type, namespaces, origType,
			elemData = jQuery._data( elem );

		// Don't attach events to noData or text/comment nodes (but allow plain objects)
		if ( !elemData ) {
			return;
		}

		// Caller can pass in an object of custom data in lieu of the handler
		if ( handler.handler ) {
			handleObjIn = handler;
			handler = handleObjIn.handler;
			selector = handleObjIn.selector;
		}

		// Make sure that the handler has a unique ID, used to find/remove it later
		if ( !handler.guid ) {
			handler.guid = jQuery.guid++;
		}

		// Init the element's event structure and main handler, if this is the first
		if ( !( events = elemData.events ) ) {
			events = elemData.events = {};
		}
		if ( !( eventHandle = elemData.handle ) ) {
			eventHandle = elemData.handle = function( e ) {

				// Discard the second event of a jQuery.event.trigger() and
				// when an event is called after a page has unloaded
				return typeof jQuery !== "undefined" &&
					( !e || jQuery.event.triggered !== e.type ) ?
					jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
					undefined;
			};

			// Add elem as a property of the handle fn to prevent a memory leak
			// with IE non-native events
			eventHandle.elem = elem;
		}

		// Handle multiple events separated by a space
		types = ( types || "" ).match( rnotwhite ) || [ "" ];
		t = types.length;
		while ( t-- ) {
			tmp = rtypenamespace.exec( types[ t ] ) || [];
			type = origType = tmp[ 1 ];
			namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();

			// There *must* be a type, no attaching namespace-only handlers
			if ( !type ) {
				continue;
			}

			// If event changes its type, use the special event handlers for the changed type
			special = jQuery.event.special[ type ] || {};

			// If selector defined, determine special event api type, otherwise given type
			type = ( selector ? special.delegateType : special.bindType ) || type;

			// Update special based on newly reset type
			special = jQuery.event.special[ type ] || {};

			// handleObj is passed to all event handlers
			handleObj = jQuery.extend( {
				type: type,
				origType: origType,
				data: data,
				handler: handler,
				guid: handler.guid,
				selector: selector,
				needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
				namespace: namespaces.join( "." )
			}, handleObjIn );

			// Init the event handler queue if we're the first
			if ( !( handlers = events[ type ] ) ) {
				handlers = events[ type ] = [];
				handlers.delegateCount = 0;

				// Only use addEventListener/attachEvent if the special events handler returns false
				if ( !special.setup ||
					special.setup.call( elem, data, namespaces, eventHandle ) === false ) {

					// Bind the global event handler to the element
					if ( elem.addEventListener ) {
						elem.addEventListener( type, eventHandle, false );

					} else if ( elem.attachEvent ) {
						elem.attachEvent( "on" + type, eventHandle );
					}
				}
			}

			if ( special.add ) {
				special.add.call( elem, handleObj );

				if ( !handleObj.handler.guid ) {
					handleObj.handler.guid = handler.guid;
				}
			}

			// Add to the element's handler list, delegates in front
			if ( selector ) {
				handlers.splice( handlers.delegateCount++, 0, handleObj );
			} else {
				handlers.push( handleObj );
			}

			// Keep track of which events have ever been used, for event optimization
			jQuery.event.global[ type ] = true;
		}

		// Nullify elem to prevent memory leaks in IE
		elem = null;
	},

	// Detach an event or set of events from an element
	remove: function( elem, types, handler, selector, mappedTypes ) {
		var j, handleObj, tmp,
			origCount, t, events,
			special, handlers, type,
			namespaces, origType,
			elemData = jQuery.hasData( elem ) && jQuery._data( elem );

		if ( !elemData || !( events = elemData.events ) ) {
			return;
		}

		// Once for each type.namespace in types; type may be omitted
		types = ( types || "" ).match( rnotwhite ) || [ "" ];
		t = types.length;
		while ( t-- ) {
			tmp = rtypenamespace.exec( types[ t ] ) || [];
			type = origType = tmp[ 1 ];
			namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();

			// Unbind all events (on this namespace, if provided) for the element
			if ( !type ) {
				for ( type in events ) {
					jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
				}
				continue;
			}

			special = jQuery.event.special[ type ] || {};
			type = ( selector ? special.delegateType : special.bindType ) || type;
			handlers = events[ type ] || [];
			tmp = tmp[ 2 ] &&
				new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" );

			// Remove matching events
			origCount = j = handlers.length;
			while ( j-- ) {
				handleObj = handlers[ j ];

				if ( ( mappedTypes || origType === handleObj.origType ) &&
					( !handler || handler.guid === handleObj.guid ) &&
					( !tmp || tmp.test( handleObj.namespace ) ) &&
					( !selector || selector === handleObj.selector ||
						selector === "**" && handleObj.selector ) ) {
					handlers.splice( j, 1 );

					if ( handleObj.selector ) {
						handlers.delegateCount--;
					}
					if ( special.remove ) {
						special.remove.call( elem, handleObj );
					}
				}
			}

			// Remove generic event handler if we removed something and no more handlers exist
			// (avoids potential for endless recursion during removal of special event handlers)
			if ( origCount && !handlers.length ) {
				if ( !special.teardown ||
					special.teardown.call( elem, namespaces, elemData.handle ) === false ) {

					jQuery.removeEvent( elem, type, elemData.handle );
				}

				delete events[ type ];
			}
		}

		// Remove the expando if it's no longer used
		if ( jQuery.isEmptyObject( events ) ) {
			delete elemData.handle;

			// removeData also checks for emptiness and clears the expando if empty
			// so use it instead of delete
			jQuery._removeData( elem, "events" );
		}
	},

	trigger: function( event, data, elem, onlyHandlers ) {
		var handle, ontype, cur,
			bubbleType, special, tmp, i,
			eventPath = [ elem || document ],
			type = hasOwn.call( event, "type" ) ? event.type : event,
			namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : [];

		cur = tmp = elem = elem || document;

		// Don't do events on text and comment nodes
		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
			return;
		}

		// focus/blur morphs to focusin/out; ensure we're not firing them right now
		if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
			return;
		}

		if ( type.indexOf( "." ) > -1 ) {

			// Namespaced trigger; create a regexp to match event type in handle()
			namespaces = type.split( "." );
			type = namespaces.shift();
			namespaces.sort();
		}
		ontype = type.indexOf( ":" ) < 0 && "on" + type;

		// Caller can pass in a jQuery.Event object, Object, or just an event type string
		event = event[ jQuery.expando ] ?
			event :
			new jQuery.Event( type, typeof event === "object" && event );

		// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
		event.isTrigger = onlyHandlers ? 2 : 3;
		event.namespace = namespaces.join( "." );
		event.rnamespace = event.namespace ?
			new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) :
			null;

		// Clean up the event in case it is being reused
		event.result = undefined;
		if ( !event.target ) {
			event.target = elem;
		}

		// Clone any incoming data and prepend the event, creating the handler arg list
		data = data == null ?
			[ event ] :
			jQuery.makeArray( data, [ event ] );

		// Allow special events to draw outside the lines
		special = jQuery.event.special[ type ] || {};
		if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
			return;
		}

		// Determine event propagation path in advance, per W3C events spec (#9951)
		// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
		if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {

			bubbleType = special.delegateType || type;
			if ( !rfocusMorph.test( bubbleType + type ) ) {
				cur = cur.parentNode;
			}
			for ( ; cur; cur = cur.parentNode ) {
				eventPath.push( cur );
				tmp = cur;
			}

			// Only add window if we got to document (e.g., not plain obj or detached DOM)
			if ( tmp === ( elem.ownerDocument || document ) ) {
				eventPath.push( tmp.defaultView || tmp.parentWindow || window );
			}
		}

		// Fire handlers on the event path
		i = 0;
		while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {

			event.type = i > 1 ?
				bubbleType :
				special.bindType || type;

			// jQuery handler
			handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] &&
				jQuery._data( cur, "handle" );

			if ( handle ) {
				handle.apply( cur, data );
			}

			// Native handler
			handle = ontype && cur[ ontype ];
			if ( handle && handle.apply && acceptData( cur ) ) {
				event.result = handle.apply( cur, data );
				if ( event.result === false ) {
					event.preventDefault();
				}
			}
		}
		event.type = type;

		// If nobody prevented the default action, do it now
		if ( !onlyHandlers && !event.isDefaultPrevented() ) {

			if (
				( !special._default ||
				 special._default.apply( eventPath.pop(), data ) === false
				) && acceptData( elem )
			) {

				// Call a native DOM method on the target with the same name name as the event.
				// Can't use an .isFunction() check here because IE6/7 fails that test.
				// Don't do default actions on window, that's where global variables be (#6170)
				if ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) {

					// Don't re-trigger an onFOO event when we call its FOO() method
					tmp = elem[ ontype ];

					if ( tmp ) {
						elem[ ontype ] = null;
					}

					// Prevent re-triggering of the same event, since we already bubbled it above
					jQuery.event.triggered = type;
					try {
						elem[ type ]();
					} catch ( e ) {

						// IE<9 dies on focus/blur to hidden element (#1486,#12518)
						// only reproducible on winXP IE8 native, not IE9 in IE8 mode
					}
					jQuery.event.triggered = undefined;

					if ( tmp ) {
						elem[ ontype ] = tmp;
					}
				}
			}
		}

		return event.result;
	},

	dispatch: function( event ) {

		// Make a writable jQuery.Event from the native event object
		event = jQuery.event.fix( event );

		var i, j, ret, matched, handleObj,
			handlerQueue = [],
			args = slice.call( arguments ),
			handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [],
			special = jQuery.event.special[ event.type ] || {};

		// Use the fix-ed jQuery.Event rather than the (read-only) native event
		args[ 0 ] = event;
		event.delegateTarget = this;

		// Call the preDispatch hook for the mapped type, and let it bail if desired
		if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
			return;
		}

		// Determine handlers
		handlerQueue = jQuery.event.handlers.call( this, event, handlers );

		// Run delegates first; they may want to stop propagation beneath us
		i = 0;
		while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {
			event.currentTarget = matched.elem;

			j = 0;
			while ( ( handleObj = matched.handlers[ j++ ] ) &&
				!event.isImmediatePropagationStopped() ) {

				// Triggered event must either 1) have no namespace, or 2) have namespace(s)
				// a subset or equal to those in the bound event (both can have no namespace).
				if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) {

					event.handleObj = handleObj;
					event.data = handleObj.data;

					ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||
						handleObj.handler ).apply( matched.elem, args );

					if ( ret !== undefined ) {
						if ( ( event.result = ret ) === false ) {
							event.preventDefault();
							event.stopPropagation();
						}
					}
				}
			}
		}

		// Call the postDispatch hook for the mapped type
		if ( special.postDispatch ) {
			special.postDispatch.call( this, event );
		}

		return event.result;
	},

	handlers: function( event, handlers ) {
		var i, matches, sel, handleObj,
			handlerQueue = [],
			delegateCount = handlers.delegateCount,
			cur = event.target;

		// Support (at least): Chrome, IE9
		// Find delegate handlers
		// Black-hole SVG <use> instance trees (#13180)
		//
		// Support: Firefox<=42+
		// Avoid non-left-click in FF but don't block IE radio events (#3861, gh-2343)
		if ( delegateCount && cur.nodeType &&
			( event.type !== "click" || isNaN( event.button ) || event.button < 1 ) ) {

			/* jshint eqeqeq: false */
			for ( ; cur != this; cur = cur.parentNode || this ) {
				/* jshint eqeqeq: true */

				// Don't check non-elements (#13208)
				// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
				if ( cur.nodeType === 1 && ( cur.disabled !== true || event.type !== "click" ) ) {
					matches = [];
					for ( i = 0; i < delegateCount; i++ ) {
						handleObj = handlers[ i ];

						// Don't conflict with Object.prototype properties (#13203)
						sel = handleObj.selector + " ";

						if ( matches[ sel ] === undefined ) {
							matches[ sel ] = handleObj.needsContext ?
								jQuery( sel, this ).index( cur ) > -1 :
								jQuery.find( sel, this, null, [ cur ] ).length;
						}
						if ( matches[ sel ] ) {
							matches.push( handleObj );
						}
					}
					if ( matches.length ) {
						handlerQueue.push( { elem: cur, handlers: matches } );
					}
				}
			}
		}

		// Add the remaining (directly-bound) handlers
		if ( delegateCount < handlers.length ) {
			handlerQueue.push( { elem: this, handlers: handlers.slice( delegateCount ) } );
		}

		return handlerQueue;
	},

	fix: function( event ) {
		if ( event[ jQuery.expando ] ) {
			return event;
		}

		// Create a writable copy of the event object and normalize some properties
		var i, prop, copy,
			type = event.type,
			originalEvent = event,
			fixHook = this.fixHooks[ type ];

		if ( !fixHook ) {
			this.fixHooks[ type ] = fixHook =
				rmouseEvent.test( type ) ? this.mouseHooks :
				rkeyEvent.test( type ) ? this.keyHooks :
				{};
		}
		copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;

		event = new jQuery.Event( originalEvent );

		i = copy.length;
		while ( i-- ) {
			prop = copy[ i ];
			event[ prop ] = originalEvent[ prop ];
		}

		// Support: IE<9
		// Fix target property (#1925)
		if ( !event.target ) {
			event.target = originalEvent.srcElement || document;
		}

		// Support: Safari 6-8+
		// Target should not be a text node (#504, #13143)
		if ( event.target.nodeType === 3 ) {
			event.target = event.target.parentNode;
		}

		// Support: IE<9
		// For mouse/key events, metaKey==false if it's undefined (#3368, #11328)
		event.metaKey = !!event.metaKey;

		return fixHook.filter ? fixHook.filter( event, originalEvent ) : event;
	},

	// Includes some event props shared by KeyEvent and MouseEvent
	props: ( "altKey bubbles cancelable ctrlKey currentTarget detail eventPhase " +
		"metaKey relatedTarget shiftKey target timeStamp view which" ).split( " " ),

	fixHooks: {},

	keyHooks: {
		props: "char charCode key keyCode".split( " " ),
		filter: function( event, original ) {

			// Add which for key events
			if ( event.which == null ) {
				event.which = original.charCode != null ? original.charCode : original.keyCode;
			}

			return event;
		}
	},

	mouseHooks: {
		props: ( "button buttons clientX clientY fromElement offsetX offsetY " +
			"pageX pageY screenX screenY toElement" ).split( " " ),
		filter: function( event, original ) {
			var body, eventDoc, doc,
				button = original.button,
				fromElement = original.fromElement;

			// Calculate pageX/Y if missing and clientX/Y available
			if ( event.pageX == null && original.clientX != null ) {
				eventDoc = event.target.ownerDocument || document;
				doc = eventDoc.documentElement;
				body = eventDoc.body;

				event.pageX = original.clientX +
					( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) -
					( doc && doc.clientLeft || body && body.clientLeft || 0 );
				event.pageY = original.clientY +
					( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) -
					( doc && doc.clientTop  || body && body.clientTop  || 0 );
			}

			// Add relatedTarget, if necessary
			if ( !event.relatedTarget && fromElement ) {
				event.relatedTarget = fromElement === event.target ?
					original.toElement :
					fromElement;
			}

			// Add which for click: 1 === left; 2 === middle; 3 === right
			// Note: button is not normalized, so don't use it
			if ( !event.which && button !== undefined ) {
				event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
			}

			return event;
		}
	},

	special: {
		load: {

			// Prevent triggered image.load events from bubbling to window.load
			noBubble: true
		},
		focus: {

			// Fire native event if possible so blur/focus sequence is correct
			trigger: function() {
				if ( this !== safeActiveElement() && this.focus ) {
					try {
						this.focus();
						return false;
					} catch ( e ) {

						// Support: IE<9
						// If we error on focus to hidden element (#1486, #12518),
						// let .trigger() run the handlers
					}
				}
			},
			delegateType: "focusin"
		},
		blur: {
			trigger: function() {
				if ( this === safeActiveElement() && this.blur ) {
					this.blur();
					return false;
				}
			},
			delegateType: "focusout"
		},
		click: {

			// For checkbox, fire native event so checked state will be right
			trigger: function() {
				if ( jQuery.nodeName( this, "input" ) && this.type === "checkbox" && this.click ) {
					this.click();
					return false;
				}
			},

			// For cross-browser consistency, don't fire native .click() on links
			_default: function( event ) {
				return jQuery.nodeName( event.target, "a" );
			}
		},

		beforeunload: {
			postDispatch: function( event ) {

				// Support: Firefox 20+
				// Firefox doesn't alert if the returnValue field is not set.
				if ( event.result !== undefined && event.originalEvent ) {
					event.originalEvent.returnValue = event.result;
				}
			}
		}
	},

	// Piggyback on a donor event to simulate a different one
	simulate: function( type, elem, event ) {
		var e = jQuery.extend(
			new jQuery.Event(),
			event,
			{
				type: type,
				isSimulated: true

				// Previously, `originalEvent: {}` was set here, so stopPropagation call
				// would not be triggered on donor event, since in our own
				// jQuery.event.stopPropagation function we had a check for existence of
				// originalEvent.stopPropagation method, so, consequently it would be a noop.
				//
				// Guard for simulated events was moved to jQuery.event.stopPropagation function
				// since `originalEvent` should point to the original event for the
				// constancy with other events and for more focused logic
			}
		);

		jQuery.event.trigger( e, null, elem );

		if ( e.isDefaultPrevented() ) {
			event.preventDefault();
		}
	}
};

jQuery.removeEvent = document.removeEventListener ?
	function( elem, type, handle ) {

		// This "if" is needed for plain objects
		if ( elem.removeEventListener ) {
			elem.removeEventListener( type, handle );
		}
	} :
	function( elem, type, handle ) {
		var name = "on" + type;

		if ( elem.detachEvent ) {

			// #8545, #7054, preventing memory leaks for custom events in IE6-8
			// detachEvent needed property on element, by name of that event,
			// to properly expose it to GC
			if ( typeof elem[ name ] === "undefined" ) {
				elem[ name ] = null;
			}

			elem.detachEvent( name, handle );
		}
	};

jQuery.Event = function( src, props ) {

	// Allow instantiation without the 'new' keyword
	if ( !( this instanceof jQuery.Event ) ) {
		return new jQuery.Event( src, props );
	}

	// Event object
	if ( src && src.type ) {
		this.originalEvent = src;
		this.type = src.type;

		// Events bubbling up the document may have been marked as prevented
		// by a handler lower down the tree; reflect the correct value.
		this.isDefaultPrevented = src.defaultPrevented ||
				src.defaultPrevented === undefined &&

				// Support: IE < 9, Android < 4.0
				src.returnValue === false ?
			returnTrue :
			returnFalse;

	// Event type
	} else {
		this.type = src;
	}

	// Put explicitly provided properties onto the event object
	if ( props ) {
		jQuery.extend( this, props );
	}

	// Create a timestamp if incoming event doesn't have one
	this.timeStamp = src && src.timeStamp || jQuery.now();

	// Mark it as fixed
	this[ jQuery.expando ] = true;
};

// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
jQuery.Event.prototype = {
	constructor: jQuery.Event,
	isDefaultPrevented: returnFalse,
	isPropagationStopped: returnFalse,
	isImmediatePropagationStopped: returnFalse,

	preventDefault: function() {
		var e = this.originalEvent;

		this.isDefaultPrevented = returnTrue;
		if ( !e ) {
			return;
		}

		// If preventDefault exists, run it on the original event
		if ( e.preventDefault ) {
			e.preventDefault();

		// Support: IE
		// Otherwise set the returnValue property of the original event to false
		} else {
			e.returnValue = false;
		}
	},
	stopPropagation: function() {
		var e = this.originalEvent;

		this.isPropagationStopped = returnTrue;

		if ( !e || this.isSimulated ) {
			return;
		}

		// If stopPropagation exists, run it on the original event
		if ( e.stopPropagation ) {
			e.stopPropagation();
		}

		// Support: IE
		// Set the cancelBubble property of the original event to true
		e.cancelBubble = true;
	},
	stopImmediatePropagation: function() {
		var e = this.originalEvent;

		this.isImmediatePropagationStopped = returnTrue;

		if ( e && e.stopImmediatePropagation ) {
			e.stopImmediatePropagation();
		}

		this.stopPropagation();
	}
};

// Create mouseenter/leave events using mouseover/out and event-time checks
// so that event delegation works in jQuery.
// Do the same for pointerenter/pointerleave and pointerover/pointerout
//
// Support: Safari 7 only
// Safari sends mouseenter too often; see:
// https://code.google.com/p/chromium/issues/detail?id=470258
// for the description of the bug (it existed in older Chrome versions as well).
jQuery.each( {
	mouseenter: "mouseover",
	mouseleave: "mouseout",
	pointerenter: "pointerover",
	pointerleave: "pointerout"
}, function( orig, fix ) {
	jQuery.event.special[ orig ] = {
		delegateType: fix,
		bindType: fix,

		handle: function( event ) {
			var ret,
				target = this,
				related = event.relatedTarget,
				handleObj = event.handleObj;

			// For mouseenter/leave call the handler if related is outside the target.
			// NB: No relatedTarget if the mouse left/entered the browser window
			if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {
				event.type = handleObj.origType;
				ret = handleObj.handler.apply( this, arguments );
				event.type = fix;
			}
			return ret;
		}
	};
} );

// IE submit delegation
if ( !support.submit ) {

	jQuery.event.special.submit = {
		setup: function() {

			// Only need this for delegated form submit events
			if ( jQuery.nodeName( this, "form" ) ) {
				return false;
			}

			// Lazy-add a submit handler when a descendant form may potentially be submitted
			jQuery.event.add( this, "click._submit keypress._submit", function( e ) {

				// Node name check avoids a VML-related crash in IE (#9807)
				var elem = e.target,
					form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ?

						// Support: IE <=8
						// We use jQuery.prop instead of elem.form
						// to allow fixing the IE8 delegated submit issue (gh-2332)
						// by 3rd party polyfills/workarounds.
						jQuery.prop( elem, "form" ) :
						undefined;

				if ( form && !jQuery._data( form, "submit" ) ) {
					jQuery.event.add( form, "submit._submit", function( event ) {
						event._submitBubble = true;
					} );
					jQuery._data( form, "submit", true );
				}
			} );

			// return undefined since we don't need an event listener
		},

		postDispatch: function( event ) {

			// If form was submitted by the user, bubble the event up the tree
			if ( event._submitBubble ) {
				delete event._submitBubble;
				if ( this.parentNode && !event.isTrigger ) {
					jQuery.event.simulate( "submit", this.parentNode, event );
				}
			}
		},

		teardown: function() {

			// Only need this for delegated form submit events
			if ( jQuery.nodeName( this, "form" ) ) {
				return false;
			}

			// Remove delegated handlers; cleanData eventually reaps submit handlers attached above
			jQuery.event.remove( this, "._submit" );
		}
	};
}

// IE change delegation and checkbox/radio fix
if ( !support.change ) {

	jQuery.event.special.change = {

		setup: function() {

			if ( rformElems.test( this.nodeName ) ) {

				// IE doesn't fire change on a check/radio until blur; trigger it on click
				// after a propertychange. Eat the blur-change in special.change.handle.
				// This still fires onchange a second time for check/radio after blur.
				if ( this.type === "checkbox" || this.type === "radio" ) {
					jQuery.event.add( this, "propertychange._change", function( event ) {
						if ( event.originalEvent.propertyName === "checked" ) {
							this._justChanged = true;
						}
					} );
					jQuery.event.add( this, "click._change", function( event ) {
						if ( this._justChanged && !event.isTrigger ) {
							this._justChanged = false;
						}

						// Allow triggered, simulated change events (#11500)
						jQuery.event.simulate( "change", this, event );
					} );
				}
				return false;
			}

			// Delegated event; lazy-add a change handler on descendant inputs
			jQuery.event.add( this, "beforeactivate._change", function( e ) {
				var elem = e.target;

				if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "change" ) ) {
					jQuery.event.add( elem, "change._change", function( event ) {
						if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
							jQuery.event.simulate( "change", this.parentNode, event );
						}
					} );
					jQuery._data( elem, "change", true );
				}
			} );
		},

		handle: function( event ) {
			var elem = event.target;

			// Swallow native change events from checkbox/radio, we already triggered them above
			if ( this !== elem || event.isSimulated || event.isTrigger ||
				( elem.type !== "radio" && elem.type !== "checkbox" ) ) {

				return event.handleObj.handler.apply( this, arguments );
			}
		},

		teardown: function() {
			jQuery.event.remove( this, "._change" );

			return !rformElems.test( this.nodeName );
		}
	};
}

// Support: Firefox
// Firefox doesn't have focus(in | out) events
// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
//
// Support: Chrome, Safari
// focus(in | out) events fire after focus & blur events,
// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order
// Related ticket - https://code.google.com/p/chromium/issues/detail?id=449857
if ( !support.focusin ) {
	jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) {

		// Attach a single capturing handler on the document while someone wants focusin/focusout
		var handler = function( event ) {
			jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );
		};

		jQuery.event.special[ fix ] = {
			setup: function() {
				var doc = this.ownerDocument || this,
					attaches = jQuery._data( doc, fix );

				if ( !attaches ) {
					doc.addEventListener( orig, handler, true );
				}
				jQuery._data( doc, fix, ( attaches || 0 ) + 1 );
			},
			teardown: function() {
				var doc = this.ownerDocument || this,
					attaches = jQuery._data( doc, fix ) - 1;

				if ( !attaches ) {
					doc.removeEventListener( orig, handler, true );
					jQuery._removeData( doc, fix );
				} else {
					jQuery._data( doc, fix, attaches );
				}
			}
		};
	} );
}

jQuery.fn.extend( {

	on: function( types, selector, data, fn ) {
		return on( this, types, selector, data, fn );
	},
	one: function( types, selector, data, fn ) {
		return on( this, types, selector, data, fn, 1 );
	},
	off: function( types, selector, fn ) {
		var handleObj, type;
		if ( types && types.preventDefault && types.handleObj ) {

			// ( event )  dispatched jQuery.Event
			handleObj = types.handleObj;
			jQuery( types.delegateTarget ).off(
				handleObj.namespace ?
					handleObj.origType + "." + handleObj.namespace :
					handleObj.origType,
				handleObj.selector,
				handleObj.handler
			);
			return this;
		}
		if ( typeof types === "object" ) {

			// ( types-object [, selector] )
			for ( type in types ) {
				this.off( type, selector, types[ type ] );
			}
			return this;
		}
		if ( selector === false || typeof selector === "function" ) {

			// ( types [, fn] )
			fn = selector;
			selector = undefined;
		}
		if ( fn === false ) {
			fn = returnFalse;
		}
		return this.each( function() {
			jQuery.event.remove( this, types, fn, selector );
		} );
	},

	trigger: function( type, data ) {
		return this.each( function() {
			jQuery.event.trigger( type, data, this );
		} );
	},
	triggerHandler: function( type, data ) {
		var elem = this[ 0 ];
		if ( elem ) {
			return jQuery.event.trigger( type, data, elem, true );
		}
	}
} );


var rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g,
	rnoshimcache = new RegExp( "<(?:" + nodeNames + ")[\\s/>]", "i" ),
	rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,

	// Support: IE 10-11, Edge 10240+
	// In IE/Edge using regex groups here causes severe slowdowns.
	// See https://connect.microsoft.com/IE/feedback/details/1736512/
	rnoInnerhtml = /<script|<style|<link/i,

	// checked="checked" or checked
	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
	rscriptTypeMasked = /^true\/(.*)/,
	rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,
	safeFragment = createSafeFragment( document ),
	fragmentDiv = safeFragment.appendChild( document.createElement( "div" ) );

// Support: IE<8
// Manipulating tables requires a tbody
function manipulationTarget( elem, content ) {
	return jQuery.nodeName( elem, "table" ) &&
		jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ?

		elem.getElementsByTagName( "tbody" )[ 0 ] ||
			elem.appendChild( elem.ownerDocument.createElement( "tbody" ) ) :
		elem;
}

// Replace/restore the type attribute of script elements for safe DOM manipulation
function disableScript( elem ) {
	elem.type = ( jQuery.find.attr( elem, "type" ) !== null ) + "/" + elem.type;
	return elem;
}
function restoreScript( elem ) {
	var match = rscriptTypeMasked.exec( elem.type );
	if ( match ) {
		elem.type = match[ 1 ];
	} else {
		elem.removeAttribute( "type" );
	}
	return elem;
}

function cloneCopyEvent( src, dest ) {
	if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
		return;
	}

	var type, i, l,
		oldData = jQuery._data( src ),
		curData = jQuery._data( dest, oldData ),
		events = oldData.events;

	if ( events ) {
		delete curData.handle;
		curData.events = {};

		for ( type in events ) {
			for ( i = 0, l = events[ type ].length; i < l; i++ ) {
				jQuery.event.add( dest, type, events[ type ][ i ] );
			}
		}
	}

	// make the cloned public data object a copy from the original
	if ( curData.data ) {
		curData.data = jQuery.extend( {}, curData.data );
	}
}

function fixCloneNodeIssues( src, dest ) {
	var nodeName, e, data;

	// We do not need to do anything for non-Elements
	if ( dest.nodeType !== 1 ) {
		return;
	}

	nodeName = dest.nodeName.toLowerCase();

	// IE6-8 copies events bound via attachEvent when using cloneNode.
	if ( !support.noCloneEvent && dest[ jQuery.expando ] ) {
		data = jQuery._data( dest );

		for ( e in data.events ) {
			jQuery.removeEvent( dest, e, data.handle );
		}

		// Event data gets referenced instead of copied if the expando gets copied too
		dest.removeAttribute( jQuery.expando );
	}

	// IE blanks contents when cloning scripts, and tries to evaluate newly-set text
	if ( nodeName === "script" && dest.text !== src.text ) {
		disableScript( dest ).text = src.text;
		restoreScript( dest );

	// IE6-10 improperly clones children of object elements using classid.
	// IE10 throws NoModificationAllowedError if parent is null, #12132.
	} else if ( nodeName === "object" ) {
		if ( dest.parentNode ) {
			dest.outerHTML = src.outerHTML;
		}

		// This path appears unavoidable for IE9. When cloning an object
		// element in IE9, the outerHTML strategy above is not sufficient.
		// If the src has innerHTML and the destination does not,
		// copy the src.innerHTML into the dest.innerHTML. #10324
		if ( support.html5Clone && ( src.innerHTML && !jQuery.trim( dest.innerHTML ) ) ) {
			dest.innerHTML = src.innerHTML;
		}

	} else if ( nodeName === "input" && rcheckableType.test( src.type ) ) {

		// IE6-8 fails to persist the checked state of a cloned checkbox
		// or radio button. Worse, IE6-7 fail to give the cloned element
		// a checked appearance if the defaultChecked value isn't also set

		dest.defaultChecked = dest.checked = src.checked;

		// IE6-7 get confused and end up setting the value of a cloned
		// checkbox/radio button to an empty string instead of "on"
		if ( dest.value !== src.value ) {
			dest.value = src.value;
		}

	// IE6-8 fails to return the selected option to the default selected
	// state when cloning options
	} else if ( nodeName === "option" ) {
		dest.defaultSelected = dest.selected = src.defaultSelected;

	// IE6-8 fails to set the defaultValue to the correct value when
	// cloning other types of input fields
	} else if ( nodeName === "input" || nodeName === "textarea" ) {
		dest.defaultValue = src.defaultValue;
	}
}

function domManip( collection, args, callback, ignored ) {

	// Flatten any nested arrays
	args = concat.apply( [], args );

	var first, node, hasScripts,
		scripts, doc, fragment,
		i = 0,
		l = collection.length,
		iNoClone = l - 1,
		value = args[ 0 ],
		isFunction = jQuery.isFunction( value );

	// We can't cloneNode fragments that contain checked, in WebKit
	if ( isFunction ||
			( l > 1 && typeof value === "string" &&
				!support.checkClone && rchecked.test( value ) ) ) {
		return collection.each( function( index ) {
			var self = collection.eq( index );
			if ( isFunction ) {
				args[ 0 ] = value.call( this, index, self.html() );
			}
			domManip( self, args, callback, ignored );
		} );
	}

	if ( l ) {
		fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );
		first = fragment.firstChild;

		if ( fragment.childNodes.length === 1 ) {
			fragment = first;
		}

		// Require either new content or an interest in ignored elements to invoke the callback
		if ( first || ignored ) {
			scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
			hasScripts = scripts.length;

			// Use the original fragment for the last item
			// instead of the first because it can end up
			// being emptied incorrectly in certain situations (#8070).
			for ( ; i < l; i++ ) {
				node = fragment;

				if ( i !== iNoClone ) {
					node = jQuery.clone( node, true, true );

					// Keep references to cloned scripts for later restoration
					if ( hasScripts ) {

						// Support: Android<4.1, PhantomJS<2
						// push.apply(_, arraylike) throws on ancient WebKit
						jQuery.merge( scripts, getAll( node, "script" ) );
					}
				}

				callback.call( collection[ i ], node, i );
			}

			if ( hasScripts ) {
				doc = scripts[ scripts.length - 1 ].ownerDocument;

				// Reenable scripts
				jQuery.map( scripts, restoreScript );

				// Evaluate executable scripts on first document insertion
				for ( i = 0; i < hasScripts; i++ ) {
					node = scripts[ i ];
					if ( rscriptType.test( node.type || "" ) &&
						!jQuery._data( node, "globalEval" ) &&
						jQuery.contains( doc, node ) ) {

						if ( node.src ) {

							// Optional AJAX dependency, but won't run scripts if not present
							if ( jQuery._evalUrl ) {
								jQuery._evalUrl( node.src );
							}
						} else {
							jQuery.globalEval(
								( node.text || node.textContent || node.innerHTML || "" )
									.replace( rcleanScript, "" )
							);
						}
					}
				}
			}

			// Fix #11809: Avoid leaking memory
			fragment = first = null;
		}
	}

	return collection;
}

function remove( elem, selector, keepData ) {
	var node,
		elems = selector ? jQuery.filter( selector, elem ) : elem,
		i = 0;

	for ( ; ( node = elems[ i ] ) != null; i++ ) {

		if ( !keepData && node.nodeType === 1 ) {
			jQuery.cleanData( getAll( node ) );
		}

		if ( node.parentNode ) {
			if ( keepData && jQuery.contains( node.ownerDocument, node ) ) {
				setGlobalEval( getAll( node, "script" ) );
			}
			node.parentNode.removeChild( node );
		}
	}

	return elem;
}

jQuery.extend( {
	htmlPrefilter: function( html ) {
		return html.replace( rxhtmlTag, "<$1></$2>" );
	},

	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
		var destElements, node, clone, i, srcElements,
			inPage = jQuery.contains( elem.ownerDocument, elem );

		if ( support.html5Clone || jQuery.isXMLDoc( elem ) ||
			!rnoshimcache.test( "<" + elem.nodeName + ">" ) ) {

			clone = elem.cloneNode( true );

		// IE<=8 does not properly clone detached, unknown element nodes
		} else {
			fragmentDiv.innerHTML = elem.outerHTML;
			fragmentDiv.removeChild( clone = fragmentDiv.firstChild );
		}

		if ( ( !support.noCloneEvent || !support.noCloneChecked ) &&
				( elem.nodeType === 1 || elem.nodeType === 11 ) && !jQuery.isXMLDoc( elem ) ) {

			// We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2
			destElements = getAll( clone );
			srcElements = getAll( elem );

			// Fix all IE cloning issues
			for ( i = 0; ( node = srcElements[ i ] ) != null; ++i ) {

				// Ensure that the destination node is not null; Fixes #9587
				if ( destElements[ i ] ) {
					fixCloneNodeIssues( node, destElements[ i ] );
				}
			}
		}

		// Copy the events from the original to the clone
		if ( dataAndEvents ) {
			if ( deepDataAndEvents ) {
				srcElements = srcElements || getAll( elem );
				destElements = destElements || getAll( clone );

				for ( i = 0; ( node = srcElements[ i ] ) != null; i++ ) {
					cloneCopyEvent( node, destElements[ i ] );
				}
			} else {
				cloneCopyEvent( elem, clone );
			}
		}

		// Preserve script evaluation history
		destElements = getAll( clone, "script" );
		if ( destElements.length > 0 ) {
			setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
		}

		destElements = srcElements = node = null;

		// Return the cloned set
		return clone;
	},

	cleanData: function( elems, /* internal */ forceAcceptData ) {
		var elem, type, id, data,
			i = 0,
			internalKey = jQuery.expando,
			cache = jQuery.cache,
			attributes = support.attributes,
			special = jQuery.event.special;

		for ( ; ( elem = elems[ i ] ) != null; i++ ) {
			if ( forceAcceptData || acceptData( elem ) ) {

				id = elem[ internalKey ];
				data = id && cache[ id ];

				if ( data ) {
					if ( data.events ) {
						for ( type in data.events ) {
							if ( special[ type ] ) {
								jQuery.event.remove( elem, type );

							// This is a shortcut to avoid jQuery.event.remove's overhead
							} else {
								jQuery.removeEvent( elem, type, data.handle );
							}
						}
					}

					// Remove cache only if it was not already removed by jQuery.event.remove
					if ( cache[ id ] ) {

						delete cache[ id ];

						// Support: IE<9
						// IE does not allow us to delete expando properties from nodes
						// IE creates expando attributes along with the property
						// IE does not have a removeAttribute function on Document nodes
						if ( !attributes && typeof elem.removeAttribute !== "undefined" ) {
							elem.removeAttribute( internalKey );

						// Webkit & Blink performance suffers when deleting properties
						// from DOM nodes, so set to undefined instead
						// https://code.google.com/p/chromium/issues/detail?id=378607
						} else {
							elem[ internalKey ] = undefined;
						}

						deletedIds.push( id );
					}
				}
			}
		}
	}
} );

jQuery.fn.extend( {

	// Keep domManip exposed until 3.0 (gh-2225)
	domManip: domManip,

	detach: function( selector ) {
		return remove( this, selector, true );
	},

	remove: function( selector ) {
		return remove( this, selector );
	},

	text: function( value ) {
		return access( this, function( value ) {
			return value === undefined ?
				jQuery.text( this ) :
				this.empty().append(
					( this[ 0 ] && this[ 0 ].ownerDocument || document ).createTextNode( value )
				);
		}, null, value, arguments.length );
	},

	append: function() {
		return domManip( this, arguments, function( elem ) {
			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
				var target = manipulationTarget( this, elem );
				target.appendChild( elem );
			}
		} );
	},

	prepend: function() {
		return domManip( this, arguments, function( elem ) {
			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
				var target = manipulationTarget( this, elem );
				target.insertBefore( elem, target.firstChild );
			}
		} );
	},

	before: function() {
		return domManip( this, arguments, function( elem ) {
			if ( this.parentNode ) {
				this.parentNode.insertBefore( elem, this );
			}
		} );
	},

	after: function() {
		return domManip( this, arguments, function( elem ) {
			if ( this.parentNode ) {
				this.parentNode.insertBefore( elem, this.nextSibling );
			}
		} );
	},

	empty: function() {
		var elem,
			i = 0;

		for ( ; ( elem = this[ i ] ) != null; i++ ) {

			// Remove element nodes and prevent memory leaks
			if ( elem.nodeType === 1 ) {
				jQuery.cleanData( getAll( elem, false ) );
			}

			// Remove any remaining nodes
			while ( elem.firstChild ) {
				elem.removeChild( elem.firstChild );
			}

			// If this is a select, ensure that it displays empty (#12336)
			// Support: IE<9
			if ( elem.options && jQuery.nodeName( elem, "select" ) ) {
				elem.options.length = 0;
			}
		}

		return this;
	},

	clone: function( dataAndEvents, deepDataAndEvents ) {
		dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
		deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;

		return this.map( function() {
			return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
		} );
	},

	html: function( value ) {
		return access( this, function( value ) {
			var elem = this[ 0 ] || {},
				i = 0,
				l = this.length;

			if ( value === undefined ) {
				return elem.nodeType === 1 ?
					elem.innerHTML.replace( rinlinejQuery, "" ) :
					undefined;
			}

			// See if we can take a shortcut and just use innerHTML
			if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
				( support.htmlSerialize || !rnoshimcache.test( value )  ) &&
				( support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&
				!wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {

				value = jQuery.htmlPrefilter( value );

				try {
					for ( ; i < l; i++ ) {

						// Remove element nodes and prevent memory leaks
						elem = this[ i ] || {};
						if ( elem.nodeType === 1 ) {
							jQuery.cleanData( getAll( elem, false ) );
							elem.innerHTML = value;
						}
					}

					elem = 0;

				// If using innerHTML throws an exception, use the fallback method
				} catch ( e ) {}
			}

			if ( elem ) {
				this.empty().append( value );
			}
		}, null, value, arguments.length );
	},

	replaceWith: function() {
		var ignored = [];

		// Make the changes, replacing each non-ignored context element with the new content
		return domManip( this, arguments, function( elem ) {
			var parent = this.parentNode;

			if ( jQuery.inArray( this, ignored ) < 0 ) {
				jQuery.cleanData( getAll( this ) );
				if ( parent ) {
					parent.replaceChild( elem, this );
				}
			}

		// Force callback invocation
		}, ignored );
	}
} );

jQuery.each( {
	appendTo: "append",
	prependTo: "prepend",
	insertBefore: "before",
	insertAfter: "after",
	replaceAll: "replaceWith"
}, function( name, original ) {
	jQuery.fn[ name ] = function( selector ) {
		var elems,
			i = 0,
			ret = [],
			insert = jQuery( selector ),
			last = insert.length - 1;

		for ( ; i <= last; i++ ) {
			elems = i === last ? this : this.clone( true );
			jQuery( insert[ i ] )[ original ]( elems );

			// Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get()
			push.apply( ret, elems.get() );
		}

		return this.pushStack( ret );
	};
} );


var iframe,
	elemdisplay = {

		// Support: Firefox
		// We have to pre-define these values for FF (#10227)
		HTML: "block",
		BODY: "block"
	};

/**
 * Retrieve the actual display of a element
 * @param {String} name nodeName of the element
 * @param {Object} doc Document object
 */

// Called only from within defaultDisplay
function actualDisplay( name, doc ) {
	var elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),

		display = jQuery.css( elem[ 0 ], "display" );

	// We don't have any data stored on the element,
	// so use "detach" method as fast way to get rid of the element
	elem.detach();

	return display;
}

/**
 * Try to determine the default display value of an element
 * @param {String} nodeName
 */
function defaultDisplay( nodeName ) {
	var doc = document,
		display = elemdisplay[ nodeName ];

	if ( !display ) {
		display = actualDisplay( nodeName, doc );

		// If the simple way fails, read from inside an iframe
		if ( display === "none" || !display ) {

			// Use the already-created iframe if possible
			iframe = ( iframe || jQuery( "<iframe frameborder='0' width='0' height='0'/>" ) )
				.appendTo( doc.documentElement );

			// Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse
			doc = ( iframe[ 0 ].contentWindow || iframe[ 0 ].contentDocument ).document;

			// Support: IE
			doc.write();
			doc.close();

			display = actualDisplay( nodeName, doc );
			iframe.detach();
		}

		// Store the correct default display
		elemdisplay[ nodeName ] = display;
	}

	return display;
}
var rmargin = ( /^margin/ );

var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );

var swap = function( elem, options, callback, args ) {
	var ret, name,
		old = {};

	// Remember the old values, and insert the new ones
	for ( name in options ) {
		old[ name ] = elem.style[ name ];
		elem.style[ name ] = options[ name ];
	}

	ret = callback.apply( elem, args || [] );

	// Revert the old values
	for ( name in options ) {
		elem.style[ name ] = old[ name ];
	}

	return ret;
};


var documentElement = document.documentElement;



( function() {
	var pixelPositionVal, pixelMarginRightVal, boxSizingReliableVal,
		reliableHiddenOffsetsVal, reliableMarginRightVal, reliableMarginLeftVal,
		container = document.createElement( "div" ),
		div = document.createElement( "div" );

	// Finish early in limited (non-browser) environments
	if ( !div.style ) {
		return;
	}

	div.style.cssText = "float:left;opacity:.5";

	// Support: IE<9
	// Make sure that element opacity exists (as opposed to filter)
	support.opacity = div.style.opacity === "0.5";

	// Verify style float existence
	// (IE uses styleFloat instead of cssFloat)
	support.cssFloat = !!div.style.cssFloat;

	div.style.backgroundClip = "content-box";
	div.cloneNode( true ).style.backgroundClip = "";
	support.clearCloneStyle = div.style.backgroundClip === "content-box";

	container = document.createElement( "div" );
	container.style.cssText = "border:0;width:8px;height:0;top:0;left:-9999px;" +
		"padding:0;margin-top:1px;position:absolute";
	div.innerHTML = "";
	container.appendChild( div );

	// Support: Firefox<29, Android 2.3
	// Vendor-prefix box-sizing
	support.boxSizing = div.style.boxSizing === "" || div.style.MozBoxSizing === "" ||
		div.style.WebkitBoxSizing === "";

	jQuery.extend( support, {
		reliableHiddenOffsets: function() {
			if ( pixelPositionVal == null ) {
				computeStyleTests();
			}
			return reliableHiddenOffsetsVal;
		},

		boxSizingReliable: function() {

			// We're checking for pixelPositionVal here instead of boxSizingReliableVal
			// since that compresses better and they're computed together anyway.
			if ( pixelPositionVal == null ) {
				computeStyleTests();
			}
			return boxSizingReliableVal;
		},

		pixelMarginRight: function() {

			// Support: Android 4.0-4.3
			if ( pixelPositionVal == null ) {
				computeStyleTests();
			}
			return pixelMarginRightVal;
		},

		pixelPosition: function() {
			if ( pixelPositionVal == null ) {
				computeStyleTests();
			}
			return pixelPositionVal;
		},

		reliableMarginRight: function() {

			// Support: Android 2.3
			if ( pixelPositionVal == null ) {
				computeStyleTests();
			}
			return reliableMarginRightVal;
		},

		reliableMarginLeft: function() {

			// Support: IE <=8 only, Android 4.0 - 4.3 only, Firefox <=3 - 37
			if ( pixelPositionVal == null ) {
				computeStyleTests();
			}
			return reliableMarginLeftVal;
		}
	} );

	function computeStyleTests() {
		var contents, divStyle,
			documentElement = document.documentElement;

		// Setup
		documentElement.appendChild( container );

		div.style.cssText =

			// Support: Android 2.3
			// Vendor-prefix box-sizing
			"-webkit-box-sizing:border-box;box-sizing:border-box;" +
			"position:relative;display:block;" +
			"margin:auto;border:1px;padding:1px;" +
			"top:1%;width:50%";

		// Support: IE<9
		// Assume reasonable values in the absence of getComputedStyle
		pixelPositionVal = boxSizingReliableVal = reliableMarginLeftVal = false;
		pixelMarginRightVal = reliableMarginRightVal = true;

		// Check for getComputedStyle so that this code is not run in IE<9.
		if ( window.getComputedStyle ) {
			divStyle = window.getComputedStyle( div );
			pixelPositionVal = ( divStyle || {} ).top !== "1%";
			reliableMarginLeftVal = ( divStyle || {} ).marginLeft === "2px";
			boxSizingReliableVal = ( divStyle || { width: "4px" } ).width === "4px";

			// Support: Android 4.0 - 4.3 only
			// Some styles come back with percentage values, even though they shouldn't
			div.style.marginRight = "50%";
			pixelMarginRightVal = ( divStyle || { marginRight: "4px" } ).marginRight === "4px";

			// Support: Android 2.3 only
			// Div with explicit width and no margin-right incorrectly
			// gets computed margin-right based on width of container (#3333)
			// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
			contents = div.appendChild( document.createElement( "div" ) );

			// Reset CSS: box-sizing; display; margin; border; padding
			contents.style.cssText = div.style.cssText =

				// Support: Android 2.3
				// Vendor-prefix box-sizing
				"-webkit-box-sizing:content-box;-moz-box-sizing:content-box;" +
				"box-sizing:content-box;display:block;margin:0;border:0;padding:0";
			contents.style.marginRight = contents.style.width = "0";
			div.style.width = "1px";

			reliableMarginRightVal =
				!parseFloat( ( window.getComputedStyle( contents ) || {} ).marginRight );

			div.removeChild( contents );
		}

		// Support: IE6-8
		// First check that getClientRects works as expected
		// Check if table cells still have offsetWidth/Height when they are set
		// to display:none and there are still other visible table cells in a
		// table row; if so, offsetWidth/Height are not reliable for use when
		// determining if an element has been hidden directly using
		// display:none (it is still safe to use offsets if a parent element is
		// hidden; don safety goggles and see bug #4512 for more information).
		div.style.display = "none";
		reliableHiddenOffsetsVal = div.getClientRects().length === 0;
		if ( reliableHiddenOffsetsVal ) {
			div.style.display = "";
			div.innerHTML = "<table><tr><td></td><td>t</td></tr></table>";
			div.childNodes[ 0 ].style.borderCollapse = "separate";
			contents = div.getElementsByTagName( "td" );
			contents[ 0 ].style.cssText = "margin:0;border:0;padding:0;display:none";
			reliableHiddenOffsetsVal = contents[ 0 ].offsetHeight === 0;
			if ( reliableHiddenOffsetsVal ) {
				contents[ 0 ].style.display = "";
				contents[ 1 ].style.display = "none";
				reliableHiddenOffsetsVal = contents[ 0 ].offsetHeight === 0;
			}
		}

		// Teardown
		documentElement.removeChild( container );
	}

} )();


var getStyles, curCSS,
	rposition = /^(top|right|bottom|left)$/;

if ( window.getComputedStyle ) {
	getStyles = function( elem ) {

		// Support: IE<=11+, Firefox<=30+ (#15098, #14150)
		// IE throws on elements created in popups
		// FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
		var view = elem.ownerDocument.defaultView;

		if ( !view || !view.opener ) {
			view = window;
		}

		return view.getComputedStyle( elem );
	};

	curCSS = function( elem, name, computed ) {
		var width, minWidth, maxWidth, ret,
			style = elem.style;

		computed = computed || getStyles( elem );

		// getPropertyValue is only needed for .css('filter') in IE9, see #12537
		ret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined;

		// Support: Opera 12.1x only
		// Fall back to style even without computed
		// computed is undefined for elems on document fragments
		if ( ( ret === "" || ret === undefined ) && !jQuery.contains( elem.ownerDocument, elem ) ) {
			ret = jQuery.style( elem, name );
		}

		if ( computed ) {

			// A tribute to the "awesome hack by Dean Edwards"
			// Chrome < 17 and Safari 5.0 uses "computed value"
			// instead of "used value" for margin-right
			// Safari 5.1.7 (at least) returns percentage for a larger set of values,
			// but width seems to be reliably pixels
			// this is against the CSSOM draft spec:
			// http://dev.w3.org/csswg/cssom/#resolved-values
			if ( !support.pixelMarginRight() && rnumnonpx.test( ret ) && rmargin.test( name ) ) {

				// Remember the original values
				width = style.width;
				minWidth = style.minWidth;
				maxWidth = style.maxWidth;

				// Put in the new values to get a computed value out
				style.minWidth = style.maxWidth = style.width = ret;
				ret = computed.width;

				// Revert the changed values
				style.width = width;
				style.minWidth = minWidth;
				style.maxWidth = maxWidth;
			}
		}

		// Support: IE
		// IE returns zIndex value as an integer.
		return ret === undefined ?
			ret :
			ret + "";
	};
} else if ( documentElement.currentStyle ) {
	getStyles = function( elem ) {
		return elem.currentStyle;
	};

	curCSS = function( elem, name, computed ) {
		var left, rs, rsLeft, ret,
			style = elem.style;

		computed = computed || getStyles( elem );
		ret = computed ? computed[ name ] : undefined;

		// Avoid setting ret to empty string here
		// so we don't default to auto
		if ( ret == null && style && style[ name ] ) {
			ret = style[ name ];
		}

		// From the awesome hack by Dean Edwards
		// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291

		// If we're not dealing with a regular pixel number
		// but a number that has a weird ending, we need to convert it to pixels
		// but not position css attributes, as those are
		// proportional to the parent element instead
		// and we can't measure the parent instead because it
		// might trigger a "stacking dolls" problem
		if ( rnumnonpx.test( ret ) && !rposition.test( name ) ) {

			// Remember the original values
			left = style.left;
			rs = elem.runtimeStyle;
			rsLeft = rs && rs.left;

			// Put in the new values to get a computed value out
			if ( rsLeft ) {
				rs.left = elem.currentStyle.left;
			}
			style.left = name === "fontSize" ? "1em" : ret;
			ret = style.pixelLeft + "px";

			// Revert the changed values
			style.left = left;
			if ( rsLeft ) {
				rs.left = rsLeft;
			}
		}

		// Support: IE
		// IE returns zIndex value as an integer.
		return ret === undefined ?
			ret :
			ret + "" || "auto";
	};
}




function addGetHookIf( conditionFn, hookFn ) {

	// Define the hook, we'll check on the first run if it's really needed.
	return {
		get: function() {
			if ( conditionFn() ) {

				// Hook not needed (or it's not possible to use it due
				// to missing dependency), remove it.
				delete this.get;
				return;
			}

			// Hook needed; redefine it so that the support test is not executed again.
			return ( this.get = hookFn ).apply( this, arguments );
		}
	};
}


var

		ralpha = /alpha\([^)]*\)/i,
	ropacity = /opacity\s*=\s*([^)]*)/i,

	// swappable if display is none or starts with table except
	// "table", "table-cell", or "table-caption"
	// see here for display values:
	// https://developer.mozilla.org/en-US/docs/CSS/display
	rdisplayswap = /^(none|table(?!-c[ea]).+)/,
	rnumsplit = new RegExp( "^(" + pnum + ")(.*)$", "i" ),

	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
	cssNormalTransform = {
		letterSpacing: "0",
		fontWeight: "400"
	},

	cssPrefixes = [ "Webkit", "O", "Moz", "ms" ],
	emptyStyle = document.createElement( "div" ).style;


// return a css property mapped to a potentially vendor prefixed property
function vendorPropName( name ) {

	// shortcut for names that are not vendor prefixed
	if ( name in emptyStyle ) {
		return name;
	}

	// check for vendor prefixed names
	var capName = name.charAt( 0 ).toUpperCase() + name.slice( 1 ),
		i = cssPrefixes.length;

	while ( i-- ) {
		name = cssPrefixes[ i ] + capName;
		if ( name in emptyStyle ) {
			return name;
		}
	}
}

function showHide( elements, show ) {
	var display, elem, hidden,
		values = [],
		index = 0,
		length = elements.length;

	for ( ; index < length; index++ ) {
		elem = elements[ index ];
		if ( !elem.style ) {
			continue;
		}

		values[ index ] = jQuery._data( elem, "olddisplay" );
		display = elem.style.display;
		if ( show ) {

			// Reset the inline display of this element to learn if it is
			// being hidden by cascaded rules or not
			if ( !values[ index ] && display === "none" ) {
				elem.style.display = "";
			}

			// Set elements which have been overridden with display: none
			// in a stylesheet to whatever the default browser style is
			// for such an element
			if ( elem.style.display === "" && isHidden( elem ) ) {
				values[ index ] =
					jQuery._data( elem, "olddisplay", defaultDisplay( elem.nodeName ) );
			}
		} else {
			hidden = isHidden( elem );

			if ( display && display !== "none" || !hidden ) {
				jQuery._data(
					elem,
					"olddisplay",
					hidden ? display : jQuery.css( elem, "display" )
				);
			}
		}
	}

	// Set the display of most of the elements in a second loop
	// to avoid the constant reflow
	for ( index = 0; index < length; index++ ) {
		elem = elements[ index ];
		if ( !elem.style ) {
			continue;
		}
		if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
			elem.style.display = show ? values[ index ] || "" : "none";
		}
	}

	return elements;
}

function setPositiveNumber( elem, value, subtract ) {
	var matches = rnumsplit.exec( value );
	return matches ?

		// Guard against undefined "subtract", e.g., when used as in cssHooks
		Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) :
		value;
}

function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
	var i = extra === ( isBorderBox ? "border" : "content" ) ?

		// If we already have the right measurement, avoid augmentation
		4 :

		// Otherwise initialize for horizontal or vertical properties
		name === "width" ? 1 : 0,

		val = 0;

	for ( ; i < 4; i += 2 ) {

		// both box models exclude margin, so add it if we want it
		if ( extra === "margin" ) {
			val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
		}

		if ( isBorderBox ) {

			// border-box includes padding, so remove it if we want content
			if ( extra === "content" ) {
				val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
			}

			// at this point, extra isn't border nor margin, so remove border
			if ( extra !== "margin" ) {
				val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
			}
		} else {

			// at this point, extra isn't content, so add padding
			val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );

			// at this point, extra isn't content nor padding, so add border
			if ( extra !== "padding" ) {
				val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
			}
		}
	}

	return val;
}

function getWidthOrHeight( elem, name, extra ) {

	// Start with offset property, which is equivalent to the border-box value
	var valueIsBorderBox = true,
		val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
		styles = getStyles( elem ),
		isBorderBox = support.boxSizing &&
			jQuery.css( elem, "boxSizing", false, styles ) === "border-box";

	// some non-html elements return undefined for offsetWidth, so check for null/undefined
	// svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
	// MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
	if ( val <= 0 || val == null ) {

		// Fall back to computed then uncomputed css if necessary
		val = curCSS( elem, name, styles );
		if ( val < 0 || val == null ) {
			val = elem.style[ name ];
		}

		// Computed unit is not pixels. Stop here and return.
		if ( rnumnonpx.test( val ) ) {
			return val;
		}

		// we need the check for style in case a browser which returns unreliable values
		// for getComputedStyle silently falls back to the reliable elem.style
		valueIsBorderBox = isBorderBox &&
			( support.boxSizingReliable() || val === elem.style[ name ] );

		// Normalize "", auto, and prepare for extra
		val = parseFloat( val ) || 0;
	}

	// use the active box-sizing model to add/subtract irrelevant styles
	return ( val +
		augmentWidthOrHeight(
			elem,
			name,
			extra || ( isBorderBox ? "border" : "content" ),
			valueIsBorderBox,
			styles
		)
	) + "px";
}

jQuery.extend( {

	// Add in style property hooks for overriding the default
	// behavior of getting and setting a style property
	cssHooks: {
		opacity: {
			get: function( elem, computed ) {
				if ( computed ) {

					// We should always get a number back from opacity
					var ret = curCSS( elem, "opacity" );
					return ret === "" ? "1" : ret;
				}
			}
		}
	},

	// Don't automatically add "px" to these possibly-unitless properties
	cssNumber: {
		"animationIterationCount": true,
		"columnCount": true,
		"fillOpacity": true,
		"flexGrow": true,
		"flexShrink": true,
		"fontWeight": true,
		"lineHeight": true,
		"opacity": true,
		"order": true,
		"orphans": true,
		"widows": true,
		"zIndex": true,
		"zoom": true
	},

	// Add in properties whose names you wish to fix before
	// setting or getting the value
	cssProps: {

		// normalize float css property
		"float": support.cssFloat ? "cssFloat" : "styleFloat"
	},

	// Get and set the style property on a DOM Node
	style: function( elem, name, value, extra ) {

		// Don't set styles on text and comment nodes
		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
			return;
		}

		// Make sure that we're working with the right name
		var ret, type, hooks,
			origName = jQuery.camelCase( name ),
			style = elem.style;

		name = jQuery.cssProps[ origName ] ||
			( jQuery.cssProps[ origName ] = vendorPropName( origName ) || origName );

		// gets hook for the prefixed version
		// followed by the unprefixed version
		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];

		// Check if we're setting a value
		if ( value !== undefined ) {
			type = typeof value;

			// Convert "+=" or "-=" to relative numbers (#7345)
			if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {
				value = adjustCSS( elem, name, ret );

				// Fixes bug #9237
				type = "number";
			}

			// Make sure that null and NaN values aren't set. See: #7116
			if ( value == null || value !== value ) {
				return;
			}

			// If a number was passed in, add the unit (except for certain CSS properties)
			if ( type === "number" ) {
				value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" );
			}

			// Fixes #8908, it can be done more correctly by specifing setters in cssHooks,
			// but it would mean to define eight
			// (for every problematic property) identical functions
			if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
				style[ name ] = "inherit";
			}

			// If a hook was provided, use that value, otherwise just set the specified value
			if ( !hooks || !( "set" in hooks ) ||
				( value = hooks.set( elem, value, extra ) ) !== undefined ) {

				// Support: IE
				// Swallow errors from 'invalid' CSS values (#5509)
				try {
					style[ name ] = value;
				} catch ( e ) {}
			}

		} else {

			// If a hook was provided get the non-computed value from there
			if ( hooks && "get" in hooks &&
				( ret = hooks.get( elem, false, extra ) ) !== undefined ) {

				return ret;
			}

			// Otherwise just get the value from the style object
			return style[ name ];
		}
	},

	css: function( elem, name, extra, styles ) {
		var num, val, hooks,
			origName = jQuery.camelCase( name );

		// Make sure that we're working with the right name
		name = jQuery.cssProps[ origName ] ||
			( jQuery.cssProps[ origName ] = vendorPropName( origName ) || origName );

		// gets hook for the prefixed version
		// followed by the unprefixed version
		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];

		// If a hook was provided get the computed value from there
		if ( hooks && "get" in hooks ) {
			val = hooks.get( elem, true, extra );
		}

		// Otherwise, if a way to get the computed value exists, use that
		if ( val === undefined ) {
			val = curCSS( elem, name, styles );
		}

		//convert "normal" to computed value
		if ( val === "normal" && name in cssNormalTransform ) {
			val = cssNormalTransform[ name ];
		}

		// Return, converting to number if forced or a qualifier was provided and val looks numeric
		if ( extra === "" || extra ) {
			num = parseFloat( val );
			return extra === true || isFinite( num ) ? num || 0 : val;
		}
		return val;
	}
} );

jQuery.each( [ "height", "width" ], function( i, name ) {
	jQuery.cssHooks[ name ] = {
		get: function( elem, computed, extra ) {
			if ( computed ) {

				// certain elements can have dimension info if we invisibly show them
				// however, it must have a current display style that would benefit from this
				return rdisplayswap.test( jQuery.css( elem, "display" ) ) &&
					elem.offsetWidth === 0 ?
						swap( elem, cssShow, function() {
							return getWidthOrHeight( elem, name, extra );
						} ) :
						getWidthOrHeight( elem, name, extra );
			}
		},

		set: function( elem, value, extra ) {
			var styles = extra && getStyles( elem );
			return setPositiveNumber( elem, value, extra ?
				augmentWidthOrHeight(
					elem,
					name,
					extra,
					support.boxSizing &&
						jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
					styles
				) : 0
			);
		}
	};
} );

if ( !support.opacity ) {
	jQuery.cssHooks.opacity = {
		get: function( elem, computed ) {

			// IE uses filters for opacity
			return ropacity.test( ( computed && elem.currentStyle ?
				elem.currentStyle.filter :
				elem.style.filter ) || "" ) ?
					( 0.01 * parseFloat( RegExp.$1 ) ) + "" :
					computed ? "1" : "";
		},

		set: function( elem, value ) {
			var style = elem.style,
				currentStyle = elem.currentStyle,
				opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",
				filter = currentStyle && currentStyle.filter || style.filter || "";

			// IE has trouble with opacity if it does not have layout
			// Force it by setting the zoom level
			style.zoom = 1;

			// if setting opacity to 1, and no other filters exist -
			// attempt to remove filter attribute #6652
			// if value === "", then remove inline opacity #12685
			if ( ( value >= 1 || value === "" ) &&
					jQuery.trim( filter.replace( ralpha, "" ) ) === "" &&
					style.removeAttribute ) {

				// Setting style.filter to null, "" & " " still leave "filter:" in the cssText
				// if "filter:" is present at all, clearType is disabled, we want to avoid this
				// style.removeAttribute is IE Only, but so apparently is this code path...
				style.removeAttribute( "filter" );

				// if there is no filter style applied in a css rule
				// or unset inline opacity, we are done
				if ( value === "" || currentStyle && !currentStyle.filter ) {
					return;
				}
			}

			// otherwise, set new filter values
			style.filter = ralpha.test( filter ) ?
				filter.replace( ralpha, opacity ) :
				filter + " " + opacity;
		}
	};
}

jQuery.cssHooks.marginRight = addGetHookIf( support.reliableMarginRight,
	function( elem, computed ) {
		if ( computed ) {
			return swap( elem, { "display": "inline-block" },
				curCSS, [ elem, "marginRight" ] );
		}
	}
);

jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
	function( elem, computed ) {
		if ( computed ) {
			return (
				parseFloat( curCSS( elem, "marginLeft" ) ) ||

				// Support: IE<=11+
				// Running getBoundingClientRect on a disconnected node in IE throws an error
				// Support: IE8 only
				// getClientRects() errors on disconnected elems
				( jQuery.contains( elem.ownerDocument, elem ) ?
					elem.getBoundingClientRect().left -
						swap( elem, { marginLeft: 0 }, function() {
							return elem.getBoundingClientRect().left;
						} ) :
					0
				)
			) + "px";
		}
	}
);

// These hooks are used by animate to expand properties
jQuery.each( {
	margin: "",
	padding: "",
	border: "Width"
}, function( prefix, suffix ) {
	jQuery.cssHooks[ prefix + suffix ] = {
		expand: function( value ) {
			var i = 0,
				expanded = {},

				// assumes a single number if not a string
				parts = typeof value === "string" ? value.split( " " ) : [ value ];

			for ( ; i < 4; i++ ) {
				expanded[ prefix + cssExpand[ i ] + suffix ] =
					parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
			}

			return expanded;
		}
	};

	if ( !rmargin.test( prefix ) ) {
		jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
	}
} );

jQuery.fn.extend( {
	css: function( name, value ) {
		return access( this, function( elem, name, value ) {
			var styles, len,
				map = {},
				i = 0;

			if ( jQuery.isArray( name ) ) {
				styles = getStyles( elem );
				len = name.length;

				for ( ; i < len; i++ ) {
					map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
				}

				return map;
			}

			return value !== undefined ?
				jQuery.style( elem, name, value ) :
				jQuery.css( elem, name );
		}, name, value, arguments.length > 1 );
	},
	show: function() {
		return showHide( this, true );
	},
	hide: function() {
		return showHide( this );
	},
	toggle: function( state ) {
		if ( typeof state === "boolean" ) {
			return state ? this.show() : this.hide();
		}

		return this.each( function() {
			if ( isHidden( this ) ) {
				jQuery( this ).show();
			} else {
				jQuery( this ).hide();
			}
		} );
	}
} );


function Tween( elem, options, prop, end, easing ) {
	return new Tween.prototype.init( elem, options, prop, end, easing );
}
jQuery.Tween = Tween;

Tween.prototype = {
	constructor: Tween,
	init: function( elem, options, prop, end, easing, unit ) {
		this.elem = elem;
		this.prop = prop;
		this.easing = easing || jQuery.easing._default;
		this.options = options;
		this.start = this.now = this.cur();
		this.end = end;
		this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
	},
	cur: function() {
		var hooks = Tween.propHooks[ this.prop ];

		return hooks && hooks.get ?
			hooks.get( this ) :
			Tween.propHooks._default.get( this );
	},
	run: function( percent ) {
		var eased,
			hooks = Tween.propHooks[ this.prop ];

		if ( this.options.duration ) {
			this.pos = eased = jQuery.easing[ this.easing ](
				percent, this.options.duration * percent, 0, 1, this.options.duration
			);
		} else {
			this.pos = eased = percent;
		}
		this.now = ( this.end - this.start ) * eased + this.start;

		if ( this.options.step ) {
			this.options.step.call( this.elem, this.now, this );
		}

		if ( hooks && hooks.set ) {
			hooks.set( this );
		} else {
			Tween.propHooks._default.set( this );
		}
		return this;
	}
};

Tween.prototype.init.prototype = Tween.prototype;

Tween.propHooks = {
	_default: {
		get: function( tween ) {
			var result;

			// Use a property on the element directly when it is not a DOM element,
			// or when there is no matching style property that exists.
			if ( tween.elem.nodeType !== 1 ||
				tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {
				return tween.elem[ tween.prop ];
			}

			// passing an empty string as a 3rd parameter to .css will automatically
			// attempt a parseFloat and fallback to a string if the parse fails
			// so, simple values such as "10px" are parsed to Float.
			// complex values such as "rotate(1rad)" are returned as is.
			result = jQuery.css( tween.elem, tween.prop, "" );

			// Empty strings, null, undefined and "auto" are converted to 0.
			return !result || result === "auto" ? 0 : result;
		},
		set: function( tween ) {

			// use step hook for back compat - use cssHook if its there - use .style if its
			// available and use plain properties where available
			if ( jQuery.fx.step[ tween.prop ] ) {
				jQuery.fx.step[ tween.prop ]( tween );
			} else if ( tween.elem.nodeType === 1 &&
				( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null ||
					jQuery.cssHooks[ tween.prop ] ) ) {
				jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
			} else {
				tween.elem[ tween.prop ] = tween.now;
			}
		}
	}
};

// Support: IE <=9
// Panic based approach to setting things on disconnected nodes

Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
	set: function( tween ) {
		if ( tween.elem.nodeType && tween.elem.parentNode ) {
			tween.elem[ tween.prop ] = tween.now;
		}
	}
};

jQuery.easing = {
	linear: function( p ) {
		return p;
	},
	swing: function( p ) {
		return 0.5 - Math.cos( p * Math.PI ) / 2;
	},
	_default: "swing"
};

jQuery.fx = Tween.prototype.init;

// Back Compat <1.8 extension point
jQuery.fx.step = {};




var
	fxNow, timerId,
	rfxtypes = /^(?:toggle|show|hide)$/,
	rrun = /queueHooks$/;

// Animations created synchronously will run synchronously
function createFxNow() {
	window.setTimeout( function() {
		fxNow = undefined;
	} );
	return ( fxNow = jQuery.now() );
}

// Generate parameters to create a standard animation
function genFx( type, includeWidth ) {
	var which,
		attrs = { height: type },
		i = 0;

	// if we include width, step value is 1 to do all cssExpand values,
	// if we don't include width, step value is 2 to skip over Left and Right
	includeWidth = includeWidth ? 1 : 0;
	for ( ; i < 4 ; i += 2 - includeWidth ) {
		which = cssExpand[ i ];
		attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
	}

	if ( includeWidth ) {
		attrs.opacity = attrs.width = type;
	}

	return attrs;
}

function createTween( value, prop, animation ) {
	var tween,
		collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ),
		index = 0,
		length = collection.length;
	for ( ; index < length; index++ ) {
		if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {

			// we're done with this property
			return tween;
		}
	}
}

function defaultPrefilter( elem, props, opts ) {
	/* jshint validthis: true */
	var prop, value, toggle, tween, hooks, oldfire, display, checkDisplay,
		anim = this,
		orig = {},
		style = elem.style,
		hidden = elem.nodeType && isHidden( elem ),
		dataShow = jQuery._data( elem, "fxshow" );

	// handle queue: false promises
	if ( !opts.queue ) {
		hooks = jQuery._queueHooks( elem, "fx" );
		if ( hooks.unqueued == null ) {
			hooks.unqueued = 0;
			oldfire = hooks.empty.fire;
			hooks.empty.fire = function() {
				if ( !hooks.unqueued ) {
					oldfire();
				}
			};
		}
		hooks.unqueued++;

		anim.always( function() {

			// doing this makes sure that the complete handler will be called
			// before this completes
			anim.always( function() {
				hooks.unqueued--;
				if ( !jQuery.queue( elem, "fx" ).length ) {
					hooks.empty.fire();
				}
			} );
		} );
	}

	// height/width overflow pass
	if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) {

		// Make sure that nothing sneaks out
		// Record all 3 overflow attributes because IE does not
		// change the overflow attribute when overflowX and
		// overflowY are set to the same value
		opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];

		// Set display property to inline-block for height/width
		// animations on inline elements that are having width/height animated
		display = jQuery.css( elem, "display" );

		// Test default display if display is currently "none"
		checkDisplay = display === "none" ?
			jQuery._data( elem, "olddisplay" ) || defaultDisplay( elem.nodeName ) : display;

		if ( checkDisplay === "inline" && jQuery.css( elem, "float" ) === "none" ) {

			// inline-level elements accept inline-block;
			// block-level elements need to be inline with layout
			if ( !support.inlineBlockNeedsLayout || defaultDisplay( elem.nodeName ) === "inline" ) {
				style.display = "inline-block";
			} else {
				style.zoom = 1;
			}
		}
	}

	if ( opts.overflow ) {
		style.overflow = "hidden";
		if ( !support.shrinkWrapBlocks() ) {
			anim.always( function() {
				style.overflow = opts.overflow[ 0 ];
				style.overflowX = opts.overflow[ 1 ];
				style.overflowY = opts.overflow[ 2 ];
			} );
		}
	}

	// show/hide pass
	for ( prop in props ) {
		value = props[ prop ];
		if ( rfxtypes.exec( value ) ) {
			delete props[ prop ];
			toggle = toggle || value === "toggle";
			if ( value === ( hidden ? "hide" : "show" ) ) {

				// If there is dataShow left over from a stopped hide or show
				// and we are going to proceed with show, we should pretend to be hidden
				if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
					hidden = true;
				} else {
					continue;
				}
			}
			orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );

		// Any non-fx value stops us from restoring the original display value
		} else {
			display = undefined;
		}
	}

	if ( !jQuery.isEmptyObject( orig ) ) {
		if ( dataShow ) {
			if ( "hidden" in dataShow ) {
				hidden = dataShow.hidden;
			}
		} else {
			dataShow = jQuery._data( elem, "fxshow", {} );
		}

		// store state if its toggle - enables .stop().toggle() to "reverse"
		if ( toggle ) {
			dataShow.hidden = !hidden;
		}
		if ( hidden ) {
			jQuery( elem ).show();
		} else {
			anim.done( function() {
				jQuery( elem ).hide();
			} );
		}
		anim.done( function() {
			var prop;
			jQuery._removeData( elem, "fxshow" );
			for ( prop in orig ) {
				jQuery.style( elem, prop, orig[ prop ] );
			}
		} );
		for ( prop in orig ) {
			tween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );

			if ( !( prop in dataShow ) ) {
				dataShow[ prop ] = tween.start;
				if ( hidden ) {
					tween.end = tween.start;
					tween.start = prop === "width" || prop === "height" ? 1 : 0;
				}
			}
		}

	// If this is a noop like .hide().hide(), restore an overwritten display value
	} else if ( ( display === "none" ? defaultDisplay( elem.nodeName ) : display ) === "inline" ) {
		style.display = display;
	}
}

function propFilter( props, specialEasing ) {
	var index, name, easing, value, hooks;

	// camelCase, specialEasing and expand cssHook pass
	for ( index in props ) {
		name = jQuery.camelCase( index );
		easing = specialEasing[ name ];
		value = props[ index ];
		if ( jQuery.isArray( value ) ) {
			easing = value[ 1 ];
			value = props[ index ] = value[ 0 ];
		}

		if ( index !== name ) {
			props[ name ] = value;
			delete props[ index ];
		}

		hooks = jQuery.cssHooks[ name ];
		if ( hooks && "expand" in hooks ) {
			value = hooks.expand( value );
			delete props[ name ];

			// not quite $.extend, this wont overwrite keys already present.
			// also - reusing 'index' from above because we have the correct "name"
			for ( index in value ) {
				if ( !( index in props ) ) {
					props[ index ] = value[ index ];
					specialEasing[ index ] = easing;
				}
			}
		} else {
			specialEasing[ name ] = easing;
		}
	}
}

function Animation( elem, properties, options ) {
	var result,
		stopped,
		index = 0,
		length = Animation.prefilters.length,
		deferred = jQuery.Deferred().always( function() {

			// don't match elem in the :animated selector
			delete tick.elem;
		} ),
		tick = function() {
			if ( stopped ) {
				return false;
			}
			var currentTime = fxNow || createFxNow(),
				remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),

				// Support: Android 2.3
				// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)
				temp = remaining / animation.duration || 0,
				percent = 1 - temp,
				index = 0,
				length = animation.tweens.length;

			for ( ; index < length ; index++ ) {
				animation.tweens[ index ].run( percent );
			}

			deferred.notifyWith( elem, [ animation, percent, remaining ] );

			if ( percent < 1 && length ) {
				return remaining;
			} else {
				deferred.resolveWith( elem, [ animation ] );
				return false;
			}
		},
		animation = deferred.promise( {
			elem: elem,
			props: jQuery.extend( {}, properties ),
			opts: jQuery.extend( true, {
				specialEasing: {},
				easing: jQuery.easing._default
			}, options ),
			originalProperties: properties,
			originalOptions: options,
			startTime: fxNow || createFxNow(),
			duration: options.duration,
			tweens: [],
			createTween: function( prop, end ) {
				var tween = jQuery.Tween( elem, animation.opts, prop, end,
						animation.opts.specialEasing[ prop ] || animation.opts.easing );
				animation.tweens.push( tween );
				return tween;
			},
			stop: function( gotoEnd ) {
				var index = 0,

					// if we are going to the end, we want to run all the tweens
					// otherwise we skip this part
					length = gotoEnd ? animation.tweens.length : 0;
				if ( stopped ) {
					return this;
				}
				stopped = true;
				for ( ; index < length ; index++ ) {
					animation.tweens[ index ].run( 1 );
				}

				// resolve when we played the last frame
				// otherwise, reject
				if ( gotoEnd ) {
					deferred.notifyWith( elem, [ animation, 1, 0 ] );
					deferred.resolveWith( elem, [ animation, gotoEnd ] );
				} else {
					deferred.rejectWith( elem, [ animation, gotoEnd ] );
				}
				return this;
			}
		} ),
		props = animation.props;

	propFilter( props, animation.opts.specialEasing );

	for ( ; index < length ; index++ ) {
		result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );
		if ( result ) {
			if ( jQuery.isFunction( result.stop ) ) {
				jQuery._queueHooks( animation.elem, animation.opts.queue ).stop =
					jQuery.proxy( result.stop, result );
			}
			return result;
		}
	}

	jQuery.map( props, createTween, animation );

	if ( jQuery.isFunction( animation.opts.start ) ) {
		animation.opts.start.call( elem, animation );
	}

	jQuery.fx.timer(
		jQuery.extend( tick, {
			elem: elem,
			anim: animation,
			queue: animation.opts.queue
		} )
	);

	// attach callbacks from options
	return animation.progress( animation.opts.progress )
		.done( animation.opts.done, animation.opts.complete )
		.fail( animation.opts.fail )
		.always( animation.opts.always );
}

jQuery.Animation = jQuery.extend( Animation, {

	tweeners: {
		"*": [ function( prop, value ) {
			var tween = this.createTween( prop, value );
			adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );
			return tween;
		} ]
	},

	tweener: function( props, callback ) {
		if ( jQuery.isFunction( props ) ) {
			callback = props;
			props = [ "*" ];
		} else {
			props = props.match( rnotwhite );
		}

		var prop,
			index = 0,
			length = props.length;

		for ( ; index < length ; index++ ) {
			prop = props[ index ];
			Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];
			Animation.tweeners[ prop ].unshift( callback );
		}
	},

	prefilters: [ defaultPrefilter ],

	prefilter: function( callback, prepend ) {
		if ( prepend ) {
			Animation.prefilters.unshift( callback );
		} else {
			Animation.prefilters.push( callback );
		}
	}
} );

jQuery.speed = function( speed, easing, fn ) {
	var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
		complete: fn || !fn && easing ||
			jQuery.isFunction( speed ) && speed,
		duration: speed,
		easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
	};

	opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
		opt.duration in jQuery.fx.speeds ?
			jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;

	// normalize opt.queue - true/undefined/null -> "fx"
	if ( opt.queue == null || opt.queue === true ) {
		opt.queue = "fx";
	}

	// Queueing
	opt.old = opt.complete;

	opt.complete = function() {
		if ( jQuery.isFunction( opt.old ) ) {
			opt.old.call( this );
		}

		if ( opt.queue ) {
			jQuery.dequeue( this, opt.queue );
		}
	};

	return opt;
};

jQuery.fn.extend( {
	fadeTo: function( speed, to, easing, callback ) {

		// show any hidden elements after setting opacity to 0
		return this.filter( isHidden ).css( "opacity", 0 ).show()

			// animate to the value specified
			.end().animate( { opacity: to }, speed, easing, callback );
	},
	animate: function( prop, speed, easing, callback ) {
		var empty = jQuery.isEmptyObject( prop ),
			optall = jQuery.speed( speed, easing, callback ),
			doAnimation = function() {

				// Operate on a copy of prop so per-property easing won't be lost
				var anim = Animation( this, jQuery.extend( {}, prop ), optall );

				// Empty animations, or finishing resolves immediately
				if ( empty || jQuery._data( this, "finish" ) ) {
					anim.stop( true );
				}
			};
			doAnimation.finish = doAnimation;

		return empty || optall.queue === false ?
			this.each( doAnimation ) :
			this.queue( optall.queue, doAnimation );
	},
	stop: function( type, clearQueue, gotoEnd ) {
		var stopQueue = function( hooks ) {
			var stop = hooks.stop;
			delete hooks.stop;
			stop( gotoEnd );
		};

		if ( typeof type !== "string" ) {
			gotoEnd = clearQueue;
			clearQueue = type;
			type = undefined;
		}
		if ( clearQueue && type !== false ) {
			this.queue( type || "fx", [] );
		}

		return this.each( function() {
			var dequeue = true,
				index = type != null && type + "queueHooks",
				timers = jQuery.timers,
				data = jQuery._data( this );

			if ( index ) {
				if ( data[ index ] && data[ index ].stop ) {
					stopQueue( data[ index ] );
				}
			} else {
				for ( index in data ) {
					if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
						stopQueue( data[ index ] );
					}
				}
			}

			for ( index = timers.length; index--; ) {
				if ( timers[ index ].elem === this &&
					( type == null || timers[ index ].queue === type ) ) {

					timers[ index ].anim.stop( gotoEnd );
					dequeue = false;
					timers.splice( index, 1 );
				}
			}

			// start the next in the queue if the last step wasn't forced
			// timers currently will call their complete callbacks, which will dequeue
			// but only if they were gotoEnd
			if ( dequeue || !gotoEnd ) {
				jQuery.dequeue( this, type );
			}
		} );
	},
	finish: function( type ) {
		if ( type !== false ) {
			type = type || "fx";
		}
		return this.each( function() {
			var index,
				data = jQuery._data( this ),
				queue = data[ type + "queue" ],
				hooks = data[ type + "queueHooks" ],
				timers = jQuery.timers,
				length = queue ? queue.length : 0;

			// enable finishing flag on private data
			data.finish = true;

			// empty the queue first
			jQuery.queue( this, type, [] );

			if ( hooks && hooks.stop ) {
				hooks.stop.call( this, true );
			}

			// look for any active animations, and finish them
			for ( index = timers.length; index--; ) {
				if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
					timers[ index ].anim.stop( true );
					timers.splice( index, 1 );
				}
			}

			// look for any animations in the old queue and finish them
			for ( index = 0; index < length; index++ ) {
				if ( queue[ index ] && queue[ index ].finish ) {
					queue[ index ].finish.call( this );
				}
			}

			// turn off finishing flag
			delete data.finish;
		} );
	}
} );

jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) {
	var cssFn = jQuery.fn[ name ];
	jQuery.fn[ name ] = function( speed, easing, callback ) {
		return speed == null || typeof speed === "boolean" ?
			cssFn.apply( this, arguments ) :
			this.animate( genFx( name, true ), speed, easing, callback );
	};
} );

// Generate shortcuts for custom animations
jQuery.each( {
	slideDown: genFx( "show" ),
	slideUp: genFx( "hide" ),
	slideToggle: genFx( "toggle" ),
	fadeIn: { opacity: "show" },
	fadeOut: { opacity: "hide" },
	fadeToggle: { opacity: "toggle" }
}, function( name, props ) {
	jQuery.fn[ name ] = function( speed, easing, callback ) {
		return this.animate( props, speed, easing, callback );
	};
} );

jQuery.timers = [];
jQuery.fx.tick = function() {
	var timer,
		timers = jQuery.timers,
		i = 0;

	fxNow = jQuery.now();

	for ( ; i < timers.length; i++ ) {
		timer = timers[ i ];

		// Checks the timer has not already been removed
		if ( !timer() && timers[ i ] === timer ) {
			timers.splice( i--, 1 );
		}
	}

	if ( !timers.length ) {
		jQuery.fx.stop();
	}
	fxNow = undefined;
};

jQuery.fx.timer = function( timer ) {
	jQuery.timers.push( timer );
	if ( timer() ) {
		jQuery.fx.start();
	} else {
		jQuery.timers.pop();
	}
};

jQuery.fx.interval = 13;

jQuery.fx.start = function() {
	if ( !timerId ) {
		timerId = window.setInterval( jQuery.fx.tick, jQuery.fx.interval );
	}
};

jQuery.fx.stop = function() {
	window.clearInterval( timerId );
	timerId = null;
};

jQuery.fx.speeds = {
	slow: 600,
	fast: 200,

	// Default speed
	_default: 400
};


// Based off of the plugin by Clint Helfers, with permission.
// http://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/
jQuery.fn.delay = function( time, type ) {
	time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
	type = type || "fx";

	return this.queue( type, function( next, hooks ) {
		var timeout = window.setTimeout( next, time );
		hooks.stop = function() {
			window.clearTimeout( timeout );
		};
	} );
};


( function() {
	var a,
		input = document.createElement( "input" ),
		div = document.createElement( "div" ),
		select = document.createElement( "select" ),
		opt = select.appendChild( document.createElement( "option" ) );

	// Setup
	div = document.createElement( "div" );
	div.setAttribute( "className", "t" );
	div.innerHTML = "  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
	a = div.getElementsByTagName( "a" )[ 0 ];

	// Support: Windows Web Apps (WWA)
	// `type` must use .setAttribute for WWA (#14901)
	input.setAttribute( "type", "checkbox" );
	div.appendChild( input );

	a = div.getElementsByTagName( "a" )[ 0 ];

	// First batch of tests.
	a.style.cssText = "top:1px";

	// Test setAttribute on camelCase class.
	// If it works, we need attrFixes when doing get/setAttribute (ie6/7)
	support.getSetAttribute = div.className !== "t";

	// Get the style information from getAttribute
	// (IE uses .cssText instead)
	support.style = /top/.test( a.getAttribute( "style" ) );

	// Make sure that URLs aren't manipulated
	// (IE normalizes it by default)
	support.hrefNormalized = a.getAttribute( "href" ) === "/a";

	// Check the default checkbox/radio value ("" on WebKit; "on" elsewhere)
	support.checkOn = !!input.value;

	// Make sure that a selected-by-default option has a working selected property.
	// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
	support.optSelected = opt.selected;

	// Tests for enctype support on a form (#6743)
	support.enctype = !!document.createElement( "form" ).enctype;

	// Make sure that the options inside disabled selects aren't marked as disabled
	// (WebKit marks them as disabled)
	select.disabled = true;
	support.optDisabled = !opt.disabled;

	// Support: IE8 only
	// Check if we can trust getAttribute("value")
	input = document.createElement( "input" );
	input.setAttribute( "value", "" );
	support.input = input.getAttribute( "value" ) === "";

	// Check if an input maintains its value after becoming a radio
	input.value = "t";
	input.setAttribute( "type", "radio" );
	support.radioValue = input.value === "t";
} )();


var rreturn = /\r/g,
	rspaces = /[\x20\t\r\n\f]+/g;

jQuery.fn.extend( {
	val: function( value ) {
		var hooks, ret, isFunction,
			elem = this[ 0 ];

		if ( !arguments.length ) {
			if ( elem ) {
				hooks = jQuery.valHooks[ elem.type ] ||
					jQuery.valHooks[ elem.nodeName.toLowerCase() ];

				if (
					hooks &&
					"get" in hooks &&
					( ret = hooks.get( elem, "value" ) ) !== undefined
				) {
					return ret;
				}

				ret = elem.value;

				return typeof ret === "string" ?

					// handle most common string cases
					ret.replace( rreturn, "" ) :

					// handle cases where value is null/undef or number
					ret == null ? "" : ret;
			}

			return;
		}

		isFunction = jQuery.isFunction( value );

		return this.each( function( i ) {
			var val;

			if ( this.nodeType !== 1 ) {
				return;
			}

			if ( isFunction ) {
				val = value.call( this, i, jQuery( this ).val() );
			} else {
				val = value;
			}

			// Treat null/undefined as ""; convert numbers to string
			if ( val == null ) {
				val = "";
			} else if ( typeof val === "number" ) {
				val += "";
			} else if ( jQuery.isArray( val ) ) {
				val = jQuery.map( val, function( value ) {
					return value == null ? "" : value + "";
				} );
			}

			hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];

			// If set returns undefined, fall back to normal setting
			if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) {
				this.value = val;
			}
		} );
	}
} );

jQuery.extend( {
	valHooks: {
		option: {
			get: function( elem ) {
				var val = jQuery.find.attr( elem, "value" );
				return val != null ?
					val :

					// Support: IE10-11+
					// option.text throws exceptions (#14686, #14858)
					// Strip and collapse whitespace
					// https://html.spec.whatwg.org/#strip-and-collapse-whitespace
					jQuery.trim( jQuery.text( elem ) ).replace( rspaces, " " );
			}
		},
		select: {
			get: function( elem ) {
				var value, option,
					options = elem.options,
					index = elem.selectedIndex,
					one = elem.type === "select-one" || index < 0,
					values = one ? null : [],
					max = one ? index + 1 : options.length,
					i = index < 0 ?
						max :
						one ? index : 0;

				// Loop through all the selected options
				for ( ; i < max; i++ ) {
					option = options[ i ];

					// oldIE doesn't update selected after form reset (#2551)
					if ( ( option.selected || i === index ) &&

							// Don't return options that are disabled or in a disabled optgroup
							( support.optDisabled ?
								!option.disabled :
								option.getAttribute( "disabled" ) === null ) &&
							( !option.parentNode.disabled ||
								!jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {

						// Get the specific value for the option
						value = jQuery( option ).val();

						// We don't need an array for one selects
						if ( one ) {
							return value;
						}

						// Multi-Selects return an array
						values.push( value );
					}
				}

				return values;
			},

			set: function( elem, value ) {
				var optionSet, option,
					options = elem.options,
					values = jQuery.makeArray( value ),
					i = options.length;

				while ( i-- ) {
					option = options[ i ];

					if ( jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 ) {

						// Support: IE6
						// When new option element is added to select box we need to
						// force reflow of newly added node in order to workaround delay
						// of initialization properties
						try {
							option.selected = optionSet = true;

						} catch ( _ ) {

							// Will be executed only in IE6
							option.scrollHeight;
						}

					} else {
						option.selected = false;
					}
				}

				// Force browsers to behave consistently when non-matching value is set
				if ( !optionSet ) {
					elem.selectedIndex = -1;
				}

				return options;
			}
		}
	}
} );

// Radios and checkboxes getter/setter
jQuery.each( [ "radio", "checkbox" ], function() {
	jQuery.valHooks[ this ] = {
		set: function( elem, value ) {
			if ( jQuery.isArray( value ) ) {
				return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );
			}
		}
	};
	if ( !support.checkOn ) {
		jQuery.valHooks[ this ].get = function( elem ) {
			return elem.getAttribute( "value" ) === null ? "on" : elem.value;
		};
	}
} );




var nodeHook, boolHook,
	attrHandle = jQuery.expr.attrHandle,
	ruseDefault = /^(?:checked|selected)$/i,
	getSetAttribute = support.getSetAttribute,
	getSetInput = support.input;

jQuery.fn.extend( {
	attr: function( name, value ) {
		return access( this, jQuery.attr, name, value, arguments.length > 1 );
	},

	removeAttr: function( name ) {
		return this.each( function() {
			jQuery.removeAttr( this, name );
		} );
	}
} );

jQuery.extend( {
	attr: function( elem, name, value ) {
		var ret, hooks,
			nType = elem.nodeType;

		// Don't get/set attributes on text, comment and attribute nodes
		if ( nType === 3 || nType === 8 || nType === 2 ) {
			return;
		}

		// Fallback to prop when attributes are not supported
		if ( typeof elem.getAttribute === "undefined" ) {
			return jQuery.prop( elem, name, value );
		}

		// All attributes are lowercase
		// Grab necessary hook if one is defined
		if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
			name = name.toLowerCase();
			hooks = jQuery.attrHooks[ name ] ||
				( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook );
		}

		if ( value !== undefined ) {
			if ( value === null ) {
				jQuery.removeAttr( elem, name );
				return;
			}

			if ( hooks && "set" in hooks &&
				( ret = hooks.set( elem, value, name ) ) !== undefined ) {
				return ret;
			}

			elem.setAttribute( name, value + "" );
			return value;
		}

		if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
			return ret;
		}

		ret = jQuery.find.attr( elem, name );

		// Non-existent attributes return null, we normalize to undefined
		return ret == null ? undefined : ret;
	},

	attrHooks: {
		type: {
			set: function( elem, value ) {
				if ( !support.radioValue && value === "radio" &&
					jQuery.nodeName( elem, "input" ) ) {

					// Setting the type on a radio button after the value resets the value in IE8-9
					// Reset value to default in case type is set after value during creation
					var val = elem.value;
					elem.setAttribute( "type", value );
					if ( val ) {
						elem.value = val;
					}
					return value;
				}
			}
		}
	},

	removeAttr: function( elem, value ) {
		var name, propName,
			i = 0,
			attrNames = value && value.match( rnotwhite );

		if ( attrNames && elem.nodeType === 1 ) {
			while ( ( name = attrNames[ i++ ] ) ) {
				propName = jQuery.propFix[ name ] || name;

				// Boolean attributes get special treatment (#10870)
				if ( jQuery.expr.match.bool.test( name ) ) {

					// Set corresponding property to false
					if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {
						elem[ propName ] = false;

					// Support: IE<9
					// Also clear defaultChecked/defaultSelected (if appropriate)
					} else {
						elem[ jQuery.camelCase( "default-" + name ) ] =
							elem[ propName ] = false;
					}

				// See #9699 for explanation of this approach (setting first, then removal)
				} else {
					jQuery.attr( elem, name, "" );
				}

				elem.removeAttribute( getSetAttribute ? name : propName );
			}
		}
	}
} );

// Hooks for boolean attributes
boolHook = {
	set: function( elem, value, name ) {
		if ( value === false ) {

			// Remove boolean attributes when set to false
			jQuery.removeAttr( elem, name );
		} else if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {

			// IE<8 needs the *property* name
			elem.setAttribute( !getSetAttribute && jQuery.propFix[ name ] || name, name );

		} else {

			// Support: IE<9
			// Use defaultChecked and defaultSelected for oldIE
			elem[ jQuery.camelCase( "default-" + name ) ] = elem[ name ] = true;
		}
		return name;
	}
};

jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
	var getter = attrHandle[ name ] || jQuery.find.attr;

	if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {
		attrHandle[ name ] = function( elem, name, isXML ) {
			var ret, handle;
			if ( !isXML ) {

				// Avoid an infinite loop by temporarily removing this function from the getter
				handle = attrHandle[ name ];
				attrHandle[ name ] = ret;
				ret = getter( elem, name, isXML ) != null ?
					name.toLowerCase() :
					null;
				attrHandle[ name ] = handle;
			}
			return ret;
		};
	} else {
		attrHandle[ name ] = function( elem, name, isXML ) {
			if ( !isXML ) {
				return elem[ jQuery.camelCase( "default-" + name ) ] ?
					name.toLowerCase() :
					null;
			}
		};
	}
} );

// fix oldIE attroperties
if ( !getSetInput || !getSetAttribute ) {
	jQuery.attrHooks.value = {
		set: function( elem, value, name ) {
			if ( jQuery.nodeName( elem, "input" ) ) {

				// Does not return so that setAttribute is also used
				elem.defaultValue = value;
			} else {

				// Use nodeHook if defined (#1954); otherwise setAttribute is fine
				return nodeHook && nodeHook.set( elem, value, name );
			}
		}
	};
}

// IE6/7 do not support getting/setting some attributes with get/setAttribute
if ( !getSetAttribute ) {

	// Use this for any attribute in IE6/7
	// This fixes almost every IE6/7 issue
	nodeHook = {
		set: function( elem, value, name ) {

			// Set the existing or create a new attribute node
			var ret = elem.getAttributeNode( name );
			if ( !ret ) {
				elem.setAttributeNode(
					( ret = elem.ownerDocument.createAttribute( name ) )
				);
			}

			ret.value = value += "";

			// Break association with cloned elements by also using setAttribute (#9646)
			if ( name === "value" || value === elem.getAttribute( name ) ) {
				return value;
			}
		}
	};

	// Some attributes are constructed with empty-string values when not defined
	attrHandle.id = attrHandle.name = attrHandle.coords =
		function( elem, name, isXML ) {
			var ret;
			if ( !isXML ) {
				return ( ret = elem.getAttributeNode( name ) ) && ret.value !== "" ?
					ret.value :
					null;
			}
		};

	// Fixing value retrieval on a button requires this module
	jQuery.valHooks.button = {
		get: function( elem, name ) {
			var ret = elem.getAttributeNode( name );
			if ( ret && ret.specified ) {
				return ret.value;
			}
		},
		set: nodeHook.set
	};

	// Set contenteditable to false on removals(#10429)
	// Setting to empty string throws an error as an invalid value
	jQuery.attrHooks.contenteditable = {
		set: function( elem, value, name ) {
			nodeHook.set( elem, value === "" ? false : value, name );
		}
	};

	// Set width and height to auto instead of 0 on empty string( Bug #8150 )
	// This is for removals
	jQuery.each( [ "width", "height" ], function( i, name ) {
		jQuery.attrHooks[ name ] = {
			set: function( elem, value ) {
				if ( value === "" ) {
					elem.setAttribute( name, "auto" );
					return value;
				}
			}
		};
	} );
}

if ( !support.style ) {
	jQuery.attrHooks.style = {
		get: function( elem ) {

			// Return undefined in the case of empty string
			// Note: IE uppercases css property names, but if we were to .toLowerCase()
			// .cssText, that would destroy case sensitivity in URL's, like in "background"
			return elem.style.cssText || undefined;
		},
		set: function( elem, value ) {
			return ( elem.style.cssText = value + "" );
		}
	};
}




var rfocusable = /^(?:input|select|textarea|button|object)$/i,
	rclickable = /^(?:a|area)$/i;

jQuery.fn.extend( {
	prop: function( name, value ) {
		return access( this, jQuery.prop, name, value, arguments.length > 1 );
	},

	removeProp: function( name ) {
		name = jQuery.propFix[ name ] || name;
		return this.each( function() {

			// try/catch handles cases where IE balks (such as removing a property on window)
			try {
				this[ name ] = undefined;
				delete this[ name ];
			} catch ( e ) {}
		} );
	}
} );

jQuery.extend( {
	prop: function( elem, name, value ) {
		var ret, hooks,
			nType = elem.nodeType;

		// Don't get/set properties on text, comment and attribute nodes
		if ( nType === 3 || nType === 8 || nType === 2 ) {
			return;
		}

		if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {

			// Fix name and attach hooks
			name = jQuery.propFix[ name ] || name;
			hooks = jQuery.propHooks[ name ];
		}

		if ( value !== undefined ) {
			if ( hooks && "set" in hooks &&
				( ret = hooks.set( elem, value, name ) ) !== undefined ) {
				return ret;
			}

			return ( elem[ name ] = value );
		}

		if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
			return ret;
		}

		return elem[ name ];
	},

	propHooks: {
		tabIndex: {
			get: function( elem ) {

				// elem.tabIndex doesn't always return the
				// correct value when it hasn't been explicitly set
				// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
				// Use proper attribute retrieval(#12072)
				var tabindex = jQuery.find.attr( elem, "tabindex" );

				return tabindex ?
					parseInt( tabindex, 10 ) :
					rfocusable.test( elem.nodeName ) ||
						rclickable.test( elem.nodeName ) && elem.href ?
							0 :
							-1;
			}
		}
	},

	propFix: {
		"for": "htmlFor",
		"class": "className"
	}
} );

// Some attributes require a special call on IE
// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
if ( !support.hrefNormalized ) {

	// href/src property should get the full normalized URL (#10299/#12915)
	jQuery.each( [ "href", "src" ], function( i, name ) {
		jQuery.propHooks[ name ] = {
			get: function( elem ) {
				return elem.getAttribute( name, 4 );
			}
		};
	} );
}

// Support: Safari, IE9+
// Accessing the selectedIndex property
// forces the browser to respect setting selected
// on the option
// The getter ensures a default option is selected
// when in an optgroup
if ( !support.optSelected ) {
	jQuery.propHooks.selected = {
		get: function( elem ) {
			var parent = elem.parentNode;

			if ( parent ) {
				parent.selectedIndex;

				// Make sure that it also works with optgroups, see #5701
				if ( parent.parentNode ) {
					parent.parentNode.selectedIndex;
				}
			}
			return null;
		},
		set: function( elem ) {
			var parent = elem.parentNode;
			if ( parent ) {
				parent.selectedIndex;

				if ( parent.parentNode ) {
					parent.parentNode.selectedIndex;
				}
			}
		}
	};
}

jQuery.each( [
	"tabIndex",
	"readOnly",
	"maxLength",
	"cellSpacing",
	"cellPadding",
	"rowSpan",
	"colSpan",
	"useMap",
	"frameBorder",
	"contentEditable"
], function() {
	jQuery.propFix[ this.toLowerCase() ] = this;
} );

// IE6/7 call enctype encoding
if ( !support.enctype ) {
	jQuery.propFix.enctype = "encoding";
}




var rclass = /[\t\r\n\f]/g;

function getClass( elem ) {
	return jQuery.attr( elem, "class" ) || "";
}

jQuery.fn.extend( {
	addClass: function( value ) {
		var classes, elem, cur, curValue, clazz, j, finalValue,
			i = 0;

		if ( jQuery.isFunction( value ) ) {
			return this.each( function( j ) {
				jQuery( this ).addClass( value.call( this, j, getClass( this ) ) );
			} );
		}

		if ( typeof value === "string" && value ) {
			classes = value.match( rnotwhite ) || [];

			while ( ( elem = this[ i++ ] ) ) {
				curValue = getClass( elem );
				cur = elem.nodeType === 1 &&
					( " " + curValue + " " ).replace( rclass, " " );

				if ( cur ) {
					j = 0;
					while ( ( clazz = classes[ j++ ] ) ) {
						if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
							cur += clazz + " ";
						}
					}

					// only assign if different to avoid unneeded rendering.
					finalValue = jQuery.trim( cur );
					if ( curValue !== finalValue ) {
						jQuery.attr( elem, "class", finalValue );
					}
				}
			}
		}

		return this;
	},

	removeClass: function( value ) {
		var classes, elem, cur, curValue, clazz, j, finalValue,
			i = 0;

		if ( jQuery.isFunction( value ) ) {
			return this.each( function( j ) {
				jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );
			} );
		}

		if ( !arguments.length ) {
			return this.attr( "class", "" );
		}

		if ( typeof value === "string" && value ) {
			classes = value.match( rnotwhite ) || [];

			while ( ( elem = this[ i++ ] ) ) {
				curValue = getClass( elem );

				// This expression is here for better compressibility (see addClass)
				cur = elem.nodeType === 1 &&
					( " " + curValue + " " ).replace( rclass, " " );

				if ( cur ) {
					j = 0;
					while ( ( clazz = classes[ j++ ] ) ) {

						// Remove *all* instances
						while ( cur.indexOf( " " + clazz + " " ) > -1 ) {
							cur = cur.replace( " " + clazz + " ", " " );
						}
					}

					// Only assign if different to avoid unneeded rendering.
					finalValue = jQuery.trim( cur );
					if ( curValue !== finalValue ) {
						jQuery.attr( elem, "class", finalValue );
					}
				}
			}
		}

		return this;
	},

	toggleClass: function( value, stateVal ) {
		var type = typeof value;

		if ( typeof stateVal === "boolean" && type === "string" ) {
			return stateVal ? this.addClass( value ) : this.removeClass( value );
		}

		if ( jQuery.isFunction( value ) ) {
			return this.each( function( i ) {
				jQuery( this ).toggleClass(
					value.call( this, i, getClass( this ), stateVal ),
					stateVal
				);
			} );
		}

		return this.each( function() {
			var className, i, self, classNames;

			if ( type === "string" ) {

				// Toggle individual class names
				i = 0;
				self = jQuery( this );
				classNames = value.match( rnotwhite ) || [];

				while ( ( className = classNames[ i++ ] ) ) {

					// Check each className given, space separated list
					if ( self.hasClass( className ) ) {
						self.removeClass( className );
					} else {
						self.addClass( className );
					}
				}

			// Toggle whole class name
			} else if ( value === undefined || type === "boolean" ) {
				className = getClass( this );
				if ( className ) {

					// store className if set
					jQuery._data( this, "__className__", className );
				}

				// If the element has a class name or if we're passed "false",
				// then remove the whole classname (if there was one, the above saved it).
				// Otherwise bring back whatever was previously saved (if anything),
				// falling back to the empty string if nothing was stored.
				jQuery.attr( this, "class",
					className || value === false ?
					"" :
					jQuery._data( this, "__className__" ) || ""
				);
			}
		} );
	},

	hasClass: function( selector ) {
		var className, elem,
			i = 0;

		className = " " + selector + " ";
		while ( ( elem = this[ i++ ] ) ) {
			if ( elem.nodeType === 1 &&
				( " " + getClass( elem ) + " " ).replace( rclass, " " )
					.indexOf( className ) > -1
			) {
				return true;
			}
		}

		return false;
	}
} );




// Return jQuery for attributes-only inclusion


jQuery.each( ( "blur focus focusin focusout load resize scroll unload click dblclick " +
	"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
	"change select submit keydown keypress keyup error contextmenu" ).split( " " ),
	function( i, name ) {

	// Handle event binding
	jQuery.fn[ name ] = function( data, fn ) {
		return arguments.length > 0 ?
			this.on( name, null, data, fn ) :
			this.trigger( name );
	};
} );

jQuery.fn.extend( {
	hover: function( fnOver, fnOut ) {
		return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
	}
} );


var location = window.location;

var nonce = jQuery.now();

var rquery = ( /\?/ );



var rvalidtokens = /(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;

jQuery.parseJSON = function( data ) {

	// Attempt to parse using the native JSON parser first
	if ( window.JSON && window.JSON.parse ) {

		// Support: Android 2.3
		// Workaround failure to string-cast null input
		return window.JSON.parse( data + "" );
	}

	var requireNonComma,
		depth = null,
		str = jQuery.trim( data + "" );

	// Guard against invalid (and possibly dangerous) input by ensuring that nothing remains
	// after removing valid tokens
	return str && !jQuery.trim( str.replace( rvalidtokens, function( token, comma, open, close ) {

		// Force termination if we see a misplaced comma
		if ( requireNonComma && comma ) {
			depth = 0;
		}

		// Perform no more replacements after returning to outermost depth
		if ( depth === 0 ) {
			return token;
		}

		// Commas must not follow "[", "{", or ","
		requireNonComma = open || comma;

		// Determine new depth
		// array/object open ("[" or "{"): depth += true - false (increment)
		// array/object close ("]" or "}"): depth += false - true (decrement)
		// other cases ("," or primitive): depth += true - true (numeric cast)
		depth += !close - !open;

		// Remove this token
		return "";
	} ) ) ?
		( Function( "return " + str ) )() :
		jQuery.error( "Invalid JSON: " + data );
};


// Cross-browser xml parsing
jQuery.parseXML = function( data ) {
	var xml, tmp;
	if ( !data || typeof data !== "string" ) {
		return null;
	}
	try {
		if ( window.DOMParser ) { // Standard
			tmp = new window.DOMParser();
			xml = tmp.parseFromString( data, "text/xml" );
		} else { // IE
			xml = new window.ActiveXObject( "Microsoft.XMLDOM" );
			xml.async = "false";
			xml.loadXML( data );
		}
	} catch ( e ) {
		xml = undefined;
	}
	if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
		jQuery.error( "Invalid XML: " + data );
	}
	return xml;
};


var
	rhash = /#.*$/,
	rts = /([?&])_=[^&]*/,

	// IE leaves an \r character at EOL
	rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg,

	// #7653, #8125, #8152: local protocol detection
	rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
	rnoContent = /^(?:GET|HEAD)$/,
	rprotocol = /^\/\//,
	rurl = /^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,

	/* Prefilters
	 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
	 * 2) These are called:
	 *    - BEFORE asking for a transport
	 *    - AFTER param serialization (s.data is a string if s.processData is true)
	 * 3) key is the dataType
	 * 4) the catchall symbol "*" can be used
	 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
	 */
	prefilters = {},

	/* Transports bindings
	 * 1) key is the dataType
	 * 2) the catchall symbol "*" can be used
	 * 3) selection will start with transport dataType and THEN go to "*" if needed
	 */
	transports = {},

	// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
	allTypes = "*/".concat( "*" ),

	// Document location
	ajaxLocation = location.href,

	// Segment location into parts
	ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];

// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
function addToPrefiltersOrTransports( structure ) {

	// dataTypeExpression is optional and defaults to "*"
	return function( dataTypeExpression, func ) {

		if ( typeof dataTypeExpression !== "string" ) {
			func = dataTypeExpression;
			dataTypeExpression = "*";
		}

		var dataType,
			i = 0,
			dataTypes = dataTypeExpression.toLowerCase().match( rnotwhite ) || [];

		if ( jQuery.isFunction( func ) ) {

			// For each dataType in the dataTypeExpression
			while ( ( dataType = dataTypes[ i++ ] ) ) {

				// Prepend if requested
				if ( dataType.charAt( 0 ) === "+" ) {
					dataType = dataType.slice( 1 ) || "*";
					( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );

				// Otherwise append
				} else {
					( structure[ dataType ] = structure[ dataType ] || [] ).push( func );
				}
			}
		}
	};
}

// Base inspection function for prefilters and transports
function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {

	var inspected = {},
		seekingTransport = ( structure === transports );

	function inspect( dataType ) {
		var selected;
		inspected[ dataType ] = true;
		jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
			var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
			if ( typeof dataTypeOrTransport === "string" &&
				!seekingTransport && !inspected[ dataTypeOrTransport ] ) {

				options.dataTypes.unshift( dataTypeOrTransport );
				inspect( dataTypeOrTransport );
				return false;
			} else if ( seekingTransport ) {
				return !( selected = dataTypeOrTransport );
			}
		} );
		return selected;
	}

	return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
}

// A special extend for ajax options
// that takes "flat" options (not to be deep extended)
// Fixes #9887
function ajaxExtend( target, src ) {
	var deep, key,
		flatOptions = jQuery.ajaxSettings.flatOptions || {};

	for ( key in src ) {
		if ( src[ key ] !== undefined ) {
			( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
		}
	}
	if ( deep ) {
		jQuery.extend( true, target, deep );
	}

	return target;
}

/* Handles responses to an ajax request:
 * - finds the right dataType (mediates between content-type and expected dataType)
 * - returns the corresponding response
 */
function ajaxHandleResponses( s, jqXHR, responses ) {
	var firstDataType, ct, finalDataType, type,
		contents = s.contents,
		dataTypes = s.dataTypes;

	// Remove auto dataType and get content-type in the process
	while ( dataTypes[ 0 ] === "*" ) {
		dataTypes.shift();
		if ( ct === undefined ) {
			ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" );
		}
	}

	// Check if we're dealing with a known content-type
	if ( ct ) {
		for ( type in contents ) {
			if ( contents[ type ] && contents[ type ].test( ct ) ) {
				dataTypes.unshift( type );
				break;
			}
		}
	}

	// Check to see if we have a response for the expected dataType
	if ( dataTypes[ 0 ] in responses ) {
		finalDataType = dataTypes[ 0 ];
	} else {

		// Try convertible dataTypes
		for ( type in responses ) {
			if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) {
				finalDataType = type;
				break;
			}
			if ( !firstDataType ) {
				firstDataType = type;
			}
		}

		// Or just use first one
		finalDataType = finalDataType || firstDataType;
	}

	// If we found a dataType
	// We add the dataType to the list if needed
	// and return the corresponding response
	if ( finalDataType ) {
		if ( finalDataType !== dataTypes[ 0 ] ) {
			dataTypes.unshift( finalDataType );
		}
		return responses[ finalDataType ];
	}
}

/* Chain conversions given the request and the original response
 * Also sets the responseXXX fields on the jqXHR instance
 */
function ajaxConvert( s, response, jqXHR, isSuccess ) {
	var conv2, current, conv, tmp, prev,
		converters = {},

		// Work with a copy of dataTypes in case we need to modify it for conversion
		dataTypes = s.dataTypes.slice();

	// Create converters map with lowercased keys
	if ( dataTypes[ 1 ] ) {
		for ( conv in s.converters ) {
			converters[ conv.toLowerCase() ] = s.converters[ conv ];
		}
	}

	current = dataTypes.shift();

	// Convert to each sequential dataType
	while ( current ) {

		if ( s.responseFields[ current ] ) {
			jqXHR[ s.responseFields[ current ] ] = response;
		}

		// Apply the dataFilter if provided
		if ( !prev && isSuccess && s.dataFilter ) {
			response = s.dataFilter( response, s.dataType );
		}

		prev = current;
		current = dataTypes.shift();

		if ( current ) {

			// There's only work to do if current dataType is non-auto
			if ( current === "*" ) {

				current = prev;

			// Convert response if prev dataType is non-auto and differs from current
			} else if ( prev !== "*" && prev !== current ) {

				// Seek a direct converter
				conv = converters[ prev + " " + current ] || converters[ "* " + current ];

				// If none found, seek a pair
				if ( !conv ) {
					for ( conv2 in converters ) {

						// If conv2 outputs current
						tmp = conv2.split( " " );
						if ( tmp[ 1 ] === current ) {

							// If prev can be converted to accepted input
							conv = converters[ prev + " " + tmp[ 0 ] ] ||
								converters[ "* " + tmp[ 0 ] ];
							if ( conv ) {

								// Condense equivalence converters
								if ( conv === true ) {
									conv = converters[ conv2 ];

								// Otherwise, insert the intermediate dataType
								} else if ( converters[ conv2 ] !== true ) {
									current = tmp[ 0 ];
									dataTypes.unshift( tmp[ 1 ] );
								}
								break;
							}
						}
					}
				}

				// Apply converter (if not an equivalence)
				if ( conv !== true ) {

					// Unless errors are allowed to bubble, catch and return them
					if ( conv && s[ "throws" ] ) { // jscs:ignore requireDotNotation
						response = conv( response );
					} else {
						try {
							response = conv( response );
						} catch ( e ) {
							return {
								state: "parsererror",
								error: conv ? e : "No conversion from " + prev + " to " + current
							};
						}
					}
				}
			}
		}
	}

	return { state: "success", data: response };
}

jQuery.extend( {

	// Counter for holding the number of active queries
	active: 0,

	// Last-Modified header cache for next request
	lastModified: {},
	etag: {},

	ajaxSettings: {
		url: ajaxLocation,
		type: "GET",
		isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
		global: true,
		processData: true,
		async: true,
		contentType: "application/x-www-form-urlencoded; charset=UTF-8",
		/*
		timeout: 0,
		data: null,
		dataType: null,
		username: null,
		password: null,
		cache: null,
		throws: false,
		traditional: false,
		headers: {},
		*/

		accepts: {
			"*": allTypes,
			text: "text/plain",
			html: "text/html",
			xml: "application/xml, text/xml",
			json: "application/json, text/javascript"
		},

		contents: {
			xml: /\bxml\b/,
			html: /\bhtml/,
			json: /\bjson\b/
		},

		responseFields: {
			xml: "responseXML",
			text: "responseText",
			json: "responseJSON"
		},

		// Data converters
		// Keys separate source (or catchall "*") and destination types with a single space
		converters: {

			// Convert anything to text
			"* text": String,

			// Text to html (true = no transformation)
			"text html": true,

			// Evaluate text as a json expression
			"text json": jQuery.parseJSON,

			// Parse text as xml
			"text xml": jQuery.parseXML
		},

		// For options that shouldn't be deep extended:
		// you can add your own custom options here if
		// and when you create one that shouldn't be
		// deep extended (see ajaxExtend)
		flatOptions: {
			url: true,
			context: true
		}
	},

	// Creates a full fledged settings object into target
	// with both ajaxSettings and settings fields.
	// If target is omitted, writes into ajaxSettings.
	ajaxSetup: function( target, settings ) {
		return settings ?

			// Building a settings object
			ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :

			// Extending ajaxSettings
			ajaxExtend( jQuery.ajaxSettings, target );
	},

	ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
	ajaxTransport: addToPrefiltersOrTransports( transports ),

	// Main method
	ajax: function( url, options ) {

		// If url is an object, simulate pre-1.5 signature
		if ( typeof url === "object" ) {
			options = url;
			url = undefined;
		}

		// Force options to be an object
		options = options || {};

		var

			// Cross-domain detection vars
			parts,

			// Loop variable
			i,

			// URL without anti-cache param
			cacheURL,

			// Response headers as string
			responseHeadersString,

			// timeout handle
			timeoutTimer,

			// To know if global events are to be dispatched
			fireGlobals,

			transport,

			// Response headers
			responseHeaders,

			// Create the final options object
			s = jQuery.ajaxSetup( {}, options ),

			// Callbacks context
			callbackContext = s.context || s,

			// Context for global events is callbackContext if it is a DOM node or jQuery collection
			globalEventContext = s.context &&
				( callbackContext.nodeType || callbackContext.jquery ) ?
					jQuery( callbackContext ) :
					jQuery.event,

			// Deferreds
			deferred = jQuery.Deferred(),
			completeDeferred = jQuery.Callbacks( "once memory" ),

			// Status-dependent callbacks
			statusCode = s.statusCode || {},

			// Headers (they are sent all at once)
			requestHeaders = {},
			requestHeadersNames = {},

			// The jqXHR state
			state = 0,

			// Default abort message
			strAbort = "canceled",

			// Fake xhr
			jqXHR = {
				readyState: 0,

				// Builds headers hashtable if needed
				getResponseHeader: function( key ) {
					var match;
					if ( state === 2 ) {
						if ( !responseHeaders ) {
							responseHeaders = {};
							while ( ( match = rheaders.exec( responseHeadersString ) ) ) {
								responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ];
							}
						}
						match = responseHeaders[ key.toLowerCase() ];
					}
					return match == null ? null : match;
				},

				// Raw string
				getAllResponseHeaders: function() {
					return state === 2 ? responseHeadersString : null;
				},

				// Caches the header
				setRequestHeader: function( name, value ) {
					var lname = name.toLowerCase();
					if ( !state ) {
						name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
						requestHeaders[ name ] = value;
					}
					return this;
				},

				// Overrides response content-type header
				overrideMimeType: function( type ) {
					if ( !state ) {
						s.mimeType = type;
					}
					return this;
				},

				// Status-dependent callbacks
				statusCode: function( map ) {
					var code;
					if ( map ) {
						if ( state < 2 ) {
							for ( code in map ) {

								// Lazy-add the new callback in a way that preserves old ones
								statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
							}
						} else {

							// Execute the appropriate callbacks
							jqXHR.always( map[ jqXHR.status ] );
						}
					}
					return this;
				},

				// Cancel the request
				abort: function( statusText ) {
					var finalText = statusText || strAbort;
					if ( transport ) {
						transport.abort( finalText );
					}
					done( 0, finalText );
					return this;
				}
			};

		// Attach deferreds
		deferred.promise( jqXHR ).complete = completeDeferred.add;
		jqXHR.success = jqXHR.done;
		jqXHR.error = jqXHR.fail;

		// Remove hash character (#7531: and string promotion)
		// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
		// Handle falsy url in the settings object (#10093: consistency with old signature)
		// We also use the url parameter if available
		s.url = ( ( url || s.url || ajaxLocation ) + "" )
			.replace( rhash, "" )
			.replace( rprotocol, ajaxLocParts[ 1 ] + "//" );

		// Alias method option to type as per ticket #12004
		s.type = options.method || options.type || s.method || s.type;

		// Extract dataTypes list
		s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().match( rnotwhite ) || [ "" ];

		// A cross-domain request is in order when we have a protocol:host:port mismatch
		if ( s.crossDomain == null ) {
			parts = rurl.exec( s.url.toLowerCase() );
			s.crossDomain = !!( parts &&
				( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||
					( parts[ 3 ] || ( parts[ 1 ] === "http:" ? "80" : "443" ) ) !==
						( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? "80" : "443" ) ) )
			);
		}

		// Convert data if not already a string
		if ( s.data && s.processData && typeof s.data !== "string" ) {
			s.data = jQuery.param( s.data, s.traditional );
		}

		// Apply prefilters
		inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );

		// If request was aborted inside a prefilter, stop there
		if ( state === 2 ) {
			return jqXHR;
		}

		// We can fire global events as of now if asked to
		// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)
		fireGlobals = jQuery.event && s.global;

		// Watch for a new set of requests
		if ( fireGlobals && jQuery.active++ === 0 ) {
			jQuery.event.trigger( "ajaxStart" );
		}

		// Uppercase the type
		s.type = s.type.toUpperCase();

		// Determine if request has content
		s.hasContent = !rnoContent.test( s.type );

		// Save the URL in case we're toying with the If-Modified-Since
		// and/or If-None-Match header later on
		cacheURL = s.url;

		// More options handling for requests with no content
		if ( !s.hasContent ) {

			// If data is available, append data to url
			if ( s.data ) {
				cacheURL = ( s.url += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data );

				// #9682: remove data so that it's not used in an eventual retry
				delete s.data;
			}

			// Add anti-cache in url if needed
			if ( s.cache === false ) {
				s.url = rts.test( cacheURL ) ?

					// If there is already a '_' parameter, set its value
					cacheURL.replace( rts, "$1_=" + nonce++ ) :

					// Otherwise add one to the end
					cacheURL + ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + nonce++;
			}
		}

		// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
		if ( s.ifModified ) {
			if ( jQuery.lastModified[ cacheURL ] ) {
				jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
			}
			if ( jQuery.etag[ cacheURL ] ) {
				jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
			}
		}

		// Set the correct header, if data is being sent
		if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
			jqXHR.setRequestHeader( "Content-Type", s.contentType );
		}

		// Set the Accepts header for the server, depending on the dataType
		jqXHR.setRequestHeader(
			"Accept",
			s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?
				s.accepts[ s.dataTypes[ 0 ] ] +
					( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
				s.accepts[ "*" ]
		);

		// Check for headers option
		for ( i in s.headers ) {
			jqXHR.setRequestHeader( i, s.headers[ i ] );
		}

		// Allow custom headers/mimetypes and early abort
		if ( s.beforeSend &&
			( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {

			// Abort if not done already and return
			return jqXHR.abort();
		}

		// aborting is no longer a cancellation
		strAbort = "abort";

		// Install callbacks on deferreds
		for ( i in { success: 1, error: 1, complete: 1 } ) {
			jqXHR[ i ]( s[ i ] );
		}

		// Get transport
		transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );

		// If no transport, we auto-abort
		if ( !transport ) {
			done( -1, "No Transport" );
		} else {
			jqXHR.readyState = 1;

			// Send global event
			if ( fireGlobals ) {
				globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
			}

			// If request was aborted inside ajaxSend, stop there
			if ( state === 2 ) {
				return jqXHR;
			}

			// Timeout
			if ( s.async && s.timeout > 0 ) {
				timeoutTimer = window.setTimeout( function() {
					jqXHR.abort( "timeout" );
				}, s.timeout );
			}

			try {
				state = 1;
				transport.send( requestHeaders, done );
			} catch ( e ) {

				// Propagate exception as error if not done
				if ( state < 2 ) {
					done( -1, e );

				// Simply rethrow otherwise
				} else {
					throw e;
				}
			}
		}

		// Callback for when everything is done
		function done( status, nativeStatusText, responses, headers ) {
			var isSuccess, success, error, response, modified,
				statusText = nativeStatusText;

			// Called once
			if ( state === 2 ) {
				return;
			}

			// State is "done" now
			state = 2;

			// Clear timeout if it exists
			if ( timeoutTimer ) {
				window.clearTimeout( timeoutTimer );
			}

			// Dereference transport for early garbage collection
			// (no matter how long the jqXHR object will be used)
			transport = undefined;

			// Cache response headers
			responseHeadersString = headers || "";

			// Set readyState
			jqXHR.readyState = status > 0 ? 4 : 0;

			// Determine if successful
			isSuccess = status >= 200 && status < 300 || status === 304;

			// Get response data
			if ( responses ) {
				response = ajaxHandleResponses( s, jqXHR, responses );
			}

			// Convert no matter what (that way responseXXX fields are always set)
			response = ajaxConvert( s, response, jqXHR, isSuccess );

			// If successful, handle type chaining
			if ( isSuccess ) {

				// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
				if ( s.ifModified ) {
					modified = jqXHR.getResponseHeader( "Last-Modified" );
					if ( modified ) {
						jQuery.lastModified[ cacheURL ] = modified;
					}
					modified = jqXHR.getResponseHeader( "etag" );
					if ( modified ) {
						jQuery.etag[ cacheURL ] = modified;
					}
				}

				// if no content
				if ( status === 204 || s.type === "HEAD" ) {
					statusText = "nocontent";

				// if not modified
				} else if ( status === 304 ) {
					statusText = "notmodified";

				// If we have data, let's convert it
				} else {
					statusText = response.state;
					success = response.data;
					error = response.error;
					isSuccess = !error;
				}
			} else {

				// We extract error from statusText
				// then normalize statusText and status for non-aborts
				error = statusText;
				if ( status || !statusText ) {
					statusText = "error";
					if ( status < 0 ) {
						status = 0;
					}
				}
			}

			// Set data for the fake xhr object
			jqXHR.status = status;
			jqXHR.statusText = ( nativeStatusText || statusText ) + "";

			// Success/Error
			if ( isSuccess ) {
				deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
			} else {
				deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
			}

			// Status-dependent callbacks
			jqXHR.statusCode( statusCode );
			statusCode = undefined;

			if ( fireGlobals ) {
				globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
					[ jqXHR, s, isSuccess ? success : error ] );
			}

			// Complete
			completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );

			if ( fireGlobals ) {
				globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );

				// Handle the global AJAX counter
				if ( !( --jQuery.active ) ) {
					jQuery.event.trigger( "ajaxStop" );
				}
			}
		}

		return jqXHR;
	},

	getJSON: function( url, data, callback ) {
		return jQuery.get( url, data, callback, "json" );
	},

	getScript: function( url, callback ) {
		return jQuery.get( url, undefined, callback, "script" );
	}
} );

jQuery.each( [ "get", "post" ], function( i, method ) {
	jQuery[ method ] = function( url, data, callback, type ) {

		// shift arguments if data argument was omitted
		if ( jQuery.isFunction( data ) ) {
			type = type || callback;
			callback = data;
			data = undefined;
		}

		// The url can be an options object (which then must have .url)
		return jQuery.ajax( jQuery.extend( {
			url: url,
			type: method,
			dataType: type,
			data: data,
			success: callback
		}, jQuery.isPlainObject( url ) && url ) );
	};
} );


jQuery._evalUrl = function( url ) {
	return jQuery.ajax( {
		url: url,

		// Make this explicit, since user can override this through ajaxSetup (#11264)
		type: "GET",
		dataType: "script",
		cache: true,
		async: false,
		global: false,
		"throws": true
	} );
};


jQuery.fn.extend( {
	wrapAll: function( html ) {
		if ( jQuery.isFunction( html ) ) {
			return this.each( function( i ) {
				jQuery( this ).wrapAll( html.call( this, i ) );
			} );
		}

		if ( this[ 0 ] ) {

			// The elements to wrap the target around
			var wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );

			if ( this[ 0 ].parentNode ) {
				wrap.insertBefore( this[ 0 ] );
			}

			wrap.map( function() {
				var elem = this;

				while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
					elem = elem.firstChild;
				}

				return elem;
			} ).append( this );
		}

		return this;
	},

	wrapInner: function( html ) {
		if ( jQuery.isFunction( html ) ) {
			return this.each( function( i ) {
				jQuery( this ).wrapInner( html.call( this, i ) );
			} );
		}

		return this.each( function() {
			var self = jQuery( this ),
				contents = self.contents();

			if ( contents.length ) {
				contents.wrapAll( html );

			} else {
				self.append( html );
			}
		} );
	},

	wrap: function( html ) {
		var isFunction = jQuery.isFunction( html );

		return this.each( function( i ) {
			jQuery( this ).wrapAll( isFunction ? html.call( this, i ) : html );
		} );
	},

	unwrap: function() {
		return this.parent().each( function() {
			if ( !jQuery.nodeName( this, "body" ) ) {
				jQuery( this ).replaceWith( this.childNodes );
			}
		} ).end();
	}
} );


function getDisplay( elem ) {
	return elem.style && elem.style.display || jQuery.css( elem, "display" );
}

function filterHidden( elem ) {

	// Disconnected elements are considered hidden
	if ( !jQuery.contains( elem.ownerDocument || document, elem ) ) {
		return true;
	}
	while ( elem && elem.nodeType === 1 ) {
		if ( getDisplay( elem ) === "none" || elem.type === "hidden" ) {
			return true;
		}
		elem = elem.parentNode;
	}
	return false;
}

jQuery.expr.filters.hidden = function( elem ) {

	// Support: Opera <= 12.12
	// Opera reports offsetWidths and offsetHeights less than zero on some elements
	return support.reliableHiddenOffsets() ?
		( elem.offsetWidth <= 0 && elem.offsetHeight <= 0 &&
			!elem.getClientRects().length ) :
			filterHidden( elem );
};

jQuery.expr.filters.visible = function( elem ) {
	return !jQuery.expr.filters.hidden( elem );
};




var r20 = /%20/g,
	rbracket = /\[\]$/,
	rCRLF = /\r?\n/g,
	rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
	rsubmittable = /^(?:input|select|textarea|keygen)/i;

function buildParams( prefix, obj, traditional, add ) {
	var name;

	if ( jQuery.isArray( obj ) ) {

		// Serialize array item.
		jQuery.each( obj, function( i, v ) {
			if ( traditional || rbracket.test( prefix ) ) {

				// Treat each array item as a scalar.
				add( prefix, v );

			} else {

				// Item is non-scalar (array or object), encode its numeric index.
				buildParams(
					prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]",
					v,
					traditional,
					add
				);
			}
		} );

	} else if ( !traditional && jQuery.type( obj ) === "object" ) {

		// Serialize object item.
		for ( name in obj ) {
			buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
		}

	} else {

		// Serialize scalar item.
		add( prefix, obj );
	}
}

// Serialize an array of form elements or a set of
// key/values into a query string
jQuery.param = function( a, traditional ) {
	var prefix,
		s = [],
		add = function( key, value ) {

			// If value is a function, invoke it and return its value
			value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
			s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
		};

	// Set traditional to true for jQuery <= 1.3.2 behavior.
	if ( traditional === undefined ) {
		traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
	}

	// If an array was passed in, assume that it is an array of form elements.
	if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {

		// Serialize the form elements
		jQuery.each( a, function() {
			add( this.name, this.value );
		} );

	} else {

		// If traditional, encode the "old" way (the way 1.3.2 or older
		// did it), otherwise encode params recursively.
		for ( prefix in a ) {
			buildParams( prefix, a[ prefix ], traditional, add );
		}
	}

	// Return the resulting serialization
	return s.join( "&" ).replace( r20, "+" );
};

jQuery.fn.extend( {
	serialize: function() {
		return jQuery.param( this.serializeArray() );
	},
	serializeArray: function() {
		return this.map( function() {

			// Can add propHook for "elements" to filter or add form elements
			var elements = jQuery.prop( this, "elements" );
			return elements ? jQuery.makeArray( elements ) : this;
		} )
		.filter( function() {
			var type = this.type;

			// Use .is(":disabled") so that fieldset[disabled] works
			return this.name && !jQuery( this ).is( ":disabled" ) &&
				rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
				( this.checked || !rcheckableType.test( type ) );
		} )
		.map( function( i, elem ) {
			var val = jQuery( this ).val();

			return val == null ?
				null :
				jQuery.isArray( val ) ?
					jQuery.map( val, function( val ) {
						return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
					} ) :
					{ name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
		} ).get();
	}
} );


// Create the request object
// (This is still attached to ajaxSettings for backward compatibility)
jQuery.ajaxSettings.xhr = window.ActiveXObject !== undefined ?

	// Support: IE6-IE8
	function() {

		// XHR cannot access local files, always use ActiveX for that case
		if ( this.isLocal ) {
			return createActiveXHR();
		}

		// Support: IE 9-11
		// IE seems to error on cross-domain PATCH requests when ActiveX XHR
		// is used. In IE 9+ always use the native XHR.
		// Note: this condition won't catch Edge as it doesn't define
		// document.documentMode but it also doesn't support ActiveX so it won't
		// reach this code.
		if ( document.documentMode > 8 ) {
			return createStandardXHR();
		}

		// Support: IE<9
		// oldIE XHR does not support non-RFC2616 methods (#13240)
		// See http://msdn.microsoft.com/en-us/library/ie/ms536648(v=vs.85).aspx
		// and http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9
		// Although this check for six methods instead of eight
		// since IE also does not support "trace" and "connect"
		return /^(get|post|head|put|delete|options)$/i.test( this.type ) &&
			createStandardXHR() || createActiveXHR();
	} :

	// For all other browsers, use the standard XMLHttpRequest object
	createStandardXHR;

var xhrId = 0,
	xhrCallbacks = {},
	xhrSupported = jQuery.ajaxSettings.xhr();

// Support: IE<10
// Open requests must be manually aborted on unload (#5280)
// See https://support.microsoft.com/kb/2856746 for more info
if ( window.attachEvent ) {
	window.attachEvent( "onunload", function() {
		for ( var key in xhrCallbacks ) {
			xhrCallbacks[ key ]( undefined, true );
		}
	} );
}

// Determine support properties
support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
xhrSupported = support.ajax = !!xhrSupported;

// Create transport if the browser can provide an xhr
if ( xhrSupported ) {

	jQuery.ajaxTransport( function( options ) {

		// Cross domain only allowed if supported through XMLHttpRequest
		if ( !options.crossDomain || support.cors ) {

			var callback;

			return {
				send: function( headers, complete ) {
					var i,
						xhr = options.xhr(),
						id = ++xhrId;

					// Open the socket
					xhr.open(
						options.type,
						options.url,
						options.async,
						options.username,
						options.password
					);

					// Apply custom fields if provided
					if ( options.xhrFields ) {
						for ( i in options.xhrFields ) {
							xhr[ i ] = options.xhrFields[ i ];
						}
					}

					// Override mime type if needed
					if ( options.mimeType && xhr.overrideMimeType ) {
						xhr.overrideMimeType( options.mimeType );
					}

					// X-Requested-With header
					// For cross-domain requests, seeing as conditions for a preflight are
					// akin to a jigsaw puzzle, we simply never set it to be sure.
					// (it can always be set on a per-request basis or even using ajaxSetup)
					// For same-domain requests, won't change header if already provided.
					if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) {
						headers[ "X-Requested-With" ] = "XMLHttpRequest";
					}

					// Set headers
					for ( i in headers ) {

						// Support: IE<9
						// IE's ActiveXObject throws a 'Type Mismatch' exception when setting
						// request header to a null-value.
						//
						// To keep consistent with other XHR implementations, cast the value
						// to string and ignore `undefined`.
						if ( headers[ i ] !== undefined ) {
							xhr.setRequestHeader( i, headers[ i ] + "" );
						}
					}

					// Do send the request
					// This may raise an exception which is actually
					// handled in jQuery.ajax (so no try/catch here)
					xhr.send( ( options.hasContent && options.data ) || null );

					// Listener
					callback = function( _, isAbort ) {
						var status, statusText, responses;

						// Was never called and is aborted or complete
						if ( callback && ( isAbort || xhr.readyState === 4 ) ) {

							// Clean up
							delete xhrCallbacks[ id ];
							callback = undefined;
							xhr.onreadystatechange = jQuery.noop;

							// Abort manually if needed
							if ( isAbort ) {
								if ( xhr.readyState !== 4 ) {
									xhr.abort();
								}
							} else {
								responses = {};
								status = xhr.status;

								// Support: IE<10
								// Accessing binary-data responseText throws an exception
								// (#11426)
								if ( typeof xhr.responseText === "string" ) {
									responses.text = xhr.responseText;
								}

								// Firefox throws an exception when accessing
								// statusText for faulty cross-domain requests
								try {
									statusText = xhr.statusText;
								} catch ( e ) {

									// We normalize with Webkit giving an empty statusText
									statusText = "";
								}

								// Filter status for non standard behaviors

								// If the request is local and we have data: assume a success
								// (success with no data won't get notified, that's the best we
								// can do given current implementations)
								if ( !status && options.isLocal && !options.crossDomain ) {
									status = responses.text ? 200 : 404;

								// IE - #1450: sometimes returns 1223 when it should be 204
								} else if ( status === 1223 ) {
									status = 204;
								}
							}
						}

						// Call complete if needed
						if ( responses ) {
							complete( status, statusText, responses, xhr.getAllResponseHeaders() );
						}
					};

					// Do send the request
					// `xhr.send` may raise an exception, but it will be
					// handled in jQuery.ajax (so no try/catch here)
					if ( !options.async ) {

						// If we're in sync mode we fire the callback
						callback();
					} else if ( xhr.readyState === 4 ) {

						// (IE6 & IE7) if it's in cache and has been
						// retrieved directly we need to fire the callback
						window.setTimeout( callback );
					} else {

						// Register the callback, but delay it in case `xhr.send` throws
						// Add to the list of active xhr callbacks
						xhr.onreadystatechange = xhrCallbacks[ id ] = callback;
					}
				},

				abort: function() {
					if ( callback ) {
						callback( undefined, true );
					}
				}
			};
		}
	} );
}

// Functions to create xhrs
function createStandardXHR() {
	try {
		return new window.XMLHttpRequest();
	} catch ( e ) {}
}

function createActiveXHR() {
	try {
		return new window.ActiveXObject( "Microsoft.XMLHTTP" );
	} catch ( e ) {}
}




// Install script dataType
jQuery.ajaxSetup( {
	accepts: {
		script: "text/javascript, application/javascript, " +
			"application/ecmascript, application/x-ecmascript"
	},
	contents: {
		script: /\b(?:java|ecma)script\b/
	},
	converters: {
		"text script": function( text ) {
			jQuery.globalEval( text );
			return text;
		}
	}
} );

// Handle cache's special case and global
jQuery.ajaxPrefilter( "script", function( s ) {
	if ( s.cache === undefined ) {
		s.cache = false;
	}
	if ( s.crossDomain ) {
		s.type = "GET";
		s.global = false;
	}
} );

// Bind script tag hack transport
jQuery.ajaxTransport( "script", function( s ) {

	// This transport only deals with cross domain requests
	if ( s.crossDomain ) {

		var script,
			head = document.head || jQuery( "head" )[ 0 ] || document.documentElement;

		return {

			send: function( _, callback ) {

				script = document.createElement( "script" );

				script.async = true;

				if ( s.scriptCharset ) {
					script.charset = s.scriptCharset;
				}

				script.src = s.url;

				// Attach handlers for all browsers
				script.onload = script.onreadystatechange = function( _, isAbort ) {

					if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {

						// Handle memory leak in IE
						script.onload = script.onreadystatechange = null;

						// Remove the script
						if ( script.parentNode ) {
							script.parentNode.removeChild( script );
						}

						// Dereference the script
						script = null;

						// Callback if not abort
						if ( !isAbort ) {
							callback( 200, "success" );
						}
					}
				};

				// Circumvent IE6 bugs with base elements (#2709 and #4378) by prepending
				// Use native DOM manipulation to avoid our domManip AJAX trickery
				head.insertBefore( script, head.firstChild );
			},

			abort: function() {
				if ( script ) {
					script.onload( undefined, true );
				}
			}
		};
	}
} );




var oldCallbacks = [],
	rjsonp = /(=)\?(?=&|$)|\?\?/;

// Default jsonp settings
jQuery.ajaxSetup( {
	jsonp: "callback",
	jsonpCallback: function() {
		var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
		this[ callback ] = true;
		return callback;
	}
} );

// Detect, normalize options and install callbacks for jsonp requests
jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {

	var callbackName, overwritten, responseContainer,
		jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
			"url" :
			typeof s.data === "string" &&
				( s.contentType || "" )
					.indexOf( "application/x-www-form-urlencoded" ) === 0 &&
				rjsonp.test( s.data ) && "data"
		);

	// Handle iff the expected data type is "jsonp" or we have a parameter to set
	if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {

		// Get callback name, remembering preexisting value associated with it
		callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
			s.jsonpCallback() :
			s.jsonpCallback;

		// Insert callback into url or form data
		if ( jsonProp ) {
			s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
		} else if ( s.jsonp !== false ) {
			s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
		}

		// Use data converter to retrieve json after script execution
		s.converters[ "script json" ] = function() {
			if ( !responseContainer ) {
				jQuery.error( callbackName + " was not called" );
			}
			return responseContainer[ 0 ];
		};

		// force json dataType
		s.dataTypes[ 0 ] = "json";

		// Install callback
		overwritten = window[ callbackName ];
		window[ callbackName ] = function() {
			responseContainer = arguments;
		};

		// Clean-up function (fires after converters)
		jqXHR.always( function() {

			// If previous value didn't exist - remove it
			if ( overwritten === undefined ) {
				jQuery( window ).removeProp( callbackName );

			// Otherwise restore preexisting value
			} else {
				window[ callbackName ] = overwritten;
			}

			// Save back as free
			if ( s[ callbackName ] ) {

				// make sure that re-using the options doesn't screw things around
				s.jsonpCallback = originalSettings.jsonpCallback;

				// save the callback name for future use
				oldCallbacks.push( callbackName );
			}

			// Call if it was a function and we have a response
			if ( responseContainer && jQuery.isFunction( overwritten ) ) {
				overwritten( responseContainer[ 0 ] );
			}

			responseContainer = overwritten = undefined;
		} );

		// Delegate to script
		return "script";
	}
} );




// data: string of html
// context (optional): If specified, the fragment will be created in this context,
// defaults to document
// keepScripts (optional): If true, will include scripts passed in the html string
jQuery.parseHTML = function( data, context, keepScripts ) {
	if ( !data || typeof data !== "string" ) {
		return null;
	}
	if ( typeof context === "boolean" ) {
		keepScripts = context;
		context = false;
	}
	context = context || document;

	var parsed = rsingleTag.exec( data ),
		scripts = !keepScripts && [];

	// Single tag
	if ( parsed ) {
		return [ context.createElement( parsed[ 1 ] ) ];
	}

	parsed = buildFragment( [ data ], context, scripts );

	if ( scripts && scripts.length ) {
		jQuery( scripts ).remove();
	}

	return jQuery.merge( [], parsed.childNodes );
};


// Keep a copy of the old load method
var _load = jQuery.fn.load;

/**
 * Load a url into a page
 */
jQuery.fn.load = function( url, params, callback ) {
	if ( typeof url !== "string" && _load ) {
		return _load.apply( this, arguments );
	}

	var selector, type, response,
		self = this,
		off = url.indexOf( " " );

	if ( off > -1 ) {
		selector = jQuery.trim( url.slice( off, url.length ) );
		url = url.slice( 0, off );
	}

	// If it's a function
	if ( jQuery.isFunction( params ) ) {

		// We assume that it's the callback
		callback = params;
		params = undefined;

	// Otherwise, build a param string
	} else if ( params && typeof params === "object" ) {
		type = "POST";
	}

	// If we have elements to modify, make the request
	if ( self.length > 0 ) {
		jQuery.ajax( {
			url: url,

			// If "type" variable is undefined, then "GET" method will be used.
			// Make value of this field explicit since
			// user can override it through ajaxSetup method
			type: type || "GET",
			dataType: "html",
			data: params
		} ).done( function( responseText ) {

			// Save response for use in complete callback
			response = arguments;

			self.html( selector ?

				// If a selector was specified, locate the right elements in a dummy div
				// Exclude scripts to avoid IE 'Permission Denied' errors
				jQuery( "<div>" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :

				// Otherwise use the full result
				responseText );

		// If the request succeeds, this function gets "data", "status", "jqXHR"
		// but they are ignored because response was set above.
		// If it fails, this function gets "jqXHR", "status", "error"
		} ).always( callback && function( jqXHR, status ) {
			self.each( function() {
				callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );
			} );
		} );
	}

	return this;
};




// Attach a bunch of functions for handling common AJAX events
jQuery.each( [
	"ajaxStart",
	"ajaxStop",
	"ajaxComplete",
	"ajaxError",
	"ajaxSuccess",
	"ajaxSend"
], function( i, type ) {
	jQuery.fn[ type ] = function( fn ) {
		return this.on( type, fn );
	};
} );




jQuery.expr.filters.animated = function( elem ) {
	return jQuery.grep( jQuery.timers, function( fn ) {
		return elem === fn.elem;
	} ).length;
};





/**
 * Gets a window from an element
 */
function getWindow( elem ) {
	return jQuery.isWindow( elem ) ?
		elem :
		elem.nodeType === 9 ?
			elem.defaultView || elem.parentWindow :
			false;
}

jQuery.offset = {
	setOffset: function( elem, options, i ) {
		var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
			position = jQuery.css( elem, "position" ),
			curElem = jQuery( elem ),
			props = {};

		// set position first, in-case top/left are set even on static elem
		if ( position === "static" ) {
			elem.style.position = "relative";
		}

		curOffset = curElem.offset();
		curCSSTop = jQuery.css( elem, "top" );
		curCSSLeft = jQuery.css( elem, "left" );
		calculatePosition = ( position === "absolute" || position === "fixed" ) &&
			jQuery.inArray( "auto", [ curCSSTop, curCSSLeft ] ) > -1;

		// need to be able to calculate position if either top or left
		// is auto and position is either absolute or fixed
		if ( calculatePosition ) {
			curPosition = curElem.position();
			curTop = curPosition.top;
			curLeft = curPosition.left;
		} else {
			curTop = parseFloat( curCSSTop ) || 0;
			curLeft = parseFloat( curCSSLeft ) || 0;
		}

		if ( jQuery.isFunction( options ) ) {

			// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)
			options = options.call( elem, i, jQuery.extend( {}, curOffset ) );
		}

		if ( options.top != null ) {
			props.top = ( options.top - curOffset.top ) + curTop;
		}
		if ( options.left != null ) {
			props.left = ( options.left - curOffset.left ) + curLeft;
		}

		if ( "using" in options ) {
			options.using.call( elem, props );
		} else {
			curElem.css( props );
		}
	}
};

jQuery.fn.extend( {
	offset: function( options ) {
		if ( arguments.length ) {
			return options === undefined ?
				this :
				this.each( function( i ) {
					jQuery.offset.setOffset( this, options, i );
				} );
		}

		var docElem, win,
			box = { top: 0, left: 0 },
			elem = this[ 0 ],
			doc = elem && elem.ownerDocument;

		if ( !doc ) {
			return;
		}

		docElem = doc.documentElement;

		// Make sure it's not a disconnected DOM node
		if ( !jQuery.contains( docElem, elem ) ) {
			return box;
		}

		// If we don't have gBCR, just use 0,0 rather than error
		// BlackBerry 5, iOS 3 (original iPhone)
		if ( typeof elem.getBoundingClientRect !== "undefined" ) {
			box = elem.getBoundingClientRect();
		}
		win = getWindow( doc );
		return {
			top: box.top  + ( win.pageYOffset || docElem.scrollTop )  - ( docElem.clientTop  || 0 ),
			left: box.left + ( win.pageXOffset || docElem.scrollLeft ) - ( docElem.clientLeft || 0 )
		};
	},

	position: function() {
		if ( !this[ 0 ] ) {
			return;
		}

		var offsetParent, offset,
			parentOffset = { top: 0, left: 0 },
			elem = this[ 0 ];

		// Fixed elements are offset from window (parentOffset = {top:0, left: 0},
		// because it is its only offset parent
		if ( jQuery.css( elem, "position" ) === "fixed" ) {

			// we assume that getBoundingClientRect is available when computed position is fixed
			offset = elem.getBoundingClientRect();
		} else {

			// Get *real* offsetParent
			offsetParent = this.offsetParent();

			// Get correct offsets
			offset = this.offset();
			if ( !jQuery.nodeName( offsetParent[ 0 ], "html" ) ) {
				parentOffset = offsetParent.offset();
			}

			// Add offsetParent borders
			parentOffset.top  += jQuery.css( offsetParent[ 0 ], "borderTopWidth", true );
			parentOffset.left += jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true );
		}

		// Subtract parent offsets and element margins
		// note: when an element has margin: auto the offsetLeft and marginLeft
		// are the same in Safari causing offset.left to incorrectly be 0
		return {
			top:  offset.top  - parentOffset.top - jQuery.css( elem, "marginTop", true ),
			left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true )
		};
	},

	offsetParent: function() {
		return this.map( function() {
			var offsetParent = this.offsetParent;

			while ( offsetParent && ( !jQuery.nodeName( offsetParent, "html" ) &&
				jQuery.css( offsetParent, "position" ) === "static" ) ) {
				offsetParent = offsetParent.offsetParent;
			}
			return offsetParent || documentElement;
		} );
	}
} );

// Create scrollLeft and scrollTop methods
jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {
	var top = /Y/.test( prop );

	jQuery.fn[ method ] = function( val ) {
		return access( this, function( elem, method, val ) {
			var win = getWindow( elem );

			if ( val === undefined ) {
				return win ? ( prop in win ) ? win[ prop ] :
					win.document.documentElement[ method ] :
					elem[ method ];
			}

			if ( win ) {
				win.scrollTo(
					!top ? val : jQuery( win ).scrollLeft(),
					top ? val : jQuery( win ).scrollTop()
				);

			} else {
				elem[ method ] = val;
			}
		}, method, val, arguments.length, null );
	};
} );

// Support: Safari<7-8+, Chrome<37-44+
// Add the top/left cssHooks using jQuery.fn.position
// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
// getComputedStyle returns percent when specified for top/left/bottom/right
// rather than make the css module depend on the offset module, we just check for it here
jQuery.each( [ "top", "left" ], function( i, prop ) {
	jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
		function( elem, computed ) {
			if ( computed ) {
				computed = curCSS( elem, prop );

				// if curCSS returns percentage, fallback to offset
				return rnumnonpx.test( computed ) ?
					jQuery( elem ).position()[ prop ] + "px" :
					computed;
			}
		}
	);
} );


// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
	jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name },
	function( defaultExtra, funcName ) {

		// margin is only for outerHeight, outerWidth
		jQuery.fn[ funcName ] = function( margin, value ) {
			var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
				extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );

			return access( this, function( elem, type, value ) {
				var doc;

				if ( jQuery.isWindow( elem ) ) {

					// As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
					// isn't a whole lot we can do. See pull request at this URL for discussion:
					// https://github.com/jquery/jquery/pull/764
					return elem.document.documentElement[ "client" + name ];
				}

				// Get document width or height
				if ( elem.nodeType === 9 ) {
					doc = elem.documentElement;

					// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
					// whichever is greatest
					// unfortunately, this causes bug #3838 in IE6/8 only,
					// but there is currently no good, small way to fix it.
					return Math.max(
						elem.body[ "scroll" + name ], doc[ "scroll" + name ],
						elem.body[ "offset" + name ], doc[ "offset" + name ],
						doc[ "client" + name ]
					);
				}

				return value === undefined ?

					// Get width or height on the element, requesting but not forcing parseFloat
					jQuery.css( elem, type, extra ) :

					// Set width or height on the element
					jQuery.style( elem, type, value, extra );
			}, type, chainable ? margin : undefined, chainable, null );
		};
	} );
} );


jQuery.fn.extend( {

	bind: function( types, data, fn ) {
		return this.on( types, null, data, fn );
	},
	unbind: function( types, fn ) {
		return this.off( types, null, fn );
	},

	delegate: function( selector, types, data, fn ) {
		return this.on( types, selector, data, fn );
	},
	undelegate: function( selector, types, fn ) {

		// ( namespace ) or ( selector, types [, fn] )
		return arguments.length === 1 ?
			this.off( selector, "**" ) :
			this.off( types, selector || "**", fn );
	}
} );

// The number of elements contained in the matched element set
jQuery.fn.size = function() {
	return this.length;
};

jQuery.fn.andSelf = jQuery.fn.addBack;




// Register as a named AMD module, since jQuery can be concatenated with other
// files that may use define, but not via a proper concatenation script that
// understands anonymous AMD modules. A named AMD is safest and most robust
// way to register. Lowercase jquery is used because AMD module names are
// derived from file names, and jQuery is normally delivered in a lowercase
// file name. Do this after creating the global so that if an AMD module wants
// to call noConflict to hide this version of jQuery, it will work.

// Note that for maximum portability, libraries that are not jQuery should
// declare themselves as anonymous modules, and avoid setting a global if an
// AMD loader is present. jQuery is a special case. For more information, see
// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon

if ( typeof define === "function" && define.amd ) {
	define( "jquery", [], function() {
		return jQuery;
	} );
}



var

	// Map over jQuery in case of overwrite
	_jQuery = window.jQuery,

	// Map over the $ in case of overwrite
	_$ = window.$;

jQuery.noConflict = function( deep ) {
	if ( window.$ === jQuery ) {
		window.$ = _$;
	}

	if ( deep && window.jQuery === jQuery ) {
		window.jQuery = _jQuery;
	}

	return jQuery;
};

// Expose jQuery and $ identifiers, even in
// AMD (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
// and CommonJS for browser emulators (#13566)
if ( !noGlobal ) {
	window.jQuery = window.$ = jQuery;
}

return jQuery;
}));

},{}],110:[function(require,module,exports){
(function (factory) {
    // Module systems magic dance.

    if (typeof require === "function" && typeof exports === "object" && typeof module === "object") {
        // CommonJS or Node: hard-coded dependency on "knockout"
        factory(require("knockout"), exports);
    } else if (typeof define === "function" && define["amd"]) {
        // AMD anonymous module with hard-coded dependency on "knockout"
        define(["knockout", "exports"], factory);
    } else {
        // <script> tag: use the global `ko` object, attaching a `mapping` property
        factory(ko, ko.mapping = {});
    }
}(function (ko, exports) {
    var DEBUG = true;
    var mappingProperty = "__ko_mapping__";
    var realKoDependentObservable = ko.dependentObservable;
    var mappingNesting = 0;
    var dependentObservables;
    var visitedObjects;
    var recognizedRootProperties = ["create", "update", "key", "arrayChanged"];
    var emptyReturn = {};

    var _defaultOptions = {
        include: ["_destroy"],
        ignore: [],
        copy: [],
        observe: []
    };
    var defaultOptions = _defaultOptions;

    function unionArrays() {
        var args = arguments,
        l = args.length,
        obj = {},
        res = [],
        i, j, k;

        while (l--) {
            k = args[l];
            i = k.length;

            while (i--) {
                j = k[i];
                if (!obj[j]) {
                    obj[j] = 1;
                    res.push(j);
                }
            }
        }

        return res;
    }

    function extendObject(destination, source) {
        var destType;

        for (var key in source) {
            if (source.hasOwnProperty(key) && source[key]) {
                destType = exports.getType(destination[key]);
                if (key && destination[key] && destType !== "array" && destType !== "string") {
                    extendObject(destination[key], source[key]);
                } else {
                    var bothArrays = exports.getType(destination[key]) === "array" && exports.getType(source[key]) === "array";
                    if (bothArrays) {
                        destination[key] = unionArrays(destination[key], source[key]);
                    } else {
                        destination[key] = source[key];
                    }
                }
            }
        }
    }

    function merge(obj1, obj2) {
        var merged = {};
        extendObject(merged, obj1);
        extendObject(merged, obj2);

        return merged;
    }

    exports.isMapped = function (viewModel) {
        var unwrapped = ko.utils.unwrapObservable(viewModel);
        return unwrapped && unwrapped[mappingProperty];
    };

    exports.fromJS = function (jsObject /*, inputOptions, target*/ ) {
        if (!arguments.length) throw new Error("When calling ko.mapping.fromJS, pass the object you want to convert.");

        try {
            if (!mappingNesting++) {
                dependentObservables = [];
                visitedObjects = new objectLookup();
            }

            var options;
            var target;

            if (arguments.length == 2) {
                if (arguments[1][mappingProperty]) {
                    target = arguments[1];
                } else {
                    options = arguments[1];
                }
            }
            if (arguments.length == 3) {
                options = arguments[1];
                target = arguments[2];
            }

            if (target) {
                options = merge(options, target[mappingProperty]);
            }
            options = fillOptions(options);

            var result = updateViewModel(target, jsObject, options);
            if (target) {
                result = target;
            }

            // Evaluate any dependent observables that were proxied.
            // Do this after the model's observables have been created
            if (!--mappingNesting) {
                while (dependentObservables.length) {
                    var DO = dependentObservables.pop();
                    if (DO) {
                        DO();

                        // Move this magic property to the underlying dependent observable
                        DO.__DO["throttleEvaluation"] = DO["throttleEvaluation"];
                    }
                }
            }

            // Save any new mapping options in the view model, so that updateFromJS can use them later.
            result[mappingProperty] = merge(result[mappingProperty], options);

            return result;
        } catch(e) {
            mappingNesting = 0;
            throw e;
        }
    };

    exports.fromJSON = function (jsonString /*, options, target*/ ) {
        var parsed = ko.utils.parseJson(jsonString);
        var argArray = Array.prototype.slice.call(arguments);
        argArray[0] = parsed;
        return exports.fromJS.apply(this, argArray);
    };

    exports.updateFromJS = function (viewModel) {
        throw new Error("ko.mapping.updateFromJS, use ko.mapping.fromJS instead. Please note that the order of parameters is different!");
    };

    exports.updateFromJSON = function (viewModel) {
        throw new Error("ko.mapping.updateFromJSON, use ko.mapping.fromJSON instead. Please note that the order of parameters is different!");
    };

    exports.toJS = function (rootObject, options) {
        if (!defaultOptions) exports.resetDefaultOptions();

        if (!arguments.length) throw new Error("When calling ko.mapping.toJS, pass the object you want to convert.");
        if (exports.getType(defaultOptions.ignore) !== "array") throw new Error("ko.mapping.defaultOptions().ignore should be an array.");
        if (exports.getType(defaultOptions.include) !== "array") throw new Error("ko.mapping.defaultOptions().include should be an array.");
        if (exports.getType(defaultOptions.copy) !== "array") throw new Error("ko.mapping.defaultOptions().copy should be an array.");

        // Merge in the options used in fromJS
        options = fillOptions(options, rootObject[mappingProperty]);

        // We just unwrap everything at every level in the object graph
        return exports.visitModel(rootObject, function (x) {
            return ko.utils.unwrapObservable(x);
        }, options);
    };

    exports.toJSON = function (rootObject, options) {
        var plainJavaScriptObject = exports.toJS(rootObject, options);
        return ko.utils.stringifyJson(plainJavaScriptObject);
    };

    exports.defaultOptions = function () {
        if (arguments.length > 0) {
            defaultOptions = arguments[0];
        } else {
            return defaultOptions;
        }
    };

    exports.resetDefaultOptions = function () {
        defaultOptions = {
            include: _defaultOptions.include.slice(0),
            ignore: _defaultOptions.ignore.slice(0),
            copy: _defaultOptions.copy.slice(0),
            observe: _defaultOptions.observe.slice(0)
        };
    };

    exports.getType = function(x) {
        if ((x) && (typeof (x) === "object")) {
            if (x.constructor === Date) return "date";
            if (x.constructor === Array) return "array";
        }
        return typeof x;
    };

    function fillOptions(rawOptions, otherOptions) {
        var options = merge({}, rawOptions);

        // Move recognized root-level properties into a root namespace
        for (var i = recognizedRootProperties.length - 1; i >= 0; i--) {
            var property = recognizedRootProperties[i];

            // Carry on, unless this property is present
            if (!options[property]) continue;

            // Move the property into the root namespace
            if (!(options[""] instanceof Object)) options[""] = {};
            options[""][property] = options[property];
            delete options[property];
        }

        if (otherOptions) {
            options.ignore = mergeArrays(otherOptions.ignore, options.ignore);
            options.include = mergeArrays(otherOptions.include, options.include);
            options.copy = mergeArrays(otherOptions.copy, options.copy);
            options.observe = mergeArrays(otherOptions.observe, options.observe);
        }
        options.ignore = mergeArrays(options.ignore, defaultOptions.ignore);
        options.include = mergeArrays(options.include, defaultOptions.include);
        options.copy = mergeArrays(options.copy, defaultOptions.copy);
        options.observe = mergeArrays(options.observe, defaultOptions.observe);

        options.mappedProperties = options.mappedProperties || {};
        options.copiedProperties = options.copiedProperties || {};
        return options;
    }

    function mergeArrays(a, b) {
        if (exports.getType(a) !== "array") {
            if (exports.getType(a) === "undefined") a = [];
            else a = [a];
        }
        if (exports.getType(b) !== "array") {
            if (exports.getType(b) === "undefined") b = [];
            else b = [b];
        }

        return ko.utils.arrayGetDistinctValues(a.concat(b));
    }

    // When using a 'create' callback, we proxy the dependent observable so that it doesn't immediately evaluate on creation.
    // The reason is that the dependent observables in the user-specified callback may contain references to properties that have not been mapped yet.
    function withProxyDependentObservable(dependentObservables, callback) {
        var localDO = ko.dependentObservable;
        ko.dependentObservable = function (read, owner, options) {
            options = options || {};

            if (read && typeof read == "object") { // mirrors condition in knockout implementation of DO's
                options = read;
            }

            var realDeferEvaluation = options.deferEvaluation;

            var isRemoved = false;

            // We wrap the original dependent observable so that we can remove it from the 'dependentObservables' list we need to evaluate after mapping has
            // completed if the user already evaluated the DO themselves in the meantime.
            var wrap = function (DO) {
                // Temporarily revert ko.dependentObservable, since it is used in ko.isWriteableObservable
                var tmp = ko.dependentObservable;
                ko.dependentObservable = realKoDependentObservable;
                var isWriteable = ko.isWriteableObservable(DO);
                ko.dependentObservable = tmp;

                var wrapped = realKoDependentObservable({
                    read: function () {
                        if (!isRemoved) {
                            ko.utils.arrayRemoveItem(dependentObservables, DO);
                            isRemoved = true;
                        }
                        return DO.apply(DO, arguments);
                    },
                    write: isWriteable && function (val) {
                        return DO(val);
                    },
                    deferEvaluation: true
                });
                if (DEBUG) wrapped._wrapper = true;
                wrapped.__DO = DO;
                return wrapped;
            };

            options.deferEvaluation = true; // will either set for just options, or both read/options.
            var realDependentObservable = new realKoDependentObservable(read, owner, options);

            if (!realDeferEvaluation) {
                realDependentObservable = wrap(realDependentObservable);
                dependentObservables.push(realDependentObservable);
            }

            return realDependentObservable;
        };
        ko.dependentObservable.fn = realKoDependentObservable.fn;
        ko.computed = ko.dependentObservable;
        var result = callback();
        ko.dependentObservable = localDO;
        ko.computed = ko.dependentObservable;
        return result;
    }

    function updateViewModel(mappedRootObject, rootObject, options, parentName, parent, parentPropertyName, mappedParent) {
        var isArray = exports.getType(ko.utils.unwrapObservable(rootObject)) === "array";

        parentPropertyName = parentPropertyName || "";

        // If this object was already mapped previously, take the options from there and merge them with our existing ones.
        if (exports.isMapped(mappedRootObject)) {
            var previousMapping = ko.utils.unwrapObservable(mappedRootObject)[mappingProperty];
            options = merge(previousMapping, options);
        }

        var callbackParams = {
            data: rootObject,
            parent: mappedParent || parent
        };

        var hasCreateCallback = function () {
            return options[parentName] && options[parentName].create instanceof Function;
        };

        var createCallback = function (data) {
            return withProxyDependentObservable(dependentObservables, function () {

                if (ko.utils.unwrapObservable(parent) instanceof Array) {
                    return options[parentName].create({
                        data: data || callbackParams.data,
                        parent: callbackParams.parent,
                        skip: emptyReturn
                    });
                } else {
                    return options[parentName].create({
                        data: data || callbackParams.data,
                        parent: callbackParams.parent
                    });
                }
            });
        };

        var hasUpdateCallback = function () {
            return options[parentName] && options[parentName].update instanceof Function;
        };

        var updateCallback = function (obj, data) {
            var params = {
                data: data || callbackParams.data,
                parent: callbackParams.parent,
                target: ko.utils.unwrapObservable(obj)
            };

            if (ko.isWriteableObservable(obj)) {
                params.observable = obj;
            }

            return options[parentName].update(params);
        };

        var alreadyMapped = visitedObjects.get(rootObject);
        if (alreadyMapped) {
            return alreadyMapped;
        }

        parentName = parentName || "";

        if (!isArray) {
            // For atomic types, do a direct update on the observable
            if (!canHaveProperties(rootObject)) {
                switch (exports.getType(rootObject)) {
                case "function":
                    if (hasUpdateCallback()) {
                        if (ko.isWriteableObservable(rootObject)) {
                            rootObject(updateCallback(rootObject));
                            mappedRootObject = rootObject;
                        } else {
                            mappedRootObject = updateCallback(rootObject);
                        }
                    } else {
                        mappedRootObject = rootObject;
                    }
                    break;
                default:
                    var valueToWrite;
                    if (ko.isWriteableObservable(mappedRootObject)) {
                        if (hasUpdateCallback()) {
                            valueToWrite = updateCallback(mappedRootObject);
                            mappedRootObject(valueToWrite);
                            return valueToWrite;
                        } else {
                            valueToWrite = ko.utils.unwrapObservable(rootObject);
                            mappedRootObject(valueToWrite);
                            return valueToWrite;
                        }
                    } else {
                        var hasCreateOrUpdateCallback = hasCreateCallback() || hasUpdateCallback();

                        if (hasCreateCallback()) {
                            mappedRootObject = createCallback();
                        } else {
                            mappedRootObject = ko.observable(ko.utils.unwrapObservable(rootObject));
                        }

                        if (hasUpdateCallback()) {
                            mappedRootObject(updateCallback(mappedRootObject));
                        }

                        if (hasCreateOrUpdateCallback) return mappedRootObject;
                    }
                }

            } else {
                mappedRootObject = ko.utils.unwrapObservable(mappedRootObject);
                if (!mappedRootObject) {
                    if (hasCreateCallback()) {
                        var result = createCallback();

                        if (hasUpdateCallback()) {
                            result = updateCallback(result);
                        }

                        return result;
                    } else {
                        if (hasUpdateCallback()) {
                            return updateCallback(result);
                        }

                        mappedRootObject = {};
                    }
                }

                if (hasUpdateCallback()) {
                    mappedRootObject = updateCallback(mappedRootObject);
                }

                visitedObjects.save(rootObject, mappedRootObject);
                if (hasUpdateCallback()) return mappedRootObject;

                // For non-atomic types, visit all properties and update recursively
                visitPropertiesOrArrayEntries(rootObject, function (indexer) {
                    var fullPropertyName = parentPropertyName.length ? parentPropertyName + "." + indexer : indexer;

                    if (ko.utils.arrayIndexOf(options.ignore, fullPropertyName) != -1) {
                        return;
                    }

                    if (ko.utils.arrayIndexOf(options.copy, fullPropertyName) != -1) {
                        mappedRootObject[indexer] = rootObject[indexer];
                        return;
                    }

                    if(typeof rootObject[indexer] != "object" && typeof rootObject[indexer] != "array" && options.observe.length > 0 && ko.utils.arrayIndexOf(options.observe, fullPropertyName) == -1)
                    {
                        mappedRootObject[indexer] = rootObject[indexer];
                        options.copiedProperties[fullPropertyName] = true;
                        return;
                    }

                    // In case we are adding an already mapped property, fill it with the previously mapped property value to prevent recursion.
                    // If this is a property that was generated by fromJS, we should use the options specified there
                    var prevMappedProperty = visitedObjects.get(rootObject[indexer]);
                    var retval = updateViewModel(mappedRootObject[indexer], rootObject[indexer], options, indexer, mappedRootObject, fullPropertyName, mappedRootObject);
                    var value = prevMappedProperty || retval;

                    if(options.observe.length > 0 && ko.utils.arrayIndexOf(options.observe, fullPropertyName) == -1)
                    {
                        mappedRootObject[indexer] = ko.utils.unwrapObservable(value);
                        options.copiedProperties[fullPropertyName] = true;
                        return;
                    }

                    if (ko.isWriteableObservable(mappedRootObject[indexer])) {
                        value = ko.utils.unwrapObservable(value);
                        if (mappedRootObject[indexer]() !== value) {
                            mappedRootObject[indexer](value);
                        }
                    } else {
                        value = mappedRootObject[indexer] === undefined ? value : ko.utils.unwrapObservable(value);
                        mappedRootObject[indexer] = value;
                    }

                    options.mappedProperties[fullPropertyName] = true;
                });
            }
        } else { //mappedRootObject is an array
            var changes = [];

            var hasKeyCallback = false;
            var keyCallback = function (x) {
                return x;
            };
            if (options[parentName] && options[parentName].key) {
                keyCallback = options[parentName].key;
                hasKeyCallback = true;
            }

            if (!ko.isObservable(mappedRootObject)) {
                // When creating the new observable array, also add a bunch of utility functions that take the 'key' of the array items into account.
                mappedRootObject = ko.observableArray([]);

                mappedRootObject.mappedRemove = function (valueOrPredicate) {
                    var predicate = typeof valueOrPredicate == "function" ? valueOrPredicate : function (value) {
                            return value === keyCallback(valueOrPredicate);
                        };
                    return mappedRootObject.remove(function (item) {
                        return predicate(keyCallback(item));
                    });
                };

                mappedRootObject.mappedRemoveAll = function (arrayOfValues) {
                    var arrayOfKeys = filterArrayByKey(arrayOfValues, keyCallback);
                    return mappedRootObject.remove(function (item) {
                        return ko.utils.arrayIndexOf(arrayOfKeys, keyCallback(item)) != -1;
                    });
                };

                mappedRootObject.mappedDestroy = function (valueOrPredicate) {
                    var predicate = typeof valueOrPredicate == "function" ? valueOrPredicate : function (value) {
                            return value === keyCallback(valueOrPredicate);
                        };
                    return mappedRootObject.destroy(function (item) {
                        return predicate(keyCallback(item));
                    });
                };

                mappedRootObject.mappedDestroyAll = function (arrayOfValues) {
                    var arrayOfKeys = filterArrayByKey(arrayOfValues, keyCallback);
                    return mappedRootObject.destroy(function (item) {
                        return ko.utils.arrayIndexOf(arrayOfKeys, keyCallback(item)) != -1;
                    });
                };

                mappedRootObject.mappedIndexOf = function (item) {
                    var keys = filterArrayByKey(mappedRootObject(), keyCallback);
                    var key = keyCallback(item);
                    return ko.utils.arrayIndexOf(keys, key);
                };

                mappedRootObject.mappedGet = function (item) {
                    return mappedRootObject()[mappedRootObject.mappedIndexOf(item)];
                };

                mappedRootObject.mappedCreate = function (value) {
                    if (mappedRootObject.mappedIndexOf(value) !== -1) {
                        throw new Error("There already is an object with the key that you specified.");
                    }

                    var item = hasCreateCallback() ? createCallback(value) : value;
                    if (hasUpdateCallback()) {
                        var newValue = updateCallback(item, value);
                        if (ko.isWriteableObservable(item)) {
                            item(newValue);
                        } else {
                            item = newValue;
                        }
                    }
                    mappedRootObject.push(item);
                    return item;
                };
            }

            var currentArrayKeys = filterArrayByKey(ko.utils.unwrapObservable(mappedRootObject), keyCallback).sort();
            var newArrayKeys = filterArrayByKey(rootObject, keyCallback);
            if (hasKeyCallback) newArrayKeys.sort();
            var editScript = ko.utils.compareArrays(currentArrayKeys, newArrayKeys);

            var ignoreIndexOf = {};

            var i;
            var j;

            var key;
            var unwrappedRootObject = ko.utils.unwrapObservable(rootObject);
            var itemsByKey = {};
            var optimizedKeys = true;
            for (i = 0, j = unwrappedRootObject.length; i < j; i++) {
                key = keyCallback(unwrappedRootObject[i]);
                if (key === undefined || key instanceof Object) {
                    optimizedKeys = false;
                    break;
                }
                itemsByKey[key] = unwrappedRootObject[i];
            }

            var newContents = [];
            var passedOver = 0;
            for (i = 0, j = editScript.length; i < j; i++) {
                key = editScript[i];
                var mappedItem;
                var fullPropertyName = parentPropertyName + "[" + i + "]";
                var item;
                var index;
                switch (key.status) {
                case "added":
                    item = optimizedKeys ? itemsByKey[key.value] : getItemByKey(ko.utils.unwrapObservable(rootObject), key.value, keyCallback);
                    mappedItem = updateViewModel(undefined, item, options, parentName, mappedRootObject, fullPropertyName, parent);
                    if(!hasCreateCallback()) {
                        mappedItem = ko.utils.unwrapObservable(mappedItem);
                    }

                    index = ignorableIndexOf(ko.utils.unwrapObservable(rootObject), item, ignoreIndexOf);

                    if (mappedItem === emptyReturn) {
                        passedOver++;
                    } else {
                        newContents[index - passedOver] = mappedItem;
                    }

                    ignoreIndexOf[index] = true;
                    break;
                case "retained":
                    item = optimizedKeys ? itemsByKey[key.value] : getItemByKey(ko.utils.unwrapObservable(rootObject), key.value, keyCallback);
                    mappedItem = getItemByKey(mappedRootObject, key.value, keyCallback);
                    updateViewModel(mappedItem, item, options, parentName, mappedRootObject, fullPropertyName, parent);

                    index = ignorableIndexOf(ko.utils.unwrapObservable(rootObject), item, ignoreIndexOf);
                    newContents[index] = mappedItem;
                    ignoreIndexOf[index] = true;
                    break;
                case "deleted":
                    mappedItem = getItemByKey(mappedRootObject, key.value, keyCallback);
                    break;
                }

                changes.push({
                    event: key.status,
                    item: mappedItem
                });
            }

            mappedRootObject(newContents);

            if (options[parentName] && options[parentName].arrayChanged) {
                ko.utils.arrayForEach(changes, function (change) {
                    options[parentName].arrayChanged(change.event, change.item);
                });
            }
        }

        return mappedRootObject;
    }

    function ignorableIndexOf(array, item, ignoreIndices) {
        for (var i = 0, j = array.length; i < j; i++) {
            if (ignoreIndices[i] === true) continue;
            if (array[i] === item) return i;
        }
        return null;
    }

    function mapKey(item, callback) {
        var mappedItem;
        if (callback) mappedItem = callback(item);
        if (exports.getType(mappedItem) === "undefined") mappedItem = item;

        return ko.utils.unwrapObservable(mappedItem);
    }

    function getItemByKey(array, key, callback) {
        array = ko.utils.unwrapObservable(array);
        for (var i = 0, j = array.length; i < j; i++) {
            var item = array[i];
            if (mapKey(item, callback) === key) return item;
        }

        throw new Error("When calling ko.update*, the key '" + key + "' was not found!");
    }

    function filterArrayByKey(array, callback) {
        return ko.utils.arrayMap(ko.utils.unwrapObservable(array), function (item) {
            if (callback) {
                return mapKey(item, callback);
            } else {
                return item;
            }
        });
    }

    function visitPropertiesOrArrayEntries(rootObject, visitorCallback) {
        if (exports.getType(rootObject) === "array") {
            for (var i = 0; i < rootObject.length; i++)
            visitorCallback(i);
        } else {
            for (var propertyName in rootObject)
            visitorCallback(propertyName);
        }
    }

    function canHaveProperties(object) {
        var type = exports.getType(object);
        return ((type === "object") || (type === "array")) && (object !== null);
    }

    // Based on the parentName, this creates a fully classified name of a property

    function getPropertyName(parentName, parent, indexer) {
        var propertyName = parentName || "";
        if (exports.getType(parent) === "array") {
            if (parentName) {
                propertyName += "[" + indexer + "]";
            }
        } else {
            if (parentName) {
                propertyName += ".";
            }
            propertyName += indexer;
        }
        return propertyName;
    }

    exports.visitModel = function (rootObject, callback, options) {
        options = options || {};
        options.visitedObjects = options.visitedObjects || new objectLookup();

        var mappedRootObject;
        var unwrappedRootObject = ko.utils.unwrapObservable(rootObject);

        if (!canHaveProperties(unwrappedRootObject)) {
            return callback(rootObject, options.parentName);
        } else {
            options = fillOptions(options, unwrappedRootObject[mappingProperty]);

            // Only do a callback, but ignore the results
            callback(rootObject, options.parentName);
            mappedRootObject = exports.getType(unwrappedRootObject) === "array" ? [] : {};
        }

        options.visitedObjects.save(rootObject, mappedRootObject);

        var parentName = options.parentName;
        visitPropertiesOrArrayEntries(unwrappedRootObject, function (indexer) {
            if (options.ignore && ko.utils.arrayIndexOf(options.ignore, indexer) != -1) return;

            var propertyValue = unwrappedRootObject[indexer];
            options.parentName = getPropertyName(parentName, unwrappedRootObject, indexer);

            // If we don't want to explicitly copy the unmapped property...
            if (ko.utils.arrayIndexOf(options.copy, indexer) === -1) {
                // ...find out if it's a property we want to explicitly include
                if (ko.utils.arrayIndexOf(options.include, indexer) === -1) {
                    // The mapped properties object contains all the properties that were part of the original object.
                    // If a property does not exist, and it is not because it is part of an array (e.g. "myProp[3]"), then it should not be unmapped.
                    if (unwrappedRootObject[mappingProperty] &&
                        unwrappedRootObject[mappingProperty].mappedProperties &&
                        !unwrappedRootObject[mappingProperty].mappedProperties[indexer] &&
                        unwrappedRootObject[mappingProperty].copiedProperties &&
                        !unwrappedRootObject[mappingProperty].copiedProperties[indexer] &&
                        exports.getType(unwrappedRootObject) !== "array")
                    {
                        return;
                    }
                }
            }

            var outputProperty;
            switch (exports.getType(ko.utils.unwrapObservable(propertyValue))) {
            case "object":
            case "array":
            case "undefined":
                var previouslyMappedValue = options.visitedObjects.get(propertyValue);
                mappedRootObject[indexer] = (exports.getType(previouslyMappedValue) !== "undefined") ? previouslyMappedValue : exports.visitModel(propertyValue, callback, options);
                break;
            default:
                mappedRootObject[indexer] = callback(propertyValue, options.parentName);
            }
        });

        return mappedRootObject;
    };

    function simpleObjectLookup() {
        var keys = [];
        var values = [];
        this.save = function (key, value) {
            var existingIndex = ko.utils.arrayIndexOf(keys, key);
            if (existingIndex >= 0) values[existingIndex] = value;
            else {
                keys.push(key);
                values.push(value);
            }
        };
        this.get = function (key) {
            var existingIndex = ko.utils.arrayIndexOf(keys, key);
            var value = (existingIndex >= 0) ? values[existingIndex] : undefined;
            return value;
        };
    }

    function objectLookup() {
        var buckets = {};

        var findBucket = function(key) {
            var bucketKey;
            try {
                bucketKey = key;//JSON.stringify(key);
            }
            catch (e) {
                bucketKey = "$$$";
            }

            var bucket = buckets[bucketKey];
            if (bucket === undefined) {
                bucket = new simpleObjectLookup();
                buckets[bucketKey] = bucket;
            }
            return bucket;
        };

        this.save = function (key, value) {
            findBucket(key).save(key, value);
        };
        this.get = function (key) {
            return findBucket(key).get(key);
        };
    }
}));

},{"knockout":111}],111:[function(require,module,exports){
/*!
 * Knockout JavaScript library v3.4.2
 * (c) The Knockout.js team - http://knockoutjs.com/
 * License: MIT (http://www.opensource.org/licenses/mit-license.php)
 */

(function(){
var DEBUG=true;
(function(undefined){
    // (0, eval)('this') is a robust way of getting a reference to the global object
    // For details, see http://stackoverflow.com/questions/14119988/return-this-0-evalthis/14120023#14120023
    var window = this || (0, eval)('this'),
        document = window['document'],
        navigator = window['navigator'],
        jQueryInstance = window["jQuery"],
        JSON = window["JSON"];
(function(factory) {
    // Support three module loading scenarios
    if (typeof define === 'function' && define['amd']) {
        // [1] AMD anonymous module
        define(['exports', 'require'], factory);
    } else if (typeof exports === 'object' && typeof module === 'object') {
        // [2] CommonJS/Node.js
        factory(module['exports'] || exports);  // module.exports is for Node.js
    } else {
        // [3] No module loader (plain <script> tag) - put directly in global namespace
        factory(window['ko'] = {});
    }
}(function(koExports, amdRequire){
// Internally, all KO objects are attached to koExports (even the non-exported ones whose names will be minified by the closure compiler).
// In the future, the following "ko" variable may be made distinct from "koExports" so that private objects are not externally reachable.
var ko = typeof koExports !== 'undefined' ? koExports : {};
// Google Closure Compiler helpers (used only to make the minified file smaller)
ko.exportSymbol = function(koPath, object) {
    var tokens = koPath.split(".");

    // In the future, "ko" may become distinct from "koExports" (so that non-exported objects are not reachable)
    // At that point, "target" would be set to: (typeof koExports !== "undefined" ? koExports : ko)
    var target = ko;

    for (var i = 0; i < tokens.length - 1; i++)
        target = target[tokens[i]];
    target[tokens[tokens.length - 1]] = object;
};
ko.exportProperty = function(owner, publicName, object) {
    owner[publicName] = object;
};
ko.version = "3.4.2";

ko.exportSymbol('version', ko.version);
// For any options that may affect various areas of Knockout and aren't directly associated with data binding.
ko.options = {
    'deferUpdates': false,
    'useOnlyNativeEvents': false
};

//ko.exportSymbol('options', ko.options);   // 'options' isn't minified
ko.utils = (function () {
    function objectForEach(obj, action) {
        for (var prop in obj) {
            if (obj.hasOwnProperty(prop)) {
                action(prop, obj[prop]);
            }
        }
    }

    function extend(target, source) {
        if (source) {
            for(var prop in source) {
                if(source.hasOwnProperty(prop)) {
                    target[prop] = source[prop];
                }
            }
        }
        return target;
    }

    function setPrototypeOf(obj, proto) {
        obj.__proto__ = proto;
        return obj;
    }

    var canSetPrototype = ({ __proto__: [] } instanceof Array);
    var canUseSymbols = !DEBUG && typeof Symbol === 'function';

    // Represent the known event types in a compact way, then at runtime transform it into a hash with event name as key (for fast lookup)
    var knownEvents = {}, knownEventTypesByEventName = {};
    var keyEventTypeName = (navigator && /Firefox\/2/i.test(navigator.userAgent)) ? 'KeyboardEvent' : 'UIEvents';
    knownEvents[keyEventTypeName] = ['keyup', 'keydown', 'keypress'];
    knownEvents['MouseEvents'] = ['click', 'dblclick', 'mousedown', 'mouseup', 'mousemove', 'mouseover', 'mouseout', 'mouseenter', 'mouseleave'];
    objectForEach(knownEvents, function(eventType, knownEventsForType) {
        if (knownEventsForType.length) {
            for (var i = 0, j = knownEventsForType.length; i < j; i++)
                knownEventTypesByEventName[knownEventsForType[i]] = eventType;
        }
    });
    var eventsThatMustBeRegisteredUsingAttachEvent = { 'propertychange': true }; // Workaround for an IE9 issue - https://github.com/SteveSanderson/knockout/issues/406

    // Detect IE versions for bug workarounds (uses IE conditionals, not UA string, for robustness)
    // Note that, since IE 10 does not support conditional comments, the following logic only detects IE < 10.
    // Currently this is by design, since IE 10+ behaves correctly when treated as a standard browser.
    // If there is a future need to detect specific versions of IE10+, we will amend this.
    var ieVersion = document && (function() {
        var version = 3, div = document.createElement('div'), iElems = div.getElementsByTagName('i');

        // Keep constructing conditional HTML blocks until we hit one that resolves to an empty fragment
        while (
            div.innerHTML = '<!--[if gt IE ' + (++version) + ']><i></i><![endif]-->',
            iElems[0]
        ) {}
        return version > 4 ? version : undefined;
    }());
    var isIe6 = ieVersion === 6,
        isIe7 = ieVersion === 7;

    function isClickOnCheckableElement(element, eventType) {
        if ((ko.utils.tagNameLower(element) !== "input") || !element.type) return false;
        if (eventType.toLowerCase() != "click") return false;
        var inputType = element.type;
        return (inputType == "checkbox") || (inputType == "radio");
    }

    // For details on the pattern for changing node classes
    // see: https://github.com/knockout/knockout/issues/1597
    var cssClassNameRegex = /\S+/g;

    function toggleDomNodeCssClass(node, classNames, shouldHaveClass) {
        var addOrRemoveFn;
        if (classNames) {
            if (typeof node.classList === 'object') {
                addOrRemoveFn = node.classList[shouldHaveClass ? 'add' : 'remove'];
                ko.utils.arrayForEach(classNames.match(cssClassNameRegex), function(className) {
                    addOrRemoveFn.call(node.classList, className);
                });
            } else if (typeof node.className['baseVal'] === 'string') {
                // SVG tag .classNames is an SVGAnimatedString instance
                toggleObjectClassPropertyString(node.className, 'baseVal', classNames, shouldHaveClass);
            } else {
                // node.className ought to be a string.
                toggleObjectClassPropertyString(node, 'className', classNames, shouldHaveClass);
            }
        }
    }

    function toggleObjectClassPropertyString(obj, prop, classNames, shouldHaveClass) {
        // obj/prop is either a node/'className' or a SVGAnimatedString/'baseVal'.
        var currentClassNames = obj[prop].match(cssClassNameRegex) || [];
        ko.utils.arrayForEach(classNames.match(cssClassNameRegex), function(className) {
            ko.utils.addOrRemoveItem(currentClassNames, className, shouldHaveClass);
        });
        obj[prop] = currentClassNames.join(" ");
    }

    return {
        fieldsIncludedWithJsonPost: ['authenticity_token', /^__RequestVerificationToken(_.*)?$/],

        arrayForEach: function (array, action) {
            for (var i = 0, j = array.length; i < j; i++)
                action(array[i], i);
        },

        arrayIndexOf: function (array, item) {
            if (typeof Array.prototype.indexOf == "function")
                return Array.prototype.indexOf.call(array, item);
            for (var i = 0, j = array.length; i < j; i++)
                if (array[i] === item)
                    return i;
            return -1;
        },

        arrayFirst: function (array, predicate, predicateOwner) {
            for (var i = 0, j = array.length; i < j; i++)
                if (predicate.call(predicateOwner, array[i], i))
                    return array[i];
            return null;
        },

        arrayRemoveItem: function (array, itemToRemove) {
            var index = ko.utils.arrayIndexOf(array, itemToRemove);
            if (index > 0) {
                array.splice(index, 1);
            }
            else if (index === 0) {
                array.shift();
            }
        },

        arrayGetDistinctValues: function (array) {
            array = array || [];
            var result = [];
            for (var i = 0, j = array.length; i < j; i++) {
                if (ko.utils.arrayIndexOf(result, array[i]) < 0)
                    result.push(array[i]);
            }
            return result;
        },

        arrayMap: function (array, mapping) {
            array = array || [];
            var result = [];
            for (var i = 0, j = array.length; i < j; i++)
                result.push(mapping(array[i], i));
            return result;
        },

        arrayFilter: function (array, predicate) {
            array = array || [];
            var result = [];
            for (var i = 0, j = array.length; i < j; i++)
                if (predicate(array[i], i))
                    result.push(array[i]);
            return result;
        },

        arrayPushAll: function (array, valuesToPush) {
            if (valuesToPush instanceof Array)
                array.push.apply(array, valuesToPush);
            else
                for (var i = 0, j = valuesToPush.length; i < j; i++)
                    array.push(valuesToPush[i]);
            return array;
        },

        addOrRemoveItem: function(array, value, included) {
            var existingEntryIndex = ko.utils.arrayIndexOf(ko.utils.peekObservable(array), value);
            if (existingEntryIndex < 0) {
                if (included)
                    array.push(value);
            } else {
                if (!included)
                    array.splice(existingEntryIndex, 1);
            }
        },

        canSetPrototype: canSetPrototype,

        extend: extend,

        setPrototypeOf: setPrototypeOf,

        setPrototypeOfOrExtend: canSetPrototype ? setPrototypeOf : extend,

        objectForEach: objectForEach,

        objectMap: function(source, mapping) {
            if (!source)
                return source;
            var target = {};
            for (var prop in source) {
                if (source.hasOwnProperty(prop)) {
                    target[prop] = mapping(source[prop], prop, source);
                }
            }
            return target;
        },

        emptyDomNode: function (domNode) {
            while (domNode.firstChild) {
                ko.removeNode(domNode.firstChild);
            }
        },

        moveCleanedNodesToContainerElement: function(nodes) {
            // Ensure it's a real array, as we're about to reparent the nodes and
            // we don't want the underlying collection to change while we're doing that.
            var nodesArray = ko.utils.makeArray(nodes);
            var templateDocument = (nodesArray[0] && nodesArray[0].ownerDocument) || document;

            var container = templateDocument.createElement('div');
            for (var i = 0, j = nodesArray.length; i < j; i++) {
                container.appendChild(ko.cleanNode(nodesArray[i]));
            }
            return container;
        },

        cloneNodes: function (nodesArray, shouldCleanNodes) {
            for (var i = 0, j = nodesArray.length, newNodesArray = []; i < j; i++) {
                var clonedNode = nodesArray[i].cloneNode(true);
                newNodesArray.push(shouldCleanNodes ? ko.cleanNode(clonedNode) : clonedNode);
            }
            return newNodesArray;
        },

        setDomNodeChildren: function (domNode, childNodes) {
            ko.utils.emptyDomNode(domNode);
            if (childNodes) {
                for (var i = 0, j = childNodes.length; i < j; i++)
                    domNode.appendChild(childNodes[i]);
            }
        },

        replaceDomNodes: function (nodeToReplaceOrNodeArray, newNodesArray) {
            var nodesToReplaceArray = nodeToReplaceOrNodeArray.nodeType ? [nodeToReplaceOrNodeArray] : nodeToReplaceOrNodeArray;
            if (nodesToReplaceArray.length > 0) {
                var insertionPoint = nodesToReplaceArray[0];
                var parent = insertionPoint.parentNode;
                for (var i = 0, j = newNodesArray.length; i < j; i++)
                    parent.insertBefore(newNodesArray[i], insertionPoint);
                for (var i = 0, j = nodesToReplaceArray.length; i < j; i++) {
                    ko.removeNode(nodesToReplaceArray[i]);
                }
            }
        },

        fixUpContinuousNodeArray: function(continuousNodeArray, parentNode) {
            // Before acting on a set of nodes that were previously outputted by a template function, we have to reconcile
            // them against what is in the DOM right now. It may be that some of the nodes have already been removed, or that
            // new nodes might have been inserted in the middle, for example by a binding. Also, there may previously have been
            // leading comment nodes (created by rewritten string-based templates) that have since been removed during binding.
            // So, this function translates the old "map" output array into its best guess of the set of current DOM nodes.
            //
            // Rules:
            //   [A] Any leading nodes that have been removed should be ignored
            //       These most likely correspond to memoization nodes that were already removed during binding
            //       See https://github.com/knockout/knockout/pull/440
            //   [B] Any trailing nodes that have been remove should be ignored
            //       This prevents the code here from adding unrelated nodes to the array while processing rule [C]
            //       See https://github.com/knockout/knockout/pull/1903
            //   [C] We want to output a continuous series of nodes. So, ignore any nodes that have already been removed,
            //       and include any nodes that have been inserted among the previous collection

            if (continuousNodeArray.length) {
                // The parent node can be a virtual element; so get the real parent node
                parentNode = (parentNode.nodeType === 8 && parentNode.parentNode) || parentNode;

                // Rule [A]
                while (continuousNodeArray.length && continuousNodeArray[0].parentNode !== parentNode)
                    continuousNodeArray.splice(0, 1);

                // Rule [B]
                while (continuousNodeArray.length > 1 && continuousNodeArray[continuousNodeArray.length - 1].parentNode !== parentNode)
                    continuousNodeArray.length--;

                // Rule [C]
                if (continuousNodeArray.length > 1) {
                    var current = continuousNodeArray[0], last = continuousNodeArray[continuousNodeArray.length - 1];
                    // Replace with the actual new continuous node set
                    continuousNodeArray.length = 0;
                    while (current !== last) {
                        continuousNodeArray.push(current);
                        current = current.nextSibling;
                    }
                    continuousNodeArray.push(last);
                }
            }
            return continuousNodeArray;
        },

        setOptionNodeSelectionState: function (optionNode, isSelected) {
            // IE6 sometimes throws "unknown error" if you try to write to .selected directly, whereas Firefox struggles with setAttribute. Pick one based on browser.
            if (ieVersion < 7)
                optionNode.setAttribute("selected", isSelected);
            else
                optionNode.selected = isSelected;
        },

        stringTrim: function (string) {
            return string === null || string === undefined ? '' :
                string.trim ?
                    string.trim() :
                    string.toString().replace(/^[\s\xa0]+|[\s\xa0]+$/g, '');
        },

        stringStartsWith: function (string, startsWith) {
            string = string || "";
            if (startsWith.length > string.length)
                return false;
            return string.substring(0, startsWith.length) === startsWith;
        },

        domNodeIsContainedBy: function (node, containedByNode) {
            if (node === containedByNode)
                return true;
            if (node.nodeType === 11)
                return false; // Fixes issue #1162 - can't use node.contains for document fragments on IE8
            if (containedByNode.contains)
                return containedByNode.contains(node.nodeType === 3 ? node.parentNode : node);
            if (containedByNode.compareDocumentPosition)
                return (containedByNode.compareDocumentPosition(node) & 16) == 16;
            while (node && node != containedByNode) {
                node = node.parentNode;
            }
            return !!node;
        },

        domNodeIsAttachedToDocument: function (node) {
            return ko.utils.domNodeIsContainedBy(node, node.ownerDocument.documentElement);
        },

        anyDomNodeIsAttachedToDocument: function(nodes) {
            return !!ko.utils.arrayFirst(nodes, ko.utils.domNodeIsAttachedToDocument);
        },

        tagNameLower: function(element) {
            // For HTML elements, tagName will always be upper case; for XHTML elements, it'll be lower case.
            // Possible future optimization: If we know it's an element from an XHTML document (not HTML),
            // we don't need to do the .toLowerCase() as it will always be lower case anyway.
            return element && element.tagName && element.tagName.toLowerCase();
        },

        catchFunctionErrors: function (delegate) {
            return ko['onError'] ? function () {
                try {
                    return delegate.apply(this, arguments);
                } catch (e) {
                    ko['onError'] && ko['onError'](e);
                    throw e;
                }
            } : delegate;
        },

        setTimeout: function (handler, timeout) {
            return setTimeout(ko.utils.catchFunctionErrors(handler), timeout);
        },

        deferError: function (error) {
            setTimeout(function () {
                ko['onError'] && ko['onError'](error);
                throw error;
            }, 0);
        },

        registerEventHandler: function (element, eventType, handler) {
            var wrappedHandler = ko.utils.catchFunctionErrors(handler);

            var mustUseAttachEvent = ieVersion && eventsThatMustBeRegisteredUsingAttachEvent[eventType];
            if (!ko.options['useOnlyNativeEvents'] && !mustUseAttachEvent && jQueryInstance) {
                jQueryInstance(element)['bind'](eventType, wrappedHandler);
            } else if (!mustUseAttachEvent && typeof element.addEventListener == "function")
                element.addEventListener(eventType, wrappedHandler, false);
            else if (typeof element.attachEvent != "undefined") {
                var attachEventHandler = function (event) { wrappedHandler.call(element, event); },
                    attachEventName = "on" + eventType;
                element.attachEvent(attachEventName, attachEventHandler);

                // IE does not dispose attachEvent handlers automatically (unlike with addEventListener)
                // so to avoid leaks, we have to remove them manually. See bug #856
                ko.utils.domNodeDisposal.addDisposeCallback(element, function() {
                    element.detachEvent(attachEventName, attachEventHandler);
                });
            } else
                throw new Error("Browser doesn't support addEventListener or attachEvent");
        },

        triggerEvent: function (element, eventType) {
            if (!(element && element.nodeType))
                throw new Error("element must be a DOM node when calling triggerEvent");

            // For click events on checkboxes and radio buttons, jQuery toggles the element checked state *after* the
            // event handler runs instead of *before*. (This was fixed in 1.9 for checkboxes but not for radio buttons.)
            // IE doesn't change the checked state when you trigger the click event using "fireEvent".
            // In both cases, we'll use the click method instead.
            var useClickWorkaround = isClickOnCheckableElement(element, eventType);

            if (!ko.options['useOnlyNativeEvents'] && jQueryInstance && !useClickWorkaround) {
                jQueryInstance(element)['trigger'](eventType);
            } else if (typeof document.createEvent == "function") {
                if (typeof element.dispatchEvent == "function") {
                    var eventCategory = knownEventTypesByEventName[eventType] || "HTMLEvents";
                    var event = document.createEvent(eventCategory);
                    event.initEvent(eventType, true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, element);
                    element.dispatchEvent(event);
                }
                else
                    throw new Error("The supplied element doesn't support dispatchEvent");
            } else if (useClickWorkaround && element.click) {
                element.click();
            } else if (typeof element.fireEvent != "undefined") {
                element.fireEvent("on" + eventType);
            } else {
                throw new Error("Browser doesn't support triggering events");
            }
        },

        unwrapObservable: function (value) {
            return ko.isObservable(value) ? value() : value;
        },

        peekObservable: function (value) {
            return ko.isObservable(value) ? value.peek() : value;
        },

        toggleDomNodeCssClass: toggleDomNodeCssClass,

        setTextContent: function(element, textContent) {
            var value = ko.utils.unwrapObservable(textContent);
            if ((value === null) || (value === undefined))
                value = "";

            // We need there to be exactly one child: a text node.
            // If there are no children, more than one, or if it's not a text node,
            // we'll clear everything and create a single text node.
            var innerTextNode = ko.virtualElements.firstChild(element);
            if (!innerTextNode || innerTextNode.nodeType != 3 || ko.virtualElements.nextSibling(innerTextNode)) {
                ko.virtualElements.setDomNodeChildren(element, [element.ownerDocument.createTextNode(value)]);
            } else {
                innerTextNode.data = value;
            }

            ko.utils.forceRefresh(element);
        },

        setElementName: function(element, name) {
            element.name = name;

            // Workaround IE 6/7 issue
            // - https://github.com/SteveSanderson/knockout/issues/197
            // - http://www.matts411.com/post/setting_the_name_attribute_in_ie_dom/
            if (ieVersion <= 7) {
                try {
                    element.mergeAttributes(document.createElement("<input name='" + element.name + "'/>"), false);
                }
                catch(e) {} // For IE9 with doc mode "IE9 Standards" and browser mode "IE9 Compatibility View"
            }
        },

        forceRefresh: function(node) {
            // Workaround for an IE9 rendering bug - https://github.com/SteveSanderson/knockout/issues/209
            if (ieVersion >= 9) {
                // For text nodes and comment nodes (most likely virtual elements), we will have to refresh the container
                var elem = node.nodeType == 1 ? node : node.parentNode;
                if (elem.style)
                    elem.style.zoom = elem.style.zoom;
            }
        },

        ensureSelectElementIsRenderedCorrectly: function(selectElement) {
            // Workaround for IE9 rendering bug - it doesn't reliably display all the text in dynamically-added select boxes unless you force it to re-render by updating the width.
            // (See https://github.com/SteveSanderson/knockout/issues/312, http://stackoverflow.com/questions/5908494/select-only-shows-first-char-of-selected-option)
            // Also fixes IE7 and IE8 bug that causes selects to be zero width if enclosed by 'if' or 'with'. (See issue #839)
            if (ieVersion) {
                var originalWidth = selectElement.style.width;
                selectElement.style.width = 0;
                selectElement.style.width = originalWidth;
            }
        },

        range: function (min, max) {
            min = ko.utils.unwrapObservable(min);
            max = ko.utils.unwrapObservable(max);
            var result = [];
            for (var i = min; i <= max; i++)
                result.push(i);
            return result;
        },

        makeArray: function(arrayLikeObject) {
            var result = [];
            for (var i = 0, j = arrayLikeObject.length; i < j; i++) {
                result.push(arrayLikeObject[i]);
            };
            return result;
        },

        createSymbolOrString: function(identifier) {
            return canUseSymbols ? Symbol(identifier) : identifier;
        },

        isIe6 : isIe6,
        isIe7 : isIe7,
        ieVersion : ieVersion,

        getFormFields: function(form, fieldName) {
            var fields = ko.utils.makeArray(form.getElementsByTagName("input")).concat(ko.utils.makeArray(form.getElementsByTagName("textarea")));
            var isMatchingField = (typeof fieldName == 'string')
                ? function(field) { return field.name === fieldName }
                : function(field) { return fieldName.test(field.name) }; // Treat fieldName as regex or object containing predicate
            var matches = [];
            for (var i = fields.length - 1; i >= 0; i--) {
                if (isMatchingField(fields[i]))
                    matches.push(fields[i]);
            };
            return matches;
        },

        parseJson: function (jsonString) {
            if (typeof jsonString == "string") {
                jsonString = ko.utils.stringTrim(jsonString);
                if (jsonString) {
                    if (JSON && JSON.parse) // Use native parsing where available
                        return JSON.parse(jsonString);
                    return (new Function("return " + jsonString))(); // Fallback on less safe parsing for older browsers
                }
            }
            return null;
        },

        stringifyJson: function (data, replacer, space) {   // replacer and space are optional
            if (!JSON || !JSON.stringify)
                throw new Error("Cannot find JSON.stringify(). Some browsers (e.g., IE < 8) don't support it natively, but you can overcome this by adding a script reference to json2.js, downloadable from http://www.json.org/json2.js");
            return JSON.stringify(ko.utils.unwrapObservable(data), replacer, space);
        },

        postJson: function (urlOrForm, data, options) {
            options = options || {};
            var params = options['params'] || {};
            var includeFields = options['includeFields'] || this.fieldsIncludedWithJsonPost;
            var url = urlOrForm;

            // If we were given a form, use its 'action' URL and pick out any requested field values
            if((typeof urlOrForm == 'object') && (ko.utils.tagNameLower(urlOrForm) === "form")) {
                var originalForm = urlOrForm;
                url = originalForm.action;
                for (var i = includeFields.length - 1; i >= 0; i--) {
                    var fields = ko.utils.getFormFields(originalForm, includeFields[i]);
                    for (var j = fields.length - 1; j >= 0; j--)
                        params[fields[j].name] = fields[j].value;
                }
            }

            data = ko.utils.unwrapObservable(data);
            var form = document.createElement("form");
            form.style.display = "none";
            form.action = url;
            form.method = "post";
            for (var key in data) {
                // Since 'data' this is a model object, we include all properties including those inherited from its prototype
                var input = document.createElement("input");
                input.type = "hidden";
                input.name = key;
                input.value = ko.utils.stringifyJson(ko.utils.unwrapObservable(data[key]));
                form.appendChild(input);
            }
            objectForEach(params, function(key, value) {
                var input = document.createElement("input");
                input.type = "hidden";
                input.name = key;
                input.value = value;
                form.appendChild(input);
            });
            document.body.appendChild(form);
            options['submitter'] ? options['submitter'](form) : form.submit();
            setTimeout(function () { form.parentNode.removeChild(form); }, 0);
        }
    }
}());

ko.exportSymbol('utils', ko.utils);
ko.exportSymbol('utils.arrayForEach', ko.utils.arrayForEach);
ko.exportSymbol('utils.arrayFirst', ko.utils.arrayFirst);
ko.exportSymbol('utils.arrayFilter', ko.utils.arrayFilter);
ko.exportSymbol('utils.arrayGetDistinctValues', ko.utils.arrayGetDistinctValues);
ko.exportSymbol('utils.arrayIndexOf', ko.utils.arrayIndexOf);
ko.exportSymbol('utils.arrayMap', ko.utils.arrayMap);
ko.exportSymbol('utils.arrayPushAll', ko.utils.arrayPushAll);
ko.exportSymbol('utils.arrayRemoveItem', ko.utils.arrayRemoveItem);
ko.exportSymbol('utils.extend', ko.utils.extend);
ko.exportSymbol('utils.fieldsIncludedWithJsonPost', ko.utils.fieldsIncludedWithJsonPost);
ko.exportSymbol('utils.getFormFields', ko.utils.getFormFields);
ko.exportSymbol('utils.peekObservable', ko.utils.peekObservable);
ko.exportSymbol('utils.postJson', ko.utils.postJson);
ko.exportSymbol('utils.parseJson', ko.utils.parseJson);
ko.exportSymbol('utils.registerEventHandler', ko.utils.registerEventHandler);
ko.exportSymbol('utils.stringifyJson', ko.utils.stringifyJson);
ko.exportSymbol('utils.range', ko.utils.range);
ko.exportSymbol('utils.toggleDomNodeCssClass', ko.utils.toggleDomNodeCssClass);
ko.exportSymbol('utils.triggerEvent', ko.utils.triggerEvent);
ko.exportSymbol('utils.unwrapObservable', ko.utils.unwrapObservable);
ko.exportSymbol('utils.objectForEach', ko.utils.objectForEach);
ko.exportSymbol('utils.addOrRemoveItem', ko.utils.addOrRemoveItem);
ko.exportSymbol('utils.setTextContent', ko.utils.setTextContent);
ko.exportSymbol('unwrap', ko.utils.unwrapObservable); // Convenient shorthand, because this is used so commonly

if (!Function.prototype['bind']) {
    // Function.prototype.bind is a standard part of ECMAScript 5th Edition (December 2009, http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf)
    // In case the browser doesn't implement it natively, provide a JavaScript implementation. This implementation is based on the one in prototype.js
    Function.prototype['bind'] = function (object) {
        var originalFunction = this;
        if (arguments.length === 1) {
            return function () {
                return originalFunction.apply(object, arguments);
            };
        } else {
            var partialArgs = Array.prototype.slice.call(arguments, 1);
            return function () {
                var args = partialArgs.slice(0);
                args.push.apply(args, arguments);
                return originalFunction.apply(object, args);
            };
        }
    };
}

ko.utils.domData = new (function () {
    var uniqueId = 0;
    var dataStoreKeyExpandoPropertyName = "__ko__" + (new Date).getTime();
    var dataStore = {};

    function getAll(node, createIfNotFound) {
        var dataStoreKey = node[dataStoreKeyExpandoPropertyName];
        var hasExistingDataStore = dataStoreKey && (dataStoreKey !== "null") && dataStore[dataStoreKey];
        if (!hasExistingDataStore) {
            if (!createIfNotFound)
                return undefined;
            dataStoreKey = node[dataStoreKeyExpandoPropertyName] = "ko" + uniqueId++;
            dataStore[dataStoreKey] = {};
        }
        return dataStore[dataStoreKey];
    }

    return {
        get: function (node, key) {
            var allDataForNode = getAll(node, false);
            return allDataForNode === undefined ? undefined : allDataForNode[key];
        },
        set: function (node, key, value) {
            if (value === undefined) {
                // Make sure we don't actually create a new domData key if we are actually deleting a value
                if (getAll(node, false) === undefined)
                    return;
            }
            var allDataForNode = getAll(node, true);
            allDataForNode[key] = value;
        },
        clear: function (node) {
            var dataStoreKey = node[dataStoreKeyExpandoPropertyName];
            if (dataStoreKey) {
                delete dataStore[dataStoreKey];
                node[dataStoreKeyExpandoPropertyName] = null;
                return true; // Exposing "did clean" flag purely so specs can infer whether things have been cleaned up as intended
            }
            return false;
        },

        nextKey: function () {
            return (uniqueId++) + dataStoreKeyExpandoPropertyName;
        }
    };
})();

ko.exportSymbol('utils.domData', ko.utils.domData);
ko.exportSymbol('utils.domData.clear', ko.utils.domData.clear); // Exporting only so specs can clear up after themselves fully

ko.utils.domNodeDisposal = new (function () {
    var domDataKey = ko.utils.domData.nextKey();
    var cleanableNodeTypes = { 1: true, 8: true, 9: true };       // Element, Comment, Document
    var cleanableNodeTypesWithDescendants = { 1: true, 9: true }; // Element, Document

    function getDisposeCallbacksCollection(node, createIfNotFound) {
        var allDisposeCallbacks = ko.utils.domData.get(node, domDataKey);
        if ((allDisposeCallbacks === undefined) && createIfNotFound) {
            allDisposeCallbacks = [];
            ko.utils.domData.set(node, domDataKey, allDisposeCallbacks);
        }
        return allDisposeCallbacks;
    }
    function destroyCallbacksCollection(node) {
        ko.utils.domData.set(node, domDataKey, undefined);
    }

    function cleanSingleNode(node) {
        // Run all the dispose callbacks
        var callbacks = getDisposeCallbacksCollection(node, false);
        if (callbacks) {
            callbacks = callbacks.slice(0); // Clone, as the array may be modified during iteration (typically, callbacks will remove themselves)
            for (var i = 0; i < callbacks.length; i++)
                callbacks[i](node);
        }

        // Erase the DOM data
        ko.utils.domData.clear(node);

        // Perform cleanup needed by external libraries (currently only jQuery, but can be extended)
        ko.utils.domNodeDisposal["cleanExternalData"](node);

        // Clear any immediate-child comment nodes, as these wouldn't have been found by
        // node.getElementsByTagName("*") in cleanNode() (comment nodes aren't elements)
        if (cleanableNodeTypesWithDescendants[node.nodeType])
            cleanImmediateCommentTypeChildren(node);
    }

    function cleanImmediateCommentTypeChildren(nodeWithChildren) {
        var child, nextChild = nodeWithChildren.firstChild;
        while (child = nextChild) {
            nextChild = child.nextSibling;
            if (child.nodeType === 8)
                cleanSingleNode(child);
        }
    }

    return {
        addDisposeCallback : function(node, callback) {
            if (typeof callback != "function")
                throw new Error("Callback must be a function");
            getDisposeCallbacksCollection(node, true).push(callback);
        },

        removeDisposeCallback : function(node, callback) {
            var callbacksCollection = getDisposeCallbacksCollection(node, false);
            if (callbacksCollection) {
                ko.utils.arrayRemoveItem(callbacksCollection, callback);
                if (callbacksCollection.length == 0)
                    destroyCallbacksCollection(node);
            }
        },

        cleanNode : function(node) {
            // First clean this node, where applicable
            if (cleanableNodeTypes[node.nodeType]) {
                cleanSingleNode(node);

                // ... then its descendants, where applicable
                if (cleanableNodeTypesWithDescendants[node.nodeType]) {
                    // Clone the descendants list in case it changes during iteration
                    var descendants = [];
                    ko.utils.arrayPushAll(descendants, node.getElementsByTagName("*"));
                    for (var i = 0, j = descendants.length; i < j; i++)
                        cleanSingleNode(descendants[i]);
                }
            }
            return node;
        },

        removeNode : function(node) {
            ko.cleanNode(node);
            if (node.parentNode)
                node.parentNode.removeChild(node);
        },

        "cleanExternalData" : function (node) {
            // Special support for jQuery here because it's so commonly used.
            // Many jQuery plugins (including jquery.tmpl) store data using jQuery's equivalent of domData
            // so notify it to tear down any resources associated with the node & descendants here.
            if (jQueryInstance && (typeof jQueryInstance['cleanData'] == "function"))
                jQueryInstance['cleanData']([node]);
        }
    };
})();
ko.cleanNode = ko.utils.domNodeDisposal.cleanNode; // Shorthand name for convenience
ko.removeNode = ko.utils.domNodeDisposal.removeNode; // Shorthand name for convenience
ko.exportSymbol('cleanNode', ko.cleanNode);
ko.exportSymbol('removeNode', ko.removeNode);
ko.exportSymbol('utils.domNodeDisposal', ko.utils.domNodeDisposal);
ko.exportSymbol('utils.domNodeDisposal.addDisposeCallback', ko.utils.domNodeDisposal.addDisposeCallback);
ko.exportSymbol('utils.domNodeDisposal.removeDisposeCallback', ko.utils.domNodeDisposal.removeDisposeCallback);
(function () {
    var none = [0, "", ""],
        table = [1, "<table>", "</table>"],
        tbody = [2, "<table><tbody>", "</tbody></table>"],
        tr = [3, "<table><tbody><tr>", "</tr></tbody></table>"],
        select = [1, "<select multiple='multiple'>", "</select>"],
        lookup = {
            'thead': table,
            'tbody': table,
            'tfoot': table,
            'tr': tbody,
            'td': tr,
            'th': tr,
            'option': select,
            'optgroup': select
        },

        // This is needed for old IE if you're *not* using either jQuery or innerShiv. Doesn't affect other cases.
        mayRequireCreateElementHack = ko.utils.ieVersion <= 8;

    function getWrap(tags) {
        var m = tags.match(/^<([a-z]+)[ >]/);
        return (m && lookup[m[1]]) || none;
    }

    function simpleHtmlParse(html, documentContext) {
        documentContext || (documentContext = document);
        var windowContext = documentContext['parentWindow'] || documentContext['defaultView'] || window;

        // Based on jQuery's "clean" function, but only accounting for table-related elements.
        // If you have referenced jQuery, this won't be used anyway - KO will use jQuery's "clean" function directly

        // Note that there's still an issue in IE < 9 whereby it will discard comment nodes that are the first child of
        // a descendant node. For example: "<div><!-- mycomment -->abc</div>" will get parsed as "<div>abc</div>"
        // This won't affect anyone who has referenced jQuery, and there's always the workaround of inserting a dummy node
        // (possibly a text node) in front of the comment. So, KO does not attempt to workaround this IE issue automatically at present.

        // Trim whitespace, otherwise indexOf won't work as expected
        var tags = ko.utils.stringTrim(html).toLowerCase(), div = documentContext.createElement("div"),
            wrap = getWrap(tags),
            depth = wrap[0];

        // Go to html and back, then peel off extra wrappers
        // Note that we always prefix with some dummy text, because otherwise, IE<9 will strip out leading comment nodes in descendants. Total madness.
        var markup = "ignored<div>" + wrap[1] + html + wrap[2] + "</div>";
        if (typeof windowContext['innerShiv'] == "function") {
            // Note that innerShiv is deprecated in favour of html5shiv. We should consider adding
            // support for html5shiv (except if no explicit support is needed, e.g., if html5shiv
            // somehow shims the native APIs so it just works anyway)
            div.appendChild(windowContext['innerShiv'](markup));
        } else {
            if (mayRequireCreateElementHack) {
                // The document.createElement('my-element') trick to enable custom elements in IE6-8
                // only works if we assign innerHTML on an element associated with that document.
                documentContext.appendChild(div);
            }

            div.innerHTML = markup;

            if (mayRequireCreateElementHack) {
                div.parentNode.removeChild(div);
            }
        }

        // Move to the right depth
        while (depth--)
            div = div.lastChild;

        return ko.utils.makeArray(div.lastChild.childNodes);
    }

    function jQueryHtmlParse(html, documentContext) {
        // jQuery's "parseHTML" function was introduced in jQuery 1.8.0 and is a documented public API.
        if (jQueryInstance['parseHTML']) {
            return jQueryInstance['parseHTML'](html, documentContext) || []; // Ensure we always return an array and never null
        } else {
            // For jQuery < 1.8.0, we fall back on the undocumented internal "clean" function.
            var elems = jQueryInstance['clean']([html], documentContext);

            // As of jQuery 1.7.1, jQuery parses the HTML by appending it to some dummy parent nodes held in an in-memory document fragment.
            // Unfortunately, it never clears the dummy parent nodes from the document fragment, so it leaks memory over time.
            // Fix this by finding the top-most dummy parent element, and detaching it from its owner fragment.
            if (elems && elems[0]) {
                // Find the top-most parent element that's a direct child of a document fragment
                var elem = elems[0];
                while (elem.parentNode && elem.parentNode.nodeType !== 11 /* i.e., DocumentFragment */)
                    elem = elem.parentNode;
                // ... then detach it
                if (elem.parentNode)
                    elem.parentNode.removeChild(elem);
            }

            return elems;
        }
    }

    ko.utils.parseHtmlFragment = function(html, documentContext) {
        return jQueryInstance ?
            jQueryHtmlParse(html, documentContext) :   // As below, benefit from jQuery's optimisations where possible
            simpleHtmlParse(html, documentContext);  // ... otherwise, this simple logic will do in most common cases.
    };

    ko.utils.setHtml = function(node, html) {
        ko.utils.emptyDomNode(node);

        // There's no legitimate reason to display a stringified observable without unwrapping it, so we'll unwrap it
        html = ko.utils.unwrapObservable(html);

        if ((html !== null) && (html !== undefined)) {
            if (typeof html != 'string')
                html = html.toString();

            // jQuery contains a lot of sophisticated code to parse arbitrary HTML fragments,
            // for example <tr> elements which are not normally allowed to exist on their own.
            // If you've referenced jQuery we'll use that rather than duplicating its code.
            if (jQueryInstance) {
                jQueryInstance(node)['html'](html);
            } else {
                // ... otherwise, use KO's own parsing logic.
                var parsedNodes = ko.utils.parseHtmlFragment(html, node.ownerDocument);
                for (var i = 0; i < parsedNodes.length; i++)
                    node.appendChild(parsedNodes[i]);
            }
        }
    };
})();

ko.exportSymbol('utils.parseHtmlFragment', ko.utils.parseHtmlFragment);
ko.exportSymbol('utils.setHtml', ko.utils.setHtml);

ko.memoization = (function () {
    var memos = {};

    function randomMax8HexChars() {
        return (((1 + Math.random()) * 0x100000000) | 0).toString(16).substring(1);
    }
    function generateRandomId() {
        return randomMax8HexChars() + randomMax8HexChars();
    }
    function findMemoNodes(rootNode, appendToArray) {
        if (!rootNode)
            return;
        if (rootNode.nodeType == 8) {
            var memoId = ko.memoization.parseMemoText(rootNode.nodeValue);
            if (memoId != null)
                appendToArray.push({ domNode: rootNode, memoId: memoId });
        } else if (rootNode.nodeType == 1) {
            for (var i = 0, childNodes = rootNode.childNodes, j = childNodes.length; i < j; i++)
                findMemoNodes(childNodes[i], appendToArray);
        }
    }

    return {
        memoize: function (callback) {
            if (typeof callback != "function")
                throw new Error("You can only pass a function to ko.memoization.memoize()");
            var memoId = generateRandomId();
            memos[memoId] = callback;
            return "<!--[ko_memo:" + memoId + "]-->";
        },

        unmemoize: function (memoId, callbackParams) {
            var callback = memos[memoId];
            if (callback === undefined)
                throw new Error("Couldn't find any memo with ID " + memoId + ". Perhaps it's already been unmemoized.");
            try {
                callback.apply(null, callbackParams || []);
                return true;
            }
            finally { delete memos[memoId]; }
        },

        unmemoizeDomNodeAndDescendants: function (domNode, extraCallbackParamsArray) {
            var memos = [];
            findMemoNodes(domNode, memos);
            for (var i = 0, j = memos.length; i < j; i++) {
                var node = memos[i].domNode;
                var combinedParams = [node];
                if (extraCallbackParamsArray)
                    ko.utils.arrayPushAll(combinedParams, extraCallbackParamsArray);
                ko.memoization.unmemoize(memos[i].memoId, combinedParams);
                node.nodeValue = ""; // Neuter this node so we don't try to unmemoize it again
                if (node.parentNode)
                    node.parentNode.removeChild(node); // If possible, erase it totally (not always possible - someone else might just hold a reference to it then call unmemoizeDomNodeAndDescendants again)
            }
        },

        parseMemoText: function (memoText) {
            var match = memoText.match(/^\[ko_memo\:(.*?)\]$/);
            return match ? match[1] : null;
        }
    };
})();

ko.exportSymbol('memoization', ko.memoization);
ko.exportSymbol('memoization.memoize', ko.memoization.memoize);
ko.exportSymbol('memoization.unmemoize', ko.memoization.unmemoize);
ko.exportSymbol('memoization.parseMemoText', ko.memoization.parseMemoText);
ko.exportSymbol('memoization.unmemoizeDomNodeAndDescendants', ko.memoization.unmemoizeDomNodeAndDescendants);
ko.tasks = (function () {
    var scheduler,
        taskQueue = [],
        taskQueueLength = 0,
        nextHandle = 1,
        nextIndexToProcess = 0;

    if (window['MutationObserver']) {
        // Chrome 27+, Firefox 14+, IE 11+, Opera 15+, Safari 6.1+
        // From https://github.com/petkaantonov/bluebird * Copyright (c) 2014 Petka Antonov * License: MIT
        scheduler = (function (callback) {
            var div = document.createElement("div");
            new MutationObserver(callback).observe(div, {attributes: true});
            return function () { div.classList.toggle("foo"); };
        })(scheduledProcess);
    } else if (document && "onreadystatechange" in document.createElement("script")) {
        // IE 6-10
        // From https://github.com/YuzuJS/setImmediate * Copyright (c) 2012 Barnesandnoble.com, llc, Donavon West, and Domenic Denicola * License: MIT
        scheduler = function (callback) {
            var script = document.createElement("script");
            script.onreadystatechange = function () {
                script.onreadystatechange = null;
                document.documentElement.removeChild(script);
                script = null;
                callback();
            };
            document.documentElement.appendChild(script);
        };
    } else {
        scheduler = function (callback) {
            setTimeout(callback, 0);
        };
    }

    function processTasks() {
        if (taskQueueLength) {
            // Each mark represents the end of a logical group of tasks and the number of these groups is
            // limited to prevent unchecked recursion.
            var mark = taskQueueLength, countMarks = 0;

            // nextIndexToProcess keeps track of where we are in the queue; processTasks can be called recursively without issue
            for (var task; nextIndexToProcess < taskQueueLength; ) {
                if (task = taskQueue[nextIndexToProcess++]) {
                    if (nextIndexToProcess > mark) {
                        if (++countMarks >= 5000) {
                            nextIndexToProcess = taskQueueLength;   // skip all tasks remaining in the queue since any of them could be causing the recursion
                            ko.utils.deferError(Error("'Too much recursion' after processing " + countMarks + " task groups."));
                            break;
                        }
                        mark = taskQueueLength;
                    }
                    try {
                        task();
                    } catch (ex) {
                        ko.utils.deferError(ex);
                    }
                }
            }
        }
    }

    function scheduledProcess() {
        processTasks();

        // Reset the queue
        nextIndexToProcess = taskQueueLength = taskQueue.length = 0;
    }

    function scheduleTaskProcessing() {
        ko.tasks['scheduler'](scheduledProcess);
    }

    var tasks = {
        'scheduler': scheduler,     // Allow overriding the scheduler

        schedule: function (func) {
            if (!taskQueueLength) {
                scheduleTaskProcessing();
            }

            taskQueue[taskQueueLength++] = func;
            return nextHandle++;
        },

        cancel: function (handle) {
            var index = handle - (nextHandle - taskQueueLength);
            if (index >= nextIndexToProcess && index < taskQueueLength) {
                taskQueue[index] = null;
            }
        },

        // For testing only: reset the queue and return the previous queue length
        'resetForTesting': function () {
            var length = taskQueueLength - nextIndexToProcess;
            nextIndexToProcess = taskQueueLength = taskQueue.length = 0;
            return length;
        },

        runEarly: processTasks
    };

    return tasks;
})();

ko.exportSymbol('tasks', ko.tasks);
ko.exportSymbol('tasks.schedule', ko.tasks.schedule);
//ko.exportSymbol('tasks.cancel', ko.tasks.cancel);  "cancel" isn't minified
ko.exportSymbol('tasks.runEarly', ko.tasks.runEarly);
ko.extenders = {
    'throttle': function(target, timeout) {
        // Throttling means two things:

        // (1) For dependent observables, we throttle *evaluations* so that, no matter how fast its dependencies
        //     notify updates, the target doesn't re-evaluate (and hence doesn't notify) faster than a certain rate
        target['throttleEvaluation'] = timeout;

        // (2) For writable targets (observables, or writable dependent observables), we throttle *writes*
        //     so the target cannot change value synchronously or faster than a certain rate
        var writeTimeoutInstance = null;
        return ko.dependentObservable({
            'read': target,
            'write': function(value) {
                clearTimeout(writeTimeoutInstance);
                writeTimeoutInstance = ko.utils.setTimeout(function() {
                    target(value);
                }, timeout);
            }
        });
    },

    'rateLimit': function(target, options) {
        var timeout, method, limitFunction;

        if (typeof options == 'number') {
            timeout = options;
        } else {
            timeout = options['timeout'];
            method = options['method'];
        }

        // rateLimit supersedes deferred updates
        target._deferUpdates = false;

        limitFunction = method == 'notifyWhenChangesStop' ?  debounce : throttle;
        target.limit(function(callback) {
            return limitFunction(callback, timeout);
        });
    },

    'deferred': function(target, options) {
        if (options !== true) {
            throw new Error('The \'deferred\' extender only accepts the value \'true\', because it is not supported to turn deferral off once enabled.')
        }

        if (!target._deferUpdates) {
            target._deferUpdates = true;
            target.limit(function (callback) {
                var handle,
                    ignoreUpdates = false;
                return function () {
                    if (!ignoreUpdates) {
                        ko.tasks.cancel(handle);
                        handle = ko.tasks.schedule(callback);

                        try {
                            ignoreUpdates = true;
                            target['notifySubscribers'](undefined, 'dirty');
                        } finally {
                            ignoreUpdates = false;
                        }
                    }
                };
            });
        }
    },

    'notify': function(target, notifyWhen) {
        target["equalityComparer"] = notifyWhen == "always" ?
            null :  // null equalityComparer means to always notify
            valuesArePrimitiveAndEqual;
    }
};

var primitiveTypes = { 'undefined':1, 'boolean':1, 'number':1, 'string':1 };
function valuesArePrimitiveAndEqual(a, b) {
    var oldValueIsPrimitive = (a === null) || (typeof(a) in primitiveTypes);
    return oldValueIsPrimitive ? (a === b) : false;
}

function throttle(callback, timeout) {
    var timeoutInstance;
    return function () {
        if (!timeoutInstance) {
            timeoutInstance = ko.utils.setTimeout(function () {
                timeoutInstance = undefined;
                callback();
            }, timeout);
        }
    };
}

function debounce(callback, timeout) {
    var timeoutInstance;
    return function () {
        clearTimeout(timeoutInstance);
        timeoutInstance = ko.utils.setTimeout(callback, timeout);
    };
}

function applyExtenders(requestedExtenders) {
    var target = this;
    if (requestedExtenders) {
        ko.utils.objectForEach(requestedExtenders, function(key, value) {
            var extenderHandler = ko.extenders[key];
            if (typeof extenderHandler == 'function') {
                target = extenderHandler(target, value) || target;
            }
        });
    }
    return target;
}

ko.exportSymbol('extenders', ko.extenders);

ko.subscription = function (target, callback, disposeCallback) {
    this._target = target;
    this.callback = callback;
    this.disposeCallback = disposeCallback;
    this.isDisposed = false;
    ko.exportProperty(this, 'dispose', this.dispose);
};
ko.subscription.prototype.dispose = function () {
    this.isDisposed = true;
    this.disposeCallback();
};

ko.subscribable = function () {
    ko.utils.setPrototypeOfOrExtend(this, ko_subscribable_fn);
    ko_subscribable_fn.init(this);
}

var defaultEvent = "change";

// Moved out of "limit" to avoid the extra closure
function limitNotifySubscribers(value, event) {
    if (!event || event === defaultEvent) {
        this._limitChange(value);
    } else if (event === 'beforeChange') {
        this._limitBeforeChange(value);
    } else {
        this._origNotifySubscribers(value, event);
    }
}

var ko_subscribable_fn = {
    init: function(instance) {
        instance._subscriptions = { "change": [] };
        instance._versionNumber = 1;
    },

    subscribe: function (callback, callbackTarget, event) {
        var self = this;

        event = event || defaultEvent;
        var boundCallback = callbackTarget ? callback.bind(callbackTarget) : callback;

        var subscription = new ko.subscription(self, boundCallback, function () {
            ko.utils.arrayRemoveItem(self._subscriptions[event], subscription);
            if (self.afterSubscriptionRemove)
                self.afterSubscriptionRemove(event);
        });

        if (self.beforeSubscriptionAdd)
            self.beforeSubscriptionAdd(event);

        if (!self._subscriptions[event])
            self._subscriptions[event] = [];
        self._subscriptions[event].push(subscription);

        return subscription;
    },

    "notifySubscribers": function (valueToNotify, event) {
        event = event || defaultEvent;
        if (event === defaultEvent) {
            this.updateVersion();
        }
        if (this.hasSubscriptionsForEvent(event)) {
            var subs = event === defaultEvent && this._changeSubscriptions || this._subscriptions[event].slice(0);
            try {
                ko.dependencyDetection.begin(); // Begin suppressing dependency detection (by setting the top frame to undefined)
                for (var i = 0, subscription; subscription = subs[i]; ++i) {
                    // In case a subscription was disposed during the arrayForEach cycle, check
                    // for isDisposed on each subscription before invoking its callback
                    if (!subscription.isDisposed)
                        subscription.callback(valueToNotify);
                }
            } finally {
                ko.dependencyDetection.end(); // End suppressing dependency detection
            }
        }
    },

    getVersion: function () {
        return this._versionNumber;
    },

    hasChanged: function (versionToCheck) {
        return this.getVersion() !== versionToCheck;
    },

    updateVersion: function () {
        ++this._versionNumber;
    },

    limit: function(limitFunction) {
        var self = this, selfIsObservable = ko.isObservable(self),
            ignoreBeforeChange, notifyNextChange, previousValue, pendingValue, beforeChange = 'beforeChange';

        if (!self._origNotifySubscribers) {
            self._origNotifySubscribers = self["notifySubscribers"];
            self["notifySubscribers"] = limitNotifySubscribers;
        }

        var finish = limitFunction(function() {
            self._notificationIsPending = false;

            // If an observable provided a reference to itself, access it to get the latest value.
            // This allows computed observables to delay calculating their value until needed.
            if (selfIsObservable && pendingValue === self) {
                pendingValue = self._evalIfChanged ? self._evalIfChanged() : self();
            }
            var shouldNotify = notifyNextChange || self.isDifferent(previousValue, pendingValue);

            notifyNextChange = ignoreBeforeChange = false;

            if (shouldNotify) {
                self._origNotifySubscribers(previousValue = pendingValue);
            }
        });

        self._limitChange = function(value) {
            self._changeSubscriptions = self._subscriptions[defaultEvent].slice(0);
            self._notificationIsPending = ignoreBeforeChange = true;
            pendingValue = value;
            finish();
        };
        self._limitBeforeChange = function(value) {
            if (!ignoreBeforeChange) {
                previousValue = value;
                self._origNotifySubscribers(value, beforeChange);
            }
        };
        self._notifyNextChangeIfValueIsDifferent = function() {
            if (self.isDifferent(previousValue, self.peek(true /*evaluate*/))) {
                notifyNextChange = true;
            }
        };
    },

    hasSubscriptionsForEvent: function(event) {
        return this._subscriptions[event] && this._subscriptions[event].length;
    },

    getSubscriptionsCount: function (event) {
        if (event) {
            return this._subscriptions[event] && this._subscriptions[event].length || 0;
        } else {
            var total = 0;
            ko.utils.objectForEach(this._subscriptions, function(eventName, subscriptions) {
                if (eventName !== 'dirty')
                    total += subscriptions.length;
            });
            return total;
        }
    },

    isDifferent: function(oldValue, newValue) {
        return !this['equalityComparer'] || !this['equalityComparer'](oldValue, newValue);
    },

    extend: applyExtenders
};

ko.exportProperty(ko_subscribable_fn, 'subscribe', ko_subscribable_fn.subscribe);
ko.exportProperty(ko_subscribable_fn, 'extend', ko_subscribable_fn.extend);
ko.exportProperty(ko_subscribable_fn, 'getSubscriptionsCount', ko_subscribable_fn.getSubscriptionsCount);

// For browsers that support proto assignment, we overwrite the prototype of each
// observable instance. Since observables are functions, we need Function.prototype
// to still be in the prototype chain.
if (ko.utils.canSetPrototype) {
    ko.utils.setPrototypeOf(ko_subscribable_fn, Function.prototype);
}

ko.subscribable['fn'] = ko_subscribable_fn;


ko.isSubscribable = function (instance) {
    return instance != null && typeof instance.subscribe == "function" && typeof instance["notifySubscribers"] == "function";
};

ko.exportSymbol('subscribable', ko.subscribable);
ko.exportSymbol('isSubscribable', ko.isSubscribable);

ko.computedContext = ko.dependencyDetection = (function () {
    var outerFrames = [],
        currentFrame,
        lastId = 0;

    // Return a unique ID that can be assigned to an observable for dependency tracking.
    // Theoretically, you could eventually overflow the number storage size, resulting
    // in duplicate IDs. But in JavaScript, the largest exact integral value is 2^53
    // or 9,007,199,254,740,992. If you created 1,000,000 IDs per second, it would
    // take over 285 years to reach that number.
    // Reference http://blog.vjeux.com/2010/javascript/javascript-max_int-number-limits.html
    function getId() {
        return ++lastId;
    }

    function begin(options) {
        outerFrames.push(currentFrame);
        currentFrame = options;
    }

    function end() {
        currentFrame = outerFrames.pop();
    }

    return {
        begin: begin,

        end: end,

        registerDependency: function (subscribable) {
            if (currentFrame) {
                if (!ko.isSubscribable(subscribable))
                    throw new Error("Only subscribable things can act as dependencies");
                currentFrame.callback.call(currentFrame.callbackTarget, subscribable, subscribable._id || (subscribable._id = getId()));
            }
        },

        ignore: function (callback, callbackTarget, callbackArgs) {
            try {
                begin();
                return callback.apply(callbackTarget, callbackArgs || []);
            } finally {
                end();
            }
        },

        getDependenciesCount: function () {
            if (currentFrame)
                return currentFrame.computed.getDependenciesCount();
        },

        isInitial: function() {
            if (currentFrame)
                return currentFrame.isInitial;
        }
    };
})();

ko.exportSymbol('computedContext', ko.computedContext);
ko.exportSymbol('computedContext.getDependenciesCount', ko.computedContext.getDependenciesCount);
ko.exportSymbol('computedContext.isInitial', ko.computedContext.isInitial);

ko.exportSymbol('ignoreDependencies', ko.ignoreDependencies = ko.dependencyDetection.ignore);
var observableLatestValue = ko.utils.createSymbolOrString('_latestValue');

ko.observable = function (initialValue) {
    function observable() {
        if (arguments.length > 0) {
            // Write

            // Ignore writes if the value hasn't changed
            if (observable.isDifferent(observable[observableLatestValue], arguments[0])) {
                observable.valueWillMutate();
                observable[observableLatestValue] = arguments[0];
                observable.valueHasMutated();
            }
            return this; // Permits chained assignments
        }
        else {
            // Read
            ko.dependencyDetection.registerDependency(observable); // The caller only needs to be notified of changes if they did a "read" operation
            return observable[observableLatestValue];
        }
    }

    observable[observableLatestValue] = initialValue;

    // Inherit from 'subscribable'
    if (!ko.utils.canSetPrototype) {
        // 'subscribable' won't be on the prototype chain unless we put it there directly
        ko.utils.extend(observable, ko.subscribable['fn']);
    }
    ko.subscribable['fn'].init(observable);

    // Inherit from 'observable'
    ko.utils.setPrototypeOfOrExtend(observable, observableFn);

    if (ko.options['deferUpdates']) {
        ko.extenders['deferred'](observable, true);
    }

    return observable;
}

// Define prototype for observables
var observableFn = {
    'equalityComparer': valuesArePrimitiveAndEqual,
    peek: function() { return this[observableLatestValue]; },
    valueHasMutated: function () { this['notifySubscribers'](this[observableLatestValue]); },
    valueWillMutate: function () { this['notifySubscribers'](this[observableLatestValue], 'beforeChange'); }
};

// Note that for browsers that don't support proto assignment, the
// inheritance chain is created manually in the ko.observable constructor
if (ko.utils.canSetPrototype) {
    ko.utils.setPrototypeOf(observableFn, ko.subscribable['fn']);
}

var protoProperty = ko.observable.protoProperty = '__ko_proto__';
observableFn[protoProperty] = ko.observable;

ko.hasPrototype = function(instance, prototype) {
    if ((instance === null) || (instance === undefined) || (instance[protoProperty] === undefined)) return false;
    if (instance[protoProperty] === prototype) return true;
    return ko.hasPrototype(instance[protoProperty], prototype); // Walk the prototype chain
};

ko.isObservable = function (instance) {
    return ko.hasPrototype(instance, ko.observable);
}
ko.isWriteableObservable = function (instance) {
    // Observable
    if ((typeof instance == 'function') && instance[protoProperty] === ko.observable)
        return true;
    // Writeable dependent observable
    if ((typeof instance == 'function') && (instance[protoProperty] === ko.dependentObservable) && (instance.hasWriteFunction))
        return true;
    // Anything else
    return false;
}

ko.exportSymbol('observable', ko.observable);
ko.exportSymbol('isObservable', ko.isObservable);
ko.exportSymbol('isWriteableObservable', ko.isWriteableObservable);
ko.exportSymbol('isWritableObservable', ko.isWriteableObservable);
ko.exportSymbol('observable.fn', observableFn);
ko.exportProperty(observableFn, 'peek', observableFn.peek);
ko.exportProperty(observableFn, 'valueHasMutated', observableFn.valueHasMutated);
ko.exportProperty(observableFn, 'valueWillMutate', observableFn.valueWillMutate);
ko.observableArray = function (initialValues) {
    initialValues = initialValues || [];

    if (typeof initialValues != 'object' || !('length' in initialValues))
        throw new Error("The argument passed when initializing an observable array must be an array, or null, or undefined.");

    var result = ko.observable(initialValues);
    ko.utils.setPrototypeOfOrExtend(result, ko.observableArray['fn']);
    return result.extend({'trackArrayChanges':true});
};

ko.observableArray['fn'] = {
    'remove': function (valueOrPredicate) {
        var underlyingArray = this.peek();
        var removedValues = [];
        var predicate = typeof valueOrPredicate == "function" && !ko.isObservable(valueOrPredicate) ? valueOrPredicate : function (value) { return value === valueOrPredicate; };
        for (var i = 0; i < underlyingArray.length; i++) {
            var value = underlyingArray[i];
            if (predicate(value)) {
                if (removedValues.length === 0) {
                    this.valueWillMutate();
                }
                removedValues.push(value);
                underlyingArray.splice(i, 1);
                i--;
            }
        }
        if (removedValues.length) {
            this.valueHasMutated();
        }
        return removedValues;
    },

    'removeAll': function (arrayOfValues) {
        // If you passed zero args, we remove everything
        if (arrayOfValues === undefined) {
            var underlyingArray = this.peek();
            var allValues = underlyingArray.slice(0);
            this.valueWillMutate();
            underlyingArray.splice(0, underlyingArray.length);
            this.valueHasMutated();
            return allValues;
        }
        // If you passed an arg, we interpret it as an array of entries to remove
        if (!arrayOfValues)
            return [];
        return this['remove'](function (value) {
            return ko.utils.arrayIndexOf(arrayOfValues, value) >= 0;
        });
    },

    'destroy': function (valueOrPredicate) {
        var underlyingArray = this.peek();
        var predicate = typeof valueOrPredicate == "function" && !ko.isObservable(valueOrPredicate) ? valueOrPredicate : function (value) { return value === valueOrPredicate; };
        this.valueWillMutate();
        for (var i = underlyingArray.length - 1; i >= 0; i--) {
            var value = underlyingArray[i];
            if (predicate(value))
                underlyingArray[i]["_destroy"] = true;
        }
        this.valueHasMutated();
    },

    'destroyAll': function (arrayOfValues) {
        // If you passed zero args, we destroy everything
        if (arrayOfValues === undefined)
            return this['destroy'](function() { return true });

        // If you passed an arg, we interpret it as an array of entries to destroy
        if (!arrayOfValues)
            return [];
        return this['destroy'](function (value) {
            return ko.utils.arrayIndexOf(arrayOfValues, value) >= 0;
        });
    },

    'indexOf': function (item) {
        var underlyingArray = this();
        return ko.utils.arrayIndexOf(underlyingArray, item);
    },

    'replace': function(oldItem, newItem) {
        var index = this['indexOf'](oldItem);
        if (index >= 0) {
            this.valueWillMutate();
            this.peek()[index] = newItem;
            this.valueHasMutated();
        }
    }
};

// Note that for browsers that don't support proto assignment, the
// inheritance chain is created manually in the ko.observableArray constructor
if (ko.utils.canSetPrototype) {
    ko.utils.setPrototypeOf(ko.observableArray['fn'], ko.observable['fn']);
}

// Populate ko.observableArray.fn with read/write functions from native arrays
// Important: Do not add any additional functions here that may reasonably be used to *read* data from the array
// because we'll eval them without causing subscriptions, so ko.computed output could end up getting stale
ko.utils.arrayForEach(["pop", "push", "reverse", "shift", "sort", "splice", "unshift"], function (methodName) {
    ko.observableArray['fn'][methodName] = function () {
        // Use "peek" to avoid creating a subscription in any computed that we're executing in the context of
        // (for consistency with mutating regular observables)
        var underlyingArray = this.peek();
        this.valueWillMutate();
        this.cacheDiffForKnownOperation(underlyingArray, methodName, arguments);
        var methodCallResult = underlyingArray[methodName].apply(underlyingArray, arguments);
        this.valueHasMutated();
        // The native sort and reverse methods return a reference to the array, but it makes more sense to return the observable array instead.
        return methodCallResult === underlyingArray ? this : methodCallResult;
    };
});

// Populate ko.observableArray.fn with read-only functions from native arrays
ko.utils.arrayForEach(["slice"], function (methodName) {
    ko.observableArray['fn'][methodName] = function () {
        var underlyingArray = this();
        return underlyingArray[methodName].apply(underlyingArray, arguments);
    };
});

ko.exportSymbol('observableArray', ko.observableArray);
var arrayChangeEventName = 'arrayChange';
ko.extenders['trackArrayChanges'] = function(target, options) {
    // Use the provided options--each call to trackArrayChanges overwrites the previously set options
    target.compareArrayOptions = {};
    if (options && typeof options == "object") {
        ko.utils.extend(target.compareArrayOptions, options);
    }
    target.compareArrayOptions['sparse'] = true;

    // Only modify the target observable once
    if (target.cacheDiffForKnownOperation) {
        return;
    }
    var trackingChanges = false,
        cachedDiff = null,
        arrayChangeSubscription,
        pendingNotifications = 0,
        underlyingNotifySubscribersFunction,
        underlyingBeforeSubscriptionAddFunction = target.beforeSubscriptionAdd,
        underlyingAfterSubscriptionRemoveFunction = target.afterSubscriptionRemove;

    // Watch "subscribe" calls, and for array change events, ensure change tracking is enabled
    target.beforeSubscriptionAdd = function (event) {
        if (underlyingBeforeSubscriptionAddFunction)
            underlyingBeforeSubscriptionAddFunction.call(target, event);
        if (event === arrayChangeEventName) {
            trackChanges();
        }
    };
    // Watch "dispose" calls, and for array change events, ensure change tracking is disabled when all are disposed
    target.afterSubscriptionRemove = function (event) {
        if (underlyingAfterSubscriptionRemoveFunction)
            underlyingAfterSubscriptionRemoveFunction.call(target, event);
        if (event === arrayChangeEventName && !target.hasSubscriptionsForEvent(arrayChangeEventName)) {
            if (underlyingNotifySubscribersFunction) {
                target['notifySubscribers'] = underlyingNotifySubscribersFunction;
                underlyingNotifySubscribersFunction = undefined;
            }
            arrayChangeSubscription.dispose();
            trackingChanges = false;
        }
    };

    function trackChanges() {
        // Calling 'trackChanges' multiple times is the same as calling it once
        if (trackingChanges) {
            return;
        }

        trackingChanges = true;

        // Intercept "notifySubscribers" to track how many times it was called.
        underlyingNotifySubscribersFunction = target['notifySubscribers'];
        target['notifySubscribers'] = function(valueToNotify, event) {
            if (!event || event === defaultEvent) {
                ++pendingNotifications;
            }
            return underlyingNotifySubscribersFunction.apply(this, arguments);
        };

        // Each time the array changes value, capture a clone so that on the next
        // change it's possible to produce a diff
        var previousContents = [].concat(target.peek() || []);
        cachedDiff = null;
        arrayChangeSubscription = target.subscribe(function(currentContents) {
            // Make a copy of the current contents and ensure it's an array
            currentContents = [].concat(currentContents || []);

            // Compute the diff and issue notifications, but only if someone is listening
            if (target.hasSubscriptionsForEvent(arrayChangeEventName)) {
                var changes = getChanges(previousContents, currentContents);
            }

            // Eliminate references to the old, removed items, so they can be GCed
            previousContents = currentContents;
            cachedDiff = null;
            pendingNotifications = 0;

            if (changes && changes.length) {
                target['notifySubscribers'](changes, arrayChangeEventName);
            }
        });
    }

    function getChanges(previousContents, currentContents) {
        // We try to re-use cached diffs.
        // The scenarios where pendingNotifications > 1 are when using rate-limiting or the Deferred Updates
        // plugin, which without this check would not be compatible with arrayChange notifications. Normally,
        // notifications are issued immediately so we wouldn't be queueing up more than one.
        if (!cachedDiff || pendingNotifications > 1) {
            cachedDiff = ko.utils.compareArrays(previousContents, currentContents, target.compareArrayOptions);
        }

        return cachedDiff;
    }

    target.cacheDiffForKnownOperation = function(rawArray, operationName, args) {
        // Only run if we're currently tracking changes for this observable array
        // and there aren't any pending deferred notifications.
        if (!trackingChanges || pendingNotifications) {
            return;
        }
        var diff = [],
            arrayLength = rawArray.length,
            argsLength = args.length,
            offset = 0;

        function pushDiff(status, value, index) {
            return diff[diff.length] = { 'status': status, 'value': value, 'index': index };
        }
        switch (operationName) {
            case 'push':
                offset = arrayLength;
            case 'unshift':
                for (var index = 0; index < argsLength; index++) {
                    pushDiff('added', args[index], offset + index);
                }
                break;

            case 'pop':
                offset = arrayLength - 1;
            case 'shift':
                if (arrayLength) {
                    pushDiff('deleted', rawArray[offset], offset);
                }
                break;

            case 'splice':
                // Negative start index means 'from end of array'. After that we clamp to [0...arrayLength].
                // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice
                var startIndex = Math.min(Math.max(0, args[0] < 0 ? arrayLength + args[0] : args[0]), arrayLength),
                    endDeleteIndex = argsLength === 1 ? arrayLength : Math.min(startIndex + (args[1] || 0), arrayLength),
                    endAddIndex = startIndex + argsLength - 2,
                    endIndex = Math.max(endDeleteIndex, endAddIndex),
                    additions = [], deletions = [];
                for (var index = startIndex, argsIndex = 2; index < endIndex; ++index, ++argsIndex) {
                    if (index < endDeleteIndex)
                        deletions.push(pushDiff('deleted', rawArray[index], index));
                    if (index < endAddIndex)
                        additions.push(pushDiff('added', args[argsIndex], index));
                }
                ko.utils.findMovesInArrayComparison(deletions, additions);
                break;

            default:
                return;
        }
        cachedDiff = diff;
    };
};
var computedState = ko.utils.createSymbolOrString('_state');

ko.computed = ko.dependentObservable = function (evaluatorFunctionOrOptions, evaluatorFunctionTarget, options) {
    if (typeof evaluatorFunctionOrOptions === "object") {
        // Single-parameter syntax - everything is on this "options" param
        options = evaluatorFunctionOrOptions;
    } else {
        // Multi-parameter syntax - construct the options according to the params passed
        options = options || {};
        if (evaluatorFunctionOrOptions) {
            options["read"] = evaluatorFunctionOrOptions;
        }
    }
    if (typeof options["read"] != "function")
        throw Error("Pass a function that returns the value of the ko.computed");

    var writeFunction = options["write"];
    var state = {
        latestValue: undefined,
        isStale: true,
        isDirty: true,
        isBeingEvaluated: false,
        suppressDisposalUntilDisposeWhenReturnsFalse: false,
        isDisposed: false,
        pure: false,
        isSleeping: false,
        readFunction: options["read"],
        evaluatorFunctionTarget: evaluatorFunctionTarget || options["owner"],
        disposeWhenNodeIsRemoved: options["disposeWhenNodeIsRemoved"] || options.disposeWhenNodeIsRemoved || null,
        disposeWhen: options["disposeWhen"] || options.disposeWhen,
        domNodeDisposalCallback: null,
        dependencyTracking: {},
        dependenciesCount: 0,
        evaluationTimeoutInstance: null
    };

    function computedObservable() {
        if (arguments.length > 0) {
            if (typeof writeFunction === "function") {
                // Writing a value
                writeFunction.apply(state.evaluatorFunctionTarget, arguments);
            } else {
                throw new Error("Cannot write a value to a ko.computed unless you specify a 'write' option. If you wish to read the current value, don't pass any parameters.");
            }
            return this; // Permits chained assignments
        } else {
            // Reading the value
            ko.dependencyDetection.registerDependency(computedObservable);
            if (state.isDirty || (state.isSleeping && computedObservable.haveDependenciesChanged())) {
                computedObservable.evaluateImmediate();
            }
            return state.latestValue;
        }
    }

    computedObservable[computedState] = state;
    computedObservable.hasWriteFunction = typeof writeFunction === "function";

    // Inherit from 'subscribable'
    if (!ko.utils.canSetPrototype) {
        // 'subscribable' won't be on the prototype chain unless we put it there directly
        ko.utils.extend(computedObservable, ko.subscribable['fn']);
    }
    ko.subscribable['fn'].init(computedObservable);

    // Inherit from 'computed'
    ko.utils.setPrototypeOfOrExtend(computedObservable, computedFn);

    if (options['pure']) {
        state.pure = true;
        state.isSleeping = true;     // Starts off sleeping; will awake on the first subscription
        ko.utils.extend(computedObservable, pureComputedOverrides);
    } else if (options['deferEvaluation']) {
        ko.utils.extend(computedObservable, deferEvaluationOverrides);
    }

    if (ko.options['deferUpdates']) {
        ko.extenders['deferred'](computedObservable, true);
    }

    if (DEBUG) {
        // #1731 - Aid debugging by exposing the computed's options
        computedObservable["_options"] = options;
    }

    if (state.disposeWhenNodeIsRemoved) {
        // Since this computed is associated with a DOM node, and we don't want to dispose the computed
        // until the DOM node is *removed* from the document (as opposed to never having been in the document),
        // we'll prevent disposal until "disposeWhen" first returns false.
        state.suppressDisposalUntilDisposeWhenReturnsFalse = true;

        // disposeWhenNodeIsRemoved: true can be used to opt into the "only dispose after first false result"
        // behaviour even if there's no specific node to watch. In that case, clear the option so we don't try
        // to watch for a non-node's disposal. This technique is intended for KO's internal use only and shouldn't
        // be documented or used by application code, as it's likely to change in a future version of KO.
        if (!state.disposeWhenNodeIsRemoved.nodeType) {
            state.disposeWhenNodeIsRemoved = null;
        }
    }

    // Evaluate, unless sleeping or deferEvaluation is true
    if (!state.isSleeping && !options['deferEvaluation']) {
        computedObservable.evaluateImmediate();
    }

    // Attach a DOM node disposal callback so that the computed will be proactively disposed as soon as the node is
    // removed using ko.removeNode. But skip if isActive is false (there will never be any dependencies to dispose).
    if (state.disposeWhenNodeIsRemoved && computedObservable.isActive()) {
        ko.utils.domNodeDisposal.addDisposeCallback(state.disposeWhenNodeIsRemoved, state.domNodeDisposalCallback = function () {
            computedObservable.dispose();
        });
    }

    return computedObservable;
};

// Utility function that disposes a given dependencyTracking entry
function computedDisposeDependencyCallback(id, entryToDispose) {
    if (entryToDispose !== null && entryToDispose.dispose) {
        entryToDispose.dispose();
    }
}

// This function gets called each time a dependency is detected while evaluating a computed.
// It's factored out as a shared function to avoid creating unnecessary function instances during evaluation.
function computedBeginDependencyDetectionCallback(subscribable, id) {
    var computedObservable = this.computedObservable,
        state = computedObservable[computedState];
    if (!state.isDisposed) {
        if (this.disposalCount && this.disposalCandidates[id]) {
            // Don't want to dispose this subscription, as it's still being used
            computedObservable.addDependencyTracking(id, subscribable, this.disposalCandidates[id]);
            this.disposalCandidates[id] = null; // No need to actually delete the property - disposalCandidates is a transient object anyway
            --this.disposalCount;
        } else if (!state.dependencyTracking[id]) {
            // Brand new subscription - add it
            computedObservable.addDependencyTracking(id, subscribable, state.isSleeping ? { _target: subscribable } : computedObservable.subscribeToDependency(subscribable));
        }
        // If the observable we've accessed has a pending notification, ensure we get notified of the actual final value (bypass equality checks)
        if (subscribable._notificationIsPending) {
            subscribable._notifyNextChangeIfValueIsDifferent();
        }
    }
}

var computedFn = {
    "equalityComparer": valuesArePrimitiveAndEqual,
    getDependenciesCount: function () {
        return this[computedState].dependenciesCount;
    },
    addDependencyTracking: function (id, target, trackingObj) {
        if (this[computedState].pure && target === this) {
            throw Error("A 'pure' computed must not be called recursively");
        }

        this[computedState].dependencyTracking[id] = trackingObj;
        trackingObj._order = this[computedState].dependenciesCount++;
        trackingObj._version = target.getVersion();
    },
    haveDependenciesChanged: function () {
        var id, dependency, dependencyTracking = this[computedState].dependencyTracking;
        for (id in dependencyTracking) {
            if (dependencyTracking.hasOwnProperty(id)) {
                dependency = dependencyTracking[id];
                if ((this._evalDelayed && dependency._target._notificationIsPending) || dependency._target.hasChanged(dependency._version)) {
                    return true;
                }
            }
        }
    },
    markDirty: function () {
        // Process "dirty" events if we can handle delayed notifications
        if (this._evalDelayed && !this[computedState].isBeingEvaluated) {
            this._evalDelayed(false /*isChange*/);
        }
    },
    isActive: function () {
        var state = this[computedState];
        return state.isDirty || state.dependenciesCount > 0;
    },
    respondToChange: function () {
        // Ignore "change" events if we've already scheduled a delayed notification
        if (!this._notificationIsPending) {
            this.evaluatePossiblyAsync();
        } else if (this[computedState].isDirty) {
            this[computedState].isStale = true;
        }
    },
    subscribeToDependency: function (target) {
        if (target._deferUpdates && !this[computedState].disposeWhenNodeIsRemoved) {
            var dirtySub = target.subscribe(this.markDirty, this, 'dirty'),
                changeSub = target.subscribe(this.respondToChange, this);
            return {
                _target: target,
                dispose: function () {
                    dirtySub.dispose();
                    changeSub.dispose();
                }
            };
        } else {
            return target.subscribe(this.evaluatePossiblyAsync, this);
        }
    },
    evaluatePossiblyAsync: function () {
        var computedObservable = this,
            throttleEvaluationTimeout = computedObservable['throttleEvaluation'];
        if (throttleEvaluationTimeout && throttleEvaluationTimeout >= 0) {
            clearTimeout(this[computedState].evaluationTimeoutInstance);
            this[computedState].evaluationTimeoutInstance = ko.utils.setTimeout(function () {
                computedObservable.evaluateImmediate(true /*notifyChange*/);
            }, throttleEvaluationTimeout);
        } else if (computedObservable._evalDelayed) {
            computedObservable._evalDelayed(true /*isChange*/);
        } else {
            computedObservable.evaluateImmediate(true /*notifyChange*/);
        }
    },
    evaluateImmediate: function (notifyChange) {
        var computedObservable = this,
            state = computedObservable[computedState],
            disposeWhen = state.disposeWhen,
            changed = false;

        if (state.isBeingEvaluated) {
            // If the evaluation of a ko.computed causes side effects, it's possible that it will trigger its own re-evaluation.
            // This is not desirable (it's hard for a developer to realise a chain of dependencies might cause this, and they almost
            // certainly didn't intend infinite re-evaluations). So, for predictability, we simply prevent ko.computeds from causing
            // their own re-evaluation. Further discussion at https://github.com/SteveSanderson/knockout/pull/387
            return;
        }

        // Do not evaluate (and possibly capture new dependencies) if disposed
        if (state.isDisposed) {
            return;
        }

        if (state.disposeWhenNodeIsRemoved && !ko.utils.domNodeIsAttachedToDocument(state.disposeWhenNodeIsRemoved) || disposeWhen && disposeWhen()) {
            // See comment above about suppressDisposalUntilDisposeWhenReturnsFalse
            if (!state.suppressDisposalUntilDisposeWhenReturnsFalse) {
                computedObservable.dispose();
                return;
            }
        } else {
            // It just did return false, so we can stop suppressing now
            state.suppressDisposalUntilDisposeWhenReturnsFalse = false;
        }

        state.isBeingEvaluated = true;
        try {
            changed = this.evaluateImmediate_CallReadWithDependencyDetection(notifyChange);
        } finally {
            state.isBeingEvaluated = false;
        }

        if (!state.dependenciesCount) {
            computedObservable.dispose();
        }

        return changed;
    },
    evaluateImmediate_CallReadWithDependencyDetection: function (notifyChange) {
        // This function is really just part of the evaluateImmediate logic. You would never call it from anywhere else.
        // Factoring it out into a separate function means it can be independent of the try/catch block in evaluateImmediate,
        // which contributes to saving about 40% off the CPU overhead of computed evaluation (on V8 at least).

        var computedObservable = this,
            state = computedObservable[computedState],
            changed = false;

        // Initially, we assume that none of the subscriptions are still being used (i.e., all are candidates for disposal).
        // Then, during evaluation, we cross off any that are in fact still being used.
        var isInitial = state.pure ? undefined : !state.dependenciesCount,   // If we're evaluating when there are no previous dependencies, it must be the first time
            dependencyDetectionContext = {
                computedObservable: computedObservable,
                disposalCandidates: state.dependencyTracking,
                disposalCount: state.dependenciesCount
            };

        ko.dependencyDetection.begin({
            callbackTarget: dependencyDetectionContext,
            callback: computedBeginDependencyDetectionCallback,
            computed: computedObservable,
            isInitial: isInitial
        });

        state.dependencyTracking = {};
        state.dependenciesCount = 0;

        var newValue = this.evaluateImmediate_CallReadThenEndDependencyDetection(state, dependencyDetectionContext);

        if (computedObservable.isDifferent(state.latestValue, newValue)) {
            if (!state.isSleeping) {
                computedObservable["notifySubscribers"](state.latestValue, "beforeChange");
            }

            state.latestValue = newValue;
            if (DEBUG) computedObservable._latestValue = newValue;

            if (state.isSleeping) {
                computedObservable.updateVersion();
            } else if (notifyChange) {
                computedObservable["notifySubscribers"](state.latestValue);
            }

            changed = true;
        }

        if (isInitial) {
            computedObservable["notifySubscribers"](state.latestValue, "awake");
        }

        return changed;
    },
    evaluateImmediate_CallReadThenEndDependencyDetection: function (state, dependencyDetectionContext) {
        // This function is really part of the evaluateImmediate_CallReadWithDependencyDetection logic.
        // You'd never call it from anywhere else. Factoring it out means that evaluateImmediate_CallReadWithDependencyDetection
        // can be independent of try/finally blocks, which contributes to saving about 40% off the CPU
        // overhead of computed evaluation (on V8 at least).

        try {
            var readFunction = state.readFunction;
            return state.evaluatorFunctionTarget ? readFunction.call(state.evaluatorFunctionTarget) : readFunction();
        } finally {
            ko.dependencyDetection.end();

            // For each subscription no longer being used, remove it from the active subscriptions list and dispose it
            if (dependencyDetectionContext.disposalCount && !state.isSleeping) {
                ko.utils.objectForEach(dependencyDetectionContext.disposalCandidates, computedDisposeDependencyCallback);
            }

            state.isStale = state.isDirty = false;
        }
    },
    peek: function (evaluate) {
        // By default, peek won't re-evaluate, except while the computed is sleeping or to get the initial value when "deferEvaluation" is set.
        // Pass in true to evaluate if needed.
        var state = this[computedState];
        if ((state.isDirty && (evaluate || !state.dependenciesCount)) || (state.isSleeping && this.haveDependenciesChanged())) {
            this.evaluateImmediate();
        }
        return state.latestValue;
    },
    limit: function (limitFunction) {
        // Override the limit function with one that delays evaluation as well
        ko.subscribable['fn'].limit.call(this, limitFunction);
        this._evalIfChanged = function () {
            if (this[computedState].isStale) {
                this.evaluateImmediate();
            } else {
                this[computedState].isDirty = false;
            }
            return this[computedState].latestValue;
        };
        this._evalDelayed = function (isChange) {
            this._limitBeforeChange(this[computedState].latestValue);

            // Mark as dirty
            this[computedState].isDirty = true;
            if (isChange) {
                this[computedState].isStale = true;
            }

            // Pass the observable to the "limit" code, which will evaluate it when
            // it's time to do the notification.
            this._limitChange(this);
        };
    },
    dispose: function () {
        var state = this[computedState];
        if (!state.isSleeping && state.dependencyTracking) {
            ko.utils.objectForEach(state.dependencyTracking, function (id, dependency) {
                if (dependency.dispose)
                    dependency.dispose();
            });
        }
        if (state.disposeWhenNodeIsRemoved && state.domNodeDisposalCallback) {
            ko.utils.domNodeDisposal.removeDisposeCallback(state.disposeWhenNodeIsRemoved, state.domNodeDisposalCallback);
        }
        state.dependencyTracking = null;
        state.dependenciesCount = 0;
        state.isDisposed = true;
        state.isStale = false;
        state.isDirty = false;
        state.isSleeping = false;
        state.disposeWhenNodeIsRemoved = null;
    }
};

var pureComputedOverrides = {
    beforeSubscriptionAdd: function (event) {
        // If asleep, wake up the computed by subscribing to any dependencies.
        var computedObservable = this,
            state = computedObservable[computedState];
        if (!state.isDisposed && state.isSleeping && event == 'change') {
            state.isSleeping = false;
            if (state.isStale || computedObservable.haveDependenciesChanged()) {
                state.dependencyTracking = null;
                state.dependenciesCount = 0;
                if (computedObservable.evaluateImmediate()) {
                    computedObservable.updateVersion();
                }
            } else {
                // First put the dependencies in order
                var dependeciesOrder = [];
                ko.utils.objectForEach(state.dependencyTracking, function (id, dependency) {
                    dependeciesOrder[dependency._order] = id;
                });
                // Next, subscribe to each one
                ko.utils.arrayForEach(dependeciesOrder, function (id, order) {
                    var dependency = state.dependencyTracking[id],
                        subscription = computedObservable.subscribeToDependency(dependency._target);
                    subscription._order = order;
                    subscription._version = dependency._version;
                    state.dependencyTracking[id] = subscription;
                });
            }
            if (!state.isDisposed) {     // test since evaluating could trigger disposal
                computedObservable["notifySubscribers"](state.latestValue, "awake");
            }
        }
    },
    afterSubscriptionRemove: function (event) {
        var state = this[computedState];
        if (!state.isDisposed && event == 'change' && !this.hasSubscriptionsForEvent('change')) {
            ko.utils.objectForEach(state.dependencyTracking, function (id, dependency) {
                if (dependency.dispose) {
                    state.dependencyTracking[id] = {
                        _target: dependency._target,
                        _order: dependency._order,
                        _version: dependency._version
                    };
                    dependency.dispose();
                }
            });
            state.isSleeping = true;
            this["notifySubscribers"](undefined, "asleep");
        }
    },
    getVersion: function () {
        // Because a pure computed is not automatically updated while it is sleeping, we can't
        // simply return the version number. Instead, we check if any of the dependencies have
        // changed and conditionally re-evaluate the computed observable.
        var state = this[computedState];
        if (state.isSleeping && (state.isStale || this.haveDependenciesChanged())) {
            this.evaluateImmediate();
        }
        return ko.subscribable['fn'].getVersion.call(this);
    }
};

var deferEvaluationOverrides = {
    beforeSubscriptionAdd: function (event) {
        // This will force a computed with deferEvaluation to evaluate when the first subscription is registered.
        if (event == 'change' || event == 'beforeChange') {
            this.peek();
        }
    }
};

// Note that for browsers that don't support proto assignment, the
// inheritance chain is created manually in the ko.computed constructor
if (ko.utils.canSetPrototype) {
    ko.utils.setPrototypeOf(computedFn, ko.subscribable['fn']);
}

// Set the proto chain values for ko.hasPrototype
var protoProp = ko.observable.protoProperty; // == "__ko_proto__"
ko.computed[protoProp] = ko.observable;
computedFn[protoProp] = ko.computed;

ko.isComputed = function (instance) {
    return ko.hasPrototype(instance, ko.computed);
};

ko.isPureComputed = function (instance) {
    return ko.hasPrototype(instance, ko.computed)
        && instance[computedState] && instance[computedState].pure;
};

ko.exportSymbol('computed', ko.computed);
ko.exportSymbol('dependentObservable', ko.computed);    // export ko.dependentObservable for backwards compatibility (1.x)
ko.exportSymbol('isComputed', ko.isComputed);
ko.exportSymbol('isPureComputed', ko.isPureComputed);
ko.exportSymbol('computed.fn', computedFn);
ko.exportProperty(computedFn, 'peek', computedFn.peek);
ko.exportProperty(computedFn, 'dispose', computedFn.dispose);
ko.exportProperty(computedFn, 'isActive', computedFn.isActive);
ko.exportProperty(computedFn, 'getDependenciesCount', computedFn.getDependenciesCount);

ko.pureComputed = function (evaluatorFunctionOrOptions, evaluatorFunctionTarget) {
    if (typeof evaluatorFunctionOrOptions === 'function') {
        return ko.computed(evaluatorFunctionOrOptions, evaluatorFunctionTarget, {'pure':true});
    } else {
        evaluatorFunctionOrOptions = ko.utils.extend({}, evaluatorFunctionOrOptions);   // make a copy of the parameter object
        evaluatorFunctionOrOptions['pure'] = true;
        return ko.computed(evaluatorFunctionOrOptions, evaluatorFunctionTarget);
    }
}
ko.exportSymbol('pureComputed', ko.pureComputed);

(function() {
    var maxNestedObservableDepth = 10; // Escape the (unlikely) pathalogical case where an observable's current value is itself (or similar reference cycle)

    ko.toJS = function(rootObject) {
        if (arguments.length == 0)
            throw new Error("When calling ko.toJS, pass the object you want to convert.");

        // We just unwrap everything at every level in the object graph
        return mapJsObjectGraph(rootObject, function(valueToMap) {
            // Loop because an observable's value might in turn be another observable wrapper
            for (var i = 0; ko.isObservable(valueToMap) && (i < maxNestedObservableDepth); i++)
                valueToMap = valueToMap();
            return valueToMap;
        });
    };

    ko.toJSON = function(rootObject, replacer, space) {     // replacer and space are optional
        var plainJavaScriptObject = ko.toJS(rootObject);
        return ko.utils.stringifyJson(plainJavaScriptObject, replacer, space);
    };

    function mapJsObjectGraph(rootObject, mapInputCallback, visitedObjects) {
        visitedObjects = visitedObjects || new objectLookup();

        rootObject = mapInputCallback(rootObject);
        var canHaveProperties = (typeof rootObject == "object") && (rootObject !== null) && (rootObject !== undefined) && (!(rootObject instanceof RegExp)) && (!(rootObject instanceof Date)) && (!(rootObject instanceof String)) && (!(rootObject instanceof Number)) && (!(rootObject instanceof Boolean));
        if (!canHaveProperties)
            return rootObject;

        var outputProperties = rootObject instanceof Array ? [] : {};
        visitedObjects.save(rootObject, outputProperties);

        visitPropertiesOrArrayEntries(rootObject, function(indexer) {
            var propertyValue = mapInputCallback(rootObject[indexer]);

            switch (typeof propertyValue) {
                case "boolean":
                case "number":
                case "string":
                case "function":
                    outputProperties[indexer] = propertyValue;
                    break;
                case "object":
                case "undefined":
                    var previouslyMappedValue = visitedObjects.get(propertyValue);
                    outputProperties[indexer] = (previouslyMappedValue !== undefined)
                        ? previouslyMappedValue
                        : mapJsObjectGraph(propertyValue, mapInputCallback, visitedObjects);
                    break;
            }
        });

        return outputProperties;
    }

    function visitPropertiesOrArrayEntries(rootObject, visitorCallback) {
        if (rootObject instanceof Array) {
            for (var i = 0; i < rootObject.length; i++)
                visitorCallback(i);

            // For arrays, also respect toJSON property for custom mappings (fixes #278)
            if (typeof rootObject['toJSON'] == 'function')
                visitorCallback('toJSON');
        } else {
            for (var propertyName in rootObject) {
                visitorCallback(propertyName);
            }
        }
    };

    function objectLookup() {
        this.keys = [];
        this.values = [];
    };

    objectLookup.prototype = {
        constructor: objectLookup,
        save: function(key, value) {
            var existingIndex = ko.utils.arrayIndexOf(this.keys, key);
            if (existingIndex >= 0)
                this.values[existingIndex] = value;
            else {
                this.keys.push(key);
                this.values.push(value);
            }
        },
        get: function(key) {
            var existingIndex = ko.utils.arrayIndexOf(this.keys, key);
            return (existingIndex >= 0) ? this.values[existingIndex] : undefined;
        }
    };
})();

ko.exportSymbol('toJS', ko.toJS);
ko.exportSymbol('toJSON', ko.toJSON);
(function () {
    var hasDomDataExpandoProperty = '__ko__hasDomDataOptionValue__';

    // Normally, SELECT elements and their OPTIONs can only take value of type 'string' (because the values
    // are stored on DOM attributes). ko.selectExtensions provides a way for SELECTs/OPTIONs to have values
    // that are arbitrary objects. This is very convenient when implementing things like cascading dropdowns.
    ko.selectExtensions = {
        readValue : function(element) {
            switch (ko.utils.tagNameLower(element)) {
                case 'option':
                    if (element[hasDomDataExpandoProperty] === true)
                        return ko.utils.domData.get(element, ko.bindingHandlers.options.optionValueDomDataKey);
                    return ko.utils.ieVersion <= 7
                        ? (element.getAttributeNode('value') && element.getAttributeNode('value').specified ? element.value : element.text)
                        : element.value;
                case 'select':
                    return element.selectedIndex >= 0 ? ko.selectExtensions.readValue(element.options[element.selectedIndex]) : undefined;
                default:
                    return element.value;
            }
        },

        writeValue: function(element, value, allowUnset) {
            switch (ko.utils.tagNameLower(element)) {
                case 'option':
                    switch(typeof value) {
                        case "string":
                            ko.utils.domData.set(element, ko.bindingHandlers.options.optionValueDomDataKey, undefined);
                            if (hasDomDataExpandoProperty in element) { // IE <= 8 throws errors if you delete non-existent properties from a DOM node
                                delete element[hasDomDataExpandoProperty];
                            }
                            element.value = value;
                            break;
                        default:
                            // Store arbitrary object using DomData
                            ko.utils.domData.set(element, ko.bindingHandlers.options.optionValueDomDataKey, value);
                            element[hasDomDataExpandoProperty] = true;

                            // Special treatment of numbers is just for backward compatibility. KO 1.2.1 wrote numerical values to element.value.
                            element.value = typeof value === "number" ? value : "";
                            break;
                    }
                    break;
                case 'select':
                    if (value === "" || value === null)       // A blank string or null value will select the caption
                        value = undefined;
                    var selection = -1;
                    for (var i = 0, n = element.options.length, optionValue; i < n; ++i) {
                        optionValue = ko.selectExtensions.readValue(element.options[i]);
                        // Include special check to handle selecting a caption with a blank string value
                        if (optionValue == value || (optionValue == "" && value === undefined)) {
                            selection = i;
                            break;
                        }
                    }
                    if (allowUnset || selection >= 0 || (value === undefined && element.size > 1)) {
                        element.selectedIndex = selection;
                    }
                    break;
                default:
                    if ((value === null) || (value === undefined))
                        value = "";
                    element.value = value;
                    break;
            }
        }
    };
})();

ko.exportSymbol('selectExtensions', ko.selectExtensions);
ko.exportSymbol('selectExtensions.readValue', ko.selectExtensions.readValue);
ko.exportSymbol('selectExtensions.writeValue', ko.selectExtensions.writeValue);
ko.expressionRewriting = (function () {
    var javaScriptReservedWords = ["true", "false", "null", "undefined"];

    // Matches something that can be assigned to--either an isolated identifier or something ending with a property accessor
    // This is designed to be simple and avoid false negatives, but could produce false positives (e.g., a+b.c).
    // This also will not properly handle nested brackets (e.g., obj1[obj2['prop']]; see #911).
    var javaScriptAssignmentTarget = /^(?:[$_a-z][$\w]*|(.+)(\.\s*[$_a-z][$\w]*|\[.+\]))$/i;

    function getWriteableValue(expression) {
        if (ko.utils.arrayIndexOf(javaScriptReservedWords, expression) >= 0)
            return false;
        var match = expression.match(javaScriptAssignmentTarget);
        return match === null ? false : match[1] ? ('Object(' + match[1] + ')' + match[2]) : expression;
    }

    // The following regular expressions will be used to split an object-literal string into tokens

        // These two match strings, either with double quotes or single quotes
    var stringDouble = '"(?:[^"\\\\]|\\\\.)*"',
        stringSingle = "'(?:[^'\\\\]|\\\\.)*'",
        // Matches a regular expression (text enclosed by slashes), but will also match sets of divisions
        // as a regular expression (this is handled by the parsing loop below).
        stringRegexp = '/(?:[^/\\\\]|\\\\.)*/\w*',
        // These characters have special meaning to the parser and must not appear in the middle of a
        // token, except as part of a string.
        specials = ',"\'{}()/:[\\]',
        // Match text (at least two characters) that does not contain any of the above special characters,
        // although some of the special characters are allowed to start it (all but the colon and comma).
        // The text can contain spaces, but leading or trailing spaces are skipped.
        everyThingElse = '[^\\s:,/][^' + specials + ']*[^\\s' + specials + ']',
        // Match any non-space character not matched already. This will match colons and commas, since they're
        // not matched by "everyThingElse", but will also match any other single character that wasn't already
        // matched (for example: in "a: 1, b: 2", each of the non-space characters will be matched by oneNotSpace).
        oneNotSpace = '[^\\s]',

        // Create the actual regular expression by or-ing the above strings. The order is important.
        bindingToken = RegExp(stringDouble + '|' + stringSingle + '|' + stringRegexp + '|' + everyThingElse + '|' + oneNotSpace, 'g'),

        // Match end of previous token to determine whether a slash is a division or regex.
        divisionLookBehind = /[\])"'A-Za-z0-9_$]+$/,
        keywordRegexLookBehind = {'in':1,'return':1,'typeof':1};

    function parseObjectLiteral(objectLiteralString) {
        // Trim leading and trailing spaces from the string
        var str = ko.utils.stringTrim(objectLiteralString);

        // Trim braces '{' surrounding the whole object literal
        if (str.charCodeAt(0) === 123) str = str.slice(1, -1);

        // Split into tokens
        var result = [], toks = str.match(bindingToken), key, values = [], depth = 0;

        if (toks) {
            // Append a comma so that we don't need a separate code block to deal with the last item
            toks.push(',');

            for (var i = 0, tok; tok = toks[i]; ++i) {
                var c = tok.charCodeAt(0);
                // A comma signals the end of a key/value pair if depth is zero
                if (c === 44) { // ","
                    if (depth <= 0) {
                        result.push((key && values.length) ? {key: key, value: values.join('')} : {'unknown': key || values.join('')});
                        key = depth = 0;
                        values = [];
                        continue;
                    }
                // Simply skip the colon that separates the name and value
                } else if (c === 58) { // ":"
                    if (!depth && !key && values.length === 1) {
                        key = values.pop();
                        continue;
                    }
                // A set of slashes is initially matched as a regular expression, but could be division
                } else if (c === 47 && i && tok.length > 1) {  // "/"
                    // Look at the end of the previous token to determine if the slash is actually division
                    var match = toks[i-1].match(divisionLookBehind);
                    if (match && !keywordRegexLookBehind[match[0]]) {
                        // The slash is actually a division punctuator; re-parse the remainder of the string (not including the slash)
                        str = str.substr(str.indexOf(tok) + 1);
                        toks = str.match(bindingToken);
                        toks.push(',');
                        i = -1;
                        // Continue with just the slash
                        tok = '/';
                    }
                // Increment depth for parentheses, braces, and brackets so that interior commas are ignored
                } else if (c === 40 || c === 123 || c === 91) { // '(', '{', '['
                    ++depth;
                } else if (c === 41 || c === 125 || c === 93) { // ')', '}', ']'
                    --depth;
                // The key will be the first token; if it's a string, trim the quotes
                } else if (!key && !values.length && (c === 34 || c === 39)) { // '"', "'"
                    tok = tok.slice(1, -1);
                }
                values.push(tok);
            }
        }
        return result;
    }

    // Two-way bindings include a write function that allow the handler to update the value even if it's not an observable.
    var twoWayBindings = {};

    function preProcessBindings(bindingsStringOrKeyValueArray, bindingOptions) {
        bindingOptions = bindingOptions || {};

        function processKeyValue(key, val) {
            var writableVal;
            function callPreprocessHook(obj) {
                return (obj && obj['preprocess']) ? (val = obj['preprocess'](val, key, processKeyValue)) : true;
            }
            if (!bindingParams) {
                if (!callPreprocessHook(ko['getBindingHandler'](key)))
                    return;

                if (twoWayBindings[key] && (writableVal = getWriteableValue(val))) {
                    // For two-way bindings, provide a write method in case the value
                    // isn't a writable observable.
                    propertyAccessorResultStrings.push("'" + key + "':function(_z){" + writableVal + "=_z}");
                }
            }
            // Values are wrapped in a function so that each value can be accessed independently
            if (makeValueAccessors) {
                val = 'function(){return ' + val + ' }';
            }
            resultStrings.push("'" + key + "':" + val);
        }

        var resultStrings = [],
            propertyAccessorResultStrings = [],
            makeValueAccessors = bindingOptions['valueAccessors'],
            bindingParams = bindingOptions['bindingParams'],
            keyValueArray = typeof bindingsStringOrKeyValueArray === "string" ?
                parseObjectLiteral(bindingsStringOrKeyValueArray) : bindingsStringOrKeyValueArray;

        ko.utils.arrayForEach(keyValueArray, function(keyValue) {
            processKeyValue(keyValue.key || keyValue['unknown'], keyValue.value);
        });

        if (propertyAccessorResultStrings.length)
            processKeyValue('_ko_property_writers', "{" + propertyAccessorResultStrings.join(",") + " }");

        return resultStrings.join(",");
    }

    return {
        bindingRewriteValidators: [],

        twoWayBindings: twoWayBindings,

        parseObjectLiteral: parseObjectLiteral,

        preProcessBindings: preProcessBindings,

        keyValueArrayContainsKey: function(keyValueArray, key) {
            for (var i = 0; i < keyValueArray.length; i++)
                if (keyValueArray[i]['key'] == key)
                    return true;
            return false;
        },

        // Internal, private KO utility for updating model properties from within bindings
        // property:            If the property being updated is (or might be) an observable, pass it here
        //                      If it turns out to be a writable observable, it will be written to directly
        // allBindings:         An object with a get method to retrieve bindings in the current execution context.
        //                      This will be searched for a '_ko_property_writers' property in case you're writing to a non-observable
        // key:                 The key identifying the property to be written. Example: for { hasFocus: myValue }, write to 'myValue' by specifying the key 'hasFocus'
        // value:               The value to be written
        // checkIfDifferent:    If true, and if the property being written is a writable observable, the value will only be written if
        //                      it is !== existing value on that writable observable
        writeValueToProperty: function(property, allBindings, key, value, checkIfDifferent) {
            if (!property || !ko.isObservable(property)) {
                var propWriters = allBindings.get('_ko_property_writers');
                if (propWriters && propWriters[key])
                    propWriters[key](value);
            } else if (ko.isWriteableObservable(property) && (!checkIfDifferent || property.peek() !== value)) {
                property(value);
            }
        }
    };
})();

ko.exportSymbol('expressionRewriting', ko.expressionRewriting);
ko.exportSymbol('expressionRewriting.bindingRewriteValidators', ko.expressionRewriting.bindingRewriteValidators);
ko.exportSymbol('expressionRewriting.parseObjectLiteral', ko.expressionRewriting.parseObjectLiteral);
ko.exportSymbol('expressionRewriting.preProcessBindings', ko.expressionRewriting.preProcessBindings);

// Making bindings explicitly declare themselves as "two way" isn't ideal in the long term (it would be better if
// all bindings could use an official 'property writer' API without needing to declare that they might). However,
// since this is not, and has never been, a public API (_ko_property_writers was never documented), it's acceptable
// as an internal implementation detail in the short term.
// For those developers who rely on _ko_property_writers in their custom bindings, we expose _twoWayBindings as an
// undocumented feature that makes it relatively easy to upgrade to KO 3.0. However, this is still not an official
// public API, and we reserve the right to remove it at any time if we create a real public property writers API.
ko.exportSymbol('expressionRewriting._twoWayBindings', ko.expressionRewriting.twoWayBindings);

// For backward compatibility, define the following aliases. (Previously, these function names were misleading because
// they referred to JSON specifically, even though they actually work with arbitrary JavaScript object literal expressions.)
ko.exportSymbol('jsonExpressionRewriting', ko.expressionRewriting);
ko.exportSymbol('jsonExpressionRewriting.insertPropertyAccessorsIntoJson', ko.expressionRewriting.preProcessBindings);
(function() {
    // "Virtual elements" is an abstraction on top of the usual DOM API which understands the notion that comment nodes
    // may be used to represent hierarchy (in addition to the DOM's natural hierarchy).
    // If you call the DOM-manipulating functions on ko.virtualElements, you will be able to read and write the state
    // of that virtual hierarchy
    //
    // The point of all this is to support containerless templates (e.g., <!-- ko foreach:someCollection -->blah<!-- /ko -->)
    // without having to scatter special cases all over the binding and templating code.

    // IE 9 cannot reliably read the "nodeValue" property of a comment node (see https://github.com/SteveSanderson/knockout/issues/186)
    // but it does give them a nonstandard alternative property called "text" that it can read reliably. Other browsers don't have that property.
    // So, use node.text where available, and node.nodeValue elsewhere
    var commentNodesHaveTextProperty = document && document.createComment("test").text === "<!--test-->";

    var startCommentRegex = commentNodesHaveTextProperty ? /^<!--\s*ko(?:\s+([\s\S]+))?\s*-->$/ : /^\s*ko(?:\s+([\s\S]+))?\s*$/;
    var endCommentRegex =   commentNodesHaveTextProperty ? /^<!--\s*\/ko\s*-->$/ : /^\s*\/ko\s*$/;
    var htmlTagsWithOptionallyClosingChildren = { 'ul': true, 'ol': true };

    function isStartComment(node) {
        return (node.nodeType == 8) && startCommentRegex.test(commentNodesHaveTextProperty ? node.text : node.nodeValue);
    }

    function isEndComment(node) {
        return (node.nodeType == 8) && endCommentRegex.test(commentNodesHaveTextProperty ? node.text : node.nodeValue);
    }

    function getVirtualChildren(startComment, allowUnbalanced) {
        var currentNode = startComment;
        var depth = 1;
        var children = [];
        while (currentNode = currentNode.nextSibling) {
            if (isEndComment(currentNode)) {
                depth--;
                if (depth === 0)
                    return children;
            }

            children.push(currentNode);

            if (isStartComment(currentNode))
                depth++;
        }
        if (!allowUnbalanced)
            throw new Error("Cannot find closing comment tag to match: " + startComment.nodeValue);
        return null;
    }

    function getMatchingEndComment(startComment, allowUnbalanced) {
        var allVirtualChildren = getVirtualChildren(startComment, allowUnbalanced);
        if (allVirtualChildren) {
            if (allVirtualChildren.length > 0)
                return allVirtualChildren[allVirtualChildren.length - 1].nextSibling;
            return startComment.nextSibling;
        } else
            return null; // Must have no matching end comment, and allowUnbalanced is true
    }

    function getUnbalancedChildTags(node) {
        // e.g., from <div>OK</div><!-- ko blah --><span>Another</span>, returns: <!-- ko blah --><span>Another</span>
        //       from <div>OK</div><!-- /ko --><!-- /ko -->,             returns: <!-- /ko --><!-- /ko -->
        var childNode = node.firstChild, captureRemaining = null;
        if (childNode) {
            do {
                if (captureRemaining)                   // We already hit an unbalanced node and are now just scooping up all subsequent nodes
                    captureRemaining.push(childNode);
                else if (isStartComment(childNode)) {
                    var matchingEndComment = getMatchingEndComment(childNode, /* allowUnbalanced: */ true);
                    if (matchingEndComment)             // It's a balanced tag, so skip immediately to the end of this virtual set
                        childNode = matchingEndComment;
                    else
                        captureRemaining = [childNode]; // It's unbalanced, so start capturing from this point
                } else if (isEndComment(childNode)) {
                    captureRemaining = [childNode];     // It's unbalanced (if it wasn't, we'd have skipped over it already), so start capturing
                }
            } while (childNode = childNode.nextSibling);
        }
        return captureRemaining;
    }

    ko.virtualElements = {
        allowedBindings: {},

        childNodes: function(node) {
            return isStartComment(node) ? getVirtualChildren(node) : node.childNodes;
        },

        emptyNode: function(node) {
            if (!isStartComment(node))
                ko.utils.emptyDomNode(node);
            else {
                var virtualChildren = ko.virtualElements.childNodes(node);
                for (var i = 0, j = virtualChildren.length; i < j; i++)
                    ko.removeNode(virtualChildren[i]);
            }
        },

        setDomNodeChildren: function(node, childNodes) {
            if (!isStartComment(node))
                ko.utils.setDomNodeChildren(node, childNodes);
            else {
                ko.virtualElements.emptyNode(node);
                var endCommentNode = node.nextSibling; // Must be the next sibling, as we just emptied the children
                for (var i = 0, j = childNodes.length; i < j; i++)
                    endCommentNode.parentNode.insertBefore(childNodes[i], endCommentNode);
            }
        },

        prepend: function(containerNode, nodeToPrepend) {
            if (!isStartComment(containerNode)) {
                if (containerNode.firstChild)
                    containerNode.insertBefore(nodeToPrepend, containerNode.firstChild);
                else
                    containerNode.appendChild(nodeToPrepend);
            } else {
                // Start comments must always have a parent and at least one following sibling (the end comment)
                containerNode.parentNode.insertBefore(nodeToPrepend, containerNode.nextSibling);
            }
        },

        insertAfter: function(containerNode, nodeToInsert, insertAfterNode) {
            if (!insertAfterNode) {
                ko.virtualElements.prepend(containerNode, nodeToInsert);
            } else if (!isStartComment(containerNode)) {
                // Insert after insertion point
                if (insertAfterNode.nextSibling)
                    containerNode.insertBefore(nodeToInsert, insertAfterNode.nextSibling);
                else
                    containerNode.appendChild(nodeToInsert);
            } else {
                // Children of start comments must always have a parent and at least one following sibling (the end comment)
                containerNode.parentNode.insertBefore(nodeToInsert, insertAfterNode.nextSibling);
            }
        },

        firstChild: function(node) {
            if (!isStartComment(node))
                return node.firstChild;
            if (!node.nextSibling || isEndComment(node.nextSibling))
                return null;
            return node.nextSibling;
        },

        nextSibling: function(node) {
            if (isStartComment(node))
                node = getMatchingEndComment(node);
            if (node.nextSibling && isEndComment(node.nextSibling))
                return null;
            return node.nextSibling;
        },

        hasBindingValue: isStartComment,

        virtualNodeBindingValue: function(node) {
            var regexMatch = (commentNodesHaveTextProperty ? node.text : node.nodeValue).match(startCommentRegex);
            return regexMatch ? regexMatch[1] : null;
        },

        normaliseVirtualElementDomStructure: function(elementVerified) {
            // Workaround for https://github.com/SteveSanderson/knockout/issues/155
            // (IE <= 8 or IE 9 quirks mode parses your HTML weirdly, treating closing </li> tags as if they don't exist, thereby moving comment nodes
            // that are direct descendants of <ul> into the preceding <li>)
            if (!htmlTagsWithOptionallyClosingChildren[ko.utils.tagNameLower(elementVerified)])
                return;

            // Scan immediate children to see if they contain unbalanced comment tags. If they do, those comment tags
            // must be intended to appear *after* that child, so move them there.
            var childNode = elementVerified.firstChild;
            if (childNode) {
                do {
                    if (childNode.nodeType === 1) {
                        var unbalancedTags = getUnbalancedChildTags(childNode);
                        if (unbalancedTags) {
                            // Fix up the DOM by moving the unbalanced tags to where they most likely were intended to be placed - *after* the child
                            var nodeToInsertBefore = childNode.nextSibling;
                            for (var i = 0; i < unbalancedTags.length; i++) {
                                if (nodeToInsertBefore)
                                    elementVerified.insertBefore(unbalancedTags[i], nodeToInsertBefore);
                                else
                                    elementVerified.appendChild(unbalancedTags[i]);
                            }
                        }
                    }
                } while (childNode = childNode.nextSibling);
            }
        }
    };
})();
ko.exportSymbol('virtualElements', ko.virtualElements);
ko.exportSymbol('virtualElements.allowedBindings', ko.virtualElements.allowedBindings);
ko.exportSymbol('virtualElements.emptyNode', ko.virtualElements.emptyNode);
//ko.exportSymbol('virtualElements.firstChild', ko.virtualElements.firstChild);     // firstChild is not minified
ko.exportSymbol('virtualElements.insertAfter', ko.virtualElements.insertAfter);
//ko.exportSymbol('virtualElements.nextSibling', ko.virtualElements.nextSibling);   // nextSibling is not minified
ko.exportSymbol('virtualElements.prepend', ko.virtualElements.prepend);
ko.exportSymbol('virtualElements.setDomNodeChildren', ko.virtualElements.setDomNodeChildren);
(function() {
    var defaultBindingAttributeName = "data-bind";

    ko.bindingProvider = function() {
        this.bindingCache = {};
    };

    ko.utils.extend(ko.bindingProvider.prototype, {
        'nodeHasBindings': function(node) {
            switch (node.nodeType) {
                case 1: // Element
                    return node.getAttribute(defaultBindingAttributeName) != null
                        || ko.components['getComponentNameForNode'](node);
                case 8: // Comment node
                    return ko.virtualElements.hasBindingValue(node);
                default: return false;
            }
        },

        'getBindings': function(node, bindingContext) {
            var bindingsString = this['getBindingsString'](node, bindingContext),
                parsedBindings = bindingsString ? this['parseBindingsString'](bindingsString, bindingContext, node) : null;
            return ko.components.addBindingsForCustomElement(parsedBindings, node, bindingContext, /* valueAccessors */ false);
        },

        'getBindingAccessors': function(node, bindingContext) {
            var bindingsString = this['getBindingsString'](node, bindingContext),
                parsedBindings = bindingsString ? this['parseBindingsString'](bindingsString, bindingContext, node, { 'valueAccessors': true }) : null;
            return ko.components.addBindingsForCustomElement(parsedBindings, node, bindingContext, /* valueAccessors */ true);
        },

        // The following function is only used internally by this default provider.
        // It's not part of the interface definition for a general binding provider.
        'getBindingsString': function(node, bindingContext) {
            switch (node.nodeType) {
                case 1: return node.getAttribute(defaultBindingAttributeName);   // Element
                case 8: return ko.virtualElements.virtualNodeBindingValue(node); // Comment node
                default: return null;
            }
        },

        // The following function is only used internally by this default provider.
        // It's not part of the interface definition for a general binding provider.
        'parseBindingsString': function(bindingsString, bindingContext, node, options) {
            try {
                var bindingFunction = createBindingsStringEvaluatorViaCache(bindingsString, this.bindingCache, options);
                return bindingFunction(bindingContext, node);
            } catch (ex) {
                ex.message = "Unable to parse bindings.\nBindings value: " + bindingsString + "\nMessage: " + ex.message;
                throw ex;
            }
        }
    });

    ko.bindingProvider['instance'] = new ko.bindingProvider();

    function createBindingsStringEvaluatorViaCache(bindingsString, cache, options) {
        var cacheKey = bindingsString + (options && options['valueAccessors'] || '');
        return cache[cacheKey]
            || (cache[cacheKey] = createBindingsStringEvaluator(bindingsString, options));
    }

    function createBindingsStringEvaluator(bindingsString, options) {
        // Build the source for a function that evaluates "expression"
        // For each scope variable, add an extra level of "with" nesting
        // Example result: with(sc1) { with(sc0) { return (expression) } }
        var rewrittenBindings = ko.expressionRewriting.preProcessBindings(bindingsString, options),
            functionBody = "with($context){with($data||{}){return{" + rewrittenBindings + "}}}";
        return new Function("$context", "$element", functionBody);
    }
})();

ko.exportSymbol('bindingProvider', ko.bindingProvider);
(function () {
    ko.bindingHandlers = {};

    // The following element types will not be recursed into during binding.
    var bindingDoesNotRecurseIntoElementTypes = {
        // Don't want bindings that operate on text nodes to mutate <script> and <textarea> contents,
        // because it's unexpected and a potential XSS issue.
        // Also bindings should not operate on <template> elements since this breaks in Internet Explorer
        // and because such elements' contents are always intended to be bound in a different context
        // from where they appear in the document.
        'script': true,
        'textarea': true,
        'template': true
    };

    // Use an overridable method for retrieving binding handlers so that a plugins may support dynamically created handlers
    ko['getBindingHandler'] = function(bindingKey) {
        return ko.bindingHandlers[bindingKey];
    };

    // The ko.bindingContext constructor is only called directly to create the root context. For child
    // contexts, use bindingContext.createChildContext or bindingContext.extend.
    ko.bindingContext = function(dataItemOrAccessor, parentContext, dataItemAlias, extendCallback, options) {

        // The binding context object includes static properties for the current, parent, and root view models.
        // If a view model is actually stored in an observable, the corresponding binding context object, and
        // any child contexts, must be updated when the view model is changed.
        function updateContext() {
            // Most of the time, the context will directly get a view model object, but if a function is given,
            // we call the function to retrieve the view model. If the function accesses any observables or returns
            // an observable, the dependency is tracked, and those observables can later cause the binding
            // context to be updated.
            var dataItemOrObservable = isFunc ? dataItemOrAccessor() : dataItemOrAccessor,
                dataItem = ko.utils.unwrapObservable(dataItemOrObservable);

            if (parentContext) {
                // When a "parent" context is given, register a dependency on the parent context. Thus whenever the
                // parent context is updated, this context will also be updated.
                if (parentContext._subscribable)
                    parentContext._subscribable();

                // Copy $root and any custom properties from the parent context
                ko.utils.extend(self, parentContext);

                // Because the above copy overwrites our own properties, we need to reset them.
                self._subscribable = subscribable;
            } else {
                self['$parents'] = [];
                self['$root'] = dataItem;

                // Export 'ko' in the binding context so it will be available in bindings and templates
                // even if 'ko' isn't exported as a global, such as when using an AMD loader.
                // See https://github.com/SteveSanderson/knockout/issues/490
                self['ko'] = ko;
            }
            self['$rawData'] = dataItemOrObservable;
            self['$data'] = dataItem;
            if (dataItemAlias)
                self[dataItemAlias] = dataItem;

            // The extendCallback function is provided when creating a child context or extending a context.
            // It handles the specific actions needed to finish setting up the binding context. Actions in this
            // function could also add dependencies to this binding context.
            if (extendCallback)
                extendCallback(self, parentContext, dataItem);

            return self['$data'];
        }
        function disposeWhen() {
            return nodes && !ko.utils.anyDomNodeIsAttachedToDocument(nodes);
        }

        var self = this,
            isFunc = typeof(dataItemOrAccessor) == "function" && !ko.isObservable(dataItemOrAccessor),
            nodes,
            subscribable;

        if (options && options['exportDependencies']) {
            // The "exportDependencies" option means that the calling code will track any dependencies and re-create
            // the binding context when they change.
            updateContext();
        } else {
            subscribable = ko.dependentObservable(updateContext, null, { disposeWhen: disposeWhen, disposeWhenNodeIsRemoved: true });

            // At this point, the binding context has been initialized, and the "subscribable" computed observable is
            // subscribed to any observables that were accessed in the process. If there is nothing to track, the
            // computed will be inactive, and we can safely throw it away. If it's active, the computed is stored in
            // the context object.
            if (subscribable.isActive()) {
                self._subscribable = subscribable;

                // Always notify because even if the model ($data) hasn't changed, other context properties might have changed
                subscribable['equalityComparer'] = null;

                // We need to be able to dispose of this computed observable when it's no longer needed. This would be
                // easy if we had a single node to watch, but binding contexts can be used by many different nodes, and
                // we cannot assume that those nodes have any relation to each other. So instead we track any node that
                // the context is attached to, and dispose the computed when all of those nodes have been cleaned.

                // Add properties to *subscribable* instead of *self* because any properties added to *self* may be overwritten on updates
                nodes = [];
                subscribable._addNode = function(node) {
                    nodes.push(node);
                    ko.utils.domNodeDisposal.addDisposeCallback(node, function(node) {
                        ko.utils.arrayRemoveItem(nodes, node);
                        if (!nodes.length) {
                            subscribable.dispose();
                            self._subscribable = subscribable = undefined;
                        }
                    });
                };
            }
        }
    }

    // Extend the binding context hierarchy with a new view model object. If the parent context is watching
    // any observables, the new child context will automatically get a dependency on the parent context.
    // But this does not mean that the $data value of the child context will also get updated. If the child
    // view model also depends on the parent view model, you must provide a function that returns the correct
    // view model on each update.
    ko.bindingContext.prototype['createChildContext'] = function (dataItemOrAccessor, dataItemAlias, extendCallback, options) {
        return new ko.bindingContext(dataItemOrAccessor, this, dataItemAlias, function(self, parentContext) {
            // Extend the context hierarchy by setting the appropriate pointers
            self['$parentContext'] = parentContext;
            self['$parent'] = parentContext['$data'];
            self['$parents'] = (parentContext['$parents'] || []).slice(0);
            self['$parents'].unshift(self['$parent']);
            if (extendCallback)
                extendCallback(self);
        }, options);
    };

    // Extend the binding context with new custom properties. This doesn't change the context hierarchy.
    // Similarly to "child" contexts, provide a function here to make sure that the correct values are set
    // when an observable view model is updated.
    ko.bindingContext.prototype['extend'] = function(properties) {
        // If the parent context references an observable view model, "_subscribable" will always be the
        // latest view model object. If not, "_subscribable" isn't set, and we can use the static "$data" value.
        return new ko.bindingContext(this._subscribable || this['$data'], this, null, function(self, parentContext) {
            // This "child" context doesn't directly track a parent observable view model,
            // so we need to manually set the $rawData value to match the parent.
            self['$rawData'] = parentContext['$rawData'];
            ko.utils.extend(self, typeof(properties) == "function" ? properties() : properties);
        });
    };

    ko.bindingContext.prototype.createStaticChildContext = function (dataItemOrAccessor, dataItemAlias) {
        return this['createChildContext'](dataItemOrAccessor, dataItemAlias, null, { "exportDependencies": true });
    };

    // Returns the valueAccesor function for a binding value
    function makeValueAccessor(value) {
        return function() {
            return value;
        };
    }

    // Returns the value of a valueAccessor function
    function evaluateValueAccessor(valueAccessor) {
        return valueAccessor();
    }

    // Given a function that returns bindings, create and return a new object that contains
    // binding value-accessors functions. Each accessor function calls the original function
    // so that it always gets the latest value and all dependencies are captured. This is used
    // by ko.applyBindingsToNode and getBindingsAndMakeAccessors.
    function makeAccessorsFromFunction(callback) {
        return ko.utils.objectMap(ko.dependencyDetection.ignore(callback), function(value, key) {
            return function() {
                return callback()[key];
            };
        });
    }

    // Given a bindings function or object, create and return a new object that contains
    // binding value-accessors functions. This is used by ko.applyBindingsToNode.
    function makeBindingAccessors(bindings, context, node) {
        if (typeof bindings === 'function') {
            return makeAccessorsFromFunction(bindings.bind(null, context, node));
        } else {
            return ko.utils.objectMap(bindings, makeValueAccessor);
        }
    }

    // This function is used if the binding provider doesn't include a getBindingAccessors function.
    // It must be called with 'this' set to the provider instance.
    function getBindingsAndMakeAccessors(node, context) {
        return makeAccessorsFromFunction(this['getBindings'].bind(this, node, context));
    }

    function validateThatBindingIsAllowedForVirtualElements(bindingName) {
        var validator = ko.virtualElements.allowedBindings[bindingName];
        if (!validator)
            throw new Error("The binding '" + bindingName + "' cannot be used with virtual elements")
    }

    function applyBindingsToDescendantsInternal (bindingContext, elementOrVirtualElement, bindingContextsMayDifferFromDomParentElement) {
        var currentChild,
            nextInQueue = ko.virtualElements.firstChild(elementOrVirtualElement),
            provider = ko.bindingProvider['instance'],
            preprocessNode = provider['preprocessNode'];

        // Preprocessing allows a binding provider to mutate a node before bindings are applied to it. For example it's
        // possible to insert new siblings after it, and/or replace the node with a different one. This can be used to
        // implement custom binding syntaxes, such as {{ value }} for string interpolation, or custom element types that
        // trigger insertion of <template> contents at that point in the document.
        if (preprocessNode) {
            while (currentChild = nextInQueue) {
                nextInQueue = ko.virtualElements.nextSibling(currentChild);
                preprocessNode.call(provider, currentChild);
            }
            // Reset nextInQueue for the next loop
            nextInQueue = ko.virtualElements.firstChild(elementOrVirtualElement);
        }

        while (currentChild = nextInQueue) {
            // Keep a record of the next child *before* applying bindings, in case the binding removes the current child from its position
            nextInQueue = ko.virtualElements.nextSibling(currentChild);
            applyBindingsToNodeAndDescendantsInternal(bindingContext, currentChild, bindingContextsMayDifferFromDomParentElement);
        }
    }

    function applyBindingsToNodeAndDescendantsInternal (bindingContext, nodeVerified, bindingContextMayDifferFromDomParentElement) {
        var shouldBindDescendants = true;

        // Perf optimisation: Apply bindings only if...
        // (1) We need to store the binding context on this node (because it may differ from the DOM parent node's binding context)
        //     Note that we can't store binding contexts on non-elements (e.g., text nodes), as IE doesn't allow expando properties for those
        // (2) It might have bindings (e.g., it has a data-bind attribute, or it's a marker for a containerless template)
        var isElement = (nodeVerified.nodeType === 1);
        if (isElement) // Workaround IE <= 8 HTML parsing weirdness
            ko.virtualElements.normaliseVirtualElementDomStructure(nodeVerified);

        var shouldApplyBindings = (isElement && bindingContextMayDifferFromDomParentElement)             // Case (1)
                               || ko.bindingProvider['instance']['nodeHasBindings'](nodeVerified);       // Case (2)
        if (shouldApplyBindings)
            shouldBindDescendants = applyBindingsToNodeInternal(nodeVerified, null, bindingContext, bindingContextMayDifferFromDomParentElement)['shouldBindDescendants'];

        if (shouldBindDescendants && !bindingDoesNotRecurseIntoElementTypes[ko.utils.tagNameLower(nodeVerified)]) {
            // We're recursing automatically into (real or virtual) child nodes without changing binding contexts. So,
            //  * For children of a *real* element, the binding context is certainly the same as on their DOM .parentNode,
            //    hence bindingContextsMayDifferFromDomParentElement is false
            //  * For children of a *virtual* element, we can't be sure. Evaluating .parentNode on those children may
            //    skip over any number of intermediate virtual elements, any of which might define a custom binding context,
            //    hence bindingContextsMayDifferFromDomParentElement is true
            applyBindingsToDescendantsInternal(bindingContext, nodeVerified, /* bindingContextsMayDifferFromDomParentElement: */ !isElement);
        }
    }

    var boundElementDomDataKey = ko.utils.domData.nextKey();


    function topologicalSortBindings(bindings) {
        // Depth-first sort
        var result = [],                // The list of key/handler pairs that we will return
            bindingsConsidered = {},    // A temporary record of which bindings are already in 'result'
            cyclicDependencyStack = []; // Keeps track of a depth-search so that, if there's a cycle, we know which bindings caused it
        ko.utils.objectForEach(bindings, function pushBinding(bindingKey) {
            if (!bindingsConsidered[bindingKey]) {
                var binding = ko['getBindingHandler'](bindingKey);
                if (binding) {
                    // First add dependencies (if any) of the current binding
                    if (binding['after']) {
                        cyclicDependencyStack.push(bindingKey);
                        ko.utils.arrayForEach(binding['after'], function(bindingDependencyKey) {
                            if (bindings[bindingDependencyKey]) {
                                if (ko.utils.arrayIndexOf(cyclicDependencyStack, bindingDependencyKey) !== -1) {
                                    throw Error("Cannot combine the following bindings, because they have a cyclic dependency: " + cyclicDependencyStack.join(", "));
                                } else {
                                    pushBinding(bindingDependencyKey);
                                }
                            }
                        });
                        cyclicDependencyStack.length--;
                    }
                    // Next add the current binding
                    result.push({ key: bindingKey, handler: binding });
                }
                bindingsConsidered[bindingKey] = true;
            }
        });

        return result;
    }

    function applyBindingsToNodeInternal(node, sourceBindings, bindingContext, bindingContextMayDifferFromDomParentElement) {
        // Prevent multiple applyBindings calls for the same node, except when a binding value is specified
        var alreadyBound = ko.utils.domData.get(node, boundElementDomDataKey);
        if (!sourceBindings) {
            if (alreadyBound) {
                throw Error("You cannot apply bindings multiple times to the same element.");
            }
            ko.utils.domData.set(node, boundElementDomDataKey, true);
        }

        // Optimization: Don't store the binding context on this node if it's definitely the same as on node.parentNode, because
        // we can easily recover it just by scanning up the node's ancestors in the DOM
        // (note: here, parent node means "real DOM parent" not "virtual parent", as there's no O(1) way to find the virtual parent)
        if (!alreadyBound && bindingContextMayDifferFromDomParentElement)
            ko.storedBindingContextForNode(node, bindingContext);

        // Use bindings if given, otherwise fall back on asking the bindings provider to give us some bindings
        var bindings;
        if (sourceBindings && typeof sourceBindings !== 'function') {
            bindings = sourceBindings;
        } else {
            var provider = ko.bindingProvider['instance'],
                getBindings = provider['getBindingAccessors'] || getBindingsAndMakeAccessors;

            // Get the binding from the provider within a computed observable so that we can update the bindings whenever
            // the binding context is updated or if the binding provider accesses observables.
            var bindingsUpdater = ko.dependentObservable(
                function() {
                    bindings = sourceBindings ? sourceBindings(bindingContext, node) : getBindings.call(provider, node, bindingContext);
                    // Register a dependency on the binding context to support observable view models.
                    if (bindings && bindingContext._subscribable)
                        bindingContext._subscribable();
                    return bindings;
                },
                null, { disposeWhenNodeIsRemoved: node }
            );

            if (!bindings || !bindingsUpdater.isActive())
                bindingsUpdater = null;
        }

        var bindingHandlerThatControlsDescendantBindings;
        if (bindings) {
            // Return the value accessor for a given binding. When bindings are static (won't be updated because of a binding
            // context update), just return the value accessor from the binding. Otherwise, return a function that always gets
            // the latest binding value and registers a dependency on the binding updater.
            var getValueAccessor = bindingsUpdater
                ? function(bindingKey) {
                    return function() {
                        return evaluateValueAccessor(bindingsUpdater()[bindingKey]);
                    };
                } : function(bindingKey) {
                    return bindings[bindingKey];
                };

            // Use of allBindings as a function is maintained for backwards compatibility, but its use is deprecated
            function allBindings() {
                return ko.utils.objectMap(bindingsUpdater ? bindingsUpdater() : bindings, evaluateValueAccessor);
            }
            // The following is the 3.x allBindings API
            allBindings['get'] = function(key) {
                return bindings[key] && evaluateValueAccessor(getValueAccessor(key));
            };
            allBindings['has'] = function(key) {
                return key in bindings;
            };

            // First put the bindings into the right order
            var orderedBindings = topologicalSortBindings(bindings);

            // Go through the sorted bindings, calling init and update for each
            ko.utils.arrayForEach(orderedBindings, function(bindingKeyAndHandler) {
                // Note that topologicalSortBindings has already filtered out any nonexistent binding handlers,
                // so bindingKeyAndHandler.handler will always be nonnull.
                var handlerInitFn = bindingKeyAndHandler.handler["init"],
                    handlerUpdateFn = bindingKeyAndHandler.handler["update"],
                    bindingKey = bindingKeyAndHandler.key;

                if (node.nodeType === 8) {
                    validateThatBindingIsAllowedForVirtualElements(bindingKey);
                }

                try {
                    // Run init, ignoring any dependencies
                    if (typeof handlerInitFn == "function") {
                        ko.dependencyDetection.ignore(function() {
                            var initResult = handlerInitFn(node, getValueAccessor(bindingKey), allBindings, bindingContext['$data'], bindingContext);

                            // If this binding handler claims to control descendant bindings, make a note of this
                            if (initResult && initResult['controlsDescendantBindings']) {
                                if (bindingHandlerThatControlsDescendantBindings !== undefined)
                                    throw new Error("Multiple bindings (" + bindingHandlerThatControlsDescendantBindings + " and " + bindingKey + ") are trying to control descendant bindings of the same element. You cannot use these bindings together on the same element.");
                                bindingHandlerThatControlsDescendantBindings = bindingKey;
                            }
                        });
                    }

                    // Run update in its own computed wrapper
                    if (typeof handlerUpdateFn == "function") {
                        ko.dependentObservable(
                            function() {
                                handlerUpdateFn(node, getValueAccessor(bindingKey), allBindings, bindingContext['$data'], bindingContext);
                            },
                            null,
                            { disposeWhenNodeIsRemoved: node }
                        );
                    }
                } catch (ex) {
                    ex.message = "Unable to process binding \"" + bindingKey + ": " + bindings[bindingKey] + "\"\nMessage: " + ex.message;
                    throw ex;
                }
            });
        }

        return {
            'shouldBindDescendants': bindingHandlerThatControlsDescendantBindings === undefined
        };
    };

    var storedBindingContextDomDataKey = ko.utils.domData.nextKey();
    ko.storedBindingContextForNode = function (node, bindingContext) {
        if (arguments.length == 2) {
            ko.utils.domData.set(node, storedBindingContextDomDataKey, bindingContext);
            if (bindingContext._subscribable)
                bindingContext._subscribable._addNode(node);
        } else {
            return ko.utils.domData.get(node, storedBindingContextDomDataKey);
        }
    }

    function getBindingContext(viewModelOrBindingContext) {
        return viewModelOrBindingContext && (viewModelOrBindingContext instanceof ko.bindingContext)
            ? viewModelOrBindingContext
            : new ko.bindingContext(viewModelOrBindingContext);
    }

    ko.applyBindingAccessorsToNode = function (node, bindings, viewModelOrBindingContext) {
        if (node.nodeType === 1) // If it's an element, workaround IE <= 8 HTML parsing weirdness
            ko.virtualElements.normaliseVirtualElementDomStructure(node);
        return applyBindingsToNodeInternal(node, bindings, getBindingContext(viewModelOrBindingContext), true);
    };

    ko.applyBindingsToNode = function (node, bindings, viewModelOrBindingContext) {
        var context = getBindingContext(viewModelOrBindingContext);
        return ko.applyBindingAccessorsToNode(node, makeBindingAccessors(bindings, context, node), context);
    };

    ko.applyBindingsToDescendants = function(viewModelOrBindingContext, rootNode) {
        if (rootNode.nodeType === 1 || rootNode.nodeType === 8)
            applyBindingsToDescendantsInternal(getBindingContext(viewModelOrBindingContext), rootNode, true);
    };

    ko.applyBindings = function (viewModelOrBindingContext, rootNode) {
        // If jQuery is loaded after Knockout, we won't initially have access to it. So save it here.
        if (!jQueryInstance && window['jQuery']) {
            jQueryInstance = window['jQuery'];
        }

        if (rootNode && (rootNode.nodeType !== 1) && (rootNode.nodeType !== 8))
            throw new Error("ko.applyBindings: first parameter should be your view model; second parameter should be a DOM node");
        rootNode = rootNode || window.document.body; // Make "rootNode" parameter optional

        applyBindingsToNodeAndDescendantsInternal(getBindingContext(viewModelOrBindingContext), rootNode, true);
    };

    // Retrieving binding context from arbitrary nodes
    ko.contextFor = function(node) {
        // We can only do something meaningful for elements and comment nodes (in particular, not text nodes, as IE can't store domdata for them)
        switch (node.nodeType) {
            case 1:
            case 8:
                var context = ko.storedBindingContextForNode(node);
                if (context) return context;
                if (node.parentNode) return ko.contextFor(node.parentNode);
                break;
        }
        return undefined;
    };
    ko.dataFor = function(node) {
        var context = ko.contextFor(node);
        return context ? context['$data'] : undefined;
    };

    ko.exportSymbol('bindingHandlers', ko.bindingHandlers);
    ko.exportSymbol('applyBindings', ko.applyBindings);
    ko.exportSymbol('applyBindingsToDescendants', ko.applyBindingsToDescendants);
    ko.exportSymbol('applyBindingAccessorsToNode', ko.applyBindingAccessorsToNode);
    ko.exportSymbol('applyBindingsToNode', ko.applyBindingsToNode);
    ko.exportSymbol('contextFor', ko.contextFor);
    ko.exportSymbol('dataFor', ko.dataFor);
})();
(function(undefined) {
    var loadingSubscribablesCache = {}, // Tracks component loads that are currently in flight
        loadedDefinitionsCache = {};    // Tracks component loads that have already completed

    ko.components = {
        get: function(componentName, callback) {
            var cachedDefinition = getObjectOwnProperty(loadedDefinitionsCache, componentName);
            if (cachedDefinition) {
                // It's already loaded and cached. Reuse the same definition object.
                // Note that for API consistency, even cache hits complete asynchronously by default.
                // You can bypass this by putting synchronous:true on your component config.
                if (cachedDefinition.isSynchronousComponent) {
                    ko.dependencyDetection.ignore(function() { // See comment in loaderRegistryBehaviors.js for reasoning
                        callback(cachedDefinition.definition);
                    });
                } else {
                    ko.tasks.schedule(function() { callback(cachedDefinition.definition); });
                }
            } else {
                // Join the loading process that is already underway, or start a new one.
                loadComponentAndNotify(componentName, callback);
            }
        },

        clearCachedDefinition: function(componentName) {
            delete loadedDefinitionsCache[componentName];
        },

        _getFirstResultFromLoaders: getFirstResultFromLoaders
    };

    function getObjectOwnProperty(obj, propName) {
        return obj.hasOwnProperty(propName) ? obj[propName] : undefined;
    }

    function loadComponentAndNotify(componentName, callback) {
        var subscribable = getObjectOwnProperty(loadingSubscribablesCache, componentName),
            completedAsync;
        if (!subscribable) {
            // It's not started loading yet. Start loading, and when it's done, move it to loadedDefinitionsCache.
            subscribable = loadingSubscribablesCache[componentName] = new ko.subscribable();
            subscribable.subscribe(callback);

            beginLoadingComponent(componentName, function(definition, config) {
                var isSynchronousComponent = !!(config && config['synchronous']);
                loadedDefinitionsCache[componentName] = { definition: definition, isSynchronousComponent: isSynchronousComponent };
                delete loadingSubscribablesCache[componentName];

                // For API consistency, all loads complete asynchronously. However we want to avoid
                // adding an extra task schedule if it's unnecessary (i.e., the completion is already
                // async).
                //
                // You can bypass the 'always asynchronous' feature by putting the synchronous:true
                // flag on your component configuration when you register it.
                if (completedAsync || isSynchronousComponent) {
                    // Note that notifySubscribers ignores any dependencies read within the callback.
                    // See comment in loaderRegistryBehaviors.js for reasoning
                    subscribable['notifySubscribers'](definition);
                } else {
                    ko.tasks.schedule(function() {
                        subscribable['notifySubscribers'](definition);
                    });
                }
            });
            completedAsync = true;
        } else {
            subscribable.subscribe(callback);
        }
    }

    function beginLoadingComponent(componentName, callback) {
        getFirstResultFromLoaders('getConfig', [componentName], function(config) {
            if (config) {
                // We have a config, so now load its definition
                getFirstResultFromLoaders('loadComponent', [componentName, config], function(definition) {
                    callback(definition, config);
                });
            } else {
                // The component has no config - it's unknown to all the loaders.
                // Note that this is not an error (e.g., a module loading error) - that would abort the
                // process and this callback would not run. For this callback to run, all loaders must
                // have confirmed they don't know about this component.
                callback(null, null);
            }
        });
    }

    function getFirstResultFromLoaders(methodName, argsExceptCallback, callback, candidateLoaders) {
        // On the first call in the stack, start with the full set of loaders
        if (!candidateLoaders) {
            candidateLoaders = ko.components['loaders'].slice(0); // Use a copy, because we'll be mutating this array
        }

        // Try the next candidate
        var currentCandidateLoader = candidateLoaders.shift();
        if (currentCandidateLoader) {
            var methodInstance = currentCandidateLoader[methodName];
            if (methodInstance) {
                var wasAborted = false,
                    synchronousReturnValue = methodInstance.apply(currentCandidateLoader, argsExceptCallback.concat(function(result) {
                        if (wasAborted) {
                            callback(null);
                        } else if (result !== null) {
                            // This candidate returned a value. Use it.
                            callback(result);
                        } else {
                            // Try the next candidate
                            getFirstResultFromLoaders(methodName, argsExceptCallback, callback, candidateLoaders);
                        }
                    }));

                // Currently, loaders may not return anything synchronously. This leaves open the possibility
                // that we'll extend the API to support synchronous return values in the future. It won't be
                // a breaking change, because currently no loader is allowed to return anything except undefined.
                if (synchronousReturnValue !== undefined) {
                    wasAborted = true;

                    // Method to suppress exceptions will remain undocumented. This is only to keep
                    // KO's specs running tidily, since we can observe the loading got aborted without
                    // having exceptions cluttering up the console too.
                    if (!currentCandidateLoader['suppressLoaderExceptions']) {
                        throw new Error('Component loaders must supply values by invoking the callback, not by returning values synchronously.');
                    }
                }
            } else {
                // This candidate doesn't have the relevant handler. Synchronously move on to the next one.
                getFirstResultFromLoaders(methodName, argsExceptCallback, callback, candidateLoaders);
            }
        } else {
            // No candidates returned a value
            callback(null);
        }
    }

    // Reference the loaders via string name so it's possible for developers
    // to replace the whole array by assigning to ko.components.loaders
    ko.components['loaders'] = [];

    ko.exportSymbol('components', ko.components);
    ko.exportSymbol('components.get', ko.components.get);
    ko.exportSymbol('components.clearCachedDefinition', ko.components.clearCachedDefinition);
})();
(function(undefined) {

    // The default loader is responsible for two things:
    // 1. Maintaining the default in-memory registry of component configuration objects
    //    (i.e., the thing you're writing to when you call ko.components.register(someName, ...))
    // 2. Answering requests for components by fetching configuration objects
    //    from that default in-memory registry and resolving them into standard
    //    component definition objects (of the form { createViewModel: ..., template: ... })
    // Custom loaders may override either of these facilities, i.e.,
    // 1. To supply configuration objects from some other source (e.g., conventions)
    // 2. Or, to resolve configuration objects by loading viewmodels/templates via arbitrary logic.

    var defaultConfigRegistry = {};

    ko.components.register = function(componentName, config) {
        if (!config) {
            throw new Error('Invalid configuration for ' + componentName);
        }

        if (ko.components.isRegistered(componentName)) {
            throw new Error('Component ' + componentName + ' is already registered');
        }

        defaultConfigRegistry[componentName] = config;
    };

    ko.components.isRegistered = function(componentName) {
        return defaultConfigRegistry.hasOwnProperty(componentName);
    };

    ko.components.unregister = function(componentName) {
        delete defaultConfigRegistry[componentName];
        ko.components.clearCachedDefinition(componentName);
    };

    ko.components.defaultLoader = {
        'getConfig': function(componentName, callback) {
            var result = defaultConfigRegistry.hasOwnProperty(componentName)
                ? defaultConfigRegistry[componentName]
                : null;
            callback(result);
        },

        'loadComponent': function(componentName, config, callback) {
            var errorCallback = makeErrorCallback(componentName);
            possiblyGetConfigFromAmd(errorCallback, config, function(loadedConfig) {
                resolveConfig(componentName, errorCallback, loadedConfig, callback);
            });
        },

        'loadTemplate': function(componentName, templateConfig, callback) {
            resolveTemplate(makeErrorCallback(componentName), templateConfig, callback);
        },

        'loadViewModel': function(componentName, viewModelConfig, callback) {
            resolveViewModel(makeErrorCallback(componentName), viewModelConfig, callback);
        }
    };

    var createViewModelKey = 'createViewModel';

    // Takes a config object of the form { template: ..., viewModel: ... }, and asynchronously convert it
    // into the standard component definition format:
    //    { template: <ArrayOfDomNodes>, createViewModel: function(params, componentInfo) { ... } }.
    // Since both template and viewModel may need to be resolved asynchronously, both tasks are performed
    // in parallel, and the results joined when both are ready. We don't depend on any promises infrastructure,
    // so this is implemented manually below.
    function resolveConfig(componentName, errorCallback, config, callback) {
        var result = {},
            makeCallBackWhenZero = 2,
            tryIssueCallback = function() {
                if (--makeCallBackWhenZero === 0) {
                    callback(result);
                }
            },
            templateConfig = config['template'],
            viewModelConfig = config['viewModel'];

        if (templateConfig) {
            possiblyGetConfigFromAmd(errorCallback, templateConfig, function(loadedConfig) {
                ko.components._getFirstResultFromLoaders('loadTemplate', [componentName, loadedConfig], function(resolvedTemplate) {
                    result['template'] = resolvedTemplate;
                    tryIssueCallback();
                });
            });
        } else {
            tryIssueCallback();
        }

        if (viewModelConfig) {
            possiblyGetConfigFromAmd(errorCallback, viewModelConfig, function(loadedConfig) {
                ko.components._getFirstResultFromLoaders('loadViewModel', [componentName, loadedConfig], function(resolvedViewModel) {
                    result[createViewModelKey] = resolvedViewModel;
                    tryIssueCallback();
                });
            });
        } else {
            tryIssueCallback();
        }
    }

    function resolveTemplate(errorCallback, templateConfig, callback) {
        if (typeof templateConfig === 'string') {
            // Markup - parse it
            callback(ko.utils.parseHtmlFragment(templateConfig));
        } else if (templateConfig instanceof Array) {
            // Assume already an array of DOM nodes - pass through unchanged
            callback(templateConfig);
        } else if (isDocumentFragment(templateConfig)) {
            // Document fragment - use its child nodes
            callback(ko.utils.makeArray(templateConfig.childNodes));
        } else if (templateConfig['element']) {
            var element = templateConfig['element'];
            if (isDomElement(element)) {
                // Element instance - copy its child nodes
                callback(cloneNodesFromTemplateSourceElement(element));
            } else if (typeof element === 'string') {
                // Element ID - find it, then copy its child nodes
                var elemInstance = document.getElementById(element);
                if (elemInstance) {
                    callback(cloneNodesFromTemplateSourceElement(elemInstance));
                } else {
                    errorCallback('Cannot find element with ID ' + element);
                }
            } else {
                errorCallback('Unknown element type: ' + element);
            }
        } else {
            errorCallback('Unknown template value: ' + templateConfig);
        }
    }

    function resolveViewModel(errorCallback, viewModelConfig, callback) {
        if (typeof viewModelConfig === 'function') {
            // Constructor - convert to standard factory function format
            // By design, this does *not* supply componentInfo to the constructor, as the intent is that
            // componentInfo contains non-viewmodel data (e.g., the component's element) that should only
            // be used in factory functions, not viewmodel constructors.
            callback(function (params /*, componentInfo */) {
                return new viewModelConfig(params);
            });
        } else if (typeof viewModelConfig[createViewModelKey] === 'function') {
            // Already a factory function - use it as-is
            callback(viewModelConfig[createViewModelKey]);
        } else if ('instance' in viewModelConfig) {
            // Fixed object instance - promote to createViewModel format for API consistency
            var fixedInstance = viewModelConfig['instance'];
            callback(function (params, componentInfo) {
                return fixedInstance;
            });
        } else if ('viewModel' in viewModelConfig) {
            // Resolved AMD module whose value is of the form { viewModel: ... }
            resolveViewModel(errorCallback, viewModelConfig['viewModel'], callback);
        } else {
            errorCallback('Unknown viewModel value: ' + viewModelConfig);
        }
    }

    function cloneNodesFromTemplateSourceElement(elemInstance) {
        switch (ko.utils.tagNameLower(elemInstance)) {
            case 'script':
                return ko.utils.parseHtmlFragment(elemInstance.text);
            case 'textarea':
                return ko.utils.parseHtmlFragment(elemInstance.value);
            case 'template':
                // For browsers with proper <template> element support (i.e., where the .content property
                // gives a document fragment), use that document fragment.
                if (isDocumentFragment(elemInstance.content)) {
                    return ko.utils.cloneNodes(elemInstance.content.childNodes);
                }
        }

        // Regular elements such as <div>, and <template> elements on old browsers that don't really
        // understand <template> and just treat it as a regular container
        return ko.utils.cloneNodes(elemInstance.childNodes);
    }

    function isDomElement(obj) {
        if (window['HTMLElement']) {
            return obj instanceof HTMLElement;
        } else {
            return obj && obj.tagName && obj.nodeType === 1;
        }
    }

    function isDocumentFragment(obj) {
        if (window['DocumentFragment']) {
            return obj instanceof DocumentFragment;
        } else {
            return obj && obj.nodeType === 11;
        }
    }

    function possiblyGetConfigFromAmd(errorCallback, config, callback) {
        if (typeof config['require'] === 'string') {
            // The config is the value of an AMD module
            if (amdRequire || window['require']) {
                (amdRequire || window['require'])([config['require']], callback);
            } else {
                errorCallback('Uses require, but no AMD loader is present');
            }
        } else {
            callback(config);
        }
    }

    function makeErrorCallback(componentName) {
        return function (message) {
            throw new Error('Component \'' + componentName + '\': ' + message);
        };
    }

    ko.exportSymbol('components.register', ko.components.register);
    ko.exportSymbol('components.isRegistered', ko.components.isRegistered);
    ko.exportSymbol('components.unregister', ko.components.unregister);

    // Expose the default loader so that developers can directly ask it for configuration
    // or to resolve configuration
    ko.exportSymbol('components.defaultLoader', ko.components.defaultLoader);

    // By default, the default loader is the only registered component loader
    ko.components['loaders'].push(ko.components.defaultLoader);

    // Privately expose the underlying config registry for use in old-IE shim
    ko.components._allRegisteredComponents = defaultConfigRegistry;
})();
(function (undefined) {
    // Overridable API for determining which component name applies to a given node. By overriding this,
    // you can for example map specific tagNames to components that are not preregistered.
    ko.components['getComponentNameForNode'] = function(node) {
        var tagNameLower = ko.utils.tagNameLower(node);
        if (ko.components.isRegistered(tagNameLower)) {
            // Try to determine that this node can be considered a *custom* element; see https://github.com/knockout/knockout/issues/1603
            if (tagNameLower.indexOf('-') != -1 || ('' + node) == "[object HTMLUnknownElement]" || (ko.utils.ieVersion <= 8 && node.tagName === tagNameLower)) {
                return tagNameLower;
            }
        }
    };

    ko.components.addBindingsForCustomElement = function(allBindings, node, bindingContext, valueAccessors) {
        // Determine if it's really a custom element matching a component
        if (node.nodeType === 1) {
            var componentName = ko.components['getComponentNameForNode'](node);
            if (componentName) {
                // It does represent a component, so add a component binding for it
                allBindings = allBindings || {};

                if (allBindings['component']) {
                    // Avoid silently overwriting some other 'component' binding that may already be on the element
                    throw new Error('Cannot use the "component" binding on a custom element matching a component');
                }

                var componentBindingValue = { 'name': componentName, 'params': getComponentParamsFromCustomElement(node, bindingContext) };

                allBindings['component'] = valueAccessors
                    ? function() { return componentBindingValue; }
                    : componentBindingValue;
            }
        }

        return allBindings;
    }

    var nativeBindingProviderInstance = new ko.bindingProvider();

    function getComponentParamsFromCustomElement(elem, bindingContext) {
        var paramsAttribute = elem.getAttribute('params');

        if (paramsAttribute) {
            var params = nativeBindingProviderInstance['parseBindingsString'](paramsAttribute, bindingContext, elem, { 'valueAccessors': true, 'bindingParams': true }),
                rawParamComputedValues = ko.utils.objectMap(params, function(paramValue, paramName) {
                    return ko.computed(paramValue, null, { disposeWhenNodeIsRemoved: elem });
                }),
                result = ko.utils.objectMap(rawParamComputedValues, function(paramValueComputed, paramName) {
                    var paramValue = paramValueComputed.peek();
                    // Does the evaluation of the parameter value unwrap any observables?
                    if (!paramValueComputed.isActive()) {
                        // No it doesn't, so there's no need for any computed wrapper. Just pass through the supplied value directly.
                        // Example: "someVal: firstName, age: 123" (whether or not firstName is an observable/computed)
                        return paramValue;
                    } else {
                        // Yes it does. Supply a computed property that unwraps both the outer (binding expression)
                        // level of observability, and any inner (resulting model value) level of observability.
                        // This means the component doesn't have to worry about multiple unwrapping. If the value is a
                        // writable observable, the computed will also be writable and pass the value on to the observable.
                        return ko.computed({
                            'read': function() {
                                return ko.utils.unwrapObservable(paramValueComputed());
                            },
                            'write': ko.isWriteableObservable(paramValue) && function(value) {
                                paramValueComputed()(value);
                            },
                            disposeWhenNodeIsRemoved: elem
                        });
                    }
                });

            // Give access to the raw computeds, as long as that wouldn't overwrite any custom param also called '$raw'
            // This is in case the developer wants to react to outer (binding) observability separately from inner
            // (model value) observability, or in case the model value observable has subobservables.
            if (!result.hasOwnProperty('$raw')) {
                result['$raw'] = rawParamComputedValues;
            }

            return result;
        } else {
            // For consistency, absence of a "params" attribute is treated the same as the presence of
            // any empty one. Otherwise component viewmodels need special code to check whether or not
            // 'params' or 'params.$raw' is null/undefined before reading subproperties, which is annoying.
            return { '$raw': {} };
        }
    }

    // --------------------------------------------------------------------------------
    // Compatibility code for older (pre-HTML5) IE browsers

    if (ko.utils.ieVersion < 9) {
        // Whenever you preregister a component, enable it as a custom element in the current document
        ko.components['register'] = (function(originalFunction) {
            return function(componentName) {
                document.createElement(componentName); // Allows IE<9 to parse markup containing the custom element
                return originalFunction.apply(this, arguments);
            }
        })(ko.components['register']);

        // Whenever you create a document fragment, enable all preregistered component names as custom elements
        // This is needed to make innerShiv/jQuery HTML parsing correctly handle the custom elements
        document.createDocumentFragment = (function(originalFunction) {
            return function() {
                var newDocFrag = originalFunction(),
                    allComponents = ko.components._allRegisteredComponents;
                for (var componentName in allComponents) {
                    if (allComponents.hasOwnProperty(componentName)) {
                        newDocFrag.createElement(componentName);
                    }
                }
                return newDocFrag;
            };
        })(document.createDocumentFragment);
    }
})();(function(undefined) {

    var componentLoadingOperationUniqueId = 0;

    ko.bindingHandlers['component'] = {
        'init': function(element, valueAccessor, ignored1, ignored2, bindingContext) {
            var currentViewModel,
                currentLoadingOperationId,
                disposeAssociatedComponentViewModel = function () {
                    var currentViewModelDispose = currentViewModel && currentViewModel['dispose'];
                    if (typeof currentViewModelDispose === 'function') {
                        currentViewModelDispose.call(currentViewModel);
                    }
                    currentViewModel = null;
                    // Any in-flight loading operation is no longer relevant, so make sure we ignore its completion
                    currentLoadingOperationId = null;
                },
                originalChildNodes = ko.utils.makeArray(ko.virtualElements.childNodes(element));

            ko.utils.domNodeDisposal.addDisposeCallback(element, disposeAssociatedComponentViewModel);

            ko.computed(function () {
                var value = ko.utils.unwrapObservable(valueAccessor()),
                    componentName, componentParams;

                if (typeof value === 'string') {
                    componentName = value;
                } else {
                    componentName = ko.utils.unwrapObservable(value['name']);
                    componentParams = ko.utils.unwrapObservable(value['params']);
                }

                if (!componentName) {
                    throw new Error('No component name specified');
                }

                var loadingOperationId = currentLoadingOperationId = ++componentLoadingOperationUniqueId;
                ko.components.get(componentName, function(componentDefinition) {
                    // If this is not the current load operation for this element, ignore it.
                    if (currentLoadingOperationId !== loadingOperationId) {
                        return;
                    }

                    // Clean up previous state
                    disposeAssociatedComponentViewModel();

                    // Instantiate and bind new component. Implicitly this cleans any old DOM nodes.
                    if (!componentDefinition) {
                        throw new Error('Unknown component \'' + componentName + '\'');
                    }
                    cloneTemplateIntoElement(componentName, componentDefinition, element);
                    var componentViewModel = createViewModel(componentDefinition, element, originalChildNodes, componentParams),
                        childBindingContext = bindingContext['createChildContext'](componentViewModel, /* dataItemAlias */ undefined, function(ctx) {
                            ctx['$component'] = componentViewModel;
                            ctx['$componentTemplateNodes'] = originalChildNodes;
                        });
                    currentViewModel = componentViewModel;
                    ko.applyBindingsToDescendants(childBindingContext, element);
                });
            }, null, { disposeWhenNodeIsRemoved: element });

            return { 'controlsDescendantBindings': true };
        }
    };

    ko.virtualElements.allowedBindings['component'] = true;

    function cloneTemplateIntoElement(componentName, componentDefinition, element) {
        var template = componentDefinition['template'];
        if (!template) {
            throw new Error('Component \'' + componentName + '\' has no template');
        }

        var clonedNodesArray = ko.utils.cloneNodes(template);
        ko.virtualElements.setDomNodeChildren(element, clonedNodesArray);
    }

    function createViewModel(componentDefinition, element, originalChildNodes, componentParams) {
        var componentViewModelFactory = componentDefinition['createViewModel'];
        return componentViewModelFactory
            ? componentViewModelFactory.call(componentDefinition, componentParams, { 'element': element, 'templateNodes': originalChildNodes })
            : componentParams; // Template-only component
    }

})();
var attrHtmlToJavascriptMap = { 'class': 'className', 'for': 'htmlFor' };
ko.bindingHandlers['attr'] = {
    'update': function(element, valueAccessor, allBindings) {
        var value = ko.utils.unwrapObservable(valueAccessor()) || {};
        ko.utils.objectForEach(value, function(attrName, attrValue) {
            attrValue = ko.utils.unwrapObservable(attrValue);

            // To cover cases like "attr: { checked:someProp }", we want to remove the attribute entirely
            // when someProp is a "no value"-like value (strictly null, false, or undefined)
            // (because the absence of the "checked" attr is how to mark an element as not checked, etc.)
            var toRemove = (attrValue === false) || (attrValue === null) || (attrValue === undefined);
            if (toRemove)
                element.removeAttribute(attrName);

            // In IE <= 7 and IE8 Quirks Mode, you have to use the Javascript property name instead of the
            // HTML attribute name for certain attributes. IE8 Standards Mode supports the correct behavior,
            // but instead of figuring out the mode, we'll just set the attribute through the Javascript
            // property for IE <= 8.
            if (ko.utils.ieVersion <= 8 && attrName in attrHtmlToJavascriptMap) {
                attrName = attrHtmlToJavascriptMap[attrName];
                if (toRemove)
                    element.removeAttribute(attrName);
                else
                    element[attrName] = attrValue;
            } else if (!toRemove) {
                element.setAttribute(attrName, attrValue.toString());
            }

            // Treat "name" specially - although you can think of it as an attribute, it also needs
            // special handling on older versions of IE (https://github.com/SteveSanderson/knockout/pull/333)
            // Deliberately being case-sensitive here because XHTML would regard "Name" as a different thing
            // entirely, and there's no strong reason to allow for such casing in HTML.
            if (attrName === "name") {
                ko.utils.setElementName(element, toRemove ? "" : attrValue.toString());
            }
        });
    }
};
(function() {

ko.bindingHandlers['checked'] = {
    'after': ['value', 'attr'],
    'init': function (element, valueAccessor, allBindings) {
        var checkedValue = ko.pureComputed(function() {
            // Treat "value" like "checkedValue" when it is included with "checked" binding
            if (allBindings['has']('checkedValue')) {
                return ko.utils.unwrapObservable(allBindings.get('checkedValue'));
            } else if (allBindings['has']('value')) {
                return ko.utils.unwrapObservable(allBindings.get('value'));
            }

            return element.value;
        });

        function updateModel() {
            // This updates the model value from the view value.
            // It runs in response to DOM events (click) and changes in checkedValue.
            var isChecked = element.checked,
                elemValue = useCheckedValue ? checkedValue() : isChecked;

            // When we're first setting up this computed, don't change any model state.
            if (ko.computedContext.isInitial()) {
                return;
            }

            // We can ignore unchecked radio buttons, because some other radio
            // button will be getting checked, and that one can take care of updating state.
            if (isRadio && !isChecked) {
                return;
            }

            var modelValue = ko.dependencyDetection.ignore(valueAccessor);
            if (valueIsArray) {
                var writableValue = rawValueIsNonArrayObservable ? modelValue.peek() : modelValue;
                if (oldElemValue !== elemValue) {
                    // When we're responding to the checkedValue changing, and the element is
                    // currently checked, replace the old elem value with the new elem value
                    // in the model array.
                    if (isChecked) {
                        ko.utils.addOrRemoveItem(writableValue, elemValue, true);
                        ko.utils.addOrRemoveItem(writableValue, oldElemValue, false);
                    }

                    oldElemValue = elemValue;
                } else {
                    // When we're responding to the user having checked/unchecked a checkbox,
                    // add/remove the element value to the model array.
                    ko.utils.addOrRemoveItem(writableValue, elemValue, isChecked);
                }
                if (rawValueIsNonArrayObservable && ko.isWriteableObservable(modelValue)) {
                    modelValue(writableValue);
                }
            } else {
                ko.expressionRewriting.writeValueToProperty(modelValue, allBindings, 'checked', elemValue, true);
            }
        };

        function updateView() {
            // This updates the view value from the model value.
            // It runs in response to changes in the bound (checked) value.
            var modelValue = ko.utils.unwrapObservable(valueAccessor());

            if (valueIsArray) {
                // When a checkbox is bound to an array, being checked represents its value being present in that array
                element.checked = ko.utils.arrayIndexOf(modelValue, checkedValue()) >= 0;
            } else if (isCheckbox) {
                // When a checkbox is bound to any other value (not an array), being checked represents the value being trueish
                element.checked = modelValue;
            } else {
                // For radio buttons, being checked means that the radio button's value corresponds to the model value
                element.checked = (checkedValue() === modelValue);
            }
        };

        var isCheckbox = element.type == "checkbox",
            isRadio = element.type == "radio";

        // Only bind to check boxes and radio buttons
        if (!isCheckbox && !isRadio) {
            return;
        }

        var rawValue = valueAccessor(),
            valueIsArray = isCheckbox && (ko.utils.unwrapObservable(rawValue) instanceof Array),
            rawValueIsNonArrayObservable = !(valueIsArray && rawValue.push && rawValue.splice),
            oldElemValue = valueIsArray ? checkedValue() : undefined,
            useCheckedValue = isRadio || valueIsArray;

        // IE 6 won't allow radio buttons to be selected unless they have a name
        if (isRadio && !element.name)
            ko.bindingHandlers['uniqueName']['init'](element, function() { return true });

        // Set up two computeds to update the binding:

        // The first responds to changes in the checkedValue value and to element clicks
        ko.computed(updateModel, null, { disposeWhenNodeIsRemoved: element });
        ko.utils.registerEventHandler(element, "click", updateModel);

        // The second responds to changes in the model value (the one associated with the checked binding)
        ko.computed(updateView, null, { disposeWhenNodeIsRemoved: element });

        rawValue = undefined;
    }
};
ko.expressionRewriting.twoWayBindings['checked'] = true;

ko.bindingHandlers['checkedValue'] = {
    'update': function (element, valueAccessor) {
        element.value = ko.utils.unwrapObservable(valueAccessor());
    }
};

})();var classesWrittenByBindingKey = '__ko__cssValue';
ko.bindingHandlers['css'] = {
    'update': function (element, valueAccessor) {
        var value = ko.utils.unwrapObservable(valueAccessor());
        if (value !== null && typeof value == "object") {
            ko.utils.objectForEach(value, function(className, shouldHaveClass) {
                shouldHaveClass = ko.utils.unwrapObservable(shouldHaveClass);
                ko.utils.toggleDomNodeCssClass(element, className, shouldHaveClass);
            });
        } else {
            value = ko.utils.stringTrim(String(value || '')); // Make sure we don't try to store or set a non-string value
            ko.utils.toggleDomNodeCssClass(element, element[classesWrittenByBindingKey], false);
            element[classesWrittenByBindingKey] = value;
            ko.utils.toggleDomNodeCssClass(element, value, true);
        }
    }
};
ko.bindingHandlers['enable'] = {
    'update': function (element, valueAccessor) {
        var value = ko.utils.unwrapObservable(valueAccessor());
        if (value && element.disabled)
            element.removeAttribute("disabled");
        else if ((!value) && (!element.disabled))
            element.disabled = true;
    }
};

ko.bindingHandlers['disable'] = {
    'update': function (element, valueAccessor) {
        ko.bindingHandlers['enable']['update'](element, function() { return !ko.utils.unwrapObservable(valueAccessor()) });
    }
};
// For certain common events (currently just 'click'), allow a simplified data-binding syntax
// e.g. click:handler instead of the usual full-length event:{click:handler}
function makeEventHandlerShortcut(eventName) {
    ko.bindingHandlers[eventName] = {
        'init': function(element, valueAccessor, allBindings, viewModel, bindingContext) {
            var newValueAccessor = function () {
                var result = {};
                result[eventName] = valueAccessor();
                return result;
            };
            return ko.bindingHandlers['event']['init'].call(this, element, newValueAccessor, allBindings, viewModel, bindingContext);
        }
    }
}

ko.bindingHandlers['event'] = {
    'init' : function (element, valueAccessor, allBindings, viewModel, bindingContext) {
        var eventsToHandle = valueAccessor() || {};
        ko.utils.objectForEach(eventsToHandle, function(eventName) {
            if (typeof eventName == "string") {
                ko.utils.registerEventHandler(element, eventName, function (event) {
                    var handlerReturnValue;
                    var handlerFunction = valueAccessor()[eventName];
                    if (!handlerFunction)
                        return;

                    try {
                        // Take all the event args, and prefix with the viewmodel
                        var argsForHandler = ko.utils.makeArray(arguments);
                        viewModel = bindingContext['$data'];
                        argsForHandler.unshift(viewModel);
                        handlerReturnValue = handlerFunction.apply(viewModel, argsForHandler);
                    } finally {
                        if (handlerReturnValue !== true) { // Normally we want to prevent default action. Developer can override this be explicitly returning true.
                            if (event.preventDefault)
                                event.preventDefault();
                            else
                                event.returnValue = false;
                        }
                    }

                    var bubble = allBindings.get(eventName + 'Bubble') !== false;
                    if (!bubble) {
                        event.cancelBubble = true;
                        if (event.stopPropagation)
                            event.stopPropagation();
                    }
                });
            }
        });
    }
};
// "foreach: someExpression" is equivalent to "template: { foreach: someExpression }"
// "foreach: { data: someExpression, afterAdd: myfn }" is equivalent to "template: { foreach: someExpression, afterAdd: myfn }"
ko.bindingHandlers['foreach'] = {
    makeTemplateValueAccessor: function(valueAccessor) {
        return function() {
            var modelValue = valueAccessor(),
                unwrappedValue = ko.utils.peekObservable(modelValue);    // Unwrap without setting a dependency here

            // If unwrappedValue is the array, pass in the wrapped value on its own
            // The value will be unwrapped and tracked within the template binding
            // (See https://github.com/SteveSanderson/knockout/issues/523)
            if ((!unwrappedValue) || typeof unwrappedValue.length == "number")
                return { 'foreach': modelValue, 'templateEngine': ko.nativeTemplateEngine.instance };

            // If unwrappedValue.data is the array, preserve all relevant options and unwrap again value so we get updates
            ko.utils.unwrapObservable(modelValue);
            return {
                'foreach': unwrappedValue['data'],
                'as': unwrappedValue['as'],
                'includeDestroyed': unwrappedValue['includeDestroyed'],
                'afterAdd': unwrappedValue['afterAdd'],
                'beforeRemove': unwrappedValue['beforeRemove'],
                'afterRender': unwrappedValue['afterRender'],
                'beforeMove': unwrappedValue['beforeMove'],
                'afterMove': unwrappedValue['afterMove'],
                'templateEngine': ko.nativeTemplateEngine.instance
            };
        };
    },
    'init': function(element, valueAccessor, allBindings, viewModel, bindingContext) {
        return ko.bindingHandlers['template']['init'](element, ko.bindingHandlers['foreach'].makeTemplateValueAccessor(valueAccessor));
    },
    'update': function(element, valueAccessor, allBindings, viewModel, bindingContext) {
        return ko.bindingHandlers['template']['update'](element, ko.bindingHandlers['foreach'].makeTemplateValueAccessor(valueAccessor), allBindings, viewModel, bindingContext);
    }
};
ko.expressionRewriting.bindingRewriteValidators['foreach'] = false; // Can't rewrite control flow bindings
ko.virtualElements.allowedBindings['foreach'] = true;
var hasfocusUpdatingProperty = '__ko_hasfocusUpdating';
var hasfocusLastValue = '__ko_hasfocusLastValue';
ko.bindingHandlers['hasfocus'] = {
    'init': function(element, valueAccessor, allBindings) {
        var handleElementFocusChange = function(isFocused) {
            // Where possible, ignore which event was raised and determine focus state using activeElement,
            // as this avoids phantom focus/blur events raised when changing tabs in modern browsers.
            // However, not all KO-targeted browsers (Firefox 2) support activeElement. For those browsers,
            // prevent a loss of focus when changing tabs/windows by setting a flag that prevents hasfocus
            // from calling 'blur()' on the element when it loses focus.
            // Discussion at https://github.com/SteveSanderson/knockout/pull/352
            element[hasfocusUpdatingProperty] = true;
            var ownerDoc = element.ownerDocument;
            if ("activeElement" in ownerDoc) {
                var active;
                try {
                    active = ownerDoc.activeElement;
                } catch(e) {
                    // IE9 throws if you access activeElement during page load (see issue #703)
                    active = ownerDoc.body;
                }
                isFocused = (active === element);
            }
            var modelValue = valueAccessor();
            ko.expressionRewriting.writeValueToProperty(modelValue, allBindings, 'hasfocus', isFocused, true);

            //cache the latest value, so we can avoid unnecessarily calling focus/blur in the update function
            element[hasfocusLastValue] = isFocused;
            element[hasfocusUpdatingProperty] = false;
        };
        var handleElementFocusIn = handleElementFocusChange.bind(null, true);
        var handleElementFocusOut = handleElementFocusChange.bind(null, false);

        ko.utils.registerEventHandler(element, "focus", handleElementFocusIn);
        ko.utils.registerEventHandler(element, "focusin", handleElementFocusIn); // For IE
        ko.utils.registerEventHandler(element, "blur",  handleElementFocusOut);
        ko.utils.registerEventHandler(element, "focusout",  handleElementFocusOut); // For IE
    },
    'update': function(element, valueAccessor) {
        var value = !!ko.utils.unwrapObservable(valueAccessor());

        if (!element[hasfocusUpdatingProperty] && element[hasfocusLastValue] !== value) {
            value ? element.focus() : element.blur();

            // In IE, the blur method doesn't always cause the element to lose focus (for example, if the window is not in focus).
            // Setting focus to the body element does seem to be reliable in IE, but should only be used if we know that the current
            // element was focused already.
            if (!value && element[hasfocusLastValue]) {
                element.ownerDocument.body.focus();
            }

            // For IE, which doesn't reliably fire "focus" or "blur" events synchronously
            ko.dependencyDetection.ignore(ko.utils.triggerEvent, null, [element, value ? "focusin" : "focusout"]);
        }
    }
};
ko.expressionRewriting.twoWayBindings['hasfocus'] = true;

ko.bindingHandlers['hasFocus'] = ko.bindingHandlers['hasfocus']; // Make "hasFocus" an alias
ko.expressionRewriting.twoWayBindings['hasFocus'] = true;
ko.bindingHandlers['html'] = {
    'init': function() {
        // Prevent binding on the dynamically-injected HTML (as developers are unlikely to expect that, and it has security implications)
        return { 'controlsDescendantBindings': true };
    },
    'update': function (element, valueAccessor) {
        // setHtml will unwrap the value if needed
        ko.utils.setHtml(element, valueAccessor());
    }
};
// Makes a binding like with or if
function makeWithIfBinding(bindingKey, isWith, isNot, makeContextCallback) {
    ko.bindingHandlers[bindingKey] = {
        'init': function(element, valueAccessor, allBindings, viewModel, bindingContext) {
            var didDisplayOnLastUpdate,
                savedNodes;
            ko.computed(function() {
                var rawValue = valueAccessor(),
                    dataValue = ko.utils.unwrapObservable(rawValue),
                    shouldDisplay = !isNot !== !dataValue, // equivalent to isNot ? !dataValue : !!dataValue
                    isFirstRender = !savedNodes,
                    needsRefresh = isFirstRender || isWith || (shouldDisplay !== didDisplayOnLastUpdate);

                if (needsRefresh) {
                    // Save a copy of the inner nodes on the initial update, but only if we have dependencies.
                    if (isFirstRender && ko.computedContext.getDependenciesCount()) {
                        savedNodes = ko.utils.cloneNodes(ko.virtualElements.childNodes(element), true /* shouldCleanNodes */);
                    }

                    if (shouldDisplay) {
                        if (!isFirstRender) {
                            ko.virtualElements.setDomNodeChildren(element, ko.utils.cloneNodes(savedNodes));
                        }
                        ko.applyBindingsToDescendants(makeContextCallback ? makeContextCallback(bindingContext, rawValue) : bindingContext, element);
                    } else {
                        ko.virtualElements.emptyNode(element);
                    }

                    didDisplayOnLastUpdate = shouldDisplay;
                }
            }, null, { disposeWhenNodeIsRemoved: element });
            return { 'controlsDescendantBindings': true };
        }
    };
    ko.expressionRewriting.bindingRewriteValidators[bindingKey] = false; // Can't rewrite control flow bindings
    ko.virtualElements.allowedBindings[bindingKey] = true;
}

// Construct the actual binding handlers
makeWithIfBinding('if');
makeWithIfBinding('ifnot', false /* isWith */, true /* isNot */);
makeWithIfBinding('with', true /* isWith */, false /* isNot */,
    function(bindingContext, dataValue) {
        return bindingContext.createStaticChildContext(dataValue);
    }
);
var captionPlaceholder = {};
ko.bindingHandlers['options'] = {
    'init': function(element) {
        if (ko.utils.tagNameLower(element) !== "select")
            throw new Error("options binding applies only to SELECT elements");

        // Remove all existing <option>s.
        while (element.length > 0) {
            element.remove(0);
        }

        // Ensures that the binding processor doesn't try to bind the options
        return { 'controlsDescendantBindings': true };
    },
    'update': function (element, valueAccessor, allBindings) {
        function selectedOptions() {
            return ko.utils.arrayFilter(element.options, function (node) { return node.selected; });
        }

        var selectWasPreviouslyEmpty = element.length == 0,
            multiple = element.multiple,
            previousScrollTop = (!selectWasPreviouslyEmpty && multiple) ? element.scrollTop : null,
            unwrappedArray = ko.utils.unwrapObservable(valueAccessor()),
            valueAllowUnset = allBindings.get('valueAllowUnset') && allBindings['has']('value'),
            includeDestroyed = allBindings.get('optionsIncludeDestroyed'),
            arrayToDomNodeChildrenOptions = {},
            captionValue,
            filteredArray,
            previousSelectedValues = [];

        if (!valueAllowUnset) {
            if (multiple) {
                previousSelectedValues = ko.utils.arrayMap(selectedOptions(), ko.selectExtensions.readValue);
            } else if (element.selectedIndex >= 0) {
                previousSelectedValues.push(ko.selectExtensions.readValue(element.options[element.selectedIndex]));
            }
        }

        if (unwrappedArray) {
            if (typeof unwrappedArray.length == "undefined") // Coerce single value into array
                unwrappedArray = [unwrappedArray];

            // Filter out any entries marked as destroyed
            filteredArray = ko.utils.arrayFilter(unwrappedArray, function(item) {
                return includeDestroyed || item === undefined || item === null || !ko.utils.unwrapObservable(item['_destroy']);
            });

            // If caption is included, add it to the array
            if (allBindings['has']('optionsCaption')) {
                captionValue = ko.utils.unwrapObservable(allBindings.get('optionsCaption'));
                // If caption value is null or undefined, don't show a caption
                if (captionValue !== null && captionValue !== undefined) {
                    filteredArray.unshift(captionPlaceholder);
                }
            }
        } else {
            // If a falsy value is provided (e.g. null), we'll simply empty the select element
        }

        function applyToObject(object, predicate, defaultValue) {
            var predicateType = typeof predicate;
            if (predicateType == "function")    // Given a function; run it against the data value
                return predicate(object);
            else if (predicateType == "string") // Given a string; treat it as a property name on the data value
                return object[predicate];
            else                                // Given no optionsText arg; use the data value itself
                return defaultValue;
        }

        // The following functions can run at two different times:
        // The first is when the whole array is being updated directly from this binding handler.
        // The second is when an observable value for a specific array entry is updated.
        // oldOptions will be empty in the first case, but will be filled with the previously generated option in the second.
        var itemUpdate = false;
        function optionForArrayItem(arrayEntry, index, oldOptions) {
            if (oldOptions.length) {
                previousSelectedValues = !valueAllowUnset && oldOptions[0].selected ? [ ko.selectExtensions.readValue(oldOptions[0]) ] : [];
                itemUpdate = true;
            }
            var option = element.ownerDocument.createElement("option");
            if (arrayEntry === captionPlaceholder) {
                ko.utils.setTextContent(option, allBindings.get('optionsCaption'));
                ko.selectExtensions.writeValue(option, undefined);
            } else {
                // Apply a value to the option element
                var optionValue = applyToObject(arrayEntry, allBindings.get('optionsValue'), arrayEntry);
                ko.selectExtensions.writeValue(option, ko.utils.unwrapObservable(optionValue));

                // Apply some text to the option element
                var optionText = applyToObject(arrayEntry, allBindings.get('optionsText'), optionValue);
                ko.utils.setTextContent(option, optionText);
            }
            return [option];
        }

        // By using a beforeRemove callback, we delay the removal until after new items are added. This fixes a selection
        // problem in IE<=8 and Firefox. See https://github.com/knockout/knockout/issues/1208
        arrayToDomNodeChildrenOptions['beforeRemove'] =
            function (option) {
                element.removeChild(option);
            };

        function setSelectionCallback(arrayEntry, newOptions) {
            if (itemUpdate && valueAllowUnset) {
                // The model value is authoritative, so make sure its value is the one selected
                // There is no need to use dependencyDetection.ignore since setDomNodeChildrenFromArrayMapping does so already.
                ko.selectExtensions.writeValue(element, ko.utils.unwrapObservable(allBindings.get('value')), true /* allowUnset */);
            } else if (previousSelectedValues.length) {
                // IE6 doesn't like us to assign selection to OPTION nodes before they're added to the document.
                // That's why we first added them without selection. Now it's time to set the selection.
                var isSelected = ko.utils.arrayIndexOf(previousSelectedValues, ko.selectExtensions.readValue(newOptions[0])) >= 0;
                ko.utils.setOptionNodeSelectionState(newOptions[0], isSelected);

                // If this option was changed from being selected during a single-item update, notify the change
                if (itemUpdate && !isSelected) {
                    ko.dependencyDetection.ignore(ko.utils.triggerEvent, null, [element, "change"]);
                }
            }
        }

        var callback = setSelectionCallback;
        if (allBindings['has']('optionsAfterRender') && typeof allBindings.get('optionsAfterRender') == "function") {
            callback = function(arrayEntry, newOptions) {
                setSelectionCallback(arrayEntry, newOptions);
                ko.dependencyDetection.ignore(allBindings.get('optionsAfterRender'), null, [newOptions[0], arrayEntry !== captionPlaceholder ? arrayEntry : undefined]);
            }
        }

        ko.utils.setDomNodeChildrenFromArrayMapping(element, filteredArray, optionForArrayItem, arrayToDomNodeChildrenOptions, callback);

        ko.dependencyDetection.ignore(function () {
            if (valueAllowUnset) {
                // The model value is authoritative, so make sure its value is the one selected
                ko.selectExtensions.writeValue(element, ko.utils.unwrapObservable(allBindings.get('value')), true /* allowUnset */);
            } else {
                // Determine if the selection has changed as a result of updating the options list
                var selectionChanged;
                if (multiple) {
                    // For a multiple-select box, compare the new selection count to the previous one
                    // But if nothing was selected before, the selection can't have changed
                    selectionChanged = previousSelectedValues.length && selectedOptions().length < previousSelectedValues.length;
                } else {
                    // For a single-select box, compare the current value to the previous value
                    // But if nothing was selected before or nothing is selected now, just look for a change in selection
                    selectionChanged = (previousSelectedValues.length && element.selectedIndex >= 0)
                        ? (ko.selectExtensions.readValue(element.options[element.selectedIndex]) !== previousSelectedValues[0])
                        : (previousSelectedValues.length || element.selectedIndex >= 0);
                }

                // Ensure consistency between model value and selected option.
                // If the dropdown was changed so that selection is no longer the same,
                // notify the value or selectedOptions binding.
                if (selectionChanged) {
                    ko.utils.triggerEvent(element, "change");
                }
            }
        });

        // Workaround for IE bug
        ko.utils.ensureSelectElementIsRenderedCorrectly(element);

        if (previousScrollTop && Math.abs(previousScrollTop - element.scrollTop) > 20)
            element.scrollTop = previousScrollTop;
    }
};
ko.bindingHandlers['options'].optionValueDomDataKey = ko.utils.domData.nextKey();
ko.bindingHandlers['selectedOptions'] = {
    'after': ['options', 'foreach'],
    'init': function (element, valueAccessor, allBindings) {
        ko.utils.registerEventHandler(element, "change", function () {
            var value = valueAccessor(), valueToWrite = [];
            ko.utils.arrayForEach(element.getElementsByTagName("option"), function(node) {
                if (node.selected)
                    valueToWrite.push(ko.selectExtensions.readValue(node));
            });
            ko.expressionRewriting.writeValueToProperty(value, allBindings, 'selectedOptions', valueToWrite);
        });
    },
    'update': function (element, valueAccessor) {
        if (ko.utils.tagNameLower(element) != "select")
            throw new Error("values binding applies only to SELECT elements");

        var newValue = ko.utils.unwrapObservable(valueAccessor()),
            previousScrollTop = element.scrollTop;

        if (newValue && typeof newValue.length == "number") {
            ko.utils.arrayForEach(element.getElementsByTagName("option"), function(node) {
                var isSelected = ko.utils.arrayIndexOf(newValue, ko.selectExtensions.readValue(node)) >= 0;
                if (node.selected != isSelected) {      // This check prevents flashing of the select element in IE
                    ko.utils.setOptionNodeSelectionState(node, isSelected);
                }
            });
        }

        element.scrollTop = previousScrollTop;
    }
};
ko.expressionRewriting.twoWayBindings['selectedOptions'] = true;
ko.bindingHandlers['style'] = {
    'update': function (element, valueAccessor) {
        var value = ko.utils.unwrapObservable(valueAccessor() || {});
        ko.utils.objectForEach(value, function(styleName, styleValue) {
            styleValue = ko.utils.unwrapObservable(styleValue);

            if (styleValue === null || styleValue === undefined || styleValue === false) {
                // Empty string removes the value, whereas null/undefined have no effect
                styleValue = "";
            }

            element.style[styleName] = styleValue;
        });
    }
};
ko.bindingHandlers['submit'] = {
    'init': function (element, valueAccessor, allBindings, viewModel, bindingContext) {
        if (typeof valueAccessor() != "function")
            throw new Error("The value for a submit binding must be a function");
        ko.utils.registerEventHandler(element, "submit", function (event) {
            var handlerReturnValue;
            var value = valueAccessor();
            try { handlerReturnValue = value.call(bindingContext['$data'], element); }
            finally {
                if (handlerReturnValue !== true) { // Normally we want to prevent default action. Developer can override this be explicitly returning true.
                    if (event.preventDefault)
                        event.preventDefault();
                    else
                        event.returnValue = false;
                }
            }
        });
    }
};
ko.bindingHandlers['text'] = {
    'init': function() {
        // Prevent binding on the dynamically-injected text node (as developers are unlikely to expect that, and it has security implications).
        // It should also make things faster, as we no longer have to consider whether the text node might be bindable.
        return { 'controlsDescendantBindings': true };
    },
    'update': function (element, valueAccessor) {
        ko.utils.setTextContent(element, valueAccessor());
    }
};
ko.virtualElements.allowedBindings['text'] = true;
(function () {

if (window && window.navigator) {
    var parseVersion = function (matches) {
        if (matches) {
            return parseFloat(matches[1]);
        }
    };

    // Detect various browser versions because some old versions don't fully support the 'input' event
    var operaVersion = window.opera && window.opera.version && parseInt(window.opera.version()),
        userAgent = window.navigator.userAgent,
        safariVersion = parseVersion(userAgent.match(/^(?:(?!chrome).)*version\/([^ ]*) safari/i)),
        firefoxVersion = parseVersion(userAgent.match(/Firefox\/([^ ]*)/));
}

// IE 8 and 9 have bugs that prevent the normal events from firing when the value changes.
// But it does fire the 'selectionchange' event on many of those, presumably because the
// cursor is moving and that counts as the selection changing. The 'selectionchange' event is
// fired at the document level only and doesn't directly indicate which element changed. We
// set up just one event handler for the document and use 'activeElement' to determine which
// element was changed.
if (ko.utils.ieVersion < 10) {
    var selectionChangeRegisteredName = ko.utils.domData.nextKey(),
        selectionChangeHandlerName = ko.utils.domData.nextKey();
    var selectionChangeHandler = function(event) {
        var target = this.activeElement,
            handler = target && ko.utils.domData.get(target, selectionChangeHandlerName);
        if (handler) {
            handler(event);
        }
    };
    var registerForSelectionChangeEvent = function (element, handler) {
        var ownerDoc = element.ownerDocument;
        if (!ko.utils.domData.get(ownerDoc, selectionChangeRegisteredName)) {
            ko.utils.domData.set(ownerDoc, selectionChangeRegisteredName, true);
            ko.utils.registerEventHandler(ownerDoc, 'selectionchange', selectionChangeHandler);
        }
        ko.utils.domData.set(element, selectionChangeHandlerName, handler);
    };
}

ko.bindingHandlers['textInput'] = {
    'init': function (element, valueAccessor, allBindings) {

        var previousElementValue = element.value,
            timeoutHandle,
            elementValueBeforeEvent;

        var updateModel = function (event) {
            clearTimeout(timeoutHandle);
            elementValueBeforeEvent = timeoutHandle = undefined;

            var elementValue = element.value;
            if (previousElementValue !== elementValue) {
                // Provide a way for tests to know exactly which event was processed
                if (DEBUG && event) element['_ko_textInputProcessedEvent'] = event.type;
                previousElementValue = elementValue;
                ko.expressionRewriting.writeValueToProperty(valueAccessor(), allBindings, 'textInput', elementValue);
            }
        };

        var deferUpdateModel = function (event) {
            if (!timeoutHandle) {
                // The elementValueBeforeEvent variable is set *only* during the brief gap between an
                // event firing and the updateModel function running. This allows us to ignore model
                // updates that are from the previous state of the element, usually due to techniques
                // such as rateLimit. Such updates, if not ignored, can cause keystrokes to be lost.
                elementValueBeforeEvent = element.value;
                var handler = DEBUG ? updateModel.bind(element, {type: event.type}) : updateModel;
                timeoutHandle = ko.utils.setTimeout(handler, 4);
            }
        };

        // IE9 will mess up the DOM if you handle events synchronously which results in DOM changes (such as other bindings);
        // so we'll make sure all updates are asynchronous
        var ieUpdateModel = ko.utils.ieVersion == 9 ? deferUpdateModel : updateModel;

        var updateView = function () {
            var modelValue = ko.utils.unwrapObservable(valueAccessor());

            if (modelValue === null || modelValue === undefined) {
                modelValue = '';
            }

            if (elementValueBeforeEvent !== undefined && modelValue === elementValueBeforeEvent) {
                ko.utils.setTimeout(updateView, 4);
                return;
            }

            // Update the element only if the element and model are different. On some browsers, updating the value
            // will move the cursor to the end of the input, which would be bad while the user is typing.
            if (element.value !== modelValue) {
                previousElementValue = modelValue;  // Make sure we ignore events (propertychange) that result from updating the value
                element.value = modelValue;
            }
        };

        var onEvent = function (event, handler) {
            ko.utils.registerEventHandler(element, event, handler);
        };

        if (DEBUG && ko.bindingHandlers['textInput']['_forceUpdateOn']) {
            // Provide a way for tests to specify exactly which events are bound
            ko.utils.arrayForEach(ko.bindingHandlers['textInput']['_forceUpdateOn'], function(eventName) {
                if (eventName.slice(0,5) == 'after') {
                    onEvent(eventName.slice(5), deferUpdateModel);
                } else {
                    onEvent(eventName, updateModel);
                }
            });
        } else {
            if (ko.utils.ieVersion < 10) {
                // Internet Explorer <= 8 doesn't support the 'input' event, but does include 'propertychange' that fires whenever
                // any property of an element changes. Unlike 'input', it also fires if a property is changed from JavaScript code,
                // but that's an acceptable compromise for this binding. IE 9 does support 'input', but since it doesn't fire it
                // when using autocomplete, we'll use 'propertychange' for it also.
                onEvent('propertychange', function(event) {
                    if (event.propertyName === 'value') {
                        ieUpdateModel(event);
                    }
                });

                if (ko.utils.ieVersion == 8) {
                    // IE 8 has a bug where it fails to fire 'propertychange' on the first update following a value change from
                    // JavaScript code. It also doesn't fire if you clear the entire value. To fix this, we bind to the following
                    // events too.
                    onEvent('keyup', updateModel);      // A single keystoke
                    onEvent('keydown', updateModel);    // The first character when a key is held down
                }
                if (ko.utils.ieVersion >= 8) {
                    // Internet Explorer 9 doesn't fire the 'input' event when deleting text, including using
                    // the backspace, delete, or ctrl-x keys, clicking the 'x' to clear the input, dragging text
                    // out of the field, and cutting or deleting text using the context menu. 'selectionchange'
                    // can detect all of those except dragging text out of the field, for which we use 'dragend'.
                    // These are also needed in IE8 because of the bug described above.
                    registerForSelectionChangeEvent(element, ieUpdateModel);  // 'selectionchange' covers cut, paste, drop, delete, etc.
                    onEvent('dragend', deferUpdateModel);
                }
            } else {
                // All other supported browsers support the 'input' event, which fires whenever the content of the element is changed
                // through the user interface.
                onEvent('input', updateModel);

                if (safariVersion < 5 && ko.utils.tagNameLower(element) === "textarea") {
                    // Safari <5 doesn't fire the 'input' event for <textarea> elements (it does fire 'textInput'
                    // but only when typing). So we'll just catch as much as we can with keydown, cut, and paste.
                    onEvent('keydown', deferUpdateModel);
                    onEvent('paste', deferUpdateModel);
                    onEvent('cut', deferUpdateModel);
                } else if (operaVersion < 11) {
                    // Opera 10 doesn't always fire the 'input' event for cut, paste, undo & drop operations.
                    // We can try to catch some of those using 'keydown'.
                    onEvent('keydown', deferUpdateModel);
                } else if (firefoxVersion < 4.0) {
                    // Firefox <= 3.6 doesn't fire the 'input' event when text is filled in through autocomplete
                    onEvent('DOMAutoComplete', updateModel);

                    // Firefox <=3.5 doesn't fire the 'input' event when text is dropped into the input.
                    onEvent('dragdrop', updateModel);       // <3.5
                    onEvent('drop', updateModel);           // 3.5
                }
            }
        }

        // Bind to the change event so that we can catch programmatic updates of the value that fire this event.
        onEvent('change', updateModel);

        ko.computed(updateView, null, { disposeWhenNodeIsRemoved: element });
    }
};
ko.expressionRewriting.twoWayBindings['textInput'] = true;

// textinput is an alias for textInput
ko.bindingHandlers['textinput'] = {
    // preprocess is the only way to set up a full alias
    'preprocess': function (value, name, addBinding) {
        addBinding('textInput', value);
    }
};

})();ko.bindingHandlers['uniqueName'] = {
    'init': function (element, valueAccessor) {
        if (valueAccessor()) {
            var name = "ko_unique_" + (++ko.bindingHandlers['uniqueName'].currentIndex);
            ko.utils.setElementName(element, name);
        }
    }
};
ko.bindingHandlers['uniqueName'].currentIndex = 0;
ko.bindingHandlers['value'] = {
    'after': ['options', 'foreach'],
    'init': function (element, valueAccessor, allBindings) {
        // If the value binding is placed on a radio/checkbox, then just pass through to checkedValue and quit
        if (element.tagName.toLowerCase() == "input" && (element.type == "checkbox" || element.type == "radio")) {
            ko.applyBindingAccessorsToNode(element, { 'checkedValue': valueAccessor });
            return;
        }

        // Always catch "change" event; possibly other events too if asked
        var eventsToCatch = ["change"];
        var requestedEventsToCatch = allBindings.get("valueUpdate");
        var propertyChangedFired = false;
        var elementValueBeforeEvent = null;

        if (requestedEventsToCatch) {
            if (typeof requestedEventsToCatch == "string") // Allow both individual event names, and arrays of event names
                requestedEventsToCatch = [requestedEventsToCatch];
            ko.utils.arrayPushAll(eventsToCatch, requestedEventsToCatch);
            eventsToCatch = ko.utils.arrayGetDistinctValues(eventsToCatch);
        }

        var valueUpdateHandler = function() {
            elementValueBeforeEvent = null;
            propertyChangedFired = false;
            var modelValue = valueAccessor();
            var elementValue = ko.selectExtensions.readValue(element);
            ko.expressionRewriting.writeValueToProperty(modelValue, allBindings, 'value', elementValue);
        }

        // Workaround for https://github.com/SteveSanderson/knockout/issues/122
        // IE doesn't fire "change" events on textboxes if the user selects a value from its autocomplete list
        var ieAutoCompleteHackNeeded = ko.utils.ieVersion && element.tagName.toLowerCase() == "input" && element.type == "text"
                                       && element.autocomplete != "off" && (!element.form || element.form.autocomplete != "off");
        if (ieAutoCompleteHackNeeded && ko.utils.arrayIndexOf(eventsToCatch, "propertychange") == -1) {
            ko.utils.registerEventHandler(element, "propertychange", function () { propertyChangedFired = true });
            ko.utils.registerEventHandler(element, "focus", function () { propertyChangedFired = false });
            ko.utils.registerEventHandler(element, "blur", function() {
                if (propertyChangedFired) {
                    valueUpdateHandler();
                }
            });
        }

        ko.utils.arrayForEach(eventsToCatch, function(eventName) {
            // The syntax "after<eventname>" means "run the handler asynchronously after the event"
            // This is useful, for example, to catch "keydown" events after the browser has updated the control
            // (otherwise, ko.selectExtensions.readValue(this) will receive the control's value *before* the key event)
            var handler = valueUpdateHandler;
            if (ko.utils.stringStartsWith(eventName, "after")) {
                handler = function() {
                    // The elementValueBeforeEvent variable is non-null *only* during the brief gap between
                    // a keyX event firing and the valueUpdateHandler running, which is scheduled to happen
                    // at the earliest asynchronous opportunity. We store this temporary information so that
                    // if, between keyX and valueUpdateHandler, the underlying model value changes separately,
                    // we can overwrite that model value change with the value the user just typed. Otherwise,
                    // techniques like rateLimit can trigger model changes at critical moments that will
                    // override the user's inputs, causing keystrokes to be lost.
                    elementValueBeforeEvent = ko.selectExtensions.readValue(element);
                    ko.utils.setTimeout(valueUpdateHandler, 0);
                };
                eventName = eventName.substring("after".length);
            }
            ko.utils.registerEventHandler(element, eventName, handler);
        });

        var updateFromModel = function () {
            var newValue = ko.utils.unwrapObservable(valueAccessor());
            var elementValue = ko.selectExtensions.readValue(element);

            if (elementValueBeforeEvent !== null && newValue === elementValueBeforeEvent) {
                ko.utils.setTimeout(updateFromModel, 0);
                return;
            }

            var valueHasChanged = (newValue !== elementValue);

            if (valueHasChanged) {
                if (ko.utils.tagNameLower(element) === "select") {
                    var allowUnset = allBindings.get('valueAllowUnset');
                    var applyValueAction = function () {
                        ko.selectExtensions.writeValue(element, newValue, allowUnset);
                    };
                    applyValueAction();

                    if (!allowUnset && newValue !== ko.selectExtensions.readValue(element)) {
                        // If you try to set a model value that can't be represented in an already-populated dropdown, reject that change,
                        // because you're not allowed to have a model value that disagrees with a visible UI selection.
                        ko.dependencyDetection.ignore(ko.utils.triggerEvent, null, [element, "change"]);
                    } else {
                        // Workaround for IE6 bug: It won't reliably apply values to SELECT nodes during the same execution thread
                        // right after you've changed the set of OPTION nodes on it. So for that node type, we'll schedule a second thread
                        // to apply the value as well.
                        ko.utils.setTimeout(applyValueAction, 0);
                    }
                } else {
                    ko.selectExtensions.writeValue(element, newValue);
                }
            }
        };

        ko.computed(updateFromModel, null, { disposeWhenNodeIsRemoved: element });
    },
    'update': function() {} // Keep for backwards compatibility with code that may have wrapped value binding
};
ko.expressionRewriting.twoWayBindings['value'] = true;
ko.bindingHandlers['visible'] = {
    'update': function (element, valueAccessor) {
        var value = ko.utils.unwrapObservable(valueAccessor());
        var isCurrentlyVisible = !(element.style.display == "none");
        if (value && !isCurrentlyVisible)
            element.style.display = "";
        else if ((!value) && isCurrentlyVisible)
            element.style.display = "none";
    }
};
// 'click' is just a shorthand for the usual full-length event:{click:handler}
makeEventHandlerShortcut('click');
// If you want to make a custom template engine,
//
// [1] Inherit from this class (like ko.nativeTemplateEngine does)
// [2] Override 'renderTemplateSource', supplying a function with this signature:
//
//        function (templateSource, bindingContext, options) {
//            // - templateSource.text() is the text of the template you should render
//            // - bindingContext.$data is the data you should pass into the template
//            //   - you might also want to make bindingContext.$parent, bindingContext.$parents,
//            //     and bindingContext.$root available in the template too
//            // - options gives you access to any other properties set on "data-bind: { template: options }"
//            // - templateDocument is the document object of the template
//            //
//            // Return value: an array of DOM nodes
//        }
//
// [3] Override 'createJavaScriptEvaluatorBlock', supplying a function with this signature:
//
//        function (script) {
//            // Return value: Whatever syntax means "Evaluate the JavaScript statement 'script' and output the result"
//            //               For example, the jquery.tmpl template engine converts 'someScript' to '${ someScript }'
//        }
//
//     This is only necessary if you want to allow data-bind attributes to reference arbitrary template variables.
//     If you don't want to allow that, you can set the property 'allowTemplateRewriting' to false (like ko.nativeTemplateEngine does)
//     and then you don't need to override 'createJavaScriptEvaluatorBlock'.

ko.templateEngine = function () { };

ko.templateEngine.prototype['renderTemplateSource'] = function (templateSource, bindingContext, options, templateDocument) {
    throw new Error("Override renderTemplateSource");
};

ko.templateEngine.prototype['createJavaScriptEvaluatorBlock'] = function (script) {
    throw new Error("Override createJavaScriptEvaluatorBlock");
};

ko.templateEngine.prototype['makeTemplateSource'] = function(template, templateDocument) {
    // Named template
    if (typeof template == "string") {
        templateDocument = templateDocument || document;
        var elem = templateDocument.getElementById(template);
        if (!elem)
            throw new Error("Cannot find template with ID " + template);
        return new ko.templateSources.domElement(elem);
    } else if ((template.nodeType == 1) || (template.nodeType == 8)) {
        // Anonymous template
        return new ko.templateSources.anonymousTemplate(template);
    } else
        throw new Error("Unknown template type: " + template);
};

ko.templateEngine.prototype['renderTemplate'] = function (template, bindingContext, options, templateDocument) {
    var templateSource = this['makeTemplateSource'](template, templateDocument);
    return this['renderTemplateSource'](templateSource, bindingContext, options, templateDocument);
};

ko.templateEngine.prototype['isTemplateRewritten'] = function (template, templateDocument) {
    // Skip rewriting if requested
    if (this['allowTemplateRewriting'] === false)
        return true;
    return this['makeTemplateSource'](template, templateDocument)['data']("isRewritten");
};

ko.templateEngine.prototype['rewriteTemplate'] = function (template, rewriterCallback, templateDocument) {
    var templateSource = this['makeTemplateSource'](template, templateDocument);
    var rewritten = rewriterCallback(templateSource['text']());
    templateSource['text'](rewritten);
    templateSource['data']("isRewritten", true);
};

ko.exportSymbol('templateEngine', ko.templateEngine);

ko.templateRewriting = (function () {
    var memoizeDataBindingAttributeSyntaxRegex = /(<([a-z]+\d*)(?:\s+(?!data-bind\s*=\s*)[a-z0-9\-]+(?:=(?:\"[^\"]*\"|\'[^\']*\'|[^>]*))?)*\s+)data-bind\s*=\s*(["'])([\s\S]*?)\3/gi;
    var memoizeVirtualContainerBindingSyntaxRegex = /<!--\s*ko\b\s*([\s\S]*?)\s*-->/g;

    function validateDataBindValuesForRewriting(keyValueArray) {
        var allValidators = ko.expressionRewriting.bindingRewriteValidators;
        for (var i = 0; i < keyValueArray.length; i++) {
            var key = keyValueArray[i]['key'];
            if (allValidators.hasOwnProperty(key)) {
                var validator = allValidators[key];

                if (typeof validator === "function") {
                    var possibleErrorMessage = validator(keyValueArray[i]['value']);
                    if (possibleErrorMessage)
                        throw new Error(possibleErrorMessage);
                } else if (!validator) {
                    throw new Error("This template engine does not support the '" + key + "' binding within its templates");
                }
            }
        }
    }

    function constructMemoizedTagReplacement(dataBindAttributeValue, tagToRetain, nodeName, templateEngine) {
        var dataBindKeyValueArray = ko.expressionRewriting.parseObjectLiteral(dataBindAttributeValue);
        validateDataBindValuesForRewriting(dataBindKeyValueArray);
        var rewrittenDataBindAttributeValue = ko.expressionRewriting.preProcessBindings(dataBindKeyValueArray, {'valueAccessors':true});

        // For no obvious reason, Opera fails to evaluate rewrittenDataBindAttributeValue unless it's wrapped in an additional
        // anonymous function, even though Opera's built-in debugger can evaluate it anyway. No other browser requires this
        // extra indirection.
        var applyBindingsToNextSiblingScript =
            "ko.__tr_ambtns(function($context,$element){return(function(){return{ " + rewrittenDataBindAttributeValue + " } })()},'" + nodeName.toLowerCase() + "')";
        return templateEngine['createJavaScriptEvaluatorBlock'](applyBindingsToNextSiblingScript) + tagToRetain;
    }

    return {
        ensureTemplateIsRewritten: function (template, templateEngine, templateDocument) {
            if (!templateEngine['isTemplateRewritten'](template, templateDocument))
                templateEngine['rewriteTemplate'](template, function (htmlString) {
                    return ko.templateRewriting.memoizeBindingAttributeSyntax(htmlString, templateEngine);
                }, templateDocument);
        },

        memoizeBindingAttributeSyntax: function (htmlString, templateEngine) {
            return htmlString.replace(memoizeDataBindingAttributeSyntaxRegex, function () {
                return constructMemoizedTagReplacement(/* dataBindAttributeValue: */ arguments[4], /* tagToRetain: */ arguments[1], /* nodeName: */ arguments[2], templateEngine);
            }).replace(memoizeVirtualContainerBindingSyntaxRegex, function() {
                return constructMemoizedTagReplacement(/* dataBindAttributeValue: */ arguments[1], /* tagToRetain: */ "<!-- ko -->", /* nodeName: */ "#comment", templateEngine);
            });
        },

        applyMemoizedBindingsToNextSibling: function (bindings, nodeName) {
            return ko.memoization.memoize(function (domNode, bindingContext) {
                var nodeToBind = domNode.nextSibling;
                if (nodeToBind && nodeToBind.nodeName.toLowerCase() === nodeName) {
                    ko.applyBindingAccessorsToNode(nodeToBind, bindings, bindingContext);
                }
            });
        }
    }
})();


// Exported only because it has to be referenced by string lookup from within rewritten template
ko.exportSymbol('__tr_ambtns', ko.templateRewriting.applyMemoizedBindingsToNextSibling);
(function() {
    // A template source represents a read/write way of accessing a template. This is to eliminate the need for template loading/saving
    // logic to be duplicated in every template engine (and means they can all work with anonymous templates, etc.)
    //
    // Two are provided by default:
    //  1. ko.templateSources.domElement       - reads/writes the text content of an arbitrary DOM element
    //  2. ko.templateSources.anonymousElement - uses ko.utils.domData to read/write text *associated* with the DOM element, but
    //                                           without reading/writing the actual element text content, since it will be overwritten
    //                                           with the rendered template output.
    // You can implement your own template source if you want to fetch/store templates somewhere other than in DOM elements.
    // Template sources need to have the following functions:
    //   text() 			- returns the template text from your storage location
    //   text(value)		- writes the supplied template text to your storage location
    //   data(key)			- reads values stored using data(key, value) - see below
    //   data(key, value)	- associates "value" with this template and the key "key". Is used to store information like "isRewritten".
    //
    // Optionally, template sources can also have the following functions:
    //   nodes()            - returns a DOM element containing the nodes of this template, where available
    //   nodes(value)       - writes the given DOM element to your storage location
    // If a DOM element is available for a given template source, template engines are encouraged to use it in preference over text()
    // for improved speed. However, all templateSources must supply text() even if they don't supply nodes().
    //
    // Once you've implemented a templateSource, make your template engine use it by subclassing whatever template engine you were
    // using and overriding "makeTemplateSource" to return an instance of your custom template source.

    ko.templateSources = {};

    // ---- ko.templateSources.domElement -----

    // template types
    var templateScript = 1,
        templateTextArea = 2,
        templateTemplate = 3,
        templateElement = 4;

    ko.templateSources.domElement = function(element) {
        this.domElement = element;

        if (element) {
            var tagNameLower = ko.utils.tagNameLower(element);
            this.templateType =
                tagNameLower === "script" ? templateScript :
                tagNameLower === "textarea" ? templateTextArea :
                    // For browsers with proper <template> element support, where the .content property gives a document fragment
                tagNameLower == "template" && element.content && element.content.nodeType === 11 ? templateTemplate :
                templateElement;
        }
    }

    ko.templateSources.domElement.prototype['text'] = function(/* valueToWrite */) {
        var elemContentsProperty = this.templateType === templateScript ? "text"
                                 : this.templateType === templateTextArea ? "value"
                                 : "innerHTML";

        if (arguments.length == 0) {
            return this.domElement[elemContentsProperty];
        } else {
            var valueToWrite = arguments[0];
            if (elemContentsProperty === "innerHTML")
                ko.utils.setHtml(this.domElement, valueToWrite);
            else
                this.domElement[elemContentsProperty] = valueToWrite;
        }
    };

    var dataDomDataPrefix = ko.utils.domData.nextKey() + "_";
    ko.templateSources.domElement.prototype['data'] = function(key /*, valueToWrite */) {
        if (arguments.length === 1) {
            return ko.utils.domData.get(this.domElement, dataDomDataPrefix + key);
        } else {
            ko.utils.domData.set(this.domElement, dataDomDataPrefix + key, arguments[1]);
        }
    };

    var templatesDomDataKey = ko.utils.domData.nextKey();
    function getTemplateDomData(element) {
        return ko.utils.domData.get(element, templatesDomDataKey) || {};
    }
    function setTemplateDomData(element, data) {
        ko.utils.domData.set(element, templatesDomDataKey, data);
    }

    ko.templateSources.domElement.prototype['nodes'] = function(/* valueToWrite */) {
        var element = this.domElement;
        if (arguments.length == 0) {
            var templateData = getTemplateDomData(element),
                containerData = templateData.containerData;
            return containerData || (
                this.templateType === templateTemplate ? element.content :
                this.templateType === templateElement ? element :
                undefined);
        } else {
            var valueToWrite = arguments[0];
            setTemplateDomData(element, {containerData: valueToWrite});
        }
    };

    // ---- ko.templateSources.anonymousTemplate -----
    // Anonymous templates are normally saved/retrieved as DOM nodes through "nodes".
    // For compatibility, you can also read "text"; it will be serialized from the nodes on demand.
    // Writing to "text" is still supported, but then the template data will not be available as DOM nodes.

    ko.templateSources.anonymousTemplate = function(element) {
        this.domElement = element;
    }
    ko.templateSources.anonymousTemplate.prototype = new ko.templateSources.domElement();
    ko.templateSources.anonymousTemplate.prototype.constructor = ko.templateSources.anonymousTemplate;
    ko.templateSources.anonymousTemplate.prototype['text'] = function(/* valueToWrite */) {
        if (arguments.length == 0) {
            var templateData = getTemplateDomData(this.domElement);
            if (templateData.textData === undefined && templateData.containerData)
                templateData.textData = templateData.containerData.innerHTML;
            return templateData.textData;
        } else {
            var valueToWrite = arguments[0];
            setTemplateDomData(this.domElement, {textData: valueToWrite});
        }
    };

    ko.exportSymbol('templateSources', ko.templateSources);
    ko.exportSymbol('templateSources.domElement', ko.templateSources.domElement);
    ko.exportSymbol('templateSources.anonymousTemplate', ko.templateSources.anonymousTemplate);
})();
(function () {
    var _templateEngine;
    ko.setTemplateEngine = function (templateEngine) {
        if ((templateEngine != undefined) && !(templateEngine instanceof ko.templateEngine))
            throw new Error("templateEngine must inherit from ko.templateEngine");
        _templateEngine = templateEngine;
    }

    function invokeForEachNodeInContinuousRange(firstNode, lastNode, action) {
        var node, nextInQueue = firstNode, firstOutOfRangeNode = ko.virtualElements.nextSibling(lastNode);
        while (nextInQueue && ((node = nextInQueue) !== firstOutOfRangeNode)) {
            nextInQueue = ko.virtualElements.nextSibling(node);
            action(node, nextInQueue);
        }
    }

    function activateBindingsOnContinuousNodeArray(continuousNodeArray, bindingContext) {
        // To be used on any nodes that have been rendered by a template and have been inserted into some parent element
        // Walks through continuousNodeArray (which *must* be continuous, i.e., an uninterrupted sequence of sibling nodes, because
        // the algorithm for walking them relies on this), and for each top-level item in the virtual-element sense,
        // (1) Does a regular "applyBindings" to associate bindingContext with this node and to activate any non-memoized bindings
        // (2) Unmemoizes any memos in the DOM subtree (e.g., to activate bindings that had been memoized during template rewriting)

        if (continuousNodeArray.length) {
            var firstNode = continuousNodeArray[0],
                lastNode = continuousNodeArray[continuousNodeArray.length - 1],
                parentNode = firstNode.parentNode,
                provider = ko.bindingProvider['instance'],
                preprocessNode = provider['preprocessNode'];

            if (preprocessNode) {
                invokeForEachNodeInContinuousRange(firstNode, lastNode, function(node, nextNodeInRange) {
                    var nodePreviousSibling = node.previousSibling;
                    var newNodes = preprocessNode.call(provider, node);
                    if (newNodes) {
                        if (node === firstNode)
                            firstNode = newNodes[0] || nextNodeInRange;
                        if (node === lastNode)
                            lastNode = newNodes[newNodes.length - 1] || nodePreviousSibling;
                    }
                });

                // Because preprocessNode can change the nodes, including the first and last nodes, update continuousNodeArray to match.
                // We need the full set, including inner nodes, because the unmemoize step might remove the first node (and so the real
                // first node needs to be in the array).
                continuousNodeArray.length = 0;
                if (!firstNode) { // preprocessNode might have removed all the nodes, in which case there's nothing left to do
                    return;
                }
                if (firstNode === lastNode) {
                    continuousNodeArray.push(firstNode);
                } else {
                    continuousNodeArray.push(firstNode, lastNode);
                    ko.utils.fixUpContinuousNodeArray(continuousNodeArray, parentNode);
                }
            }

            // Need to applyBindings *before* unmemoziation, because unmemoization might introduce extra nodes (that we don't want to re-bind)
            // whereas a regular applyBindings won't introduce new memoized nodes
            invokeForEachNodeInContinuousRange(firstNode, lastNode, function(node) {
                if (node.nodeType === 1 || node.nodeType === 8)
                    ko.applyBindings(bindingContext, node);
            });
            invokeForEachNodeInContinuousRange(firstNode, lastNode, function(node) {
                if (node.nodeType === 1 || node.nodeType === 8)
                    ko.memoization.unmemoizeDomNodeAndDescendants(node, [bindingContext]);
            });

            // Make sure any changes done by applyBindings or unmemoize are reflected in the array
            ko.utils.fixUpContinuousNodeArray(continuousNodeArray, parentNode);
        }
    }

    function getFirstNodeFromPossibleArray(nodeOrNodeArray) {
        return nodeOrNodeArray.nodeType ? nodeOrNodeArray
                                        : nodeOrNodeArray.length > 0 ? nodeOrNodeArray[0]
                                        : null;
    }

    function executeTemplate(targetNodeOrNodeArray, renderMode, template, bindingContext, options) {
        options = options || {};
        var firstTargetNode = targetNodeOrNodeArray && getFirstNodeFromPossibleArray(targetNodeOrNodeArray);
        var templateDocument = (firstTargetNode || template || {}).ownerDocument;
        var templateEngineToUse = (options['templateEngine'] || _templateEngine);
        ko.templateRewriting.ensureTemplateIsRewritten(template, templateEngineToUse, templateDocument);
        var renderedNodesArray = templateEngineToUse['renderTemplate'](template, bindingContext, options, templateDocument);

        // Loosely check result is an array of DOM nodes
        if ((typeof renderedNodesArray.length != "number") || (renderedNodesArray.length > 0 && typeof renderedNodesArray[0].nodeType != "number"))
            throw new Error("Template engine must return an array of DOM nodes");

        var haveAddedNodesToParent = false;
        switch (renderMode) {
            case "replaceChildren":
                ko.virtualElements.setDomNodeChildren(targetNodeOrNodeArray, renderedNodesArray);
                haveAddedNodesToParent = true;
                break;
            case "replaceNode":
                ko.utils.replaceDomNodes(targetNodeOrNodeArray, renderedNodesArray);
                haveAddedNodesToParent = true;
                break;
            case "ignoreTargetNode": break;
            default:
                throw new Error("Unknown renderMode: " + renderMode);
        }

        if (haveAddedNodesToParent) {
            activateBindingsOnContinuousNodeArray(renderedNodesArray, bindingContext);
            if (options['afterRender'])
                ko.dependencyDetection.ignore(options['afterRender'], null, [renderedNodesArray, bindingContext['$data']]);
        }

        return renderedNodesArray;
    }

    function resolveTemplateName(template, data, context) {
        // The template can be specified as:
        if (ko.isObservable(template)) {
            // 1. An observable, with string value
            return template();
        } else if (typeof template === 'function') {
            // 2. A function of (data, context) returning a string
            return template(data, context);
        } else {
            // 3. A string
            return template;
        }
    }

    ko.renderTemplate = function (template, dataOrBindingContext, options, targetNodeOrNodeArray, renderMode) {
        options = options || {};
        if ((options['templateEngine'] || _templateEngine) == undefined)
            throw new Error("Set a template engine before calling renderTemplate");
        renderMode = renderMode || "replaceChildren";

        if (targetNodeOrNodeArray) {
            var firstTargetNode = getFirstNodeFromPossibleArray(targetNodeOrNodeArray);

            var whenToDispose = function () { return (!firstTargetNode) || !ko.utils.domNodeIsAttachedToDocument(firstTargetNode); }; // Passive disposal (on next evaluation)
            var activelyDisposeWhenNodeIsRemoved = (firstTargetNode && renderMode == "replaceNode") ? firstTargetNode.parentNode : firstTargetNode;

            return ko.dependentObservable( // So the DOM is automatically updated when any dependency changes
                function () {
                    // Ensure we've got a proper binding context to work with
                    var bindingContext = (dataOrBindingContext && (dataOrBindingContext instanceof ko.bindingContext))
                        ? dataOrBindingContext
                        : new ko.bindingContext(dataOrBindingContext, null, null, null, { "exportDependencies": true });

                    var templateName = resolveTemplateName(template, bindingContext['$data'], bindingContext),
                        renderedNodesArray = executeTemplate(targetNodeOrNodeArray, renderMode, templateName, bindingContext, options);

                    if (renderMode == "replaceNode") {
                        targetNodeOrNodeArray = renderedNodesArray;
                        firstTargetNode = getFirstNodeFromPossibleArray(targetNodeOrNodeArray);
                    }
                },
                null,
                { disposeWhen: whenToDispose, disposeWhenNodeIsRemoved: activelyDisposeWhenNodeIsRemoved }
            );
        } else {
            // We don't yet have a DOM node to evaluate, so use a memo and render the template later when there is a DOM node
            return ko.memoization.memoize(function (domNode) {
                ko.renderTemplate(template, dataOrBindingContext, options, domNode, "replaceNode");
            });
        }
    };

    ko.renderTemplateForEach = function (template, arrayOrObservableArray, options, targetNode, parentBindingContext) {
        // Since setDomNodeChildrenFromArrayMapping always calls executeTemplateForArrayItem and then
        // activateBindingsCallback for added items, we can store the binding context in the former to use in the latter.
        var arrayItemContext;

        // This will be called by setDomNodeChildrenFromArrayMapping to get the nodes to add to targetNode
        var executeTemplateForArrayItem = function (arrayValue, index) {
            // Support selecting template as a function of the data being rendered
            arrayItemContext = parentBindingContext['createChildContext'](arrayValue, options['as'], function(context) {
                context['$index'] = index;
            });

            var templateName = resolveTemplateName(template, arrayValue, arrayItemContext);
            return executeTemplate(null, "ignoreTargetNode", templateName, arrayItemContext, options);
        }

        // This will be called whenever setDomNodeChildrenFromArrayMapping has added nodes to targetNode
        var activateBindingsCallback = function(arrayValue, addedNodesArray, index) {
            activateBindingsOnContinuousNodeArray(addedNodesArray, arrayItemContext);
            if (options['afterRender'])
                options['afterRender'](addedNodesArray, arrayValue);

            // release the "cache" variable, so that it can be collected by
            // the GC when its value isn't used from within the bindings anymore.
            arrayItemContext = null;
        };

        return ko.dependentObservable(function () {
            var unwrappedArray = ko.utils.unwrapObservable(arrayOrObservableArray) || [];
            if (typeof unwrappedArray.length == "undefined") // Coerce single value into array
                unwrappedArray = [unwrappedArray];

            // Filter out any entries marked as destroyed
            var filteredArray = ko.utils.arrayFilter(unwrappedArray, function(item) {
                return options['includeDestroyed'] || item === undefined || item === null || !ko.utils.unwrapObservable(item['_destroy']);
            });

            // Call setDomNodeChildrenFromArrayMapping, ignoring any observables unwrapped within (most likely from a callback function).
            // If the array items are observables, though, they will be unwrapped in executeTemplateForArrayItem and managed within setDomNodeChildrenFromArrayMapping.
            ko.dependencyDetection.ignore(ko.utils.setDomNodeChildrenFromArrayMapping, null, [targetNode, filteredArray, executeTemplateForArrayItem, options, activateBindingsCallback]);

        }, null, { disposeWhenNodeIsRemoved: targetNode });
    };

    var templateComputedDomDataKey = ko.utils.domData.nextKey();
    function disposeOldComputedAndStoreNewOne(element, newComputed) {
        var oldComputed = ko.utils.domData.get(element, templateComputedDomDataKey);
        if (oldComputed && (typeof(oldComputed.dispose) == 'function'))
            oldComputed.dispose();
        ko.utils.domData.set(element, templateComputedDomDataKey, (newComputed && newComputed.isActive()) ? newComputed : undefined);
    }

    ko.bindingHandlers['template'] = {
        'init': function(element, valueAccessor) {
            // Support anonymous templates
            var bindingValue = ko.utils.unwrapObservable(valueAccessor());
            if (typeof bindingValue == "string" || bindingValue['name']) {
                // It's a named template - clear the element
                ko.virtualElements.emptyNode(element);
            } else if ('nodes' in bindingValue) {
                // We've been given an array of DOM nodes. Save them as the template source.
                // There is no known use case for the node array being an observable array (if the output
                // varies, put that behavior *into* your template - that's what templates are for), and
                // the implementation would be a mess, so assert that it's not observable.
                var nodes = bindingValue['nodes'] || [];
                if (ko.isObservable(nodes)) {
                    throw new Error('The "nodes" option must be a plain, non-observable array.');
                }
                var container = ko.utils.moveCleanedNodesToContainerElement(nodes); // This also removes the nodes from their current parent
                new ko.templateSources.anonymousTemplate(element)['nodes'](container);
            } else {
                // It's an anonymous template - store the element contents, then clear the element
                var templateNodes = ko.virtualElements.childNodes(element),
                    container = ko.utils.moveCleanedNodesToContainerElement(templateNodes); // This also removes the nodes from their current parent
                new ko.templateSources.anonymousTemplate(element)['nodes'](container);
            }
            return { 'controlsDescendantBindings': true };
        },
        'update': function (element, valueAccessor, allBindings, viewModel, bindingContext) {
            var value = valueAccessor(),
                options = ko.utils.unwrapObservable(value),
                shouldDisplay = true,
                templateComputed = null,
                templateName;

            if (typeof options == "string") {
                templateName = value;
                options = {};
            } else {
                templateName = options['name'];

                // Support "if"/"ifnot" conditions
                if ('if' in options)
                    shouldDisplay = ko.utils.unwrapObservable(options['if']);
                if (shouldDisplay && 'ifnot' in options)
                    shouldDisplay = !ko.utils.unwrapObservable(options['ifnot']);
            }

            if ('foreach' in options) {
                // Render once for each data point (treating data set as empty if shouldDisplay==false)
                var dataArray = (shouldDisplay && options['foreach']) || [];
                templateComputed = ko.renderTemplateForEach(templateName || element, dataArray, options, element, bindingContext);
            } else if (!shouldDisplay) {
                ko.virtualElements.emptyNode(element);
            } else {
                // Render once for this single data point (or use the viewModel if no data was provided)
                var innerBindingContext = ('data' in options) ?
                    bindingContext.createStaticChildContext(options['data'], options['as']) :  // Given an explitit 'data' value, we create a child binding context for it
                    bindingContext;                                                        // Given no explicit 'data' value, we retain the same binding context
                templateComputed = ko.renderTemplate(templateName || element, innerBindingContext, options, element);
            }

            // It only makes sense to have a single template computed per element (otherwise which one should have its output displayed?)
            disposeOldComputedAndStoreNewOne(element, templateComputed);
        }
    };

    // Anonymous templates can't be rewritten. Give a nice error message if you try to do it.
    ko.expressionRewriting.bindingRewriteValidators['template'] = function(bindingValue) {
        var parsedBindingValue = ko.expressionRewriting.parseObjectLiteral(bindingValue);

        if ((parsedBindingValue.length == 1) && parsedBindingValue[0]['unknown'])
            return null; // It looks like a string literal, not an object literal, so treat it as a named template (which is allowed for rewriting)

        if (ko.expressionRewriting.keyValueArrayContainsKey(parsedBindingValue, "name"))
            return null; // Named templates can be rewritten, so return "no error"
        return "This template engine does not support anonymous templates nested within its templates";
    };

    ko.virtualElements.allowedBindings['template'] = true;
})();

ko.exportSymbol('setTemplateEngine', ko.setTemplateEngine);
ko.exportSymbol('renderTemplate', ko.renderTemplate);
// Go through the items that have been added and deleted and try to find matches between them.
ko.utils.findMovesInArrayComparison = function (left, right, limitFailedCompares) {
    if (left.length && right.length) {
        var failedCompares, l, r, leftItem, rightItem;
        for (failedCompares = l = 0; (!limitFailedCompares || failedCompares < limitFailedCompares) && (leftItem = left[l]); ++l) {
            for (r = 0; rightItem = right[r]; ++r) {
                if (leftItem['value'] === rightItem['value']) {
                    leftItem['moved'] = rightItem['index'];
                    rightItem['moved'] = leftItem['index'];
                    right.splice(r, 1);         // This item is marked as moved; so remove it from right list
                    failedCompares = r = 0;     // Reset failed compares count because we're checking for consecutive failures
                    break;
                }
            }
            failedCompares += r;
        }
    }
};

ko.utils.compareArrays = (function () {
    var statusNotInOld = 'added', statusNotInNew = 'deleted';

    // Simple calculation based on Levenshtein distance.
    function compareArrays(oldArray, newArray, options) {
        // For backward compatibility, if the third arg is actually a bool, interpret
        // it as the old parameter 'dontLimitMoves'. Newer code should use { dontLimitMoves: true }.
        options = (typeof options === 'boolean') ? { 'dontLimitMoves': options } : (options || {});
        oldArray = oldArray || [];
        newArray = newArray || [];

        if (oldArray.length < newArray.length)
            return compareSmallArrayToBigArray(oldArray, newArray, statusNotInOld, statusNotInNew, options);
        else
            return compareSmallArrayToBigArray(newArray, oldArray, statusNotInNew, statusNotInOld, options);
    }

    function compareSmallArrayToBigArray(smlArray, bigArray, statusNotInSml, statusNotInBig, options) {
        var myMin = Math.min,
            myMax = Math.max,
            editDistanceMatrix = [],
            smlIndex, smlIndexMax = smlArray.length,
            bigIndex, bigIndexMax = bigArray.length,
            compareRange = (bigIndexMax - smlIndexMax) || 1,
            maxDistance = smlIndexMax + bigIndexMax + 1,
            thisRow, lastRow,
            bigIndexMaxForRow, bigIndexMinForRow;

        for (smlIndex = 0; smlIndex <= smlIndexMax; smlIndex++) {
            lastRow = thisRow;
            editDistanceMatrix.push(thisRow = []);
            bigIndexMaxForRow = myMin(bigIndexMax, smlIndex + compareRange);
            bigIndexMinForRow = myMax(0, smlIndex - 1);
            for (bigIndex = bigIndexMinForRow; bigIndex <= bigIndexMaxForRow; bigIndex++) {
                if (!bigIndex)
                    thisRow[bigIndex] = smlIndex + 1;
                else if (!smlIndex)  // Top row - transform empty array into new array via additions
                    thisRow[bigIndex] = bigIndex + 1;
                else if (smlArray[smlIndex - 1] === bigArray[bigIndex - 1])
                    thisRow[bigIndex] = lastRow[bigIndex - 1];                  // copy value (no edit)
                else {
                    var northDistance = lastRow[bigIndex] || maxDistance;       // not in big (deletion)
                    var westDistance = thisRow[bigIndex - 1] || maxDistance;    // not in small (addition)
                    thisRow[bigIndex] = myMin(northDistance, westDistance) + 1;
                }
            }
        }

        var editScript = [], meMinusOne, notInSml = [], notInBig = [];
        for (smlIndex = smlIndexMax, bigIndex = bigIndexMax; smlIndex || bigIndex;) {
            meMinusOne = editDistanceMatrix[smlIndex][bigIndex] - 1;
            if (bigIndex && meMinusOne === editDistanceMatrix[smlIndex][bigIndex-1]) {
                notInSml.push(editScript[editScript.length] = {     // added
                    'status': statusNotInSml,
                    'value': bigArray[--bigIndex],
                    'index': bigIndex });
            } else if (smlIndex && meMinusOne === editDistanceMatrix[smlIndex - 1][bigIndex]) {
                notInBig.push(editScript[editScript.length] = {     // deleted
                    'status': statusNotInBig,
                    'value': smlArray[--smlIndex],
                    'index': smlIndex });
            } else {
                --bigIndex;
                --smlIndex;
                if (!options['sparse']) {
                    editScript.push({
                        'status': "retained",
                        'value': bigArray[bigIndex] });
                }
            }
        }

        // Set a limit on the number of consecutive non-matching comparisons; having it a multiple of
        // smlIndexMax keeps the time complexity of this algorithm linear.
        ko.utils.findMovesInArrayComparison(notInBig, notInSml, !options['dontLimitMoves'] && smlIndexMax * 10);

        return editScript.reverse();
    }

    return compareArrays;
})();

ko.exportSymbol('utils.compareArrays', ko.utils.compareArrays);
(function () {
    // Objective:
    // * Given an input array, a container DOM node, and a function from array elements to arrays of DOM nodes,
    //   map the array elements to arrays of DOM nodes, concatenate together all these arrays, and use them to populate the container DOM node
    // * Next time we're given the same combination of things (with the array possibly having mutated), update the container DOM node
    //   so that its children is again the concatenation of the mappings of the array elements, but don't re-map any array elements that we
    //   previously mapped - retain those nodes, and just insert/delete other ones

    // "callbackAfterAddingNodes" will be invoked after any "mapping"-generated nodes are inserted into the container node
    // You can use this, for example, to activate bindings on those nodes.

    function mapNodeAndRefreshWhenChanged(containerNode, mapping, valueToMap, callbackAfterAddingNodes, index) {
        // Map this array value inside a dependentObservable so we re-map when any dependency changes
        var mappedNodes = [];
        var dependentObservable = ko.dependentObservable(function() {
            var newMappedNodes = mapping(valueToMap, index, ko.utils.fixUpContinuousNodeArray(mappedNodes, containerNode)) || [];

            // On subsequent evaluations, just replace the previously-inserted DOM nodes
            if (mappedNodes.length > 0) {
                ko.utils.replaceDomNodes(mappedNodes, newMappedNodes);
                if (callbackAfterAddingNodes)
                    ko.dependencyDetection.ignore(callbackAfterAddingNodes, null, [valueToMap, newMappedNodes, index]);
            }

            // Replace the contents of the mappedNodes array, thereby updating the record
            // of which nodes would be deleted if valueToMap was itself later removed
            mappedNodes.length = 0;
            ko.utils.arrayPushAll(mappedNodes, newMappedNodes);
        }, null, { disposeWhenNodeIsRemoved: containerNode, disposeWhen: function() { return !ko.utils.anyDomNodeIsAttachedToDocument(mappedNodes); } });
        return { mappedNodes : mappedNodes, dependentObservable : (dependentObservable.isActive() ? dependentObservable : undefined) };
    }

    var lastMappingResultDomDataKey = ko.utils.domData.nextKey(),
        deletedItemDummyValue = ko.utils.domData.nextKey();

    ko.utils.setDomNodeChildrenFromArrayMapping = function (domNode, array, mapping, options, callbackAfterAddingNodes) {
        // Compare the provided array against the previous one
        array = array || [];
        options = options || {};
        var isFirstExecution = ko.utils.domData.get(domNode, lastMappingResultDomDataKey) === undefined;
        var lastMappingResult = ko.utils.domData.get(domNode, lastMappingResultDomDataKey) || [];
        var lastArray = ko.utils.arrayMap(lastMappingResult, function (x) { return x.arrayEntry; });
        var editScript = ko.utils.compareArrays(lastArray, array, options['dontLimitMoves']);

        // Build the new mapping result
        var newMappingResult = [];
        var lastMappingResultIndex = 0;
        var newMappingResultIndex = 0;

        var nodesToDelete = [];
        var itemsToProcess = [];
        var itemsForBeforeRemoveCallbacks = [];
        var itemsForMoveCallbacks = [];
        var itemsForAfterAddCallbacks = [];
        var mapData;

        function itemMovedOrRetained(editScriptIndex, oldPosition) {
            mapData = lastMappingResult[oldPosition];
            if (newMappingResultIndex !== oldPosition)
                itemsForMoveCallbacks[editScriptIndex] = mapData;
            // Since updating the index might change the nodes, do so before calling fixUpContinuousNodeArray
            mapData.indexObservable(newMappingResultIndex++);
            ko.utils.fixUpContinuousNodeArray(mapData.mappedNodes, domNode);
            newMappingResult.push(mapData);
            itemsToProcess.push(mapData);
        }

        function callCallback(callback, items) {
            if (callback) {
                for (var i = 0, n = items.length; i < n; i++) {
                    if (items[i]) {
                        ko.utils.arrayForEach(items[i].mappedNodes, function(node) {
                            callback(node, i, items[i].arrayEntry);
                        });
                    }
                }
            }
        }

        for (var i = 0, editScriptItem, movedIndex; editScriptItem = editScript[i]; i++) {
            movedIndex = editScriptItem['moved'];
            switch (editScriptItem['status']) {
                case "deleted":
                    if (movedIndex === undefined) {
                        mapData = lastMappingResult[lastMappingResultIndex];

                        // Stop tracking changes to the mapping for these nodes
                        if (mapData.dependentObservable) {
                            mapData.dependentObservable.dispose();
                            mapData.dependentObservable = undefined;
                        }

                        // Queue these nodes for later removal
                        if (ko.utils.fixUpContinuousNodeArray(mapData.mappedNodes, domNode).length) {
                            if (options['beforeRemove']) {
                                newMappingResult.push(mapData);
                                itemsToProcess.push(mapData);
                                if (mapData.arrayEntry === deletedItemDummyValue) {
                                    mapData = null;
                                } else {
                                    itemsForBeforeRemoveCallbacks[i] = mapData;
                                }
                            }
                            if (mapData) {
                                nodesToDelete.push.apply(nodesToDelete, mapData.mappedNodes);
                            }
                        }
                    }
                    lastMappingResultIndex++;
                    break;

                case "retained":
                    itemMovedOrRetained(i, lastMappingResultIndex++);
                    break;

                case "added":
                    if (movedIndex !== undefined) {
                        itemMovedOrRetained(i, movedIndex);
                    } else {
                        mapData = { arrayEntry: editScriptItem['value'], indexObservable: ko.observable(newMappingResultIndex++) };
                        newMappingResult.push(mapData);
                        itemsToProcess.push(mapData);
                        if (!isFirstExecution)
                            itemsForAfterAddCallbacks[i] = mapData;
                    }
                    break;
            }
        }

        // Store a copy of the array items we just considered so we can difference it next time
        ko.utils.domData.set(domNode, lastMappingResultDomDataKey, newMappingResult);

        // Call beforeMove first before any changes have been made to the DOM
        callCallback(options['beforeMove'], itemsForMoveCallbacks);

        // Next remove nodes for deleted items (or just clean if there's a beforeRemove callback)
        ko.utils.arrayForEach(nodesToDelete, options['beforeRemove'] ? ko.cleanNode : ko.removeNode);

        // Next add/reorder the remaining items (will include deleted items if there's a beforeRemove callback)
        for (var i = 0, nextNode = ko.virtualElements.firstChild(domNode), lastNode, node; mapData = itemsToProcess[i]; i++) {
            // Get nodes for newly added items
            if (!mapData.mappedNodes)
                ko.utils.extend(mapData, mapNodeAndRefreshWhenChanged(domNode, mapping, mapData.arrayEntry, callbackAfterAddingNodes, mapData.indexObservable));

            // Put nodes in the right place if they aren't there already
            for (var j = 0; node = mapData.mappedNodes[j]; nextNode = node.nextSibling, lastNode = node, j++) {
                if (node !== nextNode)
                    ko.virtualElements.insertAfter(domNode, node, lastNode);
            }

            // Run the callbacks for newly added nodes (for example, to apply bindings, etc.)
            if (!mapData.initialized && callbackAfterAddingNodes) {
                callbackAfterAddingNodes(mapData.arrayEntry, mapData.mappedNodes, mapData.indexObservable);
                mapData.initialized = true;
            }
        }

        // If there's a beforeRemove callback, call it after reordering.
        // Note that we assume that the beforeRemove callback will usually be used to remove the nodes using
        // some sort of animation, which is why we first reorder the nodes that will be removed. If the
        // callback instead removes the nodes right away, it would be more efficient to skip reordering them.
        // Perhaps we'll make that change in the future if this scenario becomes more common.
        callCallback(options['beforeRemove'], itemsForBeforeRemoveCallbacks);

        // Replace the stored values of deleted items with a dummy value. This provides two benefits: it marks this item
        // as already "removed" so we won't call beforeRemove for it again, and it ensures that the item won't match up
        // with an actual item in the array and appear as "retained" or "moved".
        for (i = 0; i < itemsForBeforeRemoveCallbacks.length; ++i) {
            if (itemsForBeforeRemoveCallbacks[i]) {
                itemsForBeforeRemoveCallbacks[i].arrayEntry = deletedItemDummyValue;
            }
        }

        // Finally call afterMove and afterAdd callbacks
        callCallback(options['afterMove'], itemsForMoveCallbacks);
        callCallback(options['afterAdd'], itemsForAfterAddCallbacks);
    }
})();

ko.exportSymbol('utils.setDomNodeChildrenFromArrayMapping', ko.utils.setDomNodeChildrenFromArrayMapping);
ko.nativeTemplateEngine = function () {
    this['allowTemplateRewriting'] = false;
}

ko.nativeTemplateEngine.prototype = new ko.templateEngine();
ko.nativeTemplateEngine.prototype.constructor = ko.nativeTemplateEngine;
ko.nativeTemplateEngine.prototype['renderTemplateSource'] = function (templateSource, bindingContext, options, templateDocument) {
    var useNodesIfAvailable = !(ko.utils.ieVersion < 9), // IE<9 cloneNode doesn't work properly
        templateNodesFunc = useNodesIfAvailable ? templateSource['nodes'] : null,
        templateNodes = templateNodesFunc ? templateSource['nodes']() : null;

    if (templateNodes) {
        return ko.utils.makeArray(templateNodes.cloneNode(true).childNodes);
    } else {
        var templateText = templateSource['text']();
        return ko.utils.parseHtmlFragment(templateText, templateDocument);
    }
};

ko.nativeTemplateEngine.instance = new ko.nativeTemplateEngine();
ko.setTemplateEngine(ko.nativeTemplateEngine.instance);

ko.exportSymbol('nativeTemplateEngine', ko.nativeTemplateEngine);
(function() {
    ko.jqueryTmplTemplateEngine = function () {
        // Detect which version of jquery-tmpl you're using. Unfortunately jquery-tmpl
        // doesn't expose a version number, so we have to infer it.
        // Note that as of Knockout 1.3, we only support jQuery.tmpl 1.0.0pre and later,
        // which KO internally refers to as version "2", so older versions are no longer detected.
        var jQueryTmplVersion = this.jQueryTmplVersion = (function() {
            if (!jQueryInstance || !(jQueryInstance['tmpl']))
                return 0;
            // Since it exposes no official version number, we use our own numbering system. To be updated as jquery-tmpl evolves.
            try {
                if (jQueryInstance['tmpl']['tag']['tmpl']['open'].toString().indexOf('__') >= 0) {
                    // Since 1.0.0pre, custom tags should append markup to an array called "__"
                    return 2; // Final version of jquery.tmpl
                }
            } catch(ex) { /* Apparently not the version we were looking for */ }

            return 1; // Any older version that we don't support
        })();

        function ensureHasReferencedJQueryTemplates() {
            if (jQueryTmplVersion < 2)
                throw new Error("Your version of jQuery.tmpl is too old. Please upgrade to jQuery.tmpl 1.0.0pre or later.");
        }

        function executeTemplate(compiledTemplate, data, jQueryTemplateOptions) {
            return jQueryInstance['tmpl'](compiledTemplate, data, jQueryTemplateOptions);
        }

        this['renderTemplateSource'] = function(templateSource, bindingContext, options, templateDocument) {
            templateDocument = templateDocument || document;
            options = options || {};
            ensureHasReferencedJQueryTemplates();

            // Ensure we have stored a precompiled version of this template (don't want to reparse on every render)
            var precompiled = templateSource['data']('precompiled');
            if (!precompiled) {
                var templateText = templateSource['text']() || "";
                // Wrap in "with($whatever.koBindingContext) { ... }"
                templateText = "{{ko_with $item.koBindingContext}}" + templateText + "{{/ko_with}}";

                precompiled = jQueryInstance['template'](null, templateText);
                templateSource['data']('precompiled', precompiled);
            }

            var data = [bindingContext['$data']]; // Prewrap the data in an array to stop jquery.tmpl from trying to unwrap any arrays
            var jQueryTemplateOptions = jQueryInstance['extend']({ 'koBindingContext': bindingContext }, options['templateOptions']);

            var resultNodes = executeTemplate(precompiled, data, jQueryTemplateOptions);
            resultNodes['appendTo'](templateDocument.createElement("div")); // Using "appendTo" forces jQuery/jQuery.tmpl to perform necessary cleanup work

            jQueryInstance['fragments'] = {}; // Clear jQuery's fragment cache to avoid a memory leak after a large number of template renders
            return resultNodes;
        };

        this['createJavaScriptEvaluatorBlock'] = function(script) {
            return "{{ko_code ((function() { return " + script + " })()) }}";
        };

        this['addTemplate'] = function(templateName, templateMarkup) {
            document.write("<script type='text/html' id='" + templateName + "'>" + templateMarkup + "<" + "/script>");
        };

        if (jQueryTmplVersion > 0) {
            jQueryInstance['tmpl']['tag']['ko_code'] = {
                open: "__.push($1 || '');"
            };
            jQueryInstance['tmpl']['tag']['ko_with'] = {
                open: "with($1) {",
                close: "} "
            };
        }
    };

    ko.jqueryTmplTemplateEngine.prototype = new ko.templateEngine();
    ko.jqueryTmplTemplateEngine.prototype.constructor = ko.jqueryTmplTemplateEngine;

    // Use this one by default *only if jquery.tmpl is referenced*
    var jqueryTmplTemplateEngineInstance = new ko.jqueryTmplTemplateEngine();
    if (jqueryTmplTemplateEngineInstance.jQueryTmplVersion > 0)
        ko.setTemplateEngine(jqueryTmplTemplateEngineInstance);

    ko.exportSymbol('jqueryTmplTemplateEngine', ko.jqueryTmplTemplateEngine);
})();
}));
}());
})();

},{}],112:[function(require,module,exports){
//! moment.js

;(function (global, factory) {
    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
    typeof define === 'function' && define.amd ? define(factory) :
    global.moment = factory()
}(this, (function () { 'use strict';

    var hookCallback;

    function hooks () {
        return hookCallback.apply(null, arguments);
    }

    // This is done to register the method called with moment()
    // without creating circular dependencies.
    function setHookCallback (callback) {
        hookCallback = callback;
    }

    function isArray(input) {
        return input instanceof Array || Object.prototype.toString.call(input) === '[object Array]';
    }

    function isObject(input) {
        // IE8 will treat undefined and null as object if it wasn't for
        // input != null
        return input != null && Object.prototype.toString.call(input) === '[object Object]';
    }

    function isObjectEmpty(obj) {
        if (Object.getOwnPropertyNames) {
            return (Object.getOwnPropertyNames(obj).length === 0);
        } else {
            var k;
            for (k in obj) {
                if (obj.hasOwnProperty(k)) {
                    return false;
                }
            }
            return true;
        }
    }

    function isUndefined(input) {
        return input === void 0;
    }

    function isNumber(input) {
        return typeof input === 'number' || Object.prototype.toString.call(input) === '[object Number]';
    }

    function isDate(input) {
        return input instanceof Date || Object.prototype.toString.call(input) === '[object Date]';
    }

    function map(arr, fn) {
        var res = [], i;
        for (i = 0; i < arr.length; ++i) {
            res.push(fn(arr[i], i));
        }
        return res;
    }

    function hasOwnProp(a, b) {
        return Object.prototype.hasOwnProperty.call(a, b);
    }

    function extend(a, b) {
        for (var i in b) {
            if (hasOwnProp(b, i)) {
                a[i] = b[i];
            }
        }

        if (hasOwnProp(b, 'toString')) {
            a.toString = b.toString;
        }

        if (hasOwnProp(b, 'valueOf')) {
            a.valueOf = b.valueOf;
        }

        return a;
    }

    function createUTC (input, format, locale, strict) {
        return createLocalOrUTC(input, format, locale, strict, true).utc();
    }

    function defaultParsingFlags() {
        // We need to deep clone this object.
        return {
            empty           : false,
            unusedTokens    : [],
            unusedInput     : [],
            overflow        : -2,
            charsLeftOver   : 0,
            nullInput       : false,
            invalidMonth    : null,
            invalidFormat   : false,
            userInvalidated : false,
            iso             : false,
            parsedDateParts : [],
            meridiem        : null,
            rfc2822         : false,
            weekdayMismatch : false
        };
    }

    function getParsingFlags(m) {
        if (m._pf == null) {
            m._pf = defaultParsingFlags();
        }
        return m._pf;
    }

    var some;
    if (Array.prototype.some) {
        some = Array.prototype.some;
    } else {
        some = function (fun) {
            var t = Object(this);
            var len = t.length >>> 0;

            for (var i = 0; i < len; i++) {
                if (i in t && fun.call(this, t[i], i, t)) {
                    return true;
                }
            }

            return false;
        };
    }

    function isValid(m) {
        if (m._isValid == null) {
            var flags = getParsingFlags(m);
            var parsedParts = some.call(flags.parsedDateParts, function (i) {
                return i != null;
            });
            var isNowValid = !isNaN(m._d.getTime()) &&
                flags.overflow < 0 &&
                !flags.empty &&
                !flags.invalidMonth &&
                !flags.invalidWeekday &&
                !flags.weekdayMismatch &&
                !flags.nullInput &&
                !flags.invalidFormat &&
                !flags.userInvalidated &&
                (!flags.meridiem || (flags.meridiem && parsedParts));

            if (m._strict) {
                isNowValid = isNowValid &&
                    flags.charsLeftOver === 0 &&
                    flags.unusedTokens.length === 0 &&
                    flags.bigHour === undefined;
            }

            if (Object.isFrozen == null || !Object.isFrozen(m)) {
                m._isValid = isNowValid;
            }
            else {
                return isNowValid;
            }
        }
        return m._isValid;
    }

    function createInvalid (flags) {
        var m = createUTC(NaN);
        if (flags != null) {
            extend(getParsingFlags(m), flags);
        }
        else {
            getParsingFlags(m).userInvalidated = true;
        }

        return m;
    }

    // Plugins that add properties should also add the key here (null value),
    // so we can properly clone ourselves.
    var momentProperties = hooks.momentProperties = [];

    function copyConfig(to, from) {
        var i, prop, val;

        if (!isUndefined(from._isAMomentObject)) {
            to._isAMomentObject = from._isAMomentObject;
        }
        if (!isUndefined(from._i)) {
            to._i = from._i;
        }
        if (!isUndefined(from._f)) {
            to._f = from._f;
        }
        if (!isUndefined(from._l)) {
            to._l = from._l;
        }
        if (!isUndefined(from._strict)) {
            to._strict = from._strict;
        }
        if (!isUndefined(from._tzm)) {
            to._tzm = from._tzm;
        }
        if (!isUndefined(from._isUTC)) {
            to._isUTC = from._isUTC;
        }
        if (!isUndefined(from._offset)) {
            to._offset = from._offset;
        }
        if (!isUndefined(from._pf)) {
            to._pf = getParsingFlags(from);
        }
        if (!isUndefined(from._locale)) {
            to._locale = from._locale;
        }

        if (momentProperties.length > 0) {
            for (i = 0; i < momentProperties.length; i++) {
                prop = momentProperties[i];
                val = from[prop];
                if (!isUndefined(val)) {
                    to[prop] = val;
                }
            }
        }

        return to;
    }

    var updateInProgress = false;

    // Moment prototype object
    function Moment(config) {
        copyConfig(this, config);
        this._d = new Date(config._d != null ? config._d.getTime() : NaN);
        if (!this.isValid()) {
            this._d = new Date(NaN);
        }
        // Prevent infinite loop in case updateOffset creates new moment
        // objects.
        if (updateInProgress === false) {
            updateInProgress = true;
            hooks.updateOffset(this);
            updateInProgress = false;
        }
    }

    function isMoment (obj) {
        return obj instanceof Moment || (obj != null && obj._isAMomentObject != null);
    }

    function absFloor (number) {
        if (number < 0) {
            // -0 -> 0
            return Math.ceil(number) || 0;
        } else {
            return Math.floor(number);
        }
    }

    function toInt(argumentForCoercion) {
        var coercedNumber = +argumentForCoercion,
            value = 0;

        if (coercedNumber !== 0 && isFinite(coercedNumber)) {
            value = absFloor(coercedNumber);
        }

        return value;
    }

    // compare two arrays, return the number of differences
    function compareArrays(array1, array2, dontConvert) {
        var len = Math.min(array1.length, array2.length),
            lengthDiff = Math.abs(array1.length - array2.length),
            diffs = 0,
            i;
        for (i = 0; i < len; i++) {
            if ((dontConvert && array1[i] !== array2[i]) ||
                (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) {
                diffs++;
            }
        }
        return diffs + lengthDiff;
    }

    function warn(msg) {
        if (hooks.suppressDeprecationWarnings === false &&
                (typeof console !==  'undefined') && console.warn) {
            console.warn('Deprecation warning: ' + msg);
        }
    }

    function deprecate(msg, fn) {
        var firstTime = true;

        return extend(function () {
            if (hooks.deprecationHandler != null) {
                hooks.deprecationHandler(null, msg);
            }
            if (firstTime) {
                var args = [];
                var arg;
                for (var i = 0; i < arguments.length; i++) {
                    arg = '';
                    if (typeof arguments[i] === 'object') {
                        arg += '\n[' + i + '] ';
                        for (var key in arguments[0]) {
                            arg += key + ': ' + arguments[0][key] + ', ';
                        }
                        arg = arg.slice(0, -2); // Remove trailing comma and space
                    } else {
                        arg = arguments[i];
                    }
                    args.push(arg);
                }
                warn(msg + '\nArguments: ' + Array.prototype.slice.call(args).join('') + '\n' + (new Error()).stack);
                firstTime = false;
            }
            return fn.apply(this, arguments);
        }, fn);
    }

    var deprecations = {};

    function deprecateSimple(name, msg) {
        if (hooks.deprecationHandler != null) {
            hooks.deprecationHandler(name, msg);
        }
        if (!deprecations[name]) {
            warn(msg);
            deprecations[name] = true;
        }
    }

    hooks.suppressDeprecationWarnings = false;
    hooks.deprecationHandler = null;

    function isFunction(input) {
        return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]';
    }

    function set (config) {
        var prop, i;
        for (i in config) {
            prop = config[i];
            if (isFunction(prop)) {
                this[i] = prop;
            } else {
                this['_' + i] = prop;
            }
        }
        this._config = config;
        // Lenient ordinal parsing accepts just a number in addition to
        // number + (possibly) stuff coming from _dayOfMonthOrdinalParse.
        // TODO: Remove "ordinalParse" fallback in next major release.
        this._dayOfMonthOrdinalParseLenient = new RegExp(
            (this._dayOfMonthOrdinalParse.source || this._ordinalParse.source) +
                '|' + (/\d{1,2}/).source);
    }

    function mergeConfigs(parentConfig, childConfig) {
        var res = extend({}, parentConfig), prop;
        for (prop in childConfig) {
            if (hasOwnProp(childConfig, prop)) {
                if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) {
                    res[prop] = {};
                    extend(res[prop], parentConfig[prop]);
                    extend(res[prop], childConfig[prop]);
                } else if (childConfig[prop] != null) {
                    res[prop] = childConfig[prop];
                } else {
                    delete res[prop];
                }
            }
        }
        for (prop in parentConfig) {
            if (hasOwnProp(parentConfig, prop) &&
                    !hasOwnProp(childConfig, prop) &&
                    isObject(parentConfig[prop])) {
                // make sure changes to properties don't modify parent config
                res[prop] = extend({}, res[prop]);
            }
        }
        return res;
    }

    function Locale(config) {
        if (config != null) {
            this.set(config);
        }
    }

    var keys;

    if (Object.keys) {
        keys = Object.keys;
    } else {
        keys = function (obj) {
            var i, res = [];
            for (i in obj) {
                if (hasOwnProp(obj, i)) {
                    res.push(i);
                }
            }
            return res;
        };
    }

    var defaultCalendar = {
        sameDay : '[Today at] LT',
        nextDay : '[Tomorrow at] LT',
        nextWeek : 'dddd [at] LT',
        lastDay : '[Yesterday at] LT',
        lastWeek : '[Last] dddd [at] LT',
        sameElse : 'L'
    };

    function calendar (key, mom, now) {
        var output = this._calendar[key] || this._calendar['sameElse'];
        return isFunction(output) ? output.call(mom, now) : output;
    }

    var defaultLongDateFormat = {
        LTS  : 'h:mm:ss A',
        LT   : 'h:mm A',
        L    : 'MM/DD/YYYY',
        LL   : 'MMMM D, YYYY',
        LLL  : 'MMMM D, YYYY h:mm A',
        LLLL : 'dddd, MMMM D, YYYY h:mm A'
    };

    function longDateFormat (key) {
        var format = this._longDateFormat[key],
            formatUpper = this._longDateFormat[key.toUpperCase()];

        if (format || !formatUpper) {
            return format;
        }

        this._longDateFormat[key] = formatUpper.replace(/MMMM|MM|DD|dddd/g, function (val) {
            return val.slice(1);
        });

        return this._longDateFormat[key];
    }

    var defaultInvalidDate = 'Invalid date';

    function invalidDate () {
        return this._invalidDate;
    }

    var defaultOrdinal = '%d';
    var defaultDayOfMonthOrdinalParse = /\d{1,2}/;

    function ordinal (number) {
        return this._ordinal.replace('%d', number);
    }

    var defaultRelativeTime = {
        future : 'in %s',
        past   : '%s ago',
        s  : 'a few seconds',
        ss : '%d seconds',
        m  : 'a minute',
        mm : '%d minutes',
        h  : 'an hour',
        hh : '%d hours',
        d  : 'a day',
        dd : '%d days',
        M  : 'a month',
        MM : '%d months',
        y  : 'a year',
        yy : '%d years'
    };

    function relativeTime (number, withoutSuffix, string, isFuture) {
        var output = this._relativeTime[string];
        return (isFunction(output)) ?
            output(number, withoutSuffix, string, isFuture) :
            output.replace(/%d/i, number);
    }

    function pastFuture (diff, output) {
        var format = this._relativeTime[diff > 0 ? 'future' : 'past'];
        return isFunction(format) ? format(output) : format.replace(/%s/i, output);
    }

    var aliases = {};

    function addUnitAlias (unit, shorthand) {
        var lowerCase = unit.toLowerCase();
        aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit;
    }

    function normalizeUnits(units) {
        return typeof units === 'string' ? aliases[units] || aliases[units.toLowerCase()] : undefined;
    }

    function normalizeObjectUnits(inputObject) {
        var normalizedInput = {},
            normalizedProp,
            prop;

        for (prop in inputObject) {
            if (hasOwnProp(inputObject, prop)) {
                normalizedProp = normalizeUnits(prop);
                if (normalizedProp) {
                    normalizedInput[normalizedProp] = inputObject[prop];
                }
            }
        }

        return normalizedInput;
    }

    var priorities = {};

    function addUnitPriority(unit, priority) {
        priorities[unit] = priority;
    }

    function getPrioritizedUnits(unitsObj) {
        var units = [];
        for (var u in unitsObj) {
            units.push({unit: u, priority: priorities[u]});
        }
        units.sort(function (a, b) {
            return a.priority - b.priority;
        });
        return units;
    }

    function zeroFill(number, targetLength, forceSign) {
        var absNumber = '' + Math.abs(number),
            zerosToFill = targetLength - absNumber.length,
            sign = number >= 0;
        return (sign ? (forceSign ? '+' : '') : '-') +
            Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber;
    }

    var formattingTokens = /(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g;

    var localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g;

    var formatFunctions = {};

    var formatTokenFunctions = {};

    // token:    'M'
    // padded:   ['MM', 2]
    // ordinal:  'Mo'
    // callback: function () { this.month() + 1 }
    function addFormatToken (token, padded, ordinal, callback) {
        var func = callback;
        if (typeof callback === 'string') {
            func = function () {
                return this[callback]();
            };
        }
        if (token) {
            formatTokenFunctions[token] = func;
        }
        if (padded) {
            formatTokenFunctions[padded[0]] = function () {
                return zeroFill(func.apply(this, arguments), padded[1], padded[2]);
            };
        }
        if (ordinal) {
            formatTokenFunctions[ordinal] = function () {
                return this.localeData().ordinal(func.apply(this, arguments), token);
            };
        }
    }

    function removeFormattingTokens(input) {
        if (input.match(/\[[\s\S]/)) {
            return input.replace(/^\[|\]$/g, '');
        }
        return input.replace(/\\/g, '');
    }

    function makeFormatFunction(format) {
        var array = format.match(formattingTokens), i, length;

        for (i = 0, length = array.length; i < length; i++) {
            if (formatTokenFunctions[array[i]]) {
                array[i] = formatTokenFunctions[array[i]];
            } else {
                array[i] = removeFormattingTokens(array[i]);
            }
        }

        return function (mom) {
            var output = '', i;
            for (i = 0; i < length; i++) {
                output += isFunction(array[i]) ? array[i].call(mom, format) : array[i];
            }
            return output;
        };
    }

    // format date using native date object
    function formatMoment(m, format) {
        if (!m.isValid()) {
            return m.localeData().invalidDate();
        }

        format = expandFormat(format, m.localeData());
        formatFunctions[format] = formatFunctions[format] || makeFormatFunction(format);

        return formatFunctions[format](m);
    }

    function expandFormat(format, locale) {
        var i = 5;

        function replaceLongDateFormatTokens(input) {
            return locale.longDateFormat(input) || input;
        }

        localFormattingTokens.lastIndex = 0;
        while (i >= 0 && localFormattingTokens.test(format)) {
            format = format.replace(localFormattingTokens, replaceLongDateFormatTokens);
            localFormattingTokens.lastIndex = 0;
            i -= 1;
        }

        return format;
    }

    var match1         = /\d/;            //       0 - 9
    var match2         = /\d\d/;          //      00 - 99
    var match3         = /\d{3}/;         //     000 - 999
    var match4         = /\d{4}/;         //    0000 - 9999
    var match6         = /[+-]?\d{6}/;    // -999999 - 999999
    var match1to2      = /\d\d?/;         //       0 - 99
    var match3to4      = /\d\d\d\d?/;     //     999 - 9999
    var match5to6      = /\d\d\d\d\d\d?/; //   99999 - 999999
    var match1to3      = /\d{1,3}/;       //       0 - 999
    var match1to4      = /\d{1,4}/;       //       0 - 9999
    var match1to6      = /[+-]?\d{1,6}/;  // -999999 - 999999

    var matchUnsigned  = /\d+/;           //       0 - inf
    var matchSigned    = /[+-]?\d+/;      //    -inf - inf

    var matchOffset    = /Z|[+-]\d\d:?\d\d/gi; // +00:00 -00:00 +0000 -0000 or Z
    var matchShortOffset = /Z|[+-]\d\d(?::?\d\d)?/gi; // +00 -00 +00:00 -00:00 +0000 -0000 or Z

    var matchTimestamp = /[+-]?\d+(\.\d{1,3})?/; // 123456789 123456789.123

    // any word (or two) characters or numbers including two/three word month in arabic.
    // includes scottish gaelic two word and hyphenated months
    var matchWord = /[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i;

    var regexes = {};

    function addRegexToken (token, regex, strictRegex) {
        regexes[token] = isFunction(regex) ? regex : function (isStrict, localeData) {
            return (isStrict && strictRegex) ? strictRegex : regex;
        };
    }

    function getParseRegexForToken (token, config) {
        if (!hasOwnProp(regexes, token)) {
            return new RegExp(unescapeFormat(token));
        }

        return regexes[token](config._strict, config._locale);
    }

    // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript
    function unescapeFormat(s) {
        return regexEscape(s.replace('\\', '').replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) {
            return p1 || p2 || p3 || p4;
        }));
    }

    function regexEscape(s) {
        return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
    }

    var tokens = {};

    function addParseToken (token, callback) {
        var i, func = callback;
        if (typeof token === 'string') {
            token = [token];
        }
        if (isNumber(callback)) {
            func = function (input, array) {
                array[callback] = toInt(input);
            };
        }
        for (i = 0; i < token.length; i++) {
            tokens[token[i]] = func;
        }
    }

    function addWeekParseToken (token, callback) {
        addParseToken(token, function (input, array, config, token) {
            config._w = config._w || {};
            callback(input, config._w, config, token);
        });
    }

    function addTimeToArrayFromToken(token, input, config) {
        if (input != null && hasOwnProp(tokens, token)) {
            tokens[token](input, config._a, config, token);
        }
    }

    var YEAR = 0;
    var MONTH = 1;
    var DATE = 2;
    var HOUR = 3;
    var MINUTE = 4;
    var SECOND = 5;
    var MILLISECOND = 6;
    var WEEK = 7;
    var WEEKDAY = 8;

    // FORMATTING

    addFormatToken('Y', 0, 0, function () {
        var y = this.year();
        return y <= 9999 ? '' + y : '+' + y;
    });

    addFormatToken(0, ['YY', 2], 0, function () {
        return this.year() % 100;
    });

    addFormatToken(0, ['YYYY',   4],       0, 'year');
    addFormatToken(0, ['YYYYY',  5],       0, 'year');
    addFormatToken(0, ['YYYYYY', 6, true], 0, 'year');

    // ALIASES

    addUnitAlias('year', 'y');

    // PRIORITIES

    addUnitPriority('year', 1);

    // PARSING

    addRegexToken('Y',      matchSigned);
    addRegexToken('YY',     match1to2, match2);
    addRegexToken('YYYY',   match1to4, match4);
    addRegexToken('YYYYY',  match1to6, match6);
    addRegexToken('YYYYYY', match1to6, match6);

    addParseToken(['YYYYY', 'YYYYYY'], YEAR);
    addParseToken('YYYY', function (input, array) {
        array[YEAR] = input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input);
    });
    addParseToken('YY', function (input, array) {
        array[YEAR] = hooks.parseTwoDigitYear(input);
    });
    addParseToken('Y', function (input, array) {
        array[YEAR] = parseInt(input, 10);
    });

    // HELPERS

    function daysInYear(year) {
        return isLeapYear(year) ? 366 : 365;
    }

    function isLeapYear(year) {
        return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
    }

    // HOOKS

    hooks.parseTwoDigitYear = function (input) {
        return toInt(input) + (toInt(input) > 68 ? 1900 : 2000);
    };

    // MOMENTS

    var getSetYear = makeGetSet('FullYear', true);

    function getIsLeapYear () {
        return isLeapYear(this.year());
    }

    function makeGetSet (unit, keepTime) {
        return function (value) {
            if (value != null) {
                set$1(this, unit, value);
                hooks.updateOffset(this, keepTime);
                return this;
            } else {
                return get(this, unit);
            }
        };
    }

    function get (mom, unit) {
        return mom.isValid() ?
            mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() : NaN;
    }

    function set$1 (mom, unit, value) {
        if (mom.isValid() && !isNaN(value)) {
            if (unit === 'FullYear' && isLeapYear(mom.year()) && mom.month() === 1 && mom.date() === 29) {
                mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value, mom.month(), daysInMonth(value, mom.month()));
            }
            else {
                mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value);
            }
        }
    }

    // MOMENTS

    function stringGet (units) {
        units = normalizeUnits(units);
        if (isFunction(this[units])) {
            return this[units]();
        }
        return this;
    }


    function stringSet (units, value) {
        if (typeof units === 'object') {
            units = normalizeObjectUnits(units);
            var prioritized = getPrioritizedUnits(units);
            for (var i = 0; i < prioritized.length; i++) {
                this[prioritized[i].unit](units[prioritized[i].unit]);
            }
        } else {
            units = normalizeUnits(units);
            if (isFunction(this[units])) {
                return this[units](value);
            }
        }
        return this;
    }

    function mod(n, x) {
        return ((n % x) + x) % x;
    }

    var indexOf;

    if (Array.prototype.indexOf) {
        indexOf = Array.prototype.indexOf;
    } else {
        indexOf = function (o) {
            // I know
            var i;
            for (i = 0; i < this.length; ++i) {
                if (this[i] === o) {
                    return i;
                }
            }
            return -1;
        };
    }

    function daysInMonth(year, month) {
        if (isNaN(year) || isNaN(month)) {
            return NaN;
        }
        var modMonth = mod(month, 12);
        year += (month - modMonth) / 12;
        return modMonth === 1 ? (isLeapYear(year) ? 29 : 28) : (31 - modMonth % 7 % 2);
    }

    // FORMATTING

    addFormatToken('M', ['MM', 2], 'Mo', function () {
        return this.month() + 1;
    });

    addFormatToken('MMM', 0, 0, function (format) {
        return this.localeData().monthsShort(this, format);
    });

    addFormatToken('MMMM', 0, 0, function (format) {
        return this.localeData().months(this, format);
    });

    // ALIASES

    addUnitAlias('month', 'M');

    // PRIORITY

    addUnitPriority('month', 8);

    // PARSING

    addRegexToken('M',    match1to2);
    addRegexToken('MM',   match1to2, match2);
    addRegexToken('MMM',  function (isStrict, locale) {
        return locale.monthsShortRegex(isStrict);
    });
    addRegexToken('MMMM', function (isStrict, locale) {
        return locale.monthsRegex(isStrict);
    });

    addParseToken(['M', 'MM'], function (input, array) {
        array[MONTH] = toInt(input) - 1;
    });

    addParseToken(['MMM', 'MMMM'], function (input, array, config, token) {
        var month = config._locale.monthsParse(input, token, config._strict);
        // if we didn't find a month name, mark the date as invalid.
        if (month != null) {
            array[MONTH] = month;
        } else {
            getParsingFlags(config).invalidMonth = input;
        }
    });

    // LOCALES

    var MONTHS_IN_FORMAT = /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/;
    var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_');
    function localeMonths (m, format) {
        if (!m) {
            return isArray(this._months) ? this._months :
                this._months['standalone'];
        }
        return isArray(this._months) ? this._months[m.month()] :
            this._months[(this._months.isFormat || MONTHS_IN_FORMAT).test(format) ? 'format' : 'standalone'][m.month()];
    }

    var defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_');
    function localeMonthsShort (m, format) {
        if (!m) {
            return isArray(this._monthsShort) ? this._monthsShort :
                this._monthsShort['standalone'];
        }
        return isArray(this._monthsShort) ? this._monthsShort[m.month()] :
            this._monthsShort[MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'][m.month()];
    }

    function handleStrictParse(monthName, format, strict) {
        var i, ii, mom, llc = monthName.toLocaleLowerCase();
        if (!this._monthsParse) {
            // this is not used
            this._monthsParse = [];
            this._longMonthsParse = [];
            this._shortMonthsParse = [];
            for (i = 0; i < 12; ++i) {
                mom = createUTC([2000, i]);
                this._shortMonthsParse[i] = this.monthsShort(mom, '').toLocaleLowerCase();
                this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase();
            }
        }

        if (strict) {
            if (format === 'MMM') {
                ii = indexOf.call(this._shortMonthsParse, llc);
                return ii !== -1 ? ii : null;
            } else {
                ii = indexOf.call(this._longMonthsParse, llc);
                return ii !== -1 ? ii : null;
            }
        } else {
            if (format === 'MMM') {
                ii = indexOf.call(this._shortMonthsParse, llc);
                if (ii !== -1) {
                    return ii;
                }
                ii = indexOf.call(this._longMonthsParse, llc);
                return ii !== -1 ? ii : null;
            } else {
                ii = indexOf.call(this._longMonthsParse, llc);
                if (ii !== -1) {
                    return ii;
                }
                ii = indexOf.call(this._shortMonthsParse, llc);
                return ii !== -1 ? ii : null;
            }
        }
    }

    function localeMonthsParse (monthName, format, strict) {
        var i, mom, regex;

        if (this._monthsParseExact) {
            return handleStrictParse.call(this, monthName, format, strict);
        }

        if (!this._monthsParse) {
            this._monthsParse = [];
            this._longMonthsParse = [];
            this._shortMonthsParse = [];
        }

        // TODO: add sorting
        // Sorting makes sure if one month (or abbr) is a prefix of another
        // see sorting in computeMonthsParse
        for (i = 0; i < 12; i++) {
            // make the regex if we don't have it already
            mom = createUTC([2000, i]);
            if (strict && !this._longMonthsParse[i]) {
                this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i');
                this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i');
            }
            if (!strict && !this._monthsParse[i]) {
                regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, '');
                this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i');
            }
            // test the regex
            if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) {
                return i;
            } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) {
                return i;
            } else if (!strict && this._monthsParse[i].test(monthName)) {
                return i;
            }
        }
    }

    // MOMENTS

    function setMonth (mom, value) {
        var dayOfMonth;

        if (!mom.isValid()) {
            // No op
            return mom;
        }

        if (typeof value === 'string') {
            if (/^\d+$/.test(value)) {
                value = toInt(value);
            } else {
                value = mom.localeData().monthsParse(value);
                // TODO: Another silent failure?
                if (!isNumber(value)) {
                    return mom;
                }
            }
        }

        dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value));
        mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth);
        return mom;
    }

    function getSetMonth (value) {
        if (value != null) {
            setMonth(this, value);
            hooks.updateOffset(this, true);
            return this;
        } else {
            return get(this, 'Month');
        }
    }

    function getDaysInMonth () {
        return daysInMonth(this.year(), this.month());
    }

    var defaultMonthsShortRegex = matchWord;
    function monthsShortRegex (isStrict) {
        if (this._monthsParseExact) {
            if (!hasOwnProp(this, '_monthsRegex')) {
                computeMonthsParse.call(this);
            }
            if (isStrict) {
                return this._monthsShortStrictRegex;
            } else {
                return this._monthsShortRegex;
            }
        } else {
            if (!hasOwnProp(this, '_monthsShortRegex')) {
                this._monthsShortRegex = defaultMonthsShortRegex;
            }
            return this._monthsShortStrictRegex && isStrict ?
                this._monthsShortStrictRegex : this._monthsShortRegex;
        }
    }

    var defaultMonthsRegex = matchWord;
    function monthsRegex (isStrict) {
        if (this._monthsParseExact) {
            if (!hasOwnProp(this, '_monthsRegex')) {
                computeMonthsParse.call(this);
            }
            if (isStrict) {
                return this._monthsStrictRegex;
            } else {
                return this._monthsRegex;
            }
        } else {
            if (!hasOwnProp(this, '_monthsRegex')) {
                this._monthsRegex = defaultMonthsRegex;
            }
            return this._monthsStrictRegex && isStrict ?
                this._monthsStrictRegex : this._monthsRegex;
        }
    }

    function computeMonthsParse () {
        function cmpLenRev(a, b) {
            return b.length - a.length;
        }

        var shortPieces = [], longPieces = [], mixedPieces = [],
            i, mom;
        for (i = 0; i < 12; i++) {
            // make the regex if we don't have it already
            mom = createUTC([2000, i]);
            shortPieces.push(this.monthsShort(mom, ''));
            longPieces.push(this.months(mom, ''));
            mixedPieces.push(this.months(mom, ''));
            mixedPieces.push(this.monthsShort(mom, ''));
        }
        // Sorting makes sure if one month (or abbr) is a prefix of another it
        // will match the longer piece.
        shortPieces.sort(cmpLenRev);
        longPieces.sort(cmpLenRev);
        mixedPieces.sort(cmpLenRev);
        for (i = 0; i < 12; i++) {
            shortPieces[i] = regexEscape(shortPieces[i]);
            longPieces[i] = regexEscape(longPieces[i]);
        }
        for (i = 0; i < 24; i++) {
            mixedPieces[i] = regexEscape(mixedPieces[i]);
        }

        this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');
        this._monthsShortRegex = this._monthsRegex;
        this._monthsStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i');
        this._monthsShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');
    }

    function createDate (y, m, d, h, M, s, ms) {
        // can't just apply() to create a date:
        // https://stackoverflow.com/q/181348
        var date = new Date(y, m, d, h, M, s, ms);

        // the date constructor remaps years 0-99 to 1900-1999
        if (y < 100 && y >= 0 && isFinite(date.getFullYear())) {
            date.setFullYear(y);
        }
        return date;
    }

    function createUTCDate (y) {
        var date = new Date(Date.UTC.apply(null, arguments));

        // the Date.UTC function remaps years 0-99 to 1900-1999
        if (y < 100 && y >= 0 && isFinite(date.getUTCFullYear())) {
            date.setUTCFullYear(y);
        }
        return date;
    }

    // start-of-first-week - start-of-year
    function firstWeekOffset(year, dow, doy) {
        var // first-week day -- which january is always in the first week (4 for iso, 1 for other)
            fwd = 7 + dow - doy,
            // first-week day local weekday -- which local weekday is fwd
            fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7;

        return -fwdlw + fwd - 1;
    }

    // https://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday
    function dayOfYearFromWeeks(year, week, weekday, dow, doy) {
        var localWeekday = (7 + weekday - dow) % 7,
            weekOffset = firstWeekOffset(year, dow, doy),
            dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset,
            resYear, resDayOfYear;

        if (dayOfYear <= 0) {
            resYear = year - 1;
            resDayOfYear = daysInYear(resYear) + dayOfYear;
        } else if (dayOfYear > daysInYear(year)) {
            resYear = year + 1;
            resDayOfYear = dayOfYear - daysInYear(year);
        } else {
            resYear = year;
            resDayOfYear = dayOfYear;
        }

        return {
            year: resYear,
            dayOfYear: resDayOfYear
        };
    }

    function weekOfYear(mom, dow, doy) {
        var weekOffset = firstWeekOffset(mom.year(), dow, doy),
            week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1,
            resWeek, resYear;

        if (week < 1) {
            resYear = mom.year() - 1;
            resWeek = week + weeksInYear(resYear, dow, doy);
        } else if (week > weeksInYear(mom.year(), dow, doy)) {
            resWeek = week - weeksInYear(mom.year(), dow, doy);
            resYear = mom.year() + 1;
        } else {
            resYear = mom.year();
            resWeek = week;
        }

        return {
            week: resWeek,
            year: resYear
        };
    }

    function weeksInYear(year, dow, doy) {
        var weekOffset = firstWeekOffset(year, dow, doy),
            weekOffsetNext = firstWeekOffset(year + 1, dow, doy);
        return (daysInYear(year) - weekOffset + weekOffsetNext) / 7;
    }

    // FORMATTING

    addFormatToken('w', ['ww', 2], 'wo', 'week');
    addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek');

    // ALIASES

    addUnitAlias('week', 'w');
    addUnitAlias('isoWeek', 'W');

    // PRIORITIES

    addUnitPriority('week', 5);
    addUnitPriority('isoWeek', 5);

    // PARSING

    addRegexToken('w',  match1to2);
    addRegexToken('ww', match1to2, match2);
    addRegexToken('W',  match1to2);
    addRegexToken('WW', match1to2, match2);

    addWeekParseToken(['w', 'ww', 'W', 'WW'], function (input, week, config, token) {
        week[token.substr(0, 1)] = toInt(input);
    });

    // HELPERS

    // LOCALES

    function localeWeek (mom) {
        return weekOfYear(mom, this._week.dow, this._week.doy).week;
    }

    var defaultLocaleWeek = {
        dow : 0, // Sunday is the first day of the week.
        doy : 6  // The week that contains Jan 1st is the first week of the year.
    };

    function localeFirstDayOfWeek () {
        return this._week.dow;
    }

    function localeFirstDayOfYear () {
        return this._week.doy;
    }

    // MOMENTS

    function getSetWeek (input) {
        var week = this.localeData().week(this);
        return input == null ? week : this.add((input - week) * 7, 'd');
    }

    function getSetISOWeek (input) {
        var week = weekOfYear(this, 1, 4).week;
        return input == null ? week : this.add((input - week) * 7, 'd');
    }

    // FORMATTING

    addFormatToken('d', 0, 'do', 'day');

    addFormatToken('dd', 0, 0, function (format) {
        return this.localeData().weekdaysMin(this, format);
    });

    addFormatToken('ddd', 0, 0, function (format) {
        return this.localeData().weekdaysShort(this, format);
    });

    addFormatToken('dddd', 0, 0, function (format) {
        return this.localeData().weekdays(this, format);
    });

    addFormatToken('e', 0, 0, 'weekday');
    addFormatToken('E', 0, 0, 'isoWeekday');

    // ALIASES

    addUnitAlias('day', 'd');
    addUnitAlias('weekday', 'e');
    addUnitAlias('isoWeekday', 'E');

    // PRIORITY
    addUnitPriority('day', 11);
    addUnitPriority('weekday', 11);
    addUnitPriority('isoWeekday', 11);

    // PARSING

    addRegexToken('d',    match1to2);
    addRegexToken('e',    match1to2);
    addRegexToken('E',    match1to2);
    addRegexToken('dd',   function (isStrict, locale) {
        return locale.weekdaysMinRegex(isStrict);
    });
    addRegexToken('ddd',   function (isStrict, locale) {
        return locale.weekdaysShortRegex(isStrict);
    });
    addRegexToken('dddd',   function (isStrict, locale) {
        return locale.weekdaysRegex(isStrict);
    });

    addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) {
        var weekday = config._locale.weekdaysParse(input, token, config._strict);
        // if we didn't get a weekday name, mark the date as invalid
        if (weekday != null) {
            week.d = weekday;
        } else {
            getParsingFlags(config).invalidWeekday = input;
        }
    });

    addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) {
        week[token] = toInt(input);
    });

    // HELPERS

    function parseWeekday(input, locale) {
        if (typeof input !== 'string') {
            return input;
        }

        if (!isNaN(input)) {
            return parseInt(input, 10);
        }

        input = locale.weekdaysParse(input);
        if (typeof input === 'number') {
            return input;
        }

        return null;
    }

    function parseIsoWeekday(input, locale) {
        if (typeof input === 'string') {
            return locale.weekdaysParse(input) % 7 || 7;
        }
        return isNaN(input) ? null : input;
    }

    // LOCALES

    var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_');
    function localeWeekdays (m, format) {
        if (!m) {
            return isArray(this._weekdays) ? this._weekdays :
                this._weekdays['standalone'];
        }
        return isArray(this._weekdays) ? this._weekdays[m.day()] :
            this._weekdays[this._weekdays.isFormat.test(format) ? 'format' : 'standalone'][m.day()];
    }

    var defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_');
    function localeWeekdaysShort (m) {
        return (m) ? this._weekdaysShort[m.day()] : this._weekdaysShort;
    }

    var defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_');
    function localeWeekdaysMin (m) {
        return (m) ? this._weekdaysMin[m.day()] : this._weekdaysMin;
    }

    function handleStrictParse$1(weekdayName, format, strict) {
        var i, ii, mom, llc = weekdayName.toLocaleLowerCase();
        if (!this._weekdaysParse) {
            this._weekdaysParse = [];
            this._shortWeekdaysParse = [];
            this._minWeekdaysParse = [];

            for (i = 0; i < 7; ++i) {
                mom = createUTC([2000, 1]).day(i);
                this._minWeekdaysParse[i] = this.weekdaysMin(mom, '').toLocaleLowerCase();
                this._shortWeekdaysParse[i] = this.weekdaysShort(mom, '').toLocaleLowerCase();
                this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase();
            }
        }

        if (strict) {
            if (format === 'dddd') {
                ii = indexOf.call(this._weekdaysParse, llc);
                return ii !== -1 ? ii : null;
            } else if (format === 'ddd') {
                ii = indexOf.call(this._shortWeekdaysParse, llc);
                return ii !== -1 ? ii : null;
            } else {
                ii = indexOf.call(this._minWeekdaysParse, llc);
                return ii !== -1 ? ii : null;
            }
        } else {
            if (format === 'dddd') {
                ii = indexOf.call(this._weekdaysParse, llc);
                if (ii !== -1) {
                    return ii;
                }
                ii = indexOf.call(this._shortWeekdaysParse, llc);
                if (ii !== -1) {
                    return ii;
                }
                ii = indexOf.call(this._minWeekdaysParse, llc);
                return ii !== -1 ? ii : null;
            } else if (format === 'ddd') {
                ii = indexOf.call(this._shortWeekdaysParse, llc);
                if (ii !== -1) {
                    return ii;
                }
                ii = indexOf.call(this._weekdaysParse, llc);
                if (ii !== -1) {
                    return ii;
                }
                ii = indexOf.call(this._minWeekdaysParse, llc);
                return ii !== -1 ? ii : null;
            } else {
                ii = indexOf.call(this._minWeekdaysParse, llc);
                if (ii !== -1) {
                    return ii;
                }
                ii = indexOf.call(this._weekdaysParse, llc);
                if (ii !== -1) {
                    return ii;
                }
                ii = indexOf.call(this._shortWeekdaysParse, llc);
                return ii !== -1 ? ii : null;
            }
        }
    }

    function localeWeekdaysParse (weekdayName, format, strict) {
        var i, mom, regex;

        if (this._weekdaysParseExact) {
            return handleStrictParse$1.call(this, weekdayName, format, strict);
        }

        if (!this._weekdaysParse) {
            this._weekdaysParse = [];
            this._minWeekdaysParse = [];
            this._shortWeekdaysParse = [];
            this._fullWeekdaysParse = [];
        }

        for (i = 0; i < 7; i++) {
            // make the regex if we don't have it already

            mom = createUTC([2000, 1]).day(i);
            if (strict && !this._fullWeekdaysParse[i]) {
                this._fullWeekdaysParse[i] = new RegExp('^' + this.weekdays(mom, '').replace('.', '\\.?') + '$', 'i');
                this._shortWeekdaysParse[i] = new RegExp('^' + this.weekdaysShort(mom, '').replace('.', '\\.?') + '$', 'i');
                this._minWeekdaysParse[i] = new RegExp('^' + this.weekdaysMin(mom, '').replace('.', '\\.?') + '$', 'i');
            }
            if (!this._weekdaysParse[i]) {
                regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, '');
                this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i');
            }
            // test the regex
            if (strict && format === 'dddd' && this._fullWeekdaysParse[i].test(weekdayName)) {
                return i;
            } else if (strict && format === 'ddd' && this._shortWeekdaysParse[i].test(weekdayName)) {
                return i;
            } else if (strict && format === 'dd' && this._minWeekdaysParse[i].test(weekdayName)) {
                return i;
            } else if (!strict && this._weekdaysParse[i].test(weekdayName)) {
                return i;
            }
        }
    }

    // MOMENTS

    function getSetDayOfWeek (input) {
        if (!this.isValid()) {
            return input != null ? this : NaN;
        }
        var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay();
        if (input != null) {
            input = parseWeekday(input, this.localeData());
            return this.add(input - day, 'd');
        } else {
            return day;
        }
    }

    function getSetLocaleDayOfWeek (input) {
        if (!this.isValid()) {
            return input != null ? this : NaN;
        }
        var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7;
        return input == null ? weekday : this.add(input - weekday, 'd');
    }

    function getSetISODayOfWeek (input) {
        if (!this.isValid()) {
            return input != null ? this : NaN;
        }

        // behaves the same as moment#day except
        // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6)
        // as a setter, sunday should belong to the previous week.

        if (input != null) {
            var weekday = parseIsoWeekday(input, this.localeData());
            return this.day(this.day() % 7 ? weekday : weekday - 7);
        } else {
            return this.day() || 7;
        }
    }

    var defaultWeekdaysRegex = matchWord;
    function weekdaysRegex (isStrict) {
        if (this._weekdaysParseExact) {
            if (!hasOwnProp(this, '_weekdaysRegex')) {
                computeWeekdaysParse.call(this);
            }
            if (isStrict) {
                return this._weekdaysStrictRegex;
            } else {
                return this._weekdaysRegex;
            }
        } else {
            if (!hasOwnProp(this, '_weekdaysRegex')) {
                this._weekdaysRegex = defaultWeekdaysRegex;
            }
            return this._weekdaysStrictRegex && isStrict ?
                this._weekdaysStrictRegex : this._weekdaysRegex;
        }
    }

    var defaultWeekdaysShortRegex = matchWord;
    function weekdaysShortRegex (isStrict) {
        if (this._weekdaysParseExact) {
            if (!hasOwnProp(this, '_weekdaysRegex')) {
                computeWeekdaysParse.call(this);
            }
            if (isStrict) {
                return this._weekdaysShortStrictRegex;
            } else {
                return this._weekdaysShortRegex;
            }
        } else {
            if (!hasOwnProp(this, '_weekdaysShortRegex')) {
                this._weekdaysShortRegex = defaultWeekdaysShortRegex;
            }
            return this._weekdaysShortStrictRegex && isStrict ?
                this._weekdaysShortStrictRegex : this._weekdaysShortRegex;
        }
    }

    var defaultWeekdaysMinRegex = matchWord;
    function weekdaysMinRegex (isStrict) {
        if (this._weekdaysParseExact) {
            if (!hasOwnProp(this, '_weekdaysRegex')) {
                computeWeekdaysParse.call(this);
            }
            if (isStrict) {
                return this._weekdaysMinStrictRegex;
            } else {
                return this._weekdaysMinRegex;
            }
        } else {
            if (!hasOwnProp(this, '_weekdaysMinRegex')) {
                this._weekdaysMinRegex = defaultWeekdaysMinRegex;
            }
            return this._weekdaysMinStrictRegex && isStrict ?
                this._weekdaysMinStrictRegex : this._weekdaysMinRegex;
        }
    }


    function computeWeekdaysParse () {
        function cmpLenRev(a, b) {
            return b.length - a.length;
        }

        var minPieces = [], shortPieces = [], longPieces = [], mixedPieces = [],
            i, mom, minp, shortp, longp;
        for (i = 0; i < 7; i++) {
            // make the regex if we don't have it already
            mom = createUTC([2000, 1]).day(i);
            minp = this.weekdaysMin(mom, '');
            shortp = this.weekdaysShort(mom, '');
            longp = this.weekdays(mom, '');
            minPieces.push(minp);
            shortPieces.push(shortp);
            longPieces.push(longp);
            mixedPieces.push(minp);
            mixedPieces.push(shortp);
            mixedPieces.push(longp);
        }
        // Sorting makes sure if one weekday (or abbr) is a prefix of another it
        // will match the longer piece.
        minPieces.sort(cmpLenRev);
        shortPieces.sort(cmpLenRev);
        longPieces.sort(cmpLenRev);
        mixedPieces.sort(cmpLenRev);
        for (i = 0; i < 7; i++) {
            shortPieces[i] = regexEscape(shortPieces[i]);
            longPieces[i] = regexEscape(longPieces[i]);
            mixedPieces[i] = regexEscape(mixedPieces[i]);
        }

        this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');
        this._weekdaysShortRegex = this._weekdaysRegex;
        this._weekdaysMinRegex = this._weekdaysRegex;

        this._weekdaysStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i');
        this._weekdaysShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');
        this._weekdaysMinStrictRegex = new RegExp('^(' + minPieces.join('|') + ')', 'i');
    }

    // FORMATTING

    function hFormat() {
        return this.hours() % 12 || 12;
    }

    function kFormat() {
        return this.hours() || 24;
    }

    addFormatToken('H', ['HH', 2], 0, 'hour');
    addFormatToken('h', ['hh', 2], 0, hFormat);
    addFormatToken('k', ['kk', 2], 0, kFormat);

    addFormatToken('hmm', 0, 0, function () {
        return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2);
    });

    addFormatToken('hmmss', 0, 0, function () {
        return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2) +
            zeroFill(this.seconds(), 2);
    });

    addFormatToken('Hmm', 0, 0, function () {
        return '' + this.hours() + zeroFill(this.minutes(), 2);
    });

    addFormatToken('Hmmss', 0, 0, function () {
        return '' + this.hours() + zeroFill(this.minutes(), 2) +
            zeroFill(this.seconds(), 2);
    });

    function meridiem (token, lowercase) {
        addFormatToken(token, 0, 0, function () {
            return this.localeData().meridiem(this.hours(), this.minutes(), lowercase);
        });
    }

    meridiem('a', true);
    meridiem('A', false);

    // ALIASES

    addUnitAlias('hour', 'h');

    // PRIORITY
    addUnitPriority('hour', 13);

    // PARSING

    function matchMeridiem (isStrict, locale) {
        return locale._meridiemParse;
    }

    addRegexToken('a',  matchMeridiem);
    addRegexToken('A',  matchMeridiem);
    addRegexToken('H',  match1to2);
    addRegexToken('h',  match1to2);
    addRegexToken('k',  match1to2);
    addRegexToken('HH', match1to2, match2);
    addRegexToken('hh', match1to2, match2);
    addRegexToken('kk', match1to2, match2);

    addRegexToken('hmm', match3to4);
    addRegexToken('hmmss', match5to6);
    addRegexToken('Hmm', match3to4);
    addRegexToken('Hmmss', match5to6);

    addParseToken(['H', 'HH'], HOUR);
    addParseToken(['k', 'kk'], function (input, array, config) {
        var kInput = toInt(input);
        array[HOUR] = kInput === 24 ? 0 : kInput;
    });
    addParseToken(['a', 'A'], function (input, array, config) {
        config._isPm = config._locale.isPM(input);
        config._meridiem = input;
    });
    addParseToken(['h', 'hh'], function (input, array, config) {
        array[HOUR] = toInt(input);
        getParsingFlags(config).bigHour = true;
    });
    addParseToken('hmm', function (input, array, config) {
        var pos = input.length - 2;
        array[HOUR] = toInt(input.substr(0, pos));
        array[MINUTE] = toInt(input.substr(pos));
        getParsingFlags(config).bigHour = true;
    });
    addParseToken('hmmss', function (input, array, config) {
        var pos1 = input.length - 4;
        var pos2 = input.length - 2;
        array[HOUR] = toInt(input.substr(0, pos1));
        array[MINUTE] = toInt(input.substr(pos1, 2));
        array[SECOND] = toInt(input.substr(pos2));
        getParsingFlags(config).bigHour = true;
    });
    addParseToken('Hmm', function (input, array, config) {
        var pos = input.length - 2;
        array[HOUR] = toInt(input.substr(0, pos));
        array[MINUTE] = toInt(input.substr(pos));
    });
    addParseToken('Hmmss', function (input, array, config) {
        var pos1 = input.length - 4;
        var pos2 = input.length - 2;
        array[HOUR] = toInt(input.substr(0, pos1));
        array[MINUTE] = toInt(input.substr(pos1, 2));
        array[SECOND] = toInt(input.substr(pos2));
    });

    // LOCALES

    function localeIsPM (input) {
        // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays
        // Using charAt should be more compatible.
        return ((input + '').toLowerCase().charAt(0) === 'p');
    }

    var defaultLocaleMeridiemParse = /[ap]\.?m?\.?/i;
    function localeMeridiem (hours, minutes, isLower) {
        if (hours > 11) {
            return isLower ? 'pm' : 'PM';
        } else {
            return isLower ? 'am' : 'AM';
        }
    }


    // MOMENTS

    // Setting the hour should keep the time, because the user explicitly
    // specified which hour they want. So trying to maintain the same hour (in
    // a new timezone) makes sense. Adding/subtracting hours does not follow
    // this rule.
    var getSetHour = makeGetSet('Hours', true);

    var baseConfig = {
        calendar: defaultCalendar,
        longDateFormat: defaultLongDateFormat,
        invalidDate: defaultInvalidDate,
        ordinal: defaultOrdinal,
        dayOfMonthOrdinalParse: defaultDayOfMonthOrdinalParse,
        relativeTime: defaultRelativeTime,

        months: defaultLocaleMonths,
        monthsShort: defaultLocaleMonthsShort,

        week: defaultLocaleWeek,

        weekdays: defaultLocaleWeekdays,
        weekdaysMin: defaultLocaleWeekdaysMin,
        weekdaysShort: defaultLocaleWeekdaysShort,

        meridiemParse: defaultLocaleMeridiemParse
    };

    // internal storage for locale config files
    var locales = {};
    var localeFamilies = {};
    var globalLocale;

    function normalizeLocale(key) {
        return key ? key.toLowerCase().replace('_', '-') : key;
    }

    // pick the locale from the array
    // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each
    // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root
    function chooseLocale(names) {
        var i = 0, j, next, locale, split;

        while (i < names.length) {
            split = normalizeLocale(names[i]).split('-');
            j = split.length;
            next = normalizeLocale(names[i + 1]);
            next = next ? next.split('-') : null;
            while (j > 0) {
                locale = loadLocale(split.slice(0, j).join('-'));
                if (locale) {
                    return locale;
                }
                if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) {
                    //the next array item is better than a shallower substring of this one
                    break;
                }
                j--;
            }
            i++;
        }
        return globalLocale;
    }

    function loadLocale(name) {
        var oldLocale = null;
        // TODO: Find a better way to register and load all the locales in Node
        if (!locales[name] && (typeof module !== 'undefined') &&
                module && module.exports) {
            try {
                oldLocale = globalLocale._abbr;
                var aliasedRequire = require;
                aliasedRequire('./locale/' + name);
                getSetGlobalLocale(oldLocale);
            } catch (e) {}
        }
        return locales[name];
    }

    // This function will load locale and then set the global locale.  If
    // no arguments are passed in, it will simply return the current global
    // locale key.
    function getSetGlobalLocale (key, values) {
        var data;
        if (key) {
            if (isUndefined(values)) {
                data = getLocale(key);
            }
            else {
                data = defineLocale(key, values);
            }

            if (data) {
                // moment.duration._locale = moment._locale = data;
                globalLocale = data;
            }
            else {
                if ((typeof console !==  'undefined') && console.warn) {
                    //warn user if arguments are passed but the locale could not be set
                    console.warn('Locale ' + key +  ' not found. Did you forget to load it?');
                }
            }
        }

        return globalLocale._abbr;
    }

    function defineLocale (name, config) {
        if (config !== null) {
            var locale, parentConfig = baseConfig;
            config.abbr = name;
            if (locales[name] != null) {
                deprecateSimple('defineLocaleOverride',
                        'use moment.updateLocale(localeName, config) to change ' +
                        'an existing locale. moment.defineLocale(localeName, ' +
                        'config) should only be used for creating a new locale ' +
                        'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.');
                parentConfig = locales[name]._config;
            } else if (config.parentLocale != null) {
                if (locales[config.parentLocale] != null) {
                    parentConfig = locales[config.parentLocale]._config;
                } else {
                    locale = loadLocale(config.parentLocale);
                    if (locale != null) {
                        parentConfig = locale._config;
                    } else {
                        if (!localeFamilies[config.parentLocale]) {
                            localeFamilies[config.parentLocale] = [];
                        }
                        localeFamilies[config.parentLocale].push({
                            name: name,
                            config: config
                        });
                        return null;
                    }
                }
            }
            locales[name] = new Locale(mergeConfigs(parentConfig, config));

            if (localeFamilies[name]) {
                localeFamilies[name].forEach(function (x) {
                    defineLocale(x.name, x.config);
                });
            }

            // backwards compat for now: also set the locale
            // make sure we set the locale AFTER all child locales have been
            // created, so we won't end up with the child locale set.
            getSetGlobalLocale(name);


            return locales[name];
        } else {
            // useful for testing
            delete locales[name];
            return null;
        }
    }

    function updateLocale(name, config) {
        if (config != null) {
            var locale, tmpLocale, parentConfig = baseConfig;
            // MERGE
            tmpLocale = loadLocale(name);
            if (tmpLocale != null) {
                parentConfig = tmpLocale._config;
            }
            config = mergeConfigs(parentConfig, config);
            locale = new Locale(config);
            locale.parentLocale = locales[name];
            locales[name] = locale;

            // backwards compat for now: also set the locale
            getSetGlobalLocale(name);
        } else {
            // pass null for config to unupdate, useful for tests
            if (locales[name] != null) {
                if (locales[name].parentLocale != null) {
                    locales[name] = locales[name].parentLocale;
                } else if (locales[name] != null) {
                    delete locales[name];
                }
            }
        }
        return locales[name];
    }

    // returns locale data
    function getLocale (key) {
        var locale;

        if (key && key._locale && key._locale._abbr) {
            key = key._locale._abbr;
        }

        if (!key) {
            return globalLocale;
        }

        if (!isArray(key)) {
            //short-circuit everything else
            locale = loadLocale(key);
            if (locale) {
                return locale;
            }
            key = [key];
        }

        return chooseLocale(key);
    }

    function listLocales() {
        return keys(locales);
    }

    function checkOverflow (m) {
        var overflow;
        var a = m._a;

        if (a && getParsingFlags(m).overflow === -2) {
            overflow =
                a[MONTH]       < 0 || a[MONTH]       > 11  ? MONTH :
                a[DATE]        < 1 || a[DATE]        > daysInMonth(a[YEAR], a[MONTH]) ? DATE :
                a[HOUR]        < 0 || a[HOUR]        > 24 || (a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0)) ? HOUR :
                a[MINUTE]      < 0 || a[MINUTE]      > 59  ? MINUTE :
                a[SECOND]      < 0 || a[SECOND]      > 59  ? SECOND :
                a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND :
                -1;

            if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) {
                overflow = DATE;
            }
            if (getParsingFlags(m)._overflowWeeks && overflow === -1) {
                overflow = WEEK;
            }
            if (getParsingFlags(m)._overflowWeekday && overflow === -1) {
                overflow = WEEKDAY;
            }

            getParsingFlags(m).overflow = overflow;
        }

        return m;
    }

    // Pick the first defined of two or three arguments.
    function defaults(a, b, c) {
        if (a != null) {
            return a;
        }
        if (b != null) {
            return b;
        }
        return c;
    }

    function currentDateArray(config) {
        // hooks is actually the exported moment object
        var nowValue = new Date(hooks.now());
        if (config._useUTC) {
            return [nowValue.getUTCFullYear(), nowValue.getUTCMonth(), nowValue.getUTCDate()];
        }
        return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()];
    }

    // convert an array to a date.
    // the array should mirror the parameters below
    // note: all values past the year are optional and will default to the lowest possible value.
    // [year, month, day , hour, minute, second, millisecond]
    function configFromArray (config) {
        var i, date, input = [], currentDate, expectedWeekday, yearToUse;

        if (config._d) {
            return;
        }

        currentDate = currentDateArray(config);

        //compute day of the year from weeks and weekdays
        if (config._w && config._a[DATE] == null && config._a[MONTH] == null) {
            dayOfYearFromWeekInfo(config);
        }

        //if the day of the year is set, figure out what it is
        if (config._dayOfYear != null) {
            yearToUse = defaults(config._a[YEAR], currentDate[YEAR]);

            if (config._dayOfYear > daysInYear(yearToUse) || config._dayOfYear === 0) {
                getParsingFlags(config)._overflowDayOfYear = true;
            }

            date = createUTCDate(yearToUse, 0, config._dayOfYear);
            config._a[MONTH] = date.getUTCMonth();
            config._a[DATE] = date.getUTCDate();
        }

        // Default to current date.
        // * if no year, month, day of month are given, default to today
        // * if day of month is given, default month and year
        // * if month is given, default only year
        // * if year is given, don't default anything
        for (i = 0; i < 3 && config._a[i] == null; ++i) {
            config._a[i] = input[i] = currentDate[i];
        }

        // Zero out whatever was not defaulted, including time
        for (; i < 7; i++) {
            config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i];
        }

        // Check for 24:00:00.000
        if (config._a[HOUR] === 24 &&
                config._a[MINUTE] === 0 &&
                config._a[SECOND] === 0 &&
                config._a[MILLISECOND] === 0) {
            config._nextDay = true;
            config._a[HOUR] = 0;
        }

        config._d = (config._useUTC ? createUTCDate : createDate).apply(null, input);
        expectedWeekday = config._useUTC ? config._d.getUTCDay() : config._d.getDay();

        // Apply timezone offset from input. The actual utcOffset can be changed
        // with parseZone.
        if (config._tzm != null) {
            config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);
        }

        if (config._nextDay) {
            config._a[HOUR] = 24;
        }

        // check for mismatching day of week
        if (config._w && typeof config._w.d !== 'undefined' && config._w.d !== expectedWeekday) {
            getParsingFlags(config).weekdayMismatch = true;
        }
    }

    function dayOfYearFromWeekInfo(config) {
        var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow;

        w = config._w;
        if (w.GG != null || w.W != null || w.E != null) {
            dow = 1;
            doy = 4;

            // TODO: We need to take the current isoWeekYear, but that depends on
            // how we interpret now (local, utc, fixed offset). So create
            // a now version of current config (take local/utc/offset flags, and
            // create now).
            weekYear = defaults(w.GG, config._a[YEAR], weekOfYear(createLocal(), 1, 4).year);
            week = defaults(w.W, 1);
            weekday = defaults(w.E, 1);
            if (weekday < 1 || weekday > 7) {
                weekdayOverflow = true;
            }
        } else {
            dow = config._locale._week.dow;
            doy = config._locale._week.doy;

            var curWeek = weekOfYear(createLocal(), dow, doy);

            weekYear = defaults(w.gg, config._a[YEAR], curWeek.year);

            // Default to current week.
            week = defaults(w.w, curWeek.week);

            if (w.d != null) {
                // weekday -- low day numbers are considered next week
                weekday = w.d;
                if (weekday < 0 || weekday > 6) {
                    weekdayOverflow = true;
                }
            } else if (w.e != null) {
                // local weekday -- counting starts from begining of week
                weekday = w.e + dow;
                if (w.e < 0 || w.e > 6) {
                    weekdayOverflow = true;
                }
            } else {
                // default to begining of week
                weekday = dow;
            }
        }
        if (week < 1 || week > weeksInYear(weekYear, dow, doy)) {
            getParsingFlags(config)._overflowWeeks = true;
        } else if (weekdayOverflow != null) {
            getParsingFlags(config)._overflowWeekday = true;
        } else {
            temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy);
            config._a[YEAR] = temp.year;
            config._dayOfYear = temp.dayOfYear;
        }
    }

    // iso 8601 regex
    // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00)
    var extendedIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/;
    var basicIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/;

    var tzRegex = /Z|[+-]\d\d(?::?\d\d)?/;

    var isoDates = [
        ['YYYYYY-MM-DD', /[+-]\d{6}-\d\d-\d\d/],
        ['YYYY-MM-DD', /\d{4}-\d\d-\d\d/],
        ['GGGG-[W]WW-E', /\d{4}-W\d\d-\d/],
        ['GGGG-[W]WW', /\d{4}-W\d\d/, false],
        ['YYYY-DDD', /\d{4}-\d{3}/],
        ['YYYY-MM', /\d{4}-\d\d/, false],
        ['YYYYYYMMDD', /[+-]\d{10}/],
        ['YYYYMMDD', /\d{8}/],
        // YYYYMM is NOT allowed by the standard
        ['GGGG[W]WWE', /\d{4}W\d{3}/],
        ['GGGG[W]WW', /\d{4}W\d{2}/, false],
        ['YYYYDDD', /\d{7}/]
    ];

    // iso time formats and regexes
    var isoTimes = [
        ['HH:mm:ss.SSSS', /\d\d:\d\d:\d\d\.\d+/],
        ['HH:mm:ss,SSSS', /\d\d:\d\d:\d\d,\d+/],
        ['HH:mm:ss', /\d\d:\d\d:\d\d/],
        ['HH:mm', /\d\d:\d\d/],
        ['HHmmss.SSSS', /\d\d\d\d\d\d\.\d+/],
        ['HHmmss,SSSS', /\d\d\d\d\d\d,\d+/],
        ['HHmmss', /\d\d\d\d\d\d/],
        ['HHmm', /\d\d\d\d/],
        ['HH', /\d\d/]
    ];

    var aspNetJsonRegex = /^\/?Date\((\-?\d+)/i;

    // date from iso format
    function configFromISO(config) {
        var i, l,
            string = config._i,
            match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string),
            allowTime, dateFormat, timeFormat, tzFormat;

        if (match) {
            getParsingFlags(config).iso = true;

            for (i = 0, l = isoDates.length; i < l; i++) {
                if (isoDates[i][1].exec(match[1])) {
                    dateFormat = isoDates[i][0];
                    allowTime = isoDates[i][2] !== false;
                    break;
                }
            }
            if (dateFormat == null) {
                config._isValid = false;
                return;
            }
            if (match[3]) {
                for (i = 0, l = isoTimes.length; i < l; i++) {
                    if (isoTimes[i][1].exec(match[3])) {
                        // match[2] should be 'T' or space
                        timeFormat = (match[2] || ' ') + isoTimes[i][0];
                        break;
                    }
                }
                if (timeFormat == null) {
                    config._isValid = false;
                    return;
                }
            }
            if (!allowTime && timeFormat != null) {
                config._isValid = false;
                return;
            }
            if (match[4]) {
                if (tzRegex.exec(match[4])) {
                    tzFormat = 'Z';
                } else {
                    config._isValid = false;
                    return;
                }
            }
            config._f = dateFormat + (timeFormat || '') + (tzFormat || '');
            configFromStringAndFormat(config);
        } else {
            config._isValid = false;
        }
    }

    // RFC 2822 regex: For details see https://tools.ietf.org/html/rfc2822#section-3.3
    var rfc2822 = /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/;

    function extractFromRFC2822Strings(yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) {
        var result = [
            untruncateYear(yearStr),
            defaultLocaleMonthsShort.indexOf(monthStr),
            parseInt(dayStr, 10),
            parseInt(hourStr, 10),
            parseInt(minuteStr, 10)
        ];

        if (secondStr) {
            result.push(parseInt(secondStr, 10));
        }

        return result;
    }

    function untruncateYear(yearStr) {
        var year = parseInt(yearStr, 10);
        if (year <= 49) {
            return 2000 + year;
        } else if (year <= 999) {
            return 1900 + year;
        }
        return year;
    }

    function preprocessRFC2822(s) {
        // Remove comments and folding whitespace and replace multiple-spaces with a single space
        return s.replace(/\([^)]*\)|[\n\t]/g, ' ').replace(/(\s\s+)/g, ' ').replace(/^\s\s*/, '').replace(/\s\s*$/, '');
    }

    function checkWeekday(weekdayStr, parsedInput, config) {
        if (weekdayStr) {
            // TODO: Replace the vanilla JS Date object with an indepentent day-of-week check.
            var weekdayProvided = defaultLocaleWeekdaysShort.indexOf(weekdayStr),
                weekdayActual = new Date(parsedInput[0], parsedInput[1], parsedInput[2]).getDay();
            if (weekdayProvided !== weekdayActual) {
                getParsingFlags(config).weekdayMismatch = true;
                config._isValid = false;
                return false;
            }
        }
        return true;
    }

    var obsOffsets = {
        UT: 0,
        GMT: 0,
        EDT: -4 * 60,
        EST: -5 * 60,
        CDT: -5 * 60,
        CST: -6 * 60,
        MDT: -6 * 60,
        MST: -7 * 60,
        PDT: -7 * 60,
        PST: -8 * 60
    };

    function calculateOffset(obsOffset, militaryOffset, numOffset) {
        if (obsOffset) {
            return obsOffsets[obsOffset];
        } else if (militaryOffset) {
            // the only allowed military tz is Z
            return 0;
        } else {
            var hm = parseInt(numOffset, 10);
            var m = hm % 100, h = (hm - m) / 100;
            return h * 60 + m;
        }
    }

    // date and time from ref 2822 format
    function configFromRFC2822(config) {
        var match = rfc2822.exec(preprocessRFC2822(config._i));
        if (match) {
            var parsedArray = extractFromRFC2822Strings(match[4], match[3], match[2], match[5], match[6], match[7]);
            if (!checkWeekday(match[1], parsedArray, config)) {
                return;
            }

            config._a = parsedArray;
            config._tzm = calculateOffset(match[8], match[9], match[10]);

            config._d = createUTCDate.apply(null, config._a);
            config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);

            getParsingFlags(config).rfc2822 = true;
        } else {
            config._isValid = false;
        }
    }

    // date from iso format or fallback
    function configFromString(config) {
        var matched = aspNetJsonRegex.exec(config._i);

        if (matched !== null) {
            config._d = new Date(+matched[1]);
            return;
        }

        configFromISO(config);
        if (config._isValid === false) {
            delete config._isValid;
        } else {
            return;
        }

        configFromRFC2822(config);
        if (config._isValid === false) {
            delete config._isValid;
        } else {
            return;
        }

        // Final attempt, use Input Fallback
        hooks.createFromInputFallback(config);
    }

    hooks.createFromInputFallback = deprecate(
        'value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), ' +
        'which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are ' +
        'discouraged and will be removed in an upcoming major release. Please refer to ' +
        'http://momentjs.com/guides/#/warnings/js-date/ for more info.',
        function (config) {
            config._d = new Date(config._i + (config._useUTC ? ' UTC' : ''));
        }
    );

    // constant that refers to the ISO standard
    hooks.ISO_8601 = function () {};

    // constant that refers to the RFC 2822 form
    hooks.RFC_2822 = function () {};

    // date from string and format string
    function configFromStringAndFormat(config) {
        // TODO: Move this to another part of the creation flow to prevent circular deps
        if (config._f === hooks.ISO_8601) {
            configFromISO(config);
            return;
        }
        if (config._f === hooks.RFC_2822) {
            configFromRFC2822(config);
            return;
        }
        config._a = [];
        getParsingFlags(config).empty = true;

        // This array is used to make a Date, either with `new Date` or `Date.UTC`
        var string = '' + config._i,
            i, parsedInput, tokens, token, skipped,
            stringLength = string.length,
            totalParsedInputLength = 0;

        tokens = expandFormat(config._f, config._locale).match(formattingTokens) || [];

        for (i = 0; i < tokens.length; i++) {
            token = tokens[i];
            parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0];
            // console.log('token', token, 'parsedInput', parsedInput,
            //         'regex', getParseRegexForToken(token, config));
            if (parsedInput) {
                skipped = string.substr(0, string.indexOf(parsedInput));
                if (skipped.length > 0) {
                    getParsingFlags(config).unusedInput.push(skipped);
                }
                string = string.slice(string.indexOf(parsedInput) + parsedInput.length);
                totalParsedInputLength += parsedInput.length;
            }
            // don't parse if it's not a known token
            if (formatTokenFunctions[token]) {
                if (parsedInput) {
                    getParsingFlags(config).empty = false;
                }
                else {
                    getParsingFlags(config).unusedTokens.push(token);
                }
                addTimeToArrayFromToken(token, parsedInput, config);
            }
            else if (config._strict && !parsedInput) {
                getParsingFlags(config).unusedTokens.push(token);
            }
        }

        // add remaining unparsed input length to the string
        getParsingFlags(config).charsLeftOver = stringLength - totalParsedInputLength;
        if (string.length > 0) {
            getParsingFlags(config).unusedInput.push(string);
        }

        // clear _12h flag if hour is <= 12
        if (config._a[HOUR] <= 12 &&
            getParsingFlags(config).bigHour === true &&
            config._a[HOUR] > 0) {
            getParsingFlags(config).bigHour = undefined;
        }

        getParsingFlags(config).parsedDateParts = config._a.slice(0);
        getParsingFlags(config).meridiem = config._meridiem;
        // handle meridiem
        config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], config._meridiem);

        configFromArray(config);
        checkOverflow(config);
    }


    function meridiemFixWrap (locale, hour, meridiem) {
        var isPm;

        if (meridiem == null) {
            // nothing to do
            return hour;
        }
        if (locale.meridiemHour != null) {
            return locale.meridiemHour(hour, meridiem);
        } else if (locale.isPM != null) {
            // Fallback
            isPm = locale.isPM(meridiem);
            if (isPm && hour < 12) {
                hour += 12;
            }
            if (!isPm && hour === 12) {
                hour = 0;
            }
            return hour;
        } else {
            // this is not supposed to happen
            return hour;
        }
    }

    // date from string and array of format strings
    function configFromStringAndArray(config) {
        var tempConfig,
            bestMoment,

            scoreToBeat,
            i,
            currentScore;

        if (config._f.length === 0) {
            getParsingFlags(config).invalidFormat = true;
            config._d = new Date(NaN);
            return;
        }

        for (i = 0; i < config._f.length; i++) {
            currentScore = 0;
            tempConfig = copyConfig({}, config);
            if (config._useUTC != null) {
                tempConfig._useUTC = config._useUTC;
            }
            tempConfig._f = config._f[i];
            configFromStringAndFormat(tempConfig);

            if (!isValid(tempConfig)) {
                continue;
            }

            // if there is any input that was not parsed add a penalty for that format
            currentScore += getParsingFlags(tempConfig).charsLeftOver;

            //or tokens
            currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10;

            getParsingFlags(tempConfig).score = currentScore;

            if (scoreToBeat == null || currentScore < scoreToBeat) {
                scoreToBeat = currentScore;
                bestMoment = tempConfig;
            }
        }

        extend(config, bestMoment || tempConfig);
    }

    function configFromObject(config) {
        if (config._d) {
            return;
        }

        var i = normalizeObjectUnits(config._i);
        config._a = map([i.year, i.month, i.day || i.date, i.hour, i.minute, i.second, i.millisecond], function (obj) {
            return obj && parseInt(obj, 10);
        });

        configFromArray(config);
    }

    function createFromConfig (config) {
        var res = new Moment(checkOverflow(prepareConfig(config)));
        if (res._nextDay) {
            // Adding is smart enough around DST
            res.add(1, 'd');
            res._nextDay = undefined;
        }

        return res;
    }

    function prepareConfig (config) {
        var input = config._i,
            format = config._f;

        config._locale = config._locale || getLocale(config._l);

        if (input === null || (format === undefined && input === '')) {
            return createInvalid({nullInput: true});
        }

        if (typeof input === 'string') {
            config._i = input = config._locale.preparse(input);
        }

        if (isMoment(input)) {
            return new Moment(checkOverflow(input));
        } else if (isDate(input)) {
            config._d = input;
        } else if (isArray(format)) {
            configFromStringAndArray(config);
        } else if (format) {
            configFromStringAndFormat(config);
        }  else {
            configFromInput(config);
        }

        if (!isValid(config)) {
            config._d = null;
        }

        return config;
    }

    function configFromInput(config) {
        var input = config._i;
        if (isUndefined(input)) {
            config._d = new Date(hooks.now());
        } else if (isDate(input)) {
            config._d = new Date(input.valueOf());
        } else if (typeof input === 'string') {
            configFromString(config);
        } else if (isArray(input)) {
            config._a = map(input.slice(0), function (obj) {
                return parseInt(obj, 10);
            });
            configFromArray(config);
        } else if (isObject(input)) {
            configFromObject(config);
        } else if (isNumber(input)) {
            // from milliseconds
            config._d = new Date(input);
        } else {
            hooks.createFromInputFallback(config);
        }
    }

    function createLocalOrUTC (input, format, locale, strict, isUTC) {
        var c = {};

        if (locale === true || locale === false) {
            strict = locale;
            locale = undefined;
        }

        if ((isObject(input) && isObjectEmpty(input)) ||
                (isArray(input) && input.length === 0)) {
            input = undefined;
        }
        // object construction must be done this way.
        // https://github.com/moment/moment/issues/1423
        c._isAMomentObject = true;
        c._useUTC = c._isUTC = isUTC;
        c._l = locale;
        c._i = input;
        c._f = format;
        c._strict = strict;

        return createFromConfig(c);
    }

    function createLocal (input, format, locale, strict) {
        return createLocalOrUTC(input, format, locale, strict, false);
    }

    var prototypeMin = deprecate(
        'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/',
        function () {
            var other = createLocal.apply(null, arguments);
            if (this.isValid() && other.isValid()) {
                return other < this ? this : other;
            } else {
                return createInvalid();
            }
        }
    );

    var prototypeMax = deprecate(
        'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/',
        function () {
            var other = createLocal.apply(null, arguments);
            if (this.isValid() && other.isValid()) {
                return other > this ? this : other;
            } else {
                return createInvalid();
            }
        }
    );

    // Pick a moment m from moments so that m[fn](other) is true for all
    // other. This relies on the function fn to be transitive.
    //
    // moments should either be an array of moment objects or an array, whose
    // first element is an array of moment objects.
    function pickBy(fn, moments) {
        var res, i;
        if (moments.length === 1 && isArray(moments[0])) {
            moments = moments[0];
        }
        if (!moments.length) {
            return createLocal();
        }
        res = moments[0];
        for (i = 1; i < moments.length; ++i) {
            if (!moments[i].isValid() || moments[i][fn](res)) {
                res = moments[i];
            }
        }
        return res;
    }

    // TODO: Use [].sort instead?
    function min () {
        var args = [].slice.call(arguments, 0);

        return pickBy('isBefore', args);
    }

    function max () {
        var args = [].slice.call(arguments, 0);

        return pickBy('isAfter', args);
    }

    var now = function () {
        return Date.now ? Date.now() : +(new Date());
    };

    var ordering = ['year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', 'millisecond'];

    function isDurationValid(m) {
        for (var key in m) {
            if (!(indexOf.call(ordering, key) !== -1 && (m[key] == null || !isNaN(m[key])))) {
                return false;
            }
        }

        var unitHasDecimal = false;
        for (var i = 0; i < ordering.length; ++i) {
            if (m[ordering[i]]) {
                if (unitHasDecimal) {
                    return false; // only allow non-integers for smallest unit
                }
                if (parseFloat(m[ordering[i]]) !== toInt(m[ordering[i]])) {
                    unitHasDecimal = true;
                }
            }
        }

        return true;
    }

    function isValid$1() {
        return this._isValid;
    }

    function createInvalid$1() {
        return createDuration(NaN);
    }

    function Duration (duration) {
        var normalizedInput = normalizeObjectUnits(duration),
            years = normalizedInput.year || 0,
            quarters = normalizedInput.quarter || 0,
            months = normalizedInput.month || 0,
            weeks = normalizedInput.week || 0,
            days = normalizedInput.day || 0,
            hours = normalizedInput.hour || 0,
            minutes = normalizedInput.minute || 0,
            seconds = normalizedInput.second || 0,
            milliseconds = normalizedInput.millisecond || 0;

        this._isValid = isDurationValid(normalizedInput);

        // representation for dateAddRemove
        this._milliseconds = +milliseconds +
            seconds * 1e3 + // 1000
            minutes * 6e4 + // 1000 * 60
            hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978
        // Because of dateAddRemove treats 24 hours as different from a
        // day when working around DST, we need to store them separately
        this._days = +days +
            weeks * 7;
        // It is impossible to translate months into days without knowing
        // which months you are are talking about, so we have to store
        // it separately.
        this._months = +months +
            quarters * 3 +
            years * 12;

        this._data = {};

        this._locale = getLocale();

        this._bubble();
    }

    function isDuration (obj) {
        return obj instanceof Duration;
    }

    function absRound (number) {
        if (number < 0) {
            return Math.round(-1 * number) * -1;
        } else {
            return Math.round(number);
        }
    }

    // FORMATTING

    function offset (token, separator) {
        addFormatToken(token, 0, 0, function () {
            var offset = this.utcOffset();
            var sign = '+';
            if (offset < 0) {
                offset = -offset;
                sign = '-';
            }
            return sign + zeroFill(~~(offset / 60), 2) + separator + zeroFill(~~(offset) % 60, 2);
        });
    }

    offset('Z', ':');
    offset('ZZ', '');

    // PARSING

    addRegexToken('Z',  matchShortOffset);
    addRegexToken('ZZ', matchShortOffset);
    addParseToken(['Z', 'ZZ'], function (input, array, config) {
        config._useUTC = true;
        config._tzm = offsetFromString(matchShortOffset, input);
    });

    // HELPERS

    // timezone chunker
    // '+10:00' > ['10',  '00']
    // '-1530'  > ['-15', '30']
    var chunkOffset = /([\+\-]|\d\d)/gi;

    function offsetFromString(matcher, string) {
        var matches = (string || '').match(matcher);

        if (matches === null) {
            return null;
        }

        var chunk   = matches[matches.length - 1] || [];
        var parts   = (chunk + '').match(chunkOffset) || ['-', 0, 0];
        var minutes = +(parts[1] * 60) + toInt(parts[2]);

        return minutes === 0 ?
          0 :
          parts[0] === '+' ? minutes : -minutes;
    }

    // Return a moment from input, that is local/utc/zone equivalent to model.
    function cloneWithOffset(input, model) {
        var res, diff;
        if (model._isUTC) {
            res = model.clone();
            diff = (isMoment(input) || isDate(input) ? input.valueOf() : createLocal(input).valueOf()) - res.valueOf();
            // Use low-level api, because this fn is low-level api.
            res._d.setTime(res._d.valueOf() + diff);
            hooks.updateOffset(res, false);
            return res;
        } else {
            return createLocal(input).local();
        }
    }

    function getDateOffset (m) {
        // On Firefox.24 Date#getTimezoneOffset returns a floating point.
        // https://github.com/moment/moment/pull/1871
        return -Math.round(m._d.getTimezoneOffset() / 15) * 15;
    }

    // HOOKS

    // This function will be called whenever a moment is mutated.
    // It is intended to keep the offset in sync with the timezone.
    hooks.updateOffset = function () {};

    // MOMENTS

    // keepLocalTime = true means only change the timezone, without
    // affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]-->
    // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset
    // +0200, so we adjust the time as needed, to be valid.
    //
    // Keeping the time actually adds/subtracts (one hour)
    // from the actual represented time. That is why we call updateOffset
    // a second time. In case it wants us to change the offset again
    // _changeInProgress == true case, then we have to adjust, because
    // there is no such time in the given timezone.
    function getSetOffset (input, keepLocalTime, keepMinutes) {
        var offset = this._offset || 0,
            localAdjust;
        if (!this.isValid()) {
            return input != null ? this : NaN;
        }
        if (input != null) {
            if (typeof input === 'string') {
                input = offsetFromString(matchShortOffset, input);
                if (input === null) {
                    return this;
                }
            } else if (Math.abs(input) < 16 && !keepMinutes) {
                input = input * 60;
            }
            if (!this._isUTC && keepLocalTime) {
                localAdjust = getDateOffset(this);
            }
            this._offset = input;
            this._isUTC = true;
            if (localAdjust != null) {
                this.add(localAdjust, 'm');
            }
            if (offset !== input) {
                if (!keepLocalTime || this._changeInProgress) {
                    addSubtract(this, createDuration(input - offset, 'm'), 1, false);
                } else if (!this._changeInProgress) {
                    this._changeInProgress = true;
                    hooks.updateOffset(this, true);
                    this._changeInProgress = null;
                }
            }
            return this;
        } else {
            return this._isUTC ? offset : getDateOffset(this);
        }
    }

    function getSetZone (input, keepLocalTime) {
        if (input != null) {
            if (typeof input !== 'string') {
                input = -input;
            }

            this.utcOffset(input, keepLocalTime);

            return this;
        } else {
            return -this.utcOffset();
        }
    }

    function setOffsetToUTC (keepLocalTime) {
        return this.utcOffset(0, keepLocalTime);
    }

    function setOffsetToLocal (keepLocalTime) {
        if (this._isUTC) {
            this.utcOffset(0, keepLocalTime);
            this._isUTC = false;

            if (keepLocalTime) {
                this.subtract(getDateOffset(this), 'm');
            }
        }
        return this;
    }

    function setOffsetToParsedOffset () {
        if (this._tzm != null) {
            this.utcOffset(this._tzm, false, true);
        } else if (typeof this._i === 'string') {
            var tZone = offsetFromString(matchOffset, this._i);
            if (tZone != null) {
                this.utcOffset(tZone);
            }
            else {
                this.utcOffset(0, true);
            }
        }
        return this;
    }

    function hasAlignedHourOffset (input) {
        if (!this.isValid()) {
            return false;
        }
        input = input ? createLocal(input).utcOffset() : 0;

        return (this.utcOffset() - input) % 60 === 0;
    }

    function isDaylightSavingTime () {
        return (
            this.utcOffset() > this.clone().month(0).utcOffset() ||
            this.utcOffset() > this.clone().month(5).utcOffset()
        );
    }

    function isDaylightSavingTimeShifted () {
        if (!isUndefined(this._isDSTShifted)) {
            return this._isDSTShifted;
        }

        var c = {};

        copyConfig(c, this);
        c = prepareConfig(c);

        if (c._a) {
            var other = c._isUTC ? createUTC(c._a) : createLocal(c._a);
            this._isDSTShifted = this.isValid() &&
                compareArrays(c._a, other.toArray()) > 0;
        } else {
            this._isDSTShifted = false;
        }

        return this._isDSTShifted;
    }

    function isLocal () {
        return this.isValid() ? !this._isUTC : false;
    }

    function isUtcOffset () {
        return this.isValid() ? this._isUTC : false;
    }

    function isUtc () {
        return this.isValid() ? this._isUTC && this._offset === 0 : false;
    }

    // ASP.NET json date format regex
    var aspNetRegex = /^(\-|\+)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/;

    // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html
    // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere
    // and further modified to allow for strings containing both week and day
    var isoRegex = /^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;

    function createDuration (input, key) {
        var duration = input,
            // matching against regexp is expensive, do it on demand
            match = null,
            sign,
            ret,
            diffRes;

        if (isDuration(input)) {
            duration = {
                ms : input._milliseconds,
                d  : input._days,
                M  : input._months
            };
        } else if (isNumber(input)) {
            duration = {};
            if (key) {
                duration[key] = input;
            } else {
                duration.milliseconds = input;
            }
        } else if (!!(match = aspNetRegex.exec(input))) {
            sign = (match[1] === '-') ? -1 : 1;
            duration = {
                y  : 0,
                d  : toInt(match[DATE])                         * sign,
                h  : toInt(match[HOUR])                         * sign,
                m  : toInt(match[MINUTE])                       * sign,
                s  : toInt(match[SECOND])                       * sign,
                ms : toInt(absRound(match[MILLISECOND] * 1000)) * sign // the millisecond decimal point is included in the match
            };
        } else if (!!(match = isoRegex.exec(input))) {
            sign = (match[1] === '-') ? -1 : (match[1] === '+') ? 1 : 1;
            duration = {
                y : parseIso(match[2], sign),
                M : parseIso(match[3], sign),
                w : parseIso(match[4], sign),
                d : parseIso(match[5], sign),
                h : parseIso(match[6], sign),
                m : parseIso(match[7], sign),
                s : parseIso(match[8], sign)
            };
        } else if (duration == null) {// checks for null or undefined
            duration = {};
        } else if (typeof duration === 'object' && ('from' in duration || 'to' in duration)) {
            diffRes = momentsDifference(createLocal(duration.from), createLocal(duration.to));

            duration = {};
            duration.ms = diffRes.milliseconds;
            duration.M = diffRes.months;
        }

        ret = new Duration(duration);

        if (isDuration(input) && hasOwnProp(input, '_locale')) {
            ret._locale = input._locale;
        }

        return ret;
    }

    createDuration.fn = Duration.prototype;
    createDuration.invalid = createInvalid$1;

    function parseIso (inp, sign) {
        // We'd normally use ~~inp for this, but unfortunately it also
        // converts floats to ints.
        // inp may be undefined, so careful calling replace on it.
        var res = inp && parseFloat(inp.replace(',', '.'));
        // apply sign while we're at it
        return (isNaN(res) ? 0 : res) * sign;
    }

    function positiveMomentsDifference(base, other) {
        var res = {milliseconds: 0, months: 0};

        res.months = other.month() - base.month() +
            (other.year() - base.year()) * 12;
        if (base.clone().add(res.months, 'M').isAfter(other)) {
            --res.months;
        }

        res.milliseconds = +other - +(base.clone().add(res.months, 'M'));

        return res;
    }

    function momentsDifference(base, other) {
        var res;
        if (!(base.isValid() && other.isValid())) {
            return {milliseconds: 0, months: 0};
        }

        other = cloneWithOffset(other, base);
        if (base.isBefore(other)) {
            res = positiveMomentsDifference(base, other);
        } else {
            res = positiveMomentsDifference(other, base);
            res.milliseconds = -res.milliseconds;
            res.months = -res.months;
        }

        return res;
    }

    // TODO: remove 'name' arg after deprecation is removed
    function createAdder(direction, name) {
        return function (val, period) {
            var dur, tmp;
            //invert the arguments, but complain about it
            if (period !== null && !isNaN(+period)) {
                deprecateSimple(name, 'moment().' + name  + '(period, number) is deprecated. Please use moment().' + name + '(number, period). ' +
                'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.');
                tmp = val; val = period; period = tmp;
            }

            val = typeof val === 'string' ? +val : val;
            dur = createDuration(val, period);
            addSubtract(this, dur, direction);
            return this;
        };
    }

    function addSubtract (mom, duration, isAdding, updateOffset) {
        var milliseconds = duration._milliseconds,
            days = absRound(duration._days),
            months = absRound(duration._months);

        if (!mom.isValid()) {
            // No op
            return;
        }

        updateOffset = updateOffset == null ? true : updateOffset;

        if (months) {
            setMonth(mom, get(mom, 'Month') + months * isAdding);
        }
        if (days) {
            set$1(mom, 'Date', get(mom, 'Date') + days * isAdding);
        }
        if (milliseconds) {
            mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding);
        }
        if (updateOffset) {
            hooks.updateOffset(mom, days || months);
        }
    }

    var add      = createAdder(1, 'add');
    var subtract = createAdder(-1, 'subtract');

    function getCalendarFormat(myMoment, now) {
        var diff = myMoment.diff(now, 'days', true);
        return diff < -6 ? 'sameElse' :
                diff < -1 ? 'lastWeek' :
                diff < 0 ? 'lastDay' :
                diff < 1 ? 'sameDay' :
                diff < 2 ? 'nextDay' :
                diff < 7 ? 'nextWeek' : 'sameElse';
    }

    function calendar$1 (time, formats) {
        // We want to compare the start of today, vs this.
        // Getting start-of-today depends on whether we're local/utc/offset or not.
        var now = time || createLocal(),
            sod = cloneWithOffset(now, this).startOf('day'),
            format = hooks.calendarFormat(this, sod) || 'sameElse';

        var output = formats && (isFunction(formats[format]) ? formats[format].call(this, now) : formats[format]);

        return this.format(output || this.localeData().calendar(format, this, createLocal(now)));
    }

    function clone () {
        return new Moment(this);
    }

    function isAfter (input, units) {
        var localInput = isMoment(input) ? input : createLocal(input);
        if (!(this.isValid() && localInput.isValid())) {
            return false;
        }
        units = normalizeUnits(!isUndefined(units) ? units : 'millisecond');
        if (units === 'millisecond') {
            return this.valueOf() > localInput.valueOf();
        } else {
            return localInput.valueOf() < this.clone().startOf(units).valueOf();
        }
    }

    function isBefore (input, units) {
        var localInput = isMoment(input) ? input : createLocal(input);
        if (!(this.isValid() && localInput.isValid())) {
            return false;
        }
        units = normalizeUnits(!isUndefined(units) ? units : 'millisecond');
        if (units === 'millisecond') {
            return this.valueOf() < localInput.valueOf();
        } else {
            return this.clone().endOf(units).valueOf() < localInput.valueOf();
        }
    }

    function isBetween (from, to, units, inclusivity) {
        inclusivity = inclusivity || '()';
        return (inclusivity[0] === '(' ? this.isAfter(from, units) : !this.isBefore(from, units)) &&
            (inclusivity[1] === ')' ? this.isBefore(to, units) : !this.isAfter(to, units));
    }

    function isSame (input, units) {
        var localInput = isMoment(input) ? input : createLocal(input),
            inputMs;
        if (!(this.isValid() && localInput.isValid())) {
            return false;
        }
        units = normalizeUnits(units || 'millisecond');
        if (units === 'millisecond') {
            return this.valueOf() === localInput.valueOf();
        } else {
            inputMs = localInput.valueOf();
            return this.clone().startOf(units).valueOf() <= inputMs && inputMs <= this.clone().endOf(units).valueOf();
        }
    }

    function isSameOrAfter (input, units) {
        return this.isSame(input, units) || this.isAfter(input,units);
    }

    function isSameOrBefore (input, units) {
        return this.isSame(input, units) || this.isBefore(input,units);
    }

    function diff (input, units, asFloat) {
        var that,
            zoneDelta,
            output;

        if (!this.isValid()) {
            return NaN;
        }

        that = cloneWithOffset(input, this);

        if (!that.isValid()) {
            return NaN;
        }

        zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4;

        units = normalizeUnits(units);

        switch (units) {
            case 'year': output = monthDiff(this, that) / 12; break;
            case 'month': output = monthDiff(this, that); break;
            case 'quarter': output = monthDiff(this, that) / 3; break;
            case 'second': output = (this - that) / 1e3; break; // 1000
            case 'minute': output = (this - that) / 6e4; break; // 1000 * 60
            case 'hour': output = (this - that) / 36e5; break; // 1000 * 60 * 60
            case 'day': output = (this - that - zoneDelta) / 864e5; break; // 1000 * 60 * 60 * 24, negate dst
            case 'week': output = (this - that - zoneDelta) / 6048e5; break; // 1000 * 60 * 60 * 24 * 7, negate dst
            default: output = this - that;
        }

        return asFloat ? output : absFloor(output);
    }

    function monthDiff (a, b) {
        // difference in months
        var wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()),
            // b is in (anchor - 1 month, anchor + 1 month)
            anchor = a.clone().add(wholeMonthDiff, 'months'),
            anchor2, adjust;

        if (b - anchor < 0) {
            anchor2 = a.clone().add(wholeMonthDiff - 1, 'months');
            // linear across the month
            adjust = (b - anchor) / (anchor - anchor2);
        } else {
            anchor2 = a.clone().add(wholeMonthDiff + 1, 'months');
            // linear across the month
            adjust = (b - anchor) / (anchor2 - anchor);
        }

        //check for negative zero, return zero if negative zero
        return -(wholeMonthDiff + adjust) || 0;
    }

    hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ';
    hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]';

    function toString () {
        return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');
    }

    function toISOString(keepOffset) {
        if (!this.isValid()) {
            return null;
        }
        var utc = keepOffset !== true;
        var m = utc ? this.clone().utc() : this;
        if (m.year() < 0 || m.year() > 9999) {
            return formatMoment(m, utc ? 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYYYY-MM-DD[T]HH:mm:ss.SSSZ');
        }
        if (isFunction(Date.prototype.toISOString)) {
            // native implementation is ~50x faster, use it when we can
            if (utc) {
                return this.toDate().toISOString();
            } else {
                return new Date(this.valueOf() + this.utcOffset() * 60 * 1000).toISOString().replace('Z', formatMoment(m, 'Z'));
            }
        }
        return formatMoment(m, utc ? 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYY-MM-DD[T]HH:mm:ss.SSSZ');
    }

    /**
     * Return a human readable representation of a moment that can
     * also be evaluated to get a new moment which is the same
     *
     * @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects
     */
    function inspect () {
        if (!this.isValid()) {
            return 'moment.invalid(/* ' + this._i + ' */)';
        }
        var func = 'moment';
        var zone = '';
        if (!this.isLocal()) {
            func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone';
            zone = 'Z';
        }
        var prefix = '[' + func + '("]';
        var year = (0 <= this.year() && this.year() <= 9999) ? 'YYYY' : 'YYYYYY';
        var datetime = '-MM-DD[T]HH:mm:ss.SSS';
        var suffix = zone + '[")]';

        return this.format(prefix + year + datetime + suffix);
    }

    function format (inputString) {
        if (!inputString) {
            inputString = this.isUtc() ? hooks.defaultFormatUtc : hooks.defaultFormat;
        }
        var output = formatMoment(this, inputString);
        return this.localeData().postformat(output);
    }

    function from (time, withoutSuffix) {
        if (this.isValid() &&
                ((isMoment(time) && time.isValid()) ||
                 createLocal(time).isValid())) {
            return createDuration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix);
        } else {
            return this.localeData().invalidDate();
        }
    }

    function fromNow (withoutSuffix) {
        return this.from(createLocal(), withoutSuffix);
    }

    function to (time, withoutSuffix) {
        if (this.isValid() &&
                ((isMoment(time) && time.isValid()) ||
                 createLocal(time).isValid())) {
            return createDuration({from: this, to: time}).locale(this.locale()).humanize(!withoutSuffix);
        } else {
            return this.localeData().invalidDate();
        }
    }

    function toNow (withoutSuffix) {
        return this.to(createLocal(), withoutSuffix);
    }

    // If passed a locale key, it will set the locale for this
    // instance.  Otherwise, it will return the locale configuration
    // variables for this instance.
    function locale (key) {
        var newLocaleData;

        if (key === undefined) {
            return this._locale._abbr;
        } else {
            newLocaleData = getLocale(key);
            if (newLocaleData != null) {
                this._locale = newLocaleData;
            }
            return this;
        }
    }

    var lang = deprecate(
        'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.',
        function (key) {
            if (key === undefined) {
                return this.localeData();
            } else {
                return this.locale(key);
            }
        }
    );

    function localeData () {
        return this._locale;
    }

    function startOf (units) {
        units = normalizeUnits(units);
        // the following switch intentionally omits break keywords
        // to utilize falling through the cases.
        switch (units) {
            case 'year':
                this.month(0);
                /* falls through */
            case 'quarter':
            case 'month':
                this.date(1);
                /* falls through */
            case 'week':
            case 'isoWeek':
            case 'day':
            case 'date':
                this.hours(0);
                /* falls through */
            case 'hour':
                this.minutes(0);
                /* falls through */
            case 'minute':
                this.seconds(0);
                /* falls through */
            case 'second':
                this.milliseconds(0);
        }

        // weeks are a special case
        if (units === 'week') {
            this.weekday(0);
        }
        if (units === 'isoWeek') {
            this.isoWeekday(1);
        }

        // quarters are also special
        if (units === 'quarter') {
            this.month(Math.floor(this.month() / 3) * 3);
        }

        return this;
    }

    function endOf (units) {
        units = normalizeUnits(units);
        if (units === undefined || units === 'millisecond') {
            return this;
        }

        // 'date' is an alias for 'day', so it should be considered as such.
        if (units === 'date') {
            units = 'day';
        }

        return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms');
    }

    function valueOf () {
        return this._d.valueOf() - ((this._offset || 0) * 60000);
    }

    function unix () {
        return Math.floor(this.valueOf() / 1000);
    }

    function toDate () {
        return new Date(this.valueOf());
    }

    function toArray () {
        var m = this;
        return [m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second(), m.millisecond()];
    }

    function toObject () {
        var m = this;
        return {
            years: m.year(),
            months: m.month(),
            date: m.date(),
            hours: m.hours(),
            minutes: m.minutes(),
            seconds: m.seconds(),
            milliseconds: m.milliseconds()
        };
    }

    function toJSON () {
        // new Date(NaN).toJSON() === null
        return this.isValid() ? this.toISOString() : null;
    }

    function isValid$2 () {
        return isValid(this);
    }

    function parsingFlags () {
        return extend({}, getParsingFlags(this));
    }

    function invalidAt () {
        return getParsingFlags(this).overflow;
    }

    function creationData() {
        return {
            input: this._i,
            format: this._f,
            locale: this._locale,
            isUTC: this._isUTC,
            strict: this._strict
        };
    }

    // FORMATTING

    addFormatToken(0, ['gg', 2], 0, function () {
        return this.weekYear() % 100;
    });

    addFormatToken(0, ['GG', 2], 0, function () {
        return this.isoWeekYear() % 100;
    });

    function addWeekYearFormatToken (token, getter) {
        addFormatToken(0, [token, token.length], 0, getter);
    }

    addWeekYearFormatToken('gggg',     'weekYear');
    addWeekYearFormatToken('ggggg',    'weekYear');
    addWeekYearFormatToken('GGGG',  'isoWeekYear');
    addWeekYearFormatToken('GGGGG', 'isoWeekYear');

    // ALIASES

    addUnitAlias('weekYear', 'gg');
    addUnitAlias('isoWeekYear', 'GG');

    // PRIORITY

    addUnitPriority('weekYear', 1);
    addUnitPriority('isoWeekYear', 1);


    // PARSING

    addRegexToken('G',      matchSigned);
    addRegexToken('g',      matchSigned);
    addRegexToken('GG',     match1to2, match2);
    addRegexToken('gg',     match1to2, match2);
    addRegexToken('GGGG',   match1to4, match4);
    addRegexToken('gggg',   match1to4, match4);
    addRegexToken('GGGGG',  match1to6, match6);
    addRegexToken('ggggg',  match1to6, match6);

    addWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function (input, week, config, token) {
        week[token.substr(0, 2)] = toInt(input);
    });

    addWeekParseToken(['gg', 'GG'], function (input, week, config, token) {
        week[token] = hooks.parseTwoDigitYear(input);
    });

    // MOMENTS

    function getSetWeekYear (input) {
        return getSetWeekYearHelper.call(this,
                input,
                this.week(),
                this.weekday(),
                this.localeData()._week.dow,
                this.localeData()._week.doy);
    }

    function getSetISOWeekYear (input) {
        return getSetWeekYearHelper.call(this,
                input, this.isoWeek(), this.isoWeekday(), 1, 4);
    }

    function getISOWeeksInYear () {
        return weeksInYear(this.year(), 1, 4);
    }

    function getWeeksInYear () {
        var weekInfo = this.localeData()._week;
        return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy);
    }

    function getSetWeekYearHelper(input, week, weekday, dow, doy) {
        var weeksTarget;
        if (input == null) {
            return weekOfYear(this, dow, doy).year;
        } else {
            weeksTarget = weeksInYear(input, dow, doy);
            if (week > weeksTarget) {
                week = weeksTarget;
            }
            return setWeekAll.call(this, input, week, weekday, dow, doy);
        }
    }

    function setWeekAll(weekYear, week, weekday, dow, doy) {
        var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy),
            date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear);

        this.year(date.getUTCFullYear());
        this.month(date.getUTCMonth());
        this.date(date.getUTCDate());
        return this;
    }

    // FORMATTING

    addFormatToken('Q', 0, 'Qo', 'quarter');

    // ALIASES

    addUnitAlias('quarter', 'Q');

    // PRIORITY

    addUnitPriority('quarter', 7);

    // PARSING

    addRegexToken('Q', match1);
    addParseToken('Q', function (input, array) {
        array[MONTH] = (toInt(input) - 1) * 3;
    });

    // MOMENTS

    function getSetQuarter (input) {
        return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3);
    }

    // FORMATTING

    addFormatToken('D', ['DD', 2], 'Do', 'date');

    // ALIASES

    addUnitAlias('date', 'D');

    // PRIORITY
    addUnitPriority('date', 9);

    // PARSING

    addRegexToken('D',  match1to2);
    addRegexToken('DD', match1to2, match2);
    addRegexToken('Do', function (isStrict, locale) {
        // TODO: Remove "ordinalParse" fallback in next major release.
        return isStrict ?
          (locale._dayOfMonthOrdinalParse || locale._ordinalParse) :
          locale._dayOfMonthOrdinalParseLenient;
    });

    addParseToken(['D', 'DD'], DATE);
    addParseToken('Do', function (input, array) {
        array[DATE] = toInt(input.match(match1to2)[0]);
    });

    // MOMENTS

    var getSetDayOfMonth = makeGetSet('Date', true);

    // FORMATTING

    addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear');

    // ALIASES

    addUnitAlias('dayOfYear', 'DDD');

    // PRIORITY
    addUnitPriority('dayOfYear', 4);

    // PARSING

    addRegexToken('DDD',  match1to3);
    addRegexToken('DDDD', match3);
    addParseToken(['DDD', 'DDDD'], function (input, array, config) {
        config._dayOfYear = toInt(input);
    });

    // HELPERS

    // MOMENTS

    function getSetDayOfYear (input) {
        var dayOfYear = Math.round((this.clone().startOf('day') - this.clone().startOf('year')) / 864e5) + 1;
        return input == null ? dayOfYear : this.add((input - dayOfYear), 'd');
    }

    // FORMATTING

    addFormatToken('m', ['mm', 2], 0, 'minute');

    // ALIASES

    addUnitAlias('minute', 'm');

    // PRIORITY

    addUnitPriority('minute', 14);

    // PARSING

    addRegexToken('m',  match1to2);
    addRegexToken('mm', match1to2, match2);
    addParseToken(['m', 'mm'], MINUTE);

    // MOMENTS

    var getSetMinute = makeGetSet('Minutes', false);

    // FORMATTING

    addFormatToken('s', ['ss', 2], 0, 'second');

    // ALIASES

    addUnitAlias('second', 's');

    // PRIORITY

    addUnitPriority('second', 15);

    // PARSING

    addRegexToken('s',  match1to2);
    addRegexToken('ss', match1to2, match2);
    addParseToken(['s', 'ss'], SECOND);

    // MOMENTS

    var getSetSecond = makeGetSet('Seconds', false);

    // FORMATTING

    addFormatToken('S', 0, 0, function () {
        return ~~(this.millisecond() / 100);
    });

    addFormatToken(0, ['SS', 2], 0, function () {
        return ~~(this.millisecond() / 10);
    });

    addFormatToken(0, ['SSS', 3], 0, 'millisecond');
    addFormatToken(0, ['SSSS', 4], 0, function () {
        return this.millisecond() * 10;
    });
    addFormatToken(0, ['SSSSS', 5], 0, function () {
        return this.millisecond() * 100;
    });
    addFormatToken(0, ['SSSSSS', 6], 0, function () {
        return this.millisecond() * 1000;
    });
    addFormatToken(0, ['SSSSSSS', 7], 0, function () {
        return this.millisecond() * 10000;
    });
    addFormatToken(0, ['SSSSSSSS', 8], 0, function () {
        return this.millisecond() * 100000;
    });
    addFormatToken(0, ['SSSSSSSSS', 9], 0, function () {
        return this.millisecond() * 1000000;
    });


    // ALIASES

    addUnitAlias('millisecond', 'ms');

    // PRIORITY

    addUnitPriority('millisecond', 16);

    // PARSING

    addRegexToken('S',    match1to3, match1);
    addRegexToken('SS',   match1to3, match2);
    addRegexToken('SSS',  match1to3, match3);

    var token;
    for (token = 'SSSS'; token.length <= 9; token += 'S') {
        addRegexToken(token, matchUnsigned);
    }

    function parseMs(input, array) {
        array[MILLISECOND] = toInt(('0.' + input) * 1000);
    }

    for (token = 'S'; token.length <= 9; token += 'S') {
        addParseToken(token, parseMs);
    }
    // MOMENTS

    var getSetMillisecond = makeGetSet('Milliseconds', false);

    // FORMATTING

    addFormatToken('z',  0, 0, 'zoneAbbr');
    addFormatToken('zz', 0, 0, 'zoneName');

    // MOMENTS

    function getZoneAbbr () {
        return this._isUTC ? 'UTC' : '';
    }

    function getZoneName () {
        return this._isUTC ? 'Coordinated Universal Time' : '';
    }

    var proto = Moment.prototype;

    proto.add               = add;
    proto.calendar          = calendar$1;
    proto.clone             = clone;
    proto.diff              = diff;
    proto.endOf             = endOf;
    proto.format            = format;
    proto.from              = from;
    proto.fromNow           = fromNow;
    proto.to                = to;
    proto.toNow             = toNow;
    proto.get               = stringGet;
    proto.invalidAt         = invalidAt;
    proto.isAfter           = isAfter;
    proto.isBefore          = isBefore;
    proto.isBetween         = isBetween;
    proto.isSame            = isSame;
    proto.isSameOrAfter     = isSameOrAfter;
    proto.isSameOrBefore    = isSameOrBefore;
    proto.isValid           = isValid$2;
    proto.lang              = lang;
    proto.locale            = locale;
    proto.localeData        = localeData;
    proto.max               = prototypeMax;
    proto.min               = prototypeMin;
    proto.parsingFlags      = parsingFlags;
    proto.set               = stringSet;
    proto.startOf           = startOf;
    proto.subtract          = subtract;
    proto.toArray           = toArray;
    proto.toObject          = toObject;
    proto.toDate            = toDate;
    proto.toISOString       = toISOString;
    proto.inspect           = inspect;
    proto.toJSON            = toJSON;
    proto.toString          = toString;
    proto.unix              = unix;
    proto.valueOf           = valueOf;
    proto.creationData      = creationData;
    proto.year       = getSetYear;
    proto.isLeapYear = getIsLeapYear;
    proto.weekYear    = getSetWeekYear;
    proto.isoWeekYear = getSetISOWeekYear;
    proto.quarter = proto.quarters = getSetQuarter;
    proto.month       = getSetMonth;
    proto.daysInMonth = getDaysInMonth;
    proto.week           = proto.weeks        = getSetWeek;
    proto.isoWeek        = proto.isoWeeks     = getSetISOWeek;
    proto.weeksInYear    = getWeeksInYear;
    proto.isoWeeksInYear = getISOWeeksInYear;
    proto.date       = getSetDayOfMonth;
    proto.day        = proto.days             = getSetDayOfWeek;
    proto.weekday    = getSetLocaleDayOfWeek;
    proto.isoWeekday = getSetISODayOfWeek;
    proto.dayOfYear  = getSetDayOfYear;
    proto.hour = proto.hours = getSetHour;
    proto.minute = proto.minutes = getSetMinute;
    proto.second = proto.seconds = getSetSecond;
    proto.millisecond = proto.milliseconds = getSetMillisecond;
    proto.utcOffset            = getSetOffset;
    proto.utc                  = setOffsetToUTC;
    proto.local                = setOffsetToLocal;
    proto.parseZone            = setOffsetToParsedOffset;
    proto.hasAlignedHourOffset = hasAlignedHourOffset;
    proto.isDST                = isDaylightSavingTime;
    proto.isLocal              = isLocal;
    proto.isUtcOffset          = isUtcOffset;
    proto.isUtc                = isUtc;
    proto.isUTC                = isUtc;
    proto.zoneAbbr = getZoneAbbr;
    proto.zoneName = getZoneName;
    proto.dates  = deprecate('dates accessor is deprecated. Use date instead.', getSetDayOfMonth);
    proto.months = deprecate('months accessor is deprecated. Use month instead', getSetMonth);
    proto.years  = deprecate('years accessor is deprecated. Use year instead', getSetYear);
    proto.zone   = deprecate('moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/', getSetZone);
    proto.isDSTShifted = deprecate('isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information', isDaylightSavingTimeShifted);

    function createUnix (input) {
        return createLocal(input * 1000);
    }

    function createInZone () {
        return createLocal.apply(null, arguments).parseZone();
    }

    function preParsePostFormat (string) {
        return string;
    }

    var proto$1 = Locale.prototype;

    proto$1.calendar        = calendar;
    proto$1.longDateFormat  = longDateFormat;
    proto$1.invalidDate     = invalidDate;
    proto$1.ordinal         = ordinal;
    proto$1.preparse        = preParsePostFormat;
    proto$1.postformat      = preParsePostFormat;
    proto$1.relativeTime    = relativeTime;
    proto$1.pastFuture      = pastFuture;
    proto$1.set             = set;

    proto$1.months            =        localeMonths;
    proto$1.monthsShort       =        localeMonthsShort;
    proto$1.monthsParse       =        localeMonthsParse;
    proto$1.monthsRegex       = monthsRegex;
    proto$1.monthsShortRegex  = monthsShortRegex;
    proto$1.week = localeWeek;
    proto$1.firstDayOfYear = localeFirstDayOfYear;
    proto$1.firstDayOfWeek = localeFirstDayOfWeek;

    proto$1.weekdays       =        localeWeekdays;
    proto$1.weekdaysMin    =        localeWeekdaysMin;
    proto$1.weekdaysShort  =        localeWeekdaysShort;
    proto$1.weekdaysParse  =        localeWeekdaysParse;

    proto$1.weekdaysRegex       =        weekdaysRegex;
    proto$1.weekdaysShortRegex  =        weekdaysShortRegex;
    proto$1.weekdaysMinRegex    =        weekdaysMinRegex;

    proto$1.isPM = localeIsPM;
    proto$1.meridiem = localeMeridiem;

    function get$1 (format, index, field, setter) {
        var locale = getLocale();
        var utc = createUTC().set(setter, index);
        return locale[field](utc, format);
    }

    function listMonthsImpl (format, index, field) {
        if (isNumber(format)) {
            index = format;
            format = undefined;
        }

        format = format || '';

        if (index != null) {
            return get$1(format, index, field, 'month');
        }

        var i;
        var out = [];
        for (i = 0; i < 12; i++) {
            out[i] = get$1(format, i, field, 'month');
        }
        return out;
    }

    // ()
    // (5)
    // (fmt, 5)
    // (fmt)
    // (true)
    // (true, 5)
    // (true, fmt, 5)
    // (true, fmt)
    function listWeekdaysImpl (localeSorted, format, index, field) {
        if (typeof localeSorted === 'boolean') {
            if (isNumber(format)) {
                index = format;
                format = undefined;
            }

            format = format || '';
        } else {
            format = localeSorted;
            index = format;
            localeSorted = false;

            if (isNumber(format)) {
                index = format;
                format = undefined;
            }

            format = format || '';
        }

        var locale = getLocale(),
            shift = localeSorted ? locale._week.dow : 0;

        if (index != null) {
            return get$1(format, (index + shift) % 7, field, 'day');
        }

        var i;
        var out = [];
        for (i = 0; i < 7; i++) {
            out[i] = get$1(format, (i + shift) % 7, field, 'day');
        }
        return out;
    }

    function listMonths (format, index) {
        return listMonthsImpl(format, index, 'months');
    }

    function listMonthsShort (format, index) {
        return listMonthsImpl(format, index, 'monthsShort');
    }

    function listWeekdays (localeSorted, format, index) {
        return listWeekdaysImpl(localeSorted, format, index, 'weekdays');
    }

    function listWeekdaysShort (localeSorted, format, index) {
        return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort');
    }

    function listWeekdaysMin (localeSorted, format, index) {
        return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin');
    }

    getSetGlobalLocale('en', {
        dayOfMonthOrdinalParse: /\d{1,2}(th|st|nd|rd)/,
        ordinal : function (number) {
            var b = number % 10,
                output = (toInt(number % 100 / 10) === 1) ? 'th' :
                (b === 1) ? 'st' :
                (b === 2) ? 'nd' :
                (b === 3) ? 'rd' : 'th';
            return number + output;
        }
    });

    // Side effect imports

    hooks.lang = deprecate('moment.lang is deprecated. Use moment.locale instead.', getSetGlobalLocale);
    hooks.langData = deprecate('moment.langData is deprecated. Use moment.localeData instead.', getLocale);

    var mathAbs = Math.abs;

    function abs () {
        var data           = this._data;

        this._milliseconds = mathAbs(this._milliseconds);
        this._days         = mathAbs(this._days);
        this._months       = mathAbs(this._months);

        data.milliseconds  = mathAbs(data.milliseconds);
        data.seconds       = mathAbs(data.seconds);
        data.minutes       = mathAbs(data.minutes);
        data.hours         = mathAbs(data.hours);
        data.months        = mathAbs(data.months);
        data.years         = mathAbs(data.years);

        return this;
    }

    function addSubtract$1 (duration, input, value, direction) {
        var other = createDuration(input, value);

        duration._milliseconds += direction * other._milliseconds;
        duration._days         += direction * other._days;
        duration._months       += direction * other._months;

        return duration._bubble();
    }

    // supports only 2.0-style add(1, 's') or add(duration)
    function add$1 (input, value) {
        return addSubtract$1(this, input, value, 1);
    }

    // supports only 2.0-style subtract(1, 's') or subtract(duration)
    function subtract$1 (input, value) {
        return addSubtract$1(this, input, value, -1);
    }

    function absCeil (number) {
        if (number < 0) {
            return Math.floor(number);
        } else {
            return Math.ceil(number);
        }
    }

    function bubble () {
        var milliseconds = this._milliseconds;
        var days         = this._days;
        var months       = this._months;
        var data         = this._data;
        var seconds, minutes, hours, years, monthsFromDays;

        // if we have a mix of positive and negative values, bubble down first
        // check: https://github.com/moment/moment/issues/2166
        if (!((milliseconds >= 0 && days >= 0 && months >= 0) ||
                (milliseconds <= 0 && days <= 0 && months <= 0))) {
            milliseconds += absCeil(monthsToDays(months) + days) * 864e5;
            days = 0;
            months = 0;
        }

        // The following code bubbles up values, see the tests for
        // examples of what that means.
        data.milliseconds = milliseconds % 1000;

        seconds           = absFloor(milliseconds / 1000);
        data.seconds      = seconds % 60;

        minutes           = absFloor(seconds / 60);
        data.minutes      = minutes % 60;

        hours             = absFloor(minutes / 60);
        data.hours        = hours % 24;

        days += absFloor(hours / 24);

        // convert days to months
        monthsFromDays = absFloor(daysToMonths(days));
        months += monthsFromDays;
        days -= absCeil(monthsToDays(monthsFromDays));

        // 12 months -> 1 year
        years = absFloor(months / 12);
        months %= 12;

        data.days   = days;
        data.months = months;
        data.years  = years;

        return this;
    }

    function daysToMonths (days) {
        // 400 years have 146097 days (taking into account leap year rules)
        // 400 years have 12 months === 4800
        return days * 4800 / 146097;
    }

    function monthsToDays (months) {
        // the reverse of daysToMonths
        return months * 146097 / 4800;
    }

    function as (units) {
        if (!this.isValid()) {
            return NaN;
        }
        var days;
        var months;
        var milliseconds = this._milliseconds;

        units = normalizeUnits(units);

        if (units === 'month' || units === 'year') {
            days   = this._days   + milliseconds / 864e5;
            months = this._months + daysToMonths(days);
            return units === 'month' ? months : months / 12;
        } else {
            // handle milliseconds separately because of floating point math errors (issue #1867)
            days = this._days + Math.round(monthsToDays(this._months));
            switch (units) {
                case 'week'   : return days / 7     + milliseconds / 6048e5;
                case 'day'    : return days         + milliseconds / 864e5;
                case 'hour'   : return days * 24    + milliseconds / 36e5;
                case 'minute' : return days * 1440  + milliseconds / 6e4;
                case 'second' : return days * 86400 + milliseconds / 1000;
                // Math.floor prevents floating point math errors here
                case 'millisecond': return Math.floor(days * 864e5) + milliseconds;
                default: throw new Error('Unknown unit ' + units);
            }
        }
    }

    // TODO: Use this.as('ms')?
    function valueOf$1 () {
        if (!this.isValid()) {
            return NaN;
        }
        return (
            this._milliseconds +
            this._days * 864e5 +
            (this._months % 12) * 2592e6 +
            toInt(this._months / 12) * 31536e6
        );
    }

    function makeAs (alias) {
        return function () {
            return this.as(alias);
        };
    }

    var asMilliseconds = makeAs('ms');
    var asSeconds      = makeAs('s');
    var asMinutes      = makeAs('m');
    var asHours        = makeAs('h');
    var asDays         = makeAs('d');
    var asWeeks        = makeAs('w');
    var asMonths       = makeAs('M');
    var asYears        = makeAs('y');

    function clone$1 () {
        return createDuration(this);
    }

    function get$2 (units) {
        units = normalizeUnits(units);
        return this.isValid() ? this[units + 's']() : NaN;
    }

    function makeGetter(name) {
        return function () {
            return this.isValid() ? this._data[name] : NaN;
        };
    }

    var milliseconds = makeGetter('milliseconds');
    var seconds      = makeGetter('seconds');
    var minutes      = makeGetter('minutes');
    var hours        = makeGetter('hours');
    var days         = makeGetter('days');
    var months       = makeGetter('months');
    var years        = makeGetter('years');

    function weeks () {
        return absFloor(this.days() / 7);
    }

    var round = Math.round;
    var thresholds = {
        ss: 44,         // a few seconds to seconds
        s : 45,         // seconds to minute
        m : 45,         // minutes to hour
        h : 22,         // hours to day
        d : 26,         // days to month
        M : 11          // months to year
    };

    // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize
    function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) {
        return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture);
    }

    function relativeTime$1 (posNegDuration, withoutSuffix, locale) {
        var duration = createDuration(posNegDuration).abs();
        var seconds  = round(duration.as('s'));
        var minutes  = round(duration.as('m'));
        var hours    = round(duration.as('h'));
        var days     = round(duration.as('d'));
        var months   = round(duration.as('M'));
        var years    = round(duration.as('y'));

        var a = seconds <= thresholds.ss && ['s', seconds]  ||
                seconds < thresholds.s   && ['ss', seconds] ||
                minutes <= 1             && ['m']           ||
                minutes < thresholds.m   && ['mm', minutes] ||
                hours   <= 1             && ['h']           ||
                hours   < thresholds.h   && ['hh', hours]   ||
                days    <= 1             && ['d']           ||
                days    < thresholds.d   && ['dd', days]    ||
                months  <= 1             && ['M']           ||
                months  < thresholds.M   && ['MM', months]  ||
                years   <= 1             && ['y']           || ['yy', years];

        a[2] = withoutSuffix;
        a[3] = +posNegDuration > 0;
        a[4] = locale;
        return substituteTimeAgo.apply(null, a);
    }

    // This function allows you to set the rounding function for relative time strings
    function getSetRelativeTimeRounding (roundingFunction) {
        if (roundingFunction === undefined) {
            return round;
        }
        if (typeof(roundingFunction) === 'function') {
            round = roundingFunction;
            return true;
        }
        return false;
    }

    // This function allows you to set a threshold for relative time strings
    function getSetRelativeTimeThreshold (threshold, limit) {
        if (thresholds[threshold] === undefined) {
            return false;
        }
        if (limit === undefined) {
            return thresholds[threshold];
        }
        thresholds[threshold] = limit;
        if (threshold === 's') {
            thresholds.ss = limit - 1;
        }
        return true;
    }

    function humanize (withSuffix) {
        if (!this.isValid()) {
            return this.localeData().invalidDate();
        }

        var locale = this.localeData();
        var output = relativeTime$1(this, !withSuffix, locale);

        if (withSuffix) {
            output = locale.pastFuture(+this, output);
        }

        return locale.postformat(output);
    }

    var abs$1 = Math.abs;

    function sign(x) {
        return ((x > 0) - (x < 0)) || +x;
    }

    function toISOString$1() {
        // for ISO strings we do not use the normal bubbling rules:
        //  * milliseconds bubble up until they become hours
        //  * days do not bubble at all
        //  * months bubble up until they become years
        // This is because there is no context-free conversion between hours and days
        // (think of clock changes)
        // and also not between days and months (28-31 days per month)
        if (!this.isValid()) {
            return this.localeData().invalidDate();
        }

        var seconds = abs$1(this._milliseconds) / 1000;
        var days         = abs$1(this._days);
        var months       = abs$1(this._months);
        var minutes, hours, years;

        // 3600 seconds -> 60 minutes -> 1 hour
        minutes           = absFloor(seconds / 60);
        hours             = absFloor(minutes / 60);
        seconds %= 60;
        minutes %= 60;

        // 12 months -> 1 year
        years  = absFloor(months / 12);
        months %= 12;


        // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js
        var Y = years;
        var M = months;
        var D = days;
        var h = hours;
        var m = minutes;
        var s = seconds ? seconds.toFixed(3).replace(/\.?0+$/, '') : '';
        var total = this.asSeconds();

        if (!total) {
            // this is the same as C#'s (Noda) and python (isodate)...
            // but not other JS (goog.date)
            return 'P0D';
        }

        var totalSign = total < 0 ? '-' : '';
        var ymSign = sign(this._months) !== sign(total) ? '-' : '';
        var daysSign = sign(this._days) !== sign(total) ? '-' : '';
        var hmsSign = sign(this._milliseconds) !== sign(total) ? '-' : '';

        return totalSign + 'P' +
            (Y ? ymSign + Y + 'Y' : '') +
            (M ? ymSign + M + 'M' : '') +
            (D ? daysSign + D + 'D' : '') +
            ((h || m || s) ? 'T' : '') +
            (h ? hmsSign + h + 'H' : '') +
            (m ? hmsSign + m + 'M' : '') +
            (s ? hmsSign + s + 'S' : '');
    }

    var proto$2 = Duration.prototype;

    proto$2.isValid        = isValid$1;
    proto$2.abs            = abs;
    proto$2.add            = add$1;
    proto$2.subtract       = subtract$1;
    proto$2.as             = as;
    proto$2.asMilliseconds = asMilliseconds;
    proto$2.asSeconds      = asSeconds;
    proto$2.asMinutes      = asMinutes;
    proto$2.asHours        = asHours;
    proto$2.asDays         = asDays;
    proto$2.asWeeks        = asWeeks;
    proto$2.asMonths       = asMonths;
    proto$2.asYears        = asYears;
    proto$2.valueOf        = valueOf$1;
    proto$2._bubble        = bubble;
    proto$2.clone          = clone$1;
    proto$2.get            = get$2;
    proto$2.milliseconds   = milliseconds;
    proto$2.seconds        = seconds;
    proto$2.minutes        = minutes;
    proto$2.hours          = hours;
    proto$2.days           = days;
    proto$2.weeks          = weeks;
    proto$2.months         = months;
    proto$2.years          = years;
    proto$2.humanize       = humanize;
    proto$2.toISOString    = toISOString$1;
    proto$2.toString       = toISOString$1;
    proto$2.toJSON         = toISOString$1;
    proto$2.locale         = locale;
    proto$2.localeData     = localeData;

    proto$2.toIsoString = deprecate('toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', toISOString$1);
    proto$2.lang = lang;

    // Side effect imports

    // FORMATTING

    addFormatToken('X', 0, 0, 'unix');
    addFormatToken('x', 0, 0, 'valueOf');

    // PARSING

    addRegexToken('x', matchSigned);
    addRegexToken('X', matchTimestamp);
    addParseToken('X', function (input, array, config) {
        config._d = new Date(parseFloat(input, 10) * 1000);
    });
    addParseToken('x', function (input, array, config) {
        config._d = new Date(toInt(input));
    });

    // Side effect imports


    hooks.version = '2.22.2';

    setHookCallback(createLocal);

    hooks.fn                    = proto;
    hooks.min                   = min;
    hooks.max                   = max;
    hooks.now                   = now;
    hooks.utc                   = createUTC;
    hooks.unix                  = createUnix;
    hooks.months                = listMonths;
    hooks.isDate                = isDate;
    hooks.locale                = getSetGlobalLocale;
    hooks.invalid               = createInvalid;
    hooks.duration              = createDuration;
    hooks.isMoment              = isMoment;
    hooks.weekdays              = listWeekdays;
    hooks.parseZone             = createInZone;
    hooks.localeData            = getLocale;
    hooks.isDuration            = isDuration;
    hooks.monthsShort           = listMonthsShort;
    hooks.weekdaysMin           = listWeekdaysMin;
    hooks.defineLocale          = defineLocale;
    hooks.updateLocale          = updateLocale;
    hooks.locales               = listLocales;
    hooks.weekdaysShort         = listWeekdaysShort;
    hooks.normalizeUnits        = normalizeUnits;
    hooks.relativeTimeRounding  = getSetRelativeTimeRounding;
    hooks.relativeTimeThreshold = getSetRelativeTimeThreshold;
    hooks.calendarFormat        = getCalendarFormat;
    hooks.prototype             = proto;

    // currently HTML5 input type only supports 24-hour formats
    hooks.HTML5_FMT = {
        DATETIME_LOCAL: 'YYYY-MM-DDTHH:mm',             // <input type="datetime-local" />
        DATETIME_LOCAL_SECONDS: 'YYYY-MM-DDTHH:mm:ss',  // <input type="datetime-local" step="1" />
        DATETIME_LOCAL_MS: 'YYYY-MM-DDTHH:mm:ss.SSS',   // <input type="datetime-local" step="0.001" />
        DATE: 'YYYY-MM-DD',                             // <input type="date" />
        TIME: 'HH:mm',                                  // <input type="time" />
        TIME_SECONDS: 'HH:mm:ss',                       // <input type="time" step="1" />
        TIME_MS: 'HH:mm:ss.SSS',                        // <input type="time" step="0.001" />
        WEEK: 'YYYY-[W]WW',                             // <input type="week" />
        MONTH: 'YYYY-MM'                                // <input type="month" />
    };

    return hooks;

})));

},{}],113:[function(require,module,exports){
(function (global){
//     Underscore.js 1.9.1
//     http://underscorejs.org
//     (c) 2009-2018 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
//     Underscore may be freely distributed under the MIT license.

(function() {

  // Baseline setup
  // --------------

  // Establish the root object, `window` (`self`) in the browser, `global`
  // on the server, or `this` in some virtual machines. We use `self`
  // instead of `window` for `WebWorker` support.
  var root = typeof self == 'object' && self.self === self && self ||
            typeof global == 'object' && global.global === global && global ||
            this ||
            {};

  // Save the previous value of the `_` variable.
  var previousUnderscore = root._;

  // Save bytes in the minified (but not gzipped) version:
  var ArrayProto = Array.prototype, ObjProto = Object.prototype;
  var SymbolProto = typeof Symbol !== 'undefined' ? Symbol.prototype : null;

  // Create quick reference variables for speed access to core prototypes.
  var push = ArrayProto.push,
      slice = ArrayProto.slice,
      toString = ObjProto.toString,
      hasOwnProperty = ObjProto.hasOwnProperty;

  // All **ECMAScript 5** native function implementations that we hope to use
  // are declared here.
  var nativeIsArray = Array.isArray,
      nativeKeys = Object.keys,
      nativeCreate = Object.create;

  // Naked function reference for surrogate-prototype-swapping.
  var Ctor = function(){};

  // Create a safe reference to the Underscore object for use below.
  var _ = function(obj) {
    if (obj instanceof _) return obj;
    if (!(this instanceof _)) return new _(obj);
    this._wrapped = obj;
  };

  // Export the Underscore object for **Node.js**, with
  // backwards-compatibility for their old module API. If we're in
  // the browser, add `_` as a global object.
  // (`nodeType` is checked to ensure that `module`
  // and `exports` are not HTML elements.)
  if (typeof exports != 'undefined' && !exports.nodeType) {
    if (typeof module != 'undefined' && !module.nodeType && module.exports) {
      exports = module.exports = _;
    }
    exports._ = _;
  } else {
    root._ = _;
  }

  // Current version.
  _.VERSION = '1.9.1';

  // Internal function that returns an efficient (for current engines) version
  // of the passed-in callback, to be repeatedly applied in other Underscore
  // functions.
  var optimizeCb = function(func, context, argCount) {
    if (context === void 0) return func;
    switch (argCount == null ? 3 : argCount) {
      case 1: return function(value) {
        return func.call(context, value);
      };
      // The 2-argument case is omitted because we’re not using it.
      case 3: return function(value, index, collection) {
        return func.call(context, value, index, collection);
      };
      case 4: return function(accumulator, value, index, collection) {
        return func.call(context, accumulator, value, index, collection);
      };
    }
    return function() {
      return func.apply(context, arguments);
    };
  };

  var builtinIteratee;

  // An internal function to generate callbacks that can be applied to each
  // element in a collection, returning the desired result — either `identity`,
  // an arbitrary callback, a property matcher, or a property accessor.
  var cb = function(value, context, argCount) {
    if (_.iteratee !== builtinIteratee) return _.iteratee(value, context);
    if (value == null) return _.identity;
    if (_.isFunction(value)) return optimizeCb(value, context, argCount);
    if (_.isObject(value) && !_.isArray(value)) return _.matcher(value);
    return _.property(value);
  };

  // External wrapper for our callback generator. Users may customize
  // `_.iteratee` if they want additional predicate/iteratee shorthand styles.
  // This abstraction hides the internal-only argCount argument.
  _.iteratee = builtinIteratee = function(value, context) {
    return cb(value, context, Infinity);
  };

  // Some functions take a variable number of arguments, or a few expected
  // arguments at the beginning and then a variable number of values to operate
  // on. This helper accumulates all remaining arguments past the function’s
  // argument length (or an explicit `startIndex`), into an array that becomes
  // the last argument. Similar to ES6’s "rest parameter".
  var restArguments = function(func, startIndex) {
    startIndex = startIndex == null ? func.length - 1 : +startIndex;
    return function() {
      var length = Math.max(arguments.length - startIndex, 0),
          rest = Array(length),
          index = 0;
      for (; index < length; index++) {
        rest[index] = arguments[index + startIndex];
      }
      switch (startIndex) {
        case 0: return func.call(this, rest);
        case 1: return func.call(this, arguments[0], rest);
        case 2: return func.call(this, arguments[0], arguments[1], rest);
      }
      var args = Array(startIndex + 1);
      for (index = 0; index < startIndex; index++) {
        args[index] = arguments[index];
      }
      args[startIndex] = rest;
      return func.apply(this, args);
    };
  };

  // An internal function for creating a new object that inherits from another.
  var baseCreate = function(prototype) {
    if (!_.isObject(prototype)) return {};
    if (nativeCreate) return nativeCreate(prototype);
    Ctor.prototype = prototype;
    var result = new Ctor;
    Ctor.prototype = null;
    return result;
  };

  var shallowProperty = function(key) {
    return function(obj) {
      return obj == null ? void 0 : obj[key];
    };
  };

  var has = function(obj, path) {
    return obj != null && hasOwnProperty.call(obj, path);
  }

  var deepGet = function(obj, path) {
    var length = path.length;
    for (var i = 0; i < length; i++) {
      if (obj == null) return void 0;
      obj = obj[path[i]];
    }
    return length ? obj : void 0;
  };

  // Helper for collection methods to determine whether a collection
  // should be iterated as an array or as an object.
  // Related: http://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength
  // Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094
  var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1;
  var getLength = shallowProperty('length');
  var isArrayLike = function(collection) {
    var length = getLength(collection);
    return typeof length == 'number' && length >= 0 && length <= MAX_ARRAY_INDEX;
  };

  // Collection Functions
  // --------------------

  // The cornerstone, an `each` implementation, aka `forEach`.
  // Handles raw objects in addition to array-likes. Treats all
  // sparse array-likes as if they were dense.
  _.each = _.forEach = function(obj, iteratee, context) {
    iteratee = optimizeCb(iteratee, context);
    var i, length;
    if (isArrayLike(obj)) {
      for (i = 0, length = obj.length; i < length; i++) {
        iteratee(obj[i], i, obj);
      }
    } else {
      var keys = _.keys(obj);
      for (i = 0, length = keys.length; i < length; i++) {
        iteratee(obj[keys[i]], keys[i], obj);
      }
    }
    return obj;
  };

  // Return the results of applying the iteratee to each element.
  _.map = _.collect = function(obj, iteratee, context) {
    iteratee = cb(iteratee, context);
    var keys = !isArrayLike(obj) && _.keys(obj),
        length = (keys || obj).length,
        results = Array(length);
    for (var index = 0; index < length; index++) {
      var currentKey = keys ? keys[index] : index;
      results[index] = iteratee(obj[currentKey], currentKey, obj);
    }
    return results;
  };

  // Create a reducing function iterating left or right.
  var createReduce = function(dir) {
    // Wrap code that reassigns argument variables in a separate function than
    // the one that accesses `arguments.length` to avoid a perf hit. (#1991)
    var reducer = function(obj, iteratee, memo, initial) {
      var keys = !isArrayLike(obj) && _.keys(obj),
          length = (keys || obj).length,
          index = dir > 0 ? 0 : length - 1;
      if (!initial) {
        memo = obj[keys ? keys[index] : index];
        index += dir;
      }
      for (; index >= 0 && index < length; index += dir) {
        var currentKey = keys ? keys[index] : index;
        memo = iteratee(memo, obj[currentKey], currentKey, obj);
      }
      return memo;
    };

    return function(obj, iteratee, memo, context) {
      var initial = arguments.length >= 3;
      return reducer(obj, optimizeCb(iteratee, context, 4), memo, initial);
    };
  };

  // **Reduce** builds up a single result from a list of values, aka `inject`,
  // or `foldl`.
  _.reduce = _.foldl = _.inject = createReduce(1);

  // The right-associative version of reduce, also known as `foldr`.
  _.reduceRight = _.foldr = createReduce(-1);

  // Return the first value which passes a truth test. Aliased as `detect`.
  _.find = _.detect = function(obj, predicate, context) {
    var keyFinder = isArrayLike(obj) ? _.findIndex : _.findKey;
    var key = keyFinder(obj, predicate, context);
    if (key !== void 0 && key !== -1) return obj[key];
  };

  // Return all the elements that pass a truth test.
  // Aliased as `select`.
  _.filter = _.select = function(obj, predicate, context) {
    var results = [];
    predicate = cb(predicate, context);
    _.each(obj, function(value, index, list) {
      if (predicate(value, index, list)) results.push(value);
    });
    return results;
  };

  // Return all the elements for which a truth test fails.
  _.reject = function(obj, predicate, context) {
    return _.filter(obj, _.negate(cb(predicate)), context);
  };

  // Determine whether all of the elements match a truth test.
  // Aliased as `all`.
  _.every = _.all = function(obj, predicate, context) {
    predicate = cb(predicate, context);
    var keys = !isArrayLike(obj) && _.keys(obj),
        length = (keys || obj).length;
    for (var index = 0; index < length; index++) {
      var currentKey = keys ? keys[index] : index;
      if (!predicate(obj[currentKey], currentKey, obj)) return false;
    }
    return true;
  };

  // Determine if at least one element in the object matches a truth test.
  // Aliased as `any`.
  _.some = _.any = function(obj, predicate, context) {
    predicate = cb(predicate, context);
    var keys = !isArrayLike(obj) && _.keys(obj),
        length = (keys || obj).length;
    for (var index = 0; index < length; index++) {
      var currentKey = keys ? keys[index] : index;
      if (predicate(obj[currentKey], currentKey, obj)) return true;
    }
    return false;
  };

  // Determine if the array or object contains a given item (using `===`).
  // Aliased as `includes` and `include`.
  _.contains = _.includes = _.include = function(obj, item, fromIndex, guard) {
    if (!isArrayLike(obj)) obj = _.values(obj);
    if (typeof fromIndex != 'number' || guard) fromIndex = 0;
    return _.indexOf(obj, item, fromIndex) >= 0;
  };

  // Invoke a method (with arguments) on every item in a collection.
  _.invoke = restArguments(function(obj, path, args) {
    var contextPath, func;
    if (_.isFunction(path)) {
      func = path;
    } else if (_.isArray(path)) {
      contextPath = path.slice(0, -1);
      path = path[path.length - 1];
    }
    return _.map(obj, function(context) {
      var method = func;
      if (!method) {
        if (contextPath && contextPath.length) {
          context = deepGet(context, contextPath);
        }
        if (context == null) return void 0;
        method = context[path];
      }
      return method == null ? method : method.apply(context, args);
    });
  });

  // Convenience version of a common use case of `map`: fetching a property.
  _.pluck = function(obj, key) {
    return _.map(obj, _.property(key));
  };

  // Convenience version of a common use case of `filter`: selecting only objects
  // containing specific `key:value` pairs.
  _.where = function(obj, attrs) {
    return _.filter(obj, _.matcher(attrs));
  };

  // Convenience version of a common use case of `find`: getting the first object
  // containing specific `key:value` pairs.
  _.findWhere = function(obj, attrs) {
    return _.find(obj, _.matcher(attrs));
  };

  // Return the maximum element (or element-based computation).
  _.max = function(obj, iteratee, context) {
    var result = -Infinity, lastComputed = -Infinity,
        value, computed;
    if (iteratee == null || typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null) {
      obj = isArrayLike(obj) ? obj : _.values(obj);
      for (var i = 0, length = obj.length; i < length; i++) {
        value = obj[i];
        if (value != null && value > result) {
          result = value;
        }
      }
    } else {
      iteratee = cb(iteratee, context);
      _.each(obj, function(v, index, list) {
        computed = iteratee(v, index, list);
        if (computed > lastComputed || computed === -Infinity && result === -Infinity) {
          result = v;
          lastComputed = computed;
        }
      });
    }
    return result;
  };

  // Return the minimum element (or element-based computation).
  _.min = function(obj, iteratee, context) {
    var result = Infinity, lastComputed = Infinity,
        value, computed;
    if (iteratee == null || typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null) {
      obj = isArrayLike(obj) ? obj : _.values(obj);
      for (var i = 0, length = obj.length; i < length; i++) {
        value = obj[i];
        if (value != null && value < result) {
          result = value;
        }
      }
    } else {
      iteratee = cb(iteratee, context);
      _.each(obj, function(v, index, list) {
        computed = iteratee(v, index, list);
        if (computed < lastComputed || computed === Infinity && result === Infinity) {
          result = v;
          lastComputed = computed;
        }
      });
    }
    return result;
  };

  // Shuffle a collection.
  _.shuffle = function(obj) {
    return _.sample(obj, Infinity);
  };

  // Sample **n** random values from a collection using the modern version of the
  // [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher–Yates_shuffle).
  // If **n** is not specified, returns a single random element.
  // The internal `guard` argument allows it to work with `map`.
  _.sample = function(obj, n, guard) {
    if (n == null || guard) {
      if (!isArrayLike(obj)) obj = _.values(obj);
      return obj[_.random(obj.length - 1)];
    }
    var sample = isArrayLike(obj) ? _.clone(obj) : _.values(obj);
    var length = getLength(sample);
    n = Math.max(Math.min(n, length), 0);
    var last = length - 1;
    for (var index = 0; index < n; index++) {
      var rand = _.random(index, last);
      var temp = sample[index];
      sample[index] = sample[rand];
      sample[rand] = temp;
    }
    return sample.slice(0, n);
  };

  // Sort the object's values by a criterion produced by an iteratee.
  _.sortBy = function(obj, iteratee, context) {
    var index = 0;
    iteratee = cb(iteratee, context);
    return _.pluck(_.map(obj, function(value, key, list) {
      return {
        value: value,
        index: index++,
        criteria: iteratee(value, key, list)
      };
    }).sort(function(left, right) {
      var a = left.criteria;
      var b = right.criteria;
      if (a !== b) {
        if (a > b || a === void 0) return 1;
        if (a < b || b === void 0) return -1;
      }
      return left.index - right.index;
    }), 'value');
  };

  // An internal function used for aggregate "group by" operations.
  var group = function(behavior, partition) {
    return function(obj, iteratee, context) {
      var result = partition ? [[], []] : {};
      iteratee = cb(iteratee, context);
      _.each(obj, function(value, index) {
        var key = iteratee(value, index, obj);
        behavior(result, value, key);
      });
      return result;
    };
  };

  // Groups the object's values by a criterion. Pass either a string attribute
  // to group by, or a function that returns the criterion.
  _.groupBy = group(function(result, value, key) {
    if (has(result, key)) result[key].push(value); else result[key] = [value];
  });

  // Indexes the object's values by a criterion, similar to `groupBy`, but for
  // when you know that your index values will be unique.
  _.indexBy = group(function(result, value, key) {
    result[key] = value;
  });

  // Counts instances of an object that group by a certain criterion. Pass
  // either a string attribute to count by, or a function that returns the
  // criterion.
  _.countBy = group(function(result, value, key) {
    if (has(result, key)) result[key]++; else result[key] = 1;
  });

  var reStrSymbol = /[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g;
  // Safely create a real, live array from anything iterable.
  _.toArray = function(obj) {
    if (!obj) return [];
    if (_.isArray(obj)) return slice.call(obj);
    if (_.isString(obj)) {
      // Keep surrogate pair characters together
      return obj.match(reStrSymbol);
    }
    if (isArrayLike(obj)) return _.map(obj, _.identity);
    return _.values(obj);
  };

  // Return the number of elements in an object.
  _.size = function(obj) {
    if (obj == null) return 0;
    return isArrayLike(obj) ? obj.length : _.keys(obj).length;
  };

  // Split a collection into two arrays: one whose elements all satisfy the given
  // predicate, and one whose elements all do not satisfy the predicate.
  _.partition = group(function(result, value, pass) {
    result[pass ? 0 : 1].push(value);
  }, true);

  // Array Functions
  // ---------------

  // Get the first element of an array. Passing **n** will return the first N
  // values in the array. Aliased as `head` and `take`. The **guard** check
  // allows it to work with `_.map`.
  _.first = _.head = _.take = function(array, n, guard) {
    if (array == null || array.length < 1) return n == null ? void 0 : [];
    if (n == null || guard) return array[0];
    return _.initial(array, array.length - n);
  };

  // Returns everything but the last entry of the array. Especially useful on
  // the arguments object. Passing **n** will return all the values in
  // the array, excluding the last N.
  _.initial = function(array, n, guard) {
    return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n)));
  };

  // Get the last element of an array. Passing **n** will return the last N
  // values in the array.
  _.last = function(array, n, guard) {
    if (array == null || array.length < 1) return n == null ? void 0 : [];
    if (n == null || guard) return array[array.length - 1];
    return _.rest(array, Math.max(0, array.length - n));
  };

  // Returns everything but the first entry of the array. Aliased as `tail` and `drop`.
  // Especially useful on the arguments object. Passing an **n** will return
  // the rest N values in the array.
  _.rest = _.tail = _.drop = function(array, n, guard) {
    return slice.call(array, n == null || guard ? 1 : n);
  };

  // Trim out all falsy values from an array.
  _.compact = function(array) {
    return _.filter(array, Boolean);
  };

  // Internal implementation of a recursive `flatten` function.
  var flatten = function(input, shallow, strict, output) {
    output = output || [];
    var idx = output.length;
    for (var i = 0, length = getLength(input); i < length; i++) {
      var value = input[i];
      if (isArrayLike(value) && (_.isArray(value) || _.isArguments(value))) {
        // Flatten current level of array or arguments object.
        if (shallow) {
          var j = 0, len = value.length;
          while (j < len) output[idx++] = value[j++];
        } else {
          flatten(value, shallow, strict, output);
          idx = output.length;
        }
      } else if (!strict) {
        output[idx++] = value;
      }
    }
    return output;
  };

  // Flatten out an array, either recursively (by default), or just one level.
  _.flatten = function(array, shallow) {
    return flatten(array, shallow, false);
  };

  // Return a version of the array that does not contain the specified value(s).
  _.without = restArguments(function(array, otherArrays) {
    return _.difference(array, otherArrays);
  });

  // Produce a duplicate-free version of the array. If the array has already
  // been sorted, you have the option of using a faster algorithm.
  // The faster algorithm will not work with an iteratee if the iteratee
  // is not a one-to-one function, so providing an iteratee will disable
  // the faster algorithm.
  // Aliased as `unique`.
  _.uniq = _.unique = function(array, isSorted, iteratee, context) {
    if (!_.isBoolean(isSorted)) {
      context = iteratee;
      iteratee = isSorted;
      isSorted = false;
    }
    if (iteratee != null) iteratee = cb(iteratee, context);
    var result = [];
    var seen = [];
    for (var i = 0, length = getLength(array); i < length; i++) {
      var value = array[i],
          computed = iteratee ? iteratee(value, i, array) : value;
      if (isSorted && !iteratee) {
        if (!i || seen !== computed) result.push(value);
        seen = computed;
      } else if (iteratee) {
        if (!_.contains(seen, computed)) {
          seen.push(computed);
          result.push(value);
        }
      } else if (!_.contains(result, value)) {
        result.push(value);
      }
    }
    return result;
  };

  // Produce an array that contains the union: each distinct element from all of
  // the passed-in arrays.
  _.union = restArguments(function(arrays) {
    return _.uniq(flatten(arrays, true, true));
  });

  // Produce an array that contains every item shared between all the
  // passed-in arrays.
  _.intersection = function(array) {
    var result = [];
    var argsLength = arguments.length;
    for (var i = 0, length = getLength(array); i < length; i++) {
      var item = array[i];
      if (_.contains(result, item)) continue;
      var j;
      for (j = 1; j < argsLength; j++) {
        if (!_.contains(arguments[j], item)) break;
      }
      if (j === argsLength) result.push(item);
    }
    return result;
  };

  // Take the difference between one array and a number of other arrays.
  // Only the elements present in just the first array will remain.
  _.difference = restArguments(function(array, rest) {
    rest = flatten(rest, true, true);
    return _.filter(array, function(value){
      return !_.contains(rest, value);
    });
  });

  // Complement of _.zip. Unzip accepts an array of arrays and groups
  // each array's elements on shared indices.
  _.unzip = function(array) {
    var length = array && _.max(array, getLength).length || 0;
    var result = Array(length);

    for (var index = 0; index < length; index++) {
      result[index] = _.pluck(array, index);
    }
    return result;
  };

  // Zip together multiple lists into a single array -- elements that share
  // an index go together.
  _.zip = restArguments(_.unzip);

  // Converts lists into objects. Pass either a single array of `[key, value]`
  // pairs, or two parallel arrays of the same length -- one of keys, and one of
  // the corresponding values. Passing by pairs is the reverse of _.pairs.
  _.object = function(list, values) {
    var result = {};
    for (var i = 0, length = getLength(list); i < length; i++) {
      if (values) {
        result[list[i]] = values[i];
      } else {
        result[list[i][0]] = list[i][1];
      }
    }
    return result;
  };

  // Generator function to create the findIndex and findLastIndex functions.
  var createPredicateIndexFinder = function(dir) {
    return function(array, predicate, context) {
      predicate = cb(predicate, context);
      var length = getLength(array);
      var index = dir > 0 ? 0 : length - 1;
      for (; index >= 0 && index < length; index += dir) {
        if (predicate(array[index], index, array)) return index;
      }
      return -1;
    };
  };

  // Returns the first index on an array-like that passes a predicate test.
  _.findIndex = createPredicateIndexFinder(1);
  _.findLastIndex = createPredicateIndexFinder(-1);

  // Use a comparator function to figure out the smallest index at which
  // an object should be inserted so as to maintain order. Uses binary search.
  _.sortedIndex = function(array, obj, iteratee, context) {
    iteratee = cb(iteratee, context, 1);
    var value = iteratee(obj);
    var low = 0, high = getLength(array);
    while (low < high) {
      var mid = Math.floor((low + high) / 2);
      if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;
    }
    return low;
  };

  // Generator function to create the indexOf and lastIndexOf functions.
  var createIndexFinder = function(dir, predicateFind, sortedIndex) {
    return function(array, item, idx) {
      var i = 0, length = getLength(array);
      if (typeof idx == 'number') {
        if (dir > 0) {
          i = idx >= 0 ? idx : Math.max(idx + length, i);
        } else {
          length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1;
        }
      } else if (sortedIndex && idx && length) {
        idx = sortedIndex(array, item);
        return array[idx] === item ? idx : -1;
      }
      if (item !== item) {
        idx = predicateFind(slice.call(array, i, length), _.isNaN);
        return idx >= 0 ? idx + i : -1;
      }
      for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) {
        if (array[idx] === item) return idx;
      }
      return -1;
    };
  };

  // Return the position of the first occurrence of an item in an array,
  // or -1 if the item is not included in the array.
  // If the array is large and already in sort order, pass `true`
  // for **isSorted** to use binary search.
  _.indexOf = createIndexFinder(1, _.findIndex, _.sortedIndex);
  _.lastIndexOf = createIndexFinder(-1, _.findLastIndex);

  // Generate an integer Array containing an arithmetic progression. A port of
  // the native Python `range()` function. See
  // [the Python documentation](http://docs.python.org/library/functions.html#range).
  _.range = function(start, stop, step) {
    if (stop == null) {
      stop = start || 0;
      start = 0;
    }
    if (!step) {
      step = stop < start ? -1 : 1;
    }

    var length = Math.max(Math.ceil((stop - start) / step), 0);
    var range = Array(length);

    for (var idx = 0; idx < length; idx++, start += step) {
      range[idx] = start;
    }

    return range;
  };

  // Chunk a single array into multiple arrays, each containing `count` or fewer
  // items.
  _.chunk = function(array, count) {
    if (count == null || count < 1) return [];
    var result = [];
    var i = 0, length = array.length;
    while (i < length) {
      result.push(slice.call(array, i, i += count));
    }
    return result;
  };

  // Function (ahem) Functions
  // ------------------

  // Determines whether to execute a function as a constructor
  // or a normal function with the provided arguments.
  var executeBound = function(sourceFunc, boundFunc, context, callingContext, args) {
    if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args);
    var self = baseCreate(sourceFunc.prototype);
    var result = sourceFunc.apply(self, args);
    if (_.isObject(result)) return result;
    return self;
  };

  // Create a function bound to a given object (assigning `this`, and arguments,
  // optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if
  // available.
  _.bind = restArguments(function(func, context, args) {
    if (!_.isFunction(func)) throw new TypeError('Bind must be called on a function');
    var bound = restArguments(function(callArgs) {
      return executeBound(func, bound, context, this, args.concat(callArgs));
    });
    return bound;
  });

  // Partially apply a function by creating a version that has had some of its
  // arguments pre-filled, without changing its dynamic `this` context. _ acts
  // as a placeholder by default, allowing any combination of arguments to be
  // pre-filled. Set `_.partial.placeholder` for a custom placeholder argument.
  _.partial = restArguments(function(func, boundArgs) {
    var placeholder = _.partial.placeholder;
    var bound = function() {
      var position = 0, length = boundArgs.length;
      var args = Array(length);
      for (var i = 0; i < length; i++) {
        args[i] = boundArgs[i] === placeholder ? arguments[position++] : boundArgs[i];
      }
      while (position < arguments.length) args.push(arguments[position++]);
      return executeBound(func, bound, this, this, args);
    };
    return bound;
  });

  _.partial.placeholder = _;

  // Bind a number of an object's methods to that object. Remaining arguments
  // are the method names to be bound. Useful for ensuring that all callbacks
  // defined on an object belong to it.
  _.bindAll = restArguments(function(obj, keys) {
    keys = flatten(keys, false, false);
    var index = keys.length;
    if (index < 1) throw new Error('bindAll must be passed function names');
    while (index--) {
      var key = keys[index];
      obj[key] = _.bind(obj[key], obj);
    }
  });

  // Memoize an expensive function by storing its results.
  _.memoize = function(func, hasher) {
    var memoize = function(key) {
      var cache = memoize.cache;
      var address = '' + (hasher ? hasher.apply(this, arguments) : key);
      if (!has(cache, address)) cache[address] = func.apply(this, arguments);
      return cache[address];
    };
    memoize.cache = {};
    return memoize;
  };

  // Delays a function for the given number of milliseconds, and then calls
  // it with the arguments supplied.
  _.delay = restArguments(function(func, wait, args) {
    return setTimeout(function() {
      return func.apply(null, args);
    }, wait);
  });

  // Defers a function, scheduling it to run after the current call stack has
  // cleared.
  _.defer = _.partial(_.delay, _, 1);

  // Returns a function, that, when invoked, will only be triggered at most once
  // during a given window of time. Normally, the throttled function will run
  // as much as it can, without ever going more than once per `wait` duration;
  // but if you'd like to disable the execution on the leading edge, pass
  // `{leading: false}`. To disable execution on the trailing edge, ditto.
  _.throttle = function(func, wait, options) {
    var timeout, context, args, result;
    var previous = 0;
    if (!options) options = {};

    var later = function() {
      previous = options.leading === false ? 0 : _.now();
      timeout = null;
      result = func.apply(context, args);
      if (!timeout) context = args = null;
    };

    var throttled = function() {
      var now = _.now();
      if (!previous && options.leading === false) previous = now;
      var remaining = wait - (now - previous);
      context = this;
      args = arguments;
      if (remaining <= 0 || remaining > wait) {
        if (timeout) {
          clearTimeout(timeout);
          timeout = null;
        }
        previous = now;
        result = func.apply(context, args);
        if (!timeout) context = args = null;
      } else if (!timeout && options.trailing !== false) {
        timeout = setTimeout(later, remaining);
      }
      return result;
    };

    throttled.cancel = function() {
      clearTimeout(timeout);
      previous = 0;
      timeout = context = args = null;
    };

    return throttled;
  };

  // Returns a function, that, as long as it continues to be invoked, will not
  // be triggered. The function will be called after it stops being called for
  // N milliseconds. If `immediate` is passed, trigger the function on the
  // leading edge, instead of the trailing.
  _.debounce = function(func, wait, immediate) {
    var timeout, result;

    var later = function(context, args) {
      timeout = null;
      if (args) result = func.apply(context, args);
    };

    var debounced = restArguments(function(args) {
      if (timeout) clearTimeout(timeout);
      if (immediate) {
        var callNow = !timeout;
        timeout = setTimeout(later, wait);
        if (callNow) result = func.apply(this, args);
      } else {
        timeout = _.delay(later, wait, this, args);
      }

      return result;
    });

    debounced.cancel = function() {
      clearTimeout(timeout);
      timeout = null;
    };

    return debounced;
  };

  // Returns the first function passed as an argument to the second,
  // allowing you to adjust arguments, run code before and after, and
  // conditionally execute the original function.
  _.wrap = function(func, wrapper) {
    return _.partial(wrapper, func);
  };

  // Returns a negated version of the passed-in predicate.
  _.negate = function(predicate) {
    return function() {
      return !predicate.apply(this, arguments);
    };
  };

  // Returns a function that is the composition of a list of functions, each
  // consuming the return value of the function that follows.
  _.compose = function() {
    var args = arguments;
    var start = args.length - 1;
    return function() {
      var i = start;
      var result = args[start].apply(this, arguments);
      while (i--) result = args[i].call(this, result);
      return result;
    };
  };

  // Returns a function that will only be executed on and after the Nth call.
  _.after = function(times, func) {
    return function() {
      if (--times < 1) {
        return func.apply(this, arguments);
      }
    };
  };

  // Returns a function that will only be executed up to (but not including) the Nth call.
  _.before = function(times, func) {
    var memo;
    return function() {
      if (--times > 0) {
        memo = func.apply(this, arguments);
      }
      if (times <= 1) func = null;
      return memo;
    };
  };

  // Returns a function that will be executed at most one time, no matter how
  // often you call it. Useful for lazy initialization.
  _.once = _.partial(_.before, 2);

  _.restArguments = restArguments;

  // Object Functions
  // ----------------

  // Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed.
  var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString');
  var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString',
    'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];

  var collectNonEnumProps = function(obj, keys) {
    var nonEnumIdx = nonEnumerableProps.length;
    var constructor = obj.constructor;
    var proto = _.isFunction(constructor) && constructor.prototype || ObjProto;

    // Constructor is a special case.
    var prop = 'constructor';
    if (has(obj, prop) && !_.contains(keys, prop)) keys.push(prop);

    while (nonEnumIdx--) {
      prop = nonEnumerableProps[nonEnumIdx];
      if (prop in obj && obj[prop] !== proto[prop] && !_.contains(keys, prop)) {
        keys.push(prop);
      }
    }
  };

  // Retrieve the names of an object's own properties.
  // Delegates to **ECMAScript 5**'s native `Object.keys`.
  _.keys = function(obj) {
    if (!_.isObject(obj)) return [];
    if (nativeKeys) return nativeKeys(obj);
    var keys = [];
    for (var key in obj) if (has(obj, key)) keys.push(key);
    // Ahem, IE < 9.
    if (hasEnumBug) collectNonEnumProps(obj, keys);
    return keys;
  };

  // Retrieve all the property names of an object.
  _.allKeys = function(obj) {
    if (!_.isObject(obj)) return [];
    var keys = [];
    for (var key in obj) keys.push(key);
    // Ahem, IE < 9.
    if (hasEnumBug) collectNonEnumProps(obj, keys);
    return keys;
  };

  // Retrieve the values of an object's properties.
  _.values = function(obj) {
    var keys = _.keys(obj);
    var length = keys.length;
    var values = Array(length);
    for (var i = 0; i < length; i++) {
      values[i] = obj[keys[i]];
    }
    return values;
  };

  // Returns the results of applying the iteratee to each element of the object.
  // In contrast to _.map it returns an object.
  _.mapObject = function(obj, iteratee, context) {
    iteratee = cb(iteratee, context);
    var keys = _.keys(obj),
        length = keys.length,
        results = {};
    for (var index = 0; index < length; index++) {
      var currentKey = keys[index];
      results[currentKey] = iteratee(obj[currentKey], currentKey, obj);
    }
    return results;
  };

  // Convert an object into a list of `[key, value]` pairs.
  // The opposite of _.object.
  _.pairs = function(obj) {
    var keys = _.keys(obj);
    var length = keys.length;
    var pairs = Array(length);
    for (var i = 0; i < length; i++) {
      pairs[i] = [keys[i], obj[keys[i]]];
    }
    return pairs;
  };

  // Invert the keys and values of an object. The values must be serializable.
  _.invert = function(obj) {
    var result = {};
    var keys = _.keys(obj);
    for (var i = 0, length = keys.length; i < length; i++) {
      result[obj[keys[i]]] = keys[i];
    }
    return result;
  };

  // Return a sorted list of the function names available on the object.
  // Aliased as `methods`.
  _.functions = _.methods = function(obj) {
    var names = [];
    for (var key in obj) {
      if (_.isFunction(obj[key])) names.push(key);
    }
    return names.sort();
  };

  // An internal function for creating assigner functions.
  var createAssigner = function(keysFunc, defaults) {
    return function(obj) {
      var length = arguments.length;
      if (defaults) obj = Object(obj);
      if (length < 2 || obj == null) return obj;
      for (var index = 1; index < length; index++) {
        var source = arguments[index],
            keys = keysFunc(source),
            l = keys.length;
        for (var i = 0; i < l; i++) {
          var key = keys[i];
          if (!defaults || obj[key] === void 0) obj[key] = source[key];
        }
      }
      return obj;
    };
  };

  // Extend a given object with all the properties in passed-in object(s).
  _.extend = createAssigner(_.allKeys);

  // Assigns a given object with all the own properties in the passed-in object(s).
  // (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)
  _.extendOwn = _.assign = createAssigner(_.keys);

  // Returns the first key on an object that passes a predicate test.
  _.findKey = function(obj, predicate, context) {
    predicate = cb(predicate, context);
    var keys = _.keys(obj), key;
    for (var i = 0, length = keys.length; i < length; i++) {
      key = keys[i];
      if (predicate(obj[key], key, obj)) return key;
    }
  };

  // Internal pick helper function to determine if `obj` has key `key`.
  var keyInObj = function(value, key, obj) {
    return key in obj;
  };

  // Return a copy of the object only containing the whitelisted properties.
  _.pick = restArguments(function(obj, keys) {
    var result = {}, iteratee = keys[0];
    if (obj == null) return result;
    if (_.isFunction(iteratee)) {
      if (keys.length > 1) iteratee = optimizeCb(iteratee, keys[1]);
      keys = _.allKeys(obj);
    } else {
      iteratee = keyInObj;
      keys = flatten(keys, false, false);
      obj = Object(obj);
    }
    for (var i = 0, length = keys.length; i < length; i++) {
      var key = keys[i];
      var value = obj[key];
      if (iteratee(value, key, obj)) result[key] = value;
    }
    return result;
  });

  // Return a copy of the object without the blacklisted properties.
  _.omit = restArguments(function(obj, keys) {
    var iteratee = keys[0], context;
    if (_.isFunction(iteratee)) {
      iteratee = _.negate(iteratee);
      if (keys.length > 1) context = keys[1];
    } else {
      keys = _.map(flatten(keys, false, false), String);
      iteratee = function(value, key) {
        return !_.contains(keys, key);
      };
    }
    return _.pick(obj, iteratee, context);
  });

  // Fill in a given object with default properties.
  _.defaults = createAssigner(_.allKeys, true);

  // Creates an object that inherits from the given prototype object.
  // If additional properties are provided then they will be added to the
  // created object.
  _.create = function(prototype, props) {
    var result = baseCreate(prototype);
    if (props) _.extendOwn(result, props);
    return result;
  };

  // Create a (shallow-cloned) duplicate of an object.
  _.clone = function(obj) {
    if (!_.isObject(obj)) return obj;
    return _.isArray(obj) ? obj.slice() : _.extend({}, obj);
  };

  // Invokes interceptor with the obj, and then returns obj.
  // The primary purpose of this method is to "tap into" a method chain, in
  // order to perform operations on intermediate results within the chain.
  _.tap = function(obj, interceptor) {
    interceptor(obj);
    return obj;
  };

  // Returns whether an object has a given set of `key:value` pairs.
  _.isMatch = function(object, attrs) {
    var keys = _.keys(attrs), length = keys.length;
    if (object == null) return !length;
    var obj = Object(object);
    for (var i = 0; i < length; i++) {
      var key = keys[i];
      if (attrs[key] !== obj[key] || !(key in obj)) return false;
    }
    return true;
  };


  // Internal recursive comparison function for `isEqual`.
  var eq, deepEq;
  eq = function(a, b, aStack, bStack) {
    // Identical objects are equal. `0 === -0`, but they aren't identical.
    // See the [Harmony `egal` proposal](http://wiki.ecmascript.org/doku.php?id=harmony:egal).
    if (a === b) return a !== 0 || 1 / a === 1 / b;
    // `null` or `undefined` only equal to itself (strict comparison).
    if (a == null || b == null) return false;
    // `NaN`s are equivalent, but non-reflexive.
    if (a !== a) return b !== b;
    // Exhaust primitive checks
    var type = typeof a;
    if (type !== 'function' && type !== 'object' && typeof b != 'object') return false;
    return deepEq(a, b, aStack, bStack);
  };

  // Internal recursive comparison function for `isEqual`.
  deepEq = function(a, b, aStack, bStack) {
    // Unwrap any wrapped objects.
    if (a instanceof _) a = a._wrapped;
    if (b instanceof _) b = b._wrapped;
    // Compare `[[Class]]` names.
    var className = toString.call(a);
    if (className !== toString.call(b)) return false;
    switch (className) {
      // Strings, numbers, regular expressions, dates, and booleans are compared by value.
      case '[object RegExp]':
      // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i')
      case '[object String]':
        // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is
        // equivalent to `new String("5")`.
        return '' + a === '' + b;
      case '[object Number]':
        // `NaN`s are equivalent, but non-reflexive.
        // Object(NaN) is equivalent to NaN.
        if (+a !== +a) return +b !== +b;
        // An `egal` comparison is performed for other numeric values.
        return +a === 0 ? 1 / +a === 1 / b : +a === +b;
      case '[object Date]':
      case '[object Boolean]':
        // Coerce dates and booleans to numeric primitive values. Dates are compared by their
        // millisecond representations. Note that invalid dates with millisecond representations
        // of `NaN` are not equivalent.
        return +a === +b;
      case '[object Symbol]':
        return SymbolProto.valueOf.call(a) === SymbolProto.valueOf.call(b);
    }

    var areArrays = className === '[object Array]';
    if (!areArrays) {
      if (typeof a != 'object' || typeof b != 'object') return false;

      // Objects with different constructors are not equivalent, but `Object`s or `Array`s
      // from different frames are.
      var aCtor = a.constructor, bCtor = b.constructor;
      if (aCtor !== bCtor && !(_.isFunction(aCtor) && aCtor instanceof aCtor &&
                               _.isFunction(bCtor) && bCtor instanceof bCtor)
                          && ('constructor' in a && 'constructor' in b)) {
        return false;
      }
    }
    // Assume equality for cyclic structures. The algorithm for detecting cyclic
    // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.

    // Initializing stack of traversed objects.
    // It's done here since we only need them for objects and arrays comparison.
    aStack = aStack || [];
    bStack = bStack || [];
    var length = aStack.length;
    while (length--) {
      // Linear search. Performance is inversely proportional to the number of
      // unique nested structures.
      if (aStack[length] === a) return bStack[length] === b;
    }

    // Add the first object to the stack of traversed objects.
    aStack.push(a);
    bStack.push(b);

    // Recursively compare objects and arrays.
    if (areArrays) {
      // Compare array lengths to determine if a deep comparison is necessary.
      length = a.length;
      if (length !== b.length) return false;
      // Deep compare the contents, ignoring non-numeric properties.
      while (length--) {
        if (!eq(a[length], b[length], aStack, bStack)) return false;
      }
    } else {
      // Deep compare objects.
      var keys = _.keys(a), key;
      length = keys.length;
      // Ensure that both objects contain the same number of properties before comparing deep equality.
      if (_.keys(b).length !== length) return false;
      while (length--) {
        // Deep compare each member
        key = keys[length];
        if (!(has(b, key) && eq(a[key], b[key], aStack, bStack))) return false;
      }
    }
    // Remove the first object from the stack of traversed objects.
    aStack.pop();
    bStack.pop();
    return true;
  };

  // Perform a deep comparison to check if two objects are equal.
  _.isEqual = function(a, b) {
    return eq(a, b);
  };

  // Is a given array, string, or object empty?
  // An "empty" object has no enumerable own-properties.
  _.isEmpty = function(obj) {
    if (obj == null) return true;
    if (isArrayLike(obj) && (_.isArray(obj) || _.isString(obj) || _.isArguments(obj))) return obj.length === 0;
    return _.keys(obj).length === 0;
  };

  // Is a given value a DOM element?
  _.isElement = function(obj) {
    return !!(obj && obj.nodeType === 1);
  };

  // Is a given value an array?
  // Delegates to ECMA5's native Array.isArray
  _.isArray = nativeIsArray || function(obj) {
    return toString.call(obj) === '[object Array]';
  };

  // Is a given variable an object?
  _.isObject = function(obj) {
    var type = typeof obj;
    return type === 'function' || type === 'object' && !!obj;
  };

  // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp, isError, isMap, isWeakMap, isSet, isWeakSet.
  _.each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp', 'Error', 'Symbol', 'Map', 'WeakMap', 'Set', 'WeakSet'], function(name) {
    _['is' + name] = function(obj) {
      return toString.call(obj) === '[object ' + name + ']';
    };
  });

  // Define a fallback version of the method in browsers (ahem, IE < 9), where
  // there isn't any inspectable "Arguments" type.
  if (!_.isArguments(arguments)) {
    _.isArguments = function(obj) {
      return has(obj, 'callee');
    };
  }

  // Optimize `isFunction` if appropriate. Work around some typeof bugs in old v8,
  // IE 11 (#1621), Safari 8 (#1929), and PhantomJS (#2236).
  var nodelist = root.document && root.document.childNodes;
  if (typeof /./ != 'function' && typeof Int8Array != 'object' && typeof nodelist != 'function') {
    _.isFunction = function(obj) {
      return typeof obj == 'function' || false;
    };
  }

  // Is a given object a finite number?
  _.isFinite = function(obj) {
    return !_.isSymbol(obj) && isFinite(obj) && !isNaN(parseFloat(obj));
  };

  // Is the given value `NaN`?
  _.isNaN = function(obj) {
    return _.isNumber(obj) && isNaN(obj);
  };

  // Is a given value a boolean?
  _.isBoolean = function(obj) {
    return obj === true || obj === false || toString.call(obj) === '[object Boolean]';
  };

  // Is a given value equal to null?
  _.isNull = function(obj) {
    return obj === null;
  };

  // Is a given variable undefined?
  _.isUndefined = function(obj) {
    return obj === void 0;
  };

  // Shortcut function for checking if an object has a given property directly
  // on itself (in other words, not on a prototype).
  _.has = function(obj, path) {
    if (!_.isArray(path)) {
      return has(obj, path);
    }
    var length = path.length;
    for (var i = 0; i < length; i++) {
      var key = path[i];
      if (obj == null || !hasOwnProperty.call(obj, key)) {
        return false;
      }
      obj = obj[key];
    }
    return !!length;
  };

  // Utility Functions
  // -----------------

  // Run Underscore.js in *noConflict* mode, returning the `_` variable to its
  // previous owner. Returns a reference to the Underscore object.
  _.noConflict = function() {
    root._ = previousUnderscore;
    return this;
  };

  // Keep the identity function around for default iteratees.
  _.identity = function(value) {
    return value;
  };

  // Predicate-generating functions. Often useful outside of Underscore.
  _.constant = function(value) {
    return function() {
      return value;
    };
  };

  _.noop = function(){};

  // Creates a function that, when passed an object, will traverse that object’s
  // properties down the given `path`, specified as an array of keys or indexes.
  _.property = function(path) {
    if (!_.isArray(path)) {
      return shallowProperty(path);
    }
    return function(obj) {
      return deepGet(obj, path);
    };
  };

  // Generates a function for a given object that returns a given property.
  _.propertyOf = function(obj) {
    if (obj == null) {
      return function(){};
    }
    return function(path) {
      return !_.isArray(path) ? obj[path] : deepGet(obj, path);
    };
  };

  // Returns a predicate for checking whether an object has a given set of
  // `key:value` pairs.
  _.matcher = _.matches = function(attrs) {
    attrs = _.extendOwn({}, attrs);
    return function(obj) {
      return _.isMatch(obj, attrs);
    };
  };

  // Run a function **n** times.
  _.times = function(n, iteratee, context) {
    var accum = Array(Math.max(0, n));
    iteratee = optimizeCb(iteratee, context, 1);
    for (var i = 0; i < n; i++) accum[i] = iteratee(i);
    return accum;
  };

  // Return a random integer between min and max (inclusive).
  _.random = function(min, max) {
    if (max == null) {
      max = min;
      min = 0;
    }
    return min + Math.floor(Math.random() * (max - min + 1));
  };

  // A (possibly faster) way to get the current timestamp as an integer.
  _.now = Date.now || function() {
    return new Date().getTime();
  };

  // List of HTML entities for escaping.
  var escapeMap = {
    '&': '&amp;',
    '<': '&lt;',
    '>': '&gt;',
    '"': '&quot;',
    "'": '&#x27;',
    '`': '&#x60;'
  };
  var unescapeMap = _.invert(escapeMap);

  // Functions for escaping and unescaping strings to/from HTML interpolation.
  var createEscaper = function(map) {
    var escaper = function(match) {
      return map[match];
    };
    // Regexes for identifying a key that needs to be escaped.
    var source = '(?:' + _.keys(map).join('|') + ')';
    var testRegexp = RegExp(source);
    var replaceRegexp = RegExp(source, 'g');
    return function(string) {
      string = string == null ? '' : '' + string;
      return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;
    };
  };
  _.escape = createEscaper(escapeMap);
  _.unescape = createEscaper(unescapeMap);

  // Traverses the children of `obj` along `path`. If a child is a function, it
  // is invoked with its parent as context. Returns the value of the final
  // child, or `fallback` if any child is undefined.
  _.result = function(obj, path, fallback) {
    if (!_.isArray(path)) path = [path];
    var length = path.length;
    if (!length) {
      return _.isFunction(fallback) ? fallback.call(obj) : fallback;
    }
    for (var i = 0; i < length; i++) {
      var prop = obj == null ? void 0 : obj[path[i]];
      if (prop === void 0) {
        prop = fallback;
        i = length; // Ensure we don't continue iterating.
      }
      obj = _.isFunction(prop) ? prop.call(obj) : prop;
    }
    return obj;
  };

  // Generate a unique integer id (unique within the entire client session).
  // Useful for temporary DOM ids.
  var idCounter = 0;
  _.uniqueId = function(prefix) {
    var id = ++idCounter + '';
    return prefix ? prefix + id : id;
  };

  // By default, Underscore uses ERB-style template delimiters, change the
  // following template settings to use alternative delimiters.
  _.templateSettings = {
    evaluate: /<%([\s\S]+?)%>/g,
    interpolate: /<%=([\s\S]+?)%>/g,
    escape: /<%-([\s\S]+?)%>/g
  };

  // When customizing `templateSettings`, if you don't want to define an
  // interpolation, evaluation or escaping regex, we need one that is
  // guaranteed not to match.
  var noMatch = /(.)^/;

  // Certain characters need to be escaped so that they can be put into a
  // string literal.
  var escapes = {
    "'": "'",
    '\\': '\\',
    '\r': 'r',
    '\n': 'n',
    '\u2028': 'u2028',
    '\u2029': 'u2029'
  };

  var escapeRegExp = /\\|'|\r|\n|\u2028|\u2029/g;

  var escapeChar = function(match) {
    return '\\' + escapes[match];
  };

  // JavaScript micro-templating, similar to John Resig's implementation.
  // Underscore templating handles arbitrary delimiters, preserves whitespace,
  // and correctly escapes quotes within interpolated code.
  // NB: `oldSettings` only exists for backwards compatibility.
  _.template = function(text, settings, oldSettings) {
    if (!settings && oldSettings) settings = oldSettings;
    settings = _.defaults({}, settings, _.templateSettings);

    // Combine delimiters into one regular expression via alternation.
    var matcher = RegExp([
      (settings.escape || noMatch).source,
      (settings.interpolate || noMatch).source,
      (settings.evaluate || noMatch).source
    ].join('|') + '|$', 'g');

    // Compile the template source, escaping string literals appropriately.
    var index = 0;
    var source = "__p+='";
    text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
      source += text.slice(index, offset).replace(escapeRegExp, escapeChar);
      index = offset + match.length;

      if (escape) {
        source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
      } else if (interpolate) {
        source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
      } else if (evaluate) {
        source += "';\n" + evaluate + "\n__p+='";
      }

      // Adobe VMs need the match returned to produce the correct offset.
      return match;
    });
    source += "';\n";

    // If a variable is not specified, place data values in local scope.
    if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';

    source = "var __t,__p='',__j=Array.prototype.join," +
      "print=function(){__p+=__j.call(arguments,'');};\n" +
      source + 'return __p;\n';

    var render;
    try {
      render = new Function(settings.variable || 'obj', '_', source);
    } catch (e) {
      e.source = source;
      throw e;
    }

    var template = function(data) {
      return render.call(this, data, _);
    };

    // Provide the compiled source as a convenience for precompilation.
    var argument = settings.variable || 'obj';
    template.source = 'function(' + argument + '){\n' + source + '}';

    return template;
  };

  // Add a "chain" function. Start chaining a wrapped Underscore object.
  _.chain = function(obj) {
    var instance = _(obj);
    instance._chain = true;
    return instance;
  };

  // OOP
  // ---------------
  // If Underscore is called as a function, it returns a wrapped object that
  // can be used OO-style. This wrapper holds altered versions of all the
  // underscore functions. Wrapped objects may be chained.

  // Helper function to continue chaining intermediate results.
  var chainResult = function(instance, obj) {
    return instance._chain ? _(obj).chain() : obj;
  };

  // Add your own custom functions to the Underscore object.
  _.mixin = function(obj) {
    _.each(_.functions(obj), function(name) {
      var func = _[name] = obj[name];
      _.prototype[name] = function() {
        var args = [this._wrapped];
        push.apply(args, arguments);
        return chainResult(this, func.apply(_, args));
      };
    });
    return _;
  };

  // Add all of the Underscore functions to the wrapper object.
  _.mixin(_);

  // Add all mutator Array functions to the wrapper.
  _.each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
    var method = ArrayProto[name];
    _.prototype[name] = function() {
      var obj = this._wrapped;
      method.apply(obj, arguments);
      if ((name === 'shift' || name === 'splice') && obj.length === 0) delete obj[0];
      return chainResult(this, obj);
    };
  });

  // Add all accessor Array functions to the wrapper.
  _.each(['concat', 'join', 'slice'], function(name) {
    var method = ArrayProto[name];
    _.prototype[name] = function() {
      return chainResult(this, method.apply(this._wrapped, arguments));
    };
  });

  // Extracts the result from a wrapped and chained object.
  _.prototype.value = function() {
    return this._wrapped;
  };

  // Provide unwrapping proxy for some methods used in engine operations
  // such as arithmetic and JSON stringification.
  _.prototype.valueOf = _.prototype.toJSON = _.prototype.value;

  _.prototype.toString = function() {
    return String(this._wrapped);
  };

  // AMD registration happens at the end for compatibility with AMD loaders
  // that may not enforce next-turn semantics on modules. Even though general
  // practice for AMD registration is to be anonymous, underscore registers
  // as a named module because, like jQuery, it is a base library that is
  // popular enough to be bundled in a third party lib, but not be part of
  // an AMD load request. Those cases could generate an error when an
  // anonymous define() is called outside of a loader request.
  if (typeof define == 'function' && define.amd) {
    define('underscore', [], function() {
      return _;
    });
  }
}());

}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy91bmRlcnNjb3JlL3VuZGVyc2NvcmUuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIvLyAgICAgVW5kZXJzY29yZS5qcyAxLjkuMVxuLy8gICAgIGh0dHA6Ly91bmRlcnNjb3JlanMub3JnXG4vLyAgICAgKGMpIDIwMDktMjAxOCBKZXJlbXkgQXNoa2VuYXMsIERvY3VtZW50Q2xvdWQgYW5kIEludmVzdGlnYXRpdmUgUmVwb3J0ZXJzICYgRWRpdG9yc1xuLy8gICAgIFVuZGVyc2NvcmUgbWF5IGJlIGZyZWVseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5cbihmdW5jdGlvbigpIHtcblxuICAvLyBCYXNlbGluZSBzZXR1cFxuICAvLyAtLS0tLS0tLS0tLS0tLVxuXG4gIC8vIEVzdGFibGlzaCB0aGUgcm9vdCBvYmplY3QsIGB3aW5kb3dgIChgc2VsZmApIGluIHRoZSBicm93c2VyLCBgZ2xvYmFsYFxuICAvLyBvbiB0aGUgc2VydmVyLCBvciBgdGhpc2AgaW4gc29tZSB2aXJ0dWFsIG1hY2hpbmVzLiBXZSB1c2UgYHNlbGZgXG4gIC8vIGluc3RlYWQgb2YgYHdpbmRvd2AgZm9yIGBXZWJXb3JrZXJgIHN1cHBvcnQuXG4gIHZhciByb290ID0gdHlwZW9mIHNlbGYgPT0gJ29iamVjdCcgJiYgc2VsZi5zZWxmID09PSBzZWxmICYmIHNlbGYgfHxcbiAgICAgICAgICAgIHR5cGVvZiBnbG9iYWwgPT0gJ29iamVjdCcgJiYgZ2xvYmFsLmdsb2JhbCA9PT0gZ2xvYmFsICYmIGdsb2JhbCB8fFxuICAgICAgICAgICAgdGhpcyB8fFxuICAgICAgICAgICAge307XG5cbiAgLy8gU2F2ZSB0aGUgcHJldmlvdXMgdmFsdWUgb2YgdGhlIGBfYCB2YXJpYWJsZS5cbiAgdmFyIHByZXZpb3VzVW5kZXJzY29yZSA9IHJvb3QuXztcblxuICAvLyBTYXZlIGJ5dGVzIGluIHRoZSBtaW5pZmllZCAoYnV0IG5vdCBnemlwcGVkKSB2ZXJzaW9uOlxuICB2YXIgQXJyYXlQcm90byA9IEFycmF5LnByb3RvdHlwZSwgT2JqUHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuICB2YXIgU3ltYm9sUHJvdG8gPSB0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyA/IFN5bWJvbC5wcm90b3R5cGUgOiBudWxsO1xuXG4gIC8vIENyZWF0ZSBxdWljayByZWZlcmVuY2UgdmFyaWFibGVzIGZvciBzcGVlZCBhY2Nlc3MgdG8gY29yZSBwcm90b3R5cGVzLlxuICB2YXIgcHVzaCA9IEFycmF5UHJvdG8ucHVzaCxcbiAgICAgIHNsaWNlID0gQXJyYXlQcm90by5zbGljZSxcbiAgICAgIHRvU3RyaW5nID0gT2JqUHJvdG8udG9TdHJpbmcsXG4gICAgICBoYXNPd25Qcm9wZXJ0eSA9IE9ialByb3RvLmhhc093blByb3BlcnR5O1xuXG4gIC8vIEFsbCAqKkVDTUFTY3JpcHQgNSoqIG5hdGl2ZSBmdW5jdGlvbiBpbXBsZW1lbnRhdGlvbnMgdGhhdCB3ZSBob3BlIHRvIHVzZVxuICAvLyBhcmUgZGVjbGFyZWQgaGVyZS5cbiAgdmFyIG5hdGl2ZUlzQXJyYXkgPSBBcnJheS5pc0FycmF5LFxuICAgICAgbmF0aXZlS2V5cyA9IE9iamVjdC5rZXlzLFxuICAgICAgbmF0aXZlQ3JlYXRlID0gT2JqZWN0LmNyZWF0ZTtcblxuICAvLyBOYWtlZCBmdW5jdGlvbiByZWZlcmVuY2UgZm9yIHN1cnJvZ2F0ZS1wcm90b3R5cGUtc3dhcHBpbmcuXG4gIHZhciBDdG9yID0gZnVuY3Rpb24oKXt9O1xuXG4gIC8vIENyZWF0ZSBhIHNhZmUgcmVmZXJlbmNlIHRvIHRoZSBVbmRlcnNjb3JlIG9iamVjdCBmb3IgdXNlIGJlbG93LlxuICB2YXIgXyA9IGZ1bmN0aW9uKG9iaikge1xuICAgIGlmIChvYmogaW5zdGFuY2VvZiBfKSByZXR1cm4gb2JqO1xuICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBfKSkgcmV0dXJuIG5ldyBfKG9iaik7XG4gICAgdGhpcy5fd3JhcHBlZCA9IG9iajtcbiAgfTtcblxuICAvLyBFeHBvcnQgdGhlIFVuZGVyc2NvcmUgb2JqZWN0IGZvciAqKk5vZGUuanMqKiwgd2l0aFxuICAvLyBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSBmb3IgdGhlaXIgb2xkIG1vZHVsZSBBUEkuIElmIHdlJ3JlIGluXG4gIC8vIHRoZSBicm93c2VyLCBhZGQgYF9gIGFzIGEgZ2xvYmFsIG9iamVjdC5cbiAgLy8gKGBub2RlVHlwZWAgaXMgY2hlY2tlZCB0byBlbnN1cmUgdGhhdCBgbW9kdWxlYFxuICAvLyBhbmQgYGV4cG9ydHNgIGFyZSBub3QgSFRNTCBlbGVtZW50cy4pXG4gIGlmICh0eXBlb2YgZXhwb3J0cyAhPSAndW5kZWZpbmVkJyAmJiAhZXhwb3J0cy5ub2RlVHlwZSkge1xuICAgIGlmICh0eXBlb2YgbW9kdWxlICE9ICd1bmRlZmluZWQnICYmICFtb2R1bGUubm9kZVR5cGUgJiYgbW9kdWxlLmV4cG9ydHMpIHtcbiAgICAgIGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IF87XG4gICAgfVxuICAgIGV4cG9ydHMuXyA9IF87XG4gIH0gZWxzZSB7XG4gICAgcm9vdC5fID0gXztcbiAgfVxuXG4gIC8vIEN1cnJlbnQgdmVyc2lvbi5cbiAgXy5WRVJTSU9OID0gJzEuOS4xJztcblxuICAvLyBJbnRlcm5hbCBmdW5jdGlvbiB0aGF0IHJldHVybnMgYW4gZWZmaWNpZW50IChmb3IgY3VycmVudCBlbmdpbmVzKSB2ZXJzaW9uXG4gIC8vIG9mIHRoZSBwYXNzZWQtaW4gY2FsbGJhY2ssIHRvIGJlIHJlcGVhdGVkbHkgYXBwbGllZCBpbiBvdGhlciBVbmRlcnNjb3JlXG4gIC8vIGZ1bmN0aW9ucy5cbiAgdmFyIG9wdGltaXplQ2IgPSBmdW5jdGlvbihmdW5jLCBjb250ZXh0LCBhcmdDb3VudCkge1xuICAgIGlmIChjb250ZXh0ID09PSB2b2lkIDApIHJldHVybiBmdW5jO1xuICAgIHN3aXRjaCAoYXJnQ291bnQgPT0gbnVsbCA/IDMgOiBhcmdDb3VudCkge1xuICAgICAgY2FzZSAxOiByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmMuY2FsbChjb250ZXh0LCB2YWx1ZSk7XG4gICAgICB9O1xuICAgICAgLy8gVGhlIDItYXJndW1lbnQgY2FzZSBpcyBvbWl0dGVkIGJlY2F1c2Ugd2XigJlyZSBub3QgdXNpbmcgaXQuXG4gICAgICBjYXNlIDM6IHJldHVybiBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuIGZ1bmMuY2FsbChjb250ZXh0LCB2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pO1xuICAgICAgfTtcbiAgICAgIGNhc2UgNDogcmV0dXJuIGZ1bmN0aW9uKGFjY3VtdWxhdG9yLCB2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuIGZ1bmMuY2FsbChjb250ZXh0LCBhY2N1bXVsYXRvciwgdmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKTtcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgfTtcblxuICB2YXIgYnVpbHRpbkl0ZXJhdGVlO1xuXG4gIC8vIEFuIGludGVybmFsIGZ1bmN0aW9uIHRvIGdlbmVyYXRlIGNhbGxiYWNrcyB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGVhY2hcbiAgLy8gZWxlbWVudCBpbiBhIGNvbGxlY3Rpb24sIHJldHVybmluZyB0aGUgZGVzaXJlZCByZXN1bHQg4oCUIGVpdGhlciBgaWRlbnRpdHlgLFxuICAvLyBhbiBhcmJpdHJhcnkgY2FsbGJhY2ssIGEgcHJvcGVydHkgbWF0Y2hlciwgb3IgYSBwcm9wZXJ0eSBhY2Nlc3Nvci5cbiAgdmFyIGNiID0gZnVuY3Rpb24odmFsdWUsIGNvbnRleHQsIGFyZ0NvdW50KSB7XG4gICAgaWYgKF8uaXRlcmF0ZWUgIT09IGJ1aWx0aW5JdGVyYXRlZSkgcmV0dXJuIF8uaXRlcmF0ZWUodmFsdWUsIGNvbnRleHQpO1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gXy5pZGVudGl0eTtcbiAgICBpZiAoXy5pc0Z1bmN0aW9uKHZhbHVlKSkgcmV0dXJuIG9wdGltaXplQ2IodmFsdWUsIGNvbnRleHQsIGFyZ0NvdW50KTtcbiAgICBpZiAoXy5pc09iamVjdCh2YWx1ZSkgJiYgIV8uaXNBcnJheSh2YWx1ZSkpIHJldHVybiBfLm1hdGNoZXIodmFsdWUpO1xuICAgIHJldHVybiBfLnByb3BlcnR5KHZhbHVlKTtcbiAgfTtcblxuICAvLyBFeHRlcm5hbCB3cmFwcGVyIGZvciBvdXIgY2FsbGJhY2sgZ2VuZXJhdG9yLiBVc2VycyBtYXkgY3VzdG9taXplXG4gIC8vIGBfLml0ZXJhdGVlYCBpZiB0aGV5IHdhbnQgYWRkaXRpb25hbCBwcmVkaWNhdGUvaXRlcmF0ZWUgc2hvcnRoYW5kIHN0eWxlcy5cbiAgLy8gVGhpcyBhYnN0cmFjdGlvbiBoaWRlcyB0aGUgaW50ZXJuYWwtb25seSBhcmdDb3VudCBhcmd1bWVudC5cbiAgXy5pdGVyYXRlZSA9IGJ1aWx0aW5JdGVyYXRlZSA9IGZ1bmN0aW9uKHZhbHVlLCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIGNiKHZhbHVlLCBjb250ZXh0LCBJbmZpbml0eSk7XG4gIH07XG5cbiAgLy8gU29tZSBmdW5jdGlvbnMgdGFrZSBhIHZhcmlhYmxlIG51bWJlciBvZiBhcmd1bWVudHMsIG9yIGEgZmV3IGV4cGVjdGVkXG4gIC8vIGFyZ3VtZW50cyBhdCB0aGUgYmVnaW5uaW5nIGFuZCB0aGVuIGEgdmFyaWFibGUgbnVtYmVyIG9mIHZhbHVlcyB0byBvcGVyYXRlXG4gIC8vIG9uLiBUaGlzIGhlbHBlciBhY2N1bXVsYXRlcyBhbGwgcmVtYWluaW5nIGFyZ3VtZW50cyBwYXN0IHRoZSBmdW5jdGlvbuKAmXNcbiAgLy8gYXJndW1lbnQgbGVuZ3RoIChvciBhbiBleHBsaWNpdCBgc3RhcnRJbmRleGApLCBpbnRvIGFuIGFycmF5IHRoYXQgYmVjb21lc1xuICAvLyB0aGUgbGFzdCBhcmd1bWVudC4gU2ltaWxhciB0byBFUzbigJlzIFwicmVzdCBwYXJhbWV0ZXJcIi5cbiAgdmFyIHJlc3RBcmd1bWVudHMgPSBmdW5jdGlvbihmdW5jLCBzdGFydEluZGV4KSB7XG4gICAgc3RhcnRJbmRleCA9IHN0YXJ0SW5kZXggPT0gbnVsbCA/IGZ1bmMubGVuZ3RoIC0gMSA6ICtzdGFydEluZGV4O1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBsZW5ndGggPSBNYXRoLm1heChhcmd1bWVudHMubGVuZ3RoIC0gc3RhcnRJbmRleCwgMCksXG4gICAgICAgICAgcmVzdCA9IEFycmF5KGxlbmd0aCksXG4gICAgICAgICAgaW5kZXggPSAwO1xuICAgICAgZm9yICg7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgIHJlc3RbaW5kZXhdID0gYXJndW1lbnRzW2luZGV4ICsgc3RhcnRJbmRleF07XG4gICAgICB9XG4gICAgICBzd2l0Y2ggKHN0YXJ0SW5kZXgpIHtcbiAgICAgICAgY2FzZSAwOiByZXR1cm4gZnVuYy5jYWxsKHRoaXMsIHJlc3QpO1xuICAgICAgICBjYXNlIDE6IHJldHVybiBmdW5jLmNhbGwodGhpcywgYXJndW1lbnRzWzBdLCByZXN0KTtcbiAgICAgICAgY2FzZSAyOiByZXR1cm4gZnVuYy5jYWxsKHRoaXMsIGFyZ3VtZW50c1swXSwgYXJndW1lbnRzWzFdLCByZXN0KTtcbiAgICAgIH1cbiAgICAgIHZhciBhcmdzID0gQXJyYXkoc3RhcnRJbmRleCArIDEpO1xuICAgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgc3RhcnRJbmRleDsgaW5kZXgrKykge1xuICAgICAgICBhcmdzW2luZGV4XSA9IGFyZ3VtZW50c1tpbmRleF07XG4gICAgICB9XG4gICAgICBhcmdzW3N0YXJ0SW5kZXhdID0gcmVzdDtcbiAgICAgIHJldHVybiBmdW5jLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH07XG4gIH07XG5cbiAgLy8gQW4gaW50ZXJuYWwgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGEgbmV3IG9iamVjdCB0aGF0IGluaGVyaXRzIGZyb20gYW5vdGhlci5cbiAgdmFyIGJhc2VDcmVhdGUgPSBmdW5jdGlvbihwcm90b3R5cGUpIHtcbiAgICBpZiAoIV8uaXNPYmplY3QocHJvdG90eXBlKSkgcmV0dXJuIHt9O1xuICAgIGlmIChuYXRpdmVDcmVhdGUpIHJldHVybiBuYXRpdmVDcmVhdGUocHJvdG90eXBlKTtcbiAgICBDdG9yLnByb3RvdHlwZSA9IHByb3RvdHlwZTtcbiAgICB2YXIgcmVzdWx0ID0gbmV3IEN0b3I7XG4gICAgQ3Rvci5wcm90b3R5cGUgPSBudWxsO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgdmFyIHNoYWxsb3dQcm9wZXJ0eSA9IGZ1bmN0aW9uKGtleSkge1xuICAgIHJldHVybiBmdW5jdGlvbihvYmopIHtcbiAgICAgIHJldHVybiBvYmogPT0gbnVsbCA/IHZvaWQgMCA6IG9ialtrZXldO1xuICAgIH07XG4gIH07XG5cbiAgdmFyIGhhcyA9IGZ1bmN0aW9uKG9iaiwgcGF0aCkge1xuICAgIHJldHVybiBvYmogIT0gbnVsbCAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcGF0aCk7XG4gIH1cblxuICB2YXIgZGVlcEdldCA9IGZ1bmN0aW9uKG9iaiwgcGF0aCkge1xuICAgIHZhciBsZW5ndGggPSBwYXRoLmxlbmd0aDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAob2JqID09IG51bGwpIHJldHVybiB2b2lkIDA7XG4gICAgICBvYmogPSBvYmpbcGF0aFtpXV07XG4gICAgfVxuICAgIHJldHVybiBsZW5ndGggPyBvYmogOiB2b2lkIDA7XG4gIH07XG5cbiAgLy8gSGVscGVyIGZvciBjb2xsZWN0aW9uIG1ldGhvZHMgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBjb2xsZWN0aW9uXG4gIC8vIHNob3VsZCBiZSBpdGVyYXRlZCBhcyBhbiBhcnJheSBvciBhcyBhbiBvYmplY3QuXG4gIC8vIFJlbGF0ZWQ6IGh0dHA6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLXRvbGVuZ3RoXG4gIC8vIEF2b2lkcyBhIHZlcnkgbmFzdHkgaU9TIDggSklUIGJ1ZyBvbiBBUk0tNjQuICMyMDk0XG4gIHZhciBNQVhfQVJSQVlfSU5ERVggPSBNYXRoLnBvdygyLCA1MykgLSAxO1xuICB2YXIgZ2V0TGVuZ3RoID0gc2hhbGxvd1Byb3BlcnR5KCdsZW5ndGgnKTtcbiAgdmFyIGlzQXJyYXlMaWtlID0gZnVuY3Rpb24oY29sbGVjdGlvbikge1xuICAgIHZhciBsZW5ndGggPSBnZXRMZW5ndGgoY29sbGVjdGlvbik7XG4gICAgcmV0dXJuIHR5cGVvZiBsZW5ndGggPT0gJ251bWJlcicgJiYgbGVuZ3RoID49IDAgJiYgbGVuZ3RoIDw9IE1BWF9BUlJBWV9JTkRFWDtcbiAgfTtcblxuICAvLyBDb2xsZWN0aW9uIEZ1bmN0aW9uc1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8vIFRoZSBjb3JuZXJzdG9uZSwgYW4gYGVhY2hgIGltcGxlbWVudGF0aW9uLCBha2EgYGZvckVhY2hgLlxuICAvLyBIYW5kbGVzIHJhdyBvYmplY3RzIGluIGFkZGl0aW9uIHRvIGFycmF5LWxpa2VzLiBUcmVhdHMgYWxsXG4gIC8vIHNwYXJzZSBhcnJheS1saWtlcyBhcyBpZiB0aGV5IHdlcmUgZGVuc2UuXG4gIF8uZWFjaCA9IF8uZm9yRWFjaCA9IGZ1bmN0aW9uKG9iaiwgaXRlcmF0ZWUsIGNvbnRleHQpIHtcbiAgICBpdGVyYXRlZSA9IG9wdGltaXplQ2IoaXRlcmF0ZWUsIGNvbnRleHQpO1xuICAgIHZhciBpLCBsZW5ndGg7XG4gICAgaWYgKGlzQXJyYXlMaWtlKG9iaikpIHtcbiAgICAgIGZvciAoaSA9IDAsIGxlbmd0aCA9IG9iai5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICBpdGVyYXRlZShvYmpbaV0sIGksIG9iaik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBrZXlzID0gXy5rZXlzKG9iaik7XG4gICAgICBmb3IgKGkgPSAwLCBsZW5ndGggPSBrZXlzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGl0ZXJhdGVlKG9ialtrZXlzW2ldXSwga2V5c1tpXSwgb2JqKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9iajtcbiAgfTtcblxuICAvLyBSZXR1cm4gdGhlIHJlc3VsdHMgb2YgYXBwbHlpbmcgdGhlIGl0ZXJhdGVlIHRvIGVhY2ggZWxlbWVudC5cbiAgXy5tYXAgPSBfLmNvbGxlY3QgPSBmdW5jdGlvbihvYmosIGl0ZXJhdGVlLCBjb250ZXh0KSB7XG4gICAgaXRlcmF0ZWUgPSBjYihpdGVyYXRlZSwgY29udGV4dCk7XG4gICAgdmFyIGtleXMgPSAhaXNBcnJheUxpa2Uob2JqKSAmJiBfLmtleXMob2JqKSxcbiAgICAgICAgbGVuZ3RoID0gKGtleXMgfHwgb2JqKS5sZW5ndGgsXG4gICAgICAgIHJlc3VsdHMgPSBBcnJheShsZW5ndGgpO1xuICAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIHZhciBjdXJyZW50S2V5ID0ga2V5cyA/IGtleXNbaW5kZXhdIDogaW5kZXg7XG4gICAgICByZXN1bHRzW2luZGV4XSA9IGl0ZXJhdGVlKG9ialtjdXJyZW50S2V5XSwgY3VycmVudEtleSwgb2JqKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH07XG5cbiAgLy8gQ3JlYXRlIGEgcmVkdWNpbmcgZnVuY3Rpb24gaXRlcmF0aW5nIGxlZnQgb3IgcmlnaHQuXG4gIHZhciBjcmVhdGVSZWR1Y2UgPSBmdW5jdGlvbihkaXIpIHtcbiAgICAvLyBXcmFwIGNvZGUgdGhhdCByZWFzc2lnbnMgYXJndW1lbnQgdmFyaWFibGVzIGluIGEgc2VwYXJhdGUgZnVuY3Rpb24gdGhhblxuICAgIC8vIHRoZSBvbmUgdGhhdCBhY2Nlc3NlcyBgYXJndW1lbnRzLmxlbmd0aGAgdG8gYXZvaWQgYSBwZXJmIGhpdC4gKCMxOTkxKVxuICAgIHZhciByZWR1Y2VyID0gZnVuY3Rpb24ob2JqLCBpdGVyYXRlZSwgbWVtbywgaW5pdGlhbCkge1xuICAgICAgdmFyIGtleXMgPSAhaXNBcnJheUxpa2Uob2JqKSAmJiBfLmtleXMob2JqKSxcbiAgICAgICAgICBsZW5ndGggPSAoa2V5cyB8fCBvYmopLmxlbmd0aCxcbiAgICAgICAgICBpbmRleCA9IGRpciA+IDAgPyAwIDogbGVuZ3RoIC0gMTtcbiAgICAgIGlmICghaW5pdGlhbCkge1xuICAgICAgICBtZW1vID0gb2JqW2tleXMgPyBrZXlzW2luZGV4XSA6IGluZGV4XTtcbiAgICAgICAgaW5kZXggKz0gZGlyO1xuICAgICAgfVxuICAgICAgZm9yICg7IGluZGV4ID49IDAgJiYgaW5kZXggPCBsZW5ndGg7IGluZGV4ICs9IGRpcikge1xuICAgICAgICB2YXIgY3VycmVudEtleSA9IGtleXMgPyBrZXlzW2luZGV4XSA6IGluZGV4O1xuICAgICAgICBtZW1vID0gaXRlcmF0ZWUobWVtbywgb2JqW2N1cnJlbnRLZXldLCBjdXJyZW50S2V5LCBvYmopO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG1lbW87XG4gICAgfTtcblxuICAgIHJldHVybiBmdW5jdGlvbihvYmosIGl0ZXJhdGVlLCBtZW1vLCBjb250ZXh0KSB7XG4gICAgICB2YXIgaW5pdGlhbCA9IGFyZ3VtZW50cy5sZW5ndGggPj0gMztcbiAgICAgIHJldHVybiByZWR1Y2VyKG9iaiwgb3B0aW1pemVDYihpdGVyYXRlZSwgY29udGV4dCwgNCksIG1lbW8sIGluaXRpYWwpO1xuICAgIH07XG4gIH07XG5cbiAgLy8gKipSZWR1Y2UqKiBidWlsZHMgdXAgYSBzaW5nbGUgcmVzdWx0IGZyb20gYSBsaXN0IG9mIHZhbHVlcywgYWthIGBpbmplY3RgLFxuICAvLyBvciBgZm9sZGxgLlxuICBfLnJlZHVjZSA9IF8uZm9sZGwgPSBfLmluamVjdCA9IGNyZWF0ZVJlZHVjZSgxKTtcblxuICAvLyBUaGUgcmlnaHQtYXNzb2NpYXRpdmUgdmVyc2lvbiBvZiByZWR1Y2UsIGFsc28ga25vd24gYXMgYGZvbGRyYC5cbiAgXy5yZWR1Y2VSaWdodCA9IF8uZm9sZHIgPSBjcmVhdGVSZWR1Y2UoLTEpO1xuXG4gIC8vIFJldHVybiB0aGUgZmlyc3QgdmFsdWUgd2hpY2ggcGFzc2VzIGEgdHJ1dGggdGVzdC4gQWxpYXNlZCBhcyBgZGV0ZWN0YC5cbiAgXy5maW5kID0gXy5kZXRlY3QgPSBmdW5jdGlvbihvYmosIHByZWRpY2F0ZSwgY29udGV4dCkge1xuICAgIHZhciBrZXlGaW5kZXIgPSBpc0FycmF5TGlrZShvYmopID8gXy5maW5kSW5kZXggOiBfLmZpbmRLZXk7XG4gICAgdmFyIGtleSA9IGtleUZpbmRlcihvYmosIHByZWRpY2F0ZSwgY29udGV4dCk7XG4gICAgaWYgKGtleSAhPT0gdm9pZCAwICYmIGtleSAhPT0gLTEpIHJldHVybiBvYmpba2V5XTtcbiAgfTtcblxuICAvLyBSZXR1cm4gYWxsIHRoZSBlbGVtZW50cyB0aGF0IHBhc3MgYSB0cnV0aCB0ZXN0LlxuICAvLyBBbGlhc2VkIGFzIGBzZWxlY3RgLlxuICBfLmZpbHRlciA9IF8uc2VsZWN0ID0gZnVuY3Rpb24ob2JqLCBwcmVkaWNhdGUsIGNvbnRleHQpIHtcbiAgICB2YXIgcmVzdWx0cyA9IFtdO1xuICAgIHByZWRpY2F0ZSA9IGNiKHByZWRpY2F0ZSwgY29udGV4dCk7XG4gICAgXy5lYWNoKG9iaiwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBsaXN0KSB7XG4gICAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBpbmRleCwgbGlzdCkpIHJlc3VsdHMucHVzaCh2YWx1ZSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH07XG5cbiAgLy8gUmV0dXJuIGFsbCB0aGUgZWxlbWVudHMgZm9yIHdoaWNoIGEgdHJ1dGggdGVzdCBmYWlscy5cbiAgXy5yZWplY3QgPSBmdW5jdGlvbihvYmosIHByZWRpY2F0ZSwgY29udGV4dCkge1xuICAgIHJldHVybiBfLmZpbHRlcihvYmosIF8ubmVnYXRlKGNiKHByZWRpY2F0ZSkpLCBjb250ZXh0KTtcbiAgfTtcblxuICAvLyBEZXRlcm1pbmUgd2hldGhlciBhbGwgb2YgdGhlIGVsZW1lbnRzIG1hdGNoIGEgdHJ1dGggdGVzdC5cbiAgLy8gQWxpYXNlZCBhcyBgYWxsYC5cbiAgXy5ldmVyeSA9IF8uYWxsID0gZnVuY3Rpb24ob2JqLCBwcmVkaWNhdGUsIGNvbnRleHQpIHtcbiAgICBwcmVkaWNhdGUgPSBjYihwcmVkaWNhdGUsIGNvbnRleHQpO1xuICAgIHZhciBrZXlzID0gIWlzQXJyYXlMaWtlKG9iaikgJiYgXy5rZXlzKG9iaiksXG4gICAgICAgIGxlbmd0aCA9IChrZXlzIHx8IG9iaikubGVuZ3RoO1xuICAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIHZhciBjdXJyZW50S2V5ID0ga2V5cyA/IGtleXNbaW5kZXhdIDogaW5kZXg7XG4gICAgICBpZiAoIXByZWRpY2F0ZShvYmpbY3VycmVudEtleV0sIGN1cnJlbnRLZXksIG9iaikpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG5cbiAgLy8gRGV0ZXJtaW5lIGlmIGF0IGxlYXN0IG9uZSBlbGVtZW50IGluIHRoZSBvYmplY3QgbWF0Y2hlcyBhIHRydXRoIHRlc3QuXG4gIC8vIEFsaWFzZWQgYXMgYGFueWAuXG4gIF8uc29tZSA9IF8uYW55ID0gZnVuY3Rpb24ob2JqLCBwcmVkaWNhdGUsIGNvbnRleHQpIHtcbiAgICBwcmVkaWNhdGUgPSBjYihwcmVkaWNhdGUsIGNvbnRleHQpO1xuICAgIHZhciBrZXlzID0gIWlzQXJyYXlMaWtlKG9iaikgJiYgXy5rZXlzKG9iaiksXG4gICAgICAgIGxlbmd0aCA9IChrZXlzIHx8IG9iaikubGVuZ3RoO1xuICAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIHZhciBjdXJyZW50S2V5ID0ga2V5cyA/IGtleXNbaW5kZXhdIDogaW5kZXg7XG4gICAgICBpZiAocHJlZGljYXRlKG9ialtjdXJyZW50S2V5XSwgY3VycmVudEtleSwgb2JqKSkgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICAvLyBEZXRlcm1pbmUgaWYgdGhlIGFycmF5IG9yIG9iamVjdCBjb250YWlucyBhIGdpdmVuIGl0ZW0gKHVzaW5nIGA9PT1gKS5cbiAgLy8gQWxpYXNlZCBhcyBgaW5jbHVkZXNgIGFuZCBgaW5jbHVkZWAuXG4gIF8uY29udGFpbnMgPSBfLmluY2x1ZGVzID0gXy5pbmNsdWRlID0gZnVuY3Rpb24ob2JqLCBpdGVtLCBmcm9tSW5kZXgsIGd1YXJkKSB7XG4gICAgaWYgKCFpc0FycmF5TGlrZShvYmopKSBvYmogPSBfLnZhbHVlcyhvYmopO1xuICAgIGlmICh0eXBlb2YgZnJvbUluZGV4ICE9ICdudW1iZXInIHx8IGd1YXJkKSBmcm9tSW5kZXggPSAwO1xuICAgIHJldHVybiBfLmluZGV4T2Yob2JqLCBpdGVtLCBmcm9tSW5kZXgpID49IDA7XG4gIH07XG5cbiAgLy8gSW52b2tlIGEgbWV0aG9kICh3aXRoIGFyZ3VtZW50cykgb24gZXZlcnkgaXRlbSBpbiBhIGNvbGxlY3Rpb24uXG4gIF8uaW52b2tlID0gcmVzdEFyZ3VtZW50cyhmdW5jdGlvbihvYmosIHBhdGgsIGFyZ3MpIHtcbiAgICB2YXIgY29udGV4dFBhdGgsIGZ1bmM7XG4gICAgaWYgKF8uaXNGdW5jdGlvbihwYXRoKSkge1xuICAgICAgZnVuYyA9IHBhdGg7XG4gICAgfSBlbHNlIGlmIChfLmlzQXJyYXkocGF0aCkpIHtcbiAgICAgIGNvbnRleHRQYXRoID0gcGF0aC5zbGljZSgwLCAtMSk7XG4gICAgICBwYXRoID0gcGF0aFtwYXRoLmxlbmd0aCAtIDFdO1xuICAgIH1cbiAgICByZXR1cm4gXy5tYXAob2JqLCBmdW5jdGlvbihjb250ZXh0KSB7XG4gICAgICB2YXIgbWV0aG9kID0gZnVuYztcbiAgICAgIGlmICghbWV0aG9kKSB7XG4gICAgICAgIGlmIChjb250ZXh0UGF0aCAmJiBjb250ZXh0UGF0aC5sZW5ndGgpIHtcbiAgICAgICAgICBjb250ZXh0ID0gZGVlcEdldChjb250ZXh0LCBjb250ZXh0UGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkgcmV0dXJuIHZvaWQgMDtcbiAgICAgICAgbWV0aG9kID0gY29udGV4dFtwYXRoXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBtZXRob2QgPT0gbnVsbCA/IG1ldGhvZCA6IG1ldGhvZC5hcHBseShjb250ZXh0LCBhcmdzKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gQ29udmVuaWVuY2UgdmVyc2lvbiBvZiBhIGNvbW1vbiB1c2UgY2FzZSBvZiBgbWFwYDogZmV0Y2hpbmcgYSBwcm9wZXJ0eS5cbiAgXy5wbHVjayA9IGZ1bmN0aW9uKG9iaiwga2V5KSB7XG4gICAgcmV0dXJuIF8ubWFwKG9iaiwgXy5wcm9wZXJ0eShrZXkpKTtcbiAgfTtcblxuICAvLyBDb252ZW5pZW5jZSB2ZXJzaW9uIG9mIGEgY29tbW9uIHVzZSBjYXNlIG9mIGBmaWx0ZXJgOiBzZWxlY3Rpbmcgb25seSBvYmplY3RzXG4gIC8vIGNvbnRhaW5pbmcgc3BlY2lmaWMgYGtleTp2YWx1ZWAgcGFpcnMuXG4gIF8ud2hlcmUgPSBmdW5jdGlvbihvYmosIGF0dHJzKSB7XG4gICAgcmV0dXJuIF8uZmlsdGVyKG9iaiwgXy5tYXRjaGVyKGF0dHJzKSk7XG4gIH07XG5cbiAgLy8gQ29udmVuaWVuY2UgdmVyc2lvbiBvZiBhIGNvbW1vbiB1c2UgY2FzZSBvZiBgZmluZGA6IGdldHRpbmcgdGhlIGZpcnN0IG9iamVjdFxuICAvLyBjb250YWluaW5nIHNwZWNpZmljIGBrZXk6dmFsdWVgIHBhaXJzLlxuICBfLmZpbmRXaGVyZSA9IGZ1bmN0aW9uKG9iaiwgYXR0cnMpIHtcbiAgICByZXR1cm4gXy5maW5kKG9iaiwgXy5tYXRjaGVyKGF0dHJzKSk7XG4gIH07XG5cbiAgLy8gUmV0dXJuIHRoZSBtYXhpbXVtIGVsZW1lbnQgKG9yIGVsZW1lbnQtYmFzZWQgY29tcHV0YXRpb24pLlxuICBfLm1heCA9IGZ1bmN0aW9uKG9iaiwgaXRlcmF0ZWUsIGNvbnRleHQpIHtcbiAgICB2YXIgcmVzdWx0ID0gLUluZmluaXR5LCBsYXN0Q29tcHV0ZWQgPSAtSW5maW5pdHksXG4gICAgICAgIHZhbHVlLCBjb21wdXRlZDtcbiAgICBpZiAoaXRlcmF0ZWUgPT0gbnVsbCB8fCB0eXBlb2YgaXRlcmF0ZWUgPT0gJ251bWJlcicgJiYgdHlwZW9mIG9ialswXSAhPSAnb2JqZWN0JyAmJiBvYmogIT0gbnVsbCkge1xuICAgICAgb2JqID0gaXNBcnJheUxpa2Uob2JqKSA/IG9iaiA6IF8udmFsdWVzKG9iaik7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gb2JqLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhbHVlID0gb2JqW2ldO1xuICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZSA+IHJlc3VsdCkge1xuICAgICAgICAgIHJlc3VsdCA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGl0ZXJhdGVlID0gY2IoaXRlcmF0ZWUsIGNvbnRleHQpO1xuICAgICAgXy5lYWNoKG9iaiwgZnVuY3Rpb24odiwgaW5kZXgsIGxpc3QpIHtcbiAgICAgICAgY29tcHV0ZWQgPSBpdGVyYXRlZSh2LCBpbmRleCwgbGlzdCk7XG4gICAgICAgIGlmIChjb21wdXRlZCA+IGxhc3RDb21wdXRlZCB8fCBjb21wdXRlZCA9PT0gLUluZmluaXR5ICYmIHJlc3VsdCA9PT0gLUluZmluaXR5KSB7XG4gICAgICAgICAgcmVzdWx0ID0gdjtcbiAgICAgICAgICBsYXN0Q29tcHV0ZWQgPSBjb21wdXRlZDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgLy8gUmV0dXJuIHRoZSBtaW5pbXVtIGVsZW1lbnQgKG9yIGVsZW1lbnQtYmFzZWQgY29tcHV0YXRpb24pLlxuICBfLm1pbiA9IGZ1bmN0aW9uKG9iaiwgaXRlcmF0ZWUsIGNvbnRleHQpIHtcbiAgICB2YXIgcmVzdWx0ID0gSW5maW5pdHksIGxhc3RDb21wdXRlZCA9IEluZmluaXR5LFxuICAgICAgICB2YWx1ZSwgY29tcHV0ZWQ7XG4gICAgaWYgKGl0ZXJhdGVlID09IG51bGwgfHwgdHlwZW9mIGl0ZXJhdGVlID09ICdudW1iZXInICYmIHR5cGVvZiBvYmpbMF0gIT0gJ29iamVjdCcgJiYgb2JqICE9IG51bGwpIHtcbiAgICAgIG9iaiA9IGlzQXJyYXlMaWtlKG9iaikgPyBvYmogOiBfLnZhbHVlcyhvYmopO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IG9iai5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICB2YWx1ZSA9IG9ialtpXTtcbiAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUgPCByZXN1bHQpIHtcbiAgICAgICAgICByZXN1bHQgPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpdGVyYXRlZSA9IGNiKGl0ZXJhdGVlLCBjb250ZXh0KTtcbiAgICAgIF8uZWFjaChvYmosIGZ1bmN0aW9uKHYsIGluZGV4LCBsaXN0KSB7XG4gICAgICAgIGNvbXB1dGVkID0gaXRlcmF0ZWUodiwgaW5kZXgsIGxpc3QpO1xuICAgICAgICBpZiAoY29tcHV0ZWQgPCBsYXN0Q29tcHV0ZWQgfHwgY29tcHV0ZWQgPT09IEluZmluaXR5ICYmIHJlc3VsdCA9PT0gSW5maW5pdHkpIHtcbiAgICAgICAgICByZXN1bHQgPSB2O1xuICAgICAgICAgIGxhc3RDb21wdXRlZCA9IGNvbXB1dGVkO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICAvLyBTaHVmZmxlIGEgY29sbGVjdGlvbi5cbiAgXy5zaHVmZmxlID0gZnVuY3Rpb24ob2JqKSB7XG4gICAgcmV0dXJuIF8uc2FtcGxlKG9iaiwgSW5maW5pdHkpO1xuICB9O1xuXG4gIC8vIFNhbXBsZSAqKm4qKiByYW5kb20gdmFsdWVzIGZyb20gYSBjb2xsZWN0aW9uIHVzaW5nIHRoZSBtb2Rlcm4gdmVyc2lvbiBvZiB0aGVcbiAgLy8gW0Zpc2hlci1ZYXRlcyBzaHVmZmxlXShodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0Zpc2hlcuKAk1lhdGVzX3NodWZmbGUpLlxuICAvLyBJZiAqKm4qKiBpcyBub3Qgc3BlY2lmaWVkLCByZXR1cm5zIGEgc2luZ2xlIHJhbmRvbSBlbGVtZW50LlxuICAvLyBUaGUgaW50ZXJuYWwgYGd1YXJkYCBhcmd1bWVudCBhbGxvd3MgaXQgdG8gd29yayB3aXRoIGBtYXBgLlxuICBfLnNhbXBsZSA9IGZ1bmN0aW9uKG9iaiwgbiwgZ3VhcmQpIHtcbiAgICBpZiAobiA9PSBudWxsIHx8IGd1YXJkKSB7XG4gICAgICBpZiAoIWlzQXJyYXlMaWtlKG9iaikpIG9iaiA9IF8udmFsdWVzKG9iaik7XG4gICAgICByZXR1cm4gb2JqW18ucmFuZG9tKG9iai5sZW5ndGggLSAxKV07XG4gICAgfVxuICAgIHZhciBzYW1wbGUgPSBpc0FycmF5TGlrZShvYmopID8gXy5jbG9uZShvYmopIDogXy52YWx1ZXMob2JqKTtcbiAgICB2YXIgbGVuZ3RoID0gZ2V0TGVuZ3RoKHNhbXBsZSk7XG4gICAgbiA9IE1hdGgubWF4KE1hdGgubWluKG4sIGxlbmd0aCksIDApO1xuICAgIHZhciBsYXN0ID0gbGVuZ3RoIC0gMTtcbiAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgbjsgaW5kZXgrKykge1xuICAgICAgdmFyIHJhbmQgPSBfLnJhbmRvbShpbmRleCwgbGFzdCk7XG4gICAgICB2YXIgdGVtcCA9IHNhbXBsZVtpbmRleF07XG4gICAgICBzYW1wbGVbaW5kZXhdID0gc2FtcGxlW3JhbmRdO1xuICAgICAgc2FtcGxlW3JhbmRdID0gdGVtcDtcbiAgICB9XG4gICAgcmV0dXJuIHNhbXBsZS5zbGljZSgwLCBuKTtcbiAgfTtcblxuICAvLyBTb3J0IHRoZSBvYmplY3QncyB2YWx1ZXMgYnkgYSBjcml0ZXJpb24gcHJvZHVjZWQgYnkgYW4gaXRlcmF0ZWUuXG4gIF8uc29ydEJ5ID0gZnVuY3Rpb24ob2JqLCBpdGVyYXRlZSwgY29udGV4dCkge1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgaXRlcmF0ZWUgPSBjYihpdGVyYXRlZSwgY29udGV4dCk7XG4gICAgcmV0dXJuIF8ucGx1Y2soXy5tYXAob2JqLCBmdW5jdGlvbih2YWx1ZSwga2V5LCBsaXN0KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgIGluZGV4OiBpbmRleCsrLFxuICAgICAgICBjcml0ZXJpYTogaXRlcmF0ZWUodmFsdWUsIGtleSwgbGlzdClcbiAgICAgIH07XG4gICAgfSkuc29ydChmdW5jdGlvbihsZWZ0LCByaWdodCkge1xuICAgICAgdmFyIGEgPSBsZWZ0LmNyaXRlcmlhO1xuICAgICAgdmFyIGIgPSByaWdodC5jcml0ZXJpYTtcbiAgICAgIGlmIChhICE9PSBiKSB7XG4gICAgICAgIGlmIChhID4gYiB8fCBhID09PSB2b2lkIDApIHJldHVybiAxO1xuICAgICAgICBpZiAoYSA8IGIgfHwgYiA9PT0gdm9pZCAwKSByZXR1cm4gLTE7XG4gICAgICB9XG4gICAgICByZXR1cm4gbGVmdC5pbmRleCAtIHJpZ2h0LmluZGV4O1xuICAgIH0pLCAndmFsdWUnKTtcbiAgfTtcblxuICAvLyBBbiBpbnRlcm5hbCBmdW5jdGlvbiB1c2VkIGZvciBhZ2dyZWdhdGUgXCJncm91cCBieVwiIG9wZXJhdGlvbnMuXG4gIHZhciBncm91cCA9IGZ1bmN0aW9uKGJlaGF2aW9yLCBwYXJ0aXRpb24pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24ob2JqLCBpdGVyYXRlZSwgY29udGV4dCkge1xuICAgICAgdmFyIHJlc3VsdCA9IHBhcnRpdGlvbiA/IFtbXSwgW11dIDoge307XG4gICAgICBpdGVyYXRlZSA9IGNiKGl0ZXJhdGVlLCBjb250ZXh0KTtcbiAgICAgIF8uZWFjaChvYmosIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkge1xuICAgICAgICB2YXIga2V5ID0gaXRlcmF0ZWUodmFsdWUsIGluZGV4LCBvYmopO1xuICAgICAgICBiZWhhdmlvcihyZXN1bHQsIHZhbHVlLCBrZXkpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gIH07XG5cbiAgLy8gR3JvdXBzIHRoZSBvYmplY3QncyB2YWx1ZXMgYnkgYSBjcml0ZXJpb24uIFBhc3MgZWl0aGVyIGEgc3RyaW5nIGF0dHJpYnV0ZVxuICAvLyB0byBncm91cCBieSwgb3IgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGNyaXRlcmlvbi5cbiAgXy5ncm91cEJ5ID0gZ3JvdXAoZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gICAgaWYgKGhhcyhyZXN1bHQsIGtleSkpIHJlc3VsdFtrZXldLnB1c2godmFsdWUpOyBlbHNlIHJlc3VsdFtrZXldID0gW3ZhbHVlXTtcbiAgfSk7XG5cbiAgLy8gSW5kZXhlcyB0aGUgb2JqZWN0J3MgdmFsdWVzIGJ5IGEgY3JpdGVyaW9uLCBzaW1pbGFyIHRvIGBncm91cEJ5YCwgYnV0IGZvclxuICAvLyB3aGVuIHlvdSBrbm93IHRoYXQgeW91ciBpbmRleCB2YWx1ZXMgd2lsbCBiZSB1bmlxdWUuXG4gIF8uaW5kZXhCeSA9IGdyb3VwKGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkge1xuICAgIHJlc3VsdFtrZXldID0gdmFsdWU7XG4gIH0pO1xuXG4gIC8vIENvdW50cyBpbnN0YW5jZXMgb2YgYW4gb2JqZWN0IHRoYXQgZ3JvdXAgYnkgYSBjZXJ0YWluIGNyaXRlcmlvbi4gUGFzc1xuICAvLyBlaXRoZXIgYSBzdHJpbmcgYXR0cmlidXRlIHRvIGNvdW50IGJ5LCBvciBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGVcbiAgLy8gY3JpdGVyaW9uLlxuICBfLmNvdW50QnkgPSBncm91cChmdW5jdGlvbihyZXN1bHQsIHZhbHVlLCBrZXkpIHtcbiAgICBpZiAoaGFzKHJlc3VsdCwga2V5KSkgcmVzdWx0W2tleV0rKzsgZWxzZSByZXN1bHRba2V5XSA9IDE7XG4gIH0pO1xuXG4gIHZhciByZVN0clN5bWJvbCA9IC9bXlxcdWQ4MDAtXFx1ZGZmZl18W1xcdWQ4MDAtXFx1ZGJmZl1bXFx1ZGMwMC1cXHVkZmZmXXxbXFx1ZDgwMC1cXHVkZmZmXS9nO1xuICAvLyBTYWZlbHkgY3JlYXRlIGEgcmVhbCwgbGl2ZSBhcnJheSBmcm9tIGFueXRoaW5nIGl0ZXJhYmxlLlxuICBfLnRvQXJyYXkgPSBmdW5jdGlvbihvYmopIHtcbiAgICBpZiAoIW9iaikgcmV0dXJuIFtdO1xuICAgIGlmIChfLmlzQXJyYXkob2JqKSkgcmV0dXJuIHNsaWNlLmNhbGwob2JqKTtcbiAgICBpZiAoXy5pc1N0cmluZyhvYmopKSB7XG4gICAgICAvLyBLZWVwIHN1cnJvZ2F0ZSBwYWlyIGNoYXJhY3RlcnMgdG9nZXRoZXJcbiAgICAgIHJldHVybiBvYmoubWF0Y2gocmVTdHJTeW1ib2wpO1xuICAgIH1cbiAgICBpZiAoaXNBcnJheUxpa2Uob2JqKSkgcmV0dXJuIF8ubWFwKG9iaiwgXy5pZGVudGl0eSk7XG4gICAgcmV0dXJuIF8udmFsdWVzKG9iaik7XG4gIH07XG5cbiAgLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gYW4gb2JqZWN0LlxuICBfLnNpemUgPSBmdW5jdGlvbihvYmopIHtcbiAgICBpZiAob2JqID09IG51bGwpIHJldHVybiAwO1xuICAgIHJldHVybiBpc0FycmF5TGlrZShvYmopID8gb2JqLmxlbmd0aCA6IF8ua2V5cyhvYmopLmxlbmd0aDtcbiAgfTtcblxuICAvLyBTcGxpdCBhIGNvbGxlY3Rpb24gaW50byB0d28gYXJyYXlzOiBvbmUgd2hvc2UgZWxlbWVudHMgYWxsIHNhdGlzZnkgdGhlIGdpdmVuXG4gIC8vIHByZWRpY2F0ZSwgYW5kIG9uZSB3aG9zZSBlbGVtZW50cyBhbGwgZG8gbm90IHNhdGlzZnkgdGhlIHByZWRpY2F0ZS5cbiAgXy5wYXJ0aXRpb24gPSBncm91cChmdW5jdGlvbihyZXN1bHQsIHZhbHVlLCBwYXNzKSB7XG4gICAgcmVzdWx0W3Bhc3MgPyAwIDogMV0ucHVzaCh2YWx1ZSk7XG4gIH0sIHRydWUpO1xuXG4gIC8vIEFycmF5IEZ1bmN0aW9uc1xuICAvLyAtLS0tLS0tLS0tLS0tLS1cblxuICAvLyBHZXQgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYW4gYXJyYXkuIFBhc3NpbmcgKipuKiogd2lsbCByZXR1cm4gdGhlIGZpcnN0IE5cbiAgLy8gdmFsdWVzIGluIHRoZSBhcnJheS4gQWxpYXNlZCBhcyBgaGVhZGAgYW5kIGB0YWtlYC4gVGhlICoqZ3VhcmQqKiBjaGVja1xuICAvLyBhbGxvd3MgaXQgdG8gd29yayB3aXRoIGBfLm1hcGAuXG4gIF8uZmlyc3QgPSBfLmhlYWQgPSBfLnRha2UgPSBmdW5jdGlvbihhcnJheSwgbiwgZ3VhcmQpIHtcbiAgICBpZiAoYXJyYXkgPT0gbnVsbCB8fCBhcnJheS5sZW5ndGggPCAxKSByZXR1cm4gbiA9PSBudWxsID8gdm9pZCAwIDogW107XG4gICAgaWYgKG4gPT0gbnVsbCB8fCBndWFyZCkgcmV0dXJuIGFycmF5WzBdO1xuICAgIHJldHVybiBfLmluaXRpYWwoYXJyYXksIGFycmF5Lmxlbmd0aCAtIG4pO1xuICB9O1xuXG4gIC8vIFJldHVybnMgZXZlcnl0aGluZyBidXQgdGhlIGxhc3QgZW50cnkgb2YgdGhlIGFycmF5LiBFc3BlY2lhbGx5IHVzZWZ1bCBvblxuICAvLyB0aGUgYXJndW1lbnRzIG9iamVjdC4gUGFzc2luZyAqKm4qKiB3aWxsIHJldHVybiBhbGwgdGhlIHZhbHVlcyBpblxuICAvLyB0aGUgYXJyYXksIGV4Y2x1ZGluZyB0aGUgbGFzdCBOLlxuICBfLmluaXRpYWwgPSBmdW5jdGlvbihhcnJheSwgbiwgZ3VhcmQpIHtcbiAgICByZXR1cm4gc2xpY2UuY2FsbChhcnJheSwgMCwgTWF0aC5tYXgoMCwgYXJyYXkubGVuZ3RoIC0gKG4gPT0gbnVsbCB8fCBndWFyZCA/IDEgOiBuKSkpO1xuICB9O1xuXG4gIC8vIEdldCB0aGUgbGFzdCBlbGVtZW50IG9mIGFuIGFycmF5LiBQYXNzaW5nICoqbioqIHdpbGwgcmV0dXJuIHRoZSBsYXN0IE5cbiAgLy8gdmFsdWVzIGluIHRoZSBhcnJheS5cbiAgXy5sYXN0ID0gZnVuY3Rpb24oYXJyYXksIG4sIGd1YXJkKSB7XG4gICAgaWYgKGFycmF5ID09IG51bGwgfHwgYXJyYXkubGVuZ3RoIDwgMSkgcmV0dXJuIG4gPT0gbnVsbCA/IHZvaWQgMCA6IFtdO1xuICAgIGlmIChuID09IG51bGwgfHwgZ3VhcmQpIHJldHVybiBhcnJheVthcnJheS5sZW5ndGggLSAxXTtcbiAgICByZXR1cm4gXy5yZXN0KGFycmF5LCBNYXRoLm1heCgwLCBhcnJheS5sZW5ndGggLSBuKSk7XG4gIH07XG5cbiAgLy8gUmV0dXJucyBldmVyeXRoaW5nIGJ1dCB0aGUgZmlyc3QgZW50cnkgb2YgdGhlIGFycmF5LiBBbGlhc2VkIGFzIGB0YWlsYCBhbmQgYGRyb3BgLlxuICAvLyBFc3BlY2lhbGx5IHVzZWZ1bCBvbiB0aGUgYXJndW1lbnRzIG9iamVjdC4gUGFzc2luZyBhbiAqKm4qKiB3aWxsIHJldHVyblxuICAvLyB0aGUgcmVzdCBOIHZhbHVlcyBpbiB0aGUgYXJyYXkuXG4gIF8ucmVzdCA9IF8udGFpbCA9IF8uZHJvcCA9IGZ1bmN0aW9uKGFycmF5LCBuLCBndWFyZCkge1xuICAgIHJldHVybiBzbGljZS5jYWxsKGFycmF5LCBuID09IG51bGwgfHwgZ3VhcmQgPyAxIDogbik7XG4gIH07XG5cbiAgLy8gVHJpbSBvdXQgYWxsIGZhbHN5IHZhbHVlcyBmcm9tIGFuIGFycmF5LlxuICBfLmNvbXBhY3QgPSBmdW5jdGlvbihhcnJheSkge1xuICAgIHJldHVybiBfLmZpbHRlcihhcnJheSwgQm9vbGVhbik7XG4gIH07XG5cbiAgLy8gSW50ZXJuYWwgaW1wbGVtZW50YXRpb24gb2YgYSByZWN1cnNpdmUgYGZsYXR0ZW5gIGZ1bmN0aW9uLlxuICB2YXIgZmxhdHRlbiA9IGZ1bmN0aW9uKGlucHV0LCBzaGFsbG93LCBzdHJpY3QsIG91dHB1dCkge1xuICAgIG91dHB1dCA9IG91dHB1dCB8fCBbXTtcbiAgICB2YXIgaWR4ID0gb3V0cHV0Lmxlbmd0aDtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gZ2V0TGVuZ3RoKGlucHV0KTsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgdmFsdWUgPSBpbnB1dFtpXTtcbiAgICAgIGlmIChpc0FycmF5TGlrZSh2YWx1ZSkgJiYgKF8uaXNBcnJheSh2YWx1ZSkgfHwgXy5pc0FyZ3VtZW50cyh2YWx1ZSkpKSB7XG4gICAgICAgIC8vIEZsYXR0ZW4gY3VycmVudCBsZXZlbCBvZiBhcnJheSBvciBhcmd1bWVudHMgb2JqZWN0LlxuICAgICAgICBpZiAoc2hhbGxvdykge1xuICAgICAgICAgIHZhciBqID0gMCwgbGVuID0gdmFsdWUubGVuZ3RoO1xuICAgICAgICAgIHdoaWxlIChqIDwgbGVuKSBvdXRwdXRbaWR4KytdID0gdmFsdWVbaisrXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmbGF0dGVuKHZhbHVlLCBzaGFsbG93LCBzdHJpY3QsIG91dHB1dCk7XG4gICAgICAgICAgaWR4ID0gb3V0cHV0Lmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICghc3RyaWN0KSB7XG4gICAgICAgIG91dHB1dFtpZHgrK10gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dDtcbiAgfTtcblxuICAvLyBGbGF0dGVuIG91dCBhbiBhcnJheSwgZWl0aGVyIHJlY3Vyc2l2ZWx5IChieSBkZWZhdWx0KSwgb3IganVzdCBvbmUgbGV2ZWwuXG4gIF8uZmxhdHRlbiA9IGZ1bmN0aW9uKGFycmF5LCBzaGFsbG93KSB7XG4gICAgcmV0dXJuIGZsYXR0ZW4oYXJyYXksIHNoYWxsb3csIGZhbHNlKTtcbiAgfTtcblxuICAvLyBSZXR1cm4gYSB2ZXJzaW9uIG9mIHRoZSBhcnJheSB0aGF0IGRvZXMgbm90IGNvbnRhaW4gdGhlIHNwZWNpZmllZCB2YWx1ZShzKS5cbiAgXy53aXRob3V0ID0gcmVzdEFyZ3VtZW50cyhmdW5jdGlvbihhcnJheSwgb3RoZXJBcnJheXMpIHtcbiAgICByZXR1cm4gXy5kaWZmZXJlbmNlKGFycmF5LCBvdGhlckFycmF5cyk7XG4gIH0pO1xuXG4gIC8vIFByb2R1Y2UgYSBkdXBsaWNhdGUtZnJlZSB2ZXJzaW9uIG9mIHRoZSBhcnJheS4gSWYgdGhlIGFycmF5IGhhcyBhbHJlYWR5XG4gIC8vIGJlZW4gc29ydGVkLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIHVzaW5nIGEgZmFzdGVyIGFsZ29yaXRobS5cbiAgLy8gVGhlIGZhc3RlciBhbGdvcml0aG0gd2lsbCBub3Qgd29yayB3aXRoIGFuIGl0ZXJhdGVlIGlmIHRoZSBpdGVyYXRlZVxuICAvLyBpcyBub3QgYSBvbmUtdG8tb25lIGZ1bmN0aW9uLCBzbyBwcm92aWRpbmcgYW4gaXRlcmF0ZWUgd2lsbCBkaXNhYmxlXG4gIC8vIHRoZSBmYXN0ZXIgYWxnb3JpdGhtLlxuICAvLyBBbGlhc2VkIGFzIGB1bmlxdWVgLlxuICBfLnVuaXEgPSBfLnVuaXF1ZSA9IGZ1bmN0aW9uKGFycmF5LCBpc1NvcnRlZCwgaXRlcmF0ZWUsIGNvbnRleHQpIHtcbiAgICBpZiAoIV8uaXNCb29sZWFuKGlzU29ydGVkKSkge1xuICAgICAgY29udGV4dCA9IGl0ZXJhdGVlO1xuICAgICAgaXRlcmF0ZWUgPSBpc1NvcnRlZDtcbiAgICAgIGlzU29ydGVkID0gZmFsc2U7XG4gICAgfVxuICAgIGlmIChpdGVyYXRlZSAhPSBudWxsKSBpdGVyYXRlZSA9IGNiKGl0ZXJhdGVlLCBjb250ZXh0KTtcbiAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgdmFyIHNlZW4gPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gZ2V0TGVuZ3RoKGFycmF5KTsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgdmFsdWUgPSBhcnJheVtpXSxcbiAgICAgICAgICBjb21wdXRlZCA9IGl0ZXJhdGVlID8gaXRlcmF0ZWUodmFsdWUsIGksIGFycmF5KSA6IHZhbHVlO1xuICAgICAgaWYgKGlzU29ydGVkICYmICFpdGVyYXRlZSkge1xuICAgICAgICBpZiAoIWkgfHwgc2VlbiAhPT0gY29tcHV0ZWQpIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICAgICAgc2VlbiA9IGNvbXB1dGVkO1xuICAgICAgfSBlbHNlIGlmIChpdGVyYXRlZSkge1xuICAgICAgICBpZiAoIV8uY29udGFpbnMoc2VlbiwgY29tcHV0ZWQpKSB7XG4gICAgICAgICAgc2Vlbi5wdXNoKGNvbXB1dGVkKTtcbiAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIV8uY29udGFpbnMocmVzdWx0LCB2YWx1ZSkpIHtcbiAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIC8vIFByb2R1Y2UgYW4gYXJyYXkgdGhhdCBjb250YWlucyB0aGUgdW5pb246IGVhY2ggZGlzdGluY3QgZWxlbWVudCBmcm9tIGFsbCBvZlxuICAvLyB0aGUgcGFzc2VkLWluIGFycmF5cy5cbiAgXy51bmlvbiA9IHJlc3RBcmd1bWVudHMoZnVuY3Rpb24oYXJyYXlzKSB7XG4gICAgcmV0dXJuIF8udW5pcShmbGF0dGVuKGFycmF5cywgdHJ1ZSwgdHJ1ZSkpO1xuICB9KTtcblxuICAvLyBQcm9kdWNlIGFuIGFycmF5IHRoYXQgY29udGFpbnMgZXZlcnkgaXRlbSBzaGFyZWQgYmV0d2VlbiBhbGwgdGhlXG4gIC8vIHBhc3NlZC1pbiBhcnJheXMuXG4gIF8uaW50ZXJzZWN0aW9uID0gZnVuY3Rpb24oYXJyYXkpIHtcbiAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgdmFyIGFyZ3NMZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBnZXRMZW5ndGgoYXJyYXkpOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBpdGVtID0gYXJyYXlbaV07XG4gICAgICBpZiAoXy5jb250YWlucyhyZXN1bHQsIGl0ZW0pKSBjb250aW51ZTtcbiAgICAgIHZhciBqO1xuICAgICAgZm9yIChqID0gMTsgaiA8IGFyZ3NMZW5ndGg7IGorKykge1xuICAgICAgICBpZiAoIV8uY29udGFpbnMoYXJndW1lbnRzW2pdLCBpdGVtKSkgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoaiA9PT0gYXJnc0xlbmd0aCkgcmVzdWx0LnB1c2goaXRlbSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgLy8gVGFrZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIG9uZSBhcnJheSBhbmQgYSBudW1iZXIgb2Ygb3RoZXIgYXJyYXlzLlxuICAvLyBPbmx5IHRoZSBlbGVtZW50cyBwcmVzZW50IGluIGp1c3QgdGhlIGZpcnN0IGFycmF5IHdpbGwgcmVtYWluLlxuICBfLmRpZmZlcmVuY2UgPSByZXN0QXJndW1lbnRzKGZ1bmN0aW9uKGFycmF5LCByZXN0KSB7XG4gICAgcmVzdCA9IGZsYXR0ZW4ocmVzdCwgdHJ1ZSwgdHJ1ZSk7XG4gICAgcmV0dXJuIF8uZmlsdGVyKGFycmF5LCBmdW5jdGlvbih2YWx1ZSl7XG4gICAgICByZXR1cm4gIV8uY29udGFpbnMocmVzdCwgdmFsdWUpO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyBDb21wbGVtZW50IG9mIF8uemlwLiBVbnppcCBhY2NlcHRzIGFuIGFycmF5IG9mIGFycmF5cyBhbmQgZ3JvdXBzXG4gIC8vIGVhY2ggYXJyYXkncyBlbGVtZW50cyBvbiBzaGFyZWQgaW5kaWNlcy5cbiAgXy51bnppcCA9IGZ1bmN0aW9uKGFycmF5KSB7XG4gICAgdmFyIGxlbmd0aCA9IGFycmF5ICYmIF8ubWF4KGFycmF5LCBnZXRMZW5ndGgpLmxlbmd0aCB8fCAwO1xuICAgIHZhciByZXN1bHQgPSBBcnJheShsZW5ndGgpO1xuXG4gICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgcmVzdWx0W2luZGV4XSA9IF8ucGx1Y2soYXJyYXksIGluZGV4KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICAvLyBaaXAgdG9nZXRoZXIgbXVsdGlwbGUgbGlzdHMgaW50byBhIHNpbmdsZSBhcnJheSAtLSBlbGVtZW50cyB0aGF0IHNoYXJlXG4gIC8vIGFuIGluZGV4IGdvIHRvZ2V0aGVyLlxuICBfLnppcCA9IHJlc3RBcmd1bWVudHMoXy51bnppcCk7XG5cbiAgLy8gQ29udmVydHMgbGlzdHMgaW50byBvYmplY3RzLiBQYXNzIGVpdGhlciBhIHNpbmdsZSBhcnJheSBvZiBgW2tleSwgdmFsdWVdYFxuICAvLyBwYWlycywgb3IgdHdvIHBhcmFsbGVsIGFycmF5cyBvZiB0aGUgc2FtZSBsZW5ndGggLS0gb25lIG9mIGtleXMsIGFuZCBvbmUgb2ZcbiAgLy8gdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWVzLiBQYXNzaW5nIGJ5IHBhaXJzIGlzIHRoZSByZXZlcnNlIG9mIF8ucGFpcnMuXG4gIF8ub2JqZWN0ID0gZnVuY3Rpb24obGlzdCwgdmFsdWVzKSB7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBnZXRMZW5ndGgobGlzdCk7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHZhbHVlcykge1xuICAgICAgICByZXN1bHRbbGlzdFtpXV0gPSB2YWx1ZXNbaV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHRbbGlzdFtpXVswXV0gPSBsaXN0W2ldWzFdO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIC8vIEdlbmVyYXRvciBmdW5jdGlvbiB0byBjcmVhdGUgdGhlIGZpbmRJbmRleCBhbmQgZmluZExhc3RJbmRleCBmdW5jdGlvbnMuXG4gIHZhciBjcmVhdGVQcmVkaWNhdGVJbmRleEZpbmRlciA9IGZ1bmN0aW9uKGRpcikge1xuICAgIHJldHVybiBmdW5jdGlvbihhcnJheSwgcHJlZGljYXRlLCBjb250ZXh0KSB7XG4gICAgICBwcmVkaWNhdGUgPSBjYihwcmVkaWNhdGUsIGNvbnRleHQpO1xuICAgICAgdmFyIGxlbmd0aCA9IGdldExlbmd0aChhcnJheSk7XG4gICAgICB2YXIgaW5kZXggPSBkaXIgPiAwID8gMCA6IGxlbmd0aCAtIDE7XG4gICAgICBmb3IgKDsgaW5kZXggPj0gMCAmJiBpbmRleCA8IGxlbmd0aDsgaW5kZXggKz0gZGlyKSB7XG4gICAgICAgIGlmIChwcmVkaWNhdGUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpKSByZXR1cm4gaW5kZXg7XG4gICAgICB9XG4gICAgICByZXR1cm4gLTE7XG4gICAgfTtcbiAgfTtcblxuICAvLyBSZXR1cm5zIHRoZSBmaXJzdCBpbmRleCBvbiBhbiBhcnJheS1saWtlIHRoYXQgcGFzc2VzIGEgcHJlZGljYXRlIHRlc3QuXG4gIF8uZmluZEluZGV4ID0gY3JlYXRlUHJlZGljYXRlSW5kZXhGaW5kZXIoMSk7XG4gIF8uZmluZExhc3RJbmRleCA9IGNyZWF0ZVByZWRpY2F0ZUluZGV4RmluZGVyKC0xKTtcblxuICAvLyBVc2UgYSBjb21wYXJhdG9yIGZ1bmN0aW9uIHRvIGZpZ3VyZSBvdXQgdGhlIHNtYWxsZXN0IGluZGV4IGF0IHdoaWNoXG4gIC8vIGFuIG9iamVjdCBzaG91bGQgYmUgaW5zZXJ0ZWQgc28gYXMgdG8gbWFpbnRhaW4gb3JkZXIuIFVzZXMgYmluYXJ5IHNlYXJjaC5cbiAgXy5zb3J0ZWRJbmRleCA9IGZ1bmN0aW9uKGFycmF5LCBvYmosIGl0ZXJhdGVlLCBjb250ZXh0KSB7XG4gICAgaXRlcmF0ZWUgPSBjYihpdGVyYXRlZSwgY29udGV4dCwgMSk7XG4gICAgdmFyIHZhbHVlID0gaXRlcmF0ZWUob2JqKTtcbiAgICB2YXIgbG93ID0gMCwgaGlnaCA9IGdldExlbmd0aChhcnJheSk7XG4gICAgd2hpbGUgKGxvdyA8IGhpZ2gpIHtcbiAgICAgIHZhciBtaWQgPSBNYXRoLmZsb29yKChsb3cgKyBoaWdoKSAvIDIpO1xuICAgICAgaWYgKGl0ZXJhdGVlKGFycmF5W21pZF0pIDwgdmFsdWUpIGxvdyA9IG1pZCArIDE7IGVsc2UgaGlnaCA9IG1pZDtcbiAgICB9XG4gICAgcmV0dXJuIGxvdztcbiAgfTtcblxuICAvLyBHZW5lcmF0b3IgZnVuY3Rpb24gdG8gY3JlYXRlIHRoZSBpbmRleE9mIGFuZCBsYXN0SW5kZXhPZiBmdW5jdGlvbnMuXG4gIHZhciBjcmVhdGVJbmRleEZpbmRlciA9IGZ1bmN0aW9uKGRpciwgcHJlZGljYXRlRmluZCwgc29ydGVkSW5kZXgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oYXJyYXksIGl0ZW0sIGlkeCkge1xuICAgICAgdmFyIGkgPSAwLCBsZW5ndGggPSBnZXRMZW5ndGgoYXJyYXkpO1xuICAgICAgaWYgKHR5cGVvZiBpZHggPT0gJ251bWJlcicpIHtcbiAgICAgICAgaWYgKGRpciA+IDApIHtcbiAgICAgICAgICBpID0gaWR4ID49IDAgPyBpZHggOiBNYXRoLm1heChpZHggKyBsZW5ndGgsIGkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxlbmd0aCA9IGlkeCA+PSAwID8gTWF0aC5taW4oaWR4ICsgMSwgbGVuZ3RoKSA6IGlkeCArIGxlbmd0aCArIDE7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc29ydGVkSW5kZXggJiYgaWR4ICYmIGxlbmd0aCkge1xuICAgICAgICBpZHggPSBzb3J0ZWRJbmRleChhcnJheSwgaXRlbSk7XG4gICAgICAgIHJldHVybiBhcnJheVtpZHhdID09PSBpdGVtID8gaWR4IDogLTE7XG4gICAgICB9XG4gICAgICBpZiAoaXRlbSAhPT0gaXRlbSkge1xuICAgICAgICBpZHggPSBwcmVkaWNhdGVGaW5kKHNsaWNlLmNhbGwoYXJyYXksIGksIGxlbmd0aCksIF8uaXNOYU4pO1xuICAgICAgICByZXR1cm4gaWR4ID49IDAgPyBpZHggKyBpIDogLTE7XG4gICAgICB9XG4gICAgICBmb3IgKGlkeCA9IGRpciA+IDAgPyBpIDogbGVuZ3RoIC0gMTsgaWR4ID49IDAgJiYgaWR4IDwgbGVuZ3RoOyBpZHggKz0gZGlyKSB7XG4gICAgICAgIGlmIChhcnJheVtpZHhdID09PSBpdGVtKSByZXR1cm4gaWR4O1xuICAgICAgfVxuICAgICAgcmV0dXJuIC0xO1xuICAgIH07XG4gIH07XG5cbiAgLy8gUmV0dXJuIHRoZSBwb3NpdGlvbiBvZiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBhbiBpdGVtIGluIGFuIGFycmF5LFxuICAvLyBvciAtMSBpZiB0aGUgaXRlbSBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIGFycmF5LlxuICAvLyBJZiB0aGUgYXJyYXkgaXMgbGFyZ2UgYW5kIGFscmVhZHkgaW4gc29ydCBvcmRlciwgcGFzcyBgdHJ1ZWBcbiAgLy8gZm9yICoqaXNTb3J0ZWQqKiB0byB1c2UgYmluYXJ5IHNlYXJjaC5cbiAgXy5pbmRleE9mID0gY3JlYXRlSW5kZXhGaW5kZXIoMSwgXy5maW5kSW5kZXgsIF8uc29ydGVkSW5kZXgpO1xuICBfLmxhc3RJbmRleE9mID0gY3JlYXRlSW5kZXhGaW5kZXIoLTEsIF8uZmluZExhc3RJbmRleCk7XG5cbiAgLy8gR2VuZXJhdGUgYW4gaW50ZWdlciBBcnJheSBjb250YWluaW5nIGFuIGFyaXRobWV0aWMgcHJvZ3Jlc3Npb24uIEEgcG9ydCBvZlxuICAvLyB0aGUgbmF0aXZlIFB5dGhvbiBgcmFuZ2UoKWAgZnVuY3Rpb24uIFNlZVxuICAvLyBbdGhlIFB5dGhvbiBkb2N1bWVudGF0aW9uXShodHRwOi8vZG9jcy5weXRob24ub3JnL2xpYnJhcnkvZnVuY3Rpb25zLmh0bWwjcmFuZ2UpLlxuICBfLnJhbmdlID0gZnVuY3Rpb24oc3RhcnQsIHN0b3AsIHN0ZXApIHtcbiAgICBpZiAoc3RvcCA9PSBudWxsKSB7XG4gICAgICBzdG9wID0gc3RhcnQgfHwgMDtcbiAgICAgIHN0YXJ0ID0gMDtcbiAgICB9XG4gICAgaWYgKCFzdGVwKSB7XG4gICAgICBzdGVwID0gc3RvcCA8IHN0YXJ0ID8gLTEgOiAxO1xuICAgIH1cblxuICAgIHZhciBsZW5ndGggPSBNYXRoLm1heChNYXRoLmNlaWwoKHN0b3AgLSBzdGFydCkgLyBzdGVwKSwgMCk7XG4gICAgdmFyIHJhbmdlID0gQXJyYXkobGVuZ3RoKTtcblxuICAgIGZvciAodmFyIGlkeCA9IDA7IGlkeCA8IGxlbmd0aDsgaWR4KyssIHN0YXJ0ICs9IHN0ZXApIHtcbiAgICAgIHJhbmdlW2lkeF0gPSBzdGFydDtcbiAgICB9XG5cbiAgICByZXR1cm4gcmFuZ2U7XG4gIH07XG5cbiAgLy8gQ2h1bmsgYSBzaW5nbGUgYXJyYXkgaW50byBtdWx0aXBsZSBhcnJheXMsIGVhY2ggY29udGFpbmluZyBgY291bnRgIG9yIGZld2VyXG4gIC8vIGl0ZW1zLlxuICBfLmNodW5rID0gZnVuY3Rpb24oYXJyYXksIGNvdW50KSB7XG4gICAgaWYgKGNvdW50ID09IG51bGwgfHwgY291bnQgPCAxKSByZXR1cm4gW107XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIHZhciBpID0gMCwgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuICAgIHdoaWxlIChpIDwgbGVuZ3RoKSB7XG4gICAgICByZXN1bHQucHVzaChzbGljZS5jYWxsKGFycmF5LCBpLCBpICs9IGNvdW50KSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgLy8gRnVuY3Rpb24gKGFoZW0pIEZ1bmN0aW9uc1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvLyBEZXRlcm1pbmVzIHdoZXRoZXIgdG8gZXhlY3V0ZSBhIGZ1bmN0aW9uIGFzIGEgY29uc3RydWN0b3JcbiAgLy8gb3IgYSBub3JtYWwgZnVuY3Rpb24gd2l0aCB0aGUgcHJvdmlkZWQgYXJndW1lbnRzLlxuICB2YXIgZXhlY3V0ZUJvdW5kID0gZnVuY3Rpb24oc291cmNlRnVuYywgYm91bmRGdW5jLCBjb250ZXh0LCBjYWxsaW5nQ29udGV4dCwgYXJncykge1xuICAgIGlmICghKGNhbGxpbmdDb250ZXh0IGluc3RhbmNlb2YgYm91bmRGdW5jKSkgcmV0dXJuIHNvdXJjZUZ1bmMuYXBwbHkoY29udGV4dCwgYXJncyk7XG4gICAgdmFyIHNlbGYgPSBiYXNlQ3JlYXRlKHNvdXJjZUZ1bmMucHJvdG90eXBlKTtcbiAgICB2YXIgcmVzdWx0ID0gc291cmNlRnVuYy5hcHBseShzZWxmLCBhcmdzKTtcbiAgICBpZiAoXy5pc09iamVjdChyZXN1bHQpKSByZXR1cm4gcmVzdWx0O1xuICAgIHJldHVybiBzZWxmO1xuICB9O1xuXG4gIC8vIENyZWF0ZSBhIGZ1bmN0aW9uIGJvdW5kIHRvIGEgZ2l2ZW4gb2JqZWN0IChhc3NpZ25pbmcgYHRoaXNgLCBhbmQgYXJndW1lbnRzLFxuICAvLyBvcHRpb25hbGx5KS4gRGVsZWdhdGVzIHRvICoqRUNNQVNjcmlwdCA1KioncyBuYXRpdmUgYEZ1bmN0aW9uLmJpbmRgIGlmXG4gIC8vIGF2YWlsYWJsZS5cbiAgXy5iaW5kID0gcmVzdEFyZ3VtZW50cyhmdW5jdGlvbihmdW5jLCBjb250ZXh0LCBhcmdzKSB7XG4gICAgaWYgKCFfLmlzRnVuY3Rpb24oZnVuYykpIHRocm93IG5ldyBUeXBlRXJyb3IoJ0JpbmQgbXVzdCBiZSBjYWxsZWQgb24gYSBmdW5jdGlvbicpO1xuICAgIHZhciBib3VuZCA9IHJlc3RBcmd1bWVudHMoZnVuY3Rpb24oY2FsbEFyZ3MpIHtcbiAgICAgIHJldHVybiBleGVjdXRlQm91bmQoZnVuYywgYm91bmQsIGNvbnRleHQsIHRoaXMsIGFyZ3MuY29uY2F0KGNhbGxBcmdzKSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGJvdW5kO1xuICB9KTtcblxuICAvLyBQYXJ0aWFsbHkgYXBwbHkgYSBmdW5jdGlvbiBieSBjcmVhdGluZyBhIHZlcnNpb24gdGhhdCBoYXMgaGFkIHNvbWUgb2YgaXRzXG4gIC8vIGFyZ3VtZW50cyBwcmUtZmlsbGVkLCB3aXRob3V0IGNoYW5naW5nIGl0cyBkeW5hbWljIGB0aGlzYCBjb250ZXh0LiBfIGFjdHNcbiAgLy8gYXMgYSBwbGFjZWhvbGRlciBieSBkZWZhdWx0LCBhbGxvd2luZyBhbnkgY29tYmluYXRpb24gb2YgYXJndW1lbnRzIHRvIGJlXG4gIC8vIHByZS1maWxsZWQuIFNldCBgXy5wYXJ0aWFsLnBsYWNlaG9sZGVyYCBmb3IgYSBjdXN0b20gcGxhY2Vob2xkZXIgYXJndW1lbnQuXG4gIF8ucGFydGlhbCA9IHJlc3RBcmd1bWVudHMoZnVuY3Rpb24oZnVuYywgYm91bmRBcmdzKSB7XG4gICAgdmFyIHBsYWNlaG9sZGVyID0gXy5wYXJ0aWFsLnBsYWNlaG9sZGVyO1xuICAgIHZhciBib3VuZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHBvc2l0aW9uID0gMCwgbGVuZ3RoID0gYm91bmRBcmdzLmxlbmd0aDtcbiAgICAgIHZhciBhcmdzID0gQXJyYXkobGVuZ3RoKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYXJnc1tpXSA9IGJvdW5kQXJnc1tpXSA9PT0gcGxhY2Vob2xkZXIgPyBhcmd1bWVudHNbcG9zaXRpb24rK10gOiBib3VuZEFyZ3NbaV07XG4gICAgICB9XG4gICAgICB3aGlsZSAocG9zaXRpb24gPCBhcmd1bWVudHMubGVuZ3RoKSBhcmdzLnB1c2goYXJndW1lbnRzW3Bvc2l0aW9uKytdKTtcbiAgICAgIHJldHVybiBleGVjdXRlQm91bmQoZnVuYywgYm91bmQsIHRoaXMsIHRoaXMsIGFyZ3MpO1xuICAgIH07XG4gICAgcmV0dXJuIGJvdW5kO1xuICB9KTtcblxuICBfLnBhcnRpYWwucGxhY2Vob2xkZXIgPSBfO1xuXG4gIC8vIEJpbmQgYSBudW1iZXIgb2YgYW4gb2JqZWN0J3MgbWV0aG9kcyB0byB0aGF0IG9iamVjdC4gUmVtYWluaW5nIGFyZ3VtZW50c1xuICAvLyBhcmUgdGhlIG1ldGhvZCBuYW1lcyB0byBiZSBib3VuZC4gVXNlZnVsIGZvciBlbnN1cmluZyB0aGF0IGFsbCBjYWxsYmFja3NcbiAgLy8gZGVmaW5lZCBvbiBhbiBvYmplY3QgYmVsb25nIHRvIGl0LlxuICBfLmJpbmRBbGwgPSByZXN0QXJndW1lbnRzKGZ1bmN0aW9uKG9iaiwga2V5cykge1xuICAgIGtleXMgPSBmbGF0dGVuKGtleXMsIGZhbHNlLCBmYWxzZSk7XG4gICAgdmFyIGluZGV4ID0ga2V5cy5sZW5ndGg7XG4gICAgaWYgKGluZGV4IDwgMSkgdGhyb3cgbmV3IEVycm9yKCdiaW5kQWxsIG11c3QgYmUgcGFzc2VkIGZ1bmN0aW9uIG5hbWVzJyk7XG4gICAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICAgIHZhciBrZXkgPSBrZXlzW2luZGV4XTtcbiAgICAgIG9ialtrZXldID0gXy5iaW5kKG9ialtrZXldLCBvYmopO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gTWVtb2l6ZSBhbiBleHBlbnNpdmUgZnVuY3Rpb24gYnkgc3RvcmluZyBpdHMgcmVzdWx0cy5cbiAgXy5tZW1vaXplID0gZnVuY3Rpb24oZnVuYywgaGFzaGVyKSB7XG4gICAgdmFyIG1lbW9pemUgPSBmdW5jdGlvbihrZXkpIHtcbiAgICAgIHZhciBjYWNoZSA9IG1lbW9pemUuY2FjaGU7XG4gICAgICB2YXIgYWRkcmVzcyA9ICcnICsgKGhhc2hlciA/IGhhc2hlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDoga2V5KTtcbiAgICAgIGlmICghaGFzKGNhY2hlLCBhZGRyZXNzKSkgY2FjaGVbYWRkcmVzc10gPSBmdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICByZXR1cm4gY2FjaGVbYWRkcmVzc107XG4gICAgfTtcbiAgICBtZW1vaXplLmNhY2hlID0ge307XG4gICAgcmV0dXJuIG1lbW9pemU7XG4gIH07XG5cbiAgLy8gRGVsYXlzIGEgZnVuY3Rpb24gZm9yIHRoZSBnaXZlbiBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLCBhbmQgdGhlbiBjYWxsc1xuICAvLyBpdCB3aXRoIHRoZSBhcmd1bWVudHMgc3VwcGxpZWQuXG4gIF8uZGVsYXkgPSByZXN0QXJndW1lbnRzKGZ1bmN0aW9uKGZ1bmMsIHdhaXQsIGFyZ3MpIHtcbiAgICByZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBmdW5jLmFwcGx5KG51bGwsIGFyZ3MpO1xuICAgIH0sIHdhaXQpO1xuICB9KTtcblxuICAvLyBEZWZlcnMgYSBmdW5jdGlvbiwgc2NoZWR1bGluZyBpdCB0byBydW4gYWZ0ZXIgdGhlIGN1cnJlbnQgY2FsbCBzdGFjayBoYXNcbiAgLy8gY2xlYXJlZC5cbiAgXy5kZWZlciA9IF8ucGFydGlhbChfLmRlbGF5LCBfLCAxKTtcblxuICAvLyBSZXR1cm5zIGEgZnVuY3Rpb24sIHRoYXQsIHdoZW4gaW52b2tlZCwgd2lsbCBvbmx5IGJlIHRyaWdnZXJlZCBhdCBtb3N0IG9uY2VcbiAgLy8gZHVyaW5nIGEgZ2l2ZW4gd2luZG93IG9mIHRpbWUuIE5vcm1hbGx5LCB0aGUgdGhyb3R0bGVkIGZ1bmN0aW9uIHdpbGwgcnVuXG4gIC8vIGFzIG11Y2ggYXMgaXQgY2FuLCB3aXRob3V0IGV2ZXIgZ29pbmcgbW9yZSB0aGFuIG9uY2UgcGVyIGB3YWl0YCBkdXJhdGlvbjtcbiAgLy8gYnV0IGlmIHlvdSdkIGxpa2UgdG8gZGlzYWJsZSB0aGUgZXhlY3V0aW9uIG9uIHRoZSBsZWFkaW5nIGVkZ2UsIHBhc3NcbiAgLy8gYHtsZWFkaW5nOiBmYWxzZX1gLiBUbyBkaXNhYmxlIGV4ZWN1dGlvbiBvbiB0aGUgdHJhaWxpbmcgZWRnZSwgZGl0dG8uXG4gIF8udGhyb3R0bGUgPSBmdW5jdGlvbihmdW5jLCB3YWl0LCBvcHRpb25zKSB7XG4gICAgdmFyIHRpbWVvdXQsIGNvbnRleHQsIGFyZ3MsIHJlc3VsdDtcbiAgICB2YXIgcHJldmlvdXMgPSAwO1xuICAgIGlmICghb3B0aW9ucykgb3B0aW9ucyA9IHt9O1xuXG4gICAgdmFyIGxhdGVyID0gZnVuY3Rpb24oKSB7XG4gICAgICBwcmV2aW91cyA9IG9wdGlvbnMubGVhZGluZyA9PT0gZmFsc2UgPyAwIDogXy5ub3coKTtcbiAgICAgIHRpbWVvdXQgPSBudWxsO1xuICAgICAgcmVzdWx0ID0gZnVuYy5hcHBseShjb250ZXh0LCBhcmdzKTtcbiAgICAgIGlmICghdGltZW91dCkgY29udGV4dCA9IGFyZ3MgPSBudWxsO1xuICAgIH07XG5cbiAgICB2YXIgdGhyb3R0bGVkID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgbm93ID0gXy5ub3coKTtcbiAgICAgIGlmICghcHJldmlvdXMgJiYgb3B0aW9ucy5sZWFkaW5nID09PSBmYWxzZSkgcHJldmlvdXMgPSBub3c7XG4gICAgICB2YXIgcmVtYWluaW5nID0gd2FpdCAtIChub3cgLSBwcmV2aW91cyk7XG4gICAgICBjb250ZXh0ID0gdGhpcztcbiAgICAgIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICBpZiAocmVtYWluaW5nIDw9IDAgfHwgcmVtYWluaW5nID4gd2FpdCkge1xuICAgICAgICBpZiAodGltZW91dCkge1xuICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgICB0aW1lb3V0ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBwcmV2aW91cyA9IG5vdztcbiAgICAgICAgcmVzdWx0ID0gZnVuYy5hcHBseShjb250ZXh0LCBhcmdzKTtcbiAgICAgICAgaWYgKCF0aW1lb3V0KSBjb250ZXh0ID0gYXJncyA9IG51bGw7XG4gICAgICB9IGVsc2UgaWYgKCF0aW1lb3V0ICYmIG9wdGlvbnMudHJhaWxpbmcgIT09IGZhbHNlKSB7XG4gICAgICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KGxhdGVyLCByZW1haW5pbmcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgdGhyb3R0bGVkLmNhbmNlbCA9IGZ1bmN0aW9uKCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgcHJldmlvdXMgPSAwO1xuICAgICAgdGltZW91dCA9IGNvbnRleHQgPSBhcmdzID0gbnVsbDtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRocm90dGxlZDtcbiAgfTtcblxuICAvLyBSZXR1cm5zIGEgZnVuY3Rpb24sIHRoYXQsIGFzIGxvbmcgYXMgaXQgY29udGludWVzIHRvIGJlIGludm9rZWQsIHdpbGwgbm90XG4gIC8vIGJlIHRyaWdnZXJlZC4gVGhlIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGFmdGVyIGl0IHN0b3BzIGJlaW5nIGNhbGxlZCBmb3JcbiAgLy8gTiBtaWxsaXNlY29uZHMuIElmIGBpbW1lZGlhdGVgIGlzIHBhc3NlZCwgdHJpZ2dlciB0aGUgZnVuY3Rpb24gb24gdGhlXG4gIC8vIGxlYWRpbmcgZWRnZSwgaW5zdGVhZCBvZiB0aGUgdHJhaWxpbmcuXG4gIF8uZGVib3VuY2UgPSBmdW5jdGlvbihmdW5jLCB3YWl0LCBpbW1lZGlhdGUpIHtcbiAgICB2YXIgdGltZW91dCwgcmVzdWx0O1xuXG4gICAgdmFyIGxhdGVyID0gZnVuY3Rpb24oY29udGV4dCwgYXJncykge1xuICAgICAgdGltZW91dCA9IG51bGw7XG4gICAgICBpZiAoYXJncykgcmVzdWx0ID0gZnVuYy5hcHBseShjb250ZXh0LCBhcmdzKTtcbiAgICB9O1xuXG4gICAgdmFyIGRlYm91bmNlZCA9IHJlc3RBcmd1bWVudHMoZnVuY3Rpb24oYXJncykge1xuICAgICAgaWYgKHRpbWVvdXQpIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgIGlmIChpbW1lZGlhdGUpIHtcbiAgICAgICAgdmFyIGNhbGxOb3cgPSAhdGltZW91dDtcbiAgICAgICAgdGltZW91dCA9IHNldFRpbWVvdXQobGF0ZXIsIHdhaXQpO1xuICAgICAgICBpZiAoY2FsbE5vdykgcmVzdWx0ID0gZnVuYy5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRpbWVvdXQgPSBfLmRlbGF5KGxhdGVyLCB3YWl0LCB0aGlzLCBhcmdzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcblxuICAgIGRlYm91bmNlZC5jYW5jZWwgPSBmdW5jdGlvbigpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgIHRpbWVvdXQgPSBudWxsO1xuICAgIH07XG5cbiAgICByZXR1cm4gZGVib3VuY2VkO1xuICB9O1xuXG4gIC8vIFJldHVybnMgdGhlIGZpcnN0IGZ1bmN0aW9uIHBhc3NlZCBhcyBhbiBhcmd1bWVudCB0byB0aGUgc2Vjb25kLFxuICAvLyBhbGxvd2luZyB5b3UgdG8gYWRqdXN0IGFyZ3VtZW50cywgcnVuIGNvZGUgYmVmb3JlIGFuZCBhZnRlciwgYW5kXG4gIC8vIGNvbmRpdGlvbmFsbHkgZXhlY3V0ZSB0aGUgb3JpZ2luYWwgZnVuY3Rpb24uXG4gIF8ud3JhcCA9IGZ1bmN0aW9uKGZ1bmMsIHdyYXBwZXIpIHtcbiAgICByZXR1cm4gXy5wYXJ0aWFsKHdyYXBwZXIsIGZ1bmMpO1xuICB9O1xuXG4gIC8vIFJldHVybnMgYSBuZWdhdGVkIHZlcnNpb24gb2YgdGhlIHBhc3NlZC1pbiBwcmVkaWNhdGUuXG4gIF8ubmVnYXRlID0gZnVuY3Rpb24ocHJlZGljYXRlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuICFwcmVkaWNhdGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuICB9O1xuXG4gIC8vIFJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGlzIHRoZSBjb21wb3NpdGlvbiBvZiBhIGxpc3Qgb2YgZnVuY3Rpb25zLCBlYWNoXG4gIC8vIGNvbnN1bWluZyB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBmdW5jdGlvbiB0aGF0IGZvbGxvd3MuXG4gIF8uY29tcG9zZSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICAgIHZhciBzdGFydCA9IGFyZ3MubGVuZ3RoIC0gMTtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgaSA9IHN0YXJ0O1xuICAgICAgdmFyIHJlc3VsdCA9IGFyZ3Nbc3RhcnRdLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB3aGlsZSAoaS0tKSByZXN1bHQgPSBhcmdzW2ldLmNhbGwodGhpcywgcmVzdWx0KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgfTtcblxuICAvLyBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCB3aWxsIG9ubHkgYmUgZXhlY3V0ZWQgb24gYW5kIGFmdGVyIHRoZSBOdGggY2FsbC5cbiAgXy5hZnRlciA9IGZ1bmN0aW9uKHRpbWVzLCBmdW5jKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKC0tdGltZXMgPCAxKSB7XG4gICAgICAgIHJldHVybiBmdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG4gICAgfTtcbiAgfTtcblxuICAvLyBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCB3aWxsIG9ubHkgYmUgZXhlY3V0ZWQgdXAgdG8gKGJ1dCBub3QgaW5jbHVkaW5nKSB0aGUgTnRoIGNhbGwuXG4gIF8uYmVmb3JlID0gZnVuY3Rpb24odGltZXMsIGZ1bmMpIHtcbiAgICB2YXIgbWVtbztcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoLS10aW1lcyA+IDApIHtcbiAgICAgICAgbWVtbyA9IGZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aW1lcyA8PSAxKSBmdW5jID0gbnVsbDtcbiAgICAgIHJldHVybiBtZW1vO1xuICAgIH07XG4gIH07XG5cbiAgLy8gUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBleGVjdXRlZCBhdCBtb3N0IG9uZSB0aW1lLCBubyBtYXR0ZXIgaG93XG4gIC8vIG9mdGVuIHlvdSBjYWxsIGl0LiBVc2VmdWwgZm9yIGxhenkgaW5pdGlhbGl6YXRpb24uXG4gIF8ub25jZSA9IF8ucGFydGlhbChfLmJlZm9yZSwgMik7XG5cbiAgXy5yZXN0QXJndW1lbnRzID0gcmVzdEFyZ3VtZW50cztcblxuICAvLyBPYmplY3QgRnVuY3Rpb25zXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS1cblxuICAvLyBLZXlzIGluIElFIDwgOSB0aGF0IHdvbid0IGJlIGl0ZXJhdGVkIGJ5IGBmb3Iga2V5IGluIC4uLmAgYW5kIHRodXMgbWlzc2VkLlxuICB2YXIgaGFzRW51bUJ1ZyA9ICF7dG9TdHJpbmc6IG51bGx9LnByb3BlcnR5SXNFbnVtZXJhYmxlKCd0b1N0cmluZycpO1xuICB2YXIgbm9uRW51bWVyYWJsZVByb3BzID0gWyd2YWx1ZU9mJywgJ2lzUHJvdG90eXBlT2YnLCAndG9TdHJpbmcnLFxuICAgICdwcm9wZXJ0eUlzRW51bWVyYWJsZScsICdoYXNPd25Qcm9wZXJ0eScsICd0b0xvY2FsZVN0cmluZyddO1xuXG4gIHZhciBjb2xsZWN0Tm9uRW51bVByb3BzID0gZnVuY3Rpb24ob2JqLCBrZXlzKSB7XG4gICAgdmFyIG5vbkVudW1JZHggPSBub25FbnVtZXJhYmxlUHJvcHMubGVuZ3RoO1xuICAgIHZhciBjb25zdHJ1Y3RvciA9IG9iai5jb25zdHJ1Y3RvcjtcbiAgICB2YXIgcHJvdG8gPSBfLmlzRnVuY3Rpb24oY29uc3RydWN0b3IpICYmIGNvbnN0cnVjdG9yLnByb3RvdHlwZSB8fCBPYmpQcm90bztcblxuICAgIC8vIENvbnN0cnVjdG9yIGlzIGEgc3BlY2lhbCBjYXNlLlxuICAgIHZhciBwcm9wID0gJ2NvbnN0cnVjdG9yJztcbiAgICBpZiAoaGFzKG9iaiwgcHJvcCkgJiYgIV8uY29udGFpbnMoa2V5cywgcHJvcCkpIGtleXMucHVzaChwcm9wKTtcblxuICAgIHdoaWxlIChub25FbnVtSWR4LS0pIHtcbiAgICAgIHByb3AgPSBub25FbnVtZXJhYmxlUHJvcHNbbm9uRW51bUlkeF07XG4gICAgICBpZiAocHJvcCBpbiBvYmogJiYgb2JqW3Byb3BdICE9PSBwcm90b1twcm9wXSAmJiAhXy5jb250YWlucyhrZXlzLCBwcm9wKSkge1xuICAgICAgICBrZXlzLnB1c2gocHJvcCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8vIFJldHJpZXZlIHRoZSBuYW1lcyBvZiBhbiBvYmplY3QncyBvd24gcHJvcGVydGllcy5cbiAgLy8gRGVsZWdhdGVzIHRvICoqRUNNQVNjcmlwdCA1KioncyBuYXRpdmUgYE9iamVjdC5rZXlzYC5cbiAgXy5rZXlzID0gZnVuY3Rpb24ob2JqKSB7XG4gICAgaWYgKCFfLmlzT2JqZWN0KG9iaikpIHJldHVybiBbXTtcbiAgICBpZiAobmF0aXZlS2V5cykgcmV0dXJuIG5hdGl2ZUtleXMob2JqKTtcbiAgICB2YXIga2V5cyA9IFtdO1xuICAgIGZvciAodmFyIGtleSBpbiBvYmopIGlmIChoYXMob2JqLCBrZXkpKSBrZXlzLnB1c2goa2V5KTtcbiAgICAvLyBBaGVtLCBJRSA8IDkuXG4gICAgaWYgKGhhc0VudW1CdWcpIGNvbGxlY3ROb25FbnVtUHJvcHMob2JqLCBrZXlzKTtcbiAgICByZXR1cm4ga2V5cztcbiAgfTtcblxuICAvLyBSZXRyaWV2ZSBhbGwgdGhlIHByb3BlcnR5IG5hbWVzIG9mIGFuIG9iamVjdC5cbiAgXy5hbGxLZXlzID0gZnVuY3Rpb24ob2JqKSB7XG4gICAgaWYgKCFfLmlzT2JqZWN0KG9iaikpIHJldHVybiBbXTtcbiAgICB2YXIga2V5cyA9IFtdO1xuICAgIGZvciAodmFyIGtleSBpbiBvYmopIGtleXMucHVzaChrZXkpO1xuICAgIC8vIEFoZW0sIElFIDwgOS5cbiAgICBpZiAoaGFzRW51bUJ1ZykgY29sbGVjdE5vbkVudW1Qcm9wcyhvYmosIGtleXMpO1xuICAgIHJldHVybiBrZXlzO1xuICB9O1xuXG4gIC8vIFJldHJpZXZlIHRoZSB2YWx1ZXMgb2YgYW4gb2JqZWN0J3MgcHJvcGVydGllcy5cbiAgXy52YWx1ZXMgPSBmdW5jdGlvbihvYmopIHtcbiAgICB2YXIga2V5cyA9IF8ua2V5cyhvYmopO1xuICAgIHZhciBsZW5ndGggPSBrZXlzLmxlbmd0aDtcbiAgICB2YXIgdmFsdWVzID0gQXJyYXkobGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICB2YWx1ZXNbaV0gPSBvYmpba2V5c1tpXV07XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZXM7XG4gIH07XG5cbiAgLy8gUmV0dXJucyB0aGUgcmVzdWx0cyBvZiBhcHBseWluZyB0aGUgaXRlcmF0ZWUgdG8gZWFjaCBlbGVtZW50IG9mIHRoZSBvYmplY3QuXG4gIC8vIEluIGNvbnRyYXN0IHRvIF8ubWFwIGl0IHJldHVybnMgYW4gb2JqZWN0LlxuICBfLm1hcE9iamVjdCA9IGZ1bmN0aW9uKG9iaiwgaXRlcmF0ZWUsIGNvbnRleHQpIHtcbiAgICBpdGVyYXRlZSA9IGNiKGl0ZXJhdGVlLCBjb250ZXh0KTtcbiAgICB2YXIga2V5cyA9IF8ua2V5cyhvYmopLFxuICAgICAgICBsZW5ndGggPSBrZXlzLmxlbmd0aCxcbiAgICAgICAgcmVzdWx0cyA9IHt9O1xuICAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIHZhciBjdXJyZW50S2V5ID0ga2V5c1tpbmRleF07XG4gICAgICByZXN1bHRzW2N1cnJlbnRLZXldID0gaXRlcmF0ZWUob2JqW2N1cnJlbnRLZXldLCBjdXJyZW50S2V5LCBvYmopO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfTtcblxuICAvLyBDb252ZXJ0IGFuIG9iamVjdCBpbnRvIGEgbGlzdCBvZiBgW2tleSwgdmFsdWVdYCBwYWlycy5cbiAgLy8gVGhlIG9wcG9zaXRlIG9mIF8ub2JqZWN0LlxuICBfLnBhaXJzID0gZnVuY3Rpb24ob2JqKSB7XG4gICAgdmFyIGtleXMgPSBfLmtleXMob2JqKTtcbiAgICB2YXIgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gICAgdmFyIHBhaXJzID0gQXJyYXkobGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICBwYWlyc1tpXSA9IFtrZXlzW2ldLCBvYmpba2V5c1tpXV1dO1xuICAgIH1cbiAgICByZXR1cm4gcGFpcnM7XG4gIH07XG5cbiAgLy8gSW52ZXJ0IHRoZSBrZXlzIGFuZCB2YWx1ZXMgb2YgYW4gb2JqZWN0LiBUaGUgdmFsdWVzIG11c3QgYmUgc2VyaWFsaXphYmxlLlxuICBfLmludmVydCA9IGZ1bmN0aW9uKG9iaikge1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICB2YXIga2V5cyA9IF8ua2V5cyhvYmopO1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBrZXlzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICByZXN1bHRbb2JqW2tleXNbaV1dXSA9IGtleXNbaV07XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgLy8gUmV0dXJuIGEgc29ydGVkIGxpc3Qgb2YgdGhlIGZ1bmN0aW9uIG5hbWVzIGF2YWlsYWJsZSBvbiB0aGUgb2JqZWN0LlxuICAvLyBBbGlhc2VkIGFzIGBtZXRob2RzYC5cbiAgXy5mdW5jdGlvbnMgPSBfLm1ldGhvZHMgPSBmdW5jdGlvbihvYmopIHtcbiAgICB2YXIgbmFtZXMgPSBbXTtcbiAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgICBpZiAoXy5pc0Z1bmN0aW9uKG9ialtrZXldKSkgbmFtZXMucHVzaChrZXkpO1xuICAgIH1cbiAgICByZXR1cm4gbmFtZXMuc29ydCgpO1xuICB9O1xuXG4gIC8vIEFuIGludGVybmFsIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhc3NpZ25lciBmdW5jdGlvbnMuXG4gIHZhciBjcmVhdGVBc3NpZ25lciA9IGZ1bmN0aW9uKGtleXNGdW5jLCBkZWZhdWx0cykge1xuICAgIHJldHVybiBmdW5jdGlvbihvYmopIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgICAgaWYgKGRlZmF1bHRzKSBvYmogPSBPYmplY3Qob2JqKTtcbiAgICAgIGlmIChsZW5ndGggPCAyIHx8IG9iaiA9PSBudWxsKSByZXR1cm4gb2JqO1xuICAgICAgZm9yICh2YXIgaW5kZXggPSAxOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2luZGV4XSxcbiAgICAgICAgICAgIGtleXMgPSBrZXlzRnVuYyhzb3VyY2UpLFxuICAgICAgICAgICAgbCA9IGtleXMubGVuZ3RoO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgICAgICAgIGlmICghZGVmYXVsdHMgfHwgb2JqW2tleV0gPT09IHZvaWQgMCkgb2JqW2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG9iajtcbiAgICB9O1xuICB9O1xuXG4gIC8vIEV4dGVuZCBhIGdpdmVuIG9iamVjdCB3aXRoIGFsbCB0aGUgcHJvcGVydGllcyBpbiBwYXNzZWQtaW4gb2JqZWN0KHMpLlxuICBfLmV4dGVuZCA9IGNyZWF0ZUFzc2lnbmVyKF8uYWxsS2V5cyk7XG5cbiAgLy8gQXNzaWducyBhIGdpdmVuIG9iamVjdCB3aXRoIGFsbCB0aGUgb3duIHByb3BlcnRpZXMgaW4gdGhlIHBhc3NlZC1pbiBvYmplY3QocykuXG4gIC8vIChodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3QvYXNzaWduKVxuICBfLmV4dGVuZE93biA9IF8uYXNzaWduID0gY3JlYXRlQXNzaWduZXIoXy5rZXlzKTtcblxuICAvLyBSZXR1cm5zIHRoZSBmaXJzdCBrZXkgb24gYW4gb2JqZWN0IHRoYXQgcGFzc2VzIGEgcHJlZGljYXRlIHRlc3QuXG4gIF8uZmluZEtleSA9IGZ1bmN0aW9uKG9iaiwgcHJlZGljYXRlLCBjb250ZXh0KSB7XG4gICAgcHJlZGljYXRlID0gY2IocHJlZGljYXRlLCBjb250ZXh0KTtcbiAgICB2YXIga2V5cyA9IF8ua2V5cyhvYmopLCBrZXk7XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IGtleXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIGtleSA9IGtleXNbaV07XG4gICAgICBpZiAocHJlZGljYXRlKG9ialtrZXldLCBrZXksIG9iaikpIHJldHVybiBrZXk7XG4gICAgfVxuICB9O1xuXG4gIC8vIEludGVybmFsIHBpY2sgaGVscGVyIGZ1bmN0aW9uIHRvIGRldGVybWluZSBpZiBgb2JqYCBoYXMga2V5IGBrZXlgLlxuICB2YXIga2V5SW5PYmogPSBmdW5jdGlvbih2YWx1ZSwga2V5LCBvYmopIHtcbiAgICByZXR1cm4ga2V5IGluIG9iajtcbiAgfTtcblxuICAvLyBSZXR1cm4gYSBjb3B5IG9mIHRoZSBvYmplY3Qgb25seSBjb250YWluaW5nIHRoZSB3aGl0ZWxpc3RlZCBwcm9wZXJ0aWVzLlxuICBfLnBpY2sgPSByZXN0QXJndW1lbnRzKGZ1bmN0aW9uKG9iaiwga2V5cykge1xuICAgIHZhciByZXN1bHQgPSB7fSwgaXRlcmF0ZWUgPSBrZXlzWzBdO1xuICAgIGlmIChvYmogPT0gbnVsbCkgcmV0dXJuIHJlc3VsdDtcbiAgICBpZiAoXy5pc0Z1bmN0aW9uKGl0ZXJhdGVlKSkge1xuICAgICAgaWYgKGtleXMubGVuZ3RoID4gMSkgaXRlcmF0ZWUgPSBvcHRpbWl6ZUNiKGl0ZXJhdGVlLCBrZXlzWzFdKTtcbiAgICAgIGtleXMgPSBfLmFsbEtleXMob2JqKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaXRlcmF0ZWUgPSBrZXlJbk9iajtcbiAgICAgIGtleXMgPSBmbGF0dGVuKGtleXMsIGZhbHNlLCBmYWxzZSk7XG4gICAgICBvYmogPSBPYmplY3Qob2JqKTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IGtleXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgICAgdmFyIHZhbHVlID0gb2JqW2tleV07XG4gICAgICBpZiAoaXRlcmF0ZWUodmFsdWUsIGtleSwgb2JqKSkgcmVzdWx0W2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSk7XG5cbiAgLy8gUmV0dXJuIGEgY29weSBvZiB0aGUgb2JqZWN0IHdpdGhvdXQgdGhlIGJsYWNrbGlzdGVkIHByb3BlcnRpZXMuXG4gIF8ub21pdCA9IHJlc3RBcmd1bWVudHMoZnVuY3Rpb24ob2JqLCBrZXlzKSB7XG4gICAgdmFyIGl0ZXJhdGVlID0ga2V5c1swXSwgY29udGV4dDtcbiAgICBpZiAoXy5pc0Z1bmN0aW9uKGl0ZXJhdGVlKSkge1xuICAgICAgaXRlcmF0ZWUgPSBfLm5lZ2F0ZShpdGVyYXRlZSk7XG4gICAgICBpZiAoa2V5cy5sZW5ndGggPiAxKSBjb250ZXh0ID0ga2V5c1sxXTtcbiAgICB9IGVsc2Uge1xuICAgICAga2V5cyA9IF8ubWFwKGZsYXR0ZW4oa2V5cywgZmFsc2UsIGZhbHNlKSwgU3RyaW5nKTtcbiAgICAgIGl0ZXJhdGVlID0gZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAgICByZXR1cm4gIV8uY29udGFpbnMoa2V5cywga2V5KTtcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBfLnBpY2sob2JqLCBpdGVyYXRlZSwgY29udGV4dCk7XG4gIH0pO1xuXG4gIC8vIEZpbGwgaW4gYSBnaXZlbiBvYmplY3Qgd2l0aCBkZWZhdWx0IHByb3BlcnRpZXMuXG4gIF8uZGVmYXVsdHMgPSBjcmVhdGVBc3NpZ25lcihfLmFsbEtleXMsIHRydWUpO1xuXG4gIC8vIENyZWF0ZXMgYW4gb2JqZWN0IHRoYXQgaW5oZXJpdHMgZnJvbSB0aGUgZ2l2ZW4gcHJvdG90eXBlIG9iamVjdC5cbiAgLy8gSWYgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIGFyZSBwcm92aWRlZCB0aGVuIHRoZXkgd2lsbCBiZSBhZGRlZCB0byB0aGVcbiAgLy8gY3JlYXRlZCBvYmplY3QuXG4gIF8uY3JlYXRlID0gZnVuY3Rpb24ocHJvdG90eXBlLCBwcm9wcykge1xuICAgIHZhciByZXN1bHQgPSBiYXNlQ3JlYXRlKHByb3RvdHlwZSk7XG4gICAgaWYgKHByb3BzKSBfLmV4dGVuZE93bihyZXN1bHQsIHByb3BzKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIC8vIENyZWF0ZSBhIChzaGFsbG93LWNsb25lZCkgZHVwbGljYXRlIG9mIGFuIG9iamVjdC5cbiAgXy5jbG9uZSA9IGZ1bmN0aW9uKG9iaikge1xuICAgIGlmICghXy5pc09iamVjdChvYmopKSByZXR1cm4gb2JqO1xuICAgIHJldHVybiBfLmlzQXJyYXkob2JqKSA/IG9iai5zbGljZSgpIDogXy5leHRlbmQoe30sIG9iaik7XG4gIH07XG5cbiAgLy8gSW52b2tlcyBpbnRlcmNlcHRvciB3aXRoIHRoZSBvYmosIGFuZCB0aGVuIHJldHVybnMgb2JqLlxuICAvLyBUaGUgcHJpbWFyeSBwdXJwb3NlIG9mIHRoaXMgbWV0aG9kIGlzIHRvIFwidGFwIGludG9cIiBhIG1ldGhvZCBjaGFpbiwgaW5cbiAgLy8gb3JkZXIgdG8gcGVyZm9ybSBvcGVyYXRpb25zIG9uIGludGVybWVkaWF0ZSByZXN1bHRzIHdpdGhpbiB0aGUgY2hhaW4uXG4gIF8udGFwID0gZnVuY3Rpb24ob2JqLCBpbnRlcmNlcHRvcikge1xuICAgIGludGVyY2VwdG9yKG9iaik7XG4gICAgcmV0dXJuIG9iajtcbiAgfTtcblxuICAvLyBSZXR1cm5zIHdoZXRoZXIgYW4gb2JqZWN0IGhhcyBhIGdpdmVuIHNldCBvZiBga2V5OnZhbHVlYCBwYWlycy5cbiAgXy5pc01hdGNoID0gZnVuY3Rpb24ob2JqZWN0LCBhdHRycykge1xuICAgIHZhciBrZXlzID0gXy5rZXlzKGF0dHJzKSwgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gICAgaWYgKG9iamVjdCA9PSBudWxsKSByZXR1cm4gIWxlbmd0aDtcbiAgICB2YXIgb2JqID0gT2JqZWN0KG9iamVjdCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGtleSA9IGtleXNbaV07XG4gICAgICBpZiAoYXR0cnNba2V5XSAhPT0gb2JqW2tleV0gfHwgIShrZXkgaW4gb2JqKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcblxuXG4gIC8vIEludGVybmFsIHJlY3Vyc2l2ZSBjb21wYXJpc29uIGZ1bmN0aW9uIGZvciBgaXNFcXVhbGAuXG4gIHZhciBlcSwgZGVlcEVxO1xuICBlcSA9IGZ1bmN0aW9uKGEsIGIsIGFTdGFjaywgYlN0YWNrKSB7XG4gICAgLy8gSWRlbnRpY2FsIG9iamVjdHMgYXJlIGVxdWFsLiBgMCA9PT0gLTBgLCBidXQgdGhleSBhcmVuJ3QgaWRlbnRpY2FsLlxuICAgIC8vIFNlZSB0aGUgW0hhcm1vbnkgYGVnYWxgIHByb3Bvc2FsXShodHRwOi8vd2lraS5lY21hc2NyaXB0Lm9yZy9kb2t1LnBocD9pZD1oYXJtb255OmVnYWwpLlxuICAgIGlmIChhID09PSBiKSByZXR1cm4gYSAhPT0gMCB8fCAxIC8gYSA9PT0gMSAvIGI7XG4gICAgLy8gYG51bGxgIG9yIGB1bmRlZmluZWRgIG9ubHkgZXF1YWwgdG8gaXRzZWxmIChzdHJpY3QgY29tcGFyaXNvbikuXG4gICAgaWYgKGEgPT0gbnVsbCB8fCBiID09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgICAvLyBgTmFOYHMgYXJlIGVxdWl2YWxlbnQsIGJ1dCBub24tcmVmbGV4aXZlLlxuICAgIGlmIChhICE9PSBhKSByZXR1cm4gYiAhPT0gYjtcbiAgICAvLyBFeGhhdXN0IHByaW1pdGl2ZSBjaGVja3NcbiAgICB2YXIgdHlwZSA9IHR5cGVvZiBhO1xuICAgIGlmICh0eXBlICE9PSAnZnVuY3Rpb24nICYmIHR5cGUgIT09ICdvYmplY3QnICYmIHR5cGVvZiBiICE9ICdvYmplY3QnKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIGRlZXBFcShhLCBiLCBhU3RhY2ssIGJTdGFjayk7XG4gIH07XG5cbiAgLy8gSW50ZXJuYWwgcmVjdXJzaXZlIGNvbXBhcmlzb24gZnVuY3Rpb24gZm9yIGBpc0VxdWFsYC5cbiAgZGVlcEVxID0gZnVuY3Rpb24oYSwgYiwgYVN0YWNrLCBiU3RhY2spIHtcbiAgICAvLyBVbndyYXAgYW55IHdyYXBwZWQgb2JqZWN0cy5cbiAgICBpZiAoYSBpbnN0YW5jZW9mIF8pIGEgPSBhLl93cmFwcGVkO1xuICAgIGlmIChiIGluc3RhbmNlb2YgXykgYiA9IGIuX3dyYXBwZWQ7XG4gICAgLy8gQ29tcGFyZSBgW1tDbGFzc11dYCBuYW1lcy5cbiAgICB2YXIgY2xhc3NOYW1lID0gdG9TdHJpbmcuY2FsbChhKTtcbiAgICBpZiAoY2xhc3NOYW1lICE9PSB0b1N0cmluZy5jYWxsKGIpKSByZXR1cm4gZmFsc2U7XG4gICAgc3dpdGNoIChjbGFzc05hbWUpIHtcbiAgICAgIC8vIFN0cmluZ3MsIG51bWJlcnMsIHJlZ3VsYXIgZXhwcmVzc2lvbnMsIGRhdGVzLCBhbmQgYm9vbGVhbnMgYXJlIGNvbXBhcmVkIGJ5IHZhbHVlLlxuICAgICAgY2FzZSAnW29iamVjdCBSZWdFeHBdJzpcbiAgICAgIC8vIFJlZ0V4cHMgYXJlIGNvZXJjZWQgdG8gc3RyaW5ncyBmb3IgY29tcGFyaXNvbiAoTm90ZTogJycgKyAvYS9pID09PSAnL2EvaScpXG4gICAgICBjYXNlICdbb2JqZWN0IFN0cmluZ10nOlxuICAgICAgICAvLyBQcmltaXRpdmVzIGFuZCB0aGVpciBjb3JyZXNwb25kaW5nIG9iamVjdCB3cmFwcGVycyBhcmUgZXF1aXZhbGVudDsgdGh1cywgYFwiNVwiYCBpc1xuICAgICAgICAvLyBlcXVpdmFsZW50IHRvIGBuZXcgU3RyaW5nKFwiNVwiKWAuXG4gICAgICAgIHJldHVybiAnJyArIGEgPT09ICcnICsgYjtcbiAgICAgIGNhc2UgJ1tvYmplY3QgTnVtYmVyXSc6XG4gICAgICAgIC8vIGBOYU5gcyBhcmUgZXF1aXZhbGVudCwgYnV0IG5vbi1yZWZsZXhpdmUuXG4gICAgICAgIC8vIE9iamVjdChOYU4pIGlzIGVxdWl2YWxlbnQgdG8gTmFOLlxuICAgICAgICBpZiAoK2EgIT09ICthKSByZXR1cm4gK2IgIT09ICtiO1xuICAgICAgICAvLyBBbiBgZWdhbGAgY29tcGFyaXNvbiBpcyBwZXJmb3JtZWQgZm9yIG90aGVyIG51bWVyaWMgdmFsdWVzLlxuICAgICAgICByZXR1cm4gK2EgPT09IDAgPyAxIC8gK2EgPT09IDEgLyBiIDogK2EgPT09ICtiO1xuICAgICAgY2FzZSAnW29iamVjdCBEYXRlXSc6XG4gICAgICBjYXNlICdbb2JqZWN0IEJvb2xlYW5dJzpcbiAgICAgICAgLy8gQ29lcmNlIGRhdGVzIGFuZCBib29sZWFucyB0byBudW1lcmljIHByaW1pdGl2ZSB2YWx1ZXMuIERhdGVzIGFyZSBjb21wYXJlZCBieSB0aGVpclxuICAgICAgICAvLyBtaWxsaXNlY29uZCByZXByZXNlbnRhdGlvbnMuIE5vdGUgdGhhdCBpbnZhbGlkIGRhdGVzIHdpdGggbWlsbGlzZWNvbmQgcmVwcmVzZW50YXRpb25zXG4gICAgICAgIC8vIG9mIGBOYU5gIGFyZSBub3QgZXF1aXZhbGVudC5cbiAgICAgICAgcmV0dXJuICthID09PSArYjtcbiAgICAgIGNhc2UgJ1tvYmplY3QgU3ltYm9sXSc6XG4gICAgICAgIHJldHVybiBTeW1ib2xQcm90by52YWx1ZU9mLmNhbGwoYSkgPT09IFN5bWJvbFByb3RvLnZhbHVlT2YuY2FsbChiKTtcbiAgICB9XG5cbiAgICB2YXIgYXJlQXJyYXlzID0gY2xhc3NOYW1lID09PSAnW29iamVjdCBBcnJheV0nO1xuICAgIGlmICghYXJlQXJyYXlzKSB7XG4gICAgICBpZiAodHlwZW9mIGEgIT0gJ29iamVjdCcgfHwgdHlwZW9mIGIgIT0gJ29iamVjdCcpIHJldHVybiBmYWxzZTtcblxuICAgICAgLy8gT2JqZWN0cyB3aXRoIGRpZmZlcmVudCBjb25zdHJ1Y3RvcnMgYXJlIG5vdCBlcXVpdmFsZW50LCBidXQgYE9iamVjdGBzIG9yIGBBcnJheWBzXG4gICAgICAvLyBmcm9tIGRpZmZlcmVudCBmcmFtZXMgYXJlLlxuICAgICAgdmFyIGFDdG9yID0gYS5jb25zdHJ1Y3RvciwgYkN0b3IgPSBiLmNvbnN0cnVjdG9yO1xuICAgICAgaWYgKGFDdG9yICE9PSBiQ3RvciAmJiAhKF8uaXNGdW5jdGlvbihhQ3RvcikgJiYgYUN0b3IgaW5zdGFuY2VvZiBhQ3RvciAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8uaXNGdW5jdGlvbihiQ3RvcikgJiYgYkN0b3IgaW5zdGFuY2VvZiBiQ3RvcilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKCdjb25zdHJ1Y3RvcicgaW4gYSAmJiAnY29uc3RydWN0b3InIGluIGIpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gQXNzdW1lIGVxdWFsaXR5IGZvciBjeWNsaWMgc3RydWN0dXJlcy4gVGhlIGFsZ29yaXRobSBmb3IgZGV0ZWN0aW5nIGN5Y2xpY1xuICAgIC8vIHN0cnVjdHVyZXMgaXMgYWRhcHRlZCBmcm9tIEVTIDUuMSBzZWN0aW9uIDE1LjEyLjMsIGFic3RyYWN0IG9wZXJhdGlvbiBgSk9gLlxuXG4gICAgLy8gSW5pdGlhbGl6aW5nIHN0YWNrIG9mIHRyYXZlcnNlZCBvYmplY3RzLlxuICAgIC8vIEl0J3MgZG9uZSBoZXJlIHNpbmNlIHdlIG9ubHkgbmVlZCB0aGVtIGZvciBvYmplY3RzIGFuZCBhcnJheXMgY29tcGFyaXNvbi5cbiAgICBhU3RhY2sgPSBhU3RhY2sgfHwgW107XG4gICAgYlN0YWNrID0gYlN0YWNrIHx8IFtdO1xuICAgIHZhciBsZW5ndGggPSBhU3RhY2subGVuZ3RoO1xuICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgLy8gTGluZWFyIHNlYXJjaC4gUGVyZm9ybWFuY2UgaXMgaW52ZXJzZWx5IHByb3BvcnRpb25hbCB0byB0aGUgbnVtYmVyIG9mXG4gICAgICAvLyB1bmlxdWUgbmVzdGVkIHN0cnVjdHVyZXMuXG4gICAgICBpZiAoYVN0YWNrW2xlbmd0aF0gPT09IGEpIHJldHVybiBiU3RhY2tbbGVuZ3RoXSA9PT0gYjtcbiAgICB9XG5cbiAgICAvLyBBZGQgdGhlIGZpcnN0IG9iamVjdCB0byB0aGUgc3RhY2sgb2YgdHJhdmVyc2VkIG9iamVjdHMuXG4gICAgYVN0YWNrLnB1c2goYSk7XG4gICAgYlN0YWNrLnB1c2goYik7XG5cbiAgICAvLyBSZWN1cnNpdmVseSBjb21wYXJlIG9iamVjdHMgYW5kIGFycmF5cy5cbiAgICBpZiAoYXJlQXJyYXlzKSB7XG4gICAgICAvLyBDb21wYXJlIGFycmF5IGxlbmd0aHMgdG8gZGV0ZXJtaW5lIGlmIGEgZGVlcCBjb21wYXJpc29uIGlzIG5lY2Vzc2FyeS5cbiAgICAgIGxlbmd0aCA9IGEubGVuZ3RoO1xuICAgICAgaWYgKGxlbmd0aCAhPT0gYi5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICAgIC8vIERlZXAgY29tcGFyZSB0aGUgY29udGVudHMsIGlnbm9yaW5nIG5vbi1udW1lcmljIHByb3BlcnRpZXMuXG4gICAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgICAgaWYgKCFlcShhW2xlbmd0aF0sIGJbbGVuZ3RoXSwgYVN0YWNrLCBiU3RhY2spKSByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIERlZXAgY29tcGFyZSBvYmplY3RzLlxuICAgICAgdmFyIGtleXMgPSBfLmtleXMoYSksIGtleTtcbiAgICAgIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICAgICAgLy8gRW5zdXJlIHRoYXQgYm90aCBvYmplY3RzIGNvbnRhaW4gdGhlIHNhbWUgbnVtYmVyIG9mIHByb3BlcnRpZXMgYmVmb3JlIGNvbXBhcmluZyBkZWVwIGVxdWFsaXR5LlxuICAgICAgaWYgKF8ua2V5cyhiKS5sZW5ndGggIT09IGxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgIC8vIERlZXAgY29tcGFyZSBlYWNoIG1lbWJlclxuICAgICAgICBrZXkgPSBrZXlzW2xlbmd0aF07XG4gICAgICAgIGlmICghKGhhcyhiLCBrZXkpICYmIGVxKGFba2V5XSwgYltrZXldLCBhU3RhY2ssIGJTdGFjaykpKSByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIFJlbW92ZSB0aGUgZmlyc3Qgb2JqZWN0IGZyb20gdGhlIHN0YWNrIG9mIHRyYXZlcnNlZCBvYmplY3RzLlxuICAgIGFTdGFjay5wb3AoKTtcbiAgICBiU3RhY2sucG9wKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG5cbiAgLy8gUGVyZm9ybSBhIGRlZXAgY29tcGFyaXNvbiB0byBjaGVjayBpZiB0d28gb2JqZWN0cyBhcmUgZXF1YWwuXG4gIF8uaXNFcXVhbCA9IGZ1bmN0aW9uKGEsIGIpIHtcbiAgICByZXR1cm4gZXEoYSwgYik7XG4gIH07XG5cbiAgLy8gSXMgYSBnaXZlbiBhcnJheSwgc3RyaW5nLCBvciBvYmplY3QgZW1wdHk/XG4gIC8vIEFuIFwiZW1wdHlcIiBvYmplY3QgaGFzIG5vIGVudW1lcmFibGUgb3duLXByb3BlcnRpZXMuXG4gIF8uaXNFbXB0eSA9IGZ1bmN0aW9uKG9iaikge1xuICAgIGlmIChvYmogPT0gbnVsbCkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQXJyYXlMaWtlKG9iaikgJiYgKF8uaXNBcnJheShvYmopIHx8IF8uaXNTdHJpbmcob2JqKSB8fCBfLmlzQXJndW1lbnRzKG9iaikpKSByZXR1cm4gb2JqLmxlbmd0aCA9PT0gMDtcbiAgICByZXR1cm4gXy5rZXlzKG9iaikubGVuZ3RoID09PSAwO1xuICB9O1xuXG4gIC8vIElzIGEgZ2l2ZW4gdmFsdWUgYSBET00gZWxlbWVudD9cbiAgXy5pc0VsZW1lbnQgPSBmdW5jdGlvbihvYmopIHtcbiAgICByZXR1cm4gISEob2JqICYmIG9iai5ub2RlVHlwZSA9PT0gMSk7XG4gIH07XG5cbiAgLy8gSXMgYSBnaXZlbiB2YWx1ZSBhbiBhcnJheT9cbiAgLy8gRGVsZWdhdGVzIHRvIEVDTUE1J3MgbmF0aXZlIEFycmF5LmlzQXJyYXlcbiAgXy5pc0FycmF5ID0gbmF0aXZlSXNBcnJheSB8fCBmdW5jdGlvbihvYmopIHtcbiAgICByZXR1cm4gdG9TdHJpbmcuY2FsbChvYmopID09PSAnW29iamVjdCBBcnJheV0nO1xuICB9O1xuXG4gIC8vIElzIGEgZ2l2ZW4gdmFyaWFibGUgYW4gb2JqZWN0P1xuICBfLmlzT2JqZWN0ID0gZnVuY3Rpb24ob2JqKSB7XG4gICAgdmFyIHR5cGUgPSB0eXBlb2Ygb2JqO1xuICAgIHJldHVybiB0eXBlID09PSAnZnVuY3Rpb24nIHx8IHR5cGUgPT09ICdvYmplY3QnICYmICEhb2JqO1xuICB9O1xuXG4gIC8vIEFkZCBzb21lIGlzVHlwZSBtZXRob2RzOiBpc0FyZ3VtZW50cywgaXNGdW5jdGlvbiwgaXNTdHJpbmcsIGlzTnVtYmVyLCBpc0RhdGUsIGlzUmVnRXhwLCBpc0Vycm9yLCBpc01hcCwgaXNXZWFrTWFwLCBpc1NldCwgaXNXZWFrU2V0LlxuICBfLmVhY2goWydBcmd1bWVudHMnLCAnRnVuY3Rpb24nLCAnU3RyaW5nJywgJ051bWJlcicsICdEYXRlJywgJ1JlZ0V4cCcsICdFcnJvcicsICdTeW1ib2wnLCAnTWFwJywgJ1dlYWtNYXAnLCAnU2V0JywgJ1dlYWtTZXQnXSwgZnVuY3Rpb24obmFtZSkge1xuICAgIF9bJ2lzJyArIG5hbWVdID0gZnVuY3Rpb24ob2JqKSB7XG4gICAgICByZXR1cm4gdG9TdHJpbmcuY2FsbChvYmopID09PSAnW29iamVjdCAnICsgbmFtZSArICddJztcbiAgICB9O1xuICB9KTtcblxuICAvLyBEZWZpbmUgYSBmYWxsYmFjayB2ZXJzaW9uIG9mIHRoZSBtZXRob2QgaW4gYnJvd3NlcnMgKGFoZW0sIElFIDwgOSksIHdoZXJlXG4gIC8vIHRoZXJlIGlzbid0IGFueSBpbnNwZWN0YWJsZSBcIkFyZ3VtZW50c1wiIHR5cGUuXG4gIGlmICghXy5pc0FyZ3VtZW50cyhhcmd1bWVudHMpKSB7XG4gICAgXy5pc0FyZ3VtZW50cyA9IGZ1bmN0aW9uKG9iaikge1xuICAgICAgcmV0dXJuIGhhcyhvYmosICdjYWxsZWUnKTtcbiAgICB9O1xuICB9XG5cbiAgLy8gT3B0aW1pemUgYGlzRnVuY3Rpb25gIGlmIGFwcHJvcHJpYXRlLiBXb3JrIGFyb3VuZCBzb21lIHR5cGVvZiBidWdzIGluIG9sZCB2OCxcbiAgLy8gSUUgMTEgKCMxNjIxKSwgU2FmYXJpIDggKCMxOTI5KSwgYW5kIFBoYW50b21KUyAoIzIyMzYpLlxuICB2YXIgbm9kZWxpc3QgPSByb290LmRvY3VtZW50ICYmIHJvb3QuZG9jdW1lbnQuY2hpbGROb2RlcztcbiAgaWYgKHR5cGVvZiAvLi8gIT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgSW50OEFycmF5ICE9ICdvYmplY3QnICYmIHR5cGVvZiBub2RlbGlzdCAhPSAnZnVuY3Rpb24nKSB7XG4gICAgXy5pc0Z1bmN0aW9uID0gZnVuY3Rpb24ob2JqKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIG9iaiA9PSAnZnVuY3Rpb24nIHx8IGZhbHNlO1xuICAgIH07XG4gIH1cblxuICAvLyBJcyBhIGdpdmVuIG9iamVjdCBhIGZpbml0ZSBudW1iZXI/XG4gIF8uaXNGaW5pdGUgPSBmdW5jdGlvbihvYmopIHtcbiAgICByZXR1cm4gIV8uaXNTeW1ib2wob2JqKSAmJiBpc0Zpbml0ZShvYmopICYmICFpc05hTihwYXJzZUZsb2F0KG9iaikpO1xuICB9O1xuXG4gIC8vIElzIHRoZSBnaXZlbiB2YWx1ZSBgTmFOYD9cbiAgXy5pc05hTiA9IGZ1bmN0aW9uKG9iaikge1xuICAgIHJldHVybiBfLmlzTnVtYmVyKG9iaikgJiYgaXNOYU4ob2JqKTtcbiAgfTtcblxuICAvLyBJcyBhIGdpdmVuIHZhbHVlIGEgYm9vbGVhbj9cbiAgXy5pc0Jvb2xlYW4gPSBmdW5jdGlvbihvYmopIHtcbiAgICByZXR1cm4gb2JqID09PSB0cnVlIHx8IG9iaiA9PT0gZmFsc2UgfHwgdG9TdHJpbmcuY2FsbChvYmopID09PSAnW29iamVjdCBCb29sZWFuXSc7XG4gIH07XG5cbiAgLy8gSXMgYSBnaXZlbiB2YWx1ZSBlcXVhbCB0byBudWxsP1xuICBfLmlzTnVsbCA9IGZ1bmN0aW9uKG9iaikge1xuICAgIHJldHVybiBvYmogPT09IG51bGw7XG4gIH07XG5cbiAgLy8gSXMgYSBnaXZlbiB2YXJpYWJsZSB1bmRlZmluZWQ/XG4gIF8uaXNVbmRlZmluZWQgPSBmdW5jdGlvbihvYmopIHtcbiAgICByZXR1cm4gb2JqID09PSB2b2lkIDA7XG4gIH07XG5cbiAgLy8gU2hvcnRjdXQgZnVuY3Rpb24gZm9yIGNoZWNraW5nIGlmIGFuIG9iamVjdCBoYXMgYSBnaXZlbiBwcm9wZXJ0eSBkaXJlY3RseVxuICAvLyBvbiBpdHNlbGYgKGluIG90aGVyIHdvcmRzLCBub3Qgb24gYSBwcm90b3R5cGUpLlxuICBfLmhhcyA9IGZ1bmN0aW9uKG9iaiwgcGF0aCkge1xuICAgIGlmICghXy5pc0FycmF5KHBhdGgpKSB7XG4gICAgICByZXR1cm4gaGFzKG9iaiwgcGF0aCk7XG4gICAgfVxuICAgIHZhciBsZW5ndGggPSBwYXRoLmxlbmd0aDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIga2V5ID0gcGF0aFtpXTtcbiAgICAgIGlmIChvYmogPT0gbnVsbCB8fCAhaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgb2JqID0gb2JqW2tleV07XG4gICAgfVxuICAgIHJldHVybiAhIWxlbmd0aDtcbiAgfTtcblxuICAvLyBVdGlsaXR5IEZ1bmN0aW9uc1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8vIFJ1biBVbmRlcnNjb3JlLmpzIGluICpub0NvbmZsaWN0KiBtb2RlLCByZXR1cm5pbmcgdGhlIGBfYCB2YXJpYWJsZSB0byBpdHNcbiAgLy8gcHJldmlvdXMgb3duZXIuIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIFVuZGVyc2NvcmUgb2JqZWN0LlxuICBfLm5vQ29uZmxpY3QgPSBmdW5jdGlvbigpIHtcbiAgICByb290Ll8gPSBwcmV2aW91c1VuZGVyc2NvcmU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLy8gS2VlcCB0aGUgaWRlbnRpdHkgZnVuY3Rpb24gYXJvdW5kIGZvciBkZWZhdWx0IGl0ZXJhdGVlcy5cbiAgXy5pZGVudGl0eSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9O1xuXG4gIC8vIFByZWRpY2F0ZS1nZW5lcmF0aW5nIGZ1bmN0aW9ucy4gT2Z0ZW4gdXNlZnVsIG91dHNpZGUgb2YgVW5kZXJzY29yZS5cbiAgXy5jb25zdGFudCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH07XG4gIH07XG5cbiAgXy5ub29wID0gZnVuY3Rpb24oKXt9O1xuXG4gIC8vIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0LCB3aGVuIHBhc3NlZCBhbiBvYmplY3QsIHdpbGwgdHJhdmVyc2UgdGhhdCBvYmplY3TigJlzXG4gIC8vIHByb3BlcnRpZXMgZG93biB0aGUgZ2l2ZW4gYHBhdGhgLCBzcGVjaWZpZWQgYXMgYW4gYXJyYXkgb2Yga2V5cyBvciBpbmRleGVzLlxuICBfLnByb3BlcnR5ID0gZnVuY3Rpb24ocGF0aCkge1xuICAgIGlmICghXy5pc0FycmF5KHBhdGgpKSB7XG4gICAgICByZXR1cm4gc2hhbGxvd1Byb3BlcnR5KHBhdGgpO1xuICAgIH1cbiAgICByZXR1cm4gZnVuY3Rpb24ob2JqKSB7XG4gICAgICByZXR1cm4gZGVlcEdldChvYmosIHBhdGgpO1xuICAgIH07XG4gIH07XG5cbiAgLy8gR2VuZXJhdGVzIGEgZnVuY3Rpb24gZm9yIGEgZ2l2ZW4gb2JqZWN0IHRoYXQgcmV0dXJucyBhIGdpdmVuIHByb3BlcnR5LlxuICBfLnByb3BlcnR5T2YgPSBmdW5jdGlvbihvYmopIHtcbiAgICBpZiAob2JqID09IG51bGwpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbigpe307XG4gICAgfVxuICAgIHJldHVybiBmdW5jdGlvbihwYXRoKSB7XG4gICAgICByZXR1cm4gIV8uaXNBcnJheShwYXRoKSA/IG9ialtwYXRoXSA6IGRlZXBHZXQob2JqLCBwYXRoKTtcbiAgICB9O1xuICB9O1xuXG4gIC8vIFJldHVybnMgYSBwcmVkaWNhdGUgZm9yIGNoZWNraW5nIHdoZXRoZXIgYW4gb2JqZWN0IGhhcyBhIGdpdmVuIHNldCBvZlxuICAvLyBga2V5OnZhbHVlYCBwYWlycy5cbiAgXy5tYXRjaGVyID0gXy5tYXRjaGVzID0gZnVuY3Rpb24oYXR0cnMpIHtcbiAgICBhdHRycyA9IF8uZXh0ZW5kT3duKHt9LCBhdHRycyk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKG9iaikge1xuICAgICAgcmV0dXJuIF8uaXNNYXRjaChvYmosIGF0dHJzKTtcbiAgICB9O1xuICB9O1xuXG4gIC8vIFJ1biBhIGZ1bmN0aW9uICoqbioqIHRpbWVzLlxuICBfLnRpbWVzID0gZnVuY3Rpb24obiwgaXRlcmF0ZWUsIGNvbnRleHQpIHtcbiAgICB2YXIgYWNjdW0gPSBBcnJheShNYXRoLm1heCgwLCBuKSk7XG4gICAgaXRlcmF0ZWUgPSBvcHRpbWl6ZUNiKGl0ZXJhdGVlLCBjb250ZXh0LCAxKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykgYWNjdW1baV0gPSBpdGVyYXRlZShpKTtcbiAgICByZXR1cm4gYWNjdW07XG4gIH07XG5cbiAgLy8gUmV0dXJuIGEgcmFuZG9tIGludGVnZXIgYmV0d2VlbiBtaW4gYW5kIG1heCAoaW5jbHVzaXZlKS5cbiAgXy5yYW5kb20gPSBmdW5jdGlvbihtaW4sIG1heCkge1xuICAgIGlmIChtYXggPT0gbnVsbCkge1xuICAgICAgbWF4ID0gbWluO1xuICAgICAgbWluID0gMDtcbiAgICB9XG4gICAgcmV0dXJuIG1pbiArIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtYXggLSBtaW4gKyAxKSk7XG4gIH07XG5cbiAgLy8gQSAocG9zc2libHkgZmFzdGVyKSB3YXkgdG8gZ2V0IHRoZSBjdXJyZW50IHRpbWVzdGFtcCBhcyBhbiBpbnRlZ2VyLlxuICBfLm5vdyA9IERhdGUubm93IHx8IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgfTtcblxuICAvLyBMaXN0IG9mIEhUTUwgZW50aXRpZXMgZm9yIGVzY2FwaW5nLlxuICB2YXIgZXNjYXBlTWFwID0ge1xuICAgICcmJzogJyZhbXA7JyxcbiAgICAnPCc6ICcmbHQ7JyxcbiAgICAnPic6ICcmZ3Q7JyxcbiAgICAnXCInOiAnJnF1b3Q7JyxcbiAgICBcIidcIjogJyYjeDI3OycsXG4gICAgJ2AnOiAnJiN4NjA7J1xuICB9O1xuICB2YXIgdW5lc2NhcGVNYXAgPSBfLmludmVydChlc2NhcGVNYXApO1xuXG4gIC8vIEZ1bmN0aW9ucyBmb3IgZXNjYXBpbmcgYW5kIHVuZXNjYXBpbmcgc3RyaW5ncyB0by9mcm9tIEhUTUwgaW50ZXJwb2xhdGlvbi5cbiAgdmFyIGNyZWF0ZUVzY2FwZXIgPSBmdW5jdGlvbihtYXApIHtcbiAgICB2YXIgZXNjYXBlciA9IGZ1bmN0aW9uKG1hdGNoKSB7XG4gICAgICByZXR1cm4gbWFwW21hdGNoXTtcbiAgICB9O1xuICAgIC8vIFJlZ2V4ZXMgZm9yIGlkZW50aWZ5aW5nIGEga2V5IHRoYXQgbmVlZHMgdG8gYmUgZXNjYXBlZC5cbiAgICB2YXIgc291cmNlID0gJyg/OicgKyBfLmtleXMobWFwKS5qb2luKCd8JykgKyAnKSc7XG4gICAgdmFyIHRlc3RSZWdleHAgPSBSZWdFeHAoc291cmNlKTtcbiAgICB2YXIgcmVwbGFjZVJlZ2V4cCA9IFJlZ0V4cChzb3VyY2UsICdnJyk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmluZykge1xuICAgICAgc3RyaW5nID0gc3RyaW5nID09IG51bGwgPyAnJyA6ICcnICsgc3RyaW5nO1xuICAgICAgcmV0dXJuIHRlc3RSZWdleHAudGVzdChzdHJpbmcpID8gc3RyaW5nLnJlcGxhY2UocmVwbGFjZVJlZ2V4cCwgZXNjYXBlcikgOiBzdHJpbmc7XG4gICAgfTtcbiAgfTtcbiAgXy5lc2NhcGUgPSBjcmVhdGVFc2NhcGVyKGVzY2FwZU1hcCk7XG4gIF8udW5lc2NhcGUgPSBjcmVhdGVFc2NhcGVyKHVuZXNjYXBlTWFwKTtcblxuICAvLyBUcmF2ZXJzZXMgdGhlIGNoaWxkcmVuIG9mIGBvYmpgIGFsb25nIGBwYXRoYC4gSWYgYSBjaGlsZCBpcyBhIGZ1bmN0aW9uLCBpdFxuICAvLyBpcyBpbnZva2VkIHdpdGggaXRzIHBhcmVudCBhcyBjb250ZXh0LiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgZmluYWxcbiAgLy8gY2hpbGQsIG9yIGBmYWxsYmFja2AgaWYgYW55IGNoaWxkIGlzIHVuZGVmaW5lZC5cbiAgXy5yZXN1bHQgPSBmdW5jdGlvbihvYmosIHBhdGgsIGZhbGxiYWNrKSB7XG4gICAgaWYgKCFfLmlzQXJyYXkocGF0aCkpIHBhdGggPSBbcGF0aF07XG4gICAgdmFyIGxlbmd0aCA9IHBhdGgubGVuZ3RoO1xuICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICByZXR1cm4gXy5pc0Z1bmN0aW9uKGZhbGxiYWNrKSA/IGZhbGxiYWNrLmNhbGwob2JqKSA6IGZhbGxiYWNrO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcHJvcCA9IG9iaiA9PSBudWxsID8gdm9pZCAwIDogb2JqW3BhdGhbaV1dO1xuICAgICAgaWYgKHByb3AgPT09IHZvaWQgMCkge1xuICAgICAgICBwcm9wID0gZmFsbGJhY2s7XG4gICAgICAgIGkgPSBsZW5ndGg7IC8vIEVuc3VyZSB3ZSBkb24ndCBjb250aW51ZSBpdGVyYXRpbmcuXG4gICAgICB9XG4gICAgICBvYmogPSBfLmlzRnVuY3Rpb24ocHJvcCkgPyBwcm9wLmNhbGwob2JqKSA6IHByb3A7XG4gICAgfVxuICAgIHJldHVybiBvYmo7XG4gIH07XG5cbiAgLy8gR2VuZXJhdGUgYSB1bmlxdWUgaW50ZWdlciBpZCAodW5pcXVlIHdpdGhpbiB0aGUgZW50aXJlIGNsaWVudCBzZXNzaW9uKS5cbiAgLy8gVXNlZnVsIGZvciB0ZW1wb3JhcnkgRE9NIGlkcy5cbiAgdmFyIGlkQ291bnRlciA9IDA7XG4gIF8udW5pcXVlSWQgPSBmdW5jdGlvbihwcmVmaXgpIHtcbiAgICB2YXIgaWQgPSArK2lkQ291bnRlciArICcnO1xuICAgIHJldHVybiBwcmVmaXggPyBwcmVmaXggKyBpZCA6IGlkO1xuICB9O1xuXG4gIC8vIEJ5IGRlZmF1bHQsIFVuZGVyc2NvcmUgdXNlcyBFUkItc3R5bGUgdGVtcGxhdGUgZGVsaW1pdGVycywgY2hhbmdlIHRoZVxuICAvLyBmb2xsb3dpbmcgdGVtcGxhdGUgc2V0dGluZ3MgdG8gdXNlIGFsdGVybmF0aXZlIGRlbGltaXRlcnMuXG4gIF8udGVtcGxhdGVTZXR0aW5ncyA9IHtcbiAgICBldmFsdWF0ZTogLzwlKFtcXHNcXFNdKz8pJT4vZyxcbiAgICBpbnRlcnBvbGF0ZTogLzwlPShbXFxzXFxTXSs/KSU+L2csXG4gICAgZXNjYXBlOiAvPCUtKFtcXHNcXFNdKz8pJT4vZ1xuICB9O1xuXG4gIC8vIFdoZW4gY3VzdG9taXppbmcgYHRlbXBsYXRlU2V0dGluZ3NgLCBpZiB5b3UgZG9uJ3Qgd2FudCB0byBkZWZpbmUgYW5cbiAgLy8gaW50ZXJwb2xhdGlvbiwgZXZhbHVhdGlvbiBvciBlc2NhcGluZyByZWdleCwgd2UgbmVlZCBvbmUgdGhhdCBpc1xuICAvLyBndWFyYW50ZWVkIG5vdCB0byBtYXRjaC5cbiAgdmFyIG5vTWF0Y2ggPSAvKC4pXi87XG5cbiAgLy8gQ2VydGFpbiBjaGFyYWN0ZXJzIG5lZWQgdG8gYmUgZXNjYXBlZCBzbyB0aGF0IHRoZXkgY2FuIGJlIHB1dCBpbnRvIGFcbiAgLy8gc3RyaW5nIGxpdGVyYWwuXG4gIHZhciBlc2NhcGVzID0ge1xuICAgIFwiJ1wiOiBcIidcIixcbiAgICAnXFxcXCc6ICdcXFxcJyxcbiAgICAnXFxyJzogJ3InLFxuICAgICdcXG4nOiAnbicsXG4gICAgJ1xcdTIwMjgnOiAndTIwMjgnLFxuICAgICdcXHUyMDI5JzogJ3UyMDI5J1xuICB9O1xuXG4gIHZhciBlc2NhcGVSZWdFeHAgPSAvXFxcXHwnfFxccnxcXG58XFx1MjAyOHxcXHUyMDI5L2c7XG5cbiAgdmFyIGVzY2FwZUNoYXIgPSBmdW5jdGlvbihtYXRjaCkge1xuICAgIHJldHVybiAnXFxcXCcgKyBlc2NhcGVzW21hdGNoXTtcbiAgfTtcblxuICAvLyBKYXZhU2NyaXB0IG1pY3JvLXRlbXBsYXRpbmcsIHNpbWlsYXIgdG8gSm9obiBSZXNpZydzIGltcGxlbWVudGF0aW9uLlxuICAvLyBVbmRlcnNjb3JlIHRlbXBsYXRpbmcgaGFuZGxlcyBhcmJpdHJhcnkgZGVsaW1pdGVycywgcHJlc2VydmVzIHdoaXRlc3BhY2UsXG4gIC8vIGFuZCBjb3JyZWN0bHkgZXNjYXBlcyBxdW90ZXMgd2l0aGluIGludGVycG9sYXRlZCBjb2RlLlxuICAvLyBOQjogYG9sZFNldHRpbmdzYCBvbmx5IGV4aXN0cyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuXG4gIF8udGVtcGxhdGUgPSBmdW5jdGlvbih0ZXh0LCBzZXR0aW5ncywgb2xkU2V0dGluZ3MpIHtcbiAgICBpZiAoIXNldHRpbmdzICYmIG9sZFNldHRpbmdzKSBzZXR0aW5ncyA9IG9sZFNldHRpbmdzO1xuICAgIHNldHRpbmdzID0gXy5kZWZhdWx0cyh7fSwgc2V0dGluZ3MsIF8udGVtcGxhdGVTZXR0aW5ncyk7XG5cbiAgICAvLyBDb21iaW5lIGRlbGltaXRlcnMgaW50byBvbmUgcmVndWxhciBleHByZXNzaW9uIHZpYSBhbHRlcm5hdGlvbi5cbiAgICB2YXIgbWF0Y2hlciA9IFJlZ0V4cChbXG4gICAgICAoc2V0dGluZ3MuZXNjYXBlIHx8IG5vTWF0Y2gpLnNvdXJjZSxcbiAgICAgIChzZXR0aW5ncy5pbnRlcnBvbGF0ZSB8fCBub01hdGNoKS5zb3VyY2UsXG4gICAgICAoc2V0dGluZ3MuZXZhbHVhdGUgfHwgbm9NYXRjaCkuc291cmNlXG4gICAgXS5qb2luKCd8JykgKyAnfCQnLCAnZycpO1xuXG4gICAgLy8gQ29tcGlsZSB0aGUgdGVtcGxhdGUgc291cmNlLCBlc2NhcGluZyBzdHJpbmcgbGl0ZXJhbHMgYXBwcm9wcmlhdGVseS5cbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIHZhciBzb3VyY2UgPSBcIl9fcCs9J1wiO1xuICAgIHRleHQucmVwbGFjZShtYXRjaGVyLCBmdW5jdGlvbihtYXRjaCwgZXNjYXBlLCBpbnRlcnBvbGF0ZSwgZXZhbHVhdGUsIG9mZnNldCkge1xuICAgICAgc291cmNlICs9IHRleHQuc2xpY2UoaW5kZXgsIG9mZnNldCkucmVwbGFjZShlc2NhcGVSZWdFeHAsIGVzY2FwZUNoYXIpO1xuICAgICAgaW5kZXggPSBvZmZzZXQgKyBtYXRjaC5sZW5ndGg7XG5cbiAgICAgIGlmIChlc2NhcGUpIHtcbiAgICAgICAgc291cmNlICs9IFwiJytcXG4oKF9fdD0oXCIgKyBlc2NhcGUgKyBcIikpPT1udWxsPycnOl8uZXNjYXBlKF9fdCkpK1xcbidcIjtcbiAgICAgIH0gZWxzZSBpZiAoaW50ZXJwb2xhdGUpIHtcbiAgICAgICAgc291cmNlICs9IFwiJytcXG4oKF9fdD0oXCIgKyBpbnRlcnBvbGF0ZSArIFwiKSk9PW51bGw/Jyc6X190KStcXG4nXCI7XG4gICAgICB9IGVsc2UgaWYgKGV2YWx1YXRlKSB7XG4gICAgICAgIHNvdXJjZSArPSBcIic7XFxuXCIgKyBldmFsdWF0ZSArIFwiXFxuX19wKz0nXCI7XG4gICAgICB9XG5cbiAgICAgIC8vIEFkb2JlIFZNcyBuZWVkIHRoZSBtYXRjaCByZXR1cm5lZCB0byBwcm9kdWNlIHRoZSBjb3JyZWN0IG9mZnNldC5cbiAgICAgIHJldHVybiBtYXRjaDtcbiAgICB9KTtcbiAgICBzb3VyY2UgKz0gXCInO1xcblwiO1xuXG4gICAgLy8gSWYgYSB2YXJpYWJsZSBpcyBub3Qgc3BlY2lmaWVkLCBwbGFjZSBkYXRhIHZhbHVlcyBpbiBsb2NhbCBzY29wZS5cbiAgICBpZiAoIXNldHRpbmdzLnZhcmlhYmxlKSBzb3VyY2UgPSAnd2l0aChvYmp8fHt9KXtcXG4nICsgc291cmNlICsgJ31cXG4nO1xuXG4gICAgc291cmNlID0gXCJ2YXIgX190LF9fcD0nJyxfX2o9QXJyYXkucHJvdG90eXBlLmpvaW4sXCIgK1xuICAgICAgXCJwcmludD1mdW5jdGlvbigpe19fcCs9X19qLmNhbGwoYXJndW1lbnRzLCcnKTt9O1xcblwiICtcbiAgICAgIHNvdXJjZSArICdyZXR1cm4gX19wO1xcbic7XG5cbiAgICB2YXIgcmVuZGVyO1xuICAgIHRyeSB7XG4gICAgICByZW5kZXIgPSBuZXcgRnVuY3Rpb24oc2V0dGluZ3MudmFyaWFibGUgfHwgJ29iaicsICdfJywgc291cmNlKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBlLnNvdXJjZSA9IHNvdXJjZTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuXG4gICAgdmFyIHRlbXBsYXRlID0gZnVuY3Rpb24oZGF0YSkge1xuICAgICAgcmV0dXJuIHJlbmRlci5jYWxsKHRoaXMsIGRhdGEsIF8pO1xuICAgIH07XG5cbiAgICAvLyBQcm92aWRlIHRoZSBjb21waWxlZCBzb3VyY2UgYXMgYSBjb252ZW5pZW5jZSBmb3IgcHJlY29tcGlsYXRpb24uXG4gICAgdmFyIGFyZ3VtZW50ID0gc2V0dGluZ3MudmFyaWFibGUgfHwgJ29iaic7XG4gICAgdGVtcGxhdGUuc291cmNlID0gJ2Z1bmN0aW9uKCcgKyBhcmd1bWVudCArICcpe1xcbicgKyBzb3VyY2UgKyAnfSc7XG5cbiAgICByZXR1cm4gdGVtcGxhdGU7XG4gIH07XG5cbiAgLy8gQWRkIGEgXCJjaGFpblwiIGZ1bmN0aW9uLiBTdGFydCBjaGFpbmluZyBhIHdyYXBwZWQgVW5kZXJzY29yZSBvYmplY3QuXG4gIF8uY2hhaW4gPSBmdW5jdGlvbihvYmopIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBfKG9iaik7XG4gICAgaW5zdGFuY2UuX2NoYWluID0gdHJ1ZTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH07XG5cbiAgLy8gT09QXG4gIC8vIC0tLS0tLS0tLS0tLS0tLVxuICAvLyBJZiBVbmRlcnNjb3JlIGlzIGNhbGxlZCBhcyBhIGZ1bmN0aW9uLCBpdCByZXR1cm5zIGEgd3JhcHBlZCBvYmplY3QgdGhhdFxuICAvLyBjYW4gYmUgdXNlZCBPTy1zdHlsZS4gVGhpcyB3cmFwcGVyIGhvbGRzIGFsdGVyZWQgdmVyc2lvbnMgb2YgYWxsIHRoZVxuICAvLyB1bmRlcnNjb3JlIGZ1bmN0aW9ucy4gV3JhcHBlZCBvYmplY3RzIG1heSBiZSBjaGFpbmVkLlxuXG4gIC8vIEhlbHBlciBmdW5jdGlvbiB0byBjb250aW51ZSBjaGFpbmluZyBpbnRlcm1lZGlhdGUgcmVzdWx0cy5cbiAgdmFyIGNoYWluUmVzdWx0ID0gZnVuY3Rpb24oaW5zdGFuY2UsIG9iaikge1xuICAgIHJldHVybiBpbnN0YW5jZS5fY2hhaW4gPyBfKG9iaikuY2hhaW4oKSA6IG9iajtcbiAgfTtcblxuICAvLyBBZGQgeW91ciBvd24gY3VzdG9tIGZ1bmN0aW9ucyB0byB0aGUgVW5kZXJzY29yZSBvYmplY3QuXG4gIF8ubWl4aW4gPSBmdW5jdGlvbihvYmopIHtcbiAgICBfLmVhY2goXy5mdW5jdGlvbnMob2JqKSwgZnVuY3Rpb24obmFtZSkge1xuICAgICAgdmFyIGZ1bmMgPSBfW25hbWVdID0gb2JqW25hbWVdO1xuICAgICAgXy5wcm90b3R5cGVbbmFtZV0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBbdGhpcy5fd3JhcHBlZF07XG4gICAgICAgIHB1c2guYXBwbHkoYXJncywgYXJndW1lbnRzKTtcbiAgICAgICAgcmV0dXJuIGNoYWluUmVzdWx0KHRoaXMsIGZ1bmMuYXBwbHkoXywgYXJncykpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgICByZXR1cm4gXztcbiAgfTtcblxuICAvLyBBZGQgYWxsIG9mIHRoZSBVbmRlcnNjb3JlIGZ1bmN0aW9ucyB0byB0aGUgd3JhcHBlciBvYmplY3QuXG4gIF8ubWl4aW4oXyk7XG5cbiAgLy8gQWRkIGFsbCBtdXRhdG9yIEFycmF5IGZ1bmN0aW9ucyB0byB0aGUgd3JhcHBlci5cbiAgXy5lYWNoKFsncG9wJywgJ3B1c2gnLCAncmV2ZXJzZScsICdzaGlmdCcsICdzb3J0JywgJ3NwbGljZScsICd1bnNoaWZ0J10sIGZ1bmN0aW9uKG5hbWUpIHtcbiAgICB2YXIgbWV0aG9kID0gQXJyYXlQcm90b1tuYW1lXTtcbiAgICBfLnByb3RvdHlwZVtuYW1lXSA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIG9iaiA9IHRoaXMuX3dyYXBwZWQ7XG4gICAgICBtZXRob2QuYXBwbHkob2JqLCBhcmd1bWVudHMpO1xuICAgICAgaWYgKChuYW1lID09PSAnc2hpZnQnIHx8IG5hbWUgPT09ICdzcGxpY2UnKSAmJiBvYmoubGVuZ3RoID09PSAwKSBkZWxldGUgb2JqWzBdO1xuICAgICAgcmV0dXJuIGNoYWluUmVzdWx0KHRoaXMsIG9iaik7XG4gICAgfTtcbiAgfSk7XG5cbiAgLy8gQWRkIGFsbCBhY2Nlc3NvciBBcnJheSBmdW5jdGlvbnMgdG8gdGhlIHdyYXBwZXIuXG4gIF8uZWFjaChbJ2NvbmNhdCcsICdqb2luJywgJ3NsaWNlJ10sIGZ1bmN0aW9uKG5hbWUpIHtcbiAgICB2YXIgbWV0aG9kID0gQXJyYXlQcm90b1tuYW1lXTtcbiAgICBfLnByb3RvdHlwZVtuYW1lXSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGNoYWluUmVzdWx0KHRoaXMsIG1ldGhvZC5hcHBseSh0aGlzLl93cmFwcGVkLCBhcmd1bWVudHMpKTtcbiAgICB9O1xuICB9KTtcblxuICAvLyBFeHRyYWN0cyB0aGUgcmVzdWx0IGZyb20gYSB3cmFwcGVkIGFuZCBjaGFpbmVkIG9iamVjdC5cbiAgXy5wcm90b3R5cGUudmFsdWUgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fd3JhcHBlZDtcbiAgfTtcblxuICAvLyBQcm92aWRlIHVud3JhcHBpbmcgcHJveHkgZm9yIHNvbWUgbWV0aG9kcyB1c2VkIGluIGVuZ2luZSBvcGVyYXRpb25zXG4gIC8vIHN1Y2ggYXMgYXJpdGhtZXRpYyBhbmQgSlNPTiBzdHJpbmdpZmljYXRpb24uXG4gIF8ucHJvdG90eXBlLnZhbHVlT2YgPSBfLnByb3RvdHlwZS50b0pTT04gPSBfLnByb3RvdHlwZS52YWx1ZTtcblxuICBfLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBTdHJpbmcodGhpcy5fd3JhcHBlZCk7XG4gIH07XG5cbiAgLy8gQU1EIHJlZ2lzdHJhdGlvbiBoYXBwZW5zIGF0IHRoZSBlbmQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBBTUQgbG9hZGVyc1xuICAvLyB0aGF0IG1heSBub3QgZW5mb3JjZSBuZXh0LXR1cm4gc2VtYW50aWNzIG9uIG1vZHVsZXMuIEV2ZW4gdGhvdWdoIGdlbmVyYWxcbiAgLy8gcHJhY3RpY2UgZm9yIEFNRCByZWdpc3RyYXRpb24gaXMgdG8gYmUgYW5vbnltb3VzLCB1bmRlcnNjb3JlIHJlZ2lzdGVyc1xuICAvLyBhcyBhIG5hbWVkIG1vZHVsZSBiZWNhdXNlLCBsaWtlIGpRdWVyeSwgaXQgaXMgYSBiYXNlIGxpYnJhcnkgdGhhdCBpc1xuICAvLyBwb3B1bGFyIGVub3VnaCB0byBiZSBidW5kbGVkIGluIGEgdGhpcmQgcGFydHkgbGliLCBidXQgbm90IGJlIHBhcnQgb2ZcbiAgLy8gYW4gQU1EIGxvYWQgcmVxdWVzdC4gVGhvc2UgY2FzZXMgY291bGQgZ2VuZXJhdGUgYW4gZXJyb3Igd2hlbiBhblxuICAvLyBhbm9ueW1vdXMgZGVmaW5lKCkgaXMgY2FsbGVkIG91dHNpZGUgb2YgYSBsb2FkZXIgcmVxdWVzdC5cbiAgaWYgKHR5cGVvZiBkZWZpbmUgPT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XG4gICAgZGVmaW5lKCd1bmRlcnNjb3JlJywgW10sIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIF87XG4gICAgfSk7XG4gIH1cbn0oKSk7XG4iXX0=
},{}]},{},[1])
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJTY3JpcHRzL2FwcC5qcyIsIlNjcmlwdHMvYXBwL0FkbWluRXJyb3IvQWRtaW5FcnJvci5qcyIsIlNjcmlwdHMvYXBwL0FsbGVyZ2VuL0FsbGVyZ2VuLmpzIiwiU2NyaXB0cy9hcHAvQWxsZXJnZW4vQWxsZXJnZW5Sb3V0ZXIuanMiLCJTY3JpcHRzL2FwcC9BdXRoZW50aWNhdGlvbi9BdXRoZW50aWNhdGlvbi5qcyIsIlNjcmlwdHMvYXBwL0F1dGhlbnRpY2F0aW9uL0F1dGhlbnRpY2F0aW9uUm91dGVyLmpzIiwiU2NyaXB0cy9hcHAvQmFzZS9Gb3JtLmpzIiwiU2NyaXB0cy9hcHAvQmFzZS9Lb0JpbmRpbmdFeHRlbnNpb25zLmpzIiwiU2NyaXB0cy9hcHAvQmFzZS9Lb0JpbmRpbmdTZWxlY3QyLmpzIiwiU2NyaXB0cy9hcHAvQmFzZS9Sb3V0ZXIuanMiLCJTY3JpcHRzL2FwcC9CYXNlL1RhYmxlLmpzIiwiU2NyaXB0cy9hcHAvQmFzZS9WTUJhc2UuanMiLCJTY3JpcHRzL2FwcC9DYWxsVG9BY3Rpb24vQ2FsbFRvQWN0aW9uLmpzIiwiU2NyaXB0cy9hcHAvQ29tbW9uL01vZGFsLmpzIiwiU2NyaXB0cy9hcHAvQ29ubmVjdC9Db25uZWN0LmpzIiwiU2NyaXB0cy9hcHAvQ29ubmVjdC9Db25uZWN0Rm9ybS5qcyIsIlNjcmlwdHMvYXBwL0Nvbm5lY3QvQ29ubmVjdFJvdXRlci5qcyIsIlNjcmlwdHMvYXBwL0NvbnRhY3RVcy9Db250YWN0VXMuanMiLCJTY3JpcHRzL2FwcC9Db250YWN0VXMvQ29udGFjdFVzUm91dGVyLmpzIiwiU2NyaXB0cy9hcHAvQ29udGFjdC9Db250YWN0LmpzIiwiU2NyaXB0cy9hcHAvQ29udGFjdC9Db250YWN0Um91dGVyLmpzIiwiU2NyaXB0cy9hcHAvQ29udGVudFBhZ2VUcmVlVmlldy9Db250ZW50UGFnZVRyZWVWaWV3LmpzIiwiU2NyaXB0cy9hcHAvQ29udGVudFBhZ2UvQ29udGVudFBhZ2UuanMiLCJTY3JpcHRzL2FwcC9Db250ZW50UGFnZS9Db250ZW50UGFnZUJhc2UuanMiLCJTY3JpcHRzL2FwcC9Db250ZW50UGFnZS9Db250ZW50UGFnZUZvcm0uanMiLCJTY3JpcHRzL2FwcC9Db250ZW50UGFnZS9Db250ZW50UGFnZVJvdXRlci5qcyIsIlNjcmlwdHMvYXBwL0NvdXBvblJlZGVtcHRpb24vQ291cG9uUmVkZW1wdGlvbi5qcyIsIlNjcmlwdHMvYXBwL0NvdXBvbi9Db3Vwb24uanMiLCJTY3JpcHRzL2FwcC9EYXNoYm9hcmRWZXJzaW9uL0Rhc2hib2FyZFZlcnNpb24uanMiLCJTY3JpcHRzL2FwcC9EYXNoYm9hcmRWZXJzaW9uL0Rhc2hib2FyZFZlcnNpb25Gb3JtLmpzIiwiU2NyaXB0cy9hcHAvRGFzaGJvYXJkVmVyc2lvbi9EYXNoYm9hcmRWZXJzaW9uUm91dGVyLmpzIiwiU2NyaXB0cy9hcHAvRXJyb3IvRXJyb3IuanMiLCJTY3JpcHRzL2FwcC9GZWVkYmFja0tleXdvcmRMb2cvRmVlZGJhY2tLZXl3b3JkTG9nLmpzIiwiU2NyaXB0cy9hcHAvRmVlZGJhY2tLZXl3b3JkL0ZlZWRiYWNrS2V5d29yZC5qcyIsIlNjcmlwdHMvYXBwL0ZlZWRiYWNrS2V5d29yZC9GZWVkYmFja0tleXdvcmRSb3V0ZXIuanMiLCJTY3JpcHRzL2FwcC9GdW5kcmFpc2VyQmxhY2tvdXREYXRlL0Z1bmRyYWlzZXJCbGFja291dERhdGUuanMiLCJTY3JpcHRzL2FwcC9GdW5kcmFpc2VyQmxhY2tvdXREYXRlL0Z1bmRyYWlzZXJCbGFja291dERhdGVSb3V0ZXIuanMiLCJTY3JpcHRzL2FwcC9GdW5kcmFpc2VySW5xdWlyeS9GdW5kcmFpc2VySW5xdWlyeS5qcyIsIlNjcmlwdHMvYXBwL0Z1bmRyYWlzZXJJbnF1aXJ5L0Z1bmRyYWlzZXJJbnF1aXJ5Um91dGVyLmpzIiwiU2NyaXB0cy9hcHAvRnVuZHJhaXNlckxvZy9GdW5kcmFpc2VyTG9nLmpzIiwiU2NyaXB0cy9hcHAvRnVuZHJhaXNlckxvZ2luL0Z1bmRyYWlzZXJMb2dpbi5qcyIsIlNjcmlwdHMvYXBwL0Z1bmRyYWlzZXJMb2dpbi9GdW5kcmFpc2VyTG9naW5Gb3JtLmpzIiwiU2NyaXB0cy9hcHAvRnVuZHJhaXNlck1lbWJlci9GdW5kcmFpc2VyTWVtYmVyLmpzIiwiU2NyaXB0cy9hcHAvRnVuZHJhaXNlck1lbWJlci9GdW5kcmFpc2VyTWVtYmVyUm91dGVyLmpzIiwiU2NyaXB0cy9hcHAvRnVuZHJhaXNlclVuaXRFeGNlcHRpb24vRnVuZHJhaXNlclVuaXRFeGNlcHRpb24uanMiLCJTY3JpcHRzL2FwcC9GdW5kcmFpc2VyVW5pdEV4Y2VwdGlvbi9GdW5kcmFpc2VyVW5pdEV4Y2VwdGlvblJvdXRlci5qcyIsIlNjcmlwdHMvYXBwL0Z1bmRyYWlzZXIvRnVuZHJhaXNlci5qcyIsIlNjcmlwdHMvYXBwL0Z1bmRyYWlzZXIvRnVuZHJhaXNlclJvdXRlci5qcyIsIlNjcmlwdHMvYXBwL0dyaWRDb250ZW50UGFnZS9HcmlkQ29udGVudFBhZ2UuanMiLCJTY3JpcHRzL2FwcC9HcmlkQ29udGVudFBhZ2UvR3JpZENvbnRlbnRQYWdlRm9ybS5qcyIsIlNjcmlwdHMvYXBwL0hhbGZBbmRIYWxmL0hhbGZBbmRIYWxmLmpzIiwiU2NyaXB0cy9hcHAvSGFsZkFuZEhhbGYvSGFsZkFuZEhhbGZSb3V0ZXIuanMiLCJTY3JpcHRzL2FwcC9Ib21lU3RyZWFtL0hvbWVTdHJlYW0uanMiLCJTY3JpcHRzL2FwcC9Ib21lU3RyZWFtL0hvbWVTdHJlYW1Sb3V0ZXIuanMiLCJTY3JpcHRzL2FwcC9NZWFsL01lYWwuanMiLCJTY3JpcHRzL2FwcC9NZWRpYS9NZWRpYS5qcyIsIlNjcmlwdHMvYXBwL01lZGlhL01lZGlhUm91dGVyLmpzIiwiU2NyaXB0cy9hcHAvTWVudUNhdGVnb3J5L01lbnVDYXRlZ29yeS5qcyIsIlNjcmlwdHMvYXBwL01lbnVDYXRlZ29yeS9NZW51Q2F0ZWdvcnlSb3V0ZXIuanMiLCJTY3JpcHRzL2FwcC9NZW51SXRlbS9NZW51SXRlbS5qcyIsIlNjcmlwdHMvYXBwL01lbnVJdGVtL01lbnVJdGVtUm91dGVyLmpzIiwiU2NyaXB0cy9hcHAvTWVudS9NZW51LmpzIiwiU2NyaXB0cy9hcHAvTW9iaWxlRmVhdHVyZS9Nb2JpbGVGZWF0dXJlLmpzIiwiU2NyaXB0cy9hcHAvTnV0cml0aW9uL051dHJpdGlvbi5qcyIsIlNjcmlwdHMvYXBwL1BhbmRhRnVuZHJhaXNlckJsYWNrb3V0RGF0ZS9QYW5kYUZ1bmRyYWlzZXJCbGFja291dERhdGUuanMiLCJTY3JpcHRzL2FwcC9QYW5kYUZ1bmRyYWlzZXJNZW1iZXIvUGFuZGFGdW5kcmFpc2VyTWVtYmVyLmpzIiwiU2NyaXB0cy9hcHAvUGFuZGFGdW5kcmFpc2VyTWVtYmVyL1BhbmRhRnVuZHJhaXNlck1lbWJlckZvcm0uanMiLCJTY3JpcHRzL2FwcC9QYW5kYUZ1bmRyYWlzZXIvUGFuZGFGdW5kcmFpc2VyLmpzIiwiU2NyaXB0cy9hcHAvUGFuZGFGdW5kcmFpc2VyL1BhbmRhRnVuZHJhaXNlckZvcm0uanMiLCJTY3JpcHRzL2FwcC9QYW5kYUZ1bmRyYWlzZXIvUGFuZGFGdW5kcmFpc2VyUm91dGVyLmpzIiwiU2NyaXB0cy9hcHAvUHVibGljQ29udGVudFBhZ2UvUHVibGljQ29udGVudFBhZ2UuanMiLCJTY3JpcHRzL2FwcC9RdWVzdGlvbkFuc3dlci9RdWVzdGlvbkFuc3dlci5qcyIsIlNjcmlwdHMvYXBwL1JlZGlyZWN0VXJsL1JlZGlyZWN0VXJsLmpzIiwiU2NyaXB0cy9hcHAvUmVkaXJlY3RVcmwvUmVkaXJlY3RVcmxSb3V0ZXIuanMiLCJTY3JpcHRzL2FwcC9TaXRlTWFwL1NpdGVNYXAuanMiLCJTY3JpcHRzL2FwcC9TdG9yZUV4Y2VwdGlvbi9TdG9yZUV4Y2VwdGlvbi5qcyIsIlNjcmlwdHMvYXBwL1N0b3JlRXhjZXB0aW9uL1N0b3JlRXhjZXB0aW9uUm91dGVyLmpzIiwiU2NyaXB0cy9hcHAvU3RvcmUvU3RvcmUuanMiLCJTY3JpcHRzL2FwcC9TdG9yZS9TdG9yZVRhYmxlLmpzIiwiU2NyaXB0cy9hcHAvU3R5bGVHdWlkZS9TdHlsZUd1aWRlLmpzIiwiU2NyaXB0cy9hcHAvU3lzdGVtQ29udGVudFBhZ2UvU3lzdGVtQ29udGVudFBhZ2UuanMiLCJTY3JpcHRzL2FwcC9TeXN0ZW1Db250ZW50UGFnZS9TeXN0ZW1Db250ZW50UGFnZUZvcm0uanMiLCJTY3JpcHRzL2FwcC9Vc2VyTG9jYXRpb24vVXNlckxvY2F0aW9uLmpzIiwiU2NyaXB0cy9hcHAvVXNlci9Vc2VyLmpzIiwiU2NyaXB0cy9hcHAvVXNlci9Vc2VyUm91dGVyLmpzIiwiU2NyaXB0cy9hcHAvVmVuZG9yL1ZlbmRvci5qcyIsIlNjcmlwdHMvYXBwL1Zpc2l0b3JTY2hlZHVsZWRNZWV0aW5nL1Zpc2l0b3JTY2hlZHVsZWRNZWV0aW5nLmpzIiwiU2NyaXB0cy9hcHAvWWVscFJldmlldy9ZZWxwUmV2aWV3LmpzIiwiU2NyaXB0cy9hcHAvWWVscFJldmlldy9ZZWxwUmV2aWV3VGFibGUuanMiLCJTY3JpcHRzL2xpYi9qcXVlcnkuaXNsb2FkaW5nLmpzIiwiU2NyaXB0cy9saWIvbW9tZW50LWRhdGVwaWNrZXIta28uanMiLCJTY3JpcHRzL2xpYi9tb21lbnQtZGF0ZXBpY2tlci5qcyIsIlNjcmlwdHMvbGliL3NhbW15LmpzIiwiU2NyaXB0cy9saWIvc2VsZWN0Mi4zLjQuMi5qcyIsIlNjcmlwdHMvbGliL3N1bW1lcm5vdGUuanMiLCJub2RlX21vZHVsZXMvYm9vdHN0cmFwL2Rpc3QvanMvbnBtLmpzIiwibm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9qcy9hZmZpeC5qcyIsIm5vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvYWxlcnQuanMiLCJub2RlX21vZHVsZXMvYm9vdHN0cmFwL2pzL2J1dHRvbi5qcyIsIm5vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvY2Fyb3VzZWwuanMiLCJub2RlX21vZHVsZXMvYm9vdHN0cmFwL2pzL2NvbGxhcHNlLmpzIiwibm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9qcy9kcm9wZG93bi5qcyIsIm5vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvbW9kYWwuanMiLCJub2RlX21vZHVsZXMvYm9vdHN0cmFwL2pzL3BvcG92ZXIuanMiLCJub2RlX21vZHVsZXMvYm9vdHN0cmFwL2pzL3Njcm9sbHNweS5qcyIsIm5vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvdGFiLmpzIiwibm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9qcy90b29sdGlwLmpzIiwibm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9qcy90cmFuc2l0aW9uLmpzIiwibm9kZV9tb2R1bGVzL2pxdWVyeS9kaXN0L2pxdWVyeS5qcyIsIm5vZGVfbW9kdWxlcy9rbm9ja291dC5tYXBwaW5nL2tub2Nrb3V0Lm1hcHBpbmcuanMiLCJub2RlX21vZHVsZXMva25vY2tvdXQvYnVpbGQvb3V0cHV0L2tub2Nrb3V0LWxhdGVzdC5kZWJ1Zy5qcyIsIm5vZGVfbW9kdWxlcy9tb21lbnQvbW9tZW50LmpzIiwibm9kZV9tb2R1bGVzL3VuZGVyc2NvcmUvdW5kZXJzY29yZS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDYkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaklBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5S0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4S0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOWJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3REQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDYkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3REQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3REQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0VBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9HQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3REQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDYkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4UUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0VBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3REQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3REQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDYkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzaEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1bUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RwR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbGxOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3T0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDblZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeGdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaHdWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6ekJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzl5TEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMTVJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt2YXIgZj1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK28rXCInXCIpO3Rocm93IGYuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixmfXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSkiLCIvLy8gVGhpcyBjb2RlIHdhcyBnZW5lcmF0ZWQgYnkgT3JhbmdlIE9uaW9uIFNjYWZmb2xkZXIuXHJcbi8vIHRlbXBsYXRlOiBNVkMuVFNBcHAuY3NcclxuLy8gY2xhc3M6IFJlZGlyZWN0VXJsXHJcbnBhbmRhID0ge307XHJcbnZhciBBdXRoZW50aWNhdGlvbiA9IHJlcXVpcmUoXCIuL2FwcC9BdXRoZW50aWNhdGlvbi9BdXRoZW50aWNhdGlvblwiKTtcclxucGFuZGEuQXV0aGVudGljYXRpb24gPSBBdXRoZW50aWNhdGlvbjtcclxudmFyIENhbGxUb0FjdGlvbiA9IHJlcXVpcmUoJy4vYXBwL0NhbGxUb0FjdGlvbi9DYWxsVG9BY3Rpb24nKTtcclxucGFuZGEuQ2FsbFRvQWN0aW9uID0gQ2FsbFRvQWN0aW9uO1xyXG52YXIgQ29udGFjdCA9IHJlcXVpcmUoJy4vYXBwL0NvbnRhY3QvQ29udGFjdCcpO1xyXG5wYW5kYS5Db250YWN0ID0gQ29udGFjdDtcclxudmFyIENvbnRlbnRQYWdlID0gcmVxdWlyZSgnLi9hcHAvQ29udGVudFBhZ2UvQ29udGVudFBhZ2UnKTtcclxucGFuZGEuQ29udGVudFBhZ2UgPSBDb250ZW50UGFnZTtcclxudmFyIEhvbWVTdHJlYW0gPSByZXF1aXJlKCcuL2FwcC9Ib21lU3RyZWFtL0hvbWVTdHJlYW0nKTtcclxucGFuZGEuSG9tZVN0cmVhbSA9IEhvbWVTdHJlYW07XHJcbnZhciBEYXNoYm9hcmRWZXJzaW9uID0gcmVxdWlyZSgnLi9hcHAvRGFzaGJvYXJkVmVyc2lvbi9EYXNoYm9hcmRWZXJzaW9uJyk7XHJcbnBhbmRhLkRhc2hib2FyZFZlcnNpb24gPSBEYXNoYm9hcmRWZXJzaW9uO1xyXG52YXIgTWVkaWEgPSByZXF1aXJlKCcuL2FwcC9NZWRpYS9NZWRpYScpO1xyXG5wYW5kYS5NZWRpYUxpYnJhcnkgPSBNZWRpYTtcclxudmFyIENvbnRlbnRQYWdlVHJlZVZpZXcgPSByZXF1aXJlKCcuL2FwcC9Db250ZW50UGFnZVRyZWVWaWV3L0NvbnRlbnRQYWdlVHJlZVZpZXcnKTtcclxucGFuZGEuQ29udGVudFBhZ2VUcmVlVmlldyA9IENvbnRlbnRQYWdlVHJlZVZpZXc7XHJcbnZhciBDb3Vwb24gPSByZXF1aXJlKCcuL2FwcC9Db3Vwb24vQ291cG9uJyk7XHJcbnBhbmRhLkNvdXBvbiA9IENvdXBvbjtcclxudmFyIENvdXBvblJlZGVtcHRpb24gPSByZXF1aXJlKCcuL2FwcC9Db3Vwb25SZWRlbXB0aW9uL0NvdXBvblJlZGVtcHRpb24nKTtcclxucGFuZGEuQ291cG9uUmVkZW1wdGlvbiA9IENvdXBvblJlZGVtcHRpb247XHJcbnZhciBGdW5kcmFpc2VyID0gcmVxdWlyZSgnLi9hcHAvRnVuZHJhaXNlci9GdW5kcmFpc2VyJyk7XHJcbnBhbmRhLkZ1bmRyYWlzZXIgPSBGdW5kcmFpc2VyO1xyXG52YXIgRnVuZHJhaXNlckJsYWNrb3V0RGF0ZSA9IHJlcXVpcmUoJy4vYXBwL0Z1bmRyYWlzZXJCbGFja291dERhdGUvRnVuZHJhaXNlckJsYWNrb3V0RGF0ZScpO1xyXG5wYW5kYS5GdW5kcmFpc2VyQmxhY2tvdXREYXRlID0gRnVuZHJhaXNlckJsYWNrb3V0RGF0ZTtcclxudmFyIEZ1bmRyYWlzZXJNZW1iZXIgPSByZXF1aXJlKCcuL2FwcC9GdW5kcmFpc2VyTWVtYmVyL0Z1bmRyYWlzZXJNZW1iZXInKTtcclxucGFuZGEuRnVuZHJhaXNlck1lbWJlciA9IEZ1bmRyYWlzZXJNZW1iZXI7XHJcbnZhciBGdW5kcmFpc2VyVW5pdEV4Y2VwdGlvbiA9IHJlcXVpcmUoJy4vYXBwL0Z1bmRyYWlzZXJVbml0RXhjZXB0aW9uL0Z1bmRyYWlzZXJVbml0RXhjZXB0aW9uJyk7XHJcbnBhbmRhLkZ1bmRyYWlzZXJVbml0RXhjZXB0aW9uID0gRnVuZHJhaXNlclVuaXRFeGNlcHRpb247XHJcbnZhciBHcmlkQ29udGVudFBhZ2UgPSByZXF1aXJlKCcuL2FwcC9HcmlkQ29udGVudFBhZ2UvR3JpZENvbnRlbnRQYWdlJyk7XHJcbnBhbmRhLkdyaWRDb250ZW50UGFnZSA9IEdyaWRDb250ZW50UGFnZTtcclxudmFyIEhhbGZBbmRIYWxmID0gcmVxdWlyZSgnLi9hcHAvSGFsZkFuZEhhbGYvSGFsZkFuZEhhbGYnKTtcclxucGFuZGEuSGFsZkFuZEhhbGYgPSBIYWxmQW5kSGFsZjtcclxudmFyIE1lYWwgPSByZXF1aXJlKCcuL2FwcC9NZWFsL01lYWwnKTtcclxucGFuZGEuTWVhbCA9IE1lYWw7XHJcbnZhciBNZW51Q2F0ZWdvcnkgPSByZXF1aXJlKCcuL2FwcC9NZW51Q2F0ZWdvcnkvTWVudUNhdGVnb3J5Jyk7XHJcbnBhbmRhLk1lbnVDYXRlZ29yeSA9IE1lbnVDYXRlZ29yeTtcclxudmFyIE1lbnVJdGVtID0gcmVxdWlyZSgnLi9hcHAvTWVudUl0ZW0vTWVudUl0ZW0nKTtcclxucGFuZGEuTWVudUl0ZW0gPSBNZW51SXRlbTtcclxudmFyIE1vYmlsZUZlYXR1cmUgPSByZXF1aXJlKCcuL2FwcC9Nb2JpbGVGZWF0dXJlL01vYmlsZUZlYXR1cmUnKTtcclxucGFuZGEuTW9iaWxlRmVhdHVyZSA9IE1vYmlsZUZlYXR1cmU7XHJcbnZhciBRdWVzdGlvbkFuc3dlciA9IHJlcXVpcmUoJy4vYXBwL1F1ZXN0aW9uQW5zd2VyL1F1ZXN0aW9uQW5zd2VyJyk7XHJcbnBhbmRhLlF1ZXN0aW9uQW5zd2VyID0gUXVlc3Rpb25BbnN3ZXI7XHJcbnZhciBSZWRpcmVjdFVybCA9IHJlcXVpcmUoJy4vYXBwL1JlZGlyZWN0VXJsL1JlZGlyZWN0VXJsJyk7XHJcbnBhbmRhLlJlZGlyZWN0VXJsID0gUmVkaXJlY3RVcmw7XHJcbnZhciBTdG9yZSA9IHJlcXVpcmUoJy4vYXBwL1N0b3JlL1N0b3JlJyk7XHJcbnBhbmRhLlN0b3JlID0gU3RvcmU7XHJcbnZhciBTdG9yZUV4Y2VwdGlvbiA9IHJlcXVpcmUoJy4vYXBwL1N0b3JlRXhjZXB0aW9uL1N0b3JlRXhjZXB0aW9uJyk7XHJcbnBhbmRhLlN0b3JlRXhjZXB0aW9uID0gU3RvcmVFeGNlcHRpb247XHJcbnZhciBTeXN0ZW1Db250ZW50UGFnZSA9IHJlcXVpcmUoJy4vYXBwL1N5c3RlbUNvbnRlbnRQYWdlL1N5c3RlbUNvbnRlbnRQYWdlJyk7XHJcbnBhbmRhLlN5c3RlbUNvbnRlbnRQYWdlID0gU3lzdGVtQ29udGVudFBhZ2U7XHJcbnZhciBVc2VyID0gcmVxdWlyZSgnLi9hcHAvVXNlci9Vc2VyJyk7XHJcbnBhbmRhLlVzZXIgPSBVc2VyO1xyXG52YXIgVXNlckxvY2F0aW9uID0gcmVxdWlyZSgnLi9hcHAvVXNlckxvY2F0aW9uL1VzZXJMb2NhdGlvbicpO1xyXG5wYW5kYS5Vc2VyTG9jYXRpb24gPSBVc2VyTG9jYXRpb247XHJcbnZhciBDb25uZWN0ID0gcmVxdWlyZSgnLi9hcHAvQ29ubmVjdC9Db25uZWN0Jyk7XHJcbnBhbmRhLkNvbm5lY3RVcyA9IENvbm5lY3Q7XHJcbnZhciBDb250YWN0VXMgPSByZXF1aXJlKCcuL2FwcC9Db250YWN0VXMvQ29udGFjdFVzJyk7XHJcbnBhbmRhLkNvbnRhY3RVcyA9IENvbnRhY3RVcztcclxudmFyIEZ1bmRyYWlzZXJMb2dpbiA9IHJlcXVpcmUoJy4vYXBwL0Z1bmRyYWlzZXJMb2dpbi9GdW5kcmFpc2VyTG9naW4nKTtcclxucGFuZGEuRnVuZHJhaXNlckxvZ2luID0gRnVuZHJhaXNlckxvZ2luO1xyXG52YXIgTWVudSA9IHJlcXVpcmUoJy4vYXBwL01lbnUvTWVudScpO1xyXG5wYW5kYS5NZW51ID0gTWVudTtcclxudmFyIFBhbmRhRnVuZHJhaXNlciA9IHJlcXVpcmUoJy4vYXBwL1BhbmRhRnVuZHJhaXNlci9QYW5kYUZ1bmRyYWlzZXInKTtcclxucGFuZGEuUGFuZGFGdW5kcmFpc2VyID0gUGFuZGFGdW5kcmFpc2VyO1xyXG52YXIgUGFuZGFGdW5kcmFpc2VyQmxhY2tvdXREYXRlID0gcmVxdWlyZSgnLi9hcHAvUGFuZGFGdW5kcmFpc2VyQmxhY2tvdXREYXRlL1BhbmRhRnVuZHJhaXNlckJsYWNrb3V0RGF0ZScpO1xyXG5wYW5kYS5QYW5kYUZ1bmRyYWlzZXJCbGFja291dERhdGUgPSBQYW5kYUZ1bmRyYWlzZXJCbGFja291dERhdGU7XHJcbnZhciBQYW5kYUZ1bmRyYWlzZXJNZW1iZXIgPSByZXF1aXJlKCcuL2FwcC9QYW5kYUZ1bmRyYWlzZXJNZW1iZXIvUGFuZGFGdW5kcmFpc2VyTWVtYmVyJyk7XHJcbnBhbmRhLlBhbmRhRnVuZHJhaXNlck1lbWJlciA9IFBhbmRhRnVuZHJhaXNlck1lbWJlcjtcclxudmFyIFB1YmxpY0NvbnRlbnRQYWdlID0gcmVxdWlyZSgnLi9hcHAvUHVibGljQ29udGVudFBhZ2UvUHVibGljQ29udGVudFBhZ2UnKTtcclxucGFuZGEuUHVibGljQ29udGVudFBhZ2UgPSBQdWJsaWNDb250ZW50UGFnZTtcclxudmFyIEVycm9yID0gcmVxdWlyZSgnLi9hcHAvRXJyb3IvRXJyb3InKTtcclxucGFuZGEuRXJyb3IgPSBFcnJvcjtcclxudmFyIEFkbWluRXJyb3IgPSByZXF1aXJlKCcuL2FwcC9BZG1pbkVycm9yL0FkbWluRXJyb3InKTtcclxucGFuZGEuQWRtaW5FcnJvciA9IEFkbWluRXJyb3I7XHJcbnZhciBTdHlsZUd1aWRlID0gcmVxdWlyZSgnLi9hcHAvU3R5bGVHdWlkZS9TdHlsZUd1aWRlJyk7XHJcbnBhbmRhLlN0eWxlR3VpZGUgPSBTdHlsZUd1aWRlO1xyXG52YXIgU2l0ZU1hcCA9IHJlcXVpcmUoJy4vYXBwL1NpdGVNYXAvU2l0ZU1hcCcpO1xyXG5wYW5kYS5TaXRlTWFwID0gU2l0ZU1hcDtcclxudmFyIEZlZWRiYWNrS2V5d29yZCA9IHJlcXVpcmUoJy4vYXBwL0ZlZWRiYWNrS2V5d29yZC9GZWVkYmFja0tleXdvcmQnKTtcclxucGFuZGEuRmVlZGJhY2tLZXl3b3JkID0gRmVlZGJhY2tLZXl3b3JkO1xyXG52YXIgVmVuZG9yID0gcmVxdWlyZSgnLi9hcHAvVmVuZG9yL1ZlbmRvcicpO1xyXG5wYW5kYS5WZW5kb3IgPSBWZW5kb3I7XHJcbnZhciBGZWVkYmFja0tleXdvcmRMb2cgPSByZXF1aXJlKCcuL2FwcC9GZWVkYmFja0tleXdvcmRMb2cvRmVlZGJhY2tLZXl3b3JkTG9nJyk7XHJcbnBhbmRhLkZlZWRiYWNrS2V5d29yZExvZyA9IEZlZWRiYWNrS2V5d29yZExvZztcclxudmFyIEFsbGVyZ2VuID0gcmVxdWlyZSgnLi9hcHAvQWxsZXJnZW4vQWxsZXJnZW4nKTtcclxucGFuZGEuQWxsZXJnZW4gPSBBbGxlcmdlbjtcclxudmFyIEZ1bmRyYWlzZXJMb2cgPSByZXF1aXJlKCcuL2FwcC9GdW5kcmFpc2VyTG9nL0Z1bmRyYWlzZXJMb2cnKTtcclxucGFuZGEuRnVuZHJhaXNlckxvZyA9IEZ1bmRyYWlzZXJMb2c7XHJcbnZhciBGdW5kcmFpc2VySW5xdWlyeSA9IHJlcXVpcmUoJy4vYXBwL0Z1bmRyYWlzZXJJbnF1aXJ5L0Z1bmRyYWlzZXJJbnF1aXJ5Jyk7XHJcbnBhbmRhLkZ1bmRyYWlzZXJJbnF1aXJ5ID0gRnVuZHJhaXNlcklucXVpcnk7XHJcbnZhciBZZWxwUmV2aWV3ID0gcmVxdWlyZSgnLi9hcHAvWWVscFJldmlldy9ZZWxwUmV2aWV3Jyk7XHJcbnBhbmRhLlllbHBSZXZpZXcgPSBZZWxwUmV2aWV3O1xyXG52YXIgVmlzaXRvclNjaGVkdWxlZE1lZXRpbmcgPSByZXF1aXJlKCcuL2FwcC9WaXNpdG9yU2NoZWR1bGVkTWVldGluZy9WaXNpdG9yU2NoZWR1bGVkTWVldGluZycpO1xyXG5wYW5kYS5WaXNpdG9yU2NoZWR1bGVkTWVldGluZyA9IFZpc2l0b3JTY2hlZHVsZWRNZWV0aW5nO1xyXG52YXIgTnV0cml0aW9uID0gcmVxdWlyZSgnLi9hcHAvTnV0cml0aW9uL051dHJpdGlvbicpO1xyXG5wYW5kYS5OdXRyaXRpb24gPSBOdXRyaXRpb247XHJcblxyXG5kb2N1bWVudC5vbmtleWRvd24gPSBmdW5jdGlvbiAoZSkge1xyXG4gICAgaWYgKGUua2V5Q29kZSA9PT0gMTMpIHtcclxuICAgICAgICBjb25zb2xlLmxvZygnZW50ZXInKTtcclxuICAgICAgICBkb2N1bWVudC5hY3RpdmVFbGVtZW50LmNsaWNrKCk7XHJcbiAgICB9XHJcbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xyXG5jb25zdCBrbyA9IHJlcXVpcmUoXCJrbm9ja291dFwiKTtcclxuY2xhc3MgQWRtaW5FcnJvciB7XHJcbiAgICBjb25zdHJ1Y3RvcihkYXRhKSB7XHJcbiAgICAgICAgLy9jYWxsIGJhc2UgY2xhc3MgY29uc3RydWN0b3JcclxuICAgICAgICAvLyBzdXBlcihkYXRhLCBGb3JtLCBUYWJsZSwgUm91dGVyKTtcclxuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xyXG4gICAgICAgIGtvLmFwcGx5QmluZGluZ3ModGhpcyk7XHJcbiAgICAgICAgJCgnLmhpZGVVbmJvdW5kJykucmVtb3ZlQ2xhc3MoJ2hpZGVVbmJvdW5kJyk7XHJcbiAgICB9XHJcbn1cclxubW9kdWxlLmV4cG9ydHMgPSBBZG1pbkVycm9yO1xyXG4iLCJcInVzZSBzdHJpY3RcIjtcclxuLy8vIFRoaXMgY29kZSB3YXMgZ2VuZXJhdGVkIGJ5IE9yYW5nZSBPbmlvbiBTY2FmZm9sZGVyLlxyXG4vLyB0ZW1wbGF0ZTogTVZDLkpTTW9kdWxlLmNzXHJcbi8vIGNsYXNzOiBBbGxlcmdlblxyXG5jb25zdCAkID0gcmVxdWlyZShcImpxdWVyeVwiKTtcclxuY29uc3Qga28gPSByZXF1aXJlKFwia25vY2tvdXRcIik7XHJcbmNvbnN0IGJhc2UgPSByZXF1aXJlKFwiLi4vQmFzZS9WTUJhc2VcIik7XHJcbmNvbnN0IFRhYmxlID0gcmVxdWlyZShcIi4uL0Jhc2UvVGFibGVcIik7XHJcbmNvbnN0IEFsbGVyZ2VuUm91dGVyID0gcmVxdWlyZShcIi4vQWxsZXJnZW5Sb3V0ZXJcIik7XHJcbmNvbnN0IEZvcm0gPSByZXF1aXJlKFwiLi4vQmFzZS9Gb3JtXCIpO1xyXG5jbGFzcyBBbGxlcmdlbiBleHRlbmRzIGJhc2UuVm1CYXNlIHtcclxuICAgIGNvbnN0cnVjdG9yKGRhdGEpIHtcclxuICAgICAgICAvL2NhbGwgYmFzZSBjbGFzcyBjb25zdHJ1Y3RvclxyXG4gICAgICAgIHN1cGVyKGRhdGEsIEZvcm0sIFRhYmxlLCBBbGxlcmdlblJvdXRlcik7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcclxuICAgICAgICBrby5hcHBseUJpbmRpbmdzKHRoaXMpO1xyXG4gICAgICAgICQoJy5oaWRlVW5ib3VuZCcpLnJlbW92ZUNsYXNzKCdoaWRlVW5ib3VuZCcpO1xyXG4gICAgfVxyXG59XHJcbm1vZHVsZS5leHBvcnRzID0gQWxsZXJnZW47XHJcbiIsIlwidXNlIHN0cmljdFwiO1xyXG5jb25zdCBSb3V0ZXIgPSByZXF1aXJlKFwiLi4vQmFzZS9Sb3V0ZXJcIik7XHJcbmNsYXNzIEFsbGVyZ2VuUm91dGVyIGV4dGVuZHMgUm91dGVyIHtcclxuICAgIGNvbnN0cnVjdG9yKGRhdGEsIHZtLCBhbHRlcm5hdGVyb3V0ZXMpIHtcclxuICAgICAgICBzdXBlcihkYXRhLCB2bSwgYWx0ZXJuYXRlcm91dGVzKTtcclxuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xyXG4gICAgICAgIHRoaXMudm0gPSB2bTtcclxuICAgIH1cclxuICAgIGdldFJvdXRlcygpIHtcclxuICAgICAgICB2YXIgc2VsZjtcclxuICAgICAgICBzZWxmID0gdGhpcztcclxuICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBgJHtzZWxmLmdldEFyZWEoKX0vJHtzZWxmLmRhdGEuVGl0bGV9Iy9saXN0YCxcclxuICAgICAgICAgICAgICAgIGZ1bmM6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLmZvcm0uY2FuY2VsKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS50YWJsZS5sb2FkKCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvUmVnRXg6IGZhbHNlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IGAke3NlbGYuZ2V0QXJlYSgpfS8ke3NlbGYuZGF0YS5UaXRsZX0jL25ld2AsXHJcbiAgICAgICAgICAgICAgICBmdW5jKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uZm9ybS5hZGQoKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9SZWdFeDogZmFsc2VcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogYCR7c2VsZi5nZXRBcmVhKCl9LyR7c2VsZi5kYXRhLlRpdGxlfSMvdmlldy86aWRgLFxyXG4gICAgICAgICAgICAgICAgZnVuYygpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgaWQgPSB0aGlzLnBhcmFtc1snaWQnXTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLmZvcm0uZ2V0RGV0YWlsKGlkKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9SZWdFeDogZmFsc2VcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogYCR7c2VsZi5nZXRBcmVhKCl9LyR7c2VsZi5kYXRhLlRpdGxlfSMvaW5kZXhgLFxyXG4gICAgICAgICAgICAgICAgZnVuYygpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLmZvcm0uZ2V0RGV0YWlsKG51bGwpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbnZlcnRUb1JlZ0V4OiBmYWxzZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBgJHtzZWxmLmdldEFyZWEoKX0vJHtzZWxmLmRhdGEuVGl0bGV9Iy9kZWxldGUvOmlkYCxcclxuICAgICAgICAgICAgICAgIGZ1bmMoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGlkID0gdGhpcy5wYXJhbXNbJ2lkJ107XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5mb3JtLmRlbGV0ZUl0ZW0oaWQpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbnZlcnRUb1JlZ0V4OiBmYWxzZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgXTtcclxuICAgIH1cclxufVxyXG5tb2R1bGUuZXhwb3J0cyA9IEFsbGVyZ2VuUm91dGVyO1xyXG4iLCJcInVzZSBzdHJpY3RcIjtcclxuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XHJcbmNvbnN0IGtvID0gcmVxdWlyZShcImtub2Nrb3V0XCIpO1xyXG5jb25zdCBiYXNlID0gcmVxdWlyZShcIi4uL0Jhc2UvVk1CYXNlXCIpO1xyXG5jb25zdCBUYWJsZSA9IHJlcXVpcmUoXCIuLi9CYXNlL1RhYmxlXCIpO1xyXG5jb25zdCBGb3JtID0gcmVxdWlyZShcIi4uL0Jhc2UvRm9ybVwiKTtcclxuY29uc3QgQXV0aGVudGljYXRpb25Sb3V0ZXIxID0gcmVxdWlyZShcIi4vQXV0aGVudGljYXRpb25Sb3V0ZXJcIik7XHJcbmNsYXNzIEF1dGhlbnRpY2F0aW9uIGV4dGVuZHMgYmFzZS5WbUJhc2Uge1xyXG4gICAgY29uc3RydWN0b3IoZGF0YSkge1xyXG4gICAgICAgIC8vY2FsbCBiYXNlIGNsYXNzIGNvbnN0cnVjdG9yXHJcbiAgICAgICAgc3VwZXIoZGF0YSwgRm9ybSwgVGFibGUsIEF1dGhlbnRpY2F0aW9uUm91dGVyMSk7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcclxuICAgICAgICB0aGlzLkZpbHRlcnMgPSBudWxsO1xyXG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcclxuICAgICAgICBrby5hcHBseUJpbmRpbmdzKHRoaXMpO1xyXG4gICAgICAgICQoJy5oaWRlVW5ib3VuZCcpLnJlbW92ZUNsYXNzKCdoaWRlVW5ib3VuZCcpO1xyXG4gICAgICAgICQoJyNsb2dpbi1idXR0b24nKS5vbignY2xpY2snLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIHNlbGYuQWxlcnRzKFtdKTtcclxuICAgICAgICAgICAgdmFyIHVybCA9ICcvQWRtaW4vQXV0aGVudGljYXRpb24vTG9naW4nO1xyXG4gICAgICAgICAgICB2YXIgbWFwcGluZyA9IHtcclxuICAgICAgICAgICAgICAgICdpZ25vcmUnOiB0aGlzLmRhdGEuS09NYXBwaW5nLmFsbE5vblBvc3RCYWNrXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHZhciBwb3N0RGF0YSA9IGtvLm1hcHBpbmcudG9KUyh0aGlzLCBtYXBwaW5nKTtcclxuICAgICAgICAgICAgJCgnI2xvYWRpbmcnKS5oZWlnaHQoJCh3aW5kb3cpLmhlaWdodCgpKTtcclxuICAgICAgICAgICAgdGhpcy5Jc0xvYWRpbmcodHJ1ZSk7XHJcbiAgICAgICAgICAgIHZhciBwcm9taXNlID0gJC5hamF4KHtcclxuICAgICAgICAgICAgICAgIHVybDogdXJsLFxyXG4gICAgICAgICAgICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkocG9zdERhdGEpLFxyXG4gICAgICAgICAgICAgICAgdHlwZTogJ1BPU1QnLFxyXG4gICAgICAgICAgICAgICAgY2FjaGU6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgY29udGVudFR5cGU6ICdhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTgnXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBwcm9taXNlLmZhaWwoZnVuY3Rpb24gKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAvL3NvbWV0aGluZyB3ZW50IHdyb25nIGRpc3BsYXkgZXJyb3JcclxuICAgICAgICAgICAgICAgIHZhciBodG1sID0gZXJyb3IuZXJyb3IoKS5yZXNwb25zZVRleHQ7XHJcbiAgICAgICAgICAgICAgICB2YXIgZWxlbWVudCA9ICQoJzxkaXYvPicpLmh0bWwoaHRtbCk7XHJcbiAgICAgICAgICAgICAgICAkKCdzdHlsZScsIGVsZW1lbnQpLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAgICAgdmFyIGh0bWxUZXh0ID0gZWxlbWVudC5odG1sKCk7XHJcbiAgICAgICAgICAgICAgICBzZWxmLkFkZEFsZXJ0KGh0bWxUZXh0LCAnZXJyb3InKTtcclxuICAgICAgICAgICAgICAgIHNlbGYuSXNMb2FkaW5nKGZhbHNlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHByb21pc2UuZG9uZShmdW5jdGlvbiAoZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGRhdGEuTG9naW5TdWNjZXNzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBkYXRhLlJldHVyblVybDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuQWRkQWxlcnQoZGF0YS5NZXNzYWdlLCAnZXJyb3InKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHNlbGYuSXNMb2FkaW5nKGZhbHNlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgICQoJyNmb3Jnb3QtcGFzc3dvcmQtYnV0dG9uJykub24oJ2NsaWNrJywgKCkgPT4ge1xyXG4gICAgICAgICAgICBzZWxmLkFsZXJ0cy5yZW1vdmVBbGwoKTtcclxuICAgICAgICAgICAgc2VsZi5Jc0xvYWRpbmcodHJ1ZSk7XHJcbiAgICAgICAgICAgIHZhciBwcm9taXNlID0gJC5hamF4KHtcclxuICAgICAgICAgICAgICAgIHVybDogJy9BZG1pbi9BdXRoZW50aWNhdGlvbi9Gb3Jnb3RQYXNzd29yZD9lbWFpbD0nICsgJCgnI0l0ZW1EZXRhaWxfRW1haWwnKS52YWwoKSxcclxuICAgICAgICAgICAgICAgIHR5cGU6ICdQT1NUJyxcclxuICAgICAgICAgICAgICAgIGNhY2hlOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIGRhdGFUeXBlOiAnanNvbidcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHByb21pc2UuZmFpbChmdW5jdGlvbiAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgIC8vc29tZXRoaW5nIHdlbnQgd3JvbmcgZGlzcGxheSBlcnJvclxyXG4gICAgICAgICAgICAgICAgdmFyIG1zZyA9IGVycm9yLmVycm9yKCkucmVzcG9uc2VKU09OLk1lc3NhZ2U7XHJcbiAgICAgICAgICAgICAgICB2YXIgZWxlbWVudCA9ICQoJzxkaXYvPicpLmh0bWwobXNnKTtcclxuICAgICAgICAgICAgICAgICQoJ3N0eWxlJywgZWxlbWVudCkucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgICAgICB2YXIgaHRtbFRleHQgPSBlbGVtZW50Lmh0bWwoKTtcclxuICAgICAgICAgICAgICAgIHNlbGYuQWRkQWxlcnQoaHRtbFRleHQsIFwiZXJyb3JcIik7XHJcbiAgICAgICAgICAgICAgICBzZWxmLklzTG9hZGluZyhmYWxzZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBwcm9taXNlLmRvbmUoZnVuY3Rpb24gKGRhdGEpIHtcclxuICAgICAgICAgICAgICAgIHNlbGYuSXNMb2FkaW5nKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIHNlbGYuQWRkQWxlcnQoZGF0YS5NZXNzYWdlLCAnc3VjY2VzcycpO1xyXG4gICAgICAgICAgICAgICAgc2VsZi5TaG93Rm9yZ290UGFzc3dvcmQoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhhc2ggPSAnIy9pbmRleCc7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZTtcclxuICAgICAgICB9KTtcclxuICAgICAgICAkKCcjcmVzZXQtcGFzc3dvcmQtYnV0dG9uJykub24oJ2NsaWNrJywgKCkgPT4ge1xyXG4gICAgICAgICAgICBzZWxmLkFsZXJ0cy5yZW1vdmVBbGwoKTtcclxuICAgICAgICAgICAgc2VsZi5Jc0xvYWRpbmcodHJ1ZSk7XHJcbiAgICAgICAgICAgIHZhciBtYXBwaW5nID0ge1xyXG4gICAgICAgICAgICAgICAgJ2lnbm9yZSc6IHRoaXMuZGF0YS5LT01hcHBpbmcuYWxsTm9uUG9zdEJhY2tcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgdmFyIHBvc3REYXRhID0ga28ubWFwcGluZy50b0pTKHRoaXMsIG1hcHBpbmcpO1xyXG4gICAgICAgICAgICB2YXIgcHJvbWlzZSA9ICQuYWpheCh7XHJcbiAgICAgICAgICAgICAgICB1cmw6ICcvQWRtaW4vQXV0aGVudGljYXRpb24vUmVzZXRQYXNzd29yZCcsXHJcbiAgICAgICAgICAgICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShwb3N0RGF0YSksXHJcbiAgICAgICAgICAgICAgICB0eXBlOiAnUE9TVCcsXHJcbiAgICAgICAgICAgICAgICBjYWNoZTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICBjb250ZW50VHlwZTogJ2FwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtOCcsXHJcbiAgICAgICAgICAgICAgICBkYXRhVHlwZTogJ2pzb24nXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBwcm9taXNlLmZhaWwoZnVuY3Rpb24gKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAvL3NvbWV0aGluZyB3ZW50IHdyb25nIGRpc3BsYXkgZXJyb3JcclxuICAgICAgICAgICAgICAgIC8vdmFyIG1zZyA9IGVycm9yLmVycm9yKCkucmVzcG9uc2VKU09OLk1lc3NhZ2U7XHJcbiAgICAgICAgICAgICAgICAkLmVhY2goZXJyb3IucmVzcG9uc2VKU09OLk1vZGVsU3RhdGUuUHJvcGVydHlFcnJvcnMsIGZ1bmN0aW9uIChrLCB2KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSAkKCc8ZGl2Lz4nKS5odG1sKHYuRXJyb3JNZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgICAgICAkKCdzdHlsZScsIGVsZW1lbnQpLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBodG1sVGV4dCA9IGVsZW1lbnQuaHRtbCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuQWRkQWxlcnQoaHRtbFRleHQsIFwiZXJyb3JcIik7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICQuZWFjaChlcnJvci5yZXNwb25zZUpTT04uTW9kZWxTdGF0ZS5Nb2RlbEVycm9ycywgZnVuY3Rpb24gKGssIHYpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgZWxlbWVudCA9ICQoJzxkaXYvPicpLmh0bWwodi5FcnJvck1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICQoJ3N0eWxlJywgZWxlbWVudCkucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGh0bWxUZXh0ID0gZWxlbWVudC5odG1sKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5BZGRBbGVydChodG1sVGV4dCwgXCJlcnJvclwiKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgc2VsZi5Jc0xvYWRpbmcoZmFsc2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcHJvbWlzZS5kb25lKGZ1bmN0aW9uIChkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICBzZWxmLklzTG9hZGluZyhmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICBzZWxmLkFkZEFsZXJ0KGRhdGEuTWVzc2FnZSwgJ3N1Y2Nlc3MnKTtcclxuICAgICAgICAgICAgICAgIHNlbGYuU2hvd0ZvcmdvdFBhc3N3b3JkKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIHNlbGYuU2hvd1Jlc2V0UGFzc3dvcmQoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhhc2ggPSAnIy9pbmRleCc7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZTtcclxuICAgICAgICB9KTtcclxuICAgICAgICAkKGRvY3VtZW50KS5vbigna2V5dXAnLCAoZSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZS53aGljaCA9PT0gMTMpIHtcclxuICAgICAgICAgICAgICAgIHNlbGYuSXRlbURldGFpbC5QYXNzd29yZCgkKCcjcGFzc3dvcmQtdGV4dCcpLnZhbCgpKTtcclxuICAgICAgICAgICAgICAgIHNlbGYuSXRlbURldGFpbC5FbWFpbCgkKCcjSXRlbURldGFpbF9FbWFpbCcpLnZhbCgpKTtcclxuICAgICAgICAgICAgICAgICQoJyNsb2dpbi1idXR0b24nKS5jbGljaygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn1cclxubW9kdWxlLmV4cG9ydHMgPSBBdXRoZW50aWNhdGlvbjtcclxuIiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbmNvbnN0IFJvdXRlciA9IHJlcXVpcmUoXCIuLi9CYXNlL1JvdXRlclwiKTtcclxuY2xhc3MgQXV0aGVudGljYXRpb25Sb3V0ZXIgZXh0ZW5kcyBSb3V0ZXIge1xyXG4gICAgY29uc3RydWN0b3IoZGF0YSwgdm0sIGFsdGVybmF0ZXJvdXRlcykge1xyXG4gICAgICAgIHN1cGVyKGRhdGEsIHZtLCBhbHRlcm5hdGVyb3V0ZXMpO1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICAgICAgdGhpcy52bSA9IHZtO1xyXG4gICAgfVxyXG4gICAgZ2V0Um91dGVzKCkge1xyXG4gICAgICAgIHZhciBzZWxmO1xyXG4gICAgICAgIHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6ICcvQWRtaW4vQXV0aGVudGljYXRpb24jL2luZGV4JyxcclxuICAgICAgICAgICAgICAgIGZ1bmMoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5TaG93Rm9yZ290UGFzc3dvcmQoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbnZlcnRUb1JlZ0V4OiB0cnVlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6ICcvQWRtaW4vQXV0aGVudGljYXRpb24jL2ZvcmdvdHBhc3N3b3JkJyxcclxuICAgICAgICAgICAgICAgIGZ1bmMoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5TaG93Rm9yZ290UGFzc3dvcmQodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvUmVnRXg6IHRydWVcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogJy9BZG1pbi9BdXRoZW50aWNhdGlvbiMvcmVzZXRwYXNzd29yZCcsXHJcbiAgICAgICAgICAgICAgICBmdW5jKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uU2hvd0ZvcmdvdFBhc3N3b3JkKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLlNob3dSZXNldFBhc3N3b3JkKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbnZlcnRUb1JlZ0V4OiB0cnVlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICBdO1xyXG4gICAgfVxyXG59XHJcbm1vZHVsZS5leHBvcnRzID0gQXV0aGVudGljYXRpb25Sb3V0ZXI7XHJcbiIsIlwidXNlIHN0cmljdFwiO1xyXG5jb25zdCAkID0gcmVxdWlyZShcImpxdWVyeVwiKTtcclxudmFyIEpRdWVyeSA9ICQ7XHJcbmNvbnN0IGtvID0gcmVxdWlyZShcImtub2Nrb3V0XCIpO1xyXG5jb25zdCBrb21hcHBpbmcgPSByZXF1aXJlKFwia25vY2tvdXQubWFwcGluZ1wiKTtcclxua28ubWFwcGluZyA9IGtvbWFwcGluZztcclxuY29uc3QgXyA9IHJlcXVpcmUoXCJ1bmRlcnNjb3JlXCIpO1xyXG5jb25zdCBib290c3RyYXAgPSByZXF1aXJlKFwiYm9vdHN0cmFwXCIpO1xyXG5ib290c3RyYXA7XHJcbmNvbnN0IGlzTG9hZGluZyA9IHJlcXVpcmUoXCJqcXVlcnktaXNsb2FkaW5nXCIpO1xyXG5pc0xvYWRpbmc7XHJcbmNsYXNzIEZvcm0ge1xyXG4gICAgY29uc3RydWN0b3IoZGF0YSwgdm0sIGVkaXRBY3Rpb24gPSAnRWRpdCcpIHtcclxuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xyXG4gICAgICAgIHRoaXMudm0gPSB2bTtcclxuICAgICAgICB0aGlzLmVkaXRBY3Rpb24gPSBlZGl0QWN0aW9uO1xyXG4gICAgICAgIHRoaXMuY29udHJvbGxlclVybCA9IGAvJHtkYXRhLlRpdGxlfWA7XHJcbiAgICAgICAgdGhpcy50YWJSb3dTZWxlY3RvciA9ICcubWFpbi1tb2RhbC1mb3JtIGZvcm0gPiAucm93JztcclxuICAgICAgICB0aGlzLmFyZWEgPSB0aGlzLmRhdGEuQXJlYSA/IGAvJHt0aGlzLmRhdGEuQXJlYX1gIDogJyc7XHJcbiAgICAgICAgdGhpcy5nZXRVcmwgPSBgJHt0aGlzLmFyZWF9LyR7ZGF0YS5UaXRsZX0vSXRlbWA7XHJcbiAgICAgICAgdGhpcy5wb3N0VXJsID0gYCR7dGhpcy5hcmVhfS8ke3RoaXMuZGF0YS5UaXRsZX0vJHt0aGlzLmVkaXRBY3Rpb259YDtcclxuICAgICAgICB0aGlzLnZtLklzTG9hZGluZy5zdWJzY3JpYmUoZnVuY3Rpb24gKG5ld1ZhbHVlKSB7XHJcbiAgICAgICAgICAgIGlmIChuZXdWYWx1ZSlcclxuICAgICAgICAgICAgICAgICQuaXNMb2FkaW5nKHsgJ3RleHQnOiAnTG9hZGluZy4uLicgfSk7XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICQuaXNMb2FkaW5nKCdoaWRlJyk7XHJcbiAgICAgICAgfSwgdGhpcyk7XHJcbiAgICAgICAgdGhpcy5zZXR1cEJpbmRpZ3MoKTtcclxuICAgICAgICB0aGlzLnNldHVwVGFicygpO1xyXG4gICAgfVxyXG4gICAgLy9wb3N0VXJsKCk6IHN0cmluZyB7XHJcbiAgICAvLyAgICByZXR1cm4gYCR7dGhpcy5hcmVhKCkgfS8ke3RoaXMuZGF0YS5UaXRsZX0vJHt0aGlzLmVkaXRBY3Rpb259YDtcclxuICAgIC8vfVxyXG4gICAgLy9hcmVhKCk6IHN0cmluZyB7XHJcbiAgICAvLyAgICByZXR1cm4gdGhpcy5kYXRhLkFyZWEgPyBgLyR7dGhpcy5kYXRhLkFyZWF9YCA6ICcnO1xyXG4gICAgLy99XHJcbiAgICBzZXR1cEJpbmRpZ3MoKSB7XHJcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIC8vdGFiIGNsaWNrIHNldHVwXHJcbiAgICAgICAgJCgnLm1vZGFsZm9ybS1ob2xkZXInKS5vbignY2xpY2snLCAnLmZvcm0tdGFiLW5hdicsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgLy9zZXQgY2xpY2tlZCBvbmUgdG8gYWN0aXZlXHJcbiAgICAgICAgICAgIHZhciBmb3JtVGFiID0ga28uZGF0YUZvcih0aGlzKTsgLy9sb2NhbCB0aGlzXHJcbiAgICAgICAgICAgIHZhciBpbmRleCA9IF8uaW5kZXhPZihzZWxmLnZtLkZvcm1UYWJzKCksIGZvcm1UYWIpO1xyXG4gICAgICAgICAgICBzZWxmLnZtLkFjdGl2ZVRhYkluZGV4KGluZGV4KTtcclxuICAgICAgICB9KTtcclxuICAgICAgICAkKCcubW9kYWxmb3JtLWhvbGRlcicpLm9uKCdjbGljaycsICcjc2F2ZScsICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5wb3N0KCk7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9KTtcclxuICAgICAgICAkKCcuaW5kZXhmb3JtLWhvbGRlcicpLm9uKCdjbGljaycsICcjc2F2ZScsICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5wb3N0SW5kZXgoKTtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgICQoJy5mb3JtLWJvZHknKS5vbignY2xpY2snLCAnI2NvbmZpcm0tZGVsZXRlJywgKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmNvbmZpcm1EZWxldGUoKTtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgc2V0dXBDbGVhclZhbGlkYXRpb24ocHJvcGVydHkpIHtcclxuICAgICAgICAvL2dldCBwcm9wZXJ0eSBvZmYgb2Ygdm0gdXNpbmcgc3RyaW5nIG5hbWUgY29taW5nIGZyb20gc2VydmVyXHJcbiAgICAgICAgdmFyIHZtUHJvcGVydHkgPSB0aGlzLmdldFZtUHJvcGVydHkocHJvcGVydHkpO1xyXG4gICAgICAgIGlmIChrby5pc09ic2VydmFibGUodm1Qcm9wZXJ0eSkpIHtcclxuICAgICAgICAgICAgdmFyIHN1YnNjcmlwdGlvbiA9IHZtUHJvcGVydHkuc3Vic2NyaWJlKChuZXdWYWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVFcnJvcihwcm9wZXJ0eSk7XHJcbiAgICAgICAgICAgICAgICAvL2dldCByaWQgb2Ygc3Vic2NyaXB0aW9uXHJcbiAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb24uZGlzcG9zZSgpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBjb25maXJtRGVsZXRlKCkge1xyXG4gICAgICAgIHRoaXMuZWRpdEFjdGlvbiA9ICdEZWxldGUnO1xyXG4gICAgICAgIHRoaXMucG9zdFVybCA9IGAke3RoaXMuYXJlYX0vJHt0aGlzLmRhdGEuVGl0bGV9LyR7dGhpcy5lZGl0QWN0aW9ufWA7XHJcbiAgICAgICAgdmFyIHByb21pc2UgPSB0aGlzLnBvc3QoKTtcclxuICAgICAgICBwcm9taXNlLmRvbmUoKCkgPT4ge1xyXG4gICAgICAgICAgICAkKCcjZGVsZXRlLW1vZGFsJykubW9kYWwoJ2hpZGUnKTtcclxuICAgICAgICAgICAgdGhpcy5lZGl0QWN0aW9uID0gJ0VkaXQnO1xyXG4gICAgICAgICAgICB0aGlzLnBvc3RVcmwgPSBgJHt0aGlzLmFyZWF9LyR7dGhpcy5kYXRhLlRpdGxlfS8ke3RoaXMuZWRpdEFjdGlvbn1gO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgLy9wb3N0VXJsKCkge1xyXG4gICAgLy8gICAgcmV0dXJuIGAke3RoaXMuYXJlYX0vJHt0aGlzLmRhdGEuVGl0bGV9LyR7dGhpcy5lZGl0QWN0aW9ufWA7XHJcbiAgICAvL31cclxuICAgIC8vYXJlYSgpIHtcclxuICAgIC8vICAgIHJldHVybiB0aGlzLmRhdGEuQXJlYSA/IGAvJHt0aGlzLmRhdGEuQXJlYX1gIDogJyc7XHJcbiAgICAvL31cclxuICAgIHJlbW92ZUVycm9yKHByb3BlcnR5KSB7XHJcbiAgICAgICAgLy9wcm9wZXJ0eSBpZCBoYXMgXyBpbnN0ZWFkIG9mIC5cclxuICAgICAgICB2YXIgZm9ybWlucHV0ID0gJCgnIycgKyBwcm9wZXJ0eS5yZXBsYWNlKC9cXC4vZywgJ18nKSk7XHJcbiAgICAgICAgJChcIiNlcnJvcl9tZXNzYWdlX1wiICsgcHJvcGVydHkucmVwbGFjZSgvXFwuL2csICdfJykpLmVtcHR5KCk7XHJcbiAgICAgICAgLy9zZWxlY3QyIHVzZXMgcGFyZW50XHJcbiAgICAgICAgaWYgKGZvcm1pbnB1dC5oYXNDbGFzcygnc2VsZWN0Mi1vZmZzY3JlZW4nKSkge1xyXG4gICAgICAgICAgICBmb3JtaW5wdXQgPSAkKCcuc2VsZWN0Mi1jb250YWluZXInLCBmb3JtaW5wdXQucGFyZW50KCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvL3JlbW92ZSBlcnJvciBjbGFzcyB0byBwYXJlbnQgZWxlbWVudFxyXG4gICAgICAgIHZhciBmb3JtR3JvdXAgPSBmb3JtaW5wdXQucGFyZW50KCk7XHJcbiAgICAgICAgZm9ybUdyb3VwLnJlbW92ZUNsYXNzKCdoYXMtZXJyb3IgaGFzLWZlZWRiYWNrJyk7XHJcbiAgICAgICAgLy9yZW1vdmUgYm9vdHNyYXAgcG9wb3ZlclxyXG4gICAgICAgIGlmICgoZm9ybWlucHV0KS5hdHRyKCdkYXRhLXRyaWdnZXInKSkge1xyXG4gICAgICAgICAgICBmb3JtaW5wdXRcclxuICAgICAgICAgICAgICAgIC5yZW1vdmVBdHRyKCdkYXRhLXRyaWdnZXInKVxyXG4gICAgICAgICAgICAgICAgLnJlbW92ZUF0dHIoJ2RhdGEtcGxhY2VtZW50JylcclxuICAgICAgICAgICAgICAgIC5yZW1vdmVBdHRyKCdkYXRhLWNvbnRlbnQnKVxyXG4gICAgICAgICAgICAgICAgLnBvcG92ZXIoJ2Rlc3Ryb3knKSAvL3RvZG8gYm9vdHN0cmFwIHBvcG92ZXJcclxuICAgICAgICAgICAgO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvL3JlbW92ZSBwb3BvdmVyIGVsZW1lbnRcclxuICAgICAgICAkKCcuZm9ybS1jb250cm9sLWZlZWRiYWNrJywgZm9ybUdyb3VwKS5yZW1vdmUoKTtcclxuICAgICAgICAvL2dldCByaWQgb2Ygc3Vic2NyaXB0aW9uXHJcbiAgICAgICAgLy9zdWJzY3JpcHRpb24uZGlzcG9zZSgpO1xyXG4gICAgICAgIC8vcmVmcmVzaCB0YWJzXHJcbiAgICAgICAgdGhpcy5yZWZyZXNoVGFiVmFsaWRhdGlvbkJhZGdlcygpO1xyXG4gICAgICAgIC8vaGFuZGxlIHNwYW4gZGlmZmVyZW50bHlcclxuICAgICAgICB2YXIgaXNTcGFuID0gZm9ybWlucHV0LmlzKCdzcGFuJyk7XHJcbiAgICAgICAgaWYgKGlzU3Bhbikge1xyXG4gICAgICAgICAgICBmb3JtaW5wdXQudGV4dCgnJyk7XHJcbiAgICAgICAgICAgIGZvcm1pbnB1dC5yZW1vdmVDbGFzcygnbGFiZWwgbGFiZWwtZGFuZ2VyJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vfSk7XHJcbiAgICB9XHJcbiAgICBnZXRWbVByb3BlcnR5KHByb3BlcnR5KSB7XHJcbiAgICAgICAgdmFyIHByb3BlcnR5UGFydHMgPSBwcm9wZXJ0eS5zcGxpdCgnLicpO1xyXG4gICAgICAgIHZhciB2bVByb3BlcnR5ID0gdGhpcy52bVtwcm9wZXJ0eVBhcnRzWzBdXVtwcm9wZXJ0eVBhcnRzWzFdXTtcclxuICAgICAgICByZXR1cm4gdm1Qcm9wZXJ0eTtcclxuICAgIH1cclxuICAgIHNldHVwVGFicygpIHtcclxuICAgICAgICAkKHRoaXMudGFiUm93U2VsZWN0b3IgKyAnIGgyJykuaGlkZSgpO1xyXG4gICAgICAgIC8vY3JlYXRlIGEga25vY2tvdXRvYnNlcnZhYmxlIGZvcmVhY2ggaDIgaW5zaWRlIGEgcm93XHJcbiAgICAgICAgJCh0aGlzLnRhYlJvd1NlbGVjdG9yICsgJyBoMicpLmVhY2goKGluZGV4LCB2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgZWxlbWVudCA9ICQodmFsdWUpO1xyXG4gICAgICAgICAgICB2YXIgYXR0ciA9ICd2aXNpYmxlOiAkcm9vdC5BY3RpdmVUYWJJbmRleCgpID09PSAnICsgaW5kZXgudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgJCh2YWx1ZSkucGFyZW50KCkucGFyZW50KCkuYXR0cignZGF0YS1iaW5kJywgYXR0cik7XHJcbiAgICAgICAgICAgIHRoaXMudm0uRm9ybVRhYnMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICBUZXh0OiBrby5vYnNlcnZhYmxlKGVsZW1lbnQuaHRtbCgpKSxcclxuICAgICAgICAgICAgICAgIEVycm9yQ291bnQ6IGtvLm9ic2VydmFibGUoMCksXHJcbiAgICAgICAgICAgICAgICBDaGFuZ2VDb3VudDoga28ub2JzZXJ2YWJsZSgwKSxcclxuICAgICAgICAgICAgICAgIEhpZGRlbjoga28ub2JzZXJ2YWJsZShmYWxzZSksXHJcbiAgICAgICAgICAgICAgICBJZDoga28ub2JzZXJ2YWJsZShudWxsKVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLnZtLkFjdGl2ZVRhYkluZGV4KDApO1xyXG4gICAgfVxyXG4gICAgZ2VuZXJhdGVOZXdDbGllbnRJZCgpIHtcclxuICAgICAgICByZXR1cm4gJ3h4eHh4eHh4LXh4eHgtNHh4eC15eHh4LXh4eHh4eHh4eHh4eCcucmVwbGFjZSgvW3h5XS9nLCBmdW5jdGlvbiAoYykgeyB2YXIgciA9IE1hdGgucmFuZG9tKCkgKiAxNiB8IDAsIHYgPSBjID09ICd4JyA/IHIgOiAociAmIDB4MyB8IDB4OCk7IHJldHVybiB2LnRvU3RyaW5nKDE2KTsgfSk7XHJcbiAgICB9XHJcbiAgICBhZGQoKSB7XHJcbiAgICAgICAgdGhpcy52bS5Jc0xvYWRpbmcodHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5yZXNldERldGFpbCgpO1xyXG4gICAgICAgIHRoaXMudm0uSXRlbURldGFpbElzTmV3KHRydWUpO1xyXG4gICAgICAgICQoJ2JvZHknKS5hZGRDbGFzcygnZm9ybS1zaG93bicpO1xyXG4gICAgICAgIHRoaXMudm0uRm9ybVZpc2libGUodHJ1ZSk7XHJcbiAgICAgICAgdGhpcy52bS5Jc0xvYWRpbmcoZmFsc2UpO1xyXG4gICAgfVxyXG4gICAgZGVsZXRlaXRlbShpZCkge1xyXG4gICAgICAgIHZhciBwcm9taXNlID0gdGhpcy5nZXREZXRhaWwoaWQpO1xyXG4gICAgICAgIHByb21pc2UuZG9uZSgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMudm0ucm91dGVzLnZpZXcoaWQpO1xyXG4gICAgICAgICAgICAkKCcjZGVsZXRlLW1vZGFsJykubW9kYWwoJ3Nob3cnKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gcHJvbWlzZTtcclxuICAgIH1cclxuICAgIGNhbmNlbCgpIHtcclxuICAgICAgICB0aGlzLnZtLkZvcm1WaXNpYmxlKGZhbHNlKTtcclxuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgJCgnYm9keScpLnJlbW92ZUNsYXNzKCdmb3JtLXNob3duJyk7XHJcbiAgICAgICAgfSwgMjUwKTtcclxuICAgIH1cclxuICAgIHBvc3QoKSB7XHJcbiAgICAgICAgLy9wcmV2ZW50IGRvdWJsZSBwb3N0XHJcbiAgICAgICAgaWYgKHRoaXMudm0uSXNMb2FkaW5nKCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvL21ha2Ugb3ZlcmxheSBsb2FkaW5nIGRpdiBmdWxsIGhlaWdodFxyXG4gICAgICAgICQoJyNsb2FkaW5nJykuaGVpZ2h0KCQod2luZG93KS5oZWlnaHQoKSk7XHJcbiAgICAgICAgdGhpcy52bS5Jc0xvYWRpbmcodHJ1ZSk7XHJcbiAgICAgICAgdmFyIGlnbm9yZU1hcHBpbmcgPSB7XHJcbiAgICAgICAgICAgICdpZ25vcmUnOiB0aGlzLmRhdGEuS09NYXBwaW5nLmFsbE5vblBvc3RCYWNrXHJcbiAgICAgICAgfTtcclxuICAgICAgICB2YXIgcG9zdERhdGEgPSBrby5tYXBwaW5nLnRvSlModGhpcy52bSwgaWdub3JlTWFwcGluZyk7XHJcbiAgICAgICAgZGVsZXRlIHBvc3REYXRhLkFsZXJ0cztcclxuICAgICAgICBkZWxldGUgcG9zdERhdGEuTmV3VmVyc2lvbjtcclxuICAgICAgICAkKFwiLmZvcm0tdmFsaWRhdGlvbi1lcnJvcnNcIikuaGlkZSgpO1xyXG4gICAgICAgIHZhciBwcm9taXNlID0gJC5hamF4KHtcclxuICAgICAgICAgICAgdXJsOiB0aGlzLnBvc3RVcmwudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpLFxyXG4gICAgICAgICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShwb3N0RGF0YSksXHJcbiAgICAgICAgICAgIHR5cGU6ICdQT1NUJyxcclxuICAgICAgICAgICAgY2FjaGU6IGZhbHNlLFxyXG4gICAgICAgICAgICBjb250ZW50VHlwZTogJ2FwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtOCcsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcHJvbWlzZS5mYWlsKChlcnJvcikgPT4gdGhpcy5wb3N0UHJvbWlzZUZhaWwoZXJyb3IpKTtcclxuICAgICAgICBwcm9taXNlLmRvbmUoZGF0YSA9PiB0aGlzLnBvc3RQcm9taXNlRG9uZShkYXRhKSk7XHJcbiAgICAgICAgcmV0dXJuIHByb21pc2U7XHJcbiAgICB9XHJcbiAgICBwb3N0SW5kZXgoKSB7XHJcbiAgICAgICAgLy9wcmV2ZW50IGRvdWJsZSBwb3N0XHJcbiAgICAgICAgaWYgKHRoaXMudm0uSXNMb2FkaW5nKCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvL21ha2Ugb3ZlcmxheSBsb2FkaW5nIGRpdiBmdWxsIGhlaWdodFxyXG4gICAgICAgICQoJyNsb2FkaW5nJykuaGVpZ2h0KCQod2luZG93KS5oZWlnaHQoKSk7XHJcbiAgICAgICAgdGhpcy52bS5Jc0xvYWRpbmcodHJ1ZSk7XHJcbiAgICAgICAgdmFyIGlnbm9yZU1hcHBpbmcgPSB7XHJcbiAgICAgICAgICAgICdpZ25vcmUnOiB0aGlzLmRhdGEuS09NYXBwaW5nLmFsbE5vblBvc3RCYWNrXHJcbiAgICAgICAgfTtcclxuICAgICAgICB2YXIgcG9zdERhdGEgPSBrby5tYXBwaW5nLnRvSlModGhpcy52bSwgaWdub3JlTWFwcGluZyk7XHJcbiAgICAgICAgZGVsZXRlIHBvc3REYXRhLkFsZXJ0cztcclxuICAgICAgICBkZWxldGUgcG9zdERhdGEuTmV3VmVyc2lvbjtcclxuICAgICAgICAkKFwiLmZvcm0tdmFsaWRhdGlvbi1lcnJvcnNcIikuaGlkZSgpO1xyXG4gICAgICAgIHZhciBwcm9taXNlID0gJC5hamF4KHtcclxuICAgICAgICAgICAgdXJsOiB0aGlzLnBvc3RVcmwudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpLFxyXG4gICAgICAgICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShwb3N0RGF0YSksXHJcbiAgICAgICAgICAgIHR5cGU6ICdQT1NUJyxcclxuICAgICAgICAgICAgY2FjaGU6IGZhbHNlLFxyXG4gICAgICAgICAgICBjb250ZW50VHlwZTogJ2FwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtOCcsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcHJvbWlzZS5mYWlsKChlcnJvcikgPT4gdGhpcy5wb3N0UHJvbWlzZUZhaWwoZXJyb3IpKTtcclxuICAgICAgICBwcm9taXNlLmRvbmUoZGF0YSA9PiB0aGlzLnBvc3RQcm9taXNlSW5kZXhEb25lKGRhdGEpKTtcclxuICAgICAgICByZXR1cm4gcHJvbWlzZTtcclxuICAgIH1cclxuICAgIGRlbGV0ZUl0ZW0oaWQpIHtcclxuICAgICAgICB0aGlzLmlzRGVsZXRpbmcgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMudm0ucm91dGVzLnZpZXcoaWQpOyAvLyBLaWNrcyBvZmYgYW4gaW1wbGllZCBnZXREZXRhaWwoKVxyXG4gICAgICAgIC8vdmFyIHByb21pc2UgPSB0aGlzLmdldERldGFpbChpZCk7XHJcbiAgICAgICAgLy9wcm9taXNlLmRvbmUoKCkgPT4ge1xyXG4gICAgICAgIC8vICAgIHRoaXMudm0ucm91dGVzLnZpZXcoaWQpO1xyXG4gICAgICAgIC8vICAgICQoJyNkZWxldGUtbW9kYWwnKS5tb2RhbCgnc2hvdycpO1xyXG4gICAgICAgIC8vICAgIHRoaXMuaXNNb2RhbFNob3dpbmcgPSB0cnVlO1xyXG4gICAgICAgIC8vfSk7XHJcbiAgICAgICAgLy9yZXR1cm4gcHJvbWlzZTtcclxuICAgIH1cclxuICAgIC8vY29uZmlybURlbGV0ZSgpIHtcclxuICAgIC8vICAgIHRoaXMuZWRpdEFjdGlvbiA9ICdEZWxldGUnO1xyXG4gICAgLy8gICAgdmFyIHByb21pc2UgPSB0aGlzLnBvc3QoKTtcclxuICAgIC8vICAgIHByb21pc2UuZG9uZSgoKSA9PiB7XHJcbiAgICAvLyAgICAgICAgdGhpcy5lZGl0QWN0aW9uID0gJ0VkaXQnO1xyXG4gICAgLy8gICAgfSk7XHJcbiAgICAvL31cclxuICAgIG1hcFBvc3REYXRhKGRhdGEpIHtcclxuICAgICAgICB2YXIgY29weU1hcHBpbmcgPSB7XHJcbiAgICAgICAgICAgICdjb3B5JzogdGhpcy5kYXRhLktPTWFwcGluZy5jb3B5XHJcbiAgICAgICAgfTtcclxuICAgICAgICBrby5tYXBwaW5nLmZyb21KUyhkYXRhLkl0ZW1EZXRhaWwsIGNvcHlNYXBwaW5nLCB0aGlzLnZtLkl0ZW1EZXRhaWwpO1xyXG4gICAgfVxyXG4gICAgYWRkUHJvcGVydHlFcnJvcihwcm9wZXJ0eUVycm9yKSB7XHJcbiAgICAgICAgdmFyIGtleSA9IHByb3BlcnR5RXJyb3IuS2V5LCBtZXNzYWdlID0gcHJvcGVydHlFcnJvci5FcnJvck1lc3NhZ2U7XHJcbiAgICAgICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkIHx8IGtleSA9PT0gbnVsbClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIC8vZmluZCBtYXRjaGluZyBpbnB1dFxyXG4gICAgICAgIHZhciBmb3JtaW5wdXQgPSAkKCcjJyArIGtleS5yZXBsYWNlKC9cXC4vZywgJ18nKSk7XHJcbiAgICAgICAgLy9zZWxlY3QyIG5lZWQgdG8gdXNlIHBhcmVudCBlbGVtZW50XHJcbiAgICAgICAgaWYgKGZvcm1pbnB1dC5oYXNDbGFzcygnc2VsZWN0Mi1vZmZzY3JlZW4nKSkge1xyXG4gICAgICAgICAgICBmb3JtaW5wdXQgPSAkKCcuc2VsZWN0Mi1jb250YWluZXInLCBmb3JtaW5wdXQucGFyZW50KCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmZvcm1JbnB1dEFkZEVycm9yKGZvcm1pbnB1dCwga2V5LCBtZXNzYWdlKTtcclxuICAgICAgICB2YXIgZXJyb3JNZXNzYWdlID0gJChcIiNlcnJvcl9tZXNzYWdlX1wiICsga2V5LnJlcGxhY2UoL1xcLi9nLCAnXycpKTtcclxuICAgICAgICB0aGlzLmZvcm1JbnB1dEFkZEVycm9yKGVycm9yTWVzc2FnZSwga2V5LCBtZXNzYWdlKTtcclxuICAgIH1cclxuICAgIC8vYWRkIGVycm9yIHN0YXRlIHRvIGRvbVxyXG4gICAgZm9ybUlucHV0QWRkRXJyb3IoZm9ybWlucHV0LCBrZXksIG1lc3NhZ2UpIHtcclxuICAgICAgICAvL3NlbGVjdDIgbmVlZCB0byB1c2UgcGFyZW50IGVsZW1lbnRcclxuICAgICAgICBpZiAoZm9ybWlucHV0Lmhhc0NsYXNzKCdzZWxlY3QyLW9mZnNjcmVlbicpKSB7XHJcbiAgICAgICAgICAgIGZvcm1pbnB1dCA9ICQoJy5zZWxlY3QyLWNvbnRhaW5lcicsIGZvcm1pbnB1dC5wYXJlbnQoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBpc1NwYW4gPSBmb3JtaW5wdXQuaXMoJ3NwYW4nKTtcclxuICAgICAgICB2YXIgZm9ybUVsZW1lbnRGb3VuZCA9IHRydWU7XHJcbiAgICAgICAgaWYgKGZvcm1pbnB1dC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHZhciBlbGVtZW50UGFyZW50ID0gZm9ybWlucHV0LnBhcmVudCgpO1xyXG4gICAgICAgICAgICBlbGVtZW50UGFyZW50LmFkZENsYXNzKCdoYXMtZXJyb3IgaGFzLWZlZWRiYWNrJyk7XHJcbiAgICAgICAgICAgIGlmICghaXNTcGFuKSB7XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50UGFyZW50LmFwcGVuZCgnPHNwYW4gY2xhc3M9XFwnZ2x5cGhpY29uIGdseXBoaWNvbi1yZW1vdmUgZm9ybS1jb250cm9sLWZlZWRiYWNrXFwnPjwvc3Bhbj4nKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGZvcm1pbnB1dC50ZXh0KG1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgZm9ybWlucHV0LmFkZENsYXNzKCdsYWJlbCBsYWJlbC1kYW5nZXInKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAobWVzc2FnZSAmJiAhaXNTcGFuKSB7XHJcbiAgICAgICAgICAgICAgICBmb3JtaW5wdXRcclxuICAgICAgICAgICAgICAgICAgICAuYXR0cignZGF0YS10cmlnZ2VyJywgJ2hvdmVyJylcclxuICAgICAgICAgICAgICAgICAgICAuYXR0cignZGF0YS1wbGFjZW1lbnQnLCAnYm90dG9tJylcclxuICAgICAgICAgICAgICAgICAgICAuYXR0cignZGF0YS1jb250ZW50JywgbWVzc2FnZSlcclxuICAgICAgICAgICAgICAgICAgICAucG9wb3ZlcigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghaXNTcGFuKVxyXG4gICAgICAgICAgICAgICAgZm9ybWlucHV0LmF0dHIoJ2FyaWEtaW52YWxpZCcsICd0cnVlJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBmb3JtRWxlbWVudEZvdW5kID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGlmIChtZXNzYWdlID09PSAnREJDb25jdXJyZW5jeUV4Y2VwdGlvbicpIHtcclxuICAgICAgICAgICAgICAgIC8vJChcIiNjb25mbGljdE1vZGFsXCIpLm1vZGFsKFwic2hvd1wiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vYWRkQWxlcnQobWVzc2FnZSwgXCJlcnJvclwiKTsgLy90b2RvIGZvcm0gY2xhc3MgbGV2ZWwgdmFsaWRhdGlvblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChmb3JtRWxlbWVudEZvdW5kKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0dXBDbGVhclZhbGlkYXRpb24oa2V5KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvL3JlbW92ZSBlcnJvciBzdGF0ZSBmcm9tIGRvblxyXG4gICAgZm9ybUlucHV0UmVtb3ZlRXJyb3IoZm9ybWlucHV0LCBrZXkpIHtcclxuICAgICAgICBpZiAoZm9ybWlucHV0Lmhhc0NsYXNzKCdzZWxlY3QyLW9mZnNjcmVlbicpKSB7XHJcbiAgICAgICAgICAgIGZvcm1pbnB1dCA9ICQoJy5zZWxlY3QyLWNvbnRhaW5lcicsIGZvcm1pbnB1dC5wYXJlbnQoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vcmVtb3ZlIGVycm9yIGNsYXNzIHRvIHBhcmVudCBlbGVtZW50XHJcbiAgICAgICAgdmFyIGZvcm1Hcm91cCA9IGZvcm1pbnB1dC5jbG9zZXN0KCcuZm9ybS1ncm91cCcpO1xyXG4gICAgICAgIGZvcm1Hcm91cC5yZW1vdmVDbGFzcygnaGFzLWVycm9yIGhhcy1mZWVkYmFjaycpO1xyXG4gICAgICAgIC8vcmVtb3ZlIGJvb3RzcmFwIHBvcG92ZXJcclxuICAgICAgICBpZiAoKGZvcm1pbnB1dCkuYXR0cignZGF0YS10cmlnZ2VyJykpIHtcclxuICAgICAgICAgICAgZm9ybWlucHV0XHJcbiAgICAgICAgICAgICAgICAucmVtb3ZlQXR0cignZGF0YS10cmlnZ2VyJylcclxuICAgICAgICAgICAgICAgIC5yZW1vdmVBdHRyKCdkYXRhLXBsYWNlbWVudCcpXHJcbiAgICAgICAgICAgICAgICAucmVtb3ZlQXR0cignZGF0YS1jb250ZW50JylcclxuICAgICAgICAgICAgICAgIC5wb3BvdmVyKCdkZXN0cm95JykgLy90b2RvIGJvb3RzdHJhcCBwb3BvdmVyXHJcbiAgICAgICAgICAgIDtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy9yZW1vdmUgcG9wb3ZlciBlbGVtZW50XHJcbiAgICAgICAgJCgnLmZvcm0tY29udHJvbC1mZWVkYmFjaycsIGZvcm1Hcm91cCkucmVtb3ZlKCk7XHJcbiAgICAgICAgLy9yZWZyZXNoIHRhYnNcclxuICAgICAgICB0aGlzLnJlZnJlc2hUYWJWYWxpZGF0aW9uQmFkZ2VzKCk7XHJcbiAgICAgICAgLy9oYW5kbGUgc3BhbiBkaWZmZXJlbnRseVxyXG4gICAgICAgIHZhciBpc1NwYW4gPSBmb3JtaW5wdXQuaXMoJ3NwYW4nKTtcclxuICAgICAgICBpZiAoaXNTcGFuKSB7XHJcbiAgICAgICAgICAgIGZvcm1pbnB1dC50ZXh0KCcnKTtcclxuICAgICAgICAgICAgZm9ybWlucHV0LnJlbW92ZUNsYXNzKCdsYWJlbCBsYWJlbC1kYW5nZXInKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvL3NldHVwIHRhYiB2YWxpZGF0aW9uIG5vdGljZVxyXG4gICAgcmVmcmVzaFRhYlZhbGlkYXRpb25CYWRnZXMoKSB7XHJcbiAgICAgICAgLy9maW5kIGVsZW1lbnRzIGluc2lkZSByb3cgdGhhdCBoYXZlIGhhcy1lcnJvciBjbGFzc1xyXG4gICAgICAgICQoJy5mb3JtLWhvbGRlciAucm93JykuZWFjaCgoaSwgdikgPT4ge1xyXG4gICAgICAgICAgICAvL2dldCB0aGUgbnVtYmVyIG9mIGVycm9ycyBvbiBpbiB0YWIgc2VjdGlvblxyXG4gICAgICAgICAgICB2YXIgZXJyb3JzID0gJCgnLmhhcy1lcnJvcicsIHYpLmxlbmd0aDtcclxuICAgICAgICAgICAgLy9maW5kIHRhYiBieSB0aXRsZSBhbmQgc2V0IGVycm9yIGNvdW50XHJcbiAgICAgICAgICAgIHZhciB0YWJUaXRsZSA9ICQoJ2gyJywgdikuaHRtbCgpO1xyXG4gICAgICAgICAgICB2YXIgbWF0Y2ggPSBrby51dGlscy5hcnJheUZpcnN0KHRoaXMudm0uRm9ybVRhYnMoKSwgaXRlbSA9PiAodGFiVGl0bGUgPT09IGl0ZW0uVGV4dCgpKSk7XHJcbiAgICAgICAgICAgIGlmIChtYXRjaCkge1xyXG4gICAgICAgICAgICAgICAgbWF0Y2guRXJyb3JDb3VudChlcnJvcnMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICAvL3Jlc2V0cyBpdGVtIGRldGFpbCBzbyB0aGF0IGl0IGxvb2tzIGxpa2UgYSBuZXcgaW5zZXJ0XHJcbiAgICByZXNldERldGFpbCgpIHtcclxuICAgICAgICAvLyQoJyNkZWxldGUtbW9kYWwnKS5tb2RhbCgnaGlkZScpO1xyXG4gICAgICAgIGtvLm1hcHBpbmcuZnJvbUpTKHRoaXMudm0uTmV3SXRlbURldGFpbCwge30sIHRoaXMudm0uSXRlbURldGFpbCk7XHJcbiAgICAgICAgLy90aGlzLnJlZnJlc2hUYWJWYWxpZGF0aW9uQmFkZ2VzKCk7XHJcbiAgICAgICAgXy5lYWNoKHRoaXMudm0uRm9ybVRhYnMoKSwgZnVuY3Rpb24gKHRhYikgeyB0YWIuRXJyb3JDb3VudCgwKTsgfSk7IC8vcmVzZXQgZXJyb3JzIHRvIDBcclxuICAgICAgICAkKCcubWFpbi1tb2RhbC1mb3JtIGZvcm0gPiAucm93JykuaGlkZSgpO1xyXG4gICAgICAgIHRoaXMudm0uQWN0aXZlVGFiSW5kZXgoMCk7XHJcbiAgICAgICAgJCgnLm1haW4tbW9kYWwtZm9ybSBmb3JtID4gLnJvdzplcSgwKScpLnNob3coKTtcclxuICAgIH1cclxuICAgIC8vcmVzZXRzIGl0ZW0gZGV0YWlsIHNvIHRoYXQgaXQgbG9va3MgbGlrZSBhIG5ldyBpbnNlcnRcclxuICAgIHJlc2V0RGV0YWlsSW5kZXgoKSB7XHJcbiAgICAgICAgLy8kKCcjZGVsZXRlLW1vZGFsJykubW9kYWwoJ2hpZGUnKTtcclxuICAgICAgICAvLyBrby5tYXBwaW5nLmZyb21KUyh0aGlzLnZtLk5ld0l0ZW1EZXRhaWwsIHt9LCB0aGlzLnZtLkl0ZW1EZXRhaWwpO1xyXG4gICAgICAgIC8vdGhpcy5yZWZyZXNoVGFiVmFsaWRhdGlvbkJhZGdlcygpO1xyXG4gICAgICAgIF8uZWFjaCh0aGlzLnZtLkZvcm1UYWJzKCksIGZ1bmN0aW9uICh0YWIpIHsgdGFiLkVycm9yQ291bnQoMCk7IH0pOyAvL3Jlc2V0IGVycm9ycyB0byAwXHJcbiAgICAgICAgJCgnLm1haW4tbW9kYWwtZm9ybSBmb3JtID4gLnJvdycpLmhpZGUoKTtcclxuICAgICAgICB0aGlzLnZtLkFjdGl2ZVRhYkluZGV4KDApO1xyXG4gICAgICAgICQoJy5tYWluLW1vZGFsLWZvcm0gZm9ybSA+IC5yb3c6ZXEoMCknKS5zaG93KCk7XHJcbiAgICB9XHJcbiAgICBnZXREZXRhaWwoaWQpIHtcclxuICAgICAgICB0aGlzLnJlc2V0RGV0YWlsKCk7XHJcbiAgICAgICAgLy8kKCcjbG9hZGluZycpLmhlaWdodCgkKHdpbmRvdykuaGVpZ2h0KCkpO1xyXG4gICAgICAgIHRoaXMudm0uSXNMb2FkaW5nKHRydWUpO1xyXG4gICAgICAgICQoJ2JvZHknKS5hZGRDbGFzcygnZm9ybS1zaG93bicpO1xyXG4gICAgICAgIHZhciBwcm9taXNlID0gJC5hamF4KHtcclxuICAgICAgICAgICAgdXJsOiB0aGlzLmdldFVybCxcclxuICAgICAgICAgICAgZGF0YTogeyBpZDogaWQgfSxcclxuICAgICAgICAgICAgdHlwZTogJ0dFVCcsXHJcbiAgICAgICAgICAgIGNhY2hlOiBmYWxzZSxcclxuICAgICAgICAgICAgY29udGVudFR5cGU6ICdhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTgnXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcHJvbWlzZS5mYWlsKChlcnJvcikgPT4gdGhpcy5nZXRQcm9taXNlRmFpbChlcnJvciwgaWQpKTtcclxuICAgICAgICBwcm9taXNlLmZhaWwoKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgIHZhciBodG1sID0gZXJyb3IuZXJyb3IoKS5yZXNwb25zZVRleHQ7XHJcbiAgICAgICAgICAgIHZhciBlbGVtZW50ID0gJCgnPGRpdi8+JykuaHRtbChodG1sKTtcclxuICAgICAgICAgICAgJCgnc3R5bGUnLCBlbGVtZW50KS5yZW1vdmUoKTtcclxuICAgICAgICAgICAgdmFyIGh0bWxUZXh0ID0gZWxlbWVudC5odG1sKCk7XHJcbiAgICAgICAgICAgIHRoaXMudm0uQWRkQWxlcnQoaHRtbFRleHQsICdhbGVydC1lcnJvcicpO1xyXG4gICAgICAgICAgICB0aGlzLnZtLklzTG9hZGluZyhmYWxzZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcHJvbWlzZS5kb25lKChkYXRhKSA9PiB0aGlzLmdldFByb21pc2VEb25lKGRhdGEsIGlkKSk7XHJcbiAgICAgICAgcmV0dXJuIHByb21pc2U7XHJcbiAgICB9XHJcbiAgICBrb21hcHBpbmdmcm9tZGF0YShkYXRhLCBpZCkge1xyXG4gICAgICAgIHZhciBjb3B5TWFwcGluZyA9IHtcclxuICAgICAgICAgICAgJ2NvcHknOiB0aGlzLmRhdGEuS09NYXBwaW5nLmFsbE5vblBvc3RCYWNrXHJcbiAgICAgICAgfTtcclxuICAgICAgICBrby5tYXBwaW5nLmZyb21KUyhkYXRhLkl0ZW1EZXRhaWwsIGNvcHlNYXBwaW5nLCB0aGlzLnZtLkl0ZW1EZXRhaWwpO1xyXG4gICAgfVxyXG4gICAgLy9wb3N0IGFqYXggZmFpbCQkXHJcbiAgICBwb3N0UHJvbWlzZUZhaWwoZXJyb3IpIHtcclxuICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzID09PSA0MDApIHtcclxuICAgICAgICAgICAgaWYgKGVycm9yLnJlc3BvbnNlSlNPTi5Nb2RlbFN0YXRlLlByb3BlcnR5RXJyb3JzLmxlbmd0aCA+IDApXHJcbiAgICAgICAgICAgICAgICAkKFwiLmZvcm0tdmFsaWRhdGlvbi1lcnJvcnNcIikuc2hvdygpO1xyXG4gICAgICAgICAgICBfLmVhY2goZXJyb3IucmVzcG9uc2VKU09OLk1vZGVsU3RhdGUuUHJvcGVydHlFcnJvcnMsIChwcm9wZXJ0eUVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFkZFByb3BlcnR5RXJyb3IocHJvcGVydHlFcnJvcik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBfLmVhY2goZXJyb3IucmVzcG9uc2VKU09OLk1vZGVsU3RhdGUuTW9kZWxFcnJvcnMsICh2KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAvLyBhZGRBbGVydCh2LkVycm9yTWVzc2FnZSwgJ2Vycm9yJyk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hUYWJWYWxpZGF0aW9uQmFkZ2VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGVycm9yLnN0YXR1cyA9PT0gNDIyKSB7XHJcbiAgICAgICAgICAgIC8vIEZhaWxlZCBjYXB0Y2hhXHJcbiAgICAgICAgICAgIGFsZXJ0KFwiWW91ciByZXF1ZXN0IGFwcGVhcnMgdG8gYmUgaW52YWxpZC4gUGxlYXNlIHRyeSBhZ2Fpbi5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoZXJyb3IucmVzcG9uc2VKU09OKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IucmVzcG9uc2VKU09OLk1lc3NhZ2UpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnZtLkFkZEFsZXJ0KGVycm9yLnJlc3BvbnNlSlNPTi5NZXNzYWdlLCAnZXJyb3InKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBodG1sID0gZXJyb3IuZXJyb3IoKS5yZXNwb25zZVRleHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSAkKCc8ZGl2Lz4nKS5odG1sKGh0bWwpO1xyXG4gICAgICAgICAgICAgICAgICAgICQoJ3N0eWxlJywgZWxlbWVudCkucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGh0bWxUZXh0ID0gZWxlbWVudC5odG1sKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52bS5BZGRBbGVydChodG1sVGV4dCwgJ2Vycm9yJyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgaHRtbDIgPSBlcnJvci5lcnJvcigpLnJlc3BvbnNlVGV4dDtcclxuICAgICAgICAgICAgICAgIHZhciBlbGVtZW50MiA9ICQoJzxkaXYvPicpLmh0bWwoaHRtbDIpO1xyXG4gICAgICAgICAgICAgICAgJCgnc3R5bGUnLCBlbGVtZW50MikucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgICAgICB2YXIgaHRtbFRleHQyID0gZWxlbWVudDIuaHRtbCgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy52bS5BZGRBbGVydChodG1sVGV4dDIsICdlcnJvcicpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMudm0uSXNMb2FkaW5nKGZhbHNlKTtcclxuICAgIH1cclxuICAgIC8vcG9zdCBhamF4IHN1Y2Nlc3NcclxuICAgIHBvc3RQcm9taXNlRG9uZShkYXRhKSB7XHJcbiAgICAgICAgdGhpcy5tYXBQb3N0RGF0YShkYXRhKTtcclxuICAgICAgICBpZiAoIXRoaXMudm0uTGVhdmVPcGVuT25BamF4U3VjY2VzcygpKSB7XHJcbiAgICAgICAgICAgIHRoaXMudm0ucm91dGVzLmdvQmFjaygpO1xyXG4gICAgICAgICAgICB0aGlzLnJlc2V0RGV0YWlsKCk7XHJcbiAgICAgICAgICAgIHRoaXMudm0uQWRkQWxlcnQoZGF0YS5NZXNzYWdlLCAnc3VjY2VzcycpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnZtLklzTG9hZGluZyhmYWxzZSk7XHJcbiAgICB9XHJcbiAgICAvL3Bvc3QgYWpheCBzdWNjZXNzXHJcbiAgICBwb3N0UHJvbWlzZUluZGV4RG9uZShkYXRhKSB7XHJcbiAgICAgICAgdGhpcy5tYXBQb3N0RGF0YShkYXRhKTtcclxuICAgICAgICBpZiAoIXRoaXMudm0uTGVhdmVPcGVuT25BamF4U3VjY2VzcygpKSB7XHJcbiAgICAgICAgICAgIHRoaXMudm0ucm91dGVzLmdvQmFjaygpO1xyXG4gICAgICAgICAgICB0aGlzLnJlc2V0RGV0YWlsSW5kZXgoKTtcclxuICAgICAgICAgICAgdGhpcy52bS5BZGRBbGVydChkYXRhLk1lc3NhZ2UsICdzdWNjZXNzJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMudm0uSXNMb2FkaW5nKGZhbHNlKTtcclxuICAgIH1cclxuICAgIC8vZ2V0IGFqYXggZmFpbFxyXG4gICAgZ2V0UHJvbWlzZUZhaWwoZXJyb3IsIGlkKSB7XHJcbiAgICAgICAgdmFyIGh0bWwgPSBlcnJvci5lcnJvcigpLnJlc3BvbnNlVGV4dDtcclxuICAgICAgICB2YXIgZWxlbWVudCA9ICQoJzxkaXYvPicpLmh0bWwoaHRtbCk7XHJcbiAgICAgICAgJCgnc3R5bGUnLCBlbGVtZW50KS5yZW1vdmUoKTtcclxuICAgICAgICB2YXIgaHRtbFRleHQgPSBlbGVtZW50Lmh0bWwoKTtcclxuICAgICAgICB0aGlzLnZtLkFkZEFsZXJ0KGh0bWxUZXh0LCAnYWxlcnQtZXJyb3InKTtcclxuICAgICAgICB0aGlzLnZtLklzTG9hZGluZyhmYWxzZSk7XHJcbiAgICB9XHJcbiAgICAvL2dldCBhamF4IHN1Y2Nlc3NcclxuICAgIGdldFByb21pc2VEb25lKGRhdGEsIGlkKSB7XHJcbiAgICAgICAgaWYgKGRhdGEubGVuZ3RoID09PSAwIHx8IGRhdGEgPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gJy9BZG1pbi9BdXRoZW50aWNhdGlvbi9Mb2dpbic7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMudm0uSXRlbURldGFpbElzTmV3KGZhbHNlKTtcclxuICAgICAgICB0aGlzLmtvbWFwcGluZ2Zyb21kYXRhKGRhdGEsIGlkKTtcclxuICAgICAgICB0aGlzLnZtLnJvdXRlcy52aWV3KGlkKTtcclxuICAgICAgICB0aGlzLnZtLklzTG9hZGluZyhmYWxzZSk7XHJcbiAgICAgICAgdGhpcy52bS5Gb3JtVmlzaWJsZSh0cnVlKTtcclxuICAgICAgICBpZiAodGhpcy5pc0RlbGV0aW5nKSB7XHJcbiAgICAgICAgICAgICQoJyNkZWxldGUtbW9kYWwnKS5tb2RhbCgnc2hvdycpO1xyXG4gICAgICAgICAgICB0aGlzLmlzTW9kYWxTaG93aW5nID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxubW9kdWxlLmV4cG9ydHMgPSBGb3JtO1xyXG4iLCJcInVzZSBzdHJpY3RcIjtcclxuY29uc3Qga28gPSByZXF1aXJlKFwia25vY2tvdXRcIik7XHJcbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xyXG5jbGFzcyBLb0JpbmRpbmdFeHRlbnNpb25zIHtcclxuICAgIHJlZ2lzdGVyKCkge1xyXG4gICAgICAgIGtvLmJpbmRpbmdIYW5kbGVycy5oaWRkZW4gPSB7XHJcbiAgICAgICAgICAgIHVwZGF0ZShlbGVtZW50LCB2YWx1ZUFjY2Vzc29yLCBhbGxCaW5kaW5nc0FjY2Vzc29yLCB2aWV3TW9kZWwsIGJpbmRpbmdDb250ZXh0KSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKHZhbHVlQWNjZXNzb3IoKSk7XHJcbiAgICAgICAgICAgICAgICBrby5iaW5kaW5nSGFuZGxlcnMudmlzaWJsZS51cGRhdGUoZWxlbWVudCwgKCkgPT4gKCF2YWx1ZSksIGFsbEJpbmRpbmdzQWNjZXNzb3IsIHZpZXdNb2RlbCwgYmluZGluZ0NvbnRleHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgICAgICBrby5iaW5kaW5nSGFuZGxlcnMuc2xpZGVJblZpc2libGUgPSB7XHJcbiAgICAgICAgICAgIGluaXQoZWxlbWVudCwgdmFsdWVBY2Nlc3Nvcikge1xyXG4gICAgICAgICAgICAgICAgLy8gSW5pdGlhbGx5IHNldCB0aGUgZWxlbWVudCB0byBiZSBpbnN0YW50bHkgdmlzaWJsZS9oaWRkZW4gZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZVxyXG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gdmFsdWVBY2Nlc3NvcigpO1xyXG4gICAgICAgICAgICAgICAgJChlbGVtZW50KS50b2dnbGUoa28udW53cmFwKHZhbHVlKSk7IC8vIFVzZSBcInVud3JhcE9ic2VydmFibGVcIiBzbyB3ZSBjYW4gaGFuZGxlIHZhbHVlcyB0aGF0IG1heSBvciBtYXkgbm90IGJlIG9ic2VydmFibGVcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgdXBkYXRlKGVsZW1lbnQsIHZhbHVlQWNjZXNzb3IpIHtcclxuICAgICAgICAgICAgICAgIC8vIFdoZW5ldmVyIHRoZSB2YWx1ZSBzdWJzZXF1ZW50bHkgY2hhbmdlcywgc2xvd2x5IGZhZGUgdGhlIGVsZW1lbnQgaW4gb3Igb3V0XHJcbiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSB2YWx1ZUFjY2Vzc29yKCk7XHJcbiAgICAgICAgICAgICAgICB2YXIganF1ZXJ5RWxlbWVudCA9ICQoZWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoa28udW53cmFwKHZhbHVlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vc2Nyb2xsIGJyb3dzZXIgdG8gdG9wIHRvIG1ha2Ugc3VyZSBmb3JtIGlzIGluIHZpZXdcclxuICAgICAgICAgICAgICAgICAgICAkKCdib2R5JylcclxuICAgICAgICAgICAgICAgICAgICAgICAgLmFuaW1hdGUoeyBzY3JvbGxUb3A6IDAgfSwgJzI1MCcsICdzd2luZycpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vaGlkZVxyXG4gICAgICAgICAgICAgICAgICAgIC8vcG9zaXRpb24gb2ZmIHNjcmVlbiBcclxuICAgICAgICAgICAgICAgICAgICAvL3Nob3dcclxuICAgICAgICAgICAgICAgICAgICAvL3NsaWRlIGludG8gcG9zaXRpb25cclxuICAgICAgICAgICAgICAgICAgICBqcXVlcnlFbGVtZW50XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5oaWRlKClcclxuICAgICAgICAgICAgICAgICAgICAgICAgLmFuaW1hdGUoeyBsZWZ0OiAtMzAwMCB9LCAxLCAnbGluZWFyJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLnNob3coKTsgLy9sb2NhbCB0aGlzXHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgLmFuaW1hdGUoeyBsZWZ0OiAwIH0sIDI1MCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvL3NsaWRlIG9mZiBzY3JlZW5cclxuICAgICAgICAgICAgICAgICAgICAvL2hpZGVcclxuICAgICAgICAgICAgICAgICAgICAvL3Jlc2V0IHRvIDAgcG9zaXRpb25cclxuICAgICAgICAgICAgICAgICAgICBqcXVlcnlFbGVtZW50XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5hbmltYXRlKHsgbGVmdDogLTMwMDAgfSwgNTAwLCAnbGluZWFyJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmhpZGUoKS5jc3MoJ2xlZnQnLCAnMCcpOyAvL2xvY2FsIHRoaXNcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICA7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICAgIGtvLmJpbmRpbmdIYW5kbGVycy5zbGlkZUFsZXJ0ID0ge1xyXG4gICAgICAgICAgICBpbml0KGVsZW1lbnQsIHZhbHVlQWNjZXNzb3IsIGFsbEJpbmRpbmdzLCB2aWV3TW9kZWwsIGJpbmRpbmdDb250ZXh0KSB7XHJcbiAgICAgICAgICAgICAgICAkKGVsZW1lbnQpLnNsaWRlRG93big0MDApO1xyXG4gICAgICAgICAgICAgICAgLy9hdXRvIHJlbW92ZSBzdWNjZXNzIG1lc3NhZ2VzIGFmdGVyIDMgc2Vjb25kc1xyXG4gICAgICAgICAgICAgICAgaWYgKHZpZXdNb2RlbC5UeXBlID09PSAnYWxlcnQtc3VjY2VzcycpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJChlbGVtZW50KS5zbGlkZVVwKDQwMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRpbmdDb250ZXh0LiRyb290LkFsZXJ0cy5yZW1vdmUodmlld01vZGVsKTtcclxuICAgICAgICAgICAgICAgICAgICB9LCAzMDAwKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgICAga28uYmluZGluZ0hhbmRsZXJzLmhyZWYgPSB7XHJcbiAgICAgICAgICAgIHVwZGF0ZShlbGVtZW50LCB2YWx1ZUFjY2Vzc29yLCBhbGxCaW5kaW5ncywgdmlld01vZGVsLCBiaW5kaW5nQ29udGV4dCkge1xyXG4gICAgICAgICAgICAgICAga28uYmluZGluZ0hhbmRsZXJzLmF0dHIudXBkYXRlKGVsZW1lbnQsICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBocmVmOiB2YWx1ZUFjY2Vzc29yKCkgfTtcclxuICAgICAgICAgICAgICAgIH0sIGFsbEJpbmRpbmdzLCB2aWV3TW9kZWwsIGJpbmRpbmdDb250ZXh0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgICAga28uYmluZGluZ0hhbmRsZXJzLmRhdGV0aW1lID0ge1xyXG4gICAgICAgICAgICB1cGRhdGU6IGZ1bmN0aW9uIChlbGVtZW50LCB2YWx1ZUFjY2Vzc29yLCBhbGxCaW5kaW5nc0FjY2Vzc29yLCB2aWV3TW9kZWwpIHtcclxuICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHZhbHVlQWNjZXNzb3IoKTtcclxuICAgICAgICAgICAgICAgIHZhciBhbGxCaW5kaW5ncyA9IGFsbEJpbmRpbmdzQWNjZXNzb3IoKTtcclxuICAgICAgICAgICAgICAgIHZhciB2YWx1ZVVud3JhcHBlZCA9IGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUodmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgLy8gRGF0ZSBmb3JtYXRzOiBodHRwOi8vbW9tZW50anMuY29tL2RvY3MvIy9kaXNwbGF5aW5nL2Zvcm1hdC9cclxuICAgICAgICAgICAgICAgIHZhciBlbGVtZW50Rm9ybWF0ID0gJChlbGVtZW50KS5hdHRyKCdkYXRhLWZvcm1hdCcpO1xyXG4gICAgICAgICAgICAgICAgdmFyIHBhdHRlcm4gPSBlbGVtZW50Rm9ybWF0IHx8IGFsbEJpbmRpbmdzLmZvcm1hdCB8fCAnTU0vREQvWVlZWSc7XHJcbiAgICAgICAgICAgICAgICB2YXIgb3V0cHV0ID0gJyc7XHJcbiAgICAgICAgICAgICAgICBpZiAodmFsdWVVbndyYXBwZWQgIT09IG51bGwgJiYgdmFsdWVVbndyYXBwZWQgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZVVud3JhcHBlZC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlVW53cmFwcGVkLmluZGV4T2YoJ1onKSA9PSB2YWx1ZVVud3JhcHBlZC5sZW5ndGggLSAxKSB7IC8vYnkgZGVmYXVsdCBtb21lbnRqcyBjb252ZXJ0cyBVVEMgdG8gbG9jYWwgYW5kIHdlIHdhbnQgaXQgdG8gc3RheSBVVEMgaWYgc2VsZWN0ZWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gbW9tZW50LnV0Yyh2YWx1ZVVud3JhcHBlZCkuZm9ybWF0KHBhdHRlcm4pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gbW9tZW50KHZhbHVlVW53cmFwcGVkKS5mb3JtYXQocGF0dGVybik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKCQoZWxlbWVudCkuaXMoJ2lucHV0JykgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAkKGVsZW1lbnQpLnZhbChvdXRwdXQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgJChlbGVtZW50KS50ZXh0KG91dHB1dCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICAgIGtvLmJpbmRpbmdIYW5kbGVycy50aW1lID0ge1xyXG4gICAgICAgICAgICB1cGRhdGU6IGZ1bmN0aW9uIChlbGVtZW50LCB2YWx1ZUFjY2Vzc29yLCBhbGxCaW5kaW5nc0FjY2Vzc29yLCB2aWV3TW9kZWwpIHtcclxuICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHZhbHVlQWNjZXNzb3IoKTtcclxuICAgICAgICAgICAgICAgIHZhciBhbGxCaW5kaW5ncyA9IGFsbEJpbmRpbmdzQWNjZXNzb3IoKTtcclxuICAgICAgICAgICAgICAgIHZhciB2YWx1ZVVud3JhcHBlZCA9IGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUodmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgLy8gRGF0ZSBmb3JtYXRzOiBodHRwOi8vbW9tZW50anMuY29tL2RvY3MvIy9kaXNwbGF5aW5nL2Zvcm1hdC9cclxuICAgICAgICAgICAgICAgIHZhciBlbGVtZW50Rm9ybWF0ID0gJChlbGVtZW50KS5hdHRyKCdkYXRhLWZvcm1hdCcpO1xyXG4gICAgICAgICAgICAgICAgdmFyIHBhdHRlcm4gPSBlbGVtZW50Rm9ybWF0IHx8IGFsbEJpbmRpbmdzLmZvcm1hdCB8fCAnSDptbSBhJztcclxuICAgICAgICAgICAgICAgIHZhciBvdXRwdXQgPSAnJztcclxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZVVud3JhcHBlZCAhPT0gbnVsbCAmJiB2YWx1ZVVud3JhcHBlZCAhPT0gdW5kZWZpbmVkICYmIHZhbHVlVW53cmFwcGVkLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWVVbndyYXBwZWQuaW5kZXhPZignWicpID09IHZhbHVlVW53cmFwcGVkLmxlbmd0aCAtIDEpIHsgLy9ieSBkZWZhdWx0IG1vbWVudGpzIGNvbnZlcnRzIFVUQyB0byBsb2NhbCBhbmQgd2Ugd2FudCBpdCB0byBzdGF5IFVUQyBpZiBzZWxlY3RlZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSBtb21lbnQudXRjKHZhbHVlVW53cmFwcGVkKS5mb3JtYXQocGF0dGVybik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSBtb21lbnQodmFsdWVVbndyYXBwZWQpLmZvcm1hdChwYXR0ZXJuKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoJChlbGVtZW50KS5pcygnaW5wdXQnKSA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICQoZWxlbWVudCkudmFsKG91dHB1dCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAkKGVsZW1lbnQpLnRleHQob3V0cHV0KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgICAga28uYmluZGluZ0hhbmRsZXJzLnN1bW1lcm5vdGUgPSB7XHJcbiAgICAgICAgICAgIGluaXQoZWxlbWVudCwgdmFsdWVBY2Nlc3NvciwgYWxsQmluZGluZ3MsIHZpZXdNb2RlbCwgYmluZGluZ0NvbnRleHQpIHtcclxuICAgICAgICAgICAgICAgIHZhciB2YWx1ZUJpbmRpbmcgPSB2YWx1ZUFjY2Vzc29yKCk7XHJcbiAgICAgICAgICAgICAgICB2YXIgJGVsZW1lbnQgPSAkKGVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgdmFyIHVwZGF0ZU9ic2VydmFibGUgPSAoKSA9PiB2aWV3TW9kZWxbdmFsdWVCaW5kaW5nXSgkZWxlbWVudC5jb2RlKCkpO1xyXG4gICAgICAgICAgICAgICAgJGVsZW1lbnQuc3VtbWVybm90ZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiA2MDAsXHJcbiAgICAgICAgICAgICAgICAgICAgb25ibHVyOiB1cGRhdGVPYnNlcnZhYmxlXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICRlbGVtZW50LmNvZGUodmlld01vZGVsW3ZhbHVlQmluZGluZ10oKSk7XHJcbiAgICAgICAgICAgICAgICAvLyByZXBsYWNlIHNjcmlwdCB0YWdzIHNvIHRoZXkncmUgbm90IGV4ZWN1dGVkIHdoZW4gbG9hZGVkIGluIGFkbWluXHJcbiAgICAgICAgICAgICAgICB2YXIgY29kZVRvUmVwbGFjZSA9ICRlbGVtZW50LmNvZGUoKTtcclxuICAgICAgICAgICAgICAgIGNvZGVUb1JlcGxhY2UgPSBjb2RlVG9SZXBsYWNlLnJlcGxhY2UoJzxzY3JpcHQnLCAnPCEtLTxzY3JpcHQnKTtcclxuICAgICAgICAgICAgICAgIGNvZGVUb1JlcGxhY2UgPSBjb2RlVG9SZXBsYWNlLnJlcGxhY2UoJzwvc2NyaXB0PicsICc8L3NjcmlwdD4tLT4nKTtcclxuICAgICAgICAgICAgICAgICRlbGVtZW50LmNvZGUoY29kZVRvUmVwbGFjZSk7XHJcbiAgICAgICAgICAgICAgICB2aWV3TW9kZWxbdmFsdWVCaW5kaW5nXS5zdWJzY3JpYmUobmV3VmFsdWUgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICRlbGVtZW50LmNvZGUodmlld01vZGVsW3ZhbHVlQmluZGluZ10oKSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbn1cclxubW9kdWxlLmV4cG9ydHMgPSBLb0JpbmRpbmdFeHRlbnNpb25zO1xyXG4iLCJcInVzZSBzdHJpY3RcIjtcclxuY29uc3Qga28gPSByZXF1aXJlKFwia25vY2tvdXRcIik7XHJcbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xyXG5jb25zdCBzZWxlY3QyID0gcmVxdWlyZShcInNlbGVjdDJcIik7XHJcbmNvbnN0IF8gPSByZXF1aXJlKFwidW5kZXJzY29yZVwiKTtcclxuJFsnc2VsZWN0MiddID0gc2VsZWN0MjtcclxuY2xhc3MgS29CaW5kaW5nU2VsZWN0MiB7XHJcbiAgICBhZGRCaW5kaW5nKCkgeyBrby5iaW5kaW5nSGFuZGxlcnMuc2VsZWN0MmhlbHBlciA9IHRoaXM7IH1cclxuICAgIGluaXQoZWxlbWVudCwgdmFsdWVBY2Nlc3NvciwgYWxsQmluZGluZ3MsIHZpZXdNb2RlbCwgYmluZGluZ0NvbnRleHQpIHtcclxuICAgICAgICAvKkluaXRhbCBTZXR1cCovXHJcbiAgICAgICAga28udXRpbHMuZG9tTm9kZURpc3Bvc2FsLmFkZERpc3Bvc2VDYWxsYmFjayhlbGVtZW50LCAoKSA9PiB7XHJcbiAgICAgICAgICAgICQoZWxlbWVudCkuc2VsZWN0MignZGVzdHJveScpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHZhciBib3VuZE9ic2VydmFibGUgPSB2YWx1ZUFjY2Vzc29yKCk7XHJcbiAgICAgICAgdmFyIGlzQm91bmRUb0FycmF5ID0gS29CaW5kaW5nU2VsZWN0Mi5pc09ic2VydmFibGVBcnJheShib3VuZE9ic2VydmFibGUpO1xyXG4gICAgICAgIHZhciBzZWxlY3QySGVscGVyU291cmNlTmFtZSA9IGFsbEJpbmRpbmdzKCkuc2VsZWN0MkhlbHBlclNvdXJjZU5hbWU7XHJcbiAgICAgICAgdmFyIG9EYXRhQWpheFNvdXJjZSA9IGFsbEJpbmRpbmdzKCkuc2VsZWN0MkhlbHBlck9EYXRhQWpheFNvdXJjZTtcclxuICAgICAgICB2YXIgaXNSZWZlcmVuY2VUeXBlID0gYWxsQmluZGluZ3MoKS5zZWxlY3QySGVscGVyUmVmZXJlbmNlO1xyXG4gICAgICAgIHZhciBjdXN0b21TZWxlY3Rpb25Gb3JtYXQgPSBhbGxCaW5kaW5ncygpLnNlbGVjdDJIZWxwZXJGb3JtYXRTZWxlY3Rpb247XHJcbiAgICAgICAgdmFyIGN1c3RvbVJlc3VsdEZvcm1hdCA9IGFsbEJpbmRpbmdzKCkuc2VsZWN0MkhlbHBlckZvcm1hdFJlc3VsdDtcclxuICAgICAgICB2YXIgcGxhY2Vob2xkZXJUZXh0ID0gYWxsQmluZGluZ3MoKS5zZWxlY3QyUGxhY2Vob2xkZXJUZXh0O1xyXG4gICAgICAgIHZhciBhbGxvd0NsZWFyID0gYWxsQmluZGluZ3MoKS5zZWxlY3QyQWxsb3dDbGVhcjtcclxuICAgICAgICB2YXIgb0RhdGFTb3J0ID0gYWxsQmluZGluZ3MoKS5zZWxlY3QySGVscGVyT0RhdGFTb3J0O1xyXG4gICAgICAgIHZhciBvcHRpb25zU3VwcGxpZWQgPSB0cnVlO1xyXG4gICAgICAgIC8vc2VsZWN0MiBvcHRpb25zXHJcbiAgICAgICAgdmFyIGRhdGEgPSB7fTtcclxuICAgICAgICBkYXRhLmZvcm1hdFNlbGVjdGlvbiA9IGN1c3RvbVNlbGVjdGlvbkZvcm1hdCA/IEtvQmluZGluZ1NlbGVjdDIuZ2V0TmVzdGVkUHJvcGVydHkoY3VzdG9tU2VsZWN0aW9uRm9ybWF0LCBiaW5kaW5nQ29udGV4dC4kcm9vdCkgOiBLb0JpbmRpbmdTZWxlY3QyLmZvcm1hdFNlbGVjdGlvbjtcclxuICAgICAgICBkYXRhLmZvcm1hdFJlc3VsdCA9IGN1c3RvbVJlc3VsdEZvcm1hdCA/IEtvQmluZGluZ1NlbGVjdDIuZ2V0TmVzdGVkUHJvcGVydHkoY3VzdG9tUmVzdWx0Rm9ybWF0LCBiaW5kaW5nQ29udGV4dC4kcm9vdCkgOiBLb0JpbmRpbmdTZWxlY3QyLmZvcm1hdFJlc3VsdDtcclxuICAgICAgICBkYXRhLmlkID0gS29CaW5kaW5nU2VsZWN0Mi5mb3JtYXRJZDtcclxuICAgICAgICBkYXRhLm1hdGNoZXIgPSBLb0JpbmRpbmdTZWxlY3QyLm1hdGNoZXI7XHJcbiAgICAgICAgZGF0YS5tdWx0aXBsZSA9IGlzQm91bmRUb0FycmF5O1xyXG4gICAgICAgIGRhdGEuZHJvcGRvd25BdXRvV2lkdGggPSB0cnVlO1xyXG4gICAgICAgIGRhdGEucGxhY2Vob2xkZXIgPSBwbGFjZWhvbGRlclRleHQgPyBwbGFjZWhvbGRlclRleHQgOiAnJztcclxuICAgICAgICBkYXRhLmFsbG93Q2xlYXIgPSBhbGxvd0NsZWFyID8gYWxsb3dDbGVhciA6IHRydWU7XHJcbiAgICAgICAgdmFyIGluaXRWYWx1ZSA9IG51bGw7XHJcbiAgICAgICAgaWYgKCFpc0JvdW5kVG9BcnJheSkge1xyXG4gICAgICAgICAgICBpZiAoaXNSZWZlcmVuY2VUeXBlKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBrby50b0pTKGJvdW5kT2JzZXJ2YWJsZSk7XHJcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUpXHJcbiAgICAgICAgICAgICAgICAgICAgaW5pdFZhbHVlID0gdmFsdWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpbml0VmFsdWUgPSBrby50b0pTKGJvdW5kT2JzZXJ2YWJsZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy9zZXR1cCBzb3VyY2UgZm9yIG9wdGlvbnNcclxuICAgICAgICBpZiAoc2VsZWN0MkhlbHBlclNvdXJjZU5hbWUpIHsgLy91c2luZyBhcnJheSBvbiB2aWV3IG1vZGVsXHJcbiAgICAgICAgICAgIHZhciBzb3VyY2VMaXN0ID0gS29CaW5kaW5nU2VsZWN0Mi5nZXROZXN0ZWRQcm9wZXJ0eShzZWxlY3QySGVscGVyU291cmNlTmFtZSwgYmluZGluZ0NvbnRleHQuJHJvb3QpO1xyXG4gICAgICAgICAgICBkYXRhLmRhdGEgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyByZXN1bHRzOiBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKHNvdXJjZUxpc3QpIH07XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKG9EYXRhQWpheFNvdXJjZSkgeyAvL3VzaW5nIGFqYXhcclxuICAgICAgICAgICAgZGF0YS5pbml0U2VsZWN0aW9uID0gKGVsZW1lbnQsIGNhbGxiYWNrKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhrby50b0pTKGJvdW5kT2JzZXJ2YWJsZSkpO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB2YXIgcGFnZVNpemUgPSAzMDtcclxuICAgICAgICAgICAgZGF0YS5hamF4ID0ge1xyXG4gICAgICAgICAgICAgICAgdXJsOiBvRGF0YUFqYXhTb3VyY2UsXHJcbiAgICAgICAgICAgICAgICBkYXRhVHlwZTogJ2pzb24nLFxyXG4gICAgICAgICAgICAgICAgZGF0YSh0ZXJtLCBwYWdlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJGlubGluZWNvdW50OiAnYWxscGFnZXMnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAkb3JkZXJieTogb0RhdGFTb3J0ID8gb0RhdGFTb3J0IDogXCJOYW1lXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICR0b3A6IHBhZ2VTaXplLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAkc2tpcDogKHBhZ2UgPT0gdW5kZWZpbmVkIHx8IHBhZ2UgPCAxKSA/IDAgOiAocGFnZSAtIDEpICogcGFnZVNpemUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFNlYXJjaFRlcm06IHRlcm0gPT0gdW5kZWZpbmVkID8gJycgOiB0ZXJtXHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICByZXN1bHRzKHJlc3VsdERhdGEsIHBhZ2UpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgbW9yZSA9IChwYWdlICogcGFnZVNpemUpIDwgcmVzdWx0RGF0YS5QYWdlSW5mby5Ub3RhbEl0ZW1Db3VudDtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyByZXN1bHRzOiByZXN1bHREYXRhLkxpc3QsIG1vcmU6IG1vcmUgfTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIC8vbm8gdmFsaWQgc291cmNlIHNwZWNpZmllZFxyXG4gICAgICAgICAgICBvcHRpb25zU3VwcGxpZWQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG9wdGlvbnNTdXBwbGllZCkge1xyXG4gICAgICAgICAgICAkKGVsZW1lbnQpLnNlbGVjdDIoZGF0YSk7XHJcbiAgICAgICAgICAgIC8qSW5pdGlhbCB2YWx1ZSovXHJcbiAgICAgICAgICAgIGlmIChpbml0VmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICQoZWxlbWVudCkuc2VsZWN0MigndmFsJywgaW5pdFZhbHVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvKkpxdWVyeSBVcGRhdGVzKi9cclxuICAgICAgICAgICAgJChlbGVtZW50KS5vbignY2hhbmdlJywgKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQuYWRkZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAvL3VwZGF0ZSBvYnNlcnZhYmxlIGRlcGVuZGluZyBvbiBpZiBpdCBpcyBhbiBhcnJheSBvciBwcm9wZXJ0eVxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBuZXdWYWx1ZSA9IGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUoZXZlbnQuYWRkZWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNSZWZlcmVuY2VUeXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNCb3VuZFRvQXJyYXkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kT2JzZXJ2YWJsZShuZXdWYWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZE9ic2VydmFibGUucHVzaChuZXdWYWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNCb3VuZFRvQXJyYXkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kT2JzZXJ2YWJsZShuZXdWYWx1ZS5JZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZE9ic2VydmFibGUucHVzaChuZXdWYWx1ZS5JZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvL2lmIHJlbW92aW5nIGFuZCBib3VuZCB0byBhcnJheSB3ZSBoYXZlIHRvIGNhbGwgcmVtb3ZlIG9uIG9ic2VydmFibGUgYXJyYXlcclxuICAgICAgICAgICAgICAgIGlmIChldmVudC5yZW1vdmVkICYmIGlzQm91bmRUb0FycmF5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlbW92ZWRWYWx1ZSA9IGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUoZXZlbnQucmVtb3ZlZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vZmluZCB0aGUgaXRlbSB3aXRoIG1hdGNoaW4gaWQgYW5kIHJlbW92ZVxyXG4gICAgICAgICAgICAgICAgICAgIGJvdW5kT2JzZXJ2YWJsZS5yZW1vdmUoaXRlbSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpZCA9IGlzUmVmZXJlbmNlVHlwZSA/IGl0ZW0uSWQgOiBpdGVtO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbUlkID0ga28udXRpbHMudW53cmFwT2JzZXJ2YWJsZShpZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZW1vdmVkVmFsdWVJZCA9IGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUocmVtb3ZlZFZhbHVlLklkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1JZCA9PT0gcmVtb3ZlZFZhbHVlSWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAkKGVsZW1lbnQpLm9uKFwic2VsZWN0Mi1yZW1vdmVkXCIsIGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFpc0JvdW5kVG9BcnJheSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGJvdW5kT2JzZXJ2YWJsZShudWxsKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIC8qb2JzZXJ2YWJsZSB1cGRhdGVzKi9cclxuICAgICAgICAgICAgYm91bmRPYnNlcnZhYmxlLnN1YnNjcmliZShuZXdWYWx1ZSA9PiB7XHJcbiAgICAgICAgICAgICAgICBuZXdWYWx1ZSA9IGtvLnRvSlMobmV3VmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGlzQm91bmRUb0FycmF5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCA9PT0gMClcclxuICAgICAgICAgICAgICAgICAgICAgICAgJChlbGVtZW50KS5zZWxlY3QyKCd2YWwnLCBudWxsKTtcclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBsdWNrZWQgPSBfLnBsdWNrKG5ld1ZhbHVlLCAnSWQnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJChlbGVtZW50KS5zZWxlY3QyKCd2YWwnLCBwbHVja2VkKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNSZWZlcmVuY2VUeXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICQoZWxlbWVudCkuc2VsZWN0MignZGF0YScsIG5ld1ZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICQoZWxlbWVudCkuc2VsZWN0MigndmFsJywgbmV3VmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgc3RhdGljIGlzT2JzZXJ2YWJsZUFycmF5KGJvdW5kT2JzZXJ2YWJsZSkge1xyXG4gICAgICAgIHJldHVybiAoYm91bmRPYnNlcnZhYmxlKCkgaW5zdGFuY2VvZiBBcnJheSk7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgZm9ybWF0U2VsZWN0aW9uKGl0ZW0pIHtcclxuICAgICAgICByZXR1cm4ga28udXRpbHMudW53cmFwT2JzZXJ2YWJsZShpdGVtLk5hbWUpO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGZvcm1hdFJlc3VsdChpdGVtKSB7XHJcbiAgICAgICAgcmV0dXJuIGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUoaXRlbS5OYW1lKTtcclxuICAgIH1cclxuICAgIHN0YXRpYyBmb3JtYXRJZChpdGVtKSB7XHJcbiAgICAgICAgaWYgKGl0ZW0pXHJcbiAgICAgICAgICAgIHJldHVybiBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKGl0ZW0uSWQpO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIG1hdGNoZXIodGVybSwgdGV4dCwgb3B0aW9uKSB7XHJcbiAgICAgICAgdmFyIG5hbWUgPSBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKG9wdGlvbi5OYW1lKTtcclxuICAgICAgICByZXR1cm4gbmFtZS50b1VwcGVyQ2FzZSgpLmluZGV4T2YodGVybS50b1VwcGVyQ2FzZSgpKSA+PSAwO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGdldE5lc3RlZFByb3BlcnR5KHByb3BlcnR5U3RyaW5nLCBwYXJlbnRPYmplY3QpIHtcclxuICAgICAgICB2YXIgcGFydHMgPSBwcm9wZXJ0eVN0cmluZy5zcGxpdCgnLicpO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBzaXplID0gcGFydHMubGVuZ3RoOyBpIDwgc2l6ZTsgaSsrKSB7XHJcbiAgICAgICAgICAgIHBhcmVudE9iamVjdCA9IHBhcmVudE9iamVjdFtwYXJ0c1tpXV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBwYXJlbnRPYmplY3Q7XHJcbiAgICB9XHJcbn1cclxubW9kdWxlLmV4cG9ydHMgPSBLb0JpbmRpbmdTZWxlY3QyO1xyXG4iLCJcInVzZSBzdHJpY3RcIjtcclxuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XHJcbmNvbnN0IFNhbW15ID0gcmVxdWlyZShcInNhbW15XCIpO1xyXG5jb25zdCBfID0gcmVxdWlyZShcInVuZGVyc2NvcmVcIik7XHJcbmNsYXNzIFJvdXRlciB7XHJcbiAgICBjb25zdHJ1Y3RvcihkYXRhLCB2bSwgYWx0ZXJuYXRlcm91dGVzKSB7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcclxuICAgICAgICB0aGlzLnZtID0gdm07XHJcbiAgICAgICAgaWYgKGFsdGVybmF0ZXJvdXRlcykge1xyXG4gICAgICAgICAgICB0aGlzLnJvdXRlcyA9IGFsdGVybmF0ZXJvdXRlcztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMucm91dGVzID0gdGhpcy5nZXRSb3V0ZXMoKTtcclxuICAgICAgICAgICAgLy8gYWRkIGkgcmVnZXggZmxhZyBmb3IgY2FzZSBpbnNlbnNpdGl2ZSByb3V0ZXNcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnJvdXRlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucm91dGVzW2ldLmNvbnZlcnRUb1JlZ0V4ICYmIHRoaXMucm91dGVzW2ldLm5hbWUuY29uc3RydWN0b3IgIT09IFJlZ0V4cCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucm91dGVzW2ldLm5hbWUgPSBuZXcgUmVnRXhwKHRoaXMucm91dGVzW2ldLm5hbWUudG9TdHJpbmcoKSwgJ2knKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNldHVwQmluZGlncygpO1xyXG4gICAgICAgIHRoaXMuaW5pdFJvdXRlcygpO1xyXG4gICAgfVxyXG4gICAgZ2V0Um91dGVzKCkge1xyXG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcclxuICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBuZXcgUmVnRXhwKGAke3NlbGYuZ2V0QXJlYSgpfS8ke3NlbGYuZGF0YS5UaXRsZX0jL2xpc3RgKSxcclxuICAgICAgICAgICAgICAgIGZ1bmM6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLmZvcm0uY2FuY2VsKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS50YWJsZS5sb2FkKCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvUmVnRXg6IHRydWVcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogYCR7c2VsZi5nZXRBcmVhKCl9LyR7c2VsZi5kYXRhLlRpdGxlfSMvbmV3YCxcclxuICAgICAgICAgICAgICAgIGZ1bmMoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5mb3JtLmFkZCgpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbnZlcnRUb1JlZ0V4OiB0cnVlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIC8vbmFtZTogL1xcI1xcL3ZpZXdcXC8oLiopL2ksXHJcbiAgICAgICAgICAgICAgICBuYW1lOiBgJHtzZWxmLmdldEFyZWEoKX0vJHtzZWxmLmRhdGEuVGl0bGV9Iy92aWV3LzppZGAsXHJcbiAgICAgICAgICAgICAgICBmdW5jKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpZCA9IHRoaXMucGFyYW1zWydpZCddO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uZm9ybS5nZXREZXRhaWwoaWQpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbnZlcnRUb1JlZ0V4OiBmYWxzZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBgJHtzZWxmLmdldEFyZWEoKX0vJHtzZWxmLmRhdGEuVGl0bGV9Iy9pbmRleGAsXHJcbiAgICAgICAgICAgICAgICBmdW5jKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uZm9ybS5nZXREZXRhaWwobnVsbCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvUmVnRXg6IHRydWVcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIF07XHJcbiAgICB9XHJcbiAgICBzZXR1cEJpbmRpZ3MoKSB7XHJcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIC8vI2FkZCBzaG93IGNhbGwgbmV3IHJvdXRlXHJcbiAgICAgICAgJCgnI2FkbWluLWJ1dHRvbi1jb250YWluZXInKS5vbignY2xpY2snLCAnI2FkZCcsICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5hZGQoKTtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIC8vI2NhbmNlbCBzaG93IGJhY2tcclxuICAgICAgICAkKCcubWFpbi1tb2RhbC1mb3JtJykub24oJ2NsaWNrJywgJy5kaWFsb2ctY2xvc2UnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuZ29CYWNrKCk7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIGluaXRSb3V0ZXMoKSB7XHJcbiAgICAgICAgdmFyIGFwcCA9IFNhbW15KCdib2R5Jywgc2FtbXkgPT4ge1xyXG4gICAgICAgICAgICAvL3Bhc3MgZXJyb3IgXHJcbiAgICAgICAgICAgIHNhbW15LnJhaXNlX2Vycm9ycyA9IHRydWU7XHJcbiAgICAgICAgICAgIC8vcmVnaXN0ZXIgYWxsIHJvdXRlcyAodGhpcyBhbGxvd3MgdXMgdG8gYWRkIHRvIHRoZW0gZnJvbSBkZXJpdmVkIGNsYXNzKVxyXG4gICAgICAgICAgICBfLmVhY2godGhpcy5yb3V0ZXMsIHYgPT4ge1xyXG4gICAgICAgICAgICAgICAgc2FtbXkuZ2V0KHYubmFtZSwgdi5mdW5jKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIC8va2VlcCB0cmFjayBvZiBsYXN0IHJvdXRlXHJcbiAgICAgICAgICAgIHNhbW15LmJlZm9yZSgocm91dGUpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMubGFzdFJvdXRlID0gdGhpcy5jdXJyZW50Um91dGU7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRSb3V0ZSA9IHJvdXRlO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgICAgICAkKCgpID0+IHtcclxuICAgICAgICAgICAgLy9nbyB0byBkZWZhdWx0IHJvdXRlXHJcbiAgICAgICAgICAgIGFwcC5ydW4odGhpcy5nZXRBcmVhKCkgKyAnLycgKyB0aGlzLnZtLlRpdGxlKCkudG9Mb3dlckNhc2UoKSArICcjLycgKyB0aGlzLnZtLkRlZmF1bHRTYW1teVJvdXRlKCkpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgZ2V0QXJlYSgpIHtcclxuICAgICAgICB2YXIgYXJlYSA9ICcnO1xyXG4gICAgICAgIGlmICh0aGlzLnZtLkFyZWEoKSkge1xyXG4gICAgICAgICAgICBhcmVhID0gJy8nICsgdGhpcy52bS5BcmVhKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBhcmVhO1xyXG4gICAgfVxyXG4gICAgLy9nbyB0byBwcmV2aW91cyByb3V0ZSBvciBkZWZhdWx0IHJvdXRlIGlmIHVuZGVmaW5lZFxyXG4gICAgZ29CYWNrKCkge1xyXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5oYXNoID0gYCMvbGlzdGA7XHJcbiAgICB9XHJcbiAgICBhZGQoKSB7XHJcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmhhc2ggPSAnIy9uZXcnO1xyXG4gICAgfVxyXG4gICAgdmlldyhpZCkge1xyXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5oYXNoID0gJyMvdmlldy8nICsgaWQ7XHJcbiAgICB9XHJcbn1cclxubW9kdWxlLmV4cG9ydHMgPSBSb3V0ZXI7XHJcbiIsIlwidXNlIHN0cmljdFwiO1xyXG5jb25zdCAkID0gcmVxdWlyZShcImpxdWVyeVwiKTtcclxuY29uc3Qga28gPSByZXF1aXJlKFwia25vY2tvdXRcIik7XHJcbmNvbnN0IGtvbWFwcGluZyA9IHJlcXVpcmUoXCJrbm9ja291dC5tYXBwaW5nXCIpO1xyXG5rby5tYXBwaW5nID0ga29tYXBwaW5nO1xyXG5jb25zdCBfID0gcmVxdWlyZShcInVuZGVyc2NvcmVcIik7XHJcbmNsYXNzIFRhYmxlIHtcclxuICAgIGNvbnN0cnVjdG9yKGRhdGEsIHZtKSB7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcclxuICAgICAgICB0aGlzLnZtID0gdm07XHJcbiAgICAgICAgdGhpcy5vRGF0YVVybCA9IGAvYXBpLyR7ZGF0YS5UaXRsZX1gO1xyXG4gICAgICAgIHRoaXMuZGVmYXVsdFNvcnQgPSBcIkNyZWF0ZWREYXRlIGRlc2NcIjtcclxuICAgICAgICB0aGlzLm9yZGVyYnkgPSB0aGlzLmRlZmF1bHRTb3J0O1xyXG4gICAgICAgIHRoaXMuc29ydEJ5ID0gbmV3IEFycmF5KCk7XHJcbiAgICAgICAgdGhpcy5zZXR1cFN1YnNjcmlwdGlvbnMoKTtcclxuICAgICAgICB0aGlzLnNldHVwQmluZGluZ3MoKTtcclxuICAgIH1cclxuICAgIC8vbG9hZHMgYWpheCBkYXRhIGludG8gdGFibGVcclxuICAgIGxvYWRSZXNwb25zZShyZXNwb25zZWRhdGEpIHtcclxuICAgICAgICAvL2NsZWFyIHRoZSBsaXN0XHJcbiAgICAgICAgdGhpcy52bS5MaXN0LnJlbW92ZUFsbCgpO1xyXG4gICAgICAgIC8vYWRkIHRoZSBuZXcgaXRlbXNcclxuICAgICAgICBfLmVhY2gocmVzcG9uc2VkYXRhLkxpc3QsICh2KSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMudm0uTGlzdC5wdXNoKHYpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIC8vcmVsb2FkIHBhZ2UgaW5mb1xyXG4gICAgICAgIGtvLm1hcHBpbmcuZnJvbUpTKHJlc3BvbnNlZGF0YS5QYWdlSW5mbywge30sIHRoaXMudm0uUGFnZUluZm8pO1xyXG4gICAgfVxyXG4gICAgLy9zdWJzY3JpYmVzIHRvIG9ic2VydmFibGVzXHJcbiAgICBzZXR1cFN1YnNjcmlwdGlvbnMoKSB7XHJcbiAgICAgICAgLy9wYWdlIG51bWJlclxyXG4gICAgICAgIHRoaXMudm0uUGFnZUluZm8uUGFnZU51bWJlci5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxvYWQoKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICAvL3BhZ2Ugc2l6ZVxyXG4gICAgICAgIHRoaXMudm0uUGFnZUluZm8uUGFnZVNpemUuc3Vic2NyaWJlKChuZXdWYWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnNvbWV0aGluZ0NoYW5nZWQoKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICAvL2ZpbHRlcnMgdmFsdWVzXHJcbiAgICAgICAgXy5lYWNoKHRoaXMudm0uRmlsdGVycywgKHYpID0+IHtcclxuICAgICAgICAgICAgdi5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zb21ldGhpbmdDaGFuZ2VkKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgc29tZXRoaW5nQ2hhbmdlZCgpIHtcclxuICAgICAgICBpZiAodGhpcy52bS5QYWdlSW5mby5QYWdlTnVtYmVyKCkgPT09IDEpXHJcbiAgICAgICAgICAgIHRoaXMubG9hZCgpO1xyXG4gICAgICAgIHRoaXMudm0uUGFnZUluZm8uUGFnZU51bWJlcigxKTtcclxuICAgIH1cclxuICAgIHNldHVwQmluZGluZ3MoKSB7XHJcbiAgICAgICAgLy9hZGQgY2xpY2sgaGFuZGxlcnMgdG8gdGhlIGNvbHVtbi1oZWFkaW5nc1xyXG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcclxuICAgICAgICAvLyBjbGljayAtIGNvbHVtbiBoZWFkZXJzXHJcbiAgICAgICAgJChcIi50YWJsZS1ob2xkZXItXCIgKyB0aGlzLmRhdGEuVGl0bGUpLm9uKFwiY2xpY2tcIiwgXCIuY29sdW1uLWhlYWRpbmdcIiwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgZGF0YSA9IGtvLmRhdGFGb3IodGhpcyk7IC8vJ3RoaXMnIGlzIGxvY2FsXHJcbiAgICAgICAgICAgIHZhciBpc1VwID0gZGF0YS5Jc1NvcnRlZFVwKCk7XHJcbiAgICAgICAgICAgIHZhciBpc0Rvd24gPSBkYXRhLklzU29ydGVkRG93bigpO1xyXG4gICAgICAgICAgICAvL25laXRoZXIgLT4gdXBcclxuICAgICAgICAgICAgaWYgKCFpc1VwICYmICFpc0Rvd24pIHtcclxuICAgICAgICAgICAgICAgIGRhdGEuSXNTb3J0ZWRVcCh0cnVlKTtcclxuICAgICAgICAgICAgICAgIC8vYWRkIGNvbHVtbiBhc2MgdG8gYXJyYXkgKyByZW1vdmUgb3RoZXIgdmFyaWFudHMgb2YgdGhpcyBjb2x1bW5cclxuICAgICAgICAgICAgICAgIHNlbGYuc29ydEJ5LnB1c2goZGF0YS5Tb3J0Q29sdW1uKCkgKyBcIiBhc2NcIik7XHJcbiAgICAgICAgICAgICAgICBzZWxmLnNvcnRCeSA9IF8ud2l0aG91dChzZWxmLnNvcnRCeSwgZGF0YS5Tb3J0Q29sdW1uKCkgKyBcIiBkZXNjXCIpO1xyXG4gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGRlZmF1bHQgc29ydCBpZiBpdCdzIG5vdCB0aGUgc2FtZSBzb3J0IHdlIGp1c3QgaW52b2tlZFxyXG4gICAgICAgICAgICAgICAgaWYgKHNlbGYuZGVmYXVsdFNvcnQgIT09IGRhdGEuU29ydENvbHVtbigpICsgXCIgYXNjXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5zb3J0QnkgPSBfLndpdGhvdXQoc2VsZi5zb3J0QnksIHNlbGYuZGVmYXVsdFNvcnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vdXAgLT4gZG93blxyXG4gICAgICAgICAgICBlbHNlIGlmIChpc1VwKSB7XHJcbiAgICAgICAgICAgICAgICBkYXRhLklzU29ydGVkVXAoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgZGF0YS5Jc1NvcnRlZERvd24odHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAvL2FkZCBjb2x1bW4gZGVzYyB0byBhcnJheSArIHJlbW92ZSBvdGhlciB2YXJpYW50cyBvZiB0aGlzIGNvbHVtblxyXG4gICAgICAgICAgICAgICAgc2VsZi5zb3J0QnkucHVzaChkYXRhLlNvcnRDb2x1bW4oKSArIFwiIGRlc2NcIik7XHJcbiAgICAgICAgICAgICAgICBzZWxmLnNvcnRCeSA9IF8ud2l0aG91dChzZWxmLnNvcnRCeSwgZGF0YS5Tb3J0Q29sdW1uKCkgKyBcIiBhc2NcIik7XHJcbiAgICAgICAgICAgICAgICAvLyByZW1vdmUgZGVmYXVsdCBzb3J0IGlmIGl0J3Mgbm90IHRoZSBzYW1lIHNvcnQgd2UganVzdCBpbnZva2VkXHJcbiAgICAgICAgICAgICAgICBpZiAoc2VsZi5kZWZhdWx0U29ydCAhPT0gZGF0YS5Tb3J0Q29sdW1uKCkgKyBcIiBkZXNjXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5zb3J0QnkgPSBfLndpdGhvdXQoc2VsZi5zb3J0QnksIHNlbGYuZGVmYXVsdFNvcnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vZG93biAtPiBuZWl0aGVyXHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZGF0YS5Jc1NvcnRlZFVwKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIGRhdGEuSXNTb3J0ZWREb3duKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIC8vcmVtb3ZlIGFsbCB2YXJpYW50cyBvZiB0aGlzIGNvbHVtblxyXG4gICAgICAgICAgICAgICAgc2VsZi5zb3J0QnkgPSBfLndpdGhvdXQoc2VsZi5zb3J0QnksIGRhdGEuU29ydENvbHVtbigpICsgXCIgZGVzY1wiKTtcclxuICAgICAgICAgICAgICAgIHNlbGYuc29ydEJ5ID0gXy53aXRob3V0KHNlbGYuc29ydEJ5LCBkYXRhLlNvcnRDb2x1bW4oKSArIFwiIGFzY1wiKTtcclxuICAgICAgICAgICAgICAgIHNlbGYuc29ydEJ5ID0gXy53aXRob3V0KHNlbGYuc29ydEJ5LCBzZWxmLmRlZmF1bHRTb3J0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvL2lmIG5vIHNvcnQgYWRkIGRlZmF1bHRcclxuICAgICAgICAgICAgaWYgKHNlbGYuc29ydEJ5Lmxlbmd0aCA9PT0gMClcclxuICAgICAgICAgICAgICAgIHNlbGYuc29ydEJ5LnB1c2goc2VsZi5kZWZhdWx0U29ydCk7XHJcbiAgICAgICAgICAgIHNlbGYub3JkZXJieSA9IHNlbGYuc29ydEJ5LmpvaW4oXCIsIFwiKTtcclxuICAgICAgICAgICAgc2VsZi5sb2FkKCk7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9KTtcclxuICAgICAgICAvLyBjbGljayAtIHBhZ2luZyBjb250cm9sc1xyXG4gICAgICAgICQoXCIucGFnaW5hdGlvbi1jb250YWluZXItXCIgKyB0aGlzLmRhdGEuVGl0bGUgKyBcIiAucGFnaW5hdGlvblwiKS5vbihcImNsaWNrXCIsIFwiYSwgYnV0dG9uXCIsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIGFMaW5rID0gdGhpcztcclxuICAgICAgICAgICAgdmFyIHZtID0ga28uZGF0YUZvcih0aGlzKTtcclxuICAgICAgICAgICAgaWYgKCQoYUxpbmspLnBhcmVudCgpLmhhc0NsYXNzKFwiZGlzYWJsZWRcIikgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgYVRleHQgPSAkKGFMaW5rKS50ZXh0KCkudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICAgICAgICAgIHZhciBwYWdlTnVtYmVyID0gdm0uUGFnZUluZm8uUGFnZU51bWJlcigpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGFUZXh0LmluZGV4T2YoXCJmaXJzdFwiKSA+IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFnZU51bWJlciA9IDE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChhVGV4dC5pbmRleE9mKFwicHJldlwiKSA+IC0xIHx8ICQoYUxpbmspLmhhc0NsYXNzKCdwcmV2JykpIHtcclxuICAgICAgICAgICAgICAgICAgICBwYWdlTnVtYmVyID0gcGFnZU51bWJlciAtIDE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChhVGV4dC5pbmRleE9mKFwibmV4dFwiKSA+IC0xIHx8ICQoYUxpbmspLmhhc0NsYXNzKCduZXh0JykpIHtcclxuICAgICAgICAgICAgICAgICAgICBwYWdlTnVtYmVyID0gcGFnZU51bWJlciArIDE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChhVGV4dC5pbmRleE9mKFwibGFzdFwiKSA+IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFnZU51bWJlciA9IHNlbGYudm0uUGFnZUluZm8uUGFnZUNvdW50KCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHsgLy9udW1iZXJzXHJcbiAgICAgICAgICAgICAgICAgICAgcGFnZU51bWJlciA9IHBhcnNlSW50KGFUZXh0KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHZtLlBhZ2VJbmZvLlBhZ2VOdW1iZXIocGFnZU51bWJlcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy9zZWxmLmxvYWQoKTtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgLy9jbGVhcnMgc29ydHMgb24gYWxsIGNvbHVtbnMgZXhjZXB0IG9uZXMgbmFtZWRcclxuICAgIGNsZWFyU29ydENvbHVtbnMoZG90Tm90Q2xlYXJDb2x1bW5OYW1lKSB7XHJcbiAgICAgICAgXy5lYWNoKHRoaXMudm0uQ29sdW1ucygpLCAodikgPT4ge1xyXG4gICAgICAgICAgICBpZiAodi5Db2x1bW5OYW1lKCkgIT09IGRvdE5vdENsZWFyQ29sdW1uTmFtZSkge1xyXG4gICAgICAgICAgICAgICAgdi5Jc1NvcnRlZFVwKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIHYuSXNTb3J0ZWREb3duKGZhbHNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgdG9wKCkge1xyXG4gICAgICAgIHJldHVybiAodGhpcy52bS5QYWdlSW5mby5QYWdlU2l6ZSgpKTtcclxuICAgIH1cclxuICAgIHNraXAoKSB7XHJcbiAgICAgICAgcmV0dXJuICh0aGlzLnZtLlBhZ2VJbmZvLlBhZ2VOdW1iZXIoKSAtIDEpICogdGhpcy50b3AoKTtcclxuICAgIH1cclxuICAgIC8vc2VuZHMgYWpheCBjYWxsIGZvciBkYXRhIFxyXG4gICAgbG9hZCgpIHtcclxuICAgICAgICB0aGlzLnZtLmZvcm0uaXNEZWxldGluZyA9IGZhbHNlO1xyXG4gICAgICAgICQoJyNsb2FkaW5nJykuaGVpZ2h0KCQod2luZG93KS5oZWlnaHQoKSk7XHJcbiAgICAgICAgdGhpcy52bS5Jc0xvYWRpbmcodHJ1ZSk7XHJcbiAgICAgICAgLy9mb3JtYXQgdGhlIHJlcXVlc3RcclxuICAgICAgICB2YXIgcmVxdWVzdERhdGEgPSB7XHJcbiAgICAgICAgICAgICRpbmxpbmVjb3VudDogXCJhbGxwYWdlc1wiLFxyXG4gICAgICAgICAgICAkb3JkZXJieTogdGhpcy5vcmRlcmJ5LFxyXG4gICAgICAgICAgICAkdG9wOiB0aGlzLnRvcCgpLFxyXG4gICAgICAgICAgICAkc2tpcDogdGhpcy5za2lwKClcclxuICAgICAgICB9O1xyXG4gICAgICAgIC8vYWRkIGluIGZpbHRlcnNcclxuICAgICAgICAkLmV4dGVuZChyZXF1ZXN0RGF0YSwga28udG9KUyh0aGlzLnZtLkZpbHRlcnMpKTtcclxuICAgICAgICAvL21ha2UgdGhlIHJlcXVlc3RcclxuICAgICAgICB2YXIgcmVzcG9uc2UgPSAkLmFqYXgoe1xyXG4gICAgICAgICAgICB1cmw6IHRoaXMub0RhdGFVcmwsXHJcbiAgICAgICAgICAgIGRhdGFUeXBlOiBcImpzb25cIixcclxuICAgICAgICAgICAgY2FjaGU6IGZhbHNlLFxyXG4gICAgICAgICAgICBkYXRhOiByZXF1ZXN0RGF0YVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIC8vaGFuZGxlIHN1Y2Nlc3NmdWwgcmVzcG9uc2VcclxuICAgICAgICByZXNwb25zZS5kb25lKHJlc3BvbnNlZGF0YSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubG9hZFJlc3BvbnNlKHJlc3BvbnNlZGF0YSk7XHJcbiAgICAgICAgICAgIHRoaXMudm0uSXNMb2FkaW5nKGZhbHNlKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgICB9XHJcbn1cclxubW9kdWxlLmV4cG9ydHMgPSBUYWJsZTtcclxuIiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcclxuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XHJcbndpbmRvd1snJCddID0gJDtcclxuY29uc3Qga28gPSByZXF1aXJlKFwia25vY2tvdXRcIik7XHJcbmNvbnN0IGtvbWFwcGluZyA9IHJlcXVpcmUoXCJrbm9ja291dC5tYXBwaW5nXCIpO1xyXG5rby5tYXBwaW5nID0ga29tYXBwaW5nO1xyXG53aW5kb3dbJ2tvJ10gPSBrbzsgLy9mb3IgY29uc29sZSBkZWJ1Z2dpbmdcclxuY29uc3Qga29leHRlbnNpb25zID0gcmVxdWlyZShcIi4vS29CaW5kaW5nRXh0ZW5zaW9uc1wiKTtcclxubmV3IGtvZXh0ZW5zaW9ucygpLnJlZ2lzdGVyKCk7XHJcbmNvbnN0IGtvc2VsZWN0MiA9IHJlcXVpcmUoXCIuL0tvQmluZGluZ1NlbGVjdDJcIik7XHJcbm5ldyBrb3NlbGVjdDIoKS5hZGRCaW5kaW5nKCk7XHJcbmNvbnN0IG1vbW1lbnREYXRldGltZUtvID0gcmVxdWlyZShcIm1vbWVudC1kYXRlcGlja2VyLWtvXCIpO1xyXG5tb21tZW50RGF0ZXRpbWVLbztcclxuY29uc3QgbW9tbWVudERhdGV0aW1lID0gcmVxdWlyZShcIm1vbWVudC1kYXRlcGlja2VyXCIpO1xyXG5tb21tZW50RGF0ZXRpbWU7XHJcbmNvbnN0IGJvb3RzdHJhcCA9IHJlcXVpcmUoXCJib290c3RyYXBcIik7XHJcbmJvb3RzdHJhcDtcclxuY2xhc3MgVm1CYXNlIHtcclxuICAgIGNvbnN0cnVjdG9yKGRhdGEsIGZvcm1UeXBlLCB0YWJsZVR5cGUsIHJvdXRlclR5cGUpIHtcclxuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xyXG4gICAgICAgIGtvLm1hcHBpbmcuZnJvbUpTKGRhdGEsIGRhdGEuS09NYXBwaW5nLCB0aGlzKTtcclxuICAgICAgICB0aGlzLnNldHVwQmluZGluZ3MoKTtcclxuICAgICAgICAvL3NhdmUgY29weSBvZiB3aGF0IGEgZW1wdHkgaXRlbSBsb29rcyBsaWtlIGZvciBjcmVhdGluZyBhZnRlciBlZGl0aW5nXHJcbiAgICAgICAgdGhpcy5OZXdJdGVtRGV0YWlsID0ga28ubWFwcGluZy50b0pTKHRoaXMuSXRlbURldGFpbCk7XHJcbiAgICAgICAgaWYgKGZvcm1UeXBlICE9PSBudWxsKVxyXG4gICAgICAgICAgICB0aGlzLmZvcm0gPSBuZXcgZm9ybVR5cGUoZGF0YSwgdGhpcyk7XHJcbiAgICAgICAgaWYgKHRhYmxlVHlwZSAhPT0gbnVsbClcclxuICAgICAgICAgICAgdGhpcy50YWJsZSA9IG5ldyB0YWJsZVR5cGUoZGF0YSwgdGhpcyk7XHJcbiAgICAgICAgaWYgKHJvdXRlclR5cGUgIT09IG51bGwpXHJcbiAgICAgICAgICAgIHRoaXMucm91dGVzID0gbmV3IHJvdXRlclR5cGUoZGF0YSwgdGhpcyk7XHJcbiAgICB9XHJcbiAgICBzZXR1cEJpbmRpbmdzKCkge1xyXG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcclxuICAgICAgICAkKCcuYWxlcnRzLWhvbGRlcicpLm9uKCdjbGljaycsICcuY2xvc2UnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBkYXRhID0ga28uZGF0YUZvcih0aGlzKTsgLy9sb2NhbCB0aGlzXHJcbiAgICAgICAgICAgIHNlbGYuQWxlcnRzLnJlbW92ZShkYXRhKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICAkKCdib2R5Jykub24oJ2NsaWNrJywgJy5tYWluLWhhbWJ1cmdlcicsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgJChcIiN3cmFwcGVyXCIpLnRvZ2dsZUNsYXNzKFwidG9nZ2xlZFwiKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICAvLyQoJ2JvZHknKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgLy8gICAgJChcIiN3cmFwcGVyXCIpLnJlbW92ZUNsYXNzKFwidG9nZ2xlZFwiKTtcclxuICAgICAgICAvL30pXHJcbiAgICB9XHJcbiAgICBBZGRBbGVydChtZXNzYWdlLCBhbGVydFR5cGUpIHtcclxuICAgICAgICB2YXIgY3NzID0gJ2FsZXJ0LXdhcm5pbmcnO1xyXG4gICAgICAgIGlmIChhbGVydFR5cGUgPT09ICdpbmZvJylcclxuICAgICAgICAgICAgY3NzID0gJ2FsZXJ0LWluZm8nO1xyXG4gICAgICAgIGlmIChhbGVydFR5cGUgPT09ICdlcnJvcicpXHJcbiAgICAgICAgICAgIGNzcyA9ICdhbGVydC1kYW5nZXInO1xyXG4gICAgICAgIGlmIChhbGVydFR5cGUgPT09ICdzdWNjZXNzJylcclxuICAgICAgICAgICAgY3NzID0gJ2FsZXJ0LXN1Y2Nlc3MnO1xyXG4gICAgICAgIHRoaXMuQWxlcnRzLnB1c2goe1xyXG4gICAgICAgICAgICBNZXNzYWdlOiBtZXNzYWdlLFxyXG4gICAgICAgICAgICBUeXBlOiBjc3MsXHJcbiAgICAgICAgICAgIElzVmlzaWJsZToga28ub2JzZXJ2YWJsZSh0cnVlKVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcbmV4cG9ydHMuVm1CYXNlID0gVm1CYXNlO1xyXG4iLCJcInVzZSBzdHJpY3RcIjtcclxuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XHJcbmNvbnN0IGtvID0gcmVxdWlyZShcImtub2Nrb3V0XCIpO1xyXG5jb25zdCBiYXNlID0gcmVxdWlyZShcIi4uL0Jhc2UvVk1CYXNlXCIpO1xyXG5jb25zdCBUYWJsZSA9IHJlcXVpcmUoXCIuLi9CYXNlL1RhYmxlXCIpO1xyXG5jb25zdCBSb3V0ZXIgPSByZXF1aXJlKFwiLi4vQmFzZS9Sb3V0ZXJcIik7XHJcbmNvbnN0IEZvcm0gPSByZXF1aXJlKFwiLi4vQmFzZS9Gb3JtXCIpO1xyXG5jbGFzcyBDYWxsVG9BY3Rpb24gZXh0ZW5kcyBiYXNlLlZtQmFzZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihkYXRhKSB7XHJcbiAgICAgICAgLy9jYWxsIGJhc2UgY2xhc3MgY29uc3RydWN0b3JcclxuICAgICAgICBzdXBlcihkYXRhLCBGb3JtLCBUYWJsZSwgUm91dGVyKTtcclxuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xyXG4gICAgICAgIGtvLmFwcGx5QmluZGluZ3ModGhpcyk7XHJcbiAgICAgICAgJCgnLmhpZGVVbmJvdW5kJykucmVtb3ZlQ2xhc3MoJ2hpZGVVbmJvdW5kJyk7XHJcbiAgICB9XHJcbn1cclxubW9kdWxlLmV4cG9ydHMgPSBDYWxsVG9BY3Rpb247XHJcbiIsIlwidXNlIHN0cmljdFwiO1xyXG5jb25zdCAkID0gcmVxdWlyZShcImpxdWVyeVwiKTtcclxuLyoqXHJcbiAqIE1vZGFsIHRoYXQgY2FuIGJlIHVzZWQgYW55d2hlcmUuXHJcbiAqIEBwYXJhbSAge1N0cmluZ30gIG1vZGFsTmFtZSAgTmFtZSBvZiB0aGUgbW9kYWxcclxuICovXHJcbmNsYXNzIE1vZGFsIHtcclxuICAgIGNvbnN0cnVjdG9yKG1vZGFsTmFtZSkge1xyXG4gICAgICAgIHRoaXMubmFtZSA9IG1vZGFsTmFtZTtcclxuICAgICAgICB0aGlzLnZpc2libGUgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLiR0cmlnZ2VyID0gJCgnW2RhdGEtbW9kYWwtdHJpZ2dlcj1cIicgKyBtb2RhbE5hbWUgKyAnXCJdJyk7XHJcbiAgICAgICAgdGhpcy4kbW9kYWwgPSAkKCdbZGF0YS1tb2RhbD1cIicgKyBtb2RhbE5hbWUgKyAnXCJdJyk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEluaXQgZnVuY3Rpb24gZm9yIGFuIGluZGl2dWFsIG1vZGFsIC0gU2V0cyB1cCBjbGljayBhY3Rpb25zLlxyXG4gICAgICovXHJcbiAgICBpbml0KCkge1xyXG4gICAgICAgIHZhciBtb2RhbCA9IHRoaXM7XHJcbiAgICAgICAgaWYgKCQoJ1tkYXRhLW1vZGFsLW92ZXJsYXldJykubGVuZ3RoIDwgMSkge1xyXG4gICAgICAgICAgICAkKCcud3JhcHBlciwgLm1vZGFsLWJvZHknKS5hZnRlcignPGRpdiBjbGFzcz1cIm1vZGFsLW92ZXJsYXlcIiBkYXRhLW1vZGFsLW92ZXJsYXkgZGF0YS1zdGF0ZT1cImhpZGRlblwiPjwvZGl2PicpO1xyXG4gICAgICAgICAgICAkKCdbZGF0YS1tb2RhbC1vdmVybGF5XSwgW2RhdGEtbW9kYWwtY2xvc2VdJykub24oJ2NsaWNrJywgZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgbW9kYWwuY2xvc2UoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuJG1vZGFsLmF0dHIoJ2RhdGEtc3RhdGUnLCAnaGlkZGVuJyk7XHJcbiAgICAgICAgLy90aGlzLiR0cmlnZ2VyLm9uKCdjbGljaycsIGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICAgIC8vICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgLy8gICAgbW9kYWwub3BlbigpO1xyXG4gICAgICAgIC8vfSk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEZ1bmN0aW9uIHRvIG9wZW4gdGhpcyBNb2RhbFxyXG4gICAgICovXHJcbiAgICBvcGVuKGlkKSB7XHJcbiAgICAgICAgdGhpcy5ldmVudElkID0gaWQ7XHJcbiAgICAgICAgdmFyICRvdmVybGF5ID0gJCgnW2RhdGEtbW9kYWwtb3ZlcmxheV0nKS5maXJzdCgpO1xyXG4gICAgICAgIC8vIHZhciAkY2xvbmUgPSB0aGlzLiRtb2RhbC5jbG9uZSgpLmF0dHIoJ2RhdGEtc3RhdGUnLCAndmlzaWJsZScpO1xyXG4gICAgICAgIHRoaXMuJG1vZGFsLmF0dHIoJ2RhdGEtc3RhdGUnLCAndmlzaWJsZScpO1xyXG4gICAgICAgICRvdmVybGF5LmF0dHIoJ2RhdGEtc3RhdGUnLCAndmlzaWJsZScpO1xyXG4gICAgICAgIHRoaXMudmlzaWJsZSA9IHRydWU7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEZ1bmN0aW9uIHRvIENsb3NlIHRoaXMgTW9kYWxcclxuICAgICAqL1xyXG4gICAgY2xvc2UoKSB7XHJcbiAgICAgICAgdmFyICRvdmVybGF5ID0gJCgnW2RhdGEtbW9kYWwtb3ZlcmxheV0nKS5maXJzdCgpO1xyXG4gICAgICAgIHRoaXMuJG1vZGFsLmF0dHIoJ2RhdGEtc3RhdGUnLCAnaGlkZGVuJyk7XHJcbiAgICAgICAgJG92ZXJsYXkuYXR0cignZGF0YS1zdGF0ZScsICdoaWRkZW4nKTtcclxuICAgICAgICB0aGlzLnZpc2libGUgPSBmYWxzZTtcclxuICAgIH1cclxufVxyXG5tb2R1bGUuZXhwb3J0cyA9IE1vZGFsO1xyXG4iLCJcInVzZSBzdHJpY3RcIjtcclxuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XHJcbmNvbnN0IGtvID0gcmVxdWlyZShcImtub2Nrb3V0XCIpO1xyXG5jb25zdCBiYXNlID0gcmVxdWlyZShcIi4uL0Jhc2UvVk1CYXNlXCIpO1xyXG5jb25zdCBUYWJsZSA9IHJlcXVpcmUoXCIuLi9CYXNlL1RhYmxlXCIpO1xyXG5jb25zdCBDb25uZWN0Um91dGVyID0gcmVxdWlyZShcIi4vQ29ubmVjdFJvdXRlclwiKTtcclxuY29uc3QgQ29ubmVjdEZvcm0gPSByZXF1aXJlKFwiLi9Db25uZWN0Rm9ybVwiKTtcclxuY29uc3QgTW9kYWwgPSByZXF1aXJlKFwiLi4vQ29tbW9uL01vZGFsXCIpO1xyXG5jbGFzcyBDb25uZWN0IGV4dGVuZHMgYmFzZS5WbUJhc2Uge1xyXG4gICAgY29uc3RydWN0b3IoZGF0YSkge1xyXG4gICAgICAgIC8vY2FsbCBiYXNlIGNsYXNzIGNvbnN0cnVjdG9yXHJcbiAgICAgICAgc3VwZXIoZGF0YSwgQ29ubmVjdEZvcm0sIFRhYmxlLCBDb25uZWN0Um91dGVyKTtcclxuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xyXG4gICAgICAgIHRoaXMubW9kYWwgPSBuZXcgTW9kYWwoXCJ1bnN1YnNjcmliZVwiKTtcclxuICAgICAgICB0aGlzLm1vZGFsLmluaXQoKTtcclxuICAgICAgICB0aGlzLk9yaWdpbmFsRW1haWwgPSBrby5vYnNlcnZhYmxlKCcnKTtcclxuICAgICAgICAkKCcubW9kYWxmb3JtLWhvbGRlcicpLm9uKCdjbGljaycsICcjc2F2ZS1jb25uZWN0JywgKCkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgcHJvbWlzZSA9IHRoaXMuZm9ybS5wb3N0KCk7XHJcbiAgICAgICAgICAgIHByb21pc2UuZG9uZSgoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBcIi9Db25uZWN0VXMjL3RoYW5reW91XCI7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgJCgnLm1vZGFsZm9ybS1ob2xkZXInKS5vbignY2xpY2snLCAnI3VwZGF0ZS1jb25uZWN0JywgKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygndXBkYXRlJyk7XHJcbiAgICAgICAgICAgIHZhciBwcm9taXNlID0gdGhpcy5mb3JtLnBvc3QoKTtcclxuICAgICAgICAgICAgcHJvbWlzZS5kb25lKChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IFwiL2Nvbm5lY3R1cyMvdGhhbmt5b3VcIjtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9KTtcclxuICAgICAgICAkKCcubW9kYWxmb3JtLWhvbGRlcicpLm9uKCdjbGljaycsICcjc2F2ZS1jb25uZWN0LXN0YW5kYWxvbmUnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIHZhciBwcm9taXNlID0gdGhpcy5mb3JtLnBvc3QoKTtcclxuICAgICAgICAgICAgcHJvbWlzZS5kb25lKChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IFwiL0Nvbm5lY3RVcy9TdGFuZEFsb25lIy90aGFua3lvdVwiO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgICQoJy5tb2RhbGZvcm0taG9sZGVyJykub24oJ2NsaWNrJywgJyN1bnN1YnNjcmliZScsICgpID0+IHtcclxuICAgICAgICAgICAgdmFyIHByb21pc2UgPSB0aGlzLmZvcm0udW5zdWJzY3JpYmUoKTtcclxuICAgICAgICAgICAgcHJvbWlzZS5kb25lKChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGFsLmNsb3NlKCk7XHJcbiAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IFwiL2Nvbm5lY3R1cyMvdW5zdWJzY3JpYmVkXCI7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBwcm9taXNlLmZhaWwoKGVycm9yKSA9PiB0aGlzLmZvcm0ucG9zdFByb21pc2VGYWlsKGVycm9yKSk7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9KTtcclxuICAgICAgICAkKCcubW9kYWxmb3JtLWhvbGRlcicpLmtleXByZXNzKGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIHZhciBrZXkgPSBlLndoaWNoO1xyXG4gICAgICAgICAgICBpZiAoa2V5ID09PSAxMykgLy8gdGhlIGVudGVyIGtleSBjb2RlXHJcbiAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAkKCcjc2F2ZS1jb25uZWN0JykuY2xpY2soKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgICQoJy5tb2RhbGZvcm0taG9sZGVyJykub24oJ2NsaWNrJywgJyN1bnN1YnNjcmliZS1tb2RhbCcsICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5tb2RhbC5vcGVuKCd1bnN1YnNjcmliZScpO1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAga28uYXBwbHlCaW5kaW5ncyh0aGlzKTtcclxuICAgICAgICAkKCcuaGlkZVVuYm91bmQnKS5yZW1vdmVDbGFzcygnaGlkZVVuYm91bmQnKTtcclxuICAgIH1cclxufVxyXG5tb2R1bGUuZXhwb3J0cyA9IENvbm5lY3Q7XHJcbiIsIlwidXNlIHN0cmljdFwiO1xyXG5jb25zdCBGb3JtID0gcmVxdWlyZShcIi4uL0Jhc2UvRm9ybVwiKTtcclxuY2xhc3MgQ29ubmVjdEZvcm0gZXh0ZW5kcyBGb3JtIHtcclxuICAgIGNvbnN0cnVjdG9yKGRhdGEsIHZtLCBlZGl0QWN0aW9uID0gJ0VkaXQnKSB7XHJcbiAgICAgICAgc3VwZXIoZGF0YSwgdm0sIGVkaXRBY3Rpb24pO1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICAgICAgdGhpcy52bSA9IHZtO1xyXG4gICAgICAgIHRoaXMuZWRpdEFjdGlvbiA9IGVkaXRBY3Rpb247XHJcbiAgICAgICAgJCgnI0VtYWlsT3B0SW4nKS5vbignY2xpY2snLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh2bS5JdGVtRGV0YWlsLkVtYWlsKCkgPT09IG51bGwgfHwgdm0uSXRlbURldGFpbC5FbWFpbCgpLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgdm0uSXRlbURldGFpbC5FbWFpbCgnbm9uZScpO1xyXG4gICAgICAgICAgICAgICAgdm0uSXRlbURldGFpbC5FbWFpbCgnJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHZtLkl0ZW1EZXRhaWwuQ29uZmlybUVtYWlsKCkgPT09IG51bGwgfHwgdm0uSXRlbURldGFpbC5Db25maXJtRW1haWwoKS5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgICAgIHZtLkl0ZW1EZXRhaWwuQ29uZmlybUVtYWlsKCdub25lJyk7XHJcbiAgICAgICAgICAgICAgICB2bS5JdGVtRGV0YWlsLkNvbmZpcm1FbWFpbCgnJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5yZW1vdmVFcnJvcnMoKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICAkKCcjU21zT3B0SW4nKS5vbignY2xpY2snLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh2bS5JdGVtRGV0YWlsLlBob25lKCkgPT09IG51bGwgfHwgdm0uSXRlbURldGFpbC5QaG9uZSgpLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgdm0uSXRlbURldGFpbC5QaG9uZSgnbm9uZScpO1xyXG4gICAgICAgICAgICAgICAgdm0uSXRlbURldGFpbC5QaG9uZSgnJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5yZW1vdmVFcnJvcnMoKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIHByb21pc2VEb25lKGRhdGEsIGlkKSB7XHJcbiAgICAgICAgc3VwZXIuZ2V0UHJvbWlzZURvbmUoZGF0YSwgaWQpO1xyXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gZGF0YS5SZXR1cm5Vcmw7XHJcbiAgICB9XHJcbiAgICByZW1vdmVFcnJvcnMoKSB7XHJcbiAgICAgICAgJCgnI0l0ZW1EZXRhaWxfRW1haWxPcHRJbicpLnRleHQoJycpO1xyXG4gICAgICAgICQoJyNJdGVtRGV0YWlsX0VtYWlsT3B0SW4nKS5yZW1vdmVDbGFzcygnbGFiZWwnKS5yZW1vdmVDbGFzcygnbGFiZWwtZGFuZ2VyJyk7XHJcbiAgICAgICAgJCgnI0l0ZW1EZXRhaWxfRW1haWxPcHRJbicpLnBhcmVudCgpLnJlbW92ZUNsYXNzKCdoYXMtZXJyb3InKS5yZW1vdmVDbGFzcygnaGFzLWZlZWRiYWNrJyk7XHJcbiAgICAgICAgJCgnI0l0ZW1EZXRhaWxfU21zT3B0SW4nKS50ZXh0KCcnKTtcclxuICAgICAgICAkKCcjSXRlbURldGFpbF9TbXNPcHRJbicpLnJlbW92ZUNsYXNzKCdsYWJlbCcpLnJlbW92ZUNsYXNzKCdsYWJlbC1kYW5nZXInKTtcclxuICAgICAgICAkKCcjSXRlbURldGFpbF9TbXNPcHRJbicpLnBhcmVudCgpLnJlbW92ZUNsYXNzKCdoYXMtZXJyb3InKS5yZW1vdmVDbGFzcygnaGFzLWZlZWRiYWNrJyk7XHJcbiAgICB9XHJcbiAgICB1bnN1YnNjcmliZSgpIHtcclxuICAgICAgICB2YXIgbWFwcGluZyA9IHtcclxuICAgICAgICAgICAgJ2lnbm9yZSc6IHRoaXMudm0uZGF0YS5LT01hcHBpbmcuYWxsTm9uUG9zdEJhY2tcclxuICAgICAgICB9O1xyXG4gICAgICAgIHZhciBwb3N0RGF0YSA9IGtvLm1hcHBpbmcudG9KUyh0aGlzLnZtLCBtYXBwaW5nKTtcclxuICAgICAgICB2YXIgcHJvbWlzZSA9ICQuYWpheCh7XHJcbiAgICAgICAgICAgIHVybDogJy9jb25uZWN0dXMvdW5zdWJzY3JpYmUnLFxyXG4gICAgICAgICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShwb3N0RGF0YSksXHJcbiAgICAgICAgICAgIHR5cGU6ICdQT1NUJyxcclxuICAgICAgICAgICAgY2FjaGU6IGZhbHNlLFxyXG4gICAgICAgICAgICBjb250ZW50VHlwZTogJ2FwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtOCcsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHByb21pc2U7XHJcbiAgICB9XHJcbiAgICBnZXRTdWJzY3JpYmVyKGlkKSB7XHJcbiAgICAgICAgdmFyIHByb21pc2UgPSAkLmFqYXgoe1xyXG4gICAgICAgICAgICB1cmw6ICcvY29ubmVjdHVzL3N1YnNjcmliZXI/aWQ9JyArIGVuY29kZVVSSUNvbXBvbmVudChpZCksXHJcbiAgICAgICAgICAgIHR5cGU6ICdHRVQnLFxyXG4gICAgICAgICAgICBjYWNoZTogZmFsc2VcclxuICAgICAgICB9KTtcclxuICAgICAgICBwcm9taXNlLmRvbmUoKGRhdGEpID0+IHRoaXMucmVmcmVzaEZpZWxkcyhkYXRhKSk7XHJcbiAgICAgICAgcmV0dXJuIHByb21pc2U7XHJcbiAgICB9XHJcbiAgICByZWZyZXNoRmllbGRzKGRhdGEpIHtcclxuICAgICAgICB0aGlzLnZtLkl0ZW1EZXRhaWwuRmlyc3ROYW1lKGRhdGEuSXRlbURldGFpbC5GaXJzdE5hbWUpO1xyXG4gICAgICAgIHRoaXMudm0uSXRlbURldGFpbC5MYXN0TmFtZShkYXRhLkl0ZW1EZXRhaWwuTGFzdE5hbWUpO1xyXG4gICAgICAgIHRoaXMudm0uSXRlbURldGFpbC5FbWFpbChkYXRhLkl0ZW1EZXRhaWwuRW1haWwpO1xyXG4gICAgICAgIHRoaXMudm0uSXRlbURldGFpbC5Db25maXJtRW1haWwoZGF0YS5JdGVtRGV0YWlsLkNvbmZpcm1FbWFpbCk7XHJcbiAgICAgICAgdGhpcy52bS5JdGVtRGV0YWlsLlppcChkYXRhLkl0ZW1EZXRhaWwuWmlwKTtcclxuICAgICAgICB0aGlzLnZtLkl0ZW1EZXRhaWwuQmlydGhkYXlEYXkoZGF0YS5JdGVtRGV0YWlsLkJpcnRoZGF5RGF5KTtcclxuICAgICAgICB0aGlzLnZtLkl0ZW1EZXRhaWwuQmlydGhkYXlNb250aChkYXRhLkl0ZW1EZXRhaWwuQmlydGhkYXlNb250aCk7XHJcbiAgICAgICAgdGhpcy52bS5JdGVtRGV0YWlsLlVuaXF1ZUlkKGRhdGEuSXRlbURldGFpbC5VbmlxdWVJZCk7XHJcbiAgICAgICAgdGhpcy52bS5JdGVtRGV0YWlsLkVtYWlsT3B0SW4odHJ1ZSk7XHJcbiAgICAgICAgdGhpcy52bS5PcmlnaW5hbEVtYWlsKGRhdGEuSXRlbURldGFpbC5FbWFpbCk7XHJcbiAgICB9XHJcbn1cclxubW9kdWxlLmV4cG9ydHMgPSBDb25uZWN0Rm9ybTtcclxuIiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbmNvbnN0IFJvdXRlciA9IHJlcXVpcmUoXCIuLi9CYXNlL1JvdXRlclwiKTtcclxuY2xhc3MgQ29ubmVjdFJvdXRlciBleHRlbmRzIFJvdXRlciB7XHJcbiAgICBjb25zdHJ1Y3RvcihkYXRhLCB2bSwgYWx0ZXJuYXRlcm91dGVzKSB7XHJcbiAgICAgICAgc3VwZXIoZGF0YSwgdm0sIGFsdGVybmF0ZXJvdXRlcyk7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcclxuICAgICAgICB0aGlzLnZtID0gdm07XHJcbiAgICB9XHJcbiAgICBnZXRSb3V0ZXMoKSB7XHJcbiAgICAgICAgdmFyIHNlbGY7XHJcbiAgICAgICAgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogYC9Db25uZWN0VXMjL25ld2AsXHJcbiAgICAgICAgICAgICAgICBmdW5jKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uZm9ybS5hZGQoKTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLlNob3dUaGFua1lvdShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5TaG93VW5zdWJzY3JpYmVkKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLklzVXBkYXRlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9SZWdFeDogdHJ1ZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBgL0Nvbm5lY3RVcyMvdGhhbmt5b3VgLFxyXG4gICAgICAgICAgICAgICAgZnVuYygpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLlNob3dUaGFua1lvdSh0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLlNob3dVbnN1YnNjcmliZWQoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uSXNVcGRhdGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbnZlcnRUb1JlZ0V4OiB0cnVlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IGAvQ29ubmVjdC9TdGFuZEFsb25lIy9uZXdgLFxyXG4gICAgICAgICAgICAgICAgZnVuYygpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLmZvcm0uYWRkKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5TaG93VGhhbmtZb3UoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uU2hvd1Vuc3Vic2NyaWJlZChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5Jc1VwZGF0ZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvUmVnRXg6IHRydWVcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogYC9Db25uZWN0L1N0YW5kQWxvbmUjL3RoYW5reW91YCxcclxuICAgICAgICAgICAgICAgIGZ1bmMoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5TaG93VGhhbmtZb3UodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5TaG93VW5zdWJzY3JpYmVkKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLklzVXBkYXRlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9SZWdFeDogdHJ1ZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBgL0Nvbm5lY3RVcyMvcHJvZmlsZWAsXHJcbiAgICAgICAgICAgICAgICBmdW5jKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpZCA9IHRoaXMucGFyYW1zLnVpZDtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgcHJvbWlzZSA9IHNlbGYudm0uZm9ybS5nZXRTdWJzY3JpYmVyKGlkKTtcclxuICAgICAgICAgICAgICAgICAgICBwcm9taXNlLmRvbmUoKCkgPT4gc2VsZi52bS5Jc1VwZGF0ZSh0cnVlKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbWlzZS5mYWlsKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBcIi9jb25uZWN0dXMjL25ld1wiO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uZm9ybS5hZGQoKTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLlNob3dUaGFua1lvdShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvUmVnRXg6IHRydWVcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogYC9jb25uZWN0dXMjL3Vuc3Vic2NyaWJlZGAsXHJcbiAgICAgICAgICAgICAgICBmdW5jKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uU2hvd1RoYW5rWW91KGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLlNob3dVbnN1YnNjcmliZWQodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5Jc1VwZGF0ZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvUmVnRXg6IHRydWVcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICBdO1xyXG4gICAgfVxyXG59XHJcbm1vZHVsZS5leHBvcnRzID0gQ29ubmVjdFJvdXRlcjtcclxuIiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xyXG5jb25zdCBrbyA9IHJlcXVpcmUoXCJrbm9ja291dFwiKTtcclxuY29uc3QgYmFzZSA9IHJlcXVpcmUoXCIuLi9CYXNlL1ZNQmFzZVwiKTtcclxuY29uc3QgVGFibGUgPSByZXF1aXJlKFwiLi4vQmFzZS9UYWJsZVwiKTtcclxuY29uc3QgRm9ybSA9IHJlcXVpcmUoXCIuLi9CYXNlL0Zvcm1cIik7XHJcbmNvbnN0IENvbnRhY3RVc1JvdXRlciA9IHJlcXVpcmUoXCIuL0NvbnRhY3RVc1JvdXRlclwiKTtcclxuY29uc3QgXyA9IHJlcXVpcmUoXCJ1bmRlcnNjb3JlXCIpO1xyXG5jb25zdCBTdG9yZSA9IHJlcXVpcmUoXCIuLi9TdG9yZS9TdG9yZVwiKTtcclxuY2xhc3MgQ29udGFjdFVzIGV4dGVuZHMgYmFzZS5WbUJhc2Uge1xyXG4gICAgY29uc3RydWN0b3IoZGF0YSkge1xyXG4gICAgICAgIC8vY2FsbCBiYXNlIGNsYXNzIGNvbnN0cnVjdG9yXHJcbiAgICAgICAgc3VwZXIoZGF0YSwgRm9ybSwgVGFibGUsIENvbnRhY3RVc1JvdXRlcik7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcclxuICAgICAgICAvL3NldHVwIHRhYmxlLCByb3V0ZXMgYW5kIGZvcm1cclxuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgLy9yZXVzZSB0aGUgc3RvcmUgdm0gZm9yIHN0b3JlIHNlYXJjaFxyXG4gICAgICAgIHRoaXMuc3RvcmVWbSA9IG5ldyBTdG9yZShkYXRhLlN0b3JlVmlld01vZGVsLCBmYWxzZSk7XHJcbiAgICAgICAgdGhpcy5JdGVtRGV0YWlsLlN0b3JlU3RhdGUuc3Vic2NyaWJlKChuZXdWYWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAobmV3VmFsdWUgIT09ICd1bmRlZmluZWQnICYmIG5ld1ZhbHVlICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuU3RvcmVDaXRpZXMucmVtb3ZlQWxsKCk7XHJcbiAgICAgICAgICAgICAgICAkLmFqYXgoe1xyXG4gICAgICAgICAgICAgICAgICAgIHVybDogJy9hcGkvU3RvcmUvR2V0U3RvcmVDaXRpZXNCeVN0YXRlP3N0YXRlPScgKyBuZXdWYWx1ZSxcclxuICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAoZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBfLmVhY2goZGF0YSwgKHYpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuU3RvcmVDaXRpZXMucHVzaCh2KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLkl0ZW1EZXRhaWwuU3RvcmVDaXR5LnN1YnNjcmliZSgobmV3VmFsdWUpID0+IHtcclxuICAgICAgICAgICAgaWYgKG5ld1ZhbHVlICE9PSAndW5kZWZpbmVkJyAmJiBuZXdWYWx1ZSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLlN0b3JlQWRkcmVzc2VzLnJlbW92ZUFsbCgpO1xyXG4gICAgICAgICAgICAgICAgJC5hamF4KHtcclxuICAgICAgICAgICAgICAgICAgICB1cmw6ICcvYXBpL1N0b3JlL0dldFN0b3Jlc0J5U3RhdGVBbmRDaXR5P3N0YXRlPScgKyB0aGlzLkl0ZW1EZXRhaWwuU3RvcmVTdGF0ZSgpICsgJyZjaXR5PScgKyBuZXdWYWx1ZSxcclxuICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAoZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBfLmVhY2goZGF0YSwgKHYpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuU3RvcmVBZGRyZXNzZXMucHVzaCh2KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICAkKCcubW9kYWxmb3JtLWhvbGRlcicpLm9uKCdjbGljaycsICcjc2F2ZS1jb250YWN0JywgKCkgPT4ge1xyXG4gICAgICAgICAgICAkKCcjSXRlbURldGFpbF9SZXF1aXJlUmVzcG9uc2UnKS50ZXh0KCcnKTtcclxuICAgICAgICAgICAgJCgnI0l0ZW1EZXRhaWxfUmVxdWlyZVJlc3BvbnNlJykucmVtb3ZlQ2xhc3MoJ2xhYmVsJykucmVtb3ZlQ2xhc3MoJ2xhYmVsLWRhbmdlcicpO1xyXG4gICAgICAgICAgICAkKCcjSXRlbURldGFpbF9SZXF1aXJlUmVzcG9uc2UnKS5wYXJlbnQoKS5yZW1vdmVDbGFzcygnaGFzLWVycm9yJykucmVtb3ZlQ2xhc3MoJ2hhcy1mZWVkYmFjaycpO1xyXG4gICAgICAgICAgICB2YXIgcHJvbWlzZSA9IHRoaXMuZm9ybS5wb3N0KCk7XHJcbiAgICAgICAgICAgIHByb21pc2UuZG9uZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IFwiL0NvbnRhY3RVcyMvdGhhbmt5b3VcIjtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBrby5hcHBseUJpbmRpbmdzKHRoaXMpO1xyXG4gICAgICAgICQoXCIuaGlkZVVuYm91bmRcIikucmVtb3ZlQ2xhc3MoXCJoaWRlVW5ib3VuZFwiKTtcclxuICAgICAgICAvLyQoJyNJdGVtRGV0YWlsX1B1cmNoYXNlRGF0ZScpLnZhbCgnbW0vZGQveXl5eScpO1xyXG4gICAgfVxyXG59XHJcbm1vZHVsZS5leHBvcnRzID0gQ29udGFjdFVzO1xyXG4iLCJcInVzZSBzdHJpY3RcIjtcclxuY29uc3QgUm91dGVyID0gcmVxdWlyZShcIi4uL0Jhc2UvUm91dGVyXCIpO1xyXG5jbGFzcyBDb250YWN0VXNSb3V0ZXIgZXh0ZW5kcyBSb3V0ZXIge1xyXG4gICAgY29uc3RydWN0b3IoZGF0YSwgdm0sIGFsdGVybmF0ZXJvdXRlcykge1xyXG4gICAgICAgIHN1cGVyKGRhdGEsIHZtLCBhbHRlcm5hdGVyb3V0ZXMpO1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICAgICAgdGhpcy52bSA9IHZtO1xyXG4gICAgfVxyXG4gICAgZ2V0Um91dGVzKCkge1xyXG4gICAgICAgIHZhciBzZWxmO1xyXG4gICAgICAgIHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6ICcvQ29udGFjdFVzIy9uZXcnLFxyXG4gICAgICAgICAgICAgICAgZnVuYygpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgb3JpZ2luID0gdGhpcy5wYXJhbXMucGxhdGZvcm07XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5mb3JtLmFkZCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcmlnaW4gIT0gJycpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5JdGVtRGV0YWlsLk9yaWdpbihvcmlnaW4pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLlNob3dUaGFua1lvdShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvUmVnRXg6IHRydWVcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogJy9Db250YWN0VXMjL3RoYW5reW91JyxcclxuICAgICAgICAgICAgICAgIGZ1bmMoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5TaG93VGhhbmtZb3UodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvUmVnRXg6IHRydWVcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIF07XHJcbiAgICB9XHJcbn1cclxubW9kdWxlLmV4cG9ydHMgPSBDb250YWN0VXNSb3V0ZXI7XHJcbiIsIlwidXNlIHN0cmljdFwiO1xyXG5jb25zdCAkID0gcmVxdWlyZShcImpxdWVyeVwiKTtcclxuY29uc3Qga28gPSByZXF1aXJlKFwia25vY2tvdXRcIik7XHJcbmNvbnN0IGJhc2UgPSByZXF1aXJlKFwiLi4vQmFzZS9WTUJhc2VcIik7XHJcbmNvbnN0IFRhYmxlID0gcmVxdWlyZShcIi4uL0Jhc2UvVGFibGVcIik7XHJcbmNvbnN0IENvbnRhY3RSb3V0ZXIgPSByZXF1aXJlKFwiLi9Db250YWN0Um91dGVyXCIpO1xyXG5jb25zdCBGb3JtID0gcmVxdWlyZShcIi4uL0Jhc2UvRm9ybVwiKTtcclxuY2xhc3MgQ29udGFjdCBleHRlbmRzIGJhc2UuVm1CYXNlIHtcclxuICAgIGNvbnN0cnVjdG9yKGRhdGEpIHtcclxuICAgICAgICAvL2NhbGwgYmFzZSBjbGFzcyBjb25zdHJ1Y3RvclxyXG4gICAgICAgIHN1cGVyKGRhdGEsIEZvcm0sIFRhYmxlLCBDb250YWN0Um91dGVyKTtcclxuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xyXG4gICAgICAgIGtvLmFwcGx5QmluZGluZ3ModGhpcyk7XHJcbiAgICAgICAgJCgnLmhpZGVVbmJvdW5kJykucmVtb3ZlQ2xhc3MoJ2hpZGVVbmJvdW5kJyk7XHJcbiAgICB9XHJcbn1cclxubW9kdWxlLmV4cG9ydHMgPSBDb250YWN0O1xyXG4iLCJcInVzZSBzdHJpY3RcIjtcclxuY29uc3QgUm91dGVyID0gcmVxdWlyZShcIi4uL0Jhc2UvUm91dGVyXCIpO1xyXG5jbGFzcyBDb250YWN0Um91dGVyIGV4dGVuZHMgUm91dGVyIHtcclxuICAgIGNvbnN0cnVjdG9yKGRhdGEsIHZtLCBhbHRlcm5hdGVyb3V0ZXMpIHtcclxuICAgICAgICBzdXBlcihkYXRhLCB2bSwgYWx0ZXJuYXRlcm91dGVzKTtcclxuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xyXG4gICAgICAgIHRoaXMudm0gPSB2bTtcclxuICAgIH1cclxuICAgIGdldFJvdXRlcygpIHtcclxuICAgICAgICB2YXIgc2VsZjtcclxuICAgICAgICBzZWxmID0gdGhpcztcclxuICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBgJHtzZWxmLmdldEFyZWEoKX0vJHtzZWxmLmRhdGEuVGl0bGV9Iy9saXN0YCxcclxuICAgICAgICAgICAgICAgIGZ1bmM6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLmZvcm0uY2FuY2VsKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS50YWJsZS5sb2FkKCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvUmVnRXg6IGZhbHNlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IGAke3NlbGYuZ2V0QXJlYSgpfS8ke3NlbGYuZGF0YS5UaXRsZX0jL25ld2AsXHJcbiAgICAgICAgICAgICAgICBmdW5jKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uZm9ybS5hZGQoKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9SZWdFeDogZmFsc2VcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogYCR7c2VsZi5nZXRBcmVhKCl9LyR7c2VsZi5kYXRhLlRpdGxlfSMvdmlldy86aWRgLFxyXG4gICAgICAgICAgICAgICAgZnVuYygpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgaWQgPSB0aGlzLnBhcmFtc1snaWQnXTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLmZvcm0uZ2V0RGV0YWlsKGlkKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9SZWdFeDogZmFsc2VcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogYCR7c2VsZi5nZXRBcmVhKCl9LyR7c2VsZi5kYXRhLlRpdGxlfSMvaW5kZXhgLFxyXG4gICAgICAgICAgICAgICAgZnVuYygpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLmZvcm0uZ2V0RGV0YWlsKG51bGwpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbnZlcnRUb1JlZ0V4OiBmYWxzZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBgJHtzZWxmLmdldEFyZWEoKX0vJHtzZWxmLmRhdGEuVGl0bGV9Iy9kZWxldGUvOmlkYCxcclxuICAgICAgICAgICAgICAgIGZ1bmMoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGlkID0gdGhpcy5wYXJhbXNbJ2lkJ107XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5mb3JtLmRlbGV0ZUl0ZW0oaWQpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbnZlcnRUb1JlZ0V4OiBmYWxzZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgXTtcclxuICAgIH1cclxufVxyXG5tb2R1bGUuZXhwb3J0cyA9IENvbnRhY3RSb3V0ZXI7XHJcbiIsIlwidXNlIHN0cmljdFwiO1xyXG4vLy8gVGhpcyBjb2RlIHdhcyBnZW5lcmF0ZWQgYnkgT3JhbmdlIE9uaW9uIFNjYWZmb2xkZXIuXHJcbi8vIHRlbXBsYXRlOiBNVkMuSlNNb2R1bGUuY3NcclxuLy8gY2xhc3M6IENvbnRlbnRQYWdlVHJlZVZpZXdcclxuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XHJcbmNvbnN0IGtvID0gcmVxdWlyZShcImtub2Nrb3V0XCIpO1xyXG5jb25zdCBiYXNlID0gcmVxdWlyZShcIi4uL0Jhc2UvVk1CYXNlXCIpO1xyXG5jb25zdCBUYWJsZSA9IHJlcXVpcmUoXCIuLi9CYXNlL1RhYmxlXCIpO1xyXG5jb25zdCBSb3V0ZXIgPSByZXF1aXJlKFwiLi4vQmFzZS9Sb3V0ZXJcIik7XHJcbmNvbnN0IEZvcm0gPSByZXF1aXJlKFwiLi4vQmFzZS9Gb3JtXCIpO1xyXG5jbGFzcyBDb250ZW50UGFnZVRyZWVWaWV3IGV4dGVuZHMgYmFzZS5WbUJhc2Uge1xyXG4gICAgY29uc3RydWN0b3IoZGF0YSkge1xyXG4gICAgICAgIC8vY2FsbCBiYXNlIGNsYXNzIGNvbnN0cnVjdG9yXHJcbiAgICAgICAgc3VwZXIoZGF0YSwgRm9ybSwgVGFibGUsIFJvdXRlcik7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcclxuICAgICAgICBrby5hcHBseUJpbmRpbmdzKHRoaXMpO1xyXG4gICAgICAgICQoJy5oaWRlVW5ib3VuZCcpLnJlbW92ZUNsYXNzKCdoaWRlVW5ib3VuZCcpO1xyXG4gICAgfVxyXG59XHJcbm1vZHVsZS5leHBvcnRzID0gQ29udGVudFBhZ2VUcmVlVmlldztcclxuIiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xyXG5jb25zdCBrbyA9IHJlcXVpcmUoXCJrbm9ja291dFwiKTtcclxuY29uc3QgQ29udGVudFBhZ2VGb3JtID0gcmVxdWlyZShcIi4vQ29udGVudFBhZ2VGb3JtXCIpO1xyXG5jb25zdCBUYWJsZSA9IHJlcXVpcmUoXCIuLi9CYXNlL1RhYmxlXCIpO1xyXG5jb25zdCBQYWdlQmFzZSA9IHJlcXVpcmUoXCIuL0NvbnRlbnRQYWdlQmFzZVwiKTtcclxuY29uc3QgQ29udGVudFBhZ2VSb3V0ZXIgPSByZXF1aXJlKFwiLi9Db250ZW50UGFnZVJvdXRlclwiKTtcclxuY2xhc3MgQ29udGVudFBhZ2UgZXh0ZW5kcyBQYWdlQmFzZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihkYXRhLCBhcHBseUJpbmRpbmdzID0gdHJ1ZSkge1xyXG4gICAgICAgIC8vY2FsbCBiYXNlIGNsYXNzIGNvbnN0cnVjdG9yXHJcbiAgICAgICAgc3VwZXIoZGF0YSwgQ29udGVudFBhZ2VGb3JtLCBUYWJsZSwgQ29udGVudFBhZ2VSb3V0ZXIpO1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICAgICAgaWYgKGFwcGx5QmluZGluZ3MpIHtcclxuICAgICAgICAgICAga28uYXBwbHlCaW5kaW5ncyh0aGlzKTtcclxuICAgICAgICAgICAgJCgnLmhpZGVVbmJvdW5kJykucmVtb3ZlQ2xhc3MoJ2hpZGVVbmJvdW5kJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbm1vZHVsZS5leHBvcnRzID0gQ29udGVudFBhZ2U7XHJcbiIsIlwidXNlIHN0cmljdFwiO1xyXG5jb25zdCBiYXNlID0gcmVxdWlyZShcIi4uL0Jhc2UvVk1CYXNlXCIpO1xyXG5jbGFzcyBDb250ZW50UGFnZUJhc2UgZXh0ZW5kcyBiYXNlLlZtQmFzZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihkYXRhLCBmb3JtVHlwZSwgdGFibGVUeXBlLCByb3V0ZXJUeXBlKSB7XHJcbiAgICAgICAgc3VwZXIoZGF0YSwgZm9ybVR5cGUsIHRhYmxlVHlwZSwgcm91dGVyVHlwZSk7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcclxuICAgIH1cclxufVxyXG5tb2R1bGUuZXhwb3J0cyA9IENvbnRlbnRQYWdlQmFzZTtcclxuIiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xyXG5jb25zdCBrbyA9IHJlcXVpcmUoXCJrbm9ja291dFwiKTtcclxuY29uc3QgXyA9IHJlcXVpcmUoXCJ1bmRlcnNjb3JlXCIpO1xyXG5jb25zdCBGb3JtID0gcmVxdWlyZShcIi4uL0Jhc2UvRm9ybVwiKTtcclxuY29uc3QgbW9tZW50ID0gcmVxdWlyZShcIm1vbWVudFwiKTtcclxuY29uc3Qgc3VtbWVybm90ZSA9IHJlcXVpcmUoXCJzdW1tZXJub3RlXCIpO1xyXG5zdW1tZXJub3RlO1xyXG5jbGFzcyBDb250ZW50UGFnZUZvcm0gZXh0ZW5kcyBGb3JtIHtcclxuICAgIGNvbnN0cnVjdG9yKGRhdGEsIHZtKSB7XHJcbiAgICAgICAgc3VwZXIoZGF0YSwgdm0pO1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICAgICAgdGhpcy52bSA9IHZtO1xyXG4gICAgICAgIHRoaXMudmVyc2lvbkVycm9yS2V5ID0gJ0NGMUI2MTgzLThBMTEtNDQ5Ri04QzRCLUQxQUUxM0I3REUwRic7XHJcbiAgICAgICAgdGhpcy5uZXdQYWdlTmFtZSA9IGtvLm9ic2VydmFibGUoJycpO1xyXG4gICAgICAgIHRoaXMubmV3UGFnZU5hbWUuc3Vic2NyaWJlKChuZXdWYWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnZtLk5ld0l0ZW1EZXRhaWwuTmFtZShuZXdWYWx1ZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5hZGRJdGVtRGV0YWlsQ2xpZW50T25seVByb3BlcnRpZXMoKTtcclxuICAgIH1cclxuICAgIHNldHVwVGFicygpIHtcclxuICAgICAgICAkKHRoaXMudGFiUm93U2VsZWN0b3IgKyAnIGgyJykuaGlkZSgpO1xyXG4gICAgICAgIC8vY3JlYXRlIGEga25vY2tvdXRvYnNlcnZhYmxlIGZvcmVhY2ggaDIgaW5zaWRlIGEgcm93XHJcbiAgICAgICAgJCh0aGlzLnRhYlJvd1NlbGVjdG9yICsgJyBoMicpLmVhY2goKGluZGV4LCB2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgZWxlbWVudCA9ICQodmFsdWUpO1xyXG4gICAgICAgICAgICB2YXIgYXR0ciA9ICd2aXNpYmxlOiAkcm9vdC5BY3RpdmVUYWJJbmRleCgpID09PSAnICsgaW5kZXgudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgJCh2YWx1ZSkucGFyZW50KCkucGFyZW50KCkuYXR0cignZGF0YS1iaW5kJywgYXR0cik7XHJcbiAgICAgICAgICAgIHZhciBhbGxMYW5nID0gdGhpcy52bS5NZXRhLkFsbExhbmd1YWdlcztcclxuICAgICAgICAgICAgdmFyIG1hdGNoaW5nTGFuZyA9IF8uZmluZFdoZXJlKGFsbExhbmcsIHsgTmFtZTogZWxlbWVudC5odG1sKCkgfSk7XHJcbiAgICAgICAgICAgIHZhciBuZXdUYWIgPSB7XHJcbiAgICAgICAgICAgICAgICBUZXh0OiBrby5vYnNlcnZhYmxlKGVsZW1lbnQuaHRtbCgpKSxcclxuICAgICAgICAgICAgICAgIEVycm9yQ291bnQ6IGtvLm9ic2VydmFibGUoMCksXHJcbiAgICAgICAgICAgICAgICBDaGFuZ2VDb3VudDoga28ub2JzZXJ2YWJsZSgwKSxcclxuICAgICAgICAgICAgICAgIEhpZGRlbjoga28ub2JzZXJ2YWJsZShmYWxzZSksXHJcbiAgICAgICAgICAgICAgICBJZDogbnVsbFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBpZiAobWF0Y2hpbmdMYW5nKSB7XHJcbiAgICAgICAgICAgICAgICBuZXdUYWIuSWQgPSBtYXRjaGluZ0xhbmcuSWQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy52bS5Gb3JtVGFicy5wdXNoKG5ld1RhYik7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy52bS5BY3RpdmVUYWJJbmRleCgwKTtcclxuICAgIH1cclxuICAgIC8vZmluZCB0aGUgZm9ybSBpbnB1dCBiYXNlZCBvbiBwcm9wcnR5IGtleVxyXG4gICAgYWRkUHJvcGVydHlFcnJvcihwcm9wZXJ0eUVycm9yKSB7XHJcbiAgICAgICAgdmFyIGtleSA9IHByb3BlcnR5RXJyb3IuS2V5LCBtZXNzYWdlID0gcHJvcGVydHlFcnJvci5FcnJvck1lc3NhZ2U7XHJcbiAgICAgICAgdmFyIGZvcm1pbnB1dCA9IG51bGw7XHJcbiAgICAgICAgaWYgKGtleS5pbmRleE9mKHRoaXMudmVyc2lvbkVycm9yS2V5KSA+IC0xKSB7XHJcbiAgICAgICAgICAgIGZvcm1pbnB1dCA9IHRoaXMuZ2V0VmVyc2lvbkZvcm1JbnB1dChrZXkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgLy9maW5kIG1hdGNoaW5nIGlucHV0XHJcbiAgICAgICAgICAgIGZvcm1pbnB1dCA9ICQoJyMnICsga2V5LnJlcGxhY2UoL1xcLi9nLCAnXycpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5mb3JtSW5wdXRBZGRFcnJvcihmb3JtaW5wdXQsIGtleSwgbWVzc2FnZSk7XHJcbiAgICB9XHJcbiAgICByZW1vdmVFcnJvcihrZXkpIHtcclxuICAgICAgICB2YXIgZm9ybWlucHV0ID0gbnVsbDtcclxuICAgICAgICBpZiAoa2V5LmluZGV4T2YodGhpcy52ZXJzaW9uRXJyb3JLZXkpID4gLTEpIHtcclxuICAgICAgICAgICAgZm9ybWlucHV0ID0gdGhpcy5nZXRWZXJzaW9uRm9ybUlucHV0KGtleSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBmb3JtaW5wdXQgPSAkKCcjJyArIGtleS5yZXBsYWNlKC9cXC4vZywgJ18nKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZm9ybUlucHV0UmVtb3ZlRXJyb3IoZm9ybWlucHV0LCBrZXkpO1xyXG4gICAgfVxyXG4gICAgZm9ybUlucHV0UmVtb3ZlRXJyb3IoZm9ybWlucHV0LCBrZXkpIHtcclxuICAgICAgICBzdXBlci5mb3JtSW5wdXRSZW1vdmVFcnJvcihmb3JtaW5wdXQsIGtleSk7XHJcbiAgICB9XHJcbiAgICBnZXRWZXJzaW9uRm9ybUlucHV0KGtleSkge1xyXG4gICAgICAgIHZhciBzcGxpdFZhbCA9IGtleS5zcGxpdCgnfCcpO1xyXG4gICAgICAgIHZhciBsYW5nID0gc3BsaXRWYWxbMV07XHJcbiAgICAgICAgdmFyIHZlcnNpb24gPSBzcGxpdFZhbFsyXTtcclxuICAgICAgICB2YXIgcHJvcGVydHkgPSBzcGxpdFZhbFszXTtcclxuICAgICAgICB2YXIgdm0gPSB0aGlzLnZtO1xyXG4gICAgICAgIC8vZmluZCB0aGUgdGFiIGZvciB0aGUgbGFuZyBhbmQgXHJcbiAgICAgICAgLy92YXIgdGFiID0gXy5maW5kKHRoaXMudm0uRm9ybVRhYnMoKSwgeyBJZDogbGFuZyB9KTtcclxuICAgICAgICByZXR1cm4gJCgnIycgKyBwcm9wZXJ0eSwgJy4nICsgbGFuZyArICctdGFiJyk7XHJcbiAgICB9XHJcbiAgICAvL3Byb3RlY3RlZCBzZXR1cENsZWFyVmFsaWRhdGlvbihwcm9wZXJ0eSkge1xyXG4gICAgLy8gICAgdmFyIHZtUHJvcGVydHk7XHJcbiAgICAvLyAgICAvL2dldCBwcm9wZXJ0eSBvZmYgb2Ygdm0gdXNpbmcgc3RyaW5nIG5hbWUgY29taW5nIGZyb20gc2VydmVyXHJcbiAgICAvLyAgICB2YXIgcHJvcGVydHlQYXJ0cyA9IHByb3BlcnR5LnNwbGl0KCcuJyk7XHJcbiAgICAvLyAgICB2YXIgY291bnRPZlBhcnRzID0gcHJvcGVydHlQYXJ0cy5sZW5ndGg7XHJcbiAgICAvLyAgICBpZiAoY291bnRPZlBhcnRzID09PSAyKVxyXG4gICAgLy8gICAgICAgIHZtUHJvcGVydHkgPSB0aGlzLnZtW3Byb3BlcnR5UGFydHNbMF1dW3Byb3BlcnR5UGFydHNbMV1dO1xyXG4gICAgLy8gICAgaWYgKGNvdW50T2ZQYXJ0cyA9PT0gMylcclxuICAgIC8vICAgICAgICB2YXIgYWN0aXZlVmVyc2lvbiA9IHRoaXMudm1bcHJvcGVydHlQYXJ0c1swXV1bcHJvcGVydHlQYXJ0c1sxXV07XHJcbiAgICAvLyAgICB2bVByb3BlcnR5ID0gJCgnaW5wdXQjVGl0bGUuZm9ybS1jb250cm9sJyk7XHJcbiAgICAvLyAgICBpZiAoa28uaXNPYnNlcnZhYmxlKHZtUHJvcGVydHkpKSB7XHJcbiAgICAvLyAgICAgICAgdmFyIHN1YnNjcmlwdGlvbiA9IHZtUHJvcGVydHkuc3Vic2NyaWJlKChuZXdWYWx1ZSkgPT4ge1xyXG4gICAgLy8gICAgICAgICAgICB2YXIgZm9ybWlucHV0O1xyXG4gICAgLy8gICAgICAgICAgICAvL3Byb3BlcnR5IGlkIGhhcyBfIGluc3RlYWQgb2YgLlxyXG4gICAgLy8gICAgICAgICAgICBpZiAoY291bnRPZlBhcnRzID09PSAyKVxyXG4gICAgLy8gICAgICAgICAgICAgICAgZm9ybWlucHV0ID0gJCgnIycgKyBwcm9wZXJ0eS5yZXBsYWNlKC9cXC4vZywgJ18nKSk7XHJcbiAgICAvLyAgICAgICAgICAgIC8vc2VsZWN0MiB1c2VzIHBhcmVudFxyXG4gICAgLy8gICAgICAgICAgICBpZiAoZm9ybWlucHV0Lmhhc0NsYXNzKCdzZWxlY3QyLW9mZnNjcmVlbicpKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICBmb3JtaW5wdXQgPSAkKCcuc2VsZWN0Mi1jb250YWluZXInLCBmb3JtaW5wdXQucGFyZW50KCkpO1xyXG4gICAgLy8gICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgICAgIC8vcmVtb3ZlIGVycm9yIGNsYXNzIHRvIHBhcmVudCBlbGVtZW50XHJcbiAgICAvLyAgICAgICAgICAgIHZhciBmb3JtR3JvdXAgPSBmb3JtaW5wdXQucGFyZW50KCk7XHJcbiAgICAvLyAgICAgICAgICAgIGZvcm1Hcm91cC5yZW1vdmVDbGFzcygnaGFzLWVycm9yIGhhcy1mZWVkYmFjaycpO1xyXG4gICAgLy8gICAgICAgICAgICAvL3JlbW92ZSBib290c3JhcCBwb3BvdmVyXHJcbiAgICAvLyAgICAgICAgICAgIGlmICgoZm9ybWlucHV0KS5hdHRyKCdkYXRhLXRyaWdnZXInKSkge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgZm9ybWlucHV0XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgLnJlbW92ZUF0dHIoJ2RhdGEtdHJpZ2dlcicpXHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgLnJlbW92ZUF0dHIoJ2RhdGEtcGxhY2VtZW50JylcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAucmVtb3ZlQXR0cignZGF0YS1jb250ZW50JylcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAucG9wb3ZlcignZGVzdHJveScpIC8vdG9kbyBib290c3RyYXAgcG9wb3ZlclxyXG4gICAgLy8gICAgICAgICAgICAgICAgO1xyXG4gICAgLy8gICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgICAgIC8vcmVtb3ZlIHBvcG92ZXIgZWxlbWVudFxyXG4gICAgLy8gICAgICAgICAgICAkKCcuZm9ybS1jb250cm9sLWZlZWRiYWNrJywgZm9ybUdyb3VwKS5yZW1vdmUoKTtcclxuICAgIC8vICAgICAgICAgICAgLy9nZXQgcmlkIG9mIHN1YnNjcmlwdGlvblxyXG4gICAgLy8gICAgICAgICAgICBzdWJzY3JpcHRpb24uZGlzcG9zZSgpO1xyXG4gICAgLy8gICAgICAgICAgICAvL3JlZnJlc2ggdGFic1xyXG4gICAgLy8gICAgICAgICAgICB0aGlzLnJlZnJlc2hUYWJWYWxpZGF0aW9uQmFkZ2VzKCk7XHJcbiAgICAvLyAgICAgICAgICAgIC8vaGFuZGxlIHNwYW4gZGlmZmVyZW50bHlcclxuICAgIC8vICAgICAgICAgICAgdmFyIGlzU3BhbiA9IGZvcm1pbnB1dC5pcygnc3BhbicpO1xyXG4gICAgLy8gICAgICAgICAgICBpZiAoaXNTcGFuKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICBmb3JtaW5wdXQudGV4dCgnJyk7XHJcbiAgICAvLyAgICAgICAgICAgICAgICBmb3JtaW5wdXQucmVtb3ZlQ2xhc3MoJ2xhYmVsIGxhYmVsLWRhbmdlcicpO1xyXG4gICAgLy8gICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgfSk7XHJcbiAgICAvLyAgICB9XHJcbiAgICAvL31cclxuICAgIHNldHVwQmluZGlncygpIHtcclxuICAgICAgICBzdXBlci5zZXR1cEJpbmRpZ3MoKTtcclxuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgJCgnLnZlcnNpb24tdGFiJykub24oJ2NsaWNrJywgJy5hY3RpdmF0ZS12ZXJzaW9uJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgZGF0YSA9IGtvLmRhdGFGb3IodGhpcyk7XHJcbiAgICAgICAgICAgIC8vZmlndXJlIG91dCB2ZXJzaW9uXHJcbiAgICAgICAgICAgIC8vbWFrZSBzdXJlIGN1cnJlbnQgQWN0aXZlXyB2ZXJzaW9uIGlzIHZhbGlkIChpZiBpdHMgbm90IHZhbGlkIHdlIGNhbnQgbmF2aWdhdGUgYXdheSlcclxuICAgICAgICAgICAgc2VsZi52bS5JdGVtRGV0YWlsWydBY3RpdmVfJyArIGRhdGEuTGFuZ3VhZ2UoKV0oZGF0YSk7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9KTtcclxuICAgICAgICAkKGAuJHt0aGlzLmRhdGEuVGl0bGV9LWZvcm0tYm9keWApLm9uKCdjbGljaycsICcjY29uZmlybS1kZWxldGUnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuY29uZmlybURlbGV0ZSgpO1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5hZGRBY3RpdmVUYWJMYW5ndWFnZUlkKCk7XHJcbiAgICB9XHJcbiAgICByZXNldERldGFpbCgpIHtcclxuICAgICAgICBzdXBlci5yZXNldERldGFpbCgpO1xyXG4gICAgICAgIHRoaXMuY2xlYXJBbGxWZXJzaW9ucygpO1xyXG4gICAgfVxyXG4gICAgc29ydEFsbFZlcnNpb25zKCkge1xyXG4gICAgICAgIC8vdG9kbyB3aHkgZG9lcyB0aGlzIG1ha2Ugb2JqZWN0cyBiZWluZyBzb3J0ZWQgb2JzZXJ2YWJsZT9cclxuICAgICAgICAvL3RoaXMudm0uSXRlbURldGFpbC5BbGxWZXJzaW9ucy5zb3J0KCh2ZXJzaW9uMSwgdmVyc2lvbjIpID0+IHtcclxuICAgICAgICAvLyAgICBpZiAodmVyc2lvbjEuRGF0ZSgpID09PSB2ZXJzaW9uMi5EYXRlKCkpIHtcclxuICAgICAgICAvLyAgICAgICAgcmV0dXJuIHZlcnNpb24xLlZlcnNpb24oKSA8IHZlcnNpb24yLlZlcnNpb24oKTtcclxuICAgICAgICAvLyAgICB9XHJcbiAgICAgICAgLy8gICAgcmV0dXJuIHZlcnNpb24xLkRhdGUoKSA8IHZlcnNpb24yLkRhdGUoKTtcclxuICAgICAgICAvL30pO1xyXG4gICAgfVxyXG4gICAgc2V0dXBMYW5ndWFnZVZlcnNpb25zKCkge1xyXG4gICAgICAgIHZhciBtYXhMYW5ndWFnZVZlcnNpb24gPSB7fTtcclxuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgdGhpcy5jbGVhckFsbExhbmd1YWdlVmVyc2lvbnMoKTtcclxuICAgICAgICBfLmVhY2godGhpcy52bS5JdGVtRGV0YWlsLkFsbFZlcnNpb25zKCksICh2KSA9PiB7XHJcbiAgICAgICAgICAgIC8vdGhpcyBuZWVkcyB0byBwdWxsIHRoZSBwYXJlbnQgdXJsIHRvIGFwcGVuZCB0byB0aGUgYmVnaW5pbmcgaWYgaXQgaGFzIGEgcGFyZW50XHJcbiAgICAgICAgICAgIHNlbGYuYWRkTmV3UGVybWFsaW5rKHYpO1xyXG4gICAgICAgICAgICAvL2FkZCB0byBsYW5ndWFnZSB2ZXJzaW9uIGFycmF5XHJcbiAgICAgICAgICAgIHZhciBsYW5ndWFnZSA9IHYuTGFuZ3VhZ2UoKTtcclxuICAgICAgICAgICAgdGhpcy5hZGRWZXJzaW9uQ29tcHV0ZWQodik7XHJcbiAgICAgICAgICAgIHZhciBwcm9wZXJ0eU5hbWUgPSBgQWxsXyR7di5MYW5ndWFnZSgpfWA7XHJcbiAgICAgICAgICAgIHRoaXMudm0uSXRlbURldGFpbFtwcm9wZXJ0eU5hbWVdLnB1c2godik7XHJcbiAgICAgICAgICAgIC8vc2V0IG1heCB2ZXJzaW9uIGluIHRlbXAgb2JqZWN0XHJcbiAgICAgICAgICAgIC8vaWYgdGhlcmUgaXMgbm8gbWF4IHZlcnNpb24gZm9yIGxhbmd1YWdlIG1ha2UgaXQgdGhpcyBvbmVcclxuICAgICAgICAgICAgaWYgKG1heExhbmd1YWdlVmVyc2lvbltsYW5ndWFnZV0gPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBtYXhMYW5ndWFnZVZlcnNpb25bbGFuZ3VhZ2VdID0gdjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vaWYgdGhpcyBvbmUgaXMgYmlnZ2VyIHRoYW4gdGhlIGN1cnJlbnQgbWF4IG1ha2UgdGhpcyBvbmUgdGhlIG1heFxyXG4gICAgICAgICAgICAgICAgaWYgKHYuVmVyc2lvbigpID4gbWF4TGFuZ3VhZ2VWZXJzaW9uW2xhbmd1YWdlXS5WZXJzaW9uKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBtYXhMYW5ndWFnZVZlcnNpb25bbGFuZ3VhZ2VdID0gdjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIC8vc2V0IG1heCB2ZXJzaW9uIHRvIG9ic2VydmFibGVcclxuICAgICAgICBfLmVhY2godGhpcy52bS5NZXRhLkFsbExhbmd1YWdlcywgKHYpID0+IHtcclxuICAgICAgICAgICAgdmFyIHByb3BlcnR5TmFtZSA9IGBBY3RpdmVfJHt2LklkfWA7XHJcbiAgICAgICAgICAgIGlmIChtYXhMYW5ndWFnZVZlcnNpb25bdi5JZF0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGFjdGl2ZVZlcnNpb24gPSB0aGlzLnZtLkl0ZW1EZXRhaWxbcHJvcGVydHlOYW1lXSgpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGFjdGl2ZVZlcnNpb24gPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnZtLkl0ZW1EZXRhaWxbcHJvcGVydHlOYW1lXShtYXhMYW5ndWFnZVZlcnNpb25bdi5JZF0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxhbmcgPSB2LklkO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciB2ZXJzaW9uID0gYWN0aXZlVmVyc2lvbi5WZXJzaW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFjdGl2ZVZlcnNpb24gPSBfLmZpbmQodGhpcy52bS5JdGVtRGV0YWlsW2BBbGxfJHt2LklkfWBdKCksICh2ZXIpID0+ICh2ZXIuVmVyc2lvbigpID09PSB2ZXJzaW9uICYmIHZlci5MYW5ndWFnZSgpID09PSBsYW5nKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52bS5JdGVtRGV0YWlsW3Byb3BlcnR5TmFtZV0oYWN0aXZlVmVyc2lvbik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcHJvcGVydHlOYW1lID0gYE1heFZlcnNpb25fJHt2LklkfWA7XHJcbiAgICAgICAgICAgIHZhciB4ID0gbWF4TGFuZ3VhZ2VWZXJzaW9uW3YuSWRdID9cclxuICAgICAgICAgICAgICAgIG1heExhbmd1YWdlVmVyc2lvblt2LklkXSA6XHJcbiAgICAgICAgICAgICAgICBrby5tYXBwaW5nLmZyb21KUyhrby50b0pTKHRoaXMudm0uTmV3VmVyc2lvbikpO1xyXG4gICAgICAgICAgICB0aGlzLnZtLkl0ZW1EZXRhaWxbcHJvcGVydHlOYW1lXSh4KTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmFkZEFjdGl2ZVRhYkxhbmd1YWdlSWQoKTtcclxuICAgIH1cclxuICAgIGNsZWFyQWxsTGFuZ3VhZ2VWZXJzaW9ucygpIHtcclxuICAgICAgICBfLmVhY2godGhpcy52bS5NZXRhLkFsbExhbmd1YWdlcywgKHYpID0+IHtcclxuICAgICAgICAgICAgdmFyIHByb3BlcnR5TmFtZSA9IGBBbGxfJHt2LklkfWA7XHJcbiAgICAgICAgICAgIHRoaXMudm0uSXRlbURldGFpbFtwcm9wZXJ0eU5hbWVdLnJlbW92ZUFsbCgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgYWRkVmVyc2lvbkNvbXB1dGVkKHZlcnNpb24pIHtcclxuICAgIH1cclxuICAgIGFkZEFjdGl2ZVRhYkxhbmd1YWdlSWQoKSB7XHJcbiAgICAgICAgdGhpcy52bS5JdGVtRGV0YWlsWydBY3RpdmVUYWJMYW5ndWFnZUlkJ10gPSBrby5jb21wdXRlZCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGEuTWV0YS5BbGxMYW5ndWFnZXNbdGhpcy52bS5BY3RpdmVUYWJJbmRleCgpXSlcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGEuTWV0YS5BbGxMYW5ndWFnZXNbdGhpcy52bS5BY3RpdmVUYWJJbmRleCgpXS5JZDtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBnZXROZXdWZXJzaW9uKGxhbmd1YWdlKSB7XHJcbiAgICAgICAgdmFyIG1heFZlcnNpb24gPSB0aGlzLnZtLkl0ZW1EZXRhaWxbJ01heFZlcnNpb25fJyArIGxhbmd1YWdlXSgpLlZlcnNpb24oKTtcclxuICAgICAgICB2YXIgbmV3VmVyc2lvbiA9IG1heFZlcnNpb24gKyAxO1xyXG4gICAgICAgIHZhciB2ZXJzaW9uVG9DcmVhdGVGcm9tID0gdGhpcy5nZXRWZXJzaW9uVG9DcmVhdGVGcm9tKGxhbmd1YWdlKTtcclxuICAgICAgICB2YXIgbmV3T2JzZXJ2YWJsZSA9IGtvLm1hcHBpbmcuZnJvbUpTKGtvLnRvSlModmVyc2lvblRvQ3JlYXRlRnJvbSkpO1xyXG4gICAgICAgIHRoaXMuYWRkVmVyc2lvbkNvbXB1dGVkKG5ld09ic2VydmFibGUpO1xyXG4gICAgICAgIG5ld09ic2VydmFibGUuSWQodGhpcy52bS5OZXdWZXJzaW9uLklkKCkpO1xyXG4gICAgICAgIHZhciB0b2RheSA9IG1vbWVudCgpLmZvcm1hdCgnWVlZWS1NTS1ERFtUXScpICsgJzAwOjAwOjAwJztcclxuICAgICAgICBuZXdPYnNlcnZhYmxlLlZlcnNpb24obmV3VmVyc2lvbik7XHJcbiAgICAgICAgbmV3T2JzZXJ2YWJsZS5WZXJzaW9uRGlzcGxheShsYW5ndWFnZSArICctJyArIG5ld09ic2VydmFibGUuVmVyc2lvbigpKTtcclxuICAgICAgICBuZXdPYnNlcnZhYmxlLkxhbmd1YWdlKGxhbmd1YWdlKTtcclxuICAgICAgICBuZXdPYnNlcnZhYmxlLkRhdGUodG9kYXkpO1xyXG4gICAgICAgIG5ld09ic2VydmFibGUuU3RhcnREYXRlVGltZSA9IGtvLm9ic2VydmFibGUobmV3IERhdGUoKSk7XHJcbiAgICAgICAgbmV3T2JzZXJ2YWJsZS5EYXRlKHRvZGF5KTtcclxuICAgICAgICBuZXdPYnNlcnZhYmxlLlBhcmVudENvbnRlbnRQYWdlID0ga28ub2JzZXJ2YWJsZSh2ZXJzaW9uVG9DcmVhdGVGcm9tLlBhcmVudENvbnRlbnRQYWdlKCkpO1xyXG4gICAgICAgIG5ld09ic2VydmFibGUuSXNSZWFkT25seShmYWxzZSk7XHJcbiAgICAgICAgbmV3T2JzZXJ2YWJsZS5DcmVhdGVkQnkodGhpcy52bS5Vc2VyLlVzZXJOYW1lKCkpO1xyXG4gICAgICAgIG5ld09ic2VydmFibGUuQ3JlYXRlZERhdGUodG9kYXkpO1xyXG4gICAgICAgIG5ld09ic2VydmFibGUuU3RhdHVzKHRoaXMudm0uTmV3VmVyc2lvbi5TdGF0dXMoKSk7XHJcbiAgICAgICAgLy9uZXdPYnNlcnZhYmxlLlN0YXR1cygnRHJhZnQnKTtcclxuICAgICAgICB0aGlzLnZtLkl0ZW1EZXRhaWwuQWxsVmVyc2lvbnMucHVzaChuZXdPYnNlcnZhYmxlKTtcclxuICAgICAgICB0aGlzLnZtLkl0ZW1EZXRhaWxbJ0FsbF8nICsgbGFuZ3VhZ2VdLnB1c2gobmV3T2JzZXJ2YWJsZSk7XHJcbiAgICAgICAgdGhpcy5zb3J0QWxsVmVyc2lvbnMoKTtcclxuICAgICAgICB0aGlzLnZtLkl0ZW1EZXRhaWxbJ01heFZlcnNpb25fJyArIGxhbmd1YWdlXShuZXdPYnNlcnZhYmxlKTtcclxuICAgICAgICB0aGlzLmFkZE5ld1Blcm1hbGluayhuZXdPYnNlcnZhYmxlKTtcclxuICAgICAgICB0aGlzLnZtLkl0ZW1EZXRhaWxbJ0FjdGl2ZV8nICsgbGFuZ3VhZ2VdKG5ld09ic2VydmFibGUpO1xyXG4gICAgICAgIHJldHVybiBuZXdPYnNlcnZhYmxlO1xyXG4gICAgfVxyXG4gICAgZ2V0VmVyc2lvblRvQ3JlYXRlRnJvbShsYW5ndWFnZSkge1xyXG4gICAgICAgIC8vZmlyc3Qgc2VlIGlmIHRoZXJlIGlzIGEgYWN0aXZlIHZlcnNpb24gZm9yIGxhbmd1YWdlXHJcbiAgICAgICAgdmFyIHZlcnNpb25Ub0NyZWF0ZUZyb20gPSB0aGlzLnZtLkl0ZW1EZXRhaWxbJ0FjdGl2ZV8nICsgbGFuZ3VhZ2VdKCk7XHJcbiAgICAgICAgLy9jaGVjayBhbGwgdmVyc2lvbnMgXHJcbiAgICAgICAgaWYgKHZlcnNpb25Ub0NyZWF0ZUZyb20gPT09IG51bGwpIHtcclxuICAgICAgICAgICAgdmVyc2lvblRvQ3JlYXRlRnJvbSA9IF8ubWF4KHRoaXMudm0uSXRlbURldGFpbC5BbGxWZXJzaW9ucygpLCBmdW5jdGlvbiAodmVyc2lvbikgeyByZXR1cm4gdmVyc2lvbi5WZXJzaW9uKCk7IH0pO1xyXG4gICAgICAgICAgICBpZiAodmVyc2lvblRvQ3JlYXRlRnJvbSA9PT0gLUluZmluaXR5KVxyXG4gICAgICAgICAgICAgICAgdmVyc2lvblRvQ3JlYXRlRnJvbSA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vZmluYWxseSB1c2VkIGRlZmF1bHQgbmV3IHZlcnNpb25cclxuICAgICAgICBpZiAodmVyc2lvblRvQ3JlYXRlRnJvbSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICB2ZXJzaW9uVG9DcmVhdGVGcm9tID0gdGhpcy52bS5OZXdWZXJzaW9uO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdmVyc2lvblRvQ3JlYXRlRnJvbTtcclxuICAgIH1cclxuICAgIC8vY2hhbmdlU3RhdHVzKGlkLCBzdGF0dXMpIHtcclxuICAgIC8vICAgIHZhciBwcm9wZXJ0eU5hbWUgPSBgQWN0aXZlXyR7aWR9YDtcclxuICAgIC8vICAgIC8va2VlcCB0cmFjayBvZiB0aGUgb3JpZ2luYWwgc3RhdHVzIGluY2FzZSB0aGUgc2VydmVyIHZhbGlkYXRpb24gZmFpbHNcclxuICAgIC8vICAgIHRoaXMudm0uSXRlbURldGFpbFtwcm9wZXJ0eU5hbWVdKCkuT3JpZ2luYWxTdGF0dXModGhpcy52bS5JdGVtRGV0YWlsW3Byb3BlcnR5TmFtZV0oKS5TdGF0dXMoKSk7XHJcbiAgICAvLyAgICB0aGlzLnZtLkl0ZW1EZXRhaWxbcHJvcGVydHlOYW1lXSgpLlN0YXR1cyhzdGF0dXMpO1xyXG4gICAgLy8gICAgc3VwZXIucG9zdCgpO1xyXG4gICAgLy99XHJcbiAgICBjaGFuZ2VTdGF0dXMoaWQsIHN0YXR1cykge1xyXG4gICAgICAgIHZhciBwcm9wZXJ0eU5hbWUgPSBgQWN0aXZlXyR7aWR9YDtcclxuICAgICAgICB2YXIgb2xkU3RhdHVzID0gdGhpcy52bS5JdGVtRGV0YWlsW3Byb3BlcnR5TmFtZV0oKS5TdGF0dXMoKTtcclxuICAgICAgICB0aGlzLnZtLkl0ZW1EZXRhaWxbcHJvcGVydHlOYW1lXSgpLk9yaWdpbmFsU3RhdHVzKG9sZFN0YXR1cyk7XHJcbiAgICAgICAgdGhpcy52bS5JdGVtRGV0YWlsW3Byb3BlcnR5TmFtZV0oKS5TdGF0dXMoc3RhdHVzKTtcclxuICAgICAgICB0aGlzLnZtLkl0ZW1EZXRhaWwuQWN0aXZlVmVyc2lvbkRpc3BsYXkodGhpcy52bS5JdGVtRGV0YWlsW3Byb3BlcnR5TmFtZV0oKS5WZXJzaW9uRGlzcGxheSgpKTtcclxuICAgICAgICB0aGlzLnBvc3QoKTtcclxuICAgICAgICAvL3ZhciBwcm9taXNlID0gc3VwZXIucG9zdCgpO1xyXG4gICAgICAgIC8vcHJvbWlzZS5mYWlsKChkYXRhKSA9PiB0aGlzLmdldFByb21pc2VGYWlsKGRhdGEsIGlkKSk7XHJcbiAgICAgICAgLy9yZXR1cm4gcHJvbWlzZTtcclxuICAgIH1cclxuICAgIHVuUHVibGlzaChpZCkge1xyXG4gICAgICAgIHZhciBwcm9wZXJ0eU5hbWUgPSBgQWN0aXZlXyR7aWR9YDtcclxuICAgICAgICB2YXIgZW5kVGltZSA9IG1vbWVudCgpLmZvcm1hdCgnWVlZWS1NTS1ERFtUXScpICsgJzAwOjAwOjAwJztcclxuICAgICAgICB2YXIgc3RhcnRUaW1lID0gbW9tZW50KCkuc3VidHJhY3QoMSwgJ2RheXMnKS5mb3JtYXQoJ1lZWVktTU0tRERbVF0nKSArICcwMDowMDowMCc7XHJcbiAgICAgICAgaWYgKHRoaXMudm0uSXRlbURldGFpbFtwcm9wZXJ0eU5hbWVdKCkuU3RhcnREYXRlVGltZSgpID09PSBlbmRUaW1lKSB7XHJcbiAgICAgICAgICAgIHRoaXMudm0uSXRlbURldGFpbFtwcm9wZXJ0eU5hbWVdKCkuU3RhcnREYXRlVGltZShzdGFydFRpbWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnZtLkl0ZW1EZXRhaWxbcHJvcGVydHlOYW1lXSgpLkVuZERhdGVUaW1lKGVuZFRpbWUpO1xyXG4gICAgICAgIHRoaXMucG9zdCgpO1xyXG4gICAgfVxyXG4gICAgcHJldmlldyhpZCkge1xyXG4gICAgICAgIHZhciBwcm9wZXJ0eU5hbWUgPSBgQWN0aXZlXyR7aWR9YDtcclxuICAgICAgICB0aGlzLnZtLkxlYXZlT3Blbk9uQWpheFN1Y2Nlc3ModHJ1ZSk7XHJcbiAgICAgICAgdmFyIHByb21pc2UgPSB0aGlzLnBvc3QoKTtcclxuICAgICAgICBwcm9taXNlLmRvbmUoKGRhdGEpID0+IHtcclxuICAgICAgICAgICAgdmFyIHZlcnNpb24gPSB0aGlzLnZtLkl0ZW1EZXRhaWxbcHJvcGVydHlOYW1lXSgpO1xyXG4gICAgICAgICAgICB0aGlzLnZtLkxlYXZlT3Blbk9uQWpheFN1Y2Nlc3MoZmFsc2UpO1xyXG4gICAgICAgICAgICB2YXIgdXJsID0gdmVyc2lvbi5QZXJtYWxpbmtEaXNwbGF5KCkgKyAnP3ByZXZpZXdJZD0nICsgdmVyc2lvbi5JZCgpICsgJyZ0aWNrPScgKyBEYXRlLm5vdygpO1xyXG4gICAgICAgICAgICB3aW5kb3cub3Blbih1cmwsICdfYmxhbmsnKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIGNsZWFyQWxsVmVyc2lvbnMoKSB7XHJcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIC8vY3JlYXRlIGEgZHluYW1pYyBhY3RpdmUgb2JzZXJ2YWJsZSBmb3IgZWFjaCBsYW5nIHR5cGVcclxuICAgICAgICBfLmVhY2goc2VsZi52bS5NZXRhLkFsbExhbmd1YWdlcywgKHYsIGkpID0+IHtcclxuICAgICAgICAgICAgdmFyIHByb3BlcnR5TmFtZSA9ICdBY3RpdmVfJyArIHYuSWQ7XHJcbiAgICAgICAgICAgIHRoaXMudm0uSXRlbURldGFpbFtwcm9wZXJ0eU5hbWVdKG51bGwpO1xyXG4gICAgICAgICAgICB2YXIgcHJvcGVydHlOYW1lID0gJ01heFZlcnNpb25fJyArIHYuSWQ7XHJcbiAgICAgICAgICAgIHZhciBtYXhWZXJzaW9uID0ga28ubWFwcGluZy5mcm9tSlMoa28udG9KUyh0aGlzLnZtLk5ld1ZlcnNpb24pKTtcclxuICAgICAgICAgICAgdGhpcy52bS5JdGVtRGV0YWlsW3Byb3BlcnR5TmFtZV0obWF4VmVyc2lvbik7XHJcbiAgICAgICAgICAgIHZhciBwcm9wZXJ0eU5hbWUgPSAnQWxsXycgKyB2LklkO1xyXG4gICAgICAgICAgICB0aGlzLnZtLkl0ZW1EZXRhaWxbcHJvcGVydHlOYW1lXS5yZW1vdmVBbGwoKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIGFkZEl0ZW1EZXRhaWxDbGllbnRPbmx5UHJvcGVydGllcygpIHtcclxuICAgICAgICAvL2NyZWF0ZSBhIGR5bmFtaWMgYWN0aXZlIG9ic2VydmFibGUgZm9yIGVhY2ggbGFuZyB0eXBlXHJcbiAgICAgICAgXy5lYWNoKHRoaXMudm0uTWV0YS5BbGxMYW5ndWFnZXMsICh2LCBpKSA9PiB7XHJcbiAgICAgICAgICAgIC8vQWN0aXZlXHJcbiAgICAgICAgICAgIHZhciBhY3RpdmVQcm9wZXJ0eU5hbWUgPSBgQWN0aXZlXyR7di5JZH1gO1xyXG4gICAgICAgICAgICB0aGlzLnZtLkl0ZW1EZXRhaWxbYWN0aXZlUHJvcGVydHlOYW1lXSA9IGtvLm9ic2VydmFibGUobnVsbCk7XHJcbiAgICAgICAgICAgIC8vTWF4XHJcbiAgICAgICAgICAgIHRoaXMudm0uSXRlbURldGFpbFtgTWF4VmVyc2lvbl8ke3YuSWR9YF0gPSBrby5vYnNlcnZhYmxlKG51bGwpO1xyXG4gICAgICAgICAgICAvL0FsbFxyXG4gICAgICAgICAgICB2YXIgcHJvcGVydHlOYW1lID0gYEFsbF8ke3YuSWR9YDtcclxuICAgICAgICAgICAgdGhpcy52bS5JdGVtRGV0YWlsW3Byb3BlcnR5TmFtZV0gPSBrby5vYnNlcnZhYmxlQXJyYXkoW10pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAga29tYXBwaW5nZnJvbWRhdGEoZGF0YSwgaWQpIHtcclxuICAgICAgICB2YXIgY29weU1hcHBpbmcgPSB7XHJcbiAgICAgICAgICAgICdjb3B5JzogdGhpcy5kYXRhLktPTWFwcGluZy5hbGxOb25Qb3N0QmFja1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgLy9kbyBub3QgbWFrZSBQYXJlbnRDb250ZW50UGFnZSBjaGlsZCBwcm9wZXJ0aWVzIG9ic2VydmFibGVcclxuICAgICAgICAvL21ha2UgdGhlIHdob2xlIFBhcmVudENvbnRlbnRQYWdlIG9iamVjdCBpdHNlbGYgb2JzZXJ2YWJsZVxyXG4gICAgICAgIGNvcHlNYXBwaW5nWydQYXJlbnRDb250ZW50UGFnZSddID0geyAnY3JlYXRlJzogZnVuY3Rpb24gKG9wdGlvbnMpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBrby5vYnNlcnZhYmxlKG9wdGlvbnMuZGF0YSk7XHJcbiAgICAgICAgICAgIH0gfTtcclxuICAgICAgICBrby5tYXBwaW5nLmZyb21KUyhkYXRhLkl0ZW1EZXRhaWwsIGNvcHlNYXBwaW5nLCB0aGlzLnZtLkl0ZW1EZXRhaWwpO1xyXG4gICAgfVxyXG4gICAgYWRkTmV3UGVybWFsaW5rKHYpIHtcclxuICAgICAgICB2LlBlcm1hbGlua0Rpc3BsYXkgPSBrby5jb21wdXRlZCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHZhciBwZXJtYWxpbmtEaXNwbGF5O1xyXG4gICAgICAgICAgICB2YXIgbGFuZ3VhZ2UgPSB2Lkxhbmd1YWdlKCkgKyAnLyc7XHJcbiAgICAgICAgICAgIGlmICh2Lkxhbmd1YWdlKCkgPT09ICdlbicpXHJcbiAgICAgICAgICAgICAgICBsYW5ndWFnZSA9ICcnO1xyXG4gICAgICAgICAgICAvL2lmIHdlIGhhdmUgYSBwYXJlbnQgZ2V0IGl0cyBhY3RpdmUgbm9kZSBsYW5ndWFnZSBtYXRjaCBhbmQgcHJlcGVuZCBpdHMgdXJsIFxyXG4gICAgICAgICAgICBpZiAodi5QYXJlbnRDb250ZW50UGFnZSgpICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgdmVyc2lvbiA9IF8uZmluZCh2LlBhcmVudENvbnRlbnRQYWdlKCkuQWN0aXZlVHJlZU5vZGVzLCAobm9kZSkgPT4gKG5vZGUuTGFuZ3VhZ2UgPT09IHYuTGFuZ3VhZ2UoKSkpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHZlcnNpb24gIT09IHVuZGVmaW5lZCAmJiB2ZXJzaW9uICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHVybCA9IHYuVXJsKCkgPT09IG51bGwgPyAnJyA6IHYuVXJsKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcGVybWFsaW5rRGlzcGxheSA9IHRoaXMuZGF0YS5Sb290VXJsICsgbGFuZ3VhZ2UgKyB2ZXJzaW9uLlVybCArICcvJyArIHVybDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHZhciB1cmwgPSB2LlVybCgpID09PSBudWxsID8gJycgOiB2LlVybCgpO1xyXG4gICAgICAgICAgICAgICAgcGVybWFsaW5rRGlzcGxheSA9IHRoaXMuZGF0YS5Sb290VXJsICsgbGFuZ3VhZ2UgKyB1cmw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHBlcm1hbGlua0Rpc3BsYXk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBnZXRQcm9taXNlRmFpbChlcnJvciwgaWQpIHtcclxuICAgICAgICB2YXIgcHJvcGVydHlOYW1lID0gYEFjdGl2ZV8ke2lkfWA7XHJcbiAgICAgICAgdmFyIG9sZFN0YXR1cyA9IHRoaXMudm0uSXRlbURldGFpbFtwcm9wZXJ0eU5hbWVdKCkuT3JpZ2luYWxTdGF0dXMoKTtcclxuICAgICAgICB0aGlzLnZtLkl0ZW1EZXRhaWxbcHJvcGVydHlOYW1lXSgpLlN0YXR1cyhvbGRTdGF0dXMpO1xyXG4gICAgfVxyXG4gICAgLy9nZXRQcm9taXNlRmFpbChlcnJvciwgaWQpIHtcclxuICAgIC8vICAgIHN1cGVyLmdldFByb21pc2VGYWlsKGVycm9yLCBpZCk7XHJcbiAgICAvL31cclxuICAgIGdldFByb21pc2VEb25lKGRhdGEsIGlkKSB7XHJcbiAgICAgICAgc3VwZXIuZ2V0UHJvbWlzZURvbmUoZGF0YSwgaWQpO1xyXG4gICAgICAgIHRoaXMuc29ydEFsbFZlcnNpb25zKCk7XHJcbiAgICAgICAgdGhpcy5zZXR1cExhbmd1YWdlVmVyc2lvbnMoKTtcclxuICAgIH1cclxuICAgIHBvc3RQcm9taXNlRG9uZShkYXRhKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnZtLkxlYXZlT3Blbk9uQWpheFN1Y2Nlc3MoKSkge1xyXG4gICAgICAgICAgICB0aGlzLnZtLnJvdXRlcy5nb0JhY2soKTtcclxuICAgICAgICAgICAgdGhpcy5yZXNldERldGFpbCgpO1xyXG4gICAgICAgICAgICB0aGlzLnZtLkFkZEFsZXJ0KGRhdGEuTWVzc2FnZSwgJ3N1Y2Nlc3MnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMubWFwUG9zdERhdGEoZGF0YSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMudm0uSXNMb2FkaW5nKGZhbHNlKTtcclxuICAgIH1cclxuICAgIHBvc3RQcm9taXNlRmFpbChlcnJvcikge1xyXG4gICAgICAgIHN1cGVyLnBvc3RQcm9taXNlRmFpbChlcnJvcik7XHJcbiAgICAgICAgXy5lYWNoKHRoaXMudm0uSXRlbURldGFpbC5BbGxWZXJzaW9ucygpLCBmdW5jdGlvbiAodmVyc2lvbikge1xyXG4gICAgICAgICAgICBpZiAodmVyc2lvbi5PcmlnaW5hbFN0YXR1cygpKSB7XHJcbiAgICAgICAgICAgICAgICB2ZXJzaW9uLlN0YXR1cyh2ZXJzaW9uLk9yaWdpbmFsU3RhdHVzKCkpO1xyXG4gICAgICAgICAgICAgICAgdmVyc2lvbi5PcmlnaW5hbFN0YXR1cyhudWxsKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgZ2V0Vm1Qcm9wZXJ0eShwcm9wZXJ0eSkge1xyXG4gICAgICAgIGlmIChwcm9wZXJ0eS5pbmRleE9mKHRoaXMudmVyc2lvbkVycm9yS2V5KSA+IC0xKSB7XHJcbiAgICAgICAgICAgIHZhciBzcGxpdFZhbCA9IHByb3BlcnR5LnNwbGl0KCd8Jyk7XHJcbiAgICAgICAgICAgIHZhciBsYW5nID0gc3BsaXRWYWxbMV07XHJcbiAgICAgICAgICAgIHZhciB2ZXJzaW9uID0gc3BsaXRWYWxbMl07XHJcbiAgICAgICAgICAgIHZhciBwcm9wZXJ0eSA9IHNwbGl0VmFsWzNdO1xyXG4gICAgICAgICAgICAvL3ZhciB2bSA9IHRoaXMudm07XHJcbiAgICAgICAgICAgIHZhciBlcnJvclZlcnNpb24gPSBfLmZpbmQodGhpcy52bS5JdGVtRGV0YWlsLkFsbFZlcnNpb25zKCksIGZ1bmN0aW9uICh2KSB7IHJldHVybiAodi5WZXJzaW9uKCkudG9TdHJpbmcoKSA9PT0gdmVyc2lvbiAmJiB2Lkxhbmd1YWdlKCkgPT09IGxhbmcpOyB9KTtcclxuICAgICAgICAgICAgcmV0dXJuIGVycm9yVmVyc2lvbltwcm9wZXJ0eV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0Vm1Qcm9wZXJ0eShwcm9wZXJ0eSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgbWFwUG9zdERhdGEoZGF0YSkge1xyXG4gICAgICAgIHN1cGVyLm1hcFBvc3REYXRhKGRhdGEpO1xyXG4gICAgICAgIHRoaXMuc2V0dXBMYW5ndWFnZVZlcnNpb25zKCk7XHJcbiAgICB9XHJcbiAgICBwb3N0KCkge1xyXG4gICAgICAgIC8vcHJldmVudCBkb3VibGUgcG9zdFxyXG4gICAgICAgIGlmICh0aGlzLnZtLklzTG9hZGluZygpKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy9tYWtlIG92ZXJsYXkgbG9hZGluZyBkaXYgZnVsbCBoZWlnaHRcclxuICAgICAgICAkKCcjbG9hZGluZycpLmhlaWdodCgkKHdpbmRvdykuaGVpZ2h0KCkpO1xyXG4gICAgICAgIHRoaXMudm0uSXNMb2FkaW5nKHRydWUpO1xyXG4gICAgICAgIHZhciBpZ25vcmVNYXBwaW5nID0ge1xyXG4gICAgICAgICAgICAnaWdub3JlJzogdGhpcy5kYXRhLktPTWFwcGluZy5hbGxOb25Qb3N0QmFja1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdmFyIHBvc3REYXRhID0ga28ubWFwcGluZy50b0pTKHRoaXMudm0sIGlnbm9yZU1hcHBpbmcpO1xyXG4gICAgICAgICQuZWFjaChwb3N0RGF0YS5JdGVtRGV0YWlsLkFsbFZlcnNpb25zLCBmdW5jdGlvbiAoaSwgdikge1xyXG4gICAgICAgICAgICBpZiAobW9tZW50LmlzTW9tZW50KHYuU3RhcnREYXRlVGltZSkpXHJcbiAgICAgICAgICAgICAgICB2LlN0YXJ0RGF0ZVRpbWUgPSB2LlN0YXJ0RGF0ZVRpbWUuZm9ybWF0KFwiWVlZWS1NTS1EVEhIOm1tOnNzLm1tbVwiKTtcclxuICAgICAgICAgICAgaWYgKCFpc05hTih2LkVuZERhdGVUaW1lKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKG1vbWVudC5pc01vbWVudCh2LkVuZERhdGVUaW1lKSlcclxuICAgICAgICAgICAgICAgICAgICB2LkVuZERhdGVUaW1lID0gdi5FbmREYXRlVGltZS5mb3JtYXQoXCJZWVlZLU1NLURUSEg6bW06c3MubW1tXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcG9zdERhdGEgPSBKU09OLnN0cmluZ2lmeShwb3N0RGF0YSk7XHJcbiAgICAgICAgcG9zdERhdGEgPSBwb3N0RGF0YS5yZXBsYWNlKCc8IS0tPHNjcmlwdCcsICc8c2NyaXB0Jyk7XHJcbiAgICAgICAgcG9zdERhdGEgPSBwb3N0RGF0YS5yZXBsYWNlKCc8L3NjcmlwdD4tLT4nLCAnPC9zY3JpcHQ+Jyk7XHJcbiAgICAgICAgZGVsZXRlIHBvc3REYXRhLkFsZXJ0cztcclxuICAgICAgICBkZWxldGUgcG9zdERhdGEuTmV3VmVyc2lvbjtcclxuICAgICAgICB2YXIgcHJvbWlzZSA9ICQuYWpheCh7XHJcbiAgICAgICAgICAgIHVybDogdGhpcy5wb3N0VXJsLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSxcclxuICAgICAgICAgICAgZGF0YTogcG9zdERhdGEsXHJcbiAgICAgICAgICAgIHR5cGU6ICdQT1NUJyxcclxuICAgICAgICAgICAgY2FjaGU6IGZhbHNlLFxyXG4gICAgICAgICAgICBjb250ZW50VHlwZTogJ2FwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtOCcsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcHJvbWlzZS5mYWlsKChlcnJvcikgPT4gdGhpcy5wb3N0UHJvbWlzZUZhaWwoZXJyb3IpKTtcclxuICAgICAgICBwcm9taXNlLmRvbmUoZGF0YSA9PiB0aGlzLnBvc3RQcm9taXNlRG9uZShkYXRhKSk7XHJcbiAgICAgICAgcmV0dXJuIHByb21pc2U7XHJcbiAgICB9XHJcbn1cclxubW9kdWxlLmV4cG9ydHMgPSBDb250ZW50UGFnZUZvcm07XHJcbiIsIlwidXNlIHN0cmljdFwiO1xyXG5jb25zdCBSb3V0ZXIgPSByZXF1aXJlKFwiLi4vQmFzZS9Sb3V0ZXJcIik7XHJcbmNsYXNzIENvbnRlbnRQYWdlUm91dGVyIGV4dGVuZHMgUm91dGVyIHtcclxuICAgIGNvbnN0cnVjdG9yKGRhdGEsIHZtLCBhbHRlcm5hdGVyb3V0ZXMpIHtcclxuICAgICAgICBzdXBlcihkYXRhLCB2bSwgYWx0ZXJuYXRlcm91dGVzKTtcclxuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xyXG4gICAgICAgIHRoaXMudm0gPSB2bTtcclxuICAgIH1cclxuICAgIGdldFJvdXRlcygpIHtcclxuICAgICAgICB2YXIgc2VsZjtcclxuICAgICAgICBzZWxmID0gdGhpcztcclxuICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBgJHtzZWxmLmdldEFyZWEoKX0vJHtzZWxmLmRhdGEuVGl0bGV9Iy9saXN0YCxcclxuICAgICAgICAgICAgICAgIGZ1bmM6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLmZvcm0uY2FuY2VsKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS50YWJsZS5sb2FkKCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvUmVnRXg6IGZhbHNlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IGAke3NlbGYuZ2V0QXJlYSgpfS8ke3NlbGYuZGF0YS5UaXRsZX0jL25ld2AsXHJcbiAgICAgICAgICAgICAgICBmdW5jKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uZm9ybS5hZGQoKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9SZWdFeDogZmFsc2VcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogYCR7c2VsZi5nZXRBcmVhKCl9LyR7c2VsZi5kYXRhLlRpdGxlfSMvdmlldy86aWRgLFxyXG4gICAgICAgICAgICAgICAgZnVuYygpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgaWQgPSB0aGlzLnBhcmFtc1snaWQnXTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLmZvcm0uZ2V0RGV0YWlsKGlkKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9SZWdFeDogZmFsc2VcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogYCR7c2VsZi5nZXRBcmVhKCl9LyR7c2VsZi5kYXRhLlRpdGxlfSMvaW5kZXhgLFxyXG4gICAgICAgICAgICAgICAgZnVuYygpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLmZvcm0uZ2V0RGV0YWlsKG51bGwpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbnZlcnRUb1JlZ0V4OiBmYWxzZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBgJHtzZWxmLmdldEFyZWEoKX0vJHtzZWxmLmRhdGEuVGl0bGV9Iy9kZWxldGUvOmlkYCxcclxuICAgICAgICAgICAgICAgIGZ1bmMoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGlkID0gdGhpcy5wYXJhbXNbJ2lkJ107XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5mb3JtLmRlbGV0ZUl0ZW0oaWQpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbnZlcnRUb1JlZ0V4OiBmYWxzZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgXTtcclxuICAgIH1cclxufVxyXG5tb2R1bGUuZXhwb3J0cyA9IENvbnRlbnRQYWdlUm91dGVyO1xyXG4iLCJcInVzZSBzdHJpY3RcIjtcclxuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XHJcbmNvbnN0IGtvID0gcmVxdWlyZShcImtub2Nrb3V0XCIpO1xyXG5jb25zdCBiYXNlID0gcmVxdWlyZShcIi4uL0Jhc2UvVk1CYXNlXCIpO1xyXG5jb25zdCBUYWJsZSA9IHJlcXVpcmUoXCIuLi9CYXNlL1RhYmxlXCIpO1xyXG5jb25zdCBSb3V0ZXIgPSByZXF1aXJlKFwiLi4vQmFzZS9Sb3V0ZXJcIik7XHJcbmNvbnN0IEZvcm0gPSByZXF1aXJlKFwiLi4vQmFzZS9Gb3JtXCIpO1xyXG5jbGFzcyBDb3Vwb25SZWRlbXB0aW9uIGV4dGVuZHMgYmFzZS5WbUJhc2Uge1xyXG4gICAgY29uc3RydWN0b3IoZGF0YSkge1xyXG4gICAgICAgIC8vY2FsbCBiYXNlIGNsYXNzIGNvbnN0cnVjdG9yXHJcbiAgICAgICAgc3VwZXIoZGF0YSwgRm9ybSwgVGFibGUsIFJvdXRlcik7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcclxuICAgICAgICBrby5hcHBseUJpbmRpbmdzKHRoaXMpO1xyXG4gICAgICAgICQoJy5oaWRlVW5ib3VuZCcpLnJlbW92ZUNsYXNzKCdoaWRlVW5ib3VuZCcpO1xyXG4gICAgfVxyXG59XHJcbm1vZHVsZS5leHBvcnRzID0gQ291cG9uUmVkZW1wdGlvbjtcclxuIiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xyXG5jb25zdCBrbyA9IHJlcXVpcmUoXCJrbm9ja291dFwiKTtcclxuY29uc3QgYmFzZSA9IHJlcXVpcmUoXCIuLi9CYXNlL1ZNQmFzZVwiKTtcclxuY29uc3QgVGFibGUgPSByZXF1aXJlKFwiLi4vQmFzZS9UYWJsZVwiKTtcclxuY29uc3QgUm91dGVyID0gcmVxdWlyZShcIi4uL0Jhc2UvUm91dGVyXCIpO1xyXG5jb25zdCBGb3JtID0gcmVxdWlyZShcIi4uL0Jhc2UvRm9ybVwiKTtcclxuY2xhc3MgQ291cG9uIGV4dGVuZHMgYmFzZS5WbUJhc2Uge1xyXG4gICAgY29uc3RydWN0b3IoZGF0YSkge1xyXG4gICAgICAgIC8vY2FsbCBiYXNlIGNsYXNzIGNvbnN0cnVjdG9yXHJcbiAgICAgICAgc3VwZXIoZGF0YSwgRm9ybSwgVGFibGUsIFJvdXRlcik7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcclxuICAgICAgICBrby5hcHBseUJpbmRpbmdzKHRoaXMpO1xyXG4gICAgICAgICQoXCIuaGlkZVVuYm91bmRcIikucmVtb3ZlQ2xhc3MoXCJoaWRlVW5ib3VuZFwiKTtcclxuICAgIH1cclxufVxyXG5tb2R1bGUuZXhwb3J0cyA9IENvdXBvbjtcclxuIiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xyXG5jb25zdCBrbyA9IHJlcXVpcmUoXCJrbm9ja291dFwiKTtcclxuY29uc3QgYmFzZSA9IHJlcXVpcmUoXCIuLi9CYXNlL1ZNQmFzZVwiKTtcclxuY29uc3QgVGFibGUgPSByZXF1aXJlKFwiLi4vQmFzZS9UYWJsZVwiKTtcclxuY29uc3QgRGFzaGJvYXJkVmVyc2lvblJvdXRlciA9IHJlcXVpcmUoXCIuL0Rhc2hib2FyZFZlcnNpb25Sb3V0ZXJcIik7XHJcbmNvbnN0IERhc2hib2FyZFZlcnNpb25Gb3JtID0gcmVxdWlyZShcIi4vRGFzaGJvYXJkVmVyc2lvbkZvcm1cIik7XHJcbmNsYXNzIERhc2hib2FyZFZlcnNpb24gZXh0ZW5kcyBiYXNlLlZtQmFzZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihkYXRhKSB7XHJcbiAgICAgICAgLy9jYWxsIGJhc2UgY2xhc3MgY29uc3RydWN0b3JcclxuICAgICAgICBzdXBlcihkYXRhLCBEYXNoYm9hcmRWZXJzaW9uRm9ybSwgVGFibGUsIERhc2hib2FyZFZlcnNpb25Sb3V0ZXIpO1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICAgICAga28uYXBwbHlCaW5kaW5ncyh0aGlzKTtcclxuICAgICAgICAkKCcuaGlkZVVuYm91bmQnKS5yZW1vdmVDbGFzcygnaGlkZVVuYm91bmQnKTtcclxuICAgIH1cclxufVxyXG5tb2R1bGUuZXhwb3J0cyA9IERhc2hib2FyZFZlcnNpb247XHJcbiIsIlwidXNlIHN0cmljdFwiO1xyXG5jb25zdCBGb3JtID0gcmVxdWlyZShcIi4uL0Jhc2UvRm9ybVwiKTtcclxuY2xhc3MgRGFzaGJvYXJkVmVyc2lvbkZvcm0gZXh0ZW5kcyBGb3JtIHtcclxuICAgIGNvbnN0cnVjdG9yKGRhdGEsIHZtLCBlZGl0QWN0aW9uID0gJ0VkaXQnKSB7XHJcbiAgICAgICAgc3VwZXIoZGF0YSwgdm0sIGVkaXRBY3Rpb24pO1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICAgICAgdGhpcy52bSA9IHZtO1xyXG4gICAgICAgIHRoaXMuZWRpdEFjdGlvbiA9IGVkaXRBY3Rpb247XHJcbiAgICAgICAgJCgnI0l0ZW1EZXRhaWxfVXBncmFkZVJlcXVpcmVkJykub24oJ2NsaWNrJywgKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodm0uSXRlbURldGFpbC5VcGdyYWRlUmVxdWlyZWQoKSA9PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgICAgJCgnI3VwZ3JhZGUtcmVxdWlyZWQtbW9kYWwnKS5tb2RhbCh7XHJcbiAgICAgICAgICAgICAgICAgICAgYmFja2Ryb3A6ICdzdGF0aWMnLFxyXG4gICAgICAgICAgICAgICAgICAgIGtleWJvYXJkOiBmYWxzZVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB2bS5JdGVtRGV0YWlsLlVwZ3JhZGVSZXF1aXJlZChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICB2bS5JdGVtRGV0YWlsLkN1cnJlbnRWZXJzaW9uKHRydWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgJCgnI3JlcXVpcmUtdXBncmFkZScpLm9uKCdjbGljaycsICgpID0+IHtcclxuICAgICAgICAgICAgdm0uSXRlbURldGFpbC5VcGdyYWRlUmVxdWlyZWQodHJ1ZSk7XHJcbiAgICAgICAgICAgIHZtLkl0ZW1EZXRhaWwuQ3VycmVudFZlcnNpb24oZmFsc2UpO1xyXG4gICAgICAgICAgICAkKCcjdXBncmFkZS1yZXF1aXJlZC1tb2RhbCcpLm1vZGFsKCdoaWRlJyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgJCgnI3JlcXVpcmUtdXBncmFkZS1jYW5jZWwnKS5vbignY2xpY2snLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIHZtLkl0ZW1EZXRhaWwuVXBncmFkZVJlcXVpcmVkKGZhbHNlKTtcclxuICAgICAgICAgICAgdm0uSXRlbURldGFpbC5DdXJyZW50VmVyc2lvbih0cnVlKTtcclxuICAgICAgICAgICAgJCgnI3VwZ3JhZGUtcmVxdWlyZWQtbW9kYWwnKS5tb2RhbCgnaGlkZScpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgICQoJyNJdGVtRGV0YWlsX0N1cnJlbnRWZXJzaW9uJykub24oJ2NsaWNrJywgKCkgPT4ge1xyXG4gICAgICAgICAgICB2bS5JdGVtRGV0YWlsLlVwZ3JhZGVSZXF1aXJlZChmYWxzZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn1cclxubW9kdWxlLmV4cG9ydHMgPSBEYXNoYm9hcmRWZXJzaW9uRm9ybTtcclxuIiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbmNvbnN0IFJvdXRlciA9IHJlcXVpcmUoXCIuLi9CYXNlL1JvdXRlclwiKTtcclxuY2xhc3MgRGFzaGJvYXJkVmVyc2lvblJvdXRlciBleHRlbmRzIFJvdXRlciB7XHJcbiAgICBjb25zdHJ1Y3RvcihkYXRhLCB2bSwgYWx0ZXJuYXRlcm91dGVzKSB7XHJcbiAgICAgICAgc3VwZXIoZGF0YSwgdm0sIGFsdGVybmF0ZXJvdXRlcyk7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcclxuICAgICAgICB0aGlzLnZtID0gdm07XHJcbiAgICB9XHJcbiAgICBnZXRSb3V0ZXMoKSB7XHJcbiAgICAgICAgdmFyIHNlbGY7XHJcbiAgICAgICAgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogYCR7c2VsZi5nZXRBcmVhKCl9LyR7c2VsZi5kYXRhLlRpdGxlfSMvbGlzdGAsXHJcbiAgICAgICAgICAgICAgICBmdW5jOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5mb3JtLmNhbmNlbCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0udGFibGUubG9hZCgpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbnZlcnRUb1JlZ0V4OiBmYWxzZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBgJHtzZWxmLmdldEFyZWEoKX0vJHtzZWxmLmRhdGEuVGl0bGV9Iy9uZXdgLFxyXG4gICAgICAgICAgICAgICAgZnVuYygpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLmZvcm0uYWRkKCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvUmVnRXg6IGZhbHNlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IGAke3NlbGYuZ2V0QXJlYSgpfS8ke3NlbGYuZGF0YS5UaXRsZX0jL3ZpZXcvOmlkYCxcclxuICAgICAgICAgICAgICAgIGZ1bmMoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGlkID0gdGhpcy5wYXJhbXNbJ2lkJ107XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5mb3JtLmdldERldGFpbChpZCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvUmVnRXg6IGZhbHNlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IGAke3NlbGYuZ2V0QXJlYSgpfS8ke3NlbGYuZGF0YS5UaXRsZX0jL2luZGV4YCxcclxuICAgICAgICAgICAgICAgIGZ1bmMoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5mb3JtLmdldERldGFpbChudWxsKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9SZWdFeDogZmFsc2VcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogYCR7c2VsZi5nZXRBcmVhKCl9LyR7c2VsZi5kYXRhLlRpdGxlfSMvZGVsZXRlLzppZGAsXHJcbiAgICAgICAgICAgICAgICBmdW5jKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpZCA9IHRoaXMucGFyYW1zWydpZCddO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uZm9ybS5kZWxldGVJdGVtKGlkKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9SZWdFeDogZmFsc2VcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIF07XHJcbiAgICB9XHJcbn1cclxubW9kdWxlLmV4cG9ydHMgPSBEYXNoYm9hcmRWZXJzaW9uUm91dGVyO1xyXG4iLCJcInVzZSBzdHJpY3RcIjtcclxuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XHJcbmNvbnN0IGtvID0gcmVxdWlyZShcImtub2Nrb3V0XCIpO1xyXG5jbGFzcyBFcnJvciB7XHJcbiAgICBjb25zdHJ1Y3RvcihkYXRhKSB7XHJcbiAgICAgICAgLy9jYWxsIGJhc2UgY2xhc3MgY29uc3RydWN0b3JcclxuICAgICAgICAvLyBzdXBlcihkYXRhLCBGb3JtLCBUYWJsZSwgUm91dGVyKTtcclxuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xyXG4gICAgICAgIGtvLmFwcGx5QmluZGluZ3ModGhpcyk7XHJcbiAgICAgICAgJCgnLmhpZGVVbmJvdW5kJykucmVtb3ZlQ2xhc3MoJ2hpZGVVbmJvdW5kJyk7XHJcbiAgICB9XHJcbn1cclxubW9kdWxlLmV4cG9ydHMgPSBFcnJvcjtcclxuIiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbi8vLyBUaGlzIGNvZGUgd2FzIGdlbmVyYXRlZCBieSBPcmFuZ2UgT25pb24gU2NhZmZvbGRlci5cclxuLy8gdGVtcGxhdGU6IE1WQy5KU01vZHVsZS5jc1xyXG4vLyBjbGFzczogRmVlZGJhY2tLZXl3b3JkTG9nXHJcbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xyXG5jb25zdCBrbyA9IHJlcXVpcmUoXCJrbm9ja291dFwiKTtcclxuY29uc3QgYmFzZSA9IHJlcXVpcmUoXCIuLi9CYXNlL1ZNQmFzZVwiKTtcclxuY29uc3QgVGFibGUgPSByZXF1aXJlKFwiLi4vQmFzZS9UYWJsZVwiKTtcclxuY29uc3QgUm91dGVyID0gcmVxdWlyZShcIi4uL0Jhc2UvUm91dGVyXCIpO1xyXG5jb25zdCBGb3JtID0gcmVxdWlyZShcIi4uL0Jhc2UvRm9ybVwiKTtcclxuY29uc3QgXyA9IHJlcXVpcmUoXCJ1bmRlcnNjb3JlXCIpO1xyXG5jbGFzcyBGZWVkYmFja0tleXdvcmRMb2cgZXh0ZW5kcyBiYXNlLlZtQmFzZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihkYXRhKSB7XHJcbiAgICAgICAgLy9jYWxsIGJhc2UgY2xhc3MgY29uc3RydWN0b3JcclxuICAgICAgICBzdXBlcihkYXRhLCBGb3JtLCBUYWJsZSwgUm91dGVyKTtcclxuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xyXG4gICAgICAgIGtvLmFwcGx5QmluZGluZ3ModGhpcyk7XHJcbiAgICAgICAgJCgnLmhpZGVVbmJvdW5kJykucmVtb3ZlQ2xhc3MoJ2hpZGVVbmJvdW5kJyk7XHJcbiAgICB9XHJcbiAgICBjbGVhckZpbHRlcnMoKSB7XHJcbiAgICAgICAgXy5lYWNoKHRoaXMuRmlsdGVycywgKHYpID0+IHtcclxuICAgICAgICAgICAgdignJyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn1cclxubW9kdWxlLmV4cG9ydHMgPSBGZWVkYmFja0tleXdvcmRMb2c7XHJcbiIsIlwidXNlIHN0cmljdFwiO1xyXG4vLy8gVGhpcyBjb2RlIHdhcyBnZW5lcmF0ZWQgYnkgT3JhbmdlIE9uaW9uIFNjYWZmb2xkZXIuXHJcbi8vIHRlbXBsYXRlOiBNVkMuSlNNb2R1bGUuY3NcclxuLy8gY2xhc3M6IEZlZWRiYWNrS2V5d29yZFxyXG5jb25zdCAkID0gcmVxdWlyZShcImpxdWVyeVwiKTtcclxuY29uc3Qga28gPSByZXF1aXJlKFwia25vY2tvdXRcIik7XHJcbmNvbnN0IGJhc2UgPSByZXF1aXJlKFwiLi4vQmFzZS9WTUJhc2VcIik7XHJcbmNvbnN0IFRhYmxlID0gcmVxdWlyZShcIi4uL0Jhc2UvVGFibGVcIik7XHJcbmNvbnN0IEZvcm0gPSByZXF1aXJlKFwiLi4vQmFzZS9Gb3JtXCIpO1xyXG5jb25zdCBGZWVkYmFja0tleXdvcmRSb3V0ZXIgPSByZXF1aXJlKFwiLi9GZWVkYmFja0tleXdvcmRSb3V0ZXJcIik7XHJcbmNsYXNzIEZlZWRiYWNrS2V5d29yZCBleHRlbmRzIGJhc2UuVm1CYXNlIHtcclxuICAgIGNvbnN0cnVjdG9yKGRhdGEpIHtcclxuICAgICAgICAvL2NhbGwgYmFzZSBjbGFzcyBjb25zdHJ1Y3RvclxyXG4gICAgICAgIHN1cGVyKGRhdGEsIEZvcm0sIFRhYmxlLCBGZWVkYmFja0tleXdvcmRSb3V0ZXIpO1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICAgICAga28uYXBwbHlCaW5kaW5ncyh0aGlzKTtcclxuICAgICAgICAkKCcuaGlkZVVuYm91bmQnKS5yZW1vdmVDbGFzcygnaGlkZVVuYm91bmQnKTtcclxuICAgIH1cclxufVxyXG5tb2R1bGUuZXhwb3J0cyA9IEZlZWRiYWNrS2V5d29yZDtcclxuIiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbmNvbnN0IFJvdXRlciA9IHJlcXVpcmUoXCIuLi9CYXNlL1JvdXRlclwiKTtcclxuY2xhc3MgRmVlZGJhY2tLZXl3b3JkUm91dGVyIGV4dGVuZHMgUm91dGVyIHtcclxuICAgIGNvbnN0cnVjdG9yKGRhdGEsIHZtLCBhbHRlcm5hdGVyb3V0ZXMpIHtcclxuICAgICAgICBzdXBlcihkYXRhLCB2bSwgYWx0ZXJuYXRlcm91dGVzKTtcclxuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xyXG4gICAgICAgIHRoaXMudm0gPSB2bTtcclxuICAgIH1cclxuICAgIGdldFJvdXRlcygpIHtcclxuICAgICAgICB2YXIgc2VsZjtcclxuICAgICAgICBzZWxmID0gdGhpcztcclxuICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBgJHtzZWxmLmdldEFyZWEoKX0vJHtzZWxmLmRhdGEuVGl0bGV9Iy9saXN0YCxcclxuICAgICAgICAgICAgICAgIGZ1bmM6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLmZvcm0uY2FuY2VsKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS50YWJsZS5sb2FkKCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvUmVnRXg6IGZhbHNlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IGAke3NlbGYuZ2V0QXJlYSgpfS8ke3NlbGYuZGF0YS5UaXRsZX0jL25ld2AsXHJcbiAgICAgICAgICAgICAgICBmdW5jKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uZm9ybS5hZGQoKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9SZWdFeDogZmFsc2VcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogYCR7c2VsZi5nZXRBcmVhKCl9LyR7c2VsZi5kYXRhLlRpdGxlfSMvdmlldy86aWRgLFxyXG4gICAgICAgICAgICAgICAgZnVuYygpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgaWQgPSB0aGlzLnBhcmFtc1snaWQnXTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLmZvcm0uZ2V0RGV0YWlsKGlkKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9SZWdFeDogZmFsc2VcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogYCR7c2VsZi5nZXRBcmVhKCl9LyR7c2VsZi5kYXRhLlRpdGxlfSMvaW5kZXhgLFxyXG4gICAgICAgICAgICAgICAgZnVuYygpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLmZvcm0uZ2V0RGV0YWlsKG51bGwpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbnZlcnRUb1JlZ0V4OiBmYWxzZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBgJHtzZWxmLmdldEFyZWEoKX0vJHtzZWxmLmRhdGEuVGl0bGV9Iy9kZWxldGUvOmlkYCxcclxuICAgICAgICAgICAgICAgIGZ1bmMoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGlkID0gdGhpcy5wYXJhbXNbJ2lkJ107XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5mb3JtLmRlbGV0ZUl0ZW0oaWQpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbnZlcnRUb1JlZ0V4OiBmYWxzZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgXTtcclxuICAgIH1cclxufVxyXG5tb2R1bGUuZXhwb3J0cyA9IEZlZWRiYWNrS2V5d29yZFJvdXRlcjtcclxuIiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xyXG5jb25zdCBrbyA9IHJlcXVpcmUoXCJrbm9ja291dFwiKTtcclxuY29uc3QgYmFzZSA9IHJlcXVpcmUoXCIuLi9CYXNlL1ZNQmFzZVwiKTtcclxuY29uc3QgVGFibGUgPSByZXF1aXJlKFwiLi4vQmFzZS9UYWJsZVwiKTtcclxuY29uc3QgRnVuZHJhaXNlckJsYWNrb3V0RGF0ZVJvdXRlciA9IHJlcXVpcmUoXCIuL0Z1bmRyYWlzZXJCbGFja291dERhdGVSb3V0ZXJcIik7XHJcbmNvbnN0IEZvcm0gPSByZXF1aXJlKFwiLi4vQmFzZS9Gb3JtXCIpO1xyXG5jbGFzcyBGdW5kcmFpc2VyQmxhY2tvdXREYXRlIGV4dGVuZHMgYmFzZS5WbUJhc2Uge1xyXG4gICAgY29uc3RydWN0b3IoZGF0YSkge1xyXG4gICAgICAgIC8vY2FsbCBiYXNlIGNsYXNzIGNvbnN0cnVjdG9yXHJcbiAgICAgICAgc3VwZXIoZGF0YSwgRm9ybSwgVGFibGUsIEZ1bmRyYWlzZXJCbGFja291dERhdGVSb3V0ZXIpO1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICAgICAga28uYXBwbHlCaW5kaW5ncyh0aGlzKTtcclxuICAgICAgICAkKFwiLmhpZGVVbmJvdW5kXCIpLnJlbW92ZUNsYXNzKFwiaGlkZVVuYm91bmRcIik7XHJcbiAgICB9XHJcbn1cclxubW9kdWxlLmV4cG9ydHMgPSBGdW5kcmFpc2VyQmxhY2tvdXREYXRlO1xyXG4iLCJcInVzZSBzdHJpY3RcIjtcclxuY29uc3QgUm91dGVyID0gcmVxdWlyZShcIi4uL0Jhc2UvUm91dGVyXCIpO1xyXG5jbGFzcyBGdW5kcmFpc2VyQmxhY2tvdXREYXRlUm91dGVyIGV4dGVuZHMgUm91dGVyIHtcclxuICAgIGNvbnN0cnVjdG9yKGRhdGEsIHZtLCBhbHRlcm5hdGVyb3V0ZXMpIHtcclxuICAgICAgICBzdXBlcihkYXRhLCB2bSwgYWx0ZXJuYXRlcm91dGVzKTtcclxuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xyXG4gICAgICAgIHRoaXMudm0gPSB2bTtcclxuICAgIH1cclxuICAgIGdldFJvdXRlcygpIHtcclxuICAgICAgICB2YXIgc2VsZjtcclxuICAgICAgICBzZWxmID0gdGhpcztcclxuICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBgJHtzZWxmLmdldEFyZWEoKX0vJHtzZWxmLmRhdGEuVGl0bGV9Iy9saXN0YCxcclxuICAgICAgICAgICAgICAgIGZ1bmM6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLmZvcm0uY2FuY2VsKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS50YWJsZS5sb2FkKCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvUmVnRXg6IGZhbHNlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IGAke3NlbGYuZ2V0QXJlYSgpfS8ke3NlbGYuZGF0YS5UaXRsZX0jL25ld2AsXHJcbiAgICAgICAgICAgICAgICBmdW5jKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uZm9ybS5hZGQoKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9SZWdFeDogZmFsc2VcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogYCR7c2VsZi5nZXRBcmVhKCl9LyR7c2VsZi5kYXRhLlRpdGxlfSMvdmlldy86aWRgLFxyXG4gICAgICAgICAgICAgICAgZnVuYygpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgaWQgPSB0aGlzLnBhcmFtc1snaWQnXTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLmZvcm0uZ2V0RGV0YWlsKGlkKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9SZWdFeDogZmFsc2VcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogYCR7c2VsZi5nZXRBcmVhKCl9LyR7c2VsZi5kYXRhLlRpdGxlfSMvaW5kZXhgLFxyXG4gICAgICAgICAgICAgICAgZnVuYygpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLmZvcm0uZ2V0RGV0YWlsKG51bGwpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbnZlcnRUb1JlZ0V4OiBmYWxzZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBgJHtzZWxmLmdldEFyZWEoKX0vJHtzZWxmLmRhdGEuVGl0bGV9Iy9kZWxldGUvOmlkYCxcclxuICAgICAgICAgICAgICAgIGZ1bmMoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGlkID0gdGhpcy5wYXJhbXNbJ2lkJ107XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5mb3JtLmRlbGV0ZUl0ZW0oaWQpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbnZlcnRUb1JlZ0V4OiBmYWxzZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgXTtcclxuICAgIH1cclxufVxyXG5tb2R1bGUuZXhwb3J0cyA9IEZ1bmRyYWlzZXJCbGFja291dERhdGVSb3V0ZXI7XHJcbiIsIlwidXNlIHN0cmljdFwiO1xyXG4vLy8gVGhpcyBjb2RlIHdhcyBnZW5lcmF0ZWQgYnkgT3JhbmdlIE9uaW9uIFNjYWZmb2xkZXIuXHJcbi8vIHRlbXBsYXRlOiBNVkMuSlNNb2R1bGUuY3NcclxuLy8gY2xhc3M6IEZ1bmRyYWlzZXJJbnF1aXJ5XHJcbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xyXG5jb25zdCBrbyA9IHJlcXVpcmUoXCJrbm9ja291dFwiKTtcclxuY29uc3QgYmFzZSA9IHJlcXVpcmUoXCIuLi9CYXNlL1ZNQmFzZVwiKTtcclxuY29uc3QgVGFibGUgPSByZXF1aXJlKFwiLi4vQmFzZS9UYWJsZVwiKTtcclxuY29uc3QgRm9ybSA9IHJlcXVpcmUoXCIuLi9CYXNlL0Zvcm1cIik7XHJcbmNvbnN0IEZ1bmRyYWlzZXJJbnF1aXJ5Um91dGVyID0gcmVxdWlyZShcIi4vRnVuZHJhaXNlcklucXVpcnlSb3V0ZXJcIik7XHJcbmNvbnN0IF8gPSByZXF1aXJlKFwidW5kZXJzY29yZVwiKTtcclxuY2xhc3MgRnVuZHJhaXNlcklucXVpcnkgZXh0ZW5kcyBiYXNlLlZtQmFzZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihkYXRhKSB7XHJcbiAgICAgICAgLy9jYWxsIGJhc2UgY2xhc3MgY29uc3RydWN0b3JcclxuICAgICAgICBzdXBlcihkYXRhLCBGb3JtLCBUYWJsZSwgRnVuZHJhaXNlcklucXVpcnlSb3V0ZXIpO1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICAgICAgdGhpcy5OdW1EYXRlcyA9IDE7XHJcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xyXG4gICAgICAgICQoJy5tb2RhbGZvcm0taG9sZGVyJykub24oJ2NsaWNrJywgJyNzYXZlLWZ1bmRyYWlzZXItaW5xdWlyeScsICgpID0+IHtcclxuICAgICAgICAgICAgc2VsZi5JdGVtRGV0YWlsLkludGVyZXN0ZWREYXRlcyhbXSk7XHJcbiAgICAgICAgICAgICQoJ2lucHV0W25hbWVePVwiSXRlbURldGFpbC5JbnRlcmVzdGVkRGF0ZXNcIl0nKS5lYWNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIGlmICgkKHRoaXMpLnZhbCgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5JdGVtRGV0YWlsLkludGVyZXN0ZWREYXRlcygpLnB1c2goJCh0aGlzKS52YWwoKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB2YXIgcHJvbWlzZSA9IHRoaXMuZm9ybS5wb3N0KCk7XHJcbiAgICAgICAgICAgIHByb21pc2UuZG9uZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IFwiL2Z1bmRyYWlzZXJpbnF1aXJ5Iy90aGFua3lvdVwiO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgICQoJy5tb2RhbGZvcm0taG9sZGVyJykub24oJ2NsaWNrJywgJyNhZGQtaW50ZXJlc3RlZC1kYXRlJywgKCkgPT4ge1xyXG4gICAgICAgICAgICAkKCcjaW50ZXJlc3RlZC1kYXRlcycpLmFwcGVuZCgnPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwXCI+PGRpdiBjbGFzcz1cImRhdGUtaW5wdXRcIj48aW5wdXQgbmFtZT1cIkl0ZW1EZXRhaWwuSW50ZXJlc3RlZERhdGVzWycgKyBzZWxmLk51bURhdGVzICsgJ11cIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwiSXRlbURldGFpbF9JbnRlcmVzdGVkRGF0ZXNbJyArIHRoaXMuTnVtRGF0ZXMgKyAnXVwiIHR5cGU9XCJkYXRlXCI+PC9kaXY+PGRpdiBjbGFzcz1cImlucHV0LWdyb3VwLWFkZG9uIGJhY2tncm91bmQtd2hpdGVcIj48aSBjbGFzcz1cImZhIGZhLWNhbGVuZGFyXCI+PC9pPjwvZGl2PjwvZGl2PicpO1xyXG4gICAgICAgICAgICB0aGlzLk51bURhdGVzKys7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBrby5hcHBseUJpbmRpbmdzKHRoaXMpO1xyXG4gICAgICAgICQoJy5oaWRlVW5ib3VuZCcpLnJlbW92ZUNsYXNzKCdoaWRlVW5ib3VuZCcpO1xyXG4gICAgfVxyXG4gICAgY2xlYXJGaWx0ZXJzKCkge1xyXG4gICAgICAgIF8uZWFjaCh0aGlzLkZpbHRlcnMsICh2KSA9PiB7XHJcbiAgICAgICAgICAgIHYoJycpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcbm1vZHVsZS5leHBvcnRzID0gRnVuZHJhaXNlcklucXVpcnk7XHJcbiIsIlwidXNlIHN0cmljdFwiO1xyXG5jb25zdCBSb3V0ZXIgPSByZXF1aXJlKFwiLi4vQmFzZS9Sb3V0ZXJcIik7XHJcbmNsYXNzIEZ1bmRyYWlzZXJJbnF1aXJ5Um91dGVyIGV4dGVuZHMgUm91dGVyIHtcclxuICAgIGNvbnN0cnVjdG9yKGRhdGEsIHZtLCBhbHRlcm5hdGVyb3V0ZXMpIHtcclxuICAgICAgICBzdXBlcihkYXRhLCB2bSwgYWx0ZXJuYXRlcm91dGVzKTtcclxuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xyXG4gICAgICAgIHRoaXMudm0gPSB2bTtcclxuICAgIH1cclxuICAgIGdldFJvdXRlcygpIHtcclxuICAgICAgICB2YXIgc2VsZjtcclxuICAgICAgICBzZWxmID0gdGhpcztcclxuICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiAnL0Z1bmRyYWlzZXJJbnF1aXJ5Iy9uZXcnLFxyXG4gICAgICAgICAgICAgICAgZnVuYygpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLmZvcm0uYWRkKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5TaG93VGhhbmtZb3UoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbnZlcnRUb1JlZ0V4OiB0cnVlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6ICcvRnVuZHJhaXNlcklucXVpcnkjL3RoYW5reW91JyxcclxuICAgICAgICAgICAgICAgIGZ1bmMoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5TaG93VGhhbmtZb3UodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvUmVnRXg6IHRydWVcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogYCR7c2VsZi5nZXRBcmVhKCl9LyR7c2VsZi5kYXRhLlRpdGxlfSMvbGlzdGAsXHJcbiAgICAgICAgICAgICAgICBmdW5jOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5mb3JtLmNhbmNlbCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0udGFibGUubG9hZCgpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbnZlcnRUb1JlZ0V4OiBmYWxzZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBgJHtzZWxmLmdldEFyZWEoKX0vJHtzZWxmLmRhdGEuVGl0bGV9Iy9uZXdgLFxyXG4gICAgICAgICAgICAgICAgZnVuYygpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLmZvcm0uYWRkKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5TaG93VGhhbmtZb3UoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbnZlcnRUb1JlZ0V4OiBmYWxzZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBgJHtzZWxmLmdldEFyZWEoKX0vJHtzZWxmLmRhdGEuVGl0bGV9Iy92aWV3LzppZGAsXHJcbiAgICAgICAgICAgICAgICBmdW5jKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpZCA9IHRoaXMucGFyYW1zWydpZCddO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uZm9ybS5nZXREZXRhaWwoaWQpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbnZlcnRUb1JlZ0V4OiBmYWxzZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBgJHtzZWxmLmdldEFyZWEoKX0vJHtzZWxmLmRhdGEuVGl0bGV9Iy9pbmRleGAsXHJcbiAgICAgICAgICAgICAgICBmdW5jKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uZm9ybS5nZXREZXRhaWwobnVsbCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvUmVnRXg6IGZhbHNlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IGAke3NlbGYuZ2V0QXJlYSgpfS8ke3NlbGYuZGF0YS5UaXRsZX0jL3RoYW5reW91YCxcclxuICAgICAgICAgICAgICAgIGZ1bmMoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5TaG93VGhhbmtZb3UodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvUmVnRXg6IGZhbHNlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IGAke3NlbGYuZ2V0QXJlYSgpfS8ke3NlbGYuZGF0YS5UaXRsZX0jL2RlbGV0ZS86aWRgLFxyXG4gICAgICAgICAgICAgICAgZnVuYygpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgaWQgPSB0aGlzLnBhcmFtc1snaWQnXTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLmZvcm0uZGVsZXRlSXRlbShpZCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvUmVnRXg6IGZhbHNlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICBdO1xyXG4gICAgfVxyXG59XHJcbm1vZHVsZS5leHBvcnRzID0gRnVuZHJhaXNlcklucXVpcnlSb3V0ZXI7XHJcbiIsIlwidXNlIHN0cmljdFwiO1xyXG4vLy8gVGhpcyBjb2RlIHdhcyBnZW5lcmF0ZWQgYnkgT3JhbmdlIE9uaW9uIFNjYWZmb2xkZXIuXHJcbi8vIHRlbXBsYXRlOiBNVkMuSlNNb2R1bGUuY3NcclxuLy8gY2xhc3M6IEZ1bmRyYWlzZXJMb2dcclxuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XHJcbmNvbnN0IGtvID0gcmVxdWlyZShcImtub2Nrb3V0XCIpO1xyXG5jb25zdCBiYXNlID0gcmVxdWlyZShcIi4uL0Jhc2UvVk1CYXNlXCIpO1xyXG5jb25zdCBUYWJsZSA9IHJlcXVpcmUoXCIuLi9CYXNlL1RhYmxlXCIpO1xyXG5jb25zdCBSb3V0ZXIgPSByZXF1aXJlKFwiLi4vQmFzZS9Sb3V0ZXJcIik7XHJcbmNvbnN0IEZvcm0gPSByZXF1aXJlKFwiLi4vQmFzZS9Gb3JtXCIpO1xyXG5jbGFzcyBGdW5kcmFpc2VyTG9nIGV4dGVuZHMgYmFzZS5WbUJhc2Uge1xyXG4gICAgY29uc3RydWN0b3IoZGF0YSkge1xyXG4gICAgICAgIC8vY2FsbCBiYXNlIGNsYXNzIGNvbnN0cnVjdG9yXHJcbiAgICAgICAgc3VwZXIoZGF0YSwgRm9ybSwgVGFibGUsIFJvdXRlcik7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcclxuICAgICAgICBrby5hcHBseUJpbmRpbmdzKHRoaXMpO1xyXG4gICAgICAgICQoJy5oaWRlVW5ib3VuZCcpLnJlbW92ZUNsYXNzKCdoaWRlVW5ib3VuZCcpO1xyXG4gICAgfVxyXG4gICAgY29weUZ1bmRyYWlzZXIoaWQpIHtcclxuICAgICAgICB2YXIgaWdub3JlTWFwcGluZyA9IHtcclxuICAgICAgICAgICAgJ2lnbm9yZSc6IHRoaXMuZGF0YS5LT01hcHBpbmcuYWxsTm9uUG9zdEJhY2tcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGlkKTtcclxuICAgICAgICB2YXIgcHJvbWlzZSA9ICQuYWpheCh7XHJcbiAgICAgICAgICAgIHVybDogJy9BZG1pbi9GdW5kcmFpc2VyTG9nL0NvcHknLFxyXG4gICAgICAgICAgICBkYXRhOiAnaWQ9JyArIGlkLFxyXG4gICAgICAgICAgICB0eXBlOiAnUE9TVCcsXHJcbiAgICAgICAgICAgIGNhY2hlOiBmYWxzZVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHByb21pc2UuZmFpbCgoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5Jc0xvYWRpbmcoZmFsc2UpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHByb21pc2UuZG9uZShkYXRhID0+IHtcclxuICAgICAgICAgICAgdGhpcy5Jc0xvYWRpbmcoZmFsc2UpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcbm1vZHVsZS5leHBvcnRzID0gRnVuZHJhaXNlckxvZztcclxuIiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xyXG5jb25zdCBrbyA9IHJlcXVpcmUoXCJrbm9ja291dFwiKTtcclxuY29uc3QgYmFzZSA9IHJlcXVpcmUoXCIuLi9CYXNlL1ZNQmFzZVwiKTtcclxuY29uc3QgVGFibGUgPSByZXF1aXJlKFwiLi4vQmFzZS9UYWJsZVwiKTtcclxuY29uc3QgUm91dGVyID0gcmVxdWlyZShcIi4uL0Jhc2UvUm91dGVyXCIpO1xyXG5jb25zdCBNb2RhbCA9IHJlcXVpcmUoXCIuLi9Db21tb24vTW9kYWxcIik7XHJcbmNvbnN0IExvZ2luRm9ybSA9IHJlcXVpcmUoXCIuL0Z1bmRyYWlzZXJMb2dpbkZvcm1cIik7XHJcbmNsYXNzIEZ1bmRyYWlzZXJMb2dpbiBleHRlbmRzIGJhc2UuVm1CYXNlIHtcclxuICAgIGNvbnN0cnVjdG9yKGRhdGEpIHtcclxuICAgICAgICAvL2NhbGwgYmFzZSBjbGFzcyBjb25zdHJ1Y3RvclxyXG4gICAgICAgIHN1cGVyKGRhdGEsIExvZ2luRm9ybSwgVGFibGUsIFJvdXRlcik7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcclxuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgdGhpcy5tb2RhbCA9IG5ldyBNb2RhbChcImZvcmdvdFBhc3N3b3JkXCIpO1xyXG4gICAgICAgIHRoaXMubW9kYWwuaW5pdCgpO1xyXG4gICAgICAgIHNlbGYuSXRlbURldGFpbC5TaG93U3VjY2VzcyhmYWxzZSk7XHJcbiAgICAgICAgJChcImRpdi5sb2dpbi1ib3hcIikub24oXCJjbGlja1wiLCBcImEuZm9yZ290LXBhc3N3b3JkXCIsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgJChcIiNyZXNldEVtYWlsQWRkcmVzc1wiKS52YWwobnVsbCk7XHJcbiAgICAgICAgICAgIHNlbGYuSXRlbURldGFpbC5TaG93U3VjY2VzcyhmYWxzZSk7XHJcbiAgICAgICAgICAgIHNlbGYuSXRlbURldGFpbC5FbWFpbElzVmFsaWQodHJ1ZSk7XHJcbiAgICAgICAgICAgIHNlbGYubW9kYWwub3BlbihcImZvcmdvdFBhc3N3b3JkXCIpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgICQoJ2Rpdi5weC1tb2RhbCBkaXYuYnV0dG9uLWdyb3VwIGJ1dHRvbi5idXR0b24uc2Vjb25kYXJ5LnJlc2V0LXBhc3N3b3JkLWRvbmUnKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gXCIvZnVuZHJhaXNlcmxvZ2luIy9pbmRleFwiO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgICQoJ2Rpdi5weC1tb2RhbCBkaXYuYnV0dG9uLWdyb3VwIGJ1dHRvbi5idXR0b24uc2Vjb25kYXJ5LnJlc2V0LXBhc3N3b3JkJykub24oJ2NsaWNrJywgZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIHZhciBlbWFpbCA9ICQoXCIjcmVzZXRFbWFpbEFkZHJlc3NcIikudmFsKCk7XHJcbiAgICAgICAgICAgIHZhciB1cmwgPSBcIi9wYW5kYWZ1bmRyYWlzZXJtZW1iZXIvZm9yZ290cGFzc3dvcmQ/ZW1haWxBZGRyZXNzPVwiICsgZW1haWw7XHJcbiAgICAgICAgICAgIHZhciBtYXBwaW5nID0ge1xyXG4gICAgICAgICAgICAgICAgJ2lnbm9yZSc6IHNlbGYuZGF0YS5LT01hcHBpbmcuYWxsTm9uUG9zdEJhY2tcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgdmFyIHBvc3REYXRhID0ga28ubWFwcGluZy50b0pTKHNlbGYsIG1hcHBpbmcpO1xyXG4gICAgICAgICAgICAkKFwiI2xvYWRpbmdcIikuaGVpZ2h0KCQod2luZG93KS5oZWlnaHQoKSk7XHJcbiAgICAgICAgICAgIHNlbGYuSXNMb2FkaW5nKHRydWUpO1xyXG4gICAgICAgICAgICB2YXIgcHJvbWlzZSA9ICQuYWpheCh7XHJcbiAgICAgICAgICAgICAgICB1cmw6IHVybCxcclxuICAgICAgICAgICAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KHBvc3REYXRhKSxcclxuICAgICAgICAgICAgICAgIHR5cGU6IFwiUE9TVFwiLFxyXG4gICAgICAgICAgICAgICAgY2FjaGU6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgY29udGVudFR5cGU6IFwiYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04XCJcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHByb21pc2UuZmFpbChmdW5jdGlvbiAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgIC8vc29tZXRoaW5nIHdlbnQgd3JvbmcgZGlzcGxheSBlcnJvclxyXG4gICAgICAgICAgICAgICAgc2VsZi5JdGVtRGV0YWlsLkVtYWlsSXNWYWxpZChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICBzZWxmLklzTG9hZGluZyhmYWxzZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBwcm9taXNlLmRvbmUoZnVuY3Rpb24gKHZtKSB7XHJcbiAgICAgICAgICAgICAgICBzZWxmLkl0ZW1EZXRhaWwuRW1haWxJc1ZhbGlkKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgc2VsZi5JdGVtRGV0YWlsLlNob3dTdWNjZXNzKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgc2VsZi5Jc0xvYWRpbmcoZmFsc2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcmV0dXJuIHByb21pc2U7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAga28uYXBwbHlCaW5kaW5ncyh0aGlzKTtcclxuICAgICAgICAkKCcuaGlkZVVuYm91bmQnKS5yZW1vdmVDbGFzcygnaGlkZVVuYm91bmQnKTtcclxuICAgIH1cclxufVxyXG5tb2R1bGUuZXhwb3J0cyA9IEZ1bmRyYWlzZXJMb2dpbjtcclxuIiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbmNvbnN0IEZvcm0gPSByZXF1aXJlKFwiLi4vQmFzZS9Gb3JtXCIpO1xyXG5jbGFzcyBGdW5kcmFpc2VyTG9naW5Gb3JtIGV4dGVuZHMgRm9ybSB7XHJcbiAgICBjb25zdHJ1Y3RvcihkYXRhLCB2bSwgZWRpdEFjdGlvbiA9ICdMb2dpbicpIHtcclxuICAgICAgICBzdXBlcihkYXRhLCB2bSwgZWRpdEFjdGlvbik7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcclxuICAgICAgICB0aGlzLnZtID0gdm07XHJcbiAgICAgICAgdGhpcy5lZGl0QWN0aW9uID0gZWRpdEFjdGlvbjtcclxuICAgIH1cclxuICAgIHBvc3QoKSB7XHJcbiAgICAgICAgdmFyIHByb21pc2UgPSBzdXBlci5wb3N0KCk7XHJcbiAgICAgICAgcHJvbWlzZS5kb25lKGRhdGEgPT4ge1xyXG4gICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IGRhdGEuUmV0dXJuVXJsO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHByb21pc2UuZmFpbChlcnJvciA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMudm0uTWVzc2FnZShlcnJvci5yZXNwb25zZUpTT04uTWVzc2FnZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHByb21pc2U7XHJcbiAgICB9XHJcbiAgICBwcm9taXNlRG9uZShkYXRhLCBpZCkge1xyXG4gICAgICAgIHN1cGVyLmdldFByb21pc2VEb25lKGRhdGEsIGlkKTtcclxuICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IGRhdGEuUmV0dXJuVXJsO1xyXG4gICAgfVxyXG59XHJcbm1vZHVsZS5leHBvcnRzID0gRnVuZHJhaXNlckxvZ2luRm9ybTtcclxuIiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xyXG5jb25zdCBrbyA9IHJlcXVpcmUoXCJrbm9ja291dFwiKTtcclxuY29uc3QgYmFzZSA9IHJlcXVpcmUoXCIuLi9CYXNlL1ZNQmFzZVwiKTtcclxuY29uc3QgVGFibGUgPSByZXF1aXJlKFwiLi4vQmFzZS9UYWJsZVwiKTtcclxuY29uc3QgRm9ybSA9IHJlcXVpcmUoXCIuLi9CYXNlL0Zvcm1cIik7XHJcbmNvbnN0IEZ1bmRyYWlzZXJNZW1iZXJSb3V0ZXIgPSByZXF1aXJlKFwiLi9GdW5kcmFpc2VyTWVtYmVyUm91dGVyXCIpO1xyXG5jbGFzcyBGdW5kcmFpc2VyTWVtYmVyIGV4dGVuZHMgYmFzZS5WbUJhc2Uge1xyXG4gICAgY29uc3RydWN0b3IoZGF0YSkge1xyXG4gICAgICAgIC8vY2FsbCBiYXNlIGNsYXNzIGNvbnN0cnVjdG9yXHJcbiAgICAgICAgc3VwZXIoZGF0YSwgRm9ybSwgVGFibGUsIEZ1bmRyYWlzZXJNZW1iZXJSb3V0ZXIpO1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICAgICAga28uYXBwbHlCaW5kaW5ncyh0aGlzKTtcclxuICAgICAgICAkKCcuaGlkZVVuYm91bmQnKS5yZW1vdmVDbGFzcygnaGlkZVVuYm91bmQnKTtcclxuICAgIH1cclxufVxyXG5tb2R1bGUuZXhwb3J0cyA9IEZ1bmRyYWlzZXJNZW1iZXI7XHJcbiIsIlwidXNlIHN0cmljdFwiO1xyXG5jb25zdCBSb3V0ZXIgPSByZXF1aXJlKFwiLi4vQmFzZS9Sb3V0ZXJcIik7XHJcbmNsYXNzIEZ1bmRyYWlzZXJNZW1iZXJSb3V0ZXIgZXh0ZW5kcyBSb3V0ZXIge1xyXG4gICAgY29uc3RydWN0b3IoZGF0YSwgdm0sIGFsdGVybmF0ZXJvdXRlcykge1xyXG4gICAgICAgIHN1cGVyKGRhdGEsIHZtLCBhbHRlcm5hdGVyb3V0ZXMpO1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICAgICAgdGhpcy52bSA9IHZtO1xyXG4gICAgfVxyXG4gICAgZ2V0Um91dGVzKCkge1xyXG4gICAgICAgIHZhciBzZWxmO1xyXG4gICAgICAgIHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IGAke3NlbGYuZ2V0QXJlYSgpfS8ke3NlbGYuZGF0YS5UaXRsZX0jL2xpc3RgLFxyXG4gICAgICAgICAgICAgICAgZnVuYzogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uZm9ybS5jYW5jZWwoKTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLnRhYmxlLmxvYWQoKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9SZWdFeDogZmFsc2VcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogYCR7c2VsZi5nZXRBcmVhKCl9LyR7c2VsZi5kYXRhLlRpdGxlfSMvbmV3YCxcclxuICAgICAgICAgICAgICAgIGZ1bmMoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5mb3JtLmFkZCgpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbnZlcnRUb1JlZ0V4OiBmYWxzZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBgJHtzZWxmLmdldEFyZWEoKX0vJHtzZWxmLmRhdGEuVGl0bGV9Iy92aWV3LzppZGAsXHJcbiAgICAgICAgICAgICAgICBmdW5jKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpZCA9IHRoaXMucGFyYW1zWydpZCddO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uZm9ybS5nZXREZXRhaWwoaWQpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbnZlcnRUb1JlZ0V4OiBmYWxzZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBgJHtzZWxmLmdldEFyZWEoKX0vJHtzZWxmLmRhdGEuVGl0bGV9Iy9pbmRleGAsXHJcbiAgICAgICAgICAgICAgICBmdW5jKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uZm9ybS5nZXREZXRhaWwobnVsbCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvUmVnRXg6IGZhbHNlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IGAke3NlbGYuZ2V0QXJlYSgpfS8ke3NlbGYuZGF0YS5UaXRsZX0jL2RlbGV0ZS86aWRgLFxyXG4gICAgICAgICAgICAgICAgZnVuYygpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgaWQgPSB0aGlzLnBhcmFtc1snaWQnXTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLmZvcm0uZGVsZXRlSXRlbShpZCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvUmVnRXg6IGZhbHNlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICBdO1xyXG4gICAgfVxyXG59XHJcbm1vZHVsZS5leHBvcnRzID0gRnVuZHJhaXNlck1lbWJlclJvdXRlcjtcclxuIiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xyXG5jb25zdCBrbyA9IHJlcXVpcmUoXCJrbm9ja291dFwiKTtcclxuY29uc3QgYmFzZSA9IHJlcXVpcmUoXCIuLi9CYXNlL1ZNQmFzZVwiKTtcclxuY29uc3QgVGFibGUgPSByZXF1aXJlKFwiLi4vQmFzZS9UYWJsZVwiKTtcclxuY29uc3QgRnVuZHJhaXNlclVuaXRFeGNlcHRpb25Sb3V0ZXIgPSByZXF1aXJlKFwiLi9GdW5kcmFpc2VyVW5pdEV4Y2VwdGlvblJvdXRlclwiKTtcclxuY29uc3QgRm9ybSA9IHJlcXVpcmUoXCIuLi9CYXNlL0Zvcm1cIik7XHJcbmNsYXNzIEZ1bmRyYWlzZXJVbml0RXhjZXB0aW9uIGV4dGVuZHMgYmFzZS5WbUJhc2Uge1xyXG4gICAgY29uc3RydWN0b3IoZGF0YSkge1xyXG4gICAgICAgIC8vY2FsbCBiYXNlIGNsYXNzIGNvbnN0cnVjdG9yXHJcbiAgICAgICAgc3VwZXIoZGF0YSwgRm9ybSwgVGFibGUsIEZ1bmRyYWlzZXJVbml0RXhjZXB0aW9uUm91dGVyKTtcclxuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xyXG4gICAgICAgIGtvLmFwcGx5QmluZGluZ3ModGhpcyk7XHJcbiAgICAgICAgJCgnLmhpZGVVbmJvdW5kJykucmVtb3ZlQ2xhc3MoJ2hpZGVVbmJvdW5kJyk7XHJcbiAgICB9XHJcbn1cclxubW9kdWxlLmV4cG9ydHMgPSBGdW5kcmFpc2VyVW5pdEV4Y2VwdGlvbjtcclxuIiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbmNvbnN0IFJvdXRlciA9IHJlcXVpcmUoXCIuLi9CYXNlL1JvdXRlclwiKTtcclxuY2xhc3MgRnVuZHJhaXNlclVuaXRFeGNlcHRpb25Sb3V0ZXIgZXh0ZW5kcyBSb3V0ZXIge1xyXG4gICAgY29uc3RydWN0b3IoZGF0YSwgdm0sIGFsdGVybmF0ZXJvdXRlcykge1xyXG4gICAgICAgIHN1cGVyKGRhdGEsIHZtLCBhbHRlcm5hdGVyb3V0ZXMpO1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICAgICAgdGhpcy52bSA9IHZtO1xyXG4gICAgfVxyXG4gICAgZ2V0Um91dGVzKCkge1xyXG4gICAgICAgIHZhciBzZWxmO1xyXG4gICAgICAgIHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IGAke3NlbGYuZ2V0QXJlYSgpfS8ke3NlbGYuZGF0YS5UaXRsZX0jL2xpc3RgLFxyXG4gICAgICAgICAgICAgICAgZnVuYzogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uZm9ybS5jYW5jZWwoKTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLnRhYmxlLmxvYWQoKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9SZWdFeDogZmFsc2VcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogYCR7c2VsZi5nZXRBcmVhKCl9LyR7c2VsZi5kYXRhLlRpdGxlfSMvbmV3YCxcclxuICAgICAgICAgICAgICAgIGZ1bmMoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5mb3JtLmFkZCgpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbnZlcnRUb1JlZ0V4OiBmYWxzZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBgJHtzZWxmLmdldEFyZWEoKX0vJHtzZWxmLmRhdGEuVGl0bGV9Iy92aWV3LzppZGAsXHJcbiAgICAgICAgICAgICAgICBmdW5jKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpZCA9IHRoaXMucGFyYW1zWydpZCddO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uZm9ybS5nZXREZXRhaWwoaWQpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbnZlcnRUb1JlZ0V4OiBmYWxzZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBgJHtzZWxmLmdldEFyZWEoKX0vJHtzZWxmLmRhdGEuVGl0bGV9Iy9pbmRleGAsXHJcbiAgICAgICAgICAgICAgICBmdW5jKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uZm9ybS5nZXREZXRhaWwobnVsbCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvUmVnRXg6IGZhbHNlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IGAke3NlbGYuZ2V0QXJlYSgpfS8ke3NlbGYuZGF0YS5UaXRsZX0jL2RlbGV0ZS86aWRgLFxyXG4gICAgICAgICAgICAgICAgZnVuYygpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgaWQgPSB0aGlzLnBhcmFtc1snaWQnXTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLmZvcm0uZGVsZXRlSXRlbShpZCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvUmVnRXg6IGZhbHNlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICBdO1xyXG4gICAgfVxyXG59XHJcbm1vZHVsZS5leHBvcnRzID0gRnVuZHJhaXNlclVuaXRFeGNlcHRpb25Sb3V0ZXI7XHJcbiIsIlwidXNlIHN0cmljdFwiO1xyXG5jb25zdCAkID0gcmVxdWlyZShcImpxdWVyeVwiKTtcclxuY29uc3Qga28gPSByZXF1aXJlKFwia25vY2tvdXRcIik7XHJcbmNvbnN0IGJhc2UgPSByZXF1aXJlKFwiLi4vQmFzZS9WTUJhc2VcIik7XHJcbmNvbnN0IFRhYmxlID0gcmVxdWlyZShcIi4uL0Jhc2UvVGFibGVcIik7XHJcbmNvbnN0IEZ1bmRyYWlzZXJSb3V0ZXIgPSByZXF1aXJlKFwiLi9GdW5kcmFpc2VyUm91dGVyXCIpO1xyXG5jb25zdCBGb3JtID0gcmVxdWlyZShcIi4uL0Jhc2UvRm9ybVwiKTtcclxuY29uc3QgTW9kYWwgPSByZXF1aXJlKFwiLi4vQ29tbW9uL01vZGFsXCIpO1xyXG5jb25zdCBfID0gcmVxdWlyZShcInVuZGVyc2NvcmVcIik7XHJcbmNsYXNzIEZ1bmRyYWlzZXIgZXh0ZW5kcyBiYXNlLlZtQmFzZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihkYXRhKSB7XHJcbiAgICAgICAgLy9jYWxsIGJhc2UgY2xhc3MgY29uc3RydWN0b3JcclxuICAgICAgICBzdXBlcihkYXRhLCBGb3JtLCBUYWJsZSwgRnVuZHJhaXNlclJvdXRlcik7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcclxuICAgICAgICB0aGlzLm1vZGFsID0gbmV3IE1vZGFsKCdmdW5kcmFpc2VyU3RhdHVzV2FybmluZycpO1xyXG4gICAgICAgIHRoaXMubW9kYWwuaW5pdCgpO1xyXG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcclxuICAgICAgICBrby5hcHBseUJpbmRpbmdzKHRoaXMpO1xyXG4gICAgICAgICQoXCIuaGlkZVVuYm91bmRcIikucmVtb3ZlQ2xhc3MoXCJoaWRlVW5ib3VuZFwiKTtcclxuICAgICAgICAkKCcjaXRlbS1kZXRhaWwtZm9ybScpLm9uKFwiY2hhbmdlXCIsICcjSXRlbURldGFpbF9TdGF0dXMnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIC8veW91ciBjb2RlIGdvZXMgaGVyZS4uLlxyXG4gICAgICAgICAgICBpZiAoJCgnI0l0ZW1EZXRhaWxfU3RhdHVzJykudmFsKCkgPT0gJ0NPTVBMRVRFRCcpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubW9kYWwub3BlbignY2xpY2tlZC1zdGF0dXMnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICA7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgJCgnI3NhdmUnKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmICgkKCcjSXRlbURldGFpbF9TdGF0dXMnKS52YWwoKSA9PSAnQ09NUExFVEVEJykge1xyXG4gICAgICAgICAgICAgICAgJCgnI2l0ZW0tZGV0YWlsLWZvcm0gI0l0ZW1EZXRhaWxfU3RhdHVzJykudHJpZ2dlcihcImNoYW5nZVwiKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgICQoJyNMb2dvJykub24oJ2NoYW5nZScsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmZpbGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZmlsZSA9IHRoaXMuZmlsZXNbaV07XHJcbiAgICAgICAgICAgICAgICB2YXIgZmQgPSBuZXcgRm9ybURhdGEoKTtcclxuICAgICAgICAgICAgICAgIGZkLmFwcGVuZChcImZpbGVUb1VwbG9hZFwiLCBmaWxlKTtcclxuICAgICAgICAgICAgICAgICQuYWpheCh7XHJcbiAgICAgICAgICAgICAgICAgICAgdXJsOiAnL3BhbmRhZnVuZHJhaXNlci91cGxvYWRmaWxlJyxcclxuICAgICAgICAgICAgICAgICAgICBkYXRhOiBmZCxcclxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnUE9TVCcsXHJcbiAgICAgICAgICAgICAgICAgICAgY2FjaGU6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NEYXRhOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICBjb250ZW50VHlwZTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24gKGRhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5JdGVtRGV0YWlsLkxvZ28oZGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICAkKCdib2R5Jykub24oJ2NsaWNrJywgJy5yZW1vdmUtbG9nbycsIChlKSA9PiB7XHJcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgdGhpcy5JdGVtRGV0YWlsLkxvZ28oJycpO1xyXG4gICAgICAgICAgICAkKCcjTG9nbycpLnZhbCgnJyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5JdGVtRGV0YWlsLk51bWJlclN0b3Jlcy5zdWJzY3JpYmUoZnVuY3Rpb24gKG51bWJlclN0b3Jlcykge1xyXG4gICAgICAgICAgICBpZiAobnVtYmVyU3RvcmVzID09PSAnTXVsdGlwbGUgU3RvcmVzJykge1xyXG4gICAgICAgICAgICAgICAgc2VsZi5JdGVtRGV0YWlsLlNob3dNdWx0aXBsZVN0b3Jlc1VwbG9hZCh0cnVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHNlbGYuSXRlbURldGFpbC5TaG93TXVsdGlwbGVTdG9yZXNVcGxvYWQoZmFsc2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgJCgnYm9keScpLm9uKCdjaGFuZ2UnLCAnI1N0b3JlcycsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmZpbGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZmlsZSA9IHRoaXMuZmlsZXNbaV07XHJcbiAgICAgICAgICAgICAgICB2YXIgZmQgPSBuZXcgRm9ybURhdGEoKTtcclxuICAgICAgICAgICAgICAgIGZkLmFwcGVuZChcImZpbGVUb1VwbG9hZFwiLCBmaWxlKTtcclxuICAgICAgICAgICAgICAgICQuYWpheCh7XHJcbiAgICAgICAgICAgICAgICAgICAgdXJsOiAnL2FkbWluL2Z1bmRyYWlzZXIvVXBsb2FkRnVuZHJhaXNlclN0b3JlTGlzdCcsXHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogZmQsXHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ1BPU1QnLFxyXG4gICAgICAgICAgICAgICAgICAgIGNhY2hlOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzRGF0YTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgY29udGVudFR5cGU6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uIChkYXRhKSB7IH0sXHJcbiAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2Vycm9yJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICQoJyNTdG9yZVVwbG9hZEVycm9yJykuaHRtbCgnVGhlcmUgd2FzIGFuIGVycm9yIHVwbG9hZGluZyBmaWxlJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIGNsZWFyRmlsdGVycygpIHtcclxuICAgICAgICBfLmVhY2godGhpcy5GaWx0ZXJzLCAodikgPT4ge1xyXG4gICAgICAgICAgICB2KCcnKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIGV4cG9ydEZ1bmRyYWlzZXJzKCkge1xyXG4gICAgICAgIHZhciBpZ25vcmVNYXBwaW5nID0ge1xyXG4gICAgICAgICAgICAnaWdub3JlJzogdGhpcy5kYXRhLktPTWFwcGluZy5hbGxOb25Qb3N0QmFja1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdmFyIHBvc3REYXRhID0ga28ubWFwcGluZy50b0pTKHRoaXMsIGlnbm9yZU1hcHBpbmcpO1xyXG4gICAgICAgIGRlbGV0ZSBwb3N0RGF0YS5BbGVydHM7XHJcbiAgICAgICAgdmFyIHByb21pc2UgPSAkLmFqYXgoe1xyXG4gICAgICAgICAgICB1cmw6ICcvQWRtaW4vRnVuZHJhaXNlci9FeHBvcnQnLFxyXG4gICAgICAgICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShwb3N0RGF0YSksXHJcbiAgICAgICAgICAgIHR5cGU6ICdQT1NUJyxcclxuICAgICAgICAgICAgY2FjaGU6IGZhbHNlLFxyXG4gICAgICAgICAgICBjb250ZW50VHlwZTogJ2FwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtOCdcclxuICAgICAgICB9KTtcclxuICAgICAgICBwcm9taXNlLmZhaWwoKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuSXNMb2FkaW5nKGZhbHNlKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBwcm9taXNlLmRvbmUoZGF0YSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuSXNMb2FkaW5nKGZhbHNlKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufVxyXG5tb2R1bGUuZXhwb3J0cyA9IEZ1bmRyYWlzZXI7XHJcbiIsIlwidXNlIHN0cmljdFwiO1xyXG5jb25zdCBSb3V0ZXIgPSByZXF1aXJlKFwiLi4vQmFzZS9Sb3V0ZXJcIik7XHJcbmNsYXNzIEZ1bmRyYWlzZXJSb3V0ZXIgZXh0ZW5kcyBSb3V0ZXIge1xyXG4gICAgY29uc3RydWN0b3IoZGF0YSwgdm0sIGFsdGVybmF0ZXJvdXRlcykge1xyXG4gICAgICAgIHN1cGVyKGRhdGEsIHZtLCBhbHRlcm5hdGVyb3V0ZXMpO1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICAgICAgdGhpcy52bSA9IHZtO1xyXG4gICAgfVxyXG4gICAgZ2V0Um91dGVzKCkge1xyXG4gICAgICAgIHZhciBzZWxmO1xyXG4gICAgICAgIHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IGAke3NlbGYuZ2V0QXJlYSgpfS8ke3NlbGYuZGF0YS5UaXRsZX0jL2xpc3RgLFxyXG4gICAgICAgICAgICAgICAgZnVuYzogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uZm9ybS5jYW5jZWwoKTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLnRhYmxlLmxvYWQoKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9SZWdFeDogZmFsc2VcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogYCR7c2VsZi5nZXRBcmVhKCl9LyR7c2VsZi5kYXRhLlRpdGxlfSMvbmV3YCxcclxuICAgICAgICAgICAgICAgIGZ1bmMoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5mb3JtLmFkZCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uSXRlbURldGFpbC5OdW1iZXJTdG9yZXMoJ09uZSBTdG9yZScpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbnZlcnRUb1JlZ0V4OiBmYWxzZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBgJHtzZWxmLmdldEFyZWEoKX0vJHtzZWxmLmRhdGEuVGl0bGV9Iy92aWV3LzppZGAsXHJcbiAgICAgICAgICAgICAgICBmdW5jKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpZCA9IHRoaXMucGFyYW1zWydpZCddO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uZm9ybS5nZXREZXRhaWwoaWQpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbnZlcnRUb1JlZ0V4OiBmYWxzZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBgJHtzZWxmLmdldEFyZWEoKX0vJHtzZWxmLmRhdGEuVGl0bGV9Iy9pbmRleGAsXHJcbiAgICAgICAgICAgICAgICBmdW5jKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uZm9ybS5nZXREZXRhaWwobnVsbCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvUmVnRXg6IGZhbHNlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IGAke3NlbGYuZ2V0QXJlYSgpfS8ke3NlbGYuZGF0YS5UaXRsZX0jL2RlbGV0ZS86aWRgLFxyXG4gICAgICAgICAgICAgICAgZnVuYygpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgaWQgPSB0aGlzLnBhcmFtc1snaWQnXTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLmZvcm0uZGVsZXRlSXRlbShpZCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvUmVnRXg6IGZhbHNlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICBdO1xyXG4gICAgfVxyXG59XHJcbm1vZHVsZS5leHBvcnRzID0gRnVuZHJhaXNlclJvdXRlcjtcclxuIiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xyXG5jb25zdCBrbyA9IHJlcXVpcmUoXCJrbm9ja291dFwiKTtcclxuY29uc3QgUGFnZUJhc2UgPSByZXF1aXJlKFwiLi4vQ29udGVudFBhZ2UvQ29udGVudFBhZ2VCYXNlXCIpO1xyXG5jb25zdCBHcmlkQ29udGVudFBhZ2VGb3JtID0gcmVxdWlyZShcIi4vR3JpZENvbnRlbnRQYWdlRm9ybVwiKTtcclxuY29uc3QgVGFibGUgPSByZXF1aXJlKFwiLi4vQmFzZS9UYWJsZVwiKTtcclxuY29uc3QgQ29udGVudFBhZ2VSb3V0ZXIgPSByZXF1aXJlKFwiLi4vQ29udGVudFBhZ2UvQ29udGVudFBhZ2VSb3V0ZXJcIik7XHJcbmNsYXNzIEdyaWRDb250ZW50UGFnZSBleHRlbmRzIFBhZ2VCYXNlIHtcclxuICAgIGNvbnN0cnVjdG9yKGRhdGEpIHtcclxuICAgICAgICBzdXBlcihkYXRhLCBHcmlkQ29udGVudFBhZ2VGb3JtLCBUYWJsZSwgQ29udGVudFBhZ2VSb3V0ZXIpO1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICAgICAga28uYXBwbHlCaW5kaW5ncyh0aGlzKTtcclxuICAgICAgICAkKCcuaGlkZVVuYm91bmQnKS5yZW1vdmVDbGFzcygnaGlkZVVuYm91bmQnKTtcclxuICAgIH1cclxufVxyXG5tb2R1bGUuZXhwb3J0cyA9IEdyaWRDb250ZW50UGFnZTtcclxuIiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbmNvbnN0IF8gPSByZXF1aXJlKFwidW5kZXJzY29yZVwiKTtcclxuY29uc3QgUGFnZUZvcm0gPSByZXF1aXJlKFwiLi4vQ29udGVudFBhZ2UvQ29udGVudFBhZ2VGb3JtXCIpO1xyXG5jbGFzcyBHcmlkQ29udGVudFBhZ2VGb3JtIGV4dGVuZHMgUGFnZUZvcm0ge1xyXG4gICAgY29uc3RydWN0b3IoZGF0YSwgdm0pIHtcclxuICAgICAgICBzdXBlcihkYXRhLCB2bSk7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcclxuICAgICAgICB0aGlzLnZtID0gdm07XHJcbiAgICAgICAgdGhpcy5hZGRJdGVtRGV0YWlsQ2xpZW50T25seVByb3BlcnRpZXMoKTtcclxuICAgIH1cclxuICAgIHNldHVwQmluZGlncygpIHtcclxuICAgICAgICBzdXBlci5zZXR1cEJpbmRpZ3MoKTtcclxuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgdmFyIG1vZGVsSG9sZGVyU2VsZWN0b3IgPSAkKCcubW9kYWxmb3JtLWhvbGRlcicpO1xyXG4gICAgICAgIC8vVG9nZ2xlIENvbGxhcHNlXHJcbiAgICAgICAgbW9kZWxIb2xkZXJTZWxlY3Rvci5vbignY2xpY2snLCAnLnRvZ2dsZS1yb3cnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBkYXRhID0ga28uZGF0YUZvcih0aGlzKTsgLy9sb2NhbCB0aGlzXHJcbiAgICAgICAgICAgIGRhdGEuSGlkZGVuKCFkYXRhLkhpZGRlbigpKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBtb2RlbEhvbGRlclNlbGVjdG9yLm9uKCdjbGljaycsICcuZ3JpZGNlbGwtdG9nZ2xlJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgZGF0YSA9IGtvLmRhdGFGb3IodGhpcyk7IC8vbG9jYWwgdGhpc1xyXG4gICAgICAgICAgICBkYXRhLkV4cGFuZGVkKCFkYXRhLkV4cGFuZGVkKCkpO1xyXG4gICAgICAgICAgICB2YXIgY2VsbCA9ICQodGhpcykucGFyZW50KCkucGFyZW50KCkucGFyZW50KCk7IC8vbG9jYWwgdGhpc1xyXG4gICAgICAgICAgICB2YXIgb3JpZ2luYWxDbGFzcyA9IGNlbGwuYXR0cignZGF0YS1ub3JtYWwtY3NzJyk7XHJcbiAgICAgICAgICAgIGlmIChjZWxsLmhhc0NsYXNzKG9yaWdpbmFsQ2xhc3MpKSB7XHJcbiAgICAgICAgICAgICAgICBjZWxsLnJlbW92ZUNsYXNzKG9yaWdpbmFsQ2xhc3MpO1xyXG4gICAgICAgICAgICAgICAgY2VsbC5hZGRDbGFzcygnY29sLXhzLTEyJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjZWxsLmFkZENsYXNzKG9yaWdpbmFsQ2xhc3MpO1xyXG4gICAgICAgICAgICAgICAgY2VsbC5yZW1vdmVDbGFzcygnY29sLXhzLTEyJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBtb2RlbEhvbGRlclNlbGVjdG9yLm9uKCdjbGljaycsICcubWluaW1pemUtYWxsJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgZGF0YSA9IGtvLmRhdGFGb3IodGhpcyk7IC8vbG9jYWwgdGhpc1xyXG4gICAgICAgICAgICBzZWxmLm1pbmltaXplQWxsUm93cyhkYXRhKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBtb2RlbEhvbGRlclNlbGVjdG9yLm9uKCdjbGljaycsICcubWF4aW1pemUtYWxsJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgZGF0YSA9IGtvLmRhdGFGb3IodGhpcyk7IC8vbG9jYWwgdGhpc1xyXG4gICAgICAgICAgICBzZWxmLm1heGltaXplQWxsUm93cyhkYXRhKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICAvL1JlbW92aW5nXHJcbiAgICAgICAgbW9kZWxIb2xkZXJTZWxlY3Rvci5vbignY2xpY2snLCAnLnJvdy1yZW1vdmUnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBkYXRhID0ga28uZGF0YUZvcih0aGlzKTsgLy9sb2NhbCB0aGlzXHJcbiAgICAgICAgICAgIHZhciBjb250ZXh0ID0ga28uY29udGV4dEZvcih0aGlzKTsgLy9sb2NhbCB0aGlzXHJcbiAgICAgICAgICAgIHZhciBncmlkID0gY29udGV4dC4kcGFyZW50O1xyXG4gICAgICAgICAgICBncmlkLlJvd3MucmVtb3ZlKGRhdGEpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIG1vZGVsSG9sZGVyU2VsZWN0b3Iub24oJ2NsaWNrJywgJy5jZWxsLXJlbW92ZScsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIGRhdGEgPSBrby5kYXRhRm9yKHRoaXMpOyAvL2xvY2FsIHRoaXNcclxuICAgICAgICAgICAgdmFyIGNvbnRleHQgPSBrby5jb250ZXh0Rm9yKHRoaXMpOyAvL2xvY2FsIHRoaXNcclxuICAgICAgICAgICAgdmFyIHJvdyA9IGNvbnRleHQuJHBhcmVudDtcclxuICAgICAgICAgICAgcm93LkNlbGxzLnJlbW92ZShkYXRhKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBtb2RlbEhvbGRlclNlbGVjdG9yLm9uKCdjbGljaycsICcuaHJlZi1yZW1vdmUnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBkYXRhID0ga28uZGF0YUZvcih0aGlzKTsgLy9sb2NhbCB0aGlzXHJcbiAgICAgICAgICAgIHZhciBjb250ZXh0ID0ga28uY29udGV4dEZvcih0aGlzKTsgLy9sb2NhbCB0aGlzXHJcbiAgICAgICAgICAgIHZhciBjZWxsID0gY29udGV4dC4kcGFyZW50O1xyXG4gICAgICAgICAgICBjZWxsLkhyZWZzLnJlbW92ZShkYXRhKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICAvL0FkZGluZ1xyXG4gICAgICAgIG1vZGVsSG9sZGVyU2VsZWN0b3Iub24oJ2NsaWNrJywgJy5hZGQtcm93JywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgZGF0YSA9IGtvLmRhdGFGb3IodGhpcyk7IC8vbG9jYWwgdGhpc1xyXG4gICAgICAgICAgICBzZWxmLm1pbmltaXplQWxsUm93cyhkYXRhKTtcclxuICAgICAgICAgICAgdmFyIG9yZGVyID0gZGF0YS5Sb3dzKCkubGVuZ3RoICsgMTtcclxuICAgICAgICAgICAgdmFyIHJvdyA9IHNlbGYudm0uTmV3Um93O1xyXG4gICAgICAgICAgICB2YXIgcm93Q29weSA9IGtvLm1hcHBpbmcuZnJvbUpTKGtvLnRvSlMocm93KSk7XHJcbiAgICAgICAgICAgIHNlbGYuYWRkU29ydGVkQ2VsbHMocm93Q29weSk7XHJcbiAgICAgICAgICAgIHZhciBjZWxsID0gc2VsZi52bS5OZXdDZWxsO1xyXG4gICAgICAgICAgICB2YXIgY2VsbENvcHkgPSBrby5tYXBwaW5nLmZyb21KUyhrby50b0pTKGNlbGwpKTtcclxuICAgICAgICAgICAgc2VsZi5hZGRTb3J0ZWRIcmVmcyhjZWxsQ29weSk7XHJcbiAgICAgICAgICAgIGNlbGxDb3B5Lk9yZGVyKG9yZGVyKTtcclxuICAgICAgICAgICAgcm93Q29weS5DZWxscy5wdXNoKGNlbGxDb3B5KTtcclxuICAgICAgICAgICAgcm93Q29weS5PcmRlcihvcmRlcik7XHJcbiAgICAgICAgICAgIGRhdGEuUm93cy5wdXNoKHJvd0NvcHkpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIG1vZGVsSG9sZGVyU2VsZWN0b3Iub24oJ2NsaWNrJywgJy5hZGQtY2VsbCcsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIHJvdyA9IGtvLmRhdGFGb3IodGhpcyk7IC8vbG9jYWwgdGhpc1xyXG4gICAgICAgICAgICB2YXIgb3JkZXIgPSByb3cuQ2VsbHMoKS5sZW5ndGggKyAxO1xyXG4gICAgICAgICAgICB2YXIgY2VsbCA9IHNlbGYudm0uTmV3Q2VsbDtcclxuICAgICAgICAgICAgdmFyIGNlbGxDb3B5ID0ga28ubWFwcGluZy5mcm9tSlMoa28udG9KUyhjZWxsKSk7XHJcbiAgICAgICAgICAgIHNlbGYuYWRkU29ydGVkSHJlZnMoY2VsbENvcHkpO1xyXG4gICAgICAgICAgICBjZWxsQ29weS5PcmRlcihvcmRlcik7XHJcbiAgICAgICAgICAgIHJvdy5DZWxscy5wdXNoKGNlbGxDb3B5KTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBtb2RlbEhvbGRlclNlbGVjdG9yLm9uKCdjbGljaycsICcuYWRkLWhyZWYnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBjZWxsID0ga28uZGF0YUZvcih0aGlzKTsgLy9sb2NhbCB0aGlzXHJcbiAgICAgICAgICAgIHZhciBocmVmID0gc2VsZi52bS5OZXdIcmVmO1xyXG4gICAgICAgICAgICB2YXIgaHJlZkNvcHkgPSBrby5tYXBwaW5nLmZyb21KUyhrby50b0pTKGhyZWYpKTtcclxuICAgICAgICAgICAgY2VsbC5IcmVmcy5wdXNoKGhyZWZDb3B5KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIG1pbmltaXplQWxsUm93cyhkYXRhKSB7XHJcbiAgICAgICAgXy5lYWNoKGRhdGEuUm93cygpLCAocm93KSA9PiB7XHJcbiAgICAgICAgICAgIHJvdy5IaWRkZW4odHJ1ZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBtYXhpbWl6ZUFsbFJvd3MoZGF0YSkge1xyXG4gICAgICAgIF8uZWFjaChkYXRhLlJvd3MoKSwgKHJvdykgPT4ge1xyXG4gICAgICAgICAgICByb3cuSGlkZGVuKGZhbHNlKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIGdldE5ld1ZlcnNpb24obGFuZ3VhZ2UpIHtcclxuICAgICAgICB2YXIgbmV3VmVyc2lvbiA9IHN1cGVyLmdldE5ld1ZlcnNpb24obGFuZ3VhZ2UpO1xyXG4gICAgICAgIC8vcmVzZXQgYWxsIElkcyB0byAwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDBcclxuICAgICAgICAvL3NvIHRoYXQgYWxsIGFsbCBjaGlsZHJlbiBvZiBuZXcgdmVyc2lvbiBhcmUgbmV3IGNvcGllc1xyXG4gICAgICAgIHZhciBkZWZhdWx0SWQgPSBuZXdWZXJzaW9uLklkKCk7XHJcbiAgICAgICAgXy5lYWNoKG5ld1ZlcnNpb24uUm93cygpLCAocm93KSA9PiB7XHJcbiAgICAgICAgICAgIHJvdy5JZChkZWZhdWx0SWQpO1xyXG4gICAgICAgICAgICBfLmVhY2gocm93LkNlbGxzKCksIChjZWxsKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjZWxsLklkKGRlZmF1bHRJZCk7XHJcbiAgICAgICAgICAgICAgICBfLmVhY2goY2VsbC5IcmVmcygpLCAoaHJlZikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGhyZWYuSWQoZGVmYXVsdElkKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gbmV3VmVyc2lvbjtcclxuICAgIH1cclxuICAgIGFkZFZlcnNpb25Db21wdXRlZCh2ZXJzaW9uKSB7XHJcbiAgICAgICAgc3VwZXIuYWRkVmVyc2lvbkNvbXB1dGVkKHZlcnNpb24pO1xyXG4gICAgICAgIC8vc29ydGVkIHJvd3NcclxuICAgICAgICB2ZXJzaW9uLlNvcnRlZFJvd3MgPSBrby5jb21wdXRlZCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB2ZXJzaW9uLlJvd3MoKS5zb3J0KChsZWZ0LCByaWdodCkgPT4gKGxlZnQuT3JkZXIoKSA9PT0gcmlnaHQuT3JkZXIoKSA/IDAgOiAobGVmdC5PcmRlcigpIDwgcmlnaHQuT3JkZXIoKSA/IC0xIDogMSkpKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICAvL3NvcnRlZCBjZWxsc1xyXG4gICAgICAgIF8uZWFjaCh2ZXJzaW9uLlJvd3MoKSwgKHJvdykgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmFkZFNvcnRlZENlbGxzKHJvdyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdmVyc2lvbi5zaG93TWluaW1pemVBbGwgPSBrby5jb21wdXRlZCgoKSA9PiBfLmFueSh2ZXJzaW9uLlJvd3MoKSwgKHJvdykgPT4gKCFyb3cuSGlkZGVuKCkpKSk7XHJcbiAgICAgICAgdmVyc2lvbi5zaG93TWF4aW1pemVBbGwgPSBrby5jb21wdXRlZCgoKSA9PiBfLmFueSh2ZXJzaW9uLlJvd3MoKSwgKHJvdykgPT4gKHJvdy5IaWRkZW4oKSkpKTtcclxuICAgIH1cclxuICAgIGFkZFNvcnRlZENlbGxzKHJvdykge1xyXG4gICAgICAgIHJvdy5Tb3J0ZWRDZWxscyA9IGtvLmNvbXB1dGVkKCgpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHJvdy5DZWxscygpLnNvcnQoKGxlZnQsIHJpZ2h0KSA9PiAobGVmdC5PcmRlcigpID09PSByaWdodC5PcmRlcigpID8gMCA6IChsZWZ0Lk9yZGVyKCkgPCByaWdodC5PcmRlcigpID8gLTEgOiAxKSkpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIC8vc29ydGVkIGNlbGxzXHJcbiAgICAgICAgXy5lYWNoKHJvdy5DZWxscygpLCAoY2VsbCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmFkZFNvcnRlZEhyZWZzKGNlbGwpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgYWRkU29ydGVkSHJlZnMoY2VsbCkge1xyXG4gICAgICAgIGNlbGwuU29ydGVkSHJlZnMgPSBrby5jb21wdXRlZCgoKSA9PiBjZWxsLkhyZWZzKCkuc29ydCgobGVmdCwgcmlnaHQpID0+IChsZWZ0Lk9yZGVyKCkgPT09IHJpZ2h0Lk9yZGVyKCkgPyAwIDogKGxlZnQuT3JkZXIoKSA8IHJpZ2h0Lk9yZGVyKCkgPyAtMSA6IDEpKSkpO1xyXG4gICAgfVxyXG4gICAgcG9zdCgpIHtcclxuICAgICAgICAvL3ByZXZlbnQgZG91YmxlIHBvc3RcclxuICAgICAgICBpZiAodGhpcy52bS5Jc0xvYWRpbmcoKSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vbWFrZSBvdmVybGF5IGxvYWRpbmcgZGl2IGZ1bGwgaGVpZ2h0XHJcbiAgICAgICAgJCgnI2xvYWRpbmcnKS5oZWlnaHQoJCh3aW5kb3cpLmhlaWdodCgpKTtcclxuICAgICAgICB0aGlzLnZtLklzTG9hZGluZyh0cnVlKTtcclxuICAgICAgICB2YXIgaWdub3JlTWFwcGluZyA9IHtcclxuICAgICAgICAgICAgJ2lnbm9yZSc6IHRoaXMuZGF0YS5LT01hcHBpbmcuYWxsTm9uUG9zdEJhY2tcclxuICAgICAgICB9O1xyXG4gICAgICAgIHZhciBwb3N0RGF0YSA9IGtvLm1hcHBpbmcudG9KUyh0aGlzLnZtLCBpZ25vcmVNYXBwaW5nKTtcclxuICAgICAgICAkLmVhY2gocG9zdERhdGEuSXRlbURldGFpbC5BbGxWZXJzaW9ucywgZnVuY3Rpb24gKGksIHYpIHtcclxuICAgICAgICAgICAgaWYgKG1vbWVudC5pc01vbWVudCh2LlN0YXJ0RGF0ZVRpbWUpKVxyXG4gICAgICAgICAgICAgICAgdi5TdGFydERhdGVUaW1lID0gdi5TdGFydERhdGVUaW1lLmZvcm1hdChcIllZWVktTU0tRFRISDptbTpzcy5tbW1cIik7XHJcbiAgICAgICAgICAgIGlmICghaXNOYU4odi5FbmREYXRlVGltZSkpIHtcclxuICAgICAgICAgICAgICAgIGlmIChtb21lbnQuaXNNb21lbnQodi5FbmREYXRlVGltZSkpXHJcbiAgICAgICAgICAgICAgICAgICAgdi5FbmREYXRlVGltZSA9IHYuRW5kRGF0ZVRpbWUuZm9ybWF0KFwiWVlZWS1NTS1EVEhIOm1tOnNzLm1tbVwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHBvc3REYXRhID0gSlNPTi5zdHJpbmdpZnkocG9zdERhdGEpO1xyXG4gICAgICAgIHBvc3REYXRhID0gcG9zdERhdGEucmVwbGFjZSgnPCEtLTxzY3JpcHQnLCAnPHNjcmlwdCcpO1xyXG4gICAgICAgIHBvc3REYXRhID0gcG9zdERhdGEucmVwbGFjZSgnPC9zY3JpcHQ+LS0+JywgJzwvc2NyaXB0PicpO1xyXG4gICAgICAgIGRlbGV0ZSBwb3N0RGF0YS5BbGVydHM7XHJcbiAgICAgICAgZGVsZXRlIHBvc3REYXRhLk5ld1ZlcnNpb247XHJcbiAgICAgICAgdmFyIHByb21pc2UgPSAkLmFqYXgoe1xyXG4gICAgICAgICAgICB1cmw6IHRoaXMucG9zdFVybC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCksXHJcbiAgICAgICAgICAgIGRhdGE6IHBvc3REYXRhLFxyXG4gICAgICAgICAgICB0eXBlOiAnUE9TVCcsXHJcbiAgICAgICAgICAgIGNhY2hlOiBmYWxzZSxcclxuICAgICAgICAgICAgY29udGVudFR5cGU6ICdhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTgnLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHByb21pc2UuZmFpbCgoZXJyb3IpID0+IHRoaXMucG9zdFByb21pc2VGYWlsKGVycm9yKSk7XHJcbiAgICAgICAgcHJvbWlzZS5kb25lKGRhdGEgPT4gdGhpcy5wb3N0UHJvbWlzZURvbmUoZGF0YSkpO1xyXG4gICAgICAgIHJldHVybiBwcm9taXNlO1xyXG4gICAgfVxyXG59XHJcbm1vZHVsZS5leHBvcnRzID0gR3JpZENvbnRlbnRQYWdlRm9ybTtcclxuIiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xyXG5jb25zdCBrbyA9IHJlcXVpcmUoXCJrbm9ja291dFwiKTtcclxuY29uc3QgYmFzZSA9IHJlcXVpcmUoXCIuLi9CYXNlL1ZNQmFzZVwiKTtcclxuY29uc3QgVGFibGUgPSByZXF1aXJlKFwiLi4vQmFzZS9UYWJsZVwiKTtcclxuY29uc3QgSGFsZkFuZEhhbGZSb3V0ZXIgPSByZXF1aXJlKFwiLi9IYWxmQW5kSGFsZlJvdXRlclwiKTtcclxuY29uc3QgRm9ybSA9IHJlcXVpcmUoXCIuLi9CYXNlL0Zvcm1cIik7XHJcbmNsYXNzIEhhbGZBbmRIYWxmIGV4dGVuZHMgYmFzZS5WbUJhc2Uge1xyXG4gICAgY29uc3RydWN0b3IoZGF0YSkge1xyXG4gICAgICAgIC8vY2FsbCBiYXNlIGNsYXNzIGNvbnN0cnVjdG9yXHJcbiAgICAgICAgc3VwZXIoZGF0YSwgRm9ybSwgVGFibGUsIEhhbGZBbmRIYWxmUm91dGVyKTtcclxuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xyXG4gICAgICAgIGtvLmFwcGx5QmluZGluZ3ModGhpcyk7XHJcbiAgICAgICAgJCgnLmhpZGVVbmJvdW5kJykucmVtb3ZlQ2xhc3MoJ2hpZGVVbmJvdW5kJyk7XHJcbiAgICB9XHJcbn1cclxubW9kdWxlLmV4cG9ydHMgPSBIYWxmQW5kSGFsZjtcclxuIiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbmNvbnN0IFJvdXRlciA9IHJlcXVpcmUoXCIuLi9CYXNlL1JvdXRlclwiKTtcclxuY2xhc3MgSGFsZkFuZEhhbGZSb3V0ZXIgZXh0ZW5kcyBSb3V0ZXIge1xyXG4gICAgY29uc3RydWN0b3IoZGF0YSwgdm0sIGFsdGVybmF0ZXJvdXRlcykge1xyXG4gICAgICAgIHN1cGVyKGRhdGEsIHZtLCBhbHRlcm5hdGVyb3V0ZXMpO1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICAgICAgdGhpcy52bSA9IHZtO1xyXG4gICAgfVxyXG4gICAgZ2V0Um91dGVzKCkge1xyXG4gICAgICAgIHZhciBzZWxmO1xyXG4gICAgICAgIHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IGAke3NlbGYuZ2V0QXJlYSgpfS8ke3NlbGYuZGF0YS5UaXRsZX0jL2xpc3RgLFxyXG4gICAgICAgICAgICAgICAgZnVuYzogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uZm9ybS5jYW5jZWwoKTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLnRhYmxlLmxvYWQoKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9SZWdFeDogZmFsc2VcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogYCR7c2VsZi5nZXRBcmVhKCl9LyR7c2VsZi5kYXRhLlRpdGxlfSMvbmV3YCxcclxuICAgICAgICAgICAgICAgIGZ1bmMoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5mb3JtLmFkZCgpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbnZlcnRUb1JlZ0V4OiBmYWxzZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBgJHtzZWxmLmdldEFyZWEoKX0vJHtzZWxmLmRhdGEuVGl0bGV9Iy92aWV3LzppZGAsXHJcbiAgICAgICAgICAgICAgICBmdW5jKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpZCA9IHRoaXMucGFyYW1zWydpZCddO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uZm9ybS5nZXREZXRhaWwoaWQpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbnZlcnRUb1JlZ0V4OiBmYWxzZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBgJHtzZWxmLmdldEFyZWEoKX0vJHtzZWxmLmRhdGEuVGl0bGV9Iy9pbmRleGAsXHJcbiAgICAgICAgICAgICAgICBmdW5jKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uZm9ybS5nZXREZXRhaWwobnVsbCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvUmVnRXg6IGZhbHNlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IGAke3NlbGYuZ2V0QXJlYSgpfS8ke3NlbGYuZGF0YS5UaXRsZX0jL2RlbGV0ZS86aWRgLFxyXG4gICAgICAgICAgICAgICAgZnVuYygpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgaWQgPSB0aGlzLnBhcmFtc1snaWQnXTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLmZvcm0uZGVsZXRlSXRlbShpZCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvUmVnRXg6IGZhbHNlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICBdO1xyXG4gICAgfVxyXG59XHJcbm1vZHVsZS5leHBvcnRzID0gSGFsZkFuZEhhbGZSb3V0ZXI7XHJcbiIsIlwidXNlIHN0cmljdFwiO1xyXG5jb25zdCAkID0gcmVxdWlyZShcImpxdWVyeVwiKTtcclxuY29uc3Qga28gPSByZXF1aXJlKFwia25vY2tvdXRcIik7XHJcbmNvbnN0IGJhc2UgPSByZXF1aXJlKFwiLi4vQmFzZS9WTUJhc2VcIik7XHJcbmNvbnN0IFRhYmxlID0gcmVxdWlyZShcIi4uL0Jhc2UvVGFibGVcIik7XHJcbmNvbnN0IEhvbWVTdHJlYW1Sb3V0ZXIgPSByZXF1aXJlKFwiLi9Ib21lU3RyZWFtUm91dGVyXCIpO1xyXG5jb25zdCBGb3JtID0gcmVxdWlyZShcIi4uL0Jhc2UvRm9ybVwiKTtcclxuY2xhc3MgSG9tZVN0cmVhbSBleHRlbmRzIGJhc2UuVm1CYXNlIHtcclxuICAgIGNvbnN0cnVjdG9yKGRhdGEpIHtcclxuICAgICAgICAvL2NhbGwgYmFzZSBjbGFzcyBjb25zdHJ1Y3RvclxyXG4gICAgICAgIHN1cGVyKGRhdGEsIEZvcm0sIFRhYmxlLCBIb21lU3RyZWFtUm91dGVyKTtcclxuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xyXG4gICAgICAgIGtvLmFwcGx5QmluZGluZ3ModGhpcyk7XHJcbiAgICAgICAgJCgnLmhpZGVVbmJvdW5kJykucmVtb3ZlQ2xhc3MoJ2hpZGVVbmJvdW5kJyk7XHJcbiAgICB9XHJcbn1cclxubW9kdWxlLmV4cG9ydHMgPSBIb21lU3RyZWFtO1xyXG4iLCJcInVzZSBzdHJpY3RcIjtcclxuY29uc3QgUm91dGVyID0gcmVxdWlyZShcIi4uL0Jhc2UvUm91dGVyXCIpO1xyXG5jbGFzcyBIb21lU3RyZWFtUm91dGVyIGV4dGVuZHMgUm91dGVyIHtcclxuICAgIGNvbnN0cnVjdG9yKGRhdGEsIHZtLCBhbHRlcm5hdGVyb3V0ZXMpIHtcclxuICAgICAgICBzdXBlcihkYXRhLCB2bSwgYWx0ZXJuYXRlcm91dGVzKTtcclxuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xyXG4gICAgICAgIHRoaXMudm0gPSB2bTtcclxuICAgIH1cclxuICAgIGdldFJvdXRlcygpIHtcclxuICAgICAgICB2YXIgc2VsZjtcclxuICAgICAgICBzZWxmID0gdGhpcztcclxuICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBgJHtzZWxmLmdldEFyZWEoKX0vJHtzZWxmLmRhdGEuVGl0bGV9Iy9saXN0YCxcclxuICAgICAgICAgICAgICAgIGZ1bmM6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLmZvcm0uY2FuY2VsKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9zZWxmLnZtLnRhYmxlLmxvYWQoKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9SZWdFeDogZmFsc2VcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIF07XHJcbiAgICB9XHJcbn1cclxubW9kdWxlLmV4cG9ydHMgPSBIb21lU3RyZWFtUm91dGVyO1xyXG4iLCJcInVzZSBzdHJpY3RcIjtcclxuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XHJcbmNvbnN0IGtvID0gcmVxdWlyZShcImtub2Nrb3V0XCIpO1xyXG5jb25zdCBiYXNlID0gcmVxdWlyZShcIi4uL0Jhc2UvVk1CYXNlXCIpO1xyXG5jb25zdCBUYWJsZSA9IHJlcXVpcmUoXCIuLi9CYXNlL1RhYmxlXCIpO1xyXG5jb25zdCBSb3V0ZXIgPSByZXF1aXJlKFwiLi4vQmFzZS9Sb3V0ZXJcIik7XHJcbmNvbnN0IEZvcm0gPSByZXF1aXJlKFwiLi4vQmFzZS9Gb3JtXCIpO1xyXG5jbGFzcyBNZWFsIGV4dGVuZHMgYmFzZS5WbUJhc2Uge1xyXG4gICAgY29uc3RydWN0b3IoZGF0YSkge1xyXG4gICAgICAgIC8vY2FsbCBiYXNlIGNsYXNzIGNvbnN0cnVjdG9yXHJcbiAgICAgICAgc3VwZXIoZGF0YSwgRm9ybSwgVGFibGUsIFJvdXRlcik7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcclxuICAgICAgICBrby5hcHBseUJpbmRpbmdzKHRoaXMpO1xyXG4gICAgICAgICQoJy5oaWRlVW5ib3VuZCcpLnJlbW92ZUNsYXNzKCdoaWRlVW5ib3VuZCcpO1xyXG4gICAgfVxyXG59XHJcbm1vZHVsZS5leHBvcnRzID0gTWVhbDtcclxuIiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xyXG5jb25zdCBrbyA9IHJlcXVpcmUoXCJrbm9ja291dFwiKTtcclxuY29uc3QgYmFzZSA9IHJlcXVpcmUoXCIuLi9CYXNlL1ZNQmFzZVwiKTtcclxuY29uc3QgVGFibGUgPSByZXF1aXJlKFwiLi4vQmFzZS9UYWJsZVwiKTtcclxuY29uc3QgTWVkaWFSb3V0ZXIgPSByZXF1aXJlKFwiLi9NZWRpYVJvdXRlclwiKTtcclxuY29uc3QgRm9ybSA9IHJlcXVpcmUoXCIuLi9CYXNlL0Zvcm1cIik7XHJcbmNsYXNzIE1lZGlhIGV4dGVuZHMgYmFzZS5WbUJhc2Uge1xyXG4gICAgY29uc3RydWN0b3IoZGF0YSkge1xyXG4gICAgICAgIC8vY2FsbCBiYXNlIGNsYXNzIGNvbnN0cnVjdG9yXHJcbiAgICAgICAgc3VwZXIoZGF0YSwgRm9ybSwgVGFibGUsIE1lZGlhUm91dGVyKTtcclxuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xyXG4gICAgICAgIGtvLmFwcGx5QmluZGluZ3ModGhpcyk7XHJcbiAgICAgICAgJCgnLmhpZGVVbmJvdW5kJykucmVtb3ZlQ2xhc3MoJ2hpZGVVbmJvdW5kJyk7XHJcbiAgICB9XHJcbn1cclxubW9kdWxlLmV4cG9ydHMgPSBNZWRpYTtcclxuIiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbmNvbnN0IFJvdXRlciA9IHJlcXVpcmUoXCIuLi9CYXNlL1JvdXRlclwiKTtcclxuY2xhc3MgTWVkaWFSb3V0ZXIgZXh0ZW5kcyBSb3V0ZXIge1xyXG4gICAgY29uc3RydWN0b3IoZGF0YSwgdm0sIGFsdGVybmF0ZXJvdXRlcykge1xyXG4gICAgICAgIHN1cGVyKGRhdGEsIHZtLCBhbHRlcm5hdGVyb3V0ZXMpO1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICAgICAgdGhpcy52bSA9IHZtO1xyXG4gICAgfVxyXG4gICAgZ2V0Um91dGVzKCkge1xyXG4gICAgICAgIHZhciBzZWxmO1xyXG4gICAgICAgIHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IGAke3NlbGYuZ2V0QXJlYSgpfS8ke3NlbGYuZGF0YS5UaXRsZX0jL2xpc3RgLFxyXG4gICAgICAgICAgICAgICAgZnVuYzogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uZm9ybS5jYW5jZWwoKTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLnRhYmxlLmxvYWQoKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9SZWdFeDogZmFsc2VcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIF07XHJcbiAgICB9XHJcbn1cclxubW9kdWxlLmV4cG9ydHMgPSBNZWRpYVJvdXRlcjtcclxuIiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xyXG5jb25zdCBrbyA9IHJlcXVpcmUoXCJrbm9ja291dFwiKTtcclxuY29uc3QgYmFzZSA9IHJlcXVpcmUoXCIuLi9CYXNlL1ZNQmFzZVwiKTtcclxuY29uc3QgVGFibGUgPSByZXF1aXJlKFwiLi4vQmFzZS9UYWJsZVwiKTtcclxuY29uc3QgTWVudUNhdGVnb3J5Um91dGVyID0gcmVxdWlyZShcIi4vTWVudUNhdGVnb3J5Um91dGVyXCIpO1xyXG5jb25zdCBGb3JtID0gcmVxdWlyZShcIi4uL0Jhc2UvRm9ybVwiKTtcclxuY2xhc3MgTWVudUl0ZW0gZXh0ZW5kcyBiYXNlLlZtQmFzZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihkYXRhKSB7XHJcbiAgICAgICAgLy9jYWxsIGJhc2UgY2xhc3MgY29uc3RydWN0b3JcclxuICAgICAgICBzdXBlcihkYXRhLCBGb3JtLCBUYWJsZSwgTWVudUNhdGVnb3J5Um91dGVyKTtcclxuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xyXG4gICAgICAgIGtvLmFwcGx5QmluZGluZ3ModGhpcyk7XHJcbiAgICAgICAgJChcIi5oaWRlVW5ib3VuZFwiKS5yZW1vdmVDbGFzcyhcImhpZGVVbmJvdW5kXCIpO1xyXG4gICAgfVxyXG59XHJcbm1vZHVsZS5leHBvcnRzID0gTWVudUl0ZW07XHJcbiIsIlwidXNlIHN0cmljdFwiO1xyXG5jb25zdCBSb3V0ZXIgPSByZXF1aXJlKFwiLi4vQmFzZS9Sb3V0ZXJcIik7XHJcbmNsYXNzIE1lbnVDYXRlZ29yeVJvdXRlciBleHRlbmRzIFJvdXRlciB7XHJcbiAgICBjb25zdHJ1Y3RvcihkYXRhLCB2bSwgYWx0ZXJuYXRlcm91dGVzKSB7XHJcbiAgICAgICAgc3VwZXIoZGF0YSwgdm0sIGFsdGVybmF0ZXJvdXRlcyk7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcclxuICAgICAgICB0aGlzLnZtID0gdm07XHJcbiAgICB9XHJcbiAgICBnZXRSb3V0ZXMoKSB7XHJcbiAgICAgICAgdmFyIHNlbGY7XHJcbiAgICAgICAgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogYCR7c2VsZi5nZXRBcmVhKCl9LyR7c2VsZi5kYXRhLlRpdGxlfSMvbGlzdGAsXHJcbiAgICAgICAgICAgICAgICBmdW5jOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5mb3JtLmNhbmNlbCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0udGFibGUubG9hZCgpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbnZlcnRUb1JlZ0V4OiBmYWxzZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBgJHtzZWxmLmdldEFyZWEoKX0vJHtzZWxmLmRhdGEuVGl0bGV9Iy9uZXdgLFxyXG4gICAgICAgICAgICAgICAgZnVuYygpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLmZvcm0uYWRkKCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvUmVnRXg6IGZhbHNlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IGAke3NlbGYuZ2V0QXJlYSgpfS8ke3NlbGYuZGF0YS5UaXRsZX0jL3ZpZXcvOmlkYCxcclxuICAgICAgICAgICAgICAgIGZ1bmMoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGlkID0gdGhpcy5wYXJhbXNbJ2lkJ107XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5mb3JtLmdldERldGFpbChpZCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvUmVnRXg6IGZhbHNlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IGAke3NlbGYuZ2V0QXJlYSgpfS8ke3NlbGYuZGF0YS5UaXRsZX0jL2luZGV4YCxcclxuICAgICAgICAgICAgICAgIGZ1bmMoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5mb3JtLmdldERldGFpbChudWxsKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9SZWdFeDogZmFsc2VcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogYCR7c2VsZi5nZXRBcmVhKCl9LyR7c2VsZi5kYXRhLlRpdGxlfSMvZGVsZXRlLzppZGAsXHJcbiAgICAgICAgICAgICAgICBmdW5jKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpZCA9IHRoaXMucGFyYW1zWydpZCddO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uZm9ybS5kZWxldGVJdGVtKGlkKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9SZWdFeDogZmFsc2VcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIF07XHJcbiAgICB9XHJcbn1cclxubW9kdWxlLmV4cG9ydHMgPSBNZW51Q2F0ZWdvcnlSb3V0ZXI7XHJcbiIsIlwidXNlIHN0cmljdFwiO1xyXG5jb25zdCAkID0gcmVxdWlyZShcImpxdWVyeVwiKTtcclxuY29uc3Qga28gPSByZXF1aXJlKFwia25vY2tvdXRcIik7XHJcbmNvbnN0IGJhc2UgPSByZXF1aXJlKFwiLi4vQmFzZS9WTUJhc2VcIik7XHJcbmNvbnN0IFRhYmxlID0gcmVxdWlyZShcIi4uL0Jhc2UvVGFibGVcIik7XHJcbmNvbnN0IE1lbnVJdGVtUm91dGVyID0gcmVxdWlyZShcIi4vTWVudUl0ZW1Sb3V0ZXJcIik7XHJcbmNvbnN0IEZvcm0gPSByZXF1aXJlKFwiLi4vQmFzZS9Gb3JtXCIpO1xyXG5jbGFzcyBNZW51SXRlbSBleHRlbmRzIGJhc2UuVm1CYXNlIHtcclxuICAgIGNvbnN0cnVjdG9yKGRhdGEpIHtcclxuICAgICAgICAvL2NhbGwgYmFzZSBjbGFzcyBjb25zdHJ1Y3RvclxyXG4gICAgICAgIHN1cGVyKGRhdGEsIEZvcm0sIFRhYmxlLCBNZW51SXRlbVJvdXRlcik7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcclxuICAgICAgICBrby5hcHBseUJpbmRpbmdzKHRoaXMpO1xyXG4gICAgICAgICQoJy5oaWRlVW5ib3VuZCcpLnJlbW92ZUNsYXNzKCdoaWRlVW5ib3VuZCcpO1xyXG4gICAgfVxyXG59XHJcbm1vZHVsZS5leHBvcnRzID0gTWVudUl0ZW07XHJcbiIsIlwidXNlIHN0cmljdFwiO1xyXG5jb25zdCBSb3V0ZXIgPSByZXF1aXJlKFwiLi4vQmFzZS9Sb3V0ZXJcIik7XHJcbmNsYXNzIE1lbnVJdGVtUm91dGVyIGV4dGVuZHMgUm91dGVyIHtcclxuICAgIGNvbnN0cnVjdG9yKGRhdGEsIHZtLCBhbHRlcm5hdGVyb3V0ZXMpIHtcclxuICAgICAgICBzdXBlcihkYXRhLCB2bSwgYWx0ZXJuYXRlcm91dGVzKTtcclxuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xyXG4gICAgICAgIHRoaXMudm0gPSB2bTtcclxuICAgIH1cclxuICAgIGdldFJvdXRlcygpIHtcclxuICAgICAgICB2YXIgc2VsZjtcclxuICAgICAgICBzZWxmID0gdGhpcztcclxuICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBgJHtzZWxmLmdldEFyZWEoKX0vJHtzZWxmLmRhdGEuVGl0bGV9Iy9saXN0YCxcclxuICAgICAgICAgICAgICAgIGZ1bmM6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLmZvcm0uY2FuY2VsKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS50YWJsZS5sb2FkKCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvUmVnRXg6IGZhbHNlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IGAke3NlbGYuZ2V0QXJlYSgpfS8ke3NlbGYuZGF0YS5UaXRsZX0jL25ld2AsXHJcbiAgICAgICAgICAgICAgICBmdW5jKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uZm9ybS5hZGQoKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9SZWdFeDogZmFsc2VcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogYCR7c2VsZi5nZXRBcmVhKCl9LyR7c2VsZi5kYXRhLlRpdGxlfSMvdmlldy86aWRgLFxyXG4gICAgICAgICAgICAgICAgZnVuYygpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgaWQgPSB0aGlzLnBhcmFtc1snaWQnXTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLmZvcm0uZ2V0RGV0YWlsKGlkKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9SZWdFeDogZmFsc2VcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogYCR7c2VsZi5nZXRBcmVhKCl9LyR7c2VsZi5kYXRhLlRpdGxlfSMvaW5kZXhgLFxyXG4gICAgICAgICAgICAgICAgZnVuYygpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLmZvcm0uZ2V0RGV0YWlsKG51bGwpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbnZlcnRUb1JlZ0V4OiBmYWxzZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBgJHtzZWxmLmdldEFyZWEoKX0vJHtzZWxmLmRhdGEuVGl0bGV9Iy9kZWxldGUvOmlkYCxcclxuICAgICAgICAgICAgICAgIGZ1bmMoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGlkID0gdGhpcy5wYXJhbXNbJ2lkJ107XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5mb3JtLmRlbGV0ZUl0ZW0oaWQpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbnZlcnRUb1JlZ0V4OiBmYWxzZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgXTtcclxuICAgIH1cclxufVxyXG5tb2R1bGUuZXhwb3J0cyA9IE1lbnVJdGVtUm91dGVyO1xyXG4iLCJcInVzZSBzdHJpY3RcIjtcclxuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XHJcbmNvbnN0IGtvID0gcmVxdWlyZShcImtub2Nrb3V0XCIpO1xyXG5jb25zdCBiYXNlID0gcmVxdWlyZShcIi4uL0Jhc2UvVk1CYXNlXCIpO1xyXG5jbGFzcyBNZW51IGV4dGVuZHMgYmFzZS5WbUJhc2Uge1xyXG4gICAgY29uc3RydWN0b3IoZGF0YSkge1xyXG4gICAgICAgIC8vY2FsbCBiYXNlIGNsYXNzIGNvbnN0cnVjdG9yXHJcbiAgICAgICAgc3VwZXIoZGF0YSwgbnVsbCwgbnVsbCwgbnVsbCk7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcclxuICAgICAgICBrby5hcHBseUJpbmRpbmdzKHRoaXMpO1xyXG4gICAgICAgICQoXCIuaGlkZVVuYm91bmRcIikucmVtb3ZlQ2xhc3MoXCJoaWRlVW5ib3VuZFwiKTtcclxuICAgIH1cclxufVxyXG5tb2R1bGUuZXhwb3J0cyA9IE1lbnU7XHJcbiIsIlwidXNlIHN0cmljdFwiO1xyXG5jb25zdCAkID0gcmVxdWlyZShcImpxdWVyeVwiKTtcclxuY29uc3Qga28gPSByZXF1aXJlKFwia25vY2tvdXRcIik7XHJcbmNvbnN0IGJhc2UgPSByZXF1aXJlKFwiLi4vQmFzZS9WTUJhc2VcIik7XHJcbmNvbnN0IFRhYmxlID0gcmVxdWlyZShcIi4uL0Jhc2UvVGFibGVcIik7XHJcbmNvbnN0IFJvdXRlciA9IHJlcXVpcmUoXCIuLi9CYXNlL1JvdXRlclwiKTtcclxuY29uc3QgRm9ybSA9IHJlcXVpcmUoXCIuLi9CYXNlL0Zvcm1cIik7XHJcbmNsYXNzIE1vYmlsZUZlYXR1cmUgZXh0ZW5kcyBiYXNlLlZtQmFzZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihkYXRhKSB7XHJcbiAgICAgICAgLy9jYWxsIGJhc2UgY2xhc3MgY29uc3RydWN0b3JcclxuICAgICAgICBzdXBlcihkYXRhLCBGb3JtLCBUYWJsZSwgUm91dGVyKTtcclxuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xyXG4gICAgICAgIGtvLmFwcGx5QmluZGluZ3ModGhpcyk7XHJcbiAgICAgICAgJCgnLmhpZGVVbmJvdW5kJykucmVtb3ZlQ2xhc3MoJ2hpZGVVbmJvdW5kJyk7XHJcbiAgICB9XHJcbn1cclxubW9kdWxlLmV4cG9ydHMgPSBNb2JpbGVGZWF0dXJlO1xyXG4iLCJcInVzZSBzdHJpY3RcIjtcclxuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XHJcbmNvbnN0IGtvID0gcmVxdWlyZShcImtub2Nrb3V0XCIpO1xyXG5jbGFzcyBOdXRyaXRpb24ge1xyXG4gICAgY29uc3RydWN0b3IoZGF0YSkge1xyXG4gICAgICAgIC8vY2FsbCBiYXNlIGNsYXNzIGNvbnN0cnVjdG9yXHJcbiAgICAgICAgLy8gc3VwZXIoZGF0YSwgRm9ybSwgVGFibGUsIFJvdXRlcik7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcclxuICAgICAgICBrby5hcHBseUJpbmRpbmdzKHRoaXMpO1xyXG4gICAgICAgICQoJy5oaWRlVW5ib3VuZCcpLnJlbW92ZUNsYXNzKCdoaWRlVW5ib3VuZCcpO1xyXG4gICAgfVxyXG59XHJcbm1vZHVsZS5leHBvcnRzID0gTnV0cml0aW9uO1xyXG4iLCJcInVzZSBzdHJpY3RcIjtcclxuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XHJcbmNvbnN0IGtvID0gcmVxdWlyZShcImtub2Nrb3V0XCIpO1xyXG5jb25zdCBiYXNlID0gcmVxdWlyZShcIi4uL0Jhc2UvVk1CYXNlXCIpO1xyXG5jb25zdCBUYWJsZSA9IHJlcXVpcmUoXCIuLi9CYXNlL1RhYmxlXCIpO1xyXG5jb25zdCBSb3V0ZXIgPSByZXF1aXJlKFwiLi4vQmFzZS9Sb3V0ZXJcIik7XHJcbmNvbnN0IEZvcm0gPSByZXF1aXJlKFwiLi4vQmFzZS9Gb3JtXCIpO1xyXG5jbGFzcyBQYW5kYUZ1bmRyYWlzZXJCbGFja291dERhdGUgZXh0ZW5kcyBiYXNlLlZtQmFzZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihkYXRhKSB7XHJcbiAgICAgICAgLy9jYWxsIGJhc2UgY2xhc3MgY29uc3RydWN0b3JcclxuICAgICAgICBzdXBlcihkYXRhLCBGb3JtLCBUYWJsZSwgUm91dGVyKTtcclxuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xyXG4gICAgICAgIGtvLmFwcGx5QmluZGluZ3ModGhpcyk7XHJcbiAgICAgICAgJChcIi5oaWRlVW5ib3VuZFwiKS5yZW1vdmVDbGFzcyhcImhpZGVVbmJvdW5kXCIpO1xyXG4gICAgfVxyXG59XHJcbm1vZHVsZS5leHBvcnRzID0gUGFuZGFGdW5kcmFpc2VyQmxhY2tvdXREYXRlO1xyXG4iLCJcInVzZSBzdHJpY3RcIjtcclxuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XHJcbmNvbnN0IGtvID0gcmVxdWlyZShcImtub2Nrb3V0XCIpO1xyXG5jb25zdCBiYXNlID0gcmVxdWlyZShcIi4uL0Jhc2UvVk1CYXNlXCIpO1xyXG5jb25zdCBUYWJsZSA9IHJlcXVpcmUoXCIuLi9CYXNlL1RhYmxlXCIpO1xyXG5jb25zdCBSb3V0ZXIgPSByZXF1aXJlKFwiLi4vQmFzZS9Sb3V0ZXJcIik7XHJcbi8vaW1wb3J0IEZvcm0gPSByZXF1aXJlKCcuLi9CYXNlL0Zvcm0nKTtcclxuY29uc3QgUGFuZGFGdW5kcmFpc2VyTWVtYmVyRm9ybSA9IHJlcXVpcmUoXCIuL1BhbmRhRnVuZHJhaXNlck1lbWJlckZvcm1cIik7XHJcbmNsYXNzIFBhbmRhRnVuZHJhaXNlck1lbWJlciBleHRlbmRzIGJhc2UuVm1CYXNlIHtcclxuICAgIGNvbnN0cnVjdG9yKGRhdGEpIHtcclxuICAgICAgICAvL2NhbGwgYmFzZSBjbGFzcyBjb25zdHJ1Y3RvclxyXG4gICAgICAgIHN1cGVyKGRhdGEsIFBhbmRhRnVuZHJhaXNlck1lbWJlckZvcm0sIFRhYmxlLCBSb3V0ZXIpO1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIHNlbGYuTGVhdmVPcGVuT25BamF4U3VjY2VzcyhmYWxzZSk7XHJcbiAgICAgICAgc2VsZi5JdGVtRGV0YWlsLlNob3dTdWNjZXNzKGZhbHNlKTtcclxuICAgICAgICAkKFwiI3JlZ2lzdGVyXCIpLm9uKFwiY2xpY2tcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgdXJsID0gXCIvcGFuZGFmdW5kcmFpc2VybWVtYmVyL2VkaXRcIjtcclxuICAgICAgICAgICAgdmFyIG1hcHBpbmcgPSB7XHJcbiAgICAgICAgICAgICAgICAnaWdub3JlJzogdGhpcy5kYXRhLktPTWFwcGluZy5hbGxOb25Qb3N0QmFja1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB2YXIgcG9zdERhdGEgPSBrby5tYXBwaW5nLnRvSlModGhpcywgbWFwcGluZyk7XHJcbiAgICAgICAgICAgICQoXCIjbG9hZGluZ1wiKS5oZWlnaHQoJCh3aW5kb3cpLmhlaWdodCgpKTtcclxuICAgICAgICAgICAgdGhpcy5Jc0xvYWRpbmcodHJ1ZSk7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBwb3N0RGF0YS5BbGVydHM7XHJcbiAgICAgICAgICAgIHZhciBwcm9taXNlID0gJC5hamF4KHtcclxuICAgICAgICAgICAgICAgIHVybDogdXJsLFxyXG4gICAgICAgICAgICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkocG9zdERhdGEpLFxyXG4gICAgICAgICAgICAgICAgdHlwZTogXCJQT1NUXCIsXHJcbiAgICAgICAgICAgICAgICBjYWNoZTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICBjb250ZW50VHlwZTogXCJhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLThcIlxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcHJvbWlzZS5mYWlsKGZ1bmN0aW9uIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgLy9zb21ldGhpbmcgd2VudCB3cm9uZyBkaXNwbGF5IGVycm9yXHJcbiAgICAgICAgICAgICAgICB2YXIgaHRtbCA9IGVycm9yLmVycm9yKCkucmVzcG9uc2VUZXh0O1xyXG4gICAgICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSAkKFwiPGRpdi8+XCIpLmh0bWwoaHRtbCk7XHJcbiAgICAgICAgICAgICAgICAkKFwic3R5bGVcIiwgZWxlbWVudCkucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgICAgICB2YXIgaHRtbFRleHQgPSBlbGVtZW50Lmh0bWwoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuQWRkQWxlcnQoaHRtbFRleHQsIFwiZXJyb3JcIik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLklzTG9hZGluZyhmYWxzZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBwcm9taXNlLmRvbmUoZnVuY3Rpb24gKGRhdGEpIHtcclxuICAgICAgICAgICAgICAgIGlmIChkYXRhLkxvZ2luU3VjY2Vzcykge1xyXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gZGF0YS5SZXR1cm5Vcmw7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLkFkZEFsZXJ0KGRhdGEuTWVzc2FnZSwgXCJlcnJvclwiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMudm0uSXNMb2FkaW5nKGZhbHNlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgICQoJ2J1dHRvbi5idXR0b24ucHJpbWFyeS5jaGFuZ2UtcGFzc3dvcmQnKS5vbignY2xpY2snLCBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgdmFyIHVybCA9IFwiL3BhbmRhZnVuZHJhaXNlcm1lbWJlci9yZXNldHBhc3N3b3JkXCI7XHJcbiAgICAgICAgICAgIHZhciBtYXBwaW5nID0ge1xyXG4gICAgICAgICAgICAgICAgJ2lnbm9yZSc6IHNlbGYuZGF0YS5LT01hcHBpbmcuYWxsTm9uUG9zdEJhY2tcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgdmFyIHBvc3REYXRhID0ga28ubWFwcGluZy50b0pTKHNlbGYsIG1hcHBpbmcpO1xyXG4gICAgICAgICAgICBkZWxldGUgcG9zdERhdGEuQWxlcnRzO1xyXG4gICAgICAgICAgICAkKFwiI2xvYWRpbmdcIikuaGVpZ2h0KCQod2luZG93KS5oZWlnaHQoKSk7XHJcbiAgICAgICAgICAgIHNlbGYuSXNMb2FkaW5nKHRydWUpO1xyXG4gICAgICAgICAgICB2YXIgcHJvbWlzZSA9ICQuYWpheCh7XHJcbiAgICAgICAgICAgICAgICB1cmw6IHVybCxcclxuICAgICAgICAgICAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KHBvc3REYXRhKSxcclxuICAgICAgICAgICAgICAgIHR5cGU6IFwiUE9TVFwiLFxyXG4gICAgICAgICAgICAgICAgY2FjaGU6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgY29udGVudFR5cGU6IFwiYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04XCJcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHByb21pc2UuZmFpbCgoZXJyb3IpID0+IHNlbGYuZm9ybS5wb3N0UHJvbWlzZUZhaWwoZXJyb3IpKTtcclxuICAgICAgICAgICAgcHJvbWlzZS5kb25lKGZ1bmN0aW9uICh2bSkge1xyXG4gICAgICAgICAgICAgICAgc2VsZi5JdGVtRGV0YWlsLlNob3dTdWNjZXNzKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgc2VsZi5Jc0xvYWRpbmcoZmFsc2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcmV0dXJuIHByb21pc2U7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAga28uYXBwbHlCaW5kaW5ncyh0aGlzKTtcclxuICAgICAgICAkKCcuaGlkZVVuYm91bmQnKS5yZW1vdmVDbGFzcygnaGlkZVVuYm91bmQnKTtcclxuICAgIH1cclxufVxyXG5tb2R1bGUuZXhwb3J0cyA9IFBhbmRhRnVuZHJhaXNlck1lbWJlcjtcclxuIiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbmNvbnN0IEZvcm0gPSByZXF1aXJlKFwiLi4vQmFzZS9Gb3JtXCIpO1xyXG5jbGFzcyBQYW5kYUZ1bmRyYWlzZXJNZW1iZXJGb3JtIGV4dGVuZHMgRm9ybSB7XHJcbiAgICBjb25zdHJ1Y3RvcihkYXRhLCB2bSwgZWRpdEFjdGlvbiA9ICdFZGl0Jykge1xyXG4gICAgICAgIHN1cGVyKGRhdGEsIHZtLCBlZGl0QWN0aW9uKTtcclxuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xyXG4gICAgICAgIHRoaXMudm0gPSB2bTtcclxuICAgICAgICB0aGlzLmVkaXRBY3Rpb24gPSBlZGl0QWN0aW9uO1xyXG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcclxuICAgIH1cclxuICAgIHBvc3QoKSB7XHJcbiAgICAgICAgdGhpcy52bS5JdGVtRGV0YWlsLkludmFsaWRFbWFpbE1lc3NhZ2UobnVsbCk7XHJcbiAgICAgICAgdmFyIHByb21pc2UgPSBzdXBlci5wb3N0KCk7XHJcbiAgICAgICAgcHJvbWlzZS5kb25lKGRhdGEgPT4ge1xyXG4gICAgICAgICAgICAvL3dpbmRvdy5sb2NhdGlvbi5ocmVmID0gZGF0YS5SZXR1cm5Vcmw7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnZtLkl0ZW1EZXRhaWxJc05ldygpKVxyXG4gICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSAnL2Z1bmRyYWlzZXJsb2dpbiMvaW5kZXgnO1xyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9ICcvcGFuZGFmdW5kcmFpc2VyIy9saXN0JztcclxuICAgICAgICB9KTtcclxuICAgICAgICBwcm9taXNlLmZhaWwoZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnZtLk1lc3NhZ2UgPSBlcnJvci5yZXNwb25zZUpTT04uTWVzc2FnZTtcclxuICAgICAgICAgICAgdmFyIGh0bWwgPSBlcnJvci5lcnJvcigpLnJlc3BvbnNlVGV4dDtcclxuICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSAkKFwiPGRpdi8+XCIpLmh0bWwoaHRtbCk7XHJcbiAgICAgICAgICAgICQoXCJzdHlsZVwiLCBlbGVtZW50KS5yZW1vdmUoKTtcclxuICAgICAgICAgICAgdmFyIGh0bWxUZXh0ID0gZWxlbWVudC5odG1sKCk7XHJcbiAgICAgICAgICAgIHRoaXMudm0uQWRkQWxlcnQoaHRtbFRleHQsIFwiZXJyb3JcIik7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHByb21pc2U7XHJcbiAgICB9XHJcbn1cclxubW9kdWxlLmV4cG9ydHMgPSBQYW5kYUZ1bmRyYWlzZXJNZW1iZXJGb3JtO1xyXG4iLCJcInVzZSBzdHJpY3RcIjtcclxuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XHJcbmNvbnN0IGtvID0gcmVxdWlyZShcImtub2Nrb3V0XCIpO1xyXG5jb25zdCBiYXNlID0gcmVxdWlyZShcIi4uL0Jhc2UvVk1CYXNlXCIpO1xyXG5jb25zdCBUYWJsZSA9IHJlcXVpcmUoXCIuLi9CYXNlL1RhYmxlXCIpO1xyXG5jb25zdCBQYW5kYUZ1bmRyYWlzZXJSb3V0ZXIgPSByZXF1aXJlKFwiLi9QYW5kYUZ1bmRyYWlzZXJSb3V0ZXJcIik7XHJcbmNvbnN0IFBhbmRhRnVuZHJhaXNlckZvcm0gPSByZXF1aXJlKFwiLi9QYW5kYUZ1bmRyYWlzZXJGb3JtXCIpO1xyXG5jb25zdCBTdG9yZSA9IHJlcXVpcmUoXCIuLi9TdG9yZS9TdG9yZVwiKTtcclxuY29uc3QgTW9kYWwgPSByZXF1aXJlKFwiLi4vQ29tbW9uL01vZGFsXCIpO1xyXG5jb25zdCBfID0gcmVxdWlyZShcInVuZGVyc2NvcmVcIik7XHJcbmNsYXNzIFBhbmRhRnVuZHJhaXNlciBleHRlbmRzIGJhc2UuVm1CYXNlIHtcclxuICAgIC8vbWU6IHRoaXM7XHJcbiAgICBjb25zdHJ1Y3RvcihkYXRhKSB7XHJcbiAgICAgICAgLy9jYWxsIGJhc2UgY2xhc3MgY29uc3RydWN0b3JcclxuICAgICAgICBzdXBlcihkYXRhLCBQYW5kYUZ1bmRyYWlzZXJGb3JtLCBUYWJsZSwgUGFuZGFGdW5kcmFpc2VyUm91dGVyKTtcclxuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xyXG4gICAgICAgIHRoaXMudGFibGUub3JkZXJieSA9IFwiRXZlbnREYXRlIGRlc2NcIjtcclxuICAgICAgICAvL3NldHVwIHRhYmxlLCByb3V0ZXMgYW5kIGZvcm1cclxuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgLy9yZXVzZSB0aGUgc3RvcmUgdm0gZm9yIHN0b3JlIHNlYXJjaFxyXG4gICAgICAgIHRoaXMuc3RvcmVWbSA9IG5ldyBTdG9yZShkYXRhLlN0b3JlVmlld01vZGVsLCBmYWxzZSwgdHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5zdG9yZVZtLkZpbHRlcnMuU2hvd0hhd2FpaShmYWxzZSk7XHJcbiAgICAgICAgdGhpcy5tb2RhbCA9IG5ldyBNb2RhbChcImRlbGV0ZUV2ZW50XCIpO1xyXG4gICAgICAgIHRoaXMubW9kYWwuaW5pdCgpO1xyXG4gICAgICAgICQoXCIudGFibGUtaG9sZGVyLVwiICsgdGhpcy5kYXRhLlRpdGxlKS5vbihcImNsaWNrXCIsIFwiYS5jYW5jZWwtZXZlbnRcIiwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgYURhdGEgPSBrby5kYXRhRm9yKHRoaXMpOyAvL2xvY2FsIHRoaXNcclxuICAgICAgICAgICAgdmFyIGlkID0gYURhdGEuVW5pcXVlSWQ7XHJcbiAgICAgICAgICAgIHNlbGYubW9kYWwub3BlbihpZCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgJCgnZGl2LnB4LW1vZGFsIGRpdi5idXR0b24tZ3JvdXAgYnV0dG9uLmJ1dHRvbi5zZWNvbmRhcnknKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIC8vc2VsZi5BbGVydHMgPSA7XHJcbiAgICAgICAgICAgIHZhciB1cmwgPSBcIi9wYW5kYWZ1bmRyYWlzZXIvY2FuY2VsP3VuaXF1ZWlkPVwiICsgc2VsZi5tb2RhbC5ldmVudElkO1xyXG4gICAgICAgICAgICB2YXIgbWFwcGluZyA9IHtcclxuICAgICAgICAgICAgICAgICdpZ25vcmUnOiBzZWxmLmRhdGEuS09NYXBwaW5nLmFsbE5vblBvc3RCYWNrXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHZhciBwb3N0RGF0YSA9IGtvLm1hcHBpbmcudG9KUyhzZWxmLCBtYXBwaW5nKTtcclxuICAgICAgICAgICAgJChcIiNsb2FkaW5nXCIpLmhlaWdodCgkKHdpbmRvdykuaGVpZ2h0KCkpO1xyXG4gICAgICAgICAgICBzZWxmLklzTG9hZGluZyh0cnVlKTtcclxuICAgICAgICAgICAgdmFyIHByb21pc2UgPSAkLmFqYXgoe1xyXG4gICAgICAgICAgICAgICAgdXJsOiB1cmwsXHJcbiAgICAgICAgICAgICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShwb3N0RGF0YSksXHJcbiAgICAgICAgICAgICAgICB0eXBlOiBcIlBPU1RcIixcclxuICAgICAgICAgICAgICAgIGNhY2hlOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlOiBcImFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtOFwiXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBwcm9taXNlLmZhaWwoZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9zb21ldGhpbmcgd2VudCB3cm9uZyBkaXNwbGF5IGVycm9yXHJcbiAgICAgICAgICAgICAgICB2YXIgaHRtbCA9IGVycm9yLmVycm9yKCkucmVzcG9uc2VUZXh0O1xyXG4gICAgICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSAkKFwiPGRpdi8+XCIpLmh0bWwoaHRtbCk7XHJcbiAgICAgICAgICAgICAgICAkKFwic3R5bGVcIiwgZWxlbWVudCkucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgICAgICB2YXIgaHRtbFRleHQgPSBlbGVtZW50Lmh0bWwoKTtcclxuICAgICAgICAgICAgICAgIHNlbGYuQWRkQWxlcnQoaHRtbFRleHQsIFwiZXJyb3JcIik7XHJcbiAgICAgICAgICAgICAgICBzZWxmLklzTG9hZGluZyhmYWxzZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBwcm9taXNlLmRvbmUodm0gPT4ge1xyXG4gICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhhc2ggPSAnIy8nICsgdm0uRGVmYXVsdFNhbW15Um91dGU7XHJcbiAgICAgICAgICAgICAgICBzZWxmLklzTG9hZGluZyhmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICBzZWxmLnRhYmxlLmxvYWQoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHNlbGYubW9kYWwuY2xvc2UoKTtcclxuICAgICAgICAgICAgLy9yZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgcmV0dXJuIHByb21pc2U7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgJCgnLm1vZGFsZm9ybS1ob2xkZXInKS5vbignY2xpY2snLCAnI2NvbnRpbnVlLWZ1bmRyYWlzZXInLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIC8vcHJldmVudCBkb3VibGUgcG9zdFxyXG4gICAgICAgICAgICBpZiAodGhpcy5Jc0xvYWRpbmcoKSB8fCAoIXRoaXMuSXRlbURldGFpbC5DYW5FZGl0KCkgJiYgIXRoaXMuSXRlbURldGFpbElzTmV3KCkpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdmFyIHJlID0gbmV3IFJlZ0V4cCgnTWVtYmVySWQnKTtcclxuICAgICAgICAgICAgdmFyIHZhbHVlID0gcmUuZXhlYyhkb2N1bWVudC5jb29raWUpO1xyXG4gICAgICAgICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gJy9mdW5kcmFpc2VybG9naW4jL2luZGV4JztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLkl0ZW1EZXRhaWwuQ3VzdG9tZXJDb25maXJtZWQoZmFsc2UpO1xyXG4gICAgICAgICAgICB2YXIgY2FwdGNoYSA9IHdpbmRvd1tcImZ1bmRyYWlzZXJDYXB0Y2hhU2F0aXNmaWVkXCJdO1xyXG4gICAgICAgICAgICBpZiAoIWNhcHRjaGEpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLkl0ZW1EZXRhaWwuQWdyZWVUb1Rlcm1zKCkpXHJcbiAgICAgICAgICAgICAgICAgICAgYWxlcnQoXCJQbGVhc2UgY29tcGxldGUgdGhlIGNhcHRjaGEgY2hhbGxlbmdlLlwiKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvL21ha2Ugb3ZlcmxheSBsb2FkaW5nIGRpdiBmdWxsIGhlaWdodFxyXG4gICAgICAgICAgICAkKCcjbG9hZGluZycpLmhlaWdodCgkKHdpbmRvdykuaGVpZ2h0KCkpO1xyXG4gICAgICAgICAgICB0aGlzLklzTG9hZGluZyh0cnVlKTtcclxuICAgICAgICAgICAgdmFyIGlnbm9yZU1hcHBpbmcgPSB7XHJcbiAgICAgICAgICAgICAgICAnaWdub3JlJzogdGhpcy5kYXRhLktPTWFwcGluZy5hbGxOb25Qb3N0QmFja1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB2YXIgcG9zdERhdGEgPSBrby5tYXBwaW5nLnRvSlModGhpcywgaWdub3JlTWFwcGluZyk7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBwb3N0RGF0YS5BbGVydHM7XHJcbiAgICAgICAgICAgIHZhciBwcm9taXNlID0gJC5hamF4KHtcclxuICAgICAgICAgICAgICAgIHVybDogJ3BhbmRhZnVuZHJhaXNlci9lZGl0JyxcclxuICAgICAgICAgICAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KHBvc3REYXRhKSxcclxuICAgICAgICAgICAgICAgIHR5cGU6ICdQT1NUJyxcclxuICAgICAgICAgICAgICAgIGNhY2hlOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlOiAnYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04JyxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHByb21pc2UuZmFpbCgoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChlcnJvci5zdGF0dXMgPT09IDQwMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIF8uZWFjaChlcnJvci5yZXNwb25zZUpTT04uTW9kZWxTdGF0ZS5Qcm9wZXJ0eUVycm9ycywgKHByb3BlcnR5RXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtLmFkZFByb3BlcnR5RXJyb3IocHJvcGVydHlFcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgXy5lYWNoKGVycm9yLnJlc3BvbnNlSlNPTi5Nb2RlbFN0YXRlLk1vZGVsRXJyb3JzLCAodikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGRBbGVydCh2LkVycm9yTWVzc2FnZSwgJ2Vycm9yJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yLnJlc3BvbnNlSlNPTi5NZXNzYWdlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuTWVzc2FnZSA9IGVycm9yLnJlc3BvbnNlSlNPTi5NZXNzYWdlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm0ucmVmcmVzaFRhYlZhbGlkYXRpb25CYWRnZXMoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvci5yZXNwb25zZUpTT04pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yLnJlc3BvbnNlSlNPTi5NZXNzYWdlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkFkZEFsZXJ0KGVycm9yLnJlc3BvbnNlSlNPTi5NZXNzYWdlLCAnZXJyb3InKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBodG1sID0gZXJyb3IuZXJyb3IoKS5yZXNwb25zZVRleHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZWxlbWVudCA9ICQoJzxkaXYvPicpLmh0bWwoaHRtbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCdzdHlsZScsIGVsZW1lbnQpLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGh0bWxUZXh0ID0gZWxlbWVudC5odG1sKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkFkZEFsZXJ0KGh0bWxUZXh0LCAnZXJyb3InKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGh0bWwyID0gZXJyb3IuZXJyb3IoKS5yZXNwb25zZVRleHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbGVtZW50MiA9ICQoJzxkaXYvPicpLmh0bWwoaHRtbDIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAkKCdzdHlsZScsIGVsZW1lbnQyKS5yZW1vdmUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGh0bWxUZXh0MiA9IGVsZW1lbnQyLmh0bWwoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5BZGRBbGVydChodG1sVGV4dDIsICdlcnJvcicpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuSXNMb2FkaW5nKGZhbHNlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHByb21pc2UuZG9uZSgoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGRhdGEuUmV2aWV3RXZlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICBrby5tYXBwaW5nLmZyb21KUyhkYXRhLkl0ZW1EZXRhaWwsIHt9LCB0aGlzLkl0ZW1EZXRhaWwpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8va28ubWFwcGluZy5mcm9tSlMoZGF0YS5TdG9yZVZpZXdNb2RlbCwge30sIHRoaXMuc3RvcmVWbSk7XHJcbiAgICAgICAgICAgICAgICAgICAga28ubWFwcGluZy5mcm9tSlMoZGF0YS5TdG9yZVZpZXdNb2RlbC5GaWx0ZXJzLCB7fSwgdGhpcy5zdG9yZVZtLkZpbHRlcnMpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRm9ybVZpc2libGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuUmV2aWV3RXZlbnQodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy92YXIgaWQgPSB0aGlzLnBhcmFtc1snaWQnXTtcclxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaGFzaCA9ICcjL3ZpZXcvJyArIGtvLnVud3JhcChkYXRhLkl0ZW1EZXRhaWwuSWQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5SZXZpZXdFdmVudChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5Gb3JtVmlzaWJsZSh0cnVlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuSXNMb2FkaW5nKGZhbHNlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9KTtcclxuICAgICAgICAkKCcubW9kYWxmb3JtLWhvbGRlcicpLm9uKCdjbGljaycsICcjc2F2ZS1mdW5kcmFpc2VyJywgKCkgPT4ge1xyXG4gICAgICAgICAgICAvL3ByZXZlbnQgZG91YmxlIHBvc3RcclxuICAgICAgICAgICAgaWYgKHRoaXMuSXNMb2FkaW5nKCkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLkl0ZW1EZXRhaWwuQWdyZWVUb1Rlcm1zKHRydWUpO1xyXG4gICAgICAgICAgICB0aGlzLkl0ZW1EZXRhaWwuQ3VzdG9tZXJDb25maXJtZWQodHJ1ZSk7XHJcbiAgICAgICAgICAgIC8vbWFrZSBvdmVybGF5IGxvYWRpbmcgZGl2IGZ1bGwgaGVpZ2h0XHJcbiAgICAgICAgICAgICQoJyNsb2FkaW5nJykuaGVpZ2h0KCQod2luZG93KS5oZWlnaHQoKSk7XHJcbiAgICAgICAgICAgIHRoaXMuSXNMb2FkaW5nKHRydWUpO1xyXG4gICAgICAgICAgICB2YXIgaWdub3JlTWFwcGluZyA9IHtcclxuICAgICAgICAgICAgICAgICdpZ25vcmUnOiB0aGlzLmRhdGEuS09NYXBwaW5nLmFsbE5vblBvc3RCYWNrXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHZhciBwb3N0RGF0YSA9IGtvLm1hcHBpbmcudG9KUyh0aGlzLCBpZ25vcmVNYXBwaW5nKTtcclxuICAgICAgICAgICAgZGVsZXRlIHBvc3REYXRhLkFsZXJ0cztcclxuICAgICAgICAgICAgdmFyIHByb21pc2UgPSAkLmFqYXgoe1xyXG4gICAgICAgICAgICAgICAgdXJsOiAncGFuZGFmdW5kcmFpc2VyL2VkaXQnLFxyXG4gICAgICAgICAgICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkocG9zdERhdGEpLFxyXG4gICAgICAgICAgICAgICAgdHlwZTogJ1BPU1QnLFxyXG4gICAgICAgICAgICAgICAgY2FjaGU6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgY29udGVudFR5cGU6ICdhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTgnLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcHJvbWlzZS5mYWlsKChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGVycm9yLnN0YXR1cyA9PT0gNDAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuUmV2aWV3RXZlbnQoKSkgeyAvL2lmIHRoZXkgd2VyZSBvbiB0aGUgcmV2aWV3IGV2ZW50IHRhYiBhbmQgY2xpY2tlZCBzdWJtaXQgYW5kIHRoZSB2YWxpZGF0aW9uIGZhaWxlZCBnbyBiYWNrIHRvIHRoZSBlZGl0IHRhYlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlJldmlld0V2ZW50KGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5Gb3JtVmlzaWJsZSh0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5FdmVudFN1Ym1pdHRlZChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIF8uZWFjaChlcnJvci5yZXNwb25zZUpTT04uTW9kZWxTdGF0ZS5Qcm9wZXJ0eUVycm9ycywgKHByb3BlcnR5RXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtLmFkZFByb3BlcnR5RXJyb3IocHJvcGVydHlFcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgXy5lYWNoKGVycm9yLnJlc3BvbnNlSlNPTi5Nb2RlbFN0YXRlLk1vZGVsRXJyb3JzLCAodikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGRBbGVydCh2LkVycm9yTWVzc2FnZSwgJ2Vycm9yJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yLnJlc3BvbnNlSlNPTi5NZXNzYWdlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuTWVzc2FnZSA9IGVycm9yLnJlc3BvbnNlSlNPTi5NZXNzYWdlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm0ucmVmcmVzaFRhYlZhbGlkYXRpb25CYWRnZXMoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvci5yZXNwb25zZUpTT04pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yLnJlc3BvbnNlSlNPTi5NZXNzYWdlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkFkZEFsZXJ0KGVycm9yLnJlc3BvbnNlSlNPTi5NZXNzYWdlLCAnZXJyb3InKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBodG1sID0gZXJyb3IuZXJyb3IoKS5yZXNwb25zZVRleHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZWxlbWVudCA9ICQoJzxkaXYvPicpLmh0bWwoaHRtbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCdzdHlsZScsIGVsZW1lbnQpLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGh0bWxUZXh0ID0gZWxlbWVudC5odG1sKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkFkZEFsZXJ0KGh0bWxUZXh0LCAnZXJyb3InKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGh0bWwyID0gZXJyb3IuZXJyb3IoKS5yZXNwb25zZVRleHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbGVtZW50MiA9ICQoJzxkaXYvPicpLmh0bWwoaHRtbDIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAkKCdzdHlsZScsIGVsZW1lbnQyKS5yZW1vdmUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGh0bWxUZXh0MiA9IGVsZW1lbnQyLmh0bWwoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5BZGRBbGVydChodG1sVGV4dDIsICdlcnJvcicpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuSXNMb2FkaW5nKGZhbHNlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHByb21pc2UuZG9uZSgoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdmFyIGNvcHlNYXBwaW5nID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICdjb3B5JzogdGhpcy5kYXRhLktPTWFwcGluZy5jb3B5XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAga28ubWFwcGluZy5mcm9tSlMoZGF0YS5JdGVtRGV0YWlsLCBjb3B5TWFwcGluZywgdGhpcy5JdGVtRGV0YWlsKTtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5kYXRhLkxlYXZlT3Blbk9uQWpheFN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLlJldmlld0V2ZW50KGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLkZvcm1WaXNpYmxlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLkV2ZW50U3VibWl0dGVkKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5Jc0xvYWRpbmcoZmFsc2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgICQoJy5tb2RhbGZvcm0taG9sZGVyJykub24oJ2NoYW5nZScsICcjTG9nbycsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmZpbGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZmlsZSA9IHRoaXMuZmlsZXNbaV07XHJcbiAgICAgICAgICAgICAgICB2YXIgZmQgPSBuZXcgRm9ybURhdGEoKTtcclxuICAgICAgICAgICAgICAgIGZkLmFwcGVuZChcImZpbGVUb1VwbG9hZFwiLCBmaWxlKTtcclxuICAgICAgICAgICAgICAgICQuYWpheCh7XHJcbiAgICAgICAgICAgICAgICAgICAgdXJsOiAncGFuZGFmdW5kcmFpc2VyL3VwbG9hZGZpbGUnLFxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IGZkLFxyXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdQT1NUJyxcclxuICAgICAgICAgICAgICAgICAgICBjYWNoZTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0RhdGE6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAoZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLkl0ZW1EZXRhaWwuTG9nbyhkYXRhKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgICQoJy5tb2RhbGZvcm0taG9sZGVyJykub24oJ2NsaWNrJywgJy5pbWFnZS1idXR0b24tdGlsZScsICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5JdGVtRGV0YWlsLkxvZ28oJycpO1xyXG4gICAgICAgICAgICAkKCcjTG9nbycpLnZhbCgnJyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAga28uYXBwbHlCaW5kaW5ncyh0aGlzKTtcclxuICAgICAgICAkKCcuaGlkZVVuYm91bmQnKS5yZW1vdmVDbGFzcygnaGlkZVVuYm91bmQnKTtcclxuICAgICAgICB0aGlzLlBheW1lbnRUb01vZGFsU2hvd24gPSBmYWxzZTtcclxuICAgICAgICAkKCcjSXRlbURldGFpbF9QYXltZW50UGF5YWJsZVRvJykuYmx1cigoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5QYXltZW50VG9Nb2RhbFNob3duKSB7XHJcbiAgICAgICAgICAgICAgICBhbGVydCgnSGVscCB1cyBnZXQgeW91ciBjaGVjayB0byB5b3Ugb24gdGltZSEgUGxlYXNlIHRha2UgYSBtb21lbnQgdG8gZW5zdXJlIHlvdXIgb3JnYW5pemF0aW9u4oCZcyBuYW1lIGlzIG5vdCBhYmJyZXZpYXRlZCBhbmQgbWF0Y2hlcyB5b3VyIFRheCBJRC4nKTtcclxuICAgICAgICAgICAgICAgIC8vIG9ubHkgc2hvdyBvbmNlXHJcbiAgICAgICAgICAgICAgICB0aGlzLlBheW1lbnRUb01vZGFsU2hvd24gPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAkKCcjSXRlbURldGFpbF9FdmVudERhdGUnKS52YWwoJ21tL2RkL3l5eXknKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufVxyXG5tb2R1bGUuZXhwb3J0cyA9IFBhbmRhRnVuZHJhaXNlcjtcclxuIiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbmNvbnN0IEZvcm0gPSByZXF1aXJlKFwiLi4vQmFzZS9Gb3JtXCIpO1xyXG5jbGFzcyBQYW5kYUZ1bmRyYWlzZXJGb3JtIGV4dGVuZHMgRm9ybSB7XHJcbiAgICBjb25zdHJ1Y3RvcihkYXRhLCB2bSwgZWRpdEFjdGlvbiA9ICdFZGl0Jykge1xyXG4gICAgICAgIHN1cGVyKGRhdGEsIHZtLCBlZGl0QWN0aW9uKTtcclxuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xyXG4gICAgICAgIHRoaXMudm0gPSB2bTtcclxuICAgICAgICB0aGlzLmVkaXRBY3Rpb24gPSBlZGl0QWN0aW9uO1xyXG4gICAgfVxyXG4gICAgcHJvbWlzZURvbmUoZGF0YSwgaWQpIHtcclxuICAgICAgICB0aGlzLnZtLkl0ZW1EZXRhaWxJc05ldyhmYWxzZSk7XHJcbiAgICAgICAgdGhpcy5rb21hcHBpbmdmcm9tZGF0YShkYXRhLCBpZCk7XHJcbiAgICAgICAgdGhpcy52bS5Jc0xvYWRpbmcoZmFsc2UpO1xyXG4gICAgICAgIHRoaXMudm0uRm9ybVZpc2libGUodHJ1ZSk7XHJcbiAgICAgICAgdGhpcy52bS5SZXZpZXdFdmVudChkYXRhLlJldmlld0V2ZW50KTtcclxuICAgICAgICBpZiAodGhpcy52bS5SZXZpZXdFdmVudCgpKVxyXG4gICAgICAgICAgICB0aGlzLnZtLkZvcm1WaXNpYmxlKGZhbHNlKTtcclxuICAgICAgICBpZiAoZGF0YS5SZXR1cm5VcmwgIT09IG51bGwpXHJcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gZGF0YS5SZXR1cm5Vcmw7XHJcbiAgICAgICAgLy9lbHNlXHJcbiAgICAgICAgLy8gIHRoaXMudm0ucm91dGVzLnZpZXcoaWQpO1xyXG4gICAgfVxyXG4gICAgZ2V0RGV0YWlsKGlkKSB7XHJcbiAgICAgICAgdGhpcy5yZXNldERldGFpbCgpO1xyXG4gICAgICAgICQoJyNsb2FkaW5nJykuaGVpZ2h0KCQod2luZG93KS5oZWlnaHQoKSk7XHJcbiAgICAgICAgdGhpcy52bS5Jc0xvYWRpbmcodHJ1ZSk7XHJcbiAgICAgICAgJCgnYm9keScpLmFkZENsYXNzKCdmb3JtLXNob3duJyk7XHJcbiAgICAgICAgdmFyIHByb21pc2UgPSAkLmFqYXgoe1xyXG4gICAgICAgICAgICB1cmw6IHRoaXMuZ2V0VXJsLFxyXG4gICAgICAgICAgICBkYXRhOiB7IGlkOiBpZCB9LFxyXG4gICAgICAgICAgICB0eXBlOiAnR0VUJyxcclxuICAgICAgICAgICAgY2FjaGU6IGZhbHNlLFxyXG4gICAgICAgICAgICBjb250ZW50VHlwZTogJ2FwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtOCdcclxuICAgICAgICB9KTtcclxuICAgICAgICBwcm9taXNlLmZhaWwoKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgIHZhciBodG1sID0gZXJyb3IuZXJyb3IoKS5yZXNwb25zZVRleHQ7XHJcbiAgICAgICAgICAgIHZhciBlbGVtZW50ID0gJCgnPGRpdi8+JykuaHRtbChodG1sKTtcclxuICAgICAgICAgICAgJCgnc3R5bGUnLCBlbGVtZW50KS5yZW1vdmUoKTtcclxuICAgICAgICAgICAgdmFyIGh0bWxUZXh0ID0gZWxlbWVudC5odG1sKCk7XHJcbiAgICAgICAgICAgIHRoaXMudm0uQWRkQWxlcnQoaHRtbFRleHQsICdhbGVydC1lcnJvcicpO1xyXG4gICAgICAgICAgICB0aGlzLnZtLklzTG9hZGluZyhmYWxzZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcHJvbWlzZS5kb25lKChkYXRhKSA9PiB0aGlzLnByb21pc2VEb25lKGRhdGEsIGlkKSk7XHJcbiAgICAgICAgcmV0dXJuIHByb21pc2U7XHJcbiAgICB9XHJcbiAgICBrb21hcHBpbmdmcm9tZGF0YShkYXRhLCBpZCkge1xyXG4gICAgICAgIHZhciBjb3B5TWFwcGluZyA9IHtcclxuICAgICAgICAgICAgJ2NvcHknOiB0aGlzLmRhdGEuS09NYXBwaW5nLmFsbE5vblBvc3RCYWNrXHJcbiAgICAgICAgfTtcclxuICAgICAgICBkYXRhLkl0ZW1EZXRhaWwuRXZlbnREYXRlID0gbW9tZW50KGRhdGEuSXRlbURldGFpbC5FdmVudERhdGUpLmZvcm1hdCgnWVlZWS1NTS1ERCcpO1xyXG4gICAgICAgIGtvLm1hcHBpbmcuZnJvbUpTKGRhdGEuSXRlbURldGFpbCwgY29weU1hcHBpbmcsIHRoaXMudm0uSXRlbURldGFpbCk7XHJcbiAgICAgICAgaWYgKGRhdGEuU3RvcmVWaWV3TW9kZWwgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBrby5tYXBwaW5nLmZyb21KUyhkYXRhLlN0b3JlVmlld01vZGVsLkZpbHRlcnMsIGNvcHlNYXBwaW5nLCB0aGlzLnZtLnN0b3JlVm0uRmlsdGVycyk7XHJcbiAgICAgICAgICAgIGtvLm1hcHBpbmcuZnJvbUpTKGRhdGEuU3RvcmVWaWV3TW9kZWwuSXRlbURldGFpbCwgY29weU1hcHBpbmcsIHRoaXMudm0uc3RvcmVWbS5JdGVtRGV0YWlsKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvL3Jlc2V0cyBpdGVtIGRldGFpbCBzbyB0aGF0IGl0IGxvb2tzIGxpa2UgYSBuZXcgaW5zZXJ0XHJcbiAgICByZXNldERldGFpbCgpIHtcclxuICAgICAgICBzdXBlci5yZXNldERldGFpbCgpO1xyXG4gICAgICAgIHRoaXMudm0uSXRlbURldGFpbC5FdmVudERhdGUobnVsbCk7IC8vY2xlYXIgdGhlIGRhdGVwaWNrZXIgdGltZVxyXG4gICAgICAgIGtvLm1hcHBpbmcuZnJvbUpTKHRoaXMudm0uTmV3SXRlbURldGFpbCwge30sIHRoaXMudm0uSXRlbURldGFpbCk7XHJcbiAgICAgICAgdGhpcy52bS5zdG9yZVZtLkZpbHRlcnMuU2VhcmNoVGVybShudWxsKTtcclxuICAgIH1cclxuICAgIHBvc3QoKSB7XHJcbiAgICAgICAgdGhpcy52bS5yb3V0ZXMubGFzdFJvdXRlID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIHZhciBwcm9taXNlID0gc3VwZXIucG9zdCgpO1xyXG4gICAgICAgIHByb21pc2UuZG9uZShkYXRhID0+IHtcclxuICAgICAgICAgICAgd2luZG93LnNjcm9sbFRvKDAsIDApO1xyXG4gICAgICAgICAgICBpZiAoZGF0YS5SZXR1cm5VcmwgIT09IG51bGwpXHJcbiAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IGRhdGEuUmV0dXJuVXJsO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiBwcm9taXNlO1xyXG4gICAgfVxyXG59XHJcbm1vZHVsZS5leHBvcnRzID0gUGFuZGFGdW5kcmFpc2VyRm9ybTtcclxuIiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbmNvbnN0IFJvdXRlciA9IHJlcXVpcmUoXCIuLi9CYXNlL1JvdXRlclwiKTtcclxuY2xhc3MgUGFuZGFGdW5kcmFpc2VyUm91dGVyIGV4dGVuZHMgUm91dGVyIHtcclxuICAgIGNvbnN0cnVjdG9yKGRhdGEsIHZtLCBhbHRlcm5hdGVyb3V0ZXMpIHtcclxuICAgICAgICBzdXBlcihkYXRhLCB2bSwgYWx0ZXJuYXRlcm91dGVzKTtcclxuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xyXG4gICAgICAgIHRoaXMudm0gPSB2bTtcclxuICAgIH1cclxuICAgIGdldFJvdXRlcygpIHtcclxuICAgICAgICB2YXIgc2VsZjtcclxuICAgICAgICBzZWxmID0gdGhpcztcclxuICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiAnL1BhbmRhRnVuZHJhaXNlciMvbGlzdCcsXHJcbiAgICAgICAgICAgICAgICBmdW5jKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciByZSA9IG5ldyBSZWdFeHAoJ01lbWJlcklkJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gcmUuZXhlYyhkb2N1bWVudC5jb29raWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9ICcvZnVuZHJhaXNlcmxvZ2luIy9pbmRleCc7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uZm9ybS5jYW5jZWwoKTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLnRhYmxlLmxvYWQoKTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLlJldmlld0V2ZW50KGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLkZvcm1WaXNpYmxlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLkV2ZW50U3VibWl0dGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLlZpZXdSZXNvdXJjZXMoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbnZlcnRUb1JlZ0V4OiB0cnVlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6ICcvUGFuZGFGdW5kcmFpc2VyIy9uZXcnLFxyXG4gICAgICAgICAgICAgICAgZnVuYygpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgcmUgPSBuZXcgUmVnRXhwKCdNZW1iZXJJZCcpO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHJlLmV4ZWMoZG9jdW1lbnQuY29va2llKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSAnL2Z1bmRyYWlzZXJsb2dpbiMvaW5kZXgnO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLmZvcm0ucmVzZXREZXRhaWwoKTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLkl0ZW1EZXRhaWxJc05ldyh0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLlJldmlld0V2ZW50KGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLkZvcm1WaXNpYmxlKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uVmlld1Jlc291cmNlcyhmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgJCgnI0l0ZW1EZXRhaWxfRXZlbnREYXRlJykudmFsKCdtbS9kZC95eXl5Jyk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvUmVnRXg6IHRydWVcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogJy9QYW5kYUZ1bmRyYWlzZXIjL3NhdmUnLFxyXG4gICAgICAgICAgICAgICAgZnVuYygpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLlNhdmVGb3JMYXRlcih0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLkl0ZW1EZXRhaWwuU2F2ZUZvckxhdGVyKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uUmV0dXJuVXJsID0gJy9wYW5kYWZ1bmRyYWlzZXIjL2xpc3QnO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciByZSA9IG5ldyBSZWdFeHAoJ01lbWJlcklkJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gcmUuZXhlYyhkb2N1bWVudC5jb29raWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9ICcvZnVuZHJhaXNlcmxvZ2luIy9pbmRleCc7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnZtLmZvcm0ucG9zdCgpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbnZlcnRUb1JlZ0V4OiB0cnVlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IC9cXC9QYW5kYUZ1bmRyYWlzZXIjXFwvdmlld1xcLyguKikvaSxcclxuICAgICAgICAgICAgICAgIGZ1bmMoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGlkID0gdGhpcy5wYXJhbXNbJ3NwbGF0J11bMF07XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlID0gbmV3IFJlZ0V4cCgnTWVtYmVySWQnKTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSByZS5leGVjKGRvY3VtZW50LmNvb2tpZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gJy9mdW5kcmFpc2VybG9naW4jL2luZGV4JztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHByb21pc2UgPSBzZWxmLnZtLmZvcm0uZ2V0RGV0YWlsKGlkKTtcclxuICAgICAgICAgICAgICAgICAgICBwcm9taXNlLmRvbmUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLlJldmlld0V2ZW50KHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLkZvcm1WaXNpYmxlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5FdmVudFN1Ym1pdHRlZChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudm0uVmlld1Jlc291cmNlcyhmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvUmVnRXg6IGZhbHNlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IC9cXC9QYW5kYUZ1bmRyYWlzZXIjXFwvcmVzb3VyY2VzXFwvKC4qKS9pLFxyXG4gICAgICAgICAgICAgICAgZnVuYygpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgaWQgPSB0aGlzLnBhcmFtc1snc3BsYXQnXVswXTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgcmUgPSBuZXcgUmVnRXhwKCdNZW1iZXJJZCcpO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHJlLmV4ZWMoZG9jdW1lbnQuY29va2llKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSAnL2Z1bmRyYWlzZXJsb2dpbiMvaW5kZXgnO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB2YXIgcHJvbWlzZSA9IHNlbGYudm0uZm9ybS5nZXREZXRhaWwoaWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHByb21pc2UuZG9uZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudm0uUmV2aWV3RXZlbnQoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLkZvcm1WaXNpYmxlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5FdmVudFN1Ym1pdHRlZChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudm0uVmlld1Jlc291cmNlcyh0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9SZWdFeDogZmFsc2VcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogL1xcL1BhbmRhRnVuZHJhaXNlciNcXC9lZGl0XFwvKC4qKS9pLFxyXG4gICAgICAgICAgICAgICAgZnVuYygpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgaWQgPSB0aGlzLnBhcmFtc1snc3BsYXQnXVswXTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgcmUgPSBuZXcgUmVnRXhwKCdNZW1iZXJJZCcpO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHJlLmV4ZWMoZG9jdW1lbnQuY29va2llKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSAnL2Z1bmRyYWlzZXJsb2dpbiMvaW5kZXgnO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLmZvcm0uZ2V0RGV0YWlsKGlkKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9SZWdFeDogZmFsc2VcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIF07XHJcbiAgICB9XHJcbn1cclxubW9kdWxlLmV4cG9ydHMgPSBQYW5kYUZ1bmRyYWlzZXJSb3V0ZXI7XHJcbiIsIlwidXNlIHN0cmljdFwiO1xyXG4vLy8gVGhpcyBjb2RlIHdhcyBnZW5lcmF0ZWQgYnkgT3JhbmdlIE9uaW9uIFNjYWZmb2xkZXIuXHJcbi8vIHRlbXBsYXRlOiBNVkMuSlNNb2R1bGUuY3NcclxuLy8gY2xhc3M6IFB1YmxpY0NvbnRlbnRQYWdlXHJcbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xyXG5jb25zdCBrbyA9IHJlcXVpcmUoXCJrbm9ja291dFwiKTtcclxuY29uc3QgYmFzZSA9IHJlcXVpcmUoXCIuLi9CYXNlL1ZNQmFzZVwiKTtcclxuY2xhc3MgUHVibGljQ29udGVudFBhZ2UgZXh0ZW5kcyBiYXNlLlZtQmFzZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihkYXRhKSB7XHJcbiAgICAgICAgLy9jYWxsIGJhc2UgY2xhc3MgY29uc3RydWN0b3JcclxuICAgICAgICBzdXBlcihkYXRhLCBudWxsLCBudWxsLCBudWxsKTtcclxuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xyXG4gICAgICAgIHZhciAkZWxlbWVudCA9ICQoJy5jb250ZW50LWNvbnRhaW5lcicpO1xyXG4gICAgICAgICRlbGVtZW50LnN1bW1lcm5vdGUoe1xyXG4gICAgICAgICAgICBoZWlnaHQ6IDYwMCwgYWlyTW9kZTogdHJ1ZVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGtvLmFwcGx5QmluZGluZ3ModGhpcyk7XHJcbiAgICAgICAgJCgnLmhpZGVVbmJvdW5kJykucmVtb3ZlQ2xhc3MoJ2hpZGVVbmJvdW5kJyk7XHJcbiAgICB9XHJcbn1cclxubW9kdWxlLmV4cG9ydHMgPSBQdWJsaWNDb250ZW50UGFnZTtcclxuIiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xyXG5jb25zdCBrbyA9IHJlcXVpcmUoXCJrbm9ja291dFwiKTtcclxuY29uc3QgYmFzZSA9IHJlcXVpcmUoXCIuLi9CYXNlL1ZNQmFzZVwiKTtcclxuY29uc3QgVGFibGUgPSByZXF1aXJlKFwiLi4vQmFzZS9UYWJsZVwiKTtcclxuY29uc3QgUm91dGVyID0gcmVxdWlyZShcIi4uL0Jhc2UvUm91dGVyXCIpO1xyXG5jb25zdCBGb3JtID0gcmVxdWlyZShcIi4uL0Jhc2UvRm9ybVwiKTtcclxuY2xhc3MgUXVlc3Rpb25BbnN3ZXIgZXh0ZW5kcyBiYXNlLlZtQmFzZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihkYXRhKSB7XHJcbiAgICAgICAgLy9jYWxsIGJhc2UgY2xhc3MgY29uc3RydWN0b3JcclxuICAgICAgICBzdXBlcihkYXRhLCBGb3JtLCBUYWJsZSwgUm91dGVyKTtcclxuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xyXG4gICAgICAgIGtvLmFwcGx5QmluZGluZ3ModGhpcyk7XHJcbiAgICAgICAgJChcIi5oaWRlVW5ib3VuZFwiKS5yZW1vdmVDbGFzcyhcImhpZGVVbmJvdW5kXCIpO1xyXG4gICAgfVxyXG59XHJcbm1vZHVsZS5leHBvcnRzID0gUXVlc3Rpb25BbnN3ZXI7XHJcbiIsIlwidXNlIHN0cmljdFwiO1xyXG5jb25zdCAkID0gcmVxdWlyZShcImpxdWVyeVwiKTtcclxuY29uc3Qga28gPSByZXF1aXJlKFwia25vY2tvdXRcIik7XHJcbmNvbnN0IGJhc2UgPSByZXF1aXJlKFwiLi4vQmFzZS9WTUJhc2VcIik7XHJcbmNvbnN0IFRhYmxlID0gcmVxdWlyZShcIi4uL0Jhc2UvVGFibGVcIik7XHJcbmNvbnN0IFJlZGlyZWN0VXJsUm91dGVyID0gcmVxdWlyZShcIi4vUmVkaXJlY3RVcmxSb3V0ZXJcIik7XHJcbmNvbnN0IEZvcm0gPSByZXF1aXJlKFwiLi4vQmFzZS9Gb3JtXCIpO1xyXG5jbGFzcyBSZWRpcmVjdFVybCBleHRlbmRzIGJhc2UuVm1CYXNlIHtcclxuICAgIGNvbnN0cnVjdG9yKGRhdGEpIHtcclxuICAgICAgICAvL2NhbGwgYmFzZSBjbGFzcyBjb25zdHJ1Y3RvclxyXG4gICAgICAgIHN1cGVyKGRhdGEsIEZvcm0sIFRhYmxlLCBSZWRpcmVjdFVybFJvdXRlcik7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcclxuICAgICAgICBrby5hcHBseUJpbmRpbmdzKHRoaXMpO1xyXG4gICAgICAgICQoJy5oaWRlVW5ib3VuZCcpLnJlbW92ZUNsYXNzKCdoaWRlVW5ib3VuZCcpO1xyXG4gICAgfVxyXG59XHJcbm1vZHVsZS5leHBvcnRzID0gUmVkaXJlY3RVcmw7XHJcbiIsIlwidXNlIHN0cmljdFwiO1xyXG5jb25zdCBSb3V0ZXIgPSByZXF1aXJlKFwiLi4vQmFzZS9Sb3V0ZXJcIik7XHJcbmNsYXNzIFJlZGlyZWN0VXJsUm91dGVyIGV4dGVuZHMgUm91dGVyIHtcclxuICAgIGNvbnN0cnVjdG9yKGRhdGEsIHZtLCBhbHRlcm5hdGVyb3V0ZXMpIHtcclxuICAgICAgICBzdXBlcihkYXRhLCB2bSwgYWx0ZXJuYXRlcm91dGVzKTtcclxuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xyXG4gICAgICAgIHRoaXMudm0gPSB2bTtcclxuICAgIH1cclxuICAgIGdldFJvdXRlcygpIHtcclxuICAgICAgICB2YXIgc2VsZjtcclxuICAgICAgICBzZWxmID0gdGhpcztcclxuICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBgJHtzZWxmLmdldEFyZWEoKX0vJHtzZWxmLmRhdGEuVGl0bGV9Iy9saXN0YCxcclxuICAgICAgICAgICAgICAgIGZ1bmM6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLmZvcm0uY2FuY2VsKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS50YWJsZS5sb2FkKCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvUmVnRXg6IGZhbHNlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IGAke3NlbGYuZ2V0QXJlYSgpfS8ke3NlbGYuZGF0YS5UaXRsZX0jL25ld2AsXHJcbiAgICAgICAgICAgICAgICBmdW5jKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uZm9ybS5hZGQoKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9SZWdFeDogZmFsc2VcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogYCR7c2VsZi5nZXRBcmVhKCl9LyR7c2VsZi5kYXRhLlRpdGxlfSMvdmlldy86aWRgLFxyXG4gICAgICAgICAgICAgICAgZnVuYygpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgaWQgPSB0aGlzLnBhcmFtc1snaWQnXTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLmZvcm0uZ2V0RGV0YWlsKGlkKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9SZWdFeDogZmFsc2VcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogYCR7c2VsZi5nZXRBcmVhKCl9LyR7c2VsZi5kYXRhLlRpdGxlfSMvaW5kZXhgLFxyXG4gICAgICAgICAgICAgICAgZnVuYygpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLmZvcm0uZ2V0RGV0YWlsKG51bGwpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbnZlcnRUb1JlZ0V4OiBmYWxzZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBgJHtzZWxmLmdldEFyZWEoKX0vJHtzZWxmLmRhdGEuVGl0bGV9Iy9kZWxldGUvOmlkYCxcclxuICAgICAgICAgICAgICAgIGZ1bmMoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGlkID0gdGhpcy5wYXJhbXNbJ2lkJ107XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5mb3JtLmRlbGV0ZUl0ZW0oaWQpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbnZlcnRUb1JlZ0V4OiBmYWxzZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgXTtcclxuICAgIH1cclxufVxyXG5tb2R1bGUuZXhwb3J0cyA9IFJlZGlyZWN0VXJsUm91dGVyO1xyXG4iLCJcInVzZSBzdHJpY3RcIjtcclxuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XHJcbmNvbnN0IGtvID0gcmVxdWlyZShcImtub2Nrb3V0XCIpO1xyXG5jbGFzcyBTaXRlTWFwIHtcclxuICAgIGNvbnN0cnVjdG9yKGRhdGEpIHtcclxuICAgICAgICAvL2NhbGwgYmFzZSBjbGFzcyBjb25zdHJ1Y3RvclxyXG4gICAgICAgIC8vIHN1cGVyKGRhdGEsIEZvcm0sIFRhYmxlLCBSb3V0ZXIpO1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICAgICAga28uYXBwbHlCaW5kaW5ncyh0aGlzKTtcclxuICAgICAgICAkKCcuaGlkZVVuYm91bmQnKS5yZW1vdmVDbGFzcygnaGlkZVVuYm91bmQnKTtcclxuICAgIH1cclxufVxyXG5tb2R1bGUuZXhwb3J0cyA9IFNpdGVNYXA7XHJcbiIsIlwidXNlIHN0cmljdFwiO1xyXG4vLy8gVGhpcyBjb2RlIHdhcyBnZW5lcmF0ZWQgYnkgT3JhbmdlIE9uaW9uIFNjYWZmb2xkZXIuXHJcbi8vIHRlbXBsYXRlOiBNVkMuSlNNb2R1bGUuY3NcclxuLy8gY2xhc3M6IFN0b3JlRXhjZXB0aW9uXHJcbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xyXG5jb25zdCBrbyA9IHJlcXVpcmUoXCJrbm9ja291dFwiKTtcclxuY29uc3QgYmFzZSA9IHJlcXVpcmUoXCIuLi9CYXNlL1ZNQmFzZVwiKTtcclxuY29uc3QgVGFibGUgPSByZXF1aXJlKFwiLi4vQmFzZS9UYWJsZVwiKTtcclxuY29uc3QgU3RvcmVFeGNlcHRpb25Sb3V0ZXIgPSByZXF1aXJlKFwiLi9TdG9yZUV4Y2VwdGlvblJvdXRlclwiKTtcclxuY29uc3QgRm9ybSA9IHJlcXVpcmUoXCIuLi9CYXNlL0Zvcm1cIik7XHJcbmNsYXNzIFN0b3JlRXhjZXB0aW9uIGV4dGVuZHMgYmFzZS5WbUJhc2Uge1xyXG4gICAgY29uc3RydWN0b3IoZGF0YSkge1xyXG4gICAgICAgIC8vY2FsbCBiYXNlIGNsYXNzIGNvbnN0cnVjdG9yXHJcbiAgICAgICAgc3VwZXIoZGF0YSwgRm9ybSwgVGFibGUsIFN0b3JlRXhjZXB0aW9uUm91dGVyKTtcclxuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xyXG4gICAgICAgIGtvLmFwcGx5QmluZGluZ3ModGhpcyk7XHJcbiAgICAgICAgJCgnLmhpZGVVbmJvdW5kJykucmVtb3ZlQ2xhc3MoJ2hpZGVVbmJvdW5kJyk7XHJcbiAgICB9XHJcbn1cclxubW9kdWxlLmV4cG9ydHMgPSBTdG9yZUV4Y2VwdGlvbjtcclxuIiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbmNvbnN0IFJvdXRlciA9IHJlcXVpcmUoXCIuLi9CYXNlL1JvdXRlclwiKTtcclxuY2xhc3MgU3RvcmVFeGNlcHRpb25Sb3V0ZXIgZXh0ZW5kcyBSb3V0ZXIge1xyXG4gICAgY29uc3RydWN0b3IoZGF0YSwgdm0sIGFsdGVybmF0ZXJvdXRlcykge1xyXG4gICAgICAgIHN1cGVyKGRhdGEsIHZtLCBhbHRlcm5hdGVyb3V0ZXMpO1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICAgICAgdGhpcy52bSA9IHZtO1xyXG4gICAgfVxyXG4gICAgZ2V0Um91dGVzKCkge1xyXG4gICAgICAgIHZhciBzZWxmO1xyXG4gICAgICAgIHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IGAke3NlbGYuZ2V0QXJlYSgpfS8ke3NlbGYuZGF0YS5UaXRsZX0jL2xpc3RgLFxyXG4gICAgICAgICAgICAgICAgZnVuYzogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uZm9ybS5jYW5jZWwoKTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLnRhYmxlLmxvYWQoKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9SZWdFeDogZmFsc2VcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogYCR7c2VsZi5nZXRBcmVhKCl9LyR7c2VsZi5kYXRhLlRpdGxlfSMvbmV3YCxcclxuICAgICAgICAgICAgICAgIGZ1bmMoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5mb3JtLmFkZCgpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbnZlcnRUb1JlZ0V4OiBmYWxzZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBgJHtzZWxmLmdldEFyZWEoKX0vJHtzZWxmLmRhdGEuVGl0bGV9Iy92aWV3LzppZGAsXHJcbiAgICAgICAgICAgICAgICBmdW5jKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpZCA9IHRoaXMucGFyYW1zWydpZCddO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uZm9ybS5nZXREZXRhaWwoaWQpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbnZlcnRUb1JlZ0V4OiBmYWxzZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBgJHtzZWxmLmdldEFyZWEoKX0vJHtzZWxmLmRhdGEuVGl0bGV9Iy9pbmRleGAsXHJcbiAgICAgICAgICAgICAgICBmdW5jKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uZm9ybS5nZXREZXRhaWwobnVsbCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvUmVnRXg6IGZhbHNlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IGAke3NlbGYuZ2V0QXJlYSgpfS8ke3NlbGYuZGF0YS5UaXRsZX0jL2RlbGV0ZS86aWRgLFxyXG4gICAgICAgICAgICAgICAgZnVuYygpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgaWQgPSB0aGlzLnBhcmFtc1snaWQnXTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLmZvcm0uZGVsZXRlSXRlbShpZCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvUmVnRXg6IGZhbHNlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICBdO1xyXG4gICAgfVxyXG59XHJcbm1vZHVsZS5leHBvcnRzID0gU3RvcmVFeGNlcHRpb25Sb3V0ZXI7XHJcbiIsIlwidXNlIHN0cmljdFwiO1xyXG5jb25zdCAkID0gcmVxdWlyZShcImpxdWVyeVwiKTtcclxuY29uc3Qga28gPSByZXF1aXJlKFwia25vY2tvdXRcIik7XHJcbmNvbnN0IGJhc2UgPSByZXF1aXJlKFwiLi4vQmFzZS9WTUJhc2VcIik7XHJcbi8vaW1wb3J0IFRhYmxlID0gcmVxdWlyZSgnLi4vQmFzZS9UYWJsZScpO1xyXG5jb25zdCBSb3V0ZXIgPSByZXF1aXJlKFwiLi4vQmFzZS9Sb3V0ZXJcIik7XHJcbmNvbnN0IEZvcm0gPSByZXF1aXJlKFwiLi4vQmFzZS9Gb3JtXCIpO1xyXG5jb25zdCBTdG9yZVRhYmxlID0gcmVxdWlyZShcIi4vU3RvcmVUYWJsZVwiKTtcclxuY2xhc3MgU3RvcmUgZXh0ZW5kcyBiYXNlLlZtQmFzZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihkYXRhLCBhcHBseUJpbmRpbmdzID0gdHJ1ZSwgZnVuZHJhaXNlclN0b3JlcyA9IGZhbHNlKSB7XHJcbiAgICAgICAgLy9jYWxsIGJhc2UgY2xhc3MgY29uc3RydWN0b3JcclxuICAgICAgICBzdXBlcihkYXRhLCBGb3JtLCBTdG9yZVRhYmxlLCBSb3V0ZXIpO1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICAgICAgdGhpcy50b2dnbGVGdW5kcmFpc2VyID0gKGRhdGEsIGUpID0+IHtcclxuICAgICAgICAgICAgdmFyIHBvc3REYXRhID0gZGF0YS5JZDtcclxuICAgICAgICAgICAgJC5hamF4KHtcclxuICAgICAgICAgICAgICAgIHVybDogJy9BZG1pbi9TdG9yZS9Ub2dnbGVGdW5kcmFpc2VyP3N0b3JlPScgKyBkYXRhLklkLFxyXG4gICAgICAgICAgICAgICAgdHlwZTogJ0dFVCcsXHJcbiAgICAgICAgICAgICAgICBjb250ZW50VHlwZTogJ2FwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtOCcsXHJcbiAgICAgICAgICAgICAgICBhc3luYzogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICBkYXRhOiBwb3N0RGF0YVxyXG4gICAgICAgICAgICB9KS5kb25lKChyZXNwb25zZWRhdGEpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMudGFibGUubG9hZCgpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIGlmIChhcHBseUJpbmRpbmdzKSB7XHJcbiAgICAgICAgICAgIGtvLmFwcGx5QmluZGluZ3ModGhpcyk7XHJcbiAgICAgICAgICAgICQoJy5oaWRlVW5ib3VuZCcpLnJlbW92ZUNsYXNzKCdoaWRlVW5ib3VuZCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZnVuZHJhaXNlclN0b3Jlcykge1xyXG4gICAgICAgICAgICB0aGlzLkdldFVybCA9ICcvYXBpL1N0b3JlL0dldCc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLkdldFVybCA9ICcvYXBpL1N0b3JlL0dldEFsbEZ1bmRyYWlzZXJJbmNsdWRlJztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxubW9kdWxlLmV4cG9ydHMgPSBTdG9yZTtcclxuIiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbmNvbnN0IFRhYmxlID0gcmVxdWlyZShcIi4uL0Jhc2UvVGFibGVcIik7XHJcbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xyXG5jb25zdCBrbyA9IHJlcXVpcmUoXCJrbm9ja291dFwiKTtcclxuY29uc3Qga29tYXBwaW5nID0gcmVxdWlyZShcImtub2Nrb3V0Lm1hcHBpbmdcIik7XHJcbmtvLm1hcHBpbmcgPSBrb21hcHBpbmc7XHJcbmNsYXNzIFN0b3JlVGFibGUgZXh0ZW5kcyBUYWJsZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihkYXRhLCB2bSkge1xyXG4gICAgICAgIHN1cGVyKGRhdGEsIHZtKTtcclxuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xyXG4gICAgICAgIHRoaXMudm0gPSB2bTtcclxuICAgIH1cclxuICAgIC8vc2VuZHMgYWpheCBjYWxsIGZvciBkYXRhIFxyXG4gICAgbG9hZCgpIHtcclxuICAgICAgICAvL3RoaXMudm0uZm9ybS5pc0RlbGV0aW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5vcmRlcmJ5ID0gJ05hbWUnO1xyXG4gICAgICAgICQoJyNsb2FkaW5nJykuaGVpZ2h0KCQod2luZG93KS5oZWlnaHQoKSk7XHJcbiAgICAgICAgdGhpcy52bS5Jc0xvYWRpbmcodHJ1ZSk7XHJcbiAgICAgICAgLy9mb3JtYXQgdGhlIHJlcXVlc3RcclxuICAgICAgICB2YXIgcmVxdWVzdERhdGEgPSB7XHJcbiAgICAgICAgICAgICRpbmxpbmVjb3VudDogXCJhbGxwYWdlc1wiLFxyXG4gICAgICAgICAgICAkb3JkZXJieTogdGhpcy5vcmRlcmJ5LFxyXG4gICAgICAgICAgICAkdG9wOiB0aGlzLnRvcCgpLFxyXG4gICAgICAgICAgICAkc2tpcDogdGhpcy5za2lwKClcclxuICAgICAgICB9O1xyXG4gICAgICAgIC8vYWRkIGluIGZpbHRlcnNcclxuICAgICAgICAkLmV4dGVuZChyZXF1ZXN0RGF0YSwga28udG9KUyh0aGlzLnZtLkZpbHRlcnMpKTtcclxuICAgICAgICAvL21ha2UgdGhlIHJlcXVlc3RcclxuICAgICAgICB2YXIgcmVzcG9uc2UgPSAkLmFqYXgoe1xyXG4gICAgICAgICAgICB1cmw6IHRoaXMudm0uR2V0VXJsLFxyXG4gICAgICAgICAgICBkYXRhVHlwZTogXCJqc29uXCIsXHJcbiAgICAgICAgICAgIGNhY2hlOiBmYWxzZSxcclxuICAgICAgICAgICAgZGF0YTogcmVxdWVzdERhdGFcclxuICAgICAgICB9KTtcclxuICAgICAgICAvL2hhbmRsZSBzdWNjZXNzZnVsIHJlc3BvbnNlXHJcbiAgICAgICAgcmVzcG9uc2UuZG9uZShyZXNwb25zZWRhdGEgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxvYWRSZXNwb25zZShyZXNwb25zZWRhdGEpO1xyXG4gICAgICAgICAgICB0aGlzLnZtLkhhc0hhd2FpaUxvY2F0aW9ucyhyZXNwb25zZWRhdGEuSGFzSGF3YWlpTG9jYXRpb25zKTtcclxuICAgICAgICAgICAgdGhpcy52bS5Jc0xvYWRpbmcoZmFsc2UpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgIH1cclxufVxyXG5tb2R1bGUuZXhwb3J0cyA9IFN0b3JlVGFibGU7XHJcbiIsIlwidXNlIHN0cmljdFwiO1xyXG5jb25zdCAkID0gcmVxdWlyZShcImpxdWVyeVwiKTtcclxuY29uc3Qga28gPSByZXF1aXJlKFwia25vY2tvdXRcIik7XHJcbmNvbnN0IGJhc2UgPSByZXF1aXJlKFwiLi4vQmFzZS9WTUJhc2VcIik7XHJcbmNvbnN0IFRhYmxlID0gcmVxdWlyZShcIi4uL0Jhc2UvVGFibGVcIik7XHJcbmNvbnN0IFJvdXRlciA9IHJlcXVpcmUoXCIuLi9CYXNlL1JvdXRlclwiKTtcclxuY29uc3QgRm9ybSA9IHJlcXVpcmUoXCIuLi9CYXNlL0Zvcm1cIik7XHJcbmNsYXNzIFN0eWxlR3VpZGUgZXh0ZW5kcyBiYXNlLlZtQmFzZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihkYXRhKSB7XHJcbiAgICAgICAgLy9jYWxsIGJhc2UgY2xhc3MgY29uc3RydWN0b3JcclxuICAgICAgICBzdXBlcihkYXRhLCBGb3JtLCBUYWJsZSwgUm91dGVyKTtcclxuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xyXG4gICAgICAgIGtvLmFwcGx5QmluZGluZ3ModGhpcyk7XHJcbiAgICAgICAgJChcIi5oaWRlVW5ib3VuZFwiKS5yZW1vdmVDbGFzcyhcImhpZGVVbmJvdW5kXCIpO1xyXG4gICAgICAgIC8vdGhpcy50YWJsZS5kZWZhdWx0U29ydCA9IFwiXCJcclxuICAgIH1cclxufVxyXG5tb2R1bGUuZXhwb3J0cyA9IFN0eWxlR3VpZGU7XHJcbiIsIlwidXNlIHN0cmljdFwiO1xyXG5jb25zdCAkID0gcmVxdWlyZShcImpxdWVyeVwiKTtcclxuY29uc3Qga28gPSByZXF1aXJlKFwia25vY2tvdXRcIik7XHJcbmNvbnN0IFBhZ2VCYXNlID0gcmVxdWlyZShcIi4uL0NvbnRlbnRQYWdlL0NvbnRlbnRQYWdlQmFzZVwiKTtcclxuY29uc3QgU3lzdGVtQ29udGVudFBhZ2VGb3JtID0gcmVxdWlyZShcIi4vU3lzdGVtQ29udGVudFBhZ2VGb3JtXCIpO1xyXG5jb25zdCBUYWJsZSA9IHJlcXVpcmUoXCIuLi9CYXNlL1RhYmxlXCIpO1xyXG5jb25zdCBDb250ZW50UGFnZVJvdXRlciA9IHJlcXVpcmUoXCIuLi9Db250ZW50UGFnZS9Db250ZW50UGFnZVJvdXRlclwiKTtcclxuY2xhc3MgU3lzdGVtQ29udGVudFBhZ2UgZXh0ZW5kcyBQYWdlQmFzZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihkYXRhKSB7XHJcbiAgICAgICAgc3VwZXIoZGF0YSwgU3lzdGVtQ29udGVudFBhZ2VGb3JtLCBUYWJsZSwgQ29udGVudFBhZ2VSb3V0ZXIpO1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICAgICAga28uYXBwbHlCaW5kaW5ncyh0aGlzKTtcclxuICAgICAgICAkKCcuaGlkZVVuYm91bmQnKS5yZW1vdmVDbGFzcygnaGlkZVVuYm91bmQnKTtcclxuICAgIH1cclxufVxyXG5tb2R1bGUuZXhwb3J0cyA9IFN5c3RlbUNvbnRlbnRQYWdlO1xyXG4iLCJcInVzZSBzdHJpY3RcIjtcclxuY29uc3QgUGFnZUZvcm0gPSByZXF1aXJlKFwiLi4vQ29udGVudFBhZ2UvQ29udGVudFBhZ2VGb3JtXCIpO1xyXG5jbGFzcyBTeXN0ZW1Db250ZW50UGFnZUZvcm0gZXh0ZW5kcyBQYWdlRm9ybSB7XHJcbiAgICBjb25zdHJ1Y3RvcihkYXRhLCB2bSkge1xyXG4gICAgICAgIHN1cGVyKGRhdGEsIHZtKTtcclxuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xyXG4gICAgICAgIHRoaXMudm0gPSB2bTtcclxuICAgICAgICB0aGlzLmFkZEl0ZW1EZXRhaWxDbGllbnRPbmx5UHJvcGVydGllcygpO1xyXG4gICAgfVxyXG4gICAgLy9hZGQtY29udGVudGJsb2NrXHJcbiAgICBzZXR1cEJpbmRpZ3MoKSB7XHJcbiAgICAgICAgc3VwZXIuc2V0dXBCaW5kaWdzKCk7XHJcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIHZhciBtb2RlbEhvbGRlclNlbGVjdG9yID0gJCgnLm1vZGFsZm9ybS1ob2xkZXInKTtcclxuICAgICAgICAvL0FkZGluZ1xyXG4gICAgICAgIG1vZGVsSG9sZGVyU2VsZWN0b3Iub24oJ2NsaWNrJywgJy5hZGQtY29udGVudGJsb2NrJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgZGF0YSA9IGtvLmRhdGFGb3IodGhpcyk7IC8vbG9jYWwgdGhpc1xyXG4gICAgICAgICAgICB2YXIgcm93ID0gc2VsZi52bS5OZXdDb250ZW50QmxvY2s7XHJcbiAgICAgICAgICAgIHZhciByb3dDb3B5ID0ga28ubWFwcGluZy5mcm9tSlMoa28udG9KUyhyb3cpKTtcclxuICAgICAgICAgICAgLy8gc2VsZi5hZGRTb3J0ZWRDZWxscyhyb3dDb3B5KTtcclxuICAgICAgICAgICAgZGF0YS5Db250ZW50QmxvY2tzLnB1c2gocm93Q29weSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn1cclxubW9kdWxlLmV4cG9ydHMgPSBTeXN0ZW1Db250ZW50UGFnZUZvcm07XHJcbiIsIlwidXNlIHN0cmljdFwiO1xyXG5jb25zdCAkID0gcmVxdWlyZShcImpxdWVyeVwiKTtcclxuY29uc3Qga28gPSByZXF1aXJlKFwia25vY2tvdXRcIik7XHJcbmNvbnN0IGJhc2UgPSByZXF1aXJlKFwiLi4vQmFzZS9WTUJhc2VcIik7XHJcbmNvbnN0IFRhYmxlID0gcmVxdWlyZShcIi4uL0Jhc2UvVGFibGVcIik7XHJcbmNvbnN0IFJvdXRlciA9IHJlcXVpcmUoXCIuLi9CYXNlL1JvdXRlclwiKTtcclxuY29uc3QgRm9ybSA9IHJlcXVpcmUoXCIuLi9CYXNlL0Zvcm1cIik7XHJcbmNsYXNzIFVzZXJMb2NhdGlvbiBleHRlbmRzIGJhc2UuVm1CYXNlIHtcclxuICAgIGNvbnN0cnVjdG9yKGRhdGEpIHtcclxuICAgICAgICAvL2NhbGwgYmFzZSBjbGFzcyBjb25zdHJ1Y3RvclxyXG4gICAgICAgIHN1cGVyKGRhdGEsIEZvcm0sIFRhYmxlLCBSb3V0ZXIpO1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICAgICAga28uYXBwbHlCaW5kaW5ncyh0aGlzKTtcclxuICAgICAgICAkKFwiLmhpZGVVbmJvdW5kXCIpLnJlbW92ZUNsYXNzKFwiaGlkZVVuYm91bmRcIik7XHJcbiAgICAgICAgLy90aGlzLnRhYmxlLmRlZmF1bHRTb3J0ID0gXCJcIlxyXG4gICAgfVxyXG59XHJcbm1vZHVsZS5leHBvcnRzID0gVXNlckxvY2F0aW9uO1xyXG4iLCJcInVzZSBzdHJpY3RcIjtcclxuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XHJcbmNvbnN0IGtvID0gcmVxdWlyZShcImtub2Nrb3V0XCIpO1xyXG5jb25zdCBiYXNlID0gcmVxdWlyZShcIi4uL0Jhc2UvVk1CYXNlXCIpO1xyXG5jb25zdCBUYWJsZSA9IHJlcXVpcmUoXCIuLi9CYXNlL1RhYmxlXCIpO1xyXG5jb25zdCBVc2VyUm91dGVyID0gcmVxdWlyZShcIi4vVXNlclJvdXRlclwiKTtcclxuY29uc3QgRm9ybSA9IHJlcXVpcmUoXCIuLi9CYXNlL0Zvcm1cIik7XHJcbmNsYXNzIFVzZXIgZXh0ZW5kcyBiYXNlLlZtQmFzZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihkYXRhKSB7XHJcbiAgICAgICAgLy9jYWxsIGJhc2UgY2xhc3MgY29uc3RydWN0b3JcclxuICAgICAgICBzdXBlcihkYXRhLCBGb3JtLCBUYWJsZSwgVXNlclJvdXRlcik7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcclxuICAgICAgICBrby5hcHBseUJpbmRpbmdzKHRoaXMpO1xyXG4gICAgICAgICQoXCIuaGlkZVVuYm91bmRcIikucmVtb3ZlQ2xhc3MoXCJoaWRlVW5ib3VuZFwiKTtcclxuICAgIH1cclxufVxyXG5tb2R1bGUuZXhwb3J0cyA9IFVzZXI7XHJcbiIsIlwidXNlIHN0cmljdFwiO1xyXG5jb25zdCBSb3V0ZXIgPSByZXF1aXJlKFwiLi4vQmFzZS9Sb3V0ZXJcIik7XHJcbmNsYXNzIFVzZXJSb3V0ZXIgZXh0ZW5kcyBSb3V0ZXIge1xyXG4gICAgY29uc3RydWN0b3IoZGF0YSwgdm0sIGFsdGVybmF0ZXJvdXRlcykge1xyXG4gICAgICAgIHN1cGVyKGRhdGEsIHZtLCBhbHRlcm5hdGVyb3V0ZXMpO1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICAgICAgdGhpcy52bSA9IHZtO1xyXG4gICAgfVxyXG4gICAgZ2V0Um91dGVzKCkge1xyXG4gICAgICAgIHZhciBzZWxmO1xyXG4gICAgICAgIHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IGAke3NlbGYuZ2V0QXJlYSgpfS8ke3NlbGYuZGF0YS5UaXRsZX0jL2xpc3RgLFxyXG4gICAgICAgICAgICAgICAgZnVuYzogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uZm9ybS5jYW5jZWwoKTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLnRhYmxlLmxvYWQoKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9SZWdFeDogZmFsc2VcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogYCR7c2VsZi5nZXRBcmVhKCl9LyR7c2VsZi5kYXRhLlRpdGxlfSMvbmV3YCxcclxuICAgICAgICAgICAgICAgIGZ1bmMoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52bS5mb3JtLmFkZCgpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbnZlcnRUb1JlZ0V4OiBmYWxzZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBgJHtzZWxmLmdldEFyZWEoKX0vJHtzZWxmLmRhdGEuVGl0bGV9Iy92aWV3LzppZGAsXHJcbiAgICAgICAgICAgICAgICBmdW5jKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpZCA9IHRoaXMucGFyYW1zWydpZCddO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uZm9ybS5nZXREZXRhaWwoaWQpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbnZlcnRUb1JlZ0V4OiBmYWxzZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBgJHtzZWxmLmdldEFyZWEoKX0vJHtzZWxmLmRhdGEuVGl0bGV9Iy9pbmRleGAsXHJcbiAgICAgICAgICAgICAgICBmdW5jKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudm0uZm9ybS5nZXREZXRhaWwobnVsbCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvUmVnRXg6IGZhbHNlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IGAke3NlbGYuZ2V0QXJlYSgpfS8ke3NlbGYuZGF0YS5UaXRsZX0jL2RlbGV0ZS86aWRgLFxyXG4gICAgICAgICAgICAgICAgZnVuYygpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgaWQgPSB0aGlzLnBhcmFtc1snaWQnXTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnZtLmZvcm0uZGVsZXRlSXRlbShpZCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvUmVnRXg6IGZhbHNlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICBdO1xyXG4gICAgfVxyXG59XHJcbm1vZHVsZS5leHBvcnRzID0gVXNlclJvdXRlcjtcclxuIiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbi8vLyBUaGlzIGNvZGUgd2FzIGdlbmVyYXRlZCBieSBPcmFuZ2UgT25pb24gU2NhZmZvbGRlci5cclxuLy8gdGVtcGxhdGU6IE1WQy5KU01vZHVsZS5jc1xyXG4vLyBjbGFzczogVmVuZG9yXHJcbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xyXG5jb25zdCBrbyA9IHJlcXVpcmUoXCJrbm9ja291dFwiKTtcclxuY29uc3QgYmFzZSA9IHJlcXVpcmUoXCIuLi9CYXNlL1ZNQmFzZVwiKTtcclxuY29uc3QgVGFibGUgPSByZXF1aXJlKFwiLi4vQmFzZS9UYWJsZVwiKTtcclxuY29uc3QgUm91dGVyID0gcmVxdWlyZShcIi4uL0Jhc2UvUm91dGVyXCIpO1xyXG5jb25zdCBGb3JtID0gcmVxdWlyZShcIi4uL0Jhc2UvRm9ybVwiKTtcclxuY2xhc3MgVmVuZG9yIGV4dGVuZHMgYmFzZS5WbUJhc2Uge1xyXG4gICAgY29uc3RydWN0b3IoZGF0YSkge1xyXG4gICAgICAgIC8vY2FsbCBiYXNlIGNsYXNzIGNvbnN0cnVjdG9yXHJcbiAgICAgICAgc3VwZXIoZGF0YSwgRm9ybSwgVGFibGUsIFJvdXRlcik7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcclxuICAgICAgICBrby5hcHBseUJpbmRpbmdzKHRoaXMpO1xyXG4gICAgICAgICQoJy5oaWRlVW5ib3VuZCcpLnJlbW92ZUNsYXNzKCdoaWRlVW5ib3VuZCcpO1xyXG4gICAgfVxyXG59XHJcbm1vZHVsZS5leHBvcnRzID0gVmVuZG9yO1xyXG4iLCJcInVzZSBzdHJpY3RcIjtcclxuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XHJcbmNvbnN0IGtvID0gcmVxdWlyZShcImtub2Nrb3V0XCIpO1xyXG5jb25zdCBiYXNlID0gcmVxdWlyZShcIi4uL0Jhc2UvVk1CYXNlXCIpO1xyXG5jb25zdCBUYWJsZSA9IHJlcXVpcmUoXCIuLi9CYXNlL1RhYmxlXCIpO1xyXG5jb25zdCBSb3V0ZXIgPSByZXF1aXJlKFwiLi4vQmFzZS9Sb3V0ZXJcIik7XHJcbmNvbnN0IEZvcm0gPSByZXF1aXJlKFwiLi4vQmFzZS9Gb3JtXCIpO1xyXG5jbGFzcyBWaXNpdG9yU2NoZWR1bGVkTWVldGluZyBleHRlbmRzIGJhc2UuVm1CYXNlIHtcclxuICAgIGNvbnN0cnVjdG9yKGRhdGEpIHtcclxuICAgICAgICAvL2NhbGwgYmFzZSBjbGFzcyBjb25zdHJ1Y3RvclxyXG4gICAgICAgIHN1cGVyKGRhdGEsIEZvcm0sIFRhYmxlLCBSb3V0ZXIpO1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICAgICAgJCgnLm1vZGFsZm9ybS1ob2xkZXInKS5vbignY2xpY2snLCAnI3NhdmUtdmlzaXRvcicsICgpID0+IHtcclxuICAgICAgICAgICAgdmFyIHByb21pc2UgPSB0aGlzLmZvcm0ucG9zdCgpO1xyXG4gICAgICAgICAgICBwcm9taXNlLmRvbmUoKGRhdGEpID0+IHtcclxuICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gXCIvbHVuYXItbmV3LXllYXIvc2NoZWR1bGUtYS12aXNpdC9UaGFua1lvdVwiO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGtvLmFwcGx5QmluZGluZ3ModGhpcyk7XHJcbiAgICAgICAgJCgnLmhpZGVVbmJvdW5kJykucmVtb3ZlQ2xhc3MoJ2hpZGVVbmJvdW5kJyk7XHJcbiAgICB9XHJcbn1cclxubW9kdWxlLmV4cG9ydHMgPSBWaXNpdG9yU2NoZWR1bGVkTWVldGluZztcclxuIiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xyXG5jb25zdCBrbyA9IHJlcXVpcmUoXCJrbm9ja291dFwiKTtcclxuY29uc3QgYmFzZSA9IHJlcXVpcmUoXCIuLi9CYXNlL1ZNQmFzZVwiKTtcclxuY29uc3QgUm91dGVyID0gcmVxdWlyZShcIi4uL0Jhc2UvUm91dGVyXCIpO1xyXG5jb25zdCBGb3JtID0gcmVxdWlyZShcIi4uL0Jhc2UvRm9ybVwiKTtcclxuY29uc3QgWWVscFJldmlld1RhYmxlID0gcmVxdWlyZShcIi4vWWVscFJldmlld1RhYmxlXCIpO1xyXG5jb25zdCBfID0gcmVxdWlyZShcInVuZGVyc2NvcmVcIik7XHJcbmNsYXNzIFllbHBSZXZpZXcgZXh0ZW5kcyBiYXNlLlZtQmFzZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihkYXRhKSB7XHJcbiAgICAgICAgLy9jYWxsIGJhc2UgY2xhc3MgY29uc3RydWN0b3JcclxuICAgICAgICBzdXBlcihkYXRhLCBGb3JtLCBZZWxwUmV2aWV3VGFibGUsIFJvdXRlcik7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcclxuICAgICAgICBrby5hcHBseUJpbmRpbmdzKHRoaXMpO1xyXG4gICAgICAgICQoJy5oaWRlVW5ib3VuZCcpLnJlbW92ZUNsYXNzKCdoaWRlVW5ib3VuZCcpO1xyXG4gICAgfVxyXG4gICAgY2xlYXJGaWx0ZXJzKCkge1xyXG4gICAgICAgIF8uZWFjaCh0aGlzLkZpbHRlcnMsICh2KSA9PiB7XHJcbiAgICAgICAgICAgIHYoJycpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcbm1vZHVsZS5leHBvcnRzID0gWWVscFJldmlldztcclxuIiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbmNvbnN0IFRhYmxlID0gcmVxdWlyZShcIi4uL0Jhc2UvVGFibGVcIik7XHJcbmNvbnN0IGtvID0gcmVxdWlyZShcImtub2Nrb3V0XCIpO1xyXG5jb25zdCBrb21hcHBpbmcgPSByZXF1aXJlKFwia25vY2tvdXQubWFwcGluZ1wiKTtcclxua28ubWFwcGluZyA9IGtvbWFwcGluZztcclxuY2xhc3MgWWVscFJldmlld1RhYmxlIGV4dGVuZHMgVGFibGUge1xyXG4gICAgY29uc3RydWN0b3IoZGF0YSwgdm0pIHtcclxuICAgICAgICBzdXBlcihkYXRhLCB2bSk7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcclxuICAgICAgICB0aGlzLnZtID0gdm07XHJcbiAgICB9XHJcbn1cclxubW9kdWxlLmV4cG9ydHMgPSBZZWxwUmV2aWV3VGFibGU7XHJcbiIsIihmdW5jdGlvbiAoZ2xvYmFsKXtcblxuOyBqUXVlcnkgPSBnbG9iYWwualF1ZXJ5ID0gcmVxdWlyZShcImpxdWVyeVwiKTtcbjsgdmFyIF9fYnJvd3NlcmlmeV9zaGltX3JlcXVpcmVfXz1yZXF1aXJlOyhmdW5jdGlvbiBicm93c2VyaWZ5U2hpbShtb2R1bGUsIGRlZmluZSwgcmVxdWlyZSkge1xu77u/LyoqXHJcbiogTG9hZGluZyBwbHVnaW4gZm9yIGpRdWVyeVxyXG4qIHZlcnNpb246IHYxLjAuNlxyXG4qIFxyXG4qIFNtYWxsIGhlbHBlciB0byBnaXZlIHRoZSB1c2VyIGEgdmlzdWFsIGZlZWRiYWNrIHRoYXQgc29tZXRoaW5nIGlzIGhhcHBlbmluZyBcclxuKiB3aGVuIGZldGNoaW5nL3Bvc3RpbmcgZGF0YVxyXG4qIFxyXG4qIFVTQUdFOlxyXG4qIC0gZ2xvYmFsIG92ZXJsYXk6ICAgICAgICAgICAgICAgICAgICAgJC5pc0xvYWRpbmcoKTtcclxuKiAtIHVzZSBqYXZhc2NyaXB0OiAgICAgICAgICAgICAgICAgICAgICQoIHNlbGVjdG9yICkuaXNMb2FkaW5nKCk7XHJcbiogLSBPbiBub24tZm9ybSBlbGVtZW50czogICAgICAgICAgICAgICAkKFwiZGl2XCIpLmlzTG9hZGluZyh7IHRleHQ6IFwiTG9hZGluZ1wiLCBwb3NpdGlvbjonaW5zaWRlJ30pO1xyXG4qIC0gcmVtb3ZlIHRoZSBsb2FkaW5nIGVsZW1lbnQ6ICAgICAgICAgJCggc2VsZWN0b3IgKS5pc0xvYWRpbmcoIFwiaGlkZVwiICk7XHJcbipcclxuKiBAYXV0aG9yIExhdXJlbnQgQmxhbmVzIDxsYXVyZW50LmJsYW5lc0BnbWFpbC5jb20+XHJcbiogLS0tXHJcbiogQ29weXJpZ2h0IDIwMTMsIExhdXJlbnQgQmxhbmVzICggaHR0cHM6Ly9naXRodWIuY29tL2hla2lnYW4vaXMtbG9hZGluZyApXHJcbiogXHJcbiogVGhlIE1JVCBMaWNlbnNlIChNSVQpXHJcbiogXHJcbiogQ29weXJpZ2h0IChjKSAyMDEzIExhdXJlbnQgQmxhbmVzXHJcbiogXHJcbiogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxyXG4qIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcclxuKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXHJcbiogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxyXG4qIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xyXG4qIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XHJcbiogXHJcbiogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cclxuKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cclxuKiBcclxuKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXHJcbiogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXHJcbiogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXHJcbiogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxyXG4qIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXHJcbiogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxyXG4qIFRIRSBTT0ZUV0FSRS5cclxuKi9cclxuOyAoZnVuY3Rpb24gKCQsIHdpbmRvdywgZG9jdW1lbnQsIHVuZGVmaW5lZCkge1xyXG5cclxuICAgIC8vIENyZWF0ZSB0aGUgZGVmYXVsdHMgb25jZVxyXG4gICAgdmFyIHBsdWdpbk5hbWUgPSBcImlzTG9hZGluZ1wiLFxyXG4gICAgICAgIGRlZmF1bHRzID0ge1xyXG4gICAgICAgICAgICAncG9zaXRpb24nOiBcInJpZ2h0XCIsICAgICAgICAvLyByaWdodCB8IGluc2lkZSB8IG92ZXJsYXlcclxuICAgICAgICAgICAgJ3RleHQnOiBcIlwiLCAgICAgICAgICAgICAgICAgLy8gVGV4dCB0byBkaXNwbGF5IG5leHQgdG8gdGhlIGxvYWRlclxyXG4gICAgICAgICAgICAnY2xhc3MnOiBcImljb24tcmVmcmVzaFwiLCAgICAvLyBsb2FkZXIgQ1NTIGNsYXNzXHJcbiAgICAgICAgICAgICd0cGwnOiAnPHNwYW4gY2xhc3M9XCJpc2xvYWRpbmctd3JhcHBlciAld3JhcHBlciVcIj4ldGV4dCU8aSBjbGFzcz1cIiVjbGFzcyUgaWNvbi1zcGluXCI+PC9pPjwvc3Bhbj4nLCAgICAvLyBsb2FkZXIgYmFzZSBUYWdcclxuICAgICAgICAgICAgJ2Rpc2FibGVTb3VyY2UnOiB0cnVlLCAgICAgIC8vIHRydWUgfCBmYWxzZVxyXG4gICAgICAgICAgICAnZGlzYWJsZU90aGVycyc6IFtdXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAvLyBUaGUgYWN0dWFsIHBsdWdpbiBjb25zdHJ1Y3RvclxyXG4gICAgZnVuY3Rpb24gUGx1Z2luKGVsZW1lbnQsIG9wdGlvbnMpIHtcclxuICAgICAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50O1xyXG5cclxuICAgICAgICAvLyBNZXJnZSB1c2VyIG9wdGlvbnMgd2l0aCBkZWZhdWx0IG9uZXNcclxuICAgICAgICB0aGlzLm9wdGlvbnMgPSAkLmV4dGVuZCh7fSwgZGVmYXVsdHMsIG9wdGlvbnMpO1xyXG5cclxuICAgICAgICB0aGlzLl9kZWZhdWx0cyA9IGRlZmF1bHRzO1xyXG4gICAgICAgIHRoaXMuX25hbWUgPSBwbHVnaW5OYW1lO1xyXG4gICAgICAgIHRoaXMuX2xvYWRlciA9IG51bGw7ICAgICAgICAgICAgICAgIC8vIENvbnRhaW4gdGhlIGxvYWRpbmcgdGFnIGVsZW1lbnRcclxuXHJcbiAgICAgICAgdGhpcy5pbml0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ29udHJ1Y3RvciBmdW5jdGlvbiBmb3IgdGhlIHBsdWdpbiAob25seSBvbmNlIG9uIHBhZ2UgbG9hZClcclxuICAgIGZ1bmN0aW9uIGNvbnRydWN0KCkge1xyXG5cclxuICAgICAgICBpZiAoISRbcGx1Z2luTmFtZV0pIHtcclxuICAgICAgICAgICAgJC5pc0xvYWRpbmcgPSBmdW5jdGlvbiAob3B0cykge1xyXG4gICAgICAgICAgICAgICAgJChcImJvZHlcIikuaXNMb2FkaW5nKG9wdHMpO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBQbHVnaW4ucHJvdG90eXBlID0ge1xyXG5cclxuICAgICAgICBpbml0OiBmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgICAgICAgICBpZiAoJCh0aGlzLmVsZW1lbnQpLmlzKFwiYm9keVwiKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uID0gXCJvdmVybGF5XCI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5zaG93KCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgc2hvdzogZnVuY3Rpb24gKCkge1xyXG5cclxuICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzLFxyXG4gICAgICAgICAgICAgICAgdHBsID0gc2VsZi5vcHRpb25zLnRwbC5yZXBsYWNlKCcld3JhcHBlciUnLCAnIGlzbG9hZGluZy1zaG93ICcgKyAnIGlzbG9hZGluZy0nICsgc2VsZi5vcHRpb25zLnBvc2l0aW9uKTtcclxuICAgICAgICAgICAgdHBsID0gdHBsLnJlcGxhY2UoJyVjbGFzcyUnLCBzZWxmLm9wdGlvbnNbJ2NsYXNzJ10pO1xyXG4gICAgICAgICAgICB0cGwgPSB0cGwucmVwbGFjZSgnJXRleHQlJywgKHNlbGYub3B0aW9ucy50ZXh0ICE9PSBcIlwiKSA/IHNlbGYub3B0aW9ucy50ZXh0ICsgJyAnIDogJycpO1xyXG4gICAgICAgICAgICBzZWxmLl9sb2FkZXIgPSAkKHRwbCk7XHJcblxyXG4gICAgICAgICAgICAvLyBEaXNhYmxlIHRoZSBlbGVtZW50XHJcbiAgICAgICAgICAgIGlmICgkKHNlbGYuZWxlbWVudCkuaXMoXCJpbnB1dCwgdGV4dGFyZWFcIikgJiYgdHJ1ZSA9PT0gc2VsZi5vcHRpb25zLmRpc2FibGVTb3VyY2UpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAkKHNlbGYuZWxlbWVudCkuYXR0cihcImRpc2FibGVkXCIsIFwiZGlzYWJsZWRcIik7XHJcblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHRydWUgPT09IHNlbGYub3B0aW9ucy5kaXNhYmxlU291cmNlKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgJChzZWxmLmVsZW1lbnQpLmFkZENsYXNzKFwiZGlzYWJsZWRcIik7XHJcblxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBTZXQgcG9zaXRpb25cclxuICAgICAgICAgICAgc3dpdGNoIChzZWxmLm9wdGlvbnMucG9zaXRpb24pIHtcclxuXHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiaW5zaWRlXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgJChzZWxmLmVsZW1lbnQpLmh0bWwoc2VsZi5fbG9hZGVyKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgICAgICBjYXNlIFwib3ZlcmxheVwiOlxyXG4gICAgICAgICAgICAgICAgICAgIHZhciAkd3JhcHBlclRwbCA9IG51bGw7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICgkKHNlbGYuZWxlbWVudCkuaXMoXCJib2R5XCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICR3cmFwcGVyVHBsID0gJCgnPGRpdiBjbGFzcz1cImlzbG9hZGluZy1vdmVybGF5XCIgc3R5bGU9XCJwb3NpdGlvbjpmaXhlZDsgbGVmdDowOyB0b3A6MDsgei1pbmRleDogMTAwMDA7IGJhY2tncm91bmQ6IHJnYmEoMCwwLDAsMC41KTsgd2lkdGg6IDEwMCU7IGhlaWdodDogJyArICQod2luZG93KS5oZWlnaHQoKSArICdweDtcIiAvPicpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAkKFwiYm9keVwiKS5wcmVwZW5kKCR3cmFwcGVyVHBsKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICQod2luZG93KS5vbigncmVzaXplJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHdyYXBwZXJUcGwuaGVpZ2h0KCQod2luZG93KS5oZWlnaHQoKSArICdweCcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fbG9hZGVyLmNzcyh7IHRvcDogKCQod2luZG93KS5oZWlnaHQoKSAvIDIgLSBzZWxmLl9sb2FkZXIub3V0ZXJIZWlnaHQoKSAvIDIpICsgJ3B4JyB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNzc1Bvc2l0aW9uID0gJChzZWxmLmVsZW1lbnQpLmNzcygncG9zaXRpb24nKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcyA9IHt9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ID0gJChzZWxmLmVsZW1lbnQpLm91dGVySGVpZ2h0KCkgKyAncHgnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSAnMTAwJSc7IC8vICQoIHNlbGYuZWxlbWVudCApLm91dGVyV2lkdGgoKSArICdweDtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgncmVsYXRpdmUnID09PSBjc3NQb3NpdGlvbiB8fCAnYWJzb2x1dGUnID09PSBjc3NQb3NpdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zID0geyAndG9wJzogMCwgJ2xlZnQnOiAwIH07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3MgPSAkKHNlbGYuZWxlbWVudCkucG9zaXRpb24oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAkd3JhcHBlclRwbCA9ICQoJzxkaXYgY2xhc3M9XCJpc2xvYWRpbmctb3ZlcmxheVwiIHN0eWxlPVwicG9zaXRpb246YWJzb2x1dGU7IHRvcDogJyArIHBvcy50b3AgKyAncHg7IGxlZnQ6ICcgKyBwb3MubGVmdCArICdweDsgei1pbmRleDogMTAwMDA7IGJhY2tncm91bmQ6IHJnYmEoMCwwLDAsMC41KTsgd2lkdGg6ICcgKyB3aWR0aCArICc7IGhlaWdodDogJyArIGhlaWdodCArICc7XCIgLz4nKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLmVsZW1lbnQpLnByZXBlbmQoJHdyYXBwZXJUcGwpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgJCh3aW5kb3cpLm9uKCdyZXNpemUnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkd3JhcHBlclRwbC5oZWlnaHQoJChzZWxmLmVsZW1lbnQpLm91dGVySGVpZ2h0KCkgKyAncHgnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2xvYWRlci5jc3MoeyB0b3A6ICgkd3JhcHBlclRwbC5vdXRlckhlaWdodCgpIC8gMiAtIHNlbGYuX2xvYWRlci5vdXRlckhlaWdodCgpIC8gMikgKyAncHgnIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICR3cmFwcGVyVHBsLmh0bWwoc2VsZi5fbG9hZGVyKTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLl9sb2FkZXIuY3NzKHsgdG9wOiAoJHdyYXBwZXJUcGwub3V0ZXJIZWlnaHQoKSAvIDIgLSBzZWxmLl9sb2FkZXIub3V0ZXJIZWlnaHQoKSAvIDIpICsgJ3B4JyB9KTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgICQoc2VsZi5lbGVtZW50KS5hZnRlcihzZWxmLl9sb2FkZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBzZWxmLmRpc2FibGVPdGhlcnMoKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBoaWRlOiBmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgICAgICAgICBpZiAoXCJvdmVybGF5XCIgPT09IHRoaXMub3B0aW9ucy5wb3NpdGlvbikge1xyXG5cclxuICAgICAgICAgICAgICAgICQodGhpcy5lbGVtZW50KS5maW5kKFwiLmlzbG9hZGluZy1vdmVybGF5XCIpLmZpcnN0KCkucmVtb3ZlKCk7XHJcblxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG5cclxuICAgICAgICAgICAgICAgICQodGhpcy5fbG9hZGVyKS5yZW1vdmUoKTtcclxuICAgICAgICAgICAgICAgICQodGhpcy5lbGVtZW50KS50ZXh0KCQodGhpcy5lbGVtZW50KS5hdHRyKFwiZGF0YS1pc2xvYWRpbmctbGFiZWxcIikpO1xyXG5cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgJCh0aGlzLmVsZW1lbnQpLnJlbW92ZUF0dHIoXCJkaXNhYmxlZFwiKS5yZW1vdmVDbGFzcyhcImRpc2FibGVkXCIpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5lbmFibGVPdGhlcnMoKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBkaXNhYmxlT3RoZXJzOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICQuZWFjaCh0aGlzLm9wdGlvbnMuZGlzYWJsZU90aGVycywgZnVuY3Rpb24gKGksIGUpIHtcclxuICAgICAgICAgICAgICAgIHZhciBlbHQgPSAkKGUpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGVsdC5pcyhcImJ1dHRvbiwgaW5wdXQsIHRleHRhcmVhXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZWx0LmF0dHIoXCJkaXNhYmxlZFwiLCBcImRpc2FibGVkXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZWx0LmFkZENsYXNzKFwiZGlzYWJsZWRcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIGVuYWJsZU90aGVyczogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAkLmVhY2godGhpcy5vcHRpb25zLmRpc2FibGVPdGhlcnMsIGZ1bmN0aW9uIChpLCBlKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZWx0ID0gJChlKTtcclxuICAgICAgICAgICAgICAgIGlmIChlbHQuaXMoXCJidXR0b24sIGlucHV0LCB0ZXh0YXJlYVwiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVsdC5yZW1vdmVBdHRyKFwiZGlzYWJsZWRcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBlbHQucmVtb3ZlQ2xhc3MoXCJkaXNhYmxlZFwiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICAvLyBDb25zdHJ1Y3RvclxyXG4gICAgJC5mbltwbHVnaW5OYW1lXSA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmIChvcHRpb25zICYmIFwiaGlkZVwiICE9PSBvcHRpb25zIHx8ICEkLmRhdGEodGhpcywgXCJwbHVnaW5fXCIgKyBwbHVnaW5OYW1lKSkge1xyXG4gICAgICAgICAgICAgICAgJC5kYXRhKHRoaXMsIFwicGx1Z2luX1wiICsgcGx1Z2luTmFtZSwgbmV3IFBsdWdpbih0aGlzLCBvcHRpb25zKSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZWx0ID0gJC5kYXRhKHRoaXMsIFwicGx1Z2luX1wiICsgcGx1Z2luTmFtZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKFwiaGlkZVwiID09PSBvcHRpb25zKSB7IGVsdC5oaWRlKCk7IH1cclxuICAgICAgICAgICAgICAgIGVsc2UgeyBlbHQuc2hvdygpOyB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH07XHJcblxyXG4gICAgY29udHJ1Y3QoKTtcclxuXHJcbn0pKGpRdWVyeSwgd2luZG93LCBkb2N1bWVudCk7XG59KS5jYWxsKGdsb2JhbCwgbW9kdWxlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCk7XG5cbn0pLmNhbGwodGhpcyx0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiID8gZ2xvYmFsIDogdHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgPyBzZWxmIDogdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdyA6IHt9KVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ6dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWxOamNtbHdkSE12YkdsaUwycHhkV1Z5ZVM1cGMyeHZZV1JwYm1jdWFuTWlYU3dpYm1GdFpYTWlPbHRkTENKdFlYQndhVzVuY3lJNklqdEJRVUZCTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFaUxDSm1hV3hsSWpvaVoyVnVaWEpoZEdWa0xtcHpJaXdpYzI5MWNtTmxVbTl2ZENJNklpSXNJbk52ZFhKalpYTkRiMjUwWlc1MElqcGJJbHh1T3lCcVVYVmxjbmtnUFNCbmJHOWlZV3d1YWxGMVpYSjVJRDBnY21WeGRXbHlaU2hjSW1weGRXVnllVndpS1R0Y2Jqc2dkbUZ5SUY5ZlluSnZkM05sY21sbWVWOXphR2x0WDNKbGNYVnBjbVZmWHoxeVpYRjFhWEpsT3lobWRXNWpkR2x2YmlCaWNtOTNjMlZ5YVdaNVUyaHBiU2h0YjJSMWJHVXNJR1JsWm1sdVpTd2djbVZ4ZFdseVpTa2dlMXh1Nzd1L0x5b3FYSEpjYmlvZ1RHOWhaR2x1WnlCd2JIVm5hVzRnWm05eUlHcFJkV1Z5ZVZ4eVhHNHFJSFpsY25OcGIyNDZJSFl4TGpBdU5seHlYRzRxSUZ4eVhHNHFJRk50WVd4c0lHaGxiSEJsY2lCMGJ5Qm5hWFpsSUhSb1pTQjFjMlZ5SUdFZ2RtbHpkV0ZzSUdabFpXUmlZV05ySUhSb1lYUWdjMjl0WlhSb2FXNW5JR2x6SUdoaGNIQmxibWx1WnlCY2NseHVLaUIzYUdWdUlHWmxkR05vYVc1bkwzQnZjM1JwYm1jZ1pHRjBZVnh5WEc0cUlGeHlYRzRxSUZWVFFVZEZPbHh5WEc0cUlDMGdaMnh2WW1Gc0lHOTJaWEpzWVhrNklDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdKQzVwYzB4dllXUnBibWNvS1R0Y2NseHVLaUF0SUhWelpTQnFZWFpoYzJOeWFYQjBPaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNRb0lITmxiR1ZqZEc5eUlDa3VhWE5NYjJGa2FXNW5LQ2s3WEhKY2Jpb2dMU0JQYmlCdWIyNHRabTl5YlNCbGJHVnRaVzUwY3pvZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FrS0Z3aVpHbDJYQ0lwTG1selRHOWhaR2x1WnloN0lIUmxlSFE2SUZ3aVRHOWhaR2x1WjF3aUxDQndiM05wZEdsdmJqb25hVzV6YVdSbEozMHBPMXh5WEc0cUlDMGdjbVZ0YjNabElIUm9aU0JzYjJGa2FXNW5JR1ZzWlcxbGJuUTZJQ0FnSUNBZ0lDQWdKQ2dnYzJWc1pXTjBiM0lnS1M1cGMweHZZV1JwYm1jb0lGd2lhR2xrWlZ3aUlDazdYSEpjYmlwY2NseHVLaUJBWVhWMGFHOXlJRXhoZFhKbGJuUWdRbXhoYm1WeklEeHNZWFZ5Wlc1MExtSnNZVzVsYzBCbmJXRnBiQzVqYjIwK1hISmNiaW9nTFMwdFhISmNiaW9nUTI5d2VYSnBaMmgwSURJd01UTXNJRXhoZFhKbGJuUWdRbXhoYm1WeklDZ2dhSFIwY0hNNkx5OW5hWFJvZFdJdVkyOXRMMmhsYTJsbllXNHZhWE10Ykc5aFpHbHVaeUFwWEhKY2Jpb2dYSEpjYmlvZ1ZHaGxJRTFKVkNCTWFXTmxibk5sSUNoTlNWUXBYSEpjYmlvZ1hISmNiaW9nUTI5d2VYSnBaMmgwSUNoaktTQXlNREV6SUV4aGRYSmxiblFnUW14aGJtVnpYSEpjYmlvZ1hISmNiaW9nVUdWeWJXbHpjMmx2YmlCcGN5Qm9aWEpsWW5rZ1ozSmhiblJsWkN3Z1puSmxaU0J2WmlCamFHRnlaMlVzSUhSdklHRnVlU0J3WlhKemIyNGdiMkowWVdsdWFXNW5JR0VnWTI5d2VWeHlYRzRxSUc5bUlIUm9hWE1nYzI5bWRIZGhjbVVnWVc1a0lHRnpjMjlqYVdGMFpXUWdaRzlqZFcxbGJuUmhkR2x2YmlCbWFXeGxjeUFvZEdobElGd2lVMjltZEhkaGNtVmNJaWtzSUhSdklHUmxZV3hjY2x4dUtpQnBiaUIwYUdVZ1UyOW1kSGRoY21VZ2QybDBhRzkxZENCeVpYTjBjbWxqZEdsdmJpd2dhVzVqYkhWa2FXNW5JSGRwZEdodmRYUWdiR2x0YVhSaGRHbHZiaUIwYUdVZ2NtbG5hSFJ6WEhKY2Jpb2dkRzhnZFhObExDQmpiM0I1TENCdGIyUnBabmtzSUcxbGNtZGxMQ0J3ZFdKc2FYTm9MQ0JrYVhOMGNtbGlkWFJsTENCemRXSnNhV05sYm5ObExDQmhibVF2YjNJZ2MyVnNiRnh5WEc0cUlHTnZjR2xsY3lCdlppQjBhR1VnVTI5bWRIZGhjbVVzSUdGdVpDQjBieUJ3WlhKdGFYUWdjR1Z5YzI5dWN5QjBieUIzYUc5dElIUm9aU0JUYjJaMGQyRnlaU0JwYzF4eVhHNHFJR1oxY201cGMyaGxaQ0IwYnlCa2J5QnpieXdnYzNWaWFtVmpkQ0IwYnlCMGFHVWdabTlzYkc5M2FXNW5JR052Ym1ScGRHbHZibk02WEhKY2Jpb2dYSEpjYmlvZ1ZHaGxJR0ZpYjNabElHTnZjSGx5YVdkb2RDQnViM1JwWTJVZ1lXNWtJSFJvYVhNZ2NHVnliV2x6YzJsdmJpQnViM1JwWTJVZ2MyaGhiR3dnWW1VZ2FXNWpiSFZrWldRZ2FXNWNjbHh1S2lCaGJHd2dZMjl3YVdWeklHOXlJSE4xWW5OMFlXNTBhV0ZzSUhCdmNuUnBiMjV6SUc5bUlIUm9aU0JUYjJaMGQyRnlaUzVjY2x4dUtpQmNjbHh1S2lCVVNFVWdVMDlHVkZkQlVrVWdTVk1nVUZKUFZrbEVSVVFnWENKQlV5QkpVMXdpTENCWFNWUklUMVZVSUZkQlVsSkJUbFJaSUU5R0lFRk9XU0JMU1U1RUxDQkZXRkJTUlZOVElFOVNYSEpjYmlvZ1NVMVFURWxGUkN3Z1NVNURURlZFU1U1SElFSlZWQ0JPVDFRZ1RFbE5TVlJGUkNCVVR5QlVTRVVnVjBGU1VrRk9WRWxGVXlCUFJpQk5SVkpEU0VGT1ZFRkNTVXhKVkZrc1hISmNiaW9nUmtsVVRrVlRVeUJHVDFJZ1FTQlFRVkpVU1VOVlRFRlNJRkJWVWxCUFUwVWdRVTVFSUU1UFRrbE9SbEpKVGtkRlRVVk9WQzRnU1U0Z1RrOGdSVlpGVGxRZ1UwaEJURXdnVkVoRlhISmNiaW9nUVZWVVNFOVNVeUJQVWlCRFQxQlpVa2xIU0ZRZ1NFOU1SRVZTVXlCQ1JTQk1TVUZDVEVVZ1JrOVNJRUZPV1NCRFRFRkpUU3dnUkVGTlFVZEZVeUJQVWlCUFZFaEZVbHh5WEc0cUlFeEpRVUpKVEVsVVdTd2dWMGhGVkVoRlVpQkpUaUJCVGlCQlExUkpUMDRnVDBZZ1EwOU9WRkpCUTFRc0lGUlBVbFFnVDFJZ1QxUklSVkpYU1ZORkxDQkJVa2xUU1U1SElFWlNUMDBzWEhKY2Jpb2dUMVZVSUU5R0lFOVNJRWxPSUVOUFRrNUZRMVJKVDA0Z1YwbFVTQ0JVU0VVZ1UwOUdWRmRCVWtVZ1QxSWdWRWhGSUZWVFJTQlBVaUJQVkVoRlVpQkVSVUZNU1U1SFV5QkpUbHh5WEc0cUlGUklSU0JUVDBaVVYwRlNSUzVjY2x4dUtpOWNjbHh1T3lBb1puVnVZM1JwYjI0Z0tDUXNJSGRwYm1SdmR5d2daRzlqZFcxbGJuUXNJSFZ1WkdWbWFXNWxaQ2tnZTF4eVhHNWNjbHh1SUNBZ0lDOHZJRU55WldGMFpTQjBhR1VnWkdWbVlYVnNkSE1nYjI1alpWeHlYRzRnSUNBZ2RtRnlJSEJzZFdkcGJrNWhiV1VnUFNCY0ltbHpURzloWkdsdVoxd2lMRnh5WEc0Z0lDQWdJQ0FnSUdSbFptRjFiSFJ6SUQwZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBbmNHOXphWFJwYjI0bk9pQmNJbkpwWjJoMFhDSXNJQ0FnSUNBZ0lDQXZMeUJ5YVdkb2RDQjhJR2x1YzJsa1pTQjhJRzkyWlhKc1lYbGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0ozUmxlSFFuT2lCY0lsd2lMQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdMeThnVkdWNGRDQjBieUJrYVhOd2JHRjVJRzVsZUhRZ2RHOGdkR2hsSUd4dllXUmxjbHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQW5ZMnhoYzNNbk9pQmNJbWxqYjI0dGNtVm1jbVZ6YUZ3aUxDQWdJQ0F2THlCc2IyRmtaWElnUTFOVElHTnNZWE56WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ2QwY0d3bk9pQW5QSE53WVc0Z1kyeGhjM005WENKcGMyeHZZV1JwYm1jdGQzSmhjSEJsY2lBbGQzSmhjSEJsY2lWY0lqNGxkR1Y0ZENVOGFTQmpiR0Z6Y3oxY0lpVmpiR0Z6Y3lVZ2FXTnZiaTF6Y0dsdVhDSStQQzlwUGp3dmMzQmhiajRuTENBZ0lDQXZMeUJzYjJGa1pYSWdZbUZ6WlNCVVlXZGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0oyUnBjMkZpYkdWVGIzVnlZMlVuT2lCMGNuVmxMQ0FnSUNBZ0lDOHZJSFJ5ZFdVZ2ZDQm1ZV3h6WlZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FuWkdsellXSnNaVTkwYUdWeWN5YzZJRnRkWEhKY2JpQWdJQ0FnSUNBZ2ZUdGNjbHh1WEhKY2JpQWdJQ0F2THlCVWFHVWdZV04wZFdGc0lIQnNkV2RwYmlCamIyNXpkSEoxWTNSdmNseHlYRzRnSUNBZ1puVnVZM1JwYjI0Z1VHeDFaMmx1S0dWc1pXMWxiblFzSUc5d2RHbHZibk1wSUh0Y2NseHVJQ0FnSUNBZ0lDQjBhR2x6TG1Wc1pXMWxiblFnUFNCbGJHVnRaVzUwTzF4eVhHNWNjbHh1SUNBZ0lDQWdJQ0F2THlCTlpYSm5aU0IxYzJWeUlHOXdkR2x2Ym5NZ2QybDBhQ0JrWldaaGRXeDBJRzl1WlhOY2NseHVJQ0FnSUNBZ0lDQjBhR2x6TG05d2RHbHZibk1nUFNBa0xtVjRkR1Z1WkNoN2ZTd2daR1ZtWVhWc2RITXNJRzl3ZEdsdmJuTXBPMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQjBhR2x6TGw5a1pXWmhkV3gwY3lBOUlHUmxabUYxYkhSek8xeHlYRzRnSUNBZ0lDQWdJSFJvYVhNdVgyNWhiV1VnUFNCd2JIVm5hVzVPWVcxbE8xeHlYRzRnSUNBZ0lDQWdJSFJvYVhNdVgyeHZZV1JsY2lBOUlHNTFiR3c3SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQzh2SUVOdmJuUmhhVzRnZEdobElHeHZZV1JwYm1jZ2RHRm5JR1ZzWlcxbGJuUmNjbHh1WEhKY2JpQWdJQ0FnSUNBZ2RHaHBjeTVwYm1sMEtDazdYSEpjYmlBZ0lDQjlYSEpjYmx4eVhHNGdJQ0FnTHk4Z1EyOXVkSEoxWTNSdmNpQm1kVzVqZEdsdmJpQm1iM0lnZEdobElIQnNkV2RwYmlBb2IyNXNlU0J2Ym1ObElHOXVJSEJoWjJVZ2JHOWhaQ2xjY2x4dUlDQWdJR1oxYm1OMGFXOXVJR052Ym5SeWRXTjBLQ2tnZTF4eVhHNWNjbHh1SUNBZ0lDQWdJQ0JwWmlBb0lTUmJjR3gxWjJsdVRtRnRaVjBwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSkM1cGMweHZZV1JwYm1jZ1BTQm1kVzVqZEdsdmJpQW9iM0IwY3lrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdKQ2hjSW1KdlpIbGNJaWt1YVhOTWIyRmthVzVuS0c5d2RITXBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlPMXh5WEc0Z0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQlFiSFZuYVc0dWNISnZkRzkwZVhCbElEMGdlMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQnBibWwwT2lCbWRXNWpkR2x2YmlBb0tTQjdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb0pDaDBhR2x6TG1Wc1pXMWxiblFwTG1sektGd2lZbTlrZVZ3aUtTa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NXZjSFJwYjI1ekxuQnZjMmwwYVc5dUlEMGdYQ0p2ZG1WeWJHRjVYQ0k3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1emFHOTNLQ2s3WEhKY2JpQWdJQ0FnSUNBZ2ZTeGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ2MyaHZkem9nWm5WdVkzUnBiMjRnS0NrZ2UxeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdkbUZ5SUhObGJHWWdQU0IwYUdsekxGeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkSEJzSUQwZ2MyVnNaaTV2Y0hScGIyNXpMblJ3YkM1eVpYQnNZV05sS0NjbGQzSmhjSEJsY2lVbkxDQW5JR2x6Ykc5aFpHbHVaeTF6YUc5M0lDY2dLeUFuSUdsemJHOWhaR2x1WnkwbklDc2djMlZzWmk1dmNIUnBiMjV6TG5CdmMybDBhVzl1S1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZEhCc0lEMGdkSEJzTG5KbGNHeGhZMlVvSnlWamJHRnpjeVVuTENCelpXeG1MbTl3ZEdsdmJuTmJKMk5zWVhOekoxMHBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjBjR3dnUFNCMGNHd3VjbVZ3YkdGalpTZ25KWFJsZUhRbEp5d2dLSE5sYkdZdWIzQjBhVzl1Y3k1MFpYaDBJQ0U5UFNCY0lsd2lLU0EvSUhObGJHWXViM0IwYVc5dWN5NTBaWGgwSUNzZ0p5QW5JRG9nSnljcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCelpXeG1MbDlzYjJGa1pYSWdQU0FrS0hSd2JDazdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0F2THlCRWFYTmhZbXhsSUhSb1pTQmxiR1Z0Wlc1MFhISmNiaUFnSUNBZ0lDQWdJQ0FnSUdsbUlDZ2tLSE5sYkdZdVpXeGxiV1Z1ZENrdWFYTW9YQ0pwYm5CMWRDd2dkR1Y0ZEdGeVpXRmNJaWtnSmlZZ2RISjFaU0E5UFQwZ2MyVnNaaTV2Y0hScGIyNXpMbVJwYzJGaWJHVlRiM1Z5WTJVcElIdGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBa0tITmxiR1l1Wld4bGJXVnVkQ2t1WVhSMGNpaGNJbVJwYzJGaWJHVmtYQ0lzSUZ3aVpHbHpZV0pzWldSY0lpazdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJR1ZzYzJVZ2FXWWdLSFJ5ZFdVZ1BUMDlJSE5sYkdZdWIzQjBhVzl1Y3k1a2FYTmhZbXhsVTI5MWNtTmxLU0I3WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdKQ2h6Wld4bUxtVnNaVzFsYm5RcExtRmtaRU5zWVhOektGd2laR2x6WVdKc1pXUmNJaWs3WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNCOVhISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQXZMeUJUWlhRZ2NHOXphWFJwYjI1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnYzNkcGRHTm9JQ2h6Wld4bUxtOXdkR2x2Ym5NdWNHOXphWFJwYjI0cElIdGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCallYTmxJRndpYVc1emFXUmxYQ0k2WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdKQ2h6Wld4bUxtVnNaVzFsYm5RcExtaDBiV3dvYzJWc1ppNWZiRzloWkdWeUtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCaWNtVmhhenRjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmpZWE5sSUZ3aWIzWmxjbXhoZVZ3aU9seHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhaaGNpQWtkM0poY0hCbGNsUndiQ0E5SUc1MWJHdzdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtSUNna0tITmxiR1l1Wld4bGJXVnVkQ2t1YVhNb1hDSmliMlI1WENJcEtTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ1IzY21Gd2NHVnlWSEJzSUQwZ0pDZ25QR1JwZGlCamJHRnpjejFjSW1semJHOWhaR2x1WnkxdmRtVnliR0Y1WENJZ2MzUjViR1U5WENKd2IzTnBkR2x2YmpwbWFYaGxaRHNnYkdWbWREb3dPeUIwYjNBNk1Ec2dlaTFwYm1SbGVEb2dNVEF3TURBN0lHSmhZMnRuY205MWJtUTZJSEpuWW1Fb01Dd3dMREFzTUM0MUtUc2dkMmxrZEdnNklERXdNQ1U3SUdobGFXZG9kRG9nSnlBcklDUW9kMmx1Wkc5M0tTNW9aV2xuYUhRb0tTQXJJQ2R3ZUR0Y0lpQXZQaWNwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBa0tGd2lZbTlrZVZ3aUtTNXdjbVZ3Wlc1a0tDUjNjbUZ3Y0dWeVZIQnNLVHRjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDUW9kMmx1Wkc5M0tTNXZiaWduY21WemFYcGxKeXdnWm5WdVkzUnBiMjRnS0NrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSkhkeVlYQndaWEpVY0d3dWFHVnBaMmgwS0NRb2QybHVaRzkzS1M1b1pXbG5hSFFvS1NBcklDZHdlQ2NwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjMlZzWmk1ZmJHOWhaR1Z5TG1OemN5aDdJSFJ2Y0RvZ0tDUW9kMmx1Wkc5M0tTNW9aV2xuYUhRb0tTQXZJRElnTFNCelpXeG1MbDlzYjJGa1pYSXViM1YwWlhKSVpXbG5hSFFvS1NBdklESXBJQ3NnSjNCNEp5QjlLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlNrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlNCbGJITmxJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZG1GeUlHTnpjMUJ2YzJsMGFXOXVJRDBnSkNoelpXeG1MbVZzWlcxbGJuUXBMbU56Y3lnbmNHOXphWFJwYjI0bktTeGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhCdmN5QTlJSHQ5TEZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhR1ZwWjJoMElEMGdKQ2h6Wld4bUxtVnNaVzFsYm5RcExtOTFkR1Z5U0dWcFoyaDBLQ2tnS3lBbmNIZ25MRnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2QybGtkR2dnUFNBbk1UQXdKU2M3SUM4dklDUW9JSE5sYkdZdVpXeGxiV1Z1ZENBcExtOTFkR1Z5VjJsa2RHZ29LU0FySUNkd2VEdGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbUlDZ25jbVZzWVhScGRtVW5JRDA5UFNCamMzTlFiM05wZEdsdmJpQjhmQ0FuWVdKemIyeDFkR1VuSUQwOVBTQmpjM05RYjNOcGRHbHZiaWtnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjRzl6SUQwZ2V5QW5kRzl3SnpvZ01Dd2dKMnhsWm5Rbk9pQXdJSDA3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgwZ1pXeHpaU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQndiM01nUFNBa0tITmxiR1l1Wld4bGJXVnVkQ2t1Y0c5emFYUnBiMjRvS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWtkM0poY0hCbGNsUndiQ0E5SUNRb0p6eGthWFlnWTJ4aGMzTTlYQ0pwYzJ4dllXUnBibWN0YjNabGNteGhlVndpSUhOMGVXeGxQVndpY0c5emFYUnBiMjQ2WVdKemIyeDFkR1U3SUhSdmNEb2dKeUFySUhCdmN5NTBiM0FnS3lBbmNIZzdJR3hsWm5RNklDY2dLeUJ3YjNNdWJHVm1kQ0FySUNkd2VEc2dlaTFwYm1SbGVEb2dNVEF3TURBN0lHSmhZMnRuY205MWJtUTZJSEpuWW1Fb01Dd3dMREFzTUM0MUtUc2dkMmxrZEdnNklDY2dLeUIzYVdSMGFDQXJJQ2M3SUdobGFXZG9kRG9nSnlBcklHaGxhV2RvZENBcklDYzdYQ0lnTHo0bktUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdKQ2h6Wld4bUxtVnNaVzFsYm5RcExuQnlaWEJsYm1Rb0pIZHlZWEJ3WlhKVWNHd3BPMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0pDaDNhVzVrYjNjcExtOXVLQ2R5WlhOcGVtVW5MQ0JtZFc1amRHbHZiaUFvS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FrZDNKaGNIQmxjbFJ3YkM1b1pXbG5hSFFvSkNoelpXeG1MbVZzWlcxbGJuUXBMbTkxZEdWeVNHVnBaMmgwS0NrZ0t5QW5jSGduS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSE5sYkdZdVgyeHZZV1JsY2k1amMzTW9leUIwYjNBNklDZ2tkM0poY0hCbGNsUndiQzV2ZFhSbGNraGxhV2RvZENncElDOGdNaUF0SUhObGJHWXVYMnh2WVdSbGNpNXZkWFJsY2tobGFXZG9kQ2dwSUM4Z01pa2dLeUFuY0hnbklIMHBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5S1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNSM2NtRndjR1Z5VkhCc0xtaDBiV3dvYzJWc1ppNWZiRzloWkdWeUtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCelpXeG1MbDlzYjJGa1pYSXVZM056S0hzZ2RHOXdPaUFvSkhkeVlYQndaWEpVY0d3dWIzVjBaWEpJWldsbmFIUW9LU0F2SURJZ0xTQnpaV3htTGw5c2IyRmtaWEl1YjNWMFpYSklaV2xuYUhRb0tTQXZJRElwSUNzZ0ozQjRKeUI5S1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JpY21WaGF6dGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCa1pXWmhkV3gwT2x4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ1FvYzJWc1ppNWxiR1Z0Wlc1MEtTNWhablJsY2loelpXeG1MbDlzYjJGa1pYSXBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHSnlaV0ZyTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNCelpXeG1MbVJwYzJGaWJHVlBkR2hsY25Nb0tUdGNjbHh1SUNBZ0lDQWdJQ0I5TEZ4eVhHNWNjbHh1SUNBZ0lDQWdJQ0JvYVdSbE9pQm1kVzVqZEdsdmJpQW9LU0I3WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNCcFppQW9YQ0p2ZG1WeWJHRjVYQ0lnUFQwOUlIUm9hWE11YjNCMGFXOXVjeTV3YjNOcGRHbHZiaWtnZTF4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ1FvZEdocGN5NWxiR1Z0Wlc1MEtTNW1hVzVrS0Z3aUxtbHpiRzloWkdsdVp5MXZkbVZ5YkdGNVhDSXBMbVpwY25OMEtDa3VjbVZ0YjNabEtDazdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0I5SUdWc2MyVWdlMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDUW9kR2hwY3k1ZmJHOWhaR1Z5S1M1eVpXMXZkbVVvS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDUW9kR2hwY3k1bGJHVnRaVzUwS1M1MFpYaDBLQ1FvZEdocGN5NWxiR1Z0Wlc1MEtTNWhkSFJ5S0Z3aVpHRjBZUzFwYzJ4dllXUnBibWN0YkdGaVpXeGNJaWtwTzF4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdKQ2gwYUdsekxtVnNaVzFsYm5RcExuSmxiVzkyWlVGMGRISW9YQ0prYVhOaFlteGxaRndpS1M1eVpXMXZkbVZEYkdGemN5aGNJbVJwYzJGaWJHVmtYQ0lwTzF4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTVsYm1GaWJHVlBkR2hsY25Nb0tUdGNjbHh1SUNBZ0lDQWdJQ0I5TEZ4eVhHNWNjbHh1SUNBZ0lDQWdJQ0JrYVhOaFlteGxUM1JvWlhKek9pQm1kVzVqZEdsdmJpQW9LU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ1F1WldGamFDaDBhR2x6TG05d2RHbHZibk11WkdsellXSnNaVTkwYUdWeWN5d2dablZ1WTNScGIyNGdLR2tzSUdVcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFpoY2lCbGJIUWdQU0FrS0dVcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1lnS0dWc2RDNXBjeWhjSW1KMWRIUnZiaXdnYVc1d2RYUXNJSFJsZUhSaGNtVmhYQ0lwS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWld4MExtRjBkSElvWENKa2FYTmhZbXhsWkZ3aUxDQmNJbVJwYzJGaWJHVmtYQ0lwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdaV3h6WlNCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWld4MExtRmtaRU5zWVhOektGd2laR2x6WVdKc1pXUmNJaWs3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUgwcE8xeHlYRzRnSUNBZ0lDQWdJSDBzWEhKY2JseHlYRzRnSUNBZ0lDQWdJR1Z1WVdKc1pVOTBhR1Z5Y3pvZ1puVnVZM1JwYjI0Z0tDa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWtMbVZoWTJnb2RHaHBjeTV2Y0hScGIyNXpMbVJwYzJGaWJHVlBkR2hsY25Nc0lHWjFibU4wYVc5dUlDaHBMQ0JsS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjJZWElnWld4MElEMGdKQ2hsS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2hsYkhRdWFYTW9YQ0ppZFhSMGIyNHNJR2x1Y0hWMExDQjBaWGgwWVhKbFlWd2lLU2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR1ZzZEM1eVpXMXZkbVZCZEhSeUtGd2laR2x6WVdKc1pXUmNJaWs3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmxiSE5sSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JsYkhRdWNtVnRiM1psUTJ4aGMzTW9YQ0prYVhOaFlteGxaRndpS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2ZTazdYSEpjYmlBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnZlR0Y2NseHVYSEpjYmlBZ0lDQXZMeUJEYjI1emRISjFZM1J2Y2x4eVhHNGdJQ0FnSkM1bWJsdHdiSFZuYVc1T1lXMWxYU0E5SUdaMWJtTjBhVzl1SUNodmNIUnBiMjV6S1NCN1hISmNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlIUm9hWE11WldGamFDaG1kVzVqZEdsdmJpQW9LU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJR2xtSUNodmNIUnBiMjV6SUNZbUlGd2lhR2xrWlZ3aUlDRTlQU0J2Y0hScGIyNXpJSHg4SUNFa0xtUmhkR0VvZEdocGN5d2dYQ0p3YkhWbmFXNWZYQ0lnS3lCd2JIVm5hVzVPWVcxbEtTa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSkM1a1lYUmhLSFJvYVhNc0lGd2ljR3gxWjJsdVgxd2lJQ3NnY0d4MVoybHVUbUZ0WlN3Z2JtVjNJRkJzZFdkcGJpaDBhR2x6TENCdmNIUnBiMjV6S1NrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUgwZ1pXeHpaU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMllYSWdaV3gwSUQwZ0pDNWtZWFJoS0hSb2FYTXNJRndpY0d4MVoybHVYMXdpSUNzZ2NHeDFaMmx1VG1GdFpTazdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLRndpYUdsa1pWd2lJRDA5UFNCdmNIUnBiMjV6S1NCN0lHVnNkQzVvYVdSbEtDazdJSDFjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdWc2MyVWdleUJsYkhRdWMyaHZkeWdwT3lCOVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ0lDQjlLVHRjY2x4dUlDQWdJSDA3WEhKY2JseHlYRzRnSUNBZ1kyOXVkSEoxWTNRb0tUdGNjbHh1WEhKY2JuMHBLR3BSZFdWeWVTd2dkMmx1Wkc5M0xDQmtiMk4xYldWdWRDazdYRzU5S1M1allXeHNLR2RzYjJKaGJDd2diVzlrZFd4bExDQjFibVJsWm1sdVpXUXNJSFZ1WkdWbWFXNWxaQ2s3WEc0aVhYMD0iLCIoZnVuY3Rpb24gKGdsb2JhbCl7XG5cbjsgYm9vdHN0cmFwID0gZ2xvYmFsLmJvb3RzdHJhcCA9IHJlcXVpcmUoXCJib290c3RyYXBcIik7XG5tb21lbnQgPSBnbG9iYWwubW9tZW50ID0gcmVxdWlyZShcIm1vbWVudFwiKTtcbmpRdWVyeSA9IGdsb2JhbC5qUXVlcnkgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xua28gPSBnbG9iYWwua28gPSByZXF1aXJlKFwia25vY2tvdXRcIik7XG47IHZhciBfX2Jyb3dzZXJpZnlfc2hpbV9yZXF1aXJlX189cmVxdWlyZTsoZnVuY3Rpb24gYnJvd3NlcmlmeVNoaW0obW9kdWxlLCBkZWZpbmUsIHJlcXVpcmUpIHtcbihmdW5jdGlvbiAoJCwga28sIG1vbWVudCwgdW5kZWZpbmVkKSB7XHJcblxyXG4gICAgLy8jcmVnaW9uIFV0aWxzXHJcblxyXG4gICAgdmFyIGRldGVjdERhdGFUeXBlID0gZnVuY3Rpb24gKHZhbHVlKSB7XHJcbiAgICAgICAgZm9yICh2YXIgZm5hbWUgaW4gZGV0ZWN0RGF0YVR5cGUudHlwZURldGVjdGlvbikge1xyXG4gICAgICAgICAgICB2YXIgZiA9IGRldGVjdERhdGFUeXBlW2ZuYW1lXTtcclxuICAgICAgICAgICAgaWYgKGYodmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZGV0ZWN0RGF0YVR5cGUudHlwZURldGVjdGlvbltmbmFtZV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9O1xyXG5cclxuICAgIGRldGVjdERhdGFUeXBlLmlzU3RyaW5nID0gZnVuY3Rpb24gKHZhbHVlKSB7XHJcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZyc7XHJcbiAgICB9O1xyXG4gICAgZGV0ZWN0RGF0YVR5cGUuaXNEYXRlID0gZnVuY3Rpb24gKHZhbHVlKSB7XHJcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gXCJbb2JqZWN0IERhdGVdXCI7XHJcbiAgICB9O1xyXG4gICAgZGV0ZWN0RGF0YVR5cGUuaXNNb21lbnQgPSBmdW5jdGlvbiAodmFsdWUpIHtcclxuICAgICAgICByZXR1cm4gbW9tZW50LmlzTW9tZW50KHZhbHVlKTtcclxuICAgIH07XHJcbiAgICBkZXRlY3REYXRhVHlwZS50eXBlRGV0ZWN0aW9uID0ge1xyXG4gICAgICAgIFwiaXNNb21lbnRcIjogXCJtb21lbnRcIixcclxuICAgICAgICBcImlzU3RyaW5nXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgXCJpc0RhdGVcIjogXCJkYXRlXCJcclxuICAgIH07XHJcblxyXG4gICAgdmFyIGVsQmluZGVyID0gZnVuY3Rpb24oJGVsKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbih2YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB2YXIgZnVuY3MgPSBlbEJpbmRlci5mdW5jdGlvbnNbJGVsLmRhdGEoZWxCaW5kZXIuREFUQVRZUEVfS0VZKV0gfHwgZWxCaW5kZXIuZnVuY3Rpb25zWydfZGVmYXVsdCddO1xyXG4gICAgICAgICAgICAgICAgdmFyIGZ1bmMgPSBmdW5jc1snc2V0J10gfHwgZWxCaW5kZXIuZnVuY3Rpb25zWydfZGVmYXVsdCddWydzZXQnXTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmdW5jKCRlbCwgdmFsdWUpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGZ1bmNzID0gZWxCaW5kZXIuZnVuY3Rpb25zWyRlbC5kYXRhKGVsQmluZGVyLkRBVEFUWVBFX0tFWSldIHx8IGVsQmluZGVyLmZ1bmN0aW9uc1snX2RlZmF1bHQnXTtcclxuICAgICAgICAgICAgICAgIHZhciBmdW5jID0gZnVuY3NbJ2dldCddIHx8IGVsQmluZGVyLmZ1bmN0aW9uc1snX2RlZmF1bHQnXVsnZ2V0J107XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZnVuYygkZWwpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICByZWdpc3RlcjogZnVuY3Rpb24oZGF0YVR5cGUpIHtcclxuICAgICAgICAgICAgICAgICRlbC5kYXRhKGVsQmluZGVyLkRBVEFUWVBFX0tFWSwgZGF0YVR5cGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIFxyXG4gICAgZWxCaW5kZXIuREFUQVRZUEVfS0VZID0gXCJkYXRlcGlja2VyLmtvLmRhdGFUeXBlXCI7XHJcblxyXG4gICAgZWxCaW5kZXIuZnVuY3Rpb25zID0ge1xyXG4gICAgICAgICdfZGVmYXVsdCc6IHtcclxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoJGVsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJGVsLmRhdGVwaWNrZXIoJ2dldCcpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICgkZWwsIHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAkZWwuZGF0ZXBpY2tlcignc2V0JywgdmFsdWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICAnaXNvJzoge1xyXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgkZWwpIHtcclxuICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9ICRlbC5kYXRlcGlja2VyKCdnZXQnKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiAodmFsdWUgJiYgdmFsdWUuZm9ybWF0KCdZWVlZLU1NLUREJykpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICgkZWwsIHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgbW50ID0gbW9tZW50KHZhbHVlKTtcclxuICAgICAgICAgICAgICAgICRlbC5kYXRlcGlja2VyKCdzZXQnLCBtbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICAnZm9ybWF0Jzoge1xyXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgkZWwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAkZWwuZGF0ZXBpY2tlcignZ2V0QXNUZXh0Jyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgICdkYXRlJzoge1xyXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgkZWwpIHtcclxuICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9ICRlbC5kYXRlcGlja2VyKCdnZXQnKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiAodmFsdWUgJiYgdmFsdWUudG9EYXRlKCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICBrby5iaW5kaW5nSGFuZGxlcnMuZGF0ZXBpY2tlciA9IHtcclxuICAgICAgICBpbml0OiBmdW5jdGlvbiAoZWxlbWVudCwgdmFsdWVBY2Nlc3NvciwgYWxsQmluZGluZ3NBY2Nlc3Nvcikge1xyXG4gICAgICAgICAgICB2YXIgb3B0aW9ucyA9IGFsbEJpbmRpbmdzQWNjZXNzb3IoKS5kYXRlcGlja2VyT3B0aW9ucyB8fCB7fTtcclxuICAgICAgICAgICAgdmFyIGRhdGFUeXBlID0gb3B0aW9ucy5kYXRhVHlwZSB8fCBkZXRlY3REYXRhVHlwZShrby51dGlscy51bndyYXBPYnNlcnZhYmxlKHZhbHVlQWNjZXNzb3IoKSkpO1xyXG4gICAgICAgICAgICBkYXRhVHlwZSA9ICFkYXRhVHlwZSB8fCBkYXRhVHlwZSA9PSAnc3RyaW5nJyA/ICdpc28nIDogZGF0YVR5cGU7XHJcbiAgICAgICAgICAgIHZhciAkZWwgPSAkKGVsZW1lbnQpLmRhdGVwaWNrZXIob3B0aW9ucyk7XHJcblxyXG4gICAgICAgICAgICBlbEJpbmRlcigkZWwpLnJlZ2lzdGVyKGRhdGFUeXBlKTtcclxuXHJcbiAgICAgICAgICAgIGtvLnV0aWxzLnJlZ2lzdGVyRXZlbnRIYW5kbGVyKGVsZW1lbnQsIFwiY2hhbmdlRGF0ZVwiLCBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgICAgIHZhciBhY2Nlc3NvciA9IHZhbHVlQWNjZXNzb3IoKTtcclxuICAgICAgICAgICAgICAgIGlmIChrby5pc09ic2VydmFibGUoYWNjZXNzb3IpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gZWxCaW5kZXIoJGVsKS5nZXQoKTtcclxuICAgICAgICAgICAgICAgICAgICBhY2Nlc3Nvcih2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgdXBkYXRlOiBmdW5jdGlvbiAoZWxlbWVudCwgdmFsdWVBY2Nlc3Nvcikge1xyXG4gICAgICAgICAgICBlbEJpbmRlcigkKGVsZW1lbnQpKVxyXG4gICAgICAgICAgICAgICAgLnNldChrby51dGlscy51bndyYXBPYnNlcnZhYmxlKHZhbHVlQWNjZXNzb3IoKSkpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG5cclxuICAgIGtvLmJpbmRpbmdIYW5kbGVycy5kYXRldGltZXBpY2tlciA9IHtcclxuICAgICAgICBpbml0OiBmdW5jdGlvbiAoZWxlbWVudCwgdmFsdWVBY2Nlc3NvciwgYWxsQmluZGluZ3NBY2Nlc3Nvciwgdmlld01vZGVsLCBiaW5kaW5nQ29udGV4dCkge1xyXG4gICAgICAgICAgICAvL2luaXRpYWxpemUgZGF0ZXBpY2tlciB3aXRoIHNvbWUgb3B0aW9uYWwgb3B0aW9uc1xyXG4gICAgICAgICAgICB2YXIgb3B0aW9ucyA9IHtcclxuICAgICAgICAgICAgICAgIGZvcm1hdDogJ0REL01NL1lZWVkgaGg6bW0gQScsXHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0RGF0ZTogdmFsdWVBY2Nlc3NvcigpKClcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIGlmIChhbGxCaW5kaW5nc0FjY2Vzc29yKCkgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGFsbEJpbmRpbmdzQWNjZXNzb3IoKS5kYXRlcGlja2VyT3B0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5mb3JtYXQgPSBhbGxCaW5kaW5nc0FjY2Vzc29yKCkuZGF0ZXBpY2tlck9wdGlvbnMuZm9ybWF0ICE9PSB1bmRlZmluZWQgPyBhbGxCaW5kaW5nc0FjY2Vzc29yKCkuZGF0ZXBpY2tlck9wdGlvbnMuZm9ybWF0IDogb3B0aW9ucy5mb3JtYXQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICQoZWxlbWVudCkuZGF0ZXRpbWVwaWNrZXIob3B0aW9ucyk7XHJcblxyXG4gICAgICAgICAgICAvL3doZW4gYSB1c2VyIGNoYW5nZXMgdGhlIGRhdGUsIHVwZGF0ZSB0aGUgdmlldyBtb2RlbFxyXG4gICAgICAgICAgICBrby51dGlscy5yZWdpc3RlckV2ZW50SGFuZGxlcihlbGVtZW50LCBcImRwLmNoYW5nZVwiLCBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHZhbHVlQWNjZXNzb3IoKTtcclxuICAgICAgICAgICAgICAgIGlmIChrby5pc09ic2VydmFibGUodmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUoZXZlbnQuZGF0ZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgdXBkYXRlOiBmdW5jdGlvbiAoZWxlbWVudCwgdmFsdWVBY2Nlc3Nvcikge1xyXG4gICAgICAgICAgICBlbEJpbmRlcigkKGVsZW1lbnQpKVxyXG4gICAgICAgICAgICAgICAgLnNldChrby51dGlscy51bndyYXBPYnNlcnZhYmxlKHZhbHVlQWNjZXNzb3IoKSkpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbn0pKGpRdWVyeSwgdGhpcy5rbywgdGhpcy5tb21lbnQpO1xufSkuY2FsbChnbG9iYWwsIG1vZHVsZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQpO1xuXG59KS5jYWxsKHRoaXMsdHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiA/IGdsb2JhbCA6IHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiID8gc2VsZiA6IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgPyB3aW5kb3cgOiB7fSlcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0OnV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklsTmpjbWx3ZEhNdmJHbGlMMjF2YldWdWRDMWtZWFJsY0dsamEyVnlMV3R2TG1weklsMHNJbTVoYldWeklqcGJYU3dpYldGd2NHbHVaM01pT2lJN1FVRkJRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFTSXNJbVpwYkdVaU9pSm5aVzVsY21GMFpXUXVhbk1pTENKemIzVnlZMlZTYjI5MElqb2lJaXdpYzI5MWNtTmxjME52Ym5SbGJuUWlPbHNpWEc0N0lHSnZiM1J6ZEhKaGNDQTlJR2RzYjJKaGJDNWliMjkwYzNSeVlYQWdQU0J5WlhGMWFYSmxLRndpWW05dmRITjBjbUZ3WENJcE8xeHViVzl0Wlc1MElEMGdaMnh2WW1Gc0xtMXZiV1Z1ZENBOUlISmxjWFZwY21Vb1hDSnRiMjFsYm5SY0lpazdYRzVxVVhWbGNua2dQU0JuYkc5aVlXd3VhbEYxWlhKNUlEMGdjbVZ4ZFdseVpTaGNJbXB4ZFdWeWVWd2lLVHRjYm10dklEMGdaMnh2WW1Gc0xtdHZJRDBnY21WeGRXbHlaU2hjSW10dWIyTnJiM1YwWENJcE8xeHVPeUIyWVhJZ1gxOWljbTkzYzJWeWFXWjVYM05vYVcxZmNtVnhkV2x5WlY5ZlBYSmxjWFZwY21VN0tHWjFibU4wYVc5dUlHSnliM2R6WlhKcFpubFRhR2x0S0cxdlpIVnNaU3dnWkdWbWFXNWxMQ0J5WlhGMWFYSmxLU0I3WEc0b1puVnVZM1JwYjI0Z0tDUXNJR3R2TENCdGIyMWxiblFzSUhWdVpHVm1hVzVsWkNrZ2UxeHlYRzVjY2x4dUlDQWdJQzh2STNKbFoybHZiaUJWZEdsc2MxeHlYRzVjY2x4dUlDQWdJSFpoY2lCa1pYUmxZM1JFWVhSaFZIbHdaU0E5SUdaMWJtTjBhVzl1SUNoMllXeDFaU2tnZTF4eVhHNGdJQ0FnSUNBZ0lHWnZjaUFvZG1GeUlHWnVZVzFsSUdsdUlHUmxkR1ZqZEVSaGRHRlVlWEJsTG5SNWNHVkVaWFJsWTNScGIyNHBJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdkbUZ5SUdZZ1BTQmtaWFJsWTNSRVlYUmhWSGx3WlZ0bWJtRnRaVjA3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJR2xtSUNobUtIWmhiSFZsS1NrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlHUmxkR1ZqZEVSaGRHRlVlWEJsTG5SNWNHVkVaWFJsWTNScGIyNWJabTVoYldWZE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUJ1ZFd4c08xeHlYRzRnSUNBZ2ZUdGNjbHh1WEhKY2JpQWdJQ0JrWlhSbFkzUkVZWFJoVkhsd1pTNXBjMU4wY21sdVp5QTlJR1oxYm1OMGFXOXVJQ2gyWVd4MVpTa2dlMXh5WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUIwZVhCbGIyWWdkbUZzZFdVZ1BUMDlJQ2R6ZEhKcGJtY25PMXh5WEc0Z0lDQWdmVHRjY2x4dUlDQWdJR1JsZEdWamRFUmhkR0ZVZVhCbExtbHpSR0YwWlNBOUlHWjFibU4wYVc5dUlDaDJZV3gxWlNrZ2UxeHlYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQjBlWEJsYjJZZ2RtRnNkV1VnUFQwOUlDZHZZbXBsWTNRbklDWW1JRTlpYW1WamRDNXdjbTkwYjNSNWNHVXVkRzlUZEhKcGJtY3VZMkZzYkNoMllXeDFaU2tnUFQwOUlGd2lXMjlpYW1WamRDQkVZWFJsWFZ3aU8xeHlYRzRnSUNBZ2ZUdGNjbHh1SUNBZ0lHUmxkR1ZqZEVSaGRHRlVlWEJsTG1selRXOXRaVzUwSUQwZ1puVnVZM1JwYjI0Z0tIWmhiSFZsS1NCN1hISmNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlHMXZiV1Z1ZEM1cGMwMXZiV1Z1ZENoMllXeDFaU2s3WEhKY2JpQWdJQ0I5TzF4eVhHNGdJQ0FnWkdWMFpXTjBSR0YwWVZSNWNHVXVkSGx3WlVSbGRHVmpkR2x2YmlBOUlIdGNjbHh1SUNBZ0lDQWdJQ0JjSW1selRXOXRaVzUwWENJNklGd2liVzl0Wlc1MFhDSXNYSEpjYmlBZ0lDQWdJQ0FnWENKcGMxTjBjbWx1WjF3aU9pQmNJbk4wY21sdVoxd2lMRnh5WEc0Z0lDQWdJQ0FnSUZ3aWFYTkVZWFJsWENJNklGd2laR0YwWlZ3aVhISmNiaUFnSUNCOU8xeHlYRzVjY2x4dUlDQWdJSFpoY2lCbGJFSnBibVJsY2lBOUlHWjFibU4wYVc5dUtDUmxiQ2tnZTF4eVhHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUhObGREb2dablZ1WTNScGIyNG9kbUZzZFdVcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtSUNoMllXeDFaU0E5UFQwZ2RXNWtaV1pwYm1Wa0tTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RtRnNkV1VnUFNCdWRXeHNPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RtRnlJR1oxYm1OeklEMGdaV3hDYVc1a1pYSXVablZ1WTNScGIyNXpXeVJsYkM1a1lYUmhLR1ZzUW1sdVpHVnlMa1JCVkVGVVdWQkZYMHRGV1NsZElIeDhJR1ZzUW1sdVpHVnlMbVoxYm1OMGFXOXVjMXNuWDJSbFptRjFiSFFuWFR0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIWmhjaUJtZFc1aklEMGdablZ1WTNOYkozTmxkQ2RkSUh4OElHVnNRbWx1WkdWeUxtWjFibU4wYVc5dWMxc25YMlJsWm1GMWJIUW5YVnNuYzJWMEoxMDdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J5WlhSMWNtNGdablZ1WXlna1pXd3NJSFpoYkhWbEtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2ZTeGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ1oyVjBPaUJtZFc1amRHbHZiaWdwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIWmhjaUJtZFc1amN5QTlJR1ZzUW1sdVpHVnlMbVoxYm1OMGFXOXVjMXNrWld3dVpHRjBZU2hsYkVKcGJtUmxjaTVFUVZSQlZGbFFSVjlMUlZrcFhTQjhmQ0JsYkVKcGJtUmxjaTVtZFc1amRHbHZibk5iSjE5a1pXWmhkV3gwSjEwN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjJZWElnWm5WdVl5QTlJR1oxYm1Oeld5ZG5aWFFuWFNCOGZDQmxiRUpwYm1SbGNpNW1kVzVqZEdsdmJuTmJKMTlrWldaaGRXeDBKMTFiSjJkbGRDZGRPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJR1oxYm1Nb0pHVnNLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdmU3hjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdjbVZuYVhOMFpYSTZJR1oxYm1OMGFXOXVLR1JoZEdGVWVYQmxLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBa1pXd3VaR0YwWVNobGJFSnBibVJsY2k1RVFWUkJWRmxRUlY5TFJWa3NJR1JoZEdGVWVYQmxLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUgwN1hISmNiaUFnSUNCY2NseHVJQ0FnSUdWc1FtbHVaR1Z5TGtSQlZFRlVXVkJGWDB0RldTQTlJRndpWkdGMFpYQnBZMnRsY2k1cmJ5NWtZWFJoVkhsd1pWd2lPMXh5WEc1Y2NseHVJQ0FnSUdWc1FtbHVaR1Z5TG1aMWJtTjBhVzl1Y3lBOUlIdGNjbHh1SUNBZ0lDQWdJQ0FuWDJSbFptRjFiSFFuT2lCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUdkbGREb2dablZ1WTNScGIyNGdLQ1JsYkNrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlDUmxiQzVrWVhSbGNHbGphMlZ5S0NkblpYUW5LVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdmU3hjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdjMlYwT2lCbWRXNWpkR2x2YmlBb0pHVnNMQ0IyWVd4MVpTa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSkdWc0xtUmhkR1Z3YVdOclpYSW9KM05sZENjc0lIWmhiSFZsS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ0lIMHNYSEpjYmlBZ0lDQWdJQ0FnSjJsemJ5YzZJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdaMlYwT2lCbWRXNWpkR2x2YmlBb0pHVnNLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMllYSWdkbUZzZFdVZ1BTQWtaV3d1WkdGMFpYQnBZMnRsY2lnbloyVjBKeWs3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnS0haaGJIVmxJQ1ltSUhaaGJIVmxMbVp2Y20xaGRDZ25XVmxaV1MxTlRTMUVSQ2NwS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZlN4Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnYzJWME9pQm1kVzVqZEdsdmJpQW9KR1ZzTENCMllXeDFaU2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RtRnlJRzF1ZENBOUlHMXZiV1Z1ZENoMllXeDFaU2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBa1pXd3VaR0YwWlhCcFkydGxjaWduYzJWMEp5d2diVzUwS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ0lIMHNYSEpjYmlBZ0lDQWdJQ0FnSjJadmNtMWhkQ2M2SUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnWjJWME9pQm1kVzVqZEdsdmJpQW9KR1ZzS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z0pHVnNMbVJoZEdWd2FXTnJaWElvSjJkbGRFRnpWR1Y0ZENjcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lDQWdmU3hjY2x4dUlDQWdJQ0FnSUNBblpHRjBaU2M2SUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnWjJWME9pQm1kVzVqZEdsdmJpQW9KR1ZzS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjJZWElnZG1Gc2RXVWdQU0FrWld3dVpHRjBaWEJwWTJ0bGNpZ25aMlYwSnlrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z0tIWmhiSFZsSUNZbUlIWmhiSFZsTG5SdlJHRjBaU2dwS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lIMDdYSEpjYmx4eVhHNGdJQ0FnTHk4alpXNWtjbVZuYVc5dVhISmNibHh5WEc0Z0lDQWdhMjh1WW1sdVpHbHVaMGhoYm1Sc1pYSnpMbVJoZEdWd2FXTnJaWElnUFNCN1hISmNiaUFnSUNBZ0lDQWdhVzVwZERvZ1puVnVZM1JwYjI0Z0tHVnNaVzFsYm5Rc0lIWmhiSFZsUVdOalpYTnpiM0lzSUdGc2JFSnBibVJwYm1kelFXTmpaWE56YjNJcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RtRnlJRzl3ZEdsdmJuTWdQU0JoYkd4Q2FXNWthVzVuYzBGalkyVnpjMjl5S0NrdVpHRjBaWEJwWTJ0bGNrOXdkR2x2Ym5NZ2ZId2dlMzA3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSFpoY2lCa1lYUmhWSGx3WlNBOUlHOXdkR2x2Ym5NdVpHRjBZVlI1Y0dVZ2ZId2daR1YwWldOMFJHRjBZVlI1Y0dVb2EyOHVkWFJwYkhNdWRXNTNjbUZ3VDJKelpYSjJZV0pzWlNoMllXeDFaVUZqWTJWemMyOXlLQ2twS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnWkdGMFlWUjVjR1VnUFNBaFpHRjBZVlI1Y0dVZ2ZId2daR0YwWVZSNWNHVWdQVDBnSjNOMGNtbHVaeWNnUHlBbmFYTnZKeUE2SUdSaGRHRlVlWEJsTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0IyWVhJZ0pHVnNJRDBnSkNobGJHVnRaVzUwS1M1a1lYUmxjR2xqYTJWeUtHOXdkR2x2Ym5NcE8xeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdaV3hDYVc1a1pYSW9KR1ZzS1M1eVpXZHBjM1JsY2loa1lYUmhWSGx3WlNrN1hISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQnJieTUxZEdsc2N5NXlaV2RwYzNSbGNrVjJaVzUwU0dGdVpHeGxjaWhsYkdWdFpXNTBMQ0JjSW1Ob1lXNW5aVVJoZEdWY0lpd2dablZ1WTNScGIyNGdLR1YyWlc1MEtTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IyWVhJZ1lXTmpaWE56YjNJZ1BTQjJZV3gxWlVGalkyVnpjMjl5S0NrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaaUFvYTI4dWFYTlBZbk5sY25aaFlteGxLR0ZqWTJWemMyOXlLU2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFpoY2lCMllXeDFaU0E5SUdWc1FtbHVaR1Z5S0NSbGJDa3VaMlYwS0NrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWVdOalpYTnpiM0lvZG1Gc2RXVXBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0I5S1R0Y2NseHVJQ0FnSUNBZ0lDQjlMRnh5WEc0Z0lDQWdJQ0FnSUhWd1pHRjBaVG9nWm5WdVkzUnBiMjRnS0dWc1pXMWxiblFzSUhaaGJIVmxRV05qWlhOemIzSXBJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdaV3hDYVc1a1pYSW9KQ2hsYkdWdFpXNTBLU2xjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUM1elpYUW9hMjh1ZFhScGJITXVkVzUzY21Gd1QySnpaWEoyWVdKc1pTaDJZV3gxWlVGalkyVnpjMjl5S0NrcEtUdGNjbHh1SUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0I5TzF4eVhHNWNjbHh1WEhKY2JpQWdJQ0JyYnk1aWFXNWthVzVuU0dGdVpHeGxjbk11WkdGMFpYUnBiV1Z3YVdOclpYSWdQU0I3WEhKY2JpQWdJQ0FnSUNBZ2FXNXBkRG9nWm5WdVkzUnBiMjRnS0dWc1pXMWxiblFzSUhaaGJIVmxRV05qWlhOemIzSXNJR0ZzYkVKcGJtUnBibWR6UVdOalpYTnpiM0lzSUhacFpYZE5iMlJsYkN3Z1ltbHVaR2x1WjBOdmJuUmxlSFFwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnTHk5cGJtbDBhV0ZzYVhwbElHUmhkR1Z3YVdOclpYSWdkMmwwYUNCemIyMWxJRzl3ZEdsdmJtRnNJRzl3ZEdsdmJuTmNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RtRnlJRzl3ZEdsdmJuTWdQU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCbWIzSnRZWFE2SUNkRVJDOU5UUzlaV1ZsWklHaG9PbTF0SUVFbkxGeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdaR1ZtWVhWc2RFUmhkR1U2SUhaaGJIVmxRV05qWlhOemIzSW9LU2dwWEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSDA3WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNCcFppQW9ZV3hzUW1sdVpHbHVaM05CWTJObGMzTnZjaWdwSUNFOVBTQjFibVJsWm1sdVpXUXBJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbUlDaGhiR3hDYVc1a2FXNW5jMEZqWTJWemMyOXlLQ2t1WkdGMFpYQnBZMnRsY2s5d2RHbHZibk1nSVQwOUlIVnVaR1ZtYVc1bFpDa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHOXdkR2x2Ym5NdVptOXliV0YwSUQwZ1lXeHNRbWx1WkdsdVozTkJZMk5sYzNOdmNpZ3BMbVJoZEdWd2FXTnJaWEpQY0hScGIyNXpMbVp2Y20xaGRDQWhQVDBnZFc1a1pXWnBibVZrSUQ4Z1lXeHNRbWx1WkdsdVozTkJZMk5sYzNOdmNpZ3BMbVJoZEdWd2FXTnJaWEpQY0hScGIyNXpMbVp2Y20xaGRDQTZJRzl3ZEdsdmJuTXVabTl5YldGME8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FrS0dWc1pXMWxiblFwTG1SaGRHVjBhVzFsY0dsamEyVnlLRzl3ZEdsdmJuTXBPMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnTHk5M2FHVnVJR0VnZFhObGNpQmphR0Z1WjJWeklIUm9aU0JrWVhSbExDQjFjR1JoZEdVZ2RHaGxJSFpwWlhjZ2JXOWtaV3hjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdhMjh1ZFhScGJITXVjbVZuYVhOMFpYSkZkbVZ1ZEVoaGJtUnNaWElvWld4bGJXVnVkQ3dnWENKa2NDNWphR0Z1WjJWY0lpd2dablZ1WTNScGIyNGdLR1YyWlc1MEtTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IyWVhJZ2RtRnNkV1VnUFNCMllXeDFaVUZqWTJWemMyOXlLQ2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFppQW9hMjh1YVhOUFluTmxjblpoWW14bEtIWmhiSFZsS1NrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhaaGJIVmxLR1YyWlc1MExtUmhkR1VwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCOUtUdGNjbHh1SUNBZ0lDQWdJQ0I5TEZ4eVhHNGdJQ0FnSUNBZ0lIVndaR0YwWlRvZ1puVnVZM1JwYjI0Z0tHVnNaVzFsYm5Rc0lIWmhiSFZsUVdOalpYTnpiM0lwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnWld4Q2FXNWtaWElvSkNobGJHVnRaVzUwS1NsY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDNXpaWFFvYTI4dWRYUnBiSE11ZFc1M2NtRndUMkp6WlhKMllXSnNaU2gyWVd4MVpVRmpZMlZ6YzI5eUtDa3BLVHRjY2x4dUlDQWdJQ0FnSUNCOVhISmNiaUFnSUNCOU8xeHlYRzU5S1NocVVYVmxjbmtzSUhSb2FYTXVhMjhzSUhSb2FYTXViVzl0Wlc1MEtUdGNibjBwTG1OaGJHd29aMnh2WW1Gc0xDQnRiMlIxYkdVc0lIVnVaR1ZtYVc1bFpDd2dkVzVrWldacGJtVmtLVHRjYmlKZGZRPT0iLCIoZnVuY3Rpb24gKGdsb2JhbCl7XG5cbjsgbW9tZW50ID0gZ2xvYmFsLm1vbWVudCA9IHJlcXVpcmUoXCJtb21lbnRcIik7XG5qUXVlcnkgPSBnbG9iYWwualF1ZXJ5ID0gcmVxdWlyZShcImpxdWVyeVwiKTtcbjsgdmFyIF9fYnJvd3NlcmlmeV9zaGltX3JlcXVpcmVfXz1yZXF1aXJlOyhmdW5jdGlvbiBicm93c2VyaWZ5U2hpbShtb2R1bGUsIGRlZmluZSwgcmVxdWlyZSkge1xuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAqIE1vbWVudERhdGVwaWNrZXJcclxuICogQmFzZWQgb24gaHR0cDovL3d3dy5leWVjb24ucm8vYm9vdHN0cmFwLWRhdGVwaWNrZXJcclxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAqIENvcHlyaWdodCAyMDEyIEFuZHJlcyBNb3NjaGluaVxyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cclxuXHJcbiFmdW5jdGlvbiAoJCwgbW9tZW50LCB1bmRlZmluZWQpIHtcclxuXHJcbiAgICAvLyBQaWNrZXIgb2JqZWN0XHJcblxyXG4gICAgdmFyIERhdGVwaWNrZXIgPSBmdW5jdGlvbiAoZWxlbWVudCwgb3B0aW9ucykge1xyXG4gICAgICAgIHRoaXMuZWxlbWVudCA9ICQoZWxlbWVudCk7XHJcbiAgICAgICAgdGhpcy5hdXRvSGlkZSA9IHRydWUgJiYgKG9wdGlvbnMuYXV0b0hpZGUgIT09IGZhbHNlKSAmJiAodGhpcy5lbGVtZW50LmRhdGEoJ2RhdGVwaWNrZXItYXV0b2hpZGUnKSAhPT0gZmFsc2UpO1xyXG4gICAgICAgIHRoaXMuZm9ybWF0ID0gb3B0aW9ucy5mb3JtYXQgfHwgdGhpcy5lbGVtZW50LmRhdGEoJ2RhdGVwaWNrZXItZm9ybWF0JykgfHwgbW9tZW50LmxvY2FsZURhdGEoKS5sb25nRGF0ZUZvcm1hdCgnTCcpO1xyXG4gICAgICAgIHRoaXMuY2FsZW5kYXJQbGFjZW1lbnQgPSBvcHRpb25zLmNhbGVuZGFyUGxhY2VtZW50IHx8IHRoaXMuZWxlbWVudC5kYXRhKCdkYXRlcGlja2VyLWNhbGVuZGFycGxhY2VtZW50JykgfHwgJ3JpZ2h0JztcclxuICAgICAgICB0aGlzLnBpY2tlciA9ICQoRFBHbG9iYWwudGVtcGxhdGUpXHJcblx0XHRcdFx0XHRcdFx0LmFwcGVuZFRvKG9wdGlvbnMuY29udGFpbmVyKVxyXG5cdFx0XHRcdFx0XHRcdC5vbih7XHJcblx0XHRcdFx0XHRcdFx0ICAgIGNsaWNrOiAkLnByb3h5KHRoaXMuY2xpY2ssIHRoaXMpLFxyXG5cdFx0XHRcdFx0XHRcdCAgICBtb3VzZWRvd246ICQucHJveHkodGhpcy5tb3VzZWRvd24sIHRoaXMpXHJcblx0XHRcdFx0XHRcdFx0fSk7XHJcblxyXG4gICAgICAgIHRoaXMuJHZpZXdwb3J0ID0gJChvcHRpb25zLnZpZXdwb3J0IHx8IG9wdGlvbnMuY29udGFpbmVyKTtcclxuXHJcbiAgICAgICAgdmFyIHN0YXJ0RGF0ZVRleHQgPSBvcHRpb25zLnN0YXJ0RGF0ZSB8fCB0aGlzLmVsZW1lbnQuZGF0YSgnZGF0ZXBpY2tlci1zdGFydGRhdGUnKSB8fCB1bmRlZmluZWQ7XHJcbiAgICAgICAgdGhpcy5zdGFydERhdGUgPSAoc3RhcnREYXRlVGV4dCkgPyBEUEdsb2JhbC5wYXJzZURhdGUoc3RhcnREYXRlVGV4dCwgdGhpcy5mb3JtYXQpIDogdW5kZWZpbmVkO1xyXG4gICAgICAgIHZhciBlbmREYXRlVGV4dCA9IG9wdGlvbnMuZW5kRGF0ZSB8fCB0aGlzLmVsZW1lbnQuZGF0YSgnZGF0ZXBpY2tlci1lbmRkYXRlJykgfHwgdW5kZWZpbmVkO1xyXG4gICAgICAgIHRoaXMuZW5kRGF0ZSA9IChlbmREYXRlVGV4dCkgPyBEUEdsb2JhbC5wYXJzZURhdGUoZW5kRGF0ZVRleHQsIHRoaXMuZm9ybWF0KSA6IHVuZGVmaW5lZDtcclxuICAgICAgICB0aGlzLmlzSW5wdXQgPSB0aGlzLmVsZW1lbnQuaXMoJ2lucHV0Jyk7XHJcbiAgICAgICAgdGhpcy5jb21wb25lbnQgPSAhdGhpcy5pc0lucHV0ICYmIHRoaXMuZWxlbWVudC5pcygnLmRhdGUnKSA/IHRoaXMuZWxlbWVudC5maW5kKCcuaW5wdXQtZ3JvdXAtYWRkb24sIC5hZGQtb24nKSA6IGZhbHNlO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5pc0lucHV0KSB7XHJcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5vbih7XHJcbiAgICAgICAgICAgICAgICBmb2N1czogJC5wcm94eSh0aGlzLnNob3csIHRoaXMpLFxyXG4gICAgICAgICAgICAgICAgYmx1cjogJC5wcm94eShmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2hpZGUoKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyaWdnZXJDaGFuZ2VEYXRlKCk7XHJcbiAgICAgICAgICAgICAgICB9LCB0aGlzKSxcclxuICAgICAgICAgICAgICAgIGlucHV0OiAkLnByb3h5KGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVGcm9tVmFsdWUodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICB9LCB0aGlzKSxcclxuICAgICAgICAgICAgICAgIGtleXVwOiAkLnByb3h5KGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGUua2V5Q29kZSA9PSAxMylcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVGcm9tVmFsdWUoKTtcclxuICAgICAgICAgICAgICAgIH0sIHRoaXMpLFxyXG4gICAgICAgICAgICAgICAgY2xpY2s6ICQucHJveHkodGhpcy5zaG93LCB0aGlzKVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5jb21wb25lbnQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50Lm9uKCdjbGljaycsICQucHJveHkodGhpcy5zaG93LCB0aGlzKSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQub24oJ2NsaWNrJywgJC5wcm94eSh0aGlzLnNob3csIHRoaXMpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm1pblZpZXdNb2RlID0gb3B0aW9ucy5taW5WaWV3TW9kZSB8fCB0aGlzLmVsZW1lbnQuZGF0YSgnZGF0ZXBpY2tlci1taW52aWV3bW9kZScpIHx8IDA7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm1pblZpZXdNb2RlID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICBzd2l0Y2ggKHRoaXMubWluVmlld01vZGUpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgJ21vbnRocyc6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5taW5WaWV3TW9kZSA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlICd5ZWFycyc6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5taW5WaWV3TW9kZSA9IDI7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWluVmlld01vZGUgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMudmlld01vZGUgPSBvcHRpb25zLnZpZXdNb2RlIHx8IHRoaXMuZWxlbWVudC5kYXRhKCdkYXRlcGlja2VyLXZpZXdtb2RlJykgfHwgMDtcclxuICAgICAgICBpZiAodHlwZW9mIHRoaXMudmlld01vZGUgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIHN3aXRjaCAodGhpcy52aWV3TW9kZSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnbW9udGhzJzpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnZpZXdNb2RlID0gMTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgJ3llYXJzJzpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnZpZXdNb2RlID0gMjtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52aWV3TW9kZSA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zdGFydFZpZXdNb2RlID0gdGhpcy52aWV3TW9kZTtcclxuICAgICAgICB0aGlzLndlZWtTdGFydCA9IG9wdGlvbnMud2Vla1N0YXJ0IHx8IHRoaXMuZWxlbWVudC5kYXRhKCdkYXRlcGlja2VyLXdlZWtzdGFydCcpIHx8IDA7XHJcbiAgICAgICAgdGhpcy53ZWVrRW5kID0gdGhpcy53ZWVrU3RhcnQgPT09IDAgPyA2IDogdGhpcy53ZWVrU3RhcnQgLSAxO1xyXG4gICAgICAgIHRoaXMuZmlsbERvdygpO1xyXG4gICAgICAgIHRoaXMuZmlsbE1vbnRocygpO1xyXG4gICAgICAgIHRoaXMuc2V0Q3VzdG9tQ2xhc3NlcygpO1xyXG4gICAgICAgIHRoaXMudXBkYXRlRnJvbVZhbHVlKCk7XHJcbiAgICAgICAgdGhpcy5zaG93TW9kZSgpO1xyXG4gICAgICAgIHRoaXMucmVmcmVzaCgpO1xyXG4gICAgfTtcclxuXHJcbiAgICBEYXRlcGlja2VyLnByb3RvdHlwZSA9IHtcclxuICAgICAgICBjb25zdHJ1Y3RvcjogRGF0ZXBpY2tlcixcclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuICh0aGlzLm1vbWVudCAmJiB0aGlzLm1vbWVudC5jbG9uZSgpKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGdldEFzVGV4dDogZnVuY3Rpb24gKGZvcm1hdCkge1xyXG4gICAgICAgICAgICB2YXIgZGlzcGxheUZvcm1hdCA9IHRoaXMuZm9ybWF0O1xyXG4gICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGRpc3BsYXlGb3JtYXQpID09PSAnW29iamVjdCBBcnJheV0nKSB7XHJcbiAgICAgICAgICAgICAgICBkaXNwbGF5Rm9ybWF0ID0gZGlzcGxheUZvcm1hdFswXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gKHRoaXMubW9tZW50ICYmIHRoaXMubW9tZW50LmZvcm1hdChmb3JtYXQgfHwgZGlzcGxheUZvcm1hdCkpIHx8ICcnO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgc2hvdzogZnVuY3Rpb24gKGUpIHtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzSW5wdXQgJiYgdGhpcy5lbGVtZW50LmlzKCc6ZGlzYWJsZWQnKSkgeyByZXR1cm47IH1cclxuXHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuZWxlbWVudC5jaGlsZHJlbignaW5wdXQnKS5pcygnOmRpc2FibGVkJykpIHsgcmV0dXJuOyB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLnBpY2tlci5zaG93KCk7XHJcbiAgICAgICAgICAgIHRoaXMuaGVpZ2h0ID0gKHRoaXMuY29tcG9uZW50ICYmIHRoaXMuY29tcG9uZW50Lm91dGVySGVpZ2h0KCkpIHx8IHRoaXMuZWxlbWVudC5vdXRlckhlaWdodCgpO1xyXG4gICAgICAgICAgICB0aGlzLnBsYWNlKCk7XHJcbiAgICAgICAgICAgICQod2luZG93KS5vbigncmVzaXplJywgJC5wcm94eSh0aGlzLnBsYWNlLCB0aGlzKSk7XHJcbiAgICAgICAgICAgIGlmIChlKSB7XHJcbiAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5pc0lucHV0KSB7XHJcbiAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5vbignbW91c2Vkb3duJywgJC5wcm94eSh0aGlzLmhpZGUsIHRoaXMpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQudHJpZ2dlcih7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiAnc2hvdydcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX2hpZGU6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIC8vIFdoZW4gZ29pbmcgZnJvbSB0aGUgaW5wdXQgdG8gdGhlIHBpY2tlciwgSUUgaGFuZGxlcyB0aGUgYmx1ci9jbGlja1xyXG4gICAgICAgICAgICAvLyBldmVudHMgZGlmZmVyZW50bHkgdGhhbiBvdGhlciBicm93c2VycywgaW4gc3VjaCBhIHdheSB0aGF0IHRoZSBibHVyXHJcbiAgICAgICAgICAgIC8vIGV2ZW50IHRyaWdnZXJzIGEgaGlkZSBiZWZvcmUgdGhlIGNsaWNrIGV2ZW50IGNhbiBzdG9wIHByb3BhZ2F0aW9uLlxyXG4gICAgICAgICAgICBpZiAobmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKFwiTVNJRSA4LjBcIikgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgdCA9IHRoaXMsIGFyZ3MgPSBhcmd1bWVudHM7XHJcblxyXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gY2FuY2VsX2hpZGUoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGhpZGVfdGltZW91dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgICAgICB0LnBpY2tlci5vZmYoJ2NsaWNrJywgY2FuY2VsX2hpZGUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGRvX2hpZGUoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdC5oaWRlLmFwcGx5KHQsIGFyZ3MpO1xyXG4gICAgICAgICAgICAgICAgICAgIHQucGlja2VyLm9mZignY2xpY2snLCBjYW5jZWxfaGlkZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5waWNrZXIub24oJ2NsaWNrJywgY2FuY2VsX2hpZGUpO1xyXG4gICAgICAgICAgICAgICAgdmFyIGhpZGVfdGltZW91dCA9IHNldFRpbWVvdXQoZG9faGlkZSwgMTAwKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmhpZGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIGhpZGU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdGhpcy5waWNrZXIuaGlkZSgpO1xyXG4gICAgICAgICAgICAkKHdpbmRvdykub2ZmKCdyZXNpemUnLCB0aGlzLnBsYWNlKTtcclxuICAgICAgICAgICAgdGhpcy52aWV3TW9kZSA9IHRoaXMuc3RhcnRWaWV3TW9kZTtcclxuICAgICAgICAgICAgdGhpcy5zaG93TW9kZSgpO1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNJbnB1dCkge1xyXG4gICAgICAgICAgICAgICAgJChkb2N1bWVudCkub2ZmKCdtb3VzZWRvd24nLCB0aGlzLmhpZGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaCgpO1xyXG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQudHJpZ2dlcih7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiAnaGlkZSdcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgcmVmcmVzaDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgZm9ybWF0ZWQgPSB0aGlzLmdldEFzVGV4dCgpO1xyXG5cclxuICAgICAgICAgICAgaWYgKCF0aGlzLmlzSW5wdXQpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbXBvbmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5maW5kKCdpbnB1dCcpLnByb3AoJ3ZhbHVlJywgZm9ybWF0ZWQpLmNoYW5nZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50LmRhdGEoJ2RhdGUnLCBmb3JtYXRlZCkuY2hhbmdlKCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQucHJvcCgndmFsdWUnLCBmb3JtYXRlZCkuY2hhbmdlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChuZXdEYXRlLCBvbW1pdEV2ZW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlKG5ld0RhdGUsIG9tbWl0RXZlbnQpO1xyXG4gICAgICAgICAgICB0aGlzLnJlZnJlc2goKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBwbGFjZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgc291cmNlSXRlbSA9IHRoaXMuY29tcG9uZW50ID8gdGhpcy5jb21wb25lbnQgOiB0aGlzLmVsZW1lbnQ7XHJcbiAgICAgICAgICAgIHZhciBvZmZzZXQgPSBzb3VyY2VJdGVtLm9mZnNldCgpO1xyXG5cclxuICAgICAgICAgICAgdmFyIHZpZXdwb3J0T2Zmc2V0ID0gdGhpcy4kdmlld3BvcnQub2Zmc2V0KCk7XHJcbiAgICAgICAgICAgIHZhciBzY3JvbGxUb3AgPSB0aGlzLiR2aWV3cG9ydC5zY3JvbGxUb3AoKTtcclxuXHJcbiAgICAgICAgICAgIHZhciB6SW5kZXggPSBwYXJzZUludCh0aGlzLmVsZW1lbnQucGFyZW50cygpLmZpbHRlcihmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgekluZGV4ID0gJCh0aGlzKS5jc3MoJ3otaW5kZXgnKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB6SW5kZXggIT0gJ2F1dG8nICYmIHpJbmRleCAhPSAnMCc7XHJcbiAgICAgICAgICAgIH0pLmZpcnN0KCkuY3NzKCd6LWluZGV4JykpICsgMTA7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5jYWxlbmRhclBsYWNlbWVudCA9PSAnbGVmdCcpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucGlja2VyLmNzcyh7XHJcbiAgICAgICAgICAgICAgICAgICAgdG9wOiBvZmZzZXQudG9wICsgdGhpcy5oZWlnaHQsXHJcbiAgICAgICAgICAgICAgICAgICAgbGVmdDogb2Zmc2V0LmxlZnQgKyBzb3VyY2VJdGVtWzBdLm9mZnNldFdpZHRoIC0gdGhpcy5waWNrZXJbMF0ub2Zmc2V0V2lkdGhcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5waWNrZXIuY3NzKHtcclxuICAgICAgICAgICAgICAgICAgICB0b3A6IG9mZnNldC50b3AgKyB0aGlzLmhlaWdodCxcclxuICAgICAgICAgICAgICAgICAgICBsZWZ0OiBvZmZzZXQubGVmdCxcclxuICAgICAgICAgICAgICAgICAgICB6SW5kZXggOiB6SW5kZXhcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBsYXN0VmFsdWU6IG51bGwsXHJcbiAgICAgICAgdHJpZ2dlckNoYW5nZURhdGU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIG5ld1ZhbHVlID0gdGhpcy5tb21lbnQgPyB0aGlzLm1vbWVudC52YWx1ZU9mKCkgOiBudWxsO1xyXG4gICAgICAgICAgICBpZiAobmV3VmFsdWUgIT0gdGhpcy5sYXN0VmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubGFzdFZhbHVlID0gbmV3VmFsdWU7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQudHJpZ2dlcih7XHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2NoYW5nZURhdGUnXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodGhpcy5hdXRvSGlkZSlcclxuICAgICAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgdXBkYXRlRnJvbVZhbHVlOiBmdW5jdGlvbiAob21taXRFdmVudCkge1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZSh0aGlzLmlzSW5wdXQgPyB0aGlzLmVsZW1lbnQucHJvcCgndmFsdWUnKSA6IHRoaXMuZWxlbWVudC5kYXRhKCdkYXRlJyksIG9tbWl0RXZlbnQpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHVwZGF0ZTogZnVuY3Rpb24gKG5ld0RhdGUsIG9tbWl0RXZlbnQpIHtcclxuICAgICAgICAgICAgdmFyIG9yaWdpbmFsVmFsdWUgPSB0aGlzLm1vbWVudCA/IHRoaXMubW9tZW50LnZhbHVlT2YoKSA6IG51bGw7XHJcblxyXG4gICAgICAgICAgICB0aGlzLm1vbWVudCA9IERQR2xvYmFsLnBhcnNlRGF0ZShuZXdEYXRlLCB0aGlzLmZvcm1hdCk7XHJcblxyXG4gICAgICAgICAgICB2YXIgbmV3VmFsdWUgPSB0aGlzLm1vbWVudCA/IHRoaXMubW9tZW50LnZhbHVlT2YoKSA6IG51bGw7XHJcblxyXG4gICAgICAgICAgICBpZiAoIXRoaXMudmlld0RhdGUgfHwgb3JpZ2luYWxWYWx1ZSAhPSBuZXdWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy52aWV3RGF0ZSA9IHRoaXMuZ2V0KCkgfHwgbW9tZW50KCkuaG91cnMoMCkubWludXRlcygwKS5zZWNvbmRzKDApLm1pbGxpc2Vjb25kcygwKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZmlsbCgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50LnRyaWdnZXIoe1xyXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdjaGFuZ2VEYXRlSW5zdGFudCdcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghb21taXRFdmVudClcclxuICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlckNoYW5nZURhdGUoKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBmaWxsRG93OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBkb3dDbnQgPSB0aGlzLndlZWtTdGFydDtcclxuICAgICAgICAgICAgdmFyIGh0bWwgPSAnPHRyPic7XHJcbiAgICAgICAgICAgIHZhciBkYXlzTWluID0gJC5wcm94eShtb21lbnQubG9jYWxlRGF0YSgpLndlZWtkYXlzTWluLCBtb21lbnQubG9jYWxlRGF0YSgpKTtcclxuICAgICAgICAgICAgd2hpbGUgKGRvd0NudCA8IHRoaXMud2Vla1N0YXJ0ICsgNykge1xyXG4gICAgICAgICAgICAgICAgaHRtbCArPSAnPHRoIGNsYXNzPVwiZG93XCI+JyArIGRheXNNaW4obW9tZW50KCkuZGF5KChkb3dDbnQrKykgJSA3KSkgKyAnPC90aD4nO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGh0bWwgKz0gJzwvdHI+JztcclxuICAgICAgICAgICAgdGhpcy5waWNrZXIuZmluZCgnLmRhdGVwaWNrZXItZGF5cyB0aGVhZCcpLmFwcGVuZChodG1sKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBmaWxsTW9udGhzOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBodG1sID0gJyc7XHJcbiAgICAgICAgICAgIHZhciBpID0gMDtcclxuICAgICAgICAgICAgdmFyIG1vbnRoc1Nob3J0ID0gJC5wcm94eShtb21lbnQubG9jYWxlRGF0YSgpLm1vbnRoc1Nob3J0LCBtb21lbnQubG9jYWxlRGF0YSgpKTtcclxuICAgICAgICAgICAgd2hpbGUgKGkgPCAxMikge1xyXG4gICAgICAgICAgICAgICAgaHRtbCArPSAnPHNwYW4gY2xhc3M9XCJtb250aFwiPicgKyBtb250aHNTaG9ydChtb21lbnQoKS5zdGFydE9mKCdtb250aCcpLm1vbnRoKGkrKykpICsgJzwvc3Bhbj4nO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMucGlja2VyLmZpbmQoJy5kYXRlcGlja2VyLW1vbnRocyB0ZCcpLmFwcGVuZChodG1sKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBmaWxsOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciB5ZWFyID0gdGhpcy52aWV3RGF0ZS55ZWFyKCk7XHJcbiAgICAgICAgICAgIHZhciBtb250aCA9IHRoaXMudmlld0RhdGUubW9udGgoKTtcclxuICAgICAgICAgICAgdmFyIGN1cnJlbnRNb21lbnQgPSB0aGlzLmdldCgpO1xyXG4gICAgICAgICAgICB2YXIgY3VycmVudERhdGUgPSBjdXJyZW50TW9tZW50ID8gY3VycmVudE1vbWVudC52YWx1ZU9mKCkgOiBudWxsOyAvL1RPRE86IHVzZSBkaWZmXHJcbiAgICAgICAgICAgIHZhciBjdXJyZW50WWVhciA9IGN1cnJlbnRNb21lbnQgPyBjdXJyZW50TW9tZW50LnllYXIoKSA6IG51bGw7XHJcbiAgICAgICAgICAgIHZhciBjdXJyZW50TW9udGggPSBjdXJyZW50TW9tZW50ID8gY3VycmVudE1vbWVudC5tb250aCgpIDogbnVsbDtcclxuXHJcbiAgICAgICAgICAgIHRoaXMucGlja2VyLmZpbmQoJy5kYXRlcGlja2VyLWRheXMgdGg6ZXEoMSknKVxyXG5cdFx0XHRcdFx0XHQudGV4dChtb21lbnQubG9jYWxlRGF0YSgpLm1vbnRocyhtb21lbnQoKS5tb250aChtb250aCkpICsgJyAnICsgeWVhcik7XHJcblxyXG4gICAgICAgICAgICB2YXIgcHJldk1vbnRoID0gbW9tZW50KFt5ZWFyLCBtb250aCwgMV0pO1xyXG4gICAgICAgICAgICBwcmV2TW9udGguc3VidHJhY3QoMSwgJ2RheScpO1xyXG4gICAgICAgICAgICBwcmV2TW9udGguZGF5KHByZXZNb250aC5kYXkoKSAtIChwcmV2TW9udGguZGF5KCkgLSB0aGlzLndlZWtTdGFydCArIDcpICUgNyk7XHJcblxyXG4gICAgICAgICAgICAvL1RPRE86IHVzZSBkaWZmXHJcbiAgICAgICAgICAgIHZhciBuZXh0TW9udGhWYWwgPSBtb21lbnQocHJldk1vbnRoKS5hZGQoNDIsICdkYXlzJykudmFsdWVPZigpO1xyXG5cclxuICAgICAgICAgICAgaHRtbCA9IFtdO1xyXG4gICAgICAgICAgICB2YXIgY2xzTmFtZTtcclxuICAgICAgICAgICAgLy9UT0RPOiB1c2UgZGlmZlxyXG4gICAgICAgICAgICB3aGlsZSAocHJldk1vbnRoLnZhbHVlT2YoKSA8IG5leHRNb250aFZhbCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHByZXZNb250aC5kYXkoKSA9PT0gdGhpcy53ZWVrU3RhcnQpIHtcclxuICAgICAgICAgICAgICAgICAgICBodG1sLnB1c2goJzx0cj4nKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNsc05hbWUgPSAnJztcclxuICAgICAgICAgICAgICAgIC8vVE9ETzogdXNlIGRpZmZcclxuICAgICAgICAgICAgICAgIGlmIChwcmV2TW9udGgueWVhcigpIDwgeWVhciB8fCAocHJldk1vbnRoLnllYXIoKSA9PSB5ZWFyICYmIHByZXZNb250aC5tb250aCgpIDwgbW9udGgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2xzTmFtZSArPSAnIG9sZCc7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByZXZNb250aC55ZWFyKCkgPiB5ZWFyIHx8IChwcmV2TW9udGgueWVhcigpID09IHllYXIgJiYgcHJldk1vbnRoLm1vbnRoKCkgPiBtb250aCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjbHNOYW1lICs9ICcgbmV3JztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vVE9ETzogdXNlIGRpZmZcclxuICAgICAgICAgICAgICAgIGlmIChwcmV2TW9udGgudmFsdWVPZigpID09PSBjdXJyZW50RGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNsc05hbWUgKz0gJyBhY3RpdmUnO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHByZXZNb250aC52YWx1ZU9mKCkgPCB0aGlzLnN0YXJ0RGF0ZSB8fCBwcmV2TW9udGgudmFsdWVPZigpID4gdGhpcy5lbmREYXRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2xzTmFtZSArPSAnIGRpc2FibGVkJztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGh0bWwucHVzaCgnPHRkIGNsYXNzPVwiZGF5JyArIGNsc05hbWUgKyAnXCI+JyArIHByZXZNb250aC5kYXRlKCkgKyAnPC90ZD4nKTtcclxuICAgICAgICAgICAgICAgIGlmIChwcmV2TW9udGguZGF5KCkgPT09IHRoaXMud2Vla0VuZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGh0bWwucHVzaCgnPC90cj4nKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHByZXZNb250aC5hZGQoMSwgJ2RheXMnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnBpY2tlci5maW5kKCcuZGF0ZXBpY2tlci1kYXlzIHRib2R5JykuZW1wdHkoKS5hcHBlbmQoaHRtbC5qb2luKCcnKSk7XHJcblxyXG4gICAgICAgICAgICB2YXIgbW9udGhzID0gdGhpcy5waWNrZXIuZmluZCgnLmRhdGVwaWNrZXItbW9udGhzJylcclxuXHRcdFx0XHRcdFx0LmZpbmQoJ3RoOmVxKDEpJylcclxuXHRcdFx0XHRcdFx0XHQudGV4dCh5ZWFyKVxyXG5cdFx0XHRcdFx0XHRcdC5lbmQoKVxyXG5cdFx0XHRcdFx0XHQuZmluZCgnc3BhbicpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTtcclxuICAgICAgICAgICAgaWYgKGN1cnJlbnRZZWFyID09PSB5ZWFyKSB7XHJcbiAgICAgICAgICAgICAgICBtb250aHMuZXEoY3VycmVudE1vbnRoKS5hZGRDbGFzcygnYWN0aXZlJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCgodGhpcy5zdGFydERhdGUpICYmIHllYXIgPCB0aGlzLnN0YXJ0RGF0ZS55ZWFyKCkpIHx8ICgodGhpcy5lbmREYXRlKSAmJiB5ZWFyID4gdGhpcy5lbmREYXRlLnllYXIoKSkpIHtcclxuICAgICAgICAgICAgICAgIG1vbnRocy5hZGRDbGFzcygnZGlzYWJsZWQnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoKHRoaXMuc3RhcnREYXRlKSAmJiB5ZWFyID09IHRoaXMuc3RhcnREYXRlLnllYXIoKSkge1xyXG4gICAgICAgICAgICAgICAgbW9udGhzLnNsaWNlKDAsIHRoaXMuc3RhcnREYXRlLm1vbnRoKCkpLmFkZENsYXNzKCdkaXNhYmxlZCcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICgodGhpcy5lbmREYXRlKSAmJiB5ZWFyID09IHRoaXMuZW5kRGF0ZS55ZWFyKCkpIHtcclxuICAgICAgICAgICAgICAgIG1vbnRocy5zbGljZSh0aGlzLmVuZERhdGUubW9udGgoKSArIDEpLmFkZENsYXNzKCdkaXNhYmxlZCcpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBodG1sID0gJyc7XHJcbiAgICAgICAgICAgIHllYXIgPSBwYXJzZUludCh5ZWFyIC8gMTAsIDEwKSAqIDEwO1xyXG4gICAgICAgICAgICB2YXIgeWVhckNvbnQgPSB0aGlzLnBpY2tlci5maW5kKCcuZGF0ZXBpY2tlci15ZWFycycpXHJcblx0XHRcdFx0XHRcdFx0XHQuZmluZCgndGg6ZXEoMSknKVxyXG5cdFx0XHRcdFx0XHRcdFx0XHQudGV4dCh5ZWFyICsgJy0nICsgKHllYXIgKyA5KSlcclxuXHRcdFx0XHRcdFx0XHRcdFx0LmVuZCgpXHJcblx0XHRcdFx0XHRcdFx0XHQuZmluZCgndGQnKTtcclxuICAgICAgICAgICAgeWVhciAtPSAxO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gLTE7IGkgPCAxMTsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBodG1sICs9ICc8c3BhbiBjbGFzcz1cInllYXInICsgKGkgPT09IC0xIHx8IGkgPT09IDEwID8gJyBvbGQnIDogJycpICsgKGN1cnJlbnRZZWFyID09PSB5ZWFyID8gJyBhY3RpdmUnIDogJycpICsgKCgodGhpcy5zdGFydERhdGUpICYmIHllYXIgPCB0aGlzLnN0YXJ0RGF0ZS55ZWFyKCkpIHx8ICgodGhpcy5lbmREYXRlKSAmJiB5ZWFyID4gdGhpcy5lbmREYXRlLnllYXIoKSkgPyAnIGRpc2FibGVkJyA6ICcnKSArICdcIj4nICsgeWVhciArICc8L3NwYW4+JztcclxuICAgICAgICAgICAgICAgIHllYXIgKz0gMTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB5ZWFyQ29udC5odG1sKGh0bWwpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIGNsaWNrOiBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIHZhciB0YXJnZXQgPSAkKGUudGFyZ2V0KS5jbG9zZXN0KCdzcGFuLCB0ZCwgdGgnKTtcclxuICAgICAgICAgICAgaWYgKHRhcmdldC5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICAgICAgICAgIHN3aXRjaCAodGFyZ2V0WzBdLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlICd0aCc6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodGFyZ2V0WzBdLmNsYXNzTmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnc3dpdGNoJzpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dNb2RlKDEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAncHJldic6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICduZXh0JzpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmF2ID0gRFBHbG9iYWwubW9kZXNbdGhpcy52aWV3TW9kZV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52aWV3RGF0ZS5hZGQobmF2Lm5hdlN0ZXAgKiAodGFyZ2V0WzBdLmNsYXNzTmFtZSA9PT0gJ3ByZXYnID8gLTEgOiAxKSwgbmF2Lm5hdkZuYyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maWxsKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnc3Bhbic6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGFyZ2V0LmlzKCcuZGlzYWJsZWQnKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldC5pcygnLm1vbnRoJykpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld01vbnRoID0gdGFyZ2V0LnBhcmVudCgpLmZpbmQoJ3NwYW4nKS5pbmRleCh0YXJnZXQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdGhpcy52aWV3RGF0ZS5tb250aChuZXdNb250aCk7IEkgZG8gbm90IGxpa2UgaG93IGl0IHdvcmtzIHdoZW4gdGhlIG5ldyBtb250aCBoYXZlIGxlc3MgZGF5c1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmlld0RhdGUuYWRkKG5ld01vbnRoIC0gdGhpcy52aWV3RGF0ZS5tb250aCgpLCAnbW9udGhzJyk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgeWVhciA9IHBhcnNlSW50KHRhcmdldC50ZXh0KCksIDEwKSB8fCAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmlld0RhdGUueWVhcih5ZWFyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy52aWV3TW9kZSAhPT0gdGhpcy5taW5WaWV3TW9kZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvd01vZGUoLTEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0KHRoaXMudmlld0RhdGUsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldCh0aGlzLnZpZXdEYXRlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlICd0ZCc6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGFyZ2V0LmlzKCcuZGlzYWJsZWQnKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldC5pcygnLmRheScpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRheSA9IHBhcnNlSW50KHRhcmdldC50ZXh0KCksIDEwKSB8fCAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZW1wRGF0ZSA9IHRoaXMudmlld0RhdGUuY2xvbmUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0LmlzKCcub2xkJykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcERhdGUuc3RhcnRPZignbW9udGgnKS5hZGQoLTEsICdkYXlzJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0YXJnZXQuaXMoJy5uZXcnKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wRGF0ZS5lbmRPZignbW9udGgnKS5hZGQoMSwgJ2RheXMnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1vbnRoID0gdGVtcERhdGUubW9udGgoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgeWVhciA9IHRlbXBEYXRlLnllYXIoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldChtb21lbnQoW3llYXIsIG1vbnRoLCBkYXldKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBkYXRlV2l0aGluUmFuZ2U6IGZ1bmN0aW9uIChkYXRlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBkYXRlID49IHRoaXMuc3RhcnREYXRlICYmIGRhdGUgPD0gdGhpcy5lbmREYXRlO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIG1vdXNlZG93bjogZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHNob3dNb2RlOiBmdW5jdGlvbiAoZGlyKSB7XHJcbiAgICAgICAgICAgIGlmIChkaXIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudmlld01vZGUgPSBNYXRoLm1heCh0aGlzLm1pblZpZXdNb2RlLCBNYXRoLm1pbigyLCB0aGlzLnZpZXdNb2RlICsgZGlyKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5waWNrZXIuZmluZCgnPmRpdicpLmhpZGUoKS5maWx0ZXIoJy5kYXRlcGlja2VyLScgKyBEUEdsb2JhbC5tb2Rlc1t0aGlzLnZpZXdNb2RlXS5jbHNOYW1lKS5zaG93KCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBzZXRDdXN0b21DbGFzc2VzOiBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY2FsZW5kYXJQbGFjZW1lbnQgPT0gJ2xlZnQnKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBpY2tlci5hZGRDbGFzcygnZGF0ZXBpY2tlci1sZWZ0Jyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgICQuZm4uZGF0ZXBpY2tlciA9IGZ1bmN0aW9uIChvcHRpb24sIHZhbCkge1xyXG4gICAgICAgIHZhciByZXN1bHRzID0gW107XHJcbiAgICAgICAgdmFyIGNoYWluID0gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyICR0aGlzID0gJCh0aGlzKSxcclxuXHRcdFx0XHRkYXRhID0gJHRoaXMuZGF0YSgnZGF0ZXBpY2tlcicpLFxyXG5cdFx0XHRcdG9wdGlvbnMgPSB0eXBlb2Ygb3B0aW9uID09PSAnb2JqZWN0JyAmJiBvcHRpb247XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb3B0aW9uID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICAgICAgaWYgKGRhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZGF0YVtvcHRpb25dKHZhbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgIT09ICd1bmRlZmluZWQnKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2gocmVzdWx0KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIGlmICghZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgJHRoaXMuZGF0YSgnZGF0ZXBpY2tlcicsIChkYXRhID0gbmV3IERhdGVwaWNrZXIodGhpcywgJC5leHRlbmQoe30sICQuZm4uZGF0ZXBpY2tlci5kZWZhdWx0cywgb3B0aW9ucykpKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gcmVzdWx0cy5sZW5ndGggPT0gMSA/IHJlc3VsdHNbMF1cclxuICAgICAgICAgICAgOiByZXN1bHRzLmxlbmd0aCA/IHJlc3VsdHNcclxuICAgICAgICAgICAgOiBjaGFpbjtcclxuICAgIH07XHJcblxyXG4gICAgJC5mbi5kYXRlcGlja2VyLmRlZmF1bHRzID0ge1xyXG4gICAgICAgIGNvbnRhaW5lciA6ICdib2R5J1xyXG4gICAgfTtcclxuICAgICQuZm4uZGF0ZXBpY2tlci5Db25zdHJ1Y3RvciA9IERhdGVwaWNrZXI7XHJcblxyXG4gICAgdmFyIERQR2xvYmFsID0ge1xyXG4gICAgICAgIG1vZGVzOiBbXHJcblx0XHRcdHtcclxuXHRcdFx0ICAgIGNsc05hbWU6ICdkYXlzJyxcclxuXHRcdFx0ICAgIG5hdkZuYzogJ21vbnRocycsXHJcblx0XHRcdCAgICBuYXZTdGVwOiAxXHJcblx0XHRcdH0sXHJcblx0XHRcdHtcclxuXHRcdFx0ICAgIGNsc05hbWU6ICdtb250aHMnLFxyXG5cdFx0XHQgICAgbmF2Rm5jOiAneWVhcnMnLFxyXG5cdFx0XHQgICAgbmF2U3RlcDogMVxyXG5cdFx0XHR9LFxyXG5cdFx0XHR7XHJcblx0XHRcdCAgICBjbHNOYW1lOiAneWVhcnMnLFxyXG5cdFx0XHQgICAgbmF2Rm5jOiAneWVhcnMnLFxyXG5cdFx0XHQgICAgbmF2U3RlcDogMTBcclxuXHRcdFx0fV0sXHJcbiAgICAgICAgcGFyc2VEYXRlOiBmdW5jdGlvbiAodmFsdWUsIGZvcm1hdCkge1xyXG4gICAgICAgICAgICB2YXIgbW1udCA9IG51bGw7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZm9ybWF0KSA9PT0gJ1tvYmplY3QgQXJyYXldJykge1xyXG4gICAgICAgICAgICAgICAgICAgIG1tbnQgPSBtb21lbnQodmFsdWUsIGZvcm1hdCwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIG1tbnQgPSBtb21lbnQodmFsdWUsIGZvcm1hdCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCFtbW50IHx8ICFtbW50LmlzVmFsaWQoKSkge1xyXG4gICAgICAgICAgICAgICAgbW1udCA9IG1vbWVudCh2YWx1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCFtbW50IHx8ICFtbW50LmlzVmFsaWQoKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG1tbnQuaG91cnMoMCkubWludXRlcygwKS5zZWNvbmRzKDApLm1pbGxpc2Vjb25kcygwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGhlYWRUZW1wbGF0ZTogJzx0aGVhZD4nICtcclxuXHRcdFx0XHRcdFx0XHQnPHRyPicgK1xyXG5cdFx0XHRcdFx0XHRcdFx0Jzx0aCBjbGFzcz1cInByZXZcIj4mbHNhcXVvOzwvdGg+JyArXHJcblx0XHRcdFx0XHRcdFx0XHQnPHRoIGNvbHNwYW49XCI1XCIgY2xhc3M9XCJzd2l0Y2hcIj48L3RoPicgK1xyXG5cdFx0XHRcdFx0XHRcdFx0Jzx0aCBjbGFzcz1cIm5leHRcIj4mcnNhcXVvOzwvdGg+JyArXHJcblx0XHRcdFx0XHRcdFx0JzwvdHI+JyArXHJcblx0XHRcdFx0XHRcdCc8L3RoZWFkPicsXHJcbiAgICAgICAgY29udFRlbXBsYXRlOiAnPHRib2R5Pjx0cj48dGQgY29sc3Bhbj1cIjdcIj48L3RkPjwvdHI+PC90Ym9keT4nXHJcbiAgICB9O1xyXG4gICAgRFBHbG9iYWwudGVtcGxhdGUgPSAnPGRpdiBjbGFzcz1cImRhdGVwaWNrZXIgZHJvcGRvd24tbWVudVwiPicgK1xyXG5cdFx0XHRcdFx0XHRcdCc8ZGl2IGNsYXNzPVwiZGF0ZXBpY2tlci1kYXlzXCI+JyArXHJcblx0XHRcdFx0XHRcdFx0XHQnPHRhYmxlIGNsYXNzPVwiIHRhYmxlLWNvbmRlbnNlZFwiPicgK1xyXG5cdFx0XHRcdFx0XHRcdFx0XHREUEdsb2JhbC5oZWFkVGVtcGxhdGUgK1xyXG5cdFx0XHRcdFx0XHRcdFx0XHQnPHRib2R5PjwvdGJvZHk+JyArXHJcblx0XHRcdFx0XHRcdFx0XHQnPC90YWJsZT4nICtcclxuXHRcdFx0XHRcdFx0XHQnPC9kaXY+JyArXHJcblx0XHRcdFx0XHRcdFx0JzxkaXYgY2xhc3M9XCJkYXRlcGlja2VyLW1vbnRoc1wiPicgK1xyXG5cdFx0XHRcdFx0XHRcdFx0Jzx0YWJsZSBjbGFzcz1cInRhYmxlLWNvbmRlbnNlZFwiPicgK1xyXG5cdFx0XHRcdFx0XHRcdFx0XHREUEdsb2JhbC5oZWFkVGVtcGxhdGUgK1xyXG5cdFx0XHRcdFx0XHRcdFx0XHREUEdsb2JhbC5jb250VGVtcGxhdGUgK1xyXG5cdFx0XHRcdFx0XHRcdFx0JzwvdGFibGU+JyArXHJcblx0XHRcdFx0XHRcdFx0JzwvZGl2PicgK1xyXG5cdFx0XHRcdFx0XHRcdCc8ZGl2IGNsYXNzPVwiZGF0ZXBpY2tlci15ZWFyc1wiPicgK1xyXG5cdFx0XHRcdFx0XHRcdFx0Jzx0YWJsZSBjbGFzcz1cInRhYmxlLWNvbmRlbnNlZFwiPicgK1xyXG5cdFx0XHRcdFx0XHRcdFx0XHREUEdsb2JhbC5oZWFkVGVtcGxhdGUgK1xyXG5cdFx0XHRcdFx0XHRcdFx0XHREUEdsb2JhbC5jb250VGVtcGxhdGUgK1xyXG5cdFx0XHRcdFx0XHRcdFx0JzwvdGFibGU+JyArXHJcblx0XHRcdFx0XHRcdFx0JzwvZGl2PicgK1xyXG5cdFx0XHRcdFx0XHQnPC9kaXY+JztcclxuXHJcbn0odGhpcy5qUXVlcnksIHRoaXMubW9tZW50KTtcbn0pLmNhbGwoZ2xvYmFsLCBtb2R1bGUsIHVuZGVmaW5lZCwgdW5kZWZpbmVkKTtcblxufSkuY2FsbCh0aGlzLHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIgPyBnbG9iYWwgOiB0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiA/IHNlbGYgOiB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiID8gd2luZG93IDoge30pXG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldDp1dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJbE5qY21sd2RITXZiR2xpTDIxdmJXVnVkQzFrWVhSbGNHbGphMlZ5TG1weklsMHNJbTVoYldWeklqcGJYU3dpYldGd2NHbHVaM01pT2lJN1FVRkJRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRWlMQ0ptYVd4bElqb2laMlZ1WlhKaGRHVmtMbXB6SWl3aWMyOTFjbU5sVW05dmRDSTZJaUlzSW5OdmRYSmpaWE5EYjI1MFpXNTBJanBiSWx4dU95QnRiMjFsYm5RZ1BTQm5iRzlpWVd3dWJXOXRaVzUwSUQwZ2NtVnhkV2x5WlNoY0ltMXZiV1Z1ZEZ3aUtUdGNibXBSZFdWeWVTQTlJR2RzYjJKaGJDNXFVWFZsY25rZ1BTQnlaWEYxYVhKbEtGd2lhbkYxWlhKNVhDSXBPMXh1T3lCMllYSWdYMTlpY205M2MyVnlhV1o1WDNOb2FXMWZjbVZ4ZFdseVpWOWZQWEpsY1hWcGNtVTdLR1oxYm1OMGFXOXVJR0p5YjNkelpYSnBabmxUYUdsdEtHMXZaSFZzWlN3Z1pHVm1hVzVsTENCeVpYRjFhWEpsS1NCN1hHNHZLaUE5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQxY2NseHVJQ29nVFc5dFpXNTBSR0YwWlhCcFkydGxjbHh5WEc0Z0tpQkNZWE5sWkNCdmJpQm9kSFJ3T2k4dmQzZDNMbVY1WldOdmJpNXlieTlpYjI5MGMzUnlZWEF0WkdGMFpYQnBZMnRsY2x4eVhHNGdLaUE5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQxY2NseHVJQ29nUTI5d2VYSnBaMmgwSURJd01USWdRVzVrY21WeklFMXZjMk5vYVc1cFhISmNiaUFxWEhKY2JpQXFJRXhwWTJWdWMyVmtJSFZ1WkdWeUlIUm9aU0JCY0dGamFHVWdUR2xqWlc1elpTd2dWbVZ5YzJsdmJpQXlMakFnS0hSb1pTQmNJa3hwWTJWdWMyVmNJaWs3WEhKY2JpQXFJSGx2ZFNCdFlYa2dibTkwSUhWelpTQjBhR2x6SUdacGJHVWdaWGhqWlhCMElHbHVJR052YlhCc2FXRnVZMlVnZDJsMGFDQjBhR1VnVEdsalpXNXpaUzVjY2x4dUlDb2dXVzkxSUcxaGVTQnZZblJoYVc0Z1lTQmpiM0I1SUc5bUlIUm9aU0JNYVdObGJuTmxJR0YwWEhKY2JpQXFYSEpjYmlBcUlHaDBkSEE2THk5M2QzY3VZWEJoWTJobExtOXlaeTlzYVdObGJuTmxjeTlNU1VORlRsTkZMVEl1TUZ4eVhHNGdLbHh5WEc0Z0tpQlZibXhsYzNNZ2NtVnhkV2x5WldRZ1lua2dZWEJ3YkdsallXSnNaU0JzWVhjZ2IzSWdZV2R5WldWa0lIUnZJR2x1SUhkeWFYUnBibWNzSUhOdlpuUjNZWEpsWEhKY2JpQXFJR1JwYzNSeWFXSjFkR1ZrSUhWdVpHVnlJSFJvWlNCTWFXTmxibk5sSUdseklHUnBjM1J5YVdKMWRHVmtJRzl1SUdGdUlGd2lRVk1nU1ZOY0lpQkNRVk5KVXl4Y2NseHVJQ29nVjBsVVNFOVZWQ0JYUVZKU1FVNVVTVVZUSUU5U0lFTlBUa1JKVkVsUFRsTWdUMFlnUVU1WklFdEpUa1FzSUdWcGRHaGxjaUJsZUhCeVpYTnpJRzl5SUdsdGNHeHBaV1F1WEhKY2JpQXFJRk5sWlNCMGFHVWdUR2xqWlc1elpTQm1iM0lnZEdobElITndaV05wWm1saklHeGhibWQxWVdkbElHZHZkbVZ5Ym1sdVp5QndaWEp0YVhOemFXOXVjeUJoYm1SY2NseHVJQ29nYkdsdGFYUmhkR2x2Ym5NZ2RXNWtaWElnZEdobElFeHBZMlZ1YzJVdVhISmNiaUFxSUQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBTQXFMMXh5WEc1Y2NseHVJV1oxYm1OMGFXOXVJQ2drTENCdGIyMWxiblFzSUhWdVpHVm1hVzVsWkNrZ2UxeHlYRzVjY2x4dUlDQWdJQzh2SUZCcFkydGxjaUJ2WW1wbFkzUmNjbHh1WEhKY2JpQWdJQ0IyWVhJZ1JHRjBaWEJwWTJ0bGNpQTlJR1oxYm1OMGFXOXVJQ2hsYkdWdFpXNTBMQ0J2Y0hScGIyNXpLU0I3WEhKY2JpQWdJQ0FnSUNBZ2RHaHBjeTVsYkdWdFpXNTBJRDBnSkNobGJHVnRaVzUwS1R0Y2NseHVJQ0FnSUNBZ0lDQjBhR2x6TG1GMWRHOUlhV1JsSUQwZ2RISjFaU0FtSmlBb2IzQjBhVzl1Y3k1aGRYUnZTR2xrWlNBaFBUMGdabUZzYzJVcElDWW1JQ2gwYUdsekxtVnNaVzFsYm5RdVpHRjBZU2duWkdGMFpYQnBZMnRsY2kxaGRYUnZhR2xrWlNjcElDRTlQU0JtWVd4elpTazdYSEpjYmlBZ0lDQWdJQ0FnZEdocGN5NW1iM0p0WVhRZ1BTQnZjSFJwYjI1ekxtWnZjbTFoZENCOGZDQjBhR2x6TG1Wc1pXMWxiblF1WkdGMFlTZ25aR0YwWlhCcFkydGxjaTFtYjNKdFlYUW5LU0I4ZkNCdGIyMWxiblF1Ykc5allXeGxSR0YwWVNncExteHZibWRFWVhSbFJtOXliV0YwS0NkTUp5azdYSEpjYmlBZ0lDQWdJQ0FnZEdocGN5NWpZV3hsYm1SaGNsQnNZV05sYldWdWRDQTlJRzl3ZEdsdmJuTXVZMkZzWlc1a1lYSlFiR0ZqWlcxbGJuUWdmSHdnZEdocGN5NWxiR1Z0Wlc1MExtUmhkR0VvSjJSaGRHVndhV05yWlhJdFkyRnNaVzVrWVhKd2JHRmpaVzFsYm5RbktTQjhmQ0FuY21sbmFIUW5PMXh5WEc0Z0lDQWdJQ0FnSUhSb2FYTXVjR2xqYTJWeUlEMGdKQ2hFVUVkc2IySmhiQzUwWlcxd2JHRjBaU2xjY2x4dVhIUmNkRngwWEhSY2RGeDBYSFF1WVhCd1pXNWtWRzhvYjNCMGFXOXVjeTVqYjI1MFlXbHVaWElwWEhKY2JseDBYSFJjZEZ4MFhIUmNkRngwTG05dUtIdGNjbHh1WEhSY2RGeDBYSFJjZEZ4MFhIUWdJQ0FnWTJ4cFkyczZJQ1F1Y0hKdmVIa29kR2hwY3k1amJHbGpheXdnZEdocGN5a3NYSEpjYmx4MFhIUmNkRngwWEhSY2RGeDBJQ0FnSUcxdmRYTmxaRzkzYmpvZ0pDNXdjbTk0ZVNoMGFHbHpMbTF2ZFhObFpHOTNiaXdnZEdocGN5bGNjbHh1WEhSY2RGeDBYSFJjZEZ4MFhIUjlLVHRjY2x4dVhISmNiaUFnSUNBZ0lDQWdkR2hwY3k0a2RtbGxkM0J2Y25RZ1BTQWtLRzl3ZEdsdmJuTXVkbWxsZDNCdmNuUWdmSHdnYjNCMGFXOXVjeTVqYjI1MFlXbHVaWElwTzF4eVhHNWNjbHh1SUNBZ0lDQWdJQ0IyWVhJZ2MzUmhjblJFWVhSbFZHVjRkQ0E5SUc5d2RHbHZibk11YzNSaGNuUkVZWFJsSUh4OElIUm9hWE11Wld4bGJXVnVkQzVrWVhSaEtDZGtZWFJsY0dsamEyVnlMWE4wWVhKMFpHRjBaU2NwSUh4OElIVnVaR1ZtYVc1bFpEdGNjbHh1SUNBZ0lDQWdJQ0IwYUdsekxuTjBZWEowUkdGMFpTQTlJQ2h6ZEdGeWRFUmhkR1ZVWlhoMEtTQS9JRVJRUjJ4dlltRnNMbkJoY25ObFJHRjBaU2h6ZEdGeWRFUmhkR1ZVWlhoMExDQjBhR2x6TG1admNtMWhkQ2tnT2lCMWJtUmxabWx1WldRN1hISmNiaUFnSUNBZ0lDQWdkbUZ5SUdWdVpFUmhkR1ZVWlhoMElEMGdiM0IwYVc5dWN5NWxibVJFWVhSbElIeDhJSFJvYVhNdVpXeGxiV1Z1ZEM1a1lYUmhLQ2RrWVhSbGNHbGphMlZ5TFdWdVpHUmhkR1VuS1NCOGZDQjFibVJsWm1sdVpXUTdYSEpjYmlBZ0lDQWdJQ0FnZEdocGN5NWxibVJFWVhSbElEMGdLR1Z1WkVSaGRHVlVaWGgwS1NBL0lFUlFSMnh2WW1Gc0xuQmhjbk5sUkdGMFpTaGxibVJFWVhSbFZHVjRkQ3dnZEdocGN5NW1iM0p0WVhRcElEb2dkVzVrWldacGJtVmtPMXh5WEc0Z0lDQWdJQ0FnSUhSb2FYTXVhWE5KYm5CMWRDQTlJSFJvYVhNdVpXeGxiV1Z1ZEM1cGN5Z25hVzV3ZFhRbktUdGNjbHh1SUNBZ0lDQWdJQ0IwYUdsekxtTnZiWEJ2Ym1WdWRDQTlJQ0YwYUdsekxtbHpTVzV3ZFhRZ0ppWWdkR2hwY3k1bGJHVnRaVzUwTG1sektDY3VaR0YwWlNjcElEOGdkR2hwY3k1bGJHVnRaVzUwTG1acGJtUW9KeTVwYm5CMWRDMW5jbTkxY0MxaFpHUnZiaXdnTG1Ga1pDMXZiaWNwSURvZ1ptRnNjMlU3WEhKY2JseHlYRzRnSUNBZ0lDQWdJR2xtSUNoMGFHbHpMbWx6U1c1d2RYUXBJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1bGJHVnRaVzUwTG05dUtIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR1p2WTNWek9pQWtMbkJ5YjNoNUtIUm9hWE11YzJodmR5d2dkR2hwY3lrc1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmliSFZ5T2lBa0xuQnliM2g1S0daMWJtTjBhVzl1SUNobEtTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTVmYUdsa1pTZ3BPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11ZEhKcFoyZGxja05vWVc1blpVUmhkR1VvS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMHNJSFJvYVhNcExGeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhVzV3ZFhRNklDUXVjSEp2ZUhrb1puVnVZM1JwYjI0Z0tHVXBJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG5Wd1pHRjBaVVp5YjIxV1lXeDFaU2gwY25WbEtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDBzSUhSb2FYTXBMRnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYTJWNWRYQTZJQ1F1Y0hKdmVIa29ablZ1WTNScGIyNGdLR1VwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb1pTNXJaWGxEYjJSbElEMDlJREV6S1Z4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMblZ3WkdGMFpVWnliMjFXWVd4MVpTZ3BPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlN3Z2RHaHBjeWtzWEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCamJHbGphem9nSkM1d2NtOTRlU2gwYUdsekxuTm9iM2NzSUhSb2FYTXBYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIMHBPMXh5WEc0Z0lDQWdJQ0FnSUgwZ1pXeHpaU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJR2xtSUNoMGFHbHpMbU52YlhCdmJtVnVkQ2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTVqYjIxd2IyNWxiblF1YjI0b0oyTnNhV05ySnl3Z0pDNXdjbTk0ZVNoMGFHbHpMbk5vYjNjc0lIUm9hWE1wS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZlNCbGJITmxJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVaV3hsYldWdWRDNXZiaWduWTJ4cFkyc25MQ0FrTG5CeWIzaDVLSFJvYVhNdWMyaHZkeXdnZEdocGN5a3BPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ0lIUm9hWE11YldsdVZtbGxkMDF2WkdVZ1BTQnZjSFJwYjI1ekxtMXBibFpwWlhkTmIyUmxJSHg4SUhSb2FYTXVaV3hsYldWdWRDNWtZWFJoS0Nka1lYUmxjR2xqYTJWeUxXMXBiblpwWlhkdGIyUmxKeWtnZkh3Z01EdGNjbHh1SUNBZ0lDQWdJQ0JwWmlBb2RIbHdaVzltSUhSb2FYTXViV2x1Vm1sbGQwMXZaR1VnUFQwOUlDZHpkSEpwYm1jbktTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lITjNhWFJqYUNBb2RHaHBjeTV0YVc1V2FXVjNUVzlrWlNrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZMkZ6WlNBbmJXOXVkR2h6SnpwY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxtMXBibFpwWlhkTmIyUmxJRDBnTVR0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JpY21WaGF6dGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR05oYzJVZ0ozbGxZWEp6SnpwY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxtMXBibFpwWlhkTmIyUmxJRDBnTWp0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JpY21WaGF6dGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR1JsWm1GMWJIUTZYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTV0YVc1V2FXVjNUVzlrWlNBOUlEQTdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1luSmxZV3M3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lDQWdkR2hwY3k1MmFXVjNUVzlrWlNBOUlHOXdkR2x2Ym5NdWRtbGxkMDF2WkdVZ2ZId2dkR2hwY3k1bGJHVnRaVzUwTG1SaGRHRW9KMlJoZEdWd2FXTnJaWEl0ZG1sbGQyMXZaR1VuS1NCOGZDQXdPMXh5WEc0Z0lDQWdJQ0FnSUdsbUlDaDBlWEJsYjJZZ2RHaHBjeTUyYVdWM1RXOWtaU0E5UFQwZ0ozTjBjbWx1WnljcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2MzZHBkR05vSUNoMGFHbHpMblpwWlhkTmIyUmxLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCallYTmxJQ2R0YjI1MGFITW5PbHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11ZG1sbGQwMXZaR1VnUFNBeE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdKeVpXRnJPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWTJGelpTQW5lV1ZoY25Nbk9seHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVkbWxsZDAxdlpHVWdQU0F5TzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR0p5WldGck8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdaR1ZtWVhWc2REcGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMblpwWlhkTmIyUmxJRDBnTUR0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JpY21WaGF6dGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnSUNCMGFHbHpMbk4wWVhKMFZtbGxkMDF2WkdVZ1BTQjBhR2x6TG5acFpYZE5iMlJsTzF4eVhHNGdJQ0FnSUNBZ0lIUm9hWE11ZDJWbGExTjBZWEowSUQwZ2IzQjBhVzl1Y3k1M1pXVnJVM1JoY25RZ2ZId2dkR2hwY3k1bGJHVnRaVzUwTG1SaGRHRW9KMlJoZEdWd2FXTnJaWEl0ZDJWbGEzTjBZWEowSnlrZ2ZId2dNRHRjY2x4dUlDQWdJQ0FnSUNCMGFHbHpMbmRsWld0RmJtUWdQU0IwYUdsekxuZGxaV3RUZEdGeWRDQTlQVDBnTUNBL0lEWWdPaUIwYUdsekxuZGxaV3RUZEdGeWRDQXRJREU3WEhKY2JpQWdJQ0FnSUNBZ2RHaHBjeTVtYVd4c1JHOTNLQ2s3WEhKY2JpQWdJQ0FnSUNBZ2RHaHBjeTVtYVd4c1RXOXVkR2h6S0NrN1hISmNiaUFnSUNBZ0lDQWdkR2hwY3k1elpYUkRkWE4wYjIxRGJHRnpjMlZ6S0NrN1hISmNiaUFnSUNBZ0lDQWdkR2hwY3k1MWNHUmhkR1ZHY205dFZtRnNkV1VvS1R0Y2NseHVJQ0FnSUNBZ0lDQjBhR2x6TG5Ob2IzZE5iMlJsS0NrN1hISmNiaUFnSUNBZ0lDQWdkR2hwY3k1eVpXWnlaWE5vS0NrN1hISmNiaUFnSUNCOU8xeHlYRzVjY2x4dUlDQWdJRVJoZEdWd2FXTnJaWEl1Y0hKdmRHOTBlWEJsSUQwZ2UxeHlYRzRnSUNBZ0lDQWdJR052Ym5OMGNuVmpkRzl5T2lCRVlYUmxjR2xqYTJWeUxGeHlYRzRnSUNBZ0lDQWdJR2RsZERvZ1puVnVZM1JwYjI0Z0tDa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z0tIUm9hWE11Ylc5dFpXNTBJQ1ltSUhSb2FYTXViVzl0Wlc1MExtTnNiMjVsS0NrcE8xeHlYRzRnSUNBZ0lDQWdJSDBzWEhKY2JpQWdJQ0FnSUNBZ1oyVjBRWE5VWlhoME9pQm1kVzVqZEdsdmJpQW9abTl5YldGMEtTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIWmhjaUJrYVhOd2JHRjVSbTl5YldGMElEMGdkR2hwY3k1bWIzSnRZWFE3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJR2xtSUNoUFltcGxZM1F1Y0hKdmRHOTBlWEJsTG5SdlUzUnlhVzVuTG1OaGJHd29aR2x6Y0d4aGVVWnZjbTFoZENrZ1BUMDlJQ2RiYjJKcVpXTjBJRUZ5Y21GNVhTY3BJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdScGMzQnNZWGxHYjNKdFlYUWdQU0JrYVhOd2JHRjVSbTl5YldGMFd6QmRPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lISmxkSFZ5YmlBb2RHaHBjeTV0YjIxbGJuUWdKaVlnZEdocGN5NXRiMjFsYm5RdVptOXliV0YwS0dadmNtMWhkQ0I4ZkNCa2FYTndiR0Y1Um05eWJXRjBLU2tnZkh3Z0p5YzdYSEpjYmlBZ0lDQWdJQ0FnZlN4Y2NseHVJQ0FnSUNBZ0lDQnphRzkzT2lCbWRXNWpkR2x2YmlBb1pTa2dlMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tIUm9hWE11YVhOSmJuQjFkQ0FtSmlCMGFHbHpMbVZzWlcxbGJuUXVhWE1vSnpwa2FYTmhZbXhsWkNjcEtTQjdJSEpsZEhWeWJqc2dmVnh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnWld4elpTQnBaaUFvZEdocGN5NWxiR1Z0Wlc1MExtTm9hV3hrY21WdUtDZHBibkIxZENjcExtbHpLQ2M2WkdsellXSnNaV1FuS1NrZ2V5QnlaWFIxY200N0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdWNHbGphMlZ5TG5Ob2IzY29LVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1b1pXbG5hSFFnUFNBb2RHaHBjeTVqYjIxd2IyNWxiblFnSmlZZ2RHaHBjeTVqYjIxd2IyNWxiblF1YjNWMFpYSklaV2xuYUhRb0tTa2dmSHdnZEdocGN5NWxiR1Z0Wlc1MExtOTFkR1Z5U0dWcFoyaDBLQ2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdWNHeGhZMlVvS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSkNoM2FXNWtiM2NwTG05dUtDZHlaWE5wZW1VbkxDQWtMbkJ5YjNoNUtIUm9hWE11Y0d4aFkyVXNJSFJvYVhNcEtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLR1VwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHVXVjM1J2Y0ZCeWIzQmhaMkYwYVc5dUtDazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JsTG5CeVpYWmxiblJFWldaaGRXeDBLQ2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdhV1lnS0NGMGFHbHpMbWx6U1c1d2RYUXBJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNRb1pHOWpkVzFsYm5RcExtOXVLQ2R0YjNWelpXUnZkMjRuTENBa0xuQnliM2g1S0hSb2FYTXVhR2xrWlN3Z2RHaHBjeWtwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdVpXeGxiV1Z1ZEM1MGNtbG5aMlZ5S0h0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUjVjR1U2SUNkemFHOTNKMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlLVHRjY2x4dUlDQWdJQ0FnSUNCOUxGeHlYRzVjY2x4dUlDQWdJQ0FnSUNCZmFHbGtaVG9nWm5WdVkzUnBiMjRnS0dVcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0x5OGdWMmhsYmlCbmIybHVaeUJtY205dElIUm9aU0JwYm5CMWRDQjBieUIwYUdVZ2NHbGphMlZ5TENCSlJTQm9ZVzVrYkdWeklIUm9aU0JpYkhWeUwyTnNhV05yWEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQzh2SUdWMlpXNTBjeUJrYVdabVpYSmxiblJzZVNCMGFHRnVJRzkwYUdWeUlHSnliM2R6WlhKekxDQnBiaUJ6ZFdOb0lHRWdkMkY1SUhSb1lYUWdkR2hsSUdKc2RYSmNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0x5OGdaWFpsYm5RZ2RISnBaMmRsY25NZ1lTQm9hV1JsSUdKbFptOXlaU0IwYUdVZ1kyeHBZMnNnWlhabGJuUWdZMkZ1SUhOMGIzQWdjSEp2Y0dGbllYUnBiMjR1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJR2xtSUNodVlYWnBaMkYwYjNJdWRYTmxja0ZuWlc1MExtbHVaR1Y0VDJZb1hDSk5VMGxGSURndU1Gd2lLU0ErSURBcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFpoY2lCMElEMGdkR2hwY3l3Z1lYSm5jeUE5SUdGeVozVnRaVzUwY3p0Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JtZFc1amRHbHZiaUJqWVc1alpXeGZhR2xrWlNncElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCamJHVmhjbFJwYldWdmRYUW9hR2xrWlY5MGFXMWxiM1YwS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JsTG5SaGNtZGxkQzVtYjJOMWN5Z3BPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUXVjR2xqYTJWeUxtOW1aaWduWTJ4cFkyc25MQ0JqWVc1alpXeGZhR2xrWlNrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1puVnVZM1JwYjI0Z1pHOWZhR2xrWlNncElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMExtaHBaR1V1WVhCd2JIa29kQ3dnWVhKbmN5azdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RDNXdhV05yWlhJdWIyWm1LQ2RqYkdsamF5Y3NJR05oYm1ObGJGOW9hV1JsS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbkJwWTJ0bGNpNXZiaWduWTJ4cFkyc25MQ0JqWVc1alpXeGZhR2xrWlNrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjJZWElnYUdsa1pWOTBhVzFsYjNWMElEMGdjMlYwVkdsdFpXOTFkQ2hrYjE5b2FXUmxMQ0F4TURBcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCOUlHVnNjMlVnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUhSb2FYTXVhR2xrWlM1aGNIQnNlU2gwYUdsekxDQmhjbWQxYldWdWRITXBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJQ0FnZlN4Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnYUdsa1pUb2dablZ1WTNScGIyNGdLQ2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxuQnBZMnRsY2k1b2FXUmxLQ2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ1FvZDJsdVpHOTNLUzV2Wm1Zb0ozSmxjMmw2WlNjc0lIUm9hWE11Y0d4aFkyVXBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG5acFpYZE5iMlJsSUQwZ2RHaHBjeTV6ZEdGeWRGWnBaWGROYjJSbE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbk5vYjNkTmIyUmxLQ2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJR2xtSUNnaGRHaHBjeTVwYzBsdWNIVjBLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBa0tHUnZZM1Z0Wlc1MEtTNXZabVlvSjIxdmRYTmxaRzkzYmljc0lIUm9hWE11YUdsa1pTazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTV5WldaeVpYTm9LQ2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdVpXeGxiV1Z1ZEM1MGNtbG5aMlZ5S0h0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUjVjR1U2SUNkb2FXUmxKMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlLVHRjY2x4dUlDQWdJQ0FnSUNCOUxGeHlYRzVjY2x4dUlDQWdJQ0FnSUNCeVpXWnlaWE5vT2lCbWRXNWpkR2x2YmlBb0tTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIWmhjaUJtYjNKdFlYUmxaQ0E5SUhSb2FYTXVaMlYwUVhOVVpYaDBLQ2s3WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNCcFppQW9JWFJvYVhNdWFYTkpibkIxZENrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1lnS0hSb2FYTXVZMjl0Y0c5dVpXNTBLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1bGJHVnRaVzUwTG1acGJtUW9KMmx1Y0hWMEp5a3VjSEp2Y0NnbmRtRnNkV1VuTENCbWIzSnRZWFJsWkNrdVkyaGhibWRsS0NrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxtVnNaVzFsYm5RdVpHRjBZU2duWkdGMFpTY3NJR1p2Y20xaGRHVmtLUzVqYUdGdVoyVW9LVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdmU0JsYkhObElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdVpXeGxiV1Z1ZEM1d2NtOXdLQ2QyWVd4MVpTY3NJR1p2Y20xaGRHVmtLUzVqYUdGdVoyVW9LVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0FnSUgwc1hISmNibHh5WEc0Z0lDQWdJQ0FnSUhObGREb2dablZ1WTNScGIyNGdLRzVsZDBSaGRHVXNJRzl0YldsMFJYWmxiblFwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NTFjR1JoZEdVb2JtVjNSR0YwWlN3Z2IyMXRhWFJGZG1WdWRDazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11Y21WbWNtVnphQ2dwTzF4eVhHNGdJQ0FnSUNBZ0lIMHNYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lIQnNZV05sT2lCbWRXNWpkR2x2YmlBb0tTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIWmhjaUJ6YjNWeVkyVkpkR1Z0SUQwZ2RHaHBjeTVqYjIxd2IyNWxiblFnUHlCMGFHbHpMbU52YlhCdmJtVnVkQ0E2SUhSb2FYTXVaV3hsYldWdWREdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RtRnlJRzltWm5ObGRDQTlJSE52ZFhKalpVbDBaVzB1YjJabWMyVjBLQ2s3WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNCMllYSWdkbWxsZDNCdmNuUlBabVp6WlhRZ1BTQjBhR2x6TGlSMmFXVjNjRzl5ZEM1dlptWnpaWFFvS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZG1GeUlITmpjbTlzYkZSdmNDQTlJSFJvYVhNdUpIWnBaWGR3YjNKMExuTmpjbTlzYkZSdmNDZ3BPMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZG1GeUlIcEpibVJsZUNBOUlIQmhjbk5sU1c1MEtIUm9hWE11Wld4bGJXVnVkQzV3WVhKbGJuUnpLQ2t1Wm1sc2RHVnlLR1oxYm1OMGFXOXVJQ2dwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIWmhjaUI2U1c1a1pYZ2dQU0FrS0hSb2FYTXBMbU56Y3lnbmVpMXBibVJsZUNjcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlIcEpibVJsZUNBaFBTQW5ZWFYwYnljZ0ppWWdla2x1WkdWNElDRTlJQ2N3Snp0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZlNrdVptbHljM1FvS1M1amMzTW9KM290YVc1a1pYZ25LU2tnS3lBeE1EdGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJR2xtSUNoMGFHbHpMbU5oYkdWdVpHRnlVR3hoWTJWdFpXNTBJRDA5SUNkc1pXWjBKeWtnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTV3YVdOclpYSXVZM056S0h0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYjNBNklHOW1abk5sZEM1MGIzQWdLeUIwYUdsekxtaGxhV2RvZEN4Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzWldaME9pQnZabVp6WlhRdWJHVm1kQ0FySUhOdmRYSmpaVWwwWlcxYk1GMHViMlptYzJWMFYybGtkR2dnTFNCMGFHbHpMbkJwWTJ0bGNsc3dYUzV2Wm1aelpYUlhhV1IwYUZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZTazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIMGdaV3h6WlNCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG5CcFkydGxjaTVqYzNNb2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSdmNEb2diMlptYzJWMExuUnZjQ0FySUhSb2FYTXVhR1ZwWjJoMExGeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd4bFpuUTZJRzltWm5ObGRDNXNaV1owTEZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSHBKYm1SbGVDQTZJSHBKYm1SbGVGeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmU2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnSUNCOUxGeHlYRzRnSUNBZ0lDQWdJR3hoYzNSV1lXeDFaVG9nYm5Wc2JDeGNjbHh1SUNBZ0lDQWdJQ0IwY21sbloyVnlRMmhoYm1kbFJHRjBaVG9nWm5WdVkzUnBiMjRnS0NrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCMllYSWdibVYzVm1Gc2RXVWdQU0IwYUdsekxtMXZiV1Z1ZENBL0lIUm9hWE11Ylc5dFpXNTBMblpoYkhWbFQyWW9LU0E2SUc1MWJHdzdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2h1WlhkV1lXeDFaU0FoUFNCMGFHbHpMbXhoYzNSV1lXeDFaU2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTVzWVhOMFZtRnNkV1VnUFNCdVpYZFdZV3gxWlR0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11Wld4bGJXVnVkQzUwY21sbloyVnlLSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBlWEJsT2lBblkyaGhibWRsUkdGMFpTZGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDBwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJR2xtSUNoMGFHbHpMbUYxZEc5SWFXUmxLVnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NW9hV1JsS0NrN1hISmNiaUFnSUNBZ0lDQWdmU3hjY2x4dUlDQWdJQ0FnSUNCMWNHUmhkR1ZHY205dFZtRnNkV1U2SUdaMWJtTjBhVzl1SUNodmJXMXBkRVYyWlc1MEtTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11ZFhCa1lYUmxLSFJvYVhNdWFYTkpibkIxZENBL0lIUm9hWE11Wld4bGJXVnVkQzV3Y205d0tDZDJZV3gxWlNjcElEb2dkR2hwY3k1bGJHVnRaVzUwTG1SaGRHRW9KMlJoZEdVbktTd2diMjF0YVhSRmRtVnVkQ2s3WEhKY2JpQWdJQ0FnSUNBZ2ZTeGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ2RYQmtZWFJsT2lCbWRXNWpkR2x2YmlBb2JtVjNSR0YwWlN3Z2IyMXRhWFJGZG1WdWRDa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjJZWElnYjNKcFoybHVZV3hXWVd4MVpTQTlJSFJvYVhNdWJXOXRaVzUwSUQ4Z2RHaHBjeTV0YjIxbGJuUXVkbUZzZFdWUFppZ3BJRG9nYm5Wc2JEdGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdWJXOXRaVzUwSUQwZ1JGQkhiRzlpWVd3dWNHRnljMlZFWVhSbEtHNWxkMFJoZEdVc0lIUm9hWE11Wm05eWJXRjBLVHRjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUhaaGNpQnVaWGRXWVd4MVpTQTlJSFJvYVhNdWJXOXRaVzUwSUQ4Z2RHaHBjeTV0YjIxbGJuUXVkbUZzZFdWUFppZ3BJRG9nYm5Wc2JEdGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJR2xtSUNnaGRHaHBjeTUyYVdWM1JHRjBaU0I4ZkNCdmNtbG5hVzVoYkZaaGJIVmxJQ0U5SUc1bGQxWmhiSFZsS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG5acFpYZEVZWFJsSUQwZ2RHaHBjeTVuWlhRb0tTQjhmQ0J0YjIxbGJuUW9LUzVvYjNWeWN5Z3dLUzV0YVc1MWRHVnpLREFwTG5ObFkyOXVaSE1vTUNrdWJXbHNiR2x6WldOdmJtUnpLREFwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTVtYVd4c0tDazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxtVnNaVzFsYm5RdWRISnBaMmRsY2loN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEhsd1pUb2dKMk5vWVc1blpVUmhkR1ZKYm5OMFlXNTBKMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlNrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tDRnZiVzFwZEVWMlpXNTBLVnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NTBjbWxuWjJWeVEyaGhibWRsUkdGMFpTZ3BPMXh5WEc0Z0lDQWdJQ0FnSUgwc1hISmNibHh5WEc0Z0lDQWdJQ0FnSUdacGJHeEViM2M2SUdaMWJtTjBhVzl1SUNncElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RtRnlJR1J2ZDBOdWRDQTlJSFJvYVhNdWQyVmxhMU4wWVhKME8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCMllYSWdhSFJ0YkNBOUlDYzhkSEkrSnp0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZG1GeUlHUmhlWE5OYVc0Z1BTQWtMbkJ5YjNoNUtHMXZiV1Z1ZEM1c2IyTmhiR1ZFWVhSaEtDa3VkMlZsYTJSaGVYTk5hVzRzSUcxdmJXVnVkQzVzYjJOaGJHVkVZWFJoS0NrcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCM2FHbHNaU0FvWkc5M1EyNTBJRHdnZEdocGN5NTNaV1ZyVTNSaGNuUWdLeUEzS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQm9kRzFzSUNzOUlDYzhkR2dnWTJ4aGMzTTlYQ0prYjNkY0lqNG5JQ3NnWkdGNWMwMXBiaWh0YjIxbGJuUW9LUzVrWVhrb0tHUnZkME51ZENzcktTQWxJRGNwS1NBcklDYzhMM1JvUGljN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnYUhSdGJDQXJQU0FuUEM5MGNqNG5PMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG5CcFkydGxjaTVtYVc1a0tDY3VaR0YwWlhCcFkydGxjaTFrWVhseklIUm9aV0ZrSnlrdVlYQndaVzVrS0doMGJXd3BPMXh5WEc0Z0lDQWdJQ0FnSUgwc1hISmNibHh5WEc0Z0lDQWdJQ0FnSUdacGJHeE5iMjUwYUhNNklHWjFibU4wYVc5dUlDZ3BJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdkbUZ5SUdoMGJXd2dQU0FuSnp0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZG1GeUlHa2dQU0F3TzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0IyWVhJZ2JXOXVkR2h6VTJodmNuUWdQU0FrTG5CeWIzaDVLRzF2YldWdWRDNXNiMk5oYkdWRVlYUmhLQ2t1Ylc5dWRHaHpVMmh2Y25Rc0lHMXZiV1Z1ZEM1c2IyTmhiR1ZFWVhSaEtDa3BPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjNhR2xzWlNBb2FTQThJREV5S1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQm9kRzFzSUNzOUlDYzhjM0JoYmlCamJHRnpjejFjSW0xdmJuUm9YQ0krSnlBcklHMXZiblJvYzFOb2IzSjBLRzF2YldWdWRDZ3BMbk4wWVhKMFQyWW9KMjF2Ym5Sb0p5a3ViVzl1ZEdnb2FTc3JLU2tnS3lBblBDOXpjR0Z1UGljN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NXdhV05yWlhJdVptbHVaQ2duTG1SaGRHVndhV05yWlhJdGJXOXVkR2h6SUhSa0p5a3VZWEJ3Wlc1a0tHaDBiV3dwTzF4eVhHNGdJQ0FnSUNBZ0lIMHNYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lHWnBiR3c2SUdaMWJtTjBhVzl1SUNncElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RtRnlJSGxsWVhJZ1BTQjBhR2x6TG5acFpYZEVZWFJsTG5sbFlYSW9LVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdkbUZ5SUcxdmJuUm9JRDBnZEdocGN5NTJhV1YzUkdGMFpTNXRiMjUwYUNncE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCMllYSWdZM1Z5Y21WdWRFMXZiV1Z1ZENBOUlIUm9hWE11WjJWMEtDazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIWmhjaUJqZFhKeVpXNTBSR0YwWlNBOUlHTjFjbkpsYm5STmIyMWxiblFnUHlCamRYSnlaVzUwVFc5dFpXNTBMblpoYkhWbFQyWW9LU0E2SUc1MWJHdzdJQzh2VkU5RVR6b2dkWE5sSUdScFptWmNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RtRnlJR04xY25KbGJuUlpaV0Z5SUQwZ1kzVnljbVZ1ZEUxdmJXVnVkQ0EvSUdOMWNuSmxiblJOYjIxbGJuUXVlV1ZoY2lncElEb2diblZzYkR0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZG1GeUlHTjFjbkpsYm5STmIyNTBhQ0E5SUdOMWNuSmxiblJOYjIxbGJuUWdQeUJqZFhKeVpXNTBUVzl0Wlc1MExtMXZiblJvS0NrZ09pQnVkV3hzTzF4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTV3YVdOclpYSXVabWx1WkNnbkxtUmhkR1Z3YVdOclpYSXRaR0Y1Y3lCMGFEcGxjU2d4S1NjcFhISmNibHgwWEhSY2RGeDBYSFJjZEM1MFpYaDBLRzF2YldWdWRDNXNiMk5oYkdWRVlYUmhLQ2t1Ylc5dWRHaHpLRzF2YldWdWRDZ3BMbTF2Ym5Sb0tHMXZiblJvS1NrZ0t5QW5JQ2NnS3lCNVpXRnlLVHRjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUhaaGNpQndjbVYyVFc5dWRHZ2dQU0J0YjIxbGJuUW9XM2xsWVhJc0lHMXZiblJvTENBeFhTazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIQnlaWFpOYjI1MGFDNXpkV0owY21GamRDZ3hMQ0FuWkdGNUp5azdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIQnlaWFpOYjI1MGFDNWtZWGtvY0hKbGRrMXZiblJvTG1SaGVTZ3BJQzBnS0hCeVpYWk5iMjUwYUM1a1lYa29LU0F0SUhSb2FYTXVkMlZsYTFOMFlYSjBJQ3NnTnlrZ0pTQTNLVHRjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUM4dlZFOUVUem9nZFhObElHUnBabVpjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdkbUZ5SUc1bGVIUk5iMjUwYUZaaGJDQTlJRzF2YldWdWRDaHdjbVYyVFc5dWRHZ3BMbUZrWkNnME1pd2dKMlJoZVhNbktTNTJZV3gxWlU5bUtDazdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0JvZEcxc0lEMGdXMTA3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSFpoY2lCamJITk9ZVzFsTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0F2TDFSUFJFODZJSFZ6WlNCa2FXWm1YSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIZG9hV3hsSUNod2NtVjJUVzl1ZEdndWRtRnNkV1ZQWmlncElEd2dibVY0ZEUxdmJuUm9WbUZzS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaaUFvY0hKbGRrMXZiblJvTG1SaGVTZ3BJRDA5UFNCMGFHbHpMbmRsWld0VGRHRnlkQ2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2gwYld3dWNIVnphQ2duUEhSeVBpY3BPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1kyeHpUbUZ0WlNBOUlDY25PMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnTHk5VVQwUlBPaUIxYzJVZ1pHbG1abHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tIQnlaWFpOYjI1MGFDNTVaV0Z5S0NrZ1BDQjVaV0Z5SUh4OElDaHdjbVYyVFc5dWRHZ3VlV1ZoY2lncElEMDlJSGxsWVhJZ0ppWWdjSEpsZGsxdmJuUm9MbTF2Ym5Sb0tDa2dQQ0J0YjI1MGFDa3BJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmpiSE5PWVcxbElDczlJQ2NnYjJ4a0p6dGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDBnWld4elpTQnBaaUFvY0hKbGRrMXZiblJvTG5sbFlYSW9LU0ErSUhsbFlYSWdmSHdnS0hCeVpYWk5iMjUwYUM1NVpXRnlLQ2tnUFQwZ2VXVmhjaUFtSmlCd2NtVjJUVzl1ZEdndWJXOXVkR2dvS1NBK0lHMXZiblJvS1NrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdOc2MwNWhiV1VnS3owZ0p5QnVaWGNuTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdMeTlVVDBSUE9pQjFjMlVnWkdsbVpseHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1lnS0hCeVpYWk5iMjUwYUM1MllXeDFaVTltS0NrZ1BUMDlJR04xY25KbGJuUkVZWFJsS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWTJ4elRtRnRaU0FyUFNBbklHRmpkR2wyWlNjN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2NISmxkazF2Ym5Sb0xuWmhiSFZsVDJZb0tTQThJSFJvYVhNdWMzUmhjblJFWVhSbElIeDhJSEJ5WlhaTmIyNTBhQzUyWVd4MVpVOW1LQ2tnUGlCMGFHbHpMbVZ1WkVSaGRHVXBJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmpiSE5PWVcxbElDczlJQ2NnWkdsellXSnNaV1FuTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhSFJ0YkM1d2RYTm9LQ2M4ZEdRZ1kyeGhjM005WENKa1lYa25JQ3NnWTJ4elRtRnRaU0FySUNkY0lqNG5JQ3NnY0hKbGRrMXZiblJvTG1SaGRHVW9LU0FySUNjOEwzUmtQaWNwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLSEJ5WlhaTmIyNTBhQzVrWVhrb0tTQTlQVDBnZEdocGN5NTNaV1ZyUlc1a0tTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FIUnRiQzV3ZFhOb0tDYzhMM1J5UGljcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY0hKbGRrMXZiblJvTG1Ga1pDZ3hMQ0FuWkdGNWN5Y3BPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11Y0dsamEyVnlMbVpwYm1Rb0p5NWtZWFJsY0dsamEyVnlMV1JoZVhNZ2RHSnZaSGtuS1M1bGJYQjBlU2dwTG1Gd2NHVnVaQ2hvZEcxc0xtcHZhVzRvSnljcEtUdGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSFpoY2lCdGIyNTBhSE1nUFNCMGFHbHpMbkJwWTJ0bGNpNW1hVzVrS0NjdVpHRjBaWEJwWTJ0bGNpMXRiMjUwYUhNbktWeHlYRzVjZEZ4MFhIUmNkRngwWEhRdVptbHVaQ2duZEdnNlpYRW9NU2tuS1Z4eVhHNWNkRngwWEhSY2RGeDBYSFJjZEM1MFpYaDBLSGxsWVhJcFhISmNibHgwWEhSY2RGeDBYSFJjZEZ4MExtVnVaQ2dwWEhKY2JseDBYSFJjZEZ4MFhIUmNkQzVtYVc1a0tDZHpjR0Z1SnlrdWNtVnRiM1psUTJ4aGMzTW9KMkZqZEdsMlpTY3BMbkpsYlc5MlpVTnNZWE56S0Nka2FYTmhZbXhsWkNjcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCcFppQW9ZM1Z5Y21WdWRGbGxZWElnUFQwOUlIbGxZWElwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHMXZiblJvY3k1bGNTaGpkWEp5Wlc1MFRXOXVkR2dwTG1Ga1pFTnNZWE56S0NkaFkzUnBkbVVuS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb0tDaDBhR2x6TG5OMFlYSjBSR0YwWlNrZ0ppWWdlV1ZoY2lBOElIUm9hWE11YzNSaGNuUkVZWFJsTG5sbFlYSW9LU2tnZkh3Z0tDaDBhR2x6TG1WdVpFUmhkR1VwSUNZbUlIbGxZWElnUGlCMGFHbHpMbVZ1WkVSaGRHVXVlV1ZoY2lncEtTa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYlc5dWRHaHpMbUZrWkVOc1lYTnpLQ2RrYVhOaFlteGxaQ2NwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJR2xtSUNnb2RHaHBjeTV6ZEdGeWRFUmhkR1VwSUNZbUlIbGxZWElnUFQwZ2RHaHBjeTV6ZEdGeWRFUmhkR1V1ZVdWaGNpZ3BLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCdGIyNTBhSE11YzJ4cFkyVW9NQ3dnZEdocGN5NXpkR0Z5ZEVSaGRHVXViVzl1ZEdnb0tTa3VZV1JrUTJ4aGMzTW9KMlJwYzJGaWJHVmtKeWs3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdhV1lnS0NoMGFHbHpMbVZ1WkVSaGRHVXBJQ1ltSUhsbFlYSWdQVDBnZEdocGN5NWxibVJFWVhSbExubGxZWElvS1NrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiVzl1ZEdoekxuTnNhV05sS0hSb2FYTXVaVzVrUkdGMFpTNXRiMjUwYUNncElDc2dNU2t1WVdSa1EyeGhjM01vSjJScGMyRmliR1ZrSnlrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lHaDBiV3dnUFNBbkp6dGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2VXVmhjaUE5SUhCaGNuTmxTVzUwS0hsbFlYSWdMeUF4TUN3Z01UQXBJQ29nTVRBN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUhaaGNpQjVaV0Z5UTI5dWRDQTlJSFJvYVhNdWNHbGphMlZ5TG1acGJtUW9KeTVrWVhSbGNHbGphMlZ5TFhsbFlYSnpKeWxjY2x4dVhIUmNkRngwWEhSY2RGeDBYSFJjZEM1bWFXNWtLQ2QwYURwbGNTZ3hLU2NwWEhKY2JseDBYSFJjZEZ4MFhIUmNkRngwWEhSY2RDNTBaWGgwS0hsbFlYSWdLeUFuTFNjZ0t5QW9lV1ZoY2lBcklEa3BLVnh5WEc1Y2RGeDBYSFJjZEZ4MFhIUmNkRngwWEhRdVpXNWtLQ2xjY2x4dVhIUmNkRngwWEhSY2RGeDBYSFJjZEM1bWFXNWtLQ2QwWkNjcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCNVpXRnlJQzA5SURFN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUdadmNpQW9kbUZ5SUdrZ1BTQXRNVHNnYVNBOElERXhPeUJwS3lzcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2gwYld3Z0t6MGdKenh6Y0dGdUlHTnNZWE56UFZ3aWVXVmhjaWNnS3lBb2FTQTlQVDBnTFRFZ2ZId2dhU0E5UFQwZ01UQWdQeUFuSUc5c1pDY2dPaUFuSnlrZ0t5QW9ZM1Z5Y21WdWRGbGxZWElnUFQwOUlIbGxZWElnUHlBbklHRmpkR2wyWlNjZ09pQW5KeWtnS3lBb0tDaDBhR2x6TG5OMFlYSjBSR0YwWlNrZ0ppWWdlV1ZoY2lBOElIUm9hWE11YzNSaGNuUkVZWFJsTG5sbFlYSW9LU2tnZkh3Z0tDaDBhR2x6TG1WdVpFUmhkR1VwSUNZbUlIbGxZWElnUGlCMGFHbHpMbVZ1WkVSaGRHVXVlV1ZoY2lncEtTQS9JQ2NnWkdsellXSnNaV1FuSURvZ0p5Y3BJQ3NnSjF3aVBpY2dLeUI1WldGeUlDc2dKend2YzNCaGJqNG5PMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZVdWaGNpQXJQU0F4TzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSGxsWVhKRGIyNTBMbWgwYld3b2FIUnRiQ2s3WEhKY2JpQWdJQ0FnSUNBZ2ZTeGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ1kyeHBZMnM2SUdaMWJtTjBhVzl1SUNobEtTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lHVXVjM1J2Y0ZCeWIzQmhaMkYwYVc5dUtDazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lHVXVjSEpsZG1WdWRFUmxabUYxYkhRb0tUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RtRnlJSFJoY21kbGRDQTlJQ1FvWlM1MFlYSm5aWFFwTG1Oc2IzTmxjM1FvSjNOd1lXNHNJSFJrTENCMGFDY3BPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQnBaaUFvZEdGeVoyVjBMbXhsYm1kMGFDQTlQVDBnTVNrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjM2RwZEdOb0lDaDBZWEpuWlhSYk1GMHVibTlrWlU1aGJXVXVkRzlNYjNkbGNrTmhjMlVvS1NrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdOaGMyVWdKM1JvSnpwY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2MzZHBkR05vSUNoMFlYSm5aWFJiTUYwdVkyeGhjM05PWVcxbEtTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCallYTmxJQ2R6ZDJsMFkyZ25PbHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdWMyaHZkMDF2WkdVb01TazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZbkpsWVdzN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JqWVhObElDZHdjbVYySnpwY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR05oYzJVZ0oyNWxlSFFuT2x4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhaaGNpQnVZWFlnUFNCRVVFZHNiMkpoYkM1dGIyUmxjMXQwYUdsekxuWnBaWGROYjJSbFhUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG5acFpYZEVZWFJsTG1Ga1pDaHVZWFl1Ym1GMlUzUmxjQ0FxSUNoMFlYSm5aWFJiTUYwdVkyeGhjM05PWVcxbElEMDlQU0FuY0hKbGRpY2dQeUF0TVNBNklERXBMQ0J1WVhZdWJtRjJSbTVqS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbVpwYkd3b0tUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG5KbFpuSmxjMmdvS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCaWNtVmhhenRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCaWNtVmhhenRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmpZWE5sSUNkemNHRnVKenBjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tDRjBZWEpuWlhRdWFYTW9KeTVrYVhOaFlteGxaQ2NwS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2RHRnlaMlYwTG1sektDY3ViVzl1ZEdnbktTa2dlMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMllYSWdibVYzVFc5dWRHZ2dQU0IwWVhKblpYUXVjR0Z5Wlc1MEtDa3VabWx1WkNnbmMzQmhiaWNwTG1sdVpHVjRLSFJoY21kbGRDazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdMeTkwYUdsekxuWnBaWGRFWVhSbExtMXZiblJvS0c1bGQwMXZiblJvS1RzZ1NTQmtieUJ1YjNRZ2JHbHJaU0JvYjNjZ2FYUWdkMjl5YTNNZ2QyaGxiaUIwYUdVZ2JtVjNJRzF2Ym5Sb0lHaGhkbVVnYkdWemN5QmtZWGx6WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NTJhV1YzUkdGMFpTNWhaR1FvYm1WM1RXOXVkR2dnTFNCMGFHbHpMblpwWlhkRVlYUmxMbTF2Ym5Sb0tDa3NJQ2R0YjI1MGFITW5LVHRjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5SUdWc2MyVWdlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFpoY2lCNVpXRnlJRDBnY0dGeWMyVkpiblFvZEdGeVoyVjBMblJsZUhRb0tTd2dNVEFwSUh4OElEQTdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1MmFXVjNSR0YwWlM1NVpXRnlLSGxsWVhJcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbUlDaDBhR2x6TG5acFpYZE5iMlJsSUNFOVBTQjBhR2x6TG0xcGJsWnBaWGROYjJSbEtTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1emFHOTNUVzlrWlNndE1TazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1elpYUW9kR2hwY3k1MmFXVjNSR0YwWlN3Z2RISjFaU2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlJR1ZzYzJVZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11YzJWMEtIUm9hWE11ZG1sbGQwUmhkR1VwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdKeVpXRnJPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHTmhjMlVnSjNSa0p6cGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1lnS0NGMFlYSm5aWFF1YVhNb0p5NWthWE5oWW14bFpDY3BLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaaUFvZEdGeVoyVjBMbWx6S0NjdVpHRjVKeWtwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMllYSWdaR0Y1SUQwZ2NHRnljMlZKYm5Rb2RHRnlaMlYwTG5SbGVIUW9LU3dnTVRBcElIeDhJREU3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZG1GeUlIUmxiWEJFWVhSbElEMGdkR2hwY3k1MmFXVjNSR0YwWlM1amJHOXVaU2dwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbUlDaDBZWEpuWlhRdWFYTW9KeTV2YkdRbktTa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMFpXMXdSR0YwWlM1emRHRnlkRTltS0NkdGIyNTBhQ2NwTG1Ga1pDZ3RNU3dnSjJSaGVYTW5LVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5SUdWc2MyVWdhV1lnS0hSaGNtZGxkQzVwY3lnbkxtNWxkeWNwS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJsYlhCRVlYUmxMbVZ1WkU5bUtDZHRiMjUwYUNjcExtRmtaQ2d4TENBblpHRjVjeWNwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMllYSWdiVzl1ZEdnZ1BTQjBaVzF3UkdGMFpTNXRiMjUwYUNncE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIWmhjaUI1WldGeUlEMGdkR1Z0Y0VSaGRHVXVlV1ZoY2lncE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11YzJWMEtHMXZiV1Z1ZENoYmVXVmhjaXdnYlc5dWRHZ3NJR1JoZVYwcEtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmljbVZoYXp0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQWdJSDBzWEhKY2JseHlYRzRnSUNBZ0lDQWdJR1JoZEdWWGFYUm9hVzVTWVc1blpUb2dablZ1WTNScGIyNGdLR1JoZEdVcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUdSaGRHVWdQajBnZEdocGN5NXpkR0Z5ZEVSaGRHVWdKaVlnWkdGMFpTQThQU0IwYUdsekxtVnVaRVJoZEdVN1hISmNiaUFnSUNBZ0lDQWdmU3hjY2x4dVhISmNiaUFnSUNBZ0lDQWdiVzkxYzJWa2IzZHVPaUJtZFc1amRHbHZiaUFvWlNrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCbExuTjBiM0JRY205d1lXZGhkR2x2YmlncE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCbExuQnlaWFpsYm5SRVpXWmhkV3gwS0NrN1hISmNiaUFnSUNBZ0lDQWdmU3hjY2x4dVhISmNiaUFnSUNBZ0lDQWdjMmh2ZDAxdlpHVTZJR1oxYm1OMGFXOXVJQ2hrYVhJcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLR1JwY2lrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1MmFXVjNUVzlrWlNBOUlFMWhkR2d1YldGNEtIUm9hWE11YldsdVZtbGxkMDF2WkdVc0lFMWhkR2d1YldsdUtESXNJSFJvYVhNdWRtbGxkMDF2WkdVZ0t5QmthWElwS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxuQnBZMnRsY2k1bWFXNWtLQ2MrWkdsMkp5a3VhR2xrWlNncExtWnBiSFJsY2lnbkxtUmhkR1Z3YVdOclpYSXRKeUFySUVSUVIyeHZZbUZzTG0xdlpHVnpXM1JvYVhNdWRtbGxkMDF2WkdWZExtTnNjMDVoYldVcExuTm9iM2NvS1R0Y2NseHVJQ0FnSUNBZ0lDQjlMRnh5WEc0Z0lDQWdJQ0FnSUhObGRFTjFjM1J2YlVOc1lYTnpaWE02SUdaMWJtTjBhVzl1S0NrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCcFppQW9kR2hwY3k1allXeGxibVJoY2xCc1lXTmxiV1Z1ZENBOVBTQW5iR1ZtZENjcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdWNHbGphMlZ5TG1Ga1pFTnNZWE56S0Nka1lYUmxjR2xqYTJWeUxXeGxablFuS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lIMDdYSEpjYmx4eVhHNGdJQ0FnSkM1bWJpNWtZWFJsY0dsamEyVnlJRDBnWm5WdVkzUnBiMjRnS0c5d2RHbHZiaXdnZG1Gc0tTQjdYSEpjYmlBZ0lDQWdJQ0FnZG1GeUlISmxjM1ZzZEhNZ1BTQmJYVHRjY2x4dUlDQWdJQ0FnSUNCMllYSWdZMmhoYVc0Z1BTQjBhR2x6TG1WaFkyZ29ablZ1WTNScGIyNGdLQ2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0IyWVhJZ0pIUm9hWE1nUFNBa0tIUm9hWE1wTEZ4eVhHNWNkRngwWEhSY2RHUmhkR0VnUFNBa2RHaHBjeTVrWVhSaEtDZGtZWFJsY0dsamEyVnlKeWtzWEhKY2JseDBYSFJjZEZ4MGIzQjBhVzl1Y3lBOUlIUjVjR1Z2WmlCdmNIUnBiMjRnUFQwOUlDZHZZbXBsWTNRbklDWW1JRzl3ZEdsdmJqdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLSFI1Y0dWdlppQnZjSFJwYjI0Z1BUMDlJQ2R6ZEhKcGJtY25LU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFppQW9aR0YwWVNrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhaaGNpQnlaWE4xYkhRZ1BTQmtZWFJoVzI5d2RHbHZibDBvZG1Gc0tUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFppQW9kSGx3Wlc5bUlISmxjM1ZzZENBaFBUMGdKM1Z1WkdWbWFXNWxaQ2NwWEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhKbGMzVnNkSE11Y0hWemFDaHlaWE4xYkhRcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlJR1ZzYzJVZ2FXWWdLQ0ZrWVhSaEtTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FrZEdocGN5NWtZWFJoS0Nka1lYUmxjR2xqYTJWeUp5d2dLR1JoZEdFZ1BTQnVaWGNnUkdGMFpYQnBZMnRsY2loMGFHbHpMQ0FrTG1WNGRHVnVaQ2g3ZlN3Z0pDNW1iaTVrWVhSbGNHbGphMlZ5TG1SbFptRjFiSFJ6TENCdmNIUnBiMjV6S1NrcEtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQWdJSDBwTzF4eVhHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCeVpYTjFiSFJ6TG14bGJtZDBhQ0E5UFNBeElEOGdjbVZ6ZFd4MGMxc3dYVnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQTZJSEpsYzNWc2RITXViR1Z1WjNSb0lEOGdjbVZ6ZFd4MGMxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBNklHTm9ZV2x1TzF4eVhHNGdJQ0FnZlR0Y2NseHVYSEpjYmlBZ0lDQWtMbVp1TG1SaGRHVndhV05yWlhJdVpHVm1ZWFZzZEhNZ1BTQjdYSEpjYmlBZ0lDQWdJQ0FnWTI5dWRHRnBibVZ5SURvZ0oySnZaSGtuWEhKY2JpQWdJQ0I5TzF4eVhHNGdJQ0FnSkM1bWJpNWtZWFJsY0dsamEyVnlMa052Ym5OMGNuVmpkRzl5SUQwZ1JHRjBaWEJwWTJ0bGNqdGNjbHh1WEhKY2JpQWdJQ0IyWVhJZ1JGQkhiRzlpWVd3Z1BTQjdYSEpjYmlBZ0lDQWdJQ0FnYlc5a1pYTTZJRnRjY2x4dVhIUmNkRngwZTF4eVhHNWNkRngwWEhRZ0lDQWdZMnh6VG1GdFpUb2dKMlJoZVhNbkxGeHlYRzVjZEZ4MFhIUWdJQ0FnYm1GMlJtNWpPaUFuYlc5dWRHaHpKeXhjY2x4dVhIUmNkRngwSUNBZ0lHNWhkbE4wWlhBNklERmNjbHh1WEhSY2RGeDBmU3hjY2x4dVhIUmNkRngwZTF4eVhHNWNkRngwWEhRZ0lDQWdZMnh6VG1GdFpUb2dKMjF2Ym5Sb2N5Y3NYSEpjYmx4MFhIUmNkQ0FnSUNCdVlYWkdibU02SUNkNVpXRnljeWNzWEhKY2JseDBYSFJjZENBZ0lDQnVZWFpUZEdWd09pQXhYSEpjYmx4MFhIUmNkSDBzWEhKY2JseDBYSFJjZEh0Y2NseHVYSFJjZEZ4MElDQWdJR05zYzA1aGJXVTZJQ2Q1WldGeWN5Y3NYSEpjYmx4MFhIUmNkQ0FnSUNCdVlYWkdibU02SUNkNVpXRnljeWNzWEhKY2JseDBYSFJjZENBZ0lDQnVZWFpUZEdWd09pQXhNRnh5WEc1Y2RGeDBYSFI5WFN4Y2NseHVJQ0FnSUNBZ0lDQndZWEp6WlVSaGRHVTZJR1oxYm1OMGFXOXVJQ2gyWVd4MVpTd2dabTl5YldGMEtTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIWmhjaUJ0Ylc1MElEMGdiblZzYkR0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tIUjVjR1Z2WmlCMllXeDFaU0E5UFQwZ1hDSnpkSEpwYm1kY0lpa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tFOWlhbVZqZEM1d2NtOTBiM1I1Y0dVdWRHOVRkSEpwYm1jdVkyRnNiQ2htYjNKdFlYUXBJRDA5UFNBblcyOWlhbVZqZENCQmNuSmhlVjBuS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYlcxdWRDQTlJRzF2YldWdWRDaDJZV3gxWlN3Z1ptOXliV0YwTENCMGNuVmxLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgwZ1pXeHpaU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiVzF1ZENBOUlHMXZiV1Z1ZENoMllXeDFaU3dnWm05eWJXRjBLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb0lXMXRiblFnZkh3Z0lXMXRiblF1YVhOV1lXeHBaQ2dwS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnRiVzUwSUQwZ2JXOXRaVzUwS0haaGJIVmxLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQnBaaUFvSVcxdGJuUWdmSHdnSVcxdGJuUXVhWE5XWVd4cFpDZ3BLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnYm5Wc2JEdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnYlcxdWRDNW9iM1Z5Y3lnd0tTNXRhVzUxZEdWektEQXBMbk5sWTI5dVpITW9NQ2t1Yldsc2JHbHpaV052Ym1SektEQXBPMXh5WEc0Z0lDQWdJQ0FnSUgwc1hISmNiaUFnSUNBZ0lDQWdhR1ZoWkZSbGJYQnNZWFJsT2lBblBIUm9aV0ZrUGljZ0sxeHlYRzVjZEZ4MFhIUmNkRngwWEhSY2RDYzhkSEkrSnlBclhISmNibHgwWEhSY2RGeDBYSFJjZEZ4MFhIUW5QSFJvSUdOc1lYTnpQVndpY0hKbGRsd2lQaVpzYzJGeGRXODdQQzkwYUQ0bklDdGNjbHh1WEhSY2RGeDBYSFJjZEZ4MFhIUmNkQ2M4ZEdnZ1kyOXNjM0JoYmoxY0lqVmNJaUJqYkdGemN6MWNJbk4zYVhSamFGd2lQand2ZEdnK0p5QXJYSEpjYmx4MFhIUmNkRngwWEhSY2RGeDBYSFFuUEhSb0lHTnNZWE56UFZ3aWJtVjRkRndpUGlaeWMyRnhkVzg3UEM5MGFENG5JQ3RjY2x4dVhIUmNkRngwWEhSY2RGeDBYSFFuUEM5MGNqNG5JQ3RjY2x4dVhIUmNkRngwWEhSY2RGeDBKend2ZEdobFlXUStKeXhjY2x4dUlDQWdJQ0FnSUNCamIyNTBWR1Z0Y0d4aGRHVTZJQ2M4ZEdKdlpIaytQSFJ5UGp4MFpDQmpiMnh6Y0dGdVBWd2lOMXdpUGp3dmRHUStQQzkwY2o0OEwzUmliMlI1UGlkY2NseHVJQ0FnSUgwN1hISmNiaUFnSUNCRVVFZHNiMkpoYkM1MFpXMXdiR0YwWlNBOUlDYzhaR2wySUdOc1lYTnpQVndpWkdGMFpYQnBZMnRsY2lCa2NtOXdaRzkzYmkxdFpXNTFYQ0krSnlBclhISmNibHgwWEhSY2RGeDBYSFJjZEZ4MEp6eGthWFlnWTJ4aGMzTTlYQ0prWVhSbGNHbGphMlZ5TFdSaGVYTmNJajRuSUN0Y2NseHVYSFJjZEZ4MFhIUmNkRngwWEhSY2RDYzhkR0ZpYkdVZ1kyeGhjM005WENJZ2RHRmliR1V0WTI5dVpHVnVjMlZrWENJK0p5QXJYSEpjYmx4MFhIUmNkRngwWEhSY2RGeDBYSFJjZEVSUVIyeHZZbUZzTG1obFlXUlVaVzF3YkdGMFpTQXJYSEpjYmx4MFhIUmNkRngwWEhSY2RGeDBYSFJjZENjOGRHSnZaSGsrUEM5MFltOWtlVDRuSUN0Y2NseHVYSFJjZEZ4MFhIUmNkRngwWEhSY2RDYzhMM1JoWW14bFBpY2dLMXh5WEc1Y2RGeDBYSFJjZEZ4MFhIUmNkQ2M4TDJScGRqNG5JQ3RjY2x4dVhIUmNkRngwWEhSY2RGeDBYSFFuUEdScGRpQmpiR0Z6Y3oxY0ltUmhkR1Z3YVdOclpYSXRiVzl1ZEdoelhDSStKeUFyWEhKY2JseDBYSFJjZEZ4MFhIUmNkRngwWEhRblBIUmhZbXhsSUdOc1lYTnpQVndpZEdGaWJHVXRZMjl1WkdWdWMyVmtYQ0krSnlBclhISmNibHgwWEhSY2RGeDBYSFJjZEZ4MFhIUmNkRVJRUjJ4dlltRnNMbWhsWVdSVVpXMXdiR0YwWlNBclhISmNibHgwWEhSY2RGeDBYSFJjZEZ4MFhIUmNkRVJRUjJ4dlltRnNMbU52Ym5SVVpXMXdiR0YwWlNBclhISmNibHgwWEhSY2RGeDBYSFJjZEZ4MFhIUW5QQzkwWVdKc1pUNG5JQ3RjY2x4dVhIUmNkRngwWEhSY2RGeDBYSFFuUEM5a2FYWStKeUFyWEhKY2JseDBYSFJjZEZ4MFhIUmNkRngwSnp4a2FYWWdZMnhoYzNNOVhDSmtZWFJsY0dsamEyVnlMWGxsWVhKelhDSStKeUFyWEhKY2JseDBYSFJjZEZ4MFhIUmNkRngwWEhRblBIUmhZbXhsSUdOc1lYTnpQVndpZEdGaWJHVXRZMjl1WkdWdWMyVmtYQ0krSnlBclhISmNibHgwWEhSY2RGeDBYSFJjZEZ4MFhIUmNkRVJRUjJ4dlltRnNMbWhsWVdSVVpXMXdiR0YwWlNBclhISmNibHgwWEhSY2RGeDBYSFJjZEZ4MFhIUmNkRVJRUjJ4dlltRnNMbU52Ym5SVVpXMXdiR0YwWlNBclhISmNibHgwWEhSY2RGeDBYSFJjZEZ4MFhIUW5QQzkwWVdKc1pUNG5JQ3RjY2x4dVhIUmNkRngwWEhSY2RGeDBYSFFuUEM5a2FYWStKeUFyWEhKY2JseDBYSFJjZEZ4MFhIUmNkQ2M4TDJScGRqNG5PMXh5WEc1Y2NseHVmU2gwYUdsekxtcFJkV1Z5ZVN3Z2RHaHBjeTV0YjIxbGJuUXBPMXh1ZlNrdVkyRnNiQ2huYkc5aVlXd3NJRzF2WkhWc1pTd2dkVzVrWldacGJtVmtMQ0IxYm1SbFptbHVaV1FwTzF4dUlsMTkiLCIoZnVuY3Rpb24gKGdsb2JhbCl7XG5cbjsgSlF1ZXJ5ID0gZ2xvYmFsLkpRdWVyeSA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XG47IHZhciBfX2Jyb3dzZXJpZnlfc2hpbV9yZXF1aXJlX189cmVxdWlyZTsoZnVuY3Rpb24gYnJvd3NlcmlmeVNoaW0obW9kdWxlLCBleHBvcnRzLCByZXF1aXJlLCBkZWZpbmUsIGJyb3dzZXJpZnlfc2hpbV9fZGVmaW5lX19tb2R1bGVfX2V4cG9ydF9fKSB7XG4vLyBuYW1lOiBzYW1teVxyXG4vLyB2ZXJzaW9uOiAwLjcuNVxyXG5cclxuLy8gU2FtbXkuanMgLyBodHRwOi8vc2FtbXlqcy5vcmdcclxuXHJcbihmdW5jdGlvbihmYWN0b3J5KXtcclxuICAvLyBTdXBwb3J0IG1vZHVsZSBsb2FkaW5nIHNjZW5hcmlvc1xyXG4gIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpe1xyXG4gICAgLy8gQU1EIEFub255bW91cyBNb2R1bGVcclxuICAgIGRlZmluZShbJ2pxdWVyeSddLCBmYWN0b3J5KTtcclxuICB9IGVsc2Uge1xyXG4gICAgLy8gTm8gbW9kdWxlIGxvYWRlciAocGxhaW4gPHNjcmlwdD4gdGFnKSAtIHB1dCBkaXJlY3RseSBpbiBnbG9iYWwgbmFtZXNwYWNlXHJcbiAgICBqUXVlcnkuc2FtbXkgPSB3aW5kb3cuU2FtbXkgPSBmYWN0b3J5KGpRdWVyeSk7XHJcbiAgfVxyXG59KShmdW5jdGlvbigkKXtcclxuXHJcbiAgdmFyIFNhbW15LFxyXG4gICAgICBQQVRIX1JFUExBQ0VSID0gXCIoW15cXC9dKylcIixcclxuICAgICAgUEFUSF9OQU1FX01BVENIRVIgPSAvOihbXFx3XFxkXSspL2csXHJcbiAgICAgIFFVRVJZX1NUUklOR19NQVRDSEVSID0gL1xcPyhbXiNdKik/JC8sXHJcbiAgICAgIC8vIG1haW5seSBmb3IgbWFraW5nIGBhcmd1bWVudHNgIGFuIEFycmF5XHJcbiAgICAgIF9tYWtlQXJyYXkgPSBmdW5jdGlvbihub25hcnJheSkgeyByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwobm9uYXJyYXkpOyB9LFxyXG4gICAgICAvLyBib3Jyb3dlZCBmcm9tIGpRdWVyeVxyXG4gICAgICBfaXNGdW5jdGlvbiA9IGZ1bmN0aW9uKCBvYmogKSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKSA9PT0gXCJbb2JqZWN0IEZ1bmN0aW9uXVwiOyB9LFxyXG4gICAgICBfaXNBcnJheSA9IGZ1bmN0aW9uKCBvYmogKSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKSA9PT0gXCJbb2JqZWN0IEFycmF5XVwiOyB9LFxyXG4gICAgICBfaXNSZWdFeHAgPSBmdW5jdGlvbiggb2JqICkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iaikgPT09IFwiW29iamVjdCBSZWdFeHBdXCI7IH0sXHJcbiAgICAgIF9kZWNvZGUgPSBmdW5jdGlvbiggc3RyICkgeyByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KChzdHIgfHwgJycpLnJlcGxhY2UoL1xcKy9nLCAnICcpKTsgfSxcclxuICAgICAgX2VuY29kZSA9IGVuY29kZVVSSUNvbXBvbmVudCxcclxuICAgICAgX2VzY2FwZUhUTUwgPSBmdW5jdGlvbihzKSB7XHJcbiAgICAgICAgcmV0dXJuIFN0cmluZyhzKS5yZXBsYWNlKC8mKD8hXFx3KzspL2csICcmYW1wOycpLnJlcGxhY2UoLzwvZywgJyZsdDsnKS5yZXBsYWNlKC8+L2csICcmZ3Q7JykucmVwbGFjZSgvXCIvZywgJyZxdW90OycpO1xyXG4gICAgICB9LFxyXG4gICAgICBfcm91dGVXcmFwcGVyID0gZnVuY3Rpb24odmVyYikge1xyXG4gICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcclxuICAgICAgICAgIHJldHVybiB0aGlzLnJvdXRlLmFwcGx5KHRoaXMsIFt2ZXJiXS5jb25jYXQoQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKSkpO1xyXG4gICAgICAgIH07XHJcbiAgICAgIH0sXHJcbiAgICAgIF90ZW1wbGF0ZV9jYWNoZSA9IHt9LFxyXG4gICAgICBfaGFzX2hpc3RvcnkgPSAhISh3aW5kb3cuaGlzdG9yeSAmJiBoaXN0b3J5LnB1c2hTdGF0ZSksXHJcbiAgICAgIGxvZ2dlcnMgPSBbXTtcclxuXHJcblxyXG4gIC8vIGBTYW1teWAgKGFsc28gYWxpYXNlZCBhcyAkLnNhbW15KSBpcyBub3Qgb25seSB0aGUgbmFtZXNwYWNlIGZvciBhXHJcbiAgLy8gbnVtYmVyIG9mIHByb3RvdHlwZXMsIGl0cyBhbHNvIGEgdG9wIGxldmVsIG1ldGhvZCB0aGF0IGFsbG93cyBmb3IgZWFzeVxyXG4gIC8vIGNyZWF0aW9uL21hbmFnZW1lbnQgb2YgYFNhbW15LkFwcGxpY2F0aW9uYCBpbnN0YW5jZXMuIFRoZXJlIGFyZSBhXHJcbiAgLy8gbnVtYmVyIG9mIGRpZmZlcmVudCBmb3JtcyBmb3IgYFNhbW15KClgIGJ1dCBlYWNoIHJldHVybnMgYW4gaW5zdGFuY2VcclxuICAvLyBvZiBgU2FtbXkuQXBwbGljYXRpb25gLiBXaGVuIGEgbmV3IGluc3RhbmNlIGlzIGNyZWF0ZWQgdXNpbmdcclxuICAvLyBgU2FtbXlgIGl0IGlzIGFkZGVkIHRvIGFuIE9iamVjdCBjYWxsZWQgYFNhbW15LmFwcHNgLiBUaGlzXHJcbiAgLy8gcHJvdmlkZXMgZm9yIGFuIGVhc3kgd2F5IHRvIGdldCBhdCBleGlzdGluZyBTYW1teSBhcHBsaWNhdGlvbnMuIE9ubHkgb25lXHJcbiAgLy8gaW5zdGFuY2UgaXMgYWxsb3dlZCBwZXIgYGVsZW1lbnRfc2VsZWN0b3JgIHNvIHdoZW4gY2FsbGluZ1xyXG4gIC8vIGBTYW1teSgnc2VsZWN0b3InKWAgbXVsdGlwbGUgdGltZXMsIHRoZSBmaXJzdCB0aW1lIHdpbGwgY3JlYXRlXHJcbiAgLy8gdGhlIGFwcGxpY2F0aW9uIGFuZCB0aGUgZm9sbG93aW5nIHRpbWVzIHdpbGwgZXh0ZW5kIHRoZSBhcHBsaWNhdGlvblxyXG4gIC8vIGFscmVhZHkgYWRkZWQgdG8gdGhhdCBzZWxlY3Rvci5cclxuICAvL1xyXG4gIC8vICMjIyBFeGFtcGxlXHJcbiAgLy9cclxuICAvLyAgICAgIC8vIHJldHVybnMgdGhlIGFwcCBhdCAjbWFpbiBvciBhIG5ldyBhcHBcclxuICAvLyAgICAgIFNhbW15KCcjbWFpbicpXHJcbiAgLy9cclxuICAvLyAgICAgIC8vIGVxdWl2YWxlbnQgdG8gXCJuZXcgU2FtbXkuQXBwbGljYXRpb25cIiwgZXhjZXB0IGFwcGVuZHMgdG8gYXBwc1xyXG4gIC8vICAgICAgU2FtbXkoKTtcclxuICAvLyAgICAgIFNhbW15KGZ1bmN0aW9uKCkgeyAuLi4gfSk7XHJcbiAgLy9cclxuICAvLyAgICAgIC8vIGV4dGVuZHMgdGhlIGFwcCBhdCAnI21haW4nIHdpdGggZnVuY3Rpb24uXHJcbiAgLy8gICAgICBTYW1teSgnI21haW4nLCBmdW5jdGlvbigpIHsgLi4uIH0pO1xyXG4gIC8vXHJcbiAgU2FtbXkgPSBmdW5jdGlvbigpIHtcclxuICAgIHZhciBhcmdzID0gX21ha2VBcnJheShhcmd1bWVudHMpLFxyXG4gICAgICAgIGFwcCwgc2VsZWN0b3I7XHJcbiAgICBTYW1teS5hcHBzID0gU2FtbXkuYXBwcyB8fCB7fTtcclxuICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMCB8fCBhcmdzWzBdICYmIF9pc0Z1bmN0aW9uKGFyZ3NbMF0pKSB7IC8vIFNhbW15KClcclxuICAgICAgcmV0dXJuIFNhbW15LmFwcGx5KFNhbW15LCBbJ2JvZHknXS5jb25jYXQoYXJncykpO1xyXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgKHNlbGVjdG9yID0gYXJncy5zaGlmdCgpKSA9PSAnc3RyaW5nJykgeyAvLyBTYW1teSgnI21haW4nKVxyXG4gICAgICBhcHAgPSBTYW1teS5hcHBzW3NlbGVjdG9yXSB8fCBuZXcgU2FtbXkuQXBwbGljYXRpb24oKTtcclxuICAgICAgYXBwLmVsZW1lbnRfc2VsZWN0b3IgPSBzZWxlY3RvcjtcclxuICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICQuZWFjaChhcmdzLCBmdW5jdGlvbihpLCBwbHVnaW4pIHtcclxuICAgICAgICAgIGFwcC51c2UocGx1Z2luKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgICAvLyBpZiB0aGUgc2VsZWN0b3IgY2hhbmdlcyBtYWtlIHN1cmUgdGhlIHJlZmVyZW5jZSBpbiBTYW1teS5hcHBzIGNoYW5nZXNcclxuICAgICAgaWYgKGFwcC5lbGVtZW50X3NlbGVjdG9yICE9IHNlbGVjdG9yKSB7XHJcbiAgICAgICAgZGVsZXRlIFNhbW15LmFwcHNbc2VsZWN0b3JdO1xyXG4gICAgICB9XHJcbiAgICAgIFNhbW15LmFwcHNbYXBwLmVsZW1lbnRfc2VsZWN0b3JdID0gYXBwO1xyXG4gICAgICByZXR1cm4gYXBwO1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIFNhbW15LlZFUlNJT04gPSAnMC43LjUnO1xyXG5cclxuICAvLyBBZGQgdG8gdGhlIGdsb2JhbCBsb2dnZXIgcG9vbC4gVGFrZXMgYSBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgYW5cclxuICAvLyB1bmtub3duIG51bWJlciBvZiBhcmd1bWVudHMgYW5kIHNob3VsZCBwcmludCB0aGVtIG9yIHNlbmQgdGhlbSBzb21ld2hlcmVcclxuICAvLyBUaGUgZmlyc3QgYXJndW1lbnQgaXMgYWx3YXlzIGEgdGltZXN0YW1wLlxyXG4gIFNhbW15LmFkZExvZ2dlciA9IGZ1bmN0aW9uKGxvZ2dlcikge1xyXG4gICAgbG9nZ2Vycy5wdXNoKGxvZ2dlcik7XHJcbiAgfTtcclxuXHJcbiAgLy8gU2VuZHMgYSBsb2cgbWVzc2FnZSB0byBlYWNoIGxvZ2dlciBsaXN0ZWQgaW4gdGhlIGdsb2JhbFxyXG4gIC8vIGxvZ2dlcnMgcG9vbC4gQ2FuIHRha2UgYW55IG51bWJlciBvZiBhcmd1bWVudHMuXHJcbiAgLy8gQWxzbyBwcmVmaXhlcyB0aGUgYXJndW1lbnRzIHdpdGggYSB0aW1lc3RhbXAuXHJcbiAgU2FtbXkubG9nID0gZnVuY3Rpb24oKSAge1xyXG4gICAgdmFyIGFyZ3MgPSBfbWFrZUFycmF5KGFyZ3VtZW50cyk7XHJcbiAgICBhcmdzLnVuc2hpZnQoXCJbXCIgKyBEYXRlKCkgKyBcIl1cIik7XHJcbiAgICAkLmVhY2gobG9nZ2VycywgZnVuY3Rpb24oaSwgbG9nZ2VyKSB7XHJcbiAgICAgIGxvZ2dlci5hcHBseShTYW1teSwgYXJncyk7XHJcbiAgICB9KTtcclxuICB9O1xyXG5cclxuICBpZiAodHlwZW9mIHdpbmRvdy5jb25zb2xlICE9ICd1bmRlZmluZWQnKSB7XHJcbiAgICBpZiAodHlwZW9mIHdpbmRvdy5jb25zb2xlLmxvZyA9PT0gJ2Z1bmN0aW9uJyAmJiBfaXNGdW5jdGlvbih3aW5kb3cuY29uc29sZS5sb2cuYXBwbHkpKSB7XHJcbiAgICAgIFNhbW15LmFkZExvZ2dlcihmdW5jdGlvbigpIHtcclxuICAgICAgICB3aW5kb3cuY29uc29sZS5sb2cuYXBwbHkod2luZG93LmNvbnNvbGUsIGFyZ3VtZW50cyk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgU2FtbXkuYWRkTG9nZ2VyKGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIHdpbmRvdy5jb25zb2xlLmxvZyhhcmd1bWVudHMpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9IGVsc2UgaWYgKHR5cGVvZiBjb25zb2xlICE9ICd1bmRlZmluZWQnKSB7XHJcbiAgICBTYW1teS5hZGRMb2dnZXIoZnVuY3Rpb24oKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nLmFwcGx5KGNvbnNvbGUsIGFyZ3VtZW50cyk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gICQuZXh0ZW5kKFNhbW15LCB7XHJcbiAgICBtYWtlQXJyYXk6IF9tYWtlQXJyYXksXHJcbiAgICBpc0Z1bmN0aW9uOiBfaXNGdW5jdGlvbixcclxuICAgIGlzQXJyYXk6IF9pc0FycmF5XHJcbiAgfSk7XHJcblxyXG4gIC8vIFNhbW15Lk9iamVjdCBpcyB0aGUgYmFzZSBmb3IgYWxsIG90aGVyIFNhbW15IGNsYXNzZXMuIEl0IHByb3ZpZGVzIHNvbWUgdXNlZnVsXHJcbiAgLy8gZnVuY3Rpb25hbGl0eSwgaW5jbHVkaW5nIGNsb25pbmcsIGl0ZXJhdGluZywgZXRjLlxyXG4gIFNhbW15Lk9iamVjdCA9IGZ1bmN0aW9uKG9iaikgeyAvLyBjb25zdHJ1Y3RvclxyXG4gICAgcmV0dXJuICQuZXh0ZW5kKHRoaXMsIG9iaiB8fCB7fSk7XHJcbiAgfTtcclxuXHJcbiAgJC5leHRlbmQoU2FtbXkuT2JqZWN0LnByb3RvdHlwZSwge1xyXG5cclxuICAgIC8vIEVzY2FwZSBIVE1MIGluIHN0cmluZywgdXNlIGluIHRlbXBsYXRlcyB0byBwcmV2ZW50IHNjcmlwdCBpbmplY3Rpb24uXHJcbiAgICAvLyBBbHNvIGFsaWFzZWQgYXMgYGgoKWBcclxuICAgIGVzY2FwZUhUTUw6IF9lc2NhcGVIVE1MLFxyXG4gICAgaDogX2VzY2FwZUhUTUwsXHJcblxyXG4gICAgLy8gUmV0dXJucyBhIGNvcHkgb2YgdGhlIG9iamVjdCB3aXRoIEZ1bmN0aW9ucyByZW1vdmVkLlxyXG4gICAgdG9IYXNoOiBmdW5jdGlvbigpIHtcclxuICAgICAgdmFyIGpzb24gPSB7fTtcclxuICAgICAgJC5lYWNoKHRoaXMsIGZ1bmN0aW9uKGssdikge1xyXG4gICAgICAgIGlmICghX2lzRnVuY3Rpb24odikpIHtcclxuICAgICAgICAgIGpzb25ba10gPSB2O1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybiBqc29uO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBSZW5kZXJzIGEgc2ltcGxlIEhUTUwgdmVyc2lvbiBvZiB0aGlzIE9iamVjdHMgYXR0cmlidXRlcy5cclxuICAgIC8vIERvZXMgbm90IHJlbmRlciBmdW5jdGlvbnMuXHJcbiAgICAvLyBGb3IgZXhhbXBsZS4gR2l2ZW4gdGhpcyBTYW1teS5PYmplY3Q6XHJcbiAgICAvL1xyXG4gICAgLy8gICAgIHZhciBzID0gbmV3IFNhbW15Lk9iamVjdCh7Zmlyc3RfbmFtZTogJ1NhbW15JywgbGFzdF9uYW1lOiAnRGF2aXMgSnIuJ30pO1xyXG4gICAgLy8gICAgIHMudG9IVE1MKClcclxuICAgIC8vICAgICAvLz0+ICc8c3Ryb25nPmZpcnN0X25hbWU8L3N0cm9uZz4gU2FtbXk8YnIgLz48c3Ryb25nPmxhc3RfbmFtZTwvc3Ryb25nPiBEYXZpcyBKci48YnIgLz4nXHJcbiAgICAvL1xyXG4gICAgdG9IVE1MOiBmdW5jdGlvbigpIHtcclxuICAgICAgdmFyIGRpc3BsYXkgPSBcIlwiO1xyXG4gICAgICAkLmVhY2godGhpcywgZnVuY3Rpb24oaywgdikge1xyXG4gICAgICAgIGlmICghX2lzRnVuY3Rpb24odikpIHtcclxuICAgICAgICAgIGRpc3BsYXkgKz0gXCI8c3Ryb25nPlwiICsgayArIFwiPC9zdHJvbmc+IFwiICsgdiArIFwiPGJyIC8+XCI7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuIGRpc3BsYXk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIFJldHVybnMgYW4gYXJyYXkgb2Yga2V5cyBmb3IgdGhpcyBvYmplY3QuIElmIGBhdHRyaWJ1dGVzX29ubHlgXHJcbiAgICAvLyBpcyB0cnVlIHdpbGwgbm90IHJldHVybiBrZXlzIHRoYXQgbWFwIHRvIGEgYGZ1bmN0aW9uKClgXHJcbiAgICBrZXlzOiBmdW5jdGlvbihhdHRyaWJ1dGVzX29ubHkpIHtcclxuICAgICAgdmFyIGtleXMgPSBbXTtcclxuICAgICAgZm9yICh2YXIgcHJvcGVydHkgaW4gdGhpcykge1xyXG4gICAgICAgIGlmICghX2lzRnVuY3Rpb24odGhpc1twcm9wZXJ0eV0pIHx8ICFhdHRyaWJ1dGVzX29ubHkpIHtcclxuICAgICAgICAgIGtleXMucHVzaChwcm9wZXJ0eSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBrZXlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBDaGVja3MgaWYgdGhlIG9iamVjdCBoYXMgYSB2YWx1ZSBhdCBga2V5YCBhbmQgdGhhdCB0aGUgdmFsdWUgaXMgbm90IGVtcHR5XHJcbiAgICBoYXM6IGZ1bmN0aW9uKGtleSkge1xyXG4gICAgICByZXR1cm4gdGhpc1trZXldICYmICQudHJpbSh0aGlzW2tleV0udG9TdHJpbmcoKSkgIT09ICcnO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBjb252ZW5pZW5jZSBtZXRob2QgdG8gam9pbiBhcyBtYW55IGFyZ3VtZW50cyBhcyB5b3Ugd2FudFxyXG4gICAgLy8gYnkgdGhlIGZpcnN0IGFyZ3VtZW50IC0gdXNlZnVsIGZvciBtYWtpbmcgcGF0aHNcclxuICAgIGpvaW46IGZ1bmN0aW9uKCkge1xyXG4gICAgICB2YXIgYXJncyA9IF9tYWtlQXJyYXkoYXJndW1lbnRzKTtcclxuICAgICAgdmFyIGRlbGltaXRlciA9IGFyZ3Muc2hpZnQoKTtcclxuICAgICAgcmV0dXJuIGFyZ3Muam9pbihkZWxpbWl0ZXIpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBTaG9ydGN1dCB0byBTYW1teS5sb2dcclxuICAgIGxvZzogZnVuY3Rpb24oKSB7XHJcbiAgICAgIFNhbW15LmxvZy5hcHBseShTYW1teSwgYXJndW1lbnRzKTtcclxuICAgIH0sXHJcblxyXG4gICAgLy8gUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC5cclxuICAgIC8vIGlmIGBpbmNsdWRlX2Z1bmN0aW9uc2AgaXMgdHJ1ZSwgaXQgd2lsbCBhbHNvIHRvU3RyaW5nKCkgdGhlXHJcbiAgICAvLyBtZXRob2RzIG9mIHRoaXMgb2JqZWN0LiBCeSBkZWZhdWx0IG9ubHkgcHJpbnRzIHRoZSBhdHRyaWJ1dGVzLlxyXG4gICAgdG9TdHJpbmc6IGZ1bmN0aW9uKGluY2x1ZGVfZnVuY3Rpb25zKSB7XHJcbiAgICAgIHZhciBzID0gW107XHJcbiAgICAgICQuZWFjaCh0aGlzLCBmdW5jdGlvbihrLCB2KSB7XHJcbiAgICAgICAgaWYgKCFfaXNGdW5jdGlvbih2KSB8fCBpbmNsdWRlX2Z1bmN0aW9ucykge1xyXG4gICAgICAgICAgcy5wdXNoKCdcIicgKyBrICsgJ1wiOiAnICsgdi50b1N0cmluZygpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm4gXCJTYW1teS5PYmplY3Q6IHtcIiArIHMuam9pbignLCcpICsgXCJ9XCI7XHJcbiAgICB9XHJcbiAgfSk7XHJcblxyXG5cclxuICAvLyBSZXR1cm4gd2hldGhlciB0aGUgZXZlbnQgdGFyZ2V0cyB0aGlzIHdpbmRvdy5cclxuICBTYW1teS50YXJnZXRJc1RoaXNXaW5kb3cgPSBmdW5jdGlvbiB0YXJnZXRJc1RoaXNXaW5kb3coZXZlbnQsIHRhZ05hbWUpIHtcclxuICAgIHZhciB0YXJnZXRFbGVtZW50ID0gJChldmVudC50YXJnZXQpLmNsb3Nlc3QodGFnTmFtZSk7XHJcbiAgICBpZiAodGFyZ2V0RWxlbWVudC5sZW5ndGggPT09IDApIHsgcmV0dXJuIHRydWU7IH1cclxuXHJcbiAgICB2YXIgdGFyZ2V0V2luZG93ID0gdGFyZ2V0RWxlbWVudC5hdHRyKCd0YXJnZXQnKTtcclxuICAgIGlmICghdGFyZ2V0V2luZG93IHx8IHRhcmdldFdpbmRvdyA9PT0gd2luZG93Lm5hbWUgfHwgdGFyZ2V0V2luZG93ID09PSAnX3NlbGYnKSB7IHJldHVybiB0cnVlOyB9XHJcbiAgICBpZiAodGFyZ2V0V2luZG93ID09PSAnX2JsYW5rJykgeyByZXR1cm4gZmFsc2U7IH1cclxuICAgIGlmICh0YXJnZXRXaW5kb3cgPT09ICd0b3AnICYmIHdpbmRvdyA9PT0gd2luZG93LnRvcCkgeyByZXR1cm4gdHJ1ZTsgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH07XHJcblxyXG5cclxuICAvLyBUaGUgRGVmYXVsdExvY2F0aW9uUHJveHkgaXMgdGhlIGRlZmF1bHQgbG9jYXRpb24gcHJveHkgZm9yIGFsbCBTYW1teSBhcHBsaWNhdGlvbnMuXHJcbiAgLy8gQSBsb2NhdGlvbiBwcm94eSBpcyBhIHByb3RvdHlwZSB0aGF0IGNvbmZvcm1zIHRvIGEgc2ltcGxlIGludGVyZmFjZS4gVGhlIHB1cnBvc2VcclxuICAvLyBvZiBhIGxvY2F0aW9uIHByb3h5IGlzIHRvIG5vdGlmeSB0aGUgU2FtbXkuQXBwbGljYXRpb24gaXRzIGJvdW5kIHRvIHdoZW4gdGhlIGxvY2F0aW9uXHJcbiAgLy8gb3IgJ2V4dGVybmFsIHN0YXRlJyBjaGFuZ2VzLlxyXG4gIC8vXHJcbiAgLy8gVGhlIGBEZWZhdWx0TG9jYXRpb25Qcm94eWAgd2F0Y2hlcyBmb3IgY2hhbmdlcyB0byB0aGUgcGF0aCBvZiB0aGUgY3VycmVudCB3aW5kb3cgYW5kXHJcbiAgLy8gaXMgYWxzbyBhYmxlIHRvIHNldCB0aGUgcGF0aCBiYXNlZCBvbiBjaGFuZ2VzIGluIHRoZSBhcHBsaWNhdGlvbi4gSXQgZG9lcyB0aGlzIGJ5XHJcbiAgLy8gdXNpbmcgZGlmZmVyZW50IG1ldGhvZHMgZGVwZW5kaW5nIG9uIHdoYXQgaXMgYXZhaWxhYmxlIGluIHRoZSBjdXJyZW50IGJyb3dzZXIuIEluXHJcbiAgLy8gdGhlIGxhdGVzdCBhbmQgZ3JlYXRlc3QgYnJvd3NlcnMgaXQgdXNlZCB0aGUgSFRNTDUgSGlzdG9yeSBBUEkgYW5kIHRoZSBgcHVzaFN0YXRlYFxyXG4gIC8vIGBwb3BTdGF0ZWAgZXZlbnRzL21ldGhvZHMuIFRoaXMgYWxsb3dzIHlvdSB0byB1c2UgU2FtbXkgdG8gc2VydmUgYSBzaXRlIGJlaGluZCBub3JtYWxcclxuICAvLyBVUkkgcGF0aHMgYXMgb3Bwb3NlZCB0byB0aGUgb2xkZXIgZGVmYXVsdCBvZiBoYXNoICgjKSBiYXNlZCByb3V0aW5nLiBCZWNhdXNlIHRoZSBzZXJ2ZXJcclxuICAvLyBjYW4gaW50ZXJwcmV0IHRoZSBjaGFuZ2VkIHBhdGggb24gYSByZWZyZXNoIG9yIHJlLWVudHJ5LCB0aG91Z2gsIGl0IHJlcXVpcmVzIGFkZGl0aW9uYWxcclxuICAvLyBzdXBwb3J0IG9uIHRoZSBzZXJ2ZXIgc2lkZS4gSWYgeW91J2QgbGlrZSB0byBmb3JjZSBkaXNhYmxlIEhUTUw1IGhpc3Rvcnkgc3VwcG9ydCwgcGxlYXNlXHJcbiAgLy8gdXNlIHRoZSBgZGlzYWJsZV9wdXNoX3N0YXRlYCBzZXR0aW5nIG9uIGBTYW1teS5BcHBsaWNhdGlvbmAuIElmIHB1c2hTdGF0ZSBzdXBwb3J0XHJcbiAgLy8gaXMgZW5hYmxlZCwgYERlZmF1bHRMb2NhdGlvblByb3h5YCBhbHNvIGJpbmRzIHRvIGFsbCBsaW5rcyBvbiB0aGUgcGFnZS4gSWYgYSBsaW5rIGlzIGNsaWNrZWRcclxuICAvLyB0aGF0IG1hdGNoZXMgdGhlIGN1cnJlbnQgc2V0IG9mIHJvdXRlcywgdGhlIFVSTCBpcyBjaGFuZ2VkIHVzaW5nIHB1c2hTdGF0ZSBpbnN0ZWFkIG9mXHJcbiAgLy8gZnVsbHkgc2V0dGluZyB0aGUgbG9jYXRpb24gYW5kIHRoZSBhcHAgaXMgbm90aWZpZWQgb2YgdGhlIGNoYW5nZS5cclxuICAvL1xyXG4gIC8vIElmIHRoZSBicm93c2VyIGRvZXMgbm90IGhhdmUgc3VwcG9ydCBmb3IgSFRNTDUgSGlzdG9yeSwgYERlZmF1bHRMb2NhdGlvblByb3h5YCBhdXRvbWF0aWNhbGx5XHJcbiAgLy8gZmFsbHMgYmFjayB0byB0aGUgb2xkZXIgaGFzaCBiYXNlZCByb3V0aW5nLiBUaGUgbmV3ZXN0IGJyb3dzZXJzIChJRSwgU2FmYXJpID4gNCwgRkYgPj0gMy42KVxyXG4gIC8vIHN1cHBvcnQgYSAnb25oYXNoY2hhbmdlJyBET00gZXZlbnQsIHRoYXRzIGZpcmVkIHdoZW5ldmVyIHRoZSBsb2NhdGlvbi5oYXNoIGNoYW5nZXMuXHJcbiAgLy8gSW4gdGhpcyBzaXR1YXRpb24gdGhlIERlZmF1bHRMb2NhdGlvblByb3h5IGp1c3QgYmluZHMgdG8gdGhpcyBldmVudCBhbmQgZGVsZWdhdGVzIGl0IHRvXHJcbiAgLy8gdGhlIGFwcGxpY2F0aW9uLiBJbiB0aGUgY2FzZSBvZiBvbGRlciBicm93c2VycyBhIHBvbGxlciBpcyBzZXQgdXAgdG8gdHJhY2sgY2hhbmdlcyB0byB0aGVcclxuICAvLyBoYXNoLlxyXG4gIFNhbW15LkRlZmF1bHRMb2NhdGlvblByb3h5ID0gZnVuY3Rpb24oYXBwLCBydW5faW50ZXJ2YWxfZXZlcnkpIHtcclxuICAgIHRoaXMuYXBwID0gYXBwO1xyXG4gICAgLy8gc2V0IGlzIG5hdGl2ZSB0byBmYWxzZSBhbmQgc3RhcnQgdGhlIHBvbGxlciBpbW1lZGlhdGVseVxyXG4gICAgdGhpcy5pc19uYXRpdmUgPSBmYWxzZTtcclxuICAgIHRoaXMuaGFzX2hpc3RvcnkgPSBfaGFzX2hpc3Rvcnk7XHJcbiAgICB0aGlzLl9zdGFydFBvbGxpbmcocnVuX2ludGVydmFsX2V2ZXJ5KTtcclxuICB9O1xyXG5cclxuICBTYW1teS5EZWZhdWx0TG9jYXRpb25Qcm94eS5mdWxsUGF0aCA9IGZ1bmN0aW9uKGxvY2F0aW9uX29iaikge1xyXG4gICAvLyBCeXBhc3MgdGhlIGB3aW5kb3cubG9jYXRpb24uaGFzaGAgYXR0cmlidXRlLiAgSWYgYSBxdWVzdGlvbiBtYXJrXHJcbiAgICAvLyBhcHBlYXJzIGluIHRoZSBoYXNoIElFNiB3aWxsIHN0cmlwIGl0IGFuZCBhbGwgb2YgdGhlIGZvbGxvd2luZ1xyXG4gICAgLy8gY2hhcmFjdGVycyBmcm9tIGB3aW5kb3cubG9jYXRpb24uaGFzaGAuXHJcbiAgICB2YXIgbWF0Y2hlcyA9IGxvY2F0aW9uX29iai50b1N0cmluZygpLm1hdGNoKC9eW14jXSooIy4rKSQvKTtcclxuICAgIHZhciBoYXNoID0gbWF0Y2hlcyA/IG1hdGNoZXNbMV0gOiAnJztcclxuICAgIHJldHVybiBbbG9jYXRpb25fb2JqLnBhdGhuYW1lLCBsb2NhdGlvbl9vYmouc2VhcmNoLCBoYXNoXS5qb2luKCcnKTtcclxuICB9O1xyXG4kLmV4dGVuZChTYW1teS5EZWZhdWx0TG9jYXRpb25Qcm94eS5wcm90b3R5cGUgLCB7XHJcbiAgICAvLyBiaW5kIHRoZSBwcm94eSBldmVudHMgdG8gdGhlIGN1cnJlbnQgYXBwLlxyXG4gICAgYmluZDogZnVuY3Rpb24oKSB7XHJcbiAgICAgIHZhciBwcm94eSA9IHRoaXMsIGFwcCA9IHRoaXMuYXBwLCBscCA9IFNhbW15LkRlZmF1bHRMb2NhdGlvblByb3h5O1xyXG4gICAgICAkKHdpbmRvdykuYmluZCgnaGFzaGNoYW5nZS4nICsgdGhpcy5hcHAuZXZlbnROYW1lc3BhY2UoKSwgZnVuY3Rpb24oZSwgbm9uX25hdGl2ZSkge1xyXG4gICAgICAgIC8vIGlmIHdlIHJlY2VpdmUgYSBuYXRpdmUgaGFzaCBjaGFuZ2UgZXZlbnQsIHNldCB0aGUgcHJveHkgYWNjb3JkaW5nbHlcclxuICAgICAgICAvLyBhbmQgc3RvcCBwb2xsaW5nXHJcbiAgICAgICAgaWYgKHByb3h5LmlzX25hdGl2ZSA9PT0gZmFsc2UgJiYgIW5vbl9uYXRpdmUpIHtcclxuICAgICAgICAgIHByb3h5LmlzX25hdGl2ZSA9IHRydWU7XHJcbiAgICAgICAgICB3aW5kb3cuY2xlYXJJbnRlcnZhbChscC5faW50ZXJ2YWwpO1xyXG4gICAgICAgICAgbHAuX2ludGVydmFsID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgYXBwLnRyaWdnZXIoJ2xvY2F0aW9uLWNoYW5nZWQnKTtcclxuICAgICAgfSk7XHJcbiAgICAgIGlmIChfaGFzX2hpc3RvcnkgJiYgIWFwcC5kaXNhYmxlX3B1c2hfc3RhdGUpIHtcclxuICAgICAgICAvLyBiaW5kIHRvIHBvcHN0YXRlXHJcbiAgICAgICAgJCh3aW5kb3cpLmJpbmQoJ3BvcHN0YXRlLicgKyB0aGlzLmFwcC5ldmVudE5hbWVzcGFjZSgpLCBmdW5jdGlvbihlKSB7XHJcbiAgICAgICAgICBhcHAudHJpZ2dlcignbG9jYXRpb24tY2hhbmdlZCcpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIC8vIGJpbmQgdG8gbGluayBjbGlja3MgdGhhdCBoYXZlIHJvdXRlc1xyXG4gICAgICAgICQoZG9jdW1lbnQpLmRlbGVnYXRlKCdhJywgJ2NsaWNrLmhpc3RvcnktJyArIHRoaXMuYXBwLmV2ZW50TmFtZXNwYWNlKCksIGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSB8fCBlLm1ldGFLZXkgfHwgZS5jdHJsS2V5KSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHZhciBmdWxsX3BhdGggPSBscC5mdWxsUGF0aCh0aGlzKSxcclxuICAgICAgICAgICAgLy8gR2V0IGFuY2hvcidzIGhvc3QgbmFtZSBpbiBhIGNyb3NzIGJyb3dzZXIgY29tcGF0aWJsZSB3YXkuXHJcbiAgICAgICAgICAgIC8vIElFIGxvb3NlcyBob3N0bmFtZSBwcm9wZXJ0eSB3aGVuIHNldHRpbmcgaHJlZiBpbiBKU1xyXG4gICAgICAgICAgICAvLyB3aXRoIGEgcmVsYXRpdmUgVVJMLCBlLmcuIGEuc2V0QXR0cmlidXRlKCdocmVmJyxcIi93aGF0ZXZlclwiKS5cclxuICAgICAgICAgICAgLy8gQ2lyY3VtdmVudCB0aGlzIHByb2JsZW0gYnkgY3JlYXRpbmcgYSBuZXcgbGluayB3aXRoIGdpdmVuIFVSTCBhbmRcclxuICAgICAgICAgICAgLy8gcXVlcnlpbmcgdGhhdCBmb3IgYSBob3N0bmFtZS5cclxuICAgICAgICAgICAgaG9zdG5hbWUgPSB0aGlzLmhvc3RuYW1lID8gdGhpcy5ob3N0bmFtZSA6IGZ1bmN0aW9uIChhKSB7XHJcbiAgICAgICAgICAgICAgdmFyIGwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKTtcclxuICAgICAgICAgICAgICBsLmhyZWYgPSBhLmhyZWY7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIGwuaG9zdG5hbWU7XHJcbiAgICAgICAgICAgIH0odGhpcyk7XHJcblxyXG4gICAgICAgICAgaWYgKGhvc3RuYW1lID09IHdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSAmJlxyXG4gICAgICAgICAgICAgIGFwcC5sb29rdXBSb3V0ZSgnZ2V0JywgZnVsbF9wYXRoKSAmJlxyXG4gICAgICAgICAgICAgIFNhbW15LnRhcmdldElzVGhpc1dpbmRvdyhlLCAnYScpKSB7XHJcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgcHJveHkuc2V0TG9jYXRpb24oZnVsbF9wYXRoKTtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICghbHAuX2JpbmRpbmdzKSB7XHJcbiAgICAgICAgbHAuX2JpbmRpbmdzID0gMDtcclxuICAgICAgfVxyXG4gICAgICBscC5fYmluZGluZ3MrKztcclxuICAgIH0sXHJcblxyXG4gICAgLy8gdW5iaW5kIHRoZSBwcm94eSBldmVudHMgZnJvbSB0aGUgY3VycmVudCBhcHBcclxuICAgIHVuYmluZDogZnVuY3Rpb24oKSB7XHJcbiAgICAgICQod2luZG93KS51bmJpbmQoJ2hhc2hjaGFuZ2UuJyArIHRoaXMuYXBwLmV2ZW50TmFtZXNwYWNlKCkpO1xyXG4gICAgICAkKHdpbmRvdykudW5iaW5kKCdwb3BzdGF0ZS4nICsgdGhpcy5hcHAuZXZlbnROYW1lc3BhY2UoKSk7XHJcbiAgICAgICQoZG9jdW1lbnQpLnVuZGVsZWdhdGUoJ2EnLCAnY2xpY2suaGlzdG9yeS0nICsgdGhpcy5hcHAuZXZlbnROYW1lc3BhY2UoKSk7XHJcbiAgICAgIFNhbW15LkRlZmF1bHRMb2NhdGlvblByb3h5Ll9iaW5kaW5ncy0tO1xyXG4gICAgICBpZiAoU2FtbXkuRGVmYXVsdExvY2F0aW9uUHJveHkuX2JpbmRpbmdzIDw9IDApIHtcclxuICAgICAgICB3aW5kb3cuY2xlYXJJbnRlcnZhbChTYW1teS5EZWZhdWx0TG9jYXRpb25Qcm94eS5faW50ZXJ2YWwpO1xyXG4gICAgICAgIFNhbW15LkRlZmF1bHRMb2NhdGlvblByb3h5Ll9pbnRlcnZhbCA9IG51bGw7XHJcbiAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLy8gZ2V0IHRoZSBjdXJyZW50IGxvY2F0aW9uIGZyb20gdGhlIGhhc2guXHJcbiAgICBnZXRMb2NhdGlvbjogZnVuY3Rpb24oKSB7XHJcbiAgICAgIHJldHVybiBTYW1teS5EZWZhdWx0TG9jYXRpb25Qcm94eS5mdWxsUGF0aCh3aW5kb3cubG9jYXRpb24pO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBzZXQgdGhlIGN1cnJlbnQgbG9jYXRpb24gdG8gYG5ld19sb2NhdGlvbmBcclxuICAgIHNldExvY2F0aW9uOiBmdW5jdGlvbihuZXdfbG9jYXRpb24pIHtcclxuICAgICAgaWYgKC9eKFteI1xcL118JCkvLnRlc3QobmV3X2xvY2F0aW9uKSkgeyAvLyBub24tcHJlZml4ZWQgdXJsXHJcbiAgICAgICAgaWYgKF9oYXNfaGlzdG9yeSAmJiAhdGhpcy5hcHAuZGlzYWJsZV9wdXNoX3N0YXRlKSB7XHJcbiAgICAgICAgICBuZXdfbG9jYXRpb24gPSAnLycgKyBuZXdfbG9jYXRpb247XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIG5ld19sb2NhdGlvbiA9ICcjIS8nICsgbmV3X2xvY2F0aW9uO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAobmV3X2xvY2F0aW9uICE9IHRoaXMuZ2V0TG9jYXRpb24oKSkge1xyXG4gICAgICAgIC8vIEhUTUw1IEhpc3RvcnkgZXhpc3RzIGFuZCBuZXdfbG9jYXRpb24gaXMgYSBmdWxsIHBhdGhcclxuICAgICAgICBpZiAoX2hhc19oaXN0b3J5ICYmICF0aGlzLmFwcC5kaXNhYmxlX3B1c2hfc3RhdGUgJiYgL15cXC8vLnRlc3QobmV3X2xvY2F0aW9uKSkge1xyXG4gICAgICAgICAgaGlzdG9yeS5wdXNoU3RhdGUoeyBwYXRoOiBuZXdfbG9jYXRpb24gfSwgd2luZG93LnRpdGxlLCBuZXdfbG9jYXRpb24pO1xyXG4gICAgICAgICAgdGhpcy5hcHAudHJpZ2dlcignbG9jYXRpb24tY2hhbmdlZCcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXR1cm4gKHdpbmRvdy5sb2NhdGlvbiA9IG5ld19sb2NhdGlvbik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIF9zdGFydFBvbGxpbmc6IGZ1bmN0aW9uKGV2ZXJ5KSB7XHJcbiAgICAgIC8vIHNldCB1cCBpbnRlcnZhbFxyXG4gICAgICB2YXIgcHJveHkgPSB0aGlzO1xyXG4gICAgICBpZiAoIVNhbW15LkRlZmF1bHRMb2NhdGlvblByb3h5Ll9pbnRlcnZhbCkge1xyXG4gICAgICAgIGlmICghZXZlcnkpIHsgZXZlcnkgPSAxMDsgfVxyXG4gICAgICAgIHZhciBoYXNoQ2hlY2sgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICAgIHZhciBjdXJyZW50X2xvY2F0aW9uID0gcHJveHkuZ2V0TG9jYXRpb24oKTtcclxuICAgICAgICAgIGlmICh0eXBlb2YgU2FtbXkuRGVmYXVsdExvY2F0aW9uUHJveHkuX2xhc3RfbG9jYXRpb24gPT0gJ3VuZGVmaW5lZCcgfHxcclxuICAgICAgICAgICAgY3VycmVudF9sb2NhdGlvbiAhPSBTYW1teS5EZWZhdWx0TG9jYXRpb25Qcm94eS5fbGFzdF9sb2NhdGlvbikge1xyXG4gICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAkKHdpbmRvdykudHJpZ2dlcignaGFzaGNoYW5nZScsIFt0cnVlXSk7XHJcbiAgICAgICAgICAgIH0sIDApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgU2FtbXkuRGVmYXVsdExvY2F0aW9uUHJveHkuX2xhc3RfbG9jYXRpb24gPSBjdXJyZW50X2xvY2F0aW9uO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgaGFzaENoZWNrKCk7XHJcbiAgICAgICAgU2FtbXkuRGVmYXVsdExvY2F0aW9uUHJveHkuX2ludGVydmFsID0gd2luZG93LnNldEludGVydmFsKGhhc2hDaGVjaywgZXZlcnkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfSk7XHJcblxyXG5cclxuICAvLyBTYW1teS5BcHBsaWNhdGlvbiBpcyB0aGUgQmFzZSBwcm90b3R5cGUgZm9yIGRlZmluaW5nICdhcHBsaWNhdGlvbnMnLlxyXG4gIC8vIEFuICdhcHBsaWNhdGlvbicgaXMgYSBjb2xsZWN0aW9uIG9mICdyb3V0ZXMnIGFuZCBib3VuZCBldmVudHMgdGhhdCBpc1xyXG4gIC8vIGF0dGFjaGVkIHRvIGFuIGVsZW1lbnQgd2hlbiBgcnVuKClgIGlzIGNhbGxlZC5cclxuICAvLyBUaGUgb25seSBhcmd1bWVudCBhbiAnYXBwX2Z1bmN0aW9uJyBpcyBldmFsdWF0ZWQgd2l0aGluIHRoZSBjb250ZXh0IG9mIHRoZSBhcHBsaWNhdGlvbi5cclxuICBTYW1teS5BcHBsaWNhdGlvbiA9IGZ1bmN0aW9uKGFwcF9mdW5jdGlvbikge1xyXG4gICAgdmFyIGFwcCA9IHRoaXM7XHJcbiAgICB0aGlzLnJvdXRlcyAgICAgICAgICAgID0ge307XHJcbiAgICB0aGlzLmxpc3RlbmVycyAgICAgICAgID0gbmV3IFNhbW15Lk9iamVjdCh7fSk7XHJcbiAgICB0aGlzLmFyb3VuZHMgICAgICAgICAgID0gW107XHJcbiAgICB0aGlzLmJlZm9yZXMgICAgICAgICAgID0gW107XHJcbiAgICAvLyBnZW5lcmF0ZSBhIHVuaXF1ZSBuYW1lc3BhY2VcclxuICAgIHRoaXMubmFtZXNwYWNlICAgICAgICAgPSAobmV3IERhdGUoKSkuZ2V0VGltZSgpICsgJy0nICsgcGFyc2VJbnQoTWF0aC5yYW5kb20oKSAqIDEwMDAsIDEwKTtcclxuICAgIHRoaXMuY29udGV4dF9wcm90b3R5cGUgPSBmdW5jdGlvbigpIHsgU2FtbXkuRXZlbnRDb250ZXh0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH07XHJcbiAgICB0aGlzLmNvbnRleHRfcHJvdG90eXBlLnByb3RvdHlwZSA9IG5ldyBTYW1teS5FdmVudENvbnRleHQoKTtcclxuXHJcbiAgICBpZiAoX2lzRnVuY3Rpb24oYXBwX2Z1bmN0aW9uKSkge1xyXG4gICAgICBhcHBfZnVuY3Rpb24uYXBwbHkodGhpcywgW3RoaXNdKTtcclxuICAgIH1cclxuICAgIC8vIHNldCB0aGUgbG9jYXRpb24gcHJveHkgaWYgbm90IGRlZmluZWQgdG8gdGhlIGRlZmF1bHQgKERlZmF1bHRMb2NhdGlvblByb3h5KVxyXG4gICAgaWYgKCF0aGlzLl9sb2NhdGlvbl9wcm94eSkge1xyXG4gICAgICB0aGlzLnNldExvY2F0aW9uUHJveHkobmV3IFNhbW15LkRlZmF1bHRMb2NhdGlvblByb3h5KHRoaXMsIHRoaXMucnVuX2ludGVydmFsX2V2ZXJ5KSk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5kZWJ1Zykge1xyXG4gICAgICB0aGlzLmJpbmRUb0FsbEV2ZW50cyhmdW5jdGlvbihlLCBkYXRhKSB7XHJcbiAgICAgICAgYXBwLmxvZyhhcHAudG9TdHJpbmcoKSwgZS5jbGVhbmVkX3R5cGUsIGRhdGEgfHwge30pO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9O1xyXG5cclxuICBTYW1teS5BcHBsaWNhdGlvbi5wcm90b3R5cGUgPSAkLmV4dGVuZCh7fSwgU2FtbXkuT2JqZWN0LnByb3RvdHlwZSwge1xyXG5cclxuICAgIC8vIHRoZSBmb3VyIHJvdXRlIHZlcmJzXHJcbiAgICBST1VURV9WRVJCUzogWydnZXQnLCdwb3N0JywncHV0JywnZGVsZXRlJ10sXHJcblxyXG4gICAgLy8gQW4gYXJyYXkgb2YgdGhlIGRlZmF1bHQgZXZlbnRzIHRyaWdnZXJlZCBieSB0aGVcclxuICAgIC8vIGFwcGxpY2F0aW9uIGR1cmluZyBpdHMgbGlmZWN5Y2xlXHJcbiAgICBBUFBfRVZFTlRTOiBbJ3J1bicsICd1bmxvYWQnLCAnbG9va3VwLXJvdXRlJywgJ3J1bi1yb3V0ZScsICdyb3V0ZS1mb3VuZCcsICdldmVudC1jb250ZXh0LWJlZm9yZScsICdldmVudC1jb250ZXh0LWFmdGVyJywgJ2NoYW5nZWQnLCAnZXJyb3InLCAnY2hlY2stZm9ybS1zdWJtaXNzaW9uJywgJ3JlZGlyZWN0JywgJ2xvY2F0aW9uLWNoYW5nZWQnXSxcclxuXHJcbiAgICBfbGFzdF9yb3V0ZTogbnVsbCxcclxuICAgIF9sb2NhdGlvbl9wcm94eTogbnVsbCxcclxuICAgIF9ydW5uaW5nOiBmYWxzZSxcclxuXHJcbiAgICAvLyBEZWZpbmVzIHdoYXQgZWxlbWVudCB0aGUgYXBwbGljYXRpb24gaXMgYm91bmQgdG8uIFByb3ZpZGUgYSBzZWxlY3RvclxyXG4gICAgLy8gKHBhcnNlYWJsZSBieSBgalF1ZXJ5KClgKSBhbmQgdGhpcyB3aWxsIGJlIHVzZWQgYnkgYCRlbGVtZW50KClgXHJcbiAgICBlbGVtZW50X3NlbGVjdG9yOiAnYm9keScsXHJcblxyXG4gICAgLy8gV2hlbiBzZXQgdG8gdHJ1ZSwgbG9ncyBhbGwgb2YgdGhlIGRlZmF1bHQgZXZlbnRzIHVzaW5nIGBsb2coKWBcclxuICAgIGRlYnVnOiBmYWxzZSxcclxuXHJcbiAgICAvLyBXaGVuIHNldCB0byB0cnVlLCBhbmQgdGhlIGVycm9yKCkgaGFuZGxlciBpcyBub3Qgb3ZlcnJpZGRlbiwgd2lsbCBhY3R1YWxseVxyXG4gICAgLy8gcmFpc2UgSlMgZXJyb3JzIGluIHJvdXRlcyAoNTAwKSBhbmQgd2hlbiByb3V0ZXMgY2FuJ3QgYmUgZm91bmQgKDQwNClcclxuICAgIHJhaXNlX2Vycm9yczogZmFsc2UsXHJcblxyXG4gICAgLy8gVGhlIHRpbWUgaW4gbWlsbGlzZWNvbmRzIHRoYXQgdGhlIFVSTCBpcyBxdWVyaWVkIGZvciBjaGFuZ2VzXHJcbiAgICBydW5faW50ZXJ2YWxfZXZlcnk6IDUwLFxyXG5cclxuICAgIC8vIGlmIHVzaW5nIHRoZSBgRGVmYXVsdExvY2F0aW9uUHJveHlgIHNldHRpbmcgdGhpcyB0byB0cnVlIHdpbGwgZm9yY2UgdGhlIGFwcCB0byB1c2VcclxuICAgIC8vIHRyYWRpdGlvbmFsIGhhc2ggYmFzZWQgcm91dGluZyBhcyBvcHBvc2VkIHRvIHRoZSBuZXcgSFRNTDUgUHVzaFN0YXRlIHN1cHBvcnRcclxuICAgIGRpc2FibGVfcHVzaF9zdGF0ZTogZmFsc2UsXHJcblxyXG4gICAgLy8gVGhlIGRlZmF1bHQgdGVtcGxhdGUgZW5naW5lIHRvIHVzZSB3aGVuIHVzaW5nIGBwYXJ0aWFsKClgIGluIGFuXHJcbiAgICAvLyBgRXZlbnRDb250ZXh0YC4gYHRlbXBsYXRlX2VuZ2luZWAgY2FuIGVpdGhlciBiZSBhIHN0cmluZyB0aGF0XHJcbiAgICAvLyBjb3JyZXNwb25kcyB0byB0aGUgbmFtZSBvZiBhIG1ldGhvZC9oZWxwZXIgb24gRXZlbnRDb250ZXh0IG9yIGl0IGNhbiBiZSBhIGZ1bmN0aW9uXHJcbiAgICAvLyB0aGF0IHRha2VzIHR3byBhcmd1bWVudHMsIHRoZSBjb250ZW50IG9mIHRoZSB1bnJlbmRlcmVkIHBhcnRpYWwgYW5kIGFuIG9wdGlvbmFsXHJcbiAgICAvLyBKUyBvYmplY3QgdGhhdCBjb250YWlucyBpbnRlcnBvbGF0aW9uIGRhdGEuIFRlbXBsYXRlIGVuZ2luZSBpcyBvbmx5IGNhbGxlZC9yZWZlcnJlZFxyXG4gICAgLy8gdG8gaWYgdGhlIGV4dGVuc2lvbiBvZiB0aGUgcGFydGlhbCBpcyBudWxsIG9yIHVua25vd24uIFNlZSBgcGFydGlhbCgpYFxyXG4gICAgLy8gZm9yIG1vcmUgaW5mb3JtYXRpb25cclxuICAgIHRlbXBsYXRlX2VuZ2luZTogbnVsbCxcclxuXHJcbiAgICAvLyAvLz0+IFNhbW15LkFwcGxpY2F0aW9uOiBib2R5XHJcbiAgICB0b1N0cmluZzogZnVuY3Rpb24oKSB7XHJcbiAgICAgIHJldHVybiAnU2FtbXkuQXBwbGljYXRpb246JyArIHRoaXMuZWxlbWVudF9zZWxlY3RvcjtcclxuICAgIH0sXHJcblxyXG4gICAgLy8gcmV0dXJucyBhIGpRdWVyeSBvYmplY3Qgb2YgdGhlIEFwcGxpY2F0aW9ucyBib3VuZCBlbGVtZW50LlxyXG4gICAgJGVsZW1lbnQ6IGZ1bmN0aW9uKHNlbGVjdG9yKSB7XHJcbiAgICAgIHJldHVybiBzZWxlY3RvciA/ICQodGhpcy5lbGVtZW50X3NlbGVjdG9yKS5maW5kKHNlbGVjdG9yKSA6ICQodGhpcy5lbGVtZW50X3NlbGVjdG9yKTtcclxuICAgIH0sXHJcblxyXG4gICAgLy8gYHVzZSgpYCBpcyB0aGUgZW50cnkgcG9pbnQgZm9yIGluY2x1ZGluZyBTYW1teSBwbHVnaW5zLlxyXG4gICAgLy8gVGhlIGZpcnN0IGFyZ3VtZW50IHRvIHVzZSBzaG91bGQgYmUgYSBmdW5jdGlvbigpIHRoYXQgaXMgZXZhbHVhdGVkXHJcbiAgICAvLyBpbiB0aGUgY29udGV4dCBvZiB0aGUgY3VycmVudCBhcHBsaWNhdGlvbiwganVzdCBsaWtlIHRoZSBgYXBwX2Z1bmN0aW9uYFxyXG4gICAgLy8gYXJndW1lbnQgdG8gdGhlIGBTYW1teS5BcHBsaWNhdGlvbmAgY29uc3RydWN0b3IuXHJcbiAgICAvL1xyXG4gICAgLy8gQW55IGFkZGl0aW9uYWwgYXJndW1lbnRzIGFyZSBwYXNzZWQgdG8gdGhlIGFwcCBmdW5jdGlvbiBzZXF1ZW50aWFsbHkuXHJcbiAgICAvL1xyXG4gICAgLy8gRm9yIG11Y2ggbW9yZSBkZXRhaWwgYWJvdXQgcGx1Z2lucywgY2hlY2sgb3V0OlxyXG4gICAgLy8gW2h0dHA6Ly9zYW1teWpzLm9yZy9kb2NzL3BsdWdpbnNdKGh0dHA6Ly9zYW1teWpzLm9yZy9kb2NzL3BsdWdpbnMpXHJcbiAgICAvL1xyXG4gICAgLy8gIyMjIEV4YW1wbGVcclxuICAgIC8vXHJcbiAgICAvLyAgICAgIHZhciBNeVBsdWdpbiA9IGZ1bmN0aW9uKGFwcCwgcHJlcGVuZCkge1xyXG4gICAgLy9cclxuICAgIC8vICAgICAgICB0aGlzLmhlbHBlcnMoe1xyXG4gICAgLy8gICAgICAgICAgbXloZWxwZXI6IGZ1bmN0aW9uKHRleHQpIHtcclxuICAgIC8vICAgICAgICAgICAgYWxlcnQocHJlcGVuZCArIFwiIFwiICsgdGV4dCk7XHJcbiAgICAvLyAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgfSk7XHJcbiAgICAvL1xyXG4gICAgLy8gICAgICB9O1xyXG4gICAgLy9cclxuICAgIC8vICAgICAgdmFyIGFwcCA9ICQuc2FtbXkoZnVuY3Rpb24oKSB7XHJcbiAgICAvL1xyXG4gICAgLy8gICAgICAgIHRoaXMudXNlKE15UGx1Z2luLCAnVGhpcyBpcyBteSBwbHVnaW4nKTtcclxuICAgIC8vXHJcbiAgICAvLyAgICAgICAgdGhpcy5nZXQoJyMvJywgZnVuY3Rpb24oKSB7XHJcbiAgICAvLyAgICAgICAgICB0aGlzLm15aGVscGVyKCdhbmQgZG9udCB5b3UgZm9yZ2V0IGl0IScpO1xyXG4gICAgLy8gICAgICAgICAgLy89PiBBbGVydHM6IFRoaXMgaXMgbXkgcGx1Z2luIGFuZCBkb250IHlvdSBmb3JnZXQgaXQhXHJcbiAgICAvLyAgICAgICAgfSk7XHJcbiAgICAvL1xyXG4gICAgLy8gICAgICB9KTtcclxuICAgIC8vXHJcbiAgICAvLyBJZiBwbHVnaW4gaXMgcGFzc2VkIGFzIGEgc3RyaW5nIGl0IGFzc3VtZXMgeW91ciBhcmUgdHJ5aW5nIHRvIGxvYWRcclxuICAgIC8vIFNhbW15LlwiUGx1Z2luXCIuIFRoaXMgaXMgdGhlIHByZWZlcnJlZCB3YXkgb2YgbG9hZGluZyBjb3JlIFNhbW15IHBsdWdpbnNcclxuICAgIC8vIGFzIGl0IGFsbG93cyBmb3IgYmV0dGVyIGVycm9yLW1lc3NhZ2luZy5cclxuICAgIC8vXHJcbiAgICAvLyAjIyMgRXhhbXBsZVxyXG4gICAgLy9cclxuICAgIC8vICAgICAgJC5zYW1teShmdW5jdGlvbigpIHtcclxuICAgIC8vICAgICAgICB0aGlzLnVzZSgnTXVzdGFjaGUnKTsgLy89PiBTYW1teS5NdXN0YWNoZVxyXG4gICAgLy8gICAgICAgIHRoaXMudXNlKCdTdG9yYWdlJyk7IC8vPT4gU2FtbXkuU3RvcmFnZVxyXG4gICAgLy8gICAgICB9KTtcclxuICAgIC8vXHJcbiAgICB1c2U6IGZ1bmN0aW9uKCkge1xyXG4gICAgICAvLyBmbGF0dGVuIHRoZSBhcmd1bWVudHNcclxuICAgICAgdmFyIGFyZ3MgPSBfbWFrZUFycmF5KGFyZ3VtZW50cyksXHJcbiAgICAgICAgICBwbHVnaW4gPSBhcmdzLnNoaWZ0KCksXHJcbiAgICAgICAgICBwbHVnaW5fbmFtZSA9IHBsdWdpbiB8fCAnJztcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBhcmdzLnVuc2hpZnQodGhpcyk7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBwbHVnaW4gPT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgIHBsdWdpbl9uYW1lID0gJ1NhbW15LicgKyBwbHVnaW47XHJcbiAgICAgICAgICBwbHVnaW4gPSBTYW1teVtwbHVnaW5dO1xyXG4gICAgICAgIH1cclxuICAgICAgICBwbHVnaW4uYXBwbHkodGhpcywgYXJncyk7XHJcbiAgICAgIH0gY2F0Y2goZSkge1xyXG4gICAgICAgIGlmICh0eXBlb2YgcGx1Z2luID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgdGhpcy5lcnJvcihcIlBsdWdpbiBFcnJvcjogY2FsbGVkIHVzZSgpIGJ1dCBwbHVnaW4gKFwiICsgcGx1Z2luX25hbWUudG9TdHJpbmcoKSArIFwiKSBpcyBub3QgZGVmaW5lZFwiLCBlKTtcclxuICAgICAgICB9IGVsc2UgaWYgKCFfaXNGdW5jdGlvbihwbHVnaW4pKSB7XHJcbiAgICAgICAgICB0aGlzLmVycm9yKFwiUGx1Z2luIEVycm9yOiBjYWxsZWQgdXNlKCkgYnV0ICdcIiArIHBsdWdpbl9uYW1lLnRvU3RyaW5nKCkgKyBcIicgaXMgbm90IGEgZnVuY3Rpb25cIiwgZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuZXJyb3IoXCJQbHVnaW4gRXJyb3JcIiwgZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBTZXRzIHRoZSBsb2NhdGlvbiBwcm94eSBmb3IgdGhlIGN1cnJlbnQgYXBwLiBCeSBkZWZhdWx0IHRoaXMgaXMgc2V0IHRvXHJcbiAgICAvLyBhIG5ldyBgU2FtbXkuRGVmYXVsdExvY2F0aW9uUHJveHlgIG9uIGluaXRpYWxpemF0aW9uLiBIb3dldmVyLCB5b3UgY2FuIHNldFxyXG4gICAgLy8gdGhlIGxvY2F0aW9uX3Byb3h5IGluc2lkZSB5b3UncmUgYXBwIGZ1bmN0aW9uIHRvIGdpdmUgeW91ciBhcHAgYSBjdXN0b21cclxuICAgIC8vIGxvY2F0aW9uIG1lY2hhbmlzbS4gU2VlIGBTYW1teS5EZWZhdWx0TG9jYXRpb25Qcm94eWAgYW5kIGBTYW1teS5EYXRhTG9jYXRpb25Qcm94eWBcclxuICAgIC8vIGZvciBleGFtcGxlcy5cclxuICAgIC8vXHJcbiAgICAvLyBgc2V0TG9jYXRpb25Qcm94eSgpYCB0YWtlcyBhbiBpbml0aWFsaXplZCBsb2NhdGlvbiBwcm94eS5cclxuICAgIC8vXHJcbiAgICAvLyAjIyMgRXhhbXBsZVxyXG4gICAgLy9cclxuICAgIC8vICAgICAgICAvLyB0byBiaW5kIHRvIGRhdGEgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCBoYXNoO1xyXG4gICAgLy8gICAgICAgIHZhciBhcHAgPSAkLnNhbW15KGZ1bmN0aW9uKCkge1xyXG4gICAgLy8gICAgICAgICAgdGhpcy5zZXRMb2NhdGlvblByb3h5KG5ldyBTYW1teS5EYXRhTG9jYXRpb25Qcm94eSh0aGlzKSk7XHJcbiAgICAvLyAgICAgICAgfSk7XHJcbiAgICAvL1xyXG4gICAgc2V0TG9jYXRpb25Qcm94eTogZnVuY3Rpb24obmV3X3Byb3h5KSB7XHJcbiAgICAgIHZhciBvcmlnaW5hbF9wcm94eSA9IHRoaXMuX2xvY2F0aW9uX3Byb3h5O1xyXG4gICAgICB0aGlzLl9sb2NhdGlvbl9wcm94eSA9IG5ld19wcm94eTtcclxuICAgICAgaWYgKHRoaXMuaXNSdW5uaW5nKCkpIHtcclxuICAgICAgICBpZiAob3JpZ2luYWxfcHJveHkpIHtcclxuICAgICAgICAgIC8vIGlmIHRoZXJlIGlzIGFscmVhZHkgYSBsb2NhdGlvbiBwcm94eSwgdW5iaW5kIGl0LlxyXG4gICAgICAgICAgb3JpZ2luYWxfcHJveHkudW5iaW5kKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2xvY2F0aW9uX3Byb3h5LmJpbmQoKTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvLyBwcm92aWRlIGxvZygpIG92ZXJyaWRlIGZvciBpbnNpZGUgYW4gYXBwIHRoYXQgaW5jbHVkZXMgdGhlIHJlbGV2YW50IGFwcGxpY2F0aW9uIGVsZW1lbnRfc2VsZWN0b3JcclxuICAgIGxvZzogZnVuY3Rpb24oKSB7XHJcbiAgICAgIFNhbW15LmxvZy5hcHBseShTYW1teSwgQXJyYXkucHJvdG90eXBlLmNvbmNhdC5hcHBseShbdGhpcy5lbGVtZW50X3NlbGVjdG9yXSxhcmd1bWVudHMpKTtcclxuICAgIH0sXHJcblxyXG5cclxuICAgIC8vIGByb3V0ZSgpYCBpcyB0aGUgbWFpbiBtZXRob2QgZm9yIGRlZmluaW5nIHJvdXRlcyB3aXRoaW4gYW4gYXBwbGljYXRpb24uXHJcbiAgICAvLyBGb3IgZ3JlYXQgZGV0YWlsIG9uIHJvdXRlcywgY2hlY2sgb3V0OlxyXG4gICAgLy8gW2h0dHA6Ly9zYW1teWpzLm9yZy9kb2NzL3JvdXRlc10oaHR0cDovL3NhbW15anMub3JnL2RvY3Mvcm91dGVzKVxyXG4gICAgLy9cclxuICAgIC8vIFRoaXMgbWV0aG9kIGFsc28gaGFzIGFsaWFzZXMgZm9yIGVhY2ggb2YgdGhlIGRpZmZlcmVudCB2ZXJicyAoZWcuIGBnZXQoKWAsIGBwb3N0KClgLCBldGMuKVxyXG4gICAgLy9cclxuICAgIC8vICMjIyBBcmd1bWVudHNcclxuICAgIC8vXHJcbiAgICAvLyAqIGB2ZXJiYCBBIFN0cmluZyBpbiB0aGUgc2V0IG9mIFJPVVRFX1ZFUkJTIG9yICdhbnknLiAnYW55JyB3aWxsIGFkZCByb3V0ZXMgZm9yIGVhY2hcclxuICAgIC8vICAgIG9mIHRoZSBST1VURV9WRVJCUy4gSWYgb25seSB0d28gYXJndW1lbnRzIGFyZSBwYXNzZWQsXHJcbiAgICAvLyAgICB0aGUgZmlyc3QgYXJndW1lbnQgaXMgdGhlIHBhdGgsIHRoZSBzZWNvbmQgaXMgdGhlIGNhbGxiYWNrIGFuZCB0aGUgdmVyYlxyXG4gICAgLy8gICAgaXMgYXNzdW1lZCB0byBiZSAnYW55Jy5cclxuICAgIC8vICogYHBhdGhgIEEgUmVnZXhwIG9yIGEgU3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcGF0aCB0byBtYXRjaCB0byBpbnZva2UgdGhpcyB2ZXJiLlxyXG4gICAgLy8gKiBgY2FsbGJhY2tgIEEgRnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQvZXZhbHVhdGVkIHdoZW4gdGhlIHJvdXRlIGlzIHJ1biBzZWU6IGBydW5Sb3V0ZSgpYC5cclxuICAgIC8vICAgIEl0IGlzIGFsc28gcG9zc2libGUgdG8gcGFzcyBhIHN0cmluZyBhcyB0aGUgY2FsbGJhY2ssIHdoaWNoIGlzIGxvb2tlZCB1cCBhcyB0aGUgbmFtZVxyXG4gICAgLy8gICAgb2YgYSBtZXRob2Qgb24gdGhlIGFwcGxpY2F0aW9uLlxyXG4gICAgLy9cclxuICAgIHJvdXRlOiBmdW5jdGlvbih2ZXJiLCBwYXRoKSB7XHJcbiAgICAgIHZhciBhcHAgPSB0aGlzLCBwYXJhbV9uYW1lcyA9IFtdLCBhZGRfcm91dGUsIHBhdGhfbWF0Y2gsIGNhbGxiYWNrID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpO1xyXG5cclxuICAgICAgLy8gaWYgdGhlIG1ldGhvZCBzaWduYXR1cmUgaXMganVzdCAocGF0aCwgY2FsbGJhY2spXHJcbiAgICAgIC8vIGFzc3VtZSB0aGUgdmVyYiBpcyAnYW55J1xyXG4gICAgICBpZiAoY2FsbGJhY2subGVuZ3RoID09PSAwICYmIF9pc0Z1bmN0aW9uKHBhdGgpKSB7XHJcbiAgICAgICAgY2FsbGJhY2sgPSBbcGF0aF07XHJcbiAgICAgICAgcGF0aCA9IHZlcmI7XHJcbiAgICAgICAgdmVyYiA9ICdhbnknO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB2ZXJiID0gdmVyYi50b0xvd2VyQ2FzZSgpOyAvLyBlbnN1cmUgdmVyYiBpcyBsb3dlciBjYXNlXHJcblxyXG4gICAgICAvLyBpZiBwYXRoIGlzIGEgc3RyaW5nIHR1cm4gaXQgaW50byBhIHJlZ2V4XHJcbiAgICAgIGlmIChwYXRoLmNvbnN0cnVjdG9yID09IFN0cmluZykge1xyXG5cclxuICAgICAgICAvLyBOZWVkcyB0byBiZSBleHBsaWNpdGx5IHNldCBiZWNhdXNlIElFIHdpbGwgbWFpbnRhaW4gdGhlIGluZGV4IHVubGVzcyBOVUxMIGlzIHJldHVybmVkLFxyXG4gICAgICAgIC8vIHdoaWNoIG1lYW5zIHRoYXQgd2l0aCB0d28gY29uc2VjdXRpdmUgcm91dGVzIHRoYXQgY29udGFpbiBwYXJhbXMsIHRoZSBzZWNvbmQgc2V0IG9mIHBhcmFtcyB3aWxsIG5vdCBiZSBmb3VuZCBhbmQgZW5kIHVwIGluIHNwbGF0IGluc3RlYWQgb2YgcGFyYW1zXHJcbiAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vQ29yZV9KYXZhU2NyaXB0XzEuNV9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvUmVnRXhwL2xhc3RJbmRleFxyXG4gICAgICAgIFBBVEhfTkFNRV9NQVRDSEVSLmxhc3RJbmRleCA9IDA7XHJcblxyXG4gICAgICAgIC8vIGZpbmQgdGhlIG5hbWVzXHJcbiAgICAgICAgd2hpbGUgKChwYXRoX21hdGNoID0gUEFUSF9OQU1FX01BVENIRVIuZXhlYyhwYXRoKSkgIT09IG51bGwpIHtcclxuICAgICAgICAgIHBhcmFtX25hbWVzLnB1c2gocGF0aF9tYXRjaFsxXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHJlcGxhY2Ugd2l0aCB0aGUgcGF0aCByZXBsYWNlbWVudFxyXG4gICAgICAgIHBhdGggPSBuZXcgUmVnRXhwKHBhdGgucmVwbGFjZShQQVRIX05BTUVfTUFUQ0hFUiwgUEFUSF9SRVBMQUNFUikgKyBcIiRcIik7XHJcbiAgICAgIH1cclxuICAgICAgLy8gbG9va3VwIGNhbGxiYWNrc1xyXG4gICAgICAkLmVhY2goY2FsbGJhY2ssZnVuY3Rpb24oaSxjYil7XHJcbiAgICAgICAgaWYgKHR5cGVvZihjYikgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICBjYWxsYmFja1tpXSA9IGFwcFtjYl07XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGFkZF9yb3V0ZSA9IGZ1bmN0aW9uKHdpdGhfdmVyYikge1xyXG4gICAgICAgIHZhciByID0ge3ZlcmI6IHdpdGhfdmVyYiwgcGF0aDogcGF0aCwgY2FsbGJhY2s6IGNhbGxiYWNrLCBwYXJhbV9uYW1lczogcGFyYW1fbmFtZXN9O1xyXG4gICAgICAgIC8vIGFkZCByb3V0ZSB0byByb3V0ZXMgYXJyYXlcclxuICAgICAgICBhcHAucm91dGVzW3dpdGhfdmVyYl0gPSBhcHAucm91dGVzW3dpdGhfdmVyYl0gfHwgW107XHJcbiAgICAgICAgLy8gcGxhY2Ugcm91dGVzIGluIG9yZGVyIG9mIGRlZmluaXRpb25cclxuICAgICAgICBhcHAucm91dGVzW3dpdGhfdmVyYl0ucHVzaChyKTtcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGlmICh2ZXJiID09PSAnYW55Jykge1xyXG4gICAgICAgICQuZWFjaCh0aGlzLlJPVVRFX1ZFUkJTLCBmdW5jdGlvbihpLCB2KSB7IGFkZF9yb3V0ZSh2KTsgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgYWRkX3JvdXRlKHZlcmIpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyByZXR1cm4gdGhlIGFwcFxyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLy8gQWxpYXMgZm9yIHJvdXRlKCdnZXQnLCAuLi4pXHJcbiAgICBnZXQ6IF9yb3V0ZVdyYXBwZXIoJ2dldCcpLFxyXG5cclxuICAgIC8vIEFsaWFzIGZvciByb3V0ZSgncG9zdCcsIC4uLilcclxuICAgIHBvc3Q6IF9yb3V0ZVdyYXBwZXIoJ3Bvc3QnKSxcclxuXHJcbiAgICAvLyBBbGlhcyBmb3Igcm91dGUoJ3B1dCcsIC4uLilcclxuICAgIHB1dDogX3JvdXRlV3JhcHBlcigncHV0JyksXHJcblxyXG4gICAgLy8gQWxpYXMgZm9yIHJvdXRlKCdkZWxldGUnLCAuLi4pXHJcbiAgICBkZWw6IF9yb3V0ZVdyYXBwZXIoJ2RlbGV0ZScpLFxyXG5cclxuICAgIC8vIEFsaWFzIGZvciByb3V0ZSgnYW55JywgLi4uKVxyXG4gICAgYW55OiBfcm91dGVXcmFwcGVyKCdhbnknKSxcclxuXHJcbiAgICAvLyBgbWFwUm91dGVzYCB0YWtlcyBhbiBhcnJheSBvZiBhcnJheXMsIGVhY2ggYXJyYXkgYmVpbmcgcGFzc2VkIHRvIHJvdXRlKClcclxuICAgIC8vIGFzIGFyZ3VtZW50cywgdGhpcyBhbGxvd3MgZm9yIG1hc3MgZGVmaW5pdGlvbiBvZiByb3V0ZXMuIEFub3RoZXIgYmVuZWZpdCBpc1xyXG4gICAgLy8gdGhpcyBtYWtlcyBpdCBwb3NzaWJsZS9lYXNpZXIgdG8gbG9hZCByb3V0ZXMgdmlhIHJlbW90ZSBKU09OLlxyXG4gICAgLy9cclxuICAgIC8vICMjIyBFeGFtcGxlXHJcbiAgICAvL1xyXG4gICAgLy8gICAgICB2YXIgYXBwID0gJC5zYW1teShmdW5jdGlvbigpIHtcclxuICAgIC8vXHJcbiAgICAvLyAgICAgICAgdGhpcy5tYXBSb3V0ZXMoW1xyXG4gICAgLy8gICAgICAgICAgICBbJ2dldCcsICcjLycsIGZ1bmN0aW9uKCkgeyB0aGlzLmxvZygnaW5kZXgnKTsgfV0sXHJcbiAgICAvLyAgICAgICAgICAgIC8vIHN0cmluZ3MgaW4gY2FsbGJhY2tzIGFyZSBsb29rZWQgdXAgYXMgbWV0aG9kcyBvbiB0aGUgYXBwXHJcbiAgICAvLyAgICAgICAgICAgIFsncG9zdCcsICcjL2NyZWF0ZScsICdhZGRVc2VyJ10sXHJcbiAgICAvLyAgICAgICAgICAgIC8vIE5vIHZlcmIgYXNzdW1lcyAnYW55JyBhcyB0aGUgdmVyYlxyXG4gICAgLy8gICAgICAgICAgICBbL2Rvd2hhdGV2ZXIvLCBmdW5jdGlvbigpIHsgdGhpcy5sb2codGhpcy52ZXJiLCB0aGlzLnBhdGgpfV07XHJcbiAgICAvLyAgICAgICAgICBdKTtcclxuICAgIC8vICAgICAgfSk7XHJcbiAgICAvL1xyXG4gICAgbWFwUm91dGVzOiBmdW5jdGlvbihyb3V0ZV9hcnJheSkge1xyXG4gICAgICB2YXIgYXBwID0gdGhpcztcclxuICAgICAgJC5lYWNoKHJvdXRlX2FycmF5LCBmdW5jdGlvbihpLCByb3V0ZV9hcmdzKSB7XHJcbiAgICAgICAgYXBwLnJvdXRlLmFwcGx5KGFwcCwgcm91dGVfYXJncyk7XHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLy8gQSB1bmlxdWUgZXZlbnQgbmFtZXNwYWNlIGRlZmluZWQgcGVyIGFwcGxpY2F0aW9uLlxyXG4gICAgLy8gQWxsIGV2ZW50cyBib3VuZCB3aXRoIGBiaW5kKClgIGFyZSBhdXRvbWF0aWNhbGx5IGJvdW5kIHdpdGhpbiB0aGlzIHNwYWNlLlxyXG4gICAgZXZlbnROYW1lc3BhY2U6IGZ1bmN0aW9uKCkge1xyXG4gICAgICByZXR1cm4gWydzYW1teS1hcHAnLCB0aGlzLm5hbWVzcGFjZV0uam9pbignLScpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBXb3JrcyBqdXN0IGxpa2UgYGpRdWVyeS5mbi5iaW5kKClgIHdpdGggYSBjb3VwbGUgbm90YWJsZSBkaWZmZXJlbmNlcy5cclxuICAgIC8vXHJcbiAgICAvLyAqIEl0IGJpbmRzIGFsbCBldmVudHMgdG8gdGhlIGFwcGxpY2F0aW9uIGVsZW1lbnRcclxuICAgIC8vICogQWxsIGV2ZW50cyBhcmUgYm91bmQgd2l0aGluIHRoZSBgZXZlbnROYW1lc3BhY2UoKWBcclxuICAgIC8vICogRXZlbnRzIGFyZSBub3QgYWN0dWFsbHkgYm91bmQgdW50aWwgdGhlIGFwcGxpY2F0aW9uIGlzIHN0YXJ0ZWQgd2l0aCBgcnVuKClgXHJcbiAgICAvLyAqIGNhbGxiYWNrcyBhcmUgZXZhbHVhdGVkIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhIFNhbW15LkV2ZW50Q29udGV4dFxyXG4gICAgLy9cclxuICAgIGJpbmQ6IGZ1bmN0aW9uKG5hbWUsIGRhdGEsIGNhbGxiYWNrKSB7XHJcbiAgICAgIHZhciBhcHAgPSB0aGlzO1xyXG4gICAgICAvLyBidWlsZCB0aGUgY2FsbGJhY2tcclxuICAgICAgLy8gaWYgdGhlIGFyaXR5IGlzIDIsIGNhbGxiYWNrIGlzIHRoZSBzZWNvbmQgYXJndW1lbnRcclxuICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PSAndW5kZWZpbmVkJykgeyBjYWxsYmFjayA9IGRhdGE7IH1cclxuICAgICAgdmFyIGxpc3RlbmVyX2NhbGxiYWNrID0gIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIC8vIHB1bGwgb2ZmIHRoZSBjb250ZXh0IGZyb20gdGhlIGFyZ3VtZW50cyB0byB0aGUgY2FsbGJhY2tcclxuICAgICAgICB2YXIgZSwgY29udGV4dCwgZGF0YTtcclxuICAgICAgICBlICAgICAgID0gYXJndW1lbnRzWzBdO1xyXG4gICAgICAgIGRhdGEgICAgPSBhcmd1bWVudHNbMV07XHJcbiAgICAgICAgaWYgKGRhdGEgJiYgZGF0YS5jb250ZXh0KSB7XHJcbiAgICAgICAgICBjb250ZXh0ID0gZGF0YS5jb250ZXh0O1xyXG4gICAgICAgICAgZGVsZXRlIGRhdGEuY29udGV4dDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgY29udGV4dCA9IG5ldyBhcHAuY29udGV4dF9wcm90b3R5cGUoYXBwLCAnYmluZCcsIGUudHlwZSwgZGF0YSwgZS50YXJnZXQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlLmNsZWFuZWRfdHlwZSA9IGUudHlwZS5yZXBsYWNlKGFwcC5ldmVudE5hbWVzcGFjZSgpLCAnJyk7XHJcbiAgICAgICAgY2FsbGJhY2suYXBwbHkoY29udGV4dCwgW2UsIGRhdGFdKTtcclxuICAgICAgfTtcclxuXHJcbiAgICAgIC8vIGl0IGNvdWxkIGJlIHRoYXQgdGhlIGFwcCBlbGVtZW50IGRvZXNudCBleGlzdCB5ZXRcclxuICAgICAgLy8gc28gYXR0YWNoIHRvIHRoZSBsaXN0ZW5lcnMgYXJyYXkgYW5kIHRoZW4gcnVuKClcclxuICAgICAgLy8gd2lsbCBhY3R1YWxseSBiaW5kIHRoZSBldmVudC5cclxuICAgICAgaWYgKCF0aGlzLmxpc3RlbmVyc1tuYW1lXSkgeyB0aGlzLmxpc3RlbmVyc1tuYW1lXSA9IFtdOyB9XHJcbiAgICAgIHRoaXMubGlzdGVuZXJzW25hbWVdLnB1c2gobGlzdGVuZXJfY2FsbGJhY2spO1xyXG4gICAgICBpZiAodGhpcy5pc1J1bm5pbmcoKSkge1xyXG4gICAgICAgIC8vIGlmIHRoZSBhcHAgaXMgcnVubmluZ1xyXG4gICAgICAgIC8vICphY3R1YWxseSogYmluZCB0aGUgZXZlbnQgdG8gdGhlIGFwcCBlbGVtZW50XHJcbiAgICAgICAgdGhpcy5fbGlzdGVuKG5hbWUsIGxpc3RlbmVyX2NhbGxiYWNrKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLy8gVHJpZ2dlcnMgY3VzdG9tIGV2ZW50cyBkZWZpbmVkIHdpdGggYGJpbmQoKWBcclxuICAgIC8vXHJcbiAgICAvLyAjIyMgQXJndW1lbnRzXHJcbiAgICAvL1xyXG4gICAgLy8gKiBgbmFtZWAgVGhlIG5hbWUgb2YgdGhlIGV2ZW50LiBBdXRvbWF0aWNhbGx5IHByZWZpeGVkIHdpdGggdGhlIGBldmVudE5hbWVzcGFjZSgpYFxyXG4gICAgLy8gKiBgZGF0YWAgQW4gb3B0aW9uYWwgT2JqZWN0IHRoYXQgY2FuIGJlIHBhc3NlZCB0byB0aGUgYm91bmQgY2FsbGJhY2suXHJcbiAgICAvLyAqIGBjb250ZXh0YCBBbiBvcHRpb25hbCBjb250ZXh0L09iamVjdCBpbiB3aGljaCB0byBleGVjdXRlIHRoZSBib3VuZCBjYWxsYmFjay5cclxuICAgIC8vICAgSWYgbm8gY29udGV4dCBpcyBzdXBwbGllZCBhIHRoZSBjb250ZXh0IGlzIGEgbmV3IGBTYW1teS5FdmVudENvbnRleHRgXHJcbiAgICAvL1xyXG4gICAgdHJpZ2dlcjogZnVuY3Rpb24obmFtZSwgZGF0YSkge1xyXG4gICAgICB0aGlzLiRlbGVtZW50KCkudHJpZ2dlcihbbmFtZSwgdGhpcy5ldmVudE5hbWVzcGFjZSgpXS5qb2luKCcuJyksIFtkYXRhXSk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBSZXJ1bnMgdGhlIGN1cnJlbnQgcm91dGVcclxuICAgIHJlZnJlc2g6IGZ1bmN0aW9uKCkge1xyXG4gICAgICB0aGlzLmxhc3RfbG9jYXRpb24gPSBudWxsO1xyXG4gICAgICB0aGlzLnRyaWdnZXIoJ2xvY2F0aW9uLWNoYW5nZWQnKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIFRha2VzIGEgc2luZ2xlIGNhbGxiYWNrIHRoYXQgaXMgcHVzaGVkIG9uIHRvIGEgc3RhY2suXHJcbiAgICAvLyBCZWZvcmUgYW55IHJvdXRlIGlzIHJ1biwgdGhlIGNhbGxiYWNrcyBhcmUgZXZhbHVhdGVkIGluIG9yZGVyIHdpdGhpblxyXG4gICAgLy8gdGhlIGN1cnJlbnQgYFNhbW15LkV2ZW50Q29udGV4dGBcclxuICAgIC8vXHJcbiAgICAvLyBJZiBhbnkgb2YgdGhlIGNhbGxiYWNrcyBleHBsaWNpdGx5IHJldHVybiBmYWxzZSwgZXhlY3V0aW9uIG9mIGFueVxyXG4gICAgLy8gZnVydGhlciBjYWxsYmFja3MgYW5kIHRoZSByb3V0ZSBpdHNlbGYgaXMgaGFsdGVkLlxyXG4gICAgLy9cclxuICAgIC8vIFlvdSBjYW4gYWxzbyBwcm92aWRlIGEgc2V0IG9mIG9wdGlvbnMgdGhhdCB3aWxsIGRlZmluZSB3aGVuIHRvIHJ1biB0aGlzXHJcbiAgICAvLyBiZWZvcmUgYmFzZWQgb24gdGhlIHJvdXRlIGl0IHByb2NlZWRzLlxyXG4gICAgLy9cclxuICAgIC8vICMjIyBFeGFtcGxlXHJcbiAgICAvL1xyXG4gICAgLy8gICAgICB2YXIgYXBwID0gJC5zYW1teShmdW5jdGlvbigpIHtcclxuICAgIC8vXHJcbiAgICAvLyAgICAgICAgLy8gd2lsbCBydW4gYXQgIy9yb3V0ZSBidXQgbm90IGF0ICMvXHJcbiAgICAvLyAgICAgICAgdGhpcy5iZWZvcmUoJyMvcm91dGUnLCBmdW5jdGlvbigpIHtcclxuICAgIC8vICAgICAgICAgIC8vLi4uXHJcbiAgICAvLyAgICAgICAgfSk7XHJcbiAgICAvL1xyXG4gICAgLy8gICAgICAgIC8vIHdpbGwgcnVuIGF0ICMvIGJ1dCBub3QgYXQgIy9yb3V0ZVxyXG4gICAgLy8gICAgICAgIHRoaXMuYmVmb3JlKHtleGNlcHQ6IHtwYXRoOiAnIy9yb3V0ZSd9fSwgZnVuY3Rpb24oKSB7XHJcbiAgICAvLyAgICAgICAgICB0aGlzLmxvZygnbm90IGJlZm9yZSAjL3JvdXRlJyk7XHJcbiAgICAvLyAgICAgICAgfSk7XHJcbiAgICAvL1xyXG4gICAgLy8gICAgICAgIHRoaXMuZ2V0KCcjLycsIGZ1bmN0aW9uKCkge30pO1xyXG4gICAgLy9cclxuICAgIC8vICAgICAgICB0aGlzLmdldCgnIy9yb3V0ZScsIGZ1bmN0aW9uKCkge30pO1xyXG4gICAgLy9cclxuICAgIC8vICAgICAgfSk7XHJcbiAgICAvL1xyXG4gICAgLy8gU2VlIGBjb250ZXh0TWF0Y2hlc09wdGlvbnMoKWAgZm9yIGEgZnVsbCBsaXN0IG9mIHN1cHBvcnRlZCBvcHRpb25zXHJcbiAgICAvL1xyXG4gICAgYmVmb3JlOiBmdW5jdGlvbihvcHRpb25zLCBjYWxsYmFjaykge1xyXG4gICAgICBpZiAoX2lzRnVuY3Rpb24ob3B0aW9ucykpIHtcclxuICAgICAgICBjYWxsYmFjayA9IG9wdGlvbnM7XHJcbiAgICAgICAgb3B0aW9ucyA9IHt9O1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuYmVmb3Jlcy5wdXNoKFtvcHRpb25zLCBjYWxsYmFja10pO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLy8gQSBzaG9ydGN1dCBmb3IgYmluZGluZyBhIGNhbGxiYWNrIHRvIGJlIHJ1biBhZnRlciBhIHJvdXRlIGlzIGV4ZWN1dGVkLlxyXG4gICAgLy8gQWZ0ZXIgY2FsbGJhY2tzIGhhdmUgbm8gZ3VhcnVudGVlZCBvcmRlci5cclxuICAgIGFmdGVyOiBmdW5jdGlvbihjYWxsYmFjaykge1xyXG4gICAgICByZXR1cm4gdGhpcy5iaW5kKCdldmVudC1jb250ZXh0LWFmdGVyJywgY2FsbGJhY2spO1xyXG4gICAgfSxcclxuXHJcblxyXG4gICAgLy8gQWRkcyBhbiBhcm91bmQgZmlsdGVyIHRvIHRoZSBhcHBsaWNhdGlvbi4gYXJvdW5kIGZpbHRlcnMgYXJlIGZ1bmN0aW9uc1xyXG4gICAgLy8gdGhhdCB0YWtlIGEgc2luZ2xlIGFyZ3VtZW50IGBjYWxsYmFja2Agd2hpY2ggaXMgdGhlIGVudGlyZSByb3V0ZVxyXG4gICAgLy8gZXhlY3V0aW9uIHBhdGggd3JhcHBlZCB1cCBpbiBhIGNsb3N1cmUuIFRoaXMgbWVhbnMgeW91IGNhbiBkZWNpZGUgd2hldGhlclxyXG4gICAgLy8gb3Igbm90IHRvIHByb2NlZWQgd2l0aCBleGVjdXRpb24gYnkgbm90IGludm9raW5nIGBjYWxsYmFja2Agb3IsXHJcbiAgICAvLyBtb3JlIHVzZWZ1bGx5IHdyYXBwaW5nIGNhbGxiYWNrIGluc2lkZSB0aGUgcmVzdWx0IG9mIGFuIGFzeW5jaHJvbm91cyBleGVjdXRpb24uXHJcbiAgICAvL1xyXG4gICAgLy8gIyMjIEV4YW1wbGVcclxuICAgIC8vXHJcbiAgICAvLyBUaGUgbW9zdCBjb21tb24gdXNlIGNhc2UgZm9yIGFyb3VuZCgpIGlzIGNhbGxpbmcgYSBfcG9zc2libHlfIGFzeW5jIGZ1bmN0aW9uXHJcbiAgICAvLyBhbmQgZXhlY3V0aW5nIHRoZSByb3V0ZSB3aXRoaW4gdGhlIGZ1bmN0aW9ucyBjYWxsYmFjazpcclxuICAgIC8vXHJcbiAgICAvLyAgICAgIHZhciBhcHAgPSAkLnNhbW15KGZ1bmN0aW9uKCkge1xyXG4gICAgLy9cclxuICAgIC8vICAgICAgICB2YXIgY3VycmVudF91c2VyID0gZmFsc2U7XHJcbiAgICAvL1xyXG4gICAgLy8gICAgICAgIGZ1bmN0aW9uIGNoZWNrTG9nZ2VkSW4oY2FsbGJhY2spIHtcclxuICAgIC8vICAgICAgICAgIC8vIC9zZXNzaW9uIHJldHVybnMgYSBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsb2dnZWQgaW4gdXNlclxyXG4gICAgLy8gICAgICAgICAgLy8gb3IgYW4gZW1wdHkgb2JqZWN0XHJcbiAgICAvLyAgICAgICAgICBpZiAoIWN1cnJlbnRfdXNlcikge1xyXG4gICAgLy8gICAgICAgICAgICAkLmdldEpTT04oJy9zZXNzaW9uJywgZnVuY3Rpb24oanNvbikge1xyXG4gICAgLy8gICAgICAgICAgICAgIGlmIChqc29uLmxvZ2luKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAvLyBzaG93IHRoZSB1c2VyIGFzIGxvZ2dlZCBpblxyXG4gICAgLy8gICAgICAgICAgICAgICAgY3VycmVudF91c2VyID0ganNvbjtcclxuICAgIC8vICAgICAgICAgICAgICAgIC8vIGV4ZWN1dGUgdGhlIHJvdXRlIHBhdGhcclxuICAgIC8vICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7XHJcbiAgICAvLyAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgIC8vICAgICAgICAgICAgICAgIC8vIHNob3cgdGhlIHVzZXIgYXMgbm90IGxvZ2dlZCBpblxyXG4gICAgLy8gICAgICAgICAgICAgICAgY3VycmVudF91c2VyID0gZmFsc2U7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAvLyB0aGUgY29udGV4dCBvZiBhcm91bmRGaWx0ZXJzIGlzIGFuIEV2ZW50Q29udGV4dFxyXG4gICAgLy8gICAgICAgICAgICAgICAgdGhpcy5yZWRpcmVjdCgnIy9sb2dpbicpO1xyXG4gICAgLy8gICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgICAgfSk7XHJcbiAgICAvLyAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgLy8gICAgICAgICAgICAvLyBleGVjdXRlIHRoZSByb3V0ZSBwYXRoXHJcbiAgICAvLyAgICAgICAgICAgIGNhbGxiYWNrKCk7XHJcbiAgICAvLyAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgfTtcclxuICAgIC8vXHJcbiAgICAvLyAgICAgICAgdGhpcy5hcm91bmQoY2hlY2tMb2dnZWRJbik7XHJcbiAgICAvL1xyXG4gICAgLy8gICAgICB9KTtcclxuICAgIC8vXHJcbiAgICBhcm91bmQ6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XHJcbiAgICAgIHRoaXMuYXJvdW5kcy5wdXNoKGNhbGxiYWNrKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIEFkZHMgYSBvbkNvbXBsZXRlIGZ1bmN0aW9uIHRvIHRoZSBhcHBsaWNhdGlvbi4gb25Db21wbGV0ZSBmdW5jdGlvbnMgYXJlIGV4ZWN1dGVkXHJcbiAgICAvLyBhdCB0aGUgZW5kIG9mIGEgY2hhaW4gb2Ygcm91dGUgY2FsbGJhY2tzLCBpZiB0aGV5IGNhbGwgbmV4dCgpLiBVbmxpa2UgYWZ0ZXIsXHJcbiAgICAvLyB3aGljaCBpcyBjYWxsZWQgYXMgc29vbiBhcyB0aGUgcm91dGUgaXMgY29tcGxldGUsIG9uQ29tcGxldGUgaXMgbGlrZSBhIGZpbmFsIG5leHQoKVxyXG4gICAgLy8gZm9yIGFsbCByb3V0ZXMsIGFuZCBpcyB0aHVzIHJ1biBhc3luY2hyb25vdXNseVxyXG4gICAgLy9cclxuICAgIC8vICMjIyBFeGFtcGxlXHJcbiAgICAvL1xyXG4gICAgLy8gICAgICBhcHAuZ2V0KCcvY2hhaW4nLGZ1bmN0aW9uKGNvbnRleHQsbmV4dCkge1xyXG4gICAgLy8gICAgICAgICAgY29uc29sZS5sb2coJ2NoYWluMScpO1xyXG4gICAgLy8gICAgICAgICAgbmV4dCgpO1xyXG4gICAgLy8gICAgICB9LGZ1bmN0aW9uKGNvbnRleHQsbmV4dCkge1xyXG4gICAgLy8gICAgICAgICAgY29uc29sZS5sb2coJ2NoYWluMicpO1xyXG4gICAgLy8gICAgICAgICAgbmV4dCgpO1xyXG4gICAgLy8gICAgICB9KTtcclxuICAgIC8vXHJcbiAgICAvLyAgICAgIGFwcC5nZXQoJy9saW5rJyxmdW5jdGlvbihjb250ZXh0LG5leHQpIHtcclxuICAgIC8vICAgICAgICAgIGNvbnNvbGUubG9nKCdsaW5rMScpO1xyXG4gICAgLy8gICAgICAgICAgbmV4dCgpO1xyXG4gICAgLy8gICAgICB9LGZ1bmN0aW9uKGNvbnRleHQsbmV4dCkge1xyXG4gICAgLy8gICAgICAgICAgY29uc29sZS5sb2coJ2xpbmsyJyk7XHJcbiAgICAvLyAgICAgICAgICBuZXh0KCk7XHJcbiAgICAvLyAgICAgIH0pO1xyXG4gICAgLy9cclxuICAgIC8vICAgICAgYXBwLm9uQ29tcGxldGUoZnVuY3Rpb24oKSB7XHJcbiAgICAvLyAgICAgICAgICBjb25zb2xlLmxvZyhcIlJ1bm5pbmcgZmluYWxseVwiKTtcclxuICAgIC8vICAgICAgfSk7XHJcbiAgICAvL1xyXG4gICAgLy8gSWYgeW91IGdvIHRvICcvY2hhaW4nLCB5b3Ugd2lsbCBnZXQgdGhlIGZvbGxvd2luZyBtZXNzYWdlczpcclxuICAgIC8vXHJcbiAgICAvLyAgICAgIGNoYWluMVxyXG4gICAgLy8gICAgICBjaGFpbjJcclxuICAgIC8vICAgICAgUnVubmluZyBvbkNvbXBsZXRlXHJcbiAgICAvL1xyXG4gICAgLy9cclxuICAgIC8vIElmIHlvdSBnbyB0byAvbGluaywgeW91IHdpbGwgZ2V0IHRoZSBmb2xsb3dpbmcgbWVzc2FnZXM6XHJcbiAgICAvL1xyXG4gICAgLy8gICAgICBsaW5rMVxyXG4gICAgLy8gICAgICBsaW5rMlxyXG4gICAgLy8gICAgICBSdW5uaW5nIG9uQ29tcGxldGVcclxuICAgIC8vXHJcbiAgICAvL1xyXG4gICAgLy8gSXQgcmVhbGx5IGNvbWVzIHRvIHBsYXkgd2hlbiBkb2luZyBhc3luY2hyb25vdXM6XHJcbiAgICAvL1xyXG4gICAgLy8gICAgICBhcHAuZ2V0KCcvY2hhaW4nLGZ1bmN0aW9uKGNvbnRleHQsbmV4dCkge1xyXG4gICAgLy8gICAgICAgICQuZ2V0KCcvbXkvdXJsJyxmdW5jdGlvbigpIHtcclxuICAgIC8vICAgICAgICAgIGNvbnNvbGUubG9nKCdjaGFpbjEnKTtcclxuICAgIC8vICAgICAgICAgIG5leHQoKTtcclxuICAgIC8vICAgICAgICB9KTtcclxuICAgIC8vICAgICAgfSxmdW5jdGlvbihjb250ZXh0LG5leHQpIHtcclxuICAgIC8vICAgICAgICBjb25zb2xlLmxvZygnY2hhaW4yJyk7XHJcbiAgICAvLyAgICAgICAgbmV4dCgpO1xyXG4gICAgLy8gICAgICB9KTtcclxuICAgIC8vXHJcbiAgICBvbkNvbXBsZXRlOiBmdW5jdGlvbihjYWxsYmFjaykge1xyXG4gICAgICB0aGlzLl9vbkNvbXBsZXRlID0gY2FsbGJhY2s7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgY3VycmVudCBhcHBsaWNhdGlvbiBpcyBydW5uaW5nLlxyXG4gICAgaXNSdW5uaW5nOiBmdW5jdGlvbigpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX3J1bm5pbmc7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIEhlbHBlcnMgZXh0ZW5kcyB0aGUgRXZlbnRDb250ZXh0IHByb3RvdHlwZSBzcGVjaWZpYyB0byB0aGlzIGFwcC5cclxuICAgIC8vIFRoaXMgYWxsb3dzIHlvdSB0byBkZWZpbmUgYXBwIHNwZWNpZmljIGhlbHBlciBmdW5jdGlvbnMgdGhhdCBjYW4gYmUgdXNlZFxyXG4gICAgLy8gd2hlbmV2ZXIgeW91J3JlIGluc2lkZSBvZiBhbiBldmVudCBjb250ZXh0ICh0ZW1wbGF0ZXMsIHJvdXRlcywgYmluZCkuXHJcbiAgICAvL1xyXG4gICAgLy8gIyMjIEV4YW1wbGVcclxuICAgIC8vXHJcbiAgICAvLyAgICAgdmFyIGFwcCA9ICQuc2FtbXkoZnVuY3Rpb24oKSB7XHJcbiAgICAvL1xyXG4gICAgLy8gICAgICAgaGVscGVycyh7XHJcbiAgICAvLyAgICAgICAgIHVwY2FzZTogZnVuY3Rpb24odGV4dCkge1xyXG4gICAgLy8gICAgICAgICAgcmV0dXJuIHRleHQudG9TdHJpbmcoKS50b1VwcGVyQ2FzZSgpO1xyXG4gICAgLy8gICAgICAgICB9XHJcbiAgICAvLyAgICAgICB9KTtcclxuICAgIC8vXHJcbiAgICAvLyAgICAgICBnZXQoJyMvJywgZnVuY3Rpb24oKSB7IHdpdGgodGhpcykge1xyXG4gICAgLy8gICAgICAgICAvLyBpbnNpZGUgb2YgdGhpcyBjb250ZXh0IEkgY2FuIHVzZSB0aGUgaGVscGVyc1xyXG4gICAgLy8gICAgICAgICAkKCcjbWFpbicpLmh0bWwodXBjYXNlKCQoJyNtYWluJykudGV4dCgpKTtcclxuICAgIC8vICAgICAgIH19KTtcclxuICAgIC8vXHJcbiAgICAvLyAgICAgfSk7XHJcbiAgICAvL1xyXG4gICAgLy9cclxuICAgIC8vICMjIyBBcmd1bWVudHNcclxuICAgIC8vXHJcbiAgICAvLyAqIGBleHRlbnNpb25zYCBBbiBvYmplY3QgY29sbGVjdGlvbiBvZiBmdW5jdGlvbnMgdG8gZXh0ZW5kIHRoZSBjb250ZXh0LlxyXG4gICAgLy9cclxuICAgIGhlbHBlcnM6IGZ1bmN0aW9uKGV4dGVuc2lvbnMpIHtcclxuICAgICAgJC5leHRlbmQodGhpcy5jb250ZXh0X3Byb3RvdHlwZS5wcm90b3R5cGUsIGV4dGVuc2lvbnMpO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLy8gSGVscGVyIGV4dGVuZHMgdGhlIGV2ZW50IGNvbnRleHQganVzdCBsaWtlIGBoZWxwZXJzKClgIGJ1dCBkb2VzIGl0XHJcbiAgICAvLyBhIHNpbmdsZSBtZXRob2QgYXQgYSB0aW1lLiBUaGlzIGlzIGVzcGVjaWFsbHkgdXNlZnVsIGZvciBkeW5hbWljYWxseSBuYW1lZFxyXG4gICAgLy8gaGVscGVyc1xyXG4gICAgLy9cclxuICAgIC8vICMjIyBFeGFtcGxlXHJcbiAgICAvL1xyXG4gICAgLy8gICAgIC8vIFRyaXZpYWwgZXhhbXBsZSB0aGF0IGFkZHMgMyBoZWxwZXIgbWV0aG9kcyB0byB0aGUgY29udGV4dCBkeW5hbWljYWxseVxyXG4gICAgLy8gICAgIHZhciBhcHAgPSAkLnNhbW15KGZ1bmN0aW9uKGFwcCkge1xyXG4gICAgLy9cclxuICAgIC8vICAgICAgICQuZWFjaChbMSwyLDNdLCBmdW5jdGlvbihpLCBudW0pIHtcclxuICAgIC8vICAgICAgICAgYXBwLmhlbHBlcignaGVscGVyJyArIG51bSwgZnVuY3Rpb24oKSB7XHJcbiAgICAvLyAgICAgICAgICAgdGhpcy5sb2coXCJJJ20gaGVscGVyIG51bWJlciBcIiArIG51bSk7XHJcbiAgICAvLyAgICAgICAgIH0pO1xyXG4gICAgLy8gICAgICAgfSk7XHJcbiAgICAvL1xyXG4gICAgLy8gICAgICAgdGhpcy5nZXQoJyMvJywgZnVuY3Rpb24oKSB7XHJcbiAgICAvLyAgICAgICAgIHRoaXMuaGVscGVyMigpOyAvLz0+IEknbSBoZWxwZXIgbnVtYmVyIDJcclxuICAgIC8vICAgICAgIH0pO1xyXG4gICAgLy8gICAgIH0pO1xyXG4gICAgLy9cclxuICAgIC8vICMjIyBBcmd1bWVudHNcclxuICAgIC8vXHJcbiAgICAvLyAqIGBuYW1lYCBUaGUgbmFtZSBvZiB0aGUgbWV0aG9kXHJcbiAgICAvLyAqIGBtZXRob2RgIFRoZSBmdW5jdGlvbiB0byBiZSBhZGRlZCB0byB0aGUgcHJvdG90eXBlIGF0IGBuYW1lYFxyXG4gICAgLy9cclxuICAgIGhlbHBlcjogZnVuY3Rpb24obmFtZSwgbWV0aG9kKSB7XHJcbiAgICAgIHRoaXMuY29udGV4dF9wcm90b3R5cGUucHJvdG90eXBlW25hbWVdID0gbWV0aG9kO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLy8gQWN0dWFsbHkgc3RhcnRzIHRoZSBhcHBsaWNhdGlvbidzIGxpZmVjeWNsZS4gYHJ1bigpYCBzaG91bGQgYmUgaW52b2tlZFxyXG4gICAgLy8gd2l0aGluIGEgZG9jdW1lbnQucmVhZHkgYmxvY2sgdG8gZW5zdXJlIHRoZSBET00gZXhpc3RzIGJlZm9yZSBiaW5kaW5nIGV2ZW50cywgZXRjLlxyXG4gICAgLy9cclxuICAgIC8vICMjIyBFeGFtcGxlXHJcbiAgICAvL1xyXG4gICAgLy8gICAgIHZhciBhcHAgPSAkLnNhbW15KGZ1bmN0aW9uKCkgeyAuLi4gfSk7IC8vIHlvdXIgYXBwbGljYXRpb25cclxuICAgIC8vICAgICAkKGZ1bmN0aW9uKCkgeyAvLyBkb2N1bWVudC5yZWFkeVxyXG4gICAgLy8gICAgICAgIGFwcC5ydW4oKTtcclxuICAgIC8vICAgICB9KTtcclxuICAgIC8vXHJcbiAgICAvLyAjIyMgQXJndW1lbnRzXHJcbiAgICAvL1xyXG4gICAgLy8gKiBgc3RhcnRfdXJsYCBPcHRpb25hbGx5LCBhIFN0cmluZyBjYW4gYmUgcGFzc2VkIHdoaWNoIHRoZSBBcHAgd2lsbCByZWRpcmVjdCB0b1xyXG4gICAgLy8gICBhZnRlciB0aGUgZXZlbnRzL3JvdXRlcyBoYXZlIGJlZW4gYm91bmQuXHJcbiAgICBydW46IGZ1bmN0aW9uKHN0YXJ0X3VybCkge1xyXG4gICAgICBpZiAodGhpcy5pc1J1bm5pbmcoKSkgeyByZXR1cm4gZmFsc2U7IH1cclxuICAgICAgdmFyIGFwcCA9IHRoaXM7XHJcblxyXG4gICAgICAvLyBhY3R1YWxseSBiaW5kIGFsbCB0aGUgbGlzdGVuZXJzXHJcbiAgICAgICQuZWFjaCh0aGlzLmxpc3RlbmVycy50b0hhc2goKSwgZnVuY3Rpb24obmFtZSwgY2FsbGJhY2tzKSB7XHJcbiAgICAgICAgJC5lYWNoKGNhbGxiYWNrcywgZnVuY3Rpb24oaSwgbGlzdGVuZXJfY2FsbGJhY2spIHtcclxuICAgICAgICAgIGFwcC5fbGlzdGVuKG5hbWUsIGxpc3RlbmVyX2NhbGxiYWNrKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICB0aGlzLnRyaWdnZXIoJ3J1bicsIHtzdGFydF91cmw6IHN0YXJ0X3VybH0pO1xyXG4gICAgICB0aGlzLl9ydW5uaW5nID0gdHJ1ZTtcclxuICAgICAgLy8gc2V0IGxhc3QgbG9jYXRpb25cclxuICAgICAgdGhpcy5sYXN0X2xvY2F0aW9uID0gbnVsbDtcclxuICAgICAgaWYgKCEoL1xcIyguKykvLnRlc3QodGhpcy5nZXRMb2NhdGlvbigpKSkgJiYgdHlwZW9mIHN0YXJ0X3VybCAhPSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIHRoaXMuc2V0TG9jYXRpb24oc3RhcnRfdXJsKTtcclxuICAgICAgfVxyXG4gICAgICAvLyBjaGVjayB1cmxcclxuICAgICAgdGhpcy5fY2hlY2tMb2NhdGlvbigpO1xyXG4gICAgICB0aGlzLl9sb2NhdGlvbl9wcm94eS5iaW5kKCk7XHJcbiAgICAgIHRoaXMuYmluZCgnbG9jYXRpb24tY2hhbmdlZCcsIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIGFwcC5fY2hlY2tMb2NhdGlvbigpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIC8vIGJpbmQgdG8gc3VibWl0IHRvIGNhcHR1cmUgcG9zdC9wdXQvZGVsZXRlIHJvdXRlc1xyXG4gICAgICB0aGlzLmJpbmQoJ3N1Ym1pdCcsIGZ1bmN0aW9uKGUpIHtcclxuICAgICAgICBpZiAoICFTYW1teS50YXJnZXRJc1RoaXNXaW5kb3coZSwgJ2Zvcm0nKSApIHsgcmV0dXJuIHRydWU7IH1cclxuICAgICAgICB2YXIgcmV0dXJuZWQgPSBhcHAuX2NoZWNrRm9ybVN1Ym1pc3Npb24oJChlLnRhcmdldCkuY2xvc2VzdCgnZm9ybScpKTtcclxuICAgICAgICByZXR1cm4gKHJldHVybmVkID09PSBmYWxzZSkgPyBlLnByZXZlbnREZWZhdWx0KCkgOiBmYWxzZTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICAvLyBiaW5kIHVubG9hZCB0byBib2R5IHVubG9hZFxyXG4gICAgICAkKHdpbmRvdykuYmluZCgndW5sb2FkJywgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgYXBwLnVubG9hZCgpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIC8vIHRyaWdnZXIgaHRtbCBjaGFuZ2VkXHJcbiAgICAgIHJldHVybiB0aGlzLnRyaWdnZXIoJ2NoYW5nZWQnKTtcclxuICAgIH0sXHJcblxyXG4gICAgLy8gVGhlIG9wcG9zaXRlIG9mIGBydW4oKWAsIHVuLWJpbmRzIGFsbCBldmVudCBsaXN0ZW5lcnMgYW5kIGludGVydmFsc1xyXG4gICAgLy8gYHJ1bigpYCBBdXRvbWF0aWNhbGx5IGJpbmRzIGEgYG9udW5sb2FkYCBldmVudCB0byBydW4gdGhpcyB3aGVuXHJcbiAgICAvLyB0aGUgZG9jdW1lbnQgaXMgY2xvc2VkLlxyXG4gICAgdW5sb2FkOiBmdW5jdGlvbigpIHtcclxuICAgICAgaWYgKCF0aGlzLmlzUnVubmluZygpKSB7IHJldHVybiBmYWxzZTsgfVxyXG4gICAgICB2YXIgYXBwID0gdGhpcztcclxuICAgICAgdGhpcy50cmlnZ2VyKCd1bmxvYWQnKTtcclxuICAgICAgLy8gY2xlYXIgaW50ZXJ2YWxcclxuICAgICAgdGhpcy5fbG9jYXRpb25fcHJveHkudW5iaW5kKCk7XHJcbiAgICAgIC8vIHVuYmluZCBmb3JtIHN1Ym1pdHNcclxuICAgICAgdGhpcy4kZWxlbWVudCgpLnVuYmluZCgnc3VibWl0JykucmVtb3ZlQ2xhc3MoYXBwLmV2ZW50TmFtZXNwYWNlKCkpO1xyXG4gICAgICAvLyB1bmJpbmQgYWxsIGV2ZW50c1xyXG4gICAgICAkLmVhY2godGhpcy5saXN0ZW5lcnMudG9IYXNoKCkgLCBmdW5jdGlvbihuYW1lLCBsaXN0ZW5lcnMpIHtcclxuICAgICAgICAkLmVhY2gobGlzdGVuZXJzLCBmdW5jdGlvbihpLCBsaXN0ZW5lcl9jYWxsYmFjaykge1xyXG4gICAgICAgICAgYXBwLl91bmxpc3RlbihuYW1lLCBsaXN0ZW5lcl9jYWxsYmFjayk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLl9ydW5uaW5nID0gZmFsc2U7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBOb3Qgb25seSBydW5zIGB1bmJpbmRgIGJ1dCBhbHNvIGRlc3Ryb3lzIHRoZSBhcHAgcmVmZXJlbmNlLlxyXG4gICAgZGVzdHJveTogZnVuY3Rpb24oKSB7XHJcbiAgICAgIHRoaXMudW5sb2FkKCk7XHJcbiAgICAgIGRlbGV0ZSBTYW1teS5hcHBzW3RoaXMuZWxlbWVudF9zZWxlY3Rvcl07XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBXaWxsIGJpbmQgYSBzaW5nbGUgY2FsbGJhY2sgZnVuY3Rpb24gdG8gZXZlcnkgZXZlbnQgdGhhdCBpcyBhbHJlYWR5XHJcbiAgICAvLyBiZWluZyBsaXN0ZW5lZCB0byBpbiB0aGUgYXBwLiBUaGlzIGluY2x1ZGVzIGFsbCB0aGUgYEFQUF9FVkVOVFNgXHJcbiAgICAvLyBhcyB3ZWxsIGFzIGFueSBjdXN0b20gZXZlbnRzIGRlZmluZWQgd2l0aCBgYmluZCgpYC5cclxuICAgIC8vXHJcbiAgICAvLyBVc2VkIGludGVybmFsbHkgZm9yIGRlYnVnIGxvZ2dpbmcuXHJcbiAgICBiaW5kVG9BbGxFdmVudHM6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XHJcbiAgICAgIHZhciBhcHAgPSB0aGlzO1xyXG4gICAgICAvLyBiaW5kIHRvIHRoZSBBUFBfRVZFTlRTIGZpcnN0XHJcbiAgICAgICQuZWFjaCh0aGlzLkFQUF9FVkVOVFMsIGZ1bmN0aW9uKGksIGUpIHtcclxuICAgICAgICBhcHAuYmluZChlLCBjYWxsYmFjayk7XHJcbiAgICAgIH0pO1xyXG4gICAgICAvLyBuZXh0LCBiaW5kIHRvIGxpc3RlbmVyIG5hbWVzIChvbmx5IGlmIHRoZXkgZG9udCBleGlzdCBpbiBBUFBfRVZFTlRTKVxyXG4gICAgICAkLmVhY2godGhpcy5saXN0ZW5lcnMua2V5cyh0cnVlKSwgZnVuY3Rpb24oaSwgbmFtZSkge1xyXG4gICAgICAgIGlmICgkLmluQXJyYXkobmFtZSwgYXBwLkFQUF9FVkVOVFMpID09IC0xKSB7XHJcbiAgICAgICAgICBhcHAuYmluZChuYW1lLCBjYWxsYmFjayk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIFJldHVybnMgYSBjb3B5IG9mIHRoZSBnaXZlbiBwYXRoIHdpdGggYW55IHF1ZXJ5IHN0cmluZyBhZnRlciB0aGUgaGFzaFxyXG4gICAgLy8gcmVtb3ZlZC5cclxuICAgIHJvdXRhYmxlUGF0aDogZnVuY3Rpb24ocGF0aCkge1xyXG4gICAgICByZXR1cm4gcGF0aC5yZXBsYWNlKFFVRVJZX1NUUklOR19NQVRDSEVSLCAnJyk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIEdpdmVuIGEgdmVyYiBhbmQgYSBTdHJpbmcgcGF0aCwgd2lsbCByZXR1cm4gZWl0aGVyIGEgcm91dGUgb2JqZWN0IG9yIGZhbHNlXHJcbiAgICAvLyBpZiBhIG1hdGNoaW5nIHJvdXRlIGNhbiBiZSBmb3VuZCB3aXRoaW4gdGhlIGN1cnJlbnQgZGVmaW5lZCBzZXQuXHJcbiAgICBsb29rdXBSb3V0ZTogZnVuY3Rpb24odmVyYiwgcGF0aCkge1xyXG4gICAgICB2YXIgYXBwID0gdGhpcywgcm91dGVkID0gZmFsc2UsIGkgPSAwLCBsLCByb3V0ZTtcclxuICAgICAgaWYgKHR5cGVvZiB0aGlzLnJvdXRlc1t2ZXJiXSAhPSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIGwgPSB0aGlzLnJvdXRlc1t2ZXJiXS5sZW5ndGg7XHJcbiAgICAgICAgZm9yICg7IGkgPCBsOyBpKyspIHtcclxuICAgICAgICAgIHJvdXRlID0gdGhpcy5yb3V0ZXNbdmVyYl1baV07XHJcbiAgICAgICAgICBpZiAoYXBwLnJvdXRhYmxlUGF0aChwYXRoKS5tYXRjaChyb3V0ZS5wYXRoKSkge1xyXG4gICAgICAgICAgICByb3V0ZWQgPSByb3V0ZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiByb3V0ZWQ7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIEZpcnN0LCBpbnZva2VzIGBsb29rdXBSb3V0ZSgpYCBhbmQgaWYgYSByb3V0ZSBpcyBmb3VuZCwgcGFyc2VzIHRoZVxyXG4gICAgLy8gcG9zc2libGUgVVJMIHBhcmFtcyBhbmQgdGhlbiBpbnZva2VzIHRoZSByb3V0ZSdzIGNhbGxiYWNrIHdpdGhpbiBhIG5ld1xyXG4gICAgLy8gYFNhbW15LkV2ZW50Q29udGV4dGAuIElmIHRoZSByb3V0ZSBjYW4gbm90IGJlIGZvdW5kLCBpdCBjYWxsc1xyXG4gICAgLy8gYG5vdEZvdW5kKClgLiBJZiBgcmFpc2VfZXJyb3JzYCBpcyBzZXQgdG8gYHRydWVgIGFuZFxyXG4gICAgLy8gdGhlIGBlcnJvcigpYCBoYXMgbm90IGJlZW4gb3ZlcnJpZGRlbiwgaXQgd2lsbCB0aHJvdyBhbiBhY3R1YWwgSlNcclxuICAgIC8vIGVycm9yLlxyXG4gICAgLy9cclxuICAgIC8vIFlvdSBwcm9iYWJseSB3aWxsIG5ldmVyIGhhdmUgdG8gY2FsbCB0aGlzIGRpcmVjdGx5LlxyXG4gICAgLy9cclxuICAgIC8vICMjIyBBcmd1bWVudHNcclxuICAgIC8vXHJcbiAgICAvLyAqIGB2ZXJiYCBBIFN0cmluZyBmb3IgdGhlIHZlcmIuXHJcbiAgICAvLyAqIGBwYXRoYCBBIFN0cmluZyBwYXRoIHRvIGxvb2t1cC5cclxuICAgIC8vICogYHBhcmFtc2AgQW4gT2JqZWN0IG9mIFBhcmFtcyBwdWxsZWQgZnJvbSB0aGUgVVJJIG9yIHBhc3NlZCBkaXJlY3RseS5cclxuICAgIC8vXHJcbiAgICAvLyAjIyMgUmV0dXJuc1xyXG4gICAgLy9cclxuICAgIC8vIEVpdGhlciByZXR1cm5zIHRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGUgcm91dGUgY2FsbGJhY2sgb3IgcmFpc2VzIGEgNDA0IE5vdCBGb3VuZCBlcnJvci5cclxuICAgIC8vXHJcbiAgICBydW5Sb3V0ZTogZnVuY3Rpb24odmVyYiwgcGF0aCwgcGFyYW1zLCB0YXJnZXQpIHtcclxuICAgICAgdmFyIGFwcCA9IHRoaXMsXHJcbiAgICAgICAgICByb3V0ZSA9IHRoaXMubG9va3VwUm91dGUodmVyYiwgcGF0aCksXHJcbiAgICAgICAgICBjb250ZXh0LFxyXG4gICAgICAgICAgd3JhcHBlZF9yb3V0ZSxcclxuICAgICAgICAgIGFyb3VuZHMsXHJcbiAgICAgICAgICBhcm91bmQsXHJcbiAgICAgICAgICBiZWZvcmVzLFxyXG4gICAgICAgICAgYmVmb3JlLFxyXG4gICAgICAgICAgY2FsbGJhY2tfYXJncyxcclxuICAgICAgICAgIHBhdGhfcGFyYW1zLFxyXG4gICAgICAgICAgZmluYWxfcmV0dXJuZWQ7XHJcblxyXG4gICAgICBpZiAodGhpcy5kZWJ1Zykge1xyXG4gICAgICAgIHRoaXMubG9nKCdydW5Sb3V0ZScsIFt2ZXJiLCBwYXRoXS5qb2luKCcgJykpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnRyaWdnZXIoJ3J1bi1yb3V0ZScsIHt2ZXJiOiB2ZXJiLCBwYXRoOiBwYXRoLCBwYXJhbXM6IHBhcmFtc30pO1xyXG4gICAgICBpZiAodHlwZW9mIHBhcmFtcyA9PSAndW5kZWZpbmVkJykgeyBwYXJhbXMgPSB7fTsgfVxyXG5cclxuICAgICAgJC5leHRlbmQocGFyYW1zLCB0aGlzLl9wYXJzZVF1ZXJ5U3RyaW5nKHBhdGgpKTtcclxuXHJcbiAgICAgIGlmIChyb3V0ZSkge1xyXG4gICAgICAgIHRoaXMudHJpZ2dlcigncm91dGUtZm91bmQnLCB7cm91dGU6IHJvdXRlfSk7XHJcbiAgICAgICAgLy8gcHVsbCBvdXQgdGhlIHBhcmFtcyBmcm9tIHRoZSBwYXRoXHJcbiAgICAgICAgaWYgKChwYXRoX3BhcmFtcyA9IHJvdXRlLnBhdGguZXhlYyh0aGlzLnJvdXRhYmxlUGF0aChwYXRoKSkpICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAvLyBmaXJzdCBtYXRjaCBpcyB0aGUgZnVsbCBwYXRoXHJcbiAgICAgICAgICBwYXRoX3BhcmFtcy5zaGlmdCgpO1xyXG4gICAgICAgICAgLy8gZm9yIGVhY2ggb2YgdGhlIG1hdGNoZXNcclxuICAgICAgICAgICQuZWFjaChwYXRoX3BhcmFtcywgZnVuY3Rpb24oaSwgcGFyYW0pIHtcclxuICAgICAgICAgICAgLy8gaWYgdGhlcmVzIGEgbWF0Y2hpbmcgcGFyYW0gbmFtZVxyXG4gICAgICAgICAgICBpZiAocm91dGUucGFyYW1fbmFtZXNbaV0pIHtcclxuICAgICAgICAgICAgICAvLyBzZXQgdGhlIG5hbWUgdG8gdGhlIG1hdGNoXHJcbiAgICAgICAgICAgICAgcGFyYW1zW3JvdXRlLnBhcmFtX25hbWVzW2ldXSA9IF9kZWNvZGUocGFyYW0pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIC8vIGluaXRpYWxpemUgJ3NwbGF0J1xyXG4gICAgICAgICAgICAgIGlmICghcGFyYW1zLnNwbGF0KSB7IHBhcmFtcy5zcGxhdCA9IFtdOyB9XHJcbiAgICAgICAgICAgICAgcGFyYW1zLnNwbGF0LnB1c2goX2RlY29kZShwYXJhbSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIHNldCBldmVudCBjb250ZXh0XHJcbiAgICAgICAgY29udGV4dCAgPSBuZXcgdGhpcy5jb250ZXh0X3Byb3RvdHlwZSh0aGlzLCB2ZXJiLCBwYXRoLCBwYXJhbXMsIHRhcmdldCk7XHJcbiAgICAgICAgLy8gZW5zdXJlIGFycmF5c1xyXG4gICAgICAgIGFyb3VuZHMgPSB0aGlzLmFyb3VuZHMuc2xpY2UoMCk7XHJcbiAgICAgICAgYmVmb3JlcyA9IHRoaXMuYmVmb3Jlcy5zbGljZSgwKTtcclxuICAgICAgICAvLyBzZXQgdGhlIGNhbGxiYWNrIGFyZ3MgdG8gdGhlIGNvbnRleHQgKyBjb250ZW50cyBvZiB0aGUgc3BsYXRcclxuICAgICAgICBjYWxsYmFja19hcmdzID0gW2NvbnRleHRdO1xyXG4gICAgICAgIGlmIChwYXJhbXMuc3BsYXQpIHtcclxuICAgICAgICAgIGNhbGxiYWNrX2FyZ3MgPSBjYWxsYmFja19hcmdzLmNvbmNhdChwYXJhbXMuc3BsYXQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyB3cmFwIHRoZSByb3V0ZSB1cCB3aXRoIHRoZSBiZWZvcmUgZmlsdGVyc1xyXG4gICAgICAgIHdyYXBwZWRfcm91dGUgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICAgIHZhciByZXR1cm5lZCwgaSwgbmV4dFJvdXRlO1xyXG4gICAgICAgICAgd2hpbGUgKGJlZm9yZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBiZWZvcmUgPSBiZWZvcmVzLnNoaWZ0KCk7XHJcbiAgICAgICAgICAgIC8vIGNoZWNrIHRoZSBvcHRpb25zXHJcbiAgICAgICAgICAgIGlmIChhcHAuY29udGV4dE1hdGNoZXNPcHRpb25zKGNvbnRleHQsIGJlZm9yZVswXSkpIHtcclxuICAgICAgICAgICAgICByZXR1cm5lZCA9IGJlZm9yZVsxXS5hcHBseShjb250ZXh0LCBbY29udGV4dF0pO1xyXG4gICAgICAgICAgICAgIGlmIChyZXR1cm5lZCA9PT0gZmFsc2UpIHsgcmV0dXJuIGZhbHNlOyB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGFwcC5sYXN0X3JvdXRlID0gcm91dGU7XHJcbiAgICAgICAgICBjb250ZXh0LnRyaWdnZXIoJ2V2ZW50LWNvbnRleHQtYmVmb3JlJywge2NvbnRleHQ6IGNvbnRleHR9KTtcclxuICAgICAgICAgIC8vIHJ1biBtdWx0aXBsZSBjYWxsYmFja3NcclxuICAgICAgICAgIGlmICh0eXBlb2Yocm91dGUuY2FsbGJhY2spID09PSBcImZ1bmN0aW9uXCIpIHtcclxuICAgICAgICAgICAgcm91dGUuY2FsbGJhY2sgPSBbcm91dGUuY2FsbGJhY2tdO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKHJvdXRlLmNhbGxiYWNrICYmIHJvdXRlLmNhbGxiYWNrLmxlbmd0aCkge1xyXG4gICAgICAgICAgICBpID0gLTE7XHJcbiAgICAgICAgICAgIG5leHRSb3V0ZSA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgIGkrKztcclxuICAgICAgICAgICAgICBpZiAocm91dGUuY2FsbGJhY2tbaV0pIHtcclxuICAgICAgICAgICAgICAgIHJldHVybmVkID0gcm91dGUuY2FsbGJhY2tbaV0uYXBwbHkoY29udGV4dCxjYWxsYmFja19hcmdzKTtcclxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFwcC5fb25Db21wbGV0ZSAmJiB0eXBlb2YoYXBwLl9vbkNvbXBsZXRlID09PSBcImZ1bmN0aW9uXCIpKSB7XHJcbiAgICAgICAgICAgICAgICBhcHAuX29uQ29tcGxldGUoY29udGV4dCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBjYWxsYmFja19hcmdzLnB1c2gobmV4dFJvdXRlKTtcclxuICAgICAgICAgICAgbmV4dFJvdXRlKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBjb250ZXh0LnRyaWdnZXIoJ2V2ZW50LWNvbnRleHQtYWZ0ZXInLCB7Y29udGV4dDogY29udGV4dH0pO1xyXG4gICAgICAgICAgcmV0dXJuIHJldHVybmVkO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgJC5lYWNoKGFyb3VuZHMucmV2ZXJzZSgpLCBmdW5jdGlvbihpLCBhcm91bmQpIHtcclxuICAgICAgICAgIHZhciBsYXN0X3dyYXBwZWRfcm91dGUgPSB3cmFwcGVkX3JvdXRlO1xyXG4gICAgICAgICAgd3JhcHBlZF9yb3V0ZSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gYXJvdW5kLmFwcGx5KGNvbnRleHQsIFtsYXN0X3dyYXBwZWRfcm91dGVdKTsgfTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgZmluYWxfcmV0dXJuZWQgPSB3cmFwcGVkX3JvdXRlKCk7XHJcbiAgICAgICAgfSBjYXRjaChlKSB7XHJcbiAgICAgICAgICB0aGlzLmVycm9yKFsnNTAwIEVycm9yJywgdmVyYiwgcGF0aF0uam9pbignICcpLCBlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZpbmFsX3JldHVybmVkO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm5vdEZvdW5kKHZlcmIsIHBhdGgpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIE1hdGNoZXMgYW4gb2JqZWN0IG9mIG9wdGlvbnMgYWdhaW5zdCBhbiBgRXZlbnRDb250ZXh0YCBsaWtlIG9iamVjdCB0aGF0XHJcbiAgICAvLyBjb250YWlucyBgcGF0aGAgYW5kIGB2ZXJiYCBhdHRyaWJ1dGVzLiBJbnRlcm5hbGx5IFNhbW15IHVzZXMgdGhpc1xyXG4gICAgLy8gZm9yIG1hdGNoaW5nIGBiZWZvcmUoKWAgZmlsdGVycyBhZ2FpbnN0IHNwZWNpZmljIG9wdGlvbnMuIFlvdSBjYW4gc2V0IHRoZVxyXG4gICAgLy8gb2JqZWN0IHRvIF9vbmx5XyBtYXRjaCBjZXJ0YWluIHBhdGhzIG9yIHZlcmJzLCBvciBtYXRjaCBhbGwgcGF0aHMgb3IgdmVyYnMgX2V4Y2VwdF9cclxuICAgIC8vIHRob3NlIHRoYXQgbWF0Y2ggdGhlIG9wdGlvbnMuXHJcbiAgICAvL1xyXG4gICAgLy8gIyMjIEV4YW1wbGVcclxuICAgIC8vXHJcbiAgICAvLyAgICAgdmFyIGFwcCA9ICQuc2FtbXkoKSxcclxuICAgIC8vICAgICAgICAgY29udGV4dCA9IHt2ZXJiOiAnZ2V0JywgcGF0aDogJyMvbXlwYXRoJ307XHJcbiAgICAvL1xyXG4gICAgLy8gICAgIC8vIG1hdGNoIGFnYWluc3QgYSBwYXRoIHN0cmluZ1xyXG4gICAgLy8gICAgIGFwcC5jb250ZXh0TWF0Y2hlc09wdGlvbnMoY29udGV4dCwgJyMvbXlwYXRoJyk7IC8vPT4gdHJ1ZVxyXG4gICAgLy8gICAgIGFwcC5jb250ZXh0TWF0Y2hlc09wdGlvbnMoY29udGV4dCwgJyMvb3RoZXJwYXRoJyk7IC8vPT4gZmFsc2VcclxuICAgIC8vICAgICAvLyBlcXVpdmFsZW50IHRvXHJcbiAgICAvLyAgICAgYXBwLmNvbnRleHRNYXRjaGVzT3B0aW9ucyhjb250ZXh0LCB7b25seToge3BhdGg6JyMvbXlwYXRoJ319KTsgLy89PiB0cnVlXHJcbiAgICAvLyAgICAgYXBwLmNvbnRleHRNYXRjaGVzT3B0aW9ucyhjb250ZXh0LCB7b25seToge3BhdGg6JyMvb3RoZXJwYXRoJ319KTsgLy89PiBmYWxzZVxyXG4gICAgLy8gICAgIC8vIG1hdGNoIGFnYWluc3QgYSBwYXRoIHJlZ2V4cFxyXG4gICAgLy8gICAgIGFwcC5jb250ZXh0TWF0Y2hlc09wdGlvbnMoY29udGV4dCwgL3BhdGgvKTsgLy89PiB0cnVlXHJcbiAgICAvLyAgICAgYXBwLmNvbnRleHRNYXRjaGVzT3B0aW9ucyhjb250ZXh0LCAvXnBhdGgvKTsgLy89PiBmYWxzZVxyXG4gICAgLy8gICAgIC8vIG1hdGNoIG9ubHkgYSB2ZXJiXHJcbiAgICAvLyAgICAgYXBwLmNvbnRleHRNYXRjaGVzT3B0aW9ucyhjb250ZXh0LCB7b25seToge3ZlcmI6J2dldCd9fSk7IC8vPT4gdHJ1ZVxyXG4gICAgLy8gICAgIGFwcC5jb250ZXh0TWF0Y2hlc09wdGlvbnMoY29udGV4dCwge29ubHk6IHt2ZXJiOidwb3N0J319KTsgLy89PiBmYWxzZVxyXG4gICAgLy8gICAgIC8vIG1hdGNoIGFsbCBleGNlcHQgYSB2ZXJiXHJcbiAgICAvLyAgICAgYXBwLmNvbnRleHRNYXRjaGVzT3B0aW9ucyhjb250ZXh0LCB7ZXhjZXB0OiB7dmVyYjoncG9zdCd9fSk7IC8vPT4gdHJ1ZVxyXG4gICAgLy8gICAgIGFwcC5jb250ZXh0TWF0Y2hlc09wdGlvbnMoY29udGV4dCwge2V4Y2VwdDoge3ZlcmI6J2dldCd9fSk7IC8vPT4gZmFsc2VcclxuICAgIC8vICAgICAvLyBtYXRjaCBhbGwgZXhjZXB0IGEgcGF0aFxyXG4gICAgLy8gICAgIGFwcC5jb250ZXh0TWF0Y2hlc09wdGlvbnMoY29udGV4dCwge2V4Y2VwdDoge3BhdGg6JyMvb3RoZXJwYXRoJ319KTsgLy89PiB0cnVlXHJcbiAgICAvLyAgICAgYXBwLmNvbnRleHRNYXRjaGVzT3B0aW9ucyhjb250ZXh0LCB7ZXhjZXB0OiB7cGF0aDonIy9teXBhdGgnfX0pOyAvLz0+IGZhbHNlXHJcbiAgICAvLyAgICAgLy8gbWF0Y2ggYWxsIGV4Y2VwdCBhIHZlcmIgYW5kIGEgcGF0aFxyXG4gICAgLy8gICAgIGFwcC5jb250ZXh0TWF0Y2hlc09wdGlvbnMoY29udGV4dCwge2V4Y2VwdDoge3BhdGg6JyMvb3RoZXJwYXRoJywgdmVyYjoncG9zdCd9fSk7IC8vPT4gdHJ1ZVxyXG4gICAgLy8gICAgIGFwcC5jb250ZXh0TWF0Y2hlc09wdGlvbnMoY29udGV4dCwge2V4Y2VwdDoge3BhdGg6JyMvbXlwYXRoJywgdmVyYjoncG9zdCd9fSk7IC8vPT4gdHJ1ZVxyXG4gICAgLy8gICAgIGFwcC5jb250ZXh0TWF0Y2hlc09wdGlvbnMoY29udGV4dCwge2V4Y2VwdDoge3BhdGg6JyMvbXlwYXRoJywgdmVyYjonZ2V0J319KTsgLy89PiBmYWxzZVxyXG4gICAgLy8gICAgIC8vIG1hdGNoIG11bHRpcGxlIHBhdGhzXHJcbiAgICAvLyAgICAgYXBwLmNvbnRleHRNYXRjaGVzT3B0aW9ucyhjb250ZXh0LCB7cGF0aDogWycjL215cGF0aCcsICcjL290aGVycGF0aCddfSk7IC8vPT4gdHJ1ZVxyXG4gICAgLy8gICAgIGFwcC5jb250ZXh0TWF0Y2hlc09wdGlvbnMoY29udGV4dCwge3BhdGg6IFsnIy9vdGhlcnBhdGgnLCAnIy90aGlyZHBhdGgnXX0pOyAvLz0+IGZhbHNlXHJcbiAgICAvLyAgICAgLy8gZXF1aXZhbGVudCB0b1xyXG4gICAgLy8gICAgIGFwcC5jb250ZXh0TWF0Y2hlc09wdGlvbnMoY29udGV4dCwge29ubHk6IHtwYXRoOiBbJyMvbXlwYXRoJywgJyMvb3RoZXJwYXRoJ119fSk7IC8vPT4gdHJ1ZVxyXG4gICAgLy8gICAgIGFwcC5jb250ZXh0TWF0Y2hlc09wdGlvbnMoY29udGV4dCwge29ubHk6IHtwYXRoOiBbJyMvb3RoZXJwYXRoJywgJyMvdGhpcmRwYXRoJ119fSk7IC8vPT4gZmFsc2VcclxuICAgIC8vICAgICAvLyBtYXRjaCBhbGwgZXhjZXB0IG11bHRpcGxlIHBhdGhzXHJcbiAgICAvLyAgICAgYXBwLmNvbnRleHRNYXRjaGVzT3B0aW9ucyhjb250ZXh0LCB7ZXhjZXB0OiB7cGF0aDogWycjL215cGF0aCcsICcjL290aGVycGF0aCddfX0pOyAvLz0+IGZhbHNlXHJcbiAgICAvLyAgICAgYXBwLmNvbnRleHRNYXRjaGVzT3B0aW9ucyhjb250ZXh0LCB7ZXhjZXB0OiB7cGF0aDogWycjL290aGVycGF0aCcsICcjL3RoaXJkcGF0aCddfX0pOyAvLz0+IHRydWVcclxuICAgIC8vICAgICAvLyBtYXRjaCBhbGwgZXhjZXB0IG11bHRpcGxlIHBhdGhzIGFuZCB2ZXJic1xyXG4gICAgLy8gICAgIGFwcC5jb250ZXh0TWF0Y2hlc09wdGlvbnMoY29udGV4dCwge2V4Y2VwdDoge3BhdGg6IFsnIy9teXBhdGgnLCAnIy9vdGhlcnBhdGgnXSwgdmVyYjogWydnZXQnLCAncG9zdCddfX0pOyAvLz0+IGZhbHNlXHJcbiAgICAvLyAgICAgYXBwLmNvbnRleHRNYXRjaGVzT3B0aW9ucyhjb250ZXh0LCB7ZXhjZXB0OiB7cGF0aDogWycjL290aGVycGF0aCcsICcjL3RoaXJkcGF0aCddLCB2ZXJiOiBbJ2dldCcsICdwb3N0J119fSk7IC8vPT4gdHJ1ZVxyXG4gICAgLy9cclxuICAgIGNvbnRleHRNYXRjaGVzT3B0aW9uczogZnVuY3Rpb24oY29udGV4dCwgbWF0Y2hfb3B0aW9ucywgcG9zaXRpdmUpIHtcclxuICAgICAgdmFyIG9wdGlvbnMgPSBtYXRjaF9vcHRpb25zO1xyXG4gICAgICAvLyBub3JtYWxpemUgb3B0aW9uc1xyXG4gICAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdzdHJpbmcnIHx8IF9pc1JlZ0V4cChvcHRpb25zKSkge1xyXG4gICAgICAgIG9wdGlvbnMgPSB7cGF0aDogb3B0aW9uc307XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHR5cGVvZiBwb3NpdGl2ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICBwb3NpdGl2ZSA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgLy8gZW1wdHkgb3B0aW9ucyBhbHdheXMgbWF0Y2hcclxuICAgICAgaWYgKCQuaXNFbXB0eU9iamVjdChvcHRpb25zKSkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIERvIHdlIGhhdmUgdG8gbWF0Y2ggYWdhaW5zdCBtdWx0aXBsZSBwYXRocz9cclxuICAgICAgaWYgKF9pc0FycmF5KG9wdGlvbnMucGF0aCkpe1xyXG4gICAgICAgIHZhciByZXN1bHRzLCBudW1vcHQsIG9wdHMsIGxlbjtcclxuICAgICAgICByZXN1bHRzID0gW107XHJcbiAgICAgICAgZm9yIChudW1vcHQgPSAwLCBsZW4gPSBvcHRpb25zLnBhdGgubGVuZ3RoOyBudW1vcHQgPCBsZW47IG51bW9wdCArPSAxKSB7XHJcbiAgICAgICAgICBvcHRzID0gJC5leHRlbmQoe30sIG9wdGlvbnMsIHtwYXRoOiBvcHRpb25zLnBhdGhbbnVtb3B0XX0pO1xyXG4gICAgICAgICAgcmVzdWx0cy5wdXNoKHRoaXMuY29udGV4dE1hdGNoZXNPcHRpb25zKGNvbnRleHQsIG9wdHMpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIG1hdGNoZWQgPSAkLmluQXJyYXkodHJ1ZSwgcmVzdWx0cykgPiAtMSA/IHRydWUgOiBmYWxzZTtcclxuICAgICAgICByZXR1cm4gcG9zaXRpdmUgPyBtYXRjaGVkIDogIW1hdGNoZWQ7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKG9wdGlvbnMub25seSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRleHRNYXRjaGVzT3B0aW9ucyhjb250ZXh0LCBvcHRpb25zLm9ubHksIHRydWUpO1xyXG4gICAgICB9IGVsc2UgaWYgKG9wdGlvbnMuZXhjZXB0KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGV4dE1hdGNoZXNPcHRpb25zKGNvbnRleHQsIG9wdGlvbnMuZXhjZXB0LCBmYWxzZSk7XHJcbiAgICAgIH1cclxuICAgICAgdmFyIHBhdGhfbWF0Y2hlZCA9IHRydWUsIHZlcmJfbWF0Y2hlZCA9IHRydWU7XHJcbiAgICAgIGlmIChvcHRpb25zLnBhdGgpIHtcclxuICAgICAgICBpZiAoIV9pc1JlZ0V4cChvcHRpb25zLnBhdGgpKSB7XHJcbiAgICAgICAgICBvcHRpb25zLnBhdGggPSBuZXcgUmVnRXhwKG9wdGlvbnMucGF0aC50b1N0cmluZygpICsgJyQnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcGF0aF9tYXRjaGVkID0gb3B0aW9ucy5wYXRoLnRlc3QoY29udGV4dC5wYXRoKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAob3B0aW9ucy52ZXJiKSB7XHJcbiAgICAgICAgaWYodHlwZW9mIG9wdGlvbnMudmVyYiA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgIHZlcmJfbWF0Y2hlZCA9IG9wdGlvbnMudmVyYiA9PT0gY29udGV4dC52ZXJiO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB2ZXJiX21hdGNoZWQgPSBvcHRpb25zLnZlcmIuaW5kZXhPZihjb250ZXh0LnZlcmIpID4gLTE7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBwb3NpdGl2ZSA/ICh2ZXJiX21hdGNoZWQgJiYgcGF0aF9tYXRjaGVkKSA6ICEodmVyYl9tYXRjaGVkICYmIHBhdGhfbWF0Y2hlZCk7XHJcbiAgICB9LFxyXG5cclxuXHJcbiAgICAvLyBEZWxlZ2F0ZXMgdG8gdGhlIGBsb2NhdGlvbl9wcm94eWAgdG8gZ2V0IHRoZSBjdXJyZW50IGxvY2F0aW9uLlxyXG4gICAgLy8gU2VlIGBTYW1teS5EZWZhdWx0TG9jYXRpb25Qcm94eWAgZm9yIG1vcmUgaW5mbyBvbiBsb2NhdGlvbiBwcm94aWVzLlxyXG4gICAgZ2V0TG9jYXRpb246IGZ1bmN0aW9uKCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5fbG9jYXRpb25fcHJveHkuZ2V0TG9jYXRpb24oKTtcclxuICAgIH0sXHJcblxyXG4gICAgLy8gRGVsZWdhdGVzIHRvIHRoZSBgbG9jYXRpb25fcHJveHlgIHRvIHNldCB0aGUgY3VycmVudCBsb2NhdGlvbi5cclxuICAgIC8vIFNlZSBgU2FtbXkuRGVmYXVsdExvY2F0aW9uUHJveHlgIGZvciBtb3JlIGluZm8gb24gbG9jYXRpb24gcHJveGllcy5cclxuICAgIC8vXHJcbiAgICAvLyAjIyMgQXJndW1lbnRzXHJcbiAgICAvL1xyXG4gICAgLy8gKiBgbmV3X2xvY2F0aW9uYCBBIG5ldyBsb2NhdGlvbiBzdHJpbmcgKGUuZy4gJyMvJylcclxuICAgIC8vXHJcbiAgICBzZXRMb2NhdGlvbjogZnVuY3Rpb24obmV3X2xvY2F0aW9uKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLl9sb2NhdGlvbl9wcm94eS5zZXRMb2NhdGlvbihuZXdfbG9jYXRpb24pO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBTd2FwcyB0aGUgY29udGVudCBvZiBgJGVsZW1lbnQoKWAgd2l0aCBgY29udGVudGBcclxuICAgIC8vIFlvdSBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gcHJvdmlkZSBhbiBhbHRlcm5hdGUgc3dhcCBiZWhhdmlvclxyXG4gICAgLy8gZm9yIGBFdmVudENvbnRleHQucGFydGlhbCgpYC5cclxuICAgIC8vXHJcbiAgICAvLyAjIyMgRXhhbXBsZVxyXG4gICAgLy9cclxuICAgIC8vICAgICAgdmFyIGFwcCA9ICQuc2FtbXkoZnVuY3Rpb24oKSB7XHJcbiAgICAvL1xyXG4gICAgLy8gICAgICAgIC8vIGltcGxlbWVudHMgYSAnZmFkZSBvdXQnLydmYWRlIGluJ1xyXG4gICAgLy8gICAgICAgIHRoaXMuc3dhcCA9IGZ1bmN0aW9uKGNvbnRlbnQsIGNhbGxiYWNrKSB7XHJcbiAgICAvLyAgICAgICAgICB2YXIgY29udGV4dCA9IHRoaXM7XHJcbiAgICAvLyAgICAgICAgICBjb250ZXh0LiRlbGVtZW50KCkuZmFkZU91dCgnc2xvdycsIGZ1bmN0aW9uKCkge1xyXG4gICAgLy8gICAgICAgICAgICBjb250ZXh0LiRlbGVtZW50KCkuaHRtbChjb250ZW50KTtcclxuICAgIC8vICAgICAgICAgICAgY29udGV4dC4kZWxlbWVudCgpLmZhZGVJbignc2xvdycsIGZ1bmN0aW9uKCkge1xyXG4gICAgLy8gICAgICAgICAgICAgIGlmIChjYWxsYmFjaykge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgY2FsbGJhY2suYXBwbHkoKTtcclxuICAgIC8vICAgICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgICAgIH0pO1xyXG4gICAgLy8gICAgICAgICAgfSk7XHJcbiAgICAvLyAgICAgICAgfTtcclxuICAgIC8vXHJcbiAgICAvLyAgICAgIH0pO1xyXG4gICAgLy9cclxuICAgIHN3YXA6IGZ1bmN0aW9uKGNvbnRlbnQsIGNhbGxiYWNrKSB7XHJcbiAgICAgIHZhciAkZWwgPSB0aGlzLiRlbGVtZW50KCkuaHRtbChjb250ZW50KTtcclxuICAgICAgaWYgKF9pc0Z1bmN0aW9uKGNhbGxiYWNrKSkgeyBjYWxsYmFjayhjb250ZW50KTsgfVxyXG4gICAgICByZXR1cm4gJGVsO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBhIHNpbXBsZSBnbG9iYWwgY2FjaGUgZm9yIHRlbXBsYXRlcy4gVXNlcyB0aGUgc2FtZSBzZW1hbnRpY3MgYXNcclxuICAgIC8vIGBTYW1teS5DYWNoZWAgYW5kIGBTYW1teS5TdG9yYWdlYCBzbyBjYW4gZWFzaWx5IGJlIHJlcGxhY2VkIHdpdGhcclxuICAgIC8vIGEgcGVyc2lzdGVudCBzdG9yYWdlIHRoYXQgbGFzdHMgYmV5b25kIHRoZSBjdXJyZW50IHJlcXVlc3QuXHJcbiAgICB0ZW1wbGF0ZUNhY2hlOiBmdW5jdGlvbihrZXksIHZhbHVlKSB7XHJcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICByZXR1cm4gX3RlbXBsYXRlX2NhY2hlW2tleV0gPSB2YWx1ZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gX3RlbXBsYXRlX2NhY2hlW2tleV07XHJcbiAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLy8gY2xlYXIgdGhlIHRlbXBsYXRlQ2FjaGVcclxuICAgIGNsZWFyVGVtcGxhdGVDYWNoZTogZnVuY3Rpb24oKSB7XHJcbiAgICAgIHJldHVybiAoX3RlbXBsYXRlX2NhY2hlID0ge30pO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBUaGlzIHRocm93cyBhICc0MDQgTm90IEZvdW5kJyBlcnJvciBieSBpbnZva2luZyBgZXJyb3IoKWAuXHJcbiAgICAvLyBPdmVycmlkZSB0aGlzIG1ldGhvZCBvciBgZXJyb3IoKWAgdG8gcHJvdmlkZSBjdXN0b21cclxuICAgIC8vIDQwNCBiZWhhdmlvciAoaS5lIHJlZGlyZWN0aW5nIHRvIC8gb3Igc2hvd2luZyBhIHdhcm5pbmcpXHJcbiAgICBub3RGb3VuZDogZnVuY3Rpb24odmVyYiwgcGF0aCkge1xyXG4gICAgICB2YXIgcmV0ID0gdGhpcy5lcnJvcihbJzQwNCBOb3QgRm91bmQnLCB2ZXJiLCBwYXRoXS5qb2luKCcgJykpO1xyXG4gICAgICByZXR1cm4gKHZlcmIgPT09ICdnZXQnKSA/IHJldCA6IHRydWU7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIFRoZSBiYXNlIGVycm9yIGhhbmRsZXIgdGFrZXMgYSBzdHJpbmcgYG1lc3NhZ2VgIGFuZCBhbiBgRXJyb3JgXHJcbiAgICAvLyBvYmplY3QuIElmIGByYWlzZV9lcnJvcnNgIGlzIHNldCB0byBgdHJ1ZWAgb24gdGhlIGFwcCBsZXZlbCxcclxuICAgIC8vIHRoaXMgd2lsbCByZS10aHJvdyB0aGUgZXJyb3IgdG8gdGhlIGJyb3dzZXIuIE90aGVyd2lzZSBpdCB3aWxsIHNlbmQgdGhlIGVycm9yXHJcbiAgICAvLyB0byBgbG9nKClgLiBPdmVycmlkZSB0aGlzIG1ldGhvZCB0byBwcm92aWRlIGN1c3RvbSBlcnJvciBoYW5kbGluZ1xyXG4gICAgLy8gZS5nIGxvZ2dpbmcgdG8gYSBzZXJ2ZXIgc2lkZSBjb21wb25lbnQgb3IgZGlzcGxheWluZyBzb21lIGZlZWRiYWNrIHRvIHRoZVxyXG4gICAgLy8gdXNlci5cclxuICAgIGVycm9yOiBmdW5jdGlvbihtZXNzYWdlLCBvcmlnaW5hbF9lcnJvcikge1xyXG4gICAgICBpZiAoIW9yaWdpbmFsX2Vycm9yKSB7IG9yaWdpbmFsX2Vycm9yID0gbmV3IEVycm9yKCk7IH1cclxuICAgICAgb3JpZ2luYWxfZXJyb3IubWVzc2FnZSA9IFttZXNzYWdlLCBvcmlnaW5hbF9lcnJvci5tZXNzYWdlXS5qb2luKCcgJyk7XHJcbiAgICAgIHRoaXMudHJpZ2dlcignZXJyb3InLCB7bWVzc2FnZTogb3JpZ2luYWxfZXJyb3IubWVzc2FnZSwgZXJyb3I6IG9yaWdpbmFsX2Vycm9yfSk7XHJcbiAgICAgIGlmICh0aGlzLnJhaXNlX2Vycm9ycykge1xyXG4gICAgICAgIHRocm93KG9yaWdpbmFsX2Vycm9yKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmxvZyhvcmlnaW5hbF9lcnJvci5tZXNzYWdlLCBvcmlnaW5hbF9lcnJvcik7XHJcbiAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgX2NoZWNrTG9jYXRpb246IGZ1bmN0aW9uKCkge1xyXG4gICAgICB2YXIgbG9jYXRpb24sIHJldHVybmVkO1xyXG4gICAgICAvLyBnZXQgY3VycmVudCBsb2NhdGlvblxyXG4gICAgICBsb2NhdGlvbiA9IHRoaXMuZ2V0TG9jYXRpb24oKTtcclxuICAgICAgLy8gY29tcGFyZSB0byBzZWUgaWYgaGFzaCBoYXMgY2hhbmdlZFxyXG4gICAgICBpZiAoIXRoaXMubGFzdF9sb2NhdGlvbiB8fCB0aGlzLmxhc3RfbG9jYXRpb25bMF0gIT0gJ2dldCcgfHwgdGhpcy5sYXN0X2xvY2F0aW9uWzFdICE9IGxvY2F0aW9uKSB7XHJcbiAgICAgICAgLy8gcmVzZXQgbGFzdCBsb2NhdGlvblxyXG4gICAgICAgIHRoaXMubGFzdF9sb2NhdGlvbiA9IFsnZ2V0JywgbG9jYXRpb25dO1xyXG4gICAgICAgIC8vIGxvb2t1cCByb3V0ZSBmb3IgY3VycmVudCBoYXNoXHJcbiAgICAgICAgcmV0dXJuZWQgPSB0aGlzLnJ1blJvdXRlKCdnZXQnLCBsb2NhdGlvbik7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHJldHVybmVkO1xyXG4gICAgfSxcclxuXHJcbiAgICBfZ2V0Rm9ybVZlcmI6IGZ1bmN0aW9uKGZvcm0pIHtcclxuICAgICAgdmFyICRmb3JtID0gJChmb3JtKSwgdmVyYiwgJF9tZXRob2Q7XHJcbiAgICAgICRfbWV0aG9kID0gJGZvcm0uZmluZCgnaW5wdXRbbmFtZT1cIl9tZXRob2RcIl0nKTtcclxuICAgICAgaWYgKCRfbWV0aG9kLmxlbmd0aCA+IDApIHsgdmVyYiA9ICRfbWV0aG9kLnZhbCgpOyB9XHJcbiAgICAgIGlmICghdmVyYikgeyB2ZXJiID0gJGZvcm1bMF0uZ2V0QXR0cmlidXRlKCdtZXRob2QnKTsgfVxyXG4gICAgICBpZiAoIXZlcmIgfHwgdmVyYiA9PT0gJycpIHsgdmVyYiA9ICdnZXQnOyB9XHJcbiAgICAgIHJldHVybiAkLnRyaW0odmVyYi50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkpO1xyXG4gICAgfSxcclxuXHJcbiAgICBfY2hlY2tGb3JtU3VibWlzc2lvbjogZnVuY3Rpb24oZm9ybSkge1xyXG4gICAgICB2YXIgJGZvcm0sIHBhdGgsIHZlcmIsIHBhcmFtcywgcmV0dXJuZWQ7XHJcbiAgICAgIHRoaXMudHJpZ2dlcignY2hlY2stZm9ybS1zdWJtaXNzaW9uJywge2Zvcm06IGZvcm19KTtcclxuICAgICAgJGZvcm0gPSAkKGZvcm0pO1xyXG4gICAgICBwYXRoICA9ICRmb3JtLmF0dHIoJ2FjdGlvbicpIHx8ICcnO1xyXG4gICAgICB2ZXJiICA9IHRoaXMuX2dldEZvcm1WZXJiKCRmb3JtKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLmRlYnVnKSB7XHJcbiAgICAgICAgdGhpcy5sb2coJ19jaGVja0Zvcm1TdWJtaXNzaW9uJywgJGZvcm0sIHBhdGgsIHZlcmIpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodmVyYiA9PT0gJ2dldCcpIHtcclxuICAgICAgICBwYXJhbXMgPSB0aGlzLl9zZXJpYWxpemVGb3JtUGFyYW1zKCRmb3JtKTtcclxuICAgICAgICBpZiAocGFyYW1zICE9PSAnJykgeyBwYXRoICs9ICc/JyArIHBhcmFtczsgfVxyXG4gICAgICAgIHRoaXMuc2V0TG9jYXRpb24ocGF0aCk7XHJcbiAgICAgICAgcmV0dXJuZWQgPSBmYWxzZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBwYXJhbXMgPSAkLmV4dGVuZCh7fSwgdGhpcy5fcGFyc2VGb3JtUGFyYW1zKCRmb3JtKSk7XHJcbiAgICAgICAgcmV0dXJuZWQgPSB0aGlzLnJ1blJvdXRlKHZlcmIsIHBhdGgsIHBhcmFtcywgZm9ybS5nZXQoMCkpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiAodHlwZW9mIHJldHVybmVkID09ICd1bmRlZmluZWQnKSA/IGZhbHNlIDogcmV0dXJuZWQ7XHJcbiAgICB9LFxyXG5cclxuICAgIF9zZXJpYWxpemVGb3JtUGFyYW1zOiBmdW5jdGlvbigkZm9ybSkge1xyXG4gICAgICAgdmFyIHF1ZXJ5U3RyaW5nID0gXCJcIixcclxuICAgICAgICAgZmllbGRzID0gJGZvcm0uc2VyaWFsaXplQXJyYXkoKSxcclxuICAgICAgICAgaTtcclxuICAgICAgIGlmIChmaWVsZHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICBxdWVyeVN0cmluZyA9IHRoaXMuX2VuY29kZUZvcm1QYWlyKGZpZWxkc1swXS5uYW1lLCBmaWVsZHNbMF0udmFsdWUpO1xyXG4gICAgICAgICBmb3IgKGkgPSAxOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgcXVlcnlTdHJpbmcgPSBxdWVyeVN0cmluZyArIFwiJlwiICsgdGhpcy5fZW5jb2RlRm9ybVBhaXIoZmllbGRzW2ldLm5hbWUsIGZpZWxkc1tpXS52YWx1ZSk7XHJcbiAgICAgICAgIH1cclxuICAgICAgIH1cclxuICAgICAgIHJldHVybiBxdWVyeVN0cmluZztcclxuICAgIH0sXHJcblxyXG4gICAgX2VuY29kZUZvcm1QYWlyOiBmdW5jdGlvbihuYW1lLCB2YWx1ZSl7XHJcbiAgICAgIHJldHVybiBfZW5jb2RlKG5hbWUpICsgXCI9XCIgKyBfZW5jb2RlKHZhbHVlKTtcclxuICAgIH0sXHJcblxyXG4gICAgX3BhcnNlRm9ybVBhcmFtczogZnVuY3Rpb24oJGZvcm0pIHtcclxuICAgICAgdmFyIHBhcmFtcyA9IHt9LFxyXG4gICAgICAgICAgZm9ybV9maWVsZHMgPSAkZm9ybS5zZXJpYWxpemVBcnJheSgpLFxyXG4gICAgICAgICAgaTtcclxuICAgICAgZm9yIChpID0gMDsgaSA8IGZvcm1fZmllbGRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgcGFyYW1zID0gdGhpcy5fcGFyc2VQYXJhbVBhaXIocGFyYW1zLCBmb3JtX2ZpZWxkc1tpXS5uYW1lLCBmb3JtX2ZpZWxkc1tpXS52YWx1ZSk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHBhcmFtcztcclxuICAgIH0sXHJcblxyXG4gICAgX3BhcnNlUXVlcnlTdHJpbmc6IGZ1bmN0aW9uKHBhdGgpIHtcclxuICAgICAgdmFyIHBhcmFtcyA9IHt9LCBwYXJ0cywgcGFpcnMsIHBhaXIsIGk7XHJcblxyXG4gICAgICBwYXJ0cyA9IHBhdGgubWF0Y2goUVVFUllfU1RSSU5HX01BVENIRVIpO1xyXG4gICAgICBpZiAocGFydHMgJiYgcGFydHNbMV0pIHtcclxuICAgICAgICBwYWlycyA9IHBhcnRzWzFdLnNwbGl0KCcmJyk7XHJcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHBhaXJzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBwYWlyID0gcGFpcnNbaV0uc3BsaXQoJz0nKTtcclxuICAgICAgICAgIHBhcmFtcyA9IHRoaXMuX3BhcnNlUGFyYW1QYWlyKHBhcmFtcywgX2RlY29kZShwYWlyWzBdKSwgX2RlY29kZShwYWlyWzFdIHx8IFwiXCIpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHBhcmFtcztcclxuICAgIH0sXHJcblxyXG4gICAgX3BhcnNlUGFyYW1QYWlyOiBmdW5jdGlvbihwYXJhbXMsIGtleSwgdmFsdWUpIHtcclxuICAgICAgaWYgKHR5cGVvZiBwYXJhbXNba2V5XSAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICBpZiAoX2lzQXJyYXkocGFyYW1zW2tleV0pKSB7XHJcbiAgICAgICAgICBwYXJhbXNba2V5XS5wdXNoKHZhbHVlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcGFyYW1zW2tleV0gPSBbcGFyYW1zW2tleV0sIHZhbHVlXTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcGFyYW1zW2tleV0gPSB2YWx1ZTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gcGFyYW1zO1xyXG4gICAgfSxcclxuXHJcbiAgICBfbGlzdGVuOiBmdW5jdGlvbihuYW1lLCBjYWxsYmFjaykge1xyXG4gICAgICByZXR1cm4gdGhpcy4kZWxlbWVudCgpLmJpbmQoW25hbWUsIHRoaXMuZXZlbnROYW1lc3BhY2UoKV0uam9pbignLicpLCBjYWxsYmFjayk7XHJcbiAgICB9LFxyXG5cclxuICAgIF91bmxpc3RlbjogZnVuY3Rpb24obmFtZSwgY2FsbGJhY2spIHtcclxuICAgICAgcmV0dXJuIHRoaXMuJGVsZW1lbnQoKS51bmJpbmQoW25hbWUsIHRoaXMuZXZlbnROYW1lc3BhY2UoKV0uam9pbignLicpLCBjYWxsYmFjayk7XHJcbiAgICB9XHJcblxyXG4gIH0pO1xyXG5cclxuICAvLyBgU2FtbXkuUmVuZGVyQ29udGV4dGAgaXMgYW4gb2JqZWN0IHRoYXQgbWFrZXMgc2VxdWVudGlhbCB0ZW1wbGF0ZSBsb2FkaW5nLFxyXG4gIC8vIHJlbmRlcmluZyBhbmQgaW50ZXJwb2xhdGlvbiBzZWFtbGVzcyBldmVuIHdoZW4gZGVhbGluZyB3aXRoIGFzeW5jaHJvbm91c1xyXG4gIC8vIG9wZXJhdGlvbnMuXHJcbiAgLy9cclxuICAvLyBgUmVuZGVyQ29udGV4dGAgb2JqZWN0cyBhcmUgbm90IHVzdWFsbHkgY3JlYXRlZCBkaXJlY3RseSwgcmF0aGVyIHRoZXkgYXJlXHJcbiAgLy8gaW5zdGFudGlhdGVkIGZyb20gYW4gYFNhbW15LkV2ZW50Q29udGV4dGAgYnkgdXNpbmcgYHJlbmRlcigpYCwgYGxvYWQoKWAgb3JcclxuICAvLyBgcGFydGlhbCgpYCB3aGljaCBhbGwgcmV0dXJuIGBSZW5kZXJDb250ZXh0YCBvYmplY3RzLlxyXG4gIC8vXHJcbiAgLy8gYFJlbmRlckNvbnRleHRgIG1ldGhvZHMgYWx3YXlzIHJldHVybnMgYSBtb2RpZmllZCBgUmVuZGVyQ29udGV4dGBcclxuICAvLyBmb3IgY2hhaW5pbmcgKGxpa2UgalF1ZXJ5IGl0c2VsZikuXHJcbiAgLy9cclxuICAvLyBUaGUgY29yZSBtYWdpYyBpcyBpbiB0aGUgYHRoZW4oKWAgbWV0aG9kIHdoaWNoIHB1dHMgdGhlIGNhbGxiYWNrIHBhc3NlZCBhc1xyXG4gIC8vIGFuIGFyZ3VtZW50IGludG8gYSBxdWV1ZSB0byBiZSBleGVjdXRlZCBvbmNlIHRoZSBwcmV2aW91cyBjYWxsYmFjayBpcyBjb21wbGV0ZS5cclxuICAvLyBBbGwgdGhlIG1ldGhvZHMgb2YgYFJlbmRlckNvbnRleHRgIGFyZSB3cmFwcGVkIGluIGB0aGVuKClgIHdoaWNoIGFsbG93cyB5b3VcclxuICAvLyB0byBxdWV1ZSB1cCBtZXRob2RzIGJ5IGNoYWluaW5nLCBidXQgbWFpbnRhaW5pbmcgYSBndWFyYW50ZWVkIGV4ZWN1dGlvbiBvcmRlclxyXG4gIC8vIGV2ZW4gd2l0aCByZW1vdGUgY2FsbHMgdG8gZmV0Y2ggdGVtcGxhdGVzLlxyXG4gIC8vXHJcbiAgU2FtbXkuUmVuZGVyQ29udGV4dCA9IGZ1bmN0aW9uKGV2ZW50X2NvbnRleHQpIHtcclxuICAgIHRoaXMuZXZlbnRfY29udGV4dCAgICA9IGV2ZW50X2NvbnRleHQ7XHJcbiAgICB0aGlzLmNhbGxiYWNrcyAgICAgICAgPSBbXTtcclxuICAgIHRoaXMucHJldmlvdXNfY29udGVudCA9IG51bGw7XHJcbiAgICB0aGlzLmNvbnRlbnQgICAgICAgICAgPSBudWxsO1xyXG4gICAgdGhpcy5uZXh0X2VuZ2luZSAgICAgID0gZmFsc2U7XHJcbiAgICB0aGlzLndhaXRpbmcgICAgICAgICAgPSBmYWxzZTtcclxuICB9O1xyXG5cclxuICBTYW1teS5SZW5kZXJDb250ZXh0LnByb3RvdHlwZSA9ICQuZXh0ZW5kKHt9LCBTYW1teS5PYmplY3QucHJvdG90eXBlLCB7XHJcblxyXG4gICAgLy8gVGhlIFwiY29yZVwiIG9mIHRoZSBgUmVuZGVyQ29udGV4dGAgb2JqZWN0LCBhZGRzIHRoZSBgY2FsbGJhY2tgIHRvIHRoZVxyXG4gICAgLy8gcXVldWUuIElmIHRoZSBjb250ZXh0IGlzIGB3YWl0aW5nYCAobWVhbmluZyBhbiBhc3luYyBvcGVyYXRpb24gaXMgaGFwcGVuaW5nKVxyXG4gICAgLy8gdGhlbiB0aGUgY2FsbGJhY2sgd2lsbCBiZSBleGVjdXRlZCBpbiBvcmRlciwgb25jZSB0aGUgb3RoZXIgb3BlcmF0aW9ucyBhcmVcclxuICAgIC8vIGNvbXBsZXRlLiBJZiB0aGVyZSBpcyBubyBjdXJyZW50bHkgZXhlY3V0aW5nIG9wZXJhdGlvbiwgdGhlIGBjYWxsYmFja2BcclxuICAgIC8vIGlzIGV4ZWN1dGVkIGltbWVkaWF0ZWx5LlxyXG4gICAgLy9cclxuICAgIC8vIFRoZSB2YWx1ZSByZXR1cm5lZCBmcm9tIHRoZSBjYWxsYmFjayBpcyBzdG9yZWQgaW4gYGNvbnRlbnRgIGZvciB0aGVcclxuICAgIC8vIHN1YnNlcXVlbnQgb3BlcmF0aW9uLiBJZiB5b3UgcmV0dXJuIGBmYWxzZWAsIHRoZSBxdWV1ZSB3aWxsIHBhdXNlLCBhbmRcclxuICAgIC8vIHRoZSBuZXh0IGNhbGxiYWNrIGluIHRoZSBxdWV1ZSB3aWxsIG5vdCBiZSBleGVjdXRlZCB1bnRpbCBgbmV4dCgpYCBpc1xyXG4gICAgLy8gY2FsbGVkLiBUaGlzIGFsbG93cyBmb3IgdGhlIGd1YXJhbnRlZWQgb3JkZXIgb2YgZXhlY3V0aW9uIHdoaWxlIHdvcmtpbmdcclxuICAgIC8vIHdpdGggYXN5bmMgb3BlcmF0aW9ucy5cclxuICAgIC8vXHJcbiAgICAvLyBJZiB0aGVuKCkgaXMgcGFzc2VkIGEgc3RyaW5nIGluc3RlYWQgb2YgYSBmdW5jdGlvbiwgdGhlIHN0cmluZyBpcyBsb29rZWRcclxuICAgIC8vIHVwIGFzIGEgaGVscGVyIG1ldGhvZCBvbiB0aGUgZXZlbnQgY29udGV4dC5cclxuICAgIC8vXHJcbiAgICAvLyAjIyMgRXhhbXBsZVxyXG4gICAgLy9cclxuICAgIC8vICAgICAgdGhpcy5nZXQoJyMvJywgZnVuY3Rpb24oKSB7XHJcbiAgICAvLyAgICAgICAgLy8gaW5pdGlhbGl6ZSB0aGUgUmVuZGVyQ29udGV4dFxyXG4gICAgLy8gICAgICAgIC8vIEV2ZW4gdGhvdWdoIGBsb2FkKClgIGV4ZWN1dGVzIGFzeW5jLCB0aGUgbmV4dCBgdGhlbigpYFxyXG4gICAgLy8gICAgICAgIC8vIHdvbnQgZXhlY3V0ZSB1bnRpbCB0aGUgbG9hZCBmaW5pc2hlc1xyXG4gICAgLy8gICAgICAgIHRoaXMubG9hZCgnbXlmaWxlLnR4dCcpXHJcbiAgICAvLyAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKGNvbnRlbnQpIHtcclxuICAgIC8vICAgICAgICAgICAgICAvLyB0aGUgZmlyc3QgYXJndW1lbnQgdG8gdGhlbiBpcyB0aGUgY29udGVudCBvZiB0aGVcclxuICAgIC8vICAgICAgICAgICAgICAvLyBwcmV2IG9wZXJhdGlvblxyXG4gICAgLy8gICAgICAgICAgICAgICQoJyNtYWluJykuaHRtbChjb250ZW50KTtcclxuICAgIC8vICAgICAgICAgICAgfSk7XHJcbiAgICAvLyAgICAgIH0pO1xyXG4gICAgLy9cclxuICAgIHRoZW46IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XHJcbiAgICAgIGlmICghX2lzRnVuY3Rpb24oY2FsbGJhY2spKSB7XHJcbiAgICAgICAgLy8gaWYgYSBzdHJpbmcgaXMgcGFzc2VkIHRvIHRoZW4sIGFzc3VtZSB3ZSB3YW50IHRvIGNhbGxcclxuICAgICAgICAvLyBhIGhlbHBlciBvbiB0aGUgZXZlbnQgY29udGV4dCBpbiBpdHMgY29udGV4dFxyXG4gICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdzdHJpbmcnICYmIGNhbGxiYWNrIGluIHRoaXMuZXZlbnRfY29udGV4dCkge1xyXG4gICAgICAgICAgdmFyIGhlbHBlciA9IHRoaXMuZXZlbnRfY29udGV4dFtjYWxsYmFja107XHJcbiAgICAgICAgICBjYWxsYmFjayA9IGZ1bmN0aW9uKGNvbnRlbnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGhlbHBlci5hcHBseSh0aGlzLmV2ZW50X2NvbnRleHQsIFtjb250ZW50XSk7XHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgdmFyIGNvbnRleHQgPSB0aGlzO1xyXG4gICAgICBpZiAodGhpcy53YWl0aW5nKSB7XHJcbiAgICAgICAgdGhpcy5jYWxsYmFja3MucHVzaChjYWxsYmFjayk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy53YWl0KCk7XHJcbiAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICB2YXIgcmV0dXJuZWQgPSBjYWxsYmFjay5hcHBseShjb250ZXh0LCBbY29udGV4dC5jb250ZW50LCBjb250ZXh0LnByZXZpb3VzX2NvbnRlbnRdKTtcclxuICAgICAgICAgIGlmIChyZXR1cm5lZCAhPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgY29udGV4dC5uZXh0KHJldHVybmVkKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LCAwKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLy8gUGF1c2UgdGhlIGBSZW5kZXJDb250ZXh0YCBxdWV1ZS4gQ29tYmluZWQgd2l0aCBgbmV4dCgpYCBhbGxvd3MgZm9yIGFzeW5jXHJcbiAgICAvLyBvcGVyYXRpb25zLlxyXG4gICAgLy9cclxuICAgIC8vICMjIyBFeGFtcGxlXHJcbiAgICAvL1xyXG4gICAgLy8gICAgICAgIHRoaXMuZ2V0KCcjLycsIGZ1bmN0aW9uKCkge1xyXG4gICAgLy8gICAgICAgICAgdGhpcy5sb2FkKCdteXRleHQuanNvbicpXHJcbiAgICAvLyAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24oY29udGVudCkge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgdmFyIGNvbnRleHQgPSB0aGlzLFxyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgIGRhdGEgICAgPSBKU09OLnBhcnNlKGNvbnRlbnQpO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgLy8gcGF1c2UgZXhlY3V0aW9uXHJcbiAgICAvLyAgICAgICAgICAgICAgICBjb250ZXh0LndhaXQoKTtcclxuICAgIC8vICAgICAgICAgICAgICAgIC8vIHBvc3QgdG8gYSB1cmxcclxuICAgIC8vICAgICAgICAgICAgICAgICQucG9zdChkYXRhLnVybCwge30sIGZ1bmN0aW9uKHJlc3BvbnNlKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgIGNvbnRleHQubmV4dChKU09OLnBhcnNlKHJlc3BvbnNlKSk7XHJcbiAgICAvLyAgICAgICAgICAgICAgICB9KTtcclxuICAgIC8vICAgICAgICAgICAgICB9KVxyXG4gICAgLy8gICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKGRhdGEpIHtcclxuICAgIC8vICAgICAgICAgICAgICAgIC8vIGRhdGEgaXMganNvbiBmcm9tIHRoZSBwcmV2aW91cyBwb3N0XHJcbiAgICAvLyAgICAgICAgICAgICAgICAkKCcjbWVzc2FnZScpLnRleHQoZGF0YS5zdGF0dXMpO1xyXG4gICAgLy8gICAgICAgICAgICAgIH0pO1xyXG4gICAgLy8gICAgICAgIH0pO1xyXG4gICAgd2FpdDogZnVuY3Rpb24oKSB7XHJcbiAgICAgIHRoaXMud2FpdGluZyA9IHRydWU7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIFJlc3VtZSB0aGUgcXVldWUsIHNldHRpbmcgYGNvbnRlbnRgIHRvIGJlIHVzZWQgaW4gdGhlIG5leHQgb3BlcmF0aW9uLlxyXG4gICAgLy8gU2VlIGB3YWl0KClgIGZvciBhbiBleGFtcGxlLlxyXG4gICAgbmV4dDogZnVuY3Rpb24oY29udGVudCkge1xyXG4gICAgICB0aGlzLndhaXRpbmcgPSBmYWxzZTtcclxuICAgICAgaWYgKHR5cGVvZiBjb250ZW50ICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIHRoaXMucHJldmlvdXNfY29udGVudCA9IHRoaXMuY29udGVudDtcclxuICAgICAgICB0aGlzLmNvbnRlbnQgPSBjb250ZW50O1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLmNhbGxiYWNrcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgdGhpcy50aGVuKHRoaXMuY2FsbGJhY2tzLnNoaWZ0KCkpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIExvYWQgYSB0ZW1wbGF0ZSBpbnRvIHRoZSBjb250ZXh0LlxyXG4gICAgLy8gVGhlIGBsb2NhdGlvbmAgY2FuIGVpdGhlciBiZSBhIHN0cmluZyBzcGVjaWZ5aW5nIHRoZSByZW1vdGUgcGF0aCB0byB0aGVcclxuICAgIC8vIGZpbGUsIGEgalF1ZXJ5IG9iamVjdCwgb3IgYSBET00gZWxlbWVudC5cclxuICAgIC8vXHJcbiAgICAvLyBObyBpbnRlcnBvbGF0aW9uIGhhcHBlbnMgYnkgZGVmYXVsdCwgdGhlIGNvbnRlbnQgaXMgc3RvcmVkIGluXHJcbiAgICAvLyBgY29udGVudGAuXHJcbiAgICAvL1xyXG4gICAgLy8gSW4gdGhlIGNhc2Ugb2YgYSBwYXRoLCB1bmxlc3MgdGhlIG9wdGlvbiBge2NhY2hlOiBmYWxzZX1gIGlzIHBhc3NlZCB0aGVcclxuICAgIC8vIGRhdGEgaXMgc3RvcmVkIGluIHRoZSBhcHAncyBgdGVtcGxhdGVDYWNoZSgpYC5cclxuICAgIC8vXHJcbiAgICAvLyBJZiBhIGpRdWVyeSBvciBET00gb2JqZWN0IGlzIHBhc3NlZCB0aGUgYGlubmVySFRNTGAgb2YgdGhlIG5vZGUgaXMgcHVsbGVkIGluLlxyXG4gICAgLy8gVGhpcyBpcyB1c2VmdWwgZm9yIG5lc3RpbmcgdGVtcGxhdGVzIGFzIHBhcnQgb2YgdGhlIGluaXRpYWwgcGFnZSBsb2FkIHdyYXBwZWRcclxuICAgIC8vIGluIGludmlzaWJsZSBlbGVtZW50cyBvciBgPHNjcmlwdD5gIHRhZ3MuIFdpdGggdGVtcGxhdGUgcGF0aHMsIHRoZSB0ZW1wbGF0ZVxyXG4gICAgLy8gZW5naW5lIGlzIGxvb2tlZCB1cCBieSB0aGUgZXh0ZW5zaW9uLiBGb3IgRE9NL2pRdWVyeSBlbWJlZGRlZCB0ZW1wbGF0ZXMsXHJcbiAgICAvLyB0aGlzIGlzbnQgcG9zc2libGUsIHNvIHRoZXJlIGFyZSBhIGNvdXBsZSBvZiBvcHRpb25zOlxyXG4gICAgLy9cclxuICAgIC8vICAqIHBhc3MgYW4gYHtlbmdpbmU6fWAgb3B0aW9uLlxyXG4gICAgLy8gICogZGVmaW5lIHRoZSBlbmdpbmUgaW4gdGhlIGBkYXRhLWVuZ2luZWAgYXR0cmlidXRlIG9mIHRoZSBwYXNzZWQgbm9kZS5cclxuICAgIC8vICAqIGp1c3Qgc3RvcmUgdGhlIHJhdyB0ZW1wbGF0ZSBkYXRhIGFuZCB1c2UgYGludGVycG9sYXRlKClgIG1hbnVhbGx5XHJcbiAgICAvL1xyXG4gICAgLy8gSWYgYSBgY2FsbGJhY2tgIGlzIHBhc3NlZCBpdCBpcyBleGVjdXRlZCBhZnRlciB0aGUgdGVtcGxhdGUgbG9hZC5cclxuICAgIGxvYWQ6IGZ1bmN0aW9uKGxvY2F0aW9uLCBvcHRpb25zLCBjYWxsYmFjaykge1xyXG4gICAgICB2YXIgY29udGV4dCA9IHRoaXM7XHJcbiAgICAgIHJldHVybiB0aGlzLnRoZW4oZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgdmFyIHNob3VsZF9jYWNoZSwgY2FjaGVkLCBpc19qc29uLCBsb2NhdGlvbl9hcnJheTtcclxuICAgICAgICBpZiAoX2lzRnVuY3Rpb24ob3B0aW9ucykpIHtcclxuICAgICAgICAgIGNhbGxiYWNrID0gb3B0aW9ucztcclxuICAgICAgICAgIG9wdGlvbnMgPSB7fTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgb3B0aW9ucyA9ICQuZXh0ZW5kKHt9LCBvcHRpb25zKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNhbGxiYWNrKSB7IHRoaXMudGhlbihjYWxsYmFjayk7IH1cclxuICAgICAgICBpZiAodHlwZW9mIGxvY2F0aW9uID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgLy8gaXQncyBhIHBhdGhcclxuICAgICAgICAgIGlzX2pzb24gICAgICA9IChsb2NhdGlvbi5tYXRjaCgvXFwuanNvbihcXD98JCkvKSB8fCBvcHRpb25zLmpzb24pO1xyXG4gICAgICAgICAgc2hvdWxkX2NhY2hlID0gaXNfanNvbiA/IG9wdGlvbnMuY2FjaGUgPT09IHRydWUgOiBvcHRpb25zLmNhY2hlICE9PSBmYWxzZTtcclxuICAgICAgICAgIGNvbnRleHQubmV4dF9lbmdpbmUgPSBjb250ZXh0LmV2ZW50X2NvbnRleHQuZW5naW5lRm9yKGxvY2F0aW9uKTtcclxuICAgICAgICAgIGRlbGV0ZSBvcHRpb25zLmNhY2hlO1xyXG4gICAgICAgICAgZGVsZXRlIG9wdGlvbnMuanNvbjtcclxuICAgICAgICAgIGlmIChvcHRpb25zLmVuZ2luZSkge1xyXG4gICAgICAgICAgICBjb250ZXh0Lm5leHRfZW5naW5lID0gb3B0aW9ucy5lbmdpbmU7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBvcHRpb25zLmVuZ2luZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChzaG91bGRfY2FjaGUgJiYgKGNhY2hlZCA9IHRoaXMuZXZlbnRfY29udGV4dC5hcHAudGVtcGxhdGVDYWNoZShsb2NhdGlvbikpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWQ7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLndhaXQoKTtcclxuICAgICAgICAgICQuYWpheCgkLmV4dGVuZCh7XHJcbiAgICAgICAgICAgIHVybDogbG9jYXRpb24sXHJcbiAgICAgICAgICAgIGRhdGE6IHt9LFxyXG4gICAgICAgICAgICBkYXRhVHlwZTogaXNfanNvbiA/ICdqc29uJyA6ICd0ZXh0JyxcclxuICAgICAgICAgICAgdHlwZTogJ2dldCcsXHJcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKGRhdGEpIHtcclxuICAgICAgICAgICAgICBpZiAoc2hvdWxkX2NhY2hlKSB7XHJcbiAgICAgICAgICAgICAgICBjb250ZXh0LmV2ZW50X2NvbnRleHQuYXBwLnRlbXBsYXRlQ2FjaGUobG9jYXRpb24sIGRhdGEpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBjb250ZXh0Lm5leHQoZGF0YSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0sIG9wdGlvbnMpKTtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLy8gaXQncyBhIGRvbS9qUXVlcnlcclxuICAgICAgICAgIGlmIChsb2NhdGlvbi5ub2RlVHlwZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbG9jYXRpb24uaW5uZXJIVE1MO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKGxvY2F0aW9uLnNlbGVjdG9yKSB7XHJcbiAgICAgICAgICAgIC8vIGl0J3MgYSBqUXVlcnlcclxuICAgICAgICAgICAgY29udGV4dC5uZXh0X2VuZ2luZSA9IGxvY2F0aW9uLmF0dHIoJ2RhdGEtZW5naW5lJyk7XHJcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmNsb25lID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgIHJldHVybiBsb2NhdGlvbi5yZW1vdmUoKVswXS5pbm5lckhUTUwudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICByZXR1cm4gbG9jYXRpb25bMF0uaW5uZXJIVE1MLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBMb2FkIHBhcnRpYWxzXHJcbiAgICAvL1xyXG4gICAgLy8gIyMjIEV4YW1wbGVcclxuICAgIC8vXHJcbiAgICAvLyAgICAgIHRoaXMubG9hZFBhcnRpYWxzKHtteXBhcnRpYWw6ICcvcGF0aC90by9wYXJ0aWFsJ30pO1xyXG4gICAgLy9cclxuICAgIGxvYWRQYXJ0aWFsczogZnVuY3Rpb24ocGFydGlhbHMpIHtcclxuICAgICAgdmFyIG5hbWU7XHJcbiAgICAgIGlmKHBhcnRpYWxzKSB7XHJcbiAgICAgICAgdGhpcy5wYXJ0aWFscyA9IHRoaXMucGFydGlhbHMgfHwge307XHJcbiAgICAgICAgZm9yKG5hbWUgaW4gcGFydGlhbHMpIHtcclxuICAgICAgICAgIChmdW5jdGlvbihjb250ZXh0LCBuYW1lKSB7XHJcbiAgICAgICAgICAgIGNvbnRleHQubG9hZChwYXJ0aWFsc1tuYW1lXSlcclxuICAgICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKHRlbXBsYXRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFydGlhbHNbbmFtZV0gPSB0ZW1wbGF0ZTtcclxuICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfSkodGhpcywgbmFtZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBgbG9hZCgpYCBhIHRlbXBsYXRlIGFuZCB0aGVuIGBpbnRlcnBvbGF0ZSgpYCBpdCB3aXRoIGRhdGEuXHJcbiAgICAvL1xyXG4gICAgLy8gY2FuIGJlIGNhbGxlZCB3aXRoIG11bHRpcGxlIGRpZmZlcmVudCBzaWduYXR1cmVzOlxyXG4gICAgLy9cclxuICAgIC8vICAgICAgdGhpcy5yZW5kZXIoY2FsbGJhY2spO1xyXG4gICAgLy8gICAgICB0aGlzLnJlbmRlcignL2xvY2F0aW9uJyk7XHJcbiAgICAvLyAgICAgIHRoaXMucmVuZGVyKCcvbG9jYXRpb24nLCB7c29tZTogZGF0YX0pO1xyXG4gICAgLy8gICAgICB0aGlzLnJlbmRlcignL2xvY2F0aW9uJywgY2FsbGJhY2spO1xyXG4gICAgLy8gICAgICB0aGlzLnJlbmRlcignL2xvY2F0aW9uJywge3NvbWU6IGRhdGF9LCBjYWxsYmFjayk7XHJcbiAgICAvLyAgICAgIHRoaXMucmVuZGVyKCcvbG9jYXRpb24nLCB7c29tZTogZGF0YX0sIHtteTogcGFydGlhbHN9KTtcclxuICAgIC8vICAgICAgdGhpcy5yZW5kZXIoJy9sb2NhdGlvbicsIGNhbGxiYWNrLCB7bXk6IHBhcnRpYWxzfSk7XHJcbiAgICAvLyAgICAgIHRoaXMucmVuZGVyKCcvbG9jYXRpb24nLCB7c29tZTogZGF0YX0sIGNhbGxiYWNrLCB7bXk6IHBhcnRpYWxzfSk7XHJcbiAgICAvL1xyXG4gICAgLy8gIyMjIEV4YW1wbGVcclxuICAgIC8vXHJcbiAgICAvLyAgICAgIHRoaXMuZ2V0KCcjLycsIGZ1bmN0aW9uKCkge1xyXG4gICAgLy8gICAgICAgIHRoaXMucmVuZGVyKCdteXRlbXBsYXRlLnRlbXBsYXRlJywge25hbWU6ICd0ZXN0J30pO1xyXG4gICAgLy8gICAgICB9KTtcclxuICAgIC8vXHJcbiAgICByZW5kZXI6IGZ1bmN0aW9uKGxvY2F0aW9uLCBkYXRhLCBjYWxsYmFjaywgcGFydGlhbHMpIHtcclxuICAgICAgaWYgKF9pc0Z1bmN0aW9uKGxvY2F0aW9uKSAmJiAhZGF0YSkge1xyXG4gICAgICAgIC8vIGludm9rZWQgYXMgcmVuZGVyKGNhbGxiYWNrKVxyXG4gICAgICAgIHJldHVybiB0aGlzLnRoZW4obG9jYXRpb24pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmKF9pc0Z1bmN0aW9uKGRhdGEpKSB7XHJcbiAgICAgICAgICAvLyBpbnZva2VkIGFzIHJlbmRlcihsb2NhdGlvbiwgY2FsbGJhY2ssIFtwYXJ0aWFsc10pXHJcbiAgICAgICAgICBwYXJ0aWFscyA9IGNhbGxiYWNrO1xyXG4gICAgICAgICAgY2FsbGJhY2sgPSBkYXRhO1xyXG4gICAgICAgICAgZGF0YSA9IG51bGw7XHJcbiAgICAgICAgfSBlbHNlIGlmKGNhbGxiYWNrICYmICFfaXNGdW5jdGlvbihjYWxsYmFjaykpIHtcclxuICAgICAgICAgIC8vIGludm9rZWQgYXMgcmVuZGVyKGxvY2F0aW9uLCBkYXRhLCBwYXJ0aWFscylcclxuICAgICAgICAgIHBhcnRpYWxzID0gY2FsbGJhY2s7XHJcbiAgICAgICAgICBjYWxsYmFjayA9IG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5sb2FkUGFydGlhbHMocGFydGlhbHMpXHJcbiAgICAgICAgICAgICAgICAgICAubG9hZChsb2NhdGlvbilcclxuICAgICAgICAgICAgICAgICAgIC5pbnRlcnBvbGF0ZShkYXRhLCBsb2NhdGlvbilcclxuICAgICAgICAgICAgICAgICAgIC50aGVuKGNhbGxiYWNrKTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvLyBgcmVuZGVyKClgIHRoZSBgbG9jYXRpb25gIHdpdGggYGRhdGFgIGFuZCB0aGVuIGBzd2FwKClgIHRoZVxyXG4gICAgLy8gYXBwJ3MgYCRlbGVtZW50YCB3aXRoIHRoZSByZW5kZXJlZCBjb250ZW50LlxyXG4gICAgcGFydGlhbDogZnVuY3Rpb24obG9jYXRpb24sIGRhdGEsIGNhbGxiYWNrLCBwYXJ0aWFscykge1xyXG4gICAgICBpZiAoX2lzRnVuY3Rpb24oY2FsbGJhY2spKSB7XHJcbiAgICAgICAgLy8gaW52b2tlZCBhcyBwYXJ0aWFsKGxvY2F0aW9uLCBkYXRhLCBjYWxsYmFjaywgW3BhcnRpYWxzXSlcclxuICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXIobG9jYXRpb24sIGRhdGEsIHBhcnRpYWxzKS5zd2FwKGNhbGxiYWNrKTtcclxuICAgICAgfSBlbHNlIGlmIChfaXNGdW5jdGlvbihkYXRhKSkge1xyXG4gICAgICAgIC8vIGludm9rZWQgYXMgcGFydGlhbChsb2NhdGlvbiwgY2FsbGJhY2ssIFtwYXJ0aWFsc10pXHJcbiAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyKGxvY2F0aW9uLCB7fSwgY2FsbGJhY2spLnN3YXAoZGF0YSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gaW52b2tlZCBhcyBwYXJ0aWFsKGxvY2F0aW9uLCBkYXRhLCBbcGFydGlhbHNdKVxyXG4gICAgICAgIHJldHVybiB0aGlzLnJlbmRlcihsb2NhdGlvbiwgZGF0YSwgY2FsbGJhY2spLnN3YXAoKTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvLyBkZWZlcnMgdGhlIGNhbGwgb2YgZnVuY3Rpb24gdG8gb2NjdXIgaW4gb3JkZXIgb2YgdGhlIHJlbmRlciBxdWV1ZS5cclxuICAgIC8vIFRoZSBmdW5jdGlvbiBjYW4gYWNjZXB0IGFueSBudW1iZXIgb2YgYXJndW1lbnRzIGFzIGxvbmcgYXMgdGhlIGxhc3RcclxuICAgIC8vIGFyZ3VtZW50IGlzIGEgY2FsbGJhY2sgZnVuY3Rpb24uIFRoaXMgaXMgdXNlZnVsIGZvciBwdXR0aW5nIGFyYml0cmFyeVxyXG4gICAgLy8gYXN5bmNocm9ub3VzIGZ1bmN0aW9ucyBpbnRvIHRoZSBxdWV1ZS4gVGhlIGNvbnRlbnQgcGFzc2VkIHRvIHRoZVxyXG4gICAgLy8gY2FsbGJhY2sgaXMgcGFzc2VkIGFzIGBjb250ZW50YCB0byB0aGUgbmV4dCBpdGVtIGluIHRoZSBxdWV1ZS5cclxuICAgIC8vXHJcbiAgICAvLyAjIyMgRXhhbXBsZVxyXG4gICAgLy9cclxuICAgIC8vICAgICB0aGlzLnNlbmQoJC5nZXRKU09OLCAnL2FwcC5qc29uJylcclxuICAgIC8vICAgICAgICAgLnRoZW4oZnVuY3Rpb24oanNvbikge1xyXG4gICAgLy8gICAgICAgICAgICQoJyNtZXNzYWdlKS50ZXh0KGpzb25bJ21lc3NhZ2UnXSk7XHJcbiAgICAvLyAgICAgICAgICB9KTtcclxuICAgIC8vXHJcbiAgICAvL1xyXG4gICAgc2VuZDogZnVuY3Rpb24oKSB7XHJcbiAgICAgIHZhciBjb250ZXh0ID0gdGhpcyxcclxuICAgICAgICAgIGFyZ3MgPSBfbWFrZUFycmF5KGFyZ3VtZW50cyksXHJcbiAgICAgICAgICBmdW4gID0gYXJncy5zaGlmdCgpO1xyXG5cclxuICAgICAgaWYgKF9pc0FycmF5KGFyZ3NbMF0pKSB7IGFyZ3MgPSBhcmdzWzBdOyB9XHJcblxyXG4gICAgICByZXR1cm4gdGhpcy50aGVuKGZ1bmN0aW9uKGNvbnRlbnQpIHtcclxuICAgICAgICBhcmdzLnB1c2goZnVuY3Rpb24ocmVzcG9uc2UpIHsgY29udGV4dC5uZXh0KHJlc3BvbnNlKTsgfSk7XHJcbiAgICAgICAgY29udGV4dC53YWl0KCk7XHJcbiAgICAgICAgZnVuLmFwcGx5KGZ1biwgYXJncyk7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9KTtcclxuICAgIH0sXHJcblxyXG4gICAgLy8gaXRlcmF0ZXMgb3ZlciBhbiBhcnJheSwgYXBwbHlpbmcgdGhlIGNhbGxiYWNrIGZvciBlYWNoIGl0ZW0gaXRlbS4gdGhlXHJcbiAgICAvLyBjYWxsYmFjayB0YWtlcyB0aGUgc2FtZSBzdHlsZSBvZiBhcmd1bWVudHMgYXMgYGpRdWVyeS5lYWNoKClgIChpbmRleCwgaXRlbSkuXHJcbiAgICAvLyBUaGUgcmV0dXJuIHZhbHVlIG9mIGVhY2ggY2FsbGJhY2sgaXMgY29sbGVjdGVkIGFzIGEgc2luZ2xlIHN0cmluZyBhbmQgc3RvcmVkXHJcbiAgICAvLyBhcyBgY29udGVudGAgdG8gYmUgdXNlZCBpbiB0aGUgbmV4dCBpdGVyYXRpb24gb2YgdGhlIGBSZW5kZXJDb250ZXh0YC5cclxuICAgIGNvbGxlY3Q6IGZ1bmN0aW9uKGFycmF5LCBjYWxsYmFjaywgbm93KSB7XHJcbiAgICAgIHZhciBjb250ZXh0ID0gdGhpcztcclxuICAgICAgdmFyIGNvbGwgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICBpZiAoX2lzRnVuY3Rpb24oYXJyYXkpKSB7XHJcbiAgICAgICAgICBjYWxsYmFjayA9IGFycmF5O1xyXG4gICAgICAgICAgYXJyYXkgPSB0aGlzLmNvbnRlbnQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBjb250ZW50cyA9IFtdLCBkb21zID0gZmFsc2U7XHJcbiAgICAgICAgJC5lYWNoKGFycmF5LCBmdW5jdGlvbihpLCBpdGVtKSB7XHJcbiAgICAgICAgICB2YXIgcmV0dXJuZWQgPSBjYWxsYmFjay5hcHBseShjb250ZXh0LCBbaSwgaXRlbV0pO1xyXG4gICAgICAgICAgaWYgKHJldHVybmVkLmpxdWVyeSAmJiByZXR1cm5lZC5sZW5ndGggPT0gMSkge1xyXG4gICAgICAgICAgICByZXR1cm5lZCA9IHJldHVybmVkWzBdO1xyXG4gICAgICAgICAgICBkb21zID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGNvbnRlbnRzLnB1c2gocmV0dXJuZWQpO1xyXG4gICAgICAgICAgcmV0dXJuIHJldHVybmVkO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiBkb21zID8gY29udGVudHMgOiBjb250ZW50cy5qb2luKCcnKTtcclxuICAgICAgfTtcclxuICAgICAgcmV0dXJuIG5vdyA/IGNvbGwoKSA6IHRoaXMudGhlbihjb2xsKTtcclxuICAgIH0sXHJcblxyXG4gICAgLy8gbG9hZHMgYSB0ZW1wbGF0ZSwgYW5kIHRoZW4gaW50ZXJwb2xhdGVzIGl0IGZvciBlYWNoIGl0ZW0gaW4gdGhlIGBkYXRhYFxyXG4gICAgLy8gYXJyYXkuIElmIGEgY2FsbGJhY2sgaXMgcGFzc2VkLCBpdCB3aWxsIGNhbGwgdGhlIGNhbGxiYWNrIHdpdGggZWFjaFxyXG4gICAgLy8gaXRlbSBpbiB0aGUgYXJyYXkgX2FmdGVyXyBpbnRlcnBvbGF0aW9uXHJcbiAgICByZW5kZXJFYWNoOiBmdW5jdGlvbihsb2NhdGlvbiwgbmFtZSwgZGF0YSwgY2FsbGJhY2spIHtcclxuICAgICAgaWYgKF9pc0FycmF5KG5hbWUpKSB7XHJcbiAgICAgICAgY2FsbGJhY2sgPSBkYXRhO1xyXG4gICAgICAgIGRhdGEgPSBuYW1lO1xyXG4gICAgICAgIG5hbWUgPSBudWxsO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB0aGlzLmxvYWQobG9jYXRpb24pLnRoZW4oZnVuY3Rpb24oY29udGVudCkge1xyXG4gICAgICAgICAgdmFyIHJjdHggPSB0aGlzO1xyXG4gICAgICAgICAgaWYgKCFkYXRhKSB7XHJcbiAgICAgICAgICAgIGRhdGEgPSBfaXNBcnJheSh0aGlzLnByZXZpb3VzX2NvbnRlbnQpID8gdGhpcy5wcmV2aW91c19jb250ZW50IDogW107XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoY2FsbGJhY2spIHtcclxuICAgICAgICAgICAgJC5lYWNoKGRhdGEsIGZ1bmN0aW9uKGksIHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgdmFyIGlkYXRhID0ge30sIGVuZ2luZSA9IHRoaXMubmV4dF9lbmdpbmUgfHwgbG9jYXRpb247XHJcbiAgICAgICAgICAgICAgaWYgKG5hbWUpIHtcclxuICAgICAgICAgICAgICAgIGlkYXRhW25hbWVdID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlkYXRhID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGNhbGxiYWNrKHZhbHVlLCByY3R4LmV2ZW50X2NvbnRleHQuaW50ZXJwb2xhdGUoY29udGVudCwgaWRhdGEsIGVuZ2luZSkpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbGxlY3QoZGF0YSwgZnVuY3Rpb24oaSwgdmFsdWUpIHtcclxuICAgICAgICAgICAgICB2YXIgaWRhdGEgPSB7fSwgZW5naW5lID0gdGhpcy5uZXh0X2VuZ2luZSB8fCBsb2NhdGlvbjtcclxuICAgICAgICAgICAgICBpZiAobmFtZSkge1xyXG4gICAgICAgICAgICAgICAgaWRhdGFbbmFtZV0gPSB2YWx1ZTtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWRhdGEgPSB2YWx1ZTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXZlbnRfY29udGV4dC5pbnRlcnBvbGF0ZShjb250ZW50LCBpZGF0YSwgZW5naW5lKTtcclxuICAgICAgICAgICAgfSwgdHJ1ZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyB1c2VzIHRoZSBwcmV2aW91cyBsb2FkZWQgYGNvbnRlbnRgIGFuZCB0aGUgYGRhdGFgIG9iamVjdCB0byBpbnRlcnBvbGF0ZVxyXG4gICAgLy8gYSB0ZW1wbGF0ZS4gYGVuZ2luZWAgZGVmaW5lcyB0aGUgdGVtcGxhdGluZy9pbnRlcnBvbGF0aW9uIG1ldGhvZC9lbmdpbmVcclxuICAgIC8vIHRoYXQgc2hvdWxkIGJlIHVzZWQuIElmIGBlbmdpbmVgIGlzIG5vdCBwYXNzZWQsIHRoZSBgbmV4dF9lbmdpbmVgIGlzXHJcbiAgICAvLyB1c2VkLiBJZiBgcmV0YWluYCBpcyBgdHJ1ZWAsIHRoZSBmaW5hbCBpbnRlcnBvbGF0ZWQgZGF0YSBpcyBhcHBlbmRlZCB0b1xyXG4gICAgLy8gdGhlIGBwcmV2aW91c19jb250ZW50YCBpbnN0ZWFkIG9mIGp1c3QgcmVwbGFjaW5nIGl0LlxyXG4gICAgaW50ZXJwb2xhdGU6IGZ1bmN0aW9uKGRhdGEsIGVuZ2luZSwgcmV0YWluKSB7XHJcbiAgICAgIHZhciBjb250ZXh0ID0gdGhpcztcclxuICAgICAgcmV0dXJuIHRoaXMudGhlbihmdW5jdGlvbihjb250ZW50LCBwcmV2KSB7XHJcbiAgICAgICAgaWYgKCFkYXRhICYmIHByZXYpIHsgZGF0YSA9IHByZXY7IH1cclxuICAgICAgICBpZiAodGhpcy5uZXh0X2VuZ2luZSkge1xyXG4gICAgICAgICAgZW5naW5lID0gdGhpcy5uZXh0X2VuZ2luZTtcclxuICAgICAgICAgIHRoaXMubmV4dF9lbmdpbmUgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIHJlbmRlcmVkID0gY29udGV4dC5ldmVudF9jb250ZXh0LmludGVycG9sYXRlKGNvbnRlbnQsIGRhdGEsIGVuZ2luZSwgdGhpcy5wYXJ0aWFscyk7XHJcbiAgICAgICAgcmV0dXJuIHJldGFpbiA/IHByZXYgKyByZW5kZXJlZCA6IHJlbmRlcmVkO1xyXG4gICAgICB9KTtcclxuICAgIH0sXHJcblxyXG4gICAgLy8gU3dhcCB0aGUgcmV0dXJuIGNvbnRlbnRzIGVuc3VyaW5nIG9yZGVyLiBTZWUgYEFwcGxpY2F0aW9uI3N3YXBgXHJcbiAgICBzd2FwOiBmdW5jdGlvbihjYWxsYmFjaykge1xyXG4gICAgICByZXR1cm4gdGhpcy50aGVuKGZ1bmN0aW9uKGNvbnRlbnQpIHtcclxuICAgICAgICB0aGlzLmV2ZW50X2NvbnRleHQuc3dhcChjb250ZW50LCBjYWxsYmFjayk7XHJcbiAgICAgICAgcmV0dXJuIGNvbnRlbnQ7XHJcbiAgICAgIH0pLnRyaWdnZXIoJ2NoYW5nZWQnLCB7fSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIFNhbWUgdXNhZ2UgYXMgYGpRdWVyeS5mbi5hcHBlbmRUbygpYCBidXQgdXNlcyBgdGhlbigpYCB0byBlbnN1cmUgb3JkZXJcclxuICAgIGFwcGVuZFRvOiBmdW5jdGlvbihzZWxlY3Rvcikge1xyXG4gICAgICByZXR1cm4gdGhpcy50aGVuKGZ1bmN0aW9uKGNvbnRlbnQpIHtcclxuICAgICAgICAkKHNlbGVjdG9yKS5hcHBlbmQoY29udGVudCk7XHJcbiAgICAgIH0pLnRyaWdnZXIoJ2NoYW5nZWQnLCB7fSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIFNhbWUgdXNhZ2UgYXMgYGpRdWVyeS5mbi5wcmVwZW5kVG8oKWAgYnV0IHVzZXMgYHRoZW4oKWAgdG8gZW5zdXJlIG9yZGVyXHJcbiAgICBwcmVwZW5kVG86IGZ1bmN0aW9uKHNlbGVjdG9yKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnRoZW4oZnVuY3Rpb24oY29udGVudCkge1xyXG4gICAgICAgICQoc2VsZWN0b3IpLnByZXBlbmQoY29udGVudCk7XHJcbiAgICAgIH0pLnRyaWdnZXIoJ2NoYW5nZWQnLCB7fSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIFJlcGxhY2VzIHRoZSBgJChzZWxlY3RvcilgIHVzaW5nIGBodG1sKClgIHdpdGggdGhlIHByZXZpb3VzbHkgbG9hZGVkXHJcbiAgICAvLyBgY29udGVudGBcclxuICAgIHJlcGxhY2U6IGZ1bmN0aW9uKHNlbGVjdG9yKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnRoZW4oZnVuY3Rpb24oY29udGVudCkge1xyXG4gICAgICAgICQoc2VsZWN0b3IpLmh0bWwoY29udGVudCk7XHJcbiAgICAgIH0pLnRyaWdnZXIoJ2NoYW5nZWQnLCB7fSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIHRyaWdnZXIgdGhlIGV2ZW50IGluIHRoZSBvcmRlciBvZiB0aGUgZXZlbnQgY29udGV4dC4gU2FtZSBzZW1hbnRpY3NcclxuICAgIC8vIGFzIGBTYW1teS5FdmVudENvbnRleHQjdHJpZ2dlcigpYC4gSWYgZGF0YSBpcyBvbWl0dGVkLCBgY29udGVudGBcclxuICAgIC8vIGlzIHNlbnQgYXMgYHtjb250ZW50OiBjb250ZW50fWBcclxuICAgIHRyaWdnZXI6IGZ1bmN0aW9uKG5hbWUsIGRhdGEpIHtcclxuICAgICAgcmV0dXJuIHRoaXMudGhlbihmdW5jdGlvbihjb250ZW50KSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBkYXRhID09ICd1bmRlZmluZWQnKSB7IGRhdGEgPSB7Y29udGVudDogY29udGVudH07IH1cclxuICAgICAgICB0aGlzLmV2ZW50X2NvbnRleHQudHJpZ2dlcihuYW1lLCBkYXRhKTtcclxuICAgICAgICByZXR1cm4gY29udGVudDtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gIH0pO1xyXG5cclxuICAvLyBgU2FtbXkuRXZlbnRDb250ZXh0YCBvYmplY3RzIGFyZSBjcmVhdGVkIGV2ZXJ5IHRpbWUgYSByb3V0ZSBpcyBydW4gb3IgYVxyXG4gIC8vIGJvdW5kIGV2ZW50IGlzIHRyaWdnZXJlZC4gVGhlIGNhbGxiYWNrcyBmb3IgdGhlc2UgZXZlbnRzIGFyZSBldmFsdWF0ZWQgd2l0aGluIGEgYFNhbW15LkV2ZW50Q29udGV4dGBcclxuICAvLyBUaGlzIHdpdGhpbiB0aGVzZSBjYWxsYmFja3MgdGhlIHNwZWNpYWwgbWV0aG9kcyBvZiBgRXZlbnRDb250ZXh0YCBhcmUgYXZhaWxhYmxlLlxyXG4gIC8vXHJcbiAgLy8gIyMjIEV4YW1wbGVcclxuICAvL1xyXG4gIC8vICAgICAgICQuc2FtbXkoZnVuY3Rpb24oKSB7XHJcbiAgLy8gICAgICAgICAvLyBUaGUgY29udGV4dCBoZXJlIGlzIHRoaXMgU2FtbXkuQXBwbGljYXRpb25cclxuICAvLyAgICAgICAgIHRoaXMuZ2V0KCcjLzpuYW1lJywgZnVuY3Rpb24oKSB7XHJcbiAgLy8gICAgICAgICAgIC8vIFRoZSBjb250ZXh0IGhlcmUgaXMgYSBuZXcgU2FtbXkuRXZlbnRDb250ZXh0XHJcbiAgLy8gICAgICAgICAgIGlmICh0aGlzLnBhcmFtc1snbmFtZSddID09ICdzYW1teScpIHtcclxuICAvLyAgICAgICAgICAgICB0aGlzLnBhcnRpYWwoJ25hbWUuaHRtbC5lcmInLCB7bmFtZTogJ1NhbW15J30pO1xyXG4gIC8vICAgICAgICAgICB9IGVsc2Uge1xyXG4gIC8vICAgICAgICAgICAgIHRoaXMucmVkaXJlY3QoJyMvc29tZXdoZXJlLWVsc2UnKVxyXG4gIC8vICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICB9KTtcclxuICAvLyAgICAgICB9KTtcclxuICAvL1xyXG4gIC8vIEluaXRpYWxpemUgYSBuZXcgRXZlbnRDb250ZXh0XHJcbiAgLy9cclxuICAvLyAjIyMgQXJndW1lbnRzXHJcbiAgLy9cclxuICAvLyAqIGBhcHBgIFRoZSBgU2FtbXkuQXBwbGljYXRpb25gIHRoaXMgZXZlbnQgaXMgY2FsbGVkIHdpdGhpbi5cclxuICAvLyAqIGB2ZXJiYCBUaGUgdmVyYiBpbnZva2VkIHRvIHJ1biB0aGlzIGNvbnRleHQvcm91dGUuXHJcbiAgLy8gKiBgcGF0aGAgVGhlIHN0cmluZyBwYXRoIGludm9rZWQgdG8gcnVuIHRoaXMgY29udGV4dC9yb3V0ZS5cclxuICAvLyAqIGBwYXJhbXNgIEFuIE9iamVjdCBvZiBvcHRpb25hbCBwYXJhbXMgdG8gcGFzcyB0byB0aGUgY29udGV4dC4gSXMgY29udmVydGVkXHJcbiAgLy8gICB0byBhIGBTYW1teS5PYmplY3RgLlxyXG4gIC8vICogYHRhcmdldGAgYSBET00gZWxlbWVudCB0aGF0IHRoZSBldmVudCB0aGF0IGhvbGRzIHRoaXMgY29udGV4dCBvcmlnaW5hdGVzXHJcbiAgLy8gICBmcm9tLiBGb3IgcG9zdCwgcHV0IGFuZCBkZWwgcm91dGVzLCB0aGlzIGlzIHRoZSBmb3JtIGVsZW1lbnQgdGhhdCB0cmlnZ2VyZWRcclxuICAvLyAgIHRoZSByb3V0ZS5cclxuICAvL1xyXG4gIFNhbW15LkV2ZW50Q29udGV4dCA9IGZ1bmN0aW9uKGFwcCwgdmVyYiwgcGF0aCwgcGFyYW1zLCB0YXJnZXQpIHtcclxuICAgIHRoaXMuYXBwICAgID0gYXBwO1xyXG4gICAgdGhpcy52ZXJiICAgPSB2ZXJiO1xyXG4gICAgdGhpcy5wYXRoICAgPSBwYXRoO1xyXG4gICAgdGhpcy5wYXJhbXMgPSBuZXcgU2FtbXkuT2JqZWN0KHBhcmFtcyk7XHJcbiAgICB0aGlzLnRhcmdldCA9IHRhcmdldDtcclxuICB9O1xyXG5cclxuICBTYW1teS5FdmVudENvbnRleHQucHJvdG90eXBlID0gJC5leHRlbmQoe30sIFNhbW15Lk9iamVjdC5wcm90b3R5cGUsIHtcclxuXHJcbiAgICAvLyBBIHNob3J0Y3V0IHRvIHRoZSBhcHAncyBgJGVsZW1lbnQoKWBcclxuICAgICRlbGVtZW50OiBmdW5jdGlvbigpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuYXBwLiRlbGVtZW50KF9tYWtlQXJyYXkoYXJndW1lbnRzKS5zaGlmdCgpKTtcclxuICAgIH0sXHJcblxyXG4gICAgLy8gTG9vayB1cCBhIHRlbXBsYXRpbmcgZW5naW5lIHdpdGhpbiB0aGUgY3VycmVudCBhcHAgYW5kIGNvbnRleHQuXHJcbiAgICAvLyBgZW5naW5lYCBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6XHJcbiAgICAvL1xyXG4gICAgLy8gKiBhIGZ1bmN0aW9uOiBzaG91bGQgY29uZm9ybSB0byBgZnVuY3Rpb24oY29udGVudCwgZGF0YSkgeyByZXR1cm4gaW50ZXJwb2xhdGVkOyB9YFxyXG4gICAgLy8gKiBhIHRlbXBsYXRlIHBhdGg6ICd0ZW1wbGF0ZS5lanMnLCBsb29rcyB1cCB0aGUgZXh0ZW5zaW9uIHRvIG1hdGNoIHRvXHJcbiAgICAvLyAgIHRoZSBgZWpzKClgIGhlbHBlclxyXG4gICAgLy8gKiBhIHN0cmluZyByZWZlcnJpbmcgdG8gdGhlIGhlbHBlcjogXCJtdXN0YWNoZVwiID0+IGBtdXN0YWNoZSgpYFxyXG4gICAgLy9cclxuICAgIC8vIElmIG5vIGVuZ2luZSBpcyBmb3VuZCwgdXNlIHRoZSBhcHAncyBkZWZhdWx0IGB0ZW1wbGF0ZV9lbmdpbmVgXHJcbiAgICAvL1xyXG4gICAgZW5naW5lRm9yOiBmdW5jdGlvbihlbmdpbmUpIHtcclxuICAgICAgdmFyIGNvbnRleHQgPSB0aGlzLCBlbmdpbmVfbWF0Y2g7XHJcbiAgICAgIC8vIGlmIHBhdGggaXMgYWN0dWFsbHkgYW4gZW5naW5lIGZ1bmN0aW9uIGp1c3QgcmV0dXJuIGl0XHJcbiAgICAgIGlmIChfaXNGdW5jdGlvbihlbmdpbmUpKSB7IHJldHVybiBlbmdpbmU7IH1cclxuICAgICAgLy8gbG9va3VwIGVuZ2luZSBuYW1lIGJ5IHBhdGggZXh0ZW5zaW9uXHJcbiAgICAgIGVuZ2luZSA9IChlbmdpbmUgfHwgY29udGV4dC5hcHAudGVtcGxhdGVfZW5naW5lKS50b1N0cmluZygpO1xyXG4gICAgICBpZiAoKGVuZ2luZV9tYXRjaCA9IGVuZ2luZS5tYXRjaCgvXFwuKFteXFwuXFw/XFwjXSspKFxcP3wkKS8pKSkge1xyXG4gICAgICAgIGVuZ2luZSA9IGVuZ2luZV9tYXRjaFsxXTtcclxuICAgICAgfVxyXG4gICAgICAvLyBzZXQgdGhlIGVuZ2luZSB0byB0aGUgZGVmYXVsdCB0ZW1wbGF0ZSBlbmdpbmUgaWYgbm8gbWF0Y2ggaXMgZm91bmRcclxuICAgICAgaWYgKGVuZ2luZSAmJiBfaXNGdW5jdGlvbihjb250ZXh0W2VuZ2luZV0pKSB7XHJcbiAgICAgICAgcmV0dXJuIGNvbnRleHRbZW5naW5lXTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGNvbnRleHQuYXBwLnRlbXBsYXRlX2VuZ2luZSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmVuZ2luZUZvcihjb250ZXh0LmFwcC50ZW1wbGF0ZV9lbmdpbmUpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBmdW5jdGlvbihjb250ZW50LCBkYXRhKSB7IHJldHVybiBjb250ZW50OyB9O1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyB1c2luZyB0aGUgdGVtcGxhdGUgYGVuZ2luZWAgZm91bmQgd2l0aCBgZW5naW5lRm9yKClgLCBpbnRlcnBvbGF0ZSB0aGVcclxuICAgIC8vIGBkYXRhYCBpbnRvIGBjb250ZW50YFxyXG4gICAgaW50ZXJwb2xhdGU6IGZ1bmN0aW9uKGNvbnRlbnQsIGRhdGEsIGVuZ2luZSwgcGFydGlhbHMpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZW5naW5lRm9yKGVuZ2luZSkuYXBwbHkodGhpcywgW2NvbnRlbnQsIGRhdGEsIHBhcnRpYWxzXSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIENyZWF0ZSBhbmQgcmV0dXJuIGEgYFNhbW15LlJlbmRlckNvbnRleHRgIGNhbGxpbmcgYHJlbmRlcigpYCBvbiBpdC5cclxuICAgIC8vIExvYWRzIHRoZSB0ZW1wbGF0ZSBhbmQgaW50ZXJwb2xhdGUgdGhlIGRhdGEsIGhvd2V2ZXIgZG9lcyBub3QgYWN0dWFsXHJcbiAgICAvLyBwbGFjZSBpdCBpbiB0aGUgRE9NLlxyXG4gICAgLy9cclxuICAgIC8vICMjIyBFeGFtcGxlXHJcbiAgICAvL1xyXG4gICAgLy8gICAgICAvLyBteXRlbXBsYXRlLm11c3RhY2hlIDxkaXYgY2xhc3M9XCJuYW1lXCI+e3tuYW1lfX08L2Rpdj5cclxuICAgIC8vICAgICAgcmVuZGVyKCdteXRlbXBsYXRlLm11c3RhY2hlJywge25hbWU6ICdxdWlya2V5J30pO1xyXG4gICAgLy8gICAgICAvLyBzZXRzIHRoZSBgY29udGVudGAgdG8gPGRpdiBjbGFzcz1cIm5hbWVcIj5xdWlya2V5PC9kaXY+XHJcbiAgICAvLyAgICAgIHJlbmRlcignbXl0ZW1wbGF0ZS5tdXN0YWNoZScsIHtuYW1lOiAncXVpcmtleSd9KVxyXG4gICAgLy8gICAgICAgIC5hcHBlbmRUbygndWwnKTtcclxuICAgIC8vICAgICAgLy8gYXBwZW5kcyB0aGUgcmVuZGVyZWQgY29udGVudCB0byAkKCd1bCcpXHJcbiAgICAvL1xyXG4gICAgcmVuZGVyOiBmdW5jdGlvbihsb2NhdGlvbiwgZGF0YSwgY2FsbGJhY2ssIHBhcnRpYWxzKSB7XHJcbiAgICAgIHJldHVybiBuZXcgU2FtbXkuUmVuZGVyQ29udGV4dCh0aGlzKS5yZW5kZXIobG9jYXRpb24sIGRhdGEsIGNhbGxiYWNrLCBwYXJ0aWFscyk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIENyZWF0ZSBhbmQgcmV0dXJuIGEgYFNhbW15LlJlbmRlckNvbnRleHRgIGNhbGxpbmcgYHJlbmRlckVhY2goKWAgb24gaXQuXHJcbiAgICAvLyBMb2FkcyB0aGUgdGVtcGxhdGUgYW5kIGludGVycG9sYXRlcyB0aGUgZGF0YSBmb3IgZWFjaCBpdGVtLFxyXG4gICAgLy8gaG93ZXZlciBkb2VzIG5vdCBhY3R1YWwgcGxhY2UgaXQgaW4gdGhlIERPTS5cclxuICAgIC8vXHJcbiAgICAvLyAjIyMgRXhhbXBsZVxyXG4gICAgLy9cclxuICAgIC8vICAgICAgLy8gbXl0ZW1wbGF0ZS5tdXN0YWNoZSA8ZGl2IGNsYXNzPVwibmFtZVwiPnt7bmFtZX19PC9kaXY+XHJcbiAgICAvLyAgICAgIHJlbmRlckVhY2goJ215dGVtcGxhdGUubXVzdGFjaGUnLCBbe25hbWU6ICdxdWlya2V5J30sIHtuYW1lOiAnZW5kb3InfV0pXHJcbiAgICAvLyAgICAgIC8vIHNldHMgdGhlIGBjb250ZW50YCB0byA8ZGl2IGNsYXNzPVwibmFtZVwiPnF1aXJrZXk8L2Rpdj48ZGl2IGNsYXNzPVwibmFtZVwiPmVuZG9yPC9kaXY+XHJcbiAgICAvLyAgICAgIHJlbmRlckVhY2goJ215dGVtcGxhdGUubXVzdGFjaGUnLCBbe25hbWU6ICdxdWlya2V5J30sIHtuYW1lOiAnZW5kb3InfV0pLmFwcGVuZFRvKCd1bCcpO1xyXG4gICAgLy8gICAgICAvLyBhcHBlbmRzIHRoZSByZW5kZXJlZCBjb250ZW50IHRvICQoJ3VsJylcclxuICAgIC8vXHJcbiAgICByZW5kZXJFYWNoOiBmdW5jdGlvbihsb2NhdGlvbiwgbmFtZSwgZGF0YSwgY2FsbGJhY2spIHtcclxuICAgICAgcmV0dXJuIG5ldyBTYW1teS5SZW5kZXJDb250ZXh0KHRoaXMpLnJlbmRlckVhY2gobG9jYXRpb24sIG5hbWUsIGRhdGEsIGNhbGxiYWNrKTtcclxuICAgIH0sXHJcblxyXG4gICAgLy8gY3JlYXRlIGEgbmV3IGBTYW1teS5SZW5kZXJDb250ZXh0YCBjYWxsaW5nIGBsb2FkKClgIHdpdGggYGxvY2F0aW9uYCBhbmRcclxuICAgIC8vIGBvcHRpb25zYC4gQ2FsbGVkIHdpdGhvdXQgaW50ZXJwb2xhdGlvbiBvciBwbGFjZW1lbnQsIHRoaXMgYWxsb3dzIGZvclxyXG4gICAgLy8gcHJlbG9hZGluZy9jYWNoaW5nIHRoZSB0ZW1wbGF0ZXMuXHJcbiAgICBsb2FkOiBmdW5jdGlvbihsb2NhdGlvbiwgb3B0aW9ucywgY2FsbGJhY2spIHtcclxuICAgICAgcmV0dXJuIG5ldyBTYW1teS5SZW5kZXJDb250ZXh0KHRoaXMpLmxvYWQobG9jYXRpb24sIG9wdGlvbnMsIGNhbGxiYWNrKTtcclxuICAgIH0sXHJcblxyXG4gICAgLy8gY3JlYXRlIGEgbmV3IGBTYW1teS5SZW5kZXJDb250ZXh0YCBjYWxsaW5nIGBsb2FkUGFydGlhbHMoKWAgd2l0aCBgcGFydGlhbHNgLlxyXG4gICAgbG9hZFBhcnRpYWxzOiBmdW5jdGlvbihwYXJ0aWFscykge1xyXG4gICAgICByZXR1cm4gbmV3IFNhbW15LlJlbmRlckNvbnRleHQodGhpcykubG9hZFBhcnRpYWxzKHBhcnRpYWxzKTtcclxuICAgIH0sXHJcblxyXG4gICAgLy8gYHJlbmRlcigpYCB0aGUgYGxvY2F0aW9uYCB3aXRoIGBkYXRhYCBhbmQgdGhlbiBgc3dhcCgpYCB0aGVcclxuICAgIC8vIGFwcCdzIGAkZWxlbWVudGAgd2l0aCB0aGUgcmVuZGVyZWQgY29udGVudC5cclxuICAgIHBhcnRpYWw6IGZ1bmN0aW9uKGxvY2F0aW9uLCBkYXRhLCBjYWxsYmFjaywgcGFydGlhbHMpIHtcclxuICAgICAgcmV0dXJuIG5ldyBTYW1teS5SZW5kZXJDb250ZXh0KHRoaXMpLnBhcnRpYWwobG9jYXRpb24sIGRhdGEsIGNhbGxiYWNrLCBwYXJ0aWFscyk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIGNyZWF0ZSBhIG5ldyBgU2FtbXkuUmVuZGVyQ29udGV4dGAgY2FsbGluZyBgc2VuZCgpYCB3aXRoIGFuIGFyYml0cmFyeVxyXG4gICAgLy8gZnVuY3Rpb25cclxuICAgIHNlbmQ6IGZ1bmN0aW9uKCkge1xyXG4gICAgICB2YXIgcmN0eCA9IG5ldyBTYW1teS5SZW5kZXJDb250ZXh0KHRoaXMpO1xyXG4gICAgICByZXR1cm4gcmN0eC5zZW5kLmFwcGx5KHJjdHgsIGFyZ3VtZW50cyk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIENoYW5nZXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IHdpbmRvdy4gSWYgYHRvYCBiZWdpbnMgd2l0aFxyXG4gICAgLy8gJyMnIGl0IG9ubHkgY2hhbmdlcyB0aGUgZG9jdW1lbnQncyBoYXNoLiBJZiBwYXNzZWQgbW9yZSB0aGFuIDEgYXJndW1lbnRcclxuICAgIC8vIHJlZGlyZWN0IHdpbGwgam9pbiB0aGVtIHRvZ2V0aGVyIHdpdGggZm9yd2FyZCBzbGFzaGVzLlxyXG4gICAgLy9cclxuICAgIC8vICMjIyBFeGFtcGxlXHJcbiAgICAvL1xyXG4gICAgLy8gICAgICByZWRpcmVjdCgnIy9vdGhlci9yb3V0ZScpO1xyXG4gICAgLy8gICAgICAvLyBlcXVpdmFsZW50IHRvXHJcbiAgICAvLyAgICAgIHJlZGlyZWN0KCcjJywgJ290aGVyJywgJ3JvdXRlJyk7XHJcbiAgICAvL1xyXG4gICAgcmVkaXJlY3Q6IGZ1bmN0aW9uKCkge1xyXG4gICAgICB2YXIgdG8sIGFyZ3MgPSBfbWFrZUFycmF5KGFyZ3VtZW50cyksXHJcbiAgICAgICAgICBjdXJyZW50X2xvY2F0aW9uID0gdGhpcy5hcHAuZ2V0TG9jYXRpb24oKSxcclxuICAgICAgICAgIGwgPSBhcmdzLmxlbmd0aDtcclxuICAgICAgaWYgKGwgPiAxKSB7XHJcbiAgICAgICAgdmFyIGkgPSAwLCBwYXRocyA9IFtdLCBwYWlycyA9IFtdLCBwYXJhbXMgPSB7fSwgaGFzX3BhcmFtcyA9IGZhbHNlO1xyXG4gICAgICAgIGZvciAoOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgICBpZiAodHlwZW9mIGFyZ3NbaV0gPT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgcGF0aHMucHVzaChhcmdzW2ldKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICQuZXh0ZW5kKHBhcmFtcywgYXJnc1tpXSk7XHJcbiAgICAgICAgICAgIGhhc19wYXJhbXMgPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0byA9IHBhdGhzLmpvaW4oJy8nKTtcclxuICAgICAgICBpZiAoaGFzX3BhcmFtcykge1xyXG4gICAgICAgICAgZm9yICh2YXIgayBpbiBwYXJhbXMpIHtcclxuICAgICAgICAgICAgcGFpcnMucHVzaCh0aGlzLmFwcC5fZW5jb2RlRm9ybVBhaXIoaywgcGFyYW1zW2tdKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0byArPSAnPycgKyBwYWlycy5qb2luKCcmJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRvID0gYXJnc1swXTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnRyaWdnZXIoJ3JlZGlyZWN0Jywge3RvOiB0b30pO1xyXG4gICAgICB0aGlzLmFwcC5sYXN0X2xvY2F0aW9uID0gW3RoaXMudmVyYiwgdGhpcy5wYXRoXTtcclxuICAgICAgdGhpcy5hcHAuc2V0TG9jYXRpb24odG8pO1xyXG4gICAgICBpZiAobmV3IFJlZ0V4cCh0bykudGVzdChjdXJyZW50X2xvY2F0aW9uKSkge1xyXG4gICAgICAgIHRoaXMuYXBwLnRyaWdnZXIoJ2xvY2F0aW9uLWNoYW5nZWQnKTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvLyBUcmlnZ2VycyBldmVudHMgb24gYGFwcGAgd2l0aGluIHRoZSBjdXJyZW50IGNvbnRleHQuXHJcbiAgICB0cmlnZ2VyOiBmdW5jdGlvbihuYW1lLCBkYXRhKSB7XHJcbiAgICAgIGlmICh0eXBlb2YgZGF0YSA9PSAndW5kZWZpbmVkJykgeyBkYXRhID0ge307IH1cclxuICAgICAgaWYgKCFkYXRhLmNvbnRleHQpIHsgZGF0YS5jb250ZXh0ID0gdGhpczsgfVxyXG4gICAgICByZXR1cm4gdGhpcy5hcHAudHJpZ2dlcihuYW1lLCBkYXRhKTtcclxuICAgIH0sXHJcblxyXG4gICAgLy8gQSBzaG9ydGN1dCB0byBhcHAncyBgZXZlbnROYW1lc3BhY2UoKWBcclxuICAgIGV2ZW50TmFtZXNwYWNlOiBmdW5jdGlvbigpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuYXBwLmV2ZW50TmFtZXNwYWNlKCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIEEgc2hvcnRjdXQgdG8gYXBwJ3MgYHN3YXAoKWBcclxuICAgIHN3YXA6IGZ1bmN0aW9uKGNvbnRlbnRzLCBjYWxsYmFjaykge1xyXG4gICAgICByZXR1cm4gdGhpcy5hcHAuc3dhcChjb250ZW50cywgY2FsbGJhY2spO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBSYWlzZXMgYSBwb3NzaWJsZSBgbm90Rm91bmQoKWAgZXJyb3IgZm9yIHRoZSBjdXJyZW50IHBhdGguXHJcbiAgICBub3RGb3VuZDogZnVuY3Rpb24oKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmFwcC5ub3RGb3VuZCh0aGlzLnZlcmIsIHRoaXMucGF0aCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIERlZmF1bHQgSlNPTiBwYXJzaW5nIHVzZXMgalF1ZXJ5J3MgYHBhcnNlSlNPTigpYC4gSW5jbHVkZSBgU2FtbXkuSlNPTmBcclxuICAgIC8vIHBsdWdpbiBmb3IgdGhlIG1vcmUgY29uZm9ybWFudCBcImNyb2NrZm9yZCBzcGVjaWFsXCIuXHJcbiAgICBqc29uOiBmdW5jdGlvbihzdHJpbmcpIHtcclxuICAgICAgcmV0dXJuICQucGFyc2VKU09OKHN0cmluZyk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIC8vPT4gU2FtbXkuRXZlbnRDb250ZXh0OiBnZXQgIy8ge31cclxuICAgIHRvU3RyaW5nOiBmdW5jdGlvbigpIHtcclxuICAgICAgcmV0dXJuIFwiU2FtbXkuRXZlbnRDb250ZXh0OiBcIiArIFt0aGlzLnZlcmIsIHRoaXMucGF0aCwgdGhpcy5wYXJhbXNdLmpvaW4oJyAnKTtcclxuICAgIH1cclxuXHJcbiAgfSk7XHJcblxyXG4gIHJldHVybiBTYW1teTtcclxufSk7XHJcblxyXG5cbjsgYnJvd3NlcmlmeV9zaGltX19kZWZpbmVfX21vZHVsZV9fZXhwb3J0X18odHlwZW9mIFNhbW15ICE9IFwidW5kZWZpbmVkXCIgPyBTYW1teSA6IHdpbmRvdy5TYW1teSk7XG5cbn0pLmNhbGwoZ2xvYmFsLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGZ1bmN0aW9uIGRlZmluZUV4cG9ydChleCkgeyBtb2R1bGUuZXhwb3J0cyA9IGV4OyB9KTtcblxufSkuY2FsbCh0aGlzLHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIgPyBnbG9iYWwgOiB0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiA/IHNlbGYgOiB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiID8gd2luZG93IDoge30pXG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldDp1dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJbE5qY21sd2RITXZiR2xpTDNOaGJXMTVMbXB6SWwwc0ltNWhiV1Z6SWpwYlhTd2liV0Z3Y0dsdVozTWlPaUk3UVVGQlFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRWlMQ0ptYVd4bElqb2laMlZ1WlhKaGRHVmtMbXB6SWl3aWMyOTFjbU5sVW05dmRDSTZJaUlzSW5OdmRYSmpaWE5EYjI1MFpXNTBJanBiSWx4dU95QktVWFZsY25rZ1BTQm5iRzlpWVd3dVNsRjFaWEo1SUQwZ2NtVnhkV2x5WlNoY0ltcHhkV1Z5ZVZ3aUtUdGNianNnZG1GeUlGOWZZbkp2ZDNObGNtbG1lVjl6YUdsdFgzSmxjWFZwY21WZlh6MXlaWEYxYVhKbE95aG1kVzVqZEdsdmJpQmljbTkzYzJWeWFXWjVVMmhwYlNodGIyUjFiR1VzSUdWNGNHOXlkSE1zSUhKbGNYVnBjbVVzSUdSbFptbHVaU3dnWW5KdmQzTmxjbWxtZVY5emFHbHRYMTlrWldacGJtVmZYMjF2WkhWc1pWOWZaWGh3YjNKMFgxOHBJSHRjYmk4dklHNWhiV1U2SUhOaGJXMTVYSEpjYmk4dklIWmxjbk5wYjI0NklEQXVOeTQxWEhKY2JseHlYRzR2THlCVFlXMXRlUzVxY3lBdklHaDBkSEE2THk5ellXMXRlV3B6TG05eVoxeHlYRzVjY2x4dUtHWjFibU4wYVc5dUtHWmhZM1J2Y25rcGUxeHlYRzRnSUM4dklGTjFjSEJ2Y25RZ2JXOWtkV3hsSUd4dllXUnBibWNnYzJObGJtRnlhVzl6WEhKY2JpQWdhV1lnS0hSNWNHVnZaaUJrWldacGJtVWdQVDA5SUNkbWRXNWpkR2x2YmljZ0ppWWdaR1ZtYVc1bExtRnRaQ2w3WEhKY2JpQWdJQ0F2THlCQlRVUWdRVzV2Ym5sdGIzVnpJRTF2WkhWc1pWeHlYRzRnSUNBZ1pHVm1hVzVsS0ZzbmFuRjFaWEo1SjEwc0lHWmhZM1J2Y25rcE8xeHlYRzRnSUgwZ1pXeHpaU0I3WEhKY2JpQWdJQ0F2THlCT2J5QnRiMlIxYkdVZ2JHOWhaR1Z5SUNod2JHRnBiaUE4YzJOeWFYQjBQaUIwWVdjcElDMGdjSFYwSUdScGNtVmpkR3g1SUdsdUlHZHNiMkpoYkNCdVlXMWxjM0JoWTJWY2NseHVJQ0FnSUdwUmRXVnllUzV6WVcxdGVTQTlJSGRwYm1SdmR5NVRZVzF0ZVNBOUlHWmhZM1J2Y25rb2FsRjFaWEo1S1R0Y2NseHVJQ0I5WEhKY2JuMHBLR1oxYm1OMGFXOXVLQ1FwZTF4eVhHNWNjbHh1SUNCMllYSWdVMkZ0Ylhrc1hISmNiaUFnSUNBZ0lGQkJWRWhmVWtWUVRFRkRSVklnUFNCY0lpaGJYbHhjTDEwcktWd2lMRnh5WEc0Z0lDQWdJQ0JRUVZSSVgwNUJUVVZmVFVGVVEwaEZVaUE5SUM4NktGdGNYSGRjWEdSZEt5a3ZaeXhjY2x4dUlDQWdJQ0FnVVZWRlVsbGZVMVJTU1U1SFgwMUJWRU5JUlZJZ1BTQXZYRncvS0Z0ZUkxMHFLVDhrTHl4Y2NseHVJQ0FnSUNBZ0x5OGdiV0ZwYm14NUlHWnZjaUJ0WVd0cGJtY2dZR0Z5WjNWdFpXNTBjMkFnWVc0Z1FYSnlZWGxjY2x4dUlDQWdJQ0FnWDIxaGEyVkJjbkpoZVNBOUlHWjFibU4wYVc5dUtHNXZibUZ5Y21GNUtTQjdJSEpsZEhWeWJpQkJjbkpoZVM1d2NtOTBiM1I1Y0dVdWMyeHBZMlV1WTJGc2JDaHViMjVoY25KaGVTazdJSDBzWEhKY2JpQWdJQ0FnSUM4dklHSnZjbkp2ZDJWa0lHWnliMjBnYWxGMVpYSjVYSEpjYmlBZ0lDQWdJRjlwYzBaMWJtTjBhVzl1SUQwZ1puVnVZM1JwYjI0b0lHOWlhaUFwSUhzZ2NtVjBkWEp1SUU5aWFtVmpkQzV3Y205MGIzUjVjR1V1ZEc5VGRISnBibWN1WTJGc2JDaHZZbW9wSUQwOVBTQmNJbHR2WW1wbFkzUWdSblZ1WTNScGIyNWRYQ0k3SUgwc1hISmNiaUFnSUNBZ0lGOXBjMEZ5Y21GNUlEMGdablZ1WTNScGIyNG9JRzlpYWlBcElIc2djbVYwZFhKdUlFOWlhbVZqZEM1d2NtOTBiM1I1Y0dVdWRHOVRkSEpwYm1jdVkyRnNiQ2h2WW1vcElEMDlQU0JjSWx0dlltcGxZM1FnUVhKeVlYbGRYQ0k3SUgwc1hISmNiaUFnSUNBZ0lGOXBjMUpsWjBWNGNDQTlJR1oxYm1OMGFXOXVLQ0J2WW1vZ0tTQjdJSEpsZEhWeWJpQlBZbXBsWTNRdWNISnZkRzkwZVhCbExuUnZVM1J5YVc1bkxtTmhiR3dvYjJKcUtTQTlQVDBnWENKYmIySnFaV04wSUZKbFowVjRjRjFjSWpzZ2ZTeGNjbHh1SUNBZ0lDQWdYMlJsWTI5a1pTQTlJR1oxYm1OMGFXOXVLQ0J6ZEhJZ0tTQjdJSEpsZEhWeWJpQmtaV052WkdWVlVrbERiMjF3YjI1bGJuUW9LSE4wY2lCOGZDQW5KeWt1Y21Wd2JHRmpaU2d2WEZ3ckwyY3NJQ2NnSnlrcE95QjlMRnh5WEc0Z0lDQWdJQ0JmWlc1amIyUmxJRDBnWlc1amIyUmxWVkpKUTI5dGNHOXVaVzUwTEZ4eVhHNGdJQ0FnSUNCZlpYTmpZWEJsU0ZSTlRDQTlJR1oxYm1OMGFXOXVLSE1wSUh0Y2NseHVJQ0FnSUNBZ0lDQnlaWFIxY200Z1UzUnlhVzVuS0hNcExuSmxjR3hoWTJVb0x5WW9QeUZjWEhjck95a3ZaeXdnSnlaaGJYQTdKeWt1Y21Wd2JHRmpaU2d2UEM5bkxDQW5KbXgwT3ljcExuSmxjR3hoWTJVb0x6NHZaeXdnSnlabmREc25LUzV5WlhCc1lXTmxLQzljSWk5bkxDQW5KbkYxYjNRN0p5azdYSEpjYmlBZ0lDQWdJSDBzWEhKY2JpQWdJQ0FnSUY5eWIzVjBaVmR5WVhCd1pYSWdQU0JtZFc1amRHbHZiaWgyWlhKaUtTQjdYSEpjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJR1oxYm1OMGFXOXVLQ2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlIUm9hWE11Y205MWRHVXVZWEJ3Ykhrb2RHaHBjeXdnVzNabGNtSmRMbU52Ym1OaGRDaEJjbkpoZVM1d2NtOTBiM1I1Y0dVdWMyeHBZMlV1WTJGc2JDaGhjbWQxYldWdWRITXBLU2s3WEhKY2JpQWdJQ0FnSUNBZ2ZUdGNjbHh1SUNBZ0lDQWdmU3hjY2x4dUlDQWdJQ0FnWDNSbGJYQnNZWFJsWDJOaFkyaGxJRDBnZTMwc1hISmNiaUFnSUNBZ0lGOW9ZWE5mYUdsemRHOXllU0E5SUNFaEtIZHBibVJ2ZHk1b2FYTjBiM0o1SUNZbUlHaHBjM1J2Y25rdWNIVnphRk4wWVhSbEtTeGNjbHh1SUNBZ0lDQWdiRzluWjJWeWN5QTlJRnRkTzF4eVhHNWNjbHh1WEhKY2JpQWdMeThnWUZOaGJXMTVZQ0FvWVd4emJ5QmhiR2xoYzJWa0lHRnpJQ1F1YzJGdGJYa3BJR2x6SUc1dmRDQnZibXg1SUhSb1pTQnVZVzFsYzNCaFkyVWdabTl5SUdGY2NseHVJQ0F2THlCdWRXMWlaWElnYjJZZ2NISnZkRzkwZVhCbGN5d2dhWFJ6SUdGc2MyOGdZU0IwYjNBZ2JHVjJaV3dnYldWMGFHOWtJSFJvWVhRZ1lXeHNiM2R6SUdadmNpQmxZWE41WEhKY2JpQWdMeThnWTNKbFlYUnBiMjR2YldGdVlXZGxiV1Z1ZENCdlppQmdVMkZ0YlhrdVFYQndiR2xqWVhScGIyNWdJR2x1YzNSaGJtTmxjeTRnVkdobGNtVWdZWEpsSUdGY2NseHVJQ0F2THlCdWRXMWlaWElnYjJZZ1pHbG1abVZ5Wlc1MElHWnZjbTF6SUdadmNpQmdVMkZ0Ylhrb0tXQWdZblYwSUdWaFkyZ2djbVYwZFhKdWN5QmhiaUJwYm5OMFlXNWpaVnh5WEc0Z0lDOHZJRzltSUdCVFlXMXRlUzVCY0hCc2FXTmhkR2x2Ym1BdUlGZG9aVzRnWVNCdVpYY2dhVzV6ZEdGdVkyVWdhWE1nWTNKbFlYUmxaQ0IxYzJsdVoxeHlYRzRnSUM4dklHQlRZVzF0ZVdBZ2FYUWdhWE1nWVdSa1pXUWdkRzhnWVc0Z1QySnFaV04wSUdOaGJHeGxaQ0JnVTJGdGJYa3VZWEJ3YzJBdUlGUm9hWE5jY2x4dUlDQXZMeUJ3Y205MmFXUmxjeUJtYjNJZ1lXNGdaV0Z6ZVNCM1lYa2dkRzhnWjJWMElHRjBJR1Y0YVhOMGFXNW5JRk5oYlcxNUlHRndjR3hwWTJGMGFXOXVjeTRnVDI1c2VTQnZibVZjY2x4dUlDQXZMeUJwYm5OMFlXNWpaU0JwY3lCaGJHeHZkMlZrSUhCbGNpQmdaV3hsYldWdWRGOXpaV3hsWTNSdmNtQWdjMjhnZDJobGJpQmpZV3hzYVc1blhISmNiaUFnTHk4Z1lGTmhiVzE1S0NkelpXeGxZM1J2Y2ljcFlDQnRkV3gwYVhCc1pTQjBhVzFsY3l3Z2RHaGxJR1pwY25OMElIUnBiV1VnZDJsc2JDQmpjbVZoZEdWY2NseHVJQ0F2THlCMGFHVWdZWEJ3YkdsallYUnBiMjRnWVc1a0lIUm9aU0JtYjJ4c2IzZHBibWNnZEdsdFpYTWdkMmxzYkNCbGVIUmxibVFnZEdobElHRndjR3hwWTJGMGFXOXVYSEpjYmlBZ0x5OGdZV3h5WldGa2VTQmhaR1JsWkNCMGJ5QjBhR0YwSUhObGJHVmpkRzl5TGx4eVhHNGdJQzh2WEhKY2JpQWdMeThnSXlNaklFVjRZVzF3YkdWY2NseHVJQ0F2TDF4eVhHNGdJQzh2SUNBZ0lDQWdMeThnY21WMGRYSnVjeUIwYUdVZ1lYQndJR0YwSUNOdFlXbHVJRzl5SUdFZ2JtVjNJR0Z3Y0Z4eVhHNGdJQzh2SUNBZ0lDQWdVMkZ0Ylhrb0p5TnRZV2x1SnlsY2NseHVJQ0F2TDF4eVhHNGdJQzh2SUNBZ0lDQWdMeThnWlhGMWFYWmhiR1Z1ZENCMGJ5QmNJbTVsZHlCVFlXMXRlUzVCY0hCc2FXTmhkR2x2Ymx3aUxDQmxlR05sY0hRZ1lYQndaVzVrY3lCMGJ5QmhjSEJ6WEhKY2JpQWdMeThnSUNBZ0lDQlRZVzF0ZVNncE8xeHlYRzRnSUM4dklDQWdJQ0FnVTJGdGJYa29ablZ1WTNScGIyNG9LU0I3SUM0dUxpQjlLVHRjY2x4dUlDQXZMMXh5WEc0Z0lDOHZJQ0FnSUNBZ0x5OGdaWGgwWlc1a2N5QjBhR1VnWVhCd0lHRjBJQ2NqYldGcGJpY2dkMmwwYUNCbWRXNWpkR2x2Ymk1Y2NseHVJQ0F2THlBZ0lDQWdJRk5oYlcxNUtDY2piV0ZwYmljc0lHWjFibU4wYVc5dUtDa2dleUF1TGk0Z2ZTazdYSEpjYmlBZ0x5OWNjbHh1SUNCVFlXMXRlU0E5SUdaMWJtTjBhVzl1S0NrZ2UxeHlYRzRnSUNBZ2RtRnlJR0Z5WjNNZ1BTQmZiV0ZyWlVGeWNtRjVLR0Z5WjNWdFpXNTBjeWtzWEhKY2JpQWdJQ0FnSUNBZ1lYQndMQ0J6Wld4bFkzUnZjanRjY2x4dUlDQWdJRk5oYlcxNUxtRndjSE1nUFNCVFlXMXRlUzVoY0hCeklIeDhJSHQ5TzF4eVhHNGdJQ0FnYVdZZ0tHRnlaM011YkdWdVozUm9JRDA5UFNBd0lIeDhJR0Z5WjNOYk1GMGdKaVlnWDJselJuVnVZM1JwYjI0b1lYSm5jMXN3WFNrcElIc2dMeThnVTJGdGJYa29LVnh5WEc0Z0lDQWdJQ0J5WlhSMWNtNGdVMkZ0YlhrdVlYQndiSGtvVTJGdGJYa3NJRnNuWW05a2VTZGRMbU52Ym1OaGRDaGhjbWR6S1NrN1hISmNiaUFnSUNCOUlHVnNjMlVnYVdZZ0tIUjVjR1Z2WmlBb2MyVnNaV04wYjNJZ1BTQmhjbWR6TG5Ob2FXWjBLQ2twSUQwOUlDZHpkSEpwYm1jbktTQjdJQzh2SUZOaGJXMTVLQ2NqYldGcGJpY3BYSEpjYmlBZ0lDQWdJR0Z3Y0NBOUlGTmhiVzE1TG1Gd2NITmJjMlZzWldOMGIzSmRJSHg4SUc1bGR5QlRZVzF0ZVM1QmNIQnNhV05oZEdsdmJpZ3BPMXh5WEc0Z0lDQWdJQ0JoY0hBdVpXeGxiV1Z1ZEY5elpXeGxZM1J2Y2lBOUlITmxiR1ZqZEc5eU8xeHlYRzRnSUNBZ0lDQnBaaUFvWVhKbmN5NXNaVzVuZEdnZ1BpQXdLU0I3WEhKY2JpQWdJQ0FnSUNBZ0pDNWxZV05vS0dGeVozTXNJR1oxYm1OMGFXOXVLR2tzSUhCc2RXZHBiaWtnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdZWEJ3TG5WelpTaHdiSFZuYVc0cE8xeHlYRzRnSUNBZ0lDQWdJSDBwTzF4eVhHNGdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lDOHZJR2xtSUhSb1pTQnpaV3hsWTNSdmNpQmphR0Z1WjJWeklHMWhhMlVnYzNWeVpTQjBhR1VnY21WbVpYSmxibU5sSUdsdUlGTmhiVzE1TG1Gd2NITWdZMmhoYm1kbGMxeHlYRzRnSUNBZ0lDQnBaaUFvWVhCd0xtVnNaVzFsYm5SZmMyVnNaV04wYjNJZ0lUMGdjMlZzWldOMGIzSXBJSHRjY2x4dUlDQWdJQ0FnSUNCa1pXeGxkR1VnVTJGdGJYa3VZWEJ3YzF0elpXeGxZM1J2Y2wwN1hISmNiaUFnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdVMkZ0YlhrdVlYQndjMXRoY0hBdVpXeGxiV1Z1ZEY5elpXeGxZM1J2Y2wwZ1BTQmhjSEE3WEhKY2JpQWdJQ0FnSUhKbGRIVnliaUJoY0hBN1hISmNiaUFnSUNCOVhISmNiaUFnZlR0Y2NseHVYSEpjYmlBZ1UyRnRiWGt1VmtWU1UwbFBUaUE5SUNjd0xqY3VOU2M3WEhKY2JseHlYRzRnSUM4dklFRmtaQ0IwYnlCMGFHVWdaMnh2WW1Gc0lHeHZaMmRsY2lCd2IyOXNMaUJVWVd0bGN5QmhJR1oxYm1OMGFXOXVJSFJvWVhRZ1lXTmpaWEIwY3lCaGJseHlYRzRnSUM4dklIVnVhMjV2ZDI0Z2JuVnRZbVZ5SUc5bUlHRnlaM1Z0Wlc1MGN5QmhibVFnYzJodmRXeGtJSEJ5YVc1MElIUm9aVzBnYjNJZ2MyVnVaQ0IwYUdWdElITnZiV1YzYUdWeVpWeHlYRzRnSUM4dklGUm9aU0JtYVhKemRDQmhjbWQxYldWdWRDQnBjeUJoYkhkaGVYTWdZU0IwYVcxbGMzUmhiWEF1WEhKY2JpQWdVMkZ0YlhrdVlXUmtURzluWjJWeUlEMGdablZ1WTNScGIyNG9iRzluWjJWeUtTQjdYSEpjYmlBZ0lDQnNiMmRuWlhKekxuQjFjMmdvYkc5bloyVnlLVHRjY2x4dUlDQjlPMXh5WEc1Y2NseHVJQ0F2THlCVFpXNWtjeUJoSUd4dlp5QnRaWE56WVdkbElIUnZJR1ZoWTJnZ2JHOW5aMlZ5SUd4cGMzUmxaQ0JwYmlCMGFHVWdaMnh2WW1Gc1hISmNiaUFnTHk4Z2JHOW5aMlZ5Y3lCd2IyOXNMaUJEWVc0Z2RHRnJaU0JoYm5rZ2JuVnRZbVZ5SUc5bUlHRnlaM1Z0Wlc1MGN5NWNjbHh1SUNBdkx5QkJiSE52SUhCeVpXWnBlR1Z6SUhSb1pTQmhjbWQxYldWdWRITWdkMmwwYUNCaElIUnBiV1Z6ZEdGdGNDNWNjbHh1SUNCVFlXMXRlUzVzYjJjZ1BTQm1kVzVqZEdsdmJpZ3BJQ0I3WEhKY2JpQWdJQ0IyWVhJZ1lYSm5jeUE5SUY5dFlXdGxRWEp5WVhrb1lYSm5kVzFsYm5SektUdGNjbHh1SUNBZ0lHRnlaM011ZFc1emFHbG1kQ2hjSWx0Y0lpQXJJRVJoZEdVb0tTQXJJRndpWFZ3aUtUdGNjbHh1SUNBZ0lDUXVaV0ZqYUNoc2IyZG5aWEp6TENCbWRXNWpkR2x2YmlocExDQnNiMmRuWlhJcElIdGNjbHh1SUNBZ0lDQWdiRzluWjJWeUxtRndjR3g1S0ZOaGJXMTVMQ0JoY21kektUdGNjbHh1SUNBZ0lIMHBPMXh5WEc0Z0lIMDdYSEpjYmx4eVhHNGdJR2xtSUNoMGVYQmxiMllnZDJsdVpHOTNMbU52Ym5OdmJHVWdJVDBnSjNWdVpHVm1hVzVsWkNjcElIdGNjbHh1SUNBZ0lHbG1JQ2gwZVhCbGIyWWdkMmx1Wkc5M0xtTnZibk52YkdVdWJHOW5JRDA5UFNBblpuVnVZM1JwYjI0bklDWW1JRjlwYzBaMWJtTjBhVzl1S0hkcGJtUnZkeTVqYjI1emIyeGxMbXh2Wnk1aGNIQnNlU2twSUh0Y2NseHVJQ0FnSUNBZ1UyRnRiWGt1WVdSa1RHOW5aMlZ5S0daMWJtTjBhVzl1S0NrZ2UxeHlYRzRnSUNBZ0lDQWdJSGRwYm1SdmR5NWpiMjV6YjJ4bExteHZaeTVoY0hCc2VTaDNhVzVrYjNjdVkyOXVjMjlzWlN3Z1lYSm5kVzFsYm5SektUdGNjbHh1SUNBZ0lDQWdmU2s3WEhKY2JpQWdJQ0I5SUdWc2MyVWdlMXh5WEc0Z0lDQWdJQ0JUWVcxdGVTNWhaR1JNYjJkblpYSW9ablZ1WTNScGIyNG9LU0I3WEhKY2JpQWdJQ0FnSUNBZ2QybHVaRzkzTG1OdmJuTnZiR1V1Ykc5bktHRnlaM1Z0Wlc1MGN5azdYSEpjYmlBZ0lDQWdJSDBwTzF4eVhHNGdJQ0FnZlZ4eVhHNGdJSDBnWld4elpTQnBaaUFvZEhsd1pXOW1JR052Ym5OdmJHVWdJVDBnSjNWdVpHVm1hVzVsWkNjcElIdGNjbHh1SUNBZ0lGTmhiVzE1TG1Ga1pFeHZaMmRsY2lobWRXNWpkR2x2YmlncElIdGNjbHh1SUNBZ0lDQWdZMjl1YzI5c1pTNXNiMmN1WVhCd2JIa29ZMjl1YzI5c1pTd2dZWEpuZFcxbGJuUnpLVHRjY2x4dUlDQWdJSDBwTzF4eVhHNGdJSDFjY2x4dVhISmNiaUFnSkM1bGVIUmxibVFvVTJGdGJYa3NJSHRjY2x4dUlDQWdJRzFoYTJWQmNuSmhlVG9nWDIxaGEyVkJjbkpoZVN4Y2NseHVJQ0FnSUdselJuVnVZM1JwYjI0NklGOXBjMFoxYm1OMGFXOXVMRnh5WEc0Z0lDQWdhWE5CY25KaGVUb2dYMmx6UVhKeVlYbGNjbHh1SUNCOUtUdGNjbHh1WEhKY2JpQWdMeThnVTJGdGJYa3VUMkpxWldOMElHbHpJSFJvWlNCaVlYTmxJR1p2Y2lCaGJHd2diM1JvWlhJZ1UyRnRiWGtnWTJ4aGMzTmxjeTRnU1hRZ2NISnZkbWxrWlhNZ2MyOXRaU0IxYzJWbWRXeGNjbHh1SUNBdkx5Qm1kVzVqZEdsdmJtRnNhWFI1TENCcGJtTnNkV1JwYm1jZ1kyeHZibWx1Wnl3Z2FYUmxjbUYwYVc1bkxDQmxkR011WEhKY2JpQWdVMkZ0YlhrdVQySnFaV04wSUQwZ1puVnVZM1JwYjI0b2IySnFLU0I3SUM4dklHTnZibk4wY25WamRHOXlYSEpjYmlBZ0lDQnlaWFIxY200Z0pDNWxlSFJsYm1Rb2RHaHBjeXdnYjJKcUlIeDhJSHQ5S1R0Y2NseHVJQ0I5TzF4eVhHNWNjbHh1SUNBa0xtVjRkR1Z1WkNoVFlXMXRlUzVQWW1wbFkzUXVjSEp2ZEc5MGVYQmxMQ0I3WEhKY2JseHlYRzRnSUNBZ0x5OGdSWE5qWVhCbElFaFVUVXdnYVc0Z2MzUnlhVzVuTENCMWMyVWdhVzRnZEdWdGNHeGhkR1Z6SUhSdklIQnlaWFpsYm5RZ2MyTnlhWEIwSUdsdWFtVmpkR2x2Ymk1Y2NseHVJQ0FnSUM4dklFRnNjMjhnWVd4cFlYTmxaQ0JoY3lCZ2FDZ3BZRnh5WEc0Z0lDQWdaWE5qWVhCbFNGUk5URG9nWDJWelkyRndaVWhVVFV3c1hISmNiaUFnSUNCb09pQmZaWE5qWVhCbFNGUk5UQ3hjY2x4dVhISmNiaUFnSUNBdkx5QlNaWFIxY201eklHRWdZMjl3ZVNCdlppQjBhR1VnYjJKcVpXTjBJSGRwZEdnZ1JuVnVZM1JwYjI1eklISmxiVzkyWldRdVhISmNiaUFnSUNCMGIwaGhjMmc2SUdaMWJtTjBhVzl1S0NrZ2UxeHlYRzRnSUNBZ0lDQjJZWElnYW5OdmJpQTlJSHQ5TzF4eVhHNGdJQ0FnSUNBa0xtVmhZMmdvZEdocGN5d2dablZ1WTNScGIyNG9heXgyS1NCN1hISmNiaUFnSUNBZ0lDQWdhV1lnS0NGZmFYTkdkVzVqZEdsdmJpaDJLU2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdhbk52Ymx0clhTQTlJSFk3WEhKY2JpQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQjlLVHRjY2x4dUlDQWdJQ0FnY21WMGRYSnVJR3B6YjI0N1hISmNiaUFnSUNCOUxGeHlYRzVjY2x4dUlDQWdJQzh2SUZKbGJtUmxjbk1nWVNCemFXMXdiR1VnU0ZSTlRDQjJaWEp6YVc5dUlHOW1JSFJvYVhNZ1QySnFaV04wY3lCaGRIUnlhV0oxZEdWekxseHlYRzRnSUNBZ0x5OGdSRzlsY3lCdWIzUWdjbVZ1WkdWeUlHWjFibU4wYVc5dWN5NWNjbHh1SUNBZ0lDOHZJRVp2Y2lCbGVHRnRjR3hsTGlCSGFYWmxiaUIwYUdseklGTmhiVzE1TGs5aWFtVmpkRHBjY2x4dUlDQWdJQzh2WEhKY2JpQWdJQ0F2THlBZ0lDQWdkbUZ5SUhNZ1BTQnVaWGNnVTJGdGJYa3VUMkpxWldOMEtIdG1hWEp6ZEY5dVlXMWxPaUFuVTJGdGJYa25MQ0JzWVhOMFgyNWhiV1U2SUNkRVlYWnBjeUJLY2k0bmZTazdYSEpjYmlBZ0lDQXZMeUFnSUNBZ2N5NTBiMGhVVFV3b0tWeHlYRzRnSUNBZ0x5OGdJQ0FnSUM4dlBUNGdKenh6ZEhKdmJtYytabWx5YzNSZmJtRnRaVHd2YzNSeWIyNW5QaUJUWVcxdGVUeGljaUF2UGp4emRISnZibWMrYkdGemRGOXVZVzFsUEM5emRISnZibWMrSUVSaGRtbHpJRXB5TGp4aWNpQXZQaWRjY2x4dUlDQWdJQzh2WEhKY2JpQWdJQ0IwYjBoVVRVdzZJR1oxYm1OMGFXOXVLQ2tnZTF4eVhHNGdJQ0FnSUNCMllYSWdaR2x6Y0d4aGVTQTlJRndpWENJN1hISmNiaUFnSUNBZ0lDUXVaV0ZqYUNoMGFHbHpMQ0JtZFc1amRHbHZiaWhyTENCMktTQjdYSEpjYmlBZ0lDQWdJQ0FnYVdZZ0tDRmZhWE5HZFc1amRHbHZiaWgyS1NrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnWkdsemNHeGhlU0FyUFNCY0lqeHpkSEp2Ym1jK1hDSWdLeUJySUNzZ1hDSThMM04wY205dVp6NGdYQ0lnS3lCMklDc2dYQ0k4WW5JZ0x6NWNJanRjY2x4dUlDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lIMHBPMXh5WEc0Z0lDQWdJQ0J5WlhSMWNtNGdaR2x6Y0d4aGVUdGNjbHh1SUNBZ0lIMHNYSEpjYmx4eVhHNGdJQ0FnTHk4Z1VtVjBkWEp1Y3lCaGJpQmhjbkpoZVNCdlppQnJaWGx6SUdadmNpQjBhR2x6SUc5aWFtVmpkQzRnU1dZZ1lHRjBkSEpwWW5WMFpYTmZiMjVzZVdCY2NseHVJQ0FnSUM4dklHbHpJSFJ5ZFdVZ2QybHNiQ0J1YjNRZ2NtVjBkWEp1SUd0bGVYTWdkR2hoZENCdFlYQWdkRzhnWVNCZ1puVnVZM1JwYjI0b0tXQmNjbHh1SUNBZ0lHdGxlWE02SUdaMWJtTjBhVzl1S0dGMGRISnBZblYwWlhOZmIyNXNlU2tnZTF4eVhHNGdJQ0FnSUNCMllYSWdhMlY1Y3lBOUlGdGRPMXh5WEc0Z0lDQWdJQ0JtYjNJZ0tIWmhjaUJ3Y205d1pYSjBlU0JwYmlCMGFHbHpLU0I3WEhKY2JpQWdJQ0FnSUNBZ2FXWWdLQ0ZmYVhOR2RXNWpkR2x2YmloMGFHbHpXM0J5YjNCbGNuUjVYU2tnZkh3Z0lXRjBkSEpwWW5WMFpYTmZiMjVzZVNrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnYTJWNWN5NXdkWE5vS0hCeWIzQmxjblI1S1R0Y2NseHVJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnY21WMGRYSnVJR3RsZVhNN1hISmNiaUFnSUNCOUxGeHlYRzVjY2x4dUlDQWdJQzh2SUVOb1pXTnJjeUJwWmlCMGFHVWdiMkpxWldOMElHaGhjeUJoSUhaaGJIVmxJR0YwSUdCclpYbGdJR0Z1WkNCMGFHRjBJSFJvWlNCMllXeDFaU0JwY3lCdWIzUWdaVzF3ZEhsY2NseHVJQ0FnSUdoaGN6b2dablZ1WTNScGIyNG9hMlY1S1NCN1hISmNiaUFnSUNBZ0lISmxkSFZ5YmlCMGFHbHpXMnRsZVYwZ0ppWWdKQzUwY21sdEtIUm9hWE5iYTJWNVhTNTBiMU4wY21sdVp5Z3BLU0FoUFQwZ0p5YzdYSEpjYmlBZ0lDQjlMRnh5WEc1Y2NseHVJQ0FnSUM4dklHTnZiblpsYm1sbGJtTmxJRzFsZEdodlpDQjBieUJxYjJsdUlHRnpJRzFoYm5rZ1lYSm5kVzFsYm5SeklHRnpJSGx2ZFNCM1lXNTBYSEpjYmlBZ0lDQXZMeUJpZVNCMGFHVWdabWx5YzNRZ1lYSm5kVzFsYm5RZ0xTQjFjMlZtZFd3Z1ptOXlJRzFoYTJsdVp5QndZWFJvYzF4eVhHNGdJQ0FnYW05cGJqb2dablZ1WTNScGIyNG9LU0I3WEhKY2JpQWdJQ0FnSUhaaGNpQmhjbWR6SUQwZ1gyMWhhMlZCY25KaGVTaGhjbWQxYldWdWRITXBPMXh5WEc0Z0lDQWdJQ0IyWVhJZ1pHVnNhVzFwZEdWeUlEMGdZWEpuY3k1emFHbG1kQ2dwTzF4eVhHNGdJQ0FnSUNCeVpYUjFjbTRnWVhKbmN5NXFiMmx1S0dSbGJHbHRhWFJsY2lrN1hISmNiaUFnSUNCOUxGeHlYRzVjY2x4dUlDQWdJQzh2SUZOb2IzSjBZM1YwSUhSdklGTmhiVzE1TG14dloxeHlYRzRnSUNBZ2JHOW5PaUJtZFc1amRHbHZiaWdwSUh0Y2NseHVJQ0FnSUNBZ1UyRnRiWGt1Ykc5bkxtRndjR3g1S0ZOaGJXMTVMQ0JoY21kMWJXVnVkSE1wTzF4eVhHNGdJQ0FnZlN4Y2NseHVYSEpjYmlBZ0lDQXZMeUJTWlhSMWNtNXpJR0VnYzNSeWFXNW5JSEpsY0hKbGMyVnVkR0YwYVc5dUlHOW1JSFJvYVhNZ2IySnFaV04wTGx4eVhHNGdJQ0FnTHk4Z2FXWWdZR2x1WTJ4MVpHVmZablZ1WTNScGIyNXpZQ0JwY3lCMGNuVmxMQ0JwZENCM2FXeHNJR0ZzYzI4Z2RHOVRkSEpwYm1jb0tTQjBhR1ZjY2x4dUlDQWdJQzh2SUcxbGRHaHZaSE1nYjJZZ2RHaHBjeUJ2WW1wbFkzUXVJRUo1SUdSbFptRjFiSFFnYjI1c2VTQndjbWx1ZEhNZ2RHaGxJR0YwZEhKcFluVjBaWE11WEhKY2JpQWdJQ0IwYjFOMGNtbHVaem9nWm5WdVkzUnBiMjRvYVc1amJIVmtaVjltZFc1amRHbHZibk1wSUh0Y2NseHVJQ0FnSUNBZ2RtRnlJSE1nUFNCYlhUdGNjbHh1SUNBZ0lDQWdKQzVsWVdOb0tIUm9hWE1zSUdaMWJtTjBhVzl1S0dzc0lIWXBJSHRjY2x4dUlDQWdJQ0FnSUNCcFppQW9JVjlwYzBaMWJtTjBhVzl1S0hZcElIeDhJR2x1WTJ4MVpHVmZablZ1WTNScGIyNXpLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQnpMbkIxYzJnb0oxd2lKeUFySUdzZ0t5QW5YQ0k2SUNjZ0t5QjJMblJ2VTNSeWFXNW5LQ2twTzF4eVhHNGdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdmU2s3WEhKY2JpQWdJQ0FnSUhKbGRIVnliaUJjSWxOaGJXMTVMazlpYW1WamREb2dlMXdpSUNzZ2N5NXFiMmx1S0Njc0p5a2dLeUJjSW4xY0lqdGNjbHh1SUNBZ0lIMWNjbHh1SUNCOUtUdGNjbHh1WEhKY2JseHlYRzRnSUM4dklGSmxkSFZ5YmlCM2FHVjBhR1Z5SUhSb1pTQmxkbVZ1ZENCMFlYSm5aWFJ6SUhSb2FYTWdkMmx1Wkc5M0xseHlYRzRnSUZOaGJXMTVMblJoY21kbGRFbHpWR2hwYzFkcGJtUnZkeUE5SUdaMWJtTjBhVzl1SUhSaGNtZGxkRWx6VkdocGMxZHBibVJ2ZHlobGRtVnVkQ3dnZEdGblRtRnRaU2tnZTF4eVhHNGdJQ0FnZG1GeUlIUmhjbWRsZEVWc1pXMWxiblFnUFNBa0tHVjJaVzUwTG5SaGNtZGxkQ2t1WTJ4dmMyVnpkQ2gwWVdkT1lXMWxLVHRjY2x4dUlDQWdJR2xtSUNoMFlYSm5aWFJGYkdWdFpXNTBMbXhsYm1kMGFDQTlQVDBnTUNrZ2V5QnlaWFIxY200Z2RISjFaVHNnZlZ4eVhHNWNjbHh1SUNBZ0lIWmhjaUIwWVhKblpYUlhhVzVrYjNjZ1BTQjBZWEpuWlhSRmJHVnRaVzUwTG1GMGRISW9KM1JoY21kbGRDY3BPMXh5WEc0Z0lDQWdhV1lnS0NGMFlYSm5aWFJYYVc1a2IzY2dmSHdnZEdGeVoyVjBWMmx1Wkc5M0lEMDlQU0IzYVc1a2IzY3VibUZ0WlNCOGZDQjBZWEpuWlhSWGFXNWtiM2NnUFQwOUlDZGZjMlZzWmljcElIc2djbVYwZFhKdUlIUnlkV1U3SUgxY2NseHVJQ0FnSUdsbUlDaDBZWEpuWlhSWGFXNWtiM2NnUFQwOUlDZGZZbXhoYm1zbktTQjdJSEpsZEhWeWJpQm1ZV3h6WlRzZ2ZWeHlYRzRnSUNBZ2FXWWdLSFJoY21kbGRGZHBibVJ2ZHlBOVBUMGdKM1J2Y0NjZ0ppWWdkMmx1Wkc5M0lEMDlQU0IzYVc1a2IzY3VkRzl3S1NCN0lISmxkSFZ5YmlCMGNuVmxPeUI5WEhKY2JpQWdJQ0J5WlhSMWNtNGdabUZzYzJVN1hISmNiaUFnZlR0Y2NseHVYSEpjYmx4eVhHNGdJQzh2SUZSb1pTQkVaV1poZFd4MFRHOWpZWFJwYjI1UWNtOTRlU0JwY3lCMGFHVWdaR1ZtWVhWc2RDQnNiMk5oZEdsdmJpQndjbTk0ZVNCbWIzSWdZV3hzSUZOaGJXMTVJR0Z3Y0d4cFkyRjBhVzl1Y3k1Y2NseHVJQ0F2THlCQklHeHZZMkYwYVc5dUlIQnliM2g1SUdseklHRWdjSEp2ZEc5MGVYQmxJSFJvWVhRZ1kyOXVabTl5YlhNZ2RHOGdZU0J6YVcxd2JHVWdhVzUwWlhKbVlXTmxMaUJVYUdVZ2NIVnljRzl6WlZ4eVhHNGdJQzh2SUc5bUlHRWdiRzlqWVhScGIyNGdjSEp2ZUhrZ2FYTWdkRzhnYm05MGFXWjVJSFJvWlNCVFlXMXRlUzVCY0hCc2FXTmhkR2x2YmlCcGRITWdZbTkxYm1RZ2RHOGdkMmhsYmlCMGFHVWdiRzlqWVhScGIyNWNjbHh1SUNBdkx5QnZjaUFuWlhoMFpYSnVZV3dnYzNSaGRHVW5JR05vWVc1blpYTXVYSEpjYmlBZ0x5OWNjbHh1SUNBdkx5QlVhR1VnWUVSbFptRjFiSFJNYjJOaGRHbHZibEJ5YjNoNVlDQjNZWFJqYUdWeklHWnZjaUJqYUdGdVoyVnpJSFJ2SUhSb1pTQndZWFJvSUc5bUlIUm9aU0JqZFhKeVpXNTBJSGRwYm1SdmR5QmhibVJjY2x4dUlDQXZMeUJwY3lCaGJITnZJR0ZpYkdVZ2RHOGdjMlYwSUhSb1pTQndZWFJvSUdKaGMyVmtJRzl1SUdOb1lXNW5aWE1nYVc0Z2RHaGxJR0Z3Y0d4cFkyRjBhVzl1TGlCSmRDQmtiMlZ6SUhSb2FYTWdZbmxjY2x4dUlDQXZMeUIxYzJsdVp5QmthV1ptWlhKbGJuUWdiV1YwYUc5a2N5QmtaWEJsYm1ScGJtY2diMjRnZDJoaGRDQnBjeUJoZG1GcGJHRmliR1VnYVc0Z2RHaGxJR04xY25KbGJuUWdZbkp2ZDNObGNpNGdTVzVjY2x4dUlDQXZMeUIwYUdVZ2JHRjBaWE4wSUdGdVpDQm5jbVZoZEdWemRDQmljbTkzYzJWeWN5QnBkQ0IxYzJWa0lIUm9aU0JJVkUxTU5TQklhWE4wYjNKNUlFRlFTU0JoYm1RZ2RHaGxJR0J3ZFhOb1UzUmhkR1ZnWEhKY2JpQWdMeThnWUhCdmNGTjBZWFJsWUNCbGRtVnVkSE12YldWMGFHOWtjeTRnVkdocGN5QmhiR3h2ZDNNZ2VXOTFJSFJ2SUhWelpTQlRZVzF0ZVNCMGJ5QnpaWEoyWlNCaElITnBkR1VnWW1Wb2FXNWtJRzV2Y20xaGJGeHlYRzRnSUM4dklGVlNTU0J3WVhSb2N5QmhjeUJ2Y0hCdmMyVmtJSFJ2SUhSb1pTQnZiR1JsY2lCa1pXWmhkV3gwSUc5bUlHaGhjMmdnS0NNcElHSmhjMlZrSUhKdmRYUnBibWN1SUVKbFkyRjFjMlVnZEdobElITmxjblpsY2x4eVhHNGdJQzh2SUdOaGJpQnBiblJsY25CeVpYUWdkR2hsSUdOb1lXNW5aV1FnY0dGMGFDQnZiaUJoSUhKbFpuSmxjMmdnYjNJZ2NtVXRaVzUwY25rc0lIUm9iM1ZuYUN3Z2FYUWdjbVZ4ZFdseVpYTWdZV1JrYVhScGIyNWhiRnh5WEc0Z0lDOHZJSE4xY0hCdmNuUWdiMjRnZEdobElITmxjblpsY2lCemFXUmxMaUJKWmlCNWIzVW5aQ0JzYVd0bElIUnZJR1p2Y21ObElHUnBjMkZpYkdVZ1NGUk5URFVnYUdsemRHOXllU0J6ZFhCd2IzSjBMQ0J3YkdWaGMyVmNjbHh1SUNBdkx5QjFjMlVnZEdobElHQmthWE5oWW14bFgzQjFjMmhmYzNSaGRHVmdJSE5sZEhScGJtY2diMjRnWUZOaGJXMTVMa0Z3Y0d4cFkyRjBhVzl1WUM0Z1NXWWdjSFZ6YUZOMFlYUmxJSE4xY0hCdmNuUmNjbHh1SUNBdkx5QnBjeUJsYm1GaWJHVmtMQ0JnUkdWbVlYVnNkRXh2WTJGMGFXOXVVSEp2ZUhsZ0lHRnNjMjhnWW1sdVpITWdkRzhnWVd4c0lHeHBibXR6SUc5dUlIUm9aU0J3WVdkbExpQkpaaUJoSUd4cGJtc2dhWE1nWTJ4cFkydGxaRnh5WEc0Z0lDOHZJSFJvWVhRZ2JXRjBZMmhsY3lCMGFHVWdZM1Z5Y21WdWRDQnpaWFFnYjJZZ2NtOTFkR1Z6TENCMGFHVWdWVkpNSUdseklHTm9ZVzVuWldRZ2RYTnBibWNnY0hWemFGTjBZWFJsSUdsdWMzUmxZV1FnYjJaY2NseHVJQ0F2THlCbWRXeHNlU0J6WlhSMGFXNW5JSFJvWlNCc2IyTmhkR2x2YmlCaGJtUWdkR2hsSUdGd2NDQnBjeUJ1YjNScFptbGxaQ0J2WmlCMGFHVWdZMmhoYm1kbExseHlYRzRnSUM4dlhISmNiaUFnTHk4Z1NXWWdkR2hsSUdKeWIzZHpaWElnWkc5bGN5QnViM1FnYUdGMlpTQnpkWEJ3YjNKMElHWnZjaUJJVkUxTU5TQklhWE4wYjNKNUxDQmdSR1ZtWVhWc2RFeHZZMkYwYVc5dVVISnZlSGxnSUdGMWRHOXRZWFJwWTJGc2JIbGNjbHh1SUNBdkx5Qm1ZV3hzY3lCaVlXTnJJSFJ2SUhSb1pTQnZiR1JsY2lCb1lYTm9JR0poYzJWa0lISnZkWFJwYm1jdUlGUm9aU0J1WlhkbGMzUWdZbkp2ZDNObGNuTWdLRWxGTENCVFlXWmhjbWtnUGlBMExDQkdSaUErUFNBekxqWXBYSEpjYmlBZ0x5OGdjM1Z3Y0c5eWRDQmhJQ2R2Ym1oaGMyaGphR0Z1WjJVbklFUlBUU0JsZG1WdWRDd2dkR2hoZEhNZ1ptbHlaV1FnZDJobGJtVjJaWElnZEdobElHeHZZMkYwYVc5dUxtaGhjMmdnWTJoaGJtZGxjeTVjY2x4dUlDQXZMeUJKYmlCMGFHbHpJSE5wZEhWaGRHbHZiaUIwYUdVZ1JHVm1ZWFZzZEV4dlkyRjBhVzl1VUhKdmVIa2dhblZ6ZENCaWFXNWtjeUIwYnlCMGFHbHpJR1YyWlc1MElHRnVaQ0JrWld4bFoyRjBaWE1nYVhRZ2RHOWNjbHh1SUNBdkx5QjBhR1VnWVhCd2JHbGpZWFJwYjI0dUlFbHVJSFJvWlNCallYTmxJRzltSUc5c1pHVnlJR0p5YjNkelpYSnpJR0VnY0c5c2JHVnlJR2x6SUhObGRDQjFjQ0IwYnlCMGNtRmpheUJqYUdGdVoyVnpJSFJ2SUhSb1pWeHlYRzRnSUM4dklHaGhjMmd1WEhKY2JpQWdVMkZ0YlhrdVJHVm1ZWFZzZEV4dlkyRjBhVzl1VUhKdmVIa2dQU0JtZFc1amRHbHZiaWhoY0hBc0lISjFibDlwYm5SbGNuWmhiRjlsZG1WeWVTa2dlMXh5WEc0Z0lDQWdkR2hwY3k1aGNIQWdQU0JoY0hBN1hISmNiaUFnSUNBdkx5QnpaWFFnYVhNZ2JtRjBhWFpsSUhSdklHWmhiSE5sSUdGdVpDQnpkR0Z5ZENCMGFHVWdjRzlzYkdWeUlHbHRiV1ZrYVdGMFpXeDVYSEpjYmlBZ0lDQjBhR2x6TG1selgyNWhkR2wyWlNBOUlHWmhiSE5sTzF4eVhHNGdJQ0FnZEdocGN5NW9ZWE5mYUdsemRHOXllU0E5SUY5b1lYTmZhR2x6ZEc5eWVUdGNjbHh1SUNBZ0lIUm9hWE11WDNOMFlYSjBVRzlzYkdsdVp5aHlkVzVmYVc1MFpYSjJZV3hmWlhabGNua3BPMXh5WEc0Z0lIMDdYSEpjYmx4eVhHNGdJRk5oYlcxNUxrUmxabUYxYkhSTWIyTmhkR2x2YmxCeWIzaDVMbVoxYkd4UVlYUm9JRDBnWm5WdVkzUnBiMjRvYkc5allYUnBiMjVmYjJKcUtTQjdYSEpjYmlBZ0lDOHZJRUo1Y0dGemN5QjBhR1VnWUhkcGJtUnZkeTVzYjJOaGRHbHZiaTVvWVhOb1lDQmhkSFJ5YVdKMWRHVXVJQ0JKWmlCaElIRjFaWE4wYVc5dUlHMWhjbXRjY2x4dUlDQWdJQzh2SUdGd2NHVmhjbk1nYVc0Z2RHaGxJR2hoYzJnZ1NVVTJJSGRwYkd3Z2MzUnlhWEFnYVhRZ1lXNWtJR0ZzYkNCdlppQjBhR1VnWm05c2JHOTNhVzVuWEhKY2JpQWdJQ0F2THlCamFHRnlZV04wWlhKeklHWnliMjBnWUhkcGJtUnZkeTVzYjJOaGRHbHZiaTVvWVhOb1lDNWNjbHh1SUNBZ0lIWmhjaUJ0WVhSamFHVnpJRDBnYkc5allYUnBiMjVmYjJKcUxuUnZVM1J5YVc1bktDa3ViV0YwWTJnb0wxNWJYaU5kS2lnakxpc3BKQzhwTzF4eVhHNGdJQ0FnZG1GeUlHaGhjMmdnUFNCdFlYUmphR1Z6SUQ4Z2JXRjBZMmhsYzFzeFhTQTZJQ2NuTzF4eVhHNGdJQ0FnY21WMGRYSnVJRnRzYjJOaGRHbHZibDl2WW1vdWNHRjBhRzVoYldVc0lHeHZZMkYwYVc5dVgyOWlhaTV6WldGeVkyZ3NJR2hoYzJoZExtcHZhVzRvSnljcE8xeHlYRzRnSUgwN1hISmNiaVF1WlhoMFpXNWtLRk5oYlcxNUxrUmxabUYxYkhSTWIyTmhkR2x2YmxCeWIzaDVMbkJ5YjNSdmRIbHdaU0FzSUh0Y2NseHVJQ0FnSUM4dklHSnBibVFnZEdobElIQnliM2g1SUdWMlpXNTBjeUIwYnlCMGFHVWdZM1Z5Y21WdWRDQmhjSEF1WEhKY2JpQWdJQ0JpYVc1a09pQm1kVzVqZEdsdmJpZ3BJSHRjY2x4dUlDQWdJQ0FnZG1GeUlIQnliM2g1SUQwZ2RHaHBjeXdnWVhCd0lEMGdkR2hwY3k1aGNIQXNJR3h3SUQwZ1UyRnRiWGt1UkdWbVlYVnNkRXh2WTJGMGFXOXVVSEp2ZUhrN1hISmNiaUFnSUNBZ0lDUW9kMmx1Wkc5M0tTNWlhVzVrS0Nkb1lYTm9ZMmhoYm1kbExpY2dLeUIwYUdsekxtRndjQzVsZG1WdWRFNWhiV1Z6Y0dGalpTZ3BMQ0JtZFc1amRHbHZiaWhsTENCdWIyNWZibUYwYVhabEtTQjdYSEpjYmlBZ0lDQWdJQ0FnTHk4Z2FXWWdkMlVnY21WalpXbDJaU0JoSUc1aGRHbDJaU0JvWVhOb0lHTm9ZVzVuWlNCbGRtVnVkQ3dnYzJWMElIUm9aU0J3Y205NGVTQmhZMk52Y21ScGJtZHNlVnh5WEc0Z0lDQWdJQ0FnSUM4dklHRnVaQ0J6ZEc5d0lIQnZiR3hwYm1kY2NseHVJQ0FnSUNBZ0lDQnBaaUFvY0hKdmVIa3VhWE5mYm1GMGFYWmxJRDA5UFNCbVlXeHpaU0FtSmlBaGJtOXVYMjVoZEdsMlpTa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ2NISnZlSGt1YVhOZmJtRjBhWFpsSUQwZ2RISjFaVHRjY2x4dUlDQWdJQ0FnSUNBZ0lIZHBibVJ2ZHk1amJHVmhja2x1ZEdWeWRtRnNLR3h3TGw5cGJuUmxjblpoYkNrN1hISmNiaUFnSUNBZ0lDQWdJQ0JzY0M1ZmFXNTBaWEoyWVd3Z1BTQnVkV3hzTzF4eVhHNGdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdJQ0JoY0hBdWRISnBaMmRsY2lnbmJHOWpZWFJwYjI0dFkyaGhibWRsWkNjcE8xeHlYRzRnSUNBZ0lDQjlLVHRjY2x4dUlDQWdJQ0FnYVdZZ0tGOW9ZWE5mYUdsemRHOXllU0FtSmlBaFlYQndMbVJwYzJGaWJHVmZjSFZ6YUY5emRHRjBaU2tnZTF4eVhHNGdJQ0FnSUNBZ0lDOHZJR0pwYm1RZ2RHOGdjRzl3YzNSaGRHVmNjbHh1SUNBZ0lDQWdJQ0FrS0hkcGJtUnZkeWt1WW1sdVpDZ25jRzl3YzNSaGRHVXVKeUFySUhSb2FYTXVZWEJ3TG1WMlpXNTBUbUZ0WlhOd1lXTmxLQ2tzSUdaMWJtTjBhVzl1S0dVcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUdGd2NDNTBjbWxuWjJWeUtDZHNiMk5oZEdsdmJpMWphR0Z1WjJWa0p5azdYSEpjYmlBZ0lDQWdJQ0FnZlNrN1hISmNiaUFnSUNBZ0lDQWdMeThnWW1sdVpDQjBieUJzYVc1cklHTnNhV05yY3lCMGFHRjBJR2hoZG1VZ2NtOTFkR1Z6WEhKY2JpQWdJQ0FnSUNBZ0pDaGtiMk4xYldWdWRDa3VaR1ZzWldkaGRHVW9KMkVuTENBblkyeHBZMnN1YUdsemRHOXllUzBuSUNzZ2RHaHBjeTVoY0hBdVpYWmxiblJPWVcxbGMzQmhZMlVvS1N3Z1puVnVZM1JwYjI0Z0tHVXBJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lHbG1JQ2hsTG1selJHVm1ZWFZzZEZCeVpYWmxiblJsWkNncElIeDhJR1V1YldWMFlVdGxlU0I4ZkNCbExtTjBjbXhMWlhrcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1TzF4eVhHNGdJQ0FnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0FnSUNBZ2RtRnlJR1oxYkd4ZmNHRjBhQ0E5SUd4d0xtWjFiR3hRWVhSb0tIUm9hWE1wTEZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0F2THlCSFpYUWdZVzVqYUc5eUozTWdhRzl6ZENCdVlXMWxJR2x1SUdFZ1kzSnZjM01nWW5KdmQzTmxjaUJqYjIxd1lYUnBZbXhsSUhkaGVTNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0x5OGdTVVVnYkc5dmMyVnpJR2h2YzNSdVlXMWxJSEJ5YjNCbGNuUjVJSGRvWlc0Z2MyVjBkR2x1WnlCb2NtVm1JR2x1SUVwVFhISmNiaUFnSUNBZ0lDQWdJQ0FnSUM4dklIZHBkR2dnWVNCeVpXeGhkR2wyWlNCVlVrd3NJR1V1Wnk0Z1lTNXpaWFJCZEhSeWFXSjFkR1VvSjJoeVpXWW5MRndpTDNkb1lYUmxkbVZ5WENJcExseHlYRzRnSUNBZ0lDQWdJQ0FnSUNBdkx5QkRhWEpqZFcxMlpXNTBJSFJvYVhNZ2NISnZZbXhsYlNCaWVTQmpjbVZoZEdsdVp5QmhJRzVsZHlCc2FXNXJJSGRwZEdnZ1oybDJaVzRnVlZKTUlHRnVaRnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQXZMeUJ4ZFdWeWVXbHVaeUIwYUdGMElHWnZjaUJoSUdodmMzUnVZVzFsTGx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0JvYjNOMGJtRnRaU0E5SUhSb2FYTXVhRzl6ZEc1aGJXVWdQeUIwYUdsekxtaHZjM1J1WVcxbElEb2dablZ1WTNScGIyNGdLR0VwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNCMllYSWdiQ0E5SUdSdlkzVnRaVzUwTG1OeVpXRjBaVVZzWlcxbGJuUW9YQ0poWENJcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lHd3VhSEpsWmlBOUlHRXVhSEpsWmp0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnYkM1b2IzTjBibUZ0WlR0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZlNoMGFHbHpLVHRjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0JwWmlBb2FHOXpkRzVoYldVZ1BUMGdkMmx1Wkc5M0xteHZZMkYwYVc5dUxtaHZjM1J1WVcxbElDWW1YSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdZWEJ3TG14dmIydDFjRkp2ZFhSbEtDZG5aWFFuTENCbWRXeHNYM0JoZEdncElDWW1YSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdVMkZ0YlhrdWRHRnlaMlYwU1hOVWFHbHpWMmx1Wkc5M0tHVXNJQ2RoSnlrcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ1pTNXdjbVYyWlc1MFJHVm1ZWFZzZENncE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCd2NtOTRlUzV6WlhSTWIyTmhkR2x2YmlobWRXeHNYM0JoZEdncE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnWm1Gc2MyVTdYSEpjYmlBZ0lDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lDQWdmU2s3WEhKY2JpQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ2FXWWdLQ0ZzY0M1ZlltbHVaR2x1WjNNcElIdGNjbHh1SUNBZ0lDQWdJQ0JzY0M1ZlltbHVaR2x1WjNNZ1BTQXdPMXh5WEc0Z0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUd4d0xsOWlhVzVrYVc1bmN5c3JPMXh5WEc0Z0lDQWdmU3hjY2x4dVhISmNiaUFnSUNBdkx5QjFibUpwYm1RZ2RHaGxJSEJ5YjNoNUlHVjJaVzUwY3lCbWNtOXRJSFJvWlNCamRYSnlaVzUwSUdGd2NGeHlYRzRnSUNBZ2RXNWlhVzVrT2lCbWRXNWpkR2x2YmlncElIdGNjbHh1SUNBZ0lDQWdKQ2gzYVc1a2IzY3BMblZ1WW1sdVpDZ25hR0Z6YUdOb1lXNW5aUzRuSUNzZ2RHaHBjeTVoY0hBdVpYWmxiblJPWVcxbGMzQmhZMlVvS1NrN1hISmNiaUFnSUNBZ0lDUW9kMmx1Wkc5M0tTNTFibUpwYm1Rb0ozQnZjSE4wWVhSbExpY2dLeUIwYUdsekxtRndjQzVsZG1WdWRFNWhiV1Z6Y0dGalpTZ3BLVHRjY2x4dUlDQWdJQ0FnSkNoa2IyTjFiV1Z1ZENrdWRXNWtaV3hsWjJGMFpTZ25ZU2NzSUNkamJHbGpheTVvYVhOMGIzSjVMU2NnS3lCMGFHbHpMbUZ3Y0M1bGRtVnVkRTVoYldWemNHRmpaU2dwS1R0Y2NseHVJQ0FnSUNBZ1UyRnRiWGt1UkdWbVlYVnNkRXh2WTJGMGFXOXVVSEp2ZUhrdVgySnBibVJwYm1kekxTMDdYSEpjYmlBZ0lDQWdJR2xtSUNoVFlXMXRlUzVFWldaaGRXeDBURzlqWVhScGIyNVFjbTk0ZVM1ZlltbHVaR2x1WjNNZ1BEMGdNQ2tnZTF4eVhHNGdJQ0FnSUNBZ0lIZHBibVJ2ZHk1amJHVmhja2x1ZEdWeWRtRnNLRk5oYlcxNUxrUmxabUYxYkhSTWIyTmhkR2x2YmxCeWIzaDVMbDlwYm5SbGNuWmhiQ2s3WEhKY2JpQWdJQ0FnSUNBZ1UyRnRiWGt1UkdWbVlYVnNkRXh2WTJGMGFXOXVVSEp2ZUhrdVgybHVkR1Z5ZG1Gc0lEMGdiblZzYkR0Y2NseHVJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ2ZTeGNjbHh1WEhKY2JpQWdJQ0F2THlCblpYUWdkR2hsSUdOMWNuSmxiblFnYkc5allYUnBiMjRnWm5KdmJTQjBhR1VnYUdGemFDNWNjbHh1SUNBZ0lHZGxkRXh2WTJGMGFXOXVPaUJtZFc1amRHbHZiaWdwSUh0Y2NseHVJQ0FnSUNBZ2NtVjBkWEp1SUZOaGJXMTVMa1JsWm1GMWJIUk1iMk5oZEdsdmJsQnliM2g1TG1aMWJHeFFZWFJvS0hkcGJtUnZkeTVzYjJOaGRHbHZiaWs3WEhKY2JpQWdJQ0I5TEZ4eVhHNWNjbHh1SUNBZ0lDOHZJSE5sZENCMGFHVWdZM1Z5Y21WdWRDQnNiMk5oZEdsdmJpQjBieUJnYm1WM1gyeHZZMkYwYVc5dVlGeHlYRzRnSUNBZ2MyVjBURzlqWVhScGIyNDZJR1oxYm1OMGFXOXVLRzVsZDE5c2IyTmhkR2x2YmlrZ2UxeHlYRzRnSUNBZ0lDQnBaaUFvTDE0b1cxNGpYRnd2WFh3a0tTOHVkR1Z6ZENodVpYZGZiRzlqWVhScGIyNHBLU0I3SUM4dklHNXZiaTF3Y21WbWFYaGxaQ0IxY214Y2NseHVJQ0FnSUNBZ0lDQnBaaUFvWDJoaGMxOW9hWE4wYjNKNUlDWW1JQ0YwYUdsekxtRndjQzVrYVhOaFlteGxYM0IxYzJoZmMzUmhkR1VwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJRzVsZDE5c2IyTmhkR2x2YmlBOUlDY3ZKeUFySUc1bGQxOXNiMk5oZEdsdmJqdGNjbHh1SUNBZ0lDQWdJQ0I5SUdWc2MyVWdlMXh5WEc0Z0lDQWdJQ0FnSUNBZ2JtVjNYMnh2WTJGMGFXOXVJRDBnSnlNaEx5Y2dLeUJ1WlhkZmJHOWpZWFJwYjI0N1hISmNiaUFnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUdsbUlDaHVaWGRmYkc5allYUnBiMjRnSVQwZ2RHaHBjeTVuWlhSTWIyTmhkR2x2YmlncEtTQjdYSEpjYmlBZ0lDQWdJQ0FnTHk4Z1NGUk5URFVnU0dsemRHOXllU0JsZUdsemRITWdZVzVrSUc1bGQxOXNiMk5oZEdsdmJpQnBjeUJoSUdaMWJHd2djR0YwYUZ4eVhHNGdJQ0FnSUNBZ0lHbG1JQ2hmYUdGelgyaHBjM1J2Y25rZ0ppWWdJWFJvYVhNdVlYQndMbVJwYzJGaWJHVmZjSFZ6YUY5emRHRjBaU0FtSmlBdlhseGNMeTh1ZEdWemRDaHVaWGRmYkc5allYUnBiMjRwS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0JvYVhOMGIzSjVMbkIxYzJoVGRHRjBaU2g3SUhCaGRHZzZJRzVsZDE5c2IyTmhkR2x2YmlCOUxDQjNhVzVrYjNjdWRHbDBiR1VzSUc1bGQxOXNiMk5oZEdsdmJpazdYSEpjYmlBZ0lDQWdJQ0FnSUNCMGFHbHpMbUZ3Y0M1MGNtbG5aMlZ5S0Nkc2IyTmhkR2x2YmkxamFHRnVaMlZrSnlrN1hISmNiaUFnSUNBZ0lDQWdmU0JsYkhObElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUFvZDJsdVpHOTNMbXh2WTJGMGFXOXVJRDBnYm1WM1gyeHZZMkYwYVc5dUtUdGNjbHh1SUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUgxY2NseHVJQ0FnSUgwc1hISmNibHh5WEc0Z0lDQWdYM04wWVhKMFVHOXNiR2x1WnpvZ1puVnVZM1JwYjI0b1pYWmxjbmtwSUh0Y2NseHVJQ0FnSUNBZ0x5OGdjMlYwSUhWd0lHbHVkR1Z5ZG1Gc1hISmNiaUFnSUNBZ0lIWmhjaUJ3Y205NGVTQTlJSFJvYVhNN1hISmNiaUFnSUNBZ0lHbG1JQ2doVTJGdGJYa3VSR1ZtWVhWc2RFeHZZMkYwYVc5dVVISnZlSGt1WDJsdWRHVnlkbUZzS1NCN1hISmNiaUFnSUNBZ0lDQWdhV1lnS0NGbGRtVnllU2tnZXlCbGRtVnllU0E5SURFd095QjlYSEpjYmlBZ0lDQWdJQ0FnZG1GeUlHaGhjMmhEYUdWamF5QTlJR1oxYm1OMGFXOXVLQ2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdkbUZ5SUdOMWNuSmxiblJmYkc5allYUnBiMjRnUFNCd2NtOTRlUzVuWlhSTWIyTmhkR2x2YmlncE8xeHlYRzRnSUNBZ0lDQWdJQ0FnYVdZZ0tIUjVjR1Z2WmlCVFlXMXRlUzVFWldaaGRXeDBURzlqWVhScGIyNVFjbTk0ZVM1ZmJHRnpkRjlzYjJOaGRHbHZiaUE5UFNBbmRXNWtaV1pwYm1Wa0p5QjhmRnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQmpkWEp5Wlc1MFgyeHZZMkYwYVc5dUlDRTlJRk5oYlcxNUxrUmxabUYxYkhSTWIyTmhkR2x2YmxCeWIzaDVMbDlzWVhOMFgyeHZZMkYwYVc5dUtTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIZHBibVJ2ZHk1elpYUlVhVzFsYjNWMEtHWjFibU4wYVc5dUtDa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ1FvZDJsdVpHOTNLUzUwY21sbloyVnlLQ2RvWVhOb1kyaGhibWRsSnl3Z1czUnlkV1ZkS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZlN3Z01DazdYSEpjYmlBZ0lDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lDQWdJQ0JUWVcxdGVTNUVaV1poZFd4MFRHOWpZWFJwYjI1UWNtOTRlUzVmYkdGemRGOXNiMk5oZEdsdmJpQTlJR04xY25KbGJuUmZiRzlqWVhScGIyNDdYSEpjYmlBZ0lDQWdJQ0FnZlR0Y2NseHVJQ0FnSUNBZ0lDQm9ZWE5vUTJobFkyc29LVHRjY2x4dUlDQWdJQ0FnSUNCVFlXMXRlUzVFWldaaGRXeDBURzlqWVhScGIyNVFjbTk0ZVM1ZmFXNTBaWEoyWVd3Z1BTQjNhVzVrYjNjdWMyVjBTVzUwWlhKMllXd29hR0Z6YUVOb1pXTnJMQ0JsZG1WeWVTazdYSEpjYmlBZ0lDQWdJSDFjY2x4dUlDQWdJSDFjY2x4dUlDQjlLVHRjY2x4dVhISmNibHh5WEc0Z0lDOHZJRk5oYlcxNUxrRndjR3hwWTJGMGFXOXVJR2x6SUhSb1pTQkNZWE5sSUhCeWIzUnZkSGx3WlNCbWIzSWdaR1ZtYVc1cGJtY2dKMkZ3Y0d4cFkyRjBhVzl1Y3ljdVhISmNiaUFnTHk4Z1FXNGdKMkZ3Y0d4cFkyRjBhVzl1SnlCcGN5QmhJR052Ykd4bFkzUnBiMjRnYjJZZ0ozSnZkWFJsY3ljZ1lXNWtJR0p2ZFc1a0lHVjJaVzUwY3lCMGFHRjBJR2x6WEhKY2JpQWdMeThnWVhSMFlXTm9aV1FnZEc4Z1lXNGdaV3hsYldWdWRDQjNhR1Z1SUdCeWRXNG9LV0FnYVhNZ1kyRnNiR1ZrTGx4eVhHNGdJQzh2SUZSb1pTQnZibXg1SUdGeVozVnRaVzUwSUdGdUlDZGhjSEJmWm5WdVkzUnBiMjRuSUdseklHVjJZV3gxWVhSbFpDQjNhWFJvYVc0Z2RHaGxJR052Ym5SbGVIUWdiMllnZEdobElHRndjR3hwWTJGMGFXOXVMbHh5WEc0Z0lGTmhiVzE1TGtGd2NHeHBZMkYwYVc5dUlEMGdablZ1WTNScGIyNG9ZWEJ3WDJaMWJtTjBhVzl1S1NCN1hISmNiaUFnSUNCMllYSWdZWEJ3SUQwZ2RHaHBjenRjY2x4dUlDQWdJSFJvYVhNdWNtOTFkR1Z6SUNBZ0lDQWdJQ0FnSUNBZ1BTQjdmVHRjY2x4dUlDQWdJSFJvYVhNdWJHbHpkR1Z1WlhKeklDQWdJQ0FnSUNBZ1BTQnVaWGNnVTJGdGJYa3VUMkpxWldOMEtIdDlLVHRjY2x4dUlDQWdJSFJvYVhNdVlYSnZkVzVrY3lBZ0lDQWdJQ0FnSUNBZ1BTQmJYVHRjY2x4dUlDQWdJSFJvYVhNdVltVm1iM0psY3lBZ0lDQWdJQ0FnSUNBZ1BTQmJYVHRjY2x4dUlDQWdJQzh2SUdkbGJtVnlZWFJsSUdFZ2RXNXBjWFZsSUc1aGJXVnpjR0ZqWlZ4eVhHNGdJQ0FnZEdocGN5NXVZVzFsYzNCaFkyVWdJQ0FnSUNBZ0lDQTlJQ2h1WlhjZ1JHRjBaU2dwS1M1blpYUlVhVzFsS0NrZ0t5QW5MU2NnS3lCd1lYSnpaVWx1ZENoTllYUm9MbkpoYm1SdmJTZ3BJQ29nTVRBd01Dd2dNVEFwTzF4eVhHNGdJQ0FnZEdocGN5NWpiMjUwWlhoMFgzQnliM1J2ZEhsd1pTQTlJR1oxYm1OMGFXOXVLQ2tnZXlCVFlXMXRlUzVGZG1WdWRFTnZiblJsZUhRdVlYQndiSGtvZEdocGN5d2dZWEpuZFcxbGJuUnpLVHNnZlR0Y2NseHVJQ0FnSUhSb2FYTXVZMjl1ZEdWNGRGOXdjbTkwYjNSNWNHVXVjSEp2ZEc5MGVYQmxJRDBnYm1WM0lGTmhiVzE1TGtWMlpXNTBRMjl1ZEdWNGRDZ3BPMXh5WEc1Y2NseHVJQ0FnSUdsbUlDaGZhWE5HZFc1amRHbHZiaWhoY0hCZlpuVnVZM1JwYjI0cEtTQjdYSEpjYmlBZ0lDQWdJR0Z3Y0Y5bWRXNWpkR2x2Ymk1aGNIQnNlU2gwYUdsekxDQmJkR2hwYzEwcE8xeHlYRzRnSUNBZ2ZWeHlYRzRnSUNBZ0x5OGdjMlYwSUhSb1pTQnNiMk5oZEdsdmJpQndjbTk0ZVNCcFppQnViM1FnWkdWbWFXNWxaQ0IwYnlCMGFHVWdaR1ZtWVhWc2RDQW9SR1ZtWVhWc2RFeHZZMkYwYVc5dVVISnZlSGtwWEhKY2JpQWdJQ0JwWmlBb0lYUm9hWE11WDJ4dlkyRjBhVzl1WDNCeWIzaDVLU0I3WEhKY2JpQWdJQ0FnSUhSb2FYTXVjMlYwVEc5allYUnBiMjVRY205NGVTaHVaWGNnVTJGdGJYa3VSR1ZtWVhWc2RFeHZZMkYwYVc5dVVISnZlSGtvZEdocGN5d2dkR2hwY3k1eWRXNWZhVzUwWlhKMllXeGZaWFpsY25rcEtUdGNjbHh1SUNBZ0lIMWNjbHh1SUNBZ0lHbG1JQ2gwYUdsekxtUmxZblZuS1NCN1hISmNiaUFnSUNBZ0lIUm9hWE11WW1sdVpGUnZRV3hzUlhabGJuUnpLR1oxYm1OMGFXOXVLR1VzSUdSaGRHRXBJSHRjY2x4dUlDQWdJQ0FnSUNCaGNIQXViRzluS0dGd2NDNTBiMU4wY21sdVp5Z3BMQ0JsTG1Oc1pXRnVaV1JmZEhsd1pTd2daR0YwWVNCOGZDQjdmU2s3WEhKY2JpQWdJQ0FnSUgwcE8xeHlYRzRnSUNBZ2ZWeHlYRzRnSUgwN1hISmNibHh5WEc0Z0lGTmhiVzE1TGtGd2NHeHBZMkYwYVc5dUxuQnliM1J2ZEhsd1pTQTlJQ1F1WlhoMFpXNWtLSHQ5TENCVFlXMXRlUzVQWW1wbFkzUXVjSEp2ZEc5MGVYQmxMQ0I3WEhKY2JseHlYRzRnSUNBZ0x5OGdkR2hsSUdadmRYSWdjbTkxZEdVZ2RtVnlZbk5jY2x4dUlDQWdJRkpQVlZSRlgxWkZVa0pUT2lCYkoyZGxkQ2NzSjNCdmMzUW5MQ2R3ZFhRbkxDZGtaV3hsZEdVblhTeGNjbHh1WEhKY2JpQWdJQ0F2THlCQmJpQmhjbkpoZVNCdlppQjBhR1VnWkdWbVlYVnNkQ0JsZG1WdWRITWdkSEpwWjJkbGNtVmtJR0o1SUhSb1pWeHlYRzRnSUNBZ0x5OGdZWEJ3YkdsallYUnBiMjRnWkhWeWFXNW5JR2wwY3lCc2FXWmxZM2xqYkdWY2NseHVJQ0FnSUVGUVVGOUZWa1ZPVkZNNklGc25jblZ1Snl3Z0ozVnViRzloWkNjc0lDZHNiMjlyZFhBdGNtOTFkR1VuTENBbmNuVnVMWEp2ZFhSbEp5d2dKM0p2ZFhSbExXWnZkVzVrSnl3Z0oyVjJaVzUwTFdOdmJuUmxlSFF0WW1WbWIzSmxKeXdnSjJWMlpXNTBMV052Ym5SbGVIUXRZV1owWlhJbkxDQW5ZMmhoYm1kbFpDY3NJQ2RsY25KdmNpY3NJQ2RqYUdWamF5MW1iM0p0TFhOMVltMXBjM05wYjI0bkxDQW5jbVZrYVhKbFkzUW5MQ0FuYkc5allYUnBiMjR0WTJoaGJtZGxaQ2RkTEZ4eVhHNWNjbHh1SUNBZ0lGOXNZWE4wWDNKdmRYUmxPaUJ1ZFd4c0xGeHlYRzRnSUNBZ1gyeHZZMkYwYVc5dVgzQnliM2g1T2lCdWRXeHNMRnh5WEc0Z0lDQWdYM0oxYm01cGJtYzZJR1poYkhObExGeHlYRzVjY2x4dUlDQWdJQzh2SUVSbFptbHVaWE1nZDJoaGRDQmxiR1Z0Wlc1MElIUm9aU0JoY0hCc2FXTmhkR2x2YmlCcGN5QmliM1Z1WkNCMGJ5NGdVSEp2ZG1sa1pTQmhJSE5sYkdWamRHOXlYSEpjYmlBZ0lDQXZMeUFvY0dGeWMyVmhZbXhsSUdKNUlHQnFVWFZsY25rb0tXQXBJR0Z1WkNCMGFHbHpJSGRwYkd3Z1ltVWdkWE5sWkNCaWVTQmdKR1ZzWlcxbGJuUW9LV0JjY2x4dUlDQWdJR1ZzWlcxbGJuUmZjMlZzWldOMGIzSTZJQ2RpYjJSNUp5eGNjbHh1WEhKY2JpQWdJQ0F2THlCWGFHVnVJSE5sZENCMGJ5QjBjblZsTENCc2IyZHpJR0ZzYkNCdlppQjBhR1VnWkdWbVlYVnNkQ0JsZG1WdWRITWdkWE5wYm1jZ1lHeHZaeWdwWUZ4eVhHNGdJQ0FnWkdWaWRXYzZJR1poYkhObExGeHlYRzVjY2x4dUlDQWdJQzh2SUZkb1pXNGdjMlYwSUhSdklIUnlkV1VzSUdGdVpDQjBhR1VnWlhKeWIzSW9LU0JvWVc1a2JHVnlJR2x6SUc1dmRDQnZkbVZ5Y21sa1pHVnVMQ0IzYVd4c0lHRmpkSFZoYkd4NVhISmNiaUFnSUNBdkx5QnlZV2x6WlNCS1V5Qmxjbkp2Y25NZ2FXNGdjbTkxZEdWeklDZzFNREFwSUdGdVpDQjNhR1Z1SUhKdmRYUmxjeUJqWVc0bmRDQmlaU0JtYjNWdVpDQW9OREEwS1Z4eVhHNGdJQ0FnY21GcGMyVmZaWEp5YjNKek9pQm1ZV3h6WlN4Y2NseHVYSEpjYmlBZ0lDQXZMeUJVYUdVZ2RHbHRaU0JwYmlCdGFXeHNhWE5sWTI5dVpITWdkR2hoZENCMGFHVWdWVkpNSUdseklIRjFaWEpwWldRZ1ptOXlJR05vWVc1blpYTmNjbHh1SUNBZ0lISjFibDlwYm5SbGNuWmhiRjlsZG1WeWVUb2dOVEFzWEhKY2JseHlYRzRnSUNBZ0x5OGdhV1lnZFhOcGJtY2dkR2hsSUdCRVpXWmhkV3gwVEc5allYUnBiMjVRY205NGVXQWdjMlYwZEdsdVp5QjBhR2x6SUhSdklIUnlkV1VnZDJsc2JDQm1iM0pqWlNCMGFHVWdZWEJ3SUhSdklIVnpaVnh5WEc0Z0lDQWdMeThnZEhKaFpHbDBhVzl1WVd3Z2FHRnphQ0JpWVhObFpDQnliM1YwYVc1bklHRnpJRzl3Y0c5elpXUWdkRzhnZEdobElHNWxkeUJJVkUxTU5TQlFkWE5vVTNSaGRHVWdjM1Z3Y0c5eWRGeHlYRzRnSUNBZ1pHbHpZV0pzWlY5d2RYTm9YM04wWVhSbE9pQm1ZV3h6WlN4Y2NseHVYSEpjYmlBZ0lDQXZMeUJVYUdVZ1pHVm1ZWFZzZENCMFpXMXdiR0YwWlNCbGJtZHBibVVnZEc4Z2RYTmxJSGRvWlc0Z2RYTnBibWNnWUhCaGNuUnBZV3dvS1dBZ2FXNGdZVzVjY2x4dUlDQWdJQzh2SUdCRmRtVnVkRU52Ym5SbGVIUmdMaUJnZEdWdGNHeGhkR1ZmWlc1bmFXNWxZQ0JqWVc0Z1pXbDBhR1Z5SUdKbElHRWdjM1J5YVc1bklIUm9ZWFJjY2x4dUlDQWdJQzh2SUdOdmNuSmxjM0J2Ym1SeklIUnZJSFJvWlNCdVlXMWxJRzltSUdFZ2JXVjBhRzlrTDJobGJIQmxjaUJ2YmlCRmRtVnVkRU52Ym5SbGVIUWdiM0lnYVhRZ1kyRnVJR0psSUdFZ1puVnVZM1JwYjI1Y2NseHVJQ0FnSUM4dklIUm9ZWFFnZEdGclpYTWdkSGR2SUdGeVozVnRaVzUwY3l3Z2RHaGxJR052Ym5SbGJuUWdiMllnZEdobElIVnVjbVZ1WkdWeVpXUWdjR0Z5ZEdsaGJDQmhibVFnWVc0Z2IzQjBhVzl1WVd4Y2NseHVJQ0FnSUM4dklFcFRJRzlpYW1WamRDQjBhR0YwSUdOdmJuUmhhVzV6SUdsdWRHVnljRzlzWVhScGIyNGdaR0YwWVM0Z1ZHVnRjR3hoZEdVZ1pXNW5hVzVsSUdseklHOXViSGtnWTJGc2JHVmtMM0psWm1WeWNtVmtYSEpjYmlBZ0lDQXZMeUIwYnlCcFppQjBhR1VnWlhoMFpXNXphVzl1SUc5bUlIUm9aU0J3WVhKMGFXRnNJR2x6SUc1MWJHd2diM0lnZFc1cmJtOTNiaTRnVTJWbElHQndZWEowYVdGc0tDbGdYSEpjYmlBZ0lDQXZMeUJtYjNJZ2JXOXlaU0JwYm1admNtMWhkR2x2Ymx4eVhHNGdJQ0FnZEdWdGNHeGhkR1ZmWlc1bmFXNWxPaUJ1ZFd4c0xGeHlYRzVjY2x4dUlDQWdJQzh2SUM4dlBUNGdVMkZ0YlhrdVFYQndiR2xqWVhScGIyNDZJR0p2WkhsY2NseHVJQ0FnSUhSdlUzUnlhVzVuT2lCbWRXNWpkR2x2YmlncElIdGNjbHh1SUNBZ0lDQWdjbVYwZFhKdUlDZFRZVzF0ZVM1QmNIQnNhV05oZEdsdmJqb25JQ3NnZEdocGN5NWxiR1Z0Wlc1MFgzTmxiR1ZqZEc5eU8xeHlYRzRnSUNBZ2ZTeGNjbHh1WEhKY2JpQWdJQ0F2THlCeVpYUjFjbTV6SUdFZ2FsRjFaWEo1SUc5aWFtVmpkQ0J2WmlCMGFHVWdRWEJ3YkdsallYUnBiMjV6SUdKdmRXNWtJR1ZzWlcxbGJuUXVYSEpjYmlBZ0lDQWtaV3hsYldWdWREb2dablZ1WTNScGIyNG9jMlZzWldOMGIzSXBJSHRjY2x4dUlDQWdJQ0FnY21WMGRYSnVJSE5sYkdWamRHOXlJRDhnSkNoMGFHbHpMbVZzWlcxbGJuUmZjMlZzWldOMGIzSXBMbVpwYm1Rb2MyVnNaV04wYjNJcElEb2dKQ2gwYUdsekxtVnNaVzFsYm5SZmMyVnNaV04wYjNJcE8xeHlYRzRnSUNBZ2ZTeGNjbHh1WEhKY2JpQWdJQ0F2THlCZ2RYTmxLQ2xnSUdseklIUm9aU0JsYm5SeWVTQndiMmx1ZENCbWIzSWdhVzVqYkhWa2FXNW5JRk5oYlcxNUlIQnNkV2RwYm5NdVhISmNiaUFnSUNBdkx5QlVhR1VnWm1seWMzUWdZWEpuZFcxbGJuUWdkRzhnZFhObElITm9iM1ZzWkNCaVpTQmhJR1oxYm1OMGFXOXVLQ2tnZEdoaGRDQnBjeUJsZG1Gc2RXRjBaV1JjY2x4dUlDQWdJQzh2SUdsdUlIUm9aU0JqYjI1MFpYaDBJRzltSUhSb1pTQmpkWEp5Wlc1MElHRndjR3hwWTJGMGFXOXVMQ0JxZFhOMElHeHBhMlVnZEdobElHQmhjSEJmWm5WdVkzUnBiMjVnWEhKY2JpQWdJQ0F2THlCaGNtZDFiV1Z1ZENCMGJ5QjBhR1VnWUZOaGJXMTVMa0Z3Y0d4cFkyRjBhVzl1WUNCamIyNXpkSEoxWTNSdmNpNWNjbHh1SUNBZ0lDOHZYSEpjYmlBZ0lDQXZMeUJCYm5rZ1lXUmthWFJwYjI1aGJDQmhjbWQxYldWdWRITWdZWEpsSUhCaGMzTmxaQ0IwYnlCMGFHVWdZWEJ3SUdaMWJtTjBhVzl1SUhObGNYVmxiblJwWVd4c2VTNWNjbHh1SUNBZ0lDOHZYSEpjYmlBZ0lDQXZMeUJHYjNJZ2JYVmphQ0J0YjNKbElHUmxkR0ZwYkNCaFltOTFkQ0J3YkhWbmFXNXpMQ0JqYUdWamF5QnZkWFE2WEhKY2JpQWdJQ0F2THlCYmFIUjBjRG92TDNOaGJXMTVhbk11YjNKbkwyUnZZM012Y0d4MVoybHVjMTBvYUhSMGNEb3ZMM05oYlcxNWFuTXViM0puTDJSdlkzTXZjR3gxWjJsdWN5bGNjbHh1SUNBZ0lDOHZYSEpjYmlBZ0lDQXZMeUFqSXlNZ1JYaGhiWEJzWlZ4eVhHNGdJQ0FnTHk5Y2NseHVJQ0FnSUM4dklDQWdJQ0FnZG1GeUlFMTVVR3gxWjJsdUlEMGdablZ1WTNScGIyNG9ZWEJ3TENCd2NtVndaVzVrS1NCN1hISmNiaUFnSUNBdkwxeHlYRzRnSUNBZ0x5OGdJQ0FnSUNBZ0lIUm9hWE11YUdWc2NHVnljeWg3WEhKY2JpQWdJQ0F2THlBZ0lDQWdJQ0FnSUNCdGVXaGxiSEJsY2pvZ1puVnVZM1JwYjI0b2RHVjRkQ2tnZTF4eVhHNGdJQ0FnTHk4Z0lDQWdJQ0FnSUNBZ0lDQmhiR1Z5ZENod2NtVndaVzVrSUNzZ1hDSWdYQ0lnS3lCMFpYaDBLVHRjY2x4dUlDQWdJQzh2SUNBZ0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUM4dklDQWdJQ0FnSUNCOUtUdGNjbHh1SUNBZ0lDOHZYSEpjYmlBZ0lDQXZMeUFnSUNBZ0lIMDdYSEpjYmlBZ0lDQXZMMXh5WEc0Z0lDQWdMeThnSUNBZ0lDQjJZWElnWVhCd0lEMGdKQzV6WVcxdGVTaG1kVzVqZEdsdmJpZ3BJSHRjY2x4dUlDQWdJQzh2WEhKY2JpQWdJQ0F2THlBZ0lDQWdJQ0FnZEdocGN5NTFjMlVvVFhsUWJIVm5hVzRzSUNkVWFHbHpJR2x6SUcxNUlIQnNkV2RwYmljcE8xeHlYRzRnSUNBZ0x5OWNjbHh1SUNBZ0lDOHZJQ0FnSUNBZ0lDQjBhR2x6TG1kbGRDZ25JeThuTENCbWRXNWpkR2x2YmlncElIdGNjbHh1SUNBZ0lDOHZJQ0FnSUNBZ0lDQWdJSFJvYVhNdWJYbG9aV3h3WlhJb0oyRnVaQ0JrYjI1MElIbHZkU0JtYjNKblpYUWdhWFFoSnlrN1hISmNiaUFnSUNBdkx5QWdJQ0FnSUNBZ0lDQXZMejArSUVGc1pYSjBjem9nVkdocGN5QnBjeUJ0ZVNCd2JIVm5hVzRnWVc1a0lHUnZiblFnZVc5MUlHWnZjbWRsZENCcGRDRmNjbHh1SUNBZ0lDOHZJQ0FnSUNBZ0lDQjlLVHRjY2x4dUlDQWdJQzh2WEhKY2JpQWdJQ0F2THlBZ0lDQWdJSDBwTzF4eVhHNGdJQ0FnTHk5Y2NseHVJQ0FnSUM4dklFbG1JSEJzZFdkcGJpQnBjeUJ3WVhOelpXUWdZWE1nWVNCemRISnBibWNnYVhRZ1lYTnpkVzFsY3lCNWIzVnlJR0Z5WlNCMGNubHBibWNnZEc4Z2JHOWhaRnh5WEc0Z0lDQWdMeThnVTJGdGJYa3VYQ0pRYkhWbmFXNWNJaTRnVkdocGN5QnBjeUIwYUdVZ2NISmxabVZ5Y21Wa0lIZGhlU0J2WmlCc2IyRmthVzVuSUdOdmNtVWdVMkZ0YlhrZ2NHeDFaMmx1YzF4eVhHNGdJQ0FnTHk4Z1lYTWdhWFFnWVd4c2IzZHpJR1p2Y2lCaVpYUjBaWElnWlhKeWIzSXRiV1Z6YzJGbmFXNW5MbHh5WEc0Z0lDQWdMeTljY2x4dUlDQWdJQzh2SUNNakl5QkZlR0Z0Y0d4bFhISmNiaUFnSUNBdkwxeHlYRzRnSUNBZ0x5OGdJQ0FnSUNBa0xuTmhiVzE1S0daMWJtTjBhVzl1S0NrZ2UxeHlYRzRnSUNBZ0x5OGdJQ0FnSUNBZ0lIUm9hWE11ZFhObEtDZE5kWE4wWVdOb1pTY3BPeUF2THowK0lGTmhiVzE1TGsxMWMzUmhZMmhsWEhKY2JpQWdJQ0F2THlBZ0lDQWdJQ0FnZEdocGN5NTFjMlVvSjFOMGIzSmhaMlVuS1RzZ0x5ODlQaUJUWVcxdGVTNVRkRzl5WVdkbFhISmNiaUFnSUNBdkx5QWdJQ0FnSUgwcE8xeHlYRzRnSUNBZ0x5OWNjbHh1SUNBZ0lIVnpaVG9nWm5WdVkzUnBiMjRvS1NCN1hISmNiaUFnSUNBZ0lDOHZJR1pzWVhSMFpXNGdkR2hsSUdGeVozVnRaVzUwYzF4eVhHNGdJQ0FnSUNCMllYSWdZWEpuY3lBOUlGOXRZV3RsUVhKeVlYa29ZWEpuZFcxbGJuUnpLU3hjY2x4dUlDQWdJQ0FnSUNBZ0lIQnNkV2RwYmlBOUlHRnlaM011YzJocFpuUW9LU3hjY2x4dUlDQWdJQ0FnSUNBZ0lIQnNkV2RwYmw5dVlXMWxJRDBnY0d4MVoybHVJSHg4SUNjbk8xeHlYRzRnSUNBZ0lDQjBjbmtnZTF4eVhHNGdJQ0FnSUNBZ0lHRnlaM011ZFc1emFHbG1kQ2gwYUdsektUdGNjbHh1SUNBZ0lDQWdJQ0JwWmlBb2RIbHdaVzltSUhCc2RXZHBiaUE5UFNBbmMzUnlhVzVuSnlrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnY0d4MVoybHVYMjVoYldVZ1BTQW5VMkZ0YlhrdUp5QXJJSEJzZFdkcGJqdGNjbHh1SUNBZ0lDQWdJQ0FnSUhCc2RXZHBiaUE5SUZOaGJXMTVXM0JzZFdkcGJsMDdYSEpjYmlBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ0lIQnNkV2RwYmk1aGNIQnNlU2gwYUdsekxDQmhjbWR6S1R0Y2NseHVJQ0FnSUNBZ2ZTQmpZWFJqYUNobEtTQjdYSEpjYmlBZ0lDQWdJQ0FnYVdZZ0tIUjVjR1Z2WmlCd2JIVm5hVzRnUFQwOUlDZDFibVJsWm1sdVpXUW5LU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQjBhR2x6TG1WeWNtOXlLRndpVUd4MVoybHVJRVZ5Y205eU9pQmpZV3hzWldRZ2RYTmxLQ2tnWW5WMElIQnNkV2RwYmlBb1hDSWdLeUJ3YkhWbmFXNWZibUZ0WlM1MGIxTjBjbWx1WnlncElDc2dYQ0lwSUdseklHNXZkQ0JrWldacGJtVmtYQ0lzSUdVcE8xeHlYRzRnSUNBZ0lDQWdJSDBnWld4elpTQnBaaUFvSVY5cGMwWjFibU4wYVc5dUtIQnNkV2RwYmlrcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUhSb2FYTXVaWEp5YjNJb1hDSlFiSFZuYVc0Z1JYSnliM0k2SUdOaGJHeGxaQ0IxYzJVb0tTQmlkWFFnSjF3aUlDc2djR3gxWjJsdVgyNWhiV1V1ZEc5VGRISnBibWNvS1NBcklGd2lKeUJwY3lCdWIzUWdZU0JtZFc1amRHbHZibHdpTENCbEtUdGNjbHh1SUNBZ0lDQWdJQ0I5SUdWc2MyVWdlMXh5WEc0Z0lDQWdJQ0FnSUNBZ2RHaHBjeTVsY25KdmNpaGNJbEJzZFdkcGJpQkZjbkp2Y2x3aUxDQmxLVHRjY2x4dUlDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdjbVYwZFhKdUlIUm9hWE03WEhKY2JpQWdJQ0I5TEZ4eVhHNWNjbHh1SUNBZ0lDOHZJRk5sZEhNZ2RHaGxJR3h2WTJGMGFXOXVJSEJ5YjNoNUlHWnZjaUIwYUdVZ1kzVnljbVZ1ZENCaGNIQXVJRUo1SUdSbFptRjFiSFFnZEdocGN5QnBjeUJ6WlhRZ2RHOWNjbHh1SUNBZ0lDOHZJR0VnYm1WM0lHQlRZVzF0ZVM1RVpXWmhkV3gwVEc5allYUnBiMjVRY205NGVXQWdiMjRnYVc1cGRHbGhiR2w2WVhScGIyNHVJRWh2ZDJWMlpYSXNJSGx2ZFNCallXNGdjMlYwWEhKY2JpQWdJQ0F2THlCMGFHVWdiRzlqWVhScGIyNWZjSEp2ZUhrZ2FXNXphV1JsSUhsdmRTZHlaU0JoY0hBZ1puVnVZM1JwYjI0Z2RHOGdaMmwyWlNCNWIzVnlJR0Z3Y0NCaElHTjFjM1J2YlZ4eVhHNGdJQ0FnTHk4Z2JHOWpZWFJwYjI0Z2JXVmphR0Z1YVhOdExpQlRaV1VnWUZOaGJXMTVMa1JsWm1GMWJIUk1iMk5oZEdsdmJsQnliM2g1WUNCaGJtUWdZRk5oYlcxNUxrUmhkR0ZNYjJOaGRHbHZibEJ5YjNoNVlGeHlYRzRnSUNBZ0x5OGdabTl5SUdWNFlXMXdiR1Z6TGx4eVhHNGdJQ0FnTHk5Y2NseHVJQ0FnSUM4dklHQnpaWFJNYjJOaGRHbHZibEJ5YjNoNUtDbGdJSFJoYTJWeklHRnVJR2x1YVhScFlXeHBlbVZrSUd4dlkyRjBhVzl1SUhCeWIzaDVMbHh5WEc0Z0lDQWdMeTljY2x4dUlDQWdJQzh2SUNNakl5QkZlR0Z0Y0d4bFhISmNiaUFnSUNBdkwxeHlYRzRnSUNBZ0x5OGdJQ0FnSUNBZ0lDOHZJSFJ2SUdKcGJtUWdkRzhnWkdGMFlTQnBibk4wWldGa0lHOW1JSFJvWlNCa1pXWmhkV3gwSUdoaGMyZzdYSEpjYmlBZ0lDQXZMeUFnSUNBZ0lDQWdkbUZ5SUdGd2NDQTlJQ1F1YzJGdGJYa29ablZ1WTNScGIyNG9LU0I3WEhKY2JpQWdJQ0F2THlBZ0lDQWdJQ0FnSUNCMGFHbHpMbk5sZEV4dlkyRjBhVzl1VUhKdmVIa29ibVYzSUZOaGJXMTVMa1JoZEdGTWIyTmhkR2x2YmxCeWIzaDVLSFJvYVhNcEtUdGNjbHh1SUNBZ0lDOHZJQ0FnSUNBZ0lDQjlLVHRjY2x4dUlDQWdJQzh2WEhKY2JpQWdJQ0J6WlhSTWIyTmhkR2x2YmxCeWIzaDVPaUJtZFc1amRHbHZiaWh1WlhkZmNISnZlSGtwSUh0Y2NseHVJQ0FnSUNBZ2RtRnlJRzl5YVdkcGJtRnNYM0J5YjNoNUlEMGdkR2hwY3k1ZmJHOWpZWFJwYjI1ZmNISnZlSGs3WEhKY2JpQWdJQ0FnSUhSb2FYTXVYMnh2WTJGMGFXOXVYM0J5YjNoNUlEMGdibVYzWDNCeWIzaDVPMXh5WEc0Z0lDQWdJQ0JwWmlBb2RHaHBjeTVwYzFKMWJtNXBibWNvS1NrZ2UxeHlYRzRnSUNBZ0lDQWdJR2xtSUNodmNtbG5hVzVoYkY5d2NtOTRlU2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdMeThnYVdZZ2RHaGxjbVVnYVhNZ1lXeHlaV0ZrZVNCaElHeHZZMkYwYVc5dUlIQnliM2g1TENCMWJtSnBibVFnYVhRdVhISmNiaUFnSUNBZ0lDQWdJQ0J2Y21sbmFXNWhiRjl3Y205NGVTNTFibUpwYm1Rb0tUdGNjbHh1SUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUNBZ2RHaHBjeTVmYkc5allYUnBiMjVmY0hKdmVIa3VZbWx1WkNncE8xeHlYRzRnSUNBZ0lDQjlYSEpjYmlBZ0lDQjlMRnh5WEc1Y2NseHVJQ0FnSUM4dklIQnliM1pwWkdVZ2JHOW5LQ2tnYjNabGNuSnBaR1VnWm05eUlHbHVjMmxrWlNCaGJpQmhjSEFnZEdoaGRDQnBibU5zZFdSbGN5QjBhR1VnY21Wc1pYWmhiblFnWVhCd2JHbGpZWFJwYjI0Z1pXeGxiV1Z1ZEY5elpXeGxZM1J2Y2x4eVhHNGdJQ0FnYkc5bk9pQm1kVzVqZEdsdmJpZ3BJSHRjY2x4dUlDQWdJQ0FnVTJGdGJYa3ViRzluTG1Gd2NHeDVLRk5oYlcxNUxDQkJjbkpoZVM1d2NtOTBiM1I1Y0dVdVkyOXVZMkYwTG1Gd2NHeDVLRnQwYUdsekxtVnNaVzFsYm5SZmMyVnNaV04wYjNKZExHRnlaM1Z0Wlc1MGN5a3BPMXh5WEc0Z0lDQWdmU3hjY2x4dVhISmNibHh5WEc0Z0lDQWdMeThnWUhKdmRYUmxLQ2xnSUdseklIUm9aU0J0WVdsdUlHMWxkR2h2WkNCbWIzSWdaR1ZtYVc1cGJtY2djbTkxZEdWeklIZHBkR2hwYmlCaGJpQmhjSEJzYVdOaGRHbHZiaTVjY2x4dUlDQWdJQzh2SUVadmNpQm5jbVZoZENCa1pYUmhhV3dnYjI0Z2NtOTFkR1Z6TENCamFHVmpheUJ2ZFhRNlhISmNiaUFnSUNBdkx5QmJhSFIwY0RvdkwzTmhiVzE1YW5NdWIzSm5MMlJ2WTNNdmNtOTFkR1Z6WFNob2RIUndPaTh2YzJGdGJYbHFjeTV2Y21jdlpHOWpjeTl5YjNWMFpYTXBYSEpjYmlBZ0lDQXZMMXh5WEc0Z0lDQWdMeThnVkdocGN5QnRaWFJvYjJRZ1lXeHpieUJvWVhNZ1lXeHBZWE5sY3lCbWIzSWdaV0ZqYUNCdlppQjBhR1VnWkdsbVptVnlaVzUwSUhabGNtSnpJQ2hsWnk0Z1lHZGxkQ2dwWUN3Z1lIQnZjM1FvS1dBc0lHVjBZeTRwWEhKY2JpQWdJQ0F2TDF4eVhHNGdJQ0FnTHk4Z0l5TWpJRUZ5WjNWdFpXNTBjMXh5WEc0Z0lDQWdMeTljY2x4dUlDQWdJQzh2SUNvZ1lIWmxjbUpnSUVFZ1UzUnlhVzVuSUdsdUlIUm9aU0J6WlhRZ2IyWWdVazlWVkVWZlZrVlNRbE1nYjNJZ0oyRnVlU2N1SUNkaGJua25JSGRwYkd3Z1lXUmtJSEp2ZFhSbGN5Qm1iM0lnWldGamFGeHlYRzRnSUNBZ0x5OGdJQ0FnYjJZZ2RHaGxJRkpQVlZSRlgxWkZVa0pUTGlCSlppQnZibXg1SUhSM2J5QmhjbWQxYldWdWRITWdZWEpsSUhCaGMzTmxaQ3hjY2x4dUlDQWdJQzh2SUNBZ0lIUm9aU0JtYVhKemRDQmhjbWQxYldWdWRDQnBjeUIwYUdVZ2NHRjBhQ3dnZEdobElITmxZMjl1WkNCcGN5QjBhR1VnWTJGc2JHSmhZMnNnWVc1a0lIUm9aU0IyWlhKaVhISmNiaUFnSUNBdkx5QWdJQ0JwY3lCaGMzTjFiV1ZrSUhSdklHSmxJQ2RoYm5rbkxseHlYRzRnSUNBZ0x5OGdLaUJnY0dGMGFHQWdRU0JTWldkbGVIQWdiM0lnWVNCVGRISnBibWNnY21Wd2NtVnpaVzUwYVc1bklIUm9aU0J3WVhSb0lIUnZJRzFoZEdOb0lIUnZJR2x1ZG05clpTQjBhR2x6SUhabGNtSXVYSEpjYmlBZ0lDQXZMeUFxSUdCallXeHNZbUZqYTJBZ1FTQkdkVzVqZEdsdmJpQjBhR0YwSUdseklHTmhiR3hsWkM5bGRtRnNkV0YwWldRZ2QyaGxiaUIwYUdVZ2NtOTFkR1VnYVhNZ2NuVnVJSE5sWlRvZ1lISjFibEp2ZFhSbEtDbGdMbHh5WEc0Z0lDQWdMeThnSUNBZ1NYUWdhWE1nWVd4emJ5QndiM056YVdKc1pTQjBieUJ3WVhOeklHRWdjM1J5YVc1bklHRnpJSFJvWlNCallXeHNZbUZqYXl3Z2QyaHBZMmdnYVhNZ2JHOXZhMlZrSUhWd0lHRnpJSFJvWlNCdVlXMWxYSEpjYmlBZ0lDQXZMeUFnSUNCdlppQmhJRzFsZEdodlpDQnZiaUIwYUdVZ1lYQndiR2xqWVhScGIyNHVYSEpjYmlBZ0lDQXZMMXh5WEc0Z0lDQWdjbTkxZEdVNklHWjFibU4wYVc5dUtIWmxjbUlzSUhCaGRHZ3BJSHRjY2x4dUlDQWdJQ0FnZG1GeUlHRndjQ0E5SUhSb2FYTXNJSEJoY21GdFgyNWhiV1Z6SUQwZ1cxMHNJR0ZrWkY5eWIzVjBaU3dnY0dGMGFGOXRZWFJqYUN3Z1kyRnNiR0poWTJzZ1BTQkJjbkpoZVM1d2NtOTBiM1I1Y0dVdWMyeHBZMlV1WTJGc2JDaGhjbWQxYldWdWRITXNNaWs3WEhKY2JseHlYRzRnSUNBZ0lDQXZMeUJwWmlCMGFHVWdiV1YwYUc5a0lITnBaMjVoZEhWeVpTQnBjeUJxZFhOMElDaHdZWFJvTENCallXeHNZbUZqYXlsY2NseHVJQ0FnSUNBZ0x5OGdZWE56ZFcxbElIUm9aU0IyWlhKaUlHbHpJQ2RoYm5rblhISmNiaUFnSUNBZ0lHbG1JQ2hqWVd4c1ltRmpheTVzWlc1bmRHZ2dQVDA5SURBZ0ppWWdYMmx6Um5WdVkzUnBiMjRvY0dGMGFDa3BJSHRjY2x4dUlDQWdJQ0FnSUNCallXeHNZbUZqYXlBOUlGdHdZWFJvWFR0Y2NseHVJQ0FnSUNBZ0lDQndZWFJvSUQwZ2RtVnlZanRjY2x4dUlDQWdJQ0FnSUNCMlpYSmlJRDBnSjJGdWVTYzdYSEpjYmlBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lIWmxjbUlnUFNCMlpYSmlMblJ2VEc5M1pYSkRZWE5sS0NrN0lDOHZJR1Z1YzNWeVpTQjJaWEppSUdseklHeHZkMlZ5SUdOaGMyVmNjbHh1WEhKY2JpQWdJQ0FnSUM4dklHbG1JSEJoZEdnZ2FYTWdZU0J6ZEhKcGJtY2dkSFZ5YmlCcGRDQnBiblJ2SUdFZ2NtVm5aWGhjY2x4dUlDQWdJQ0FnYVdZZ0tIQmhkR2d1WTI5dWMzUnlkV04wYjNJZ1BUMGdVM1J5YVc1bktTQjdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDOHZJRTVsWldSeklIUnZJR0psSUdWNGNHeHBZMmwwYkhrZ2MyVjBJR0psWTJGMWMyVWdTVVVnZDJsc2JDQnRZV2x1ZEdGcGJpQjBhR1VnYVc1a1pYZ2dkVzVzWlhOeklFNVZURXdnYVhNZ2NtVjBkWEp1WldRc1hISmNiaUFnSUNBZ0lDQWdMeThnZDJocFkyZ2diV1ZoYm5NZ2RHaGhkQ0IzYVhSb0lIUjNieUJqYjI1elpXTjFkR2wyWlNCeWIzVjBaWE1nZEdoaGRDQmpiMjUwWVdsdUlIQmhjbUZ0Y3l3Z2RHaGxJSE5sWTI5dVpDQnpaWFFnYjJZZ2NHRnlZVzF6SUhkcGJHd2dibTkwSUdKbElHWnZkVzVrSUdGdVpDQmxibVFnZFhBZ2FXNGdjM0JzWVhRZ2FXNXpkR1ZoWkNCdlppQndZWEpoYlhOY2NseHVJQ0FnSUNBZ0lDQXZMeUJvZEhSd2N6b3ZMMlJsZG1Wc2IzQmxjaTV0YjNwcGJHeGhMbTl5Wnk5bGJpOURiM0psWDBwaGRtRlRZM0pwY0hSZk1TNDFYMUpsWm1WeVpXNWpaUzlIYkc5aVlXeGZUMkpxWldOMGN5OVNaV2RGZUhBdmJHRnpkRWx1WkdWNFhISmNiaUFnSUNBZ0lDQWdVRUZVU0Y5T1FVMUZYMDFCVkVOSVJWSXViR0Z6ZEVsdVpHVjRJRDBnTUR0Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnTHk4Z1ptbHVaQ0IwYUdVZ2JtRnRaWE5jY2x4dUlDQWdJQ0FnSUNCM2FHbHNaU0FvS0hCaGRHaGZiV0YwWTJnZ1BTQlFRVlJJWDA1QlRVVmZUVUZVUTBoRlVpNWxlR1ZqS0hCaGRHZ3BLU0FoUFQwZ2JuVnNiQ2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdjR0Z5WVcxZmJtRnRaWE11Y0hWemFDaHdZWFJvWDIxaGRHTm9XekZkS1R0Y2NseHVJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJQ0FnTHk4Z2NtVndiR0ZqWlNCM2FYUm9JSFJvWlNCd1lYUm9JSEpsY0d4aFkyVnRaVzUwWEhKY2JpQWdJQ0FnSUNBZ2NHRjBhQ0E5SUc1bGR5QlNaV2RGZUhBb2NHRjBhQzV5WlhCc1lXTmxLRkJCVkVoZlRrRk5SVjlOUVZSRFNFVlNMQ0JRUVZSSVgxSkZVRXhCUTBWU0tTQXJJRndpSkZ3aUtUdGNjbHh1SUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0F2THlCc2IyOXJkWEFnWTJGc2JHSmhZMnR6WEhKY2JpQWdJQ0FnSUNRdVpXRmphQ2hqWVd4c1ltRmpheXhtZFc1amRHbHZiaWhwTEdOaUtYdGNjbHh1SUNBZ0lDQWdJQ0JwWmlBb2RIbHdaVzltS0dOaUtTQTlQVDBnSjNOMGNtbHVaeWNwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJR05oYkd4aVlXTnJXMmxkSUQwZ1lYQndXMk5pWFR0Y2NseHVJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJSDBwTzF4eVhHNWNjbHh1SUNBZ0lDQWdZV1JrWDNKdmRYUmxJRDBnWm5WdVkzUnBiMjRvZDJsMGFGOTJaWEppS1NCN1hISmNiaUFnSUNBZ0lDQWdkbUZ5SUhJZ1BTQjdkbVZ5WWpvZ2QybDBhRjkyWlhKaUxDQndZWFJvT2lCd1lYUm9MQ0JqWVd4c1ltRmphem9nWTJGc2JHSmhZMnNzSUhCaGNtRnRYMjVoYldWek9pQndZWEpoYlY5dVlXMWxjMzA3WEhKY2JpQWdJQ0FnSUNBZ0x5OGdZV1JrSUhKdmRYUmxJSFJ2SUhKdmRYUmxjeUJoY25KaGVWeHlYRzRnSUNBZ0lDQWdJR0Z3Y0M1eWIzVjBaWE5iZDJsMGFGOTJaWEppWFNBOUlHRndjQzV5YjNWMFpYTmJkMmwwYUY5MlpYSmlYU0I4ZkNCYlhUdGNjbHh1SUNBZ0lDQWdJQ0F2THlCd2JHRmpaU0J5YjNWMFpYTWdhVzRnYjNKa1pYSWdiMllnWkdWbWFXNXBkR2x2Ymx4eVhHNGdJQ0FnSUNBZ0lHRndjQzV5YjNWMFpYTmJkMmwwYUY5MlpYSmlYUzV3ZFhOb0tISXBPMXh5WEc0Z0lDQWdJQ0I5TzF4eVhHNWNjbHh1SUNBZ0lDQWdhV1lnS0habGNtSWdQVDA5SUNkaGJua25LU0I3WEhKY2JpQWdJQ0FnSUNBZ0pDNWxZV05vS0hSb2FYTXVVazlWVkVWZlZrVlNRbE1zSUdaMWJtTjBhVzl1S0drc0lIWXBJSHNnWVdSa1gzSnZkWFJsS0hZcE95QjlLVHRjY2x4dUlDQWdJQ0FnZlNCbGJITmxJSHRjY2x4dUlDQWdJQ0FnSUNCaFpHUmZjbTkxZEdVb2RtVnlZaWs3WEhKY2JpQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQzh2SUhKbGRIVnliaUIwYUdVZ1lYQndYSEpjYmlBZ0lDQWdJSEpsZEhWeWJpQjBhR2x6TzF4eVhHNGdJQ0FnZlN4Y2NseHVYSEpjYmlBZ0lDQXZMeUJCYkdsaGN5Qm1iM0lnY205MWRHVW9KMmRsZENjc0lDNHVMaWxjY2x4dUlDQWdJR2RsZERvZ1gzSnZkWFJsVjNKaGNIQmxjaWduWjJWMEp5a3NYSEpjYmx4eVhHNGdJQ0FnTHk4Z1FXeHBZWE1nWm05eUlISnZkWFJsS0Nkd2IzTjBKeXdnTGk0dUtWeHlYRzRnSUNBZ2NHOXpkRG9nWDNKdmRYUmxWM0poY0hCbGNpZ25jRzl6ZENjcExGeHlYRzVjY2x4dUlDQWdJQzh2SUVGc2FXRnpJR1p2Y2lCeWIzVjBaU2duY0hWMEp5d2dMaTR1S1Z4eVhHNGdJQ0FnY0hWME9pQmZjbTkxZEdWWGNtRndjR1Z5S0Nkd2RYUW5LU3hjY2x4dVhISmNiaUFnSUNBdkx5QkJiR2xoY3lCbWIzSWdjbTkxZEdVb0oyUmxiR1YwWlNjc0lDNHVMaWxjY2x4dUlDQWdJR1JsYkRvZ1gzSnZkWFJsVjNKaGNIQmxjaWduWkdWc1pYUmxKeWtzWEhKY2JseHlYRzRnSUNBZ0x5OGdRV3hwWVhNZ1ptOXlJSEp2ZFhSbEtDZGhibmtuTENBdUxpNHBYSEpjYmlBZ0lDQmhibms2SUY5eWIzVjBaVmR5WVhCd1pYSW9KMkZ1ZVNjcExGeHlYRzVjY2x4dUlDQWdJQzh2SUdCdFlYQlNiM1YwWlhOZ0lIUmhhMlZ6SUdGdUlHRnljbUY1SUc5bUlHRnljbUY1Y3l3Z1pXRmphQ0JoY25KaGVTQmlaV2x1WnlCd1lYTnpaV1FnZEc4Z2NtOTFkR1VvS1Z4eVhHNGdJQ0FnTHk4Z1lYTWdZWEpuZFcxbGJuUnpMQ0IwYUdseklHRnNiRzkzY3lCbWIzSWdiV0Z6Y3lCa1pXWnBibWwwYVc5dUlHOW1JSEp2ZFhSbGN5NGdRVzV2ZEdobGNpQmlaVzVsWm1sMElHbHpYSEpjYmlBZ0lDQXZMeUIwYUdseklHMWhhMlZ6SUdsMElIQnZjM05wWW14bEwyVmhjMmxsY2lCMGJ5QnNiMkZrSUhKdmRYUmxjeUIyYVdFZ2NtVnRiM1JsSUVwVFQwNHVYSEpjYmlBZ0lDQXZMMXh5WEc0Z0lDQWdMeThnSXlNaklFVjRZVzF3YkdWY2NseHVJQ0FnSUM4dlhISmNiaUFnSUNBdkx5QWdJQ0FnSUhaaGNpQmhjSEFnUFNBa0xuTmhiVzE1S0daMWJtTjBhVzl1S0NrZ2UxeHlYRzRnSUNBZ0x5OWNjbHh1SUNBZ0lDOHZJQ0FnSUNBZ0lDQjBhR2x6TG0xaGNGSnZkWFJsY3loYlhISmNiaUFnSUNBdkx5QWdJQ0FnSUNBZ0lDQWdJRnNuWjJWMEp5d2dKeU12Snl3Z1puVnVZM1JwYjI0b0tTQjdJSFJvYVhNdWJHOW5LQ2RwYm1SbGVDY3BPeUI5WFN4Y2NseHVJQ0FnSUM4dklDQWdJQ0FnSUNBZ0lDQWdMeThnYzNSeWFXNW5jeUJwYmlCallXeHNZbUZqYTNNZ1lYSmxJR3h2YjJ0bFpDQjFjQ0JoY3lCdFpYUm9iMlJ6SUc5dUlIUm9aU0JoY0hCY2NseHVJQ0FnSUM4dklDQWdJQ0FnSUNBZ0lDQWdXeWR3YjNOMEp5d2dKeU12WTNKbFlYUmxKeXdnSjJGa1pGVnpaWEluWFN4Y2NseHVJQ0FnSUM4dklDQWdJQ0FnSUNBZ0lDQWdMeThnVG04Z2RtVnlZaUJoYzNOMWJXVnpJQ2RoYm5rbklHRnpJSFJvWlNCMlpYSmlYSEpjYmlBZ0lDQXZMeUFnSUNBZ0lDQWdJQ0FnSUZzdlpHOTNhR0YwWlhabGNpOHNJR1oxYm1OMGFXOXVLQ2tnZXlCMGFHbHpMbXh2WnloMGFHbHpMblpsY21Jc0lIUm9hWE11Y0dGMGFDbDlYVHRjY2x4dUlDQWdJQzh2SUNBZ0lDQWdJQ0FnSUYwcE8xeHlYRzRnSUNBZ0x5OGdJQ0FnSUNCOUtUdGNjbHh1SUNBZ0lDOHZYSEpjYmlBZ0lDQnRZWEJTYjNWMFpYTTZJR1oxYm1OMGFXOXVLSEp2ZFhSbFgyRnljbUY1S1NCN1hISmNiaUFnSUNBZ0lIWmhjaUJoY0hBZ1BTQjBhR2x6TzF4eVhHNGdJQ0FnSUNBa0xtVmhZMmdvY205MWRHVmZZWEp5WVhrc0lHWjFibU4wYVc5dUtHa3NJSEp2ZFhSbFgyRnlaM01wSUh0Y2NseHVJQ0FnSUNBZ0lDQmhjSEF1Y205MWRHVXVZWEJ3Ykhrb1lYQndMQ0J5YjNWMFpWOWhjbWR6S1R0Y2NseHVJQ0FnSUNBZ2ZTazdYSEpjYmlBZ0lDQWdJSEpsZEhWeWJpQjBhR2x6TzF4eVhHNGdJQ0FnZlN4Y2NseHVYSEpjYmlBZ0lDQXZMeUJCSUhWdWFYRjFaU0JsZG1WdWRDQnVZVzFsYzNCaFkyVWdaR1ZtYVc1bFpDQndaWElnWVhCd2JHbGpZWFJwYjI0dVhISmNiaUFnSUNBdkx5QkJiR3dnWlhabGJuUnpJR0p2ZFc1a0lIZHBkR2dnWUdKcGJtUW9LV0FnWVhKbElHRjFkRzl0WVhScFkyRnNiSGtnWW05MWJtUWdkMmwwYUdsdUlIUm9hWE1nYzNCaFkyVXVYSEpjYmlBZ0lDQmxkbVZ1ZEU1aGJXVnpjR0ZqWlRvZ1puVnVZM1JwYjI0b0tTQjdYSEpjYmlBZ0lDQWdJSEpsZEhWeWJpQmJKM05oYlcxNUxXRndjQ2NzSUhSb2FYTXVibUZ0WlhOd1lXTmxYUzVxYjJsdUtDY3RKeWs3WEhKY2JpQWdJQ0I5TEZ4eVhHNWNjbHh1SUNBZ0lDOHZJRmR2Y210eklHcDFjM1FnYkdsclpTQmdhbEYxWlhKNUxtWnVMbUpwYm1Rb0tXQWdkMmwwYUNCaElHTnZkWEJzWlNCdWIzUmhZbXhsSUdScFptWmxjbVZ1WTJWekxseHlYRzRnSUNBZ0x5OWNjbHh1SUNBZ0lDOHZJQ29nU1hRZ1ltbHVaSE1nWVd4c0lHVjJaVzUwY3lCMGJ5QjBhR1VnWVhCd2JHbGpZWFJwYjI0Z1pXeGxiV1Z1ZEZ4eVhHNGdJQ0FnTHk4Z0tpQkJiR3dnWlhabGJuUnpJR0Z5WlNCaWIzVnVaQ0IzYVhSb2FXNGdkR2hsSUdCbGRtVnVkRTVoYldWemNHRmpaU2dwWUZ4eVhHNGdJQ0FnTHk4Z0tpQkZkbVZ1ZEhNZ1lYSmxJRzV2ZENCaFkzUjFZV3hzZVNCaWIzVnVaQ0IxYm5ScGJDQjBhR1VnWVhCd2JHbGpZWFJwYjI0Z2FYTWdjM1JoY25SbFpDQjNhWFJvSUdCeWRXNG9LV0JjY2x4dUlDQWdJQzh2SUNvZ1kyRnNiR0poWTJ0eklHRnlaU0JsZG1Gc2RXRjBaV1FnZDJsMGFHbHVJSFJvWlNCamIyNTBaWGgwSUc5bUlHRWdVMkZ0YlhrdVJYWmxiblJEYjI1MFpYaDBYSEpjYmlBZ0lDQXZMMXh5WEc0Z0lDQWdZbWx1WkRvZ1puVnVZM1JwYjI0b2JtRnRaU3dnWkdGMFlTd2dZMkZzYkdKaFkyc3BJSHRjY2x4dUlDQWdJQ0FnZG1GeUlHRndjQ0E5SUhSb2FYTTdYSEpjYmlBZ0lDQWdJQzh2SUdKMWFXeGtJSFJvWlNCallXeHNZbUZqYTF4eVhHNGdJQ0FnSUNBdkx5QnBaaUIwYUdVZ1lYSnBkSGtnYVhNZ01pd2dZMkZzYkdKaFkyc2dhWE1nZEdobElITmxZMjl1WkNCaGNtZDFiV1Z1ZEZ4eVhHNGdJQ0FnSUNCcFppQW9kSGx3Wlc5bUlHTmhiR3hpWVdOcklEMDlJQ2QxYm1SbFptbHVaV1FuS1NCN0lHTmhiR3hpWVdOcklEMGdaR0YwWVRzZ2ZWeHlYRzRnSUNBZ0lDQjJZWElnYkdsemRHVnVaWEpmWTJGc2JHSmhZMnNnUFNBZ1puVnVZM1JwYjI0b0tTQjdYSEpjYmlBZ0lDQWdJQ0FnTHk4Z2NIVnNiQ0J2Wm1ZZ2RHaGxJR052Ym5SbGVIUWdabkp2YlNCMGFHVWdZWEpuZFcxbGJuUnpJSFJ2SUhSb1pTQmpZV3hzWW1GamExeHlYRzRnSUNBZ0lDQWdJSFpoY2lCbExDQmpiMjUwWlhoMExDQmtZWFJoTzF4eVhHNGdJQ0FnSUNBZ0lHVWdJQ0FnSUNBZ1BTQmhjbWQxYldWdWRITmJNRjA3WEhKY2JpQWdJQ0FnSUNBZ1pHRjBZU0FnSUNBOUlHRnlaM1Z0Wlc1MGMxc3hYVHRjY2x4dUlDQWdJQ0FnSUNCcFppQW9aR0YwWVNBbUppQmtZWFJoTG1OdmJuUmxlSFFwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJR052Ym5SbGVIUWdQU0JrWVhSaExtTnZiblJsZUhRN1hISmNiaUFnSUNBZ0lDQWdJQ0JrWld4bGRHVWdaR0YwWVM1amIyNTBaWGgwTzF4eVhHNGdJQ0FnSUNBZ0lIMGdaV3h6WlNCN1hISmNiaUFnSUNBZ0lDQWdJQ0JqYjI1MFpYaDBJRDBnYm1WM0lHRndjQzVqYjI1MFpYaDBYM0J5YjNSdmRIbHdaU2hoY0hBc0lDZGlhVzVrSnl3Z1pTNTBlWEJsTENCa1lYUmhMQ0JsTG5SaGNtZGxkQ2s3WEhKY2JpQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQWdJR1V1WTJ4bFlXNWxaRjkwZVhCbElEMGdaUzUwZVhCbExuSmxjR3hoWTJVb1lYQndMbVYyWlc1MFRtRnRaWE53WVdObEtDa3NJQ2NuS1R0Y2NseHVJQ0FnSUNBZ0lDQmpZV3hzWW1GamF5NWhjSEJzZVNoamIyNTBaWGgwTENCYlpTd2daR0YwWVYwcE8xeHlYRzRnSUNBZ0lDQjlPMXh5WEc1Y2NseHVJQ0FnSUNBZ0x5OGdhWFFnWTI5MWJHUWdZbVVnZEdoaGRDQjBhR1VnWVhCd0lHVnNaVzFsYm5RZ1pHOWxjMjUwSUdWNGFYTjBJSGxsZEZ4eVhHNGdJQ0FnSUNBdkx5QnpieUJoZEhSaFkyZ2dkRzhnZEdobElHeHBjM1JsYm1WeWN5QmhjbkpoZVNCaGJtUWdkR2hsYmlCeWRXNG9LVnh5WEc0Z0lDQWdJQ0F2THlCM2FXeHNJR0ZqZEhWaGJHeDVJR0pwYm1RZ2RHaGxJR1YyWlc1MExseHlYRzRnSUNBZ0lDQnBaaUFvSVhSb2FYTXViR2x6ZEdWdVpYSnpXMjVoYldWZEtTQjdJSFJvYVhNdWJHbHpkR1Z1WlhKelcyNWhiV1ZkSUQwZ1cxMDdJSDFjY2x4dUlDQWdJQ0FnZEdocGN5NXNhWE4wWlc1bGNuTmJibUZ0WlYwdWNIVnphQ2hzYVhOMFpXNWxjbDlqWVd4c1ltRmpheWs3WEhKY2JpQWdJQ0FnSUdsbUlDaDBhR2x6TG1selVuVnVibWx1WnlncEtTQjdYSEpjYmlBZ0lDQWdJQ0FnTHk4Z2FXWWdkR2hsSUdGd2NDQnBjeUJ5ZFc1dWFXNW5YSEpjYmlBZ0lDQWdJQ0FnTHk4Z0ttRmpkSFZoYkd4NUtpQmlhVzVrSUhSb1pTQmxkbVZ1ZENCMGJ5QjBhR1VnWVhCd0lHVnNaVzFsYm5SY2NseHVJQ0FnSUNBZ0lDQjBhR2x6TGw5c2FYTjBaVzRvYm1GdFpTd2diR2x6ZEdWdVpYSmZZMkZzYkdKaFkyc3BPMXh5WEc0Z0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUhKbGRIVnliaUIwYUdsek8xeHlYRzRnSUNBZ2ZTeGNjbHh1WEhKY2JpQWdJQ0F2THlCVWNtbG5aMlZ5Y3lCamRYTjBiMjBnWlhabGJuUnpJR1JsWm1sdVpXUWdkMmwwYUNCZ1ltbHVaQ2dwWUZ4eVhHNGdJQ0FnTHk5Y2NseHVJQ0FnSUM4dklDTWpJeUJCY21kMWJXVnVkSE5jY2x4dUlDQWdJQzh2WEhKY2JpQWdJQ0F2THlBcUlHQnVZVzFsWUNCVWFHVWdibUZ0WlNCdlppQjBhR1VnWlhabGJuUXVJRUYxZEc5dFlYUnBZMkZzYkhrZ2NISmxabWw0WldRZ2QybDBhQ0IwYUdVZ1lHVjJaVzUwVG1GdFpYTndZV05sS0NsZ1hISmNiaUFnSUNBdkx5QXFJR0JrWVhSaFlDQkJiaUJ2Y0hScGIyNWhiQ0JQWW1wbFkzUWdkR2hoZENCallXNGdZbVVnY0dGemMyVmtJSFJ2SUhSb1pTQmliM1Z1WkNCallXeHNZbUZqYXk1Y2NseHVJQ0FnSUM4dklDb2dZR052Ym5SbGVIUmdJRUZ1SUc5d2RHbHZibUZzSUdOdmJuUmxlSFF2VDJKcVpXTjBJR2x1SUhkb2FXTm9JSFJ2SUdWNFpXTjFkR1VnZEdobElHSnZkVzVrSUdOaGJHeGlZV05yTGx4eVhHNGdJQ0FnTHk4Z0lDQkpaaUJ1YnlCamIyNTBaWGgwSUdseklITjFjSEJzYVdWa0lHRWdkR2hsSUdOdmJuUmxlSFFnYVhNZ1lTQnVaWGNnWUZOaGJXMTVMa1YyWlc1MFEyOXVkR1Y0ZEdCY2NseHVJQ0FnSUM4dlhISmNiaUFnSUNCMGNtbG5aMlZ5T2lCbWRXNWpkR2x2YmlodVlXMWxMQ0JrWVhSaEtTQjdYSEpjYmlBZ0lDQWdJSFJvYVhNdUpHVnNaVzFsYm5Rb0tTNTBjbWxuWjJWeUtGdHVZVzFsTENCMGFHbHpMbVYyWlc1MFRtRnRaWE53WVdObEtDbGRMbXB2YVc0b0p5NG5LU3dnVzJSaGRHRmRLVHRjY2x4dUlDQWdJQ0FnY21WMGRYSnVJSFJvYVhNN1hISmNiaUFnSUNCOUxGeHlYRzVjY2x4dUlDQWdJQzh2SUZKbGNuVnVjeUIwYUdVZ1kzVnljbVZ1ZENCeWIzVjBaVnh5WEc0Z0lDQWdjbVZtY21WemFEb2dablZ1WTNScGIyNG9LU0I3WEhKY2JpQWdJQ0FnSUhSb2FYTXViR0Z6ZEY5c2IyTmhkR2x2YmlBOUlHNTFiR3c3WEhKY2JpQWdJQ0FnSUhSb2FYTXVkSEpwWjJkbGNpZ25iRzlqWVhScGIyNHRZMmhoYm1kbFpDY3BPMXh5WEc0Z0lDQWdJQ0J5WlhSMWNtNGdkR2hwY3p0Y2NseHVJQ0FnSUgwc1hISmNibHh5WEc0Z0lDQWdMeThnVkdGclpYTWdZU0J6YVc1bmJHVWdZMkZzYkdKaFkyc2dkR2hoZENCcGN5QndkWE5vWldRZ2IyNGdkRzhnWVNCemRHRmpheTVjY2x4dUlDQWdJQzh2SUVKbFptOXlaU0JoYm5rZ2NtOTFkR1VnYVhNZ2NuVnVMQ0IwYUdVZ1kyRnNiR0poWTJ0eklHRnlaU0JsZG1Gc2RXRjBaV1FnYVc0Z2IzSmtaWElnZDJsMGFHbHVYSEpjYmlBZ0lDQXZMeUIwYUdVZ1kzVnljbVZ1ZENCZ1UyRnRiWGt1UlhabGJuUkRiMjUwWlhoMFlGeHlYRzRnSUNBZ0x5OWNjbHh1SUNBZ0lDOHZJRWxtSUdGdWVTQnZaaUIwYUdVZ1kyRnNiR0poWTJ0eklHVjRjR3hwWTJsMGJIa2djbVYwZFhKdUlHWmhiSE5sTENCbGVHVmpkWFJwYjI0Z2IyWWdZVzU1WEhKY2JpQWdJQ0F2THlCbWRYSjBhR1Z5SUdOaGJHeGlZV05yY3lCaGJtUWdkR2hsSUhKdmRYUmxJR2wwYzJWc1ppQnBjeUJvWVd4MFpXUXVYSEpjYmlBZ0lDQXZMMXh5WEc0Z0lDQWdMeThnV1c5MUlHTmhiaUJoYkhOdklIQnliM1pwWkdVZ1lTQnpaWFFnYjJZZ2IzQjBhVzl1Y3lCMGFHRjBJSGRwYkd3Z1pHVm1hVzVsSUhkb1pXNGdkRzhnY25WdUlIUm9hWE5jY2x4dUlDQWdJQzh2SUdKbFptOXlaU0JpWVhObFpDQnZiaUIwYUdVZ2NtOTFkR1VnYVhRZ2NISnZZMlZsWkhNdVhISmNiaUFnSUNBdkwxeHlYRzRnSUNBZ0x5OGdJeU1qSUVWNFlXMXdiR1ZjY2x4dUlDQWdJQzh2WEhKY2JpQWdJQ0F2THlBZ0lDQWdJSFpoY2lCaGNIQWdQU0FrTG5OaGJXMTVLR1oxYm1OMGFXOXVLQ2tnZTF4eVhHNGdJQ0FnTHk5Y2NseHVJQ0FnSUM4dklDQWdJQ0FnSUNBdkx5QjNhV3hzSUhKMWJpQmhkQ0FqTDNKdmRYUmxJR0oxZENCdWIzUWdZWFFnSXk5Y2NseHVJQ0FnSUM4dklDQWdJQ0FnSUNCMGFHbHpMbUpsWm05eVpTZ25JeTl5YjNWMFpTY3NJR1oxYm1OMGFXOXVLQ2tnZTF4eVhHNGdJQ0FnTHk4Z0lDQWdJQ0FnSUNBZ0x5OHVMaTVjY2x4dUlDQWdJQzh2SUNBZ0lDQWdJQ0I5S1R0Y2NseHVJQ0FnSUM4dlhISmNiaUFnSUNBdkx5QWdJQ0FnSUNBZ0x5OGdkMmxzYkNCeWRXNGdZWFFnSXk4Z1luVjBJRzV2ZENCaGRDQWpMM0p2ZFhSbFhISmNiaUFnSUNBdkx5QWdJQ0FnSUNBZ2RHaHBjeTVpWldadmNtVW9lMlY0WTJWd2REb2dlM0JoZEdnNklDY2pMM0p2ZFhSbEozMTlMQ0JtZFc1amRHbHZiaWdwSUh0Y2NseHVJQ0FnSUM4dklDQWdJQ0FnSUNBZ0lIUm9hWE11Ykc5bktDZHViM1FnWW1WbWIzSmxJQ012Y205MWRHVW5LVHRjY2x4dUlDQWdJQzh2SUNBZ0lDQWdJQ0I5S1R0Y2NseHVJQ0FnSUM4dlhISmNiaUFnSUNBdkx5QWdJQ0FnSUNBZ2RHaHBjeTVuWlhRb0p5TXZKeXdnWm5WdVkzUnBiMjRvS1NCN2ZTazdYSEpjYmlBZ0lDQXZMMXh5WEc0Z0lDQWdMeThnSUNBZ0lDQWdJSFJvYVhNdVoyVjBLQ2NqTDNKdmRYUmxKeXdnWm5WdVkzUnBiMjRvS1NCN2ZTazdYSEpjYmlBZ0lDQXZMMXh5WEc0Z0lDQWdMeThnSUNBZ0lDQjlLVHRjY2x4dUlDQWdJQzh2WEhKY2JpQWdJQ0F2THlCVFpXVWdZR052Ym5SbGVIUk5ZWFJqYUdWelQzQjBhVzl1Y3lncFlDQm1iM0lnWVNCbWRXeHNJR3hwYzNRZ2IyWWdjM1Z3Y0c5eWRHVmtJRzl3ZEdsdmJuTmNjbHh1SUNBZ0lDOHZYSEpjYmlBZ0lDQmlaV1p2Y21VNklHWjFibU4wYVc5dUtHOXdkR2x2Ym5Nc0lHTmhiR3hpWVdOcktTQjdYSEpjYmlBZ0lDQWdJR2xtSUNoZmFYTkdkVzVqZEdsdmJpaHZjSFJwYjI1ektTa2dlMXh5WEc0Z0lDQWdJQ0FnSUdOaGJHeGlZV05ySUQwZ2IzQjBhVzl1Y3p0Y2NseHVJQ0FnSUNBZ0lDQnZjSFJwYjI1eklEMGdlMzA3WEhKY2JpQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ2RHaHBjeTVpWldadmNtVnpMbkIxYzJnb1cyOXdkR2x2Ym5Nc0lHTmhiR3hpWVdOclhTazdYSEpjYmlBZ0lDQWdJSEpsZEhWeWJpQjBhR2x6TzF4eVhHNGdJQ0FnZlN4Y2NseHVYSEpjYmlBZ0lDQXZMeUJCSUhOb2IzSjBZM1YwSUdadmNpQmlhVzVrYVc1bklHRWdZMkZzYkdKaFkyc2dkRzhnWW1VZ2NuVnVJR0ZtZEdWeUlHRWdjbTkxZEdVZ2FYTWdaWGhsWTNWMFpXUXVYSEpjYmlBZ0lDQXZMeUJCWm5SbGNpQmpZV3hzWW1GamEzTWdhR0YyWlNCdWJ5Qm5kV0Z5ZFc1MFpXVmtJRzl5WkdWeUxseHlYRzRnSUNBZ1lXWjBaWEk2SUdaMWJtTjBhVzl1S0dOaGJHeGlZV05yS1NCN1hISmNiaUFnSUNBZ0lISmxkSFZ5YmlCMGFHbHpMbUpwYm1Rb0oyVjJaVzUwTFdOdmJuUmxlSFF0WVdaMFpYSW5MQ0JqWVd4c1ltRmpheWs3WEhKY2JpQWdJQ0I5TEZ4eVhHNWNjbHh1WEhKY2JpQWdJQ0F2THlCQlpHUnpJR0Z1SUdGeWIzVnVaQ0JtYVd4MFpYSWdkRzhnZEdobElHRndjR3hwWTJGMGFXOXVMaUJoY205MWJtUWdabWxzZEdWeWN5QmhjbVVnWm5WdVkzUnBiMjV6WEhKY2JpQWdJQ0F2THlCMGFHRjBJSFJoYTJVZ1lTQnphVzVuYkdVZ1lYSm5kVzFsYm5RZ1lHTmhiR3hpWVdOcllDQjNhR2xqYUNCcGN5QjBhR1VnWlc1MGFYSmxJSEp2ZFhSbFhISmNiaUFnSUNBdkx5QmxlR1ZqZFhScGIyNGdjR0YwYUNCM2NtRndjR1ZrSUhWd0lHbHVJR0VnWTJ4dmMzVnlaUzRnVkdocGN5QnRaV0Z1Y3lCNWIzVWdZMkZ1SUdSbFkybGtaU0IzYUdWMGFHVnlYSEpjYmlBZ0lDQXZMeUJ2Y2lCdWIzUWdkRzhnY0hKdlkyVmxaQ0IzYVhSb0lHVjRaV04xZEdsdmJpQmllU0J1YjNRZ2FXNTJiMnRwYm1jZ1lHTmhiR3hpWVdOcllDQnZjaXhjY2x4dUlDQWdJQzh2SUcxdmNtVWdkWE5sWm5Wc2JIa2dkM0poY0hCcGJtY2dZMkZzYkdKaFkyc2dhVzV6YVdSbElIUm9aU0J5WlhOMWJIUWdiMllnWVc0Z1lYTjVibU5vY205dWIzVnpJR1Y0WldOMWRHbHZiaTVjY2x4dUlDQWdJQzh2WEhKY2JpQWdJQ0F2THlBakl5TWdSWGhoYlhCc1pWeHlYRzRnSUNBZ0x5OWNjbHh1SUNBZ0lDOHZJRlJvWlNCdGIzTjBJR052YlcxdmJpQjFjMlVnWTJGelpTQm1iM0lnWVhKdmRXNWtLQ2tnYVhNZ1kyRnNiR2x1WnlCaElGOXdiM056YVdKc2VWOGdZWE41Ym1NZ1puVnVZM1JwYjI1Y2NseHVJQ0FnSUM4dklHRnVaQ0JsZUdWamRYUnBibWNnZEdobElISnZkWFJsSUhkcGRHaHBiaUIwYUdVZ1puVnVZM1JwYjI1eklHTmhiR3hpWVdOck9seHlYRzRnSUNBZ0x5OWNjbHh1SUNBZ0lDOHZJQ0FnSUNBZ2RtRnlJR0Z3Y0NBOUlDUXVjMkZ0Ylhrb1puVnVZM1JwYjI0b0tTQjdYSEpjYmlBZ0lDQXZMMXh5WEc0Z0lDQWdMeThnSUNBZ0lDQWdJSFpoY2lCamRYSnlaVzUwWDNWelpYSWdQU0JtWVd4elpUdGNjbHh1SUNBZ0lDOHZYSEpjYmlBZ0lDQXZMeUFnSUNBZ0lDQWdablZ1WTNScGIyNGdZMmhsWTJ0TWIyZG5aV1JKYmloallXeHNZbUZqYXlrZ2UxeHlYRzRnSUNBZ0x5OGdJQ0FnSUNBZ0lDQWdMeThnTDNObGMzTnBiMjRnY21WMGRYSnVjeUJoSUVwVFQwNGdjbVZ3Y21WelpXNTBZWFJwYjI0Z2IyWWdkR2hsSUd4dloyZGxaQ0JwYmlCMWMyVnlYSEpjYmlBZ0lDQXZMeUFnSUNBZ0lDQWdJQ0F2THlCdmNpQmhiaUJsYlhCMGVTQnZZbXBsWTNSY2NseHVJQ0FnSUM4dklDQWdJQ0FnSUNBZ0lHbG1JQ2doWTNWeWNtVnVkRjkxYzJWeUtTQjdYSEpjYmlBZ0lDQXZMeUFnSUNBZ0lDQWdJQ0FnSUNRdVoyVjBTbE5QVGlnbkwzTmxjM05wYjI0bkxDQm1kVzVqZEdsdmJpaHFjMjl1S1NCN1hISmNiaUFnSUNBdkx5QWdJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tHcHpiMjR1Ykc5bmFXNHBJSHRjY2x4dUlDQWdJQzh2SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQzh2SUhOb2IzY2dkR2hsSUhWelpYSWdZWE1nYkc5bloyVmtJR2x1WEhKY2JpQWdJQ0F2THlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JqZFhKeVpXNTBYM1Z6WlhJZ1BTQnFjMjl1TzF4eVhHNGdJQ0FnTHk4Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnTHk4Z1pYaGxZM1YwWlNCMGFHVWdjbTkxZEdVZ2NHRjBhRnh5WEc0Z0lDQWdMeThnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZMkZzYkdKaFkyc29LVHRjY2x4dUlDQWdJQzh2SUNBZ0lDQWdJQ0FnSUNBZ0lDQjlJR1ZzYzJVZ2UxeHlYRzRnSUNBZ0x5OGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0x5OGdjMmh2ZHlCMGFHVWdkWE5sY2lCaGN5QnViM1FnYkc5bloyVmtJR2x1WEhKY2JpQWdJQ0F2THlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JqZFhKeVpXNTBYM1Z6WlhJZ1BTQm1ZV3h6WlR0Y2NseHVJQ0FnSUM4dklDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUM4dklIUm9aU0JqYjI1MFpYaDBJRzltSUdGeWIzVnVaRVpwYkhSbGNuTWdhWE1nWVc0Z1JYWmxiblJEYjI1MFpYaDBYSEpjYmlBZ0lDQXZMeUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG5KbFpHbHlaV04wS0NjakwyeHZaMmx1SnlrN1hISmNiaUFnSUNBdkx5QWdJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnTHk4Z0lDQWdJQ0FnSUNBZ0lDQjlLVHRjY2x4dUlDQWdJQzh2SUNBZ0lDQWdJQ0FnSUgwZ1pXeHpaU0I3WEhKY2JpQWdJQ0F2THlBZ0lDQWdJQ0FnSUNBZ0lDOHZJR1Y0WldOMWRHVWdkR2hsSUhKdmRYUmxJSEJoZEdoY2NseHVJQ0FnSUM4dklDQWdJQ0FnSUNBZ0lDQWdZMkZzYkdKaFkyc29LVHRjY2x4dUlDQWdJQzh2SUNBZ0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUM4dklDQWdJQ0FnSUNCOU8xeHlYRzRnSUNBZ0x5OWNjbHh1SUNBZ0lDOHZJQ0FnSUNBZ0lDQjBhR2x6TG1GeWIzVnVaQ2hqYUdWamEweHZaMmRsWkVsdUtUdGNjbHh1SUNBZ0lDOHZYSEpjYmlBZ0lDQXZMeUFnSUNBZ0lIMHBPMXh5WEc0Z0lDQWdMeTljY2x4dUlDQWdJR0Z5YjNWdVpEb2dablZ1WTNScGIyNG9ZMkZzYkdKaFkyc3BJSHRjY2x4dUlDQWdJQ0FnZEdocGN5NWhjbTkxYm1SekxuQjFjMmdvWTJGc2JHSmhZMnNwTzF4eVhHNGdJQ0FnSUNCeVpYUjFjbTRnZEdocGN6dGNjbHh1SUNBZ0lIMHNYSEpjYmx4eVhHNGdJQ0FnTHk4Z1FXUmtjeUJoSUc5dVEyOXRjR3hsZEdVZ1puVnVZM1JwYjI0Z2RHOGdkR2hsSUdGd2NHeHBZMkYwYVc5dUxpQnZia052YlhCc1pYUmxJR1oxYm1OMGFXOXVjeUJoY21VZ1pYaGxZM1YwWldSY2NseHVJQ0FnSUM4dklHRjBJSFJvWlNCbGJtUWdiMllnWVNCamFHRnBiaUJ2WmlCeWIzVjBaU0JqWVd4c1ltRmphM01zSUdsbUlIUm9aWGtnWTJGc2JDQnVaWGgwS0NrdUlGVnViR2xyWlNCaFpuUmxjaXhjY2x4dUlDQWdJQzh2SUhkb2FXTm9JR2x6SUdOaGJHeGxaQ0JoY3lCemIyOXVJR0Z6SUhSb1pTQnliM1YwWlNCcGN5QmpiMjF3YkdWMFpTd2diMjVEYjIxd2JHVjBaU0JwY3lCc2FXdGxJR0VnWm1sdVlXd2dibVY0ZENncFhISmNiaUFnSUNBdkx5Qm1iM0lnWVd4c0lISnZkWFJsY3l3Z1lXNWtJR2x6SUhSb2RYTWdjblZ1SUdGemVXNWphSEp2Ym05MWMyeDVYSEpjYmlBZ0lDQXZMMXh5WEc0Z0lDQWdMeThnSXlNaklFVjRZVzF3YkdWY2NseHVJQ0FnSUM4dlhISmNiaUFnSUNBdkx5QWdJQ0FnSUdGd2NDNW5aWFFvSnk5amFHRnBiaWNzWm5WdVkzUnBiMjRvWTI5dWRHVjRkQ3h1WlhoMEtTQjdYSEpjYmlBZ0lDQXZMeUFnSUNBZ0lDQWdJQ0JqYjI1emIyeGxMbXh2WnlnblkyaGhhVzR4SnlrN1hISmNiaUFnSUNBdkx5QWdJQ0FnSUNBZ0lDQnVaWGgwS0NrN1hISmNiaUFnSUNBdkx5QWdJQ0FnSUgwc1puVnVZM1JwYjI0b1kyOXVkR1Y0ZEN4dVpYaDBLU0I3WEhKY2JpQWdJQ0F2THlBZ0lDQWdJQ0FnSUNCamIyNXpiMnhsTG14dlp5Z25ZMmhoYVc0eUp5azdYSEpjYmlBZ0lDQXZMeUFnSUNBZ0lDQWdJQ0J1WlhoMEtDazdYSEpjYmlBZ0lDQXZMeUFnSUNBZ0lIMHBPMXh5WEc0Z0lDQWdMeTljY2x4dUlDQWdJQzh2SUNBZ0lDQWdZWEJ3TG1kbGRDZ25MMnhwYm1zbkxHWjFibU4wYVc5dUtHTnZiblJsZUhRc2JtVjRkQ2tnZTF4eVhHNGdJQ0FnTHk4Z0lDQWdJQ0FnSUNBZ1kyOXVjMjlzWlM1c2IyY29KMnhwYm1zeEp5azdYSEpjYmlBZ0lDQXZMeUFnSUNBZ0lDQWdJQ0J1WlhoMEtDazdYSEpjYmlBZ0lDQXZMeUFnSUNBZ0lIMHNablZ1WTNScGIyNG9ZMjl1ZEdWNGRDeHVaWGgwS1NCN1hISmNiaUFnSUNBdkx5QWdJQ0FnSUNBZ0lDQmpiMjV6YjJ4bExteHZaeWduYkdsdWF6SW5LVHRjY2x4dUlDQWdJQzh2SUNBZ0lDQWdJQ0FnSUc1bGVIUW9LVHRjY2x4dUlDQWdJQzh2SUNBZ0lDQWdmU2s3WEhKY2JpQWdJQ0F2TDF4eVhHNGdJQ0FnTHk4Z0lDQWdJQ0JoY0hBdWIyNURiMjF3YkdWMFpTaG1kVzVqZEdsdmJpZ3BJSHRjY2x4dUlDQWdJQzh2SUNBZ0lDQWdJQ0FnSUdOdmJuTnZiR1V1Ykc5bktGd2lVblZ1Ym1sdVp5Qm1hVzVoYkd4NVhDSXBPMXh5WEc0Z0lDQWdMeThnSUNBZ0lDQjlLVHRjY2x4dUlDQWdJQzh2WEhKY2JpQWdJQ0F2THlCSlppQjViM1VnWjI4Z2RHOGdKeTlqYUdGcGJpY3NJSGx2ZFNCM2FXeHNJR2RsZENCMGFHVWdabTlzYkc5M2FXNW5JRzFsYzNOaFoyVnpPbHh5WEc0Z0lDQWdMeTljY2x4dUlDQWdJQzh2SUNBZ0lDQWdZMmhoYVc0eFhISmNiaUFnSUNBdkx5QWdJQ0FnSUdOb1lXbHVNbHh5WEc0Z0lDQWdMeThnSUNBZ0lDQlNkVzV1YVc1bklHOXVRMjl0Y0d4bGRHVmNjbHh1SUNBZ0lDOHZYSEpjYmlBZ0lDQXZMMXh5WEc0Z0lDQWdMeThnU1dZZ2VXOTFJR2R2SUhSdklDOXNhVzVyTENCNWIzVWdkMmxzYkNCblpYUWdkR2hsSUdadmJHeHZkMmx1WnlCdFpYTnpZV2RsY3pwY2NseHVJQ0FnSUM4dlhISmNiaUFnSUNBdkx5QWdJQ0FnSUd4cGJtc3hYSEpjYmlBZ0lDQXZMeUFnSUNBZ0lHeHBibXN5WEhKY2JpQWdJQ0F2THlBZ0lDQWdJRkoxYm01cGJtY2diMjVEYjIxd2JHVjBaVnh5WEc0Z0lDQWdMeTljY2x4dUlDQWdJQzh2WEhKY2JpQWdJQ0F2THlCSmRDQnlaV0ZzYkhrZ1kyOXRaWE1nZEc4Z2NHeGhlU0IzYUdWdUlHUnZhVzVuSUdGemVXNWphSEp2Ym05MWN6cGNjbHh1SUNBZ0lDOHZYSEpjYmlBZ0lDQXZMeUFnSUNBZ0lHRndjQzVuWlhRb0p5OWphR0ZwYmljc1puVnVZM1JwYjI0b1kyOXVkR1Y0ZEN4dVpYaDBLU0I3WEhKY2JpQWdJQ0F2THlBZ0lDQWdJQ0FnSkM1blpYUW9KeTl0ZVM5MWNtd25MR1oxYm1OMGFXOXVLQ2tnZTF4eVhHNGdJQ0FnTHk4Z0lDQWdJQ0FnSUNBZ1kyOXVjMjlzWlM1c2IyY29KMk5vWVdsdU1TY3BPMXh5WEc0Z0lDQWdMeThnSUNBZ0lDQWdJQ0FnYm1WNGRDZ3BPMXh5WEc0Z0lDQWdMeThnSUNBZ0lDQWdJSDBwTzF4eVhHNGdJQ0FnTHk4Z0lDQWdJQ0I5TEdaMWJtTjBhVzl1S0dOdmJuUmxlSFFzYm1WNGRDa2dlMXh5WEc0Z0lDQWdMeThnSUNBZ0lDQWdJR052Ym5OdmJHVXViRzluS0NkamFHRnBiakluS1R0Y2NseHVJQ0FnSUM4dklDQWdJQ0FnSUNCdVpYaDBLQ2s3WEhKY2JpQWdJQ0F2THlBZ0lDQWdJSDBwTzF4eVhHNGdJQ0FnTHk5Y2NseHVJQ0FnSUc5dVEyOXRjR3hsZEdVNklHWjFibU4wYVc5dUtHTmhiR3hpWVdOcktTQjdYSEpjYmlBZ0lDQWdJSFJvYVhNdVgyOXVRMjl0Y0d4bGRHVWdQU0JqWVd4c1ltRmphenRjY2x4dUlDQWdJQ0FnY21WMGRYSnVJSFJvYVhNN1hISmNiaUFnSUNCOUxGeHlYRzVjY2x4dUlDQWdJQzh2SUZKbGRIVnlibk1nWUhSeWRXVmdJR2xtSUhSb1pTQmpkWEp5Wlc1MElHRndjR3hwWTJGMGFXOXVJR2x6SUhKMWJtNXBibWN1WEhKY2JpQWdJQ0JwYzFKMWJtNXBibWM2SUdaMWJtTjBhVzl1S0NrZ2UxeHlYRzRnSUNBZ0lDQnlaWFIxY200Z2RHaHBjeTVmY25WdWJtbHVaenRjY2x4dUlDQWdJSDBzWEhKY2JseHlYRzRnSUNBZ0x5OGdTR1ZzY0dWeWN5QmxlSFJsYm1SeklIUm9aU0JGZG1WdWRFTnZiblJsZUhRZ2NISnZkRzkwZVhCbElITndaV05wWm1saklIUnZJSFJvYVhNZ1lYQndMbHh5WEc0Z0lDQWdMeThnVkdocGN5QmhiR3h2ZDNNZ2VXOTFJSFJ2SUdSbFptbHVaU0JoY0hBZ2MzQmxZMmxtYVdNZ2FHVnNjR1Z5SUdaMWJtTjBhVzl1Y3lCMGFHRjBJR05oYmlCaVpTQjFjMlZrWEhKY2JpQWdJQ0F2THlCM2FHVnVaWFpsY2lCNWIzVW5jbVVnYVc1emFXUmxJRzltSUdGdUlHVjJaVzUwSUdOdmJuUmxlSFFnS0hSbGJYQnNZWFJsY3l3Z2NtOTFkR1Z6TENCaWFXNWtLUzVjY2x4dUlDQWdJQzh2WEhKY2JpQWdJQ0F2THlBakl5TWdSWGhoYlhCc1pWeHlYRzRnSUNBZ0x5OWNjbHh1SUNBZ0lDOHZJQ0FnSUNCMllYSWdZWEJ3SUQwZ0pDNXpZVzF0ZVNobWRXNWpkR2x2YmlncElIdGNjbHh1SUNBZ0lDOHZYSEpjYmlBZ0lDQXZMeUFnSUNBZ0lDQm9aV3h3WlhKektIdGNjbHh1SUNBZ0lDOHZJQ0FnSUNBZ0lDQWdkWEJqWVhObE9pQm1kVzVqZEdsdmJpaDBaWGgwS1NCN1hISmNiaUFnSUNBdkx5QWdJQ0FnSUNBZ0lDQnlaWFIxY200Z2RHVjRkQzUwYjFOMGNtbHVaeWdwTG5SdlZYQndaWEpEWVhObEtDazdYSEpjYmlBZ0lDQXZMeUFnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQzh2SUNBZ0lDQWdJSDBwTzF4eVhHNGdJQ0FnTHk5Y2NseHVJQ0FnSUM4dklDQWdJQ0FnSUdkbGRDZ25JeThuTENCbWRXNWpkR2x2YmlncElIc2dkMmwwYUNoMGFHbHpLU0I3WEhKY2JpQWdJQ0F2THlBZ0lDQWdJQ0FnSUM4dklHbHVjMmxrWlNCdlppQjBhR2x6SUdOdmJuUmxlSFFnU1NCallXNGdkWE5sSUhSb1pTQm9aV3h3WlhKelhISmNiaUFnSUNBdkx5QWdJQ0FnSUNBZ0lDUW9KeU50WVdsdUp5a3VhSFJ0YkNoMWNHTmhjMlVvSkNnbkkyMWhhVzRuS1M1MFpYaDBLQ2twTzF4eVhHNGdJQ0FnTHk4Z0lDQWdJQ0FnZlgwcE8xeHlYRzRnSUNBZ0x5OWNjbHh1SUNBZ0lDOHZJQ0FnSUNCOUtUdGNjbHh1SUNBZ0lDOHZYSEpjYmlBZ0lDQXZMMXh5WEc0Z0lDQWdMeThnSXlNaklFRnlaM1Z0Wlc1MGMxeHlYRzRnSUNBZ0x5OWNjbHh1SUNBZ0lDOHZJQ29nWUdWNGRHVnVjMmx2Ym5OZ0lFRnVJRzlpYW1WamRDQmpiMnhzWldOMGFXOXVJRzltSUdaMWJtTjBhVzl1Y3lCMGJ5QmxlSFJsYm1RZ2RHaGxJR052Ym5SbGVIUXVYSEpjYmlBZ0lDQXZMMXh5WEc0Z0lDQWdhR1ZzY0dWeWN6b2dablZ1WTNScGIyNG9aWGgwWlc1emFXOXVjeWtnZTF4eVhHNGdJQ0FnSUNBa0xtVjRkR1Z1WkNoMGFHbHpMbU52Ym5SbGVIUmZjSEp2ZEc5MGVYQmxMbkJ5YjNSdmRIbHdaU3dnWlhoMFpXNXphVzl1Y3lrN1hISmNiaUFnSUNBZ0lISmxkSFZ5YmlCMGFHbHpPMXh5WEc0Z0lDQWdmU3hjY2x4dVhISmNiaUFnSUNBdkx5QklaV3h3WlhJZ1pYaDBaVzVrY3lCMGFHVWdaWFpsYm5RZ1kyOXVkR1Y0ZENCcWRYTjBJR3hwYTJVZ1lHaGxiSEJsY25Nb0tXQWdZblYwSUdSdlpYTWdhWFJjY2x4dUlDQWdJQzh2SUdFZ2MybHVaMnhsSUcxbGRHaHZaQ0JoZENCaElIUnBiV1V1SUZSb2FYTWdhWE1nWlhOd1pXTnBZV3hzZVNCMWMyVm1kV3dnWm05eUlHUjVibUZ0YVdOaGJHeDVJRzVoYldWa1hISmNiaUFnSUNBdkx5Qm9aV3h3WlhKelhISmNiaUFnSUNBdkwxeHlYRzRnSUNBZ0x5OGdJeU1qSUVWNFlXMXdiR1ZjY2x4dUlDQWdJQzh2WEhKY2JpQWdJQ0F2THlBZ0lDQWdMeThnVkhKcGRtbGhiQ0JsZUdGdGNHeGxJSFJvWVhRZ1lXUmtjeUF6SUdobGJIQmxjaUJ0WlhSb2IyUnpJSFJ2SUhSb1pTQmpiMjUwWlhoMElHUjVibUZ0YVdOaGJHeDVYSEpjYmlBZ0lDQXZMeUFnSUNBZ2RtRnlJR0Z3Y0NBOUlDUXVjMkZ0Ylhrb1puVnVZM1JwYjI0b1lYQndLU0I3WEhKY2JpQWdJQ0F2TDF4eVhHNGdJQ0FnTHk4Z0lDQWdJQ0FnSkM1bFlXTm9LRnN4TERJc00xMHNJR1oxYm1OMGFXOXVLR2tzSUc1MWJTa2dlMXh5WEc0Z0lDQWdMeThnSUNBZ0lDQWdJQ0JoY0hBdWFHVnNjR1Z5S0Nkb1pXeHdaWEluSUNzZ2JuVnRMQ0JtZFc1amRHbHZiaWdwSUh0Y2NseHVJQ0FnSUM4dklDQWdJQ0FnSUNBZ0lDQjBhR2x6TG14dlp5aGNJa2tuYlNCb1pXeHdaWElnYm5WdFltVnlJRndpSUNzZ2JuVnRLVHRjY2x4dUlDQWdJQzh2SUNBZ0lDQWdJQ0FnZlNrN1hISmNiaUFnSUNBdkx5QWdJQ0FnSUNCOUtUdGNjbHh1SUNBZ0lDOHZYSEpjYmlBZ0lDQXZMeUFnSUNBZ0lDQjBhR2x6TG1kbGRDZ25JeThuTENCbWRXNWpkR2x2YmlncElIdGNjbHh1SUNBZ0lDOHZJQ0FnSUNBZ0lDQWdkR2hwY3k1b1pXeHdaWEl5S0NrN0lDOHZQVDRnU1NkdElHaGxiSEJsY2lCdWRXMWlaWElnTWx4eVhHNGdJQ0FnTHk4Z0lDQWdJQ0FnZlNrN1hISmNiaUFnSUNBdkx5QWdJQ0FnZlNrN1hISmNiaUFnSUNBdkwxeHlYRzRnSUNBZ0x5OGdJeU1qSUVGeVozVnRaVzUwYzF4eVhHNGdJQ0FnTHk5Y2NseHVJQ0FnSUM4dklDb2dZRzVoYldWZ0lGUm9aU0J1WVcxbElHOW1JSFJvWlNCdFpYUm9iMlJjY2x4dUlDQWdJQzh2SUNvZ1lHMWxkR2h2WkdBZ1ZHaGxJR1oxYm1OMGFXOXVJSFJ2SUdKbElHRmtaR1ZrSUhSdklIUm9aU0J3Y205MGIzUjVjR1VnWVhRZ1lHNWhiV1ZnWEhKY2JpQWdJQ0F2TDF4eVhHNGdJQ0FnYUdWc2NHVnlPaUJtZFc1amRHbHZiaWh1WVcxbExDQnRaWFJvYjJRcElIdGNjbHh1SUNBZ0lDQWdkR2hwY3k1amIyNTBaWGgwWDNCeWIzUnZkSGx3WlM1d2NtOTBiM1I1Y0dWYmJtRnRaVjBnUFNCdFpYUm9iMlE3WEhKY2JpQWdJQ0FnSUhKbGRIVnliaUIwYUdsek8xeHlYRzRnSUNBZ2ZTeGNjbHh1WEhKY2JpQWdJQ0F2THlCQlkzUjFZV3hzZVNCemRHRnlkSE1nZEdobElHRndjR3hwWTJGMGFXOXVKM01nYkdsbVpXTjVZMnhsTGlCZ2NuVnVLQ2xnSUhOb2IzVnNaQ0JpWlNCcGJuWnZhMlZrWEhKY2JpQWdJQ0F2THlCM2FYUm9hVzRnWVNCa2IyTjFiV1Z1ZEM1eVpXRmtlU0JpYkc5amF5QjBieUJsYm5OMWNtVWdkR2hsSUVSUFRTQmxlR2x6ZEhNZ1ltVm1iM0psSUdKcGJtUnBibWNnWlhabGJuUnpMQ0JsZEdNdVhISmNiaUFnSUNBdkwxeHlYRzRnSUNBZ0x5OGdJeU1qSUVWNFlXMXdiR1ZjY2x4dUlDQWdJQzh2WEhKY2JpQWdJQ0F2THlBZ0lDQWdkbUZ5SUdGd2NDQTlJQ1F1YzJGdGJYa29ablZ1WTNScGIyNG9LU0I3SUM0dUxpQjlLVHNnTHk4Z2VXOTFjaUJoY0hCc2FXTmhkR2x2Ymx4eVhHNGdJQ0FnTHk4Z0lDQWdJQ1FvWm5WdVkzUnBiMjRvS1NCN0lDOHZJR1J2WTNWdFpXNTBMbkpsWVdSNVhISmNiaUFnSUNBdkx5QWdJQ0FnSUNBZ1lYQndMbkoxYmlncE8xeHlYRzRnSUNBZ0x5OGdJQ0FnSUgwcE8xeHlYRzRnSUNBZ0x5OWNjbHh1SUNBZ0lDOHZJQ01qSXlCQmNtZDFiV1Z1ZEhOY2NseHVJQ0FnSUM4dlhISmNiaUFnSUNBdkx5QXFJR0J6ZEdGeWRGOTFjbXhnSUU5d2RHbHZibUZzYkhrc0lHRWdVM1J5YVc1bklHTmhiaUJpWlNCd1lYTnpaV1FnZDJocFkyZ2dkR2hsSUVGd2NDQjNhV3hzSUhKbFpHbHlaV04wSUhSdlhISmNiaUFnSUNBdkx5QWdJR0ZtZEdWeUlIUm9aU0JsZG1WdWRITXZjbTkxZEdWeklHaGhkbVVnWW1WbGJpQmliM1Z1WkM1Y2NseHVJQ0FnSUhKMWJqb2dablZ1WTNScGIyNG9jM1JoY25SZmRYSnNLU0I3WEhKY2JpQWdJQ0FnSUdsbUlDaDBhR2x6TG1selVuVnVibWx1WnlncEtTQjdJSEpsZEhWeWJpQm1ZV3h6WlRzZ2ZWeHlYRzRnSUNBZ0lDQjJZWElnWVhCd0lEMGdkR2hwY3p0Y2NseHVYSEpjYmlBZ0lDQWdJQzh2SUdGamRIVmhiR3g1SUdKcGJtUWdZV3hzSUhSb1pTQnNhWE4wWlc1bGNuTmNjbHh1SUNBZ0lDQWdKQzVsWVdOb0tIUm9hWE11YkdsemRHVnVaWEp6TG5SdlNHRnphQ2dwTENCbWRXNWpkR2x2YmlodVlXMWxMQ0JqWVd4c1ltRmphM01wSUh0Y2NseHVJQ0FnSUNBZ0lDQWtMbVZoWTJnb1kyRnNiR0poWTJ0ekxDQm1kVzVqZEdsdmJpaHBMQ0JzYVhOMFpXNWxjbDlqWVd4c1ltRmpheWtnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdZWEJ3TGw5c2FYTjBaVzRvYm1GdFpTd2diR2x6ZEdWdVpYSmZZMkZzYkdKaFkyc3BPMXh5WEc0Z0lDQWdJQ0FnSUgwcE8xeHlYRzRnSUNBZ0lDQjlLVHRjY2x4dVhISmNiaUFnSUNBZ0lIUm9hWE11ZEhKcFoyZGxjaWduY25WdUp5d2dlM04wWVhKMFgzVnliRG9nYzNSaGNuUmZkWEpzZlNrN1hISmNiaUFnSUNBZ0lIUm9hWE11WDNKMWJtNXBibWNnUFNCMGNuVmxPMXh5WEc0Z0lDQWdJQ0F2THlCelpYUWdiR0Z6ZENCc2IyTmhkR2x2Ymx4eVhHNGdJQ0FnSUNCMGFHbHpMbXhoYzNSZmJHOWpZWFJwYjI0Z1BTQnVkV3hzTzF4eVhHNGdJQ0FnSUNCcFppQW9JU2d2WEZ3aktDNHJLUzh1ZEdWemRDaDBhR2x6TG1kbGRFeHZZMkYwYVc5dUtDa3BLU0FtSmlCMGVYQmxiMllnYzNSaGNuUmZkWEpzSUNFOUlDZDFibVJsWm1sdVpXUW5LU0I3WEhKY2JpQWdJQ0FnSUNBZ2RHaHBjeTV6WlhSTWIyTmhkR2x2YmloemRHRnlkRjkxY213cE8xeHlYRzRnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJQzh2SUdOb1pXTnJJSFZ5YkZ4eVhHNGdJQ0FnSUNCMGFHbHpMbDlqYUdWamEweHZZMkYwYVc5dUtDazdYSEpjYmlBZ0lDQWdJSFJvYVhNdVgyeHZZMkYwYVc5dVgzQnliM2g1TG1KcGJtUW9LVHRjY2x4dUlDQWdJQ0FnZEdocGN5NWlhVzVrS0Nkc2IyTmhkR2x2YmkxamFHRnVaMlZrSnl3Z1puVnVZM1JwYjI0b0tTQjdYSEpjYmlBZ0lDQWdJQ0FnWVhCd0xsOWphR1ZqYTB4dlkyRjBhVzl1S0NrN1hISmNiaUFnSUNBZ0lIMHBPMXh5WEc1Y2NseHVJQ0FnSUNBZ0x5OGdZbWx1WkNCMGJ5QnpkV0p0YVhRZ2RHOGdZMkZ3ZEhWeVpTQndiM04wTDNCMWRDOWtaV3hsZEdVZ2NtOTFkR1Z6WEhKY2JpQWdJQ0FnSUhSb2FYTXVZbWx1WkNnbmMzVmliV2wwSnl3Z1puVnVZM1JwYjI0b1pTa2dlMXh5WEc0Z0lDQWdJQ0FnSUdsbUlDZ2dJVk5oYlcxNUxuUmhjbWRsZEVselZHaHBjMWRwYm1SdmR5aGxMQ0FuWm05eWJTY3BJQ2tnZXlCeVpYUjFjbTRnZEhKMVpUc2dmVnh5WEc0Z0lDQWdJQ0FnSUhaaGNpQnlaWFIxY201bFpDQTlJR0Z3Y0M1ZlkyaGxZMnRHYjNKdFUzVmliV2x6YzJsdmJpZ2tLR1V1ZEdGeVoyVjBLUzVqYkc5elpYTjBLQ2RtYjNKdEp5a3BPMXh5WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUFvY21WMGRYSnVaV1FnUFQwOUlHWmhiSE5sS1NBL0lHVXVjSEpsZG1WdWRFUmxabUYxYkhRb0tTQTZJR1poYkhObE8xeHlYRzRnSUNBZ0lDQjlLVHRjY2x4dVhISmNiaUFnSUNBZ0lDOHZJR0pwYm1RZ2RXNXNiMkZrSUhSdklHSnZaSGtnZFc1c2IyRmtYSEpjYmlBZ0lDQWdJQ1FvZDJsdVpHOTNLUzVpYVc1a0tDZDFibXh2WVdRbkxDQm1kVzVqZEdsdmJpZ3BJSHRjY2x4dUlDQWdJQ0FnSUNCaGNIQXVkVzVzYjJGa0tDazdYSEpjYmlBZ0lDQWdJSDBwTzF4eVhHNWNjbHh1SUNBZ0lDQWdMeThnZEhKcFoyZGxjaUJvZEcxc0lHTm9ZVzVuWldSY2NseHVJQ0FnSUNBZ2NtVjBkWEp1SUhSb2FYTXVkSEpwWjJkbGNpZ25ZMmhoYm1kbFpDY3BPMXh5WEc0Z0lDQWdmU3hjY2x4dVhISmNiaUFnSUNBdkx5QlVhR1VnYjNCd2IzTnBkR1VnYjJZZ1lISjFiaWdwWUN3Z2RXNHRZbWx1WkhNZ1lXeHNJR1YyWlc1MElHeHBjM1JsYm1WeWN5QmhibVFnYVc1MFpYSjJZV3h6WEhKY2JpQWdJQ0F2THlCZ2NuVnVLQ2xnSUVGMWRHOXRZWFJwWTJGc2JIa2dZbWx1WkhNZ1lTQmdiMjUxYm14dllXUmdJR1YyWlc1MElIUnZJSEoxYmlCMGFHbHpJSGRvWlc1Y2NseHVJQ0FnSUM4dklIUm9aU0JrYjJOMWJXVnVkQ0JwY3lCamJHOXpaV1F1WEhKY2JpQWdJQ0IxYm14dllXUTZJR1oxYm1OMGFXOXVLQ2tnZTF4eVhHNGdJQ0FnSUNCcFppQW9JWFJvYVhNdWFYTlNkVzV1YVc1bktDa3BJSHNnY21WMGRYSnVJR1poYkhObE95QjlYSEpjYmlBZ0lDQWdJSFpoY2lCaGNIQWdQU0IwYUdsek8xeHlYRzRnSUNBZ0lDQjBhR2x6TG5SeWFXZG5aWElvSjNWdWJHOWhaQ2NwTzF4eVhHNGdJQ0FnSUNBdkx5QmpiR1ZoY2lCcGJuUmxjblpoYkZ4eVhHNGdJQ0FnSUNCMGFHbHpMbDlzYjJOaGRHbHZibDl3Y205NGVTNTFibUpwYm1Rb0tUdGNjbHh1SUNBZ0lDQWdMeThnZFc1aWFXNWtJR1p2Y20wZ2MzVmliV2wwYzF4eVhHNGdJQ0FnSUNCMGFHbHpMaVJsYkdWdFpXNTBLQ2t1ZFc1aWFXNWtLQ2R6ZFdKdGFYUW5LUzV5WlcxdmRtVkRiR0Z6Y3loaGNIQXVaWFpsYm5ST1lXMWxjM0JoWTJVb0tTazdYSEpjYmlBZ0lDQWdJQzh2SUhWdVltbHVaQ0JoYkd3Z1pYWmxiblJ6WEhKY2JpQWdJQ0FnSUNRdVpXRmphQ2gwYUdsekxteHBjM1JsYm1WeWN5NTBiMGhoYzJnb0tTQXNJR1oxYm1OMGFXOXVLRzVoYldVc0lHeHBjM1JsYm1WeWN5a2dlMXh5WEc0Z0lDQWdJQ0FnSUNRdVpXRmphQ2hzYVhOMFpXNWxjbk1zSUdaMWJtTjBhVzl1S0drc0lHeHBjM1JsYm1WeVgyTmhiR3hpWVdOcktTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNCaGNIQXVYM1Z1YkdsemRHVnVLRzVoYldVc0lHeHBjM1JsYm1WeVgyTmhiR3hpWVdOcktUdGNjbHh1SUNBZ0lDQWdJQ0I5S1R0Y2NseHVJQ0FnSUNBZ2ZTazdYSEpjYmlBZ0lDQWdJSFJvYVhNdVgzSjFibTVwYm1jZ1BTQm1ZV3h6WlR0Y2NseHVJQ0FnSUNBZ2NtVjBkWEp1SUhSb2FYTTdYSEpjYmlBZ0lDQjlMRnh5WEc1Y2NseHVJQ0FnSUM4dklFNXZkQ0J2Ym14NUlISjFibk1nWUhWdVltbHVaR0FnWW5WMElHRnNjMjhnWkdWemRISnZlWE1nZEdobElHRndjQ0J5WldabGNtVnVZMlV1WEhKY2JpQWdJQ0JrWlhOMGNtOTVPaUJtZFc1amRHbHZiaWdwSUh0Y2NseHVJQ0FnSUNBZ2RHaHBjeTUxYm14dllXUW9LVHRjY2x4dUlDQWdJQ0FnWkdWc1pYUmxJRk5oYlcxNUxtRndjSE5iZEdocGN5NWxiR1Z0Wlc1MFgzTmxiR1ZqZEc5eVhUdGNjbHh1SUNBZ0lDQWdjbVYwZFhKdUlIUm9hWE03WEhKY2JpQWdJQ0I5TEZ4eVhHNWNjbHh1SUNBZ0lDOHZJRmRwYkd3Z1ltbHVaQ0JoSUhOcGJtZHNaU0JqWVd4c1ltRmpheUJtZFc1amRHbHZiaUIwYnlCbGRtVnllU0JsZG1WdWRDQjBhR0YwSUdseklHRnNjbVZoWkhsY2NseHVJQ0FnSUM4dklHSmxhVzVuSUd4cGMzUmxibVZrSUhSdklHbHVJSFJvWlNCaGNIQXVJRlJvYVhNZ2FXNWpiSFZrWlhNZ1lXeHNJSFJvWlNCZ1FWQlFYMFZXUlU1VVUyQmNjbHh1SUNBZ0lDOHZJR0Z6SUhkbGJHd2dZWE1nWVc1NUlHTjFjM1J2YlNCbGRtVnVkSE1nWkdWbWFXNWxaQ0IzYVhSb0lHQmlhVzVrS0NsZ0xseHlYRzRnSUNBZ0x5OWNjbHh1SUNBZ0lDOHZJRlZ6WldRZ2FXNTBaWEp1WVd4c2VTQm1iM0lnWkdWaWRXY2diRzluWjJsdVp5NWNjbHh1SUNBZ0lHSnBibVJVYjBGc2JFVjJaVzUwY3pvZ1puVnVZM1JwYjI0b1kyRnNiR0poWTJzcElIdGNjbHh1SUNBZ0lDQWdkbUZ5SUdGd2NDQTlJSFJvYVhNN1hISmNiaUFnSUNBZ0lDOHZJR0pwYm1RZ2RHOGdkR2hsSUVGUVVGOUZWa1ZPVkZNZ1ptbHljM1JjY2x4dUlDQWdJQ0FnSkM1bFlXTm9LSFJvYVhNdVFWQlFYMFZXUlU1VVV5d2dablZ1WTNScGIyNG9hU3dnWlNrZ2UxeHlYRzRnSUNBZ0lDQWdJR0Z3Y0M1aWFXNWtLR1VzSUdOaGJHeGlZV05yS1R0Y2NseHVJQ0FnSUNBZ2ZTazdYSEpjYmlBZ0lDQWdJQzh2SUc1bGVIUXNJR0pwYm1RZ2RHOGdiR2x6ZEdWdVpYSWdibUZ0WlhNZ0tHOXViSGtnYVdZZ2RHaGxlU0JrYjI1MElHVjRhWE4wSUdsdUlFRlFVRjlGVmtWT1ZGTXBYSEpjYmlBZ0lDQWdJQ1F1WldGamFDaDBhR2x6TG14cGMzUmxibVZ5Y3k1clpYbHpLSFJ5ZFdVcExDQm1kVzVqZEdsdmJpaHBMQ0J1WVcxbEtTQjdYSEpjYmlBZ0lDQWdJQ0FnYVdZZ0tDUXVhVzVCY25KaGVTaHVZVzFsTENCaGNIQXVRVkJRWDBWV1JVNVVVeWtnUFQwZ0xURXBJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lHRndjQzVpYVc1a0tHNWhiV1VzSUdOaGJHeGlZV05yS1R0Y2NseHVJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJSDBwTzF4eVhHNGdJQ0FnSUNCeVpYUjFjbTRnZEdocGN6dGNjbHh1SUNBZ0lIMHNYSEpjYmx4eVhHNGdJQ0FnTHk4Z1VtVjBkWEp1Y3lCaElHTnZjSGtnYjJZZ2RHaGxJR2RwZG1WdUlIQmhkR2dnZDJsMGFDQmhibmtnY1hWbGNua2djM1J5YVc1bklHRm1kR1Z5SUhSb1pTQm9ZWE5vWEhKY2JpQWdJQ0F2THlCeVpXMXZkbVZrTGx4eVhHNGdJQ0FnY205MWRHRmliR1ZRWVhSb09pQm1kVzVqZEdsdmJpaHdZWFJvS1NCN1hISmNiaUFnSUNBZ0lISmxkSFZ5YmlCd1lYUm9MbkpsY0d4aFkyVW9VVlZGVWxsZlUxUlNTVTVIWDAxQlZFTklSVklzSUNjbktUdGNjbHh1SUNBZ0lIMHNYSEpjYmx4eVhHNGdJQ0FnTHk4Z1IybDJaVzRnWVNCMlpYSmlJR0Z1WkNCaElGTjBjbWx1WnlCd1lYUm9MQ0IzYVd4c0lISmxkSFZ5YmlCbGFYUm9aWElnWVNCeWIzVjBaU0J2WW1wbFkzUWdiM0lnWm1Gc2MyVmNjbHh1SUNBZ0lDOHZJR2xtSUdFZ2JXRjBZMmhwYm1jZ2NtOTFkR1VnWTJGdUlHSmxJR1p2ZFc1a0lIZHBkR2hwYmlCMGFHVWdZM1Z5Y21WdWRDQmtaV1pwYm1Wa0lITmxkQzVjY2x4dUlDQWdJR3h2YjJ0MWNGSnZkWFJsT2lCbWRXNWpkR2x2YmloMlpYSmlMQ0J3WVhSb0tTQjdYSEpjYmlBZ0lDQWdJSFpoY2lCaGNIQWdQU0IwYUdsekxDQnliM1YwWldRZ1BTQm1ZV3h6WlN3Z2FTQTlJREFzSUd3c0lISnZkWFJsTzF4eVhHNGdJQ0FnSUNCcFppQW9kSGx3Wlc5bUlIUm9hWE11Y205MWRHVnpXM1psY21KZElDRTlJQ2QxYm1SbFptbHVaV1FuS1NCN1hISmNiaUFnSUNBZ0lDQWdiQ0E5SUhSb2FYTXVjbTkxZEdWelczWmxjbUpkTG14bGJtZDBhRHRjY2x4dUlDQWdJQ0FnSUNCbWIzSWdLRHNnYVNBOElHdzdJR2tyS3lrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnY205MWRHVWdQU0IwYUdsekxuSnZkWFJsYzF0MlpYSmlYVnRwWFR0Y2NseHVJQ0FnSUNBZ0lDQWdJR2xtSUNoaGNIQXVjbTkxZEdGaWJHVlFZWFJvS0hCaGRHZ3BMbTFoZEdOb0tISnZkWFJsTG5CaGRHZ3BLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSEp2ZFhSbFpDQTlJSEp2ZFhSbE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCaWNtVmhhenRjY2x4dUlDQWdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ2NtVjBkWEp1SUhKdmRYUmxaRHRjY2x4dUlDQWdJSDBzWEhKY2JseHlYRzRnSUNBZ0x5OGdSbWx5YzNRc0lHbHVkbTlyWlhNZ1lHeHZiMnQxY0ZKdmRYUmxLQ2xnSUdGdVpDQnBaaUJoSUhKdmRYUmxJR2x6SUdadmRXNWtMQ0J3WVhKelpYTWdkR2hsWEhKY2JpQWdJQ0F2THlCd2IzTnphV0pzWlNCVlVrd2djR0Z5WVcxeklHRnVaQ0IwYUdWdUlHbHVkbTlyWlhNZ2RHaGxJSEp2ZFhSbEozTWdZMkZzYkdKaFkyc2dkMmwwYUdsdUlHRWdibVYzWEhKY2JpQWdJQ0F2THlCZ1UyRnRiWGt1UlhabGJuUkRiMjUwWlhoMFlDNGdTV1lnZEdobElISnZkWFJsSUdOaGJpQnViM1FnWW1VZ1ptOTFibVFzSUdsMElHTmhiR3h6WEhKY2JpQWdJQ0F2THlCZ2JtOTBSbTkxYm1Rb0tXQXVJRWxtSUdCeVlXbHpaVjlsY25KdmNuTmdJR2x6SUhObGRDQjBieUJnZEhKMVpXQWdZVzVrWEhKY2JpQWdJQ0F2THlCMGFHVWdZR1Z5Y205eUtDbGdJR2hoY3lCdWIzUWdZbVZsYmlCdmRtVnljbWxrWkdWdUxDQnBkQ0IzYVd4c0lIUm9jbTkzSUdGdUlHRmpkSFZoYkNCS1UxeHlYRzRnSUNBZ0x5OGdaWEp5YjNJdVhISmNiaUFnSUNBdkwxeHlYRzRnSUNBZ0x5OGdXVzkxSUhCeWIySmhZbXg1SUhkcGJHd2dibVYyWlhJZ2FHRjJaU0IwYnlCallXeHNJSFJvYVhNZ1pHbHlaV04wYkhrdVhISmNiaUFnSUNBdkwxeHlYRzRnSUNBZ0x5OGdJeU1qSUVGeVozVnRaVzUwYzF4eVhHNGdJQ0FnTHk5Y2NseHVJQ0FnSUM4dklDb2dZSFpsY21KZ0lFRWdVM1J5YVc1bklHWnZjaUIwYUdVZ2RtVnlZaTVjY2x4dUlDQWdJQzh2SUNvZ1lIQmhkR2hnSUVFZ1UzUnlhVzVuSUhCaGRHZ2dkRzhnYkc5dmEzVndMbHh5WEc0Z0lDQWdMeThnS2lCZ2NHRnlZVzF6WUNCQmJpQlBZbXBsWTNRZ2IyWWdVR0Z5WVcxeklIQjFiR3hsWkNCbWNtOXRJSFJvWlNCVlVra2diM0lnY0dGemMyVmtJR1JwY21WamRHeDVMbHh5WEc0Z0lDQWdMeTljY2x4dUlDQWdJQzh2SUNNakl5QlNaWFIxY201elhISmNiaUFnSUNBdkwxeHlYRzRnSUNBZ0x5OGdSV2wwYUdWeUlISmxkSFZ5Ym5NZ2RHaGxJSFpoYkhWbElISmxkSFZ5Ym1Wa0lHSjVJSFJvWlNCeWIzVjBaU0JqWVd4c1ltRmpheUJ2Y2lCeVlXbHpaWE1nWVNBME1EUWdUbTkwSUVadmRXNWtJR1Z5Y205eUxseHlYRzRnSUNBZ0x5OWNjbHh1SUNBZ0lISjFibEp2ZFhSbE9pQm1kVzVqZEdsdmJpaDJaWEppTENCd1lYUm9MQ0J3WVhKaGJYTXNJSFJoY21kbGRDa2dlMXh5WEc0Z0lDQWdJQ0IyWVhJZ1lYQndJRDBnZEdocGN5eGNjbHh1SUNBZ0lDQWdJQ0FnSUhKdmRYUmxJRDBnZEdocGN5NXNiMjlyZFhCU2IzVjBaU2gyWlhKaUxDQndZWFJvS1N4Y2NseHVJQ0FnSUNBZ0lDQWdJR052Ym5SbGVIUXNYSEpjYmlBZ0lDQWdJQ0FnSUNCM2NtRndjR1ZrWDNKdmRYUmxMRnh5WEc0Z0lDQWdJQ0FnSUNBZ1lYSnZkVzVrY3l4Y2NseHVJQ0FnSUNBZ0lDQWdJR0Z5YjNWdVpDeGNjbHh1SUNBZ0lDQWdJQ0FnSUdKbFptOXlaWE1zWEhKY2JpQWdJQ0FnSUNBZ0lDQmlaV1p2Y21Vc1hISmNiaUFnSUNBZ0lDQWdJQ0JqWVd4c1ltRmphMTloY21kekxGeHlYRzRnSUNBZ0lDQWdJQ0FnY0dGMGFGOXdZWEpoYlhNc1hISmNiaUFnSUNBZ0lDQWdJQ0JtYVc1aGJGOXlaWFIxY201bFpEdGNjbHh1WEhKY2JpQWdJQ0FnSUdsbUlDaDBhR2x6TG1SbFluVm5LU0I3WEhKY2JpQWdJQ0FnSUNBZ2RHaHBjeTVzYjJjb0ozSjFibEp2ZFhSbEp5d2dXM1psY21Jc0lIQmhkR2hkTG1wdmFXNG9KeUFuS1NrN1hISmNiaUFnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUhSb2FYTXVkSEpwWjJkbGNpZ25jblZ1TFhKdmRYUmxKeXdnZTNabGNtSTZJSFpsY21Jc0lIQmhkR2c2SUhCaGRHZ3NJSEJoY21GdGN6b2djR0Z5WVcxemZTazdYSEpjYmlBZ0lDQWdJR2xtSUNoMGVYQmxiMllnY0dGeVlXMXpJRDA5SUNkMWJtUmxabWx1WldRbktTQjdJSEJoY21GdGN5QTlJSHQ5T3lCOVhISmNibHh5WEc0Z0lDQWdJQ0FrTG1WNGRHVnVaQ2h3WVhKaGJYTXNJSFJvYVhNdVgzQmhjbk5sVVhWbGNubFRkSEpwYm1jb2NHRjBhQ2twTzF4eVhHNWNjbHh1SUNBZ0lDQWdhV1lnS0hKdmRYUmxLU0I3WEhKY2JpQWdJQ0FnSUNBZ2RHaHBjeTUwY21sbloyVnlLQ2R5YjNWMFpTMW1iM1Z1WkNjc0lIdHliM1YwWlRvZ2NtOTFkR1Y5S1R0Y2NseHVJQ0FnSUNBZ0lDQXZMeUJ3ZFd4c0lHOTFkQ0IwYUdVZ2NHRnlZVzF6SUdaeWIyMGdkR2hsSUhCaGRHaGNjbHh1SUNBZ0lDQWdJQ0JwWmlBb0tIQmhkR2hmY0dGeVlXMXpJRDBnY205MWRHVXVjR0YwYUM1bGVHVmpLSFJvYVhNdWNtOTFkR0ZpYkdWUVlYUm9LSEJoZEdncEtTa2dJVDA5SUc1MWJHd3BJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDOHZJR1pwY25OMElHMWhkR05vSUdseklIUm9aU0JtZFd4c0lIQmhkR2hjY2x4dUlDQWdJQ0FnSUNBZ0lIQmhkR2hmY0dGeVlXMXpMbk5vYVdaMEtDazdYSEpjYmlBZ0lDQWdJQ0FnSUNBdkx5Qm1iM0lnWldGamFDQnZaaUIwYUdVZ2JXRjBZMmhsYzF4eVhHNGdJQ0FnSUNBZ0lDQWdKQzVsWVdOb0tIQmhkR2hmY0dGeVlXMXpMQ0JtZFc1amRHbHZiaWhwTENCd1lYSmhiU2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0F2THlCcFppQjBhR1Z5WlhNZ1lTQnRZWFJqYUdsdVp5QndZWEpoYlNCdVlXMWxYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2h5YjNWMFpTNXdZWEpoYlY5dVlXMWxjMXRwWFNrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDOHZJSE5sZENCMGFHVWdibUZ0WlNCMGJ5QjBhR1VnYldGMFkyaGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQndZWEpoYlhOYmNtOTFkR1V1Y0dGeVlXMWZibUZ0WlhOYmFWMWRJRDBnWDJSbFkyOWtaU2h3WVhKaGJTazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIMGdaV3h6WlNCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0x5OGdhVzVwZEdsaGJHbDZaU0FuYzNCc1lYUW5YSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1lnS0NGd1lYSmhiWE11YzNCc1lYUXBJSHNnY0dGeVlXMXpMbk53YkdGMElEMGdXMTA3SUgxY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNCd1lYSmhiWE11YzNCc1lYUXVjSFZ6YUNoZlpHVmpiMlJsS0hCaGNtRnRLU2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnSUNBZ0lIMHBPMXh5WEc0Z0lDQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQ0FnTHk4Z2MyVjBJR1YyWlc1MElHTnZiblJsZUhSY2NseHVJQ0FnSUNBZ0lDQmpiMjUwWlhoMElDQTlJRzVsZHlCMGFHbHpMbU52Ym5SbGVIUmZjSEp2ZEc5MGVYQmxLSFJvYVhNc0lIWmxjbUlzSUhCaGRHZ3NJSEJoY21GdGN5d2dkR0Z5WjJWMEtUdGNjbHh1SUNBZ0lDQWdJQ0F2THlCbGJuTjFjbVVnWVhKeVlYbHpYSEpjYmlBZ0lDQWdJQ0FnWVhKdmRXNWtjeUE5SUhSb2FYTXVZWEp2ZFc1a2N5NXpiR2xqWlNnd0tUdGNjbHh1SUNBZ0lDQWdJQ0JpWldadmNtVnpJRDBnZEdocGN5NWlaV1p2Y21WekxuTnNhV05sS0RBcE8xeHlYRzRnSUNBZ0lDQWdJQzh2SUhObGRDQjBhR1VnWTJGc2JHSmhZMnNnWVhKbmN5QjBieUIwYUdVZ1kyOXVkR1Y0ZENBcklHTnZiblJsYm5SeklHOW1JSFJvWlNCemNHeGhkRnh5WEc0Z0lDQWdJQ0FnSUdOaGJHeGlZV05yWDJGeVozTWdQU0JiWTI5dWRHVjRkRjA3WEhKY2JpQWdJQ0FnSUNBZ2FXWWdLSEJoY21GdGN5NXpjR3hoZENrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnWTJGc2JHSmhZMnRmWVhKbmN5QTlJR05oYkd4aVlXTnJYMkZ5WjNNdVkyOXVZMkYwS0hCaGNtRnRjeTV6Y0d4aGRDazdYSEpjYmlBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ0lDOHZJSGR5WVhBZ2RHaGxJSEp2ZFhSbElIVndJSGRwZEdnZ2RHaGxJR0psWm05eVpTQm1hV3gwWlhKelhISmNiaUFnSUNBZ0lDQWdkM0poY0hCbFpGOXliM1YwWlNBOUlHWjFibU4wYVc5dUtDa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ2RtRnlJSEpsZEhWeWJtVmtMQ0JwTENCdVpYaDBVbTkxZEdVN1hISmNiaUFnSUNBZ0lDQWdJQ0IzYUdsc1pTQW9ZbVZtYjNKbGN5NXNaVzVuZEdnZ1BpQXdLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJR0psWm05eVpTQTlJR0psWm05eVpYTXVjMmhwWm5Rb0tUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0x5OGdZMmhsWTJzZ2RHaGxJRzl3ZEdsdmJuTmNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLR0Z3Y0M1amIyNTBaWGgwVFdGMFkyaGxjMDl3ZEdsdmJuTW9ZMjl1ZEdWNGRDd2dZbVZtYjNKbFd6QmRLU2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUhKbGRIVnlibVZrSUQwZ1ltVm1iM0psV3pGZExtRndjR3g1S0dOdmJuUmxlSFFzSUZ0amIyNTBaWGgwWFNrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLSEpsZEhWeWJtVmtJRDA5UFNCbVlXeHpaU2tnZXlCeVpYUjFjbTRnWm1Gc2MyVTdJSDFjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQWdJQ0FnWVhCd0xteGhjM1JmY205MWRHVWdQU0J5YjNWMFpUdGNjbHh1SUNBZ0lDQWdJQ0FnSUdOdmJuUmxlSFF1ZEhKcFoyZGxjaWduWlhabGJuUXRZMjl1ZEdWNGRDMWlaV1p2Y21VbkxDQjdZMjl1ZEdWNGREb2dZMjl1ZEdWNGRIMHBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0x5OGdjblZ1SUcxMWJIUnBjR3hsSUdOaGJHeGlZV05yYzF4eVhHNGdJQ0FnSUNBZ0lDQWdhV1lnS0hSNWNHVnZaaWh5YjNWMFpTNWpZV3hzWW1GamF5a2dQVDA5SUZ3aVpuVnVZM1JwYjI1Y0lpa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQnliM1YwWlM1allXeHNZbUZqYXlBOUlGdHliM1YwWlM1allXeHNZbUZqYTEwN1hISmNiaUFnSUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUNBZ0lDQnBaaUFvY205MWRHVXVZMkZzYkdKaFkyc2dKaVlnY205MWRHVXVZMkZzYkdKaFkyc3ViR1Z1WjNSb0tTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lHa2dQU0F0TVR0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnYm1WNGRGSnZkWFJsSUQwZ1puVnVZM1JwYjI0b0tTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdhU3NyTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbUlDaHliM1YwWlM1allXeHNZbUZqYTF0cFhTa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY21WMGRYSnVaV1FnUFNCeWIzVjBaUzVqWVd4c1ltRmphMXRwWFM1aGNIQnNlU2hqYjI1MFpYaDBMR05oYkd4aVlXTnJYMkZ5WjNNcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lIMGdaV3h6WlNCcFppQW9ZWEJ3TGw5dmJrTnZiWEJzWlhSbElDWW1JSFI1Y0dWdlppaGhjSEF1WDI5dVEyOXRjR3hsZEdVZ1BUMDlJRndpWm5WdVkzUnBiMjVjSWlrcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR0Z3Y0M1ZmIyNURiMjF3YkdWMFpTaGpiMjUwWlhoMEtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIMDdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lHTmhiR3hpWVdOclgyRnlaM011Y0hWemFDaHVaWGgwVW05MWRHVXBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQnVaWGgwVW05MWRHVW9LVHRjY2x4dUlDQWdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdJQ0FnSUdOdmJuUmxlSFF1ZEhKcFoyZGxjaWduWlhabGJuUXRZMjl1ZEdWNGRDMWhablJsY2ljc0lIdGpiMjUwWlhoME9pQmpiMjUwWlhoMGZTazdYSEpjYmlBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnY21WMGRYSnVaV1E3WEhKY2JpQWdJQ0FnSUNBZ2ZUdGNjbHh1SUNBZ0lDQWdJQ0FrTG1WaFkyZ29ZWEp2ZFc1a2N5NXlaWFpsY25ObEtDa3NJR1oxYm1OMGFXOXVLR2tzSUdGeWIzVnVaQ2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdkbUZ5SUd4aGMzUmZkM0poY0hCbFpGOXliM1YwWlNBOUlIZHlZWEJ3WldSZmNtOTFkR1U3WEhKY2JpQWdJQ0FnSUNBZ0lDQjNjbUZ3Y0dWa1gzSnZkWFJsSUQwZ1puVnVZM1JwYjI0b0tTQjdJSEpsZEhWeWJpQmhjbTkxYm1RdVlYQndiSGtvWTI5dWRHVjRkQ3dnVzJ4aGMzUmZkM0poY0hCbFpGOXliM1YwWlYwcE95QjlPMXh5WEc0Z0lDQWdJQ0FnSUgwcE8xeHlYRzRnSUNBZ0lDQWdJSFJ5ZVNCN1hISmNiaUFnSUNBZ0lDQWdJQ0JtYVc1aGJGOXlaWFIxY201bFpDQTlJSGR5WVhCd1pXUmZjbTkxZEdVb0tUdGNjbHh1SUNBZ0lDQWdJQ0I5SUdOaGRHTm9LR1VwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJSFJvYVhNdVpYSnliM0lvV3ljMU1EQWdSWEp5YjNJbkxDQjJaWEppTENCd1lYUm9YUzVxYjJsdUtDY2dKeWtzSUdVcE8xeHlYRzRnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnSUNCeVpYUjFjbTRnWm1sdVlXeGZjbVYwZFhKdVpXUTdYSEpjYmlBZ0lDQWdJSDBnWld4elpTQjdYSEpjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJSFJvYVhNdWJtOTBSbTkxYm1Rb2RtVnlZaXdnY0dGMGFDazdYSEpjYmlBZ0lDQWdJSDFjY2x4dUlDQWdJSDBzWEhKY2JseHlYRzRnSUNBZ0x5OGdUV0YwWTJobGN5QmhiaUJ2WW1wbFkzUWdiMllnYjNCMGFXOXVjeUJoWjJGcGJuTjBJR0Z1SUdCRmRtVnVkRU52Ym5SbGVIUmdJR3hwYTJVZ2IySnFaV04wSUhSb1lYUmNjbHh1SUNBZ0lDOHZJR052Ym5SaGFXNXpJR0J3WVhSb1lDQmhibVFnWUhabGNtSmdJR0YwZEhKcFluVjBaWE11SUVsdWRHVnlibUZzYkhrZ1UyRnRiWGtnZFhObGN5QjBhR2x6WEhKY2JpQWdJQ0F2THlCbWIzSWdiV0YwWTJocGJtY2dZR0psWm05eVpTZ3BZQ0JtYVd4MFpYSnpJR0ZuWVdsdWMzUWdjM0JsWTJsbWFXTWdiM0IwYVc5dWN5NGdXVzkxSUdOaGJpQnpaWFFnZEdobFhISmNiaUFnSUNBdkx5QnZZbXBsWTNRZ2RHOGdYMjl1YkhsZklHMWhkR05vSUdObGNuUmhhVzRnY0dGMGFITWdiM0lnZG1WeVluTXNJRzl5SUcxaGRHTm9JR0ZzYkNCd1lYUm9jeUJ2Y2lCMlpYSmljeUJmWlhoalpYQjBYMXh5WEc0Z0lDQWdMeThnZEdodmMyVWdkR2hoZENCdFlYUmphQ0IwYUdVZ2IzQjBhVzl1Y3k1Y2NseHVJQ0FnSUM4dlhISmNiaUFnSUNBdkx5QWpJeU1nUlhoaGJYQnNaVnh5WEc0Z0lDQWdMeTljY2x4dUlDQWdJQzh2SUNBZ0lDQjJZWElnWVhCd0lEMGdKQzV6WVcxdGVTZ3BMRnh5WEc0Z0lDQWdMeThnSUNBZ0lDQWdJQ0JqYjI1MFpYaDBJRDBnZTNabGNtSTZJQ2RuWlhRbkxDQndZWFJvT2lBbkl5OXRlWEJoZEdnbmZUdGNjbHh1SUNBZ0lDOHZYSEpjYmlBZ0lDQXZMeUFnSUNBZ0x5OGdiV0YwWTJnZ1lXZGhhVzV6ZENCaElIQmhkR2dnYzNSeWFXNW5YSEpjYmlBZ0lDQXZMeUFnSUNBZ1lYQndMbU52Ym5SbGVIUk5ZWFJqYUdWelQzQjBhVzl1Y3loamIyNTBaWGgwTENBbkl5OXRlWEJoZEdnbktUc2dMeTg5UGlCMGNuVmxYSEpjYmlBZ0lDQXZMeUFnSUNBZ1lYQndMbU52Ym5SbGVIUk5ZWFJqYUdWelQzQjBhVzl1Y3loamIyNTBaWGgwTENBbkl5OXZkR2hsY25CaGRHZ25LVHNnTHk4OVBpQm1ZV3h6WlZ4eVhHNGdJQ0FnTHk4Z0lDQWdJQzh2SUdWeGRXbDJZV3hsYm5RZ2RHOWNjbHh1SUNBZ0lDOHZJQ0FnSUNCaGNIQXVZMjl1ZEdWNGRFMWhkR05vWlhOUGNIUnBiMjV6S0dOdmJuUmxlSFFzSUh0dmJteDVPaUI3Y0dGMGFEb25JeTl0ZVhCaGRHZ25mWDBwT3lBdkx6MCtJSFJ5ZFdWY2NseHVJQ0FnSUM4dklDQWdJQ0JoY0hBdVkyOXVkR1Y0ZEUxaGRHTm9aWE5QY0hScGIyNXpLR052Ym5SbGVIUXNJSHR2Ym14NU9pQjdjR0YwYURvbkl5OXZkR2hsY25CaGRHZ25mWDBwT3lBdkx6MCtJR1poYkhObFhISmNiaUFnSUNBdkx5QWdJQ0FnTHk4Z2JXRjBZMmdnWVdkaGFXNXpkQ0JoSUhCaGRHZ2djbVZuWlhod1hISmNiaUFnSUNBdkx5QWdJQ0FnWVhCd0xtTnZiblJsZUhSTllYUmphR1Z6VDNCMGFXOXVjeWhqYjI1MFpYaDBMQ0F2Y0dGMGFDOHBPeUF2THowK0lIUnlkV1ZjY2x4dUlDQWdJQzh2SUNBZ0lDQmhjSEF1WTI5dWRHVjRkRTFoZEdOb1pYTlBjSFJwYjI1ektHTnZiblJsZUhRc0lDOWVjR0YwYUM4cE95QXZMejArSUdaaGJITmxYSEpjYmlBZ0lDQXZMeUFnSUNBZ0x5OGdiV0YwWTJnZ2IyNXNlU0JoSUhabGNtSmNjbHh1SUNBZ0lDOHZJQ0FnSUNCaGNIQXVZMjl1ZEdWNGRFMWhkR05vWlhOUGNIUnBiMjV6S0dOdmJuUmxlSFFzSUh0dmJteDVPaUI3ZG1WeVlqb25aMlYwSjMxOUtUc2dMeTg5UGlCMGNuVmxYSEpjYmlBZ0lDQXZMeUFnSUNBZ1lYQndMbU52Ym5SbGVIUk5ZWFJqYUdWelQzQjBhVzl1Y3loamIyNTBaWGgwTENCN2IyNXNlVG9nZTNabGNtSTZKM0J2YzNRbmZYMHBPeUF2THowK0lHWmhiSE5sWEhKY2JpQWdJQ0F2THlBZ0lDQWdMeThnYldGMFkyZ2dZV3hzSUdWNFkyVndkQ0JoSUhabGNtSmNjbHh1SUNBZ0lDOHZJQ0FnSUNCaGNIQXVZMjl1ZEdWNGRFMWhkR05vWlhOUGNIUnBiMjV6S0dOdmJuUmxlSFFzSUh0bGVHTmxjSFE2SUh0MlpYSmlPaWR3YjNOMEozMTlLVHNnTHk4OVBpQjBjblZsWEhKY2JpQWdJQ0F2THlBZ0lDQWdZWEJ3TG1OdmJuUmxlSFJOWVhSamFHVnpUM0IwYVc5dWN5aGpiMjUwWlhoMExDQjdaWGhqWlhCME9pQjdkbVZ5WWpvbloyVjBKMzE5S1RzZ0x5ODlQaUJtWVd4elpWeHlYRzRnSUNBZ0x5OGdJQ0FnSUM4dklHMWhkR05vSUdGc2JDQmxlR05sY0hRZ1lTQndZWFJvWEhKY2JpQWdJQ0F2THlBZ0lDQWdZWEJ3TG1OdmJuUmxlSFJOWVhSamFHVnpUM0IwYVc5dWN5aGpiMjUwWlhoMExDQjdaWGhqWlhCME9pQjdjR0YwYURvbkl5OXZkR2hsY25CaGRHZ25mWDBwT3lBdkx6MCtJSFJ5ZFdWY2NseHVJQ0FnSUM4dklDQWdJQ0JoY0hBdVkyOXVkR1Y0ZEUxaGRHTm9aWE5QY0hScGIyNXpLR052Ym5SbGVIUXNJSHRsZUdObGNIUTZJSHR3WVhSb09pY2pMMjE1Y0dGMGFDZDlmU2s3SUM4dlBUNGdabUZzYzJWY2NseHVJQ0FnSUM4dklDQWdJQ0F2THlCdFlYUmphQ0JoYkd3Z1pYaGpaWEIwSUdFZ2RtVnlZaUJoYm1RZ1lTQndZWFJvWEhKY2JpQWdJQ0F2THlBZ0lDQWdZWEJ3TG1OdmJuUmxlSFJOWVhSamFHVnpUM0IwYVc5dWN5aGpiMjUwWlhoMExDQjdaWGhqWlhCME9pQjdjR0YwYURvbkl5OXZkR2hsY25CaGRHZ25MQ0IyWlhKaU9pZHdiM04wSjMxOUtUc2dMeTg5UGlCMGNuVmxYSEpjYmlBZ0lDQXZMeUFnSUNBZ1lYQndMbU52Ym5SbGVIUk5ZWFJqYUdWelQzQjBhVzl1Y3loamIyNTBaWGgwTENCN1pYaGpaWEIwT2lCN2NHRjBhRG9uSXk5dGVYQmhkR2duTENCMlpYSmlPaWR3YjNOMEozMTlLVHNnTHk4OVBpQjBjblZsWEhKY2JpQWdJQ0F2THlBZ0lDQWdZWEJ3TG1OdmJuUmxlSFJOWVhSamFHVnpUM0IwYVc5dWN5aGpiMjUwWlhoMExDQjdaWGhqWlhCME9pQjdjR0YwYURvbkl5OXRlWEJoZEdnbkxDQjJaWEppT2lkblpYUW5mWDBwT3lBdkx6MCtJR1poYkhObFhISmNiaUFnSUNBdkx5QWdJQ0FnTHk4Z2JXRjBZMmdnYlhWc2RHbHdiR1VnY0dGMGFITmNjbHh1SUNBZ0lDOHZJQ0FnSUNCaGNIQXVZMjl1ZEdWNGRFMWhkR05vWlhOUGNIUnBiMjV6S0dOdmJuUmxlSFFzSUh0d1lYUm9PaUJiSnlNdmJYbHdZWFJvSnl3Z0p5TXZiM1JvWlhKd1lYUm9KMTE5S1RzZ0x5ODlQaUIwY25WbFhISmNiaUFnSUNBdkx5QWdJQ0FnWVhCd0xtTnZiblJsZUhSTllYUmphR1Z6VDNCMGFXOXVjeWhqYjI1MFpYaDBMQ0I3Y0dGMGFEb2dXeWNqTDI5MGFHVnljR0YwYUNjc0lDY2pMM1JvYVhKa2NHRjBhQ2RkZlNrN0lDOHZQVDRnWm1Gc2MyVmNjbHh1SUNBZ0lDOHZJQ0FnSUNBdkx5QmxjWFZwZG1Gc1pXNTBJSFJ2WEhKY2JpQWdJQ0F2THlBZ0lDQWdZWEJ3TG1OdmJuUmxlSFJOWVhSamFHVnpUM0IwYVc5dWN5aGpiMjUwWlhoMExDQjdiMjVzZVRvZ2UzQmhkR2c2SUZzbkl5OXRlWEJoZEdnbkxDQW5JeTl2ZEdobGNuQmhkR2duWFgxOUtUc2dMeTg5UGlCMGNuVmxYSEpjYmlBZ0lDQXZMeUFnSUNBZ1lYQndMbU52Ym5SbGVIUk5ZWFJqYUdWelQzQjBhVzl1Y3loamIyNTBaWGgwTENCN2IyNXNlVG9nZTNCaGRHZzZJRnNuSXk5dmRHaGxjbkJoZEdnbkxDQW5JeTkwYUdseVpIQmhkR2duWFgxOUtUc2dMeTg5UGlCbVlXeHpaVnh5WEc0Z0lDQWdMeThnSUNBZ0lDOHZJRzFoZEdOb0lHRnNiQ0JsZUdObGNIUWdiWFZzZEdsd2JHVWdjR0YwYUhOY2NseHVJQ0FnSUM4dklDQWdJQ0JoY0hBdVkyOXVkR1Y0ZEUxaGRHTm9aWE5QY0hScGIyNXpLR052Ym5SbGVIUXNJSHRsZUdObGNIUTZJSHR3WVhSb09pQmJKeU12Ylhsd1lYUm9KeXdnSnlNdmIzUm9aWEp3WVhSb0oxMTlmU2s3SUM4dlBUNGdabUZzYzJWY2NseHVJQ0FnSUM4dklDQWdJQ0JoY0hBdVkyOXVkR1Y0ZEUxaGRHTm9aWE5QY0hScGIyNXpLR052Ym5SbGVIUXNJSHRsZUdObGNIUTZJSHR3WVhSb09pQmJKeU12YjNSb1pYSndZWFJvSnl3Z0p5TXZkR2hwY21Sd1lYUm9KMTE5ZlNrN0lDOHZQVDRnZEhKMVpWeHlYRzRnSUNBZ0x5OGdJQ0FnSUM4dklHMWhkR05vSUdGc2JDQmxlR05sY0hRZ2JYVnNkR2x3YkdVZ2NHRjBhSE1nWVc1a0lIWmxjbUp6WEhKY2JpQWdJQ0F2THlBZ0lDQWdZWEJ3TG1OdmJuUmxlSFJOWVhSamFHVnpUM0IwYVc5dWN5aGpiMjUwWlhoMExDQjdaWGhqWlhCME9pQjdjR0YwYURvZ1d5Y2pMMjE1Y0dGMGFDY3NJQ2NqTDI5MGFHVnljR0YwYUNkZExDQjJaWEppT2lCYkoyZGxkQ2NzSUNkd2IzTjBKMTE5ZlNrN0lDOHZQVDRnWm1Gc2MyVmNjbHh1SUNBZ0lDOHZJQ0FnSUNCaGNIQXVZMjl1ZEdWNGRFMWhkR05vWlhOUGNIUnBiMjV6S0dOdmJuUmxlSFFzSUh0bGVHTmxjSFE2SUh0d1lYUm9PaUJiSnlNdmIzUm9aWEp3WVhSb0p5d2dKeU12ZEdocGNtUndZWFJvSjEwc0lIWmxjbUk2SUZzbloyVjBKeXdnSjNCdmMzUW5YWDE5S1RzZ0x5ODlQaUIwY25WbFhISmNiaUFnSUNBdkwxeHlYRzRnSUNBZ1kyOXVkR1Y0ZEUxaGRHTm9aWE5QY0hScGIyNXpPaUJtZFc1amRHbHZiaWhqYjI1MFpYaDBMQ0J0WVhSamFGOXZjSFJwYjI1ekxDQndiM05wZEdsMlpTa2dlMXh5WEc0Z0lDQWdJQ0IyWVhJZ2IzQjBhVzl1Y3lBOUlHMWhkR05vWDI5d2RHbHZibk03WEhKY2JpQWdJQ0FnSUM4dklHNXZjbTFoYkdsNlpTQnZjSFJwYjI1elhISmNiaUFnSUNBZ0lHbG1JQ2gwZVhCbGIyWWdiM0IwYVc5dWN5QTlQVDBnSjNOMGNtbHVaeWNnZkh3Z1gybHpVbVZuUlhod0tHOXdkR2x2Ym5NcEtTQjdYSEpjYmlBZ0lDQWdJQ0FnYjNCMGFXOXVjeUE5SUh0d1lYUm9PaUJ2Y0hScGIyNXpmVHRjY2x4dUlDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNCcFppQW9kSGx3Wlc5bUlIQnZjMmwwYVhabElEMDlQU0FuZFc1a1pXWnBibVZrSnlrZ2UxeHlYRzRnSUNBZ0lDQWdJSEJ2YzJsMGFYWmxJRDBnZEhKMVpUdGNjbHh1SUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0F2THlCbGJYQjBlU0J2Y0hScGIyNXpJR0ZzZDJGNWN5QnRZWFJqYUZ4eVhHNGdJQ0FnSUNCcFppQW9KQzVwYzBWdGNIUjVUMkpxWldOMEtHOXdkR2x2Ym5NcEtTQjdYSEpjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJSFJ5ZFdVN1hISmNiaUFnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdMeThnUkc4Z2QyVWdhR0YyWlNCMGJ5QnRZWFJqYUNCaFoyRnBibk4wSUcxMWJIUnBjR3hsSUhCaGRHaHpQMXh5WEc0Z0lDQWdJQ0JwWmlBb1gybHpRWEp5WVhrb2IzQjBhVzl1Y3k1d1lYUm9LU2w3WEhKY2JpQWdJQ0FnSUNBZ2RtRnlJSEpsYzNWc2RITXNJRzUxYlc5d2RDd2diM0IwY3l3Z2JHVnVPMXh5WEc0Z0lDQWdJQ0FnSUhKbGMzVnNkSE1nUFNCYlhUdGNjbHh1SUNBZ0lDQWdJQ0JtYjNJZ0tHNTFiVzl3ZENBOUlEQXNJR3hsYmlBOUlHOXdkR2x2Ym5NdWNHRjBhQzVzWlc1bmRHZzdJRzUxYlc5d2RDQThJR3hsYmpzZ2JuVnRiM0IwSUNzOUlERXBJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lHOXdkSE1nUFNBa0xtVjRkR1Z1WkNoN2ZTd2diM0IwYVc5dWN5d2dlM0JoZEdnNklHOXdkR2x2Ym5NdWNHRjBhRnR1ZFcxdmNIUmRmU2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQnlaWE4xYkhSekxuQjFjMmdvZEdocGN5NWpiMjUwWlhoMFRXRjBZMmhsYzA5d2RHbHZibk1vWTI5dWRHVjRkQ3dnYjNCMGN5a3BPMXh5WEc0Z0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ0lDQjJZWElnYldGMFkyaGxaQ0E5SUNRdWFXNUJjbkpoZVNoMGNuVmxMQ0J5WlhOMWJIUnpLU0ErSUMweElEOGdkSEoxWlNBNklHWmhiSE5sTzF4eVhHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCd2IzTnBkR2wyWlNBL0lHMWhkR05vWldRZ09pQWhiV0YwWTJobFpEdGNjbHh1SUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0JwWmlBb2IzQjBhVzl1Y3k1dmJteDVLU0I3WEhKY2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUhSb2FYTXVZMjl1ZEdWNGRFMWhkR05vWlhOUGNIUnBiMjV6S0dOdmJuUmxlSFFzSUc5d2RHbHZibk11YjI1c2VTd2dkSEoxWlNrN1hISmNiaUFnSUNBZ0lIMGdaV3h6WlNCcFppQW9iM0IwYVc5dWN5NWxlR05sY0hRcElIdGNjbHh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdkR2hwY3k1amIyNTBaWGgwVFdGMFkyaGxjMDl3ZEdsdmJuTW9ZMjl1ZEdWNGRDd2diM0IwYVc5dWN5NWxlR05sY0hRc0lHWmhiSE5sS1R0Y2NseHVJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQjJZWElnY0dGMGFGOXRZWFJqYUdWa0lEMGdkSEoxWlN3Z2RtVnlZbDl0WVhSamFHVmtJRDBnZEhKMVpUdGNjbHh1SUNBZ0lDQWdhV1lnS0c5d2RHbHZibk11Y0dGMGFDa2dlMXh5WEc0Z0lDQWdJQ0FnSUdsbUlDZ2hYMmx6VW1WblJYaHdLRzl3ZEdsdmJuTXVjR0YwYUNrcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUc5d2RHbHZibk11Y0dGMGFDQTlJRzVsZHlCU1pXZEZlSEFvYjNCMGFXOXVjeTV3WVhSb0xuUnZVM1J5YVc1bktDa2dLeUFuSkNjcE8xeHlYRzRnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnSUNCd1lYUm9YMjFoZEdOb1pXUWdQU0J2Y0hScGIyNXpMbkJoZEdndWRHVnpkQ2hqYjI1MFpYaDBMbkJoZEdncE8xeHlYRzRnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJR2xtSUNodmNIUnBiMjV6TG5abGNtSXBJSHRjY2x4dUlDQWdJQ0FnSUNCcFppaDBlWEJsYjJZZ2IzQjBhVzl1Y3k1MlpYSmlJRDA5UFNBbmMzUnlhVzVuSnlrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnZG1WeVlsOXRZWFJqYUdWa0lEMGdiM0IwYVc5dWN5NTJaWEppSUQwOVBTQmpiMjUwWlhoMExuWmxjbUk3WEhKY2JpQWdJQ0FnSUNBZ2ZTQmxiSE5sSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJSFpsY21KZmJXRjBZMmhsWkNBOUlHOXdkR2x2Ym5NdWRtVnlZaTVwYm1SbGVFOW1LR052Ym5SbGVIUXVkbVZ5WWlrZ1BpQXRNVHRjY2x4dUlDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdjbVYwZFhKdUlIQnZjMmwwYVhabElEOGdLSFpsY21KZmJXRjBZMmhsWkNBbUppQndZWFJvWDIxaGRHTm9aV1FwSURvZ0lTaDJaWEppWDIxaGRHTm9aV1FnSmlZZ2NHRjBhRjl0WVhSamFHVmtLVHRjY2x4dUlDQWdJSDBzWEhKY2JseHlYRzVjY2x4dUlDQWdJQzh2SUVSbGJHVm5ZWFJsY3lCMGJ5QjBhR1VnWUd4dlkyRjBhVzl1WDNCeWIzaDVZQ0IwYnlCblpYUWdkR2hsSUdOMWNuSmxiblFnYkc5allYUnBiMjR1WEhKY2JpQWdJQ0F2THlCVFpXVWdZRk5oYlcxNUxrUmxabUYxYkhSTWIyTmhkR2x2YmxCeWIzaDVZQ0JtYjNJZ2JXOXlaU0JwYm1adklHOXVJR3h2WTJGMGFXOXVJSEJ5YjNocFpYTXVYSEpjYmlBZ0lDQm5aWFJNYjJOaGRHbHZiam9nWm5WdVkzUnBiMjRvS1NCN1hISmNiaUFnSUNBZ0lISmxkSFZ5YmlCMGFHbHpMbDlzYjJOaGRHbHZibDl3Y205NGVTNW5aWFJNYjJOaGRHbHZiaWdwTzF4eVhHNGdJQ0FnZlN4Y2NseHVYSEpjYmlBZ0lDQXZMeUJFWld4bFoyRjBaWE1nZEc4Z2RHaGxJR0JzYjJOaGRHbHZibDl3Y205NGVXQWdkRzhnYzJWMElIUm9aU0JqZFhKeVpXNTBJR3h2WTJGMGFXOXVMbHh5WEc0Z0lDQWdMeThnVTJWbElHQlRZVzF0ZVM1RVpXWmhkV3gwVEc5allYUnBiMjVRY205NGVXQWdabTl5SUcxdmNtVWdhVzVtYnlCdmJpQnNiMk5oZEdsdmJpQndjbTk0YVdWekxseHlYRzRnSUNBZ0x5OWNjbHh1SUNBZ0lDOHZJQ01qSXlCQmNtZDFiV1Z1ZEhOY2NseHVJQ0FnSUM4dlhISmNiaUFnSUNBdkx5QXFJR0J1WlhkZmJHOWpZWFJwYjI1Z0lFRWdibVYzSUd4dlkyRjBhVzl1SUhOMGNtbHVaeUFvWlM1bkxpQW5JeThuS1Z4eVhHNGdJQ0FnTHk5Y2NseHVJQ0FnSUhObGRFeHZZMkYwYVc5dU9pQm1kVzVqZEdsdmJpaHVaWGRmYkc5allYUnBiMjRwSUh0Y2NseHVJQ0FnSUNBZ2NtVjBkWEp1SUhSb2FYTXVYMnh2WTJGMGFXOXVYM0J5YjNoNUxuTmxkRXh2WTJGMGFXOXVLRzVsZDE5c2IyTmhkR2x2YmlrN1hISmNiaUFnSUNCOUxGeHlYRzVjY2x4dUlDQWdJQzh2SUZOM1lYQnpJSFJvWlNCamIyNTBaVzUwSUc5bUlHQWtaV3hsYldWdWRDZ3BZQ0IzYVhSb0lHQmpiMjUwWlc1MFlGeHlYRzRnSUNBZ0x5OGdXVzkxSUdOaGJpQnZkbVZ5Y21sa1pTQjBhR2x6SUcxbGRHaHZaQ0IwYnlCd2NtOTJhV1JsSUdGdUlHRnNkR1Z5Ym1GMFpTQnpkMkZ3SUdKbGFHRjJhVzl5WEhKY2JpQWdJQ0F2THlCbWIzSWdZRVYyWlc1MFEyOXVkR1Y0ZEM1d1lYSjBhV0ZzS0NsZ0xseHlYRzRnSUNBZ0x5OWNjbHh1SUNBZ0lDOHZJQ01qSXlCRmVHRnRjR3hsWEhKY2JpQWdJQ0F2TDF4eVhHNGdJQ0FnTHk4Z0lDQWdJQ0IyWVhJZ1lYQndJRDBnSkM1ellXMXRlU2htZFc1amRHbHZiaWdwSUh0Y2NseHVJQ0FnSUM4dlhISmNiaUFnSUNBdkx5QWdJQ0FnSUNBZ0x5OGdhVzF3YkdWdFpXNTBjeUJoSUNkbVlXUmxJRzkxZENjdkoyWmhaR1VnYVc0blhISmNiaUFnSUNBdkx5QWdJQ0FnSUNBZ2RHaHBjeTV6ZDJGd0lEMGdablZ1WTNScGIyNG9ZMjl1ZEdWdWRDd2dZMkZzYkdKaFkyc3BJSHRjY2x4dUlDQWdJQzh2SUNBZ0lDQWdJQ0FnSUhaaGNpQmpiMjUwWlhoMElEMGdkR2hwY3p0Y2NseHVJQ0FnSUM4dklDQWdJQ0FnSUNBZ0lHTnZiblJsZUhRdUpHVnNaVzFsYm5Rb0tTNW1ZV1JsVDNWMEtDZHpiRzkzSnl3Z1puVnVZM1JwYjI0b0tTQjdYSEpjYmlBZ0lDQXZMeUFnSUNBZ0lDQWdJQ0FnSUdOdmJuUmxlSFF1SkdWc1pXMWxiblFvS1M1b2RHMXNLR052Ym5SbGJuUXBPMXh5WEc0Z0lDQWdMeThnSUNBZ0lDQWdJQ0FnSUNCamIyNTBaWGgwTGlSbGJHVnRaVzUwS0NrdVptRmtaVWx1S0NkemJHOTNKeXdnWm5WdVkzUnBiMjRvS1NCN1hISmNiaUFnSUNBdkx5QWdJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tHTmhiR3hpWVdOcktTQjdYSEpjYmlBZ0lDQXZMeUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmpZV3hzWW1GamF5NWhjSEJzZVNncE8xeHlYRzRnSUNBZ0x5OGdJQ0FnSUNBZ0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUM4dklDQWdJQ0FnSUNBZ0lDQWdmU2s3WEhKY2JpQWdJQ0F2THlBZ0lDQWdJQ0FnSUNCOUtUdGNjbHh1SUNBZ0lDOHZJQ0FnSUNBZ0lDQjlPMXh5WEc0Z0lDQWdMeTljY2x4dUlDQWdJQzh2SUNBZ0lDQWdmU2s3WEhKY2JpQWdJQ0F2TDF4eVhHNGdJQ0FnYzNkaGNEb2dablZ1WTNScGIyNG9ZMjl1ZEdWdWRDd2dZMkZzYkdKaFkyc3BJSHRjY2x4dUlDQWdJQ0FnZG1GeUlDUmxiQ0E5SUhSb2FYTXVKR1ZzWlcxbGJuUW9LUzVvZEcxc0tHTnZiblJsYm5RcE8xeHlYRzRnSUNBZ0lDQnBaaUFvWDJselJuVnVZM1JwYjI0b1kyRnNiR0poWTJzcEtTQjdJR05oYkd4aVlXTnJLR052Ym5SbGJuUXBPeUI5WEhKY2JpQWdJQ0FnSUhKbGRIVnliaUFrWld3N1hISmNiaUFnSUNCOUxGeHlYRzVjY2x4dUlDQWdJQzh2SUdFZ2MybHRjR3hsSUdkc2IySmhiQ0JqWVdOb1pTQm1iM0lnZEdWdGNHeGhkR1Z6TGlCVmMyVnpJSFJvWlNCellXMWxJSE5sYldGdWRHbGpjeUJoYzF4eVhHNGdJQ0FnTHk4Z1lGTmhiVzE1TGtOaFkyaGxZQ0JoYm1RZ1lGTmhiVzE1TGxOMGIzSmhaMlZnSUhOdklHTmhiaUJsWVhOcGJIa2dZbVVnY21Wd2JHRmpaV1FnZDJsMGFGeHlYRzRnSUNBZ0x5OGdZU0J3WlhKemFYTjBaVzUwSUhOMGIzSmhaMlVnZEdoaGRDQnNZWE4wY3lCaVpYbHZibVFnZEdobElHTjFjbkpsYm5RZ2NtVnhkV1Z6ZEM1Y2NseHVJQ0FnSUhSbGJYQnNZWFJsUTJGamFHVTZJR1oxYm1OMGFXOXVLR3RsZVN3Z2RtRnNkV1VwSUh0Y2NseHVJQ0FnSUNBZ2FXWWdLSFI1Y0dWdlppQjJZV3gxWlNBaFBTQW5kVzVrWldacGJtVmtKeWtnZTF4eVhHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCZmRHVnRjR3hoZEdWZlkyRmphR1ZiYTJWNVhTQTlJSFpoYkhWbE8xeHlYRzRnSUNBZ0lDQjlJR1ZzYzJVZ2UxeHlYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQmZkR1Z0Y0d4aGRHVmZZMkZqYUdWYmEyVjVYVHRjY2x4dUlDQWdJQ0FnZlZ4eVhHNGdJQ0FnZlN4Y2NseHVYSEpjYmlBZ0lDQXZMeUJqYkdWaGNpQjBhR1VnZEdWdGNHeGhkR1ZEWVdOb1pWeHlYRzRnSUNBZ1kyeGxZWEpVWlcxd2JHRjBaVU5oWTJobE9pQm1kVzVqZEdsdmJpZ3BJSHRjY2x4dUlDQWdJQ0FnY21WMGRYSnVJQ2hmZEdWdGNHeGhkR1ZmWTJGamFHVWdQU0I3ZlNrN1hISmNiaUFnSUNCOUxGeHlYRzVjY2x4dUlDQWdJQzh2SUZSb2FYTWdkR2h5YjNkeklHRWdKelF3TkNCT2IzUWdSbTkxYm1RbklHVnljbTl5SUdKNUlHbHVkbTlyYVc1bklHQmxjbkp2Y2lncFlDNWNjbHh1SUNBZ0lDOHZJRTkyWlhKeWFXUmxJSFJvYVhNZ2JXVjBhRzlrSUc5eUlHQmxjbkp2Y2lncFlDQjBieUJ3Y205MmFXUmxJR04xYzNSdmJWeHlYRzRnSUNBZ0x5OGdOREEwSUdKbGFHRjJhVzl5SUNocExtVWdjbVZrYVhKbFkzUnBibWNnZEc4Z0x5QnZjaUJ6YUc5M2FXNW5JR0VnZDJGeWJtbHVaeWxjY2x4dUlDQWdJRzV2ZEVadmRXNWtPaUJtZFc1amRHbHZiaWgyWlhKaUxDQndZWFJvS1NCN1hISmNiaUFnSUNBZ0lIWmhjaUJ5WlhRZ1BTQjBhR2x6TG1WeWNtOXlLRnNuTkRBMElFNXZkQ0JHYjNWdVpDY3NJSFpsY21Jc0lIQmhkR2hkTG1wdmFXNG9KeUFuS1NrN1hISmNiaUFnSUNBZ0lISmxkSFZ5YmlBb2RtVnlZaUE5UFQwZ0oyZGxkQ2NwSUQ4Z2NtVjBJRG9nZEhKMVpUdGNjbHh1SUNBZ0lIMHNYSEpjYmx4eVhHNGdJQ0FnTHk4Z1ZHaGxJR0poYzJVZ1pYSnliM0lnYUdGdVpHeGxjaUIwWVd0bGN5QmhJSE4wY21sdVp5QmdiV1Z6YzJGblpXQWdZVzVrSUdGdUlHQkZjbkp2Y21CY2NseHVJQ0FnSUM4dklHOWlhbVZqZEM0Z1NXWWdZSEpoYVhObFgyVnljbTl5YzJBZ2FYTWdjMlYwSUhSdklHQjBjblZsWUNCdmJpQjBhR1VnWVhCd0lHeGxkbVZzTEZ4eVhHNGdJQ0FnTHk4Z2RHaHBjeUIzYVd4c0lISmxMWFJvY205M0lIUm9aU0JsY25KdmNpQjBieUIwYUdVZ1luSnZkM05sY2k0Z1QzUm9aWEozYVhObElHbDBJSGRwYkd3Z2MyVnVaQ0IwYUdVZ1pYSnliM0pjY2x4dUlDQWdJQzh2SUhSdklHQnNiMmNvS1dBdUlFOTJaWEp5YVdSbElIUm9hWE1nYldWMGFHOWtJSFJ2SUhCeWIzWnBaR1VnWTNWemRHOXRJR1Z5Y205eUlHaGhibVJzYVc1blhISmNiaUFnSUNBdkx5QmxMbWNnYkc5bloybHVaeUIwYnlCaElITmxjblpsY2lCemFXUmxJR052YlhCdmJtVnVkQ0J2Y2lCa2FYTndiR0Y1YVc1bklITnZiV1VnWm1WbFpHSmhZMnNnZEc4Z2RHaGxYSEpjYmlBZ0lDQXZMeUIxYzJWeUxseHlYRzRnSUNBZ1pYSnliM0k2SUdaMWJtTjBhVzl1S0cxbGMzTmhaMlVzSUc5eWFXZHBibUZzWDJWeWNtOXlLU0I3WEhKY2JpQWdJQ0FnSUdsbUlDZ2hiM0pwWjJsdVlXeGZaWEp5YjNJcElIc2diM0pwWjJsdVlXeGZaWEp5YjNJZ1BTQnVaWGNnUlhKeWIzSW9LVHNnZlZ4eVhHNGdJQ0FnSUNCdmNtbG5hVzVoYkY5bGNuSnZjaTV0WlhOellXZGxJRDBnVzIxbGMzTmhaMlVzSUc5eWFXZHBibUZzWDJWeWNtOXlMbTFsYzNOaFoyVmRMbXB2YVc0b0p5QW5LVHRjY2x4dUlDQWdJQ0FnZEdocGN5NTBjbWxuWjJWeUtDZGxjbkp2Y2ljc0lIdHRaWE56WVdkbE9pQnZjbWxuYVc1aGJGOWxjbkp2Y2k1dFpYTnpZV2RsTENCbGNuSnZjam9nYjNKcFoybHVZV3hmWlhKeWIzSjlLVHRjY2x4dUlDQWdJQ0FnYVdZZ0tIUm9hWE11Y21GcGMyVmZaWEp5YjNKektTQjdYSEpjYmlBZ0lDQWdJQ0FnZEdoeWIzY29iM0pwWjJsdVlXeGZaWEp5YjNJcE8xeHlYRzRnSUNBZ0lDQjlJR1ZzYzJVZ2UxeHlYRzRnSUNBZ0lDQWdJSFJvYVhNdWJHOW5LRzl5YVdkcGJtRnNYMlZ5Y205eUxtMWxjM05oWjJVc0lHOXlhV2RwYm1Gc1gyVnljbTl5S1R0Y2NseHVJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ2ZTeGNjbHh1WEhKY2JpQWdJQ0JmWTJobFkydE1iMk5oZEdsdmJqb2dablZ1WTNScGIyNG9LU0I3WEhKY2JpQWdJQ0FnSUhaaGNpQnNiMk5oZEdsdmJpd2djbVYwZFhKdVpXUTdYSEpjYmlBZ0lDQWdJQzh2SUdkbGRDQmpkWEp5Wlc1MElHeHZZMkYwYVc5dVhISmNiaUFnSUNBZ0lHeHZZMkYwYVc5dUlEMGdkR2hwY3k1blpYUk1iMk5oZEdsdmJpZ3BPMXh5WEc0Z0lDQWdJQ0F2THlCamIyMXdZWEpsSUhSdklITmxaU0JwWmlCb1lYTm9JR2hoY3lCamFHRnVaMlZrWEhKY2JpQWdJQ0FnSUdsbUlDZ2hkR2hwY3k1c1lYTjBYMnh2WTJGMGFXOXVJSHg4SUhSb2FYTXViR0Z6ZEY5c2IyTmhkR2x2Ymxzd1hTQWhQU0FuWjJWMEp5QjhmQ0IwYUdsekxteGhjM1JmYkc5allYUnBiMjViTVYwZ0lUMGdiRzlqWVhScGIyNHBJSHRjY2x4dUlDQWdJQ0FnSUNBdkx5QnlaWE5sZENCc1lYTjBJR3h2WTJGMGFXOXVYSEpjYmlBZ0lDQWdJQ0FnZEdocGN5NXNZWE4wWDJ4dlkyRjBhVzl1SUQwZ1d5ZG5aWFFuTENCc2IyTmhkR2x2YmwwN1hISmNiaUFnSUNBZ0lDQWdMeThnYkc5dmEzVndJSEp2ZFhSbElHWnZjaUJqZFhKeVpXNTBJR2hoYzJoY2NseHVJQ0FnSUNBZ0lDQnlaWFIxY201bFpDQTlJSFJvYVhNdWNuVnVVbTkxZEdVb0oyZGxkQ2NzSUd4dlkyRjBhVzl1S1R0Y2NseHVJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQnlaWFIxY200Z2NtVjBkWEp1WldRN1hISmNiaUFnSUNCOUxGeHlYRzVjY2x4dUlDQWdJRjluWlhSR2IzSnRWbVZ5WWpvZ1puVnVZM1JwYjI0b1ptOXliU2tnZTF4eVhHNGdJQ0FnSUNCMllYSWdKR1p2Y20wZ1BTQWtLR1p2Y20wcExDQjJaWEppTENBa1gyMWxkR2h2WkR0Y2NseHVJQ0FnSUNBZ0pGOXRaWFJvYjJRZ1BTQWtabTl5YlM1bWFXNWtLQ2RwYm5CMWRGdHVZVzFsUFZ3aVgyMWxkR2h2WkZ3aVhTY3BPMXh5WEc0Z0lDQWdJQ0JwWmlBb0pGOXRaWFJvYjJRdWJHVnVaM1JvSUQ0Z01Da2dleUIyWlhKaUlEMGdKRjl0WlhSb2IyUXVkbUZzS0NrN0lIMWNjbHh1SUNBZ0lDQWdhV1lnS0NGMlpYSmlLU0I3SUhabGNtSWdQU0FrWm05eWJWc3dYUzVuWlhSQmRIUnlhV0oxZEdVb0oyMWxkR2h2WkNjcE95QjlYSEpjYmlBZ0lDQWdJR2xtSUNnaGRtVnlZaUI4ZkNCMlpYSmlJRDA5UFNBbkp5a2dleUIyWlhKaUlEMGdKMmRsZENjN0lIMWNjbHh1SUNBZ0lDQWdjbVYwZFhKdUlDUXVkSEpwYlNoMlpYSmlMblJ2VTNSeWFXNW5LQ2t1ZEc5TWIzZGxja05oYzJVb0tTazdYSEpjYmlBZ0lDQjlMRnh5WEc1Y2NseHVJQ0FnSUY5amFHVmphMFp2Y20xVGRXSnRhWE56YVc5dU9pQm1kVzVqZEdsdmJpaG1iM0p0S1NCN1hISmNiaUFnSUNBZ0lIWmhjaUFrWm05eWJTd2djR0YwYUN3Z2RtVnlZaXdnY0dGeVlXMXpMQ0J5WlhSMWNtNWxaRHRjY2x4dUlDQWdJQ0FnZEdocGN5NTBjbWxuWjJWeUtDZGphR1ZqYXkxbWIzSnRMWE4xWW0xcGMzTnBiMjRuTENCN1ptOXliVG9nWm05eWJYMHBPMXh5WEc0Z0lDQWdJQ0FrWm05eWJTQTlJQ1FvWm05eWJTazdYSEpjYmlBZ0lDQWdJSEJoZEdnZ0lEMGdKR1p2Y20wdVlYUjBjaWduWVdOMGFXOXVKeWtnZkh3Z0p5YzdYSEpjYmlBZ0lDQWdJSFpsY21JZ0lEMGdkR2hwY3k1ZloyVjBSbTl5YlZabGNtSW9KR1p2Y20wcE8xeHlYRzVjY2x4dUlDQWdJQ0FnYVdZZ0tIUm9hWE11WkdWaWRXY3BJSHRjY2x4dUlDQWdJQ0FnSUNCMGFHbHpMbXh2WnlnblgyTm9aV05yUm05eWJWTjFZbTFwYzNOcGIyNG5MQ0FrWm05eWJTd2djR0YwYUN3Z2RtVnlZaWs3WEhKY2JpQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJR2xtSUNoMlpYSmlJRDA5UFNBbloyVjBKeWtnZTF4eVhHNGdJQ0FnSUNBZ0lIQmhjbUZ0Y3lBOUlIUm9hWE11WDNObGNtbGhiR2w2WlVadmNtMVFZWEpoYlhNb0pHWnZjbTBwTzF4eVhHNGdJQ0FnSUNBZ0lHbG1JQ2h3WVhKaGJYTWdJVDA5SUNjbktTQjdJSEJoZEdnZ0t6MGdKejhuSUNzZ2NHRnlZVzF6T3lCOVhISmNiaUFnSUNBZ0lDQWdkR2hwY3k1elpYUk1iMk5oZEdsdmJpaHdZWFJvS1R0Y2NseHVJQ0FnSUNBZ0lDQnlaWFIxY201bFpDQTlJR1poYkhObE8xeHlYRzRnSUNBZ0lDQjlJR1ZzYzJVZ2UxeHlYRzRnSUNBZ0lDQWdJSEJoY21GdGN5QTlJQ1F1WlhoMFpXNWtLSHQ5TENCMGFHbHpMbDl3WVhKelpVWnZjbTFRWVhKaGJYTW9KR1p2Y20wcEtUdGNjbHh1SUNBZ0lDQWdJQ0J5WlhSMWNtNWxaQ0E5SUhSb2FYTXVjblZ1VW05MWRHVW9kbVZ5WWl3Z2NHRjBhQ3dnY0dGeVlXMXpMQ0JtYjNKdExtZGxkQ2d3S1NrN1hISmNiaUFnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdjbVYwZFhKdUlDaDBlWEJsYjJZZ2NtVjBkWEp1WldRZ1BUMGdKM1Z1WkdWbWFXNWxaQ2NwSUQ4Z1ptRnNjMlVnT2lCeVpYUjFjbTVsWkR0Y2NseHVJQ0FnSUgwc1hISmNibHh5WEc0Z0lDQWdYM05sY21saGJHbDZaVVp2Y20xUVlYSmhiWE02SUdaMWJtTjBhVzl1S0NSbWIzSnRLU0I3WEhKY2JpQWdJQ0FnSUNCMllYSWdjWFZsY25sVGRISnBibWNnUFNCY0lsd2lMRnh5WEc0Z0lDQWdJQ0FnSUNCbWFXVnNaSE1nUFNBa1ptOXliUzV6WlhKcFlXeHBlbVZCY25KaGVTZ3BMRnh5WEc0Z0lDQWdJQ0FnSUNCcE8xeHlYRzRnSUNBZ0lDQWdhV1lnS0dacFpXeGtjeTVzWlc1bmRHZ2dQaUF3S1NCN1hISmNiaUFnSUNBZ0lDQWdJSEYxWlhKNVUzUnlhVzVuSUQwZ2RHaHBjeTVmWlc1amIyUmxSbTl5YlZCaGFYSW9abWxsYkdSeld6QmRMbTVoYldVc0lHWnBaV3hrYzFzd1hTNTJZV3gxWlNrN1hISmNiaUFnSUNBZ0lDQWdJR1p2Y2lBb2FTQTlJREU3SUdrZ1BDQm1hV1ZzWkhNdWJHVnVaM1JvT3lCcEt5c3BJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQnhkV1Z5ZVZOMGNtbHVaeUE5SUhGMVpYSjVVM1J5YVc1bklDc2dYQ0ltWENJZ0t5QjBhR2x6TGw5bGJtTnZaR1ZHYjNKdFVHRnBjaWhtYVdWc1pITmJhVjB1Ym1GdFpTd2dabWxsYkdSelcybGRMblpoYkhWbEtUdGNjbHh1SUNBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQWdjbVYwZFhKdUlIRjFaWEo1VTNSeWFXNW5PMXh5WEc0Z0lDQWdmU3hjY2x4dVhISmNiaUFnSUNCZlpXNWpiMlJsUm05eWJWQmhhWEk2SUdaMWJtTjBhVzl1S0c1aGJXVXNJSFpoYkhWbEtYdGNjbHh1SUNBZ0lDQWdjbVYwZFhKdUlGOWxibU52WkdVb2JtRnRaU2tnS3lCY0lqMWNJaUFySUY5bGJtTnZaR1VvZG1Gc2RXVXBPMXh5WEc0Z0lDQWdmU3hjY2x4dVhISmNiaUFnSUNCZmNHRnljMlZHYjNKdFVHRnlZVzF6T2lCbWRXNWpkR2x2Ymlna1ptOXliU2tnZTF4eVhHNGdJQ0FnSUNCMllYSWdjR0Z5WVcxeklEMGdlMzBzWEhKY2JpQWdJQ0FnSUNBZ0lDQm1iM0p0WDJacFpXeGtjeUE5SUNSbWIzSnRMbk5sY21saGJHbDZaVUZ5Y21GNUtDa3NYSEpjYmlBZ0lDQWdJQ0FnSUNCcE8xeHlYRzRnSUNBZ0lDQm1iM0lnS0drZ1BTQXdPeUJwSUR3Z1ptOXliVjltYVdWc1pITXViR1Z1WjNSb095QnBLeXNwSUh0Y2NseHVJQ0FnSUNBZ0lDQndZWEpoYlhNZ1BTQjBhR2x6TGw5d1lYSnpaVkJoY21GdFVHRnBjaWh3WVhKaGJYTXNJR1p2Y20xZlptbGxiR1J6VzJsZExtNWhiV1VzSUdadmNtMWZabWxsYkdSelcybGRMblpoYkhWbEtUdGNjbHh1SUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0J5WlhSMWNtNGdjR0Z5WVcxek8xeHlYRzRnSUNBZ2ZTeGNjbHh1WEhKY2JpQWdJQ0JmY0dGeWMyVlJkV1Z5ZVZOMGNtbHVaem9nWm5WdVkzUnBiMjRvY0dGMGFDa2dlMXh5WEc0Z0lDQWdJQ0IyWVhJZ2NHRnlZVzF6SUQwZ2UzMHNJSEJoY25SekxDQndZV2x5Y3l3Z2NHRnBjaXdnYVR0Y2NseHVYSEpjYmlBZ0lDQWdJSEJoY25SeklEMGdjR0YwYUM1dFlYUmphQ2hSVlVWU1dWOVRWRkpKVGtkZlRVRlVRMGhGVWlrN1hISmNiaUFnSUNBZ0lHbG1JQ2h3WVhKMGN5QW1KaUJ3WVhKMGMxc3hYU2tnZTF4eVhHNGdJQ0FnSUNBZ0lIQmhhWEp6SUQwZ2NHRnlkSE5iTVYwdWMzQnNhWFFvSnlZbktUdGNjbHh1SUNBZ0lDQWdJQ0JtYjNJZ0tHa2dQU0F3T3lCcElEd2djR0ZwY25NdWJHVnVaM1JvT3lCcEt5c3BJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lIQmhhWElnUFNCd1lXbHljMXRwWFM1emNHeHBkQ2duUFNjcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnY0dGeVlXMXpJRDBnZEdocGN5NWZjR0Z5YzJWUVlYSmhiVkJoYVhJb2NHRnlZVzF6TENCZlpHVmpiMlJsS0hCaGFYSmJNRjBwTENCZlpHVmpiMlJsS0hCaGFYSmJNVjBnZkh3Z1hDSmNJaWtwTzF4eVhHNGdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0J5WlhSMWNtNGdjR0Z5WVcxek8xeHlYRzRnSUNBZ2ZTeGNjbHh1WEhKY2JpQWdJQ0JmY0dGeWMyVlFZWEpoYlZCaGFYSTZJR1oxYm1OMGFXOXVLSEJoY21GdGN5d2dhMlY1TENCMllXeDFaU2tnZTF4eVhHNGdJQ0FnSUNCcFppQW9kSGx3Wlc5bUlIQmhjbUZ0YzF0clpYbGRJQ0U5UFNBbmRXNWtaV1pwYm1Wa0p5a2dlMXh5WEc0Z0lDQWdJQ0FnSUdsbUlDaGZhWE5CY25KaGVTaHdZWEpoYlhOYmEyVjVYU2twSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJSEJoY21GdGMxdHJaWGxkTG5CMWMyZ29kbUZzZFdVcE8xeHlYRzRnSUNBZ0lDQWdJSDBnWld4elpTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNCd1lYSmhiWE5iYTJWNVhTQTlJRnR3WVhKaGJYTmJhMlY1WFN3Z2RtRnNkV1ZkTzF4eVhHNGdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdmU0JsYkhObElIdGNjbHh1SUNBZ0lDQWdJQ0J3WVhKaGJYTmJhMlY1WFNBOUlIWmhiSFZsTzF4eVhHNGdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lISmxkSFZ5YmlCd1lYSmhiWE03WEhKY2JpQWdJQ0I5TEZ4eVhHNWNjbHh1SUNBZ0lGOXNhWE4wWlc0NklHWjFibU4wYVc5dUtHNWhiV1VzSUdOaGJHeGlZV05yS1NCN1hISmNiaUFnSUNBZ0lISmxkSFZ5YmlCMGFHbHpMaVJsYkdWdFpXNTBLQ2t1WW1sdVpDaGJibUZ0WlN3Z2RHaHBjeTVsZG1WdWRFNWhiV1Z6Y0dGalpTZ3BYUzVxYjJsdUtDY3VKeWtzSUdOaGJHeGlZV05yS1R0Y2NseHVJQ0FnSUgwc1hISmNibHh5WEc0Z0lDQWdYM1Z1YkdsemRHVnVPaUJtZFc1amRHbHZiaWh1WVcxbExDQmpZV3hzWW1GamF5a2dlMXh5WEc0Z0lDQWdJQ0J5WlhSMWNtNGdkR2hwY3k0a1pXeGxiV1Z1ZENncExuVnVZbWx1WkNoYmJtRnRaU3dnZEdocGN5NWxkbVZ1ZEU1aGJXVnpjR0ZqWlNncFhTNXFiMmx1S0NjdUp5a3NJR05oYkd4aVlXTnJLVHRjY2x4dUlDQWdJSDFjY2x4dVhISmNiaUFnZlNrN1hISmNibHh5WEc0Z0lDOHZJR0JUWVcxdGVTNVNaVzVrWlhKRGIyNTBaWGgwWUNCcGN5QmhiaUJ2WW1wbFkzUWdkR2hoZENCdFlXdGxjeUJ6WlhGMVpXNTBhV0ZzSUhSbGJYQnNZWFJsSUd4dllXUnBibWNzWEhKY2JpQWdMeThnY21WdVpHVnlhVzVuSUdGdVpDQnBiblJsY25CdmJHRjBhVzl1SUhObFlXMXNaWE56SUdWMlpXNGdkMmhsYmlCa1pXRnNhVzVuSUhkcGRHZ2dZWE41Ym1Ob2NtOXViM1Z6WEhKY2JpQWdMeThnYjNCbGNtRjBhVzl1Y3k1Y2NseHVJQ0F2TDF4eVhHNGdJQzh2SUdCU1pXNWtaWEpEYjI1MFpYaDBZQ0J2WW1wbFkzUnpJR0Z5WlNCdWIzUWdkWE4xWVd4c2VTQmpjbVZoZEdWa0lHUnBjbVZqZEd4NUxDQnlZWFJvWlhJZ2RHaGxlU0JoY21WY2NseHVJQ0F2THlCcGJuTjBZVzUwYVdGMFpXUWdabkp2YlNCaGJpQmdVMkZ0YlhrdVJYWmxiblJEYjI1MFpYaDBZQ0JpZVNCMWMybHVaeUJnY21WdVpHVnlLQ2xnTENCZ2JHOWhaQ2dwWUNCdmNseHlYRzRnSUM4dklHQndZWEowYVdGc0tDbGdJSGRvYVdOb0lHRnNiQ0J5WlhSMWNtNGdZRkpsYm1SbGNrTnZiblJsZUhSZ0lHOWlhbVZqZEhNdVhISmNiaUFnTHk5Y2NseHVJQ0F2THlCZ1VtVnVaR1Z5UTI5dWRHVjRkR0FnYldWMGFHOWtjeUJoYkhkaGVYTWdjbVYwZFhKdWN5QmhJRzF2WkdsbWFXVmtJR0JTWlc1a1pYSkRiMjUwWlhoMFlGeHlYRzRnSUM4dklHWnZjaUJqYUdGcGJtbHVaeUFvYkdsclpTQnFVWFZsY25rZ2FYUnpaV3htS1M1Y2NseHVJQ0F2TDF4eVhHNGdJQzh2SUZSb1pTQmpiM0psSUcxaFoybGpJR2x6SUdsdUlIUm9aU0JnZEdobGJpZ3BZQ0J0WlhSb2IyUWdkMmhwWTJnZ2NIVjBjeUIwYUdVZ1kyRnNiR0poWTJzZ2NHRnpjMlZrSUdGelhISmNiaUFnTHk4Z1lXNGdZWEpuZFcxbGJuUWdhVzUwYnlCaElIRjFaWFZsSUhSdklHSmxJR1Y0WldOMWRHVmtJRzl1WTJVZ2RHaGxJSEJ5WlhacGIzVnpJR05oYkd4aVlXTnJJR2x6SUdOdmJYQnNaWFJsTGx4eVhHNGdJQzh2SUVGc2JDQjBhR1VnYldWMGFHOWtjeUJ2WmlCZ1VtVnVaR1Z5UTI5dWRHVjRkR0FnWVhKbElIZHlZWEJ3WldRZ2FXNGdZSFJvWlc0b0tXQWdkMmhwWTJnZ1lXeHNiM2R6SUhsdmRWeHlYRzRnSUM4dklIUnZJSEYxWlhWbElIVndJRzFsZEdodlpITWdZbmtnWTJoaGFXNXBibWNzSUdKMWRDQnRZV2x1ZEdGcGJtbHVaeUJoSUdkMVlYSmhiblJsWldRZ1pYaGxZM1YwYVc5dUlHOXlaR1Z5WEhKY2JpQWdMeThnWlhabGJpQjNhWFJvSUhKbGJXOTBaU0JqWVd4c2N5QjBieUJtWlhSamFDQjBaVzF3YkdGMFpYTXVYSEpjYmlBZ0x5OWNjbHh1SUNCVFlXMXRlUzVTWlc1a1pYSkRiMjUwWlhoMElEMGdablZ1WTNScGIyNG9aWFpsYm5SZlkyOXVkR1Y0ZENrZ2UxeHlYRzRnSUNBZ2RHaHBjeTVsZG1WdWRGOWpiMjUwWlhoMElDQWdJRDBnWlhabGJuUmZZMjl1ZEdWNGREdGNjbHh1SUNBZ0lIUm9hWE11WTJGc2JHSmhZMnR6SUNBZ0lDQWdJQ0E5SUZ0ZE8xeHlYRzRnSUNBZ2RHaHBjeTV3Y21WMmFXOTFjMTlqYjI1MFpXNTBJRDBnYm5Wc2JEdGNjbHh1SUNBZ0lIUm9hWE11WTI5dWRHVnVkQ0FnSUNBZ0lDQWdJQ0E5SUc1MWJHdzdYSEpjYmlBZ0lDQjBhR2x6TG01bGVIUmZaVzVuYVc1bElDQWdJQ0FnUFNCbVlXeHpaVHRjY2x4dUlDQWdJSFJvYVhNdWQyRnBkR2x1WnlBZ0lDQWdJQ0FnSUNBOUlHWmhiSE5sTzF4eVhHNGdJSDA3WEhKY2JseHlYRzRnSUZOaGJXMTVMbEpsYm1SbGNrTnZiblJsZUhRdWNISnZkRzkwZVhCbElEMGdKQzVsZUhSbGJtUW9lMzBzSUZOaGJXMTVMazlpYW1WamRDNXdjbTkwYjNSNWNHVXNJSHRjY2x4dVhISmNiaUFnSUNBdkx5QlVhR1VnWENKamIzSmxYQ0lnYjJZZ2RHaGxJR0JTWlc1a1pYSkRiMjUwWlhoMFlDQnZZbXBsWTNRc0lHRmtaSE1nZEdobElHQmpZV3hzWW1GamEyQWdkRzhnZEdobFhISmNiaUFnSUNBdkx5QnhkV1YxWlM0Z1NXWWdkR2hsSUdOdmJuUmxlSFFnYVhNZ1lIZGhhWFJwYm1kZ0lDaHRaV0Z1YVc1bklHRnVJR0Z6ZVc1aklHOXdaWEpoZEdsdmJpQnBjeUJvWVhCd1pXNXBibWNwWEhKY2JpQWdJQ0F2THlCMGFHVnVJSFJvWlNCallXeHNZbUZqYXlCM2FXeHNJR0psSUdWNFpXTjFkR1ZrSUdsdUlHOXlaR1Z5TENCdmJtTmxJSFJvWlNCdmRHaGxjaUJ2Y0dWeVlYUnBiMjV6SUdGeVpWeHlYRzRnSUNBZ0x5OGdZMjl0Y0d4bGRHVXVJRWxtSUhSb1pYSmxJR2x6SUc1dklHTjFjbkpsYm5Sc2VTQmxlR1ZqZFhScGJtY2diM0JsY21GMGFXOXVMQ0IwYUdVZ1lHTmhiR3hpWVdOcllGeHlYRzRnSUNBZ0x5OGdhWE1nWlhobFkzVjBaV1FnYVcxdFpXUnBZWFJsYkhrdVhISmNiaUFnSUNBdkwxeHlYRzRnSUNBZ0x5OGdWR2hsSUhaaGJIVmxJSEpsZEhWeWJtVmtJR1p5YjIwZ2RHaGxJR05oYkd4aVlXTnJJR2x6SUhOMGIzSmxaQ0JwYmlCZ1kyOXVkR1Z1ZEdBZ1ptOXlJSFJvWlZ4eVhHNGdJQ0FnTHk4Z2MzVmljMlZ4ZFdWdWRDQnZjR1Z5WVhScGIyNHVJRWxtSUhsdmRTQnlaWFIxY200Z1lHWmhiSE5sWUN3Z2RHaGxJSEYxWlhWbElIZHBiR3dnY0dGMWMyVXNJR0Z1WkZ4eVhHNGdJQ0FnTHk4Z2RHaGxJRzVsZUhRZ1kyRnNiR0poWTJzZ2FXNGdkR2hsSUhGMVpYVmxJSGRwYkd3Z2JtOTBJR0psSUdWNFpXTjFkR1ZrSUhWdWRHbHNJR0J1WlhoMEtDbGdJR2x6WEhKY2JpQWdJQ0F2THlCallXeHNaV1F1SUZSb2FYTWdZV3hzYjNkeklHWnZjaUIwYUdVZ1ozVmhjbUZ1ZEdWbFpDQnZjbVJsY2lCdlppQmxlR1ZqZFhScGIyNGdkMmhwYkdVZ2QyOXlhMmx1WjF4eVhHNGdJQ0FnTHk4Z2QybDBhQ0JoYzNsdVl5QnZjR1Z5WVhScGIyNXpMbHh5WEc0Z0lDQWdMeTljY2x4dUlDQWdJQzh2SUVsbUlIUm9aVzRvS1NCcGN5QndZWE56WldRZ1lTQnpkSEpwYm1jZ2FXNXpkR1ZoWkNCdlppQmhJR1oxYm1OMGFXOXVMQ0IwYUdVZ2MzUnlhVzVuSUdseklHeHZiMnRsWkZ4eVhHNGdJQ0FnTHk4Z2RYQWdZWE1nWVNCb1pXeHdaWElnYldWMGFHOWtJRzl1SUhSb1pTQmxkbVZ1ZENCamIyNTBaWGgwTGx4eVhHNGdJQ0FnTHk5Y2NseHVJQ0FnSUM4dklDTWpJeUJGZUdGdGNHeGxYSEpjYmlBZ0lDQXZMMXh5WEc0Z0lDQWdMeThnSUNBZ0lDQjBhR2x6TG1kbGRDZ25JeThuTENCbWRXNWpkR2x2YmlncElIdGNjbHh1SUNBZ0lDOHZJQ0FnSUNBZ0lDQXZMeUJwYm1sMGFXRnNhWHBsSUhSb1pTQlNaVzVrWlhKRGIyNTBaWGgwWEhKY2JpQWdJQ0F2THlBZ0lDQWdJQ0FnTHk4Z1JYWmxiaUIwYUc5MVoyZ2dZR3h2WVdRb0tXQWdaWGhsWTNWMFpYTWdZWE41Ym1Nc0lIUm9aU0J1WlhoMElHQjBhR1Z1S0NsZ1hISmNiaUFnSUNBdkx5QWdJQ0FnSUNBZ0x5OGdkMjl1ZENCbGVHVmpkWFJsSUhWdWRHbHNJSFJvWlNCc2IyRmtJR1pwYm1semFHVnpYSEpjYmlBZ0lDQXZMeUFnSUNBZ0lDQWdkR2hwY3k1c2IyRmtLQ2R0ZVdacGJHVXVkSGgwSnlsY2NseHVJQ0FnSUM4dklDQWdJQ0FnSUNBZ0lDQWdMblJvWlc0b1puVnVZM1JwYjI0b1kyOXVkR1Z1ZENrZ2UxeHlYRzRnSUNBZ0x5OGdJQ0FnSUNBZ0lDQWdJQ0FnSUM4dklIUm9aU0JtYVhKemRDQmhjbWQxYldWdWRDQjBieUIwYUdWdUlHbHpJSFJvWlNCamIyNTBaVzUwSUc5bUlIUm9aVnh5WEc0Z0lDQWdMeThnSUNBZ0lDQWdJQ0FnSUNBZ0lDOHZJSEJ5WlhZZ2IzQmxjbUYwYVc5dVhISmNiaUFnSUNBdkx5QWdJQ0FnSUNBZ0lDQWdJQ0FnSkNnbkkyMWhhVzRuS1M1b2RHMXNLR052Ym5SbGJuUXBPMXh5WEc0Z0lDQWdMeThnSUNBZ0lDQWdJQ0FnSUNCOUtUdGNjbHh1SUNBZ0lDOHZJQ0FnSUNBZ2ZTazdYSEpjYmlBZ0lDQXZMMXh5WEc0Z0lDQWdkR2hsYmpvZ1puVnVZM1JwYjI0b1kyRnNiR0poWTJzcElIdGNjbHh1SUNBZ0lDQWdhV1lnS0NGZmFYTkdkVzVqZEdsdmJpaGpZV3hzWW1GamF5a3BJSHRjY2x4dUlDQWdJQ0FnSUNBdkx5QnBaaUJoSUhOMGNtbHVaeUJwY3lCd1lYTnpaV1FnZEc4Z2RHaGxiaXdnWVhOemRXMWxJSGRsSUhkaGJuUWdkRzhnWTJGc2JGeHlYRzRnSUNBZ0lDQWdJQzh2SUdFZ2FHVnNjR1Z5SUc5dUlIUm9aU0JsZG1WdWRDQmpiMjUwWlhoMElHbHVJR2wwY3lCamIyNTBaWGgwWEhKY2JpQWdJQ0FnSUNBZ2FXWWdLSFI1Y0dWdlppQmpZV3hzWW1GamF5QTlQVDBnSjNOMGNtbHVaeWNnSmlZZ1kyRnNiR0poWTJzZ2FXNGdkR2hwY3k1bGRtVnVkRjlqYjI1MFpYaDBLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQjJZWElnYUdWc2NHVnlJRDBnZEdocGN5NWxkbVZ1ZEY5amIyNTBaWGgwVzJOaGJHeGlZV05yWFR0Y2NseHVJQ0FnSUNBZ0lDQWdJR05oYkd4aVlXTnJJRDBnWm5WdVkzUnBiMjRvWTI5dWRHVnVkQ2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0J5WlhSMWNtNGdhR1ZzY0dWeUxtRndjR3g1S0hSb2FYTXVaWFpsYm5SZlkyOXVkR1Y0ZEN3Z1cyTnZiblJsYm5SZEtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUgwN1hISmNiaUFnSUNBZ0lDQWdmU0JsYkhObElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUIwYUdsek8xeHlYRzRnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNCMllYSWdZMjl1ZEdWNGRDQTlJSFJvYVhNN1hISmNiaUFnSUNBZ0lHbG1JQ2gwYUdsekxuZGhhWFJwYm1jcElIdGNjbHh1SUNBZ0lDQWdJQ0IwYUdsekxtTmhiR3hpWVdOcmN5NXdkWE5vS0dOaGJHeGlZV05yS1R0Y2NseHVJQ0FnSUNBZ2ZTQmxiSE5sSUh0Y2NseHVJQ0FnSUNBZ0lDQjBhR2x6TG5kaGFYUW9LVHRjY2x4dUlDQWdJQ0FnSUNCM2FXNWtiM2N1YzJWMFZHbHRaVzkxZENobWRXNWpkR2x2YmlncElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUhaaGNpQnlaWFIxY201bFpDQTlJR05oYkd4aVlXTnJMbUZ3Y0d4NUtHTnZiblJsZUhRc0lGdGpiMjUwWlhoMExtTnZiblJsYm5Rc0lHTnZiblJsZUhRdWNISmxkbWx2ZFhOZlkyOXVkR1Z1ZEYwcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnYVdZZ0tISmxkSFZ5Ym1Wa0lDRTlQU0JtWVd4elpTa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQmpiMjUwWlhoMExtNWxlSFFvY21WMGRYSnVaV1FwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0FnSUgwc0lEQXBPMXh5WEc0Z0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUhKbGRIVnliaUIwYUdsek8xeHlYRzRnSUNBZ2ZTeGNjbHh1WEhKY2JpQWdJQ0F2THlCUVlYVnpaU0IwYUdVZ1lGSmxibVJsY2tOdmJuUmxlSFJnSUhGMVpYVmxMaUJEYjIxaWFXNWxaQ0IzYVhSb0lHQnVaWGgwS0NsZ0lHRnNiRzkzY3lCbWIzSWdZWE41Ym1OY2NseHVJQ0FnSUM4dklHOXdaWEpoZEdsdmJuTXVYSEpjYmlBZ0lDQXZMMXh5WEc0Z0lDQWdMeThnSXlNaklFVjRZVzF3YkdWY2NseHVJQ0FnSUM4dlhISmNiaUFnSUNBdkx5QWdJQ0FnSUNBZ2RHaHBjeTVuWlhRb0p5TXZKeXdnWm5WdVkzUnBiMjRvS1NCN1hISmNiaUFnSUNBdkx5QWdJQ0FnSUNBZ0lDQjBhR2x6TG14dllXUW9KMjE1ZEdWNGRDNXFjMjl1SnlsY2NseHVJQ0FnSUM4dklDQWdJQ0FnSUNBZ0lDQWdJQ0F1ZEdobGJpaG1kVzVqZEdsdmJpaGpiMjUwWlc1MEtTQjdYSEpjYmlBZ0lDQXZMeUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjJZWElnWTI5dWRHVjRkQ0E5SUhSb2FYTXNYSEpjYmlBZ0lDQXZMeUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWkdGMFlTQWdJQ0E5SUVwVFQwNHVjR0Z5YzJVb1kyOXVkR1Z1ZENrN1hISmNiaUFnSUNBdkx5QWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBdkx5QndZWFZ6WlNCbGVHVmpkWFJwYjI1Y2NseHVJQ0FnSUM4dklDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdOdmJuUmxlSFF1ZDJGcGRDZ3BPMXh5WEc0Z0lDQWdMeThnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdMeThnY0c5emRDQjBieUJoSUhWeWJGeHlYRzRnSUNBZ0x5OGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0pDNXdiM04wS0dSaGRHRXVkWEpzTENCN2ZTd2dablZ1WTNScGIyNG9jbVZ6Y0c5dWMyVXBJSHRjY2x4dUlDQWdJQzh2SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWTI5dWRHVjRkQzV1WlhoMEtFcFRUMDR1Y0dGeWMyVW9jbVZ6Y0c5dWMyVXBLVHRjY2x4dUlDQWdJQzh2SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDBwTzF4eVhHNGdJQ0FnTHk4Z0lDQWdJQ0FnSUNBZ0lDQWdJSDBwWEhKY2JpQWdJQ0F2THlBZ0lDQWdJQ0FnSUNBZ0lDQWdMblJvWlc0b1puVnVZM1JwYjI0b1pHRjBZU2tnZTF4eVhHNGdJQ0FnTHk4Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnTHk4Z1pHRjBZU0JwY3lCcWMyOXVJR1p5YjIwZ2RHaGxJSEJ5WlhacGIzVnpJSEJ2YzNSY2NseHVJQ0FnSUM4dklDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNRb0p5TnRaWE56WVdkbEp5a3VkR1Y0ZENoa1lYUmhMbk4wWVhSMWN5azdYSEpjYmlBZ0lDQXZMeUFnSUNBZ0lDQWdJQ0FnSUNBZ2ZTazdYSEpjYmlBZ0lDQXZMeUFnSUNBZ0lDQWdmU2s3WEhKY2JpQWdJQ0IzWVdsME9pQm1kVzVqZEdsdmJpZ3BJSHRjY2x4dUlDQWdJQ0FnZEdocGN5NTNZV2wwYVc1bklEMGdkSEoxWlR0Y2NseHVJQ0FnSUgwc1hISmNibHh5WEc0Z0lDQWdMeThnVW1WemRXMWxJSFJvWlNCeGRXVjFaU3dnYzJWMGRHbHVaeUJnWTI5dWRHVnVkR0FnZEc4Z1ltVWdkWE5sWkNCcGJpQjBhR1VnYm1WNGRDQnZjR1Z5WVhScGIyNHVYSEpjYmlBZ0lDQXZMeUJUWldVZ1lIZGhhWFFvS1dBZ1ptOXlJR0Z1SUdWNFlXMXdiR1V1WEhKY2JpQWdJQ0J1WlhoME9pQm1kVzVqZEdsdmJpaGpiMjUwWlc1MEtTQjdYSEpjYmlBZ0lDQWdJSFJvYVhNdWQyRnBkR2x1WnlBOUlHWmhiSE5sTzF4eVhHNGdJQ0FnSUNCcFppQW9kSGx3Wlc5bUlHTnZiblJsYm5RZ0lUMDlJQ2QxYm1SbFptbHVaV1FuS1NCN1hISmNiaUFnSUNBZ0lDQWdkR2hwY3k1d2NtVjJhVzkxYzE5amIyNTBaVzUwSUQwZ2RHaHBjeTVqYjI1MFpXNTBPMXh5WEc0Z0lDQWdJQ0FnSUhSb2FYTXVZMjl1ZEdWdWRDQTlJR052Ym5SbGJuUTdYSEpjYmlBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnYVdZZ0tIUm9hWE11WTJGc2JHSmhZMnR6TG14bGJtZDBhQ0ErSURBcElIdGNjbHh1SUNBZ0lDQWdJQ0IwYUdsekxuUm9aVzRvZEdocGN5NWpZV3hzWW1GamEzTXVjMmhwWm5Rb0tTazdYSEpjYmlBZ0lDQWdJSDFjY2x4dUlDQWdJSDBzWEhKY2JseHlYRzRnSUNBZ0x5OGdURzloWkNCaElIUmxiWEJzWVhSbElHbHVkRzhnZEdobElHTnZiblJsZUhRdVhISmNiaUFnSUNBdkx5QlVhR1VnWUd4dlkyRjBhVzl1WUNCallXNGdaV2wwYUdWeUlHSmxJR0VnYzNSeWFXNW5JSE53WldOcFpubHBibWNnZEdobElISmxiVzkwWlNCd1lYUm9JSFJ2SUhSb1pWeHlYRzRnSUNBZ0x5OGdabWxzWlN3Z1lTQnFVWFZsY25rZ2IySnFaV04wTENCdmNpQmhJRVJQVFNCbGJHVnRaVzUwTGx4eVhHNGdJQ0FnTHk5Y2NseHVJQ0FnSUM4dklFNXZJR2x1ZEdWeWNHOXNZWFJwYjI0Z2FHRndjR1Z1Y3lCaWVTQmtaV1poZFd4MExDQjBhR1VnWTI5dWRHVnVkQ0JwY3lCemRHOXlaV1FnYVc1Y2NseHVJQ0FnSUM4dklHQmpiMjUwWlc1MFlDNWNjbHh1SUNBZ0lDOHZYSEpjYmlBZ0lDQXZMeUJKYmlCMGFHVWdZMkZ6WlNCdlppQmhJSEJoZEdnc0lIVnViR1Z6Y3lCMGFHVWdiM0IwYVc5dUlHQjdZMkZqYUdVNklHWmhiSE5sZldBZ2FYTWdjR0Z6YzJWa0lIUm9aVnh5WEc0Z0lDQWdMeThnWkdGMFlTQnBjeUJ6ZEc5eVpXUWdhVzRnZEdobElHRndjQ2R6SUdCMFpXMXdiR0YwWlVOaFkyaGxLQ2xnTGx4eVhHNGdJQ0FnTHk5Y2NseHVJQ0FnSUM4dklFbG1JR0VnYWxGMVpYSjVJRzl5SUVSUFRTQnZZbXBsWTNRZ2FYTWdjR0Z6YzJWa0lIUm9aU0JnYVc1dVpYSklWRTFNWUNCdlppQjBhR1VnYm05a1pTQnBjeUJ3ZFd4c1pXUWdhVzR1WEhKY2JpQWdJQ0F2THlCVWFHbHpJR2x6SUhWelpXWjFiQ0JtYjNJZ2JtVnpkR2x1WnlCMFpXMXdiR0YwWlhNZ1lYTWdjR0Z5ZENCdlppQjBhR1VnYVc1cGRHbGhiQ0J3WVdkbElHeHZZV1FnZDNKaGNIQmxaRnh5WEc0Z0lDQWdMeThnYVc0Z2FXNTJhWE5wWW14bElHVnNaVzFsYm5SeklHOXlJR0E4YzJOeWFYQjBQbUFnZEdGbmN5NGdWMmwwYUNCMFpXMXdiR0YwWlNCd1lYUm9jeXdnZEdobElIUmxiWEJzWVhSbFhISmNiaUFnSUNBdkx5QmxibWRwYm1VZ2FYTWdiRzl2YTJWa0lIVndJR0o1SUhSb1pTQmxlSFJsYm5OcGIyNHVJRVp2Y2lCRVQwMHZhbEYxWlhKNUlHVnRZbVZrWkdWa0lIUmxiWEJzWVhSbGN5eGNjbHh1SUNBZ0lDOHZJSFJvYVhNZ2FYTnVkQ0J3YjNOemFXSnNaU3dnYzI4Z2RHaGxjbVVnWVhKbElHRWdZMjkxY0d4bElHOW1JRzl3ZEdsdmJuTTZYSEpjYmlBZ0lDQXZMMXh5WEc0Z0lDQWdMeThnSUNvZ2NHRnpjeUJoYmlCZ2UyVnVaMmx1WlRwOVlDQnZjSFJwYjI0dVhISmNiaUFnSUNBdkx5QWdLaUJrWldacGJtVWdkR2hsSUdWdVoybHVaU0JwYmlCMGFHVWdZR1JoZEdFdFpXNW5hVzVsWUNCaGRIUnlhV0oxZEdVZ2IyWWdkR2hsSUhCaGMzTmxaQ0J1YjJSbExseHlYRzRnSUNBZ0x5OGdJQ29nYW5WemRDQnpkRzl5WlNCMGFHVWdjbUYzSUhSbGJYQnNZWFJsSUdSaGRHRWdZVzVrSUhWelpTQmdhVzUwWlhKd2IyeGhkR1VvS1dBZ2JXRnVkV0ZzYkhsY2NseHVJQ0FnSUM4dlhISmNiaUFnSUNBdkx5QkpaaUJoSUdCallXeHNZbUZqYTJBZ2FYTWdjR0Z6YzJWa0lHbDBJR2x6SUdWNFpXTjFkR1ZrSUdGbWRHVnlJSFJvWlNCMFpXMXdiR0YwWlNCc2IyRmtMbHh5WEc0Z0lDQWdiRzloWkRvZ1puVnVZM1JwYjI0b2JHOWpZWFJwYjI0c0lHOXdkR2x2Ym5Nc0lHTmhiR3hpWVdOcktTQjdYSEpjYmlBZ0lDQWdJSFpoY2lCamIyNTBaWGgwSUQwZ2RHaHBjenRjY2x4dUlDQWdJQ0FnY21WMGRYSnVJSFJvYVhNdWRHaGxiaWhtZFc1amRHbHZiaWdwSUh0Y2NseHVJQ0FnSUNBZ0lDQjJZWElnYzJodmRXeGtYMk5oWTJobExDQmpZV05vWldRc0lHbHpYMnB6YjI0c0lHeHZZMkYwYVc5dVgyRnljbUY1TzF4eVhHNGdJQ0FnSUNBZ0lHbG1JQ2hmYVhOR2RXNWpkR2x2YmlodmNIUnBiMjV6S1NrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnWTJGc2JHSmhZMnNnUFNCdmNIUnBiMjV6TzF4eVhHNGdJQ0FnSUNBZ0lDQWdiM0IwYVc5dWN5QTlJSHQ5TzF4eVhHNGdJQ0FnSUNBZ0lIMGdaV3h6WlNCN1hISmNiaUFnSUNBZ0lDQWdJQ0J2Y0hScGIyNXpJRDBnSkM1bGVIUmxibVFvZTMwc0lHOXdkR2x2Ym5NcE8xeHlYRzRnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnSUNCcFppQW9ZMkZzYkdKaFkyc3BJSHNnZEdocGN5NTBhR1Z1S0dOaGJHeGlZV05yS1RzZ2ZWeHlYRzRnSUNBZ0lDQWdJR2xtSUNoMGVYQmxiMllnYkc5allYUnBiMjRnUFQwOUlDZHpkSEpwYm1jbktTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBdkx5QnBkQ2R6SUdFZ2NHRjBhRnh5WEc0Z0lDQWdJQ0FnSUNBZ2FYTmZhbk52YmlBZ0lDQWdJRDBnS0d4dlkyRjBhVzl1TG0xaGRHTm9LQzljWEM1cWMyOXVLRnhjUDN3a0tTOHBJSHg4SUc5d2RHbHZibk11YW5OdmJpazdYSEpjYmlBZ0lDQWdJQ0FnSUNCemFHOTFiR1JmWTJGamFHVWdQU0JwYzE5cWMyOXVJRDhnYjNCMGFXOXVjeTVqWVdOb1pTQTlQVDBnZEhKMVpTQTZJRzl3ZEdsdmJuTXVZMkZqYUdVZ0lUMDlJR1poYkhObE8xeHlYRzRnSUNBZ0lDQWdJQ0FnWTI5dWRHVjRkQzV1WlhoMFgyVnVaMmx1WlNBOUlHTnZiblJsZUhRdVpYWmxiblJmWTI5dWRHVjRkQzVsYm1kcGJtVkdiM0lvYkc5allYUnBiMjRwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdaR1ZzWlhSbElHOXdkR2x2Ym5NdVkyRmphR1U3WEhKY2JpQWdJQ0FnSUNBZ0lDQmtaV3hsZEdVZ2IzQjBhVzl1Y3k1cWMyOXVPMXh5WEc0Z0lDQWdJQ0FnSUNBZ2FXWWdLRzl3ZEdsdmJuTXVaVzVuYVc1bEtTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lHTnZiblJsZUhRdWJtVjRkRjlsYm1kcGJtVWdQU0J2Y0hScGIyNXpMbVZ1WjJsdVpUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ1pHVnNaWFJsSUc5d2RHbHZibk11Wlc1bmFXNWxPMXh5WEc0Z0lDQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQWdJQ0FnYVdZZ0tITm9iM1ZzWkY5allXTm9aU0FtSmlBb1kyRmphR1ZrSUQwZ2RHaHBjeTVsZG1WdWRGOWpiMjUwWlhoMExtRndjQzUwWlcxd2JHRjBaVU5oWTJobEtHeHZZMkYwYVc5dUtTa3BJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlHTmhZMmhsWkR0Y2NseHVJQ0FnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnSUNBZ0lIUm9hWE11ZDJGcGRDZ3BPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0pDNWhhbUY0S0NRdVpYaDBaVzVrS0h0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZFhKc09pQnNiMk5oZEdsdmJpeGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ1pHRjBZVG9nZTMwc1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUdSaGRHRlVlWEJsT2lCcGMxOXFjMjl1SUQ4Z0oycHpiMjRuSURvZ0ozUmxlSFFuTEZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0IwZVhCbE9pQW5aMlYwSnl4Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnYzNWalkyVnpjem9nWm5WdVkzUnBiMjRvWkdGMFlTa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJR2xtSUNoemFHOTFiR1JmWTJGamFHVXBJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdOdmJuUmxlSFF1WlhabGJuUmZZMjl1ZEdWNGRDNWhjSEF1ZEdWdGNHeGhkR1ZEWVdOb1pTaHNiMk5oZEdsdmJpd2daR0YwWVNrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lHTnZiblJsZUhRdWJtVjRkQ2hrWVhSaEtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQWdJQ0FnZlN3Z2IzQjBhVzl1Y3lrcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJR1poYkhObE8xeHlYRzRnSUNBZ0lDQWdJSDBnWld4elpTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBdkx5QnBkQ2R6SUdFZ1pHOXRMMnBSZFdWeWVWeHlYRzRnSUNBZ0lDQWdJQ0FnYVdZZ0tHeHZZMkYwYVc5dUxtNXZaR1ZVZVhCbEtTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lISmxkSFZ5YmlCc2IyTmhkR2x2Ymk1cGJtNWxja2hVVFV3N1hISmNiaUFnSUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUNBZ0lDQnBaaUFvYkc5allYUnBiMjR1YzJWc1pXTjBiM0lwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnTHk4Z2FYUW5jeUJoSUdwUmRXVnllVnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQmpiMjUwWlhoMExtNWxlSFJmWlc1bmFXNWxJRDBnYkc5allYUnBiMjR1WVhSMGNpZ25aR0YwWVMxbGJtZHBibVVuS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tHOXdkR2x2Ym5NdVkyeHZibVVnUFQwOUlHWmhiSE5sS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUd4dlkyRjBhVzl1TG5KbGJXOTJaU2dwV3pCZExtbHVibVZ5U0ZSTlRDNTBiMU4wY21sdVp5Z3BPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlJR1ZzYzJVZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lISmxkSFZ5YmlCc2IyTmhkR2x2Ymxzd1hTNXBibTVsY2toVVRVd3VkRzlUZEhKcGJtY29LVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnZlNrN1hISmNiaUFnSUNCOUxGeHlYRzVjY2x4dUlDQWdJQzh2SUV4dllXUWdjR0Z5ZEdsaGJITmNjbHh1SUNBZ0lDOHZYSEpjYmlBZ0lDQXZMeUFqSXlNZ1JYaGhiWEJzWlZ4eVhHNGdJQ0FnTHk5Y2NseHVJQ0FnSUM4dklDQWdJQ0FnZEdocGN5NXNiMkZrVUdGeWRHbGhiSE1vZTIxNWNHRnlkR2xoYkRvZ0p5OXdZWFJvTDNSdkwzQmhjblJwWVd3bmZTazdYSEpjYmlBZ0lDQXZMMXh5WEc0Z0lDQWdiRzloWkZCaGNuUnBZV3h6T2lCbWRXNWpkR2x2Ymlod1lYSjBhV0ZzY3lrZ2UxeHlYRzRnSUNBZ0lDQjJZWElnYm1GdFpUdGNjbHh1SUNBZ0lDQWdhV1lvY0dGeWRHbGhiSE1wSUh0Y2NseHVJQ0FnSUNBZ0lDQjBhR2x6TG5CaGNuUnBZV3h6SUQwZ2RHaHBjeTV3WVhKMGFXRnNjeUI4ZkNCN2ZUdGNjbHh1SUNBZ0lDQWdJQ0JtYjNJb2JtRnRaU0JwYmlCd1lYSjBhV0ZzY3lrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnS0daMWJtTjBhVzl1S0dOdmJuUmxlSFFzSUc1aGJXVXBJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdZMjl1ZEdWNGRDNXNiMkZrS0hCaGNuUnBZV3h6VzI1aGJXVmRLVnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0xuUm9aVzRvWm5WdVkzUnBiMjRvZEdWdGNHeGhkR1VwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NXdZWEowYVdGc2MxdHVZVzFsWFNBOUlIUmxiWEJzWVhSbE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlNrN1hISmNiaUFnSUNBZ0lDQWdJQ0I5S1NoMGFHbHpMQ0J1WVcxbEtUdGNjbHh1SUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ2NtVjBkWEp1SUhSb2FYTTdYSEpjYmlBZ0lDQjlMRnh5WEc1Y2NseHVJQ0FnSUM4dklHQnNiMkZrS0NsZ0lHRWdkR1Z0Y0d4aGRHVWdZVzVrSUhSb1pXNGdZR2x1ZEdWeWNHOXNZWFJsS0NsZ0lHbDBJSGRwZEdnZ1pHRjBZUzVjY2x4dUlDQWdJQzh2WEhKY2JpQWdJQ0F2THlCallXNGdZbVVnWTJGc2JHVmtJSGRwZEdnZ2JYVnNkR2x3YkdVZ1pHbG1abVZ5Wlc1MElITnBaMjVoZEhWeVpYTTZYSEpjYmlBZ0lDQXZMMXh5WEc0Z0lDQWdMeThnSUNBZ0lDQjBhR2x6TG5KbGJtUmxjaWhqWVd4c1ltRmpheWs3WEhKY2JpQWdJQ0F2THlBZ0lDQWdJSFJvYVhNdWNtVnVaR1Z5S0NjdmJHOWpZWFJwYjI0bktUdGNjbHh1SUNBZ0lDOHZJQ0FnSUNBZ2RHaHBjeTV5Wlc1a1pYSW9KeTlzYjJOaGRHbHZiaWNzSUh0emIyMWxPaUJrWVhSaGZTazdYSEpjYmlBZ0lDQXZMeUFnSUNBZ0lIUm9hWE11Y21WdVpHVnlLQ2N2Ykc5allYUnBiMjRuTENCallXeHNZbUZqYXlrN1hISmNiaUFnSUNBdkx5QWdJQ0FnSUhSb2FYTXVjbVZ1WkdWeUtDY3ZiRzlqWVhScGIyNG5MQ0I3YzI5dFpUb2daR0YwWVgwc0lHTmhiR3hpWVdOcktUdGNjbHh1SUNBZ0lDOHZJQ0FnSUNBZ2RHaHBjeTV5Wlc1a1pYSW9KeTlzYjJOaGRHbHZiaWNzSUh0emIyMWxPaUJrWVhSaGZTd2dlMjE1T2lCd1lYSjBhV0ZzYzMwcE8xeHlYRzRnSUNBZ0x5OGdJQ0FnSUNCMGFHbHpMbkpsYm1SbGNpZ25MMnh2WTJGMGFXOXVKeXdnWTJGc2JHSmhZMnNzSUh0dGVUb2djR0Z5ZEdsaGJITjlLVHRjY2x4dUlDQWdJQzh2SUNBZ0lDQWdkR2hwY3k1eVpXNWtaWElvSnk5c2IyTmhkR2x2Ymljc0lIdHpiMjFsT2lCa1lYUmhmU3dnWTJGc2JHSmhZMnNzSUh0dGVUb2djR0Z5ZEdsaGJITjlLVHRjY2x4dUlDQWdJQzh2WEhKY2JpQWdJQ0F2THlBakl5TWdSWGhoYlhCc1pWeHlYRzRnSUNBZ0x5OWNjbHh1SUNBZ0lDOHZJQ0FnSUNBZ2RHaHBjeTVuWlhRb0p5TXZKeXdnWm5WdVkzUnBiMjRvS1NCN1hISmNiaUFnSUNBdkx5QWdJQ0FnSUNBZ2RHaHBjeTV5Wlc1a1pYSW9KMjE1ZEdWdGNHeGhkR1V1ZEdWdGNHeGhkR1VuTENCN2JtRnRaVG9nSjNSbGMzUW5mU2s3WEhKY2JpQWdJQ0F2THlBZ0lDQWdJSDBwTzF4eVhHNGdJQ0FnTHk5Y2NseHVJQ0FnSUhKbGJtUmxjam9nWm5WdVkzUnBiMjRvYkc5allYUnBiMjRzSUdSaGRHRXNJR05oYkd4aVlXTnJMQ0J3WVhKMGFXRnNjeWtnZTF4eVhHNGdJQ0FnSUNCcFppQW9YMmx6Um5WdVkzUnBiMjRvYkc5allYUnBiMjRwSUNZbUlDRmtZWFJoS1NCN1hISmNiaUFnSUNBZ0lDQWdMeThnYVc1MmIydGxaQ0JoY3lCeVpXNWtaWElvWTJGc2JHSmhZMnNwWEhKY2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUhSb2FYTXVkR2hsYmloc2IyTmhkR2x2YmlrN1hISmNiaUFnSUNBZ0lIMGdaV3h6WlNCN1hISmNiaUFnSUNBZ0lDQWdhV1lvWDJselJuVnVZM1JwYjI0b1pHRjBZU2twSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQzh2SUdsdWRtOXJaV1FnWVhNZ2NtVnVaR1Z5S0d4dlkyRjBhVzl1TENCallXeHNZbUZqYXl3Z1czQmhjblJwWVd4elhTbGNjbHh1SUNBZ0lDQWdJQ0FnSUhCaGNuUnBZV3h6SUQwZ1kyRnNiR0poWTJzN1hISmNiaUFnSUNBZ0lDQWdJQ0JqWVd4c1ltRmpheUE5SUdSaGRHRTdYSEpjYmlBZ0lDQWdJQ0FnSUNCa1lYUmhJRDBnYm5Wc2JEdGNjbHh1SUNBZ0lDQWdJQ0I5SUdWc2MyVWdhV1lvWTJGc2JHSmhZMnNnSmlZZ0lWOXBjMFoxYm1OMGFXOXVLR05oYkd4aVlXTnJLU2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdMeThnYVc1MmIydGxaQ0JoY3lCeVpXNWtaWElvYkc5allYUnBiMjRzSUdSaGRHRXNJSEJoY25ScFlXeHpLVnh5WEc0Z0lDQWdJQ0FnSUNBZ2NHRnlkR2xoYkhNZ1BTQmpZV3hzWW1GamF6dGNjbHh1SUNBZ0lDQWdJQ0FnSUdOaGJHeGlZV05ySUQwZ2JuVnNiRHRjY2x4dUlDQWdJQ0FnSUNCOVhISmNibHh5WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUIwYUdsekxteHZZV1JRWVhKMGFXRnNjeWh3WVhKMGFXRnNjeWxjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDNXNiMkZrS0d4dlkyRjBhVzl1S1Z4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdMbWx1ZEdWeWNHOXNZWFJsS0dSaGRHRXNJR3h2WTJGMGFXOXVLVnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0xuUm9aVzRvWTJGc2JHSmhZMnNwTzF4eVhHNGdJQ0FnSUNCOVhISmNiaUFnSUNCOUxGeHlYRzVjY2x4dUlDQWdJQzh2SUdCeVpXNWtaWElvS1dBZ2RHaGxJR0JzYjJOaGRHbHZibUFnZDJsMGFDQmdaR0YwWVdBZ1lXNWtJSFJvWlc0Z1lITjNZWEFvS1dBZ2RHaGxYSEpjYmlBZ0lDQXZMeUJoY0hBbmN5QmdKR1ZzWlcxbGJuUmdJSGRwZEdnZ2RHaGxJSEpsYm1SbGNtVmtJR052Ym5SbGJuUXVYSEpjYmlBZ0lDQndZWEowYVdGc09pQm1kVzVqZEdsdmJpaHNiMk5oZEdsdmJpd2daR0YwWVN3Z1kyRnNiR0poWTJzc0lIQmhjblJwWVd4ektTQjdYSEpjYmlBZ0lDQWdJR2xtSUNoZmFYTkdkVzVqZEdsdmJpaGpZV3hzWW1GamF5a3BJSHRjY2x4dUlDQWdJQ0FnSUNBdkx5QnBiblp2YTJWa0lHRnpJSEJoY25ScFlXd29iRzlqWVhScGIyNHNJR1JoZEdFc0lHTmhiR3hpWVdOckxDQmJjR0Z5ZEdsaGJITmRLVnh5WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUIwYUdsekxuSmxibVJsY2loc2IyTmhkR2x2Yml3Z1pHRjBZU3dnY0dGeWRHbGhiSE1wTG5OM1lYQW9ZMkZzYkdKaFkyc3BPMXh5WEc0Z0lDQWdJQ0I5SUdWc2MyVWdhV1lnS0Y5cGMwWjFibU4wYVc5dUtHUmhkR0VwS1NCN1hISmNiaUFnSUNBZ0lDQWdMeThnYVc1MmIydGxaQ0JoY3lCd1lYSjBhV0ZzS0d4dlkyRjBhVzl1TENCallXeHNZbUZqYXl3Z1czQmhjblJwWVd4elhTbGNjbHh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdkR2hwY3k1eVpXNWtaWElvYkc5allYUnBiMjRzSUh0OUxDQmpZV3hzWW1GamF5a3VjM2RoY0Noa1lYUmhLVHRjY2x4dUlDQWdJQ0FnZlNCbGJITmxJSHRjY2x4dUlDQWdJQ0FnSUNBdkx5QnBiblp2YTJWa0lHRnpJSEJoY25ScFlXd29iRzlqWVhScGIyNHNJR1JoZEdFc0lGdHdZWEowYVdGc2MxMHBYSEpjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJSFJvYVhNdWNtVnVaR1Z5S0d4dlkyRjBhVzl1TENCa1lYUmhMQ0JqWVd4c1ltRmpheWt1YzNkaGNDZ3BPMXh5WEc0Z0lDQWdJQ0I5WEhKY2JpQWdJQ0I5TEZ4eVhHNWNjbHh1SUNBZ0lDOHZJR1JsWm1WeWN5QjBhR1VnWTJGc2JDQnZaaUJtZFc1amRHbHZiaUIwYnlCdlkyTjFjaUJwYmlCdmNtUmxjaUJ2WmlCMGFHVWdjbVZ1WkdWeUlIRjFaWFZsTGx4eVhHNGdJQ0FnTHk4Z1ZHaGxJR1oxYm1OMGFXOXVJR05oYmlCaFkyTmxjSFFnWVc1NUlHNTFiV0psY2lCdlppQmhjbWQxYldWdWRITWdZWE1nYkc5dVp5QmhjeUIwYUdVZ2JHRnpkRnh5WEc0Z0lDQWdMeThnWVhKbmRXMWxiblFnYVhNZ1lTQmpZV3hzWW1GamF5Qm1kVzVqZEdsdmJpNGdWR2hwY3lCcGN5QjFjMlZtZFd3Z1ptOXlJSEIxZEhScGJtY2dZWEppYVhSeVlYSjVYSEpjYmlBZ0lDQXZMeUJoYzNsdVkyaHliMjV2ZFhNZ1puVnVZM1JwYjI1eklHbHVkRzhnZEdobElIRjFaWFZsTGlCVWFHVWdZMjl1ZEdWdWRDQndZWE56WldRZ2RHOGdkR2hsWEhKY2JpQWdJQ0F2THlCallXeHNZbUZqYXlCcGN5QndZWE56WldRZ1lYTWdZR052Ym5SbGJuUmdJSFJ2SUhSb1pTQnVaWGgwSUdsMFpXMGdhVzRnZEdobElIRjFaWFZsTGx4eVhHNGdJQ0FnTHk5Y2NseHVJQ0FnSUM4dklDTWpJeUJGZUdGdGNHeGxYSEpjYmlBZ0lDQXZMMXh5WEc0Z0lDQWdMeThnSUNBZ0lIUm9hWE11YzJWdVpDZ2tMbWRsZEVwVFQwNHNJQ2N2WVhCd0xtcHpiMjRuS1Z4eVhHNGdJQ0FnTHk4Z0lDQWdJQ0FnSUNBdWRHaGxiaWhtZFc1amRHbHZiaWhxYzI5dUtTQjdYSEpjYmlBZ0lDQXZMeUFnSUNBZ0lDQWdJQ0FnSkNnbkkyMWxjM05oWjJVcExuUmxlSFFvYW5OdmJsc25iV1Z6YzJGblpTZGRLVHRjY2x4dUlDQWdJQzh2SUNBZ0lDQWdJQ0FnSUgwcE8xeHlYRzRnSUNBZ0x5OWNjbHh1SUNBZ0lDOHZYSEpjYmlBZ0lDQnpaVzVrT2lCbWRXNWpkR2x2YmlncElIdGNjbHh1SUNBZ0lDQWdkbUZ5SUdOdmJuUmxlSFFnUFNCMGFHbHpMRnh5WEc0Z0lDQWdJQ0FnSUNBZ1lYSm5jeUE5SUY5dFlXdGxRWEp5WVhrb1lYSm5kVzFsYm5SektTeGNjbHh1SUNBZ0lDQWdJQ0FnSUdaMWJpQWdQU0JoY21kekxuTm9hV1owS0NrN1hISmNibHh5WEc0Z0lDQWdJQ0JwWmlBb1gybHpRWEp5WVhrb1lYSm5jMXN3WFNrcElIc2dZWEpuY3lBOUlHRnlaM05iTUYwN0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUhKbGRIVnliaUIwYUdsekxuUm9aVzRvWm5WdVkzUnBiMjRvWTI5dWRHVnVkQ2tnZTF4eVhHNGdJQ0FnSUNBZ0lHRnlaM011Y0hWemFDaG1kVzVqZEdsdmJpaHlaWE53YjI1elpTa2dleUJqYjI1MFpYaDBMbTVsZUhRb2NtVnpjRzl1YzJVcE95QjlLVHRjY2x4dUlDQWdJQ0FnSUNCamIyNTBaWGgwTG5kaGFYUW9LVHRjY2x4dUlDQWdJQ0FnSUNCbWRXNHVZWEJ3Ykhrb1puVnVMQ0JoY21kektUdGNjbHh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdabUZzYzJVN1hISmNiaUFnSUNBZ0lIMHBPMXh5WEc0Z0lDQWdmU3hjY2x4dVhISmNiaUFnSUNBdkx5QnBkR1Z5WVhSbGN5QnZkbVZ5SUdGdUlHRnljbUY1TENCaGNIQnNlV2x1WnlCMGFHVWdZMkZzYkdKaFkyc2dabTl5SUdWaFkyZ2dhWFJsYlNCcGRHVnRMaUIwYUdWY2NseHVJQ0FnSUM4dklHTmhiR3hpWVdOcklIUmhhMlZ6SUhSb1pTQnpZVzFsSUhOMGVXeGxJRzltSUdGeVozVnRaVzUwY3lCaGN5QmdhbEYxWlhKNUxtVmhZMmdvS1dBZ0tHbHVaR1Y0TENCcGRHVnRLUzVjY2x4dUlDQWdJQzh2SUZSb1pTQnlaWFIxY200Z2RtRnNkV1VnYjJZZ1pXRmphQ0JqWVd4c1ltRmpheUJwY3lCamIyeHNaV04wWldRZ1lYTWdZU0J6YVc1bmJHVWdjM1J5YVc1bklHRnVaQ0J6ZEc5eVpXUmNjbHh1SUNBZ0lDOHZJR0Z6SUdCamIyNTBaVzUwWUNCMGJ5QmlaU0IxYzJWa0lHbHVJSFJvWlNCdVpYaDBJR2wwWlhKaGRHbHZiaUJ2WmlCMGFHVWdZRkpsYm1SbGNrTnZiblJsZUhSZ0xseHlYRzRnSUNBZ1kyOXNiR1ZqZERvZ1puVnVZM1JwYjI0b1lYSnlZWGtzSUdOaGJHeGlZV05yTENCdWIzY3BJSHRjY2x4dUlDQWdJQ0FnZG1GeUlHTnZiblJsZUhRZ1BTQjBhR2x6TzF4eVhHNGdJQ0FnSUNCMllYSWdZMjlzYkNBOUlHWjFibU4wYVc5dUtDa2dlMXh5WEc0Z0lDQWdJQ0FnSUdsbUlDaGZhWE5HZFc1amRHbHZiaWhoY25KaGVTa3BJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lHTmhiR3hpWVdOcklEMGdZWEp5WVhrN1hISmNiaUFnSUNBZ0lDQWdJQ0JoY25KaGVTQTlJSFJvYVhNdVkyOXVkR1Z1ZER0Y2NseHVJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJQ0FnZG1GeUlHTnZiblJsYm5SeklEMGdXMTBzSUdSdmJYTWdQU0JtWVd4elpUdGNjbHh1SUNBZ0lDQWdJQ0FrTG1WaFkyZ29ZWEp5WVhrc0lHWjFibU4wYVc5dUtHa3NJR2wwWlcwcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUhaaGNpQnlaWFIxY201bFpDQTlJR05oYkd4aVlXTnJMbUZ3Y0d4NUtHTnZiblJsZUhRc0lGdHBMQ0JwZEdWdFhTazdYSEpjYmlBZ0lDQWdJQ0FnSUNCcFppQW9jbVYwZFhKdVpXUXVhbkYxWlhKNUlDWW1JSEpsZEhWeWJtVmtMbXhsYm1kMGFDQTlQU0F4S1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUhKbGRIVnlibVZrSUQwZ2NtVjBkWEp1WldSYk1GMDdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lHUnZiWE1nUFNCMGNuVmxPMXh5WEc0Z0lDQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQWdJQ0FnWTI5dWRHVnVkSE11Y0hWemFDaHlaWFIxY201bFpDazdYSEpjYmlBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnY21WMGRYSnVaV1E3WEhKY2JpQWdJQ0FnSUNBZ2ZTazdYSEpjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJR1J2YlhNZ1B5QmpiMjUwWlc1MGN5QTZJR052Ym5SbGJuUnpMbXB2YVc0b0p5Y3BPMXh5WEc0Z0lDQWdJQ0I5TzF4eVhHNGdJQ0FnSUNCeVpYUjFjbTRnYm05M0lEOGdZMjlzYkNncElEb2dkR2hwY3k1MGFHVnVLR052Ykd3cE8xeHlYRzRnSUNBZ2ZTeGNjbHh1WEhKY2JpQWdJQ0F2THlCc2IyRmtjeUJoSUhSbGJYQnNZWFJsTENCaGJtUWdkR2hsYmlCcGJuUmxjbkJ2YkdGMFpYTWdhWFFnWm05eUlHVmhZMmdnYVhSbGJTQnBiaUIwYUdVZ1lHUmhkR0ZnWEhKY2JpQWdJQ0F2THlCaGNuSmhlUzRnU1dZZ1lTQmpZV3hzWW1GamF5QnBjeUJ3WVhOelpXUXNJR2wwSUhkcGJHd2dZMkZzYkNCMGFHVWdZMkZzYkdKaFkyc2dkMmwwYUNCbFlXTm9YSEpjYmlBZ0lDQXZMeUJwZEdWdElHbHVJSFJvWlNCaGNuSmhlU0JmWVdaMFpYSmZJR2x1ZEdWeWNHOXNZWFJwYjI1Y2NseHVJQ0FnSUhKbGJtUmxja1ZoWTJnNklHWjFibU4wYVc5dUtHeHZZMkYwYVc5dUxDQnVZVzFsTENCa1lYUmhMQ0JqWVd4c1ltRmpheWtnZTF4eVhHNGdJQ0FnSUNCcFppQW9YMmx6UVhKeVlYa29ibUZ0WlNrcElIdGNjbHh1SUNBZ0lDQWdJQ0JqWVd4c1ltRmpheUE5SUdSaGRHRTdYSEpjYmlBZ0lDQWdJQ0FnWkdGMFlTQTlJRzVoYldVN1hISmNiaUFnSUNBZ0lDQWdibUZ0WlNBOUlHNTFiR3c3WEhKY2JpQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ2NtVjBkWEp1SUhSb2FYTXViRzloWkNoc2IyTmhkR2x2YmlrdWRHaGxiaWhtZFc1amRHbHZiaWhqYjI1MFpXNTBLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQjJZWElnY21OMGVDQTlJSFJvYVhNN1hISmNiaUFnSUNBZ0lDQWdJQ0JwWmlBb0lXUmhkR0VwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnWkdGMFlTQTlJRjlwYzBGeWNtRjVLSFJvYVhNdWNISmxkbWx2ZFhOZlkyOXVkR1Z1ZENrZ1B5QjBhR2x6TG5CeVpYWnBiM1Z6WDJOdmJuUmxiblFnT2lCYlhUdGNjbHh1SUNBZ0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ0lDQWdJR2xtSUNoallXeHNZbUZqYXlrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBa0xtVmhZMmdvWkdGMFlTd2dablZ1WTNScGIyNG9hU3dnZG1Gc2RXVXBJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0IyWVhJZ2FXUmhkR0VnUFNCN2ZTd2daVzVuYVc1bElEMGdkR2hwY3k1dVpYaDBYMlZ1WjJsdVpTQjhmQ0JzYjJOaGRHbHZianRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2JtRnRaU2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXUmhkR0ZiYm1GdFpWMGdQU0IyWVd4MVpUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQjlJR1ZzYzJVZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1JoZEdFZ1BTQjJZV3gxWlR0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ1kyRnNiR0poWTJzb2RtRnNkV1VzSUhKamRIZ3VaWFpsYm5SZlkyOXVkR1Y0ZEM1cGJuUmxjbkJ2YkdGMFpTaGpiMjUwWlc1MExDQnBaR0YwWVN3Z1pXNW5hVzVsS1NrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUgwcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnZlNCbGJITmxJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlIUm9hWE11WTI5c2JHVmpkQ2hrWVhSaExDQm1kVzVqZEdsdmJpaHBMQ0IyWVd4MVpTa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJSFpoY2lCcFpHRjBZU0E5SUh0OUxDQmxibWRwYm1VZ1BTQjBhR2x6TG01bGVIUmZaVzVuYVc1bElIeDhJR3h2WTJGMGFXOXVPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJR2xtSUNodVlXMWxLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFpHRjBZVnR1WVcxbFhTQTlJSFpoYkhWbE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lIMGdaV3h6WlNCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaR0YwWVNBOUlIWmhiSFZsTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnZEdocGN5NWxkbVZ1ZEY5amIyNTBaWGgwTG1sdWRHVnljRzlzWVhSbEtHTnZiblJsYm5Rc0lHbGtZWFJoTENCbGJtZHBibVVwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0I5TENCMGNuVmxLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdmU2s3WEhKY2JpQWdJQ0I5TEZ4eVhHNWNjbHh1SUNBZ0lDOHZJSFZ6WlhNZ2RHaGxJSEJ5WlhacGIzVnpJR3h2WVdSbFpDQmdZMjl1ZEdWdWRHQWdZVzVrSUhSb1pTQmdaR0YwWVdBZ2IySnFaV04wSUhSdklHbHVkR1Z5Y0c5c1lYUmxYSEpjYmlBZ0lDQXZMeUJoSUhSbGJYQnNZWFJsTGlCZ1pXNW5hVzVsWUNCa1pXWnBibVZ6SUhSb1pTQjBaVzF3YkdGMGFXNW5MMmx1ZEdWeWNHOXNZWFJwYjI0Z2JXVjBhRzlrTDJWdVoybHVaVnh5WEc0Z0lDQWdMeThnZEdoaGRDQnphRzkxYkdRZ1ltVWdkWE5sWkM0Z1NXWWdZR1Z1WjJsdVpXQWdhWE1nYm05MElIQmhjM05sWkN3Z2RHaGxJR0J1WlhoMFgyVnVaMmx1WldBZ2FYTmNjbHh1SUNBZ0lDOHZJSFZ6WldRdUlFbG1JR0J5WlhSaGFXNWdJR2x6SUdCMGNuVmxZQ3dnZEdobElHWnBibUZzSUdsdWRHVnljRzlzWVhSbFpDQmtZWFJoSUdseklHRndjR1Z1WkdWa0lIUnZYSEpjYmlBZ0lDQXZMeUIwYUdVZ1lIQnlaWFpwYjNWelgyTnZiblJsYm5SZ0lHbHVjM1JsWVdRZ2IyWWdhblZ6ZENCeVpYQnNZV05wYm1jZ2FYUXVYSEpjYmlBZ0lDQnBiblJsY25CdmJHRjBaVG9nWm5WdVkzUnBiMjRvWkdGMFlTd2daVzVuYVc1bExDQnlaWFJoYVc0cElIdGNjbHh1SUNBZ0lDQWdkbUZ5SUdOdmJuUmxlSFFnUFNCMGFHbHpPMXh5WEc0Z0lDQWdJQ0J5WlhSMWNtNGdkR2hwY3k1MGFHVnVLR1oxYm1OMGFXOXVLR052Ym5SbGJuUXNJSEJ5WlhZcElIdGNjbHh1SUNBZ0lDQWdJQ0JwWmlBb0lXUmhkR0VnSmlZZ2NISmxkaWtnZXlCa1lYUmhJRDBnY0hKbGRqc2dmVnh5WEc0Z0lDQWdJQ0FnSUdsbUlDaDBhR2x6TG01bGVIUmZaVzVuYVc1bEtTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNCbGJtZHBibVVnUFNCMGFHbHpMbTVsZUhSZlpXNW5hVzVsTzF4eVhHNGdJQ0FnSUNBZ0lDQWdkR2hwY3k1dVpYaDBYMlZ1WjJsdVpTQTlJR1poYkhObE8xeHlYRzRnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnSUNCMllYSWdjbVZ1WkdWeVpXUWdQU0JqYjI1MFpYaDBMbVYyWlc1MFgyTnZiblJsZUhRdWFXNTBaWEp3YjJ4aGRHVW9ZMjl1ZEdWdWRDd2daR0YwWVN3Z1pXNW5hVzVsTENCMGFHbHpMbkJoY25ScFlXeHpLVHRjY2x4dUlDQWdJQ0FnSUNCeVpYUjFjbTRnY21WMFlXbHVJRDhnY0hKbGRpQXJJSEpsYm1SbGNtVmtJRG9nY21WdVpHVnlaV1E3WEhKY2JpQWdJQ0FnSUgwcE8xeHlYRzRnSUNBZ2ZTeGNjbHh1WEhKY2JpQWdJQ0F2THlCVGQyRndJSFJvWlNCeVpYUjFjbTRnWTI5dWRHVnVkSE1nWlc1emRYSnBibWNnYjNKa1pYSXVJRk5sWlNCZ1FYQndiR2xqWVhScGIyNGpjM2RoY0dCY2NseHVJQ0FnSUhOM1lYQTZJR1oxYm1OMGFXOXVLR05oYkd4aVlXTnJLU0I3WEhKY2JpQWdJQ0FnSUhKbGRIVnliaUIwYUdsekxuUm9aVzRvWm5WdVkzUnBiMjRvWTI5dWRHVnVkQ2tnZTF4eVhHNGdJQ0FnSUNBZ0lIUm9hWE11WlhabGJuUmZZMjl1ZEdWNGRDNXpkMkZ3S0dOdmJuUmxiblFzSUdOaGJHeGlZV05yS1R0Y2NseHVJQ0FnSUNBZ0lDQnlaWFIxY200Z1kyOXVkR1Z1ZER0Y2NseHVJQ0FnSUNBZ2ZTa3VkSEpwWjJkbGNpZ25ZMmhoYm1kbFpDY3NJSHQ5S1R0Y2NseHVJQ0FnSUgwc1hISmNibHh5WEc0Z0lDQWdMeThnVTJGdFpTQjFjMkZuWlNCaGN5QmdhbEYxWlhKNUxtWnVMbUZ3Y0dWdVpGUnZLQ2xnSUdKMWRDQjFjMlZ6SUdCMGFHVnVLQ2xnSUhSdklHVnVjM1Z5WlNCdmNtUmxjbHh5WEc0Z0lDQWdZWEJ3Wlc1a1ZHODZJR1oxYm1OMGFXOXVLSE5sYkdWamRHOXlLU0I3WEhKY2JpQWdJQ0FnSUhKbGRIVnliaUIwYUdsekxuUm9aVzRvWm5WdVkzUnBiMjRvWTI5dWRHVnVkQ2tnZTF4eVhHNGdJQ0FnSUNBZ0lDUW9jMlZzWldOMGIzSXBMbUZ3Y0dWdVpDaGpiMjUwWlc1MEtUdGNjbHh1SUNBZ0lDQWdmU2t1ZEhKcFoyZGxjaWduWTJoaGJtZGxaQ2NzSUh0OUtUdGNjbHh1SUNBZ0lIMHNYSEpjYmx4eVhHNGdJQ0FnTHk4Z1UyRnRaU0IxYzJGblpTQmhjeUJnYWxGMVpYSjVMbVp1TG5CeVpYQmxibVJVYnlncFlDQmlkWFFnZFhObGN5QmdkR2hsYmlncFlDQjBieUJsYm5OMWNtVWdiM0prWlhKY2NseHVJQ0FnSUhCeVpYQmxibVJVYnpvZ1puVnVZM1JwYjI0b2MyVnNaV04wYjNJcElIdGNjbHh1SUNBZ0lDQWdjbVYwZFhKdUlIUm9hWE11ZEdobGJpaG1kVzVqZEdsdmJpaGpiMjUwWlc1MEtTQjdYSEpjYmlBZ0lDQWdJQ0FnSkNoelpXeGxZM1J2Y2lrdWNISmxjR1Z1WkNoamIyNTBaVzUwS1R0Y2NseHVJQ0FnSUNBZ2ZTa3VkSEpwWjJkbGNpZ25ZMmhoYm1kbFpDY3NJSHQ5S1R0Y2NseHVJQ0FnSUgwc1hISmNibHh5WEc0Z0lDQWdMeThnVW1Wd2JHRmpaWE1nZEdobElHQWtLSE5sYkdWamRHOXlLV0FnZFhOcGJtY2dZR2gwYld3b0tXQWdkMmwwYUNCMGFHVWdjSEpsZG1sdmRYTnNlU0JzYjJGa1pXUmNjbHh1SUNBZ0lDOHZJR0JqYjI1MFpXNTBZRnh5WEc0Z0lDQWdjbVZ3YkdGalpUb2dablZ1WTNScGIyNG9jMlZzWldOMGIzSXBJSHRjY2x4dUlDQWdJQ0FnY21WMGRYSnVJSFJvYVhNdWRHaGxiaWhtZFc1amRHbHZiaWhqYjI1MFpXNTBLU0I3WEhKY2JpQWdJQ0FnSUNBZ0pDaHpaV3hsWTNSdmNpa3VhSFJ0YkNoamIyNTBaVzUwS1R0Y2NseHVJQ0FnSUNBZ2ZTa3VkSEpwWjJkbGNpZ25ZMmhoYm1kbFpDY3NJSHQ5S1R0Y2NseHVJQ0FnSUgwc1hISmNibHh5WEc0Z0lDQWdMeThnZEhKcFoyZGxjaUIwYUdVZ1pYWmxiblFnYVc0Z2RHaGxJRzl5WkdWeUlHOW1JSFJvWlNCbGRtVnVkQ0JqYjI1MFpYaDBMaUJUWVcxbElITmxiV0Z1ZEdsamMxeHlYRzRnSUNBZ0x5OGdZWE1nWUZOaGJXMTVMa1YyWlc1MFEyOXVkR1Y0ZENOMGNtbG5aMlZ5S0NsZ0xpQkpaaUJrWVhSaElHbHpJRzl0YVhSMFpXUXNJR0JqYjI1MFpXNTBZRnh5WEc0Z0lDQWdMeThnYVhNZ2MyVnVkQ0JoY3lCZ2UyTnZiblJsYm5RNklHTnZiblJsYm5SOVlGeHlYRzRnSUNBZ2RISnBaMmRsY2pvZ1puVnVZM1JwYjI0b2JtRnRaU3dnWkdGMFlTa2dlMXh5WEc0Z0lDQWdJQ0J5WlhSMWNtNGdkR2hwY3k1MGFHVnVLR1oxYm1OMGFXOXVLR052Ym5SbGJuUXBJSHRjY2x4dUlDQWdJQ0FnSUNCcFppQW9kSGx3Wlc5bUlHUmhkR0VnUFQwZ0ozVnVaR1ZtYVc1bFpDY3BJSHNnWkdGMFlTQTlJSHRqYjI1MFpXNTBPaUJqYjI1MFpXNTBmVHNnZlZ4eVhHNGdJQ0FnSUNBZ0lIUm9hWE11WlhabGJuUmZZMjl1ZEdWNGRDNTBjbWxuWjJWeUtHNWhiV1VzSUdSaGRHRXBPMXh5WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUJqYjI1MFpXNTBPMXh5WEc0Z0lDQWdJQ0I5S1R0Y2NseHVJQ0FnSUgxY2NseHVYSEpjYmlBZ2ZTazdYSEpjYmx4eVhHNGdJQzh2SUdCVFlXMXRlUzVGZG1WdWRFTnZiblJsZUhSZ0lHOWlhbVZqZEhNZ1lYSmxJR055WldGMFpXUWdaWFpsY25rZ2RHbHRaU0JoSUhKdmRYUmxJR2x6SUhKMWJpQnZjaUJoWEhKY2JpQWdMeThnWW05MWJtUWdaWFpsYm5RZ2FYTWdkSEpwWjJkbGNtVmtMaUJVYUdVZ1kyRnNiR0poWTJ0eklHWnZjaUIwYUdWelpTQmxkbVZ1ZEhNZ1lYSmxJR1YyWVd4MVlYUmxaQ0IzYVhSb2FXNGdZU0JnVTJGdGJYa3VSWFpsYm5SRGIyNTBaWGgwWUZ4eVhHNGdJQzh2SUZSb2FYTWdkMmwwYUdsdUlIUm9aWE5sSUdOaGJHeGlZV05yY3lCMGFHVWdjM0JsWTJsaGJDQnRaWFJvYjJSeklHOW1JR0JGZG1WdWRFTnZiblJsZUhSZ0lHRnlaU0JoZG1GcGJHRmliR1V1WEhKY2JpQWdMeTljY2x4dUlDQXZMeUFqSXlNZ1JYaGhiWEJzWlZ4eVhHNGdJQzh2WEhKY2JpQWdMeThnSUNBZ0lDQWdKQzV6WVcxdGVTaG1kVzVqZEdsdmJpZ3BJSHRjY2x4dUlDQXZMeUFnSUNBZ0lDQWdJQzh2SUZSb1pTQmpiMjUwWlhoMElHaGxjbVVnYVhNZ2RHaHBjeUJUWVcxdGVTNUJjSEJzYVdOaGRHbHZibHh5WEc0Z0lDOHZJQ0FnSUNBZ0lDQWdkR2hwY3k1blpYUW9KeU12T201aGJXVW5MQ0JtZFc1amRHbHZiaWdwSUh0Y2NseHVJQ0F2THlBZ0lDQWdJQ0FnSUNBZ0x5OGdWR2hsSUdOdmJuUmxlSFFnYUdWeVpTQnBjeUJoSUc1bGR5QlRZVzF0ZVM1RmRtVnVkRU52Ym5SbGVIUmNjbHh1SUNBdkx5QWdJQ0FnSUNBZ0lDQWdhV1lnS0hSb2FYTXVjR0Z5WVcxeld5ZHVZVzFsSjEwZ1BUMGdKM05oYlcxNUp5a2dlMXh5WEc0Z0lDOHZJQ0FnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVjR0Z5ZEdsaGJDZ25ibUZ0WlM1b2RHMXNMbVZ5WWljc0lIdHVZVzFsT2lBblUyRnRiWGtuZlNrN1hISmNiaUFnTHk4Z0lDQWdJQ0FnSUNBZ0lIMGdaV3h6WlNCN1hISmNiaUFnTHk4Z0lDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1eVpXUnBjbVZqZENnbkl5OXpiMjFsZDJobGNtVXRaV3h6WlNjcFhISmNiaUFnTHk4Z0lDQWdJQ0FnSUNBZ0lIMWNjbHh1SUNBdkx5QWdJQ0FnSUNBZ0lIMHBPMXh5WEc0Z0lDOHZJQ0FnSUNBZ0lIMHBPMXh5WEc0Z0lDOHZYSEpjYmlBZ0x5OGdTVzVwZEdsaGJHbDZaU0JoSUc1bGR5QkZkbVZ1ZEVOdmJuUmxlSFJjY2x4dUlDQXZMMXh5WEc0Z0lDOHZJQ01qSXlCQmNtZDFiV1Z1ZEhOY2NseHVJQ0F2TDF4eVhHNGdJQzh2SUNvZ1lHRndjR0FnVkdobElHQlRZVzF0ZVM1QmNIQnNhV05oZEdsdmJtQWdkR2hwY3lCbGRtVnVkQ0JwY3lCallXeHNaV1FnZDJsMGFHbHVMbHh5WEc0Z0lDOHZJQ29nWUhabGNtSmdJRlJvWlNCMlpYSmlJR2x1ZG05clpXUWdkRzhnY25WdUlIUm9hWE1nWTI5dWRHVjRkQzl5YjNWMFpTNWNjbHh1SUNBdkx5QXFJR0J3WVhSb1lDQlVhR1VnYzNSeWFXNW5JSEJoZEdnZ2FXNTJiMnRsWkNCMGJ5QnlkVzRnZEdocGN5QmpiMjUwWlhoMEwzSnZkWFJsTGx4eVhHNGdJQzh2SUNvZ1lIQmhjbUZ0YzJBZ1FXNGdUMkpxWldOMElHOW1JRzl3ZEdsdmJtRnNJSEJoY21GdGN5QjBieUJ3WVhOeklIUnZJSFJvWlNCamIyNTBaWGgwTGlCSmN5QmpiMjUyWlhKMFpXUmNjbHh1SUNBdkx5QWdJSFJ2SUdFZ1lGTmhiVzE1TGs5aWFtVmpkR0F1WEhKY2JpQWdMeThnS2lCZ2RHRnlaMlYwWUNCaElFUlBUU0JsYkdWdFpXNTBJSFJvWVhRZ2RHaGxJR1YyWlc1MElIUm9ZWFFnYUc5c1pITWdkR2hwY3lCamIyNTBaWGgwSUc5eWFXZHBibUYwWlhOY2NseHVJQ0F2THlBZ0lHWnliMjB1SUVadmNpQndiM04wTENCd2RYUWdZVzVrSUdSbGJDQnliM1YwWlhNc0lIUm9hWE1nYVhNZ2RHaGxJR1p2Y20wZ1pXeGxiV1Z1ZENCMGFHRjBJSFJ5YVdkblpYSmxaRnh5WEc0Z0lDOHZJQ0FnZEdobElISnZkWFJsTGx4eVhHNGdJQzh2WEhKY2JpQWdVMkZ0YlhrdVJYWmxiblJEYjI1MFpYaDBJRDBnWm5WdVkzUnBiMjRvWVhCd0xDQjJaWEppTENCd1lYUm9MQ0J3WVhKaGJYTXNJSFJoY21kbGRDa2dlMXh5WEc0Z0lDQWdkR2hwY3k1aGNIQWdJQ0FnUFNCaGNIQTdYSEpjYmlBZ0lDQjBhR2x6TG5abGNtSWdJQ0E5SUhabGNtSTdYSEpjYmlBZ0lDQjBhR2x6TG5CaGRHZ2dJQ0E5SUhCaGRHZzdYSEpjYmlBZ0lDQjBhR2x6TG5CaGNtRnRjeUE5SUc1bGR5QlRZVzF0ZVM1UFltcGxZM1FvY0dGeVlXMXpLVHRjY2x4dUlDQWdJSFJvYVhNdWRHRnlaMlYwSUQwZ2RHRnlaMlYwTzF4eVhHNGdJSDA3WEhKY2JseHlYRzRnSUZOaGJXMTVMa1YyWlc1MFEyOXVkR1Y0ZEM1d2NtOTBiM1I1Y0dVZ1BTQWtMbVY0ZEdWdVpDaDdmU3dnVTJGdGJYa3VUMkpxWldOMExuQnliM1J2ZEhsd1pTd2dlMXh5WEc1Y2NseHVJQ0FnSUM4dklFRWdjMmh2Y25SamRYUWdkRzhnZEdobElHRndjQ2R6SUdBa1pXeGxiV1Z1ZENncFlGeHlYRzRnSUNBZ0pHVnNaVzFsYm5RNklHWjFibU4wYVc5dUtDa2dlMXh5WEc0Z0lDQWdJQ0J5WlhSMWNtNGdkR2hwY3k1aGNIQXVKR1ZzWlcxbGJuUW9YMjFoYTJWQmNuSmhlU2hoY21kMWJXVnVkSE1wTG5Ob2FXWjBLQ2twTzF4eVhHNGdJQ0FnZlN4Y2NseHVYSEpjYmlBZ0lDQXZMeUJNYjI5cklIVndJR0VnZEdWdGNHeGhkR2x1WnlCbGJtZHBibVVnZDJsMGFHbHVJSFJvWlNCamRYSnlaVzUwSUdGd2NDQmhibVFnWTI5dWRHVjRkQzVjY2x4dUlDQWdJQzh2SUdCbGJtZHBibVZnSUdOaGJpQmlaU0J2Ym1VZ2IyWWdkR2hsSUdadmJHeHZkMmx1WnpwY2NseHVJQ0FnSUM4dlhISmNiaUFnSUNBdkx5QXFJR0VnWm5WdVkzUnBiMjQ2SUhOb2IzVnNaQ0JqYjI1bWIzSnRJSFJ2SUdCbWRXNWpkR2x2YmloamIyNTBaVzUwTENCa1lYUmhLU0I3SUhKbGRIVnliaUJwYm5SbGNuQnZiR0YwWldRN0lIMWdYSEpjYmlBZ0lDQXZMeUFxSUdFZ2RHVnRjR3hoZEdVZ2NHRjBhRG9nSjNSbGJYQnNZWFJsTG1WcWN5Y3NJR3h2YjJ0eklIVndJSFJvWlNCbGVIUmxibk5wYjI0Z2RHOGdiV0YwWTJnZ2RHOWNjbHh1SUNBZ0lDOHZJQ0FnZEdobElHQmxhbk1vS1dBZ2FHVnNjR1Z5WEhKY2JpQWdJQ0F2THlBcUlHRWdjM1J5YVc1bklISmxabVZ5Y21sdVp5QjBieUIwYUdVZ2FHVnNjR1Z5T2lCY0ltMTFjM1JoWTJobFhDSWdQVDRnWUcxMWMzUmhZMmhsS0NsZ1hISmNiaUFnSUNBdkwxeHlYRzRnSUNBZ0x5OGdTV1lnYm04Z1pXNW5hVzVsSUdseklHWnZkVzVrTENCMWMyVWdkR2hsSUdGd2NDZHpJR1JsWm1GMWJIUWdZSFJsYlhCc1lYUmxYMlZ1WjJsdVpXQmNjbHh1SUNBZ0lDOHZYSEpjYmlBZ0lDQmxibWRwYm1WR2IzSTZJR1oxYm1OMGFXOXVLR1Z1WjJsdVpTa2dlMXh5WEc0Z0lDQWdJQ0IyWVhJZ1kyOXVkR1Y0ZENBOUlIUm9hWE1zSUdWdVoybHVaVjl0WVhSamFEdGNjbHh1SUNBZ0lDQWdMeThnYVdZZ2NHRjBhQ0JwY3lCaFkzUjFZV3hzZVNCaGJpQmxibWRwYm1VZ1puVnVZM1JwYjI0Z2FuVnpkQ0J5WlhSMWNtNGdhWFJjY2x4dUlDQWdJQ0FnYVdZZ0tGOXBjMFoxYm1OMGFXOXVLR1Z1WjJsdVpTa3BJSHNnY21WMGRYSnVJR1Z1WjJsdVpUc2dmVnh5WEc0Z0lDQWdJQ0F2THlCc2IyOXJkWEFnWlc1bmFXNWxJRzVoYldVZ1lua2djR0YwYUNCbGVIUmxibk5wYjI1Y2NseHVJQ0FnSUNBZ1pXNW5hVzVsSUQwZ0tHVnVaMmx1WlNCOGZDQmpiMjUwWlhoMExtRndjQzUwWlcxd2JHRjBaVjlsYm1kcGJtVXBMblJ2VTNSeWFXNW5LQ2s3WEhKY2JpQWdJQ0FnSUdsbUlDZ29aVzVuYVc1bFgyMWhkR05vSUQwZ1pXNW5hVzVsTG0xaGRHTm9LQzljWEM0b1cxNWNYQzVjWEQ5Y1hDTmRLeWtvWEZ3L2ZDUXBMeWtwS1NCN1hISmNiaUFnSUNBZ0lDQWdaVzVuYVc1bElEMGdaVzVuYVc1bFgyMWhkR05vV3pGZE8xeHlYRzRnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJQzh2SUhObGRDQjBhR1VnWlc1bmFXNWxJSFJ2SUhSb1pTQmtaV1poZFd4MElIUmxiWEJzWVhSbElHVnVaMmx1WlNCcFppQnVieUJ0WVhSamFDQnBjeUJtYjNWdVpGeHlYRzRnSUNBZ0lDQnBaaUFvWlc1bmFXNWxJQ1ltSUY5cGMwWjFibU4wYVc5dUtHTnZiblJsZUhSYlpXNW5hVzVsWFNrcElIdGNjbHh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdZMjl1ZEdWNGRGdGxibWRwYm1WZE8xeHlYRzRnSUNBZ0lDQjlYSEpjYmx4eVhHNGdJQ0FnSUNCcFppQW9ZMjl1ZEdWNGRDNWhjSEF1ZEdWdGNHeGhkR1ZmWlc1bmFXNWxLU0I3WEhKY2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUhSb2FYTXVaVzVuYVc1bFJtOXlLR052Ym5SbGVIUXVZWEJ3TG5SbGJYQnNZWFJsWDJWdVoybHVaU2s3WEhKY2JpQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ2NtVjBkWEp1SUdaMWJtTjBhVzl1S0dOdmJuUmxiblFzSUdSaGRHRXBJSHNnY21WMGRYSnVJR052Ym5SbGJuUTdJSDA3WEhKY2JpQWdJQ0I5TEZ4eVhHNWNjbHh1SUNBZ0lDOHZJSFZ6YVc1bklIUm9aU0IwWlcxd2JHRjBaU0JnWlc1bmFXNWxZQ0JtYjNWdVpDQjNhWFJvSUdCbGJtZHBibVZHYjNJb0tXQXNJR2x1ZEdWeWNHOXNZWFJsSUhSb1pWeHlYRzRnSUNBZ0x5OGdZR1JoZEdGZ0lHbHVkRzhnWUdOdmJuUmxiblJnWEhKY2JpQWdJQ0JwYm5SbGNuQnZiR0YwWlRvZ1puVnVZM1JwYjI0b1kyOXVkR1Z1ZEN3Z1pHRjBZU3dnWlc1bmFXNWxMQ0J3WVhKMGFXRnNjeWtnZTF4eVhHNGdJQ0FnSUNCeVpYUjFjbTRnZEdocGN5NWxibWRwYm1WR2IzSW9aVzVuYVc1bEtTNWhjSEJzZVNoMGFHbHpMQ0JiWTI5dWRHVnVkQ3dnWkdGMFlTd2djR0Z5ZEdsaGJITmRLVHRjY2x4dUlDQWdJSDBzWEhKY2JseHlYRzRnSUNBZ0x5OGdRM0psWVhSbElHRnVaQ0J5WlhSMWNtNGdZU0JnVTJGdGJYa3VVbVZ1WkdWeVEyOXVkR1Y0ZEdBZ1kyRnNiR2x1WnlCZ2NtVnVaR1Z5S0NsZ0lHOXVJR2wwTGx4eVhHNGdJQ0FnTHk4Z1RHOWhaSE1nZEdobElIUmxiWEJzWVhSbElHRnVaQ0JwYm5SbGNuQnZiR0YwWlNCMGFHVWdaR0YwWVN3Z2FHOTNaWFpsY2lCa2IyVnpJRzV2ZENCaFkzUjFZV3hjY2x4dUlDQWdJQzh2SUhCc1lXTmxJR2wwSUdsdUlIUm9aU0JFVDAwdVhISmNiaUFnSUNBdkwxeHlYRzRnSUNBZ0x5OGdJeU1qSUVWNFlXMXdiR1ZjY2x4dUlDQWdJQzh2WEhKY2JpQWdJQ0F2THlBZ0lDQWdJQzh2SUcxNWRHVnRjR3hoZEdVdWJYVnpkR0ZqYUdVZ1BHUnBkaUJqYkdGemN6MWNJbTVoYldWY0lqNTdlMjVoYldWOWZUd3ZaR2wyUGx4eVhHNGdJQ0FnTHk4Z0lDQWdJQ0J5Wlc1a1pYSW9KMjE1ZEdWdGNHeGhkR1V1YlhWemRHRmphR1VuTENCN2JtRnRaVG9nSjNGMWFYSnJaWGtuZlNrN1hISmNiaUFnSUNBdkx5QWdJQ0FnSUM4dklITmxkSE1nZEdobElHQmpiMjUwWlc1MFlDQjBieUE4WkdsMklHTnNZWE56UFZ3aWJtRnRaVndpUG5GMWFYSnJaWGs4TDJScGRqNWNjbHh1SUNBZ0lDOHZJQ0FnSUNBZ2NtVnVaR1Z5S0NkdGVYUmxiWEJzWVhSbExtMTFjM1JoWTJobEp5d2dlMjVoYldVNklDZHhkV2x5YTJWNUozMHBYSEpjYmlBZ0lDQXZMeUFnSUNBZ0lDQWdMbUZ3Y0dWdVpGUnZLQ2QxYkNjcE8xeHlYRzRnSUNBZ0x5OGdJQ0FnSUNBdkx5QmhjSEJsYm1SeklIUm9aU0J5Wlc1a1pYSmxaQ0JqYjI1MFpXNTBJSFJ2SUNRb0ozVnNKeWxjY2x4dUlDQWdJQzh2WEhKY2JpQWdJQ0J5Wlc1a1pYSTZJR1oxYm1OMGFXOXVLR3h2WTJGMGFXOXVMQ0JrWVhSaExDQmpZV3hzWW1GamF5d2djR0Z5ZEdsaGJITXBJSHRjY2x4dUlDQWdJQ0FnY21WMGRYSnVJRzVsZHlCVFlXMXRlUzVTWlc1a1pYSkRiMjUwWlhoMEtIUm9hWE1wTG5KbGJtUmxjaWhzYjJOaGRHbHZiaXdnWkdGMFlTd2dZMkZzYkdKaFkyc3NJSEJoY25ScFlXeHpLVHRjY2x4dUlDQWdJSDBzWEhKY2JseHlYRzRnSUNBZ0x5OGdRM0psWVhSbElHRnVaQ0J5WlhSMWNtNGdZU0JnVTJGdGJYa3VVbVZ1WkdWeVEyOXVkR1Y0ZEdBZ1kyRnNiR2x1WnlCZ2NtVnVaR1Z5UldGamFDZ3BZQ0J2YmlCcGRDNWNjbHh1SUNBZ0lDOHZJRXh2WVdSeklIUm9aU0IwWlcxd2JHRjBaU0JoYm1RZ2FXNTBaWEp3YjJ4aGRHVnpJSFJvWlNCa1lYUmhJR1p2Y2lCbFlXTm9JR2wwWlcwc1hISmNiaUFnSUNBdkx5Qm9iM2RsZG1WeUlHUnZaWE1nYm05MElHRmpkSFZoYkNCd2JHRmpaU0JwZENCcGJpQjBhR1VnUkU5TkxseHlYRzRnSUNBZ0x5OWNjbHh1SUNBZ0lDOHZJQ01qSXlCRmVHRnRjR3hsWEhKY2JpQWdJQ0F2TDF4eVhHNGdJQ0FnTHk4Z0lDQWdJQ0F2THlCdGVYUmxiWEJzWVhSbExtMTFjM1JoWTJobElEeGthWFlnWTJ4aGMzTTlYQ0p1WVcxbFhDSStlM3R1WVcxbGZYMDhMMlJwZGo1Y2NseHVJQ0FnSUM4dklDQWdJQ0FnY21WdVpHVnlSV0ZqYUNnbmJYbDBaVzF3YkdGMFpTNXRkWE4wWVdOb1pTY3NJRnQ3Ym1GdFpUb2dKM0YxYVhKclpYa25mU3dnZTI1aGJXVTZJQ2RsYm1SdmNpZDlYU2xjY2x4dUlDQWdJQzh2SUNBZ0lDQWdMeThnYzJWMGN5QjBhR1VnWUdOdmJuUmxiblJnSUhSdklEeGthWFlnWTJ4aGMzTTlYQ0p1WVcxbFhDSStjWFZwY210bGVUd3ZaR2wyUGp4a2FYWWdZMnhoYzNNOVhDSnVZVzFsWENJK1pXNWtiM0k4TDJScGRqNWNjbHh1SUNBZ0lDOHZJQ0FnSUNBZ2NtVnVaR1Z5UldGamFDZ25iWGwwWlcxd2JHRjBaUzV0ZFhOMFlXTm9aU2NzSUZ0N2JtRnRaVG9nSjNGMWFYSnJaWGtuZlN3Z2UyNWhiV1U2SUNkbGJtUnZjaWQ5WFNrdVlYQndaVzVrVkc4b0ozVnNKeWs3WEhKY2JpQWdJQ0F2THlBZ0lDQWdJQzh2SUdGd2NHVnVaSE1nZEdobElISmxibVJsY21Wa0lHTnZiblJsYm5RZ2RHOGdKQ2duZFd3bktWeHlYRzRnSUNBZ0x5OWNjbHh1SUNBZ0lISmxibVJsY2tWaFkyZzZJR1oxYm1OMGFXOXVLR3h2WTJGMGFXOXVMQ0J1WVcxbExDQmtZWFJoTENCallXeHNZbUZqYXlrZ2UxeHlYRzRnSUNBZ0lDQnlaWFIxY200Z2JtVjNJRk5oYlcxNUxsSmxibVJsY2tOdmJuUmxlSFFvZEdocGN5a3VjbVZ1WkdWeVJXRmphQ2hzYjJOaGRHbHZiaXdnYm1GdFpTd2daR0YwWVN3Z1kyRnNiR0poWTJzcE8xeHlYRzRnSUNBZ2ZTeGNjbHh1WEhKY2JpQWdJQ0F2THlCamNtVmhkR1VnWVNCdVpYY2dZRk5oYlcxNUxsSmxibVJsY2tOdmJuUmxlSFJnSUdOaGJHeHBibWNnWUd4dllXUW9LV0FnZDJsMGFDQmdiRzlqWVhScGIyNWdJR0Z1WkZ4eVhHNGdJQ0FnTHk4Z1lHOXdkR2x2Ym5OZ0xpQkRZV3hzWldRZ2QybDBhRzkxZENCcGJuUmxjbkJ2YkdGMGFXOXVJRzl5SUhCc1lXTmxiV1Z1ZEN3Z2RHaHBjeUJoYkd4dmQzTWdabTl5WEhKY2JpQWdJQ0F2THlCd2NtVnNiMkZrYVc1bkwyTmhZMmhwYm1jZ2RHaGxJSFJsYlhCc1lYUmxjeTVjY2x4dUlDQWdJR3h2WVdRNklHWjFibU4wYVc5dUtHeHZZMkYwYVc5dUxDQnZjSFJwYjI1ekxDQmpZV3hzWW1GamF5a2dlMXh5WEc0Z0lDQWdJQ0J5WlhSMWNtNGdibVYzSUZOaGJXMTVMbEpsYm1SbGNrTnZiblJsZUhRb2RHaHBjeWt1Ykc5aFpDaHNiMk5oZEdsdmJpd2diM0IwYVc5dWN5d2dZMkZzYkdKaFkyc3BPMXh5WEc0Z0lDQWdmU3hjY2x4dVhISmNiaUFnSUNBdkx5QmpjbVZoZEdVZ1lTQnVaWGNnWUZOaGJXMTVMbEpsYm1SbGNrTnZiblJsZUhSZ0lHTmhiR3hwYm1jZ1lHeHZZV1JRWVhKMGFXRnNjeWdwWUNCM2FYUm9JR0J3WVhKMGFXRnNjMkF1WEhKY2JpQWdJQ0JzYjJGa1VHRnlkR2xoYkhNNklHWjFibU4wYVc5dUtIQmhjblJwWVd4ektTQjdYSEpjYmlBZ0lDQWdJSEpsZEhWeWJpQnVaWGNnVTJGdGJYa3VVbVZ1WkdWeVEyOXVkR1Y0ZENoMGFHbHpLUzVzYjJGa1VHRnlkR2xoYkhNb2NHRnlkR2xoYkhNcE8xeHlYRzRnSUNBZ2ZTeGNjbHh1WEhKY2JpQWdJQ0F2THlCZ2NtVnVaR1Z5S0NsZ0lIUm9aU0JnYkc5allYUnBiMjVnSUhkcGRHZ2dZR1JoZEdGZ0lHRnVaQ0IwYUdWdUlHQnpkMkZ3S0NsZ0lIUm9aVnh5WEc0Z0lDQWdMeThnWVhCd0ozTWdZQ1JsYkdWdFpXNTBZQ0IzYVhSb0lIUm9aU0J5Wlc1a1pYSmxaQ0JqYjI1MFpXNTBMbHh5WEc0Z0lDQWdjR0Z5ZEdsaGJEb2dablZ1WTNScGIyNG9iRzlqWVhScGIyNHNJR1JoZEdFc0lHTmhiR3hpWVdOckxDQndZWEowYVdGc2N5a2dlMXh5WEc0Z0lDQWdJQ0J5WlhSMWNtNGdibVYzSUZOaGJXMTVMbEpsYm1SbGNrTnZiblJsZUhRb2RHaHBjeWt1Y0dGeWRHbGhiQ2hzYjJOaGRHbHZiaXdnWkdGMFlTd2dZMkZzYkdKaFkyc3NJSEJoY25ScFlXeHpLVHRjY2x4dUlDQWdJSDBzWEhKY2JseHlYRzRnSUNBZ0x5OGdZM0psWVhSbElHRWdibVYzSUdCVFlXMXRlUzVTWlc1a1pYSkRiMjUwWlhoMFlDQmpZV3hzYVc1bklHQnpaVzVrS0NsZ0lIZHBkR2dnWVc0Z1lYSmlhWFJ5WVhKNVhISmNiaUFnSUNBdkx5Qm1kVzVqZEdsdmJseHlYRzRnSUNBZ2MyVnVaRG9nWm5WdVkzUnBiMjRvS1NCN1hISmNiaUFnSUNBZ0lIWmhjaUJ5WTNSNElEMGdibVYzSUZOaGJXMTVMbEpsYm1SbGNrTnZiblJsZUhRb2RHaHBjeWs3WEhKY2JpQWdJQ0FnSUhKbGRIVnliaUJ5WTNSNExuTmxibVF1WVhCd2JIa29jbU4wZUN3Z1lYSm5kVzFsYm5SektUdGNjbHh1SUNBZ0lIMHNYSEpjYmx4eVhHNGdJQ0FnTHk4Z1EyaGhibWRsY3lCMGFHVWdiRzlqWVhScGIyNGdiMllnZEdobElHTjFjbkpsYm5RZ2QybHVaRzkzTGlCSlppQmdkRzlnSUdKbFoybHVjeUIzYVhSb1hISmNiaUFnSUNBdkx5QW5JeWNnYVhRZ2IyNXNlU0JqYUdGdVoyVnpJSFJvWlNCa2IyTjFiV1Z1ZENkeklHaGhjMmd1SUVsbUlIQmhjM05sWkNCdGIzSmxJSFJvWVc0Z01TQmhjbWQxYldWdWRGeHlYRzRnSUNBZ0x5OGdjbVZrYVhKbFkzUWdkMmxzYkNCcWIybHVJSFJvWlcwZ2RHOW5aWFJvWlhJZ2QybDBhQ0JtYjNKM1lYSmtJSE5zWVhOb1pYTXVYSEpjYmlBZ0lDQXZMMXh5WEc0Z0lDQWdMeThnSXlNaklFVjRZVzF3YkdWY2NseHVJQ0FnSUM4dlhISmNiaUFnSUNBdkx5QWdJQ0FnSUhKbFpHbHlaV04wS0NjakwyOTBhR1Z5TDNKdmRYUmxKeWs3WEhKY2JpQWdJQ0F2THlBZ0lDQWdJQzh2SUdWeGRXbDJZV3hsYm5RZ2RHOWNjbHh1SUNBZ0lDOHZJQ0FnSUNBZ2NtVmthWEpsWTNRb0p5TW5MQ0FuYjNSb1pYSW5MQ0FuY205MWRHVW5LVHRjY2x4dUlDQWdJQzh2WEhKY2JpQWdJQ0J5WldScGNtVmpkRG9nWm5WdVkzUnBiMjRvS1NCN1hISmNiaUFnSUNBZ0lIWmhjaUIwYnl3Z1lYSm5jeUE5SUY5dFlXdGxRWEp5WVhrb1lYSm5kVzFsYm5SektTeGNjbHh1SUNBZ0lDQWdJQ0FnSUdOMWNuSmxiblJmYkc5allYUnBiMjRnUFNCMGFHbHpMbUZ3Y0M1blpYUk1iMk5oZEdsdmJpZ3BMRnh5WEc0Z0lDQWdJQ0FnSUNBZ2JDQTlJR0Z5WjNNdWJHVnVaM1JvTzF4eVhHNGdJQ0FnSUNCcFppQW9iQ0ErSURFcElIdGNjbHh1SUNBZ0lDQWdJQ0IyWVhJZ2FTQTlJREFzSUhCaGRHaHpJRDBnVzEwc0lIQmhhWEp6SUQwZ1cxMHNJSEJoY21GdGN5QTlJSHQ5TENCb1lYTmZjR0Z5WVcxeklEMGdabUZzYzJVN1hISmNiaUFnSUNBZ0lDQWdabTl5SUNnN0lHa2dQQ0JzT3lCcEt5c3BJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lHbG1JQ2gwZVhCbGIyWWdZWEpuYzF0cFhTQTlQU0FuYzNSeWFXNW5KeWtnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0J3WVhSb2N5NXdkWE5vS0dGeVozTmJhVjBwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdmU0JsYkhObElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0pDNWxlSFJsYm1Rb2NHRnlZVzF6TENCaGNtZHpXMmxkS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnYUdGelgzQmhjbUZ0Y3lBOUlIUnlkV1U3WEhKY2JpQWdJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ0lIUnZJRDBnY0dGMGFITXVhbTlwYmlnbkx5Y3BPMXh5WEc0Z0lDQWdJQ0FnSUdsbUlDaG9ZWE5mY0dGeVlXMXpLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQm1iM0lnS0haaGNpQnJJR2x1SUhCaGNtRnRjeWtnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0J3WVdseWN5NXdkWE5vS0hSb2FYTXVZWEJ3TGw5bGJtTnZaR1ZHYjNKdFVHRnBjaWhyTENCd1lYSmhiWE5iYTEwcEtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ0lDQWdJSFJ2SUNzOUlDYy9KeUFySUhCaGFYSnpMbXB2YVc0b0p5WW5LVHRjY2x4dUlDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lIMGdaV3h6WlNCN1hISmNiaUFnSUNBZ0lDQWdkRzhnUFNCaGNtZHpXekJkTzF4eVhHNGdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lIUm9hWE11ZEhKcFoyZGxjaWduY21Wa2FYSmxZM1FuTENCN2RHODZJSFJ2ZlNrN1hISmNiaUFnSUNBZ0lIUm9hWE11WVhCd0xteGhjM1JmYkc5allYUnBiMjRnUFNCYmRHaHBjeTUyWlhKaUxDQjBhR2x6TG5CaGRHaGRPMXh5WEc0Z0lDQWdJQ0IwYUdsekxtRndjQzV6WlhSTWIyTmhkR2x2YmloMGJ5azdYSEpjYmlBZ0lDQWdJR2xtSUNodVpYY2dVbVZuUlhod0tIUnZLUzUwWlhOMEtHTjFjbkpsYm5SZmJHOWpZWFJwYjI0cEtTQjdYSEpjYmlBZ0lDQWdJQ0FnZEdocGN5NWhjSEF1ZEhKcFoyZGxjaWduYkc5allYUnBiMjR0WTJoaGJtZGxaQ2NwTzF4eVhHNGdJQ0FnSUNCOVhISmNiaUFnSUNCOUxGeHlYRzVjY2x4dUlDQWdJQzh2SUZSeWFXZG5aWEp6SUdWMlpXNTBjeUJ2YmlCZ1lYQndZQ0IzYVhSb2FXNGdkR2hsSUdOMWNuSmxiblFnWTI5dWRHVjRkQzVjY2x4dUlDQWdJSFJ5YVdkblpYSTZJR1oxYm1OMGFXOXVLRzVoYldVc0lHUmhkR0VwSUh0Y2NseHVJQ0FnSUNBZ2FXWWdLSFI1Y0dWdlppQmtZWFJoSUQwOUlDZDFibVJsWm1sdVpXUW5LU0I3SUdSaGRHRWdQU0I3ZlRzZ2ZWeHlYRzRnSUNBZ0lDQnBaaUFvSVdSaGRHRXVZMjl1ZEdWNGRDa2dleUJrWVhSaExtTnZiblJsZUhRZ1BTQjBhR2x6T3lCOVhISmNiaUFnSUNBZ0lISmxkSFZ5YmlCMGFHbHpMbUZ3Y0M1MGNtbG5aMlZ5S0c1aGJXVXNJR1JoZEdFcE8xeHlYRzRnSUNBZ2ZTeGNjbHh1WEhKY2JpQWdJQ0F2THlCQklITm9iM0owWTNWMElIUnZJR0Z3Y0NkeklHQmxkbVZ1ZEU1aGJXVnpjR0ZqWlNncFlGeHlYRzRnSUNBZ1pYWmxiblJPWVcxbGMzQmhZMlU2SUdaMWJtTjBhVzl1S0NrZ2UxeHlYRzRnSUNBZ0lDQnlaWFIxY200Z2RHaHBjeTVoY0hBdVpYWmxiblJPWVcxbGMzQmhZMlVvS1R0Y2NseHVJQ0FnSUgwc1hISmNibHh5WEc0Z0lDQWdMeThnUVNCemFHOXlkR04xZENCMGJ5QmhjSEFuY3lCZ2MzZGhjQ2dwWUZ4eVhHNGdJQ0FnYzNkaGNEb2dablZ1WTNScGIyNG9ZMjl1ZEdWdWRITXNJR05oYkd4aVlXTnJLU0I3WEhKY2JpQWdJQ0FnSUhKbGRIVnliaUIwYUdsekxtRndjQzV6ZDJGd0tHTnZiblJsYm5SekxDQmpZV3hzWW1GamF5azdYSEpjYmlBZ0lDQjlMRnh5WEc1Y2NseHVJQ0FnSUM4dklGSmhhWE5sY3lCaElIQnZjM05wWW14bElHQnViM1JHYjNWdVpDZ3BZQ0JsY25KdmNpQm1iM0lnZEdobElHTjFjbkpsYm5RZ2NHRjBhQzVjY2x4dUlDQWdJRzV2ZEVadmRXNWtPaUJtZFc1amRHbHZiaWdwSUh0Y2NseHVJQ0FnSUNBZ2NtVjBkWEp1SUhSb2FYTXVZWEJ3TG01dmRFWnZkVzVrS0hSb2FYTXVkbVZ5WWl3Z2RHaHBjeTV3WVhSb0tUdGNjbHh1SUNBZ0lIMHNYSEpjYmx4eVhHNGdJQ0FnTHk4Z1JHVm1ZWFZzZENCS1UwOU9JSEJoY25OcGJtY2dkWE5sY3lCcVVYVmxjbmtuY3lCZ2NHRnljMlZLVTA5T0tDbGdMaUJKYm1Oc2RXUmxJR0JUWVcxdGVTNUtVMDlPWUZ4eVhHNGdJQ0FnTHk4Z2NHeDFaMmx1SUdadmNpQjBhR1VnYlc5eVpTQmpiMjVtYjNKdFlXNTBJRndpWTNKdlkydG1iM0prSUhOd1pXTnBZV3hjSWk1Y2NseHVJQ0FnSUdwemIyNDZJR1oxYm1OMGFXOXVLSE4wY21sdVp5a2dlMXh5WEc0Z0lDQWdJQ0J5WlhSMWNtNGdKQzV3WVhKelpVcFRUMDRvYzNSeWFXNW5LVHRjY2x4dUlDQWdJSDBzWEhKY2JseHlYRzRnSUNBZ0x5OGdMeTg5UGlCVFlXMXRlUzVGZG1WdWRFTnZiblJsZUhRNklHZGxkQ0FqTHlCN2ZWeHlYRzRnSUNBZ2RHOVRkSEpwYm1jNklHWjFibU4wYVc5dUtDa2dlMXh5WEc0Z0lDQWdJQ0J5WlhSMWNtNGdYQ0pUWVcxdGVTNUZkbVZ1ZEVOdmJuUmxlSFE2SUZ3aUlDc2dXM1JvYVhNdWRtVnlZaXdnZEdocGN5NXdZWFJvTENCMGFHbHpMbkJoY21GdGMxMHVhbTlwYmlnbklDY3BPMXh5WEc0Z0lDQWdmVnh5WEc1Y2NseHVJQ0I5S1R0Y2NseHVYSEpjYmlBZ2NtVjBkWEp1SUZOaGJXMTVPMXh5WEc1OUtUdGNjbHh1WEhKY2JseHVPeUJpY205M2MyVnlhV1o1WDNOb2FXMWZYMlJsWm1sdVpWOWZiVzlrZFd4bFgxOWxlSEJ2Y25SZlh5aDBlWEJsYjJZZ1UyRnRiWGtnSVQwZ1hDSjFibVJsWm1sdVpXUmNJaUEvSUZOaGJXMTVJRG9nZDJsdVpHOTNMbE5oYlcxNUtUdGNibHh1ZlNrdVkyRnNiQ2huYkc5aVlXd3NJSFZ1WkdWbWFXNWxaQ3dnZFc1a1pXWnBibVZrTENCMWJtUmxabWx1WldRc0lIVnVaR1ZtYVc1bFpDd2dablZ1WTNScGIyNGdaR1ZtYVc1bFJYaHdiM0owS0dWNEtTQjdJRzF2WkhWc1pTNWxlSEJ2Y25SeklEMGdaWGc3SUgwcE8xeHVJbDE5IiwiKGZ1bmN0aW9uIChnbG9iYWwpe1xuXG47IGpRdWVyeSA9IGdsb2JhbC5qUXVlcnkgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xuOyB2YXIgX19icm93c2VyaWZ5X3NoaW1fcmVxdWlyZV9fPXJlcXVpcmU7KGZ1bmN0aW9uIGJyb3dzZXJpZnlTaGltKG1vZHVsZSwgZGVmaW5lLCByZXF1aXJlKSB7XG4vKlxyXG5Db3B5cmlnaHQgMjAxMiBJZ29yIFZheW5iZXJnXHJcblxyXG5WZXJzaW9uOiAzLjQuMiBUaW1lc3RhbXA6IE1vbiBBdWcgMTIgMTU6MDQ6MTIgUERUIDIwMTNcclxuXHJcblRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiQXBhY2hlIExpY2Vuc2VcIikgb3IgdGhlIEdOVVxyXG5HZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiAodGhlIFwiR1BMIExpY2Vuc2VcIikuIFlvdSBtYXkgY2hvb3NlIGVpdGhlciBsaWNlbnNlIHRvIGdvdmVybiB5b3VyXHJcbnVzZSBvZiB0aGlzIHNvZnR3YXJlIG9ubHkgdXBvbiB0aGUgY29uZGl0aW9uIHRoYXQgeW91IGFjY2VwdCBhbGwgb2YgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgQXBhY2hlXHJcbkxpY2Vuc2Ugb3IgdGhlIEdQTCBMaWNlbnNlLlxyXG5cclxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBBcGFjaGUgTGljZW5zZSBhbmQgdGhlIEdQTCBMaWNlbnNlIGF0OlxyXG5cclxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gICAgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAuaHRtbFxyXG5cclxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGVcclxuQXBhY2hlIExpY2Vuc2Ugb3IgdGhlIEdQTCBMaWNlc25zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUlxyXG5DT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIEFwYWNoZSBMaWNlbnNlIGFuZCB0aGUgR1BMIExpY2Vuc2UgZm9yXHJcbnRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSBhbmQgdGhlIEdQTCBMaWNlbnNlLlxyXG4qL1xyXG4oZnVuY3Rpb24gKCQpIHtcclxuICAgIGlmKHR5cGVvZiAkLmZuLmVhY2gyID09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICAkLmV4dGVuZCgkLmZuLCB7XHJcbiAgICAgICAgICAgIC8qXHJcbiAgICAgICAgICAgICogNC0xMCB0aW1lcyBmYXN0ZXIgLmVhY2ggcmVwbGFjZW1lbnRcclxuICAgICAgICAgICAgKiB1c2UgaXQgY2FyZWZ1bGx5LCBhcyBpdCBvdmVycmlkZXMgalF1ZXJ5IGNvbnRleHQgb2YgZWxlbWVudCBvbiBlYWNoIGl0ZXJhdGlvblxyXG4gICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICBlYWNoMiA6IGZ1bmN0aW9uIChjKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgaiA9ICQoWzBdKSwgaSA9IC0xLCBsID0gdGhpcy5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICB3aGlsZSAoXHJcbiAgICAgICAgICAgICAgICAgICAgKytpIDwgbFxyXG4gICAgICAgICAgICAgICAgICAgICYmIChqLmNvbnRleHQgPSBqWzBdID0gdGhpc1tpXSlcclxuICAgICAgICAgICAgICAgICAgICAmJiBjLmNhbGwoalswXSwgaSwgaikgIT09IGZhbHNlIC8vXCJ0aGlzXCI9RE9NLCBpPWluZGV4LCBqPWpRdWVyeSBvYmplY3RcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59KShqUXVlcnkpO1xyXG5cclxuKGZ1bmN0aW9uICgkLCB1bmRlZmluZWQpIHtcclxuICAgIFwidXNlIHN0cmljdFwiO1xyXG4gICAgLypnbG9iYWwgZG9jdW1lbnQsIHdpbmRvdywgalF1ZXJ5LCBjb25zb2xlICovXHJcblxyXG4gICAgaWYgKHdpbmRvdy5TZWxlY3QyICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIEtFWSwgQWJzdHJhY3RTZWxlY3QyLCBTaW5nbGVTZWxlY3QyLCBNdWx0aVNlbGVjdDIsIG5leHRVaWQsIHNpemVyLFxyXG4gICAgICAgIGxhc3RNb3VzZVBvc2l0aW9uPXt4OjAseTowfSwgJGRvY3VtZW50LCBzY3JvbGxCYXJEaW1lbnNpb25zLFxyXG5cclxuICAgIEtFWSA9IHtcclxuICAgICAgICBUQUI6IDksXHJcbiAgICAgICAgRU5URVI6IDEzLFxyXG4gICAgICAgIEVTQzogMjcsXHJcbiAgICAgICAgU1BBQ0U6IDMyLFxyXG4gICAgICAgIExFRlQ6IDM3LFxyXG4gICAgICAgIFVQOiAzOCxcclxuICAgICAgICBSSUdIVDogMzksXHJcbiAgICAgICAgRE9XTjogNDAsXHJcbiAgICAgICAgU0hJRlQ6IDE2LFxyXG4gICAgICAgIENUUkw6IDE3LFxyXG4gICAgICAgIEFMVDogMTgsXHJcbiAgICAgICAgUEFHRV9VUDogMzMsXHJcbiAgICAgICAgUEFHRV9ET1dOOiAzNCxcclxuICAgICAgICBIT01FOiAzNixcclxuICAgICAgICBFTkQ6IDM1LFxyXG4gICAgICAgIEJBQ0tTUEFDRTogOCxcclxuICAgICAgICBERUxFVEU6IDQ2LFxyXG4gICAgICAgIGlzQXJyb3c6IGZ1bmN0aW9uIChrKSB7XHJcbiAgICAgICAgICAgIGsgPSBrLndoaWNoID8gay53aGljaCA6IGs7XHJcbiAgICAgICAgICAgIHN3aXRjaCAoaykge1xyXG4gICAgICAgICAgICBjYXNlIEtFWS5MRUZUOlxyXG4gICAgICAgICAgICBjYXNlIEtFWS5SSUdIVDpcclxuICAgICAgICAgICAgY2FzZSBLRVkuVVA6XHJcbiAgICAgICAgICAgIGNhc2UgS0VZLkRPV046XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBpc0NvbnRyb2w6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIHZhciBrID0gZS53aGljaDtcclxuICAgICAgICAgICAgc3dpdGNoIChrKSB7XHJcbiAgICAgICAgICAgIGNhc2UgS0VZLlNISUZUOlxyXG4gICAgICAgICAgICBjYXNlIEtFWS5DVFJMOlxyXG4gICAgICAgICAgICBjYXNlIEtFWS5BTFQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGUubWV0YUtleSkgcmV0dXJuIHRydWU7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBpc0Z1bmN0aW9uS2V5OiBmdW5jdGlvbiAoaykge1xyXG4gICAgICAgICAgICBrID0gay53aGljaCA/IGsud2hpY2ggOiBrO1xyXG4gICAgICAgICAgICByZXR1cm4gayA+PSAxMTIgJiYgayA8PSAxMjM7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIE1FQVNVUkVfU0NST0xMQkFSX1RFTVBMQVRFID0gXCI8ZGl2IGNsYXNzPSdzZWxlY3QyLW1lYXN1cmUtc2Nyb2xsYmFyJz48L2Rpdj5cIixcclxuXHJcbiAgICBESUFDUklUSUNTID0ge1wiXFx1MjRCNlwiOlwiQVwiLFwiXFx1RkYyMVwiOlwiQVwiLFwiXFx1MDBDMFwiOlwiQVwiLFwiXFx1MDBDMVwiOlwiQVwiLFwiXFx1MDBDMlwiOlwiQVwiLFwiXFx1MUVBNlwiOlwiQVwiLFwiXFx1MUVBNFwiOlwiQVwiLFwiXFx1MUVBQVwiOlwiQVwiLFwiXFx1MUVBOFwiOlwiQVwiLFwiXFx1MDBDM1wiOlwiQVwiLFwiXFx1MDEwMFwiOlwiQVwiLFwiXFx1MDEwMlwiOlwiQVwiLFwiXFx1MUVCMFwiOlwiQVwiLFwiXFx1MUVBRVwiOlwiQVwiLFwiXFx1MUVCNFwiOlwiQVwiLFwiXFx1MUVCMlwiOlwiQVwiLFwiXFx1MDIyNlwiOlwiQVwiLFwiXFx1MDFFMFwiOlwiQVwiLFwiXFx1MDBDNFwiOlwiQVwiLFwiXFx1MDFERVwiOlwiQVwiLFwiXFx1MUVBMlwiOlwiQVwiLFwiXFx1MDBDNVwiOlwiQVwiLFwiXFx1MDFGQVwiOlwiQVwiLFwiXFx1MDFDRFwiOlwiQVwiLFwiXFx1MDIwMFwiOlwiQVwiLFwiXFx1MDIwMlwiOlwiQVwiLFwiXFx1MUVBMFwiOlwiQVwiLFwiXFx1MUVBQ1wiOlwiQVwiLFwiXFx1MUVCNlwiOlwiQVwiLFwiXFx1MUUwMFwiOlwiQVwiLFwiXFx1MDEwNFwiOlwiQVwiLFwiXFx1MDIzQVwiOlwiQVwiLFwiXFx1MkM2RlwiOlwiQVwiLFwiXFx1QTczMlwiOlwiQUFcIixcIlxcdTAwQzZcIjpcIkFFXCIsXCJcXHUwMUZDXCI6XCJBRVwiLFwiXFx1MDFFMlwiOlwiQUVcIixcIlxcdUE3MzRcIjpcIkFPXCIsXCJcXHVBNzM2XCI6XCJBVVwiLFwiXFx1QTczOFwiOlwiQVZcIixcIlxcdUE3M0FcIjpcIkFWXCIsXCJcXHVBNzNDXCI6XCJBWVwiLFwiXFx1MjRCN1wiOlwiQlwiLFwiXFx1RkYyMlwiOlwiQlwiLFwiXFx1MUUwMlwiOlwiQlwiLFwiXFx1MUUwNFwiOlwiQlwiLFwiXFx1MUUwNlwiOlwiQlwiLFwiXFx1MDI0M1wiOlwiQlwiLFwiXFx1MDE4MlwiOlwiQlwiLFwiXFx1MDE4MVwiOlwiQlwiLFwiXFx1MjRCOFwiOlwiQ1wiLFwiXFx1RkYyM1wiOlwiQ1wiLFwiXFx1MDEwNlwiOlwiQ1wiLFwiXFx1MDEwOFwiOlwiQ1wiLFwiXFx1MDEwQVwiOlwiQ1wiLFwiXFx1MDEwQ1wiOlwiQ1wiLFwiXFx1MDBDN1wiOlwiQ1wiLFwiXFx1MUUwOFwiOlwiQ1wiLFwiXFx1MDE4N1wiOlwiQ1wiLFwiXFx1MDIzQlwiOlwiQ1wiLFwiXFx1QTczRVwiOlwiQ1wiLFwiXFx1MjRCOVwiOlwiRFwiLFwiXFx1RkYyNFwiOlwiRFwiLFwiXFx1MUUwQVwiOlwiRFwiLFwiXFx1MDEwRVwiOlwiRFwiLFwiXFx1MUUwQ1wiOlwiRFwiLFwiXFx1MUUxMFwiOlwiRFwiLFwiXFx1MUUxMlwiOlwiRFwiLFwiXFx1MUUwRVwiOlwiRFwiLFwiXFx1MDExMFwiOlwiRFwiLFwiXFx1MDE4QlwiOlwiRFwiLFwiXFx1MDE4QVwiOlwiRFwiLFwiXFx1MDE4OVwiOlwiRFwiLFwiXFx1QTc3OVwiOlwiRFwiLFwiXFx1MDFGMVwiOlwiRFpcIixcIlxcdTAxQzRcIjpcIkRaXCIsXCJcXHUwMUYyXCI6XCJEelwiLFwiXFx1MDFDNVwiOlwiRHpcIixcIlxcdTI0QkFcIjpcIkVcIixcIlxcdUZGMjVcIjpcIkVcIixcIlxcdTAwQzhcIjpcIkVcIixcIlxcdTAwQzlcIjpcIkVcIixcIlxcdTAwQ0FcIjpcIkVcIixcIlxcdTFFQzBcIjpcIkVcIixcIlxcdTFFQkVcIjpcIkVcIixcIlxcdTFFQzRcIjpcIkVcIixcIlxcdTFFQzJcIjpcIkVcIixcIlxcdTFFQkNcIjpcIkVcIixcIlxcdTAxMTJcIjpcIkVcIixcIlxcdTFFMTRcIjpcIkVcIixcIlxcdTFFMTZcIjpcIkVcIixcIlxcdTAxMTRcIjpcIkVcIixcIlxcdTAxMTZcIjpcIkVcIixcIlxcdTAwQ0JcIjpcIkVcIixcIlxcdTFFQkFcIjpcIkVcIixcIlxcdTAxMUFcIjpcIkVcIixcIlxcdTAyMDRcIjpcIkVcIixcIlxcdTAyMDZcIjpcIkVcIixcIlxcdTFFQjhcIjpcIkVcIixcIlxcdTFFQzZcIjpcIkVcIixcIlxcdTAyMjhcIjpcIkVcIixcIlxcdTFFMUNcIjpcIkVcIixcIlxcdTAxMThcIjpcIkVcIixcIlxcdTFFMThcIjpcIkVcIixcIlxcdTFFMUFcIjpcIkVcIixcIlxcdTAxOTBcIjpcIkVcIixcIlxcdTAxOEVcIjpcIkVcIixcIlxcdTI0QkJcIjpcIkZcIixcIlxcdUZGMjZcIjpcIkZcIixcIlxcdTFFMUVcIjpcIkZcIixcIlxcdTAxOTFcIjpcIkZcIixcIlxcdUE3N0JcIjpcIkZcIixcIlxcdTI0QkNcIjpcIkdcIixcIlxcdUZGMjdcIjpcIkdcIixcIlxcdTAxRjRcIjpcIkdcIixcIlxcdTAxMUNcIjpcIkdcIixcIlxcdTFFMjBcIjpcIkdcIixcIlxcdTAxMUVcIjpcIkdcIixcIlxcdTAxMjBcIjpcIkdcIixcIlxcdTAxRTZcIjpcIkdcIixcIlxcdTAxMjJcIjpcIkdcIixcIlxcdTAxRTRcIjpcIkdcIixcIlxcdTAxOTNcIjpcIkdcIixcIlxcdUE3QTBcIjpcIkdcIixcIlxcdUE3N0RcIjpcIkdcIixcIlxcdUE3N0VcIjpcIkdcIixcIlxcdTI0QkRcIjpcIkhcIixcIlxcdUZGMjhcIjpcIkhcIixcIlxcdTAxMjRcIjpcIkhcIixcIlxcdTFFMjJcIjpcIkhcIixcIlxcdTFFMjZcIjpcIkhcIixcIlxcdTAyMUVcIjpcIkhcIixcIlxcdTFFMjRcIjpcIkhcIixcIlxcdTFFMjhcIjpcIkhcIixcIlxcdTFFMkFcIjpcIkhcIixcIlxcdTAxMjZcIjpcIkhcIixcIlxcdTJDNjdcIjpcIkhcIixcIlxcdTJDNzVcIjpcIkhcIixcIlxcdUE3OERcIjpcIkhcIixcIlxcdTI0QkVcIjpcIklcIixcIlxcdUZGMjlcIjpcIklcIixcIlxcdTAwQ0NcIjpcIklcIixcIlxcdTAwQ0RcIjpcIklcIixcIlxcdTAwQ0VcIjpcIklcIixcIlxcdTAxMjhcIjpcIklcIixcIlxcdTAxMkFcIjpcIklcIixcIlxcdTAxMkNcIjpcIklcIixcIlxcdTAxMzBcIjpcIklcIixcIlxcdTAwQ0ZcIjpcIklcIixcIlxcdTFFMkVcIjpcIklcIixcIlxcdTFFQzhcIjpcIklcIixcIlxcdTAxQ0ZcIjpcIklcIixcIlxcdTAyMDhcIjpcIklcIixcIlxcdTAyMEFcIjpcIklcIixcIlxcdTFFQ0FcIjpcIklcIixcIlxcdTAxMkVcIjpcIklcIixcIlxcdTFFMkNcIjpcIklcIixcIlxcdTAxOTdcIjpcIklcIixcIlxcdTI0QkZcIjpcIkpcIixcIlxcdUZGMkFcIjpcIkpcIixcIlxcdTAxMzRcIjpcIkpcIixcIlxcdTAyNDhcIjpcIkpcIixcIlxcdTI0QzBcIjpcIktcIixcIlxcdUZGMkJcIjpcIktcIixcIlxcdTFFMzBcIjpcIktcIixcIlxcdTAxRThcIjpcIktcIixcIlxcdTFFMzJcIjpcIktcIixcIlxcdTAxMzZcIjpcIktcIixcIlxcdTFFMzRcIjpcIktcIixcIlxcdTAxOThcIjpcIktcIixcIlxcdTJDNjlcIjpcIktcIixcIlxcdUE3NDBcIjpcIktcIixcIlxcdUE3NDJcIjpcIktcIixcIlxcdUE3NDRcIjpcIktcIixcIlxcdUE3QTJcIjpcIktcIixcIlxcdTI0QzFcIjpcIkxcIixcIlxcdUZGMkNcIjpcIkxcIixcIlxcdTAxM0ZcIjpcIkxcIixcIlxcdTAxMzlcIjpcIkxcIixcIlxcdTAxM0RcIjpcIkxcIixcIlxcdTFFMzZcIjpcIkxcIixcIlxcdTFFMzhcIjpcIkxcIixcIlxcdTAxM0JcIjpcIkxcIixcIlxcdTFFM0NcIjpcIkxcIixcIlxcdTFFM0FcIjpcIkxcIixcIlxcdTAxNDFcIjpcIkxcIixcIlxcdTAyM0RcIjpcIkxcIixcIlxcdTJDNjJcIjpcIkxcIixcIlxcdTJDNjBcIjpcIkxcIixcIlxcdUE3NDhcIjpcIkxcIixcIlxcdUE3NDZcIjpcIkxcIixcIlxcdUE3ODBcIjpcIkxcIixcIlxcdTAxQzdcIjpcIkxKXCIsXCJcXHUwMUM4XCI6XCJMalwiLFwiXFx1MjRDMlwiOlwiTVwiLFwiXFx1RkYyRFwiOlwiTVwiLFwiXFx1MUUzRVwiOlwiTVwiLFwiXFx1MUU0MFwiOlwiTVwiLFwiXFx1MUU0MlwiOlwiTVwiLFwiXFx1MkM2RVwiOlwiTVwiLFwiXFx1MDE5Q1wiOlwiTVwiLFwiXFx1MjRDM1wiOlwiTlwiLFwiXFx1RkYyRVwiOlwiTlwiLFwiXFx1MDFGOFwiOlwiTlwiLFwiXFx1MDE0M1wiOlwiTlwiLFwiXFx1MDBEMVwiOlwiTlwiLFwiXFx1MUU0NFwiOlwiTlwiLFwiXFx1MDE0N1wiOlwiTlwiLFwiXFx1MUU0NlwiOlwiTlwiLFwiXFx1MDE0NVwiOlwiTlwiLFwiXFx1MUU0QVwiOlwiTlwiLFwiXFx1MUU0OFwiOlwiTlwiLFwiXFx1MDIyMFwiOlwiTlwiLFwiXFx1MDE5RFwiOlwiTlwiLFwiXFx1QTc5MFwiOlwiTlwiLFwiXFx1QTdBNFwiOlwiTlwiLFwiXFx1MDFDQVwiOlwiTkpcIixcIlxcdTAxQ0JcIjpcIk5qXCIsXCJcXHUyNEM0XCI6XCJPXCIsXCJcXHVGRjJGXCI6XCJPXCIsXCJcXHUwMEQyXCI6XCJPXCIsXCJcXHUwMEQzXCI6XCJPXCIsXCJcXHUwMEQ0XCI6XCJPXCIsXCJcXHUxRUQyXCI6XCJPXCIsXCJcXHUxRUQwXCI6XCJPXCIsXCJcXHUxRUQ2XCI6XCJPXCIsXCJcXHUxRUQ0XCI6XCJPXCIsXCJcXHUwMEQ1XCI6XCJPXCIsXCJcXHUxRTRDXCI6XCJPXCIsXCJcXHUwMjJDXCI6XCJPXCIsXCJcXHUxRTRFXCI6XCJPXCIsXCJcXHUwMTRDXCI6XCJPXCIsXCJcXHUxRTUwXCI6XCJPXCIsXCJcXHUxRTUyXCI6XCJPXCIsXCJcXHUwMTRFXCI6XCJPXCIsXCJcXHUwMjJFXCI6XCJPXCIsXCJcXHUwMjMwXCI6XCJPXCIsXCJcXHUwMEQ2XCI6XCJPXCIsXCJcXHUwMjJBXCI6XCJPXCIsXCJcXHUxRUNFXCI6XCJPXCIsXCJcXHUwMTUwXCI6XCJPXCIsXCJcXHUwMUQxXCI6XCJPXCIsXCJcXHUwMjBDXCI6XCJPXCIsXCJcXHUwMjBFXCI6XCJPXCIsXCJcXHUwMUEwXCI6XCJPXCIsXCJcXHUxRURDXCI6XCJPXCIsXCJcXHUxRURBXCI6XCJPXCIsXCJcXHUxRUUwXCI6XCJPXCIsXCJcXHUxRURFXCI6XCJPXCIsXCJcXHUxRUUyXCI6XCJPXCIsXCJcXHUxRUNDXCI6XCJPXCIsXCJcXHUxRUQ4XCI6XCJPXCIsXCJcXHUwMUVBXCI6XCJPXCIsXCJcXHUwMUVDXCI6XCJPXCIsXCJcXHUwMEQ4XCI6XCJPXCIsXCJcXHUwMUZFXCI6XCJPXCIsXCJcXHUwMTg2XCI6XCJPXCIsXCJcXHUwMTlGXCI6XCJPXCIsXCJcXHVBNzRBXCI6XCJPXCIsXCJcXHVBNzRDXCI6XCJPXCIsXCJcXHUwMUEyXCI6XCJPSVwiLFwiXFx1QTc0RVwiOlwiT09cIixcIlxcdTAyMjJcIjpcIk9VXCIsXCJcXHUyNEM1XCI6XCJQXCIsXCJcXHVGRjMwXCI6XCJQXCIsXCJcXHUxRTU0XCI6XCJQXCIsXCJcXHUxRTU2XCI6XCJQXCIsXCJcXHUwMUE0XCI6XCJQXCIsXCJcXHUyQzYzXCI6XCJQXCIsXCJcXHVBNzUwXCI6XCJQXCIsXCJcXHVBNzUyXCI6XCJQXCIsXCJcXHVBNzU0XCI6XCJQXCIsXCJcXHUyNEM2XCI6XCJRXCIsXCJcXHVGRjMxXCI6XCJRXCIsXCJcXHVBNzU2XCI6XCJRXCIsXCJcXHVBNzU4XCI6XCJRXCIsXCJcXHUwMjRBXCI6XCJRXCIsXCJcXHUyNEM3XCI6XCJSXCIsXCJcXHVGRjMyXCI6XCJSXCIsXCJcXHUwMTU0XCI6XCJSXCIsXCJcXHUxRTU4XCI6XCJSXCIsXCJcXHUwMTU4XCI6XCJSXCIsXCJcXHUwMjEwXCI6XCJSXCIsXCJcXHUwMjEyXCI6XCJSXCIsXCJcXHUxRTVBXCI6XCJSXCIsXCJcXHUxRTVDXCI6XCJSXCIsXCJcXHUwMTU2XCI6XCJSXCIsXCJcXHUxRTVFXCI6XCJSXCIsXCJcXHUwMjRDXCI6XCJSXCIsXCJcXHUyQzY0XCI6XCJSXCIsXCJcXHVBNzVBXCI6XCJSXCIsXCJcXHVBN0E2XCI6XCJSXCIsXCJcXHVBNzgyXCI6XCJSXCIsXCJcXHUyNEM4XCI6XCJTXCIsXCJcXHVGRjMzXCI6XCJTXCIsXCJcXHUxRTlFXCI6XCJTXCIsXCJcXHUwMTVBXCI6XCJTXCIsXCJcXHUxRTY0XCI6XCJTXCIsXCJcXHUwMTVDXCI6XCJTXCIsXCJcXHUxRTYwXCI6XCJTXCIsXCJcXHUwMTYwXCI6XCJTXCIsXCJcXHUxRTY2XCI6XCJTXCIsXCJcXHUxRTYyXCI6XCJTXCIsXCJcXHUxRTY4XCI6XCJTXCIsXCJcXHUwMjE4XCI6XCJTXCIsXCJcXHUwMTVFXCI6XCJTXCIsXCJcXHUyQzdFXCI6XCJTXCIsXCJcXHVBN0E4XCI6XCJTXCIsXCJcXHVBNzg0XCI6XCJTXCIsXCJcXHUyNEM5XCI6XCJUXCIsXCJcXHVGRjM0XCI6XCJUXCIsXCJcXHUxRTZBXCI6XCJUXCIsXCJcXHUwMTY0XCI6XCJUXCIsXCJcXHUxRTZDXCI6XCJUXCIsXCJcXHUwMjFBXCI6XCJUXCIsXCJcXHUwMTYyXCI6XCJUXCIsXCJcXHUxRTcwXCI6XCJUXCIsXCJcXHUxRTZFXCI6XCJUXCIsXCJcXHUwMTY2XCI6XCJUXCIsXCJcXHUwMUFDXCI6XCJUXCIsXCJcXHUwMUFFXCI6XCJUXCIsXCJcXHUwMjNFXCI6XCJUXCIsXCJcXHVBNzg2XCI6XCJUXCIsXCJcXHVBNzI4XCI6XCJUWlwiLFwiXFx1MjRDQVwiOlwiVVwiLFwiXFx1RkYzNVwiOlwiVVwiLFwiXFx1MDBEOVwiOlwiVVwiLFwiXFx1MDBEQVwiOlwiVVwiLFwiXFx1MDBEQlwiOlwiVVwiLFwiXFx1MDE2OFwiOlwiVVwiLFwiXFx1MUU3OFwiOlwiVVwiLFwiXFx1MDE2QVwiOlwiVVwiLFwiXFx1MUU3QVwiOlwiVVwiLFwiXFx1MDE2Q1wiOlwiVVwiLFwiXFx1MDBEQ1wiOlwiVVwiLFwiXFx1MDFEQlwiOlwiVVwiLFwiXFx1MDFEN1wiOlwiVVwiLFwiXFx1MDFENVwiOlwiVVwiLFwiXFx1MDFEOVwiOlwiVVwiLFwiXFx1MUVFNlwiOlwiVVwiLFwiXFx1MDE2RVwiOlwiVVwiLFwiXFx1MDE3MFwiOlwiVVwiLFwiXFx1MDFEM1wiOlwiVVwiLFwiXFx1MDIxNFwiOlwiVVwiLFwiXFx1MDIxNlwiOlwiVVwiLFwiXFx1MDFBRlwiOlwiVVwiLFwiXFx1MUVFQVwiOlwiVVwiLFwiXFx1MUVFOFwiOlwiVVwiLFwiXFx1MUVFRVwiOlwiVVwiLFwiXFx1MUVFQ1wiOlwiVVwiLFwiXFx1MUVGMFwiOlwiVVwiLFwiXFx1MUVFNFwiOlwiVVwiLFwiXFx1MUU3MlwiOlwiVVwiLFwiXFx1MDE3MlwiOlwiVVwiLFwiXFx1MUU3NlwiOlwiVVwiLFwiXFx1MUU3NFwiOlwiVVwiLFwiXFx1MDI0NFwiOlwiVVwiLFwiXFx1MjRDQlwiOlwiVlwiLFwiXFx1RkYzNlwiOlwiVlwiLFwiXFx1MUU3Q1wiOlwiVlwiLFwiXFx1MUU3RVwiOlwiVlwiLFwiXFx1MDFCMlwiOlwiVlwiLFwiXFx1QTc1RVwiOlwiVlwiLFwiXFx1MDI0NVwiOlwiVlwiLFwiXFx1QTc2MFwiOlwiVllcIixcIlxcdTI0Q0NcIjpcIldcIixcIlxcdUZGMzdcIjpcIldcIixcIlxcdTFFODBcIjpcIldcIixcIlxcdTFFODJcIjpcIldcIixcIlxcdTAxNzRcIjpcIldcIixcIlxcdTFFODZcIjpcIldcIixcIlxcdTFFODRcIjpcIldcIixcIlxcdTFFODhcIjpcIldcIixcIlxcdTJDNzJcIjpcIldcIixcIlxcdTI0Q0RcIjpcIlhcIixcIlxcdUZGMzhcIjpcIlhcIixcIlxcdTFFOEFcIjpcIlhcIixcIlxcdTFFOENcIjpcIlhcIixcIlxcdTI0Q0VcIjpcIllcIixcIlxcdUZGMzlcIjpcIllcIixcIlxcdTFFRjJcIjpcIllcIixcIlxcdTAwRERcIjpcIllcIixcIlxcdTAxNzZcIjpcIllcIixcIlxcdTFFRjhcIjpcIllcIixcIlxcdTAyMzJcIjpcIllcIixcIlxcdTFFOEVcIjpcIllcIixcIlxcdTAxNzhcIjpcIllcIixcIlxcdTFFRjZcIjpcIllcIixcIlxcdTFFRjRcIjpcIllcIixcIlxcdTAxQjNcIjpcIllcIixcIlxcdTAyNEVcIjpcIllcIixcIlxcdTFFRkVcIjpcIllcIixcIlxcdTI0Q0ZcIjpcIlpcIixcIlxcdUZGM0FcIjpcIlpcIixcIlxcdTAxNzlcIjpcIlpcIixcIlxcdTFFOTBcIjpcIlpcIixcIlxcdTAxN0JcIjpcIlpcIixcIlxcdTAxN0RcIjpcIlpcIixcIlxcdTFFOTJcIjpcIlpcIixcIlxcdTFFOTRcIjpcIlpcIixcIlxcdTAxQjVcIjpcIlpcIixcIlxcdTAyMjRcIjpcIlpcIixcIlxcdTJDN0ZcIjpcIlpcIixcIlxcdTJDNkJcIjpcIlpcIixcIlxcdUE3NjJcIjpcIlpcIixcIlxcdTI0RDBcIjpcImFcIixcIlxcdUZGNDFcIjpcImFcIixcIlxcdTFFOUFcIjpcImFcIixcIlxcdTAwRTBcIjpcImFcIixcIlxcdTAwRTFcIjpcImFcIixcIlxcdTAwRTJcIjpcImFcIixcIlxcdTFFQTdcIjpcImFcIixcIlxcdTFFQTVcIjpcImFcIixcIlxcdTFFQUJcIjpcImFcIixcIlxcdTFFQTlcIjpcImFcIixcIlxcdTAwRTNcIjpcImFcIixcIlxcdTAxMDFcIjpcImFcIixcIlxcdTAxMDNcIjpcImFcIixcIlxcdTFFQjFcIjpcImFcIixcIlxcdTFFQUZcIjpcImFcIixcIlxcdTFFQjVcIjpcImFcIixcIlxcdTFFQjNcIjpcImFcIixcIlxcdTAyMjdcIjpcImFcIixcIlxcdTAxRTFcIjpcImFcIixcIlxcdTAwRTRcIjpcImFcIixcIlxcdTAxREZcIjpcImFcIixcIlxcdTFFQTNcIjpcImFcIixcIlxcdTAwRTVcIjpcImFcIixcIlxcdTAxRkJcIjpcImFcIixcIlxcdTAxQ0VcIjpcImFcIixcIlxcdTAyMDFcIjpcImFcIixcIlxcdTAyMDNcIjpcImFcIixcIlxcdTFFQTFcIjpcImFcIixcIlxcdTFFQURcIjpcImFcIixcIlxcdTFFQjdcIjpcImFcIixcIlxcdTFFMDFcIjpcImFcIixcIlxcdTAxMDVcIjpcImFcIixcIlxcdTJDNjVcIjpcImFcIixcIlxcdTAyNTBcIjpcImFcIixcIlxcdUE3MzNcIjpcImFhXCIsXCJcXHUwMEU2XCI6XCJhZVwiLFwiXFx1MDFGRFwiOlwiYWVcIixcIlxcdTAxRTNcIjpcImFlXCIsXCJcXHVBNzM1XCI6XCJhb1wiLFwiXFx1QTczN1wiOlwiYXVcIixcIlxcdUE3MzlcIjpcImF2XCIsXCJcXHVBNzNCXCI6XCJhdlwiLFwiXFx1QTczRFwiOlwiYXlcIixcIlxcdTI0RDFcIjpcImJcIixcIlxcdUZGNDJcIjpcImJcIixcIlxcdTFFMDNcIjpcImJcIixcIlxcdTFFMDVcIjpcImJcIixcIlxcdTFFMDdcIjpcImJcIixcIlxcdTAxODBcIjpcImJcIixcIlxcdTAxODNcIjpcImJcIixcIlxcdTAyNTNcIjpcImJcIixcIlxcdTI0RDJcIjpcImNcIixcIlxcdUZGNDNcIjpcImNcIixcIlxcdTAxMDdcIjpcImNcIixcIlxcdTAxMDlcIjpcImNcIixcIlxcdTAxMEJcIjpcImNcIixcIlxcdTAxMERcIjpcImNcIixcIlxcdTAwRTdcIjpcImNcIixcIlxcdTFFMDlcIjpcImNcIixcIlxcdTAxODhcIjpcImNcIixcIlxcdTAyM0NcIjpcImNcIixcIlxcdUE3M0ZcIjpcImNcIixcIlxcdTIxODRcIjpcImNcIixcIlxcdTI0RDNcIjpcImRcIixcIlxcdUZGNDRcIjpcImRcIixcIlxcdTFFMEJcIjpcImRcIixcIlxcdTAxMEZcIjpcImRcIixcIlxcdTFFMERcIjpcImRcIixcIlxcdTFFMTFcIjpcImRcIixcIlxcdTFFMTNcIjpcImRcIixcIlxcdTFFMEZcIjpcImRcIixcIlxcdTAxMTFcIjpcImRcIixcIlxcdTAxOENcIjpcImRcIixcIlxcdTAyNTZcIjpcImRcIixcIlxcdTAyNTdcIjpcImRcIixcIlxcdUE3N0FcIjpcImRcIixcIlxcdTAxRjNcIjpcImR6XCIsXCJcXHUwMUM2XCI6XCJkelwiLFwiXFx1MjRENFwiOlwiZVwiLFwiXFx1RkY0NVwiOlwiZVwiLFwiXFx1MDBFOFwiOlwiZVwiLFwiXFx1MDBFOVwiOlwiZVwiLFwiXFx1MDBFQVwiOlwiZVwiLFwiXFx1MUVDMVwiOlwiZVwiLFwiXFx1MUVCRlwiOlwiZVwiLFwiXFx1MUVDNVwiOlwiZVwiLFwiXFx1MUVDM1wiOlwiZVwiLFwiXFx1MUVCRFwiOlwiZVwiLFwiXFx1MDExM1wiOlwiZVwiLFwiXFx1MUUxNVwiOlwiZVwiLFwiXFx1MUUxN1wiOlwiZVwiLFwiXFx1MDExNVwiOlwiZVwiLFwiXFx1MDExN1wiOlwiZVwiLFwiXFx1MDBFQlwiOlwiZVwiLFwiXFx1MUVCQlwiOlwiZVwiLFwiXFx1MDExQlwiOlwiZVwiLFwiXFx1MDIwNVwiOlwiZVwiLFwiXFx1MDIwN1wiOlwiZVwiLFwiXFx1MUVCOVwiOlwiZVwiLFwiXFx1MUVDN1wiOlwiZVwiLFwiXFx1MDIyOVwiOlwiZVwiLFwiXFx1MUUxRFwiOlwiZVwiLFwiXFx1MDExOVwiOlwiZVwiLFwiXFx1MUUxOVwiOlwiZVwiLFwiXFx1MUUxQlwiOlwiZVwiLFwiXFx1MDI0N1wiOlwiZVwiLFwiXFx1MDI1QlwiOlwiZVwiLFwiXFx1MDFERFwiOlwiZVwiLFwiXFx1MjRENVwiOlwiZlwiLFwiXFx1RkY0NlwiOlwiZlwiLFwiXFx1MUUxRlwiOlwiZlwiLFwiXFx1MDE5MlwiOlwiZlwiLFwiXFx1QTc3Q1wiOlwiZlwiLFwiXFx1MjRENlwiOlwiZ1wiLFwiXFx1RkY0N1wiOlwiZ1wiLFwiXFx1MDFGNVwiOlwiZ1wiLFwiXFx1MDExRFwiOlwiZ1wiLFwiXFx1MUUyMVwiOlwiZ1wiLFwiXFx1MDExRlwiOlwiZ1wiLFwiXFx1MDEyMVwiOlwiZ1wiLFwiXFx1MDFFN1wiOlwiZ1wiLFwiXFx1MDEyM1wiOlwiZ1wiLFwiXFx1MDFFNVwiOlwiZ1wiLFwiXFx1MDI2MFwiOlwiZ1wiLFwiXFx1QTdBMVwiOlwiZ1wiLFwiXFx1MUQ3OVwiOlwiZ1wiLFwiXFx1QTc3RlwiOlwiZ1wiLFwiXFx1MjREN1wiOlwiaFwiLFwiXFx1RkY0OFwiOlwiaFwiLFwiXFx1MDEyNVwiOlwiaFwiLFwiXFx1MUUyM1wiOlwiaFwiLFwiXFx1MUUyN1wiOlwiaFwiLFwiXFx1MDIxRlwiOlwiaFwiLFwiXFx1MUUyNVwiOlwiaFwiLFwiXFx1MUUyOVwiOlwiaFwiLFwiXFx1MUUyQlwiOlwiaFwiLFwiXFx1MUU5NlwiOlwiaFwiLFwiXFx1MDEyN1wiOlwiaFwiLFwiXFx1MkM2OFwiOlwiaFwiLFwiXFx1MkM3NlwiOlwiaFwiLFwiXFx1MDI2NVwiOlwiaFwiLFwiXFx1MDE5NVwiOlwiaHZcIixcIlxcdTI0RDhcIjpcImlcIixcIlxcdUZGNDlcIjpcImlcIixcIlxcdTAwRUNcIjpcImlcIixcIlxcdTAwRURcIjpcImlcIixcIlxcdTAwRUVcIjpcImlcIixcIlxcdTAxMjlcIjpcImlcIixcIlxcdTAxMkJcIjpcImlcIixcIlxcdTAxMkRcIjpcImlcIixcIlxcdTAwRUZcIjpcImlcIixcIlxcdTFFMkZcIjpcImlcIixcIlxcdTFFQzlcIjpcImlcIixcIlxcdTAxRDBcIjpcImlcIixcIlxcdTAyMDlcIjpcImlcIixcIlxcdTAyMEJcIjpcImlcIixcIlxcdTFFQ0JcIjpcImlcIixcIlxcdTAxMkZcIjpcImlcIixcIlxcdTFFMkRcIjpcImlcIixcIlxcdTAyNjhcIjpcImlcIixcIlxcdTAxMzFcIjpcImlcIixcIlxcdTI0RDlcIjpcImpcIixcIlxcdUZGNEFcIjpcImpcIixcIlxcdTAxMzVcIjpcImpcIixcIlxcdTAxRjBcIjpcImpcIixcIlxcdTAyNDlcIjpcImpcIixcIlxcdTI0REFcIjpcImtcIixcIlxcdUZGNEJcIjpcImtcIixcIlxcdTFFMzFcIjpcImtcIixcIlxcdTAxRTlcIjpcImtcIixcIlxcdTFFMzNcIjpcImtcIixcIlxcdTAxMzdcIjpcImtcIixcIlxcdTFFMzVcIjpcImtcIixcIlxcdTAxOTlcIjpcImtcIixcIlxcdTJDNkFcIjpcImtcIixcIlxcdUE3NDFcIjpcImtcIixcIlxcdUE3NDNcIjpcImtcIixcIlxcdUE3NDVcIjpcImtcIixcIlxcdUE3QTNcIjpcImtcIixcIlxcdTI0REJcIjpcImxcIixcIlxcdUZGNENcIjpcImxcIixcIlxcdTAxNDBcIjpcImxcIixcIlxcdTAxM0FcIjpcImxcIixcIlxcdTAxM0VcIjpcImxcIixcIlxcdTFFMzdcIjpcImxcIixcIlxcdTFFMzlcIjpcImxcIixcIlxcdTAxM0NcIjpcImxcIixcIlxcdTFFM0RcIjpcImxcIixcIlxcdTFFM0JcIjpcImxcIixcIlxcdTAxN0ZcIjpcImxcIixcIlxcdTAxNDJcIjpcImxcIixcIlxcdTAxOUFcIjpcImxcIixcIlxcdTAyNkJcIjpcImxcIixcIlxcdTJDNjFcIjpcImxcIixcIlxcdUE3NDlcIjpcImxcIixcIlxcdUE3ODFcIjpcImxcIixcIlxcdUE3NDdcIjpcImxcIixcIlxcdTAxQzlcIjpcImxqXCIsXCJcXHUyNERDXCI6XCJtXCIsXCJcXHVGRjREXCI6XCJtXCIsXCJcXHUxRTNGXCI6XCJtXCIsXCJcXHUxRTQxXCI6XCJtXCIsXCJcXHUxRTQzXCI6XCJtXCIsXCJcXHUwMjcxXCI6XCJtXCIsXCJcXHUwMjZGXCI6XCJtXCIsXCJcXHUyNEREXCI6XCJuXCIsXCJcXHVGRjRFXCI6XCJuXCIsXCJcXHUwMUY5XCI6XCJuXCIsXCJcXHUwMTQ0XCI6XCJuXCIsXCJcXHUwMEYxXCI6XCJuXCIsXCJcXHUxRTQ1XCI6XCJuXCIsXCJcXHUwMTQ4XCI6XCJuXCIsXCJcXHUxRTQ3XCI6XCJuXCIsXCJcXHUwMTQ2XCI6XCJuXCIsXCJcXHUxRTRCXCI6XCJuXCIsXCJcXHUxRTQ5XCI6XCJuXCIsXCJcXHUwMTlFXCI6XCJuXCIsXCJcXHUwMjcyXCI6XCJuXCIsXCJcXHUwMTQ5XCI6XCJuXCIsXCJcXHVBNzkxXCI6XCJuXCIsXCJcXHVBN0E1XCI6XCJuXCIsXCJcXHUwMUNDXCI6XCJualwiLFwiXFx1MjRERVwiOlwib1wiLFwiXFx1RkY0RlwiOlwib1wiLFwiXFx1MDBGMlwiOlwib1wiLFwiXFx1MDBGM1wiOlwib1wiLFwiXFx1MDBGNFwiOlwib1wiLFwiXFx1MUVEM1wiOlwib1wiLFwiXFx1MUVEMVwiOlwib1wiLFwiXFx1MUVEN1wiOlwib1wiLFwiXFx1MUVENVwiOlwib1wiLFwiXFx1MDBGNVwiOlwib1wiLFwiXFx1MUU0RFwiOlwib1wiLFwiXFx1MDIyRFwiOlwib1wiLFwiXFx1MUU0RlwiOlwib1wiLFwiXFx1MDE0RFwiOlwib1wiLFwiXFx1MUU1MVwiOlwib1wiLFwiXFx1MUU1M1wiOlwib1wiLFwiXFx1MDE0RlwiOlwib1wiLFwiXFx1MDIyRlwiOlwib1wiLFwiXFx1MDIzMVwiOlwib1wiLFwiXFx1MDBGNlwiOlwib1wiLFwiXFx1MDIyQlwiOlwib1wiLFwiXFx1MUVDRlwiOlwib1wiLFwiXFx1MDE1MVwiOlwib1wiLFwiXFx1MDFEMlwiOlwib1wiLFwiXFx1MDIwRFwiOlwib1wiLFwiXFx1MDIwRlwiOlwib1wiLFwiXFx1MDFBMVwiOlwib1wiLFwiXFx1MUVERFwiOlwib1wiLFwiXFx1MUVEQlwiOlwib1wiLFwiXFx1MUVFMVwiOlwib1wiLFwiXFx1MUVERlwiOlwib1wiLFwiXFx1MUVFM1wiOlwib1wiLFwiXFx1MUVDRFwiOlwib1wiLFwiXFx1MUVEOVwiOlwib1wiLFwiXFx1MDFFQlwiOlwib1wiLFwiXFx1MDFFRFwiOlwib1wiLFwiXFx1MDBGOFwiOlwib1wiLFwiXFx1MDFGRlwiOlwib1wiLFwiXFx1MDI1NFwiOlwib1wiLFwiXFx1QTc0QlwiOlwib1wiLFwiXFx1QTc0RFwiOlwib1wiLFwiXFx1MDI3NVwiOlwib1wiLFwiXFx1MDFBM1wiOlwib2lcIixcIlxcdTAyMjNcIjpcIm91XCIsXCJcXHVBNzRGXCI6XCJvb1wiLFwiXFx1MjRERlwiOlwicFwiLFwiXFx1RkY1MFwiOlwicFwiLFwiXFx1MUU1NVwiOlwicFwiLFwiXFx1MUU1N1wiOlwicFwiLFwiXFx1MDFBNVwiOlwicFwiLFwiXFx1MUQ3RFwiOlwicFwiLFwiXFx1QTc1MVwiOlwicFwiLFwiXFx1QTc1M1wiOlwicFwiLFwiXFx1QTc1NVwiOlwicFwiLFwiXFx1MjRFMFwiOlwicVwiLFwiXFx1RkY1MVwiOlwicVwiLFwiXFx1MDI0QlwiOlwicVwiLFwiXFx1QTc1N1wiOlwicVwiLFwiXFx1QTc1OVwiOlwicVwiLFwiXFx1MjRFMVwiOlwiclwiLFwiXFx1RkY1MlwiOlwiclwiLFwiXFx1MDE1NVwiOlwiclwiLFwiXFx1MUU1OVwiOlwiclwiLFwiXFx1MDE1OVwiOlwiclwiLFwiXFx1MDIxMVwiOlwiclwiLFwiXFx1MDIxM1wiOlwiclwiLFwiXFx1MUU1QlwiOlwiclwiLFwiXFx1MUU1RFwiOlwiclwiLFwiXFx1MDE1N1wiOlwiclwiLFwiXFx1MUU1RlwiOlwiclwiLFwiXFx1MDI0RFwiOlwiclwiLFwiXFx1MDI3RFwiOlwiclwiLFwiXFx1QTc1QlwiOlwiclwiLFwiXFx1QTdBN1wiOlwiclwiLFwiXFx1QTc4M1wiOlwiclwiLFwiXFx1MjRFMlwiOlwic1wiLFwiXFx1RkY1M1wiOlwic1wiLFwiXFx1MDBERlwiOlwic1wiLFwiXFx1MDE1QlwiOlwic1wiLFwiXFx1MUU2NVwiOlwic1wiLFwiXFx1MDE1RFwiOlwic1wiLFwiXFx1MUU2MVwiOlwic1wiLFwiXFx1MDE2MVwiOlwic1wiLFwiXFx1MUU2N1wiOlwic1wiLFwiXFx1MUU2M1wiOlwic1wiLFwiXFx1MUU2OVwiOlwic1wiLFwiXFx1MDIxOVwiOlwic1wiLFwiXFx1MDE1RlwiOlwic1wiLFwiXFx1MDIzRlwiOlwic1wiLFwiXFx1QTdBOVwiOlwic1wiLFwiXFx1QTc4NVwiOlwic1wiLFwiXFx1MUU5QlwiOlwic1wiLFwiXFx1MjRFM1wiOlwidFwiLFwiXFx1RkY1NFwiOlwidFwiLFwiXFx1MUU2QlwiOlwidFwiLFwiXFx1MUU5N1wiOlwidFwiLFwiXFx1MDE2NVwiOlwidFwiLFwiXFx1MUU2RFwiOlwidFwiLFwiXFx1MDIxQlwiOlwidFwiLFwiXFx1MDE2M1wiOlwidFwiLFwiXFx1MUU3MVwiOlwidFwiLFwiXFx1MUU2RlwiOlwidFwiLFwiXFx1MDE2N1wiOlwidFwiLFwiXFx1MDFBRFwiOlwidFwiLFwiXFx1MDI4OFwiOlwidFwiLFwiXFx1MkM2NlwiOlwidFwiLFwiXFx1QTc4N1wiOlwidFwiLFwiXFx1QTcyOVwiOlwidHpcIixcIlxcdTI0RTRcIjpcInVcIixcIlxcdUZGNTVcIjpcInVcIixcIlxcdTAwRjlcIjpcInVcIixcIlxcdTAwRkFcIjpcInVcIixcIlxcdTAwRkJcIjpcInVcIixcIlxcdTAxNjlcIjpcInVcIixcIlxcdTFFNzlcIjpcInVcIixcIlxcdTAxNkJcIjpcInVcIixcIlxcdTFFN0JcIjpcInVcIixcIlxcdTAxNkRcIjpcInVcIixcIlxcdTAwRkNcIjpcInVcIixcIlxcdTAxRENcIjpcInVcIixcIlxcdTAxRDhcIjpcInVcIixcIlxcdTAxRDZcIjpcInVcIixcIlxcdTAxREFcIjpcInVcIixcIlxcdTFFRTdcIjpcInVcIixcIlxcdTAxNkZcIjpcInVcIixcIlxcdTAxNzFcIjpcInVcIixcIlxcdTAxRDRcIjpcInVcIixcIlxcdTAyMTVcIjpcInVcIixcIlxcdTAyMTdcIjpcInVcIixcIlxcdTAxQjBcIjpcInVcIixcIlxcdTFFRUJcIjpcInVcIixcIlxcdTFFRTlcIjpcInVcIixcIlxcdTFFRUZcIjpcInVcIixcIlxcdTFFRURcIjpcInVcIixcIlxcdTFFRjFcIjpcInVcIixcIlxcdTFFRTVcIjpcInVcIixcIlxcdTFFNzNcIjpcInVcIixcIlxcdTAxNzNcIjpcInVcIixcIlxcdTFFNzdcIjpcInVcIixcIlxcdTFFNzVcIjpcInVcIixcIlxcdTAyODlcIjpcInVcIixcIlxcdTI0RTVcIjpcInZcIixcIlxcdUZGNTZcIjpcInZcIixcIlxcdTFFN0RcIjpcInZcIixcIlxcdTFFN0ZcIjpcInZcIixcIlxcdTAyOEJcIjpcInZcIixcIlxcdUE3NUZcIjpcInZcIixcIlxcdTAyOENcIjpcInZcIixcIlxcdUE3NjFcIjpcInZ5XCIsXCJcXHUyNEU2XCI6XCJ3XCIsXCJcXHVGRjU3XCI6XCJ3XCIsXCJcXHUxRTgxXCI6XCJ3XCIsXCJcXHUxRTgzXCI6XCJ3XCIsXCJcXHUwMTc1XCI6XCJ3XCIsXCJcXHUxRTg3XCI6XCJ3XCIsXCJcXHUxRTg1XCI6XCJ3XCIsXCJcXHUxRTk4XCI6XCJ3XCIsXCJcXHUxRTg5XCI6XCJ3XCIsXCJcXHUyQzczXCI6XCJ3XCIsXCJcXHUyNEU3XCI6XCJ4XCIsXCJcXHVGRjU4XCI6XCJ4XCIsXCJcXHUxRThCXCI6XCJ4XCIsXCJcXHUxRThEXCI6XCJ4XCIsXCJcXHUyNEU4XCI6XCJ5XCIsXCJcXHVGRjU5XCI6XCJ5XCIsXCJcXHUxRUYzXCI6XCJ5XCIsXCJcXHUwMEZEXCI6XCJ5XCIsXCJcXHUwMTc3XCI6XCJ5XCIsXCJcXHUxRUY5XCI6XCJ5XCIsXCJcXHUwMjMzXCI6XCJ5XCIsXCJcXHUxRThGXCI6XCJ5XCIsXCJcXHUwMEZGXCI6XCJ5XCIsXCJcXHUxRUY3XCI6XCJ5XCIsXCJcXHUxRTk5XCI6XCJ5XCIsXCJcXHUxRUY1XCI6XCJ5XCIsXCJcXHUwMUI0XCI6XCJ5XCIsXCJcXHUwMjRGXCI6XCJ5XCIsXCJcXHUxRUZGXCI6XCJ5XCIsXCJcXHUyNEU5XCI6XCJ6XCIsXCJcXHVGRjVBXCI6XCJ6XCIsXCJcXHUwMTdBXCI6XCJ6XCIsXCJcXHUxRTkxXCI6XCJ6XCIsXCJcXHUwMTdDXCI6XCJ6XCIsXCJcXHUwMTdFXCI6XCJ6XCIsXCJcXHUxRTkzXCI6XCJ6XCIsXCJcXHUxRTk1XCI6XCJ6XCIsXCJcXHUwMUI2XCI6XCJ6XCIsXCJcXHUwMjI1XCI6XCJ6XCIsXCJcXHUwMjQwXCI6XCJ6XCIsXCJcXHUyQzZDXCI6XCJ6XCIsXCJcXHVBNzYzXCI6XCJ6XCJ9O1xyXG5cclxuICAgICRkb2N1bWVudCA9ICQoZG9jdW1lbnQpO1xyXG5cclxuICAgIG5leHRVaWQ9KGZ1bmN0aW9uKCkgeyB2YXIgY291bnRlcj0xOyByZXR1cm4gZnVuY3Rpb24oKSB7IHJldHVybiBjb3VudGVyKys7IH07IH0oKSk7XHJcblxyXG5cclxuICAgIGZ1bmN0aW9uIHN0cmlwRGlhY3JpdGljcyhzdHIpIHtcclxuICAgICAgICB2YXIgcmV0LCBpLCBsLCBjO1xyXG5cclxuICAgICAgICBpZiAoIXN0ciB8fCBzdHIubGVuZ3RoIDwgMSkgcmV0dXJuIHN0cjtcclxuXHJcbiAgICAgICAgcmV0ID0gXCJcIjtcclxuICAgICAgICBmb3IgKGkgPSAwLCBsID0gc3RyLmxlbmd0aDsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgICAgICBjID0gc3RyLmNoYXJBdChpKTtcclxuICAgICAgICAgICAgcmV0ICs9IERJQUNSSVRJQ1NbY10gfHwgYztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJldDtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBpbmRleE9mKHZhbHVlLCBhcnJheSkge1xyXG4gICAgICAgIHZhciBpID0gMCwgbCA9IGFycmF5Lmxlbmd0aDtcclxuICAgICAgICBmb3IgKDsgaSA8IGw7IGkgPSBpICsgMSkge1xyXG4gICAgICAgICAgICBpZiAoZXF1YWwodmFsdWUsIGFycmF5W2ldKSkgcmV0dXJuIGk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAtMTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBtZWFzdXJlU2Nyb2xsYmFyICgpIHtcclxuICAgICAgICB2YXIgJHRlbXBsYXRlID0gJCggTUVBU1VSRV9TQ1JPTExCQVJfVEVNUExBVEUgKTtcclxuICAgICAgICAkdGVtcGxhdGUuYXBwZW5kVG8oJ2JvZHknKTtcclxuXHJcbiAgICAgICAgdmFyIGRpbSA9IHtcclxuICAgICAgICAgICAgd2lkdGg6ICR0ZW1wbGF0ZS53aWR0aCgpIC0gJHRlbXBsYXRlWzBdLmNsaWVudFdpZHRoLFxyXG4gICAgICAgICAgICBoZWlnaHQ6ICR0ZW1wbGF0ZS5oZWlnaHQoKSAtICR0ZW1wbGF0ZVswXS5jbGllbnRIZWlnaHRcclxuICAgICAgICB9O1xyXG4gICAgICAgICR0ZW1wbGF0ZS5yZW1vdmUoKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGRpbTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbXBhcmVzIGVxdWFsaXR5IG9mIGEgYW5kIGJcclxuICAgICAqIEBwYXJhbSBhXHJcbiAgICAgKiBAcGFyYW0gYlxyXG4gICAgICovXHJcbiAgICBmdW5jdGlvbiBlcXVhbChhLCBiKSB7XHJcbiAgICAgICAgaWYgKGEgPT09IGIpIHJldHVybiB0cnVlO1xyXG4gICAgICAgIGlmIChhID09PSB1bmRlZmluZWQgfHwgYiA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgaWYgKGEgPT09IG51bGwgfHwgYiA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIC8vIENoZWNrIHdoZXRoZXIgJ2EnIG9yICdiJyBpcyBhIHN0cmluZyAocHJpbWl0aXZlIG9yIG9iamVjdCkuXHJcbiAgICAgICAgLy8gVGhlIGNvbmNhdGVuYXRpb24gb2YgYW4gZW1wdHkgc3RyaW5nICgrJycpIGNvbnZlcnRzIGl0cyBhcmd1bWVudCB0byBhIHN0cmluZydzIHByaW1pdGl2ZS5cclxuICAgICAgICBpZiAoYS5jb25zdHJ1Y3RvciA9PT0gU3RyaW5nKSByZXR1cm4gYSsnJyA9PT0gYisnJzsgLy8gYSsnJyAtIGluIGNhc2UgJ2EnIGlzIGEgU3RyaW5nIG9iamVjdFxyXG4gICAgICAgIGlmIChiLmNvbnN0cnVjdG9yID09PSBTdHJpbmcpIHJldHVybiBiKycnID09PSBhKycnOyAvLyBiKycnIC0gaW4gY2FzZSAnYicgaXMgYSBTdHJpbmcgb2JqZWN0XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3BsaXRzIHRoZSBzdHJpbmcgaW50byBhbiBhcnJheSBvZiB2YWx1ZXMsIHRyaW1taW5nIGVhY2ggdmFsdWUuIEFuIGVtcHR5IGFycmF5IGlzIHJldHVybmVkIGZvciBudWxscyBvciBlbXB0eVxyXG4gICAgICogc3RyaW5nc1xyXG4gICAgICogQHBhcmFtIHN0cmluZ1xyXG4gICAgICogQHBhcmFtIHNlcGFyYXRvclxyXG4gICAgICovXHJcbiAgICBmdW5jdGlvbiBzcGxpdFZhbChzdHJpbmcsIHNlcGFyYXRvcikge1xyXG4gICAgICAgIHZhciB2YWwsIGksIGw7XHJcbiAgICAgICAgaWYgKHN0cmluZyA9PT0gbnVsbCB8fCBzdHJpbmcubGVuZ3RoIDwgMSkgcmV0dXJuIFtdO1xyXG4gICAgICAgIHZhbCA9IHN0cmluZy5zcGxpdChzZXBhcmF0b3IpO1xyXG4gICAgICAgIGZvciAoaSA9IDAsIGwgPSB2YWwubGVuZ3RoOyBpIDwgbDsgaSA9IGkgKyAxKSB2YWxbaV0gPSAkLnRyaW0odmFsW2ldKTtcclxuICAgICAgICByZXR1cm4gdmFsO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGdldFNpZGVCb3JkZXJQYWRkaW5nKGVsZW1lbnQpIHtcclxuICAgICAgICByZXR1cm4gZWxlbWVudC5vdXRlcldpZHRoKGZhbHNlKSAtIGVsZW1lbnQud2lkdGgoKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBpbnN0YWxsS2V5VXBDaGFuZ2VFdmVudChlbGVtZW50KSB7XHJcbiAgICAgICAgdmFyIGtleT1cImtleXVwLWNoYW5nZS12YWx1ZVwiO1xyXG4gICAgICAgIGVsZW1lbnQub24oXCJrZXlkb3duXCIsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKCQuZGF0YShlbGVtZW50LCBrZXkpID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICQuZGF0YShlbGVtZW50LCBrZXksIGVsZW1lbnQudmFsKCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgZWxlbWVudC5vbihcImtleXVwXCIsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIHZhbD0gJC5kYXRhKGVsZW1lbnQsIGtleSk7XHJcbiAgICAgICAgICAgIGlmICh2YWwgIT09IHVuZGVmaW5lZCAmJiBlbGVtZW50LnZhbCgpICE9PSB2YWwpIHtcclxuICAgICAgICAgICAgICAgICQucmVtb3ZlRGF0YShlbGVtZW50LCBrZXkpO1xyXG4gICAgICAgICAgICAgICAgZWxlbWVudC50cmlnZ2VyKFwia2V5dXAtY2hhbmdlXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgJGRvY3VtZW50Lm9uKFwibW91c2Vtb3ZlXCIsIGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgbGFzdE1vdXNlUG9zaXRpb24ueCA9IGUucGFnZVg7XHJcbiAgICAgICAgbGFzdE1vdXNlUG9zaXRpb24ueSA9IGUucGFnZVk7XHJcbiAgICB9KTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIGZpbHRlcnMgbW91c2UgZXZlbnRzIHNvIGFuIGV2ZW50IGlzIGZpcmVkIG9ubHkgaWYgdGhlIG1vdXNlIG1vdmVkLlxyXG4gICAgICpcclxuICAgICAqIGZpbHRlcnMgb3V0IG1vdXNlIGV2ZW50cyB0aGF0IG9jY3VyIHdoZW4gbW91c2UgaXMgc3RhdGlvbmFyeSBidXRcclxuICAgICAqIHRoZSBlbGVtZW50cyB1bmRlciB0aGUgcG9pbnRlciBhcmUgc2Nyb2xsZWQuXHJcbiAgICAgKi9cclxuICAgIGZ1bmN0aW9uIGluc3RhbGxGaWx0ZXJlZE1vdXNlTW92ZShlbGVtZW50KSB7XHJcbiAgICAgICAgZWxlbWVudC5vbihcIm1vdXNlbW92ZVwiLCBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICB2YXIgbGFzdHBvcyA9IGxhc3RNb3VzZVBvc2l0aW9uO1xyXG4gICAgICAgICAgICBpZiAobGFzdHBvcyA9PT0gdW5kZWZpbmVkIHx8IGxhc3Rwb3MueCAhPT0gZS5wYWdlWCB8fCBsYXN0cG9zLnkgIT09IGUucGFnZVkpIHtcclxuICAgICAgICAgICAgICAgICQoZS50YXJnZXQpLnRyaWdnZXIoXCJtb3VzZW1vdmUtZmlsdGVyZWRcIiwgZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERlYm91bmNlcyBhIGZ1bmN0aW9uLiBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBjYWxscyB0aGUgb3JpZ2luYWwgZm4gZnVuY3Rpb24gb25seSBpZiBubyBpbnZvY2F0aW9ucyBoYXZlIGJlZW4gbWFkZVxyXG4gICAgICogd2l0aGluIHRoZSBsYXN0IHF1aWV0TWlsbGlzIG1pbGxpc2Vjb25kcy5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gcXVpZXRNaWxsaXMgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0IGJlZm9yZSBpbnZva2luZyBmblxyXG4gICAgICogQHBhcmFtIGZuIGZ1bmN0aW9uIHRvIGJlIGRlYm91bmNlZFxyXG4gICAgICogQHBhcmFtIGN0eCBvYmplY3QgdG8gYmUgdXNlZCBhcyB0aGlzIHJlZmVyZW5jZSB3aXRoaW4gZm5cclxuICAgICAqIEByZXR1cm4gZGVib3VuY2VkIHZlcnNpb24gb2YgZm5cclxuICAgICAqL1xyXG4gICAgZnVuY3Rpb24gZGVib3VuY2UocXVpZXRNaWxsaXMsIGZuLCBjdHgpIHtcclxuICAgICAgICBjdHggPSBjdHggfHwgdW5kZWZpbmVkO1xyXG4gICAgICAgIHZhciB0aW1lb3V0O1xyXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xyXG4gICAgICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xyXG4gICAgICAgICAgICB0aW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgICBmbi5hcHBseShjdHgsIGFyZ3MpO1xyXG4gICAgICAgICAgICB9LCBxdWlldE1pbGxpcyk7XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEEgc2ltcGxlIGltcGxlbWVudGF0aW9uIG9mIGEgdGh1bmtcclxuICAgICAqIEBwYXJhbSBmb3JtdWxhIGZ1bmN0aW9uIHVzZWQgdG8gbGF6aWx5IGluaXRpYWxpemUgdGhlIHRodW5rXHJcbiAgICAgKiBAcmV0dXJuIHtGdW5jdGlvbn1cclxuICAgICAqL1xyXG4gICAgZnVuY3Rpb24gdGh1bmsoZm9ybXVsYSkge1xyXG4gICAgICAgIHZhciBldmFsdWF0ZWQgPSBmYWxzZSxcclxuICAgICAgICAgICAgdmFsdWU7XHJcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICBpZiAoZXZhbHVhdGVkID09PSBmYWxzZSkgeyB2YWx1ZSA9IGZvcm11bGEoKTsgZXZhbHVhdGVkID0gdHJ1ZTsgfVxyXG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICAgICAgfTtcclxuICAgIH07XHJcblxyXG4gICAgZnVuY3Rpb24gaW5zdGFsbERlYm91bmNlZFNjcm9sbCh0aHJlc2hvbGQsIGVsZW1lbnQpIHtcclxuICAgICAgICB2YXIgbm90aWZ5ID0gZGVib3VuY2UodGhyZXNob2xkLCBmdW5jdGlvbiAoZSkgeyBlbGVtZW50LnRyaWdnZXIoXCJzY3JvbGwtZGVib3VuY2VkXCIsIGUpO30pO1xyXG4gICAgICAgIGVsZW1lbnQub24oXCJzY3JvbGxcIiwgZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgaWYgKGluZGV4T2YoZS50YXJnZXQsIGVsZW1lbnQuZ2V0KCkpID49IDApIG5vdGlmeShlKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBmb2N1cygkZWwpIHtcclxuICAgICAgICBpZiAoJGVsWzBdID09PSBkb2N1bWVudC5hY3RpdmVFbGVtZW50KSByZXR1cm47XHJcblxyXG4gICAgICAgIC8qIHNldCB0aGUgZm9jdXMgaW4gYSAwIHRpbWVvdXQgLSB0aGF0IHdheSB0aGUgZm9jdXMgaXMgc2V0IGFmdGVyIHRoZSBwcm9jZXNzaW5nXHJcbiAgICAgICAgICAgIG9mIHRoZSBjdXJyZW50IGV2ZW50IGhhcyBmaW5pc2hlZCAtIHdoaWNoIHNlZW1zIGxpa2UgdGhlIG9ubHkgcmVsaWFibGUgd2F5XHJcbiAgICAgICAgICAgIHRvIHNldCBmb2N1cyAqL1xyXG4gICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICB2YXIgZWw9JGVsWzBdLCBwb3M9JGVsLnZhbCgpLmxlbmd0aCwgcmFuZ2U7XHJcblxyXG4gICAgICAgICAgICAkZWwuZm9jdXMoKTtcclxuXHJcbiAgICAgICAgICAgIC8qIG1ha2Ugc3VyZSBlbCByZWNlaXZlZCBmb2N1cyBzbyB3ZSBkbyBub3QgZXJyb3Igb3V0IHdoZW4gdHJ5aW5nIHRvIG1hbmlwdWxhdGUgdGhlIGNhcmV0LlxyXG4gICAgICAgICAgICAgICAgc29tZXRpbWVzIG1vZGFscyBvciBvdGhlcnMgbGlzdGVuZXJzIG1heSBzdGVhbCBpdCBhZnRlciBpdHMgc2V0ICovXHJcbiAgICAgICAgICAgIGlmICgkZWwuaXMoXCI6dmlzaWJsZVwiKSAmJiBlbCA9PT0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkge1xyXG5cclxuICAgICAgICAgICAgICAgIC8qIGFmdGVyIHRoZSBmb2N1cyBpcyBzZXQgbW92ZSB0aGUgY2FyZXQgdG8gdGhlIGVuZCwgbmVjZXNzYXJ5IHdoZW4gd2UgdmFsKClcclxuICAgICAgICAgICAgICAgICAgICBqdXN0IGJlZm9yZSBzZXR0aW5nIGZvY3VzICovXHJcbiAgICAgICAgICAgICAgICBpZihlbC5zZXRTZWxlY3Rpb25SYW5nZSlcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBlbC5zZXRTZWxlY3Rpb25SYW5nZShwb3MsIHBvcyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChlbC5jcmVhdGVUZXh0UmFuZ2UpIHtcclxuICAgICAgICAgICAgICAgICAgICByYW5nZSA9IGVsLmNyZWF0ZVRleHRSYW5nZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJhbmdlLmNvbGxhcHNlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICByYW5nZS5zZWxlY3QoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sIDApO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGdldEN1cnNvckluZm8oZWwpIHtcclxuICAgICAgICBlbCA9ICQoZWwpWzBdO1xyXG4gICAgICAgIHZhciBvZmZzZXQgPSAwO1xyXG4gICAgICAgIHZhciBsZW5ndGggPSAwO1xyXG4gICAgICAgIGlmICgnc2VsZWN0aW9uU3RhcnQnIGluIGVsKSB7XHJcbiAgICAgICAgICAgIG9mZnNldCA9IGVsLnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBsZW5ndGggPSBlbC5zZWxlY3Rpb25FbmQgLSBvZmZzZXQ7XHJcbiAgICAgICAgfSBlbHNlIGlmICgnc2VsZWN0aW9uJyBpbiBkb2N1bWVudCkge1xyXG4gICAgICAgICAgICBlbC5mb2N1cygpO1xyXG4gICAgICAgICAgICB2YXIgc2VsID0gZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCk7XHJcbiAgICAgICAgICAgIGxlbmd0aCA9IGRvY3VtZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpLnRleHQubGVuZ3RoO1xyXG4gICAgICAgICAgICBzZWwubW92ZVN0YXJ0KCdjaGFyYWN0ZXInLCAtZWwudmFsdWUubGVuZ3RoKTtcclxuICAgICAgICAgICAgb2Zmc2V0ID0gc2VsLnRleHQubGVuZ3RoIC0gbGVuZ3RoO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geyBvZmZzZXQ6IG9mZnNldCwgbGVuZ3RoOiBsZW5ndGggfTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBraWxsRXZlbnQoZXZlbnQpIHtcclxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24ga2lsbEV2ZW50SW1tZWRpYXRlbHkoZXZlbnQpIHtcclxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIG1lYXN1cmVUZXh0V2lkdGgoZSkge1xyXG4gICAgICAgIGlmICghc2l6ZXIpe1xyXG4gICAgICAgICAgICB2YXIgc3R5bGUgPSBlWzBdLmN1cnJlbnRTdHlsZSB8fCB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlWzBdLCBudWxsKTtcclxuICAgICAgICAgICAgc2l6ZXIgPSAkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikpLmNzcyh7XHJcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogXCJhYnNvbHV0ZVwiLFxyXG4gICAgICAgICAgICAgICAgbGVmdDogXCItMTAwMDBweFwiLFxyXG4gICAgICAgICAgICAgICAgdG9wOiBcIi0xMDAwMHB4XCIsXHJcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiBcIm5vbmVcIixcclxuICAgICAgICAgICAgICAgIGZvbnRTaXplOiBzdHlsZS5mb250U2l6ZSxcclxuICAgICAgICAgICAgICAgIGZvbnRGYW1pbHk6IHN0eWxlLmZvbnRGYW1pbHksXHJcbiAgICAgICAgICAgICAgICBmb250U3R5bGU6IHN0eWxlLmZvbnRTdHlsZSxcclxuICAgICAgICAgICAgICAgIGZvbnRXZWlnaHQ6IHN0eWxlLmZvbnRXZWlnaHQsXHJcbiAgICAgICAgICAgICAgICBsZXR0ZXJTcGFjaW5nOiBzdHlsZS5sZXR0ZXJTcGFjaW5nLFxyXG4gICAgICAgICAgICAgICAgdGV4dFRyYW5zZm9ybTogc3R5bGUudGV4dFRyYW5zZm9ybSxcclxuICAgICAgICAgICAgICAgIHdoaXRlU3BhY2U6IFwibm93cmFwXCJcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHNpemVyLmF0dHIoXCJjbGFzc1wiLFwic2VsZWN0Mi1zaXplclwiKTtcclxuICAgICAgICAgICAgJChcImJvZHlcIikuYXBwZW5kKHNpemVyKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2l6ZXIudGV4dChlLnZhbCgpKTtcclxuICAgICAgICByZXR1cm4gc2l6ZXIud2lkdGgoKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBzeW5jQ3NzQ2xhc3NlcyhkZXN0LCBzcmMsIGFkYXB0ZXIpIHtcclxuICAgICAgICB2YXIgY2xhc3NlcywgcmVwbGFjZW1lbnRzID0gW10sIGFkYXB0ZWQ7XHJcblxyXG4gICAgICAgIGNsYXNzZXMgPSBkZXN0LmF0dHIoXCJjbGFzc1wiKTtcclxuICAgICAgICBpZiAoY2xhc3Nlcykge1xyXG4gICAgICAgICAgICBjbGFzc2VzID0gJycgKyBjbGFzc2VzOyAvLyBmb3IgSUUgd2hpY2ggcmV0dXJucyBvYmplY3RcclxuICAgICAgICAgICAgJChjbGFzc2VzLnNwbGl0KFwiIFwiKSkuZWFjaDIoZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pbmRleE9mKFwic2VsZWN0Mi1cIikgPT09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudHMucHVzaCh0aGlzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNsYXNzZXMgPSBzcmMuYXR0cihcImNsYXNzXCIpO1xyXG4gICAgICAgIGlmIChjbGFzc2VzKSB7XHJcbiAgICAgICAgICAgIGNsYXNzZXMgPSAnJyArIGNsYXNzZXM7IC8vIGZvciBJRSB3aGljaCByZXR1cm5zIG9iamVjdFxyXG4gICAgICAgICAgICAkKGNsYXNzZXMuc3BsaXQoXCIgXCIpKS5lYWNoMihmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmluZGV4T2YoXCJzZWxlY3QyLVwiKSAhPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGFkYXB0ZWQgPSBhZGFwdGVyKHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChhZGFwdGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50cy5wdXNoKHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGRlc3QuYXR0cihcImNsYXNzXCIsIHJlcGxhY2VtZW50cy5qb2luKFwiIFwiKSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGZ1bmN0aW9uIG1hcmtNYXRjaCh0ZXh0LCB0ZXJtLCBtYXJrdXAsIGVzY2FwZU1hcmt1cCkge1xyXG4gICAgICAgIHZhciBtYXRjaD1zdHJpcERpYWNyaXRpY3ModGV4dC50b1VwcGVyQ2FzZSgpKS5pbmRleE9mKHN0cmlwRGlhY3JpdGljcyh0ZXJtLnRvVXBwZXJDYXNlKCkpKSxcclxuICAgICAgICAgICAgdGw9dGVybS5sZW5ndGg7XHJcblxyXG4gICAgICAgIGlmIChtYXRjaDwwKSB7XHJcbiAgICAgICAgICAgIG1hcmt1cC5wdXNoKGVzY2FwZU1hcmt1cCh0ZXh0KSk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIG1hcmt1cC5wdXNoKGVzY2FwZU1hcmt1cCh0ZXh0LnN1YnN0cmluZygwLCBtYXRjaCkpKTtcclxuICAgICAgICBtYXJrdXAucHVzaChcIjxzcGFuIGNsYXNzPSdzZWxlY3QyLW1hdGNoJz5cIik7XHJcbiAgICAgICAgbWFya3VwLnB1c2goZXNjYXBlTWFya3VwKHRleHQuc3Vic3RyaW5nKG1hdGNoLCBtYXRjaCArIHRsKSkpO1xyXG4gICAgICAgIG1hcmt1cC5wdXNoKFwiPC9zcGFuPlwiKTtcclxuICAgICAgICBtYXJrdXAucHVzaChlc2NhcGVNYXJrdXAodGV4dC5zdWJzdHJpbmcobWF0Y2ggKyB0bCwgdGV4dC5sZW5ndGgpKSk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZGVmYXVsdEVzY2FwZU1hcmt1cChtYXJrdXApIHtcclxuICAgICAgICB2YXIgcmVwbGFjZV9tYXAgPSB7XHJcbiAgICAgICAgICAgICdcXFxcJzogJyYjOTI7JyxcclxuICAgICAgICAgICAgJyYnOiAnJmFtcDsnLFxyXG4gICAgICAgICAgICAnPCc6ICcmbHQ7JyxcclxuICAgICAgICAgICAgJz4nOiAnJmd0OycsXHJcbiAgICAgICAgICAgICdcIic6ICcmcXVvdDsnLFxyXG4gICAgICAgICAgICBcIidcIjogJyYjMzk7JyxcclxuICAgICAgICAgICAgXCIvXCI6ICcmIzQ3OydcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICByZXR1cm4gU3RyaW5nKG1hcmt1cCkucmVwbGFjZSgvWyY8PlwiJ1xcL1xcXFxdL2csIGZ1bmN0aW9uIChtYXRjaCkge1xyXG4gICAgICAgICAgICByZXR1cm4gcmVwbGFjZV9tYXBbbWF0Y2hdO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJvZHVjZXMgYW4gYWpheC1iYXNlZCBxdWVyeSBmdW5jdGlvblxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBvcHRpb25zIG9iamVjdCBjb250YWluaW5nIGNvbmZpZ3VyYXRpb24gcGFyYW10ZXJzXHJcbiAgICAgKiBAcGFyYW0gb3B0aW9ucy5wYXJhbXMgcGFyYW1ldGVyIG1hcCBmb3IgdGhlIHRyYW5zcG9ydCBhamF4IGNhbGwsIGNhbiBjb250YWluIHN1Y2ggb3B0aW9ucyBhcyBjYWNoZSwganNvbnBDYWxsYmFjaywgZXRjLiBzZWUgJC5hamF4XHJcbiAgICAgKiBAcGFyYW0gb3B0aW9ucy50cmFuc3BvcnQgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIHVzZWQgdG8gZXhlY3V0ZSB0aGUgYWpheCByZXF1ZXN0LiBtdXN0IGJlIGNvbXBhdGlibGUgd2l0aCBwYXJhbWV0ZXJzIHN1cHBvcnRlZCBieSAkLmFqYXhcclxuICAgICAqIEBwYXJhbSBvcHRpb25zLnVybCB1cmwgZm9yIHRoZSBkYXRhXHJcbiAgICAgKiBAcGFyYW0gb3B0aW9ucy5kYXRhIGEgZnVuY3Rpb24oc2VhcmNoVGVybSwgcGFnZU51bWJlciwgY29udGV4dCkgdGhhdCBzaG91bGQgcmV0dXJuIGFuIG9iamVjdCBjb250YWluaW5nIHF1ZXJ5IHN0cmluZyBwYXJhbWV0ZXJzIGZvciB0aGUgYWJvdmUgdXJsLlxyXG4gICAgICogQHBhcmFtIG9wdGlvbnMuZGF0YVR5cGUgcmVxdWVzdCBkYXRhIHR5cGU6IGFqYXgsIGpzb25wLCBvdGhlciBkYXRhdGF0eXBlcyBzdXBwb3J0ZWQgYnkgalF1ZXJ5J3MgJC5hamF4IGZ1bmN0aW9uIG9yIHRoZSB0cmFuc3BvcnQgZnVuY3Rpb24gaWYgc3BlY2lmaWVkXHJcbiAgICAgKiBAcGFyYW0gb3B0aW9ucy5xdWlldE1pbGxpcyAob3B0aW9uYWwpIG1pbGxpc2Vjb25kcyB0byB3YWl0IGJlZm9yZSBtYWtpbmcgdGhlIGFqYXhSZXF1ZXN0LCBoZWxwcyBkZWJvdW5jZSB0aGUgYWpheCBmdW5jdGlvbiBpZiBpbnZva2VkIHRvbyBvZnRlblxyXG4gICAgICogQHBhcmFtIG9wdGlvbnMucmVzdWx0cyBhIGZ1bmN0aW9uKHJlbW90ZURhdGEsIHBhZ2VOdW1iZXIpIHRoYXQgY29udmVydHMgZGF0YSByZXR1cm5lZCBmb3JtIHRoZSByZW1vdGUgcmVxdWVzdCB0byB0aGUgZm9ybWF0IGV4cGVjdGVkIGJ5IFNlbGVjdDIuXHJcbiAgICAgKiAgICAgIFRoZSBleHBlY3RlZCBmb3JtYXQgaXMgYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGZvbGxvd2luZyBrZXlzOlxyXG4gICAgICogICAgICByZXN1bHRzIGFycmF5IG9mIG9iamVjdHMgdGhhdCB3aWxsIGJlIHVzZWQgYXMgY2hvaWNlc1xyXG4gICAgICogICAgICBtb3JlIChvcHRpb25hbCkgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlcmUgYXJlIG1vcmUgcmVzdWx0cyBhdmFpbGFibGVcclxuICAgICAqICAgICAgRXhhbXBsZToge3Jlc3VsdHM6W3tpZDoxLCB0ZXh0OidSZWQnfSx7aWQ6MiwgdGV4dDonQmx1ZSd9XSwgbW9yZTp0cnVlfVxyXG4gICAgICovXHJcbiAgICBmdW5jdGlvbiBhamF4KG9wdGlvbnMpIHtcclxuICAgICAgICB2YXIgdGltZW91dCwgLy8gY3VycmVudCBzY2hlZHVsZWQgYnV0IG5vdCB5ZXQgZXhlY3V0ZWQgcmVxdWVzdFxyXG4gICAgICAgICAgICBoYW5kbGVyID0gbnVsbCxcclxuICAgICAgICAgICAgcXVpZXRNaWxsaXMgPSBvcHRpb25zLnF1aWV0TWlsbGlzIHx8IDEwMCxcclxuICAgICAgICAgICAgYWpheFVybCA9IG9wdGlvbnMudXJsLFxyXG4gICAgICAgICAgICBzZWxmID0gdGhpcztcclxuXHJcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChxdWVyeSkge1xyXG4gICAgICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xyXG4gICAgICAgICAgICB0aW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGRhdGEgPSBvcHRpb25zLmRhdGEsIC8vIGFqYXggZGF0YSBmdW5jdGlvblxyXG4gICAgICAgICAgICAgICAgICAgIHVybCA9IGFqYXhVcmwsIC8vIGFqYXggdXJsIHN0cmluZyBvciBmdW5jdGlvblxyXG4gICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydCA9IG9wdGlvbnMudHJhbnNwb3J0IHx8ICQuZm4uc2VsZWN0Mi5hamF4RGVmYXVsdHMudHJhbnNwb3J0LFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIGRlcHJlY2F0ZWQgLSB0byBiZSByZW1vdmVkIGluIDQuMCAgLSB1c2UgcGFyYW1zIGluc3RlYWRcclxuICAgICAgICAgICAgICAgICAgICBkZXByZWNhdGVkID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBvcHRpb25zLnR5cGUgfHwgJ0dFVCcsIC8vIHNldCB0eXBlIG9mIHJlcXVlc3QgKEdFVCBvciBQT1NUKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYWNoZTogb3B0aW9ucy5jYWNoZSB8fCBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAganNvbnBDYWxsYmFjazogb3B0aW9ucy5qc29ucENhbGxiYWNrfHx1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiBvcHRpb25zLmRhdGFUeXBlfHxcImpzb25cIlxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zID0gJC5leHRlbmQoe30sICQuZm4uc2VsZWN0Mi5hamF4RGVmYXVsdHMucGFyYW1zLCBkZXByZWNhdGVkKTtcclxuXHJcbiAgICAgICAgICAgICAgICBkYXRhID0gZGF0YSA/IGRhdGEuY2FsbChzZWxmLCBxdWVyeS50ZXJtLCBxdWVyeS5wYWdlLCBxdWVyeS5jb250ZXh0KSA6IG51bGw7XHJcbiAgICAgICAgICAgICAgICB1cmwgPSAodHlwZW9mIHVybCA9PT0gJ2Z1bmN0aW9uJykgPyB1cmwuY2FsbChzZWxmLCBxdWVyeS50ZXJtLCBxdWVyeS5wYWdlLCBxdWVyeS5jb250ZXh0KSA6IHVybDtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoaGFuZGxlcikgeyBoYW5kbGVyLmFib3J0KCk7IH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5wYXJhbXMpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoJC5pc0Z1bmN0aW9uKG9wdGlvbnMucGFyYW1zKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAkLmV4dGVuZChwYXJhbXMsIG9wdGlvbnMucGFyYW1zLmNhbGwoc2VsZikpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICQuZXh0ZW5kKHBhcmFtcywgb3B0aW9ucy5wYXJhbXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAkLmV4dGVuZChwYXJhbXMsIHtcclxuICAgICAgICAgICAgICAgICAgICB1cmw6IHVybCxcclxuICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogb3B0aW9ucy5kYXRhVHlwZSxcclxuICAgICAgICAgICAgICAgICAgICBkYXRhOiBkYXRhLFxyXG4gICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uIChkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gLSByZXBsYWNlIHF1ZXJ5LnBhZ2Ugd2l0aCBxdWVyeSBzbyB1c2VycyBoYXZlIGFjY2VzcyB0byB0ZXJtLCBwYWdlLCBldGMuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHRzID0gb3B0aW9ucy5yZXN1bHRzKGRhdGEsIHF1ZXJ5LnBhZ2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVyeS5jYWxsYmFjayhyZXN1bHRzKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIGhhbmRsZXIgPSB0cmFuc3BvcnQuY2FsbChzZWxmLCBwYXJhbXMpO1xyXG4gICAgICAgICAgICB9LCBxdWlldE1pbGxpcyk7XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFByb2R1Y2VzIGEgcXVlcnkgZnVuY3Rpb24gdGhhdCB3b3JrcyB3aXRoIGEgbG9jYWwgYXJyYXlcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBvYmplY3QgY29udGFpbmluZyBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMuIFRoZSBvcHRpb25zIHBhcmFtZXRlciBjYW4gZWl0aGVyIGJlIGFuIGFycmF5IG9yIGFuXHJcbiAgICAgKiBvYmplY3QuXHJcbiAgICAgKlxyXG4gICAgICogSWYgdGhlIGFycmF5IGZvcm0gaXMgdXNlZCBpdCBpcyBhc3N1bWVkIHRoYXQgaXQgY29udGFpbnMgb2JqZWN0cyB3aXRoICdpZCcgYW5kICd0ZXh0JyBrZXlzLlxyXG4gICAgICpcclxuICAgICAqIElmIHRoZSBvYmplY3QgZm9ybSBpcyB1c2VkIHRpIGlzIGFzc3VtZWQgdGhhdCBpdCBjb250YWlucyAnZGF0YScgYW5kICd0ZXh0JyBrZXlzLiBUaGUgJ2RhdGEnIGtleSBzaG91bGQgY29udGFpblxyXG4gICAgICogYW4gYXJyYXkgb2Ygb2JqZWN0cyB0aGF0IHdpbGwgYmUgdXNlZCBhcyBjaG9pY2VzLiBUaGVzZSBvYmplY3RzIG11c3QgY29udGFpbiBhdCBsZWFzdCBhbiAnaWQnIGtleS4gVGhlICd0ZXh0J1xyXG4gICAgICoga2V5IGNhbiBlaXRoZXIgYmUgYSBTdHJpbmcgaW4gd2hpY2ggY2FzZSBpdCBpcyBleHBlY3RlZCB0aGF0IGVhY2ggZWxlbWVudCBpbiB0aGUgJ2RhdGEnIGFycmF5IGhhcyBhIGtleSB3aXRoIHRoZVxyXG4gICAgICogdmFsdWUgb2YgJ3RleHQnIHdoaWNoIHdpbGwgYmUgdXNlZCB0byBtYXRjaCBjaG9pY2VzLiBBbHRlcm5hdGl2ZWx5LCB0ZXh0IGNhbiBiZSBhIGZ1bmN0aW9uKGl0ZW0pIHRoYXQgY2FuIGV4dHJhY3RcclxuICAgICAqIHRoZSB0ZXh0LlxyXG4gICAgICovXHJcbiAgICBmdW5jdGlvbiBsb2NhbChvcHRpb25zKSB7XHJcbiAgICAgICAgdmFyIGRhdGEgPSBvcHRpb25zLCAvLyBkYXRhIGVsZW1lbnRzXHJcbiAgICAgICAgICAgIGRhdGFUZXh0LFxyXG4gICAgICAgICAgICB0bXAsXHJcbiAgICAgICAgICAgIHRleHQgPSBmdW5jdGlvbiAoaXRlbSkgeyByZXR1cm4gXCJcIitpdGVtLnRleHQ7IH07IC8vIGZ1bmN0aW9uIHVzZWQgdG8gcmV0cmlldmUgdGhlIHRleHQgcG9ydGlvbiBvZiBhIGRhdGEgaXRlbSB0aGF0IGlzIG1hdGNoZWQgYWdhaW5zdCB0aGUgc2VhcmNoXHJcblxyXG4gICAgICAgICBpZiAoJC5pc0FycmF5KGRhdGEpKSB7XHJcbiAgICAgICAgICAgIHRtcCA9IGRhdGE7XHJcbiAgICAgICAgICAgIGRhdGEgPSB7IHJlc3VsdHM6IHRtcCB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgIGlmICgkLmlzRnVuY3Rpb24oZGF0YSkgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIHRtcCA9IGRhdGE7XHJcbiAgICAgICAgICAgIGRhdGEgPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRtcDsgfTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBkYXRhSXRlbSA9IGRhdGEoKTtcclxuICAgICAgICBpZiAoZGF0YUl0ZW0udGV4dCkge1xyXG4gICAgICAgICAgICB0ZXh0ID0gZGF0YUl0ZW0udGV4dDtcclxuICAgICAgICAgICAgLy8gaWYgdGV4dCBpcyBub3QgYSBmdW5jdGlvbiB3ZSBhc3N1bWUgaXQgdG8gYmUgYSBrZXkgbmFtZVxyXG4gICAgICAgICAgICBpZiAoISQuaXNGdW5jdGlvbih0ZXh0KSkge1xyXG4gICAgICAgICAgICAgICAgZGF0YVRleHQgPSBkYXRhSXRlbS50ZXh0OyAvLyB3ZSBuZWVkIHRvIHN0b3JlIHRoaXMgaW4gYSBzZXBhcmF0ZSB2YXJpYWJsZSBiZWNhdXNlIGluIHRoZSBuZXh0IHN0ZXAgZGF0YSBnZXRzIHJlc2V0IGFuZCBkYXRhLnRleHQgaXMgbm8gbG9uZ2VyIGF2YWlsYWJsZVxyXG4gICAgICAgICAgICAgICAgdGV4dCA9IGZ1bmN0aW9uIChpdGVtKSB7IHJldHVybiBpdGVtW2RhdGFUZXh0XTsgfTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChxdWVyeSkge1xyXG4gICAgICAgICAgICB2YXIgdCA9IHF1ZXJ5LnRlcm0sIGZpbHRlcmVkID0geyByZXN1bHRzOiBbXSB9LCBwcm9jZXNzO1xyXG4gICAgICAgICAgICBpZiAodCA9PT0gXCJcIikge1xyXG4gICAgICAgICAgICAgICAgcXVlcnkuY2FsbGJhY2soZGF0YSgpKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcHJvY2VzcyA9IGZ1bmN0aW9uKGRhdHVtLCBjb2xsZWN0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZ3JvdXAsIGF0dHI7XHJcbiAgICAgICAgICAgICAgICBkYXR1bSA9IGRhdHVtWzBdO1xyXG4gICAgICAgICAgICAgICAgaWYgKGRhdHVtLmNoaWxkcmVuKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXAgPSB7fTtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGF0dHIgaW4gZGF0dW0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdHVtLmhhc093blByb3BlcnR5KGF0dHIpKSBncm91cFthdHRyXT1kYXR1bVthdHRyXTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXAuY2hpbGRyZW49W107XHJcbiAgICAgICAgICAgICAgICAgICAgJChkYXR1bS5jaGlsZHJlbikuZWFjaDIoZnVuY3Rpb24oaSwgY2hpbGREYXR1bSkgeyBwcm9jZXNzKGNoaWxkRGF0dW0sIGdyb3VwLmNoaWxkcmVuKTsgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGdyb3VwLmNoaWxkcmVuLmxlbmd0aCB8fCBxdWVyeS5tYXRjaGVyKHQsIHRleHQoZ3JvdXApLCBkYXR1bSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdGlvbi5wdXNoKGdyb3VwKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChxdWVyeS5tYXRjaGVyKHQsIHRleHQoZGF0dW0pLCBkYXR1bSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdGlvbi5wdXNoKGRhdHVtKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAkKGRhdGEoKS5yZXN1bHRzKS5lYWNoMihmdW5jdGlvbihpLCBkYXR1bSkgeyBwcm9jZXNzKGRhdHVtLCBmaWx0ZXJlZC5yZXN1bHRzKTsgfSk7XHJcbiAgICAgICAgICAgIHF1ZXJ5LmNhbGxiYWNrKGZpbHRlcmVkKTtcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFRPRE8gamF2YWRvY1xyXG4gICAgZnVuY3Rpb24gdGFncyhkYXRhKSB7XHJcbiAgICAgICAgdmFyIGlzRnVuYyA9ICQuaXNGdW5jdGlvbihkYXRhKTtcclxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHF1ZXJ5KSB7XHJcbiAgICAgICAgICAgIHZhciB0ID0gcXVlcnkudGVybSwgZmlsdGVyZWQgPSB7cmVzdWx0czogW119O1xyXG4gICAgICAgICAgICAkKGlzRnVuYyA/IGRhdGEoKSA6IGRhdGEpLmVhY2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGlzT2JqZWN0ID0gdGhpcy50ZXh0ICE9PSB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGV4dCA9IGlzT2JqZWN0ID8gdGhpcy50ZXh0IDogdGhpcztcclxuICAgICAgICAgICAgICAgIGlmICh0ID09PSBcIlwiIHx8IHF1ZXJ5Lm1hdGNoZXIodCwgdGV4dCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZC5yZXN1bHRzLnB1c2goaXNPYmplY3QgPyB0aGlzIDoge2lkOiB0aGlzLCB0ZXh0OiB0aGlzfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBxdWVyeS5jYWxsYmFjayhmaWx0ZXJlZCk7XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENoZWNrcyBpZiB0aGUgZm9ybWF0dGVyIGZ1bmN0aW9uIHNob3VsZCBiZSB1c2VkLlxyXG4gICAgICpcclxuICAgICAqIFRocm93cyBhbiBlcnJvciBpZiBpdCBpcyBub3QgYSBmdW5jdGlvbi4gUmV0dXJucyB0cnVlIGlmIGl0IHNob3VsZCBiZSB1c2VkLFxyXG4gICAgICogZmFsc2UgaWYgbm8gZm9ybWF0dGluZyBzaG91bGQgYmUgcGVyZm9ybWVkLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBmb3JtYXR0ZXJcclxuICAgICAqL1xyXG4gICAgZnVuY3Rpb24gY2hlY2tGb3JtYXR0ZXIoZm9ybWF0dGVyLCBmb3JtYXR0ZXJOYW1lKSB7XHJcbiAgICAgICAgaWYgKCQuaXNGdW5jdGlvbihmb3JtYXR0ZXIpKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICBpZiAoIWZvcm1hdHRlcikgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihmb3JtYXR0ZXJOYW1lICtcIiBtdXN0IGJlIGEgZnVuY3Rpb24gb3IgYSBmYWxzeSB2YWx1ZVwiKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBldmFsdWF0ZSh2YWwpIHtcclxuICAgICAgICByZXR1cm4gJC5pc0Z1bmN0aW9uKHZhbCkgPyB2YWwoKSA6IHZhbDtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBjb3VudFJlc3VsdHMocmVzdWx0cykge1xyXG4gICAgICAgIHZhciBjb3VudCA9IDA7XHJcbiAgICAgICAgJC5lYWNoKHJlc3VsdHMsIGZ1bmN0aW9uKGksIGl0ZW0pIHtcclxuICAgICAgICAgICAgaWYgKGl0ZW0uY2hpbGRyZW4pIHtcclxuICAgICAgICAgICAgICAgIGNvdW50ICs9IGNvdW50UmVzdWx0cyhpdGVtLmNoaWxkcmVuKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvdW50Kys7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gY291bnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZWZhdWx0IHRva2VuaXplci4gVGhpcyBmdW5jdGlvbiB1c2VzIGJyZWFrcyB0aGUgaW5wdXQgb24gc3Vic3RyaW5nIG1hdGNoIG9mIGFueSBzdHJpbmcgZnJvbSB0aGVcclxuICAgICAqIG9wdHMudG9rZW5TZXBhcmF0b3JzIGFycmF5IGFuZCB1c2VzIG9wdHMuY3JlYXRlU2VhcmNoQ2hvaWNlIHRvIGNyZWF0ZSB0aGUgY2hvaWNlIG9iamVjdC4gQm90aCBvZiB0aG9zZVxyXG4gICAgICogdHdvIG9wdGlvbnMgaGF2ZSB0byBiZSBkZWZpbmVkIGluIG9yZGVyIGZvciB0aGUgdG9rZW5pemVyIHRvIHdvcmsuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGlucHV0IHRleHQgdXNlciBoYXMgdHlwZWQgc28gZmFyIG9yIHBhc3RlZCBpbnRvIHRoZSBzZWFyY2ggZmllbGRcclxuICAgICAqIEBwYXJhbSBzZWxlY3Rpb24gY3VycmVudGx5IHNlbGVjdGVkIGNob2ljZXNcclxuICAgICAqIEBwYXJhbSBzZWxlY3RDYWxsYmFjayBmdW5jdGlvbihjaG9pY2UpIGNhbGxiYWNrIHRobyBhZGQgdGhlIGNob2ljZSB0byBzZWxlY3Rpb25cclxuICAgICAqIEBwYXJhbSBvcHRzIHNlbGVjdDIncyBvcHRzXHJcbiAgICAgKiBAcmV0dXJuIHVuZGVmaW5lZC9udWxsIHRvIGxlYXZlIHRoZSBjdXJyZW50IGlucHV0IHVuY2hhbmdlZCwgb3IgYSBzdHJpbmcgdG8gY2hhbmdlIHRoZSBpbnB1dCB0byB0aGUgcmV0dXJuZWQgdmFsdWVcclxuICAgICAqL1xyXG4gICAgZnVuY3Rpb24gZGVmYXVsdFRva2VuaXplcihpbnB1dCwgc2VsZWN0aW9uLCBzZWxlY3RDYWxsYmFjaywgb3B0cykge1xyXG4gICAgICAgIHZhciBvcmlnaW5hbCA9IGlucHV0LCAvLyBzdG9yZSB0aGUgb3JpZ2luYWwgc28gd2UgY2FuIGNvbXBhcmUgYW5kIGtub3cgaWYgd2UgbmVlZCB0byB0ZWxsIHRoZSBzZWFyY2ggdG8gdXBkYXRlIGl0cyB0ZXh0XHJcbiAgICAgICAgICAgIGR1cGUgPSBmYWxzZSwgLy8gY2hlY2sgZm9yIHdoZXRoZXIgYSB0b2tlbiB3ZSBleHRyYWN0ZWQgcmVwcmVzZW50cyBhIGR1cGxpY2F0ZSBzZWxlY3RlZCBjaG9pY2VcclxuICAgICAgICAgICAgdG9rZW4sIC8vIHRva2VuXHJcbiAgICAgICAgICAgIGluZGV4LCAvLyBwb3NpdGlvbiBhdCB3aGljaCB0aGUgc2VwYXJhdG9yIHdhcyBmb3VuZFxyXG4gICAgICAgICAgICBpLCBsLCAvLyBsb29waW5nIHZhcmlhYmxlc1xyXG4gICAgICAgICAgICBzZXBhcmF0b3I7IC8vIHRoZSBtYXRjaGVkIHNlcGFyYXRvclxyXG5cclxuICAgICAgICBpZiAoIW9wdHMuY3JlYXRlU2VhcmNoQ2hvaWNlIHx8ICFvcHRzLnRva2VuU2VwYXJhdG9ycyB8fCBvcHRzLnRva2VuU2VwYXJhdG9ycy5sZW5ndGggPCAxKSByZXR1cm4gdW5kZWZpbmVkO1xyXG5cclxuICAgICAgICB3aGlsZSAodHJ1ZSkge1xyXG4gICAgICAgICAgICBpbmRleCA9IC0xO1xyXG5cclxuICAgICAgICAgICAgZm9yIChpID0gMCwgbCA9IG9wdHMudG9rZW5TZXBhcmF0b3JzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgc2VwYXJhdG9yID0gb3B0cy50b2tlblNlcGFyYXRvcnNbaV07XHJcbiAgICAgICAgICAgICAgICBpbmRleCA9IGlucHV0LmluZGV4T2Yoc2VwYXJhdG9yKTtcclxuICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSBicmVhaztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgYnJlYWs7IC8vIGRpZCBub3QgZmluZCBhbnkgdG9rZW4gc2VwYXJhdG9yIGluIHRoZSBpbnB1dCBzdHJpbmcsIGJhaWxcclxuXHJcbiAgICAgICAgICAgIHRva2VuID0gaW5wdXQuc3Vic3RyaW5nKDAsIGluZGV4KTtcclxuICAgICAgICAgICAgaW5wdXQgPSBpbnB1dC5zdWJzdHJpbmcoaW5kZXggKyBzZXBhcmF0b3IubGVuZ3RoKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0b2tlbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICB0b2tlbiA9IG9wdHMuY3JlYXRlU2VhcmNoQ2hvaWNlLmNhbGwodGhpcywgdG9rZW4sIHNlbGVjdGlvbik7XHJcbiAgICAgICAgICAgICAgICBpZiAodG9rZW4gIT09IHVuZGVmaW5lZCAmJiB0b2tlbiAhPT0gbnVsbCAmJiBvcHRzLmlkKHRva2VuKSAhPT0gdW5kZWZpbmVkICYmIG9wdHMuaWQodG9rZW4pICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZHVwZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDAsIGwgPSBzZWxlY3Rpb24ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcXVhbChvcHRzLmlkKHRva2VuKSwgb3B0cy5pZChzZWxlY3Rpb25baV0pKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVwZSA9IHRydWU7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWR1cGUpIHNlbGVjdENhbGxiYWNrKHRva2VuKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKG9yaWdpbmFsIT09aW5wdXQpIHJldHVybiBpbnB1dDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBuZXcgY2xhc3NcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gc3VwZXJDbGFzc1xyXG4gICAgICogQHBhcmFtIG1ldGhvZHNcclxuICAgICAqL1xyXG4gICAgZnVuY3Rpb24gY2xhenooU3VwZXJDbGFzcywgbWV0aG9kcykge1xyXG4gICAgICAgIHZhciBjb25zdHJ1Y3RvciA9IGZ1bmN0aW9uICgpIHt9O1xyXG4gICAgICAgIGNvbnN0cnVjdG9yLnByb3RvdHlwZSA9IG5ldyBTdXBlckNsYXNzO1xyXG4gICAgICAgIGNvbnN0cnVjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGNvbnN0cnVjdG9yO1xyXG4gICAgICAgIGNvbnN0cnVjdG9yLnByb3RvdHlwZS5wYXJlbnQgPSBTdXBlckNsYXNzLnByb3RvdHlwZTtcclxuICAgICAgICBjb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSAkLmV4dGVuZChjb25zdHJ1Y3Rvci5wcm90b3R5cGUsIG1ldGhvZHMpO1xyXG4gICAgICAgIHJldHVybiBjb25zdHJ1Y3RvcjtcclxuICAgIH1cclxuXHJcbiAgICBBYnN0cmFjdFNlbGVjdDIgPSBjbGF6eihPYmplY3QsIHtcclxuXHJcbiAgICAgICAgLy8gYWJzdHJhY3RcclxuICAgICAgICBiaW5kOiBmdW5jdGlvbiAoZnVuYykge1xyXG4gICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBmdW5jLmFwcGx5KHNlbGYsIGFyZ3VtZW50cyk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gYWJzdHJhY3RcclxuICAgICAgICBpbml0OiBmdW5jdGlvbiAob3B0cykge1xyXG4gICAgICAgICAgICB2YXIgcmVzdWx0cywgc2VhcmNoLCByZXN1bHRzU2VsZWN0b3IgPSBcIi5zZWxlY3QyLXJlc3VsdHNcIiwgZGlzYWJsZWQsIHJlYWRvbmx5O1xyXG5cclxuICAgICAgICAgICAgLy8gcHJlcGFyZSBvcHRpb25zXHJcbiAgICAgICAgICAgIHRoaXMub3B0cyA9IG9wdHMgPSB0aGlzLnByZXBhcmVPcHRzKG9wdHMpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5pZD1vcHRzLmlkO1xyXG5cclxuICAgICAgICAgICAgLy8gZGVzdHJveSBpZiBjYWxsZWQgb24gYW4gZXhpc3RpbmcgY29tcG9uZW50XHJcbiAgICAgICAgICAgIGlmIChvcHRzLmVsZW1lbnQuZGF0YShcInNlbGVjdDJcIikgIT09IHVuZGVmaW5lZCAmJlxyXG4gICAgICAgICAgICAgICAgb3B0cy5lbGVtZW50LmRhdGEoXCJzZWxlY3QyXCIpICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBvcHRzLmVsZW1lbnQuZGF0YShcInNlbGVjdDJcIikuZGVzdHJveSgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lciA9IHRoaXMuY3JlYXRlQ29udGFpbmVyKCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lcklkPVwiczJpZF9cIisob3B0cy5lbGVtZW50LmF0dHIoXCJpZFwiKSB8fCBcImF1dG9nZW5cIituZXh0VWlkKCkpO1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lclNlbGVjdG9yPVwiI1wiK3RoaXMuY29udGFpbmVySWQucmVwbGFjZSgvKFs7JixcXC5cXCtcXCpcXH4nOlwiXFwhXFxeIyQlQFxcW1xcXVxcKFxcKT0+XFx8XSkvZywgJ1xcXFwkMScpO1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5hdHRyKFwiaWRcIiwgdGhpcy5jb250YWluZXJJZCk7XHJcblxyXG4gICAgICAgICAgICAvLyBjYWNoZSB0aGUgYm9keSBzbyBmdXR1cmUgbG9va3VwcyBhcmUgY2hlYXBcclxuICAgICAgICAgICAgdGhpcy5ib2R5ID0gdGh1bmsoZnVuY3Rpb24oKSB7IHJldHVybiBvcHRzLmVsZW1lbnQuY2xvc2VzdChcImJvZHlcIik7IH0pO1xyXG5cclxuICAgICAgICAgICAgc3luY0Nzc0NsYXNzZXModGhpcy5jb250YWluZXIsIHRoaXMub3B0cy5lbGVtZW50LCB0aGlzLm9wdHMuYWRhcHRDb250YWluZXJDc3NDbGFzcyk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5hdHRyKFwic3R5bGVcIiwgb3B0cy5lbGVtZW50LmF0dHIoXCJzdHlsZVwiKSk7XHJcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLmNzcyhldmFsdWF0ZShvcHRzLmNvbnRhaW5lckNzcykpO1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5hZGRDbGFzcyhldmFsdWF0ZShvcHRzLmNvbnRhaW5lckNzc0NsYXNzKSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmVsZW1lbnRUYWJJbmRleCA9IHRoaXMub3B0cy5lbGVtZW50LmF0dHIoXCJ0YWJpbmRleFwiKTtcclxuXHJcbiAgICAgICAgICAgIC8vIHN3YXAgY29udGFpbmVyIGZvciB0aGUgZWxlbWVudFxyXG4gICAgICAgICAgICB0aGlzLm9wdHMuZWxlbWVudFxyXG4gICAgICAgICAgICAgICAgLmRhdGEoXCJzZWxlY3QyXCIsIHRoaXMpXHJcbiAgICAgICAgICAgICAgICAuYXR0cihcInRhYmluZGV4XCIsIFwiLTFcIilcclxuICAgICAgICAgICAgICAgIC5iZWZvcmUodGhpcy5jb250YWluZXIpO1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5kYXRhKFwic2VsZWN0MlwiLCB0aGlzKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZHJvcGRvd24gPSB0aGlzLmNvbnRhaW5lci5maW5kKFwiLnNlbGVjdDItZHJvcFwiKTtcclxuICAgICAgICAgICAgdGhpcy5kcm9wZG93bi5hZGRDbGFzcyhldmFsdWF0ZShvcHRzLmRyb3Bkb3duQ3NzQ2xhc3MpKTtcclxuICAgICAgICAgICAgdGhpcy5kcm9wZG93bi5kYXRhKFwic2VsZWN0MlwiLCB0aGlzKTtcclxuXHJcbiAgICAgICAgICAgIHN5bmNDc3NDbGFzc2VzKHRoaXMuZHJvcGRvd24sIHRoaXMub3B0cy5lbGVtZW50LCB0aGlzLm9wdHMuYWRhcHREcm9wZG93bkNzc0NsYXNzKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMucmVzdWx0cyA9IHJlc3VsdHMgPSB0aGlzLmNvbnRhaW5lci5maW5kKHJlc3VsdHNTZWxlY3Rvcik7XHJcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoID0gc2VhcmNoID0gdGhpcy5jb250YWluZXIuZmluZChcImlucHV0LnNlbGVjdDItaW5wdXRcIik7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnF1ZXJ5Q291bnQgPSAwO1xyXG4gICAgICAgICAgICB0aGlzLnJlc3VsdHNQYWdlID0gMDtcclxuICAgICAgICAgICAgdGhpcy5jb250ZXh0ID0gbnVsbDtcclxuXHJcbiAgICAgICAgICAgIC8vIGluaXRpYWxpemUgdGhlIGNvbnRhaW5lclxyXG4gICAgICAgICAgICB0aGlzLmluaXRDb250YWluZXIoKTtcclxuXHJcbiAgICAgICAgICAgIGluc3RhbGxGaWx0ZXJlZE1vdXNlTW92ZSh0aGlzLnJlc3VsdHMpO1xyXG4gICAgICAgICAgICB0aGlzLmRyb3Bkb3duLm9uKFwibW91c2Vtb3ZlLWZpbHRlcmVkIHRvdWNoc3RhcnQgdG91Y2htb3ZlIHRvdWNoZW5kXCIsIHJlc3VsdHNTZWxlY3RvciwgdGhpcy5iaW5kKHRoaXMuaGlnaGxpZ2h0VW5kZXJFdmVudCkpO1xyXG5cclxuICAgICAgICAgICAgaW5zdGFsbERlYm91bmNlZFNjcm9sbCg4MCwgdGhpcy5yZXN1bHRzKTtcclxuICAgICAgICAgICAgdGhpcy5kcm9wZG93bi5vbihcInNjcm9sbC1kZWJvdW5jZWRcIiwgcmVzdWx0c1NlbGVjdG9yLCB0aGlzLmJpbmQodGhpcy5sb2FkTW9yZUlmTmVlZGVkKSk7XHJcblxyXG4gICAgICAgICAgICAvLyBkbyBub3QgcHJvcGFnYXRlIGNoYW5nZSBldmVudCBmcm9tIHRoZSBzZWFyY2ggZmllbGQgb3V0IG9mIHRoZSBjb21wb25lbnRcclxuICAgICAgICAgICAgJCh0aGlzLmNvbnRhaW5lcikub24oXCJjaGFuZ2VcIiwgXCIuc2VsZWN0Mi1pbnB1dFwiLCBmdW5jdGlvbihlKSB7ZS5zdG9wUHJvcGFnYXRpb24oKTt9KTtcclxuICAgICAgICAgICAgJCh0aGlzLmRyb3Bkb3duKS5vbihcImNoYW5nZVwiLCBcIi5zZWxlY3QyLWlucHV0XCIsIGZ1bmN0aW9uKGUpIHtlLnN0b3BQcm9wYWdhdGlvbigpO30pO1xyXG5cclxuICAgICAgICAgICAgLy8gaWYganF1ZXJ5Lm1vdXNld2hlZWwgcGx1Z2luIGlzIGluc3RhbGxlZCB3ZSBjYW4gcHJldmVudCBvdXQtb2YtYm91bmRzIHNjcm9sbGluZyBvZiByZXN1bHRzIHZpYSBtb3VzZXdoZWVsXHJcbiAgICAgICAgICAgIGlmICgkLmZuLm1vdXNld2hlZWwpIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdHMubW91c2V3aGVlbChmdW5jdGlvbiAoZSwgZGVsdGEsIGRlbHRhWCwgZGVsdGFZKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRvcCA9IHJlc3VsdHMuc2Nyb2xsVG9wKCksIGhlaWdodDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZGVsdGFZID4gMCAmJiB0b3AgLSBkZWx0YVkgPD0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLnNjcm9sbFRvcCgwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAga2lsbEV2ZW50KGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGVsdGFZIDwgMCAmJiByZXN1bHRzLmdldCgwKS5zY3JvbGxIZWlnaHQgLSByZXN1bHRzLnNjcm9sbFRvcCgpICsgZGVsdGFZIDw9IHJlc3VsdHMuaGVpZ2h0KCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5zY3JvbGxUb3AocmVzdWx0cy5nZXQoMCkuc2Nyb2xsSGVpZ2h0IC0gcmVzdWx0cy5oZWlnaHQoKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGtpbGxFdmVudChlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaW5zdGFsbEtleVVwQ2hhbmdlRXZlbnQoc2VhcmNoKTtcclxuICAgICAgICAgICAgc2VhcmNoLm9uKFwia2V5dXAtY2hhbmdlIGlucHV0IHBhc3RlXCIsIHRoaXMuYmluZCh0aGlzLnVwZGF0ZVJlc3VsdHMpKTtcclxuICAgICAgICAgICAgc2VhcmNoLm9uKFwiZm9jdXNcIiwgZnVuY3Rpb24gKCkgeyBzZWFyY2guYWRkQ2xhc3MoXCJzZWxlY3QyLWZvY3VzZWRcIik7IH0pO1xyXG4gICAgICAgICAgICBzZWFyY2gub24oXCJibHVyXCIsIGZ1bmN0aW9uICgpIHsgc2VhcmNoLnJlbW92ZUNsYXNzKFwic2VsZWN0Mi1mb2N1c2VkXCIpO30pO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5kcm9wZG93bi5vbihcIm1vdXNldXBcIiwgcmVzdWx0c1NlbGVjdG9yLCB0aGlzLmJpbmQoZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgICAgIGlmICgkKGUudGFyZ2V0KS5jbG9zZXN0KFwiLnNlbGVjdDItcmVzdWx0LXNlbGVjdGFibGVcIikubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0VW5kZXJFdmVudChlKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdEhpZ2hsaWdodGVkKGUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KSk7XHJcblxyXG4gICAgICAgICAgICAvLyB0cmFwIGFsbCBtb3VzZSBldmVudHMgZnJvbSBsZWF2aW5nIHRoZSBkcm9wZG93bi4gc29tZXRpbWVzIHRoZXJlIG1heSBiZSBhIG1vZGFsIHRoYXQgaXMgbGlzdGVuaW5nXHJcbiAgICAgICAgICAgIC8vIGZvciBtb3VzZSBldmVudHMgb3V0c2lkZSBvZiBpdHNlbGYgc28gaXQgY2FuIGNsb3NlIGl0c2VsZi4gc2luY2UgdGhlIGRyb3Bkb3duIGlzIG5vdyBvdXRzaWRlIHRoZSBzZWxlY3QyJ3NcclxuICAgICAgICAgICAgLy8gZG9tIGl0IHdpbGwgdHJpZ2dlciB0aGUgcG9wdXAgY2xvc2UsIHdoaWNoIGlzIG5vdCB3aGF0IHdlIHdhbnRcclxuICAgICAgICAgICAgdGhpcy5kcm9wZG93bi5vbihcImNsaWNrIG1vdXNldXAgbW91c2Vkb3duXCIsIGZ1bmN0aW9uIChlKSB7IGUuc3RvcFByb3BhZ2F0aW9uKCk7IH0pO1xyXG5cclxuICAgICAgICAgICAgaWYgKCQuaXNGdW5jdGlvbih0aGlzLm9wdHMuaW5pdFNlbGVjdGlvbikpIHtcclxuICAgICAgICAgICAgICAgIC8vIGluaXRpYWxpemUgc2VsZWN0aW9uIGJhc2VkIG9uIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBzb3VyY2UgZWxlbWVudFxyXG4gICAgICAgICAgICAgICAgdGhpcy5pbml0U2VsZWN0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gaWYgdGhlIHVzZXIgaGFzIHByb3ZpZGVkIGEgZnVuY3Rpb24gdGhhdCBjYW4gc2V0IHNlbGVjdGlvbiBiYXNlZCBvbiB0aGUgdmFsdWUgb2YgdGhlIHNvdXJjZSBlbGVtZW50XHJcbiAgICAgICAgICAgICAgICAvLyB3ZSBtb25pdG9yIHRoZSBjaGFuZ2UgZXZlbnQgb24gdGhlIGVsZW1lbnQgYW5kIHRyaWdnZXIgaXQsIGFsbG93aW5nIGZvciB0d28gd2F5IHN5bmNocm9uaXphdGlvblxyXG4gICAgICAgICAgICAgICAgdGhpcy5tb25pdG9yU291cmNlKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChvcHRzLm1heGltdW1JbnB1dExlbmd0aCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWFyY2guYXR0cihcIm1heGxlbmd0aFwiLCBvcHRzLm1heGltdW1JbnB1dExlbmd0aCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHZhciBkaXNhYmxlZCA9IG9wdHMuZWxlbWVudC5wcm9wKFwiZGlzYWJsZWRcIik7XHJcbiAgICAgICAgICAgIGlmIChkaXNhYmxlZCA9PT0gdW5kZWZpbmVkKSBkaXNhYmxlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLmVuYWJsZSghZGlzYWJsZWQpO1xyXG5cclxuICAgICAgICAgICAgdmFyIHJlYWRvbmx5ID0gb3B0cy5lbGVtZW50LnByb3AoXCJyZWFkb25seVwiKTtcclxuICAgICAgICAgICAgaWYgKHJlYWRvbmx5ID09PSB1bmRlZmluZWQpIHJlYWRvbmx5ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMucmVhZG9ubHkocmVhZG9ubHkpO1xyXG5cclxuICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIHNpemUgb2Ygc2Nyb2xsYmFyXHJcbiAgICAgICAgICAgIHNjcm9sbEJhckRpbWVuc2lvbnMgPSBzY3JvbGxCYXJEaW1lbnNpb25zIHx8IG1lYXN1cmVTY3JvbGxiYXIoKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuYXV0b2ZvY3VzID0gb3B0cy5lbGVtZW50LnByb3AoXCJhdXRvZm9jdXNcIik7XHJcbiAgICAgICAgICAgIG9wdHMuZWxlbWVudC5wcm9wKFwiYXV0b2ZvY3VzXCIsIGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuYXV0b2ZvY3VzKSB0aGlzLmZvY3VzKCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLm5leHRTZWFyY2hUZXJtID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIGFic3RyYWN0XHJcbiAgICAgICAgZGVzdHJveTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgZWxlbWVudD10aGlzLm9wdHMuZWxlbWVudCwgc2VsZWN0MiA9IGVsZW1lbnQuZGF0YShcInNlbGVjdDJcIik7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmNsb3NlKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5wcm9wZXJ0eU9ic2VydmVyKSB7IGRlbGV0ZSB0aGlzLnByb3BlcnR5T2JzZXJ2ZXI7IHRoaXMucHJvcGVydHlPYnNlcnZlciA9IG51bGw7IH1cclxuXHJcbiAgICAgICAgICAgIGlmIChzZWxlY3QyICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHNlbGVjdDIuY29udGFpbmVyLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0Mi5kcm9wZG93bi5yZW1vdmUoKTtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnRcclxuICAgICAgICAgICAgICAgICAgICAucmVtb3ZlQ2xhc3MoXCJzZWxlY3QyLW9mZnNjcmVlblwiKVxyXG4gICAgICAgICAgICAgICAgICAgIC5yZW1vdmVEYXRhKFwic2VsZWN0MlwiKVxyXG4gICAgICAgICAgICAgICAgICAgIC5vZmYoXCIuc2VsZWN0MlwiKVxyXG4gICAgICAgICAgICAgICAgICAgIC5wcm9wKFwiYXV0b2ZvY3VzXCIsIHRoaXMuYXV0b2ZvY3VzIHx8IGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmVsZW1lbnRUYWJJbmRleCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuYXR0cih7dGFiaW5kZXg6IHRoaXMuZWxlbWVudFRhYkluZGV4fSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cihcInRhYmluZGV4XCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxlbWVudC5zaG93KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBhYnN0cmFjdFxyXG4gICAgICAgIG9wdGlvblRvRGF0YTogZnVuY3Rpb24oZWxlbWVudCkge1xyXG4gICAgICAgICAgICBpZiAoZWxlbWVudC5pcyhcIm9wdGlvblwiKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICBpZDplbGVtZW50LnByb3AoXCJ2YWx1ZVwiKSxcclxuICAgICAgICAgICAgICAgICAgICB0ZXh0OmVsZW1lbnQudGV4dCgpLFxyXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6IGVsZW1lbnQuZ2V0KCksXHJcbiAgICAgICAgICAgICAgICAgICAgY3NzOiBlbGVtZW50LmF0dHIoXCJjbGFzc1wiKSxcclxuICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZDogZWxlbWVudC5wcm9wKFwiZGlzYWJsZWRcIiksXHJcbiAgICAgICAgICAgICAgICAgICAgbG9ja2VkOiBlcXVhbChlbGVtZW50LmF0dHIoXCJsb2NrZWRcIiksIFwibG9ja2VkXCIpIHx8IGVxdWFsKGVsZW1lbnQuZGF0YShcImxvY2tlZFwiKSwgdHJ1ZSlcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC5pcyhcIm9wdGdyb3VwXCIpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRleHQ6ZWxlbWVudC5hdHRyKFwibGFiZWxcIiksXHJcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW46W10sXHJcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudDogZWxlbWVudC5nZXQoKSxcclxuICAgICAgICAgICAgICAgICAgICBjc3M6IGVsZW1lbnQuYXR0cihcImNsYXNzXCIpXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gYWJzdHJhY3RcclxuICAgICAgICBwcmVwYXJlT3B0czogZnVuY3Rpb24gKG9wdHMpIHtcclxuICAgICAgICAgICAgdmFyIGVsZW1lbnQsIHNlbGVjdCwgaWRLZXksIGFqYXhVcmwsIHNlbGYgPSB0aGlzO1xyXG5cclxuICAgICAgICAgICAgZWxlbWVudCA9IG9wdHMuZWxlbWVudDtcclxuXHJcbiAgICAgICAgICAgIGlmIChlbGVtZW50LmdldCgwKS50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwic2VsZWN0XCIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ID0gc2VsZWN0ID0gb3B0cy5lbGVtZW50O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoc2VsZWN0KSB7XHJcbiAgICAgICAgICAgICAgICAvLyB0aGVzZSBvcHRpb25zIGFyZSBub3QgYWxsb3dlZCB3aGVuIGF0dGFjaGVkIHRvIGEgc2VsZWN0IGJlY2F1c2UgdGhleSBhcmUgcGlja2VkIHVwIG9mZiB0aGUgZWxlbWVudCBpdHNlbGZcclxuICAgICAgICAgICAgICAgICQuZWFjaChbXCJpZFwiLCBcIm11bHRpcGxlXCIsIFwiYWpheFwiLCBcInF1ZXJ5XCIsIFwiY3JlYXRlU2VhcmNoQ2hvaWNlXCIsIFwiaW5pdFNlbGVjdGlvblwiLCBcImRhdGFcIiwgXCJ0YWdzXCJdLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMgaW4gb3B0cykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJPcHRpb24gJ1wiICsgdGhpcyArIFwiJyBpcyBub3QgYWxsb3dlZCBmb3IgU2VsZWN0MiB3aGVuIGF0dGFjaGVkIHRvIGEgPHNlbGVjdD4gZWxlbWVudC5cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIG9wdHMgPSAkLmV4dGVuZCh7fSwge1xyXG4gICAgICAgICAgICAgICAgcG9wdWxhdGVSZXN1bHRzOiBmdW5jdGlvbihjb250YWluZXIsIHJlc3VsdHMsIHF1ZXJ5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBvcHVsYXRlLCAgZGF0YSwgcmVzdWx0LCBjaGlsZHJlbiwgaWQ9dGhpcy5vcHRzLmlkO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBwb3B1bGF0ZT1mdW5jdGlvbihyZXN1bHRzLCBjb250YWluZXIsIGRlcHRoKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSwgbCwgcmVzdWx0LCBzZWxlY3RhYmxlLCBkaXNhYmxlZCwgY29tcG91bmQsIG5vZGUsIGxhYmVsLCBpbm5lckNvbnRhaW5lciwgZm9ybWF0dGVkO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IG9wdHMuc29ydFJlc3VsdHMocmVzdWx0cywgY29udGFpbmVyLCBxdWVyeSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwLCBsID0gcmVzdWx0cy5sZW5ndGg7IGkgPCBsOyBpID0gaSArIDEpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQ9cmVzdWx0c1tpXTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZCA9IChyZXN1bHQuZGlzYWJsZWQgPT09IHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0YWJsZSA9ICghZGlzYWJsZWQpICYmIChpZChyZXN1bHQpICE9PSB1bmRlZmluZWQpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvdW5kPXJlc3VsdC5jaGlsZHJlbiAmJiByZXN1bHQuY2hpbGRyZW4ubGVuZ3RoID4gMDtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlPSQoXCI8bGk+PC9saT5cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLmFkZENsYXNzKFwic2VsZWN0Mi1yZXN1bHRzLWRlcHQtXCIrZGVwdGgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5hZGRDbGFzcyhcInNlbGVjdDItcmVzdWx0XCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5hZGRDbGFzcyhzZWxlY3RhYmxlID8gXCJzZWxlY3QyLXJlc3VsdC1zZWxlY3RhYmxlXCIgOiBcInNlbGVjdDItcmVzdWx0LXVuc2VsZWN0YWJsZVwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaXNhYmxlZCkgeyBub2RlLmFkZENsYXNzKFwic2VsZWN0Mi1kaXNhYmxlZFwiKTsgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvdW5kKSB7IG5vZGUuYWRkQ2xhc3MoXCJzZWxlY3QyLXJlc3VsdC13aXRoLWNoaWxkcmVuXCIpOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLmFkZENsYXNzKHNlbGYub3B0cy5mb3JtYXRSZXN1bHRDc3NDbGFzcyhyZXN1bHQpKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD0kKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwuYWRkQ2xhc3MoXCJzZWxlY3QyLXJlc3VsdC1sYWJlbFwiKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZWQ9b3B0cy5mb3JtYXRSZXN1bHQocmVzdWx0LCBsYWJlbCwgcXVlcnksIHNlbGYub3B0cy5lc2NhcGVNYXJrdXApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvcm1hdHRlZCE9PXVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsLmh0bWwoZm9ybWF0dGVkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLmFwcGVuZChsYWJlbCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvdW5kKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubmVyQ29udGFpbmVyPSQoXCI8dWw+PC91bD5cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5uZXJDb250YWluZXIuYWRkQ2xhc3MoXCJzZWxlY3QyLXJlc3VsdC1zdWJcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9wdWxhdGUocmVzdWx0LmNoaWxkcmVuLCBpbm5lckNvbnRhaW5lciwgZGVwdGgrMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5hcHBlbmQoaW5uZXJDb250YWluZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuZGF0YShcInNlbGVjdDItZGF0YVwiLCByZXN1bHQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLmFwcGVuZChub2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHBvcHVsYXRlKHJlc3VsdHMsIGNvbnRhaW5lciwgMCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sICQuZm4uc2VsZWN0Mi5kZWZhdWx0cywgb3B0cyk7XHJcblxyXG4gICAgICAgICAgICBpZiAodHlwZW9mKG9wdHMuaWQpICE9PSBcImZ1bmN0aW9uXCIpIHtcclxuICAgICAgICAgICAgICAgIGlkS2V5ID0gb3B0cy5pZDtcclxuICAgICAgICAgICAgICAgIG9wdHMuaWQgPSBmdW5jdGlvbiAoZSkgeyByZXR1cm4gZVtpZEtleV07IH07XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICgkLmlzQXJyYXkob3B0cy5lbGVtZW50LmRhdGEoXCJzZWxlY3QyVGFnc1wiKSkpIHtcclxuICAgICAgICAgICAgICAgIGlmIChcInRhZ3NcIiBpbiBvcHRzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgXCJ0YWdzIHNwZWNpZmllZCBhcyBib3RoIGFuIGF0dHJpYnV0ZSAnZGF0YS1zZWxlY3QyLXRhZ3MnIGFuZCBpbiBvcHRpb25zIG9mIFNlbGVjdDIgXCIgKyBvcHRzLmVsZW1lbnQuYXR0cihcImlkXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgb3B0cy50YWdzPW9wdHMuZWxlbWVudC5kYXRhKFwic2VsZWN0MlRhZ3NcIik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChzZWxlY3QpIHtcclxuICAgICAgICAgICAgICAgIG9wdHMucXVlcnkgPSB0aGlzLmJpbmQoZnVuY3Rpb24gKHF1ZXJ5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGEgPSB7IHJlc3VsdHM6IFtdLCBtb3JlOiBmYWxzZSB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXJtID0gcXVlcnkudGVybSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4sIHBsYWNlaG9sZGVyT3B0aW9uLCBwcm9jZXNzO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzPWZ1bmN0aW9uKGVsZW1lbnQsIGNvbGxlY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGdyb3VwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5pcyhcIm9wdGlvblwiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHF1ZXJ5Lm1hdGNoZXIodGVybSwgZWxlbWVudC50ZXh0KCksIGVsZW1lbnQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdGlvbi5wdXNoKHNlbGYub3B0aW9uVG9EYXRhKGVsZW1lbnQpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50LmlzKFwib3B0Z3JvdXBcIikpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwPXNlbGYub3B0aW9uVG9EYXRhKGVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5jaGlsZHJlbigpLmVhY2gyKGZ1bmN0aW9uKGksIGVsbSkgeyBwcm9jZXNzKGVsbSwgZ3JvdXAuY2hpbGRyZW4pOyB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChncm91cC5jaGlsZHJlbi5sZW5ndGg+MCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxlY3Rpb24ucHVzaChncm91cCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbj1lbGVtZW50LmNoaWxkcmVuKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSB0aGUgcGxhY2Vob2xkZXIgb3B0aW9uIGlmIHRoZXJlIGlzIG9uZVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmdldFBsYWNlaG9sZGVyKCkgIT09IHVuZGVmaW5lZCAmJiBjaGlsZHJlbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyT3B0aW9uID0gdGhpcy5nZXRQbGFjZWhvbGRlck9wdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGxhY2Vob2xkZXJPcHRpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuPWNoaWxkcmVuLm5vdChwbGFjZWhvbGRlck9wdGlvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLmVhY2gyKGZ1bmN0aW9uKGksIGVsbSkgeyBwcm9jZXNzKGVsbSwgZGF0YS5yZXN1bHRzKTsgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5LmNhbGxiYWNrKGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIG5lZWRlZCBiZWNhdXNlIGluc2lkZSB2YWwoKSB3ZSBjb25zdHJ1Y3QgY2hvaWNlcyBmcm9tIG9wdGlvbnMgYW5kIHRoZXJlIGlkIGlzIGhhcmRjb2RlZFxyXG4gICAgICAgICAgICAgICAgb3B0cy5pZD1mdW5jdGlvbihlKSB7IHJldHVybiBlLmlkOyB9O1xyXG4gICAgICAgICAgICAgICAgb3B0cy5mb3JtYXRSZXN1bHRDc3NDbGFzcyA9IGZ1bmN0aW9uKGRhdGEpIHsgcmV0dXJuIGRhdGEuY3NzOyB9O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKCEoXCJxdWVyeVwiIGluIG9wdHMpKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChcImFqYXhcIiBpbiBvcHRzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFqYXhVcmwgPSBvcHRzLmVsZW1lbnQuZGF0YShcImFqYXgtdXJsXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWpheFVybCAmJiBhamF4VXJsLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdHMuYWpheC51cmwgPSBhamF4VXJsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdHMucXVlcnkgPSBhamF4LmNhbGwob3B0cy5lbGVtZW50LCBvcHRzLmFqYXgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXCJkYXRhXCIgaW4gb3B0cykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRzLnF1ZXJ5ID0gbG9jYWwob3B0cy5kYXRhKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFwidGFnc1wiIGluIG9wdHMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb3B0cy5xdWVyeSA9IHRhZ3Mob3B0cy50YWdzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdHMuY3JlYXRlU2VhcmNoQ2hvaWNlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdHMuY3JlYXRlU2VhcmNoQ2hvaWNlID0gZnVuY3Rpb24gKHRlcm0pIHsgcmV0dXJuIHtpZDogJC50cmltKHRlcm0pLCB0ZXh0OiAkLnRyaW0odGVybSl9OyB9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRzLmluaXRTZWxlY3Rpb24gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0cy5pbml0U2VsZWN0aW9uID0gZnVuY3Rpb24gKGVsZW1lbnQsIGNhbGxiYWNrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGEgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHNwbGl0VmFsKGVsZW1lbnQudmFsKCksIG9wdHMuc2VwYXJhdG9yKSkuZWFjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpZCA9IHRoaXMsIHRleHQgPSB0aGlzLCB0YWdzPW9wdHMudGFncztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCQuaXNGdW5jdGlvbih0YWdzKSkgdGFncz10YWdzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGFncykuZWFjaChmdW5jdGlvbigpIHsgaWYgKGVxdWFsKHRoaXMuaWQsIGlkKSkgeyB0ZXh0ID0gdGhpcy50ZXh0OyByZXR1cm4gZmFsc2U7IH0gfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEucHVzaCh7aWQ6IGlkLCB0ZXh0OiB0ZXh0fSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodHlwZW9mKG9wdHMucXVlcnkpICE9PSBcImZ1bmN0aW9uXCIpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IFwicXVlcnkgZnVuY3Rpb24gbm90IGRlZmluZWQgZm9yIFNlbGVjdDIgXCIgKyBvcHRzLmVsZW1lbnQuYXR0cihcImlkXCIpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gb3B0cztcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBNb25pdG9yIHRoZSBvcmlnaW5hbCBlbGVtZW50IGZvciBjaGFuZ2VzIGFuZCB1cGRhdGUgc2VsZWN0MiBhY2NvcmRpbmdseVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIC8vIGFic3RyYWN0XHJcbiAgICAgICAgbW9uaXRvclNvdXJjZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgZWwgPSB0aGlzLm9wdHMuZWxlbWVudCwgc3luYztcclxuXHJcbiAgICAgICAgICAgIGVsLm9uKFwiY2hhbmdlLnNlbGVjdDJcIiwgdGhpcy5iaW5kKGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRzLmVsZW1lbnQuZGF0YShcInNlbGVjdDItY2hhbmdlLXRyaWdnZXJlZFwiKSAhPT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdFNlbGVjdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KSk7XHJcblxyXG4gICAgICAgICAgICBzeW5jID0gdGhpcy5iaW5kKGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICAgICAgICAgICAgICB2YXIgZW5hYmxlZCwgcmVhZG9ubHksIHNlbGYgPSB0aGlzO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIHN5bmMgZW5hYmxlZCBzdGF0ZVxyXG4gICAgICAgICAgICAgICAgdmFyIGRpc2FibGVkID0gZWwucHJvcChcImRpc2FibGVkXCIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGRpc2FibGVkID09PSB1bmRlZmluZWQpIGRpc2FibGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVuYWJsZSghZGlzYWJsZWQpO1xyXG5cclxuICAgICAgICAgICAgICAgIHZhciByZWFkb25seSA9IGVsLnByb3AoXCJyZWFkb25seVwiKTtcclxuICAgICAgICAgICAgICAgIGlmIChyZWFkb25seSA9PT0gdW5kZWZpbmVkKSByZWFkb25seSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZWFkb25seShyZWFkb25seSk7XHJcblxyXG4gICAgICAgICAgICAgICAgc3luY0Nzc0NsYXNzZXModGhpcy5jb250YWluZXIsIHRoaXMub3B0cy5lbGVtZW50LCB0aGlzLm9wdHMuYWRhcHRDb250YWluZXJDc3NDbGFzcyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5hZGRDbGFzcyhldmFsdWF0ZSh0aGlzLm9wdHMuY29udGFpbmVyQ3NzQ2xhc3MpKTtcclxuXHJcbiAgICAgICAgICAgICAgICBzeW5jQ3NzQ2xhc3Nlcyh0aGlzLmRyb3Bkb3duLCB0aGlzLm9wdHMuZWxlbWVudCwgdGhpcy5vcHRzLmFkYXB0RHJvcGRvd25Dc3NDbGFzcyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRyb3Bkb3duLmFkZENsYXNzKGV2YWx1YXRlKHRoaXMub3B0cy5kcm9wZG93bkNzc0NsYXNzKSk7XHJcblxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIC8vIG1vemlsbGEgYW5kIElFXHJcbiAgICAgICAgICAgIGVsLm9uKFwicHJvcGVydHljaGFuZ2Uuc2VsZWN0MiBET01BdHRyTW9kaWZpZWQuc2VsZWN0MlwiLCBzeW5jKTtcclxuXHJcblxyXG4gICAgICAgICAgICAvLyBob2xkIG9udG8gYSByZWZlcmVuY2Ugb2YgdGhlIGNhbGxiYWNrIHRvIHdvcmsgYXJvdW5kIGEgY2hyb21pdW0gYnVnXHJcbiAgICAgICAgICAgIGlmICh0aGlzLm11dGF0aW9uQ2FsbGJhY2sgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tdXRhdGlvbkNhbGxiYWNrID0gZnVuY3Rpb24gKG11dGF0aW9ucykge1xyXG4gICAgICAgICAgICAgICAgICAgIG11dGF0aW9ucy5mb3JFYWNoKHN5bmMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBzYWZhcmkgYW5kIGNocm9tZVxyXG4gICAgICAgICAgICBpZiAodHlwZW9mIFdlYktpdE11dGF0aW9uT2JzZXJ2ZXIgIT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnByb3BlcnR5T2JzZXJ2ZXIpIHsgZGVsZXRlIHRoaXMucHJvcGVydHlPYnNlcnZlcjsgdGhpcy5wcm9wZXJ0eU9ic2VydmVyID0gbnVsbDsgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wZXJ0eU9ic2VydmVyID0gbmV3IFdlYktpdE11dGF0aW9uT2JzZXJ2ZXIodGhpcy5tdXRhdGlvbkNhbGxiYWNrKTtcclxuICAgICAgICAgICAgICAgIHRoaXMucHJvcGVydHlPYnNlcnZlci5vYnNlcnZlKGVsLmdldCgwKSwgeyBhdHRyaWJ1dGVzOnRydWUsIHN1YnRyZWU6ZmFsc2UgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBhYnN0cmFjdFxyXG4gICAgICAgIHRyaWdnZXJTZWxlY3Q6IGZ1bmN0aW9uKGRhdGEpIHtcclxuICAgICAgICAgICAgdmFyIGV2dCA9ICQuRXZlbnQoXCJzZWxlY3QyLXNlbGVjdGluZ1wiLCB7IHZhbDogdGhpcy5pZChkYXRhKSwgb2JqZWN0OiBkYXRhIH0pO1xyXG4gICAgICAgICAgICB0aGlzLm9wdHMuZWxlbWVudC50cmlnZ2VyKGV2dCk7XHJcbiAgICAgICAgICAgIHJldHVybiAhZXZ0LmlzRGVmYXVsdFByZXZlbnRlZCgpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRyaWdnZXJzIHRoZSBjaGFuZ2UgZXZlbnQgb24gdGhlIHNvdXJjZSBlbGVtZW50XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgLy8gYWJzdHJhY3RcclxuICAgICAgICB0cmlnZ2VyQ2hhbmdlOiBmdW5jdGlvbiAoZGV0YWlscykge1xyXG5cclxuICAgICAgICAgICAgZGV0YWlscyA9IGRldGFpbHMgfHwge307XHJcbiAgICAgICAgICAgIGRldGFpbHM9ICQuZXh0ZW5kKHt9LCBkZXRhaWxzLCB7IHR5cGU6IFwiY2hhbmdlXCIsIHZhbDogdGhpcy52YWwoKSB9KTtcclxuICAgICAgICAgICAgLy8gcHJldmVudHMgcmVjdXJzaXZlIHRyaWdnZXJpbmdcclxuICAgICAgICAgICAgdGhpcy5vcHRzLmVsZW1lbnQuZGF0YShcInNlbGVjdDItY2hhbmdlLXRyaWdnZXJlZFwiLCB0cnVlKTtcclxuICAgICAgICAgICAgdGhpcy5vcHRzLmVsZW1lbnQudHJpZ2dlcihkZXRhaWxzKTtcclxuICAgICAgICAgICAgdGhpcy5vcHRzLmVsZW1lbnQuZGF0YShcInNlbGVjdDItY2hhbmdlLXRyaWdnZXJlZFwiLCBmYWxzZSk7XHJcblxyXG4gICAgICAgICAgICAvLyBzb21lIHZhbGlkYXRpb24gZnJhbWV3b3JrcyBpZ25vcmUgdGhlIGNoYW5nZSBldmVudCBhbmQgbGlzdGVuIGluc3RlYWQgdG8ga2V5dXAsIGNsaWNrIGZvciBzZWxlY3RzXHJcbiAgICAgICAgICAgIC8vIHNvIGhlcmUgd2UgdHJpZ2dlciB0aGUgY2xpY2sgZXZlbnQgbWFudWFsbHlcclxuICAgICAgICAgICAgdGhpcy5vcHRzLmVsZW1lbnQuY2xpY2soKTtcclxuXHJcbiAgICAgICAgICAgIC8vIFZhbGlkYXRpb25FbmdpbmUgaWdub3JlYSB0aGUgY2hhbmdlIGV2ZW50IGFuZCBsaXN0ZW5zIGluc3RlYWQgdG8gYmx1clxyXG4gICAgICAgICAgICAvLyBzbyBoZXJlIHdlIHRyaWdnZXIgdGhlIGJsdXIgZXZlbnQgbWFudWFsbHkgaWYgc28gZGVzaXJlZFxyXG4gICAgICAgICAgICBpZiAodGhpcy5vcHRzLmJsdXJPbkNoYW5nZSlcclxuICAgICAgICAgICAgICAgIHRoaXMub3B0cy5lbGVtZW50LmJsdXIoKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvL2Fic3RyYWN0XHJcbiAgICAgICAgaXNJbnRlcmZhY2VFbmFibGVkOiBmdW5jdGlvbigpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbmFibGVkSW50ZXJmYWNlID09PSB0cnVlO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIGFic3RyYWN0XHJcbiAgICAgICAgZW5hYmxlSW50ZXJmYWNlOiBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgdmFyIGVuYWJsZWQgPSB0aGlzLl9lbmFibGVkICYmICF0aGlzLl9yZWFkb25seSxcclxuICAgICAgICAgICAgICAgIGRpc2FibGVkID0gIWVuYWJsZWQ7XHJcblxyXG4gICAgICAgICAgICBpZiAoZW5hYmxlZCA9PT0gdGhpcy5lbmFibGVkSW50ZXJmYWNlKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lci50b2dnbGVDbGFzcyhcInNlbGVjdDItY29udGFpbmVyLWRpc2FibGVkXCIsIGRpc2FibGVkKTtcclxuICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xyXG4gICAgICAgICAgICB0aGlzLmVuYWJsZWRJbnRlcmZhY2UgPSBlbmFibGVkO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gYWJzdHJhY3RcclxuICAgICAgICBlbmFibGU6IGZ1bmN0aW9uKGVuYWJsZWQpIHtcclxuICAgICAgICAgICAgaWYgKGVuYWJsZWQgPT09IHVuZGVmaW5lZCkgZW5hYmxlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9lbmFibGVkID09PSBlbmFibGVkKSByZXR1cm47XHJcbiAgICAgICAgICAgIHRoaXMuX2VuYWJsZWQgPSBlbmFibGVkO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5vcHRzLmVsZW1lbnQucHJvcChcImRpc2FibGVkXCIsICFlbmFibGVkKTtcclxuICAgICAgICAgICAgdGhpcy5lbmFibGVJbnRlcmZhY2UoKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBhYnN0cmFjdFxyXG4gICAgICAgIGRpc2FibGU6IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICB0aGlzLmVuYWJsZShmYWxzZSk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gYWJzdHJhY3RcclxuICAgICAgICByZWFkb25seTogZnVuY3Rpb24oZW5hYmxlZCkge1xyXG4gICAgICAgICAgICBpZiAoZW5hYmxlZCA9PT0gdW5kZWZpbmVkKSBlbmFibGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9yZWFkb25seSA9PT0gZW5hYmxlZCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLl9yZWFkb25seSA9IGVuYWJsZWQ7XHJcblxyXG4gICAgICAgICAgICB0aGlzLm9wdHMuZWxlbWVudC5wcm9wKFwicmVhZG9ubHlcIiwgZW5hYmxlZCk7XHJcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlSW50ZXJmYWNlKCk7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIGFic3RyYWN0XHJcbiAgICAgICAgb3BlbmVkOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5lci5oYXNDbGFzcyhcInNlbGVjdDItZHJvcGRvd24tb3BlblwiKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBhYnN0cmFjdFxyXG4gICAgICAgIHBvc2l0aW9uRHJvcGRvd246IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICB2YXIgJGRyb3Bkb3duID0gdGhpcy5kcm9wZG93bixcclxuICAgICAgICAgICAgICAgIG9mZnNldCA9IHRoaXMuY29udGFpbmVyLm9mZnNldCgpLFxyXG4gICAgICAgICAgICAgICAgaGVpZ2h0ID0gdGhpcy5jb250YWluZXIub3V0ZXJIZWlnaHQoZmFsc2UpLFxyXG4gICAgICAgICAgICAgICAgd2lkdGggPSB0aGlzLmNvbnRhaW5lci5vdXRlcldpZHRoKGZhbHNlKSxcclxuICAgICAgICAgICAgICAgIGRyb3BIZWlnaHQgPSAkZHJvcGRvd24ub3V0ZXJIZWlnaHQoZmFsc2UpLFxyXG4gICAgICAgICAgICAgICAgdmlld1BvcnRSaWdodCA9ICQod2luZG93KS5zY3JvbGxMZWZ0KCkgKyAkKHdpbmRvdykud2lkdGgoKSxcclxuICAgICAgICAgICAgICAgIHZpZXdwb3J0Qm90dG9tID0gJCh3aW5kb3cpLnNjcm9sbFRvcCgpICsgJCh3aW5kb3cpLmhlaWdodCgpLFxyXG4gICAgICAgICAgICAgICAgZHJvcFRvcCA9IG9mZnNldC50b3AgKyBoZWlnaHQsXHJcbiAgICAgICAgICAgICAgICBkcm9wTGVmdCA9IG9mZnNldC5sZWZ0LFxyXG4gICAgICAgICAgICAgICAgZW5vdWdoUm9vbUJlbG93ID0gZHJvcFRvcCArIGRyb3BIZWlnaHQgPD0gdmlld3BvcnRCb3R0b20sXHJcbiAgICAgICAgICAgICAgICBlbm91Z2hSb29tQWJvdmUgPSAob2Zmc2V0LnRvcCAtIGRyb3BIZWlnaHQpID49IHRoaXMuYm9keSgpLnNjcm9sbFRvcCgpLFxyXG4gICAgICAgICAgICAgICAgZHJvcFdpZHRoID0gJGRyb3Bkb3duLm91dGVyV2lkdGgoZmFsc2UpLFxyXG4gICAgICAgICAgICAgICAgZW5vdWdoUm9vbU9uUmlnaHQgPSBkcm9wTGVmdCArIGRyb3BXaWR0aCA8PSB2aWV3UG9ydFJpZ2h0LFxyXG4gICAgICAgICAgICAgICAgYWJvdmVOb3cgPSAkZHJvcGRvd24uaGFzQ2xhc3MoXCJzZWxlY3QyLWRyb3AtYWJvdmVcIiksXHJcbiAgICAgICAgICAgICAgICBib2R5T2Zmc2V0LFxyXG4gICAgICAgICAgICAgICAgYWJvdmUsXHJcbiAgICAgICAgICAgICAgICBjc3MsXHJcbiAgICAgICAgICAgICAgICByZXN1bHRzTGlzdE5vZGU7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5vcHRzLmRyb3Bkb3duQXV0b1dpZHRoKSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHRzTGlzdE5vZGUgPSAkKCcuc2VsZWN0Mi1yZXN1bHRzJywgJGRyb3Bkb3duKVswXTtcclxuICAgICAgICAgICAgICAgICRkcm9wZG93bi5hZGRDbGFzcygnc2VsZWN0Mi1kcm9wLWF1dG8td2lkdGgnKTtcclxuICAgICAgICAgICAgICAgICRkcm9wZG93bi5jc3MoJ3dpZHRoJywgJycpO1xyXG4gICAgICAgICAgICAgICAgLy8gQWRkIHNjcm9sbGJhciB3aWR0aCB0byBkcm9wZG93biBpZiB2ZXJ0aWNhbCBzY3JvbGxiYXIgaXMgcHJlc2VudFxyXG4gICAgICAgICAgICAgICAgZHJvcFdpZHRoID0gJGRyb3Bkb3duLm91dGVyV2lkdGgoZmFsc2UpICsgKHJlc3VsdHNMaXN0Tm9kZS5zY3JvbGxIZWlnaHQgPT09IHJlc3VsdHNMaXN0Tm9kZS5jbGllbnRIZWlnaHQgPyAwIDogc2Nyb2xsQmFyRGltZW5zaW9ucy53aWR0aCk7XHJcbiAgICAgICAgICAgICAgICBkcm9wV2lkdGggPiB3aWR0aCA/IHdpZHRoID0gZHJvcFdpZHRoIDogZHJvcFdpZHRoID0gd2lkdGg7XHJcbiAgICAgICAgICAgICAgICBlbm91Z2hSb29tT25SaWdodCA9IGRyb3BMZWZ0ICsgZHJvcFdpZHRoIDw9IHZpZXdQb3J0UmlnaHQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5yZW1vdmVDbGFzcygnc2VsZWN0Mi1kcm9wLWF1dG8td2lkdGgnKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcImJlbG93LyBkcm9wdG9wOlwiLCBkcm9wVG9wLCBcImRyb3BIZWlnaHRcIiwgZHJvcEhlaWdodCwgXCJzdW1cIiwgKGRyb3BUb3ArZHJvcEhlaWdodCkrXCIgdmlld3BvcnQgYm90dG9tXCIsIHZpZXdwb3J0Qm90dG9tLCBcImVub3VnaD9cIiwgZW5vdWdoUm9vbUJlbG93KTtcclxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcImFib3ZlLyBvZmZzZXQudG9wXCIsIG9mZnNldC50b3AsIFwiZHJvcEhlaWdodFwiLCBkcm9wSGVpZ2h0LCBcInRvcFwiLCAob2Zmc2V0LnRvcC1kcm9wSGVpZ2h0KSwgXCJzY3JvbGxUb3BcIiwgdGhpcy5ib2R5KCkuc2Nyb2xsVG9wKCksIFwiZW5vdWdoP1wiLCBlbm91Z2hSb29tQWJvdmUpO1xyXG5cclxuICAgICAgICAgICAgLy8gZml4IHBvc2l0aW9uaW5nIHdoZW4gYm9keSBoYXMgYW4gb2Zmc2V0IGFuZCBpcyBub3QgcG9zaXRpb246IHN0YXRpY1xyXG4gICAgICAgICAgICBpZiAodGhpcy5ib2R5KCkuY3NzKCdwb3NpdGlvbicpICE9PSAnc3RhdGljJykge1xyXG4gICAgICAgICAgICAgICAgYm9keU9mZnNldCA9IHRoaXMuYm9keSgpLm9mZnNldCgpO1xyXG4gICAgICAgICAgICAgICAgZHJvcFRvcCAtPSBib2R5T2Zmc2V0LnRvcDtcclxuICAgICAgICAgICAgICAgIGRyb3BMZWZ0IC09IGJvZHlPZmZzZXQubGVmdDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gYWx3YXlzIHByZWZlciB0aGUgY3VycmVudCBhYm92ZS9iZWxvdyBhbGlnbm1lbnQsIHVubGVzcyB0aGVyZSBpcyBub3QgZW5vdWdoIHJvb21cclxuICAgICAgICAgICAgaWYgKGFib3ZlTm93KSB7XHJcbiAgICAgICAgICAgICAgICBhYm92ZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWVub3VnaFJvb21BYm92ZSAmJiBlbm91Z2hSb29tQmVsb3cpIGFib3ZlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBhYm92ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFlbm91Z2hSb29tQmVsb3cgJiYgZW5vdWdoUm9vbUFib3ZlKSBhYm92ZSA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICghZW5vdWdoUm9vbU9uUmlnaHQpIHtcclxuICAgICAgICAgICAgICAgZHJvcExlZnQgPSBvZmZzZXQubGVmdCArIHdpZHRoIC0gZHJvcFdpZHRoO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoYWJvdmUpIHtcclxuICAgICAgICAgICAgICAgIGRyb3BUb3AgPSBvZmZzZXQudG9wIC0gZHJvcEhlaWdodDtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLmFkZENsYXNzKFwic2VsZWN0Mi1kcm9wLWFib3ZlXCIpO1xyXG4gICAgICAgICAgICAgICAgJGRyb3Bkb3duLmFkZENsYXNzKFwic2VsZWN0Mi1kcm9wLWFib3ZlXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb250YWluZXIucmVtb3ZlQ2xhc3MoXCJzZWxlY3QyLWRyb3AtYWJvdmVcIik7XHJcbiAgICAgICAgICAgICAgICAkZHJvcGRvd24ucmVtb3ZlQ2xhc3MoXCJzZWxlY3QyLWRyb3AtYWJvdmVcIik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNzcyA9ICQuZXh0ZW5kKHtcclxuICAgICAgICAgICAgICAgIHRvcDogZHJvcFRvcCxcclxuICAgICAgICAgICAgICAgIGxlZnQ6IGRyb3BMZWZ0LFxyXG4gICAgICAgICAgICAgICAgd2lkdGg6IHdpZHRoXHJcbiAgICAgICAgICAgIH0sIGV2YWx1YXRlKHRoaXMub3B0cy5kcm9wZG93bkNzcykpO1xyXG5cclxuICAgICAgICAgICAgJGRyb3Bkb3duLmNzcyhjc3MpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIGFic3RyYWN0XHJcbiAgICAgICAgc2hvdWxkT3BlbjogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIHZhciBldmVudDtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wZW5lZCgpKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5fZW5hYmxlZCA9PT0gZmFsc2UgfHwgdGhpcy5fcmVhZG9ubHkgPT09IHRydWUpIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIGV2ZW50ID0gJC5FdmVudChcInNlbGVjdDItb3BlbmluZ1wiKTtcclxuICAgICAgICAgICAgdGhpcy5vcHRzLmVsZW1lbnQudHJpZ2dlcihldmVudCk7XHJcbiAgICAgICAgICAgIHJldHVybiAhZXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gYWJzdHJhY3RcclxuICAgICAgICBjbGVhckRyb3Bkb3duQWxpZ25tZW50UHJlZmVyZW5jZTogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIC8vIGNsZWFyIHRoZSBjbGFzc2VzIHVzZWQgdG8gZmlndXJlIG91dCB0aGUgcHJlZmVyZW5jZSBvZiB3aGVyZSB0aGUgZHJvcGRvd24gc2hvdWxkIGJlIG9wZW5lZFxyXG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5yZW1vdmVDbGFzcyhcInNlbGVjdDItZHJvcC1hYm92ZVwiKTtcclxuICAgICAgICAgICAgdGhpcy5kcm9wZG93bi5yZW1vdmVDbGFzcyhcInNlbGVjdDItZHJvcC1hYm92ZVwiKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBPcGVucyB0aGUgZHJvcGRvd25cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IHdoZXRoZXIgb3Igbm90IGRyb3Bkb3duIHdhcyBvcGVuZWQuIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIGZhbHNlIGlmLCBmb3IgZXhhbXBsZSxcclxuICAgICAgICAgKiB0aGUgZHJvcGRvd24gaXMgYWxyZWFkeSBvcGVuLCBvciBpZiB0aGUgJ29wZW4nIGV2ZW50IGxpc3RlbmVyIG9uIHRoZSBlbGVtZW50IGNhbGxlZCBwcmV2ZW50RGVmYXVsdCgpLlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIC8vIGFic3RyYWN0XHJcbiAgICAgICAgb3BlbjogZnVuY3Rpb24gKCkge1xyXG5cclxuICAgICAgICAgICAgaWYgKCF0aGlzLnNob3VsZE9wZW4oKSkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5vcGVuaW5nKCk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBQZXJmb3JtcyB0aGUgb3BlbmluZyBvZiB0aGUgZHJvcGRvd25cclxuICAgICAgICAgKi9cclxuICAgICAgICAvLyBhYnN0cmFjdFxyXG4gICAgICAgIG9wZW5pbmc6IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICB2YXIgY2lkID0gdGhpcy5jb250YWluZXJJZCxcclxuICAgICAgICAgICAgICAgIHNjcm9sbCA9IFwic2Nyb2xsLlwiICsgY2lkLFxyXG4gICAgICAgICAgICAgICAgcmVzaXplID0gXCJyZXNpemUuXCIrY2lkLFxyXG4gICAgICAgICAgICAgICAgb3JpZW50ID0gXCJvcmllbnRhdGlvbmNoYW5nZS5cIitjaWQsXHJcbiAgICAgICAgICAgICAgICBtYXNrLCBtYXNrQ3NzO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5jb250YWluZXIuYWRkQ2xhc3MoXCJzZWxlY3QyLWRyb3Bkb3duLW9wZW5cIikuYWRkQ2xhc3MoXCJzZWxlY3QyLWNvbnRhaW5lci1hY3RpdmVcIik7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmNsZWFyRHJvcGRvd25BbGlnbm1lbnRQcmVmZXJlbmNlKCk7XHJcblxyXG4gICAgICAgICAgICBpZih0aGlzLmRyb3Bkb3duWzBdICE9PSB0aGlzLmJvZHkoKS5jaGlsZHJlbigpLmxhc3QoKVswXSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kcm9wZG93bi5kZXRhY2goKS5hcHBlbmRUbyh0aGlzLmJvZHkoKSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgZHJvcGRvd24gbWFzayBpZiBkb2VzbnQgYWxyZWFkeSBleGlzdFxyXG4gICAgICAgICAgICBtYXNrID0gJChcIiNzZWxlY3QyLWRyb3AtbWFza1wiKTtcclxuICAgICAgICAgICAgaWYgKG1hc2subGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgICAgIG1hc2sgPSAkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikpO1xyXG4gICAgICAgICAgICAgICAgbWFzay5hdHRyKFwiaWRcIixcInNlbGVjdDItZHJvcC1tYXNrXCIpLmF0dHIoXCJjbGFzc1wiLFwic2VsZWN0Mi1kcm9wLW1hc2tcIik7XHJcbiAgICAgICAgICAgICAgICBtYXNrLmhpZGUoKTtcclxuICAgICAgICAgICAgICAgIG1hc2suYXBwZW5kVG8odGhpcy5ib2R5KCkpO1xyXG4gICAgICAgICAgICAgICAgbWFzay5vbihcIm1vdXNlZG93biB0b3VjaHN0YXJ0IGNsaWNrXCIsIGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRyb3Bkb3duID0gJChcIiNzZWxlY3QyLWRyb3BcIiksIHNlbGY7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRyb3Bkb3duLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZj1kcm9wZG93bi5kYXRhKFwic2VsZWN0MlwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYub3B0cy5zZWxlY3RPbkJsdXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2VsZWN0SGlnaGxpZ2h0ZWQoe25vRm9jdXM6IHRydWV9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNsb3NlKHtmb2N1czpmYWxzZX0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIGVuc3VyZSB0aGUgbWFzayBpcyBhbHdheXMgcmlnaHQgYmVmb3JlIHRoZSBkcm9wZG93blxyXG4gICAgICAgICAgICBpZiAodGhpcy5kcm9wZG93bi5wcmV2KClbMF0gIT09IG1hc2tbMF0pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZHJvcGRvd24uYmVmb3JlKG1hc2spO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBtb3ZlIHRoZSBnbG9iYWwgaWQgdG8gdGhlIGNvcnJlY3QgZHJvcGRvd25cclxuICAgICAgICAgICAgJChcIiNzZWxlY3QyLWRyb3BcIikucmVtb3ZlQXR0cihcImlkXCIpO1xyXG4gICAgICAgICAgICB0aGlzLmRyb3Bkb3duLmF0dHIoXCJpZFwiLCBcInNlbGVjdDItZHJvcFwiKTtcclxuXHJcbiAgICAgICAgICAgIC8vIHNob3cgdGhlIGVsZW1lbnRzXHJcbiAgICAgICAgICAgIG1hc2suc2hvdygpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbkRyb3Bkb3duKCk7XHJcbiAgICAgICAgICAgIHRoaXMuZHJvcGRvd24uc2hvdygpO1xyXG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uRHJvcGRvd24oKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZHJvcGRvd24uYWRkQ2xhc3MoXCJzZWxlY3QyLWRyb3AtYWN0aXZlXCIpO1xyXG5cclxuICAgICAgICAgICAgLy8gYXR0YWNoIGxpc3RlbmVycyB0byBldmVudHMgdGhhdCBjYW4gY2hhbmdlIHRoZSBwb3NpdGlvbiBvZiB0aGUgY29udGFpbmVyIGFuZCB0aHVzIHJlcXVpcmVcclxuICAgICAgICAgICAgLy8gdGhlIHBvc2l0aW9uIG9mIHRoZSBkcm9wZG93biB0byBiZSB1cGRhdGVkIGFzIHdlbGwgc28gaXQgZG9lcyBub3QgY29tZSB1bmdsdWVkIGZyb20gdGhlIGNvbnRhaW5lclxyXG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XHJcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLnBhcmVudHMoKS5hZGQod2luZG93KS5lYWNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICQodGhpcykub24ocmVzaXplK1wiIFwiK3Njcm9sbCtcIiBcIitvcmllbnQsIGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhhdC5wb3NpdGlvbkRyb3Bkb3duKCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG5cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBhYnN0cmFjdFxyXG4gICAgICAgIGNsb3NlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5vcGVuZWQoKSkgcmV0dXJuO1xyXG5cclxuICAgICAgICAgICAgdmFyIGNpZCA9IHRoaXMuY29udGFpbmVySWQsXHJcbiAgICAgICAgICAgICAgICBzY3JvbGwgPSBcInNjcm9sbC5cIiArIGNpZCxcclxuICAgICAgICAgICAgICAgIHJlc2l6ZSA9IFwicmVzaXplLlwiK2NpZCxcclxuICAgICAgICAgICAgICAgIG9yaWVudCA9IFwib3JpZW50YXRpb25jaGFuZ2UuXCIrY2lkO1xyXG5cclxuICAgICAgICAgICAgLy8gdW5iaW5kIGV2ZW50IGxpc3RlbmVyc1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5wYXJlbnRzKCkuYWRkKHdpbmRvdykuZWFjaChmdW5jdGlvbiAoKSB7ICQodGhpcykub2ZmKHNjcm9sbCkub2ZmKHJlc2l6ZSkub2ZmKG9yaWVudCk7IH0pO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5jbGVhckRyb3Bkb3duQWxpZ25tZW50UHJlZmVyZW5jZSgpO1xyXG5cclxuICAgICAgICAgICAgJChcIiNzZWxlY3QyLWRyb3AtbWFza1wiKS5oaWRlKCk7XHJcbiAgICAgICAgICAgIHRoaXMuZHJvcGRvd24ucmVtb3ZlQXR0cihcImlkXCIpOyAvLyBvbmx5IHRoZSBhY3RpdmUgZHJvcGRvd24gaGFzIHRoZSBzZWxlY3QyLWRyb3AgaWRcclxuICAgICAgICAgICAgdGhpcy5kcm9wZG93bi5oaWRlKCk7XHJcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLnJlbW92ZUNsYXNzKFwic2VsZWN0Mi1kcm9wZG93bi1vcGVuXCIpO1xyXG4gICAgICAgICAgICB0aGlzLnJlc3VsdHMuZW1wdHkoKTtcclxuXHJcblxyXG4gICAgICAgICAgICB0aGlzLmNsZWFyU2VhcmNoKCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoLnJlbW92ZUNsYXNzKFwic2VsZWN0Mi1hY3RpdmVcIik7XHJcbiAgICAgICAgICAgIHRoaXMub3B0cy5lbGVtZW50LnRyaWdnZXIoJC5FdmVudChcInNlbGVjdDItY2xvc2VcIikpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIE9wZW5zIGNvbnRyb2wsIHNldHMgaW5wdXQgdmFsdWUsIGFuZCB1cGRhdGVzIHJlc3VsdHMuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgLy8gYWJzdHJhY3RcclxuICAgICAgICBleHRlcm5hbFNlYXJjaDogZnVuY3Rpb24gKHRlcm0pIHtcclxuICAgICAgICAgICAgdGhpcy5vcGVuKCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoLnZhbCh0ZXJtKTtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVSZXN1bHRzKGZhbHNlKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBhYnN0cmFjdFxyXG4gICAgICAgIGNsZWFyU2VhcmNoOiBmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vYWJzdHJhY3RcclxuICAgICAgICBnZXRNYXhpbXVtU2VsZWN0aW9uU2l6ZTogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBldmFsdWF0ZSh0aGlzLm9wdHMubWF4aW11bVNlbGVjdGlvblNpemUpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIGFic3RyYWN0XHJcbiAgICAgICAgZW5zdXJlSGlnaGxpZ2h0VmlzaWJsZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgcmVzdWx0cyA9IHRoaXMucmVzdWx0cywgY2hpbGRyZW4sIGluZGV4LCBjaGlsZCwgaGIsIHJiLCB5LCBtb3JlO1xyXG5cclxuICAgICAgICAgICAgaW5kZXggPSB0aGlzLmhpZ2hsaWdodCgpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgcmV0dXJuO1xyXG5cclxuICAgICAgICAgICAgaWYgKGluZGV4ID09IDApIHtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgZmlyc3QgZWxlbWVudCBpcyBoaWdobGlnaHRlZCBzY3JvbGwgYWxsIHRoZSB3YXkgdG8gdGhlIHRvcCxcclxuICAgICAgICAgICAgICAgIC8vIHRoYXQgd2F5IGFueSB1bnNlbGVjdGFibGUgaGVhZGVycyBhYm92ZSBpdCB3aWxsIGFsc28gYmUgc2Nyb2xsZWRcclxuICAgICAgICAgICAgICAgIC8vIGludG8gdmlld1xyXG5cclxuICAgICAgICAgICAgICAgIHJlc3VsdHMuc2Nyb2xsVG9wKDApO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjaGlsZHJlbiA9IHRoaXMuZmluZEhpZ2hsaWdodGFibGVDaG9pY2VzKCkuZmluZCgnLnNlbGVjdDItcmVzdWx0LWxhYmVsJyk7XHJcblxyXG4gICAgICAgICAgICBjaGlsZCA9ICQoY2hpbGRyZW5baW5kZXhdKTtcclxuXHJcbiAgICAgICAgICAgIGhiID0gY2hpbGQub2Zmc2V0KCkudG9wICsgY2hpbGQub3V0ZXJIZWlnaHQodHJ1ZSk7XHJcblxyXG4gICAgICAgICAgICAvLyBpZiB0aGlzIGlzIHRoZSBsYXN0IGNoaWxkIGxldHMgYWxzbyBtYWtlIHN1cmUgc2VsZWN0Mi1tb3JlLXJlc3VsdHMgaXMgdmlzaWJsZVxyXG4gICAgICAgICAgICBpZiAoaW5kZXggPT09IGNoaWxkcmVuLmxlbmd0aCAtIDEpIHtcclxuICAgICAgICAgICAgICAgIG1vcmUgPSByZXN1bHRzLmZpbmQoXCJsaS5zZWxlY3QyLW1vcmUtcmVzdWx0c1wiKTtcclxuICAgICAgICAgICAgICAgIGlmIChtb3JlLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBoYiA9IG1vcmUub2Zmc2V0KCkudG9wICsgbW9yZS5vdXRlckhlaWdodCh0cnVlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmIgPSByZXN1bHRzLm9mZnNldCgpLnRvcCArIHJlc3VsdHMub3V0ZXJIZWlnaHQodHJ1ZSk7XHJcbiAgICAgICAgICAgIGlmIChoYiA+IHJiKSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHRzLnNjcm9sbFRvcChyZXN1bHRzLnNjcm9sbFRvcCgpICsgKGhiIC0gcmIpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB5ID0gY2hpbGQub2Zmc2V0KCkudG9wIC0gcmVzdWx0cy5vZmZzZXQoKS50b3A7XHJcblxyXG4gICAgICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIHRvcCBvZiB0aGUgZWxlbWVudCBpcyB2aXNpYmxlXHJcbiAgICAgICAgICAgIGlmICh5IDwgMCAmJiBjaGlsZC5jc3MoJ2Rpc3BsYXknKSAhPSAnbm9uZScgKSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHRzLnNjcm9sbFRvcChyZXN1bHRzLnNjcm9sbFRvcCgpICsgeSk7IC8vIHkgaXMgbmVnYXRpdmVcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIGFic3RyYWN0XHJcbiAgICAgICAgZmluZEhpZ2hsaWdodGFibGVDaG9pY2VzOiBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVzdWx0cy5maW5kKFwiLnNlbGVjdDItcmVzdWx0LXNlbGVjdGFibGU6bm90KC5zZWxlY3QyLXNlbGVjdGVkKTpub3QoLnNlbGVjdDItZGlzYWJsZWQpXCIpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIGFic3RyYWN0XHJcbiAgICAgICAgbW92ZUhpZ2hsaWdodDogZnVuY3Rpb24gKGRlbHRhKSB7XHJcbiAgICAgICAgICAgIHZhciBjaG9pY2VzID0gdGhpcy5maW5kSGlnaGxpZ2h0YWJsZUNob2ljZXMoKSxcclxuICAgICAgICAgICAgICAgIGluZGV4ID0gdGhpcy5oaWdobGlnaHQoKTtcclxuXHJcbiAgICAgICAgICAgIHdoaWxlIChpbmRleCA+IC0xICYmIGluZGV4IDwgY2hvaWNlcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIGluZGV4ICs9IGRlbHRhO1xyXG4gICAgICAgICAgICAgICAgdmFyIGNob2ljZSA9ICQoY2hvaWNlc1tpbmRleF0pO1xyXG4gICAgICAgICAgICAgICAgaWYgKGNob2ljZS5oYXNDbGFzcyhcInNlbGVjdDItcmVzdWx0LXNlbGVjdGFibGVcIikgJiYgIWNob2ljZS5oYXNDbGFzcyhcInNlbGVjdDItZGlzYWJsZWRcIikgJiYgIWNob2ljZS5oYXNDbGFzcyhcInNlbGVjdDItc2VsZWN0ZWRcIikpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZ2hsaWdodChpbmRleCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBhYnN0cmFjdFxyXG4gICAgICAgIGhpZ2hsaWdodDogZnVuY3Rpb24gKGluZGV4KSB7XHJcbiAgICAgICAgICAgIHZhciBjaG9pY2VzID0gdGhpcy5maW5kSGlnaGxpZ2h0YWJsZUNob2ljZXMoKSxcclxuICAgICAgICAgICAgICAgIGNob2ljZSxcclxuICAgICAgICAgICAgICAgIGRhdGE7XHJcblxyXG4gICAgICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4T2YoY2hvaWNlcy5maWx0ZXIoXCIuc2VsZWN0Mi1oaWdobGlnaHRlZFwiKVswXSwgY2hvaWNlcy5nZXQoKSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChpbmRleCA+PSBjaG9pY2VzLmxlbmd0aCkgaW5kZXggPSBjaG9pY2VzLmxlbmd0aCAtIDE7XHJcbiAgICAgICAgICAgIGlmIChpbmRleCA8IDApIGluZGV4ID0gMDtcclxuXHJcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlSGlnaGxpZ2h0KCk7XHJcblxyXG4gICAgICAgICAgICBjaG9pY2UgPSAkKGNob2ljZXNbaW5kZXhdKTtcclxuICAgICAgICAgICAgY2hvaWNlLmFkZENsYXNzKFwic2VsZWN0Mi1oaWdobGlnaHRlZFwiKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZW5zdXJlSGlnaGxpZ2h0VmlzaWJsZSgpO1xyXG5cclxuICAgICAgICAgICAgZGF0YSA9IGNob2ljZS5kYXRhKFwic2VsZWN0Mi1kYXRhXCIpO1xyXG4gICAgICAgICAgICBpZiAoZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vcHRzLmVsZW1lbnQudHJpZ2dlcih7IHR5cGU6IFwic2VsZWN0Mi1oaWdobGlnaHRcIiwgdmFsOiB0aGlzLmlkKGRhdGEpLCBjaG9pY2U6IGRhdGEgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICByZW1vdmVIaWdobGlnaHQ6IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICB0aGlzLnJlc3VsdHMuZmluZChcIi5zZWxlY3QyLWhpZ2hsaWdodGVkXCIpLnJlbW92ZUNsYXNzKFwic2VsZWN0Mi1oaWdobGlnaHRlZFwiKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBhYnN0cmFjdFxyXG4gICAgICAgIGNvdW50U2VsZWN0YWJsZVJlc3VsdHM6IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maW5kSGlnaGxpZ2h0YWJsZUNob2ljZXMoKS5sZW5ndGg7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gYWJzdHJhY3RcclxuICAgICAgICBoaWdobGlnaHRVbmRlckV2ZW50OiBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgdmFyIGVsID0gJChldmVudC50YXJnZXQpLmNsb3Nlc3QoXCIuc2VsZWN0Mi1yZXN1bHQtc2VsZWN0YWJsZVwiKTtcclxuICAgICAgICAgICAgaWYgKGVsLmxlbmd0aCA+IDAgJiYgIWVsLmlzKFwiLnNlbGVjdDItaGlnaGxpZ2h0ZWRcIikpIHtcclxuICAgICAgICAgICAgICAgIHZhciBjaG9pY2VzID0gdGhpcy5maW5kSGlnaGxpZ2h0YWJsZUNob2ljZXMoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0KGNob2ljZXMuaW5kZXgoZWwpKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChlbC5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgLy8gaWYgd2UgYXJlIG92ZXIgYW4gdW5zZWxlY3RhYmxlIGl0ZW0gcmVtb3ZlIGFsbCBoaWdobGlnaHRzXHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUhpZ2hsaWdodCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gYWJzdHJhY3RcclxuICAgICAgICBsb2FkTW9yZUlmTmVlZGVkOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciByZXN1bHRzID0gdGhpcy5yZXN1bHRzLFxyXG4gICAgICAgICAgICAgICAgbW9yZSA9IHJlc3VsdHMuZmluZChcImxpLnNlbGVjdDItbW9yZS1yZXN1bHRzXCIpLFxyXG4gICAgICAgICAgICAgICAgYmVsb3csIC8vIHBpeGVscyB0aGUgZWxlbWVudCBpcyBiZWxvdyB0aGUgc2Nyb2xsIGZvbGQsIGJlbG93PT0wIGlzIHdoZW4gdGhlIGVsZW1lbnQgaXMgc3RhcnRpbmcgdG8gYmUgdmlzaWJsZVxyXG4gICAgICAgICAgICAgICAgb2Zmc2V0ID0gLTEsIC8vIGluZGV4IG9mIGZpcnN0IGVsZW1lbnQgd2l0aG91dCBkYXRhXHJcbiAgICAgICAgICAgICAgICBwYWdlID0gdGhpcy5yZXN1bHRzUGFnZSArIDEsXHJcbiAgICAgICAgICAgICAgICBzZWxmPXRoaXMsXHJcbiAgICAgICAgICAgICAgICB0ZXJtPXRoaXMuc2VhcmNoLnZhbCgpLFxyXG4gICAgICAgICAgICAgICAgY29udGV4dD10aGlzLmNvbnRleHQ7XHJcblxyXG4gICAgICAgICAgICBpZiAobW9yZS5sZW5ndGggPT09IDApIHJldHVybjtcclxuICAgICAgICAgICAgYmVsb3cgPSBtb3JlLm9mZnNldCgpLnRvcCAtIHJlc3VsdHMub2Zmc2V0KCkudG9wIC0gcmVzdWx0cy5oZWlnaHQoKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChiZWxvdyA8PSB0aGlzLm9wdHMubG9hZE1vcmVQYWRkaW5nKSB7XHJcbiAgICAgICAgICAgICAgICBtb3JlLmFkZENsYXNzKFwic2VsZWN0Mi1hY3RpdmVcIik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9wdHMucXVlcnkoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50OiB0aGlzLm9wdHMuZWxlbWVudCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGVybTogdGVybSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFnZTogcGFnZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogY29udGV4dCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcjogdGhpcy5vcHRzLm1hdGNoZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrOiB0aGlzLmJpbmQoZnVuY3Rpb24gKGRhdGEpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGEgcmVzcG9uc2UgaWYgdGhlIHNlbGVjdDIgaGFzIGJlZW4gY2xvc2VkIGJlZm9yZSBpdCB3YXMgcmVjZWl2ZWRcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGYub3BlbmVkKCkpIHJldHVybjtcclxuXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYub3B0cy5wb3B1bGF0ZVJlc3VsdHMuY2FsbCh0aGlzLCByZXN1bHRzLCBkYXRhLnJlc3VsdHMsIHt0ZXJtOiB0ZXJtLCBwYWdlOiBwYWdlLCBjb250ZXh0OmNvbnRleHR9KTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnBvc3Rwcm9jZXNzUmVzdWx0cyhkYXRhLCBmYWxzZSwgZmFsc2UpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5tb3JlPT09dHJ1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBtb3JlLmRldGFjaCgpLmFwcGVuZFRvKHJlc3VsdHMpLnRleHQoc2VsZi5vcHRzLmZvcm1hdExvYWRNb3JlKHBhZ2UrMSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpIHsgc2VsZi5sb2FkTW9yZUlmTmVlZGVkKCk7IH0sIDEwKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBtb3JlLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnBvc2l0aW9uRHJvcGRvd24oKTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnJlc3VsdHNQYWdlID0gcGFnZTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRleHQgPSBkYXRhLmNvbnRleHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRzLmVsZW1lbnQudHJpZ2dlcih7IHR5cGU6IFwic2VsZWN0Mi1sb2FkZWRcIiwgaXRlbXM6IGRhdGEgfSk7XHJcbiAgICAgICAgICAgICAgICB9KX0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogRGVmYXVsdCB0b2tlbml6ZXIgZnVuY3Rpb24gd2hpY2ggZG9lcyBub3RoaW5nXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdG9rZW5pemU6IGZ1bmN0aW9uKCkge1xyXG5cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAcGFyYW0gaW5pdGlhbCB3aGV0aGVyIG9yIG5vdCB0aGlzIGlzIHRoZSBjYWxsIHRvIHRoaXMgbWV0aG9kIHJpZ2h0IGFmdGVyIHRoZSBkcm9wZG93biBoYXMgYmVlbiBvcGVuZWRcclxuICAgICAgICAgKi9cclxuICAgICAgICAvLyBhYnN0cmFjdFxyXG4gICAgICAgIHVwZGF0ZVJlc3VsdHM6IGZ1bmN0aW9uIChpbml0aWFsKSB7XHJcbiAgICAgICAgICAgIHZhciBzZWFyY2ggPSB0aGlzLnNlYXJjaCxcclxuICAgICAgICAgICAgICAgIHJlc3VsdHMgPSB0aGlzLnJlc3VsdHMsXHJcbiAgICAgICAgICAgICAgICBvcHRzID0gdGhpcy5vcHRzLFxyXG4gICAgICAgICAgICAgICAgZGF0YSxcclxuICAgICAgICAgICAgICAgIHNlbGYgPSB0aGlzLFxyXG4gICAgICAgICAgICAgICAgaW5wdXQsXHJcbiAgICAgICAgICAgICAgICB0ZXJtID0gc2VhcmNoLnZhbCgpLFxyXG4gICAgICAgICAgICAgICAgbGFzdFRlcm0gPSAkLmRhdGEodGhpcy5jb250YWluZXIsIFwic2VsZWN0Mi1sYXN0LXRlcm1cIiksXHJcbiAgICAgICAgICAgICAgICAvLyBzZXF1ZW5jZSBudW1iZXIgdXNlZCB0byBkcm9wIG91dC1vZi1vcmRlciByZXNwb25zZXNcclxuICAgICAgICAgICAgICAgIHF1ZXJ5TnVtYmVyO1xyXG5cclxuICAgICAgICAgICAgLy8gcHJldmVudCBkdXBsaWNhdGUgcXVlcmllcyBhZ2FpbnN0IHRoZSBzYW1lIHRlcm1cclxuICAgICAgICAgICAgaWYgKGluaXRpYWwgIT09IHRydWUgJiYgbGFzdFRlcm0gJiYgZXF1YWwodGVybSwgbGFzdFRlcm0pKSByZXR1cm47XHJcblxyXG4gICAgICAgICAgICAkLmRhdGEodGhpcy5jb250YWluZXIsIFwic2VsZWN0Mi1sYXN0LXRlcm1cIiwgdGVybSk7XHJcblxyXG4gICAgICAgICAgICAvLyBpZiB0aGUgc2VhcmNoIGlzIGN1cnJlbnRseSBoaWRkZW4gd2UgZG8gbm90IGFsdGVyIHRoZSByZXN1bHRzXHJcbiAgICAgICAgICAgIGlmIChpbml0aWFsICE9PSB0cnVlICYmICh0aGlzLnNob3dTZWFyY2hJbnB1dCA9PT0gZmFsc2UgfHwgIXRoaXMub3BlbmVkKCkpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZ1bmN0aW9uIHBvc3RSZW5kZXIoKSB7XHJcbiAgICAgICAgICAgICAgICBzZWFyY2gucmVtb3ZlQ2xhc3MoXCJzZWxlY3QyLWFjdGl2ZVwiKTtcclxuICAgICAgICAgICAgICAgIHNlbGYucG9zaXRpb25Ecm9wZG93bigpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBmdW5jdGlvbiByZW5kZXIoaHRtbCkge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0cy5odG1sKGh0bWwpO1xyXG4gICAgICAgICAgICAgICAgcG9zdFJlbmRlcigpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBxdWVyeU51bWJlciA9ICsrdGhpcy5xdWVyeUNvdW50O1xyXG5cclxuICAgICAgICAgICAgdmFyIG1heFNlbFNpemUgPSB0aGlzLmdldE1heGltdW1TZWxlY3Rpb25TaXplKCk7XHJcbiAgICAgICAgICAgIGlmIChtYXhTZWxTaXplID49MSkge1xyXG4gICAgICAgICAgICAgICAgZGF0YSA9IHRoaXMuZGF0YSgpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCQuaXNBcnJheShkYXRhKSAmJiBkYXRhLmxlbmd0aCA+PSBtYXhTZWxTaXplICYmIGNoZWNrRm9ybWF0dGVyKG9wdHMuZm9ybWF0U2VsZWN0aW9uVG9vQmlnLCBcImZvcm1hdFNlbGVjdGlvblRvb0JpZ1wiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlbmRlcihcIjxsaSBjbGFzcz0nc2VsZWN0Mi1zZWxlY3Rpb24tbGltaXQnPlwiICsgb3B0cy5mb3JtYXRTZWxlY3Rpb25Ub29CaWcobWF4U2VsU2l6ZSkgKyBcIjwvbGk+XCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHNlYXJjaC52YWwoKS5sZW5ndGggPCBvcHRzLm1pbmltdW1JbnB1dExlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNoZWNrRm9ybWF0dGVyKG9wdHMuZm9ybWF0SW5wdXRUb29TaG9ydCwgXCJmb3JtYXRJbnB1dFRvb1Nob3J0XCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyKFwiPGxpIGNsYXNzPSdzZWxlY3QyLW5vLXJlc3VsdHMnPlwiICsgb3B0cy5mb3JtYXRJbnB1dFRvb1Nob3J0KHNlYXJjaC52YWwoKSwgb3B0cy5taW5pbXVtSW5wdXRMZW5ndGgpICsgXCI8L2xpPlwiKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyKFwiXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGluaXRpYWwgJiYgdGhpcy5zaG93U2VhcmNoKSB0aGlzLnNob3dTZWFyY2godHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChvcHRzLm1heGltdW1JbnB1dExlbmd0aCAmJiBzZWFyY2gudmFsKCkubGVuZ3RoID4gb3B0cy5tYXhpbXVtSW5wdXRMZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIGlmIChjaGVja0Zvcm1hdHRlcihvcHRzLmZvcm1hdElucHV0VG9vTG9uZywgXCJmb3JtYXRJbnB1dFRvb0xvbmdcIikpIHtcclxuICAgICAgICAgICAgICAgICAgICByZW5kZXIoXCI8bGkgY2xhc3M9J3NlbGVjdDItbm8tcmVzdWx0cyc+XCIgKyBvcHRzLmZvcm1hdElucHV0VG9vTG9uZyhzZWFyY2gudmFsKCksIG9wdHMubWF4aW11bUlucHV0TGVuZ3RoKSArIFwiPC9saT5cIik7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlbmRlcihcIlwiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKG9wdHMuZm9ybWF0U2VhcmNoaW5nICYmIHRoaXMuZmluZEhpZ2hsaWdodGFibGVDaG9pY2VzKCkubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICByZW5kZXIoXCI8bGkgY2xhc3M9J3NlbGVjdDItc2VhcmNoaW5nJz5cIiArIG9wdHMuZm9ybWF0U2VhcmNoaW5nKCkgKyBcIjwvbGk+XCIpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBzZWFyY2guYWRkQ2xhc3MoXCJzZWxlY3QyLWFjdGl2ZVwiKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlSGlnaGxpZ2h0KCk7XHJcblxyXG4gICAgICAgICAgICAvLyBnaXZlIHRoZSB0b2tlbml6ZXIgYSBjaGFuY2UgdG8gcHJlLXByb2Nlc3MgdGhlIGlucHV0XHJcbiAgICAgICAgICAgIGlucHV0ID0gdGhpcy50b2tlbml6ZSgpO1xyXG4gICAgICAgICAgICBpZiAoaW5wdXQgIT0gdW5kZWZpbmVkICYmIGlucHV0ICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHNlYXJjaC52YWwoaW5wdXQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLnJlc3VsdHNQYWdlID0gMTtcclxuXHJcbiAgICAgICAgICAgIG9wdHMucXVlcnkoe1xyXG4gICAgICAgICAgICAgICAgZWxlbWVudDogb3B0cy5lbGVtZW50LFxyXG4gICAgICAgICAgICAgICAgICAgIHRlcm06IHNlYXJjaC52YWwoKSxcclxuICAgICAgICAgICAgICAgICAgICBwYWdlOiB0aGlzLnJlc3VsdHNQYWdlLFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcjogb3B0cy5tYXRjaGVyLFxyXG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrOiB0aGlzLmJpbmQoZnVuY3Rpb24gKGRhdGEpIHtcclxuICAgICAgICAgICAgICAgIHZhciBkZWY7IC8vIGRlZmF1bHQgY2hvaWNlXHJcblxyXG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIG9sZCByZXNwb25zZXNcclxuICAgICAgICAgICAgICAgIGlmIChxdWVyeU51bWJlciAhPSB0aGlzLnF1ZXJ5Q291bnQpIHtcclxuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBhIHJlc3BvbnNlIGlmIHRoZSBzZWxlY3QyIGhhcyBiZWVuIGNsb3NlZCBiZWZvcmUgaXQgd2FzIHJlY2VpdmVkXHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3BlbmVkKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaC5yZW1vdmVDbGFzcyhcInNlbGVjdDItYWN0aXZlXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyBzYXZlIGNvbnRleHQsIGlmIGFueVxyXG4gICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0ID0gKGRhdGEuY29udGV4dD09PXVuZGVmaW5lZCkgPyBudWxsIDogZGF0YS5jb250ZXh0O1xyXG4gICAgICAgICAgICAgICAgLy8gY3JlYXRlIGEgZGVmYXVsdCBjaG9pY2UgYW5kIHByZXBlbmQgaXQgdG8gdGhlIGxpc3RcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdHMuY3JlYXRlU2VhcmNoQ2hvaWNlICYmIHNlYXJjaC52YWwoKSAhPT0gXCJcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIGRlZiA9IHRoaXMub3B0cy5jcmVhdGVTZWFyY2hDaG9pY2UuY2FsbChzZWxmLCBzZWFyY2gudmFsKCksIGRhdGEucmVzdWx0cyk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRlZiAhPT0gdW5kZWZpbmVkICYmIGRlZiAhPT0gbnVsbCAmJiBzZWxmLmlkKGRlZikgIT09IHVuZGVmaW5lZCAmJiBzZWxmLmlkKGRlZikgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCQoZGF0YS5yZXN1bHRzKS5maWx0ZXIoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVxdWFsKHNlbGYuaWQodGhpcyksIHNlbGYuaWQoZGVmKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEucmVzdWx0cy51bnNoaWZ0KGRlZik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGRhdGEucmVzdWx0cy5sZW5ndGggPT09IDAgJiYgY2hlY2tGb3JtYXR0ZXIob3B0cy5mb3JtYXROb01hdGNoZXMsIFwiZm9ybWF0Tm9NYXRjaGVzXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyKFwiPGxpIGNsYXNzPSdzZWxlY3QyLW5vLXJlc3VsdHMnPlwiICsgb3B0cy5mb3JtYXROb01hdGNoZXMoc2VhcmNoLnZhbCgpKSArIFwiPC9saT5cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHJlc3VsdHMuZW1wdHkoKTtcclxuICAgICAgICAgICAgICAgIHNlbGYub3B0cy5wb3B1bGF0ZVJlc3VsdHMuY2FsbCh0aGlzLCByZXN1bHRzLCBkYXRhLnJlc3VsdHMsIHt0ZXJtOiBzZWFyY2gudmFsKCksIHBhZ2U6IHRoaXMucmVzdWx0c1BhZ2UsIGNvbnRleHQ6bnVsbH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChkYXRhLm1vcmUgPT09IHRydWUgJiYgY2hlY2tGb3JtYXR0ZXIob3B0cy5mb3JtYXRMb2FkTW9yZSwgXCJmb3JtYXRMb2FkTW9yZVwiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKFwiPGxpIGNsYXNzPSdzZWxlY3QyLW1vcmUtcmVzdWx0cyc+XCIgKyBzZWxmLm9wdHMuZXNjYXBlTWFya3VwKG9wdHMuZm9ybWF0TG9hZE1vcmUodGhpcy5yZXN1bHRzUGFnZSkpICsgXCI8L2xpPlwiKTtcclxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpIHsgc2VsZi5sb2FkTW9yZUlmTmVlZGVkKCk7IH0sIDEwKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnBvc3Rwcm9jZXNzUmVzdWx0cyhkYXRhLCBpbml0aWFsKTtcclxuXHJcbiAgICAgICAgICAgICAgICBwb3N0UmVuZGVyKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5vcHRzLmVsZW1lbnQudHJpZ2dlcih7IHR5cGU6IFwic2VsZWN0Mi1sb2FkZWRcIiwgaXRlbXM6IGRhdGEgfSk7XHJcbiAgICAgICAgICAgIH0pfSk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gYWJzdHJhY3RcclxuICAgICAgICBjYW5jZWw6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIGFic3RyYWN0XHJcbiAgICAgICAgYmx1cjogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAvLyBpZiBzZWxlY3RPbkJsdXIgPT0gdHJ1ZSwgc2VsZWN0IHRoZSBjdXJyZW50bHkgaGlnaGxpZ2h0ZWQgb3B0aW9uXHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdHMuc2VsZWN0T25CbHVyKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RIaWdobGlnaHRlZCh7bm9Gb2N1czogdHJ1ZX0pO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5yZW1vdmVDbGFzcyhcInNlbGVjdDItY29udGFpbmVyLWFjdGl2ZVwiKTtcclxuICAgICAgICAgICAgLy8gc3lub255bW91cyB0byAuaXMoJzpmb2N1cycpLCB3aGljaCBpcyBhdmFpbGFibGUgaW4ganF1ZXJ5ID49IDEuNlxyXG4gICAgICAgICAgICBpZiAodGhpcy5zZWFyY2hbMF0gPT09IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpIHsgdGhpcy5zZWFyY2guYmx1cigpOyB9XHJcbiAgICAgICAgICAgIHRoaXMuY2xlYXJTZWFyY2goKTtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uZmluZChcIi5zZWxlY3QyLXNlYXJjaC1jaG9pY2UtZm9jdXNcIikucmVtb3ZlQ2xhc3MoXCJzZWxlY3QyLXNlYXJjaC1jaG9pY2UtZm9jdXNcIik7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gYWJzdHJhY3RcclxuICAgICAgICBmb2N1c1NlYXJjaDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBmb2N1cyh0aGlzLnNlYXJjaCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gYWJzdHJhY3RcclxuICAgICAgICBzZWxlY3RIaWdobGlnaHRlZDogZnVuY3Rpb24gKG9wdGlvbnMpIHtcclxuICAgICAgICAgICAgdmFyIGluZGV4PXRoaXMuaGlnaGxpZ2h0KCksXHJcbiAgICAgICAgICAgICAgICBoaWdobGlnaHRlZD10aGlzLnJlc3VsdHMuZmluZChcIi5zZWxlY3QyLWhpZ2hsaWdodGVkXCIpLFxyXG4gICAgICAgICAgICAgICAgZGF0YSA9IGhpZ2hsaWdodGVkLmNsb3Nlc3QoJy5zZWxlY3QyLXJlc3VsdCcpLmRhdGEoXCJzZWxlY3QyLWRhdGFcIik7XHJcblxyXG4gICAgICAgICAgICBpZiAoZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5oaWdobGlnaHQoaW5kZXgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vblNlbGVjdChkYXRhLCBvcHRpb25zKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zICYmIG9wdGlvbnMubm9Gb2N1cykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gYWJzdHJhY3RcclxuICAgICAgICBnZXRQbGFjZWhvbGRlcjogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgcGxhY2Vob2xkZXJPcHRpb247XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm9wdHMuZWxlbWVudC5hdHRyKFwicGxhY2Vob2xkZXJcIikgfHxcclxuICAgICAgICAgICAgICAgIHRoaXMub3B0cy5lbGVtZW50LmF0dHIoXCJkYXRhLXBsYWNlaG9sZGVyXCIpIHx8IC8vIGpxdWVyeSAxLjQgY29tcGF0XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9wdHMuZWxlbWVudC5kYXRhKFwicGxhY2Vob2xkZXJcIikgfHxcclxuICAgICAgICAgICAgICAgIHRoaXMub3B0cy5wbGFjZWhvbGRlciB8fFxyXG4gICAgICAgICAgICAgICAgKChwbGFjZWhvbGRlck9wdGlvbiA9IHRoaXMuZ2V0UGxhY2Vob2xkZXJPcHRpb24oKSkgIT09IHVuZGVmaW5lZCA/IHBsYWNlaG9sZGVyT3B0aW9uLnRleHQoKSA6IHVuZGVmaW5lZCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gYWJzdHJhY3RcclxuICAgICAgICBnZXRQbGFjZWhvbGRlck9wdGlvbjogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGZpcnN0T3B0aW9uID0gdGhpcy5zZWxlY3QuY2hpbGRyZW4oKS5maXJzdCgpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0cy5wbGFjZWhvbGRlck9wdGlvbiAhPT0gdW5kZWZpbmVkICkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vRGV0ZXJtaW5lIHRoZSBwbGFjZWhvbGRlciBvcHRpb24gYmFzZWQgb24gdGhlIHNwZWNpZmllZCBwbGFjZWhvbGRlck9wdGlvbiBzZXR0aW5nXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh0aGlzLm9wdHMucGxhY2Vob2xkZXJPcHRpb24gPT09IFwiZmlyc3RcIiAmJiBmaXJzdE9wdGlvbikgfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgKHR5cGVvZiB0aGlzLm9wdHMucGxhY2Vob2xkZXJPcHRpb24gPT09IFwiZnVuY3Rpb25cIiAmJiB0aGlzLm9wdHMucGxhY2Vob2xkZXJPcHRpb24odGhpcy5zZWxlY3QpKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmlyc3RPcHRpb24udGV4dCgpID09PSBcIlwiICYmIGZpcnN0T3B0aW9uLnZhbCgpID09PSBcIlwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9ObyBleHBsaWNpdCBwbGFjZWhvbGRlciBvcHRpb24gc3BlY2lmaWVkLCB1c2UgdGhlIGZpcnN0IGlmIGl0J3MgYmxhbmtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlyc3RPcHRpb247XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBHZXQgdGhlIGRlc2lyZWQgd2lkdGggZm9yIHRoZSBjb250YWluZXIgZWxlbWVudC4gIFRoaXMgaXNcclxuICAgICAgICAgKiBkZXJpdmVkIGZpcnN0IGZyb20gb3B0aW9uIGB3aWR0aGAgcGFzc2VkIHRvIHNlbGVjdDIsIHRoZW5cclxuICAgICAgICAgKiB0aGUgaW5saW5lICdzdHlsZScgb24gdGhlIG9yaWdpbmFsIGVsZW1lbnQsIGFuZCBmaW5hbGx5XHJcbiAgICAgICAgICogZmFsbHMgYmFjayB0byB0aGUgalF1ZXJ5IGNhbGN1bGF0ZWQgZWxlbWVudCB3aWR0aC5cclxuICAgICAgICAgKi9cclxuICAgICAgICAvLyBhYnN0cmFjdFxyXG4gICAgICAgIGluaXRDb250YWluZXJXaWR0aDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBmdW5jdGlvbiByZXNvbHZlQ29udGFpbmVyV2lkdGgoKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgc3R5bGUsIGF0dHJzLCBtYXRjaGVzLCBpLCBsO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdHMud2lkdGggPT09IFwib2ZmXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5vcHRzLndpZHRoID09PSBcImVsZW1lbnRcIil7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub3B0cy5lbGVtZW50Lm91dGVyV2lkdGgoZmFsc2UpID09PSAwID8gJ2F1dG8nIDogdGhpcy5vcHRzLmVsZW1lbnQub3V0ZXJXaWR0aChmYWxzZSkgKyAncHgnO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm9wdHMud2lkdGggPT09IFwiY29weVwiIHx8IHRoaXMub3B0cy53aWR0aCA9PT0gXCJyZXNvbHZlXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiB0aGVyZSBpcyBpbmxpbmUgc3R5bGUgb24gdGhlIGVsZW1lbnQgdGhhdCBjb250YWlucyB3aWR0aFxyXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlID0gdGhpcy5vcHRzLmVsZW1lbnQuYXR0cignc3R5bGUnKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRycyA9IHN0eWxlLnNwbGl0KCc7Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDAsIGwgPSBhdHRycy5sZW5ndGg7IGkgPCBsOyBpID0gaSArIDEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZXMgPSBhdHRyc1tpXS5yZXBsYWNlKC9cXHMvZywgJycpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hdGNoKC9bXi1dd2lkdGg6KChbLStdPyhbMC05XSpcXC4pP1swLTldKykocHh8ZW18ZXh8JXxpbnxjbXxtbXxwdHxwYykpL2kpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoZXMgIT09IG51bGwgJiYgbWF0Y2hlcy5sZW5ndGggPj0gMSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2hlc1sxXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0cy53aWR0aCA9PT0gXCJyZXNvbHZlXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV4dCBjaGVjayBpZiBjc3MoJ3dpZHRoJykgY2FuIHJlc29sdmUgYSB3aWR0aCB0aGF0IGlzIHBlcmNlbnQgYmFzZWQsIHRoaXMgaXMgc29tZXRpbWVzIHBvc3NpYmxlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gYXR0YWNoZWQgdG8gaW5wdXQgdHlwZT1oaWRkZW4gb3IgZWxlbWVudHMgaGlkZGVuIHZpYSBjc3NcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUgPSB0aGlzLm9wdHMuZWxlbWVudC5jc3MoJ3dpZHRoJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZS5pbmRleE9mKFwiJVwiKSA+IDApIHJldHVybiBzdHlsZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbmFsbHksIGZhbGxiYWNrIG9uIHRoZSBjYWxjdWxhdGVkIHdpZHRoIG9mIHRoZSBlbGVtZW50XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAodGhpcy5vcHRzLmVsZW1lbnQub3V0ZXJXaWR0aChmYWxzZSkgPT09IDAgPyAnYXV0bycgOiB0aGlzLm9wdHMuZWxlbWVudC5vdXRlcldpZHRoKGZhbHNlKSArICdweCcpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCQuaXNGdW5jdGlvbih0aGlzLm9wdHMud2lkdGgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub3B0cy53aWR0aCgpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vcHRzLndpZHRoO1xyXG4gICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICB2YXIgd2lkdGggPSByZXNvbHZlQ29udGFpbmVyV2lkdGguY2FsbCh0aGlzKTtcclxuICAgICAgICAgICAgaWYgKHdpZHRoICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5jc3MoXCJ3aWR0aFwiLCB3aWR0aCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBTaW5nbGVTZWxlY3QyID0gY2xhenooQWJzdHJhY3RTZWxlY3QyLCB7XHJcblxyXG4gICAgICAgIC8vIHNpbmdsZVxyXG5cclxuICAgICAgICBjcmVhdGVDb250YWluZXI6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIGNvbnRhaW5lciA9ICQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSkuYXR0cih7XHJcbiAgICAgICAgICAgICAgICBcImNsYXNzXCI6IFwic2VsZWN0Mi1jb250YWluZXJcIlxyXG4gICAgICAgICAgICB9KS5odG1sKFtcclxuICAgICAgICAgICAgICAgIFwiPGEgaHJlZj0namF2YXNjcmlwdDp2b2lkKDApJyBvbmNsaWNrPSdyZXR1cm4gZmFsc2U7JyBjbGFzcz0nc2VsZWN0Mi1jaG9pY2UnIHRhYmluZGV4PSctMSc+XCIsXHJcbiAgICAgICAgICAgICAgICBcIiAgIDxzcGFuIGNsYXNzPSdzZWxlY3QyLWNob3Nlbic+Jm5ic3A7PC9zcGFuPjxhYmJyIGNsYXNzPSdzZWxlY3QyLXNlYXJjaC1jaG9pY2UtY2xvc2UnPjwvYWJicj5cIixcclxuICAgICAgICAgICAgICAgIFwiICAgPHNwYW4gY2xhc3M9J3NlbGVjdDItYXJyb3cnPjxpIGNsYXNzPSdmYSBmYS1zb3J0IGJyYW5kLWluZm8gc2VsZWN0Mi1mYSc+PC9pPjwvc3Bhbj5cIixcclxuICAgICAgICAgICAgICAgIFwiPC9hPlwiLFxyXG4gICAgICAgICAgICAgICAgXCI8aW5wdXQgY2xhc3M9J3NlbGVjdDItZm9jdXNzZXIgc2VsZWN0Mi1vZmZzY3JlZW4nIHR5cGU9J3RleHQnLz5cIixcclxuICAgICAgICAgICAgICAgIFwiPGRpdiBjbGFzcz0nc2VsZWN0Mi1kcm9wIHNlbGVjdDItZGlzcGxheS1ub25lJz5cIixcclxuICAgICAgICAgICAgICAgIFwiICAgPGRpdiBjbGFzcz0nc2VsZWN0Mi1zZWFyY2gnPlwiLFxyXG4gICAgICAgICAgICAgICAgXCIgICAgICAgPGlucHV0IHR5cGU9J3RleHQnIGF1dG9jb21wbGV0ZT0nb2ZmJyBhdXRvY29ycmVjdD0nb2ZmJyBhdXRvY2FwaXRhbGl6ZT0nb2ZmJyBzcGVsbGNoZWNrPSdmYWxzZScgY2xhc3M9J3NlbGVjdDItaW5wdXQnLz5cIixcclxuICAgICAgICAgICAgICAgIFwiICAgPC9kaXY+XCIsXHJcbiAgICAgICAgICAgICAgICBcIiAgIDx1bCBjbGFzcz0nc2VsZWN0Mi1yZXN1bHRzJz5cIixcclxuICAgICAgICAgICAgICAgIFwiICAgPC91bD5cIixcclxuICAgICAgICAgICAgICAgIFwiPC9kaXY+XCJdLmpvaW4oXCJcIikpO1xyXG4gICAgICAgICAgICByZXR1cm4gY29udGFpbmVyO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIHNpbmdsZVxyXG4gICAgICAgIGVuYWJsZUludGVyZmFjZTogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnBhcmVudC5lbmFibGVJbnRlcmZhY2UuYXBwbHkodGhpcywgYXJndW1lbnRzKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5mb2N1c3Nlci5wcm9wKFwiZGlzYWJsZWRcIiwgIXRoaXMuaXNJbnRlcmZhY2VFbmFibGVkKCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gc2luZ2xlXHJcbiAgICAgICAgb3BlbmluZzogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgZWwsIHJhbmdlLCBsZW47XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5vcHRzLm1pbmltdW1SZXN1bHRzRm9yU2VhcmNoID49IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2hvd1NlYXJjaCh0cnVlKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5wYXJlbnQub3BlbmluZy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuc2hvd1NlYXJjaElucHV0ICE9PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgICAgLy8gSUUgYXBwZW5kcyBmb2N1c3Nlci52YWwoKSBhdCB0aGUgZW5kIG9mIGZpZWxkIDovIHNvIHdlIG1hbnVhbGx5IGluc2VydCBpdCBhdCB0aGUgYmVnaW5uaW5nIHVzaW5nIGEgcmFuZ2VcclxuICAgICAgICAgICAgICAgIC8vIGFsbCBvdGhlciBicm93c2VycyBoYW5kbGUgdGhpcyBqdXN0IGZpbmVcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaC52YWwodGhpcy5mb2N1c3Nlci52YWwoKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5zZWFyY2guZm9jdXMoKTtcclxuICAgICAgICAgICAgLy8gbW92ZSB0aGUgY3Vyc29yIHRvIHRoZSBlbmQgYWZ0ZXIgZm9jdXNzaW5nLCBvdGhlcndpc2UgaXQgd2lsbCBiZSBhdCB0aGUgYmVnaW5uaW5nIGFuZFxyXG4gICAgICAgICAgICAvLyBuZXcgdGV4dCB3aWxsIGFwcGVhciAqYmVmb3JlKiBmb2N1c3Nlci52YWwoKVxyXG4gICAgICAgICAgICBlbCA9IHRoaXMuc2VhcmNoLmdldCgwKTtcclxuICAgICAgICAgICAgaWYgKGVsLmNyZWF0ZVRleHRSYW5nZSkge1xyXG4gICAgICAgICAgICAgICAgcmFuZ2UgPSBlbC5jcmVhdGVUZXh0UmFuZ2UoKTtcclxuICAgICAgICAgICAgICAgIHJhbmdlLmNvbGxhcHNlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIHJhbmdlLnNlbGVjdCgpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVsLnNldFNlbGVjdGlvblJhbmdlKSB7XHJcbiAgICAgICAgICAgICAgICBsZW4gPSB0aGlzLnNlYXJjaC52YWwoKS5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICBlbC5zZXRTZWxlY3Rpb25SYW5nZShsZW4sIGxlbik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIGluaXRpYWxpemVzIHNlYXJjaCdzIHZhbHVlIHdpdGggbmV4dFNlYXJjaFRlcm0gKGlmIGRlZmluZWQgYnkgdXNlcilcclxuICAgICAgICAgICAgLy8gaWdub3JlIG5leHRTZWFyY2hUZXJtIGlmIHRoZSBkcm9wZG93biBpcyBvcGVuZWQgYnkgdGhlIHVzZXIgcHJlc3NpbmcgYSBsZXR0ZXJcclxuICAgICAgICAgICAgaWYodGhpcy5zZWFyY2gudmFsKCkgPT09IFwiXCIpIHtcclxuICAgICAgICAgICAgICAgIGlmKHRoaXMubmV4dFNlYXJjaFRlcm0gIT0gdW5kZWZpbmVkKXtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaC52YWwodGhpcy5uZXh0U2VhcmNoVGVybSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWFyY2guc2VsZWN0KCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuZm9jdXNzZXIucHJvcChcImRpc2FibGVkXCIsIHRydWUpLnZhbChcIlwiKTtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVSZXN1bHRzKHRydWUpO1xyXG4gICAgICAgICAgICB0aGlzLm9wdHMuZWxlbWVudC50cmlnZ2VyKCQuRXZlbnQoXCJzZWxlY3QyLW9wZW5cIikpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIHNpbmdsZVxyXG4gICAgICAgIGNsb3NlOiBmdW5jdGlvbiAocGFyYW1zKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5vcGVuZWQoKSkgcmV0dXJuO1xyXG4gICAgICAgICAgICB0aGlzLnBhcmVudC5jbG9zZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG5cclxuICAgICAgICAgICAgcGFyYW1zID0gcGFyYW1zIHx8IHtmb2N1czogdHJ1ZX07XHJcbiAgICAgICAgICAgIHRoaXMuZm9jdXNzZXIucmVtb3ZlQXR0cihcImRpc2FibGVkXCIpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHBhcmFtcy5mb2N1cykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5mb2N1c3Nlci5mb2N1cygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gc2luZ2xlXHJcbiAgICAgICAgZm9jdXM6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMub3BlbmVkKCkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZm9jdXNzZXIucmVtb3ZlQXR0cihcImRpc2FibGVkXCIpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5mb2N1c3Nlci5mb2N1cygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gc2luZ2xlXHJcbiAgICAgICAgaXNGb2N1c2VkOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5lci5oYXNDbGFzcyhcInNlbGVjdDItY29udGFpbmVyLWFjdGl2ZVwiKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBzaW5nbGVcclxuICAgICAgICBjYW5jZWw6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdGhpcy5wYXJlbnQuY2FuY2VsLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XHJcbiAgICAgICAgICAgIHRoaXMuZm9jdXNzZXIucmVtb3ZlQXR0cihcImRpc2FibGVkXCIpO1xyXG4gICAgICAgICAgICB0aGlzLmZvY3Vzc2VyLmZvY3VzKCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gc2luZ2xlXHJcbiAgICAgICAgZGVzdHJveTogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICQoXCJsYWJlbFtmb3I9J1wiICsgdGhpcy5mb2N1c3Nlci5hdHRyKCdpZCcpICsgXCInXVwiKVxyXG4gICAgICAgICAgICAgICAgLmF0dHIoJ2ZvcicsIHRoaXMub3B0cy5lbGVtZW50LmF0dHIoXCJpZFwiKSk7XHJcbiAgICAgICAgICAgIHRoaXMucGFyZW50LmRlc3Ryb3kuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBzaW5nbGVcclxuICAgICAgICBpbml0Q29udGFpbmVyOiBmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgICAgICAgICB2YXIgc2VsZWN0aW9uLFxyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyID0gdGhpcy5jb250YWluZXIsXHJcbiAgICAgICAgICAgICAgICBkcm9wZG93biA9IHRoaXMuZHJvcGRvd247XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5vcHRzLm1pbmltdW1SZXN1bHRzRm9yU2VhcmNoIDwgMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zaG93U2VhcmNoKGZhbHNlKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2hvd1NlYXJjaCh0cnVlKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb24gPSBjb250YWluZXIuZmluZChcIi5zZWxlY3QyLWNob2ljZVwiKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZm9jdXNzZXIgPSBjb250YWluZXIuZmluZChcIi5zZWxlY3QyLWZvY3Vzc2VyXCIpO1xyXG5cclxuICAgICAgICAgICAgLy8gcmV3cml0ZSBsYWJlbHMgZnJvbSBvcmlnaW5hbCBlbGVtZW50IHRvIGZvY3Vzc2VyXHJcbiAgICAgICAgICAgIHRoaXMuZm9jdXNzZXIuYXR0cihcImlkXCIsIFwiczJpZF9hdXRvZ2VuXCIrbmV4dFVpZCgpKTtcclxuXHJcbiAgICAgICAgICAgICQoXCJsYWJlbFtmb3I9J1wiICsgdGhpcy5vcHRzLmVsZW1lbnQuYXR0cihcImlkXCIpICsgXCInXVwiKVxyXG4gICAgICAgICAgICAgICAgLmF0dHIoJ2ZvcicsIHRoaXMuZm9jdXNzZXIuYXR0cignaWQnKSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmZvY3Vzc2VyLmF0dHIoXCJ0YWJpbmRleFwiLCB0aGlzLmVsZW1lbnRUYWJJbmRleCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNlYXJjaC5vbihcImtleWRvd25cIiwgdGhpcy5iaW5kKGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNJbnRlcmZhY2VFbmFibGVkKCkpIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZS53aGljaCA9PT0gS0VZLlBBR0VfVVAgfHwgZS53aGljaCA9PT0gS0VZLlBBR0VfRE9XTikge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHByZXZlbnQgdGhlIHBhZ2UgZnJvbSBzY3JvbGxpbmdcclxuICAgICAgICAgICAgICAgICAgICBraWxsRXZlbnQoZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHN3aXRjaCAoZS53aGljaCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgS0VZLlVQOlxyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgS0VZLkRPV046XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW92ZUhpZ2hsaWdodCgoZS53aGljaCA9PT0gS0VZLlVQKSA/IC0xIDogMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGtpbGxFdmVudChlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgS0VZLkVOVEVSOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdEhpZ2hsaWdodGVkKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGtpbGxFdmVudChlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgS0VZLlRBQjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgc2VsZWN0T25CbHVyID09IHRydWUsIHNlbGVjdCB0aGUgY3VycmVudGx5IGhpZ2hsaWdodGVkIG9wdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRzLnNlbGVjdE9uQmx1cikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RIaWdobGlnaHRlZCh7bm9Gb2N1czogdHJ1ZX0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIEtFWS5FU0M6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2FuY2VsKGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBraWxsRXZlbnQoZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSkpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5zZWFyY2gub24oXCJibHVyXCIsIHRoaXMuYmluZChmdW5jdGlvbihlKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBhIHdvcmthcm91bmQgZm9yIGNocm9tZSB0byBrZWVwIHRoZSBzZWFyY2ggZmllbGQgZm9jdXNzZWQgd2hlbiB0aGUgc2Nyb2xsIGJhciBpcyB1c2VkIHRvIHNjcm9sbCB0aGUgZHJvcGRvd24uXHJcbiAgICAgICAgICAgICAgICAvLyB3aXRob3V0IHRoaXMgdGhlIHNlYXJjaCBmaWVsZCBsb3NlcyBmb2N1cyB3aGljaCBpcyBhbm5veWluZ1xyXG4gICAgICAgICAgICAgICAgaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IHRoaXMuYm9keSgpLmdldCgwKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYmluZChmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWFyY2guZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgICAgICB9KSwgMCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZm9jdXNzZXIub24oXCJrZXlkb3duXCIsIHRoaXMuYmluZChmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzSW50ZXJmYWNlRW5hYmxlZCgpKSByZXR1cm47XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGUud2hpY2ggPT09IEtFWS5UQUIgfHwgS0VZLmlzQ29udHJvbChlKSB8fCBLRVkuaXNGdW5jdGlvbktleShlKSB8fCBlLndoaWNoID09PSBLRVkuRVNDKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdHMub3Blbk9uRW50ZXIgPT09IGZhbHNlICYmIGUud2hpY2ggPT09IEtFWS5FTlRFUikge1xyXG4gICAgICAgICAgICAgICAgICAgIGtpbGxFdmVudChlKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGUud2hpY2ggPT0gS0VZLkRPV04gfHwgZS53aGljaCA9PSBLRVkuVVBcclxuICAgICAgICAgICAgICAgICAgICB8fCAoZS53aGljaCA9PSBLRVkuRU5URVIgJiYgdGhpcy5vcHRzLm9wZW5PbkVudGVyKSkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoZS5hbHRLZXkgfHwgZS5jdHJsS2V5IHx8IGUuc2hpZnRLZXkgfHwgZS5tZXRhS2V5KSByZXR1cm47XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3BlbigpO1xyXG4gICAgICAgICAgICAgICAgICAgIGtpbGxFdmVudChlKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGUud2hpY2ggPT0gS0VZLkRFTEVURSB8fCBlLndoaWNoID09IEtFWS5CQUNLU1BBQ0UpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRzLmFsbG93Q2xlYXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGVhcigpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBraWxsRXZlbnQoZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KSk7XHJcblxyXG5cclxuICAgICAgICAgICAgaW5zdGFsbEtleVVwQ2hhbmdlRXZlbnQodGhpcy5mb2N1c3Nlcik7XHJcbiAgICAgICAgICAgIHRoaXMuZm9jdXNzZXIub24oXCJrZXl1cC1jaGFuZ2UgaW5wdXRcIiwgdGhpcy5iaW5kKGZ1bmN0aW9uKGUpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdHMubWluaW11bVJlc3VsdHNGb3JTZWFyY2ggPj0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3BlbmVkKCkpIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wZW4oKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSkpO1xyXG5cclxuICAgICAgICAgICAgc2VsZWN0aW9uLm9uKFwibW91c2Vkb3duXCIsIFwiYWJiclwiLCB0aGlzLmJpbmQoZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc0ludGVyZmFjZUVuYWJsZWQoKSkgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jbGVhcigpO1xyXG4gICAgICAgICAgICAgICAga2lsbEV2ZW50SW1tZWRpYXRlbHkoZSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5mb2N1cygpO1xyXG4gICAgICAgICAgICB9KSk7XHJcblxyXG4gICAgICAgICAgICBzZWxlY3Rpb24ub24oXCJtb3VzZWRvd25cIiwgdGhpcy5iaW5kKGZ1bmN0aW9uIChlKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmNvbnRhaW5lci5oYXNDbGFzcyhcInNlbGVjdDItY29udGFpbmVyLWFjdGl2ZVwiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3B0cy5lbGVtZW50LnRyaWdnZXIoJC5FdmVudChcInNlbGVjdDItZm9jdXNcIikpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wZW5lZCgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzSW50ZXJmYWNlRW5hYmxlZCgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcGVuKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAga2lsbEV2ZW50KGUpO1xyXG4gICAgICAgICAgICB9KSk7XHJcblxyXG4gICAgICAgICAgICBkcm9wZG93bi5vbihcIm1vdXNlZG93blwiLCB0aGlzLmJpbmQoZnVuY3Rpb24oKSB7IHRoaXMuc2VhcmNoLmZvY3VzKCk7IH0pKTtcclxuXHJcbiAgICAgICAgICAgIHNlbGVjdGlvbi5vbihcImZvY3VzXCIsIHRoaXMuYmluZChmdW5jdGlvbihlKSB7XHJcbiAgICAgICAgICAgICAgICBraWxsRXZlbnQoZSk7XHJcbiAgICAgICAgICAgIH0pKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZm9jdXNzZXIub24oXCJmb2N1c1wiLCB0aGlzLmJpbmQoZnVuY3Rpb24oKXtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5jb250YWluZXIuaGFzQ2xhc3MoXCJzZWxlY3QyLWNvbnRhaW5lci1hY3RpdmVcIikpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdHMuZWxlbWVudC50cmlnZ2VyKCQuRXZlbnQoXCJzZWxlY3QyLWZvY3VzXCIpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLmFkZENsYXNzKFwic2VsZWN0Mi1jb250YWluZXItYWN0aXZlXCIpO1xyXG4gICAgICAgICAgICB9KSkub24oXCJibHVyXCIsIHRoaXMuYmluZChmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcGVuZWQoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLnJlbW92ZUNsYXNzKFwic2VsZWN0Mi1jb250YWluZXItYWN0aXZlXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3B0cy5lbGVtZW50LnRyaWdnZXIoJC5FdmVudChcInNlbGVjdDItYmx1clwiKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgdGhpcy5zZWFyY2gub24oXCJmb2N1c1wiLCB0aGlzLmJpbmQoZnVuY3Rpb24oKXtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5jb250YWluZXIuaGFzQ2xhc3MoXCJzZWxlY3QyLWNvbnRhaW5lci1hY3RpdmVcIikpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdHMuZWxlbWVudC50cmlnZ2VyKCQuRXZlbnQoXCJzZWxlY3QyLWZvY3VzXCIpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLmFkZENsYXNzKFwic2VsZWN0Mi1jb250YWluZXItYWN0aXZlXCIpO1xyXG4gICAgICAgICAgICB9KSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmluaXRDb250YWluZXJXaWR0aCgpO1xyXG4gICAgICAgICAgICB0aGlzLm9wdHMuZWxlbWVudC5hZGRDbGFzcyhcInNlbGVjdDItb2Zmc2NyZWVuXCIpO1xyXG4gICAgICAgICAgICB0aGlzLnNldFBsYWNlaG9sZGVyKCk7XHJcblxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIHNpbmdsZVxyXG4gICAgICAgIGNsZWFyOiBmdW5jdGlvbih0cmlnZ2VyQ2hhbmdlKSB7XHJcbiAgICAgICAgICAgIHZhciBkYXRhPXRoaXMuc2VsZWN0aW9uLmRhdGEoXCJzZWxlY3QyLWRhdGFcIik7XHJcbiAgICAgICAgICAgIGlmIChkYXRhKSB7IC8vIGd1YXJkIGFnYWluc3QgcXVldWVkIHF1aWNrIGNvbnNlY3V0aXZlIGNsaWNrc1xyXG4gICAgICAgICAgICAgICAgdmFyIHBsYWNlaG9sZGVyT3B0aW9uID0gdGhpcy5nZXRQbGFjZWhvbGRlck9wdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vcHRzLmVsZW1lbnQudmFsKHBsYWNlaG9sZGVyT3B0aW9uID8gcGxhY2Vob2xkZXJPcHRpb24udmFsKCkgOiBcIlwiKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLmZpbmQoXCIuc2VsZWN0Mi1jaG9zZW5cIikuZW1wdHkoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnJlbW92ZURhdGEoXCJzZWxlY3QyLWRhdGFcIik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldFBsYWNlaG9sZGVyKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHRyaWdnZXJDaGFuZ2UgIT09IGZhbHNlKXtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdHMuZWxlbWVudC50cmlnZ2VyKHsgdHlwZTogXCJzZWxlY3QyLXJlbW92ZWRcIiwgdmFsOiB0aGlzLmlkKGRhdGEpLCBjaG9pY2U6IGRhdGEgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyQ2hhbmdlKHtyZW1vdmVkOmRhdGF9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFNldHMgc2VsZWN0aW9uIGJhc2VkIG9uIHNvdXJjZSBlbGVtZW50J3MgdmFsdWVcclxuICAgICAgICAgKi9cclxuICAgICAgICAvLyBzaW5nbGVcclxuICAgICAgICBpbml0U2VsZWN0aW9uOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBzZWxlY3RlZDtcclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNQbGFjZWhvbGRlck9wdGlvblNlbGVjdGVkKCkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU2VsZWN0aW9uKG51bGwpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRQbGFjZWhvbGRlcigpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vcHRzLmluaXRTZWxlY3Rpb24uY2FsbChudWxsLCB0aGlzLm9wdHMuZWxlbWVudCwgZnVuY3Rpb24oc2VsZWN0ZWQpe1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZCAhPT0gdW5kZWZpbmVkICYmIHNlbGVjdGVkICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlU2VsZWN0aW9uKHNlbGVjdGVkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jbG9zZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFBsYWNlaG9sZGVyKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBpc1BsYWNlaG9sZGVyT3B0aW9uU2VsZWN0ZWQ6IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICB2YXIgcGxhY2Vob2xkZXJPcHRpb247XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5vcHRzLnBsYWNlaG9sZGVyKSByZXR1cm4gZmFsc2U7IC8vIG5vIHBsYWNlaG9sZGVyIHNwZWNpZmllZCBzbyBubyBvcHRpb24gc2hvdWxkIGJlIGNvbnNpZGVyZWRcclxuICAgICAgICAgICAgcmV0dXJuICgocGxhY2Vob2xkZXJPcHRpb24gPSB0aGlzLmdldFBsYWNlaG9sZGVyT3B0aW9uKCkpICE9PSB1bmRlZmluZWQgJiYgcGxhY2Vob2xkZXJPcHRpb24uaXMoJzpzZWxlY3RlZCcpKVxyXG4gICAgICAgICAgICAgICAgfHwgKHRoaXMub3B0cy5lbGVtZW50LnZhbCgpID09PSBcIlwiKVxyXG4gICAgICAgICAgICAgICAgfHwgKHRoaXMub3B0cy5lbGVtZW50LnZhbCgpID09PSB1bmRlZmluZWQpXHJcbiAgICAgICAgICAgICAgICB8fCAodGhpcy5vcHRzLmVsZW1lbnQudmFsKCkgPT09IG51bGwpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIHNpbmdsZVxyXG4gICAgICAgIHByZXBhcmVPcHRzOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBvcHRzID0gdGhpcy5wYXJlbnQucHJlcGFyZU9wdHMuYXBwbHkodGhpcywgYXJndW1lbnRzKSxcclxuICAgICAgICAgICAgICAgIHNlbGY9dGhpcztcclxuXHJcbiAgICAgICAgICAgIGlmIChvcHRzLmVsZW1lbnQuZ2V0KDApLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJzZWxlY3RcIikge1xyXG4gICAgICAgICAgICAgICAgLy8gaW5zdGFsbCB0aGUgc2VsZWN0aW9uIGluaXRpYWxpemVyXHJcbiAgICAgICAgICAgICAgICBvcHRzLmluaXRTZWxlY3Rpb24gPSBmdW5jdGlvbiAoZWxlbWVudCwgY2FsbGJhY2spIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgc2VsZWN0ZWQgPSBlbGVtZW50LmZpbmQoXCI6c2VsZWN0ZWRcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gYSBzaW5nbGUgc2VsZWN0IGJveCBhbHdheXMgaGFzIGEgdmFsdWUsIG5vIG5lZWQgdG8gbnVsbCBjaGVjayAnc2VsZWN0ZWQnXHJcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soc2VsZi5vcHRpb25Ub0RhdGEoc2VsZWN0ZWQpKTtcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXCJkYXRhXCIgaW4gb3B0cykge1xyXG4gICAgICAgICAgICAgICAgLy8gaW5zdGFsbCBkZWZhdWx0IGluaXRTZWxlY3Rpb24gd2hlbiBhcHBsaWVkIHRvIGhpZGRlbiBpbnB1dCBhbmQgZGF0YSBpcyBsb2NhbFxyXG4gICAgICAgICAgICAgICAgb3B0cy5pbml0U2VsZWN0aW9uID0gb3B0cy5pbml0U2VsZWN0aW9uIHx8IGZ1bmN0aW9uIChlbGVtZW50LCBjYWxsYmFjaykge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpZCA9IGVsZW1lbnQudmFsKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9zZWFyY2ggaW4gZGF0YSBieSBpZCwgc3RvcmluZyB0aGUgYWN0dWFsIG1hdGNoaW5nIGl0ZW1cclxuICAgICAgICAgICAgICAgICAgICB2YXIgbWF0Y2ggPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIG9wdHMucXVlcnkoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVyOiBmdW5jdGlvbih0ZXJtLCB0ZXh0LCBlbCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaXNfbWF0Y2ggPSBlcXVhbChpZCwgb3B0cy5pZChlbCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzX21hdGNoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSBlbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpc19tYXRjaDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2s6ICEkLmlzRnVuY3Rpb24oY2FsbGJhY2spID8gJC5ub29wIDogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhtYXRjaCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiBvcHRzO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIHNpbmdsZVxyXG4gICAgICAgIGdldFBsYWNlaG9sZGVyOiBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgLy8gaWYgYSBwbGFjZWhvbGRlciBpcyBzcGVjaWZpZWQgb24gYSBzaW5nbGUgc2VsZWN0IHdpdGhvdXQgYSB2YWxpZCBwbGFjZWhvbGRlciBvcHRpb24gaWdub3JlIGl0XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZ2V0UGxhY2Vob2xkZXJPcHRpb24oKSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50LmdldFBsYWNlaG9sZGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gc2luZ2xlXHJcbiAgICAgICAgc2V0UGxhY2Vob2xkZXI6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIHBsYWNlaG9sZGVyID0gdGhpcy5nZXRQbGFjZWhvbGRlcigpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNQbGFjZWhvbGRlck9wdGlvblNlbGVjdGVkKCkgJiYgcGxhY2Vob2xkZXIgIT09IHVuZGVmaW5lZCkge1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIGNoZWNrIGZvciBhIHBsYWNlaG9sZGVyIG9wdGlvbiBpZiBhdHRhY2hlZCB0byBhIHNlbGVjdFxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ICYmIHRoaXMuZ2V0UGxhY2Vob2xkZXJPcHRpb24oKSA9PT0gdW5kZWZpbmVkKSByZXR1cm47XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uZmluZChcIi5zZWxlY3QyLWNob3NlblwiKS5odG1sKHRoaXMub3B0cy5lc2NhcGVNYXJrdXAocGxhY2Vob2xkZXIpKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5hZGRDbGFzcyhcInNlbGVjdDItZGVmYXVsdFwiKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5yZW1vdmVDbGFzcyhcInNlbGVjdDItYWxsb3djbGVhclwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIHNpbmdsZVxyXG4gICAgICAgIHBvc3Rwcm9jZXNzUmVzdWx0czogZnVuY3Rpb24gKGRhdGEsIGluaXRpYWwsIG5vSGlnaGxpZ2h0VXBkYXRlKSB7XHJcbiAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IDAsIHNlbGYgPSB0aGlzLCBzaG93U2VhcmNoSW5wdXQgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgLy8gZmluZCB0aGUgc2VsZWN0ZWQgZWxlbWVudCBpbiB0aGUgcmVzdWx0IGxpc3RcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZmluZEhpZ2hsaWdodGFibGVDaG9pY2VzKCkuZWFjaDIoZnVuY3Rpb24gKGksIGVsbSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGVxdWFsKHNlbGYuaWQoZWxtLmRhdGEoXCJzZWxlY3QyLWRhdGFcIikpLCBzZWxmLm9wdHMuZWxlbWVudC52YWwoKSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZCA9IGk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIC8vIGFuZCBoaWdobGlnaHQgaXRcclxuICAgICAgICAgICAgaWYgKG5vSGlnaGxpZ2h0VXBkYXRlICE9PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGluaXRpYWwgPT09IHRydWUgJiYgc2VsZWN0ZWQgPj0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0KHNlbGVjdGVkKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWdobGlnaHQoMCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIGhpZGUgdGhlIHNlYXJjaCBib3ggaWYgdGhpcyBpcyB0aGUgZmlyc3Qgd2UgZ290IHRoZSByZXN1bHRzIGFuZCB0aGVyZSBhcmUgZW5vdWdoIG9mIHRoZW0gZm9yIHNlYXJjaFxyXG5cclxuICAgICAgICAgICAgaWYgKGluaXRpYWwgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgICAgIHZhciBtaW4gPSB0aGlzLm9wdHMubWluaW11bVJlc3VsdHNGb3JTZWFyY2g7XHJcbiAgICAgICAgICAgICAgICBpZiAobWluID49IDApIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dTZWFyY2goY291bnRSZXN1bHRzKGRhdGEucmVzdWx0cykgPj0gbWluKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIHNpbmdsZVxyXG4gICAgICAgIHNob3dTZWFyY2g6IGZ1bmN0aW9uKHNob3dTZWFyY2hJbnB1dCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zaG93U2VhcmNoSW5wdXQgPT09IHNob3dTZWFyY2hJbnB1dCkgcmV0dXJuO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5zaG93U2VhcmNoSW5wdXQgPSBzaG93U2VhcmNoSW5wdXQ7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmRyb3Bkb3duLmZpbmQoXCIuc2VsZWN0Mi1zZWFyY2hcIikudG9nZ2xlQ2xhc3MoXCJzZWxlY3QyLXNlYXJjaC1oaWRkZW5cIiwgIXNob3dTZWFyY2hJbnB1dCk7XHJcbiAgICAgICAgICAgIHRoaXMuZHJvcGRvd24uZmluZChcIi5zZWxlY3QyLXNlYXJjaFwiKS50b2dnbGVDbGFzcyhcInNlbGVjdDItb2Zmc2NyZWVuXCIsICFzaG93U2VhcmNoSW5wdXQpO1xyXG4gICAgICAgICAgICAvL2FkZCBcInNlbGVjdDItd2l0aC1zZWFyY2hib3hcIiB0byB0aGUgY29udGFpbmVyIGlmIHNlYXJjaCBib3ggaXMgc2hvd25cclxuICAgICAgICAgICAgJCh0aGlzLmRyb3Bkb3duLCB0aGlzLmNvbnRhaW5lcikudG9nZ2xlQ2xhc3MoXCJzZWxlY3QyLXdpdGgtc2VhcmNoYm94XCIsIHNob3dTZWFyY2hJbnB1dCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gc2luZ2xlXHJcbiAgICAgICAgb25TZWxlY3Q6IGZ1bmN0aW9uIChkYXRhLCBvcHRpb25zKSB7XHJcblxyXG4gICAgICAgICAgICBpZiAoIXRoaXMudHJpZ2dlclNlbGVjdChkYXRhKSkgeyByZXR1cm47IH1cclxuXHJcbiAgICAgICAgICAgIHZhciBvbGQgPSB0aGlzLm9wdHMuZWxlbWVudC52YWwoKSxcclxuICAgICAgICAgICAgICAgIG9sZERhdGEgPSB0aGlzLmRhdGEoKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMub3B0cy5lbGVtZW50LnZhbCh0aGlzLmlkKGRhdGEpKTtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVTZWxlY3Rpb24oZGF0YSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLm9wdHMuZWxlbWVudC50cmlnZ2VyKHsgdHlwZTogXCJzZWxlY3QyLXNlbGVjdGVkXCIsIHZhbDogdGhpcy5pZChkYXRhKSwgY2hvaWNlOiBkYXRhIH0pO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5uZXh0U2VhcmNoVGVybSA9IHRoaXMub3B0cy5uZXh0U2VhcmNoVGVybShkYXRhLCB0aGlzLnNlYXJjaC52YWwoKSk7XHJcbiAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcclxuXHJcbiAgICAgICAgICAgIGlmICghb3B0aW9ucyB8fCAhb3B0aW9ucy5ub0ZvY3VzKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uZm9jdXMoKTtcclxuXHJcbiAgICAgICAgICAgIGlmICghZXF1YWwob2xkLCB0aGlzLmlkKGRhdGEpKSkgeyB0aGlzLnRyaWdnZXJDaGFuZ2Uoe2FkZGVkOmRhdGEscmVtb3ZlZDpvbGREYXRhfSk7IH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBzaW5nbGVcclxuICAgICAgICB1cGRhdGVTZWxlY3Rpb246IGZ1bmN0aW9uIChkYXRhKSB7XHJcblxyXG4gICAgICAgICAgICB2YXIgY29udGFpbmVyPXRoaXMuc2VsZWN0aW9uLmZpbmQoXCIuc2VsZWN0Mi1jaG9zZW5cIiksIGZvcm1hdHRlZCwgY3NzQ2xhc3M7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5kYXRhKFwic2VsZWN0Mi1kYXRhXCIsIGRhdGEpO1xyXG5cclxuICAgICAgICAgICAgY29udGFpbmVyLmVtcHR5KCk7XHJcbiAgICAgICAgICAgIGlmIChkYXRhICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBmb3JtYXR0ZWQ9dGhpcy5vcHRzLmZvcm1hdFNlbGVjdGlvbihkYXRhLCBjb250YWluZXIsIHRoaXMub3B0cy5lc2NhcGVNYXJrdXApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChmb3JtYXR0ZWQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyLmFwcGVuZChmb3JtYXR0ZWQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNzc0NsYXNzPXRoaXMub3B0cy5mb3JtYXRTZWxlY3Rpb25Dc3NDbGFzcyhkYXRhLCBjb250YWluZXIpO1xyXG4gICAgICAgICAgICBpZiAoY3NzQ2xhc3MgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyLmFkZENsYXNzKGNzc0NsYXNzKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24ucmVtb3ZlQ2xhc3MoXCJzZWxlY3QyLWRlZmF1bHRcIik7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5vcHRzLmFsbG93Q2xlYXIgJiYgdGhpcy5nZXRQbGFjZWhvbGRlcigpICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLmFkZENsYXNzKFwic2VsZWN0Mi1hbGxvd2NsZWFyXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gc2luZ2xlXHJcbiAgICAgICAgdmFsOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciB2YWwsXHJcbiAgICAgICAgICAgICAgICB0cmlnZ2VyQ2hhbmdlID0gZmFsc2UsXHJcbiAgICAgICAgICAgICAgICBkYXRhID0gbnVsbCxcclxuICAgICAgICAgICAgICAgIHNlbGYgPSB0aGlzLFxyXG4gICAgICAgICAgICAgICAgb2xkRGF0YSA9IHRoaXMuZGF0YSgpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm9wdHMuZWxlbWVudC52YWwoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdmFsID0gYXJndW1lbnRzWzBdO1xyXG5cclxuICAgICAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICAgICAgICB0cmlnZ2VyQ2hhbmdlID0gYXJndW1lbnRzWzFdO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3QpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0XHJcbiAgICAgICAgICAgICAgICAgICAgLnZhbCh2YWwpXHJcbiAgICAgICAgICAgICAgICAgICAgLmZpbmQoXCI6c2VsZWN0ZWRcIikuZWFjaDIoZnVuY3Rpb24gKGksIGVsbSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gc2VsZi5vcHRpb25Ub0RhdGEoZWxtKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTZWxlY3Rpb24oZGF0YSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldFBsYWNlaG9sZGVyKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAodHJpZ2dlckNoYW5nZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlckNoYW5nZSh7YWRkZWQ6IGRhdGEsIHJlbW92ZWQ6b2xkRGF0YX0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gdmFsIGlzIGFuIGlkLiAhdmFsIGlzIHRydWUgZm9yIFt1bmRlZmluZWQsbnVsbCwnJywwXSAtIDAgaXMgbGVnYWxcclxuICAgICAgICAgICAgICAgIGlmICghdmFsICYmIHZhbCAhPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2xlYXIodHJpZ2dlckNoYW5nZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0cy5pbml0U2VsZWN0aW9uID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJjYW5ub3QgY2FsbCB2YWwoKSBpZiBpbml0U2VsZWN0aW9uKCkgaXMgbm90IGRlZmluZWRcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9wdHMuZWxlbWVudC52YWwodmFsKTtcclxuICAgICAgICAgICAgICAgIHRoaXMub3B0cy5pbml0U2VsZWN0aW9uKHRoaXMub3B0cy5lbGVtZW50LCBmdW5jdGlvbihkYXRhKXtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdHMuZWxlbWVudC52YWwoIWRhdGEgPyBcIlwiIDogc2VsZi5pZChkYXRhKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi51cGRhdGVTZWxlY3Rpb24oZGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRQbGFjZWhvbGRlcigpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0cmlnZ2VyQ2hhbmdlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlckNoYW5nZSh7YWRkZWQ6IGRhdGEsIHJlbW92ZWQ6b2xkRGF0YX0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gc2luZ2xlXHJcbiAgICAgICAgY2xlYXJTZWFyY2g6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWFyY2gudmFsKFwiXCIpO1xyXG4gICAgICAgICAgICB0aGlzLmZvY3Vzc2VyLnZhbChcIlwiKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBzaW5nbGVcclxuICAgICAgICBkYXRhOiBmdW5jdGlvbih2YWx1ZSkge1xyXG4gICAgICAgICAgICB2YXIgZGF0YSxcclxuICAgICAgICAgICAgICAgIHRyaWdnZXJDaGFuZ2UgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICBkYXRhID0gdGhpcy5zZWxlY3Rpb24uZGF0YShcInNlbGVjdDItZGF0YVwiKTtcclxuICAgICAgICAgICAgICAgIGlmIChkYXRhID09IHVuZGVmaW5lZCkgZGF0YSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0YTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXJDaGFuZ2UgPSBhcmd1bWVudHNbMV07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoIXZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGVhcih0cmlnZ2VyQ2hhbmdlKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHRoaXMuZGF0YSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3B0cy5lbGVtZW50LnZhbCghdmFsdWUgPyBcIlwiIDogdGhpcy5pZCh2YWx1ZSkpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU2VsZWN0aW9uKHZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodHJpZ2dlckNoYW5nZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRyaWdnZXJDaGFuZ2Uoe2FkZGVkOiB2YWx1ZSwgcmVtb3ZlZDpkYXRhfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgTXVsdGlTZWxlY3QyID0gY2xhenooQWJzdHJhY3RTZWxlY3QyLCB7XHJcblxyXG4gICAgICAgIC8vIG11bHRpXHJcbiAgICAgICAgY3JlYXRlQ29udGFpbmVyOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBjb250YWluZXIgPSAkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikpLmF0dHIoe1xyXG4gICAgICAgICAgICAgICAgXCJjbGFzc1wiOiBcInNlbGVjdDItY29udGFpbmVyIHNlbGVjdDItY29udGFpbmVyLW11bHRpXCJcclxuICAgICAgICAgICAgfSkuaHRtbChbXHJcbiAgICAgICAgICAgICAgICBcIjx1bCBjbGFzcz0nc2VsZWN0Mi1jaG9pY2VzJz5cIixcclxuICAgICAgICAgICAgICAgIFwiICA8bGkgY2xhc3M9J3NlbGVjdDItc2VhcmNoLWZpZWxkJz5cIixcclxuICAgICAgICAgICAgICAgIFwiICAgIDxpbnB1dCB0eXBlPSd0ZXh0JyBhdXRvY29tcGxldGU9J29mZicgYXV0b2NvcnJlY3Q9J29mZicgYXV0b2NhcGl0YWxpemU9J29mZicgc3BlbGxjaGVjaz0nZmFsc2UnIGNsYXNzPSdzZWxlY3QyLWlucHV0Jz5cIixcclxuICAgICAgICAgICAgICAgIFwiICA8L2xpPlwiLFxyXG4gICAgICAgICAgICAgICAgXCI8L3VsPlwiLFxyXG4gICAgICAgICAgICAgICAgXCI8ZGl2IGNsYXNzPSdzZWxlY3QyLWRyb3Agc2VsZWN0Mi1kcm9wLW11bHRpIHNlbGVjdDItZGlzcGxheS1ub25lJz5cIixcclxuICAgICAgICAgICAgICAgIFwiICAgPHVsIGNsYXNzPSdzZWxlY3QyLXJlc3VsdHMnPlwiLFxyXG4gICAgICAgICAgICAgICAgXCIgICA8L3VsPlwiLFxyXG4gICAgICAgICAgICAgICAgXCI8L2Rpdj5cIl0uam9pbihcIlwiKSk7XHJcbiAgICAgICAgICAgIHJldHVybiBjb250YWluZXI7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gbXVsdGlcclxuICAgICAgICBwcmVwYXJlT3B0czogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgb3B0cyA9IHRoaXMucGFyZW50LnByZXBhcmVPcHRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksXHJcbiAgICAgICAgICAgICAgICBzZWxmPXRoaXM7XHJcblxyXG4gICAgICAgICAgICAvLyBUT0RPIHZhbGlkYXRlIHBsYWNlaG9sZGVyIGlzIGEgc3RyaW5nIGlmIHNwZWNpZmllZFxyXG5cclxuICAgICAgICAgICAgaWYgKG9wdHMuZWxlbWVudC5nZXQoMCkudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInNlbGVjdFwiKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBpbnN0YWxsIHN0aGUgc2VsZWN0aW9uIGluaXRpYWxpemVyXHJcbiAgICAgICAgICAgICAgICBvcHRzLmluaXRTZWxlY3Rpb24gPSBmdW5jdGlvbiAoZWxlbWVudCwgY2FsbGJhY2spIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGEgPSBbXTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5maW5kKFwiOnNlbGVjdGVkXCIpLmVhY2gyKGZ1bmN0aW9uIChpLCBlbG0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5wdXNoKHNlbGYub3B0aW9uVG9EYXRhKGVsbSkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChcImRhdGFcIiBpbiBvcHRzKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBpbnN0YWxsIGRlZmF1bHQgaW5pdFNlbGVjdGlvbiB3aGVuIGFwcGxpZWQgdG8gaGlkZGVuIGlucHV0IGFuZCBkYXRhIGlzIGxvY2FsXHJcbiAgICAgICAgICAgICAgICBvcHRzLmluaXRTZWxlY3Rpb24gPSBvcHRzLmluaXRTZWxlY3Rpb24gfHwgZnVuY3Rpb24gKGVsZW1lbnQsIGNhbGxiYWNrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGlkcyA9IHNwbGl0VmFsKGVsZW1lbnQudmFsKCksIG9wdHMuc2VwYXJhdG9yKTtcclxuICAgICAgICAgICAgICAgICAgICAvL3NlYXJjaCBpbiBkYXRhIGJ5IGFycmF5IG9mIGlkcywgc3RvcmluZyBtYXRjaGluZyBpdGVtcyBpbiBhIGxpc3RcclxuICAgICAgICAgICAgICAgICAgICB2YXIgbWF0Y2hlcyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgIG9wdHMucXVlcnkoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVyOiBmdW5jdGlvbih0ZXJtLCB0ZXh0LCBlbCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaXNfbWF0Y2ggPSAkLmdyZXAoaWRzLCBmdW5jdGlvbihpZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcXVhbChpZCwgb3B0cy5pZChlbCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzX21hdGNoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcy5wdXNoKGVsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpc19tYXRjaDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2s6ICEkLmlzRnVuY3Rpb24oY2FsbGJhY2spID8gJC5ub29wIDogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZW9yZGVyIG1hdGNoZXMgYmFzZWQgb24gdGhlIG9yZGVyIHRoZXkgYXBwZWFyIGluIHRoZSBpZHMgYXJyYXkgYmVjYXVzZSByaWdodCBub3dcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZXkgYXJlIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IGFwcGVhciBpbiBkYXRhIGFycmF5XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgb3JkZXJlZCA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpZHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaWQgPSBpZHNbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBtYXRjaGVzLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtYXRjaCA9IG1hdGNoZXNbal07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcXVhbChpZCwgb3B0cy5pZChtYXRjaCkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlcmVkLnB1c2gobWF0Y2gpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcy5zcGxpY2UoaiwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG9yZGVyZWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gb3B0cztcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBzZWxlY3RDaG9pY2U6IGZ1bmN0aW9uIChjaG9pY2UpIHtcclxuXHJcbiAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IHRoaXMuY29udGFpbmVyLmZpbmQoXCIuc2VsZWN0Mi1zZWFyY2gtY2hvaWNlLWZvY3VzXCIpO1xyXG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWQubGVuZ3RoICYmIGNob2ljZSAmJiBjaG9pY2VbMF0gPT0gc2VsZWN0ZWRbMF0pIHtcclxuXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWQubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRzLmVsZW1lbnQudHJpZ2dlcihcImNob2ljZS1kZXNlbGVjdGVkXCIsIHNlbGVjdGVkKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHNlbGVjdGVkLnJlbW92ZUNsYXNzKFwic2VsZWN0Mi1zZWFyY2gtY2hvaWNlLWZvY3VzXCIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGNob2ljZSAmJiBjaG9pY2UubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNob2ljZS5hZGRDbGFzcyhcInNlbGVjdDItc2VhcmNoLWNob2ljZS1mb2N1c1wiKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdHMuZWxlbWVudC50cmlnZ2VyKFwiY2hvaWNlLXNlbGVjdGVkXCIsIGNob2ljZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBtdWx0aVxyXG4gICAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAkKFwibGFiZWxbZm9yPSdcIiArIHRoaXMuc2VhcmNoLmF0dHIoJ2lkJykgKyBcIiddXCIpXHJcbiAgICAgICAgICAgICAgICAuYXR0cignZm9yJywgdGhpcy5vcHRzLmVsZW1lbnQuYXR0cihcImlkXCIpKTtcclxuICAgICAgICAgICAgdGhpcy5wYXJlbnQuZGVzdHJveS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIG11bHRpXHJcbiAgICAgICAgaW5pdENvbnRhaW5lcjogZnVuY3Rpb24gKCkge1xyXG5cclxuICAgICAgICAgICAgdmFyIHNlbGVjdG9yID0gXCIuc2VsZWN0Mi1jaG9pY2VzXCIsIHNlbGVjdGlvbjtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoQ29udGFpbmVyID0gdGhpcy5jb250YWluZXIuZmluZChcIi5zZWxlY3QyLXNlYXJjaC1maWVsZFwiKTtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb24gPSB0aGlzLmNvbnRhaW5lci5maW5kKHNlbGVjdG9yKTtcclxuXHJcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLm9uKFwiY2xpY2tcIiwgXCIuc2VsZWN0Mi1zZWFyY2gtY2hvaWNlXCIsIGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgICAgICAvL2tpbGxFdmVudChlKTtcclxuICAgICAgICAgICAgICAgIF90aGlzLnNlYXJjaFswXS5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuc2VsZWN0Q2hvaWNlKCQodGhpcykpO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIC8vIHJld3JpdGUgbGFiZWxzIGZyb20gb3JpZ2luYWwgZWxlbWVudCB0byBmb2N1c3NlclxyXG4gICAgICAgICAgICB0aGlzLnNlYXJjaC5hdHRyKFwiaWRcIiwgXCJzMmlkX2F1dG9nZW5cIituZXh0VWlkKCkpO1xyXG4gICAgICAgICAgICAkKFwibGFiZWxbZm9yPSdcIiArIHRoaXMub3B0cy5lbGVtZW50LmF0dHIoXCJpZFwiKSArIFwiJ11cIilcclxuICAgICAgICAgICAgICAgIC5hdHRyKCdmb3InLCB0aGlzLnNlYXJjaC5hdHRyKCdpZCcpKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoLm9uKFwiaW5wdXQgcGFzdGVcIiwgdGhpcy5iaW5kKGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzSW50ZXJmYWNlRW5hYmxlZCgpKSByZXR1cm47XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3BlbmVkKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wZW4oKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSkpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5zZWFyY2guYXR0cihcInRhYmluZGV4XCIsIHRoaXMuZWxlbWVudFRhYkluZGV4KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMua2V5ZG93bnMgPSAwO1xyXG4gICAgICAgICAgICB0aGlzLnNlYXJjaC5vbihcImtleWRvd25cIiwgdGhpcy5iaW5kKGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNJbnRlcmZhY2VFbmFibGVkKCkpIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgICAgICArK3RoaXMua2V5ZG93bnM7XHJcbiAgICAgICAgICAgICAgICB2YXIgc2VsZWN0ZWQgPSBzZWxlY3Rpb24uZmluZChcIi5zZWxlY3QyLXNlYXJjaC1jaG9pY2UtZm9jdXNcIik7XHJcbiAgICAgICAgICAgICAgICB2YXIgcHJldiA9IHNlbGVjdGVkLnByZXYoXCIuc2VsZWN0Mi1zZWFyY2gtY2hvaWNlOm5vdCguc2VsZWN0Mi1sb2NrZWQpXCIpO1xyXG4gICAgICAgICAgICAgICAgdmFyIG5leHQgPSBzZWxlY3RlZC5uZXh0KFwiLnNlbGVjdDItc2VhcmNoLWNob2ljZTpub3QoLnNlbGVjdDItbG9ja2VkKVwiKTtcclxuICAgICAgICAgICAgICAgIHZhciBwb3MgPSBnZXRDdXJzb3JJbmZvKHRoaXMuc2VhcmNoKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWQubGVuZ3RoICYmXHJcbiAgICAgICAgICAgICAgICAgICAgKGUud2hpY2ggPT0gS0VZLkxFRlQgfHwgZS53aGljaCA9PSBLRVkuUklHSFQgfHwgZS53aGljaCA9PSBLRVkuQkFDS1NQQUNFIHx8IGUud2hpY2ggPT0gS0VZLkRFTEVURSB8fCBlLndoaWNoID09IEtFWS5FTlRFUikpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgc2VsZWN0ZWRDaG9pY2UgPSBzZWxlY3RlZDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZS53aGljaCA9PSBLRVkuTEVGVCAmJiBwcmV2Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZENob2ljZSA9IHByZXY7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGUud2hpY2ggPT0gS0VZLlJJR0hUKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkQ2hvaWNlID0gbmV4dC5sZW5ndGggPyBuZXh0IDogbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZS53aGljaCA9PT0gS0VZLkJBQ0tTUEFDRSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVuc2VsZWN0KHNlbGVjdGVkLmZpcnN0KCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaC53aWR0aCgxMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkQ2hvaWNlID0gcHJldi5sZW5ndGggPyBwcmV2IDogbmV4dDtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUud2hpY2ggPT0gS0VZLkRFTEVURSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVuc2VsZWN0KHNlbGVjdGVkLmZpcnN0KCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaC53aWR0aCgxMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkQ2hvaWNlID0gbmV4dC5sZW5ndGggPyBuZXh0IDogbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUud2hpY2ggPT0gS0VZLkVOVEVSKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkQ2hvaWNlID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0Q2hvaWNlKHNlbGVjdGVkQ2hvaWNlKTtcclxuICAgICAgICAgICAgICAgICAgICBraWxsRXZlbnQoZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxlY3RlZENob2ljZSB8fCAhc2VsZWN0ZWRDaG9pY2UubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3BlbigpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCgoZS53aGljaCA9PT0gS0VZLkJBQ0tTUEFDRSAmJiB0aGlzLmtleWRvd25zID09IDEpXHJcbiAgICAgICAgICAgICAgICAgICAgfHwgZS53aGljaCA9PSBLRVkuTEVGVCkgJiYgKHBvcy5vZmZzZXQgPT0gMCAmJiAhcG9zLmxlbmd0aCkpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RDaG9pY2Uoc2VsZWN0aW9uLmZpbmQoXCIuc2VsZWN0Mi1zZWFyY2gtY2hvaWNlOm5vdCguc2VsZWN0Mi1sb2NrZWQpXCIpLmxhc3QoKSk7XHJcbiAgICAgICAgICAgICAgICAgICAga2lsbEV2ZW50KGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RDaG9pY2UobnVsbCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3BlbmVkKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGUud2hpY2gpIHtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIEtFWS5VUDpcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIEtFWS5ET1dOOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1vdmVIaWdobGlnaHQoKGUud2hpY2ggPT09IEtFWS5VUCkgPyAtMSA6IDEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBraWxsRXZlbnQoZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIEtFWS5FTlRFUjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RIaWdobGlnaHRlZCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBraWxsRXZlbnQoZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIEtFWS5UQUI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHNlbGVjdE9uQmx1ciA9PSB0cnVlLCBzZWxlY3QgdGhlIGN1cnJlbnRseSBoaWdobGlnaHRlZCBvcHRpb25cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0cy5zZWxlY3RPbkJsdXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0SGlnaGxpZ2h0ZWQoe25vRm9jdXM6dHJ1ZX0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgS0VZLkVTQzpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW5jZWwoZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGtpbGxFdmVudChlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZS53aGljaCA9PT0gS0VZLlRBQiB8fCBLRVkuaXNDb250cm9sKGUpIHx8IEtFWS5pc0Z1bmN0aW9uS2V5KGUpXHJcbiAgICAgICAgICAgICAgICAgfHwgZS53aGljaCA9PT0gS0VZLkJBQ0tTUEFDRSB8fCBlLndoaWNoID09PSBLRVkuRVNDKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChlLndoaWNoID09PSBLRVkuRU5URVIpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRzLm9wZW5PbkVudGVyID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLmFsdEtleSB8fCBlLmN0cmxLZXkgfHwgZS5zaGlmdEtleSB8fCBlLm1ldGFLZXkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLm9wZW4oKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZS53aGljaCA9PT0gS0VZLlBBR0VfVVAgfHwgZS53aGljaCA9PT0gS0VZLlBBR0VfRE9XTikge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHByZXZlbnQgdGhlIHBhZ2UgZnJvbSBzY3JvbGxpbmdcclxuICAgICAgICAgICAgICAgICAgICBraWxsRXZlbnQoZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGUud2hpY2ggPT09IEtFWS5FTlRFUikge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHByZXZlbnQgZm9ybSBmcm9tIGJlaW5nIHN1Ym1pdHRlZFxyXG4gICAgICAgICAgICAgICAgICAgIGtpbGxFdmVudChlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIH0pKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoLm9uKFwia2V5dXBcIiwgdGhpcy5iaW5kKGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmtleWRvd25zID0gMDtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVzaXplU2VhcmNoKCk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNlYXJjaC5vbihcImJsdXJcIiwgdGhpcy5iaW5kKGZ1bmN0aW9uKGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLnJlbW92ZUNsYXNzKFwic2VsZWN0Mi1jb250YWluZXItYWN0aXZlXCIpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWFyY2gucmVtb3ZlQ2xhc3MoXCJzZWxlY3QyLWZvY3VzZWRcIik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdENob2ljZShudWxsKTtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcGVuZWQoKSkgdGhpcy5jbGVhclNlYXJjaCgpO1xyXG4gICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIHRoaXMub3B0cy5lbGVtZW50LnRyaWdnZXIoJC5FdmVudChcInNlbGVjdDItYmx1clwiKSk7XHJcbiAgICAgICAgICAgIH0pKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLm9uKFwiY2xpY2tcIiwgc2VsZWN0b3IsIHRoaXMuYmluZChmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzSW50ZXJmYWNlRW5hYmxlZCgpKSByZXR1cm47XHJcbiAgICAgICAgICAgICAgICBpZiAoJChlLnRhcmdldCkuY2xvc2VzdChcIi5zZWxlY3QyLXNlYXJjaC1jaG9pY2VcIikubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGNsaWNrZWQgaW5zaWRlIGEgc2VsZWN0MiBzZWFyY2ggY2hvaWNlLCBkbyBub3Qgb3BlblxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0Q2hvaWNlKG51bGwpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jbGVhclBsYWNlaG9sZGVyKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY29udGFpbmVyLmhhc0NsYXNzKFwic2VsZWN0Mi1jb250YWluZXItYWN0aXZlXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRzLmVsZW1lbnQudHJpZ2dlcigkLkV2ZW50KFwic2VsZWN0Mi1mb2N1c1wiKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9wZW4oKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZm9jdXNTZWFyY2goKTtcclxuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgfSkpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5jb250YWluZXIub24oXCJmb2N1c1wiLCBzZWxlY3RvciwgdGhpcy5iaW5kKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc0ludGVyZmFjZUVuYWJsZWQoKSkgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmNvbnRhaW5lci5oYXNDbGFzcyhcInNlbGVjdDItY29udGFpbmVyLWFjdGl2ZVwiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3B0cy5lbGVtZW50LnRyaWdnZXIoJC5FdmVudChcInNlbGVjdDItZm9jdXNcIikpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5jb250YWluZXIuYWRkQ2xhc3MoXCJzZWxlY3QyLWNvbnRhaW5lci1hY3RpdmVcIik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRyb3Bkb3duLmFkZENsYXNzKFwic2VsZWN0Mi1kcm9wLWFjdGl2ZVwiKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJQbGFjZWhvbGRlcigpO1xyXG4gICAgICAgICAgICB9KSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmluaXRDb250YWluZXJXaWR0aCgpO1xyXG4gICAgICAgICAgICB0aGlzLm9wdHMuZWxlbWVudC5hZGRDbGFzcyhcInNlbGVjdDItb2Zmc2NyZWVuXCIpO1xyXG5cclxuICAgICAgICAgICAgLy8gc2V0IHRoZSBwbGFjZWhvbGRlciBpZiBuZWNlc3NhcnlcclxuICAgICAgICAgICAgdGhpcy5jbGVhclNlYXJjaCgpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIG11bHRpXHJcbiAgICAgICAgZW5hYmxlSW50ZXJmYWNlOiBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50LmVuYWJsZUludGVyZmFjZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaC5wcm9wKFwiZGlzYWJsZWRcIiwgIXRoaXMuaXNJbnRlcmZhY2VFbmFibGVkKCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gbXVsdGlcclxuICAgICAgICBpbml0U2VsZWN0aW9uOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBkYXRhO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5vcHRzLmVsZW1lbnQudmFsKCkgPT09IFwiXCIgJiYgdGhpcy5vcHRzLmVsZW1lbnQudGV4dCgpID09PSBcIlwiKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVNlbGVjdGlvbihbXSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlKCk7XHJcbiAgICAgICAgICAgICAgICAvLyBzZXQgdGhlIHBsYWNlaG9sZGVyIGlmIG5lY2Vzc2FyeVxyXG4gICAgICAgICAgICAgICAgdGhpcy5jbGVhclNlYXJjaCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdCB8fCB0aGlzLm9wdHMuZWxlbWVudC52YWwoKSAhPT0gXCJcIikge1xyXG4gICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vcHRzLmluaXRTZWxlY3Rpb24uY2FsbChudWxsLCB0aGlzLm9wdHMuZWxlbWVudCwgZnVuY3Rpb24oZGF0YSl7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEgIT09IHVuZGVmaW5lZCAmJiBkYXRhICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlU2VsZWN0aW9uKGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNsb3NlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCB0aGUgcGxhY2Vob2xkZXIgaWYgbmVjZXNzYXJ5XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2xlYXJTZWFyY2goKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIG11bHRpXHJcbiAgICAgICAgY2xlYXJTZWFyY2g6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIHBsYWNlaG9sZGVyID0gdGhpcy5nZXRQbGFjZWhvbGRlcigpLFxyXG4gICAgICAgICAgICAgICAgbWF4V2lkdGggPSB0aGlzLmdldE1heFNlYXJjaFdpZHRoKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAocGxhY2Vob2xkZXIgIT09IHVuZGVmaW5lZCAgJiYgdGhpcy5nZXRWYWwoKS5sZW5ndGggPT09IDAgJiYgdGhpcy5zZWFyY2guaGFzQ2xhc3MoXCJzZWxlY3QyLWZvY3VzZWRcIikgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaC52YWwocGxhY2Vob2xkZXIpLmFkZENsYXNzKFwic2VsZWN0Mi1kZWZhdWx0XCIpO1xyXG4gICAgICAgICAgICAgICAgLy8gc3RyZXRjaCB0aGUgc2VhcmNoIGJveCB0byBmdWxsIHdpZHRoIG9mIHRoZSBjb250YWluZXIgc28gYXMgbXVjaCBvZiB0aGUgcGxhY2Vob2xkZXIgaXMgdmlzaWJsZSBhcyBwb3NzaWJsZVxyXG4gICAgICAgICAgICAgICAgLy8gd2UgY291bGQgY2FsbCB0aGlzLnJlc2l6ZVNlYXJjaCgpLCBidXQgd2UgZG8gbm90IGJlY2F1c2UgdGhhdCByZXF1aXJlcyBhIHNpemVyIGFuZCB3ZSBkbyBub3Qgd2FudCB0byBjcmVhdGUgb25lIHNvIGVhcmx5IGJlY2F1c2Ugb2YgYSBmaXJlZm94IGJ1Zywgc2VlICM5NDRcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoLndpZHRoKG1heFdpZHRoID4gMCA/IG1heFdpZHRoIDogdGhpcy5jb250YWluZXIuY3NzKFwid2lkdGhcIikpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWFyY2gudmFsKFwiXCIpLndpZHRoKDEwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIG11bHRpXHJcbiAgICAgICAgY2xlYXJQbGFjZWhvbGRlcjogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zZWFyY2guaGFzQ2xhc3MoXCJzZWxlY3QyLWRlZmF1bHRcIikpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoLnZhbChcIlwiKS5yZW1vdmVDbGFzcyhcInNlbGVjdDItZGVmYXVsdFwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIG11bHRpXHJcbiAgICAgICAgb3BlbmluZzogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB0aGlzLmNsZWFyUGxhY2Vob2xkZXIoKTsgLy8gc2hvdWxkIGJlIGRvbmUgYmVmb3JlIHN1cGVyIHNvIHBsYWNlaG9sZGVyIGlzIG5vdCB1c2VkIHRvIHNlYXJjaFxyXG4gICAgICAgICAgICB0aGlzLnJlc2l6ZVNlYXJjaCgpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5wYXJlbnQub3BlbmluZy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5mb2N1c1NlYXJjaCgpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy51cGRhdGVSZXN1bHRzKHRydWUpO1xyXG4gICAgICAgICAgICB0aGlzLnNlYXJjaC5mb2N1cygpO1xyXG4gICAgICAgICAgICB0aGlzLm9wdHMuZWxlbWVudC50cmlnZ2VyKCQuRXZlbnQoXCJzZWxlY3QyLW9wZW5cIikpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIG11bHRpXHJcbiAgICAgICAgY2xvc2U6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLm9wZW5lZCgpKSByZXR1cm47XHJcbiAgICAgICAgICAgIHRoaXMucGFyZW50LmNsb3NlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gbXVsdGlcclxuICAgICAgICBmb2N1czogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB0aGlzLmNsb3NlKCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoLmZvY3VzKCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gbXVsdGlcclxuICAgICAgICBpc0ZvY3VzZWQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VhcmNoLmhhc0NsYXNzKFwic2VsZWN0Mi1mb2N1c2VkXCIpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIG11bHRpXHJcbiAgICAgICAgdXBkYXRlU2VsZWN0aW9uOiBmdW5jdGlvbiAoZGF0YSkge1xyXG4gICAgICAgICAgICB2YXIgaWRzID0gW10sIGZpbHRlcmVkID0gW10sIHNlbGYgPSB0aGlzO1xyXG5cclxuICAgICAgICAgICAgLy8gZmlsdGVyIG91dCBkdXBsaWNhdGVzXHJcbiAgICAgICAgICAgICQoZGF0YSkuZWFjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXhPZihzZWxmLmlkKHRoaXMpLCBpZHMpIDwgMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlkcy5wdXNoKHNlbGYuaWQodGhpcykpO1xyXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkLnB1c2godGhpcyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBkYXRhID0gZmlsdGVyZWQ7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5maW5kKFwiLnNlbGVjdDItc2VhcmNoLWNob2ljZVwiKS5yZW1vdmUoKTtcclxuICAgICAgICAgICAgJChkYXRhKS5lYWNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHNlbGYuYWRkU2VsZWN0ZWRDaG9pY2UodGhpcyk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBzZWxmLnBvc3Rwcm9jZXNzUmVzdWx0cygpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIG11bHRpXHJcbiAgICAgICAgdG9rZW5pemU6IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICB2YXIgaW5wdXQgPSB0aGlzLnNlYXJjaC52YWwoKTtcclxuICAgICAgICAgICAgaW5wdXQgPSB0aGlzLm9wdHMudG9rZW5pemVyLmNhbGwodGhpcywgaW5wdXQsIHRoaXMuZGF0YSgpLCB0aGlzLmJpbmQodGhpcy5vblNlbGVjdCksIHRoaXMub3B0cyk7XHJcbiAgICAgICAgICAgIGlmIChpbnB1dCAhPSBudWxsICYmIGlucHV0ICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWFyY2gudmFsKGlucHV0KTtcclxuICAgICAgICAgICAgICAgIGlmIChpbnB1dC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcGVuKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gbXVsdGlcclxuICAgICAgICBvblNlbGVjdDogZnVuY3Rpb24gKGRhdGEsIG9wdGlvbnMpIHtcclxuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy50cmlnZ2VyU2VsZWN0KGRhdGEpKSB7IHJldHVybjsgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5hZGRTZWxlY3RlZENob2ljZShkYXRhKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMub3B0cy5lbGVtZW50LnRyaWdnZXIoeyB0eXBlOiBcInNlbGVjdGVkXCIsIHZhbDogdGhpcy5pZChkYXRhKSwgY2hvaWNlOiBkYXRhIH0pO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0IHx8ICF0aGlzLm9wdHMuY2xvc2VPblNlbGVjdCkgdGhpcy5wb3N0cHJvY2Vzc1Jlc3VsdHMoZGF0YSwgZmFsc2UsIHRoaXMub3B0cy5jbG9zZU9uU2VsZWN0PT09dHJ1ZSk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5vcHRzLmNsb3NlT25TZWxlY3QpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoLndpZHRoKDEwKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvdW50U2VsZWN0YWJsZVJlc3VsdHMoKT4wKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWFyY2gud2lkdGgoMTApO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzaXplU2VhcmNoKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZ2V0TWF4aW11bVNlbGVjdGlvblNpemUoKSA+IDAgJiYgdGhpcy52YWwoKS5sZW5ndGggPj0gdGhpcy5nZXRNYXhpbXVtU2VsZWN0aW9uU2l6ZSgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIHJlYWNoZWQgbWF4IHNlbGVjdGlvbiBzaXplIHJlcGFpbnQgdGhlIHJlc3VsdHMgc28gY2hvaWNlc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhcmUgcmVwbGFjZWQgd2l0aCB0aGUgbWF4IHNlbGVjdGlvbiByZWFjaGVkIG1lc3NhZ2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVSZXN1bHRzKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBvc2l0aW9uRHJvcGRvd24oKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgbm90aGluZyBsZWZ0IHRvIHNlbGVjdCBjbG9zZVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaC53aWR0aCgxMCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIHNpbmNlIGl0cyBub3QgcG9zc2libGUgdG8gc2VsZWN0IGFuIGVsZW1lbnQgdGhhdCBoYXMgYWxyZWFkeSBiZWVuXHJcbiAgICAgICAgICAgIC8vIGFkZGVkIHdlIGRvIG5vdCBuZWVkIHRvIGNoZWNrIGlmIHRoaXMgaXMgYSBuZXcgZWxlbWVudCBiZWZvcmUgZmlyaW5nIGNoYW5nZVxyXG4gICAgICAgICAgICB0aGlzLnRyaWdnZXJDaGFuZ2UoeyBhZGRlZDogZGF0YSB9KTtcclxuXHJcbiAgICAgICAgICAgIGlmICghb3B0aW9ucyB8fCAhb3B0aW9ucy5ub0ZvY3VzKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5mb2N1c1NlYXJjaCgpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIG11bHRpXHJcbiAgICAgICAgY2FuY2VsOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcclxuICAgICAgICAgICAgdGhpcy5mb2N1c1NlYXJjaCgpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIGFkZFNlbGVjdGVkQ2hvaWNlOiBmdW5jdGlvbiAoZGF0YSkge1xyXG4gICAgICAgICAgICB2YXIgZW5hYmxlQ2hvaWNlID0gIWRhdGEubG9ja2VkLFxyXG4gICAgICAgICAgICAgICAgZW5hYmxlZEl0ZW0gPSAkKFxyXG4gICAgICAgICAgICAgICAgICAgIFwiPGxpIGNsYXNzPSdzZWxlY3QyLXNlYXJjaC1jaG9pY2UnPlwiICtcclxuICAgICAgICAgICAgICAgICAgICBcIiAgICA8ZGl2PjwvZGl2PlwiICtcclxuICAgICAgICAgICAgICAgICAgICBcIiAgICA8YSBocmVmPScjJyBvbmNsaWNrPSdyZXR1cm4gZmFsc2U7JyBjbGFzcz0nc2VsZWN0Mi1zZWFyY2gtY2hvaWNlLWNsb3NlJyB0YWJpbmRleD0nLTEnPjwvYT5cIiArXHJcbiAgICAgICAgICAgICAgICAgICAgXCI8L2xpPlwiKSxcclxuICAgICAgICAgICAgICAgIGRpc2FibGVkSXRlbSA9ICQoXHJcbiAgICAgICAgICAgICAgICAgICAgXCI8bGkgY2xhc3M9J3NlbGVjdDItc2VhcmNoLWNob2ljZSBzZWxlY3QyLWxvY2tlZCc+XCIgK1xyXG4gICAgICAgICAgICAgICAgICAgIFwiPGRpdj48L2Rpdj5cIiArXHJcbiAgICAgICAgICAgICAgICAgICAgXCI8L2xpPlwiKTtcclxuICAgICAgICAgICAgdmFyIGNob2ljZSA9IGVuYWJsZUNob2ljZSA/IGVuYWJsZWRJdGVtIDogZGlzYWJsZWRJdGVtLFxyXG4gICAgICAgICAgICAgICAgaWQgPSB0aGlzLmlkKGRhdGEpLFxyXG4gICAgICAgICAgICAgICAgdmFsID0gdGhpcy5nZXRWYWwoKSxcclxuICAgICAgICAgICAgICAgIGZvcm1hdHRlZCxcclxuICAgICAgICAgICAgICAgIGNzc0NsYXNzO1xyXG5cclxuICAgICAgICAgICAgZm9ybWF0dGVkPXRoaXMub3B0cy5mb3JtYXRTZWxlY3Rpb24oZGF0YSwgY2hvaWNlLmZpbmQoXCJkaXZcIiksIHRoaXMub3B0cy5lc2NhcGVNYXJrdXApO1xyXG4gICAgICAgICAgICBpZiAoZm9ybWF0dGVkICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgY2hvaWNlLmZpbmQoXCJkaXZcIikucmVwbGFjZVdpdGgoXCI8ZGl2PlwiK2Zvcm1hdHRlZCtcIjwvZGl2PlwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjc3NDbGFzcz10aGlzLm9wdHMuZm9ybWF0U2VsZWN0aW9uQ3NzQ2xhc3MoZGF0YSwgY2hvaWNlLmZpbmQoXCJkaXZcIikpO1xyXG4gICAgICAgICAgICBpZiAoY3NzQ2xhc3MgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBjaG9pY2UuYWRkQ2xhc3MoY3NzQ2xhc3MpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZihlbmFibGVDaG9pY2Upe1xyXG4gICAgICAgICAgICAgIGNob2ljZS5maW5kKFwiLnNlbGVjdDItc2VhcmNoLWNob2ljZS1jbG9zZVwiKVxyXG4gICAgICAgICAgICAgICAgICAub24oXCJtb3VzZWRvd25cIiwga2lsbEV2ZW50KVxyXG4gICAgICAgICAgICAgICAgICAub24oXCJjbGljayBkYmxjbGlja1wiLCB0aGlzLmJpbmQoZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzSW50ZXJmYWNlRW5hYmxlZCgpKSByZXR1cm47XHJcblxyXG4gICAgICAgICAgICAgICAgICAkKGUudGFyZ2V0KS5jbG9zZXN0KFwiLnNlbGVjdDItc2VhcmNoLWNob2ljZVwiKS5mYWRlT3V0KCdmYXN0JywgdGhpcy5iaW5kKGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVuc2VsZWN0KCQoZS50YXJnZXQpKTtcclxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLmZpbmQoXCIuc2VsZWN0Mi1zZWFyY2gtY2hvaWNlLWZvY3VzXCIpLnJlbW92ZUNsYXNzKFwic2VsZWN0Mi1zZWFyY2gtY2hvaWNlLWZvY3VzXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5mb2N1c1NlYXJjaCgpO1xyXG4gICAgICAgICAgICAgICAgICB9KSkuZGVxdWV1ZSgpO1xyXG4gICAgICAgICAgICAgICAgICBraWxsRXZlbnQoZSk7XHJcbiAgICAgICAgICAgICAgfSkpLm9uKFwiZm9jdXNcIiwgdGhpcy5iaW5kKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzSW50ZXJmYWNlRW5hYmxlZCgpKSByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLmFkZENsYXNzKFwic2VsZWN0Mi1jb250YWluZXItYWN0aXZlXCIpO1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLmRyb3Bkb3duLmFkZENsYXNzKFwic2VsZWN0Mi1kcm9wLWFjdGl2ZVwiKTtcclxuICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNob2ljZS5kYXRhKFwic2VsZWN0Mi1kYXRhXCIsIGRhdGEpO1xyXG4gICAgICAgICAgICBjaG9pY2UuaW5zZXJ0QmVmb3JlKHRoaXMuc2VhcmNoQ29udGFpbmVyKTtcclxuXHJcbiAgICAgICAgICAgIHZhbC5wdXNoKGlkKTtcclxuICAgICAgICAgICAgdGhpcy5zZXRWYWwodmFsKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBtdWx0aVxyXG4gICAgICAgIHVuc2VsZWN0OiBmdW5jdGlvbiAoc2VsZWN0ZWQpIHtcclxuICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMuZ2V0VmFsKCksXHJcbiAgICAgICAgICAgICAgICBkYXRhLFxyXG4gICAgICAgICAgICAgICAgaW5kZXg7XHJcblxyXG4gICAgICAgICAgICBzZWxlY3RlZCA9IHNlbGVjdGVkLmNsb3Nlc3QoXCIuc2VsZWN0Mi1zZWFyY2gtY2hvaWNlXCIpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHNlbGVjdGVkLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgXCJJbnZhbGlkIGFyZ3VtZW50OiBcIiArIHNlbGVjdGVkICsgXCIuIE11c3QgYmUgLnNlbGVjdDItc2VhcmNoLWNob2ljZVwiO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBkYXRhID0gc2VsZWN0ZWQuZGF0YShcInNlbGVjdDItZGF0YVwiKTtcclxuXHJcbiAgICAgICAgICAgIGlmICghZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgLy8gcHJldmVudCBhIHJhY2UgY29uZGl0aW9uIHdoZW4gdGhlICd4JyBpcyBjbGlja2VkIHJlYWxseSBmYXN0IHJlcGVhdGVkbHkgdGhlIGV2ZW50IGNhbiBiZSBxdWV1ZWRcclxuICAgICAgICAgICAgICAgIC8vIGFuZCBpbnZva2VkIG9uIGFuIGVsZW1lbnQgYWxyZWFkeSByZW1vdmVkXHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGluZGV4ID0gaW5kZXhPZih0aGlzLmlkKGRhdGEpLCB2YWwpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHtcclxuICAgICAgICAgICAgICAgIHZhbC5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRWYWwodmFsKTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdCkgdGhpcy5wb3N0cHJvY2Vzc1Jlc3VsdHMoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZWxlY3RlZC5yZW1vdmUoKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMub3B0cy5lbGVtZW50LnRyaWdnZXIoeyB0eXBlOiBcInJlbW92ZWRcIiwgdmFsOiB0aGlzLmlkKGRhdGEpLCBjaG9pY2U6IGRhdGEgfSk7XHJcbiAgICAgICAgICAgIHRoaXMudHJpZ2dlckNoYW5nZSh7IHJlbW92ZWQ6IGRhdGEgfSk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gbXVsdGlcclxuICAgICAgICBwb3N0cHJvY2Vzc1Jlc3VsdHM6IGZ1bmN0aW9uIChkYXRhLCBpbml0aWFsLCBub0hpZ2hsaWdodFVwZGF0ZSkge1xyXG4gICAgICAgICAgICB2YXIgdmFsID0gdGhpcy5nZXRWYWwoKSxcclxuICAgICAgICAgICAgICAgIGNob2ljZXMgPSB0aGlzLnJlc3VsdHMuZmluZChcIi5zZWxlY3QyLXJlc3VsdFwiKSxcclxuICAgICAgICAgICAgICAgIGNvbXBvdW5kID0gdGhpcy5yZXN1bHRzLmZpbmQoXCIuc2VsZWN0Mi1yZXN1bHQtd2l0aC1jaGlsZHJlblwiKSxcclxuICAgICAgICAgICAgICAgIHNlbGYgPSB0aGlzO1xyXG5cclxuICAgICAgICAgICAgY2hvaWNlcy5lYWNoMihmdW5jdGlvbiAoaSwgY2hvaWNlKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgaWQgPSBzZWxmLmlkKGNob2ljZS5kYXRhKFwic2VsZWN0Mi1kYXRhXCIpKTtcclxuICAgICAgICAgICAgICAgIGlmIChpbmRleE9mKGlkLCB2YWwpID49IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBjaG9pY2UuYWRkQ2xhc3MoXCJzZWxlY3QyLXNlbGVjdGVkXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIG1hcmsgYWxsIGNoaWxkcmVuIG9mIHRoZSBzZWxlY3RlZCBwYXJlbnQgYXMgc2VsZWN0ZWRcclxuICAgICAgICAgICAgICAgICAgICBjaG9pY2UuZmluZChcIi5zZWxlY3QyLXJlc3VsdC1zZWxlY3RhYmxlXCIpLmFkZENsYXNzKFwic2VsZWN0Mi1zZWxlY3RlZFwiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBjb21wb3VuZC5lYWNoMihmdW5jdGlvbihpLCBjaG9pY2UpIHtcclxuICAgICAgICAgICAgICAgIC8vIGhpZGUgYW4gb3B0Z3JvdXAgaWYgaXQgZG9lc250IGhhdmUgYW55IHNlbGVjdGFibGUgY2hpbGRyZW5cclxuICAgICAgICAgICAgICAgIGlmICghY2hvaWNlLmlzKCcuc2VsZWN0Mi1yZXN1bHQtc2VsZWN0YWJsZScpXHJcbiAgICAgICAgICAgICAgICAgICAgJiYgY2hvaWNlLmZpbmQoXCIuc2VsZWN0Mi1yZXN1bHQtc2VsZWN0YWJsZTpub3QoLnNlbGVjdDItc2VsZWN0ZWQpXCIpLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNob2ljZS5hZGRDbGFzcyhcInNlbGVjdDItc2VsZWN0ZWRcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuaGlnaGxpZ2h0KCkgPT0gLTEgJiYgbm9IaWdobGlnaHRVcGRhdGUgIT09IGZhbHNlKXtcclxuICAgICAgICAgICAgICAgIHNlbGYuaGlnaGxpZ2h0KDApO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvL0lmIGFsbCByZXN1bHRzIGFyZSBjaG9zZW4gcmVuZGVyIGZvcm1hdE5vTUF0Y2hlc1xyXG4gICAgICAgICAgICBpZighdGhpcy5vcHRzLmNyZWF0ZVNlYXJjaENob2ljZSAmJiAhY2hvaWNlcy5maWx0ZXIoJy5zZWxlY3QyLXJlc3VsdDpub3QoLnNlbGVjdDItc2VsZWN0ZWQpJykubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgICAgICBpZighZGF0YSB8fCBkYXRhICYmICFkYXRhLm1vcmUgJiYgdGhpcy5yZXN1bHRzLmZpbmQoXCIuc2VsZWN0Mi1uby1yZXN1bHRzXCIpLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGVja0Zvcm1hdHRlcihzZWxmLm9wdHMuZm9ybWF0Tm9NYXRjaGVzLCBcImZvcm1hdE5vTWF0Y2hlc1wiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc3VsdHMuYXBwZW5kKFwiPGxpIGNsYXNzPSdzZWxlY3QyLW5vLXJlc3VsdHMnPlwiICsgc2VsZi5vcHRzLmZvcm1hdE5vTWF0Y2hlcyhzZWxmLnNlYXJjaC52YWwoKSkgKyBcIjwvbGk+XCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBtdWx0aVxyXG4gICAgICAgIGdldE1heFNlYXJjaFdpZHRoOiBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uLndpZHRoKCkgLSBnZXRTaWRlQm9yZGVyUGFkZGluZyh0aGlzLnNlYXJjaCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gbXVsdGlcclxuICAgICAgICByZXNpemVTZWFyY2g6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIG1pbmltdW1XaWR0aCwgbGVmdCwgbWF4V2lkdGgsIGNvbnRhaW5lckxlZnQsIHNlYXJjaFdpZHRoLFxyXG4gICAgICAgICAgICAgICAgc2lkZUJvcmRlclBhZGRpbmcgPSBnZXRTaWRlQm9yZGVyUGFkZGluZyh0aGlzLnNlYXJjaCk7XHJcblxyXG4gICAgICAgICAgICBtaW5pbXVtV2lkdGggPSBtZWFzdXJlVGV4dFdpZHRoKHRoaXMuc2VhcmNoKSArIDEwO1xyXG5cclxuICAgICAgICAgICAgbGVmdCA9IHRoaXMuc2VhcmNoLm9mZnNldCgpLmxlZnQ7XHJcblxyXG4gICAgICAgICAgICBtYXhXaWR0aCA9IHRoaXMuc2VsZWN0aW9uLndpZHRoKCk7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lckxlZnQgPSB0aGlzLnNlbGVjdGlvbi5vZmZzZXQoKS5sZWZ0O1xyXG5cclxuICAgICAgICAgICAgc2VhcmNoV2lkdGggPSBtYXhXaWR0aCAtIChsZWZ0IC0gY29udGFpbmVyTGVmdCkgLSBzaWRlQm9yZGVyUGFkZGluZztcclxuXHJcbiAgICAgICAgICAgIGlmIChzZWFyY2hXaWR0aCA8IG1pbmltdW1XaWR0aCkge1xyXG4gICAgICAgICAgICAgICAgc2VhcmNoV2lkdGggPSBtYXhXaWR0aCAtIHNpZGVCb3JkZXJQYWRkaW5nO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoc2VhcmNoV2lkdGggPCA0MCkge1xyXG4gICAgICAgICAgICAgICAgc2VhcmNoV2lkdGggPSBtYXhXaWR0aCAtIHNpZGVCb3JkZXJQYWRkaW5nO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoc2VhcmNoV2lkdGggPD0gMCkge1xyXG4gICAgICAgICAgICAgIHNlYXJjaFdpZHRoID0gbWluaW11bVdpZHRoO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNlYXJjaC53aWR0aChzZWFyY2hXaWR0aCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gbXVsdGlcclxuICAgICAgICBnZXRWYWw6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIHZhbDtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0KSB7XHJcbiAgICAgICAgICAgICAgICB2YWwgPSB0aGlzLnNlbGVjdC52YWwoKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB2YWwgPT09IG51bGwgPyBbXSA6IHZhbDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHZhbCA9IHRoaXMub3B0cy5lbGVtZW50LnZhbCgpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHNwbGl0VmFsKHZhbCwgdGhpcy5vcHRzLnNlcGFyYXRvcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBtdWx0aVxyXG4gICAgICAgIHNldFZhbDogZnVuY3Rpb24gKHZhbCkge1xyXG4gICAgICAgICAgICB2YXIgdW5pcXVlO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3QpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0LnZhbCh2YWwpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdW5pcXVlID0gW107XHJcbiAgICAgICAgICAgICAgICAvLyBmaWx0ZXIgb3V0IGR1cGxpY2F0ZXNcclxuICAgICAgICAgICAgICAgICQodmFsKS5lYWNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXhPZih0aGlzLCB1bmlxdWUpIDwgMCkgdW5pcXVlLnB1c2godGhpcyk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHRoaXMub3B0cy5lbGVtZW50LnZhbCh1bmlxdWUubGVuZ3RoID09PSAwID8gXCJcIiA6IHVuaXF1ZS5qb2luKHRoaXMub3B0cy5zZXBhcmF0b3IpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIG11bHRpXHJcbiAgICAgICAgYnVpbGRDaGFuZ2VEZXRhaWxzOiBmdW5jdGlvbiAob2xkLCBjdXJyZW50KSB7XHJcbiAgICAgICAgICAgIHZhciBjdXJyZW50ID0gY3VycmVudC5zbGljZSgwKSxcclxuICAgICAgICAgICAgICAgIG9sZCA9IG9sZC5zbGljZSgwKTtcclxuXHJcbiAgICAgICAgICAgIC8vIHJlbW92ZSBpbnRlcnNlY3Rpb24gZnJvbSBlYWNoIGFycmF5XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY3VycmVudC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBvbGQubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZXF1YWwodGhpcy5vcHRzLmlkKGN1cnJlbnRbaV0pLCB0aGlzLm9wdHMuaWQob2xkW2pdKSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5zcGxpY2UoaSwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGktLTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb2xkLnNwbGljZShqLCAxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgai0tO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHthZGRlZDogY3VycmVudCwgcmVtb3ZlZDogb2xkfTtcclxuICAgICAgICB9LFxyXG5cclxuXHJcbiAgICAgICAgLy8gbXVsdGlcclxuICAgICAgICB2YWw6IGZ1bmN0aW9uICh2YWwsIHRyaWdnZXJDaGFuZ2UpIHtcclxuICAgICAgICAgICAgdmFyIG9sZERhdGEsIHNlbGY9dGhpcywgY2hhbmdlRGV0YWlscztcclxuXHJcbiAgICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRWYWwoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgb2xkRGF0YT10aGlzLmRhdGEoKTtcclxuICAgICAgICAgICAgaWYgKCFvbGREYXRhLmxlbmd0aCkgb2xkRGF0YT1bXTtcclxuXHJcbiAgICAgICAgICAgIC8vIHZhbCBpcyBhbiBpZC4gIXZhbCBpcyB0cnVlIGZvciBbdW5kZWZpbmVkLG51bGwsJycsMF0gLSAwIGlzIGxlZ2FsXHJcbiAgICAgICAgICAgIGlmICghdmFsICYmIHZhbCAhPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vcHRzLmVsZW1lbnQudmFsKFwiXCIpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTZWxlY3Rpb24oW10pO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jbGVhclNlYXJjaCgpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRyaWdnZXJDaGFuZ2UpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyaWdnZXJDaGFuZ2Uoe2FkZGVkOiB0aGlzLmRhdGEoKSwgcmVtb3ZlZDogb2xkRGF0YX0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyB2YWwgaXMgYSBsaXN0IG9mIGlkc1xyXG4gICAgICAgICAgICB0aGlzLnNldFZhbCh2YWwpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9wdHMuaW5pdFNlbGVjdGlvbih0aGlzLnNlbGVjdCwgdGhpcy5iaW5kKHRoaXMudXBkYXRlU2VsZWN0aW9uKSk7XHJcbiAgICAgICAgICAgICAgICBpZiAodHJpZ2dlckNoYW5nZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlckNoYW5nZSh0aGlzLmJ1aWxkQ2hhbmdlRGV0YWlscyhvbGREYXRhLCB0aGlzLmRhdGEoKSkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0cy5pbml0U2VsZWN0aW9uID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ2YWwoKSBjYW5ub3QgYmUgY2FsbGVkIGlmIGluaXRTZWxlY3Rpb24oKSBpcyBub3QgZGVmaW5lZFwiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLm9wdHMuaW5pdFNlbGVjdGlvbih0aGlzLm9wdHMuZWxlbWVudCwgZnVuY3Rpb24oZGF0YSl7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGlkcz0kLm1hcChkYXRhLCBzZWxmLmlkKTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFZhbChpZHMpO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlU2VsZWN0aW9uKGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuY2xlYXJTZWFyY2goKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodHJpZ2dlckNoYW5nZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXJDaGFuZ2Uoc2VsZi5idWlsZENoYW5nZURldGFpbHMob2xkRGF0YSwgdGhpcy5kYXRhKCkpKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmNsZWFyU2VhcmNoKCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gbXVsdGlcclxuICAgICAgICBvblNvcnRTdGFydDogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdCkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU29ydGluZyBvZiBlbGVtZW50cyBpcyBub3Qgc3VwcG9ydGVkIHdoZW4gYXR0YWNoZWQgdG8gPHNlbGVjdD4uIEF0dGFjaCB0byA8aW5wdXQgdHlwZT0naGlkZGVuJy8+IGluc3RlYWQuXCIpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBjb2xsYXBzZSBzZWFyY2ggZmllbGQgaW50byAwIHdpZHRoIHNvIGl0cyBjb250YWluZXIgY2FuIGJlIGNvbGxhcHNlZCBhcyB3ZWxsXHJcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoLndpZHRoKDApO1xyXG4gICAgICAgICAgICAvLyBoaWRlIHRoZSBjb250YWluZXJcclxuICAgICAgICAgICAgdGhpcy5zZWFyY2hDb250YWluZXIuaGlkZSgpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIG11bHRpXHJcbiAgICAgICAgb25Tb3J0RW5kOmZ1bmN0aW9uKCkge1xyXG5cclxuICAgICAgICAgICAgdmFyIHZhbD1bXSwgc2VsZj10aGlzO1xyXG5cclxuICAgICAgICAgICAgLy8gc2hvdyBzZWFyY2ggYW5kIG1vdmUgaXQgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdFxyXG4gICAgICAgICAgICB0aGlzLnNlYXJjaENvbnRhaW5lci5zaG93KCk7XHJcbiAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgc2VhcmNoIGNvbnRhaW5lciBpcyB0aGUgbGFzdCBpdGVtIGluIHRoZSBsaXN0XHJcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoQ29udGFpbmVyLmFwcGVuZFRvKHRoaXMuc2VhcmNoQ29udGFpbmVyLnBhcmVudCgpKTtcclxuICAgICAgICAgICAgLy8gc2luY2Ugd2UgY29sbGFwc2VkIHRoZSB3aWR0aCBpbiBkcmFnU3RhcnRlZCwgd2UgcmVzaXplIGl0IGhlcmVcclxuICAgICAgICAgICAgdGhpcy5yZXNpemVTZWFyY2goKTtcclxuXHJcbiAgICAgICAgICAgIC8vIHVwZGF0ZSBzZWxlY3Rpb25cclxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uZmluZChcIi5zZWxlY3QyLXNlYXJjaC1jaG9pY2VcIikuZWFjaChmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgIHZhbC5wdXNoKHNlbGYub3B0cy5pZCgkKHRoaXMpLmRhdGEoXCJzZWxlY3QyLWRhdGFcIikpKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0VmFsKHZhbCk7XHJcbiAgICAgICAgICAgIHRoaXMudHJpZ2dlckNoYW5nZSgpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIG11bHRpXHJcbiAgICAgICAgZGF0YTogZnVuY3Rpb24odmFsdWVzLCB0cmlnZ2VyQ2hhbmdlKSB7XHJcbiAgICAgICAgICAgIHZhciBzZWxmPXRoaXMsIGlkcywgb2xkO1xyXG4gICAgICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAuZmluZChcIi5zZWxlY3QyLXNlYXJjaC1jaG9pY2VcIilcclxuICAgICAgICAgICAgICAgICAgICAgLm1hcChmdW5jdGlvbigpIHsgcmV0dXJuICQodGhpcykuZGF0YShcInNlbGVjdDItZGF0YVwiKTsgfSlcclxuICAgICAgICAgICAgICAgICAgICAgLmdldCgpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgb2xkID0gdGhpcy5kYXRhKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXZhbHVlcykgeyB2YWx1ZXMgPSBbXTsgfVxyXG4gICAgICAgICAgICAgICAgaWRzID0gJC5tYXAodmFsdWVzLCBmdW5jdGlvbihlKSB7IHJldHVybiBzZWxmLm9wdHMuaWQoZSk7IH0pO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRWYWwoaWRzKTtcclxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU2VsZWN0aW9uKHZhbHVlcyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNsZWFyU2VhcmNoKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAodHJpZ2dlckNoYW5nZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlckNoYW5nZSh0aGlzLmJ1aWxkQ2hhbmdlRGV0YWlscyhvbGQsIHRoaXMuZGF0YSgpKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICAkLmZuLnNlbGVjdDIgPSBmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKSxcclxuICAgICAgICAgICAgb3B0cyxcclxuICAgICAgICAgICAgc2VsZWN0MixcclxuICAgICAgICAgICAgbWV0aG9kLCB2YWx1ZSwgbXVsdGlwbGUsXHJcbiAgICAgICAgICAgIGFsbG93ZWRNZXRob2RzID0gW1widmFsXCIsIFwiZGVzdHJveVwiLCBcIm9wZW5lZFwiLCBcIm9wZW5cIiwgXCJjbG9zZVwiLCBcImZvY3VzXCIsIFwiaXNGb2N1c2VkXCIsIFwiY29udGFpbmVyXCIsIFwiZHJvcGRvd25cIiwgXCJvblNvcnRTdGFydFwiLCBcIm9uU29ydEVuZFwiLCBcImVuYWJsZVwiLCBcImRpc2FibGVcIiwgXCJyZWFkb25seVwiLCBcInBvc2l0aW9uRHJvcGRvd25cIiwgXCJkYXRhXCIsIFwic2VhcmNoXCJdLFxyXG4gICAgICAgICAgICB2YWx1ZU1ldGhvZHMgPSBbXCJvcGVuZWRcIiwgXCJpc0ZvY3VzZWRcIiwgXCJjb250YWluZXJcIiwgXCJkcm9wZG93blwiXSxcclxuICAgICAgICAgICAgcHJvcGVydHlNZXRob2RzID0gW1widmFsXCIsIFwiZGF0YVwiXSxcclxuICAgICAgICAgICAgbWV0aG9kc01hcCA9IHsgc2VhcmNoOiBcImV4dGVybmFsU2VhcmNoXCIgfTtcclxuXHJcbiAgICAgICAgdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09PSAwIHx8IHR5cGVvZihhcmdzWzBdKSA9PT0gXCJvYmplY3RcIikge1xyXG4gICAgICAgICAgICAgICAgb3B0cyA9IGFyZ3MubGVuZ3RoID09PSAwID8ge30gOiAkLmV4dGVuZCh7fSwgYXJnc1swXSk7XHJcbiAgICAgICAgICAgICAgICBvcHRzLmVsZW1lbnQgPSAkKHRoaXMpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChvcHRzLmVsZW1lbnQuZ2V0KDApLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJzZWxlY3RcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIG11bHRpcGxlID0gb3B0cy5lbGVtZW50LnByb3AoXCJtdWx0aXBsZVwiKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGUgPSBvcHRzLm11bHRpcGxlIHx8IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChcInRhZ3NcIiBpbiBvcHRzKSB7b3B0cy5tdWx0aXBsZSA9IG11bHRpcGxlID0gdHJ1ZTt9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgc2VsZWN0MiA9IG11bHRpcGxlID8gbmV3IE11bHRpU2VsZWN0MigpIDogbmV3IFNpbmdsZVNlbGVjdDIoKTtcclxuICAgICAgICAgICAgICAgIHNlbGVjdDIuaW5pdChvcHRzKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YoYXJnc1swXSkgPT09IFwic3RyaW5nXCIpIHtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXhPZihhcmdzWzBdLCBhbGxvd2VkTWV0aG9kcykgPCAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgXCJVbmtub3duIG1ldGhvZDogXCIgKyBhcmdzWzBdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHZhbHVlID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0MiA9ICQodGhpcykuZGF0YShcInNlbGVjdDJcIik7XHJcbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0MiA9PT0gdW5kZWZpbmVkKSByZXR1cm47XHJcblxyXG4gICAgICAgICAgICAgICAgbWV0aG9kPWFyZ3NbMF07XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKG1ldGhvZCA9PT0gXCJjb250YWluZXJcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gc2VsZWN0Mi5jb250YWluZXI7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZCA9PT0gXCJkcm9wZG93blwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBzZWxlY3QyLmRyb3Bkb3duO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kc01hcFttZXRob2RdKSBtZXRob2QgPSBtZXRob2RzTWFwW21ldGhvZF07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gc2VsZWN0MlttZXRob2RdLmFwcGx5KHNlbGVjdDIsIGFyZ3Muc2xpY2UoMSkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGluZGV4T2YoYXJnc1swXSwgdmFsdWVNZXRob2RzKSA+PSAwXHJcbiAgICAgICAgICAgICAgICAgICAgfHwgKGluZGV4T2YoYXJnc1swXSwgcHJvcGVydHlNZXRob2RzKSAmJiBhcmdzLmxlbmd0aCA9PSAxKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gYWJvcnQgdGhlIGl0ZXJhdGlvbiwgcmVhZHkgdG8gcmV0dXJuIGZpcnN0IG1hdGNoZWQgdmFsdWVcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRocm93IFwiSW52YWxpZCBhcmd1bWVudHMgdG8gc2VsZWN0MiBwbHVnaW46IFwiICsgYXJncztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiAodmFsdWUgPT09IHVuZGVmaW5lZCkgPyB0aGlzIDogdmFsdWU7XHJcbiAgICB9O1xyXG5cclxuICAgIC8vIHBsdWdpbiBkZWZhdWx0cywgYWNjZXNzaWJsZSB0byB1c2Vyc1xyXG4gICAgJC5mbi5zZWxlY3QyLmRlZmF1bHRzID0ge1xyXG4gICAgICAgIHdpZHRoOiBcImNvcHlcIixcclxuICAgICAgICBsb2FkTW9yZVBhZGRpbmc6IDAsXHJcbiAgICAgICAgY2xvc2VPblNlbGVjdDogdHJ1ZSxcclxuICAgICAgICBvcGVuT25FbnRlcjogdHJ1ZSxcclxuICAgICAgICBjb250YWluZXJDc3M6IHt9LFxyXG4gICAgICAgIGRyb3Bkb3duQ3NzOiB7fSxcclxuICAgICAgICBjb250YWluZXJDc3NDbGFzczogXCJcIixcclxuICAgICAgICBkcm9wZG93bkNzc0NsYXNzOiBcIlwiLFxyXG4gICAgICAgIGZvcm1hdFJlc3VsdDogZnVuY3Rpb24ocmVzdWx0LCBjb250YWluZXIsIHF1ZXJ5LCBlc2NhcGVNYXJrdXApIHtcclxuICAgICAgICAgICAgdmFyIG1hcmt1cD1bXTtcclxuICAgICAgICAgICAgbWFya01hdGNoKHJlc3VsdC50ZXh0LCBxdWVyeS50ZXJtLCBtYXJrdXAsIGVzY2FwZU1hcmt1cCk7XHJcbiAgICAgICAgICAgIHJldHVybiBtYXJrdXAuam9pbihcIlwiKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGZvcm1hdFNlbGVjdGlvbjogZnVuY3Rpb24gKGRhdGEsIGNvbnRhaW5lciwgZXNjYXBlTWFya3VwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBkYXRhID8gZXNjYXBlTWFya3VwKGRhdGEudGV4dCkgOiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBzb3J0UmVzdWx0czogZnVuY3Rpb24gKHJlc3VsdHMsIGNvbnRhaW5lciwgcXVlcnkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHM7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBmb3JtYXRSZXN1bHRDc3NDbGFzczogZnVuY3Rpb24oZGF0YSkge3JldHVybiB1bmRlZmluZWQ7fSxcclxuICAgICAgICBmb3JtYXRTZWxlY3Rpb25Dc3NDbGFzczogZnVuY3Rpb24oZGF0YSwgY29udGFpbmVyKSB7cmV0dXJuIHVuZGVmaW5lZDt9LFxyXG4gICAgICAgIGZvcm1hdE5vTWF0Y2hlczogZnVuY3Rpb24gKCkgeyByZXR1cm4gXCJObyBtYXRjaGVzIGZvdW5kXCI7IH0sXHJcbiAgICAgICAgZm9ybWF0SW5wdXRUb29TaG9ydDogZnVuY3Rpb24gKGlucHV0LCBtaW4pIHsgdmFyIG4gPSBtaW4gLSBpbnB1dC5sZW5ndGg7IHJldHVybiBcIlBsZWFzZSBlbnRlciBcIiArIG4gKyBcIiBtb3JlIGNoYXJhY3RlclwiICsgKG4gPT0gMT8gXCJcIiA6IFwic1wiKTsgfSxcclxuICAgICAgICBmb3JtYXRJbnB1dFRvb0xvbmc6IGZ1bmN0aW9uIChpbnB1dCwgbWF4KSB7IHZhciBuID0gaW5wdXQubGVuZ3RoIC0gbWF4OyByZXR1cm4gXCJQbGVhc2UgZGVsZXRlIFwiICsgbiArIFwiIGNoYXJhY3RlclwiICsgKG4gPT0gMT8gXCJcIiA6IFwic1wiKTsgfSxcclxuICAgICAgICBmb3JtYXRTZWxlY3Rpb25Ub29CaWc6IGZ1bmN0aW9uIChsaW1pdCkgeyByZXR1cm4gXCJZb3UgY2FuIG9ubHkgc2VsZWN0IFwiICsgbGltaXQgKyBcIiBpdGVtXCIgKyAobGltaXQgPT0gMSA/IFwiXCIgOiBcInNcIik7IH0sXHJcbiAgICAgICAgZm9ybWF0TG9hZE1vcmU6IGZ1bmN0aW9uIChwYWdlTnVtYmVyKSB7IHJldHVybiBcIkxvYWRpbmcgbW9yZSByZXN1bHRzLi4uXCI7IH0sXHJcbiAgICAgICAgZm9ybWF0U2VhcmNoaW5nOiBmdW5jdGlvbiAoKSB7IHJldHVybiBcIlNlYXJjaGluZy4uLlwiOyB9LFxyXG4gICAgICAgIG1pbmltdW1SZXN1bHRzRm9yU2VhcmNoOiAwLFxyXG4gICAgICAgIG1pbmltdW1JbnB1dExlbmd0aDogMCxcclxuICAgICAgICBtYXhpbXVtSW5wdXRMZW5ndGg6IG51bGwsXHJcbiAgICAgICAgbWF4aW11bVNlbGVjdGlvblNpemU6IDAsXHJcbiAgICAgICAgaWQ6IGZ1bmN0aW9uIChlKSB7IHJldHVybiBlLmlkOyB9LFxyXG4gICAgICAgIG1hdGNoZXI6IGZ1bmN0aW9uKHRlcm0sIHRleHQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHN0cmlwRGlhY3JpdGljcygnJyt0ZXh0KS50b1VwcGVyQ2FzZSgpLmluZGV4T2Yoc3RyaXBEaWFjcml0aWNzKCcnK3Rlcm0pLnRvVXBwZXJDYXNlKCkpID49IDA7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBzZXBhcmF0b3I6IFwiLFwiLFxyXG4gICAgICAgIHRva2VuU2VwYXJhdG9yczogW10sXHJcbiAgICAgICAgdG9rZW5pemVyOiBkZWZhdWx0VG9rZW5pemVyLFxyXG4gICAgICAgIGVzY2FwZU1hcmt1cDogZGVmYXVsdEVzY2FwZU1hcmt1cCxcclxuICAgICAgICBibHVyT25DaGFuZ2U6IGZhbHNlLFxyXG4gICAgICAgIHNlbGVjdE9uQmx1cjogZmFsc2UsXHJcbiAgICAgICAgYWRhcHRDb250YWluZXJDc3NDbGFzczogZnVuY3Rpb24oYykgeyByZXR1cm4gYzsgfSxcclxuICAgICAgICBhZGFwdERyb3Bkb3duQ3NzQ2xhc3M6IGZ1bmN0aW9uKGMpIHsgcmV0dXJuIG51bGw7IH0sXHJcbiAgICAgICAgbmV4dFNlYXJjaFRlcm06IGZ1bmN0aW9uKHNlbGVjdGVkT2JqZWN0LCBjdXJyZW50U2VhcmNoVGVybSkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XHJcbiAgICB9O1xyXG5cclxuICAgICQuZm4uc2VsZWN0Mi5hamF4RGVmYXVsdHMgPSB7XHJcbiAgICAgICAgdHJhbnNwb3J0OiAkLmFqYXgsXHJcbiAgICAgICAgcGFyYW1zOiB7XHJcbiAgICAgICAgICAgIHR5cGU6IFwiR0VUXCIsXHJcbiAgICAgICAgICAgIGNhY2hlOiBmYWxzZSxcclxuICAgICAgICAgICAgZGF0YVR5cGU6IFwianNvblwiXHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICAvLyBleHBvcnRzXHJcbiAgICB3aW5kb3cuU2VsZWN0MiA9IHtcclxuICAgICAgICBxdWVyeToge1xyXG4gICAgICAgICAgICBhamF4OiBhamF4LFxyXG4gICAgICAgICAgICBsb2NhbDogbG9jYWwsXHJcbiAgICAgICAgICAgIHRhZ3M6IHRhZ3NcclxuICAgICAgICB9LCB1dGlsOiB7XHJcbiAgICAgICAgICAgIGRlYm91bmNlOiBkZWJvdW5jZSxcclxuICAgICAgICAgICAgbWFya01hdGNoOiBtYXJrTWF0Y2gsXHJcbiAgICAgICAgICAgIGVzY2FwZU1hcmt1cDogZGVmYXVsdEVzY2FwZU1hcmt1cCxcclxuICAgICAgICAgICAgc3RyaXBEaWFjcml0aWNzOiBzdHJpcERpYWNyaXRpY3NcclxuICAgICAgICB9LCBcImNsYXNzXCI6IHtcclxuICAgICAgICAgICAgXCJhYnN0cmFjdFwiOiBBYnN0cmFjdFNlbGVjdDIsXHJcbiAgICAgICAgICAgIFwic2luZ2xlXCI6IFNpbmdsZVNlbGVjdDIsXHJcbiAgICAgICAgICAgIFwibXVsdGlcIjogTXVsdGlTZWxlY3QyXHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbn0oalF1ZXJ5KSk7XHJcblxyXG5cbn0pLmNhbGwoZ2xvYmFsLCBtb2R1bGUsIHVuZGVmaW5lZCwgdW5kZWZpbmVkKTtcblxufSkuY2FsbCh0aGlzLHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIgPyBnbG9iYWwgOiB0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiA/IHNlbGYgOiB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiID8gd2luZG93IDoge30pXG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldDp1dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJbE5qY21sd2RITXZiR2xpTDNObGJHVmpkREl1TXk0MExqSXVhbk1pWFN3aWJtRnRaWE1pT2x0ZExDSnRZWEJ3YVc1bmN5STZJanRCUVVGQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJJaXdpWm1sc1pTSTZJbWRsYm1WeVlYUmxaQzVxY3lJc0luTnZkWEpqWlZKdmIzUWlPaUlpTENKemIzVnlZMlZ6UTI5dWRHVnVkQ0k2V3lKY2Jqc2dhbEYxWlhKNUlEMGdaMnh2WW1Gc0xtcFJkV1Z5ZVNBOUlISmxjWFZwY21Vb1hDSnFjWFZsY25sY0lpazdYRzQ3SUhaaGNpQmZYMkp5YjNkelpYSnBabmxmYzJocGJWOXlaWEYxYVhKbFgxODljbVZ4ZFdseVpUc29ablZ1WTNScGIyNGdZbkp2ZDNObGNtbG1lVk5vYVcwb2JXOWtkV3hsTENCa1pXWnBibVVzSUhKbGNYVnBjbVVwSUh0Y2JpOHFYSEpjYmtOdmNIbHlhV2RvZENBeU1ERXlJRWxuYjNJZ1ZtRjVibUpsY21kY2NseHVYSEpjYmxabGNuTnBiMjQ2SURNdU5DNHlJRlJwYldWemRHRnRjRG9nVFc5dUlFRjFaeUF4TWlBeE5Ub3dORG94TWlCUVJGUWdNakF4TTF4eVhHNWNjbHh1VkdocGN5QnpiMlowZDJGeVpTQnBjeUJzYVdObGJuTmxaQ0IxYm1SbGNpQjBhR1VnUVhCaFkyaGxJRXhwWTJWdWMyVXNJRlpsY25OcGIyNGdNaTR3SUNoMGFHVWdYQ0pCY0dGamFHVWdUR2xqWlc1elpWd2lLU0J2Y2lCMGFHVWdSMDVWWEhKY2JrZGxibVZ5WVd3Z1VIVmliR2xqSUV4cFkyVnVjMlVnZG1WeWMybHZiaUF5SUNoMGFHVWdYQ0pIVUV3Z1RHbGpaVzV6WlZ3aUtTNGdXVzkxSUcxaGVTQmphRzl2YzJVZ1pXbDBhR1Z5SUd4cFkyVnVjMlVnZEc4Z1oyOTJaWEp1SUhsdmRYSmNjbHh1ZFhObElHOW1JSFJvYVhNZ2MyOW1kSGRoY21VZ2IyNXNlU0IxY0c5dUlIUm9aU0JqYjI1a2FYUnBiMjRnZEdoaGRDQjViM1VnWVdOalpYQjBJR0ZzYkNCdlppQjBhR1VnZEdWeWJYTWdiMllnWldsMGFHVnlJSFJvWlNCQmNHRmphR1ZjY2x4dVRHbGpaVzV6WlNCdmNpQjBhR1VnUjFCTUlFeHBZMlZ1YzJVdVhISmNibHh5WEc1WmIzVWdiV0Y1SUc5aWRHRnBiaUJoSUdOdmNIa2diMllnZEdobElFRndZV05vWlNCTWFXTmxibk5sSUdGdVpDQjBhR1VnUjFCTUlFeHBZMlZ1YzJVZ1lYUTZYSEpjYmx4eVhHNGdJQ0FnYUhSMGNEb3ZMM2QzZHk1aGNHRmphR1V1YjNKbkwyeHBZMlZ1YzJWekwweEpRMFZPVTBVdE1pNHdYSEpjYmlBZ0lDQm9kSFJ3T2k4dmQzZDNMbWR1ZFM1dmNtY3ZiR2xqWlc1elpYTXZaM0JzTFRJdU1DNW9kRzFzWEhKY2JseHlYRzVWYm14bGMzTWdjbVZ4ZFdseVpXUWdZbmtnWVhCd2JHbGpZV0pzWlNCc1lYY2diM0lnWVdkeVpXVmtJSFJ2SUdsdUlIZHlhWFJwYm1jc0lITnZablIzWVhKbElHUnBjM1J5YVdKMWRHVmtJSFZ1WkdWeUlIUm9aVnh5WEc1QmNHRmphR1VnVEdsalpXNXpaU0J2Y2lCMGFHVWdSMUJNSUV4cFkyVnpibk5sSUdseklHUnBjM1J5YVdKMWRHVmtJRzl1SUdGdUlGd2lRVk1nU1ZOY0lpQkNRVk5KVXl3Z1YwbFVTRTlWVkNCWFFWSlNRVTVVU1VWVElFOVNYSEpjYmtOUFRrUkpWRWxQVGxNZ1QwWWdRVTVaSUV0SlRrUXNJR1ZwZEdobGNpQmxlSEJ5WlhOeklHOXlJR2x0Y0d4cFpXUXVJRk5sWlNCMGFHVWdRWEJoWTJobElFeHBZMlZ1YzJVZ1lXNWtJSFJvWlNCSFVFd2dUR2xqWlc1elpTQm1iM0pjY2x4dWRHaGxJSE53WldOcFptbGpJR3hoYm1kMVlXZGxJR2R2ZG1WeWJtbHVaeUJ3WlhKdGFYTnphVzl1Y3lCaGJtUWdiR2x0YVhSaGRHbHZibk1nZFc1a1pYSWdkR2hsSUVGd1lXTm9aU0JNYVdObGJuTmxJR0Z1WkNCMGFHVWdSMUJNSUV4cFkyVnVjMlV1WEhKY2Jpb3ZYSEpjYmlobWRXNWpkR2x2YmlBb0pDa2dlMXh5WEc0Z0lDQWdhV1lvZEhsd1pXOW1JQ1F1Wm00dVpXRmphRElnUFQwZ1hDSjFibVJsWm1sdVpXUmNJaWtnZTF4eVhHNGdJQ0FnSUNBZ0lDUXVaWGgwWlc1a0tDUXVabTRzSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnTHlwY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnS2lBMExURXdJSFJwYldWeklHWmhjM1JsY2lBdVpXRmphQ0J5WlhCc1lXTmxiV1Z1ZEZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FxSUhWelpTQnBkQ0JqWVhKbFpuVnNiSGtzSUdGeklHbDBJRzkyWlhKeWFXUmxjeUJxVVhWbGNua2dZMjl1ZEdWNGRDQnZaaUJsYkdWdFpXNTBJRzl1SUdWaFkyZ2dhWFJsY21GMGFXOXVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDb3ZYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lHVmhZMmd5SURvZ1puVnVZM1JwYjI0Z0tHTXBJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhaaGNpQnFJRDBnSkNoYk1GMHBMQ0JwSUQwZ0xURXNJR3dnUFNCMGFHbHpMbXhsYm1kMGFEdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSGRvYVd4bElDaGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBcksya2dQQ0JzWEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdKaVlnS0dvdVkyOXVkR1Y0ZENBOUlHcGJNRjBnUFNCMGFHbHpXMmxkS1Z4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ1ltSUdNdVkyRnNiQ2hxV3pCZExDQnBMQ0JxS1NBaFBUMGdabUZzYzJVZ0x5OWNJblJvYVhOY0lqMUVUMDBzSUdrOWFXNWtaWGdzSUdvOWFsRjFaWEo1SUc5aWFtVmpkRnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lISmxkSFZ5YmlCMGFHbHpPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJQ0FnZlNrN1hISmNiaUFnSUNCOVhISmNibjBwS0dwUmRXVnllU2s3WEhKY2JseHlYRzRvWm5WdVkzUnBiMjRnS0NRc0lIVnVaR1ZtYVc1bFpDa2dlMXh5WEc0Z0lDQWdYQ0oxYzJVZ2MzUnlhV04wWENJN1hISmNiaUFnSUNBdkttZHNiMkpoYkNCa2IyTjFiV1Z1ZEN3Z2QybHVaRzkzTENCcVVYVmxjbmtzSUdOdmJuTnZiR1VnS2k5Y2NseHVYSEpjYmlBZ0lDQnBaaUFvZDJsdVpHOTNMbE5sYkdWamRESWdJVDA5SUhWdVpHVm1hVzVsWkNrZ2UxeHlYRzRnSUNBZ0lDQWdJSEpsZEhWeWJqdGNjbHh1SUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0IyWVhJZ1MwVlpMQ0JCWW5OMGNtRmpkRk5sYkdWamRESXNJRk5wYm1kc1pWTmxiR1ZqZERJc0lFMTFiSFJwVTJWc1pXTjBNaXdnYm1WNGRGVnBaQ3dnYzJsNlpYSXNYSEpjYmlBZ0lDQWdJQ0FnYkdGemRFMXZkWE5sVUc5emFYUnBiMjQ5ZTNnNk1DeDVPakI5TENBa1pHOWpkVzFsYm5Rc0lITmpjbTlzYkVKaGNrUnBiV1Z1YzJsdmJuTXNYSEpjYmx4eVhHNGdJQ0FnUzBWWklEMGdlMXh5WEc0Z0lDQWdJQ0FnSUZSQlFqb2dPU3hjY2x4dUlDQWdJQ0FnSUNCRlRsUkZVam9nTVRNc1hISmNiaUFnSUNBZ0lDQWdSVk5ET2lBeU55eGNjbHh1SUNBZ0lDQWdJQ0JUVUVGRFJUb2dNeklzWEhKY2JpQWdJQ0FnSUNBZ1RFVkdWRG9nTXpjc1hISmNiaUFnSUNBZ0lDQWdWVkE2SURNNExGeHlYRzRnSUNBZ0lDQWdJRkpKUjBoVU9pQXpPU3hjY2x4dUlDQWdJQ0FnSUNCRVQxZE9PaUEwTUN4Y2NseHVJQ0FnSUNBZ0lDQlRTRWxHVkRvZ01UWXNYSEpjYmlBZ0lDQWdJQ0FnUTFSU1REb2dNVGNzWEhKY2JpQWdJQ0FnSUNBZ1FVeFVPaUF4T0N4Y2NseHVJQ0FnSUNBZ0lDQlFRVWRGWDFWUU9pQXpNeXhjY2x4dUlDQWdJQ0FnSUNCUVFVZEZYMFJQVjA0NklETTBMRnh5WEc0Z0lDQWdJQ0FnSUVoUFRVVTZJRE0yTEZ4eVhHNGdJQ0FnSUNBZ0lFVk9SRG9nTXpVc1hISmNiaUFnSUNBZ0lDQWdRa0ZEUzFOUVFVTkZPaUE0TEZ4eVhHNGdJQ0FnSUNBZ0lFUkZURVZVUlRvZ05EWXNYSEpjYmlBZ0lDQWdJQ0FnYVhOQmNuSnZkem9nWm5WdVkzUnBiMjRnS0dzcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2F5QTlJR3N1ZDJocFkyZ2dQeUJyTG5kb2FXTm9JRG9nYXp0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnYzNkcGRHTm9JQ2hyS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUdOaGMyVWdTMFZaTGt4RlJsUTZYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lHTmhjMlVnUzBWWkxsSkpSMGhVT2x4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0JqWVhObElFdEZXUzVWVURwY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnWTJGelpTQkxSVmt1UkU5WFRqcGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQjBjblZsTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQm1ZV3h6WlR0Y2NseHVJQ0FnSUNBZ0lDQjlMRnh5WEc0Z0lDQWdJQ0FnSUdselEyOXVkSEp2YkRvZ1puVnVZM1JwYjI0Z0tHVXBJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdkbUZ5SUdzZ1BTQmxMbmRvYVdOb08xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCemQybDBZMmdnS0dzcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ1kyRnpaU0JMUlZrdVUwaEpSbFE2WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJR05oYzJVZ1MwVlpMa05VVWt3NlhISmNiaUFnSUNBZ0lDQWdJQ0FnSUdOaGMyVWdTMFZaTGtGTVZEcGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQjBjblZsTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNCcFppQW9aUzV0WlhSaFMyVjVLU0J5WlhSMWNtNGdkSEoxWlR0Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lISmxkSFZ5YmlCbVlXeHpaVHRjY2x4dUlDQWdJQ0FnSUNCOUxGeHlYRzRnSUNBZ0lDQWdJR2x6Um5WdVkzUnBiMjVMWlhrNklHWjFibU4wYVc5dUlDaHJLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJR3NnUFNCckxuZG9hV05vSUQ4Z2F5NTNhR2xqYUNBNklHczdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lISmxkSFZ5YmlCcklENDlJREV4TWlBbUppQnJJRHc5SURFeU16dGNjbHh1SUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0I5TEZ4eVhHNGdJQ0FnVFVWQlUxVlNSVjlUUTFKUFRFeENRVkpmVkVWTlVFeEJWRVVnUFNCY0lqeGthWFlnWTJ4aGMzTTlKM05sYkdWamRESXRiV1ZoYzNWeVpTMXpZM0p2Ykd4aVlYSW5Qand2WkdsMlBsd2lMRnh5WEc1Y2NseHVJQ0FnSUVSSlFVTlNTVlJKUTFNZ1BTQjdYQ0pjWEhVeU5FSTJYQ0k2WENKQlhDSXNYQ0pjWEhWR1JqSXhYQ0k2WENKQlhDSXNYQ0pjWEhVd01FTXdYQ0k2WENKQlhDSXNYQ0pjWEhVd01FTXhYQ0k2WENKQlhDSXNYQ0pjWEhVd01FTXlYQ0k2WENKQlhDSXNYQ0pjWEhVeFJVRTJYQ0k2WENKQlhDSXNYQ0pjWEhVeFJVRTBYQ0k2WENKQlhDSXNYQ0pjWEhVeFJVRkJYQ0k2WENKQlhDSXNYQ0pjWEhVeFJVRTRYQ0k2WENKQlhDSXNYQ0pjWEhVd01FTXpYQ0k2WENKQlhDSXNYQ0pjWEhVd01UQXdYQ0k2WENKQlhDSXNYQ0pjWEhVd01UQXlYQ0k2WENKQlhDSXNYQ0pjWEhVeFJVSXdYQ0k2WENKQlhDSXNYQ0pjWEhVeFJVRkZYQ0k2WENKQlhDSXNYQ0pjWEhVeFJVSTBYQ0k2WENKQlhDSXNYQ0pjWEhVeFJVSXlYQ0k2WENKQlhDSXNYQ0pjWEhVd01qSTJYQ0k2WENKQlhDSXNYQ0pjWEhVd01VVXdYQ0k2WENKQlhDSXNYQ0pjWEhVd01FTTBYQ0k2WENKQlhDSXNYQ0pjWEhVd01VUkZYQ0k2WENKQlhDSXNYQ0pjWEhVeFJVRXlYQ0k2WENKQlhDSXNYQ0pjWEhVd01FTTFYQ0k2WENKQlhDSXNYQ0pjWEhVd01VWkJYQ0k2WENKQlhDSXNYQ0pjWEhVd01VTkVYQ0k2WENKQlhDSXNYQ0pjWEhVd01qQXdYQ0k2WENKQlhDSXNYQ0pjWEhVd01qQXlYQ0k2WENKQlhDSXNYQ0pjWEhVeFJVRXdYQ0k2WENKQlhDSXNYQ0pjWEhVeFJVRkRYQ0k2WENKQlhDSXNYQ0pjWEhVeFJVSTJYQ0k2WENKQlhDSXNYQ0pjWEhVeFJUQXdYQ0k2WENKQlhDSXNYQ0pjWEhVd01UQTBYQ0k2WENKQlhDSXNYQ0pjWEhVd01qTkJYQ0k2WENKQlhDSXNYQ0pjWEhVeVF6WkdYQ0k2WENKQlhDSXNYQ0pjWEhWQk56TXlYQ0k2WENKQlFWd2lMRndpWEZ4MU1EQkRObHdpT2x3aVFVVmNJaXhjSWx4Y2RUQXhSa05jSWpwY0lrRkZYQ0lzWENKY1hIVXdNVVV5WENJNlhDSkJSVndpTEZ3aVhGeDFRVGN6TkZ3aU9sd2lRVTljSWl4Y0lseGNkVUUzTXpaY0lqcGNJa0ZWWENJc1hDSmNYSFZCTnpNNFhDSTZYQ0pCVmx3aUxGd2lYRngxUVRjelFWd2lPbHdpUVZaY0lpeGNJbHhjZFVFM00wTmNJanBjSWtGWlhDSXNYQ0pjWEhVeU5FSTNYQ0k2WENKQ1hDSXNYQ0pjWEhWR1JqSXlYQ0k2WENKQ1hDSXNYQ0pjWEhVeFJUQXlYQ0k2WENKQ1hDSXNYQ0pjWEhVeFJUQTBYQ0k2WENKQ1hDSXNYQ0pjWEhVeFJUQTJYQ0k2WENKQ1hDSXNYQ0pjWEhVd01qUXpYQ0k2WENKQ1hDSXNYQ0pjWEhVd01UZ3lYQ0k2WENKQ1hDSXNYQ0pjWEhVd01UZ3hYQ0k2WENKQ1hDSXNYQ0pjWEhVeU5FSTRYQ0k2WENKRFhDSXNYQ0pjWEhWR1JqSXpYQ0k2WENKRFhDSXNYQ0pjWEhVd01UQTJYQ0k2WENKRFhDSXNYQ0pjWEhVd01UQTRYQ0k2WENKRFhDSXNYQ0pjWEhVd01UQkJYQ0k2WENKRFhDSXNYQ0pjWEhVd01UQkRYQ0k2WENKRFhDSXNYQ0pjWEhVd01FTTNYQ0k2WENKRFhDSXNYQ0pjWEhVeFJUQTRYQ0k2WENKRFhDSXNYQ0pjWEhVd01UZzNYQ0k2WENKRFhDSXNYQ0pjWEhVd01qTkNYQ0k2WENKRFhDSXNYQ0pjWEhWQk56TkZYQ0k2WENKRFhDSXNYQ0pjWEhVeU5FSTVYQ0k2WENKRVhDSXNYQ0pjWEhWR1JqSTBYQ0k2WENKRVhDSXNYQ0pjWEhVeFJUQkJYQ0k2WENKRVhDSXNYQ0pjWEhVd01UQkZYQ0k2WENKRVhDSXNYQ0pjWEhVeFJUQkRYQ0k2WENKRVhDSXNYQ0pjWEhVeFJURXdYQ0k2WENKRVhDSXNYQ0pjWEhVeFJURXlYQ0k2WENKRVhDSXNYQ0pjWEhVeFJUQkZYQ0k2WENKRVhDSXNYQ0pjWEhVd01URXdYQ0k2WENKRVhDSXNYQ0pjWEhVd01UaENYQ0k2WENKRVhDSXNYQ0pjWEhVd01UaEJYQ0k2WENKRVhDSXNYQ0pjWEhVd01UZzVYQ0k2WENKRVhDSXNYQ0pjWEhWQk56YzVYQ0k2WENKRVhDSXNYQ0pjWEhVd01VWXhYQ0k2WENKRVdsd2lMRndpWEZ4MU1ERkRORndpT2x3aVJGcGNJaXhjSWx4Y2RUQXhSakpjSWpwY0lrUjZYQ0lzWENKY1hIVXdNVU0xWENJNlhDSkVlbHdpTEZ3aVhGeDFNalJDUVZ3aU9sd2lSVndpTEZ3aVhGeDFSa1l5TlZ3aU9sd2lSVndpTEZ3aVhGeDFNREJET0Z3aU9sd2lSVndpTEZ3aVhGeDFNREJET1Z3aU9sd2lSVndpTEZ3aVhGeDFNREJEUVZ3aU9sd2lSVndpTEZ3aVhGeDFNVVZETUZ3aU9sd2lSVndpTEZ3aVhGeDFNVVZDUlZ3aU9sd2lSVndpTEZ3aVhGeDFNVVZETkZ3aU9sd2lSVndpTEZ3aVhGeDFNVVZETWx3aU9sd2lSVndpTEZ3aVhGeDFNVVZDUTF3aU9sd2lSVndpTEZ3aVhGeDFNREV4TWx3aU9sd2lSVndpTEZ3aVhGeDFNVVV4TkZ3aU9sd2lSVndpTEZ3aVhGeDFNVVV4Tmx3aU9sd2lSVndpTEZ3aVhGeDFNREV4TkZ3aU9sd2lSVndpTEZ3aVhGeDFNREV4Tmx3aU9sd2lSVndpTEZ3aVhGeDFNREJEUWx3aU9sd2lSVndpTEZ3aVhGeDFNVVZDUVZ3aU9sd2lSVndpTEZ3aVhGeDFNREV4UVZ3aU9sd2lSVndpTEZ3aVhGeDFNREl3TkZ3aU9sd2lSVndpTEZ3aVhGeDFNREl3Tmx3aU9sd2lSVndpTEZ3aVhGeDFNVVZDT0Z3aU9sd2lSVndpTEZ3aVhGeDFNVVZETmx3aU9sd2lSVndpTEZ3aVhGeDFNREl5T0Z3aU9sd2lSVndpTEZ3aVhGeDFNVVV4UTF3aU9sd2lSVndpTEZ3aVhGeDFNREV4T0Z3aU9sd2lSVndpTEZ3aVhGeDFNVVV4T0Z3aU9sd2lSVndpTEZ3aVhGeDFNVVV4UVZ3aU9sd2lSVndpTEZ3aVhGeDFNREU1TUZ3aU9sd2lSVndpTEZ3aVhGeDFNREU0UlZ3aU9sd2lSVndpTEZ3aVhGeDFNalJDUWx3aU9sd2lSbHdpTEZ3aVhGeDFSa1l5Tmx3aU9sd2lSbHdpTEZ3aVhGeDFNVVV4UlZ3aU9sd2lSbHdpTEZ3aVhGeDFNREU1TVZ3aU9sd2lSbHdpTEZ3aVhGeDFRVGMzUWx3aU9sd2lSbHdpTEZ3aVhGeDFNalJDUTF3aU9sd2lSMXdpTEZ3aVhGeDFSa1l5TjF3aU9sd2lSMXdpTEZ3aVhGeDFNREZHTkZ3aU9sd2lSMXdpTEZ3aVhGeDFNREV4UTF3aU9sd2lSMXdpTEZ3aVhGeDFNVVV5TUZ3aU9sd2lSMXdpTEZ3aVhGeDFNREV4UlZ3aU9sd2lSMXdpTEZ3aVhGeDFNREV5TUZ3aU9sd2lSMXdpTEZ3aVhGeDFNREZGTmx3aU9sd2lSMXdpTEZ3aVhGeDFNREV5TWx3aU9sd2lSMXdpTEZ3aVhGeDFNREZGTkZ3aU9sd2lSMXdpTEZ3aVhGeDFNREU1TTF3aU9sd2lSMXdpTEZ3aVhGeDFRVGRCTUZ3aU9sd2lSMXdpTEZ3aVhGeDFRVGMzUkZ3aU9sd2lSMXdpTEZ3aVhGeDFRVGMzUlZ3aU9sd2lSMXdpTEZ3aVhGeDFNalJDUkZ3aU9sd2lTRndpTEZ3aVhGeDFSa1l5T0Z3aU9sd2lTRndpTEZ3aVhGeDFNREV5TkZ3aU9sd2lTRndpTEZ3aVhGeDFNVVV5TWx3aU9sd2lTRndpTEZ3aVhGeDFNVVV5Tmx3aU9sd2lTRndpTEZ3aVhGeDFNREl4UlZ3aU9sd2lTRndpTEZ3aVhGeDFNVVV5TkZ3aU9sd2lTRndpTEZ3aVhGeDFNVVV5T0Z3aU9sd2lTRndpTEZ3aVhGeDFNVVV5UVZ3aU9sd2lTRndpTEZ3aVhGeDFNREV5Tmx3aU9sd2lTRndpTEZ3aVhGeDFNa00yTjF3aU9sd2lTRndpTEZ3aVhGeDFNa00zTlZ3aU9sd2lTRndpTEZ3aVhGeDFRVGM0UkZ3aU9sd2lTRndpTEZ3aVhGeDFNalJDUlZ3aU9sd2lTVndpTEZ3aVhGeDFSa1l5T1Z3aU9sd2lTVndpTEZ3aVhGeDFNREJEUTF3aU9sd2lTVndpTEZ3aVhGeDFNREJEUkZ3aU9sd2lTVndpTEZ3aVhGeDFNREJEUlZ3aU9sd2lTVndpTEZ3aVhGeDFNREV5T0Z3aU9sd2lTVndpTEZ3aVhGeDFNREV5UVZ3aU9sd2lTVndpTEZ3aVhGeDFNREV5UTF3aU9sd2lTVndpTEZ3aVhGeDFNREV6TUZ3aU9sd2lTVndpTEZ3aVhGeDFNREJEUmx3aU9sd2lTVndpTEZ3aVhGeDFNVVV5UlZ3aU9sd2lTVndpTEZ3aVhGeDFNVVZET0Z3aU9sd2lTVndpTEZ3aVhGeDFNREZEUmx3aU9sd2lTVndpTEZ3aVhGeDFNREl3T0Z3aU9sd2lTVndpTEZ3aVhGeDFNREl3UVZ3aU9sd2lTVndpTEZ3aVhGeDFNVVZEUVZ3aU9sd2lTVndpTEZ3aVhGeDFNREV5UlZ3aU9sd2lTVndpTEZ3aVhGeDFNVVV5UTF3aU9sd2lTVndpTEZ3aVhGeDFNREU1TjF3aU9sd2lTVndpTEZ3aVhGeDFNalJDUmx3aU9sd2lTbHdpTEZ3aVhGeDFSa1l5UVZ3aU9sd2lTbHdpTEZ3aVhGeDFNREV6TkZ3aU9sd2lTbHdpTEZ3aVhGeDFNREkwT0Z3aU9sd2lTbHdpTEZ3aVhGeDFNalJETUZ3aU9sd2lTMXdpTEZ3aVhGeDFSa1l5UWx3aU9sd2lTMXdpTEZ3aVhGeDFNVVV6TUZ3aU9sd2lTMXdpTEZ3aVhGeDFNREZGT0Z3aU9sd2lTMXdpTEZ3aVhGeDFNVVV6TWx3aU9sd2lTMXdpTEZ3aVhGeDFNREV6Tmx3aU9sd2lTMXdpTEZ3aVhGeDFNVVV6TkZ3aU9sd2lTMXdpTEZ3aVhGeDFNREU1T0Z3aU9sd2lTMXdpTEZ3aVhGeDFNa00yT1Z3aU9sd2lTMXdpTEZ3aVhGeDFRVGMwTUZ3aU9sd2lTMXdpTEZ3aVhGeDFRVGMwTWx3aU9sd2lTMXdpTEZ3aVhGeDFRVGMwTkZ3aU9sd2lTMXdpTEZ3aVhGeDFRVGRCTWx3aU9sd2lTMXdpTEZ3aVhGeDFNalJETVZ3aU9sd2lURndpTEZ3aVhGeDFSa1l5UTF3aU9sd2lURndpTEZ3aVhGeDFNREV6Umx3aU9sd2lURndpTEZ3aVhGeDFNREV6T1Z3aU9sd2lURndpTEZ3aVhGeDFNREV6UkZ3aU9sd2lURndpTEZ3aVhGeDFNVVV6Tmx3aU9sd2lURndpTEZ3aVhGeDFNVVV6T0Z3aU9sd2lURndpTEZ3aVhGeDFNREV6UWx3aU9sd2lURndpTEZ3aVhGeDFNVVV6UTF3aU9sd2lURndpTEZ3aVhGeDFNVVV6UVZ3aU9sd2lURndpTEZ3aVhGeDFNREUwTVZ3aU9sd2lURndpTEZ3aVhGeDFNREl6UkZ3aU9sd2lURndpTEZ3aVhGeDFNa00yTWx3aU9sd2lURndpTEZ3aVhGeDFNa00yTUZ3aU9sd2lURndpTEZ3aVhGeDFRVGMwT0Z3aU9sd2lURndpTEZ3aVhGeDFRVGMwTmx3aU9sd2lURndpTEZ3aVhGeDFRVGM0TUZ3aU9sd2lURndpTEZ3aVhGeDFNREZETjF3aU9sd2lURXBjSWl4Y0lseGNkVEF4UXpoY0lqcGNJa3hxWENJc1hDSmNYSFV5TkVNeVhDSTZYQ0pOWENJc1hDSmNYSFZHUmpKRVhDSTZYQ0pOWENJc1hDSmNYSFV4UlRORlhDSTZYQ0pOWENJc1hDSmNYSFV4UlRRd1hDSTZYQ0pOWENJc1hDSmNYSFV4UlRReVhDSTZYQ0pOWENJc1hDSmNYSFV5UXpaRlhDSTZYQ0pOWENJc1hDSmNYSFV3TVRsRFhDSTZYQ0pOWENJc1hDSmNYSFV5TkVNelhDSTZYQ0pPWENJc1hDSmNYSFZHUmpKRlhDSTZYQ0pPWENJc1hDSmNYSFV3TVVZNFhDSTZYQ0pPWENJc1hDSmNYSFV3TVRRelhDSTZYQ0pPWENJc1hDSmNYSFV3TUVReFhDSTZYQ0pPWENJc1hDSmNYSFV4UlRRMFhDSTZYQ0pPWENJc1hDSmNYSFV3TVRRM1hDSTZYQ0pPWENJc1hDSmNYSFV4UlRRMlhDSTZYQ0pPWENJc1hDSmNYSFV3TVRRMVhDSTZYQ0pPWENJc1hDSmNYSFV4UlRSQlhDSTZYQ0pPWENJc1hDSmNYSFV4UlRRNFhDSTZYQ0pPWENJc1hDSmNYSFV3TWpJd1hDSTZYQ0pPWENJc1hDSmNYSFV3TVRsRVhDSTZYQ0pPWENJc1hDSmNYSFZCTnprd1hDSTZYQ0pPWENJc1hDSmNYSFZCTjBFMFhDSTZYQ0pPWENJc1hDSmNYSFV3TVVOQlhDSTZYQ0pPU2x3aUxGd2lYRngxTURGRFFsd2lPbHdpVG1wY0lpeGNJbHhjZFRJMFF6UmNJanBjSWs5Y0lpeGNJbHhjZFVaR01rWmNJanBjSWs5Y0lpeGNJbHhjZFRBd1JESmNJanBjSWs5Y0lpeGNJbHhjZFRBd1JETmNJanBjSWs5Y0lpeGNJbHhjZFRBd1JEUmNJanBjSWs5Y0lpeGNJbHhjZFRGRlJESmNJanBjSWs5Y0lpeGNJbHhjZFRGRlJEQmNJanBjSWs5Y0lpeGNJbHhjZFRGRlJEWmNJanBjSWs5Y0lpeGNJbHhjZFRGRlJEUmNJanBjSWs5Y0lpeGNJbHhjZFRBd1JEVmNJanBjSWs5Y0lpeGNJbHhjZFRGRk5FTmNJanBjSWs5Y0lpeGNJbHhjZFRBeU1rTmNJanBjSWs5Y0lpeGNJbHhjZFRGRk5FVmNJanBjSWs5Y0lpeGNJbHhjZFRBeE5FTmNJanBjSWs5Y0lpeGNJbHhjZFRGRk5UQmNJanBjSWs5Y0lpeGNJbHhjZFRGRk5USmNJanBjSWs5Y0lpeGNJbHhjZFRBeE5FVmNJanBjSWs5Y0lpeGNJbHhjZFRBeU1rVmNJanBjSWs5Y0lpeGNJbHhjZFRBeU16QmNJanBjSWs5Y0lpeGNJbHhjZFRBd1JEWmNJanBjSWs5Y0lpeGNJbHhjZFRBeU1rRmNJanBjSWs5Y0lpeGNJbHhjZFRGRlEwVmNJanBjSWs5Y0lpeGNJbHhjZFRBeE5UQmNJanBjSWs5Y0lpeGNJbHhjZFRBeFJERmNJanBjSWs5Y0lpeGNJbHhjZFRBeU1FTmNJanBjSWs5Y0lpeGNJbHhjZFRBeU1FVmNJanBjSWs5Y0lpeGNJbHhjZFRBeFFUQmNJanBjSWs5Y0lpeGNJbHhjZFRGRlJFTmNJanBjSWs5Y0lpeGNJbHhjZFRGRlJFRmNJanBjSWs5Y0lpeGNJbHhjZFRGRlJUQmNJanBjSWs5Y0lpeGNJbHhjZFRGRlJFVmNJanBjSWs5Y0lpeGNJbHhjZFRGRlJUSmNJanBjSWs5Y0lpeGNJbHhjZFRGRlEwTmNJanBjSWs5Y0lpeGNJbHhjZFRGRlJEaGNJanBjSWs5Y0lpeGNJbHhjZFRBeFJVRmNJanBjSWs5Y0lpeGNJbHhjZFRBeFJVTmNJanBjSWs5Y0lpeGNJbHhjZFRBd1JEaGNJanBjSWs5Y0lpeGNJbHhjZFRBeFJrVmNJanBjSWs5Y0lpeGNJbHhjZFRBeE9EWmNJanBjSWs5Y0lpeGNJbHhjZFRBeE9VWmNJanBjSWs5Y0lpeGNJbHhjZFVFM05FRmNJanBjSWs5Y0lpeGNJbHhjZFVFM05FTmNJanBjSWs5Y0lpeGNJbHhjZFRBeFFUSmNJanBjSWs5SlhDSXNYQ0pjWEhWQk56UkZYQ0k2WENKUFQxd2lMRndpWEZ4MU1ESXlNbHdpT2x3aVQxVmNJaXhjSWx4Y2RUSTBRelZjSWpwY0lsQmNJaXhjSWx4Y2RVWkdNekJjSWpwY0lsQmNJaXhjSWx4Y2RURkZOVFJjSWpwY0lsQmNJaXhjSWx4Y2RURkZOVFpjSWpwY0lsQmNJaXhjSWx4Y2RUQXhRVFJjSWpwY0lsQmNJaXhjSWx4Y2RUSkROak5jSWpwY0lsQmNJaXhjSWx4Y2RVRTNOVEJjSWpwY0lsQmNJaXhjSWx4Y2RVRTNOVEpjSWpwY0lsQmNJaXhjSWx4Y2RVRTNOVFJjSWpwY0lsQmNJaXhjSWx4Y2RUSTBRelpjSWpwY0lsRmNJaXhjSWx4Y2RVWkdNekZjSWpwY0lsRmNJaXhjSWx4Y2RVRTNOVFpjSWpwY0lsRmNJaXhjSWx4Y2RVRTNOVGhjSWpwY0lsRmNJaXhjSWx4Y2RUQXlORUZjSWpwY0lsRmNJaXhjSWx4Y2RUSTBRemRjSWpwY0lsSmNJaXhjSWx4Y2RVWkdNekpjSWpwY0lsSmNJaXhjSWx4Y2RUQXhOVFJjSWpwY0lsSmNJaXhjSWx4Y2RURkZOVGhjSWpwY0lsSmNJaXhjSWx4Y2RUQXhOVGhjSWpwY0lsSmNJaXhjSWx4Y2RUQXlNVEJjSWpwY0lsSmNJaXhjSWx4Y2RUQXlNVEpjSWpwY0lsSmNJaXhjSWx4Y2RURkZOVUZjSWpwY0lsSmNJaXhjSWx4Y2RURkZOVU5jSWpwY0lsSmNJaXhjSWx4Y2RUQXhOVFpjSWpwY0lsSmNJaXhjSWx4Y2RURkZOVVZjSWpwY0lsSmNJaXhjSWx4Y2RUQXlORU5jSWpwY0lsSmNJaXhjSWx4Y2RUSkROalJjSWpwY0lsSmNJaXhjSWx4Y2RVRTNOVUZjSWpwY0lsSmNJaXhjSWx4Y2RVRTNRVFpjSWpwY0lsSmNJaXhjSWx4Y2RVRTNPREpjSWpwY0lsSmNJaXhjSWx4Y2RUSTBRemhjSWpwY0lsTmNJaXhjSWx4Y2RVWkdNek5jSWpwY0lsTmNJaXhjSWx4Y2RURkZPVVZjSWpwY0lsTmNJaXhjSWx4Y2RUQXhOVUZjSWpwY0lsTmNJaXhjSWx4Y2RURkZOalJjSWpwY0lsTmNJaXhjSWx4Y2RUQXhOVU5jSWpwY0lsTmNJaXhjSWx4Y2RURkZOakJjSWpwY0lsTmNJaXhjSWx4Y2RUQXhOakJjSWpwY0lsTmNJaXhjSWx4Y2RURkZOalpjSWpwY0lsTmNJaXhjSWx4Y2RURkZOakpjSWpwY0lsTmNJaXhjSWx4Y2RURkZOamhjSWpwY0lsTmNJaXhjSWx4Y2RUQXlNVGhjSWpwY0lsTmNJaXhjSWx4Y2RUQXhOVVZjSWpwY0lsTmNJaXhjSWx4Y2RUSkROMFZjSWpwY0lsTmNJaXhjSWx4Y2RVRTNRVGhjSWpwY0lsTmNJaXhjSWx4Y2RVRTNPRFJjSWpwY0lsTmNJaXhjSWx4Y2RUSTBRemxjSWpwY0lsUmNJaXhjSWx4Y2RVWkdNelJjSWpwY0lsUmNJaXhjSWx4Y2RURkZOa0ZjSWpwY0lsUmNJaXhjSWx4Y2RUQXhOalJjSWpwY0lsUmNJaXhjSWx4Y2RURkZOa05jSWpwY0lsUmNJaXhjSWx4Y2RUQXlNVUZjSWpwY0lsUmNJaXhjSWx4Y2RUQXhOakpjSWpwY0lsUmNJaXhjSWx4Y2RURkZOekJjSWpwY0lsUmNJaXhjSWx4Y2RURkZOa1ZjSWpwY0lsUmNJaXhjSWx4Y2RUQXhOalpjSWpwY0lsUmNJaXhjSWx4Y2RUQXhRVU5jSWpwY0lsUmNJaXhjSWx4Y2RUQXhRVVZjSWpwY0lsUmNJaXhjSWx4Y2RUQXlNMFZjSWpwY0lsUmNJaXhjSWx4Y2RVRTNPRFpjSWpwY0lsUmNJaXhjSWx4Y2RVRTNNamhjSWpwY0lsUmFYQ0lzWENKY1hIVXlORU5CWENJNlhDSlZYQ0lzWENKY1hIVkdSak0xWENJNlhDSlZYQ0lzWENKY1hIVXdNRVE1WENJNlhDSlZYQ0lzWENKY1hIVXdNRVJCWENJNlhDSlZYQ0lzWENKY1hIVXdNRVJDWENJNlhDSlZYQ0lzWENKY1hIVXdNVFk0WENJNlhDSlZYQ0lzWENKY1hIVXhSVGM0WENJNlhDSlZYQ0lzWENKY1hIVXdNVFpCWENJNlhDSlZYQ0lzWENKY1hIVXhSVGRCWENJNlhDSlZYQ0lzWENKY1hIVXdNVFpEWENJNlhDSlZYQ0lzWENKY1hIVXdNRVJEWENJNlhDSlZYQ0lzWENKY1hIVXdNVVJDWENJNlhDSlZYQ0lzWENKY1hIVXdNVVEzWENJNlhDSlZYQ0lzWENKY1hIVXdNVVExWENJNlhDSlZYQ0lzWENKY1hIVXdNVVE1WENJNlhDSlZYQ0lzWENKY1hIVXhSVVUyWENJNlhDSlZYQ0lzWENKY1hIVXdNVFpGWENJNlhDSlZYQ0lzWENKY1hIVXdNVGN3WENJNlhDSlZYQ0lzWENKY1hIVXdNVVF6WENJNlhDSlZYQ0lzWENKY1hIVXdNakUwWENJNlhDSlZYQ0lzWENKY1hIVXdNakUyWENJNlhDSlZYQ0lzWENKY1hIVXdNVUZHWENJNlhDSlZYQ0lzWENKY1hIVXhSVVZCWENJNlhDSlZYQ0lzWENKY1hIVXhSVVU0WENJNlhDSlZYQ0lzWENKY1hIVXhSVVZGWENJNlhDSlZYQ0lzWENKY1hIVXhSVVZEWENJNlhDSlZYQ0lzWENKY1hIVXhSVVl3WENJNlhDSlZYQ0lzWENKY1hIVXhSVVUwWENJNlhDSlZYQ0lzWENKY1hIVXhSVGN5WENJNlhDSlZYQ0lzWENKY1hIVXdNVGN5WENJNlhDSlZYQ0lzWENKY1hIVXhSVGMyWENJNlhDSlZYQ0lzWENKY1hIVXhSVGMwWENJNlhDSlZYQ0lzWENKY1hIVXdNalEwWENJNlhDSlZYQ0lzWENKY1hIVXlORU5DWENJNlhDSldYQ0lzWENKY1hIVkdSak0yWENJNlhDSldYQ0lzWENKY1hIVXhSVGREWENJNlhDSldYQ0lzWENKY1hIVXhSVGRGWENJNlhDSldYQ0lzWENKY1hIVXdNVUl5WENJNlhDSldYQ0lzWENKY1hIVkJOelZGWENJNlhDSldYQ0lzWENKY1hIVXdNalExWENJNlhDSldYQ0lzWENKY1hIVkJOell3WENJNlhDSldXVndpTEZ3aVhGeDFNalJEUTF3aU9sd2lWMXdpTEZ3aVhGeDFSa1l6TjF3aU9sd2lWMXdpTEZ3aVhGeDFNVVU0TUZ3aU9sd2lWMXdpTEZ3aVhGeDFNVVU0TWx3aU9sd2lWMXdpTEZ3aVhGeDFNREUzTkZ3aU9sd2lWMXdpTEZ3aVhGeDFNVVU0Tmx3aU9sd2lWMXdpTEZ3aVhGeDFNVVU0TkZ3aU9sd2lWMXdpTEZ3aVhGeDFNVVU0T0Z3aU9sd2lWMXdpTEZ3aVhGeDFNa00zTWx3aU9sd2lWMXdpTEZ3aVhGeDFNalJEUkZ3aU9sd2lXRndpTEZ3aVhGeDFSa1l6T0Z3aU9sd2lXRndpTEZ3aVhGeDFNVVU0UVZ3aU9sd2lXRndpTEZ3aVhGeDFNVVU0UTF3aU9sd2lXRndpTEZ3aVhGeDFNalJEUlZ3aU9sd2lXVndpTEZ3aVhGeDFSa1l6T1Z3aU9sd2lXVndpTEZ3aVhGeDFNVVZHTWx3aU9sd2lXVndpTEZ3aVhGeDFNREJFUkZ3aU9sd2lXVndpTEZ3aVhGeDFNREUzTmx3aU9sd2lXVndpTEZ3aVhGeDFNVVZHT0Z3aU9sd2lXVndpTEZ3aVhGeDFNREl6TWx3aU9sd2lXVndpTEZ3aVhGeDFNVVU0UlZ3aU9sd2lXVndpTEZ3aVhGeDFNREUzT0Z3aU9sd2lXVndpTEZ3aVhGeDFNVVZHTmx3aU9sd2lXVndpTEZ3aVhGeDFNVVZHTkZ3aU9sd2lXVndpTEZ3aVhGeDFNREZDTTF3aU9sd2lXVndpTEZ3aVhGeDFNREkwUlZ3aU9sd2lXVndpTEZ3aVhGeDFNVVZHUlZ3aU9sd2lXVndpTEZ3aVhGeDFNalJEUmx3aU9sd2lXbHdpTEZ3aVhGeDFSa1l6UVZ3aU9sd2lXbHdpTEZ3aVhGeDFNREUzT1Z3aU9sd2lXbHdpTEZ3aVhGeDFNVVU1TUZ3aU9sd2lXbHdpTEZ3aVhGeDFNREUzUWx3aU9sd2lXbHdpTEZ3aVhGeDFNREUzUkZ3aU9sd2lXbHdpTEZ3aVhGeDFNVVU1TWx3aU9sd2lXbHdpTEZ3aVhGeDFNVVU1TkZ3aU9sd2lXbHdpTEZ3aVhGeDFNREZDTlZ3aU9sd2lXbHdpTEZ3aVhGeDFNREl5TkZ3aU9sd2lXbHdpTEZ3aVhGeDFNa00zUmx3aU9sd2lXbHdpTEZ3aVhGeDFNa00yUWx3aU9sd2lXbHdpTEZ3aVhGeDFRVGMyTWx3aU9sd2lXbHdpTEZ3aVhGeDFNalJFTUZ3aU9sd2lZVndpTEZ3aVhGeDFSa1kwTVZ3aU9sd2lZVndpTEZ3aVhGeDFNVVU1UVZ3aU9sd2lZVndpTEZ3aVhGeDFNREJGTUZ3aU9sd2lZVndpTEZ3aVhGeDFNREJGTVZ3aU9sd2lZVndpTEZ3aVhGeDFNREJGTWx3aU9sd2lZVndpTEZ3aVhGeDFNVVZCTjF3aU9sd2lZVndpTEZ3aVhGeDFNVVZCTlZ3aU9sd2lZVndpTEZ3aVhGeDFNVVZCUWx3aU9sd2lZVndpTEZ3aVhGeDFNVVZCT1Z3aU9sd2lZVndpTEZ3aVhGeDFNREJGTTF3aU9sd2lZVndpTEZ3aVhGeDFNREV3TVZ3aU9sd2lZVndpTEZ3aVhGeDFNREV3TTF3aU9sd2lZVndpTEZ3aVhGeDFNVVZDTVZ3aU9sd2lZVndpTEZ3aVhGeDFNVVZCUmx3aU9sd2lZVndpTEZ3aVhGeDFNVVZDTlZ3aU9sd2lZVndpTEZ3aVhGeDFNVVZDTTF3aU9sd2lZVndpTEZ3aVhGeDFNREl5TjF3aU9sd2lZVndpTEZ3aVhGeDFNREZGTVZ3aU9sd2lZVndpTEZ3aVhGeDFNREJGTkZ3aU9sd2lZVndpTEZ3aVhGeDFNREZFUmx3aU9sd2lZVndpTEZ3aVhGeDFNVVZCTTF3aU9sd2lZVndpTEZ3aVhGeDFNREJGTlZ3aU9sd2lZVndpTEZ3aVhGeDFNREZHUWx3aU9sd2lZVndpTEZ3aVhGeDFNREZEUlZ3aU9sd2lZVndpTEZ3aVhGeDFNREl3TVZ3aU9sd2lZVndpTEZ3aVhGeDFNREl3TTF3aU9sd2lZVndpTEZ3aVhGeDFNVVZCTVZ3aU9sd2lZVndpTEZ3aVhGeDFNVVZCUkZ3aU9sd2lZVndpTEZ3aVhGeDFNVVZDTjF3aU9sd2lZVndpTEZ3aVhGeDFNVVV3TVZ3aU9sd2lZVndpTEZ3aVhGeDFNREV3TlZ3aU9sd2lZVndpTEZ3aVhGeDFNa00yTlZ3aU9sd2lZVndpTEZ3aVhGeDFNREkxTUZ3aU9sd2lZVndpTEZ3aVhGeDFRVGN6TTF3aU9sd2lZV0ZjSWl4Y0lseGNkVEF3UlRaY0lqcGNJbUZsWENJc1hDSmNYSFV3TVVaRVhDSTZYQ0poWlZ3aUxGd2lYRngxTURGRk0xd2lPbHdpWVdWY0lpeGNJbHhjZFVFM016VmNJanBjSW1GdlhDSXNYQ0pjWEhWQk56TTNYQ0k2WENKaGRWd2lMRndpWEZ4MVFUY3pPVndpT2x3aVlYWmNJaXhjSWx4Y2RVRTNNMEpjSWpwY0ltRjJYQ0lzWENKY1hIVkJOek5FWENJNlhDSmhlVndpTEZ3aVhGeDFNalJFTVZ3aU9sd2lZbHdpTEZ3aVhGeDFSa1kwTWx3aU9sd2lZbHdpTEZ3aVhGeDFNVVV3TTF3aU9sd2lZbHdpTEZ3aVhGeDFNVVV3TlZ3aU9sd2lZbHdpTEZ3aVhGeDFNVVV3TjF3aU9sd2lZbHdpTEZ3aVhGeDFNREU0TUZ3aU9sd2lZbHdpTEZ3aVhGeDFNREU0TTF3aU9sd2lZbHdpTEZ3aVhGeDFNREkxTTF3aU9sd2lZbHdpTEZ3aVhGeDFNalJFTWx3aU9sd2lZMXdpTEZ3aVhGeDFSa1kwTTF3aU9sd2lZMXdpTEZ3aVhGeDFNREV3TjF3aU9sd2lZMXdpTEZ3aVhGeDFNREV3T1Z3aU9sd2lZMXdpTEZ3aVhGeDFNREV3UWx3aU9sd2lZMXdpTEZ3aVhGeDFNREV3UkZ3aU9sd2lZMXdpTEZ3aVhGeDFNREJGTjF3aU9sd2lZMXdpTEZ3aVhGeDFNVVV3T1Z3aU9sd2lZMXdpTEZ3aVhGeDFNREU0T0Z3aU9sd2lZMXdpTEZ3aVhGeDFNREl6UTF3aU9sd2lZMXdpTEZ3aVhGeDFRVGN6Umx3aU9sd2lZMXdpTEZ3aVhGeDFNakU0TkZ3aU9sd2lZMXdpTEZ3aVhGeDFNalJFTTF3aU9sd2laRndpTEZ3aVhGeDFSa1kwTkZ3aU9sd2laRndpTEZ3aVhGeDFNVVV3UWx3aU9sd2laRndpTEZ3aVhGeDFNREV3Umx3aU9sd2laRndpTEZ3aVhGeDFNVVV3UkZ3aU9sd2laRndpTEZ3aVhGeDFNVVV4TVZ3aU9sd2laRndpTEZ3aVhGeDFNVVV4TTF3aU9sd2laRndpTEZ3aVhGeDFNVVV3Umx3aU9sd2laRndpTEZ3aVhGeDFNREV4TVZ3aU9sd2laRndpTEZ3aVhGeDFNREU0UTF3aU9sd2laRndpTEZ3aVhGeDFNREkxTmx3aU9sd2laRndpTEZ3aVhGeDFNREkxTjF3aU9sd2laRndpTEZ3aVhGeDFRVGMzUVZ3aU9sd2laRndpTEZ3aVhGeDFNREZHTTF3aU9sd2laSHBjSWl4Y0lseGNkVEF4UXpaY0lqcGNJbVI2WENJc1hDSmNYSFV5TkVRMFhDSTZYQ0psWENJc1hDSmNYSFZHUmpRMVhDSTZYQ0psWENJc1hDSmNYSFV3TUVVNFhDSTZYQ0psWENJc1hDSmNYSFV3TUVVNVhDSTZYQ0psWENJc1hDSmNYSFV3TUVWQlhDSTZYQ0psWENJc1hDSmNYSFV4UlVNeFhDSTZYQ0psWENJc1hDSmNYSFV4UlVKR1hDSTZYQ0psWENJc1hDSmNYSFV4UlVNMVhDSTZYQ0psWENJc1hDSmNYSFV4UlVNelhDSTZYQ0psWENJc1hDSmNYSFV4UlVKRVhDSTZYQ0psWENJc1hDSmNYSFV3TVRFelhDSTZYQ0psWENJc1hDSmNYSFV4UlRFMVhDSTZYQ0psWENJc1hDSmNYSFV4UlRFM1hDSTZYQ0psWENJc1hDSmNYSFV3TVRFMVhDSTZYQ0psWENJc1hDSmNYSFV3TVRFM1hDSTZYQ0psWENJc1hDSmNYSFV3TUVWQ1hDSTZYQ0psWENJc1hDSmNYSFV4UlVKQ1hDSTZYQ0psWENJc1hDSmNYSFV3TVRGQ1hDSTZYQ0psWENJc1hDSmNYSFV3TWpBMVhDSTZYQ0psWENJc1hDSmNYSFV3TWpBM1hDSTZYQ0psWENJc1hDSmNYSFV4UlVJNVhDSTZYQ0psWENJc1hDSmNYSFV4UlVNM1hDSTZYQ0psWENJc1hDSmNYSFV3TWpJNVhDSTZYQ0psWENJc1hDSmNYSFV4UlRGRVhDSTZYQ0psWENJc1hDSmNYSFV3TVRFNVhDSTZYQ0psWENJc1hDSmNYSFV4UlRFNVhDSTZYQ0psWENJc1hDSmNYSFV4UlRGQ1hDSTZYQ0psWENJc1hDSmNYSFV3TWpRM1hDSTZYQ0psWENJc1hDSmNYSFV3TWpWQ1hDSTZYQ0psWENJc1hDSmNYSFV3TVVSRVhDSTZYQ0psWENJc1hDSmNYSFV5TkVRMVhDSTZYQ0ptWENJc1hDSmNYSFZHUmpRMlhDSTZYQ0ptWENJc1hDSmNYSFV4UlRGR1hDSTZYQ0ptWENJc1hDSmNYSFV3TVRreVhDSTZYQ0ptWENJc1hDSmNYSFZCTnpkRFhDSTZYQ0ptWENJc1hDSmNYSFV5TkVRMlhDSTZYQ0puWENJc1hDSmNYSFZHUmpRM1hDSTZYQ0puWENJc1hDSmNYSFV3TVVZMVhDSTZYQ0puWENJc1hDSmNYSFV3TVRGRVhDSTZYQ0puWENJc1hDSmNYSFV4UlRJeFhDSTZYQ0puWENJc1hDSmNYSFV3TVRGR1hDSTZYQ0puWENJc1hDSmNYSFV3TVRJeFhDSTZYQ0puWENJc1hDSmNYSFV3TVVVM1hDSTZYQ0puWENJc1hDSmNYSFV3TVRJelhDSTZYQ0puWENJc1hDSmNYSFV3TVVVMVhDSTZYQ0puWENJc1hDSmNYSFV3TWpZd1hDSTZYQ0puWENJc1hDSmNYSFZCTjBFeFhDSTZYQ0puWENJc1hDSmNYSFV4UkRjNVhDSTZYQ0puWENJc1hDSmNYSFZCTnpkR1hDSTZYQ0puWENJc1hDSmNYSFV5TkVRM1hDSTZYQ0pvWENJc1hDSmNYSFZHUmpRNFhDSTZYQ0pvWENJc1hDSmNYSFV3TVRJMVhDSTZYQ0pvWENJc1hDSmNYSFV4UlRJelhDSTZYQ0pvWENJc1hDSmNYSFV4UlRJM1hDSTZYQ0pvWENJc1hDSmNYSFV3TWpGR1hDSTZYQ0pvWENJc1hDSmNYSFV4UlRJMVhDSTZYQ0pvWENJc1hDSmNYSFV4UlRJNVhDSTZYQ0pvWENJc1hDSmNYSFV4UlRKQ1hDSTZYQ0pvWENJc1hDSmNYSFV4UlRrMlhDSTZYQ0pvWENJc1hDSmNYSFV3TVRJM1hDSTZYQ0pvWENJc1hDSmNYSFV5UXpZNFhDSTZYQ0pvWENJc1hDSmNYSFV5UXpjMlhDSTZYQ0pvWENJc1hDSmNYSFV3TWpZMVhDSTZYQ0pvWENJc1hDSmNYSFV3TVRrMVhDSTZYQ0pvZGx3aUxGd2lYRngxTWpSRU9Gd2lPbHdpYVZ3aUxGd2lYRngxUmtZME9Wd2lPbHdpYVZ3aUxGd2lYRngxTURCRlExd2lPbHdpYVZ3aUxGd2lYRngxTURCRlJGd2lPbHdpYVZ3aUxGd2lYRngxTURCRlJWd2lPbHdpYVZ3aUxGd2lYRngxTURFeU9Wd2lPbHdpYVZ3aUxGd2lYRngxTURFeVFsd2lPbHdpYVZ3aUxGd2lYRngxTURFeVJGd2lPbHdpYVZ3aUxGd2lYRngxTURCRlJsd2lPbHdpYVZ3aUxGd2lYRngxTVVVeVJsd2lPbHdpYVZ3aUxGd2lYRngxTVVWRE9Wd2lPbHdpYVZ3aUxGd2lYRngxTURGRU1Gd2lPbHdpYVZ3aUxGd2lYRngxTURJd09Wd2lPbHdpYVZ3aUxGd2lYRngxTURJd1Fsd2lPbHdpYVZ3aUxGd2lYRngxTVVWRFFsd2lPbHdpYVZ3aUxGd2lYRngxTURFeVJsd2lPbHdpYVZ3aUxGd2lYRngxTVVVeVJGd2lPbHdpYVZ3aUxGd2lYRngxTURJMk9Gd2lPbHdpYVZ3aUxGd2lYRngxTURFek1Wd2lPbHdpYVZ3aUxGd2lYRngxTWpSRU9Wd2lPbHdpYWx3aUxGd2lYRngxUmtZMFFWd2lPbHdpYWx3aUxGd2lYRngxTURFek5Wd2lPbHdpYWx3aUxGd2lYRngxTURGR01Gd2lPbHdpYWx3aUxGd2lYRngxTURJME9Wd2lPbHdpYWx3aUxGd2lYRngxTWpSRVFWd2lPbHdpYTF3aUxGd2lYRngxUmtZMFFsd2lPbHdpYTF3aUxGd2lYRngxTVVVek1Wd2lPbHdpYTF3aUxGd2lYRngxTURGRk9Wd2lPbHdpYTF3aUxGd2lYRngxTVVVek0xd2lPbHdpYTF3aUxGd2lYRngxTURFek4xd2lPbHdpYTF3aUxGd2lYRngxTVVVek5Wd2lPbHdpYTF3aUxGd2lYRngxTURFNU9Wd2lPbHdpYTF3aUxGd2lYRngxTWtNMlFWd2lPbHdpYTF3aUxGd2lYRngxUVRjME1Wd2lPbHdpYTF3aUxGd2lYRngxUVRjME0xd2lPbHdpYTF3aUxGd2lYRngxUVRjME5Wd2lPbHdpYTF3aUxGd2lYRngxUVRkQk0xd2lPbHdpYTF3aUxGd2lYRngxTWpSRVFsd2lPbHdpYkZ3aUxGd2lYRngxUmtZMFExd2lPbHdpYkZ3aUxGd2lYRngxTURFME1Gd2lPbHdpYkZ3aUxGd2lYRngxTURFelFWd2lPbHdpYkZ3aUxGd2lYRngxTURFelJWd2lPbHdpYkZ3aUxGd2lYRngxTVVVek4xd2lPbHdpYkZ3aUxGd2lYRngxTVVVek9Wd2lPbHdpYkZ3aUxGd2lYRngxTURFelExd2lPbHdpYkZ3aUxGd2lYRngxTVVVelJGd2lPbHdpYkZ3aUxGd2lYRngxTVVVelFsd2lPbHdpYkZ3aUxGd2lYRngxTURFM1Jsd2lPbHdpYkZ3aUxGd2lYRngxTURFME1sd2lPbHdpYkZ3aUxGd2lYRngxTURFNVFWd2lPbHdpYkZ3aUxGd2lYRngxTURJMlFsd2lPbHdpYkZ3aUxGd2lYRngxTWtNMk1Wd2lPbHdpYkZ3aUxGd2lYRngxUVRjME9Wd2lPbHdpYkZ3aUxGd2lYRngxUVRjNE1Wd2lPbHdpYkZ3aUxGd2lYRngxUVRjME4xd2lPbHdpYkZ3aUxGd2lYRngxTURGRE9Wd2lPbHdpYkdwY0lpeGNJbHhjZFRJMFJFTmNJanBjSW0xY0lpeGNJbHhjZFVaR05FUmNJanBjSW0xY0lpeGNJbHhjZFRGRk0wWmNJanBjSW0xY0lpeGNJbHhjZFRGRk5ERmNJanBjSW0xY0lpeGNJbHhjZFRGRk5ETmNJanBjSW0xY0lpeGNJbHhjZFRBeU56RmNJanBjSW0xY0lpeGNJbHhjZFRBeU5rWmNJanBjSW0xY0lpeGNJbHhjZFRJMFJFUmNJanBjSW01Y0lpeGNJbHhjZFVaR05FVmNJanBjSW01Y0lpeGNJbHhjZFRBeFJqbGNJanBjSW01Y0lpeGNJbHhjZFRBeE5EUmNJanBjSW01Y0lpeGNJbHhjZFRBd1JqRmNJanBjSW01Y0lpeGNJbHhjZFRGRk5EVmNJanBjSW01Y0lpeGNJbHhjZFRBeE5EaGNJanBjSW01Y0lpeGNJbHhjZFRGRk5EZGNJanBjSW01Y0lpeGNJbHhjZFRBeE5EWmNJanBjSW01Y0lpeGNJbHhjZFRGRk5FSmNJanBjSW01Y0lpeGNJbHhjZFRGRk5EbGNJanBjSW01Y0lpeGNJbHhjZFRBeE9VVmNJanBjSW01Y0lpeGNJbHhjZFRBeU56SmNJanBjSW01Y0lpeGNJbHhjZFRBeE5EbGNJanBjSW01Y0lpeGNJbHhjZFVFM09URmNJanBjSW01Y0lpeGNJbHhjZFVFM1FUVmNJanBjSW01Y0lpeGNJbHhjZFRBeFEwTmNJanBjSW01cVhDSXNYQ0pjWEhVeU5FUkZYQ0k2WENKdlhDSXNYQ0pjWEhWR1JqUkdYQ0k2WENKdlhDSXNYQ0pjWEhVd01FWXlYQ0k2WENKdlhDSXNYQ0pjWEhVd01FWXpYQ0k2WENKdlhDSXNYQ0pjWEhVd01FWTBYQ0k2WENKdlhDSXNYQ0pjWEhVeFJVUXpYQ0k2WENKdlhDSXNYQ0pjWEhVeFJVUXhYQ0k2WENKdlhDSXNYQ0pjWEhVeFJVUTNYQ0k2WENKdlhDSXNYQ0pjWEhVeFJVUTFYQ0k2WENKdlhDSXNYQ0pjWEhVd01FWTFYQ0k2WENKdlhDSXNYQ0pjWEhVeFJUUkVYQ0k2WENKdlhDSXNYQ0pjWEhVd01qSkVYQ0k2WENKdlhDSXNYQ0pjWEhVeFJUUkdYQ0k2WENKdlhDSXNYQ0pjWEhVd01UUkVYQ0k2WENKdlhDSXNYQ0pjWEhVeFJUVXhYQ0k2WENKdlhDSXNYQ0pjWEhVeFJUVXpYQ0k2WENKdlhDSXNYQ0pjWEhVd01UUkdYQ0k2WENKdlhDSXNYQ0pjWEhVd01qSkdYQ0k2WENKdlhDSXNYQ0pjWEhVd01qTXhYQ0k2WENKdlhDSXNYQ0pjWEhVd01FWTJYQ0k2WENKdlhDSXNYQ0pjWEhVd01qSkNYQ0k2WENKdlhDSXNYQ0pjWEhVeFJVTkdYQ0k2WENKdlhDSXNYQ0pjWEhVd01UVXhYQ0k2WENKdlhDSXNYQ0pjWEhVd01VUXlYQ0k2WENKdlhDSXNYQ0pjWEhVd01qQkVYQ0k2WENKdlhDSXNYQ0pjWEhVd01qQkdYQ0k2WENKdlhDSXNYQ0pjWEhVd01VRXhYQ0k2WENKdlhDSXNYQ0pjWEhVeFJVUkVYQ0k2WENKdlhDSXNYQ0pjWEhVeFJVUkNYQ0k2WENKdlhDSXNYQ0pjWEhVeFJVVXhYQ0k2WENKdlhDSXNYQ0pjWEhVeFJVUkdYQ0k2WENKdlhDSXNYQ0pjWEhVeFJVVXpYQ0k2WENKdlhDSXNYQ0pjWEhVeFJVTkVYQ0k2WENKdlhDSXNYQ0pjWEhVeFJVUTVYQ0k2WENKdlhDSXNYQ0pjWEhVd01VVkNYQ0k2WENKdlhDSXNYQ0pjWEhVd01VVkVYQ0k2WENKdlhDSXNYQ0pjWEhVd01FWTRYQ0k2WENKdlhDSXNYQ0pjWEhVd01VWkdYQ0k2WENKdlhDSXNYQ0pjWEhVd01qVTBYQ0k2WENKdlhDSXNYQ0pjWEhWQk56UkNYQ0k2WENKdlhDSXNYQ0pjWEhWQk56UkVYQ0k2WENKdlhDSXNYQ0pjWEhVd01qYzFYQ0k2WENKdlhDSXNYQ0pjWEhVd01VRXpYQ0k2WENKdmFWd2lMRndpWEZ4MU1ESXlNMXdpT2x3aWIzVmNJaXhjSWx4Y2RVRTNORVpjSWpwY0ltOXZYQ0lzWENKY1hIVXlORVJHWENJNlhDSndYQ0lzWENKY1hIVkdSalV3WENJNlhDSndYQ0lzWENKY1hIVXhSVFUxWENJNlhDSndYQ0lzWENKY1hIVXhSVFUzWENJNlhDSndYQ0lzWENKY1hIVXdNVUUxWENJNlhDSndYQ0lzWENKY1hIVXhSRGRFWENJNlhDSndYQ0lzWENKY1hIVkJOelV4WENJNlhDSndYQ0lzWENKY1hIVkJOelV6WENJNlhDSndYQ0lzWENKY1hIVkJOelUxWENJNlhDSndYQ0lzWENKY1hIVXlORVV3WENJNlhDSnhYQ0lzWENKY1hIVkdSalV4WENJNlhDSnhYQ0lzWENKY1hIVXdNalJDWENJNlhDSnhYQ0lzWENKY1hIVkJOelUzWENJNlhDSnhYQ0lzWENKY1hIVkJOelU1WENJNlhDSnhYQ0lzWENKY1hIVXlORVV4WENJNlhDSnlYQ0lzWENKY1hIVkdSalV5WENJNlhDSnlYQ0lzWENKY1hIVXdNVFUxWENJNlhDSnlYQ0lzWENKY1hIVXhSVFU1WENJNlhDSnlYQ0lzWENKY1hIVXdNVFU1WENJNlhDSnlYQ0lzWENKY1hIVXdNakV4WENJNlhDSnlYQ0lzWENKY1hIVXdNakV6WENJNlhDSnlYQ0lzWENKY1hIVXhSVFZDWENJNlhDSnlYQ0lzWENKY1hIVXhSVFZFWENJNlhDSnlYQ0lzWENKY1hIVXdNVFUzWENJNlhDSnlYQ0lzWENKY1hIVXhSVFZHWENJNlhDSnlYQ0lzWENKY1hIVXdNalJFWENJNlhDSnlYQ0lzWENKY1hIVXdNamRFWENJNlhDSnlYQ0lzWENKY1hIVkJOelZDWENJNlhDSnlYQ0lzWENKY1hIVkJOMEUzWENJNlhDSnlYQ0lzWENKY1hIVkJOemd6WENJNlhDSnlYQ0lzWENKY1hIVXlORVV5WENJNlhDSnpYQ0lzWENKY1hIVkdSalV6WENJNlhDSnpYQ0lzWENKY1hIVXdNRVJHWENJNlhDSnpYQ0lzWENKY1hIVXdNVFZDWENJNlhDSnpYQ0lzWENKY1hIVXhSVFkxWENJNlhDSnpYQ0lzWENKY1hIVXdNVFZFWENJNlhDSnpYQ0lzWENKY1hIVXhSVFl4WENJNlhDSnpYQ0lzWENKY1hIVXdNVFl4WENJNlhDSnpYQ0lzWENKY1hIVXhSVFkzWENJNlhDSnpYQ0lzWENKY1hIVXhSVFl6WENJNlhDSnpYQ0lzWENKY1hIVXhSVFk1WENJNlhDSnpYQ0lzWENKY1hIVXdNakU1WENJNlhDSnpYQ0lzWENKY1hIVXdNVFZHWENJNlhDSnpYQ0lzWENKY1hIVXdNak5HWENJNlhDSnpYQ0lzWENKY1hIVkJOMEU1WENJNlhDSnpYQ0lzWENKY1hIVkJOemcxWENJNlhDSnpYQ0lzWENKY1hIVXhSVGxDWENJNlhDSnpYQ0lzWENKY1hIVXlORVV6WENJNlhDSjBYQ0lzWENKY1hIVkdSalUwWENJNlhDSjBYQ0lzWENKY1hIVXhSVFpDWENJNlhDSjBYQ0lzWENKY1hIVXhSVGszWENJNlhDSjBYQ0lzWENKY1hIVXdNVFkxWENJNlhDSjBYQ0lzWENKY1hIVXhSVFpFWENJNlhDSjBYQ0lzWENKY1hIVXdNakZDWENJNlhDSjBYQ0lzWENKY1hIVXdNVFl6WENJNlhDSjBYQ0lzWENKY1hIVXhSVGN4WENJNlhDSjBYQ0lzWENKY1hIVXhSVFpHWENJNlhDSjBYQ0lzWENKY1hIVXdNVFkzWENJNlhDSjBYQ0lzWENKY1hIVXdNVUZFWENJNlhDSjBYQ0lzWENKY1hIVXdNamc0WENJNlhDSjBYQ0lzWENKY1hIVXlRelkyWENJNlhDSjBYQ0lzWENKY1hIVkJOemczWENJNlhDSjBYQ0lzWENKY1hIVkJOekk1WENJNlhDSjBlbHdpTEZ3aVhGeDFNalJGTkZ3aU9sd2lkVndpTEZ3aVhGeDFSa1kxTlZ3aU9sd2lkVndpTEZ3aVhGeDFNREJHT1Z3aU9sd2lkVndpTEZ3aVhGeDFNREJHUVZ3aU9sd2lkVndpTEZ3aVhGeDFNREJHUWx3aU9sd2lkVndpTEZ3aVhGeDFNREUyT1Z3aU9sd2lkVndpTEZ3aVhGeDFNVVUzT1Z3aU9sd2lkVndpTEZ3aVhGeDFNREUyUWx3aU9sd2lkVndpTEZ3aVhGeDFNVVUzUWx3aU9sd2lkVndpTEZ3aVhGeDFNREUyUkZ3aU9sd2lkVndpTEZ3aVhGeDFNREJHUTF3aU9sd2lkVndpTEZ3aVhGeDFNREZFUTF3aU9sd2lkVndpTEZ3aVhGeDFNREZFT0Z3aU9sd2lkVndpTEZ3aVhGeDFNREZFTmx3aU9sd2lkVndpTEZ3aVhGeDFNREZFUVZ3aU9sd2lkVndpTEZ3aVhGeDFNVVZGTjF3aU9sd2lkVndpTEZ3aVhGeDFNREUyUmx3aU9sd2lkVndpTEZ3aVhGeDFNREUzTVZ3aU9sd2lkVndpTEZ3aVhGeDFNREZFTkZ3aU9sd2lkVndpTEZ3aVhGeDFNREl4TlZ3aU9sd2lkVndpTEZ3aVhGeDFNREl4TjF3aU9sd2lkVndpTEZ3aVhGeDFNREZDTUZ3aU9sd2lkVndpTEZ3aVhGeDFNVVZGUWx3aU9sd2lkVndpTEZ3aVhGeDFNVVZGT1Z3aU9sd2lkVndpTEZ3aVhGeDFNVVZGUmx3aU9sd2lkVndpTEZ3aVhGeDFNVVZGUkZ3aU9sd2lkVndpTEZ3aVhGeDFNVVZHTVZ3aU9sd2lkVndpTEZ3aVhGeDFNVVZGTlZ3aU9sd2lkVndpTEZ3aVhGeDFNVVUzTTF3aU9sd2lkVndpTEZ3aVhGeDFNREUzTTF3aU9sd2lkVndpTEZ3aVhGeDFNVVUzTjF3aU9sd2lkVndpTEZ3aVhGeDFNVVUzTlZ3aU9sd2lkVndpTEZ3aVhGeDFNREk0T1Z3aU9sd2lkVndpTEZ3aVhGeDFNalJGTlZ3aU9sd2lkbHdpTEZ3aVhGeDFSa1kxTmx3aU9sd2lkbHdpTEZ3aVhGeDFNVVUzUkZ3aU9sd2lkbHdpTEZ3aVhGeDFNVVUzUmx3aU9sd2lkbHdpTEZ3aVhGeDFNREk0UWx3aU9sd2lkbHdpTEZ3aVhGeDFRVGMxUmx3aU9sd2lkbHdpTEZ3aVhGeDFNREk0UTF3aU9sd2lkbHdpTEZ3aVhGeDFRVGMyTVZ3aU9sd2lkbmxjSWl4Y0lseGNkVEkwUlRaY0lqcGNJbmRjSWl4Y0lseGNkVVpHTlRkY0lqcGNJbmRjSWl4Y0lseGNkVEZGT0RGY0lqcGNJbmRjSWl4Y0lseGNkVEZGT0ROY0lqcGNJbmRjSWl4Y0lseGNkVEF4TnpWY0lqcGNJbmRjSWl4Y0lseGNkVEZGT0RkY0lqcGNJbmRjSWl4Y0lseGNkVEZGT0RWY0lqcGNJbmRjSWl4Y0lseGNkVEZGT1RoY0lqcGNJbmRjSWl4Y0lseGNkVEZGT0RsY0lqcGNJbmRjSWl4Y0lseGNkVEpETnpOY0lqcGNJbmRjSWl4Y0lseGNkVEkwUlRkY0lqcGNJbmhjSWl4Y0lseGNkVVpHTlRoY0lqcGNJbmhjSWl4Y0lseGNkVEZGT0VKY0lqcGNJbmhjSWl4Y0lseGNkVEZGT0VSY0lqcGNJbmhjSWl4Y0lseGNkVEkwUlRoY0lqcGNJbmxjSWl4Y0lseGNkVVpHTlRsY0lqcGNJbmxjSWl4Y0lseGNkVEZGUmpOY0lqcGNJbmxjSWl4Y0lseGNkVEF3UmtSY0lqcGNJbmxjSWl4Y0lseGNkVEF4TnpkY0lqcGNJbmxjSWl4Y0lseGNkVEZGUmpsY0lqcGNJbmxjSWl4Y0lseGNkVEF5TXpOY0lqcGNJbmxjSWl4Y0lseGNkVEZGT0VaY0lqcGNJbmxjSWl4Y0lseGNkVEF3UmtaY0lqcGNJbmxjSWl4Y0lseGNkVEZGUmpkY0lqcGNJbmxjSWl4Y0lseGNkVEZGT1RsY0lqcGNJbmxjSWl4Y0lseGNkVEZGUmpWY0lqcGNJbmxjSWl4Y0lseGNkVEF4UWpSY0lqcGNJbmxjSWl4Y0lseGNkVEF5TkVaY0lqcGNJbmxjSWl4Y0lseGNkVEZGUmtaY0lqcGNJbmxjSWl4Y0lseGNkVEkwUlRsY0lqcGNJbnBjSWl4Y0lseGNkVVpHTlVGY0lqcGNJbnBjSWl4Y0lseGNkVEF4TjBGY0lqcGNJbnBjSWl4Y0lseGNkVEZGT1RGY0lqcGNJbnBjSWl4Y0lseGNkVEF4TjBOY0lqcGNJbnBjSWl4Y0lseGNkVEF4TjBWY0lqcGNJbnBjSWl4Y0lseGNkVEZGT1ROY0lqcGNJbnBjSWl4Y0lseGNkVEZGT1RWY0lqcGNJbnBjSWl4Y0lseGNkVEF4UWpaY0lqcGNJbnBjSWl4Y0lseGNkVEF5TWpWY0lqcGNJbnBjSWl4Y0lseGNkVEF5TkRCY0lqcGNJbnBjSWl4Y0lseGNkVEpETmtOY0lqcGNJbnBjSWl4Y0lseGNkVUUzTmpOY0lqcGNJbnBjSW4wN1hISmNibHh5WEc0Z0lDQWdKR1J2WTNWdFpXNTBJRDBnSkNoa2IyTjFiV1Z1ZENrN1hISmNibHh5WEc0Z0lDQWdibVY0ZEZWcFpEMG9ablZ1WTNScGIyNG9LU0I3SUhaaGNpQmpiM1Z1ZEdWeVBURTdJSEpsZEhWeWJpQm1kVzVqZEdsdmJpZ3BJSHNnY21WMGRYSnVJR052ZFc1MFpYSXJLenNnZlRzZ2ZTZ3BLVHRjY2x4dVhISmNibHh5WEc0Z0lDQWdablZ1WTNScGIyNGdjM1J5YVhCRWFXRmpjbWwwYVdOektITjBjaWtnZTF4eVhHNGdJQ0FnSUNBZ0lIWmhjaUJ5WlhRc0lHa3NJR3dzSUdNN1hISmNibHh5WEc0Z0lDQWdJQ0FnSUdsbUlDZ2hjM1J5SUh4OElITjBjaTVzWlc1bmRHZ2dQQ0F4S1NCeVpYUjFjbTRnYzNSeU8xeHlYRzVjY2x4dUlDQWdJQ0FnSUNCeVpYUWdQU0JjSWx3aU8xeHlYRzRnSUNBZ0lDQWdJR1p2Y2lBb2FTQTlJREFzSUd3Z1BTQnpkSEl1YkdWdVozUm9PeUJwSUR3Z2JEc2dhU3NyS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUdNZ1BTQnpkSEl1WTJoaGNrRjBLR2twTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0J5WlhRZ0t6MGdSRWxCUTFKSlZFbERVMXRqWFNCOGZDQmpPMXh5WEc0Z0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ0lDQnlaWFIxY200Z2NtVjBPMXh5WEc0Z0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUdaMWJtTjBhVzl1SUdsdVpHVjRUMllvZG1Gc2RXVXNJR0Z5Y21GNUtTQjdYSEpjYmlBZ0lDQWdJQ0FnZG1GeUlHa2dQU0F3TENCc0lEMGdZWEp5WVhrdWJHVnVaM1JvTzF4eVhHNGdJQ0FnSUNBZ0lHWnZjaUFvT3lCcElEd2diRHNnYVNBOUlHa2dLeUF4S1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUdsbUlDaGxjWFZoYkNoMllXeDFaU3dnWVhKeVlYbGJhVjBwS1NCeVpYUjFjbTRnYVR0Y2NseHVJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJQzB4TzF4eVhHNGdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lHWjFibU4wYVc5dUlHMWxZWE4xY21WVFkzSnZiR3hpWVhJZ0tDa2dlMXh5WEc0Z0lDQWdJQ0FnSUhaaGNpQWtkR1Z0Y0d4aGRHVWdQU0FrS0NCTlJVRlRWVkpGWDFORFVrOU1URUpCVWw5VVJVMVFURUZVUlNBcE8xeHlYRzRnSUNBZ0lDQWdJQ1IwWlcxd2JHRjBaUzVoY0hCbGJtUlVieWduWW05a2VTY3BPMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQjJZWElnWkdsdElEMGdlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjNhV1IwYURvZ0pIUmxiWEJzWVhSbExuZHBaSFJvS0NrZ0xTQWtkR1Z0Y0d4aGRHVmJNRjB1WTJ4cFpXNTBWMmxrZEdnc1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUdobGFXZG9kRG9nSkhSbGJYQnNZWFJsTG1obGFXZG9kQ2dwSUMwZ0pIUmxiWEJzWVhSbFd6QmRMbU5zYVdWdWRFaGxhV2RvZEZ4eVhHNGdJQ0FnSUNBZ0lIMDdYSEpjYmlBZ0lDQWdJQ0FnSkhSbGJYQnNZWFJsTG5KbGJXOTJaU2dwTzF4eVhHNWNjbHh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdaR2x0TzF4eVhHNGdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDOHFLbHh5WEc0Z0lDQWdJQ29nUTI5dGNHRnlaWE1nWlhGMVlXeHBkSGtnYjJZZ1lTQmhibVFnWWx4eVhHNGdJQ0FnSUNvZ1FIQmhjbUZ0SUdGY2NseHVJQ0FnSUNBcUlFQndZWEpoYlNCaVhISmNiaUFnSUNBZ0tpOWNjbHh1SUNBZ0lHWjFibU4wYVc5dUlHVnhkV0ZzS0dFc0lHSXBJSHRjY2x4dUlDQWdJQ0FnSUNCcFppQW9ZU0E5UFQwZ1lpa2djbVYwZFhKdUlIUnlkV1U3WEhKY2JpQWdJQ0FnSUNBZ2FXWWdLR0VnUFQwOUlIVnVaR1ZtYVc1bFpDQjhmQ0JpSUQwOVBTQjFibVJsWm1sdVpXUXBJSEpsZEhWeWJpQm1ZV3h6WlR0Y2NseHVJQ0FnSUNBZ0lDQnBaaUFvWVNBOVBUMGdiblZzYkNCOGZDQmlJRDA5UFNCdWRXeHNLU0J5WlhSMWNtNGdabUZzYzJVN1hISmNiaUFnSUNBZ0lDQWdMeThnUTJobFkyc2dkMmhsZEdobGNpQW5ZU2NnYjNJZ0oySW5JR2x6SUdFZ2MzUnlhVzVuSUNod2NtbHRhWFJwZG1VZ2IzSWdiMkpxWldOMEtTNWNjbHh1SUNBZ0lDQWdJQ0F2THlCVWFHVWdZMjl1WTJGMFpXNWhkR2x2YmlCdlppQmhiaUJsYlhCMGVTQnpkSEpwYm1jZ0tDc25KeWtnWTI5dWRtVnlkSE1nYVhSeklHRnlaM1Z0Wlc1MElIUnZJR0VnYzNSeWFXNW5KM01nY0hKcGJXbDBhWFpsTGx4eVhHNGdJQ0FnSUNBZ0lHbG1JQ2hoTG1OdmJuTjBjblZqZEc5eUlEMDlQU0JUZEhKcGJtY3BJSEpsZEhWeWJpQmhLeWNuSUQwOVBTQmlLeWNuT3lBdkx5QmhLeWNuSUMwZ2FXNGdZMkZ6WlNBbllTY2dhWE1nWVNCVGRISnBibWNnYjJKcVpXTjBYSEpjYmlBZ0lDQWdJQ0FnYVdZZ0tHSXVZMjl1YzNSeWRXTjBiM0lnUFQwOUlGTjBjbWx1WnlrZ2NtVjBkWEp1SUdJckp5Y2dQVDA5SUdFckp5YzdJQzh2SUdJckp5Y2dMU0JwYmlCallYTmxJQ2RpSnlCcGN5QmhJRk4wY21sdVp5QnZZbXBsWTNSY2NseHVJQ0FnSUNBZ0lDQnlaWFIxY200Z1ptRnNjMlU3WEhKY2JpQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0x5b3FYSEpjYmlBZ0lDQWdLaUJUY0d4cGRITWdkR2hsSUhOMGNtbHVaeUJwYm5SdklHRnVJR0Z5Y21GNUlHOW1JSFpoYkhWbGN5d2dkSEpwYlcxcGJtY2daV0ZqYUNCMllXeDFaUzRnUVc0Z1pXMXdkSGtnWVhKeVlYa2dhWE1nY21WMGRYSnVaV1FnWm05eUlHNTFiR3h6SUc5eUlHVnRjSFI1WEhKY2JpQWdJQ0FnS2lCemRISnBibWR6WEhKY2JpQWdJQ0FnS2lCQWNHRnlZVzBnYzNSeWFXNW5YSEpjYmlBZ0lDQWdLaUJBY0dGeVlXMGdjMlZ3WVhKaGRHOXlYSEpjYmlBZ0lDQWdLaTljY2x4dUlDQWdJR1oxYm1OMGFXOXVJSE53YkdsMFZtRnNLSE4wY21sdVp5d2djMlZ3WVhKaGRHOXlLU0I3WEhKY2JpQWdJQ0FnSUNBZ2RtRnlJSFpoYkN3Z2FTd2diRHRjY2x4dUlDQWdJQ0FnSUNCcFppQW9jM1J5YVc1bklEMDlQU0J1ZFd4c0lIeDhJSE4wY21sdVp5NXNaVzVuZEdnZ1BDQXhLU0J5WlhSMWNtNGdXMTA3WEhKY2JpQWdJQ0FnSUNBZ2RtRnNJRDBnYzNSeWFXNW5Mbk53YkdsMEtITmxjR0Z5WVhSdmNpazdYSEpjYmlBZ0lDQWdJQ0FnWm05eUlDaHBJRDBnTUN3Z2JDQTlJSFpoYkM1c1pXNW5kR2c3SUdrZ1BDQnNPeUJwSUQwZ2FTQXJJREVwSUhaaGJGdHBYU0E5SUNRdWRISnBiU2gyWVd4YmFWMHBPMXh5WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUIyWVd3N1hISmNiaUFnSUNCOVhISmNibHh5WEc0Z0lDQWdablZ1WTNScGIyNGdaMlYwVTJsa1pVSnZjbVJsY2xCaFpHUnBibWNvWld4bGJXVnVkQ2tnZTF4eVhHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCbGJHVnRaVzUwTG05MWRHVnlWMmxrZEdnb1ptRnNjMlVwSUMwZ1pXeGxiV1Z1ZEM1M2FXUjBhQ2dwTzF4eVhHNGdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lHWjFibU4wYVc5dUlHbHVjM1JoYkd4TFpYbFZjRU5vWVc1blpVVjJaVzUwS0dWc1pXMWxiblFwSUh0Y2NseHVJQ0FnSUNBZ0lDQjJZWElnYTJWNVBWd2lhMlY1ZFhBdFkyaGhibWRsTFhaaGJIVmxYQ0k3WEhKY2JpQWdJQ0FnSUNBZ1pXeGxiV1Z1ZEM1dmJpaGNJbXRsZVdSdmQyNWNJaXdnWm5WdVkzUnBiMjRnS0NrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCcFppQW9KQzVrWVhSaEtHVnNaVzFsYm5Rc0lHdGxlU2tnUFQwOUlIVnVaR1ZtYVc1bFpDa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSkM1a1lYUmhLR1ZzWlcxbGJuUXNJR3RsZVN3Z1pXeGxiV1Z1ZEM1MllXd29LU2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnSUNCOUtUdGNjbHh1SUNBZ0lDQWdJQ0JsYkdWdFpXNTBMbTl1S0Z3aWEyVjVkWEJjSWl3Z1puVnVZM1JwYjI0Z0tDa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjJZWElnZG1Gc1BTQWtMbVJoZEdFb1pXeGxiV1Z1ZEN3Z2EyVjVLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdhV1lnS0haaGJDQWhQVDBnZFc1a1pXWnBibVZrSUNZbUlHVnNaVzFsYm5RdWRtRnNLQ2tnSVQwOUlIWmhiQ2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0pDNXlaVzF2ZG1WRVlYUmhLR1ZzWlcxbGJuUXNJR3RsZVNrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmxiR1Z0Wlc1MExuUnlhV2RuWlhJb1hDSnJaWGwxY0MxamFHRnVaMlZjSWlrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ0lDQjlLVHRjY2x4dUlDQWdJSDFjY2x4dVhISmNiaUFnSUNBa1pHOWpkVzFsYm5RdWIyNG9YQ0p0YjNWelpXMXZkbVZjSWl3Z1puVnVZM1JwYjI0Z0tHVXBJSHRjY2x4dUlDQWdJQ0FnSUNCc1lYTjBUVzkxYzJWUWIzTnBkR2x2Ymk1NElEMGdaUzV3WVdkbFdEdGNjbHh1SUNBZ0lDQWdJQ0JzWVhOMFRXOTFjMlZRYjNOcGRHbHZiaTU1SUQwZ1pTNXdZV2RsV1R0Y2NseHVJQ0FnSUgwcE8xeHlYRzVjY2x4dUlDQWdJQzhxS2x4eVhHNGdJQ0FnSUNvZ1ptbHNkR1Z5Y3lCdGIzVnpaU0JsZG1WdWRITWdjMjhnWVc0Z1pYWmxiblFnYVhNZ1ptbHlaV1FnYjI1c2VTQnBaaUIwYUdVZ2JXOTFjMlVnYlc5MlpXUXVYSEpjYmlBZ0lDQWdLbHh5WEc0Z0lDQWdJQ29nWm1sc2RHVnljeUJ2ZFhRZ2JXOTFjMlVnWlhabGJuUnpJSFJvWVhRZ2IyTmpkWElnZDJobGJpQnRiM1Z6WlNCcGN5QnpkR0YwYVc5dVlYSjVJR0oxZEZ4eVhHNGdJQ0FnSUNvZ2RHaGxJR1ZzWlcxbGJuUnpJSFZ1WkdWeUlIUm9aU0J3YjJsdWRHVnlJR0Z5WlNCelkzSnZiR3hsWkM1Y2NseHVJQ0FnSUNBcUwxeHlYRzRnSUNBZ1puVnVZM1JwYjI0Z2FXNXpkR0ZzYkVacGJIUmxjbVZrVFc5MWMyVk5iM1psS0dWc1pXMWxiblFwSUh0Y2NseHVJQ0FnSUNBZ0lDQmxiR1Z0Wlc1MExtOXVLRndpYlc5MWMyVnRiM1psWENJc0lHWjFibU4wYVc5dUlDaGxLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSFpoY2lCc1lYTjBjRzl6SUQwZ2JHRnpkRTF2ZFhObFVHOXphWFJwYjI0N1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUdsbUlDaHNZWE4wY0c5eklEMDlQU0IxYm1SbFptbHVaV1FnZkh3Z2JHRnpkSEJ2Y3k1NElDRTlQU0JsTG5CaFoyVllJSHg4SUd4aGMzUndiM011ZVNBaFBUMGdaUzV3WVdkbFdTa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSkNobExuUmhjbWRsZENrdWRISnBaMmRsY2loY0ltMXZkWE5sYlc5MlpTMW1hV3gwWlhKbFpGd2lMQ0JsS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ0lIMHBPMXh5WEc0Z0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUM4cUtseHlYRzRnSUNBZ0lDb2dSR1ZpYjNWdVkyVnpJR0VnWm5WdVkzUnBiMjR1SUZKbGRIVnlibk1nWVNCbWRXNWpkR2x2YmlCMGFHRjBJR05oYkd4eklIUm9aU0J2Y21sbmFXNWhiQ0JtYmlCbWRXNWpkR2x2YmlCdmJteDVJR2xtSUc1dklHbHVkbTlqWVhScGIyNXpJR2hoZG1VZ1ltVmxiaUJ0WVdSbFhISmNiaUFnSUNBZ0tpQjNhWFJvYVc0Z2RHaGxJR3hoYzNRZ2NYVnBaWFJOYVd4c2FYTWdiV2xzYkdselpXTnZibVJ6TGx4eVhHNGdJQ0FnSUNwY2NseHVJQ0FnSUNBcUlFQndZWEpoYlNCeGRXbGxkRTFwYkd4cGN5QnVkVzFpWlhJZ2IyWWdiV2xzYkdselpXTnZibVJ6SUhSdklIZGhhWFFnWW1WbWIzSmxJR2x1ZG05cmFXNW5JR1p1WEhKY2JpQWdJQ0FnS2lCQWNHRnlZVzBnWm00Z1puVnVZM1JwYjI0Z2RHOGdZbVVnWkdWaWIzVnVZMlZrWEhKY2JpQWdJQ0FnS2lCQWNHRnlZVzBnWTNSNElHOWlhbVZqZENCMGJ5QmlaU0IxYzJWa0lHRnpJSFJvYVhNZ2NtVm1aWEpsYm1ObElIZHBkR2hwYmlCbWJseHlYRzRnSUNBZ0lDb2dRSEpsZEhWeWJpQmtaV0p2ZFc1alpXUWdkbVZ5YzJsdmJpQnZaaUJtYmx4eVhHNGdJQ0FnSUNvdlhISmNiaUFnSUNCbWRXNWpkR2x2YmlCa1pXSnZkVzVqWlNoeGRXbGxkRTFwYkd4cGN5d2dabTRzSUdOMGVDa2dlMXh5WEc0Z0lDQWdJQ0FnSUdOMGVDQTlJR04wZUNCOGZDQjFibVJsWm1sdVpXUTdYSEpjYmlBZ0lDQWdJQ0FnZG1GeUlIUnBiV1Z2ZFhRN1hISmNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlHWjFibU4wYVc5dUlDZ3BJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdkbUZ5SUdGeVozTWdQU0JoY21kMWJXVnVkSE03WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSGRwYm1SdmR5NWpiR1ZoY2xScGJXVnZkWFFvZEdsdFpXOTFkQ2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSFJwYldWdmRYUWdQU0IzYVc1a2IzY3VjMlYwVkdsdFpXOTFkQ2htZFc1amRHbHZiaWdwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHWnVMbUZ3Y0d4NUtHTjBlQ3dnWVhKbmN5azdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIMHNJSEYxYVdWMFRXbHNiR2x6S1R0Y2NseHVJQ0FnSUNBZ0lDQjlPMXh5WEc0Z0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUM4cUtseHlYRzRnSUNBZ0lDb2dRU0J6YVcxd2JHVWdhVzF3YkdWdFpXNTBZWFJwYjI0Z2IyWWdZU0IwYUhWdWExeHlYRzRnSUNBZ0lDb2dRSEJoY21GdElHWnZjbTExYkdFZ1puVnVZM1JwYjI0Z2RYTmxaQ0IwYnlCc1lYcHBiSGtnYVc1cGRHbGhiR2w2WlNCMGFHVWdkR2gxYm10Y2NseHVJQ0FnSUNBcUlFQnlaWFIxY200Z2UwWjFibU4wYVc5dWZWeHlYRzRnSUNBZ0lDb3ZYSEpjYmlBZ0lDQm1kVzVqZEdsdmJpQjBhSFZ1YXlobWIzSnRkV3hoS1NCN1hISmNiaUFnSUNBZ0lDQWdkbUZ5SUdWMllXeDFZWFJsWkNBOUlHWmhiSE5sTEZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0IyWVd4MVpUdGNjbHh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdablZ1WTNScGIyNG9LU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJR2xtSUNobGRtRnNkV0YwWldRZ1BUMDlJR1poYkhObEtTQjdJSFpoYkhWbElEMGdabTl5YlhWc1lTZ3BPeUJsZG1Gc2RXRjBaV1FnUFNCMGNuVmxPeUI5WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQjJZV3gxWlR0Y2NseHVJQ0FnSUNBZ0lDQjlPMXh5WEc0Z0lDQWdmVHRjY2x4dVhISmNiaUFnSUNCbWRXNWpkR2x2YmlCcGJuTjBZV3hzUkdWaWIzVnVZMlZrVTJOeWIyeHNLSFJvY21WemFHOXNaQ3dnWld4bGJXVnVkQ2tnZTF4eVhHNGdJQ0FnSUNBZ0lIWmhjaUJ1YjNScFpua2dQU0JrWldKdmRXNWpaU2gwYUhKbGMyaHZiR1FzSUdaMWJtTjBhVzl1SUNobEtTQjdJR1ZzWlcxbGJuUXVkSEpwWjJkbGNpaGNJbk5qY205c2JDMWtaV0p2ZFc1alpXUmNJaXdnWlNrN2ZTazdYSEpjYmlBZ0lDQWdJQ0FnWld4bGJXVnVkQzV2YmloY0luTmpjbTlzYkZ3aUxDQm1kVzVqZEdsdmJpQW9aU2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2FXNWtaWGhQWmlobExuUmhjbWRsZEN3Z1pXeGxiV1Z1ZEM1blpYUW9LU2tnUGowZ01Da2dibTkwYVdaNUtHVXBPMXh5WEc0Z0lDQWdJQ0FnSUgwcE8xeHlYRzRnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJR1oxYm1OMGFXOXVJR1p2WTNWektDUmxiQ2tnZTF4eVhHNGdJQ0FnSUNBZ0lHbG1JQ2drWld4Yk1GMGdQVDA5SUdSdlkzVnRaVzUwTG1GamRHbDJaVVZzWlcxbGJuUXBJSEpsZEhWeWJqdGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0x5b2djMlYwSUhSb1pTQm1iMk4xY3lCcGJpQmhJREFnZEdsdFpXOTFkQ0F0SUhSb1lYUWdkMkY1SUhSb1pTQm1iMk4xY3lCcGN5QnpaWFFnWVdaMFpYSWdkR2hsSUhCeWIyTmxjM05wYm1kY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnYjJZZ2RHaGxJR04xY25KbGJuUWdaWFpsYm5RZ2FHRnpJR1pwYm1semFHVmtJQzBnZDJocFkyZ2djMlZsYlhNZ2JHbHJaU0IwYUdVZ2IyNXNlU0J5Wld4cFlXSnNaU0IzWVhsY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZEc4Z2MyVjBJR1p2WTNWeklDb3ZYSEpjYmlBZ0lDQWdJQ0FnZDJsdVpHOTNMbk5sZEZScGJXVnZkWFFvWm5WdVkzUnBiMjRvS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUhaaGNpQmxiRDBrWld4Yk1GMHNJSEJ2Y3owa1pXd3VkbUZzS0NrdWJHVnVaM1JvTENCeVlXNW5aVHRjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNSbGJDNW1iMk4xY3lncE8xeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdMeW9nYldGclpTQnpkWEpsSUdWc0lISmxZMlZwZG1Wa0lHWnZZM1Z6SUhOdklIZGxJR1J2SUc1dmRDQmxjbkp2Y2lCdmRYUWdkMmhsYmlCMGNubHBibWNnZEc4Z2JXRnVhWEIxYkdGMFpTQjBhR1VnWTJGeVpYUXVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J6YjIxbGRHbHRaWE1nYlc5a1lXeHpJRzl5SUc5MGFHVnljeUJzYVhOMFpXNWxjbk1nYldGNUlITjBaV0ZzSUdsMElHRm1kR1Z5SUdsMGN5QnpaWFFnS2k5Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tDUmxiQzVwY3loY0lqcDJhWE5wWW14bFhDSXBJQ1ltSUdWc0lEMDlQU0JrYjJOMWJXVnVkQzVoWTNScGRtVkZiR1Z0Wlc1MEtTQjdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0x5b2dZV1owWlhJZ2RHaGxJR1p2WTNWeklHbHpJSE5sZENCdGIzWmxJSFJvWlNCallYSmxkQ0IwYnlCMGFHVWdaVzVrTENCdVpXTmxjM05oY25rZ2QyaGxiaUIzWlNCMllXd29LVnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHcDFjM1FnWW1WbWIzSmxJSE5sZEhScGJtY2dabTlqZFhNZ0tpOWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtS0dWc0xuTmxkRk5sYkdWamRHbHZibEpoYm1kbEtWeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHVnNMbk5sZEZObGJHVmpkR2x2YmxKaGJtZGxLSEJ2Y3l3Z2NHOXpLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHVnNjMlVnYVdZZ0tHVnNMbU55WldGMFpWUmxlSFJTWVc1blpTa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lISmhibWRsSUQwZ1pXd3VZM0psWVhSbFZHVjRkRkpoYm1kbEtDazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NtRnVaMlV1WTI5c2JHRndjMlVvWm1Gc2MyVXBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lISmhibWRsTG5ObGJHVmpkQ2dwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lDQWdmU3dnTUNrN1hISmNiaUFnSUNCOVhISmNibHh5WEc0Z0lDQWdablZ1WTNScGIyNGdaMlYwUTNWeWMyOXlTVzVtYnlobGJDa2dlMXh5WEc0Z0lDQWdJQ0FnSUdWc0lEMGdKQ2hsYkNsYk1GMDdYSEpjYmlBZ0lDQWdJQ0FnZG1GeUlHOW1abk5sZENBOUlEQTdYSEpjYmlBZ0lDQWdJQ0FnZG1GeUlHeGxibWQwYUNBOUlEQTdYSEpjYmlBZ0lDQWdJQ0FnYVdZZ0tDZHpaV3hsWTNScGIyNVRkR0Z5ZENjZ2FXNGdaV3dwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnYjJabWMyVjBJRDBnWld3dWMyVnNaV04wYVc5dVUzUmhjblE3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJR3hsYm1kMGFDQTlJR1ZzTG5ObGJHVmpkR2x2YmtWdVpDQXRJRzltWm5ObGREdGNjbHh1SUNBZ0lDQWdJQ0I5SUdWc2MyVWdhV1lnS0NkelpXeGxZM1JwYjI0bklHbHVJR1J2WTNWdFpXNTBLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJR1ZzTG1adlkzVnpLQ2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSFpoY2lCelpXd2dQU0JrYjJOMWJXVnVkQzV6Wld4bFkzUnBiMjR1WTNKbFlYUmxVbUZ1WjJVb0tUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2JHVnVaM1JvSUQwZ1pHOWpkVzFsYm5RdWMyVnNaV04wYVc5dUxtTnlaV0YwWlZKaGJtZGxLQ2t1ZEdWNGRDNXNaVzVuZEdnN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUhObGJDNXRiM1psVTNSaGNuUW9KMk5vWVhKaFkzUmxjaWNzSUMxbGJDNTJZV3gxWlM1c1pXNW5kR2dwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0J2Wm1aelpYUWdQU0J6Wld3dWRHVjRkQzVzWlc1bmRHZ2dMU0JzWlc1bmRHZzdYSEpjYmlBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCN0lHOW1abk5sZERvZ2IyWm1jMlYwTENCc1pXNW5kR2c2SUd4bGJtZDBhQ0I5TzF4eVhHNGdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lHWjFibU4wYVc5dUlHdHBiR3hGZG1WdWRDaGxkbVZ1ZENrZ2UxeHlYRzRnSUNBZ0lDQWdJR1YyWlc1MExuQnlaWFpsYm5SRVpXWmhkV3gwS0NrN1hISmNiaUFnSUNBZ0lDQWdaWFpsYm5RdWMzUnZjRkJ5YjNCaFoyRjBhVzl1S0NrN1hISmNiaUFnSUNCOVhISmNiaUFnSUNCbWRXNWpkR2x2YmlCcmFXeHNSWFpsYm5SSmJXMWxaR2xoZEdWc2VTaGxkbVZ1ZENrZ2UxeHlYRzRnSUNBZ0lDQWdJR1YyWlc1MExuQnlaWFpsYm5SRVpXWmhkV3gwS0NrN1hISmNiaUFnSUNBZ0lDQWdaWFpsYm5RdWMzUnZjRWx0YldWa2FXRjBaVkJ5YjNCaFoyRjBhVzl1S0NrN1hISmNiaUFnSUNCOVhISmNibHh5WEc0Z0lDQWdablZ1WTNScGIyNGdiV1ZoYzNWeVpWUmxlSFJYYVdSMGFDaGxLU0I3WEhKY2JpQWdJQ0FnSUNBZ2FXWWdLQ0Z6YVhwbGNpbDdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIWmhjaUJ6ZEhsc1pTQTlJR1ZiTUYwdVkzVnljbVZ1ZEZOMGVXeGxJSHg4SUhkcGJtUnZkeTVuWlhSRGIyMXdkWFJsWkZOMGVXeGxLR1ZiTUYwc0lHNTFiR3dwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0J6YVhwbGNpQTlJQ1FvWkc5amRXMWxiblF1WTNKbFlYUmxSV3hsYldWdWRDaGNJbVJwZGx3aUtTa3VZM056S0h0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIQnZjMmwwYVc5dU9pQmNJbUZpYzI5c2RYUmxYQ0lzWEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCc1pXWjBPaUJjSWkweE1EQXdNSEI0WENJc1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBiM0E2SUZ3aUxURXdNREF3Y0hoY0lpeGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR1JwYzNCc1lYazZJRndpYm05dVpWd2lMRnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWm05dWRGTnBlbVU2SUhOMGVXeGxMbVp2Ym5SVGFYcGxMRnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWm05dWRFWmhiV2xzZVRvZ2MzUjViR1V1Wm05dWRFWmhiV2xzZVN4Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHWnZiblJUZEhsc1pUb2djM1I1YkdVdVptOXVkRk4wZVd4bExGeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdabTl1ZEZkbGFXZG9kRG9nYzNSNWJHVXVabTl1ZEZkbGFXZG9kQ3hjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd4bGRIUmxjbE53WVdOcGJtYzZJSE4wZVd4bExteGxkSFJsY2xOd1lXTnBibWNzWEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMFpYaDBWSEpoYm5ObWIzSnRPaUJ6ZEhsc1pTNTBaWGgwVkhKaGJuTm1iM0p0TEZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2QyaHBkR1ZUY0dGalpUb2dYQ0p1YjNkeVlYQmNJbHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdjMmw2WlhJdVlYUjBjaWhjSW1Oc1lYTnpYQ0lzWENKelpXeGxZM1F5TFhOcGVtVnlYQ0lwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FrS0Z3aVltOWtlVndpS1M1aGNIQmxibVFvYzJsNlpYSXBPMXh5WEc0Z0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ0lDQnphWHBsY2k1MFpYaDBLR1V1ZG1Gc0tDa3BPMXh5WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUJ6YVhwbGNpNTNhV1IwYUNncE8xeHlYRzRnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJR1oxYm1OMGFXOXVJSE41Ym1ORGMzTkRiR0Z6YzJWektHUmxjM1FzSUhOeVl5d2dZV1JoY0hSbGNpa2dlMXh5WEc0Z0lDQWdJQ0FnSUhaaGNpQmpiR0Z6YzJWekxDQnlaWEJzWVdObGJXVnVkSE1nUFNCYlhTd2dZV1JoY0hSbFpEdGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ1kyeGhjM05sY3lBOUlHUmxjM1F1WVhSMGNpaGNJbU5zWVhOelhDSXBPMXh5WEc0Z0lDQWdJQ0FnSUdsbUlDaGpiR0Z6YzJWektTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lHTnNZWE56WlhNZ1BTQW5KeUFySUdOc1lYTnpaWE03SUM4dklHWnZjaUJKUlNCM2FHbGphQ0J5WlhSMWNtNXpJRzlpYW1WamRGeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBa0tHTnNZWE56WlhNdWMzQnNhWFFvWENJZ1hDSXBLUzVsWVdOb01paG1kVzVqZEdsdmJpZ3BJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbUlDaDBhR2x6TG1sdVpHVjRUMllvWENKelpXeGxZM1F5TFZ3aUtTQTlQVDBnTUNrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhKbGNHeGhZMlZ0Wlc1MGN5NXdkWE5vS0hSb2FYTXBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0I5S1R0Y2NseHVJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJQ0FnWTJ4aGMzTmxjeUE5SUhOeVl5NWhkSFJ5S0Z3aVkyeGhjM05jSWlrN1hISmNiaUFnSUNBZ0lDQWdhV1lnS0dOc1lYTnpaWE1wSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnWTJ4aGMzTmxjeUE5SUNjbklDc2dZMnhoYzNObGN6c2dMeThnWm05eUlFbEZJSGRvYVdOb0lISmxkSFZ5Ym5NZ2IySnFaV04wWEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ1FvWTJ4aGMzTmxjeTV6Y0d4cGRDaGNJaUJjSWlrcExtVmhZMmd5S0daMWJtTjBhVzl1S0NrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1lnS0hSb2FYTXVhVzVrWlhoUFppaGNJbk5sYkdWamRESXRYQ0lwSUNFOVBTQXdLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZV1JoY0hSbFpDQTlJR0ZrWVhCMFpYSW9kR2hwY3lrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tHRmtZWEIwWldRcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVZ3YkdGalpXMWxiblJ6TG5CMWMyZ29kR2hwY3lrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCOUtUdGNjbHh1SUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUNBZ1pHVnpkQzVoZEhSeUtGd2lZMnhoYzNOY0lpd2djbVZ3YkdGalpXMWxiblJ6TG1wdmFXNG9YQ0lnWENJcEtUdGNjbHh1SUNBZ0lIMWNjbHh1WEhKY2JseHlYRzRnSUNBZ1puVnVZM1JwYjI0Z2JXRnlhMDFoZEdOb0tIUmxlSFFzSUhSbGNtMHNJRzFoY210MWNDd2daWE5qWVhCbFRXRnlhM1Z3S1NCN1hISmNiaUFnSUNBZ0lDQWdkbUZ5SUcxaGRHTm9QWE4wY21sd1JHbGhZM0pwZEdsamN5aDBaWGgwTG5SdlZYQndaWEpEWVhObEtDa3BMbWx1WkdWNFQyWW9jM1J5YVhCRWFXRmpjbWwwYVdOektIUmxjbTB1ZEc5VmNIQmxja05oYzJVb0tTa3BMRnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjBiRDEwWlhKdExteGxibWQwYUR0Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnYVdZZ0tHMWhkR05vUERBcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2JXRnlhM1Z3TG5CMWMyZ29aWE5qWVhCbFRXRnlhM1Z3S0hSbGVIUXBLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdU8xeHlYRzRnSUNBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lDQWdiV0Z5YTNWd0xuQjFjMmdvWlhOallYQmxUV0Z5YTNWd0tIUmxlSFF1YzNWaWMzUnlhVzVuS0RBc0lHMWhkR05vS1NrcE8xeHlYRzRnSUNBZ0lDQWdJRzFoY210MWNDNXdkWE5vS0Z3aVBITndZVzRnWTJ4aGMzTTlKM05sYkdWamRESXRiV0YwWTJnblBsd2lLVHRjY2x4dUlDQWdJQ0FnSUNCdFlYSnJkWEF1Y0hWemFDaGxjMk5oY0dWTllYSnJkWEFvZEdWNGRDNXpkV0p6ZEhKcGJtY29iV0YwWTJnc0lHMWhkR05vSUNzZ2RHd3BLU2s3WEhKY2JpQWdJQ0FnSUNBZ2JXRnlhM1Z3TG5CMWMyZ29YQ0k4TDNOd1lXNCtYQ0lwTzF4eVhHNGdJQ0FnSUNBZ0lHMWhjbXQxY0M1d2RYTm9LR1Z6WTJGd1pVMWhjbXQxY0NoMFpYaDBMbk4xWW5OMGNtbHVaeWh0WVhSamFDQXJJSFJzTENCMFpYaDBMbXhsYm1kMGFDa3BLVHRjY2x4dUlDQWdJSDFjY2x4dVhISmNiaUFnSUNCbWRXNWpkR2x2YmlCa1pXWmhkV3gwUlhOallYQmxUV0Z5YTNWd0tHMWhjbXQxY0NrZ2UxeHlYRzRnSUNBZ0lDQWdJSFpoY2lCeVpYQnNZV05sWDIxaGNDQTlJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdKMXhjWEZ3bk9pQW5KaU01TWpzbkxGeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBbkppYzZJQ2NtWVcxd095Y3NYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDYzhKem9nSnlac2REc25MRnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQW5QaWM2SUNjbVozUTdKeXhjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdKMXdpSnpvZ0p5WnhkVzkwT3ljc1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUZ3aUoxd2lPaUFuSmlNek9Uc25MRnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQmNJaTljSWpvZ0p5WWpORGM3SjF4eVhHNGdJQ0FnSUNBZ0lIMDdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCVGRISnBibWNvYldGeWEzVndLUzV5WlhCc1lXTmxLQzliSmp3K1hDSW5YRnd2WEZ4Y1hGMHZaeXdnWm5WdVkzUnBiMjRnS0cxaGRHTm9LU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQnlaWEJzWVdObFgyMWhjRnR0WVhSamFGMDdYSEpjYmlBZ0lDQWdJQ0FnZlNrN1hISmNiaUFnSUNCOVhISmNibHh5WEc0Z0lDQWdMeW9xWEhKY2JpQWdJQ0FnS2lCUWNtOWtkV05sY3lCaGJpQmhhbUY0TFdKaGMyVmtJSEYxWlhKNUlHWjFibU4wYVc5dVhISmNiaUFnSUNBZ0tseHlYRzRnSUNBZ0lDb2dRSEJoY21GdElHOXdkR2x2Ym5NZ2IySnFaV04wSUdOdmJuUmhhVzVwYm1jZ1kyOXVabWxuZFhKaGRHbHZiaUJ3WVhKaGJYUmxjbk5jY2x4dUlDQWdJQ0FxSUVCd1lYSmhiU0J2Y0hScGIyNXpMbkJoY21GdGN5QndZWEpoYldWMFpYSWdiV0Z3SUdadmNpQjBhR1VnZEhKaGJuTndiM0owSUdGcVlYZ2dZMkZzYkN3Z1kyRnVJR052Ym5SaGFXNGdjM1ZqYUNCdmNIUnBiMjV6SUdGeklHTmhZMmhsTENCcWMyOXVjRU5oYkd4aVlXTnJMQ0JsZEdNdUlITmxaU0FrTG1GcVlYaGNjbHh1SUNBZ0lDQXFJRUJ3WVhKaGJTQnZjSFJwYjI1ekxuUnlZVzV6Y0c5eWRDQm1kVzVqZEdsdmJpQjBhR0YwSUhkcGJHd2dZbVVnZFhObFpDQjBieUJsZUdWamRYUmxJSFJvWlNCaGFtRjRJSEpsY1hWbGMzUXVJRzExYzNRZ1ltVWdZMjl0Y0dGMGFXSnNaU0IzYVhSb0lIQmhjbUZ0WlhSbGNuTWdjM1Z3Y0c5eWRHVmtJR0o1SUNRdVlXcGhlRnh5WEc0Z0lDQWdJQ29nUUhCaGNtRnRJRzl3ZEdsdmJuTXVkWEpzSUhWeWJDQm1iM0lnZEdobElHUmhkR0ZjY2x4dUlDQWdJQ0FxSUVCd1lYSmhiU0J2Y0hScGIyNXpMbVJoZEdFZ1lTQm1kVzVqZEdsdmJpaHpaV0Z5WTJoVVpYSnRMQ0J3WVdkbFRuVnRZbVZ5TENCamIyNTBaWGgwS1NCMGFHRjBJSE5vYjNWc1pDQnlaWFIxY200Z1lXNGdiMkpxWldOMElHTnZiblJoYVc1cGJtY2djWFZsY25rZ2MzUnlhVzVuSUhCaGNtRnRaWFJsY25NZ1ptOXlJSFJvWlNCaFltOTJaU0IxY213dVhISmNiaUFnSUNBZ0tpQkFjR0Z5WVcwZ2IzQjBhVzl1Y3k1a1lYUmhWSGx3WlNCeVpYRjFaWE4wSUdSaGRHRWdkSGx3WlRvZ1lXcGhlQ3dnYW5OdmJuQXNJRzkwYUdWeUlHUmhkR0YwWVhSNWNHVnpJSE4xY0hCdmNuUmxaQ0JpZVNCcVVYVmxjbmtuY3lBa0xtRnFZWGdnWm5WdVkzUnBiMjRnYjNJZ2RHaGxJSFJ5WVc1emNHOXlkQ0JtZFc1amRHbHZiaUJwWmlCemNHVmphV1pwWldSY2NseHVJQ0FnSUNBcUlFQndZWEpoYlNCdmNIUnBiMjV6TG5GMWFXVjBUV2xzYkdseklDaHZjSFJwYjI1aGJDa2diV2xzYkdselpXTnZibVJ6SUhSdklIZGhhWFFnWW1WbWIzSmxJRzFoYTJsdVp5QjBhR1VnWVdwaGVGSmxjWFZsYzNRc0lHaGxiSEJ6SUdSbFltOTFibU5sSUhSb1pTQmhhbUY0SUdaMWJtTjBhVzl1SUdsbUlHbHVkbTlyWldRZ2RHOXZJRzltZEdWdVhISmNiaUFnSUNBZ0tpQkFjR0Z5WVcwZ2IzQjBhVzl1Y3k1eVpYTjFiSFJ6SUdFZ1puVnVZM1JwYjI0b2NtVnRiM1JsUkdGMFlTd2djR0ZuWlU1MWJXSmxjaWtnZEdoaGRDQmpiMjUyWlhKMGN5QmtZWFJoSUhKbGRIVnlibVZrSUdadmNtMGdkR2hsSUhKbGJXOTBaU0J5WlhGMVpYTjBJSFJ2SUhSb1pTQm1iM0p0WVhRZ1pYaHdaV04wWldRZ1lua2dVMlZzWldOME1pNWNjbHh1SUNBZ0lDQXFJQ0FnSUNBZ1ZHaGxJR1Y0Y0dWamRHVmtJR1p2Y20xaGRDQnBjeUJoYmlCdlltcGxZM1FnWTI5dWRHRnBibWx1WnlCMGFHVWdabTlzYkc5M2FXNW5JR3RsZVhNNlhISmNiaUFnSUNBZ0tpQWdJQ0FnSUhKbGMzVnNkSE1nWVhKeVlYa2diMllnYjJKcVpXTjBjeUIwYUdGMElIZHBiR3dnWW1VZ2RYTmxaQ0JoY3lCamFHOXBZMlZ6WEhKY2JpQWdJQ0FnS2lBZ0lDQWdJRzF2Y21VZ0tHOXdkR2x2Ym1Gc0tTQmliMjlzWldGdUlHbHVaR2xqWVhScGJtY2dkMmhsZEdobGNpQjBhR1Z5WlNCaGNtVWdiVzl5WlNCeVpYTjFiSFJ6SUdGMllXbHNZV0pzWlZ4eVhHNGdJQ0FnSUNvZ0lDQWdJQ0JGZUdGdGNHeGxPaUI3Y21WemRXeDBjenBiZTJsa09qRXNJSFJsZUhRNkoxSmxaQ2Q5TEh0cFpEb3lMQ0IwWlhoME9pZENiSFZsSjMxZExDQnRiM0psT25SeWRXVjlYSEpjYmlBZ0lDQWdLaTljY2x4dUlDQWdJR1oxYm1OMGFXOXVJR0ZxWVhnb2IzQjBhVzl1Y3lrZ2UxeHlYRzRnSUNBZ0lDQWdJSFpoY2lCMGFXMWxiM1YwTENBdkx5QmpkWEp5Wlc1MElITmphR1ZrZFd4bFpDQmlkWFFnYm05MElIbGxkQ0JsZUdWamRYUmxaQ0J5WlhGMVpYTjBYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lHaGhibVJzWlhJZ1BTQnVkV3hzTEZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0J4ZFdsbGRFMXBiR3hwY3lBOUlHOXdkR2x2Ym5NdWNYVnBaWFJOYVd4c2FYTWdmSHdnTVRBd0xGeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCaGFtRjRWWEpzSUQwZ2IzQjBhVzl1Y3k1MWNtd3NYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lITmxiR1lnUFNCMGFHbHpPMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQnlaWFIxY200Z1puVnVZM1JwYjI0Z0tIRjFaWEo1S1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUhkcGJtUnZkeTVqYkdWaGNsUnBiV1Z2ZFhRb2RHbHRaVzkxZENrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUhScGJXVnZkWFFnUFNCM2FXNWtiM2N1YzJWMFZHbHRaVzkxZENobWRXNWpkR2x2YmlBb0tTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IyWVhJZ1pHRjBZU0E5SUc5d2RHbHZibk11WkdGMFlTd2dMeThnWVdwaGVDQmtZWFJoSUdaMWJtTjBhVzl1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkWEpzSUQwZ1lXcGhlRlZ5YkN3Z0x5OGdZV3BoZUNCMWNtd2djM1J5YVc1bklHOXlJR1oxYm1OMGFXOXVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RISmhibk53YjNKMElEMGdiM0IwYVc5dWN5NTBjbUZ1YzNCdmNuUWdmSHdnSkM1bWJpNXpaV3hsWTNReUxtRnFZWGhFWldaaGRXeDBjeTUwY21GdWMzQnZjblFzWEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdMeThnWkdWd2NtVmpZWFJsWkNBdElIUnZJR0psSUhKbGJXOTJaV1FnYVc0Z05DNHdJQ0F0SUhWelpTQndZWEpoYlhNZ2FXNXpkR1ZoWkZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR1JsY0hKbFkyRjBaV1FnUFNCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUjVjR1U2SUc5d2RHbHZibk11ZEhsd1pTQjhmQ0FuUjBWVUp5d2dMeThnYzJWMElIUjVjR1VnYjJZZ2NtVnhkV1Z6ZENBb1IwVlVJRzl5SUZCUFUxUXBYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR05oWTJobE9pQnZjSFJwYjI1ekxtTmhZMmhsSUh4OElHWmhiSE5sTEZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcWMyOXVjRU5oYkd4aVlXTnJPaUJ2Y0hScGIyNXpMbXB6YjI1d1EyRnNiR0poWTJ0OGZIVnVaR1ZtYVc1bFpDeGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdaR0YwWVZSNWNHVTZJRzl3ZEdsdmJuTXVaR0YwWVZSNWNHVjhmRndpYW5OdmJsd2lYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZTeGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCd1lYSmhiWE1nUFNBa0xtVjRkR1Z1WkNoN2ZTd2dKQzVtYmk1elpXeGxZM1F5TG1GcVlYaEVaV1poZFd4MGN5NXdZWEpoYlhNc0lHUmxjSEpsWTJGMFpXUXBPMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHUmhkR0VnUFNCa1lYUmhJRDhnWkdGMFlTNWpZV3hzS0hObGJHWXNJSEYxWlhKNUxuUmxjbTBzSUhGMVpYSjVMbkJoWjJVc0lIRjFaWEo1TG1OdmJuUmxlSFFwSURvZ2JuVnNiRHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhWeWJDQTlJQ2gwZVhCbGIyWWdkWEpzSUQwOVBTQW5ablZ1WTNScGIyNG5LU0EvSUhWeWJDNWpZV3hzS0hObGJHWXNJSEYxWlhKNUxuUmxjbTBzSUhGMVpYSjVMbkJoWjJVc0lIRjFaWEo1TG1OdmJuUmxlSFFwSURvZ2RYSnNPMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2hvWVc1a2JHVnlLU0I3SUdoaGJtUnNaWEl1WVdKdmNuUW9LVHNnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtSUNodmNIUnBiMjV6TG5CaGNtRnRjeWtnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtSUNna0xtbHpSblZ1WTNScGIyNG9iM0IwYVc5dWN5NXdZWEpoYlhNcEtTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ1F1WlhoMFpXNWtLSEJoY21GdGN5d2diM0IwYVc5dWN5NXdZWEpoYlhNdVkyRnNiQ2h6Wld4bUtTazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZTQmxiSE5sSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0pDNWxlSFJsYm1Rb2NHRnlZVzF6TENCdmNIUnBiMjV6TG5CaGNtRnRjeWs3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ1F1WlhoMFpXNWtLSEJoY21GdGN5d2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIVnliRG9nZFhKc0xGeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdSaGRHRlVlWEJsT2lCdmNIUnBiMjV6TG1SaGRHRlVlWEJsTEZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR1JoZEdFNklHUmhkR0VzWEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjM1ZqWTJWemN6b2dablZ1WTNScGIyNGdLR1JoZEdFcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdMeThnVkU5RVR5QXRJSEpsY0d4aFkyVWdjWFZsY25rdWNHRm5aU0IzYVhSb0lIRjFaWEo1SUhOdklIVnpaWEp6SUdoaGRtVWdZV05qWlhOeklIUnZJSFJsY20wc0lIQmhaMlVzSUdWMFl5NWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkbUZ5SUhKbGMzVnNkSE1nUFNCdmNIUnBiMjV6TG5KbGMzVnNkSE1vWkdGMFlTd2djWFZsY25rdWNHRm5aU2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhGMVpYSjVMbU5oYkd4aVlXTnJLSEpsYzNWc2RITXBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDBwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FHRnVaR3hsY2lBOUlIUnlZVzV6Y0c5eWRDNWpZV3hzS0hObGJHWXNJSEJoY21GdGN5azdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIMHNJSEYxYVdWMFRXbHNiR2x6S1R0Y2NseHVJQ0FnSUNBZ0lDQjlPMXh5WEc0Z0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUM4cUtseHlYRzRnSUNBZ0lDb2dVSEp2WkhWalpYTWdZU0J4ZFdWeWVTQm1kVzVqZEdsdmJpQjBhR0YwSUhkdmNtdHpJSGRwZEdnZ1lTQnNiMk5oYkNCaGNuSmhlVnh5WEc0Z0lDQWdJQ3BjY2x4dUlDQWdJQ0FxSUVCd1lYSmhiU0J2Y0hScGIyNXpJRzlpYW1WamRDQmpiMjUwWVdsdWFXNW5JR052Ym1acFozVnlZWFJwYjI0Z2NHRnlZVzFsZEdWeWN5NGdWR2hsSUc5d2RHbHZibk1nY0dGeVlXMWxkR1Z5SUdOaGJpQmxhWFJvWlhJZ1ltVWdZVzRnWVhKeVlYa2diM0lnWVc1Y2NseHVJQ0FnSUNBcUlHOWlhbVZqZEM1Y2NseHVJQ0FnSUNBcVhISmNiaUFnSUNBZ0tpQkpaaUIwYUdVZ1lYSnlZWGtnWm05eWJTQnBjeUIxYzJWa0lHbDBJR2x6SUdGemMzVnRaV1FnZEdoaGRDQnBkQ0JqYjI1MFlXbHVjeUJ2WW1wbFkzUnpJSGRwZEdnZ0oybGtKeUJoYm1RZ0ozUmxlSFFuSUd0bGVYTXVYSEpjYmlBZ0lDQWdLbHh5WEc0Z0lDQWdJQ29nU1dZZ2RHaGxJRzlpYW1WamRDQm1iM0p0SUdseklIVnpaV1FnZEdrZ2FYTWdZWE56ZFcxbFpDQjBhR0YwSUdsMElHTnZiblJoYVc1eklDZGtZWFJoSnlCaGJtUWdKM1JsZUhRbklHdGxlWE11SUZSb1pTQW5aR0YwWVNjZ2EyVjVJSE5vYjNWc1pDQmpiMjUwWVdsdVhISmNiaUFnSUNBZ0tpQmhiaUJoY25KaGVTQnZaaUJ2WW1wbFkzUnpJSFJvWVhRZ2QybHNiQ0JpWlNCMWMyVmtJR0Z6SUdOb2IybGpaWE11SUZSb1pYTmxJRzlpYW1WamRITWdiWFZ6ZENCamIyNTBZV2x1SUdGMElHeGxZWE4wSUdGdUlDZHBaQ2NnYTJWNUxpQlVhR1VnSjNSbGVIUW5YSEpjYmlBZ0lDQWdLaUJyWlhrZ1kyRnVJR1ZwZEdobGNpQmlaU0JoSUZOMGNtbHVaeUJwYmlCM2FHbGphQ0JqWVhObElHbDBJR2x6SUdWNGNHVmpkR1ZrSUhSb1lYUWdaV0ZqYUNCbGJHVnRaVzUwSUdsdUlIUm9aU0FuWkdGMFlTY2dZWEp5WVhrZ2FHRnpJR0VnYTJWNUlIZHBkR2dnZEdobFhISmNiaUFnSUNBZ0tpQjJZV3gxWlNCdlppQW5kR1Y0ZENjZ2QyaHBZMmdnZDJsc2JDQmlaU0IxYzJWa0lIUnZJRzFoZEdOb0lHTm9iMmxqWlhNdUlFRnNkR1Z5Ym1GMGFYWmxiSGtzSUhSbGVIUWdZMkZ1SUdKbElHRWdablZ1WTNScGIyNG9hWFJsYlNrZ2RHaGhkQ0JqWVc0Z1pYaDBjbUZqZEZ4eVhHNGdJQ0FnSUNvZ2RHaGxJSFJsZUhRdVhISmNiaUFnSUNBZ0tpOWNjbHh1SUNBZ0lHWjFibU4wYVc5dUlHeHZZMkZzS0c5d2RHbHZibk1wSUh0Y2NseHVJQ0FnSUNBZ0lDQjJZWElnWkdGMFlTQTlJRzl3ZEdsdmJuTXNJQzh2SUdSaGRHRWdaV3hsYldWdWRITmNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ1pHRjBZVlJsZUhRc1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUhSdGNDeGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RHVjRkQ0E5SUdaMWJtTjBhVzl1SUNocGRHVnRLU0I3SUhKbGRIVnliaUJjSWx3aUsybDBaVzB1ZEdWNGREc2dmVHNnTHk4Z1puVnVZM1JwYjI0Z2RYTmxaQ0IwYnlCeVpYUnlhV1YyWlNCMGFHVWdkR1Y0ZENCd2IzSjBhVzl1SUc5bUlHRWdaR0YwWVNCcGRHVnRJSFJvWVhRZ2FYTWdiV0YwWTJobFpDQmhaMkZwYm5OMElIUm9aU0J6WldGeVkyaGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lHbG1JQ2drTG1selFYSnlZWGtvWkdGMFlTa3BJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdkRzF3SUQwZ1pHRjBZVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdaR0YwWVNBOUlIc2djbVZ6ZFd4MGN6b2dkRzF3SUgwN1hISmNiaUFnSUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdhV1lnS0NRdWFYTkdkVzVqZEdsdmJpaGtZWFJoS1NBOVBUMGdabUZzYzJVcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RHMXdJRDBnWkdGMFlUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ1pHRjBZU0E5SUdaMWJtTjBhVzl1S0NrZ2V5QnlaWFIxY200Z2RHMXdPeUI5TzF4eVhHNGdJQ0FnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNBZ2RtRnlJR1JoZEdGSmRHVnRJRDBnWkdGMFlTZ3BPMXh5WEc0Z0lDQWdJQ0FnSUdsbUlDaGtZWFJoU1hSbGJTNTBaWGgwS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUhSbGVIUWdQU0JrWVhSaFNYUmxiUzUwWlhoME8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBdkx5QnBaaUIwWlhoMElHbHpJRzV2ZENCaElHWjFibU4wYVc5dUlIZGxJR0Z6YzNWdFpTQnBkQ0IwYnlCaVpTQmhJR3RsZVNCdVlXMWxYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2doSkM1cGMwWjFibU4wYVc5dUtIUmxlSFFwS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmtZWFJoVkdWNGRDQTlJR1JoZEdGSmRHVnRMblJsZUhRN0lDOHZJSGRsSUc1bFpXUWdkRzhnYzNSdmNtVWdkR2hwY3lCcGJpQmhJSE5sY0dGeVlYUmxJSFpoY21saFlteGxJR0psWTJGMWMyVWdhVzRnZEdobElHNWxlSFFnYzNSbGNDQmtZWFJoSUdkbGRITWdjbVZ6WlhRZ1lXNWtJR1JoZEdFdWRHVjRkQ0JwY3lCdWJ5QnNiMjVuWlhJZ1lYWmhhV3hoWW14bFhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBaWGgwSUQwZ1puVnVZM1JwYjI0Z0tHbDBaVzBwSUhzZ2NtVjBkWEp1SUdsMFpXMWJaR0YwWVZSbGVIUmRPeUI5TzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnSUNCeVpYUjFjbTRnWm5WdVkzUnBiMjRnS0hGMVpYSjVLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSFpoY2lCMElEMGdjWFZsY25rdWRHVnliU3dnWm1sc2RHVnlaV1FnUFNCN0lISmxjM1ZzZEhNNklGdGRJSDBzSUhCeWIyTmxjM003WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJR2xtSUNoMElEMDlQU0JjSWx3aUtTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J4ZFdWeWVTNWpZV3hzWW1GamF5aGtZWFJoS0NrcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdU8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCOVhISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQndjbTlqWlhOeklEMGdablZ1WTNScGIyNG9aR0YwZFcwc0lHTnZiR3hsWTNScGIyNHBJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhaaGNpQm5jbTkxY0N3Z1lYUjBjanRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdSaGRIVnRJRDBnWkdGMGRXMWJNRjA3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFppQW9aR0YwZFcwdVkyaHBiR1J5Wlc0cElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCbmNtOTFjQ0E5SUh0OU8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdadmNpQW9ZWFIwY2lCcGJpQmtZWFIxYlNrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaaUFvWkdGMGRXMHVhR0Z6VDNkdVVISnZjR1Z5ZEhrb1lYUjBjaWtwSUdkeWIzVndXMkYwZEhKZFBXUmhkSFZ0VzJGMGRISmRPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCbmNtOTFjQzVqYUdsc1pISmxiajFiWFR0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FrS0dSaGRIVnRMbU5vYVd4a2NtVnVLUzVsWVdOb01paG1kVzVqZEdsdmJpaHBMQ0JqYUdsc1pFUmhkSFZ0S1NCN0lIQnliMk5sYzNNb1kyaHBiR1JFWVhSMWJTd2daM0p2ZFhBdVkyaHBiR1J5Wlc0cE95QjlLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaaUFvWjNKdmRYQXVZMmhwYkdSeVpXNHViR1Z1WjNSb0lIeDhJSEYxWlhKNUxtMWhkR05vWlhJb2RDd2dkR1Y0ZENobmNtOTFjQ2tzSUdSaGRIVnRLU2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCamIyeHNaV04wYVc5dUxuQjFjMmdvWjNKdmRYQXBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDBnWld4elpTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLSEYxWlhKNUxtMWhkR05vWlhJb2RDd2dkR1Y0ZENoa1lYUjFiU2tzSUdSaGRIVnRLU2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCamIyeHNaV04wYVc5dUxuQjFjMmdvWkdGMGRXMHBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdmVHRjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNRb1pHRjBZU2dwTG5KbGMzVnNkSE1wTG1WaFkyZ3lLR1oxYm1OMGFXOXVLR2tzSUdSaGRIVnRLU0I3SUhCeWIyTmxjM01vWkdGMGRXMHNJR1pwYkhSbGNtVmtMbkpsYzNWc2RITXBPeUI5S1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnY1hWbGNua3VZMkZzYkdKaFkyc29abWxzZEdWeVpXUXBPMXh5WEc0Z0lDQWdJQ0FnSUgwN1hISmNiaUFnSUNCOVhISmNibHh5WEc0Z0lDQWdMeThnVkU5RVR5QnFZWFpoWkc5alhISmNiaUFnSUNCbWRXNWpkR2x2YmlCMFlXZHpLR1JoZEdFcElIdGNjbHh1SUNBZ0lDQWdJQ0IyWVhJZ2FYTkdkVzVqSUQwZ0pDNXBjMFoxYm1OMGFXOXVLR1JoZEdFcE8xeHlYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQm1kVzVqZEdsdmJpQW9jWFZsY25rcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RtRnlJSFFnUFNCeGRXVnllUzUwWlhKdExDQm1hV3gwWlhKbFpDQTlJSHR5WlhOMWJIUnpPaUJiWFgwN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNRb2FYTkdkVzVqSUQ4Z1pHRjBZU2dwSURvZ1pHRjBZU2t1WldGamFDaG1kVzVqZEdsdmJpQW9LU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMllYSWdhWE5QWW1wbFkzUWdQU0IwYUdsekxuUmxlSFFnSVQwOUlIVnVaR1ZtYVc1bFpDeGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMFpYaDBJRDBnYVhOUFltcGxZM1FnUHlCMGFHbHpMblJsZUhRZ09pQjBhR2x6TzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLSFFnUFQwOUlGd2lYQ0lnZkh3Z2NYVmxjbmt1YldGMFkyaGxjaWgwTENCMFpYaDBLU2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR1pwYkhSbGNtVmtMbkpsYzNWc2RITXVjSFZ6YUNocGMwOWlhbVZqZENBL0lIUm9hWE1nT2lCN2FXUTZJSFJvYVhNc0lIUmxlSFE2SUhSb2FYTjlLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZlNrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUhGMVpYSjVMbU5oYkd4aVlXTnJLR1pwYkhSbGNtVmtLVHRjY2x4dUlDQWdJQ0FnSUNCOU8xeHlYRzRnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQzhxS2x4eVhHNGdJQ0FnSUNvZ1EyaGxZMnR6SUdsbUlIUm9aU0JtYjNKdFlYUjBaWElnWm5WdVkzUnBiMjRnYzJodmRXeGtJR0psSUhWelpXUXVYSEpjYmlBZ0lDQWdLbHh5WEc0Z0lDQWdJQ29nVkdoeWIzZHpJR0Z1SUdWeWNtOXlJR2xtSUdsMElHbHpJRzV2ZENCaElHWjFibU4wYVc5dUxpQlNaWFIxY201eklIUnlkV1VnYVdZZ2FYUWdjMmh2ZFd4a0lHSmxJSFZ6WldRc1hISmNiaUFnSUNBZ0tpQm1ZV3h6WlNCcFppQnVieUJtYjNKdFlYUjBhVzVuSUhOb2IzVnNaQ0JpWlNCd1pYSm1iM0p0WldRdVhISmNiaUFnSUNBZ0tseHlYRzRnSUNBZ0lDb2dRSEJoY21GdElHWnZjbTFoZEhSbGNseHlYRzRnSUNBZ0lDb3ZYSEpjYmlBZ0lDQm1kVzVqZEdsdmJpQmphR1ZqYTBadmNtMWhkSFJsY2lobWIzSnRZWFIwWlhJc0lHWnZjbTFoZEhSbGNrNWhiV1VwSUh0Y2NseHVJQ0FnSUNBZ0lDQnBaaUFvSkM1cGMwWjFibU4wYVc5dUtHWnZjbTFoZEhSbGNpa3BJSEpsZEhWeWJpQjBjblZsTzF4eVhHNGdJQ0FnSUNBZ0lHbG1JQ2doWm05eWJXRjBkR1Z5S1NCeVpYUjFjbTRnWm1Gc2MyVTdYSEpjYmlBZ0lDQWdJQ0FnZEdoeWIzY2dibVYzSUVWeWNtOXlLR1p2Y20xaGRIUmxjazVoYldVZ0sxd2lJRzExYzNRZ1ltVWdZU0JtZFc1amRHbHZiaUJ2Y2lCaElHWmhiSE41SUhaaGJIVmxYQ0lwTzF4eVhHNGdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lHWjFibU4wYVc5dUlHVjJZV3gxWVhSbEtIWmhiQ2tnZTF4eVhHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlBa0xtbHpSblZ1WTNScGIyNG9kbUZzS1NBL0lIWmhiQ2dwSURvZ2RtRnNPMXh5WEc0Z0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUdaMWJtTjBhVzl1SUdOdmRXNTBVbVZ6ZFd4MGN5aHlaWE4xYkhSektTQjdYSEpjYmlBZ0lDQWdJQ0FnZG1GeUlHTnZkVzUwSUQwZ01EdGNjbHh1SUNBZ0lDQWdJQ0FrTG1WaFkyZ29jbVZ6ZFd4MGN5d2dablZ1WTNScGIyNG9hU3dnYVhSbGJTa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQnBaaUFvYVhSbGJTNWphR2xzWkhKbGJpa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWTI5MWJuUWdLejBnWTI5MWJuUlNaWE4xYkhSektHbDBaVzB1WTJocGJHUnlaVzRwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0I5SUdWc2MyVWdlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWTI5MWJuUXJLenRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0FnSUgwcE8xeHlYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQmpiM1Z1ZER0Y2NseHVJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQXZLaXBjY2x4dUlDQWdJQ0FxSUVSbFptRjFiSFFnZEc5clpXNXBlbVZ5TGlCVWFHbHpJR1oxYm1OMGFXOXVJSFZ6WlhNZ1luSmxZV3R6SUhSb1pTQnBibkIxZENCdmJpQnpkV0p6ZEhKcGJtY2diV0YwWTJnZ2IyWWdZVzU1SUhOMGNtbHVaeUJtY205dElIUm9aVnh5WEc0Z0lDQWdJQ29nYjNCMGN5NTBiMnRsYmxObGNHRnlZWFJ2Y25NZ1lYSnlZWGtnWVc1a0lIVnpaWE1nYjNCMGN5NWpjbVZoZEdWVFpXRnlZMmhEYUc5cFkyVWdkRzhnWTNKbFlYUmxJSFJvWlNCamFHOXBZMlVnYjJKcVpXTjBMaUJDYjNSb0lHOW1JSFJvYjNObFhISmNiaUFnSUNBZ0tpQjBkMjhnYjNCMGFXOXVjeUJvWVhabElIUnZJR0psSUdSbFptbHVaV1FnYVc0Z2IzSmtaWElnWm05eUlIUm9aU0IwYjJ0bGJtbDZaWElnZEc4Z2QyOXlheTVjY2x4dUlDQWdJQ0FxWEhKY2JpQWdJQ0FnS2lCQWNHRnlZVzBnYVc1d2RYUWdkR1Y0ZENCMWMyVnlJR2hoY3lCMGVYQmxaQ0J6YnlCbVlYSWdiM0lnY0dGemRHVmtJR2x1ZEc4Z2RHaGxJSE5sWVhKamFDQm1hV1ZzWkZ4eVhHNGdJQ0FnSUNvZ1FIQmhjbUZ0SUhObGJHVmpkR2x2YmlCamRYSnlaVzUwYkhrZ2MyVnNaV04wWldRZ1kyaHZhV05sYzF4eVhHNGdJQ0FnSUNvZ1FIQmhjbUZ0SUhObGJHVmpkRU5oYkd4aVlXTnJJR1oxYm1OMGFXOXVLR05vYjJsalpTa2dZMkZzYkdKaFkyc2dkR2h2SUdGa1pDQjBhR1VnWTJodmFXTmxJSFJ2SUhObGJHVmpkR2x2Ymx4eVhHNGdJQ0FnSUNvZ1FIQmhjbUZ0SUc5d2RITWdjMlZzWldOME1pZHpJRzl3ZEhOY2NseHVJQ0FnSUNBcUlFQnlaWFIxY200Z2RXNWtaV1pwYm1Wa0wyNTFiR3dnZEc4Z2JHVmhkbVVnZEdobElHTjFjbkpsYm5RZ2FXNXdkWFFnZFc1amFHRnVaMlZrTENCdmNpQmhJSE4wY21sdVp5QjBieUJqYUdGdVoyVWdkR2hsSUdsdWNIVjBJSFJ2SUhSb1pTQnlaWFIxY201bFpDQjJZV3gxWlZ4eVhHNGdJQ0FnSUNvdlhISmNiaUFnSUNCbWRXNWpkR2x2YmlCa1pXWmhkV3gwVkc5clpXNXBlbVZ5S0dsdWNIVjBMQ0J6Wld4bFkzUnBiMjRzSUhObGJHVmpkRU5oYkd4aVlXTnJMQ0J2Y0hSektTQjdYSEpjYmlBZ0lDQWdJQ0FnZG1GeUlHOXlhV2RwYm1Gc0lEMGdhVzV3ZFhRc0lDOHZJSE4wYjNKbElIUm9aU0J2Y21sbmFXNWhiQ0J6YnlCM1pTQmpZVzRnWTI5dGNHRnlaU0JoYm1RZ2EyNXZkeUJwWmlCM1pTQnVaV1ZrSUhSdklIUmxiR3dnZEdobElITmxZWEpqYUNCMGJ5QjFjR1JoZEdVZ2FYUnpJSFJsZUhSY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnWkhWd1pTQTlJR1poYkhObExDQXZMeUJqYUdWamF5Qm1iM0lnZDJobGRHaGxjaUJoSUhSdmEyVnVJSGRsSUdWNGRISmhZM1JsWkNCeVpYQnlaWE5sYm5SeklHRWdaSFZ3YkdsallYUmxJSE5sYkdWamRHVmtJR05vYjJsalpWeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCMGIydGxiaXdnTHk4Z2RHOXJaVzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdhVzVrWlhnc0lDOHZJSEJ2YzJsMGFXOXVJR0YwSUhkb2FXTm9JSFJvWlNCelpYQmhjbUYwYjNJZ2QyRnpJR1p2ZFc1a1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUdrc0lHd3NJQzh2SUd4dmIzQnBibWNnZG1GeWFXRmliR1Z6WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSE5sY0dGeVlYUnZjanNnTHk4Z2RHaGxJRzFoZEdOb1pXUWdjMlZ3WVhKaGRHOXlYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lHbG1JQ2doYjNCMGN5NWpjbVZoZEdWVFpXRnlZMmhEYUc5cFkyVWdmSHdnSVc5d2RITXVkRzlyWlc1VFpYQmhjbUYwYjNKeklIeDhJRzl3ZEhNdWRHOXJaVzVUWlhCaGNtRjBiM0p6TG14bGJtZDBhQ0E4SURFcElISmxkSFZ5YmlCMWJtUmxabWx1WldRN1hISmNibHh5WEc0Z0lDQWdJQ0FnSUhkb2FXeGxJQ2gwY25WbEtTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lHbHVaR1Y0SUQwZ0xURTdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0JtYjNJZ0tHa2dQU0F3TENCc0lEMGdiM0IwY3k1MGIydGxibE5sY0dGeVlYUnZjbk11YkdWdVozUm9PeUJwSUR3Z2JEc2dhU3NyS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnpaWEJoY21GMGIzSWdQU0J2Y0hSekxuUnZhMlZ1VTJWd1lYSmhkRzl5YzF0cFhUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2x1WkdWNElEMGdhVzV3ZFhRdWFXNWtaWGhQWmloelpYQmhjbUYwYjNJcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1lnS0dsdVpHVjRJRDQ5SURBcElHSnlaV0ZyTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNCcFppQW9hVzVrWlhnZ1BDQXdLU0JpY21WaGF6c2dMeThnWkdsa0lHNXZkQ0JtYVc1a0lHRnVlU0IwYjJ0bGJpQnpaWEJoY21GMGIzSWdhVzRnZEdobElHbHVjSFYwSUhOMGNtbHVaeXdnWW1GcGJGeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdkRzlyWlc0Z1BTQnBibkIxZEM1emRXSnpkSEpwYm1jb01Dd2dhVzVrWlhncE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCcGJuQjFkQ0E5SUdsdWNIVjBMbk4xWW5OMGNtbHVaeWhwYm1SbGVDQXJJSE5sY0dGeVlYUnZjaTVzWlc1bmRHZ3BPMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tIUnZhMlZ1TG14bGJtZDBhQ0ErSURBcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJ2YTJWdUlEMGdiM0IwY3k1amNtVmhkR1ZUWldGeVkyaERhRzlwWTJVdVkyRnNiQ2gwYUdsekxDQjBiMnRsYml3Z2MyVnNaV04wYVc5dUtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtSUNoMGIydGxiaUFoUFQwZ2RXNWtaV1pwYm1Wa0lDWW1JSFJ2YTJWdUlDRTlQU0J1ZFd4c0lDWW1JRzl3ZEhNdWFXUW9kRzlyWlc0cElDRTlQU0IxYm1SbFptbHVaV1FnSmlZZ2IzQjBjeTVwWkNoMGIydGxiaWtnSVQwOUlHNTFiR3dwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JrZFhCbElEMGdabUZzYzJVN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWm05eUlDaHBJRDBnTUN3Z2JDQTlJSE5sYkdWamRHbHZiaTVzWlc1bmRHZzdJR2tnUENCc095QnBLeXNwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLR1Z4ZFdGc0tHOXdkSE11YVdRb2RHOXJaVzRwTENCdmNIUnpMbWxrS0hObGJHVmpkR2x2Ymx0cFhTa3BLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmtkWEJsSUQwZ2RISjFaVHNnWW5KbFlXczdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtSUNnaFpIVndaU2tnYzJWc1pXTjBRMkZzYkdKaFkyc29kRzlyWlc0cE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdJQ0JwWmlBb2IzSnBaMmx1WVd3aFBUMXBibkIxZENrZ2NtVjBkWEp1SUdsdWNIVjBPMXh5WEc0Z0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUM4cUtseHlYRzRnSUNBZ0lDb2dRM0psWVhSbGN5QmhJRzVsZHlCamJHRnpjMXh5WEc0Z0lDQWdJQ3BjY2x4dUlDQWdJQ0FxSUVCd1lYSmhiU0J6ZFhCbGNrTnNZWE56WEhKY2JpQWdJQ0FnS2lCQWNHRnlZVzBnYldWMGFHOWtjMXh5WEc0Z0lDQWdJQ292WEhKY2JpQWdJQ0JtZFc1amRHbHZiaUJqYkdGNmVpaFRkWEJsY2tOc1lYTnpMQ0J0WlhSb2IyUnpLU0I3WEhKY2JpQWdJQ0FnSUNBZ2RtRnlJR052Ym5OMGNuVmpkRzl5SUQwZ1puVnVZM1JwYjI0Z0tDa2dlMzA3WEhKY2JpQWdJQ0FnSUNBZ1kyOXVjM1J5ZFdOMGIzSXVjSEp2ZEc5MGVYQmxJRDBnYm1WM0lGTjFjR1Z5UTJ4aGMzTTdYSEpjYmlBZ0lDQWdJQ0FnWTI5dWMzUnlkV04wYjNJdWNISnZkRzkwZVhCbExtTnZibk4wY25WamRHOXlJRDBnWTI5dWMzUnlkV04wYjNJN1hISmNiaUFnSUNBZ0lDQWdZMjl1YzNSeWRXTjBiM0l1Y0hKdmRHOTBlWEJsTG5CaGNtVnVkQ0E5SUZOMWNHVnlRMnhoYzNNdWNISnZkRzkwZVhCbE8xeHlYRzRnSUNBZ0lDQWdJR052Ym5OMGNuVmpkRzl5TG5CeWIzUnZkSGx3WlNBOUlDUXVaWGgwWlc1a0tHTnZibk4wY25WamRHOXlMbkJ5YjNSdmRIbHdaU3dnYldWMGFHOWtjeWs3WEhKY2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUdOdmJuTjBjblZqZEc5eU8xeHlYRzRnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJRUZpYzNSeVlXTjBVMlZzWldOME1pQTlJR05zWVhwNktFOWlhbVZqZEN3Z2UxeHlYRzVjY2x4dUlDQWdJQ0FnSUNBdkx5QmhZbk4wY21GamRGeHlYRzRnSUNBZ0lDQWdJR0pwYm1RNklHWjFibU4wYVc5dUlDaG1kVzVqS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUhaaGNpQnpaV3htSUQwZ2RHaHBjenRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlHWjFibU4wYVc5dUlDZ3BJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdaMWJtTXVZWEJ3Ykhrb2MyVnNaaXdnWVhKbmRXMWxiblJ6S1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZlR0Y2NseHVJQ0FnSUNBZ0lDQjlMRnh5WEc1Y2NseHVJQ0FnSUNBZ0lDQXZMeUJoWW5OMGNtRmpkRnh5WEc0Z0lDQWdJQ0FnSUdsdWFYUTZJR1oxYm1OMGFXOXVJQ2h2Y0hSektTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIWmhjaUJ5WlhOMWJIUnpMQ0J6WldGeVkyZ3NJSEpsYzNWc2RITlRaV3hsWTNSdmNpQTlJRndpTG5ObGJHVmpkREl0Y21WemRXeDBjMXdpTENCa2FYTmhZbXhsWkN3Z2NtVmhaRzl1YkhrN1hISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQXZMeUJ3Y21Wd1lYSmxJRzl3ZEdsdmJuTmNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTV2Y0hSeklEMGdiM0IwY3lBOUlIUm9hWE11Y0hKbGNHRnlaVTl3ZEhNb2IzQjBjeWs3WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbWxrUFc5d2RITXVhV1E3WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNBdkx5QmtaWE4wY205NUlHbG1JR05oYkd4bFpDQnZiaUJoYmlCbGVHbHpkR2x1WnlCamIyMXdiMjVsYm5SY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tHOXdkSE11Wld4bGJXVnVkQzVrWVhSaEtGd2ljMlZzWldOME1sd2lLU0FoUFQwZ2RXNWtaV1pwYm1Wa0lDWW1YSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J2Y0hSekxtVnNaVzFsYm5RdVpHRjBZU2hjSW5ObGJHVmpkREpjSWlrZ0lUMDlJRzUxYkd3cElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRzl3ZEhNdVpXeGxiV1Z1ZEM1a1lYUmhLRndpYzJWc1pXTjBNbHdpS1M1a1pYTjBjbTk1S0NrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11WTI5dWRHRnBibVZ5SUQwZ2RHaHBjeTVqY21WaGRHVkRiMjUwWVdsdVpYSW9LVHRjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVZMjl1ZEdGcGJtVnlTV1E5WENKek1tbGtYMXdpS3lodmNIUnpMbVZzWlcxbGJuUXVZWFIwY2loY0ltbGtYQ0lwSUh4OElGd2lZWFYwYjJkbGJsd2lLMjVsZUhSVmFXUW9LU2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdVkyOXVkR0ZwYm1WeVUyVnNaV04wYjNJOVhDSWpYQ0lyZEdocGN5NWpiMjUwWVdsdVpYSkpaQzV5WlhCc1lXTmxLQzhvV3pzbUxGeGNMbHhjSzF4Y0tseGNmaWM2WENKY1hDRmNYRjRqSkNWQVhGeGJYRnhkWEZ3b1hGd3BQVDVjWEh4ZEtTOW5MQ0FuWEZ4Y1hDUXhKeWs3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdVkyOXVkR0ZwYm1WeUxtRjBkSElvWENKcFpGd2lMQ0IwYUdsekxtTnZiblJoYVc1bGNrbGtLVHRjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUM4dklHTmhZMmhsSUhSb1pTQmliMlI1SUhOdklHWjFkSFZ5WlNCc2IyOXJkWEJ6SUdGeVpTQmphR1ZoY0Z4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxtSnZaSGtnUFNCMGFIVnVheWhtZFc1amRHbHZiaWdwSUhzZ2NtVjBkWEp1SUc5d2RITXVaV3hsYldWdWRDNWpiRzl6WlhOMEtGd2lZbTlrZVZ3aUtUc2dmU2s3WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNCemVXNWpRM056UTJ4aGMzTmxjeWgwYUdsekxtTnZiblJoYVc1bGNpd2dkR2hwY3k1dmNIUnpMbVZzWlcxbGJuUXNJSFJvYVhNdWIzQjBjeTVoWkdGd2RFTnZiblJoYVc1bGNrTnpjME5zWVhOektUdGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdVkyOXVkR0ZwYm1WeUxtRjBkSElvWENKemRIbHNaVndpTENCdmNIUnpMbVZzWlcxbGJuUXVZWFIwY2loY0luTjBlV3hsWENJcEtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTVqYjI1MFlXbHVaWEl1WTNOektHVjJZV3gxWVhSbEtHOXdkSE11WTI5dWRHRnBibVZ5UTNOektTazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11WTI5dWRHRnBibVZ5TG1Ga1pFTnNZWE56S0dWMllXeDFZWFJsS0c5d2RITXVZMjl1ZEdGcGJtVnlRM056UTJ4aGMzTXBLVHRjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVaV3hsYldWdWRGUmhZa2x1WkdWNElEMGdkR2hwY3k1dmNIUnpMbVZzWlcxbGJuUXVZWFIwY2loY0luUmhZbWx1WkdWNFhDSXBPMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnTHk4Z2MzZGhjQ0JqYjI1MFlXbHVaWElnWm05eUlIUm9aU0JsYkdWdFpXNTBYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11YjNCMGN5NWxiR1Z0Wlc1MFhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQXVaR0YwWVNoY0luTmxiR1ZqZERKY0lpd2dkR2hwY3lsY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDNWhkSFJ5S0Z3aWRHRmlhVzVrWlhoY0lpd2dYQ0l0TVZ3aUtWeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdMbUpsWm05eVpTaDBhR2x6TG1OdmJuUmhhVzVsY2lrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVZMjl1ZEdGcGJtVnlMbVJoZEdFb1hDSnpaV3hsWTNReVhDSXNJSFJvYVhNcE8xeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1a2NtOXdaRzkzYmlBOUlIUm9hWE11WTI5dWRHRnBibVZ5TG1acGJtUW9YQ0l1YzJWc1pXTjBNaTFrY205d1hDSXBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG1SeWIzQmtiM2R1TG1Ga1pFTnNZWE56S0dWMllXeDFZWFJsS0c5d2RITXVaSEp2Y0dSdmQyNURjM05EYkdGemN5a3BPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG1SeWIzQmtiM2R1TG1SaGRHRW9YQ0p6Wld4bFkzUXlYQ0lzSUhSb2FYTXBPMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnYzNsdVkwTnpjME5zWVhOelpYTW9kR2hwY3k1a2NtOXdaRzkzYml3Z2RHaHBjeTV2Y0hSekxtVnNaVzFsYm5Rc0lIUm9hWE11YjNCMGN5NWhaR0Z3ZEVSeWIzQmtiM2R1UTNOelEyeGhjM01wTzF4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTV5WlhOMWJIUnpJRDBnY21WemRXeDBjeUE5SUhSb2FYTXVZMjl1ZEdGcGJtVnlMbVpwYm1Rb2NtVnpkV3gwYzFObGJHVmpkRzl5S1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NXpaV0Z5WTJnZ1BTQnpaV0Z5WTJnZ1BTQjBhR2x6TG1OdmJuUmhhVzVsY2k1bWFXNWtLRndpYVc1d2RYUXVjMlZzWldOME1pMXBibkIxZEZ3aUtUdGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdWNYVmxjbmxEYjNWdWRDQTlJREE3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdWNtVnpkV3gwYzFCaFoyVWdQU0F3TzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxtTnZiblJsZUhRZ1BTQnVkV3hzTzF4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0x5OGdhVzVwZEdsaGJHbDZaU0IwYUdVZ1kyOXVkR0ZwYm1WeVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVhVzVwZEVOdmJuUmhhVzVsY2lncE8xeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdhVzV6ZEdGc2JFWnBiSFJsY21Wa1RXOTFjMlZOYjNabEtIUm9hWE11Y21WemRXeDBjeWs3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdVpISnZjR1J2ZDI0dWIyNG9YQ0p0YjNWelpXMXZkbVV0Wm1sc2RHVnlaV1FnZEc5MVkyaHpkR0Z5ZENCMGIzVmphRzF2ZG1VZ2RHOTFZMmhsYm1SY0lpd2djbVZ6ZFd4MGMxTmxiR1ZqZEc5eUxDQjBhR2x6TG1KcGJtUW9kR2hwY3k1b2FXZG9iR2xuYUhSVmJtUmxja1YyWlc1MEtTazdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0JwYm5OMFlXeHNSR1ZpYjNWdVkyVmtVMk55YjJ4c0tEZ3dMQ0IwYUdsekxuSmxjM1ZzZEhNcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbVJ5YjNCa2IzZHVMbTl1S0Z3aWMyTnliMnhzTFdSbFltOTFibU5sWkZ3aUxDQnlaWE4xYkhSelUyVnNaV04wYjNJc0lIUm9hWE11WW1sdVpDaDBhR2x6TG14dllXUk5iM0psU1daT1pXVmtaV1FwS1R0Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDOHZJR1J2SUc1dmRDQndjbTl3WVdkaGRHVWdZMmhoYm1kbElHVjJaVzUwSUdaeWIyMGdkR2hsSUhObFlYSmphQ0JtYVdWc1pDQnZkWFFnYjJZZ2RHaGxJR052YlhCdmJtVnVkRnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWtLSFJvYVhNdVkyOXVkR0ZwYm1WeUtTNXZiaWhjSW1Ob1lXNW5aVndpTENCY0lpNXpaV3hsWTNReUxXbHVjSFYwWENJc0lHWjFibU4wYVc5dUtHVXBJSHRsTG5OMGIzQlFjbTl3WVdkaGRHbHZiaWdwTzMwcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBa0tIUm9hWE11WkhKdmNHUnZkMjRwTG05dUtGd2lZMmhoYm1kbFhDSXNJRndpTG5ObGJHVmpkREl0YVc1d2RYUmNJaXdnWm5WdVkzUnBiMjRvWlNrZ2UyVXVjM1J2Y0ZCeWIzQmhaMkYwYVc5dUtDazdmU2s3WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNBdkx5QnBaaUJxY1hWbGNua3ViVzkxYzJWM2FHVmxiQ0J3YkhWbmFXNGdhWE1nYVc1emRHRnNiR1ZrSUhkbElHTmhiaUJ3Y21WMlpXNTBJRzkxZEMxdlppMWliM1Z1WkhNZ2MyTnliMnhzYVc1bklHOW1JSEpsYzNWc2RITWdkbWxoSUcxdmRYTmxkMmhsWld4Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tDUXVabTR1Ylc5MWMyVjNhR1ZsYkNrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVZ6ZFd4MGN5NXRiM1Z6Wlhkb1pXVnNLR1oxYm1OMGFXOXVJQ2hsTENCa1pXeDBZU3dnWkdWc2RHRllMQ0JrWld4MFlWa3BJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjJZWElnZEc5d0lEMGdjbVZ6ZFd4MGN5NXpZM0p2Ykd4VWIzQW9LU3dnYUdWcFoyaDBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2hrWld4MFlWa2dQaUF3SUNZbUlIUnZjQ0F0SUdSbGJIUmhXU0E4UFNBd0tTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEpsYzNWc2RITXVjMk55YjJ4c1ZHOXdLREFwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcmFXeHNSWFpsYm5Rb1pTazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZTQmxiSE5sSUdsbUlDaGtaV3gwWVZrZ1BDQXdJQ1ltSUhKbGMzVnNkSE11WjJWMEtEQXBMbk5qY205c2JFaGxhV2RvZENBdElISmxjM1ZzZEhNdWMyTnliMnhzVkc5d0tDa2dLeUJrWld4MFlWa2dQRDBnY21WemRXeDBjeTVvWldsbmFIUW9LU2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYTjFiSFJ6TG5OamNtOXNiRlJ2Y0NoeVpYTjFiSFJ6TG1kbGRDZ3dLUzV6WTNKdmJHeElaV2xuYUhRZ0xTQnlaWE4xYkhSekxtaGxhV2RvZENncEtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhMmxzYkVWMlpXNTBLR1VwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgwcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCOVhISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQnBibk4wWVd4c1MyVjVWWEJEYUdGdVoyVkZkbVZ1ZENoelpXRnlZMmdwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0J6WldGeVkyZ3ViMjRvWENKclpYbDFjQzFqYUdGdVoyVWdhVzV3ZFhRZ2NHRnpkR1ZjSWl3Z2RHaHBjeTVpYVc1a0tIUm9hWE11ZFhCa1lYUmxVbVZ6ZFd4MGN5a3BPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQnpaV0Z5WTJndWIyNG9YQ0ptYjJOMWMxd2lMQ0JtZFc1amRHbHZiaUFvS1NCN0lITmxZWEpqYUM1aFpHUkRiR0Z6Y3loY0luTmxiR1ZqZERJdFptOWpkWE5sWkZ3aUtUc2dmU2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSE5sWVhKamFDNXZiaWhjSW1Kc2RYSmNJaXdnWm5WdVkzUnBiMjRnS0NrZ2V5QnpaV0Z5WTJndWNtVnRiM1psUTJ4aGMzTW9YQ0p6Wld4bFkzUXlMV1p2WTNWelpXUmNJaWs3ZlNrN1hISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG1SeWIzQmtiM2R1TG05dUtGd2liVzkxYzJWMWNGd2lMQ0J5WlhOMWJIUnpVMlZzWldOMGIzSXNJSFJvYVhNdVltbHVaQ2htZFc1amRHbHZiaUFvWlNrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1lnS0NRb1pTNTBZWEpuWlhRcExtTnNiM05sYzNRb1hDSXVjMlZzWldOME1pMXlaWE4xYkhRdGMyVnNaV04wWVdKc1pWd2lLUzVzWlc1bmRHZ2dQaUF3S1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NW9hV2RvYkdsbmFIUlZibVJsY2tWMlpXNTBLR1VwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdWMyVnNaV04wU0dsbmFHeHBaMmgwWldRb1pTazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSDBwS1R0Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDOHZJSFJ5WVhBZ1lXeHNJRzF2ZFhObElHVjJaVzUwY3lCbWNtOXRJR3hsWVhacGJtY2dkR2hsSUdSeWIzQmtiM2R1TGlCemIyMWxkR2x0WlhNZ2RHaGxjbVVnYldGNUlHSmxJR0VnYlc5a1lXd2dkR2hoZENCcGN5QnNhWE4wWlc1cGJtZGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0x5OGdabTl5SUcxdmRYTmxJR1YyWlc1MGN5QnZkWFJ6YVdSbElHOW1JR2wwYzJWc1ppQnpieUJwZENCallXNGdZMnh2YzJVZ2FYUnpaV3htTGlCemFXNWpaU0IwYUdVZ1pISnZjR1J2ZDI0Z2FYTWdibTkzSUc5MWRITnBaR1VnZEdobElITmxiR1ZqZERJbmMxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBdkx5QmtiMjBnYVhRZ2QybHNiQ0IwY21sbloyVnlJSFJvWlNCd2IzQjFjQ0JqYkc5elpTd2dkMmhwWTJnZ2FYTWdibTkwSUhkb1lYUWdkMlVnZDJGdWRGeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbVJ5YjNCa2IzZHVMbTl1S0Z3aVkyeHBZMnNnYlc5MWMyVjFjQ0J0YjNWelpXUnZkMjVjSWl3Z1puVnVZM1JwYjI0Z0tHVXBJSHNnWlM1emRHOXdVSEp2Y0dGbllYUnBiMjRvS1RzZ2ZTazdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb0pDNXBjMFoxYm1OMGFXOXVLSFJvYVhNdWIzQjBjeTVwYm1sMFUyVnNaV04wYVc5dUtTa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnTHk4Z2FXNXBkR2xoYkdsNlpTQnpaV3hsWTNScGIyNGdZbUZ6WldRZ2IyNGdkR2hsSUdOMWNuSmxiblFnZG1Gc2RXVWdiMllnZEdobElITnZkWEpqWlNCbGJHVnRaVzUwWEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbWx1YVhSVFpXeGxZM1JwYjI0b0tUdGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBdkx5QnBaaUIwYUdVZ2RYTmxjaUJvWVhNZ2NISnZkbWxrWldRZ1lTQm1kVzVqZEdsdmJpQjBhR0YwSUdOaGJpQnpaWFFnYzJWc1pXTjBhVzl1SUdKaGMyVmtJRzl1SUhSb1pTQjJZV3gxWlNCdlppQjBhR1VnYzI5MWNtTmxJR1ZzWlcxbGJuUmNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQzh2SUhkbElHMXZibWwwYjNJZ2RHaGxJR05vWVc1blpTQmxkbVZ1ZENCdmJpQjBhR1VnWld4bGJXVnVkQ0JoYm1RZ2RISnBaMmRsY2lCcGRDd2dZV3hzYjNkcGJtY2dabTl5SUhSM2J5QjNZWGtnYzNsdVkyaHliMjVwZW1GMGFXOXVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxtMXZibWwwYjNKVGIzVnlZMlVvS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLRzl3ZEhNdWJXRjRhVzExYlVsdWNIVjBUR1Z1WjNSb0lDRTlQU0J1ZFd4c0tTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxuTmxZWEpqYUM1aGRIUnlLRndpYldGNGJHVnVaM1JvWENJc0lHOXdkSE11YldGNGFXMTFiVWx1Y0hWMFRHVnVaM1JvS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RtRnlJR1JwYzJGaWJHVmtJRDBnYjNCMGN5NWxiR1Z0Wlc1MExuQnliM0FvWENKa2FYTmhZbXhsWkZ3aUtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLR1JwYzJGaWJHVmtJRDA5UFNCMWJtUmxabWx1WldRcElHUnBjMkZpYkdWa0lEMGdabUZzYzJVN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVaVzVoWW14bEtDRmthWE5oWW14bFpDazdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0IyWVhJZ2NtVmhaRzl1YkhrZ1BTQnZjSFJ6TG1Wc1pXMWxiblF1Y0hKdmNDaGNJbkpsWVdSdmJteDVYQ0lwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2NtVmhaRzl1YkhrZ1BUMDlJSFZ1WkdWbWFXNWxaQ2tnY21WaFpHOXViSGtnUFNCbVlXeHpaVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1eVpXRmtiMjVzZVNoeVpXRmtiMjVzZVNrN1hISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQXZMeUJEWVd4amRXeGhkR1VnYzJsNlpTQnZaaUJ6WTNKdmJHeGlZWEpjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdjMk55YjJ4c1FtRnlSR2x0Wlc1emFXOXVjeUE5SUhOamNtOXNiRUpoY2tScGJXVnVjMmx2Ym5NZ2ZId2diV1ZoYzNWeVpWTmpjbTlzYkdKaGNpZ3BPMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NWhkWFJ2Wm05amRYTWdQU0J2Y0hSekxtVnNaVzFsYm5RdWNISnZjQ2hjSW1GMWRHOW1iMk4xYzF3aUtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2IzQjBjeTVsYkdWdFpXNTBMbkJ5YjNBb1hDSmhkWFJ2Wm05amRYTmNJaXdnWm1Gc2MyVXBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQnBaaUFvZEdocGN5NWhkWFJ2Wm05amRYTXBJSFJvYVhNdVptOWpkWE1vS1R0Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11Ym1WNGRGTmxZWEpqYUZSbGNtMGdQU0IxYm1SbFptbHVaV1E3WEhKY2JpQWdJQ0FnSUNBZ2ZTeGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0x5OGdZV0p6ZEhKaFkzUmNjbHh1SUNBZ0lDQWdJQ0JrWlhOMGNtOTVPaUJtZFc1amRHbHZiaUFvS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUhaaGNpQmxiR1Z0Wlc1MFBYUm9hWE11YjNCMGN5NWxiR1Z0Wlc1MExDQnpaV3hsWTNReUlEMGdaV3hsYldWdWRDNWtZWFJoS0Z3aWMyVnNaV04wTWx3aUtUdGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdVkyeHZjMlVvS1R0Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2gwYUdsekxuQnliM0JsY25SNVQySnpaWEoyWlhJcElIc2daR1ZzWlhSbElIUm9hWE11Y0hKdmNHVnlkSGxQWW5ObGNuWmxjanNnZEdocGN5NXdjbTl3WlhKMGVVOWljMlZ5ZG1WeUlEMGdiblZzYkRzZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdhV1lnS0hObGJHVmpkRElnSVQwOUlIVnVaR1ZtYVc1bFpDa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYzJWc1pXTjBNaTVqYjI1MFlXbHVaWEl1Y21WdGIzWmxLQ2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCelpXeGxZM1F5TG1SeWIzQmtiM2R1TG5KbGJXOTJaU2dwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1pXeGxiV1Z1ZEZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQzV5WlcxdmRtVkRiR0Z6Y3loY0luTmxiR1ZqZERJdGIyWm1jMk55WldWdVhDSXBYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0xuSmxiVzkyWlVSaGRHRW9YQ0p6Wld4bFkzUXlYQ0lwWEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdMbTltWmloY0lpNXpaV3hsWTNReVhDSXBYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0xuQnliM0FvWENKaGRYUnZabTlqZFhOY0lpd2dkR2hwY3k1aGRYUnZabTlqZFhNZ2ZId2dabUZzYzJVcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1lnS0hSb2FYTXVaV3hsYldWdWRGUmhZa2x1WkdWNEtTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1pXeGxiV1Z1ZEM1aGRIUnlLSHQwWVdKcGJtUmxlRG9nZEdocGN5NWxiR1Z0Wlc1MFZHRmlTVzVrWlhoOUtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDBnWld4elpTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1pXeGxiV1Z1ZEM1eVpXMXZkbVZCZEhSeUtGd2lkR0ZpYVc1a1pYaGNJaWs3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmxiR1Z0Wlc1MExuTm9iM2NvS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ0lIMHNYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDOHZJR0ZpYzNSeVlXTjBYSEpjYmlBZ0lDQWdJQ0FnYjNCMGFXOXVWRzlFWVhSaE9pQm1kVzVqZEdsdmJpaGxiR1Z0Wlc1MEtTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2hsYkdWdFpXNTBMbWx6S0Z3aWIzQjBhVzl1WENJcEtTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J5WlhSMWNtNGdlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbGtPbVZzWlcxbGJuUXVjSEp2Y0NoY0luWmhiSFZsWENJcExGeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSbGVIUTZaV3hsYldWdWRDNTBaWGgwS0Nrc1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWld4bGJXVnVkRG9nWld4bGJXVnVkQzVuWlhRb0tTeGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCamMzTTZJR1ZzWlcxbGJuUXVZWFIwY2loY0ltTnNZWE56WENJcExGeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdScGMyRmliR1ZrT2lCbGJHVnRaVzUwTG5CeWIzQW9YQ0prYVhOaFlteGxaRndpS1N4Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzYjJOclpXUTZJR1Z4ZFdGc0tHVnNaVzFsYm5RdVlYUjBjaWhjSW14dlkydGxaRndpS1N3Z1hDSnNiMk5yWldSY0lpa2dmSHdnWlhGMVlXd29aV3hsYldWdWRDNWtZWFJoS0Z3aWJHOWphMlZrWENJcExDQjBjblZsS1Z4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2ZTQmxiSE5sSUdsbUlDaGxiR1Z0Wlc1MExtbHpLRndpYjNCMFozSnZkWEJjSWlrcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHVjRkRHBsYkdWdFpXNTBMbUYwZEhJb1hDSnNZV0psYkZ3aUtTeGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCamFHbHNaSEpsYmpwYlhTeGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCbGJHVnRaVzUwT2lCbGJHVnRaVzUwTG1kbGRDZ3BMRnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHTnpjem9nWld4bGJXVnVkQzVoZEhSeUtGd2lZMnhoYzNOY0lpbGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDA3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnSUNCOUxGeHlYRzVjY2x4dUlDQWdJQ0FnSUNBdkx5QmhZbk4wY21GamRGeHlYRzRnSUNBZ0lDQWdJSEJ5WlhCaGNtVlBjSFJ6T2lCbWRXNWpkR2x2YmlBb2IzQjBjeWtnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0IyWVhJZ1pXeGxiV1Z1ZEN3Z2MyVnNaV04wTENCcFpFdGxlU3dnWVdwaGVGVnliQ3dnYzJWc1ppQTlJSFJvYVhNN1hISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQmxiR1Z0Wlc1MElEMGdiM0IwY3k1bGJHVnRaVzUwTzF4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLR1ZzWlcxbGJuUXVaMlYwS0RBcExuUmhaMDVoYldVdWRHOU1iM2RsY2tOaGMyVW9LU0E5UFQwZ1hDSnpaV3hsWTNSY0lpa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NXpaV3hsWTNRZ1BTQnpaV3hsWTNRZ1BTQnZjSFJ6TG1Wc1pXMWxiblE3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUdsbUlDaHpaV3hsWTNRcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQzh2SUhSb1pYTmxJRzl3ZEdsdmJuTWdZWEpsSUc1dmRDQmhiR3h2ZDJWa0lIZG9aVzRnWVhSMFlXTm9aV1FnZEc4Z1lTQnpaV3hsWTNRZ1ltVmpZWFZ6WlNCMGFHVjVJR0Z5WlNCd2FXTnJaV1FnZFhBZ2IyWm1JSFJvWlNCbGJHVnRaVzUwSUdsMGMyVnNabHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSkM1bFlXTm9LRnRjSW1sa1hDSXNJRndpYlhWc2RHbHdiR1ZjSWl3Z1hDSmhhbUY0WENJc0lGd2ljWFZsY25sY0lpd2dYQ0pqY21WaGRHVlRaV0Z5WTJoRGFHOXBZMlZjSWl3Z1hDSnBibWwwVTJWc1pXTjBhVzl1WENJc0lGd2laR0YwWVZ3aUxDQmNJblJoWjNOY0lsMHNJR1oxYm1OMGFXOXVJQ2dwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2RHaHBjeUJwYmlCdmNIUnpLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSb2NtOTNJRzVsZHlCRmNuSnZjaWhjSWs5d2RHbHZiaUFuWENJZ0t5QjBhR2x6SUNzZ1hDSW5JR2x6SUc1dmRDQmhiR3h2ZDJWa0lHWnZjaUJUWld4bFkzUXlJSGRvWlc0Z1lYUjBZV05vWldRZ2RHOGdZU0E4YzJWc1pXTjBQaUJsYkdWdFpXNTBMbHdpS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOUtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdiM0IwY3lBOUlDUXVaWGgwWlc1a0tIdDlMQ0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCd2IzQjFiR0YwWlZKbGMzVnNkSE02SUdaMWJtTjBhVzl1S0dOdmJuUmhhVzVsY2l3Z2NtVnpkV3gwY3l3Z2NYVmxjbmtwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IyWVhJZ2NHOXdkV3hoZEdVc0lDQmtZWFJoTENCeVpYTjFiSFFzSUdOb2FXeGtjbVZ1TENCcFpEMTBhR2x6TG05d2RITXVhV1E3WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhCdmNIVnNZWFJsUFdaMWJtTjBhVzl1S0hKbGMzVnNkSE1zSUdOdmJuUmhhVzVsY2l3Z1pHVndkR2dwSUh0Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFpoY2lCcExDQnNMQ0J5WlhOMWJIUXNJSE5sYkdWamRHRmliR1VzSUdScGMyRmliR1ZrTENCamIyMXdiM1Z1WkN3Z2JtOWtaU3dnYkdGaVpXd3NJR2x1Ym1WeVEyOXVkR0ZwYm1WeUxDQm1iM0p0WVhSMFpXUTdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYTjFiSFJ6SUQwZ2IzQjBjeTV6YjNKMFVtVnpkV3gwY3loeVpYTjFiSFJ6TENCamIyNTBZV2x1WlhJc0lIRjFaWEo1S1R0Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR1p2Y2lBb2FTQTlJREFzSUd3Z1BTQnlaWE4xYkhSekxteGxibWQwYURzZ2FTQThJR3c3SUdrZ1BTQnBJQ3NnTVNrZ2UxeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lISmxjM1ZzZEQxeVpYTjFiSFJ6VzJsZE8xeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHUnBjMkZpYkdWa0lEMGdLSEpsYzNWc2RDNWthWE5oWW14bFpDQTlQVDBnZEhKMVpTazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCelpXeGxZM1JoWW14bElEMGdLQ0ZrYVhOaFlteGxaQ2tnSmlZZ0tHbGtLSEpsYzNWc2RDa2dJVDA5SUhWdVpHVm1hVzVsWkNrN1hISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1kyOXRjRzkxYm1ROWNtVnpkV3gwTG1Ob2FXeGtjbVZ1SUNZbUlISmxjM1ZzZEM1amFHbHNaSEpsYmk1c1pXNW5kR2dnUGlBd08xeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHNXZaR1U5SkNoY0lqeHNhVDQ4TDJ4cFBsd2lLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHNXZaR1V1WVdSa1EyeGhjM01vWENKelpXeGxZM1F5TFhKbGMzVnNkSE10WkdWd2RDMWNJaXRrWlhCMGFDazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCdWIyUmxMbUZrWkVOc1lYTnpLRndpYzJWc1pXTjBNaTF5WlhOMWJIUmNJaWs3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnViMlJsTG1Ga1pFTnNZWE56S0hObGJHVmpkR0ZpYkdVZ1B5QmNJbk5sYkdWamRESXRjbVZ6ZFd4MExYTmxiR1ZqZEdGaWJHVmNJaUE2SUZ3aWMyVnNaV04wTWkxeVpYTjFiSFF0ZFc1elpXeGxZM1JoWW14bFhDSXBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLR1JwYzJGaWJHVmtLU0I3SUc1dlpHVXVZV1JrUTJ4aGMzTW9YQ0p6Wld4bFkzUXlMV1JwYzJGaWJHVmtYQ0lwT3lCOVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb1kyOXRjRzkxYm1RcElIc2dibTlrWlM1aFpHUkRiR0Z6Y3loY0luTmxiR1ZqZERJdGNtVnpkV3gwTFhkcGRHZ3RZMmhwYkdSeVpXNWNJaWs3SUgxY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRzV2WkdVdVlXUmtRMnhoYzNNb2MyVnNaaTV2Y0hSekxtWnZjbTFoZEZKbGMzVnNkRU56YzBOc1lYTnpLSEpsYzNWc2RDa3BPMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3hoWW1Wc1BTUW9aRzlqZFcxbGJuUXVZM0psWVhSbFJXeGxiV1Z1ZENoY0ltUnBkbHdpS1NrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzWVdKbGJDNWhaR1JEYkdGemN5aGNJbk5sYkdWamRESXRjbVZ6ZFd4MExXeGhZbVZzWENJcE8xeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHWnZjbTFoZEhSbFpEMXZjSFJ6TG1admNtMWhkRkpsYzNWc2RDaHlaWE4xYkhRc0lHeGhZbVZzTENCeGRXVnllU3dnYzJWc1ppNXZjSFJ6TG1WelkyRndaVTFoY210MWNDazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFppQW9abTl5YldGMGRHVmtJVDA5ZFc1a1pXWnBibVZrS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JHRmlaV3d1YUhSdGJDaG1iM0p0WVhSMFpXUXBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHNXZaR1V1WVhCd1pXNWtLR3hoWW1Wc0tUdGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaaUFvWTI5dGNHOTFibVFwSUh0Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhVzV1WlhKRGIyNTBZV2x1WlhJOUpDaGNJangxYkQ0OEwzVnNQbHdpS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcGJtNWxja052Ym5SaGFXNWxjaTVoWkdSRGJHRnpjeWhjSW5ObGJHVmpkREl0Y21WemRXeDBMWE4xWWx3aUtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQndiM0IxYkdGMFpTaHlaWE4xYkhRdVkyaHBiR1J5Wlc0c0lHbHVibVZ5UTI5dWRHRnBibVZ5TENCa1pYQjBhQ3N4S1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCdWIyUmxMbUZ3Y0dWdVpDaHBibTVsY2tOdmJuUmhhVzVsY2lrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYm05a1pTNWtZWFJoS0Z3aWMyVnNaV04wTWkxa1lYUmhYQ0lzSUhKbGMzVnNkQ2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmpiMjUwWVdsdVpYSXVZWEJ3Wlc1a0tHNXZaR1VwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlR0Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NHOXdkV3hoZEdVb2NtVnpkV3gwY3l3Z1kyOXVkR0ZwYm1WeUxDQXdLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZlN3Z0pDNW1iaTV6Wld4bFkzUXlMbVJsWm1GMWJIUnpMQ0J2Y0hSektUdGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJR2xtSUNoMGVYQmxiMllvYjNCMGN5NXBaQ2tnSVQwOUlGd2lablZ1WTNScGIyNWNJaWtnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXUkxaWGtnUFNCdmNIUnpMbWxrTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2IzQjBjeTVwWkNBOUlHWjFibU4wYVc5dUlDaGxLU0I3SUhKbGRIVnliaUJsVzJsa1MyVjVYVHNnZlR0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLQ1F1YVhOQmNuSmhlU2h2Y0hSekxtVnNaVzFsYm5RdVpHRjBZU2hjSW5ObGJHVmpkREpVWVdkelhDSXBLU2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLRndpZEdGbmMxd2lJR2x1SUc5d2RITXBJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhSEp2ZHlCY0luUmhaM01nYzNCbFkybG1hV1ZrSUdGeklHSnZkR2dnWVc0Z1lYUjBjbWxpZFhSbElDZGtZWFJoTFhObGJHVmpkREl0ZEdGbmN5Y2dZVzVrSUdsdUlHOXdkR2x2Ym5NZ2IyWWdVMlZzWldOME1pQmNJaUFySUc5d2RITXVaV3hsYldWdWRDNWhkSFJ5S0Z3aWFXUmNJaWs3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnZjSFJ6TG5SaFozTTliM0IwY3k1bGJHVnRaVzUwTG1SaGRHRW9YQ0p6Wld4bFkzUXlWR0ZuYzF3aUtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdhV1lnS0hObGJHVmpkQ2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2IzQjBjeTV4ZFdWeWVTQTlJSFJvYVhNdVltbHVaQ2htZFc1amRHbHZiaUFvY1hWbGNua3BJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjJZWElnWkdGMFlTQTlJSHNnY21WemRXeDBjem9nVzEwc0lHMXZjbVU2SUdaaGJITmxJSDBzWEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSbGNtMGdQU0J4ZFdWeWVTNTBaWEp0TEZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCamFHbHNaSEpsYml3Z2NHeGhZMlZvYjJ4a1pYSlBjSFJwYjI0c0lIQnliMk5sYzNNN1hISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIQnliMk5sYzNNOVpuVnVZM1JwYjI0b1pXeGxiV1Z1ZEN3Z1kyOXNiR1ZqZEdsdmJpa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IyWVhJZ1ozSnZkWEE3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbUlDaGxiR1Z0Wlc1MExtbHpLRndpYjNCMGFXOXVYQ0lwS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2NYVmxjbmt1YldGMFkyaGxjaWgwWlhKdExDQmxiR1Z0Wlc1MExuUmxlSFFvS1N3Z1pXeGxiV1Z1ZENrcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmpiMnhzWldOMGFXOXVMbkIxYzJnb2MyVnNaaTV2Y0hScGIyNVViMFJoZEdFb1pXeGxiV1Z1ZENrcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOUlHVnNjMlVnYVdZZ0tHVnNaVzFsYm5RdWFYTW9YQ0p2Y0hSbmNtOTFjRndpS1NrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWjNKdmRYQTljMlZzWmk1dmNIUnBiMjVVYjBSaGRHRW9aV3hsYldWdWRDazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCbGJHVnRaVzUwTG1Ob2FXeGtjbVZ1S0NrdVpXRmphRElvWm5WdVkzUnBiMjRvYVN3Z1pXeHRLU0I3SUhCeWIyTmxjM01vWld4dExDQm5jbTkxY0M1amFHbHNaSEpsYmlrN0lIMHBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLR2R5YjNWd0xtTm9hV3hrY21WdUxteGxibWQwYUQ0d0tTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZMjlzYkdWamRHbHZiaTV3ZFhOb0tHZHliM1Z3S1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDA3WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdOb2FXeGtjbVZ1UFdWc1pXMWxiblF1WTJocGJHUnlaVzRvS1R0Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0x5OGdhV2R1YjNKbElIUm9aU0J3YkdGalpXaHZiR1JsY2lCdmNIUnBiMjRnYVdZZ2RHaGxjbVVnYVhNZ2IyNWxYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLSFJvYVhNdVoyVjBVR3hoWTJWb2IyeGtaWElvS1NBaFBUMGdkVzVrWldacGJtVmtJQ1ltSUdOb2FXeGtjbVZ1TG14bGJtZDBhQ0ErSURBcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjR3hoWTJWb2IyeGtaWEpQY0hScGIyNGdQU0IwYUdsekxtZGxkRkJzWVdObGFHOXNaR1Z5VDNCMGFXOXVLQ2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbUlDaHdiR0ZqWldodmJHUmxjazl3ZEdsdmJpa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1kyaHBiR1J5Wlc0OVkyaHBiR1J5Wlc0dWJtOTBLSEJzWVdObGFHOXNaR1Z5VDNCMGFXOXVLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWTJocGJHUnlaVzR1WldGamFESW9ablZ1WTNScGIyNG9hU3dnWld4dEtTQjdJSEJ5YjJObGMzTW9aV3h0TENCa1lYUmhMbkpsYzNWc2RITXBPeUI5S1R0Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NYVmxjbmt1WTJGc2JHSmhZMnNvWkdGMFlTazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5S1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDOHZJSFJvYVhNZ2FYTWdibVZsWkdWa0lHSmxZMkYxYzJVZ2FXNXphV1JsSUhaaGJDZ3BJSGRsSUdOdmJuTjBjblZqZENCamFHOXBZMlZ6SUdaeWIyMGdiM0IwYVc5dWN5QmhibVFnZEdobGNtVWdhV1FnYVhNZ2FHRnlaR052WkdWa1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnZjSFJ6TG1sa1BXWjFibU4wYVc5dUtHVXBJSHNnY21WMGRYSnVJR1V1YVdRN0lIMDdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J2Y0hSekxtWnZjbTFoZEZKbGMzVnNkRU56YzBOc1lYTnpJRDBnWm5WdVkzUnBiMjRvWkdGMFlTa2dleUJ5WlhSMWNtNGdaR0YwWVM1amMzTTdJSDA3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSDBnWld4elpTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb0lTaGNJbkYxWlhKNVhDSWdhVzRnYjNCMGN5a3BJSHRjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tGd2lZV3BoZUZ3aUlHbHVJRzl3ZEhNcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZV3BoZUZWeWJDQTlJRzl3ZEhNdVpXeGxiV1Z1ZEM1a1lYUmhLRndpWVdwaGVDMTFjbXhjSWlrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2hoYW1GNFZYSnNJQ1ltSUdGcVlYaFZjbXd1YkdWdVozUm9JRDRnTUNrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYjNCMGN5NWhhbUY0TG5WeWJDQTlJR0ZxWVhoVmNtdzdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYjNCMGN5NXhkV1Z5ZVNBOUlHRnFZWGd1WTJGc2JDaHZjSFJ6TG1Wc1pXMWxiblFzSUc5d2RITXVZV3BoZUNrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlNCbGJITmxJR2xtSUNoY0ltUmhkR0ZjSWlCcGJpQnZjSFJ6S1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHOXdkSE11Y1hWbGNua2dQU0JzYjJOaGJDaHZjSFJ6TG1SaGRHRXBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMGdaV3h6WlNCcFppQW9YQ0owWVdkelhDSWdhVzRnYjNCMGN5a2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J2Y0hSekxuRjFaWEo1SUQwZ2RHRm5jeWh2Y0hSekxuUmhaM01wTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFppQW9iM0IwY3k1amNtVmhkR1ZUWldGeVkyaERhRzlwWTJVZ1BUMDlJSFZ1WkdWbWFXNWxaQ2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiM0IwY3k1amNtVmhkR1ZUWldGeVkyaERhRzlwWTJVZ1BTQm1kVzVqZEdsdmJpQW9kR1Z5YlNrZ2V5QnlaWFIxY200Z2UybGtPaUFrTG5SeWFXMG9kR1Z5YlNrc0lIUmxlSFE2SUNRdWRISnBiU2gwWlhKdEtYMDdJSDA3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLRzl3ZEhNdWFXNXBkRk5sYkdWamRHbHZiaUE5UFQwZ2RXNWtaV1pwYm1Wa0tTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCdmNIUnpMbWx1YVhSVFpXeGxZM1JwYjI0Z1BTQm1kVzVqZEdsdmJpQW9aV3hsYldWdWRDd2dZMkZzYkdKaFkyc3BJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IyWVhJZ1pHRjBZU0E5SUZ0ZE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDUW9jM0JzYVhSV1lXd29aV3hsYldWdWRDNTJZV3dvS1N3Z2IzQjBjeTV6WlhCaGNtRjBiM0lwS1M1bFlXTm9LR1oxYm1OMGFXOXVJQ2dwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkbUZ5SUdsa0lEMGdkR2hwY3l3Z2RHVjRkQ0E5SUhSb2FYTXNJSFJoWjNNOWIzQjBjeTUwWVdkek8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb0pDNXBjMFoxYm1OMGFXOXVLSFJoWjNNcEtTQjBZV2R6UFhSaFozTW9LVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0pDaDBZV2R6S1M1bFlXTm9LR1oxYm1OMGFXOXVLQ2tnZXlCcFppQW9aWEYxWVd3b2RHaHBjeTVwWkN3Z2FXUXBLU0I3SUhSbGVIUWdQU0IwYUdsekxuUmxlSFE3SUhKbGRIVnliaUJtWVd4elpUc2dmU0I5S1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdaR0YwWVM1d2RYTm9LSHRwWkRvZ2FXUXNJSFJsZUhRNklIUmxlSFI5S1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOUtUdGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWTJGc2JHSmhZMnNvWkdGMFlTazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOU8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2gwZVhCbGIyWW9iM0IwY3k1eGRXVnllU2tnSVQwOUlGd2lablZ1WTNScGIyNWNJaWtnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHaHliM2NnWENKeGRXVnllU0JtZFc1amRHbHZiaUJ1YjNRZ1pHVm1hVzVsWkNCbWIzSWdVMlZzWldOME1pQmNJaUFySUc5d2RITXVaV3hsYldWdWRDNWhkSFJ5S0Z3aWFXUmNJaWs3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUJ2Y0hSek8xeHlYRzRnSUNBZ0lDQWdJSDBzWEhKY2JseHlYRzRnSUNBZ0lDQWdJQzhxS2x4eVhHNGdJQ0FnSUNBZ0lDQXFJRTF2Ym1sMGIzSWdkR2hsSUc5eWFXZHBibUZzSUdWc1pXMWxiblFnWm05eUlHTm9ZVzVuWlhNZ1lXNWtJSFZ3WkdGMFpTQnpaV3hsWTNReUlHRmpZMjl5WkdsdVoyeDVYSEpjYmlBZ0lDQWdJQ0FnSUNvdlhISmNiaUFnSUNBZ0lDQWdMeThnWVdKemRISmhZM1JjY2x4dUlDQWdJQ0FnSUNCdGIyNXBkRzl5VTI5MWNtTmxPaUJtZFc1amRHbHZiaUFvS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUhaaGNpQmxiQ0E5SUhSb2FYTXViM0IwY3k1bGJHVnRaVzUwTENCemVXNWpPMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnWld3dWIyNG9YQ0pqYUdGdVoyVXVjMlZzWldOME1sd2lMQ0IwYUdsekxtSnBibVFvWm5WdVkzUnBiMjRnS0dVcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtSUNoMGFHbHpMbTl3ZEhNdVpXeGxiV1Z1ZEM1a1lYUmhLRndpYzJWc1pXTjBNaTFqYUdGdVoyVXRkSEpwWjJkbGNtVmtYQ0lwSUNFOVBTQjBjblZsS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NXBibWwwVTJWc1pXTjBhVzl1S0NrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIMHBLVHRjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUhONWJtTWdQU0IwYUdsekxtSnBibVFvWm5WdVkzUnBiMjRnS0NrZ2UxeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhaaGNpQmxibUZpYkdWa0xDQnlaV0ZrYjI1c2VTd2djMlZzWmlBOUlIUm9hWE03WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdMeThnYzNsdVl5QmxibUZpYkdWa0lITjBZWFJsWEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMllYSWdaR2x6WVdKc1pXUWdQU0JsYkM1d2NtOXdLRndpWkdsellXSnNaV1JjSWlrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaaUFvWkdsellXSnNaV1FnUFQwOUlIVnVaR1ZtYVc1bFpDa2daR2x6WVdKc1pXUWdQU0JtWVd4elpUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdVpXNWhZbXhsS0NGa2FYTmhZbXhsWkNrN1hISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZG1GeUlISmxZV1J2Ym14NUlEMGdaV3d1Y0hKdmNDaGNJbkpsWVdSdmJteDVYQ0lwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLSEpsWVdSdmJteDVJRDA5UFNCMWJtUmxabWx1WldRcElISmxZV1J2Ym14NUlEMGdabUZzYzJVN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG5KbFlXUnZibXg1S0hKbFlXUnZibXg1S1R0Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J6ZVc1alEzTnpRMnhoYzNObGN5aDBhR2x6TG1OdmJuUmhhVzVsY2l3Z2RHaHBjeTV2Y0hSekxtVnNaVzFsYm5Rc0lIUm9hWE11YjNCMGN5NWhaR0Z3ZEVOdmJuUmhhVzVsY2tOemMwTnNZWE56S1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11WTI5dWRHRnBibVZ5TG1Ga1pFTnNZWE56S0dWMllXeDFZWFJsS0hSb2FYTXViM0IwY3k1amIyNTBZV2x1WlhKRGMzTkRiR0Z6Y3lrcE8xeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhONWJtTkRjM05EYkdGemMyVnpLSFJvYVhNdVpISnZjR1J2ZDI0c0lIUm9hWE11YjNCMGN5NWxiR1Z0Wlc1MExDQjBhR2x6TG05d2RITXVZV1JoY0hSRWNtOXdaRzkzYmtOemMwTnNZWE56S1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11WkhKdmNHUnZkMjR1WVdSa1EyeGhjM01vWlhaaGJIVmhkR1VvZEdocGN5NXZjSFJ6TG1SeWIzQmtiM2R1UTNOelEyeGhjM01wS1R0Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIMHBPMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnTHk4Z2JXOTZhV3hzWVNCaGJtUWdTVVZjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdaV3d1YjI0b1hDSndjbTl3WlhKMGVXTm9ZVzVuWlM1elpXeGxZM1F5SUVSUFRVRjBkSEpOYjJScFptbGxaQzV6Wld4bFkzUXlYQ0lzSUhONWJtTXBPMXh5WEc1Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDOHZJR2h2YkdRZ2IyNTBieUJoSUhKbFptVnlaVzVqWlNCdlppQjBhR1VnWTJGc2JHSmhZMnNnZEc4Z2QyOXlheUJoY205MWJtUWdZU0JqYUhKdmJXbDFiU0JpZFdkY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tIUm9hWE11YlhWMFlYUnBiMjVEWVd4c1ltRmpheUE5UFQwZ2RXNWtaV1pwYm1Wa0tTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxtMTFkR0YwYVc5dVEyRnNiR0poWTJzZ1BTQm1kVzVqZEdsdmJpQW9iWFYwWVhScGIyNXpLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiWFYwWVhScGIyNXpMbVp2Y2tWaFkyZ29jM2x1WXlrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQzh2SUhOaFptRnlhU0JoYm1RZ1kyaHliMjFsWEhKY2JpQWdJQ0FnSUNBZ0lDQWdJR2xtSUNoMGVYQmxiMllnVjJWaVMybDBUWFYwWVhScGIyNVBZbk5sY25abGNpQWhQVDBnWENKMWJtUmxabWx1WldSY0lpa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tIUm9hWE11Y0hKdmNHVnlkSGxQWW5ObGNuWmxjaWtnZXlCa1pXeGxkR1VnZEdocGN5NXdjbTl3WlhKMGVVOWljMlZ5ZG1WeU95QjBhR2x6TG5CeWIzQmxjblI1VDJKelpYSjJaWElnUFNCdWRXeHNPeUI5WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbkJ5YjNCbGNuUjVUMkp6WlhKMlpYSWdQU0J1WlhjZ1YyVmlTMmwwVFhWMFlYUnBiMjVQWW5ObGNuWmxjaWgwYUdsekxtMTFkR0YwYVc5dVEyRnNiR0poWTJzcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1d2NtOXdaWEowZVU5aWMyVnlkbVZ5TG05aWMyVnlkbVVvWld3dVoyVjBLREFwTENCN0lHRjBkSEpwWW5WMFpYTTZkSEoxWlN3Z2MzVmlkSEpsWlRwbVlXeHpaU0I5S1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ0lIMHNYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDOHZJR0ZpYzNSeVlXTjBYSEpjYmlBZ0lDQWdJQ0FnZEhKcFoyZGxjbE5sYkdWamREb2dablZ1WTNScGIyNG9aR0YwWVNrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCMllYSWdaWFowSUQwZ0pDNUZkbVZ1ZENoY0luTmxiR1ZqZERJdGMyVnNaV04wYVc1blhDSXNJSHNnZG1Gc09pQjBhR2x6TG1sa0tHUmhkR0VwTENCdlltcGxZM1E2SUdSaGRHRWdmU2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdWIzQjBjeTVsYkdWdFpXNTBMblJ5YVdkblpYSW9aWFowS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJQ0ZsZG5RdWFYTkVaV1poZFd4MFVISmxkbVZ1ZEdWa0tDazdYSEpjYmlBZ0lDQWdJQ0FnZlN4Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnTHlvcVhISmNiaUFnSUNBZ0lDQWdJQ29nVkhKcFoyZGxjbk1nZEdobElHTm9ZVzVuWlNCbGRtVnVkQ0J2YmlCMGFHVWdjMjkxY21ObElHVnNaVzFsYm5SY2NseHVJQ0FnSUNBZ0lDQWdLaTljY2x4dUlDQWdJQ0FnSUNBdkx5QmhZbk4wY21GamRGeHlYRzRnSUNBZ0lDQWdJSFJ5YVdkblpYSkRhR0Z1WjJVNklHWjFibU4wYVc5dUlDaGtaWFJoYVd4ektTQjdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0JrWlhSaGFXeHpJRDBnWkdWMFlXbHNjeUI4ZkNCN2ZUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ1pHVjBZV2xzY3owZ0pDNWxlSFJsYm1Rb2UzMHNJR1JsZEdGcGJITXNJSHNnZEhsd1pUb2dYQ0pqYUdGdVoyVmNJaXdnZG1Gc09pQjBhR2x6TG5aaGJDZ3BJSDBwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0F2THlCd2NtVjJaVzUwY3lCeVpXTjFjbk5wZG1VZ2RISnBaMmRsY21sdVoxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbTl3ZEhNdVpXeGxiV1Z1ZEM1a1lYUmhLRndpYzJWc1pXTjBNaTFqYUdGdVoyVXRkSEpwWjJkbGNtVmtYQ0lzSUhSeWRXVXBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG05d2RITXVaV3hsYldWdWRDNTBjbWxuWjJWeUtHUmxkR0ZwYkhNcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbTl3ZEhNdVpXeGxiV1Z1ZEM1a1lYUmhLRndpYzJWc1pXTjBNaTFqYUdGdVoyVXRkSEpwWjJkbGNtVmtYQ0lzSUdaaGJITmxLVHRjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUM4dklITnZiV1VnZG1Gc2FXUmhkR2x2YmlCbWNtRnRaWGR2Y210eklHbG5ibTl5WlNCMGFHVWdZMmhoYm1kbElHVjJaVzUwSUdGdVpDQnNhWE4wWlc0Z2FXNXpkR1ZoWkNCMGJ5QnJaWGwxY0N3Z1kyeHBZMnNnWm05eUlITmxiR1ZqZEhOY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnTHk4Z2MyOGdhR1Z5WlNCM1pTQjBjbWxuWjJWeUlIUm9aU0JqYkdsamF5QmxkbVZ1ZENCdFlXNTFZV3hzZVZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxtOXdkSE11Wld4bGJXVnVkQzVqYkdsamF5Z3BPMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnTHk4Z1ZtRnNhV1JoZEdsdmJrVnVaMmx1WlNCcFoyNXZjbVZoSUhSb1pTQmphR0Z1WjJVZ1pYWmxiblFnWVc1a0lHeHBjM1JsYm5NZ2FXNXpkR1ZoWkNCMGJ5QmliSFZ5WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQzh2SUhOdklHaGxjbVVnZDJVZ2RISnBaMmRsY2lCMGFHVWdZbXgxY2lCbGRtVnVkQ0J0WVc1MVlXeHNlU0JwWmlCemJ5QmtaWE5wY21Wa1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUdsbUlDaDBhR2x6TG05d2RITXVZbXgxY2s5dVEyaGhibWRsS1Z4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTV2Y0hSekxtVnNaVzFsYm5RdVlteDFjaWdwTzF4eVhHNGdJQ0FnSUNBZ0lIMHNYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDOHZZV0p6ZEhKaFkzUmNjbHh1SUNBZ0lDQWdJQ0JwYzBsdWRHVnlabUZqWlVWdVlXSnNaV1E2SUdaMWJtTjBhVzl1S0NsY2NseHVJQ0FnSUNBZ0lDQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lISmxkSFZ5YmlCMGFHbHpMbVZ1WVdKc1pXUkpiblJsY21aaFkyVWdQVDA5SUhSeWRXVTdYSEpjYmlBZ0lDQWdJQ0FnZlN4Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnTHk4Z1lXSnpkSEpoWTNSY2NseHVJQ0FnSUNBZ0lDQmxibUZpYkdWSmJuUmxjbVpoWTJVNklHWjFibU4wYVc5dUtDa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjJZWElnWlc1aFlteGxaQ0E5SUhSb2FYTXVYMlZ1WVdKc1pXUWdKaVlnSVhSb2FYTXVYM0psWVdSdmJteDVMRnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWkdsellXSnNaV1FnUFNBaFpXNWhZbXhsWkR0Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2hsYm1GaWJHVmtJRDA5UFNCMGFHbHpMbVZ1WVdKc1pXUkpiblJsY21aaFkyVXBJSEpsZEhWeWJpQm1ZV3h6WlR0Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11WTI5dWRHRnBibVZ5TG5SdloyZHNaVU5zWVhOektGd2ljMlZzWldOME1pMWpiMjUwWVdsdVpYSXRaR2x6WVdKc1pXUmNJaXdnWkdsellXSnNaV1FwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxtTnNiM05sS0NrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVaVzVoWW14bFpFbHVkR1Z5Wm1GalpTQTlJR1Z1WVdKc1pXUTdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0J5WlhSMWNtNGdkSEoxWlR0Y2NseHVJQ0FnSUNBZ0lDQjlMRnh5WEc1Y2NseHVJQ0FnSUNBZ0lDQXZMeUJoWW5OMGNtRmpkRnh5WEc0Z0lDQWdJQ0FnSUdWdVlXSnNaVG9nWm5WdVkzUnBiMjRvWlc1aFlteGxaQ2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb1pXNWhZbXhsWkNBOVBUMGdkVzVrWldacGJtVmtLU0JsYm1GaWJHVmtJRDBnZEhKMVpUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLSFJvYVhNdVgyVnVZV0pzWldRZ1BUMDlJR1Z1WVdKc1pXUXBJSEpsZEhWeWJqdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTVmWlc1aFlteGxaQ0E5SUdWdVlXSnNaV1E3WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbTl3ZEhNdVpXeGxiV1Z1ZEM1d2NtOXdLRndpWkdsellXSnNaV1JjSWl3Z0lXVnVZV0pzWldRcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbVZ1WVdKc1pVbHVkR1Z5Wm1GalpTZ3BPMXh5WEc0Z0lDQWdJQ0FnSUgwc1hISmNibHh5WEc0Z0lDQWdJQ0FnSUM4dklHRmljM1J5WVdOMFhISmNiaUFnSUNBZ0lDQWdaR2x6WVdKc1pUb2dablZ1WTNScGIyNG9LU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdVpXNWhZbXhsS0daaGJITmxLVHRjY2x4dUlDQWdJQ0FnSUNCOUxGeHlYRzVjY2x4dUlDQWdJQ0FnSUNBdkx5QmhZbk4wY21GamRGeHlYRzRnSUNBZ0lDQWdJSEpsWVdSdmJteDVPaUJtZFc1amRHbHZiaWhsYm1GaWJHVmtLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJR2xtSUNobGJtRmliR1ZrSUQwOVBTQjFibVJsWm1sdVpXUXBJR1Z1WVdKc1pXUWdQU0JtWVd4elpUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLSFJvYVhNdVgzSmxZV1J2Ym14NUlEMDlQU0JsYm1GaWJHVmtLU0J5WlhSMWNtNGdabUZzYzJVN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVYM0psWVdSdmJteDVJRDBnWlc1aFlteGxaRHRjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUhSb2FYTXViM0IwY3k1bGJHVnRaVzUwTG5CeWIzQW9YQ0p5WldGa2IyNXNlVndpTENCbGJtRmliR1ZrS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NWxibUZpYkdWSmJuUmxjbVpoWTJVb0tUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUhSeWRXVTdYSEpjYmlBZ0lDQWdJQ0FnZlN4Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnTHk4Z1lXSnpkSEpoWTNSY2NseHVJQ0FnSUNBZ0lDQnZjR1Z1WldRNklHWjFibU4wYVc5dUlDZ3BJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlIUm9hWE11WTI5dWRHRnBibVZ5TG1oaGMwTnNZWE56S0Z3aWMyVnNaV04wTWkxa2NtOXdaRzkzYmkxdmNHVnVYQ0lwTzF4eVhHNGdJQ0FnSUNBZ0lIMHNYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDOHZJR0ZpYzNSeVlXTjBYSEpjYmlBZ0lDQWdJQ0FnY0c5emFYUnBiMjVFY205d1pHOTNiam9nWm5WdVkzUnBiMjRvS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUhaaGNpQWtaSEp2Y0dSdmQyNGdQU0IwYUdsekxtUnliM0JrYjNkdUxGeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiMlptYzJWMElEMGdkR2hwY3k1amIyNTBZV2x1WlhJdWIyWm1jMlYwS0Nrc1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQm9aV2xuYUhRZ1BTQjBhR2x6TG1OdmJuUmhhVzVsY2k1dmRYUmxja2hsYVdkb2RDaG1ZV3h6WlNrc1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjNhV1IwYUNBOUlIUm9hWE11WTI5dWRHRnBibVZ5TG05MWRHVnlWMmxrZEdnb1ptRnNjMlVwTEZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1pISnZjRWhsYVdkb2RDQTlJQ1JrY205d1pHOTNiaTV2ZFhSbGNraGxhV2RvZENobVlXeHpaU2tzWEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMmFXVjNVRzl5ZEZKcFoyaDBJRDBnSkNoM2FXNWtiM2NwTG5OamNtOXNiRXhsWm5Rb0tTQXJJQ1FvZDJsdVpHOTNLUzUzYVdSMGFDZ3BMRnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZG1sbGQzQnZjblJDYjNSMGIyMGdQU0FrS0hkcGJtUnZkeWt1YzJOeWIyeHNWRzl3S0NrZ0t5QWtLSGRwYm1SdmR5a3VhR1ZwWjJoMEtDa3NYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JrY205d1ZHOXdJRDBnYjJabWMyVjBMblJ2Y0NBcklHaGxhV2RvZEN4Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHUnliM0JNWldaMElEMGdiMlptYzJWMExteGxablFzWEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCbGJtOTFaMmhTYjI5dFFtVnNiM2NnUFNCa2NtOXdWRzl3SUNzZ1pISnZjRWhsYVdkb2RDQThQU0IyYVdWM2NHOXlkRUp2ZEhSdmJTeGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR1Z1YjNWbmFGSnZiMjFCWW05MlpTQTlJQ2h2Wm1aelpYUXVkRzl3SUMwZ1pISnZjRWhsYVdkb2RDa2dQajBnZEdocGN5NWliMlI1S0NrdWMyTnliMnhzVkc5d0tDa3NYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JrY205d1YybGtkR2dnUFNBa1pISnZjR1J2ZDI0dWIzVjBaWEpYYVdSMGFDaG1ZV3h6WlNrc1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmxibTkxWjJoU2IyOXRUMjVTYVdkb2RDQTlJR1J5YjNCTVpXWjBJQ3NnWkhKdmNGZHBaSFJvSUR3OUlIWnBaWGRRYjNKMFVtbG5hSFFzWEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCaFltOTJaVTV2ZHlBOUlDUmtjbTl3Wkc5M2JpNW9ZWE5EYkdGemN5aGNJbk5sYkdWamRESXRaSEp2Y0MxaFltOTJaVndpS1N4Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHSnZaSGxQWm1aelpYUXNYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JoWW05MlpTeGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR056Y3l4Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lISmxjM1ZzZEhOTWFYTjBUbTlrWlR0Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2gwYUdsekxtOXdkSE11WkhKdmNHUnZkMjVCZFhSdlYybGtkR2dwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lISmxjM1ZzZEhOTWFYTjBUbTlrWlNBOUlDUW9KeTV6Wld4bFkzUXlMWEpsYzNWc2RITW5MQ0FrWkhKdmNHUnZkMjRwV3pCZE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdKR1J5YjNCa2IzZHVMbUZrWkVOc1lYTnpLQ2R6Wld4bFkzUXlMV1J5YjNBdFlYVjBieTEzYVdSMGFDY3BPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSkdSeWIzQmtiM2R1TG1OemN5Z25kMmxrZEdnbkxDQW5KeWs3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBdkx5QkJaR1FnYzJOeWIyeHNZbUZ5SUhkcFpIUm9JSFJ2SUdSeWIzQmtiM2R1SUdsbUlIWmxjblJwWTJGc0lITmpjbTlzYkdKaGNpQnBjeUJ3Y21WelpXNTBYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JrY205d1YybGtkR2dnUFNBa1pISnZjR1J2ZDI0dWIzVjBaWEpYYVdSMGFDaG1ZV3h6WlNrZ0t5QW9jbVZ6ZFd4MGMweHBjM1JPYjJSbExuTmpjbTlzYkVobGFXZG9kQ0E5UFQwZ2NtVnpkV3gwYzB4cGMzUk9iMlJsTG1Oc2FXVnVkRWhsYVdkb2RDQS9JREFnT2lCelkzSnZiR3hDWVhKRWFXMWxibk5wYjI1ekxuZHBaSFJvS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHUnliM0JYYVdSMGFDQStJSGRwWkhSb0lEOGdkMmxrZEdnZ1BTQmtjbTl3VjJsa2RHZ2dPaUJrY205d1YybGtkR2dnUFNCM2FXUjBhRHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdWdWIzVm5hRkp2YjIxUGJsSnBaMmgwSUQwZ1pISnZjRXhsWm5RZ0t5QmtjbTl3VjJsa2RHZ2dQRDBnZG1sbGQxQnZjblJTYVdkb2REdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCbGJITmxJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVZMjl1ZEdGcGJtVnlMbkpsYlc5MlpVTnNZWE56S0NkelpXeGxZM1F5TFdSeWIzQXRZWFYwYnkxM2FXUjBhQ2NwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNBdkwyTnZibk52YkdVdWJHOW5LRndpWW1Wc2IzY3ZJR1J5YjNCMGIzQTZYQ0lzSUdSeWIzQlViM0FzSUZ3aVpISnZjRWhsYVdkb2RGd2lMQ0JrY205d1NHVnBaMmgwTENCY0luTjFiVndpTENBb1pISnZjRlJ2Y0N0a2NtOXdTR1ZwWjJoMEtTdGNJaUIyYVdWM2NHOXlkQ0JpYjNSMGIyMWNJaXdnZG1sbGQzQnZjblJDYjNSMGIyMHNJRndpWlc1dmRXZG9QMXdpTENCbGJtOTFaMmhTYjI5dFFtVnNiM2NwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0F2TDJOdmJuTnZiR1V1Ykc5bktGd2lZV0p2ZG1VdklHOW1abk5sZEM1MGIzQmNJaXdnYjJabWMyVjBMblJ2Y0N3Z1hDSmtjbTl3U0dWcFoyaDBYQ0lzSUdSeWIzQklaV2xuYUhRc0lGd2lkRzl3WENJc0lDaHZabVp6WlhRdWRHOXdMV1J5YjNCSVpXbG5hSFFwTENCY0luTmpjbTlzYkZSdmNGd2lMQ0IwYUdsekxtSnZaSGtvS1M1elkzSnZiR3hVYjNBb0tTd2dYQ0psYm05MVoyZy9YQ0lzSUdWdWIzVm5hRkp2YjIxQlltOTJaU2s3WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNBdkx5Qm1hWGdnY0c5emFYUnBiMjVwYm1jZ2QyaGxiaUJpYjJSNUlHaGhjeUJoYmlCdlptWnpaWFFnWVc1a0lHbHpJRzV2ZENCd2IzTnBkR2x2YmpvZ2MzUmhkR2xqWEhKY2JpQWdJQ0FnSUNBZ0lDQWdJR2xtSUNoMGFHbHpMbUp2Wkhrb0tTNWpjM01vSjNCdmMybDBhVzl1SnlrZ0lUMDlJQ2R6ZEdGMGFXTW5LU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCaWIyUjVUMlptYzJWMElEMGdkR2hwY3k1aWIyUjVLQ2t1YjJabWMyVjBLQ2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCa2NtOXdWRzl3SUMwOUlHSnZaSGxQWm1aelpYUXVkRzl3TzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1pISnZjRXhsWm5RZ0xUMGdZbTlrZVU5bVpuTmxkQzVzWldaME8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCOVhISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQXZMeUJoYkhkaGVYTWdjSEpsWm1WeUlIUm9aU0JqZFhKeVpXNTBJR0ZpYjNabEwySmxiRzkzSUdGc2FXZHViV1Z1ZEN3Z2RXNXNaWE56SUhSb1pYSmxJR2x6SUc1dmRDQmxibTkxWjJnZ2NtOXZiVnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQnBaaUFvWVdKdmRtVk9iM2NwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHRmliM1psSUQwZ2RISjFaVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbUlDZ2haVzV2ZFdkb1VtOXZiVUZpYjNabElDWW1JR1Z1YjNWbmFGSnZiMjFDWld4dmR5a2dZV0p2ZG1VZ1BTQm1ZV3h6WlR0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZlNCbGJITmxJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdGaWIzWmxJRDBnWm1Gc2MyVTdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb0lXVnViM1ZuYUZKdmIyMUNaV3h2ZHlBbUppQmxibTkxWjJoU2IyOXRRV0p2ZG1VcElHRmliM1psSUQwZ2RISjFaVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tDRmxibTkxWjJoU2IyOXRUMjVTYVdkb2RDa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0JrY205d1RHVm1kQ0E5SUc5bVpuTmxkQzVzWldaMElDc2dkMmxrZEdnZ0xTQmtjbTl3VjJsa2RHZzdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJR2xtSUNoaFltOTJaU2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1pISnZjRlJ2Y0NBOUlHOW1abk5sZEM1MGIzQWdMU0JrY205d1NHVnBaMmgwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTVqYjI1MFlXbHVaWEl1WVdSa1EyeGhjM01vWENKelpXeGxZM1F5TFdSeWIzQXRZV0p2ZG1WY0lpazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FrWkhKdmNHUnZkMjR1WVdSa1EyeGhjM01vWENKelpXeGxZM1F5TFdSeWIzQXRZV0p2ZG1WY0lpazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ1pXeHpaU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbU52Ym5SaGFXNWxjaTV5WlcxdmRtVkRiR0Z6Y3loY0luTmxiR1ZqZERJdFpISnZjQzFoWW05MlpWd2lLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNSa2NtOXdaRzkzYmk1eVpXMXZkbVZEYkdGemN5aGNJbk5sYkdWamRESXRaSEp2Y0MxaFltOTJaVndpS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ1kzTnpJRDBnSkM1bGVIUmxibVFvZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHOXdPaUJrY205d1ZHOXdMRnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYkdWbWREb2daSEp2Y0V4bFpuUXNYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IzYVdSMGFEb2dkMmxrZEdoY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZlN3Z1pYWmhiSFZoZEdVb2RHaHBjeTV2Y0hSekxtUnliM0JrYjNkdVEzTnpLU2s3WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNBa1pISnZjR1J2ZDI0dVkzTnpLR056Y3lrN1hISmNiaUFnSUNBZ0lDQWdmU3hjY2x4dVhISmNiaUFnSUNBZ0lDQWdMeThnWVdKemRISmhZM1JjY2x4dUlDQWdJQ0FnSUNCemFHOTFiR1JQY0dWdU9pQm1kVzVqZEdsdmJpZ3BJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdkbUZ5SUdWMlpXNTBPMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tIUm9hWE11YjNCbGJtVmtLQ2twSUhKbGRIVnliaUJtWVd4elpUdGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJR2xtSUNoMGFHbHpMbDlsYm1GaWJHVmtJRDA5UFNCbVlXeHpaU0I4ZkNCMGFHbHpMbDl5WldGa2IyNXNlU0E5UFQwZ2RISjFaU2tnY21WMGRYSnVJR1poYkhObE8xeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdaWFpsYm5RZ1BTQWtMa1YyWlc1MEtGd2ljMlZzWldOME1pMXZjR1Z1YVc1blhDSXBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG05d2RITXVaV3hsYldWdWRDNTBjbWxuWjJWeUtHVjJaVzUwS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJQ0ZsZG1WdWRDNXBjMFJsWm1GMWJIUlFjbVYyWlc1MFpXUW9LVHRjY2x4dUlDQWdJQ0FnSUNCOUxGeHlYRzVjY2x4dUlDQWdJQ0FnSUNBdkx5QmhZbk4wY21GamRGeHlYRzRnSUNBZ0lDQWdJR05zWldGeVJISnZjR1J2ZDI1QmJHbG5ibTFsYm5SUWNtVm1aWEpsYm1ObE9pQm1kVzVqZEdsdmJpZ3BJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdMeThnWTJ4bFlYSWdkR2hsSUdOc1lYTnpaWE1nZFhObFpDQjBieUJtYVdkMWNtVWdiM1YwSUhSb1pTQndjbVZtWlhKbGJtTmxJRzltSUhkb1pYSmxJSFJvWlNCa2NtOXdaRzkzYmlCemFHOTFiR1FnWW1VZ2IzQmxibVZrWEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdVkyOXVkR0ZwYm1WeUxuSmxiVzkyWlVOc1lYTnpLRndpYzJWc1pXTjBNaTFrY205d0xXRmliM1psWENJcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbVJ5YjNCa2IzZHVMbkpsYlc5MlpVTnNZWE56S0Z3aWMyVnNaV04wTWkxa2NtOXdMV0ZpYjNabFhDSXBPMXh5WEc0Z0lDQWdJQ0FnSUgwc1hISmNibHh5WEc0Z0lDQWdJQ0FnSUM4cUtseHlYRzRnSUNBZ0lDQWdJQ0FxSUU5d1pXNXpJSFJvWlNCa2NtOXdaRzkzYmx4eVhHNGdJQ0FnSUNBZ0lDQXFYSEpjYmlBZ0lDQWdJQ0FnSUNvZ1FISmxkSFZ5YmlCN1FtOXZiR1ZoYm4wZ2QyaGxkR2hsY2lCdmNpQnViM1FnWkhKdmNHUnZkMjRnZDJGeklHOXdaVzVsWkM0Z1ZHaHBjeUJ0WlhSb2IyUWdkMmxzYkNCeVpYUjFjbTRnWm1Gc2MyVWdhV1lzSUdadmNpQmxlR0Z0Y0d4bExGeHlYRzRnSUNBZ0lDQWdJQ0FxSUhSb1pTQmtjbTl3Wkc5M2JpQnBjeUJoYkhKbFlXUjVJRzl3Wlc0c0lHOXlJR2xtSUhSb1pTQW5iM0JsYmljZ1pYWmxiblFnYkdsemRHVnVaWElnYjI0Z2RHaGxJR1ZzWlcxbGJuUWdZMkZzYkdWa0lIQnlaWFpsYm5SRVpXWmhkV3gwS0NrdVhISmNiaUFnSUNBZ0lDQWdJQ292WEhKY2JpQWdJQ0FnSUNBZ0x5OGdZV0p6ZEhKaFkzUmNjbHh1SUNBZ0lDQWdJQ0J2Y0dWdU9pQm1kVzVqZEdsdmJpQW9LU0I3WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNCcFppQW9JWFJvYVhNdWMyaHZkV3hrVDNCbGJpZ3BLU0J5WlhSMWNtNGdabUZzYzJVN1hISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG05d1pXNXBibWNvS1R0Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lISmxkSFZ5YmlCMGNuVmxPMXh5WEc0Z0lDQWdJQ0FnSUgwc1hISmNibHh5WEc0Z0lDQWdJQ0FnSUM4cUtseHlYRzRnSUNBZ0lDQWdJQ0FxSUZCbGNtWnZjbTF6SUhSb1pTQnZjR1Z1YVc1bklHOW1JSFJvWlNCa2NtOXdaRzkzYmx4eVhHNGdJQ0FnSUNBZ0lDQXFMMXh5WEc0Z0lDQWdJQ0FnSUM4dklHRmljM1J5WVdOMFhISmNiaUFnSUNBZ0lDQWdiM0JsYm1sdVp6b2dablZ1WTNScGIyNG9LU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSFpoY2lCamFXUWdQU0IwYUdsekxtTnZiblJoYVc1bGNrbGtMRnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYzJOeWIyeHNJRDBnWENKelkzSnZiR3d1WENJZ0t5QmphV1FzWEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYTnBlbVVnUFNCY0luSmxjMmw2WlM1Y0lpdGphV1FzWEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCdmNtbGxiblFnUFNCY0ltOXlhV1Z1ZEdGMGFXOXVZMmhoYm1kbExsd2lLMk5wWkN4Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHMWhjMnNzSUcxaGMydERjM003WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbU52Ym5SaGFXNWxjaTVoWkdSRGJHRnpjeWhjSW5ObGJHVmpkREl0WkhKdmNHUnZkMjR0YjNCbGJsd2lLUzVoWkdSRGJHRnpjeWhjSW5ObGJHVmpkREl0WTI5dWRHRnBibVZ5TFdGamRHbDJaVndpS1R0Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11WTJ4bFlYSkVjbTl3Wkc5M2JrRnNhV2R1YldWdWRGQnlaV1psY21WdVkyVW9LVHRjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUdsbUtIUm9hWE11WkhKdmNHUnZkMjViTUYwZ0lUMDlJSFJvYVhNdVltOWtlU2dwTG1Ob2FXeGtjbVZ1S0NrdWJHRnpkQ2dwV3pCZEtTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxtUnliM0JrYjNkdUxtUmxkR0ZqYUNncExtRndjR1Z1WkZSdktIUm9hWE11WW05a2VTZ3BLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnTHk4Z1kzSmxZWFJsSUhSb1pTQmtjbTl3Wkc5M2JpQnRZWE5ySUdsbUlHUnZaWE51ZENCaGJISmxZV1I1SUdWNGFYTjBYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lHMWhjMnNnUFNBa0tGd2lJM05sYkdWamRESXRaSEp2Y0MxdFlYTnJYQ0lwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2JXRnpheTVzWlc1bmRHZ2dQVDBnTUNrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiV0Z6YXlBOUlDUW9aRzlqZFcxbGJuUXVZM0psWVhSbFJXeGxiV1Z1ZENoY0ltUnBkbHdpS1NrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnRZWE5yTG1GMGRISW9YQ0pwWkZ3aUxGd2ljMlZzWldOME1pMWtjbTl3TFcxaGMydGNJaWt1WVhSMGNpaGNJbU5zWVhOelhDSXNYQ0p6Wld4bFkzUXlMV1J5YjNBdGJXRnphMXdpS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHMWhjMnN1YUdsa1pTZ3BPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYldGemF5NWhjSEJsYm1SVWJ5aDBhR2x6TG1KdlpIa29LU2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCdFlYTnJMbTl1S0Z3aWJXOTFjMlZrYjNkdUlIUnZkV05vYzNSaGNuUWdZMnhwWTJ0Y0lpd2dablZ1WTNScGIyNGdLR1VwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IyWVhJZ1pISnZjR1J2ZDI0Z1BTQWtLRndpSTNObGJHVmpkREl0WkhKdmNGd2lLU3dnYzJWc1pqdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFppQW9aSEp2Y0dSdmQyNHViR1Z1WjNSb0lENGdNQ2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCelpXeG1QV1J5YjNCa2IzZHVMbVJoZEdFb1hDSnpaV3hsWTNReVhDSXBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2MyVnNaaTV2Y0hSekxuTmxiR1ZqZEU5dVFteDFjaWtnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjMlZzWmk1elpXeGxZM1JJYVdkb2JHbG5hSFJsWkNoN2JtOUdiMk4xY3pvZ2RISjFaWDBwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lITmxiR1l1WTJ4dmMyVW9lMlp2WTNWek9tWmhiSE5sZlNrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHVXVjSEpsZG1WdWRFUmxabUYxYkhRb0tUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdaUzV6ZEc5d1VISnZjR0ZuWVhScGIyNG9LVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5S1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0x5OGdaVzV6ZFhKbElIUm9aU0J0WVhOcklHbHpJR0ZzZDJGNWN5QnlhV2RvZENCaVpXWnZjbVVnZEdobElHUnliM0JrYjNkdVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUdsbUlDaDBhR2x6TG1SeWIzQmtiM2R1TG5CeVpYWW9LVnN3WFNBaFBUMGdiV0Z6YTFzd1hTa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NWtjbTl3Wkc5M2JpNWlaV1p2Y21Vb2JXRnpheWs3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUM4dklHMXZkbVVnZEdobElHZHNiMkpoYkNCcFpDQjBieUIwYUdVZ1kyOXljbVZqZENCa2NtOXdaRzkzYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FrS0Z3aUkzTmxiR1ZqZERJdFpISnZjRndpS1M1eVpXMXZkbVZCZEhSeUtGd2lhV1JjSWlrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVaSEp2Y0dSdmQyNHVZWFIwY2loY0ltbGtYQ0lzSUZ3aWMyVnNaV04wTWkxa2NtOXdYQ0lwTzF4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0x5OGdjMmh2ZHlCMGFHVWdaV3hsYldWdWRITmNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2JXRnpheTV6YUc5M0tDazdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxuQnZjMmwwYVc5dVJISnZjR1J2ZDI0b0tUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTVrY205d1pHOTNiaTV6YUc5M0tDazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11Y0c5emFYUnBiMjVFY205d1pHOTNiaWdwTzF4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTVrY205d1pHOTNiaTVoWkdSRGJHRnpjeWhjSW5ObGJHVmpkREl0WkhKdmNDMWhZM1JwZG1WY0lpazdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0F2THlCaGRIUmhZMmdnYkdsemRHVnVaWEp6SUhSdklHVjJaVzUwY3lCMGFHRjBJR05oYmlCamFHRnVaMlVnZEdobElIQnZjMmwwYVc5dUlHOW1JSFJvWlNCamIyNTBZV2x1WlhJZ1lXNWtJSFJvZFhNZ2NtVnhkV2x5WlZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0F2THlCMGFHVWdjRzl6YVhScGIyNGdiMllnZEdobElHUnliM0JrYjNkdUlIUnZJR0psSUhWd1pHRjBaV1FnWVhNZ2QyVnNiQ0J6YnlCcGRDQmtiMlZ6SUc1dmRDQmpiMjFsSUhWdVoyeDFaV1FnWm5KdmJTQjBhR1VnWTI5dWRHRnBibVZ5WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSFpoY2lCMGFHRjBJRDBnZEdocGN6dGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTVqYjI1MFlXbHVaWEl1Y0dGeVpXNTBjeWdwTG1Ga1pDaDNhVzVrYjNjcExtVmhZMmdvWm5WdVkzUnBiMjRnS0NrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdKQ2gwYUdsektTNXZiaWh5WlhOcGVtVXJYQ0lnWENJcmMyTnliMnhzSzF3aUlGd2lLMjl5YVdWdWRDd2dablZ1WTNScGIyNGdLR1VwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYUdGMExuQnZjMmwwYVc5dVJISnZjR1J2ZDI0b0tUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDBwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0I5S1R0Y2NseHVYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lIMHNYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDOHZJR0ZpYzNSeVlXTjBYSEpjYmlBZ0lDQWdJQ0FnWTJ4dmMyVTZJR1oxYm1OMGFXOXVJQ2dwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tDRjBhR2x6TG05d1pXNWxaQ2dwS1NCeVpYUjFjbTQ3WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNCMllYSWdZMmxrSUQwZ2RHaHBjeTVqYjI1MFlXbHVaWEpKWkN4Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lITmpjbTlzYkNBOUlGd2ljMk55YjJ4c0xsd2lJQ3NnWTJsa0xGeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVZ6YVhwbElEMGdYQ0p5WlhOcGVtVXVYQ0lyWTJsa0xGeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiM0pwWlc1MElEMGdYQ0p2Y21sbGJuUmhkR2x2Ym1Ob1lXNW5aUzVjSWl0amFXUTdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0F2THlCMWJtSnBibVFnWlhabGJuUWdiR2x6ZEdWdVpYSnpYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11WTI5dWRHRnBibVZ5TG5CaGNtVnVkSE1vS1M1aFpHUW9kMmx1Wkc5M0tTNWxZV05vS0daMWJtTjBhVzl1SUNncElIc2dKQ2gwYUdsektTNXZabVlvYzJOeWIyeHNLUzV2Wm1Zb2NtVnphWHBsS1M1dlptWW9iM0pwWlc1MEtUc2dmU2s3WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbU5zWldGeVJISnZjR1J2ZDI1QmJHbG5ibTFsYm5SUWNtVm1aWEpsYm1ObEtDazdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FrS0Z3aUkzTmxiR1ZqZERJdFpISnZjQzF0WVhOclhDSXBMbWhwWkdVb0tUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTVrY205d1pHOTNiaTV5WlcxdmRtVkJkSFJ5S0Z3aWFXUmNJaWs3SUM4dklHOXViSGtnZEdobElHRmpkR2wyWlNCa2NtOXdaRzkzYmlCb1lYTWdkR2hsSUhObGJHVmpkREl0WkhKdmNDQnBaRnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG1SeWIzQmtiM2R1TG1ocFpHVW9LVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1amIyNTBZV2x1WlhJdWNtVnRiM1psUTJ4aGMzTW9YQ0p6Wld4bFkzUXlMV1J5YjNCa2IzZHVMVzl3Wlc1Y0lpazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11Y21WemRXeDBjeTVsYlhCMGVTZ3BPMXh5WEc1Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11WTJ4bFlYSlRaV0Z5WTJnb0tUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTV6WldGeVkyZ3VjbVZ0YjNabFEyeGhjM01vWENKelpXeGxZM1F5TFdGamRHbDJaVndpS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NXZjSFJ6TG1Wc1pXMWxiblF1ZEhKcFoyZGxjaWdrTGtWMlpXNTBLRndpYzJWc1pXTjBNaTFqYkc5elpWd2lLU2s3WEhKY2JpQWdJQ0FnSUNBZ2ZTeGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0x5b3FYSEpjYmlBZ0lDQWdJQ0FnSUNvZ1QzQmxibk1nWTI5dWRISnZiQ3dnYzJWMGN5QnBibkIxZENCMllXeDFaU3dnWVc1a0lIVndaR0YwWlhNZ2NtVnpkV3gwY3k1Y2NseHVJQ0FnSUNBZ0lDQWdLaTljY2x4dUlDQWdJQ0FnSUNBdkx5QmhZbk4wY21GamRGeHlYRzRnSUNBZ0lDQWdJR1Y0ZEdWeWJtRnNVMlZoY21Ob09pQm1kVzVqZEdsdmJpQW9kR1Z5YlNrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbTl3Wlc0b0tUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTV6WldGeVkyZ3VkbUZzS0hSbGNtMHBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG5Wd1pHRjBaVkpsYzNWc2RITW9abUZzYzJVcE8xeHlYRzRnSUNBZ0lDQWdJSDBzWEhKY2JseHlYRzRnSUNBZ0lDQWdJQzh2SUdGaWMzUnlZV04wWEhKY2JpQWdJQ0FnSUNBZ1kyeGxZWEpUWldGeVkyZzZJR1oxYm1OMGFXOXVJQ2dwSUh0Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnZlN4Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnTHk5aFluTjBjbUZqZEZ4eVhHNGdJQ0FnSUNBZ0lHZGxkRTFoZUdsdGRXMVRaV3hsWTNScGIyNVRhWHBsT2lCbWRXNWpkR2x2YmlncElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUdWMllXeDFZWFJsS0hSb2FYTXViM0IwY3k1dFlYaHBiWFZ0VTJWc1pXTjBhVzl1VTJsNlpTazdYSEpjYmlBZ0lDQWdJQ0FnZlN4Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnTHk4Z1lXSnpkSEpoWTNSY2NseHVJQ0FnSUNBZ0lDQmxibk4xY21WSWFXZG9iR2xuYUhSV2FYTnBZbXhsT2lCbWRXNWpkR2x2YmlBb0tTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIWmhjaUJ5WlhOMWJIUnpJRDBnZEdocGN5NXlaWE4xYkhSekxDQmphR2xzWkhKbGJpd2dhVzVrWlhnc0lHTm9hV3hrTENCb1lpd2djbUlzSUhrc0lHMXZjbVU3WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNCcGJtUmxlQ0E5SUhSb2FYTXVhR2xuYUd4cFoyaDBLQ2s3WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNCcFppQW9hVzVrWlhnZ1BDQXdLU0J5WlhSMWNtNDdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2FXNWtaWGdnUFQwZ01Da2dlMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDOHZJR2xtSUhSb1pTQm1hWEp6ZENCbGJHVnRaVzUwSUdseklHaHBaMmhzYVdkb2RHVmtJSE5qY205c2JDQmhiR3dnZEdobElIZGhlU0IwYnlCMGFHVWdkRzl3TEZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0x5OGdkR2hoZENCM1lYa2dZVzU1SUhWdWMyVnNaV04wWVdKc1pTQm9aV0ZrWlhKeklHRmliM1psSUdsMElIZHBiR3dnWVd4emJ5QmlaU0J6WTNKdmJHeGxaRnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnTHk4Z2FXNTBieUIyYVdWM1hISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY21WemRXeDBjeTV6WTNKdmJHeFViM0FvTUNrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200N1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lHTm9hV3hrY21WdUlEMGdkR2hwY3k1bWFXNWtTR2xuYUd4cFoyaDBZV0pzWlVOb2IybGpaWE1vS1M1bWFXNWtLQ2N1YzJWc1pXTjBNaTF5WlhOMWJIUXRiR0ZpWld3bktUdGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJR05vYVd4a0lEMGdKQ2hqYUdsc1pISmxibHRwYm1SbGVGMHBPMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnYUdJZ1BTQmphR2xzWkM1dlptWnpaWFFvS1M1MGIzQWdLeUJqYUdsc1pDNXZkWFJsY2tobGFXZG9kQ2gwY25WbEtUdGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQzh2SUdsbUlIUm9hWE1nYVhNZ2RHaGxJR3hoYzNRZ1kyaHBiR1FnYkdWMGN5QmhiSE52SUcxaGEyVWdjM1Z5WlNCelpXeGxZM1F5TFcxdmNtVXRjbVZ6ZFd4MGN5QnBjeUIyYVhOcFlteGxYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2hwYm1SbGVDQTlQVDBnWTJocGJHUnlaVzR1YkdWdVozUm9JQzBnTVNrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiVzl5WlNBOUlISmxjM1ZzZEhNdVptbHVaQ2hjSW14cExuTmxiR1ZqZERJdGJXOXlaUzF5WlhOMWJIUnpYQ0lwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLRzF2Y21VdWJHVnVaM1JvSUQ0Z01Da2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHaGlJRDBnYlc5eVpTNXZabVp6WlhRb0tTNTBiM0FnS3lCdGIzSmxMbTkxZEdWeVNHVnBaMmgwS0hSeWRXVXBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNCeVlpQTlJSEpsYzNWc2RITXViMlptYzJWMEtDa3VkRzl3SUNzZ2NtVnpkV3gwY3k1dmRYUmxja2hsYVdkb2RDaDBjblZsS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tHaGlJRDRnY21JcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEpsYzNWc2RITXVjMk55YjJ4c1ZHOXdLSEpsYzNWc2RITXVjMk55YjJ4c1ZHOXdLQ2tnS3lBb2FHSWdMU0J5WWlrcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUhrZ1BTQmphR2xzWkM1dlptWnpaWFFvS1M1MGIzQWdMU0J5WlhOMWJIUnpMbTltWm5ObGRDZ3BMblJ2Y0R0Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDOHZJRzFoYTJVZ2MzVnlaU0IwYUdVZ2RHOXdJRzltSUhSb1pTQmxiR1Z0Wlc1MElHbHpJSFpwYzJsaWJHVmNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLSGtnUENBd0lDWW1JR05vYVd4a0xtTnpjeWduWkdsemNHeGhlU2NwSUNFOUlDZHViMjVsSnlBcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEpsYzNWc2RITXVjMk55YjJ4c1ZHOXdLSEpsYzNWc2RITXVjMk55YjJ4c1ZHOXdLQ2tnS3lCNUtUc2dMeThnZVNCcGN5QnVaV2RoZEdsMlpWeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lDQWdmU3hjY2x4dVhISmNiaUFnSUNBZ0lDQWdMeThnWVdKemRISmhZM1JjY2x4dUlDQWdJQ0FnSUNCbWFXNWtTR2xuYUd4cFoyaDBZV0pzWlVOb2IybGpaWE02SUdaMWJtTjBhVzl1S0NrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnZEdocGN5NXlaWE4xYkhSekxtWnBibVFvWENJdWMyVnNaV04wTWkxeVpYTjFiSFF0YzJWc1pXTjBZV0pzWlRwdWIzUW9Mbk5sYkdWamRESXRjMlZzWldOMFpXUXBPbTV2ZENndWMyVnNaV04wTWkxa2FYTmhZbXhsWkNsY0lpazdYSEpjYmlBZ0lDQWdJQ0FnZlN4Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnTHk4Z1lXSnpkSEpoWTNSY2NseHVJQ0FnSUNBZ0lDQnRiM1psU0dsbmFHeHBaMmgwT2lCbWRXNWpkR2x2YmlBb1pHVnNkR0VwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZG1GeUlHTm9iMmxqWlhNZ1BTQjBhR2x6TG1acGJtUklhV2RvYkdsbmFIUmhZbXhsUTJodmFXTmxjeWdwTEZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXNWtaWGdnUFNCMGFHbHpMbWhwWjJoc2FXZG9kQ2dwTzF4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2QyaHBiR1VnS0dsdVpHVjRJRDRnTFRFZ0ppWWdhVzVrWlhnZ1BDQmphRzlwWTJWekxteGxibWQwYUNrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhVzVrWlhnZ0t6MGdaR1ZzZEdFN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjJZWElnWTJodmFXTmxJRDBnSkNoamFHOXBZMlZ6VzJsdVpHVjRYU2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFppQW9ZMmh2YVdObExtaGhjME5zWVhOektGd2ljMlZzWldOME1pMXlaWE4xYkhRdGMyVnNaV04wWVdKc1pWd2lLU0FtSmlBaFkyaHZhV05sTG1oaGMwTnNZWE56S0Z3aWMyVnNaV04wTWkxa2FYTmhZbXhsWkZ3aUtTQW1KaUFoWTJodmFXTmxMbWhoYzBOc1lYTnpLRndpYzJWc1pXTjBNaTF6Wld4bFkzUmxaRndpS1NrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVhR2xuYUd4cFoyaDBLR2x1WkdWNEtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCaWNtVmhhenRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ0lIMHNYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDOHZJR0ZpYzNSeVlXTjBYSEpjYmlBZ0lDQWdJQ0FnYUdsbmFHeHBaMmgwT2lCbWRXNWpkR2x2YmlBb2FXNWtaWGdwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZG1GeUlHTm9iMmxqWlhNZ1BTQjBhR2x6TG1acGJtUklhV2RvYkdsbmFIUmhZbXhsUTJodmFXTmxjeWdwTEZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1kyaHZhV05sTEZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1pHRjBZVHRjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUdsbUlDaGhjbWQxYldWdWRITXViR1Z1WjNSb0lEMDlQU0F3S1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z2FXNWtaWGhQWmloamFHOXBZMlZ6TG1acGJIUmxjaWhjSWk1elpXeGxZM1F5TFdocFoyaHNhV2RvZEdWa1hDSXBXekJkTENCamFHOXBZMlZ6TG1kbGRDZ3BLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tHbHVaR1Y0SUQ0OUlHTm9iMmxqWlhNdWJHVnVaM1JvS1NCcGJtUmxlQ0E5SUdOb2IybGpaWE11YkdWdVozUm9JQzBnTVR0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tHbHVaR1Y0SUR3Z01Da2dhVzVrWlhnZ1BTQXdPMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NXlaVzF2ZG1WSWFXZG9iR2xuYUhRb0tUdGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJR05vYjJsalpTQTlJQ1FvWTJodmFXTmxjMXRwYm1SbGVGMHBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQmphRzlwWTJVdVlXUmtRMnhoYzNNb1hDSnpaV3hsWTNReUxXaHBaMmhzYVdkb2RHVmtYQ0lwTzF4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTVsYm5OMWNtVklhV2RvYkdsbmFIUldhWE5wWW14bEtDazdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0JrWVhSaElEMGdZMmh2YVdObExtUmhkR0VvWENKelpXeGxZM1F5TFdSaGRHRmNJaWs3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJR2xtSUNoa1lYUmhLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbTl3ZEhNdVpXeGxiV1Z1ZEM1MGNtbG5aMlZ5S0hzZ2RIbHdaVG9nWENKelpXeGxZM1F5TFdocFoyaHNhV2RvZEZ3aUxDQjJZV3c2SUhSb2FYTXVhV1FvWkdGMFlTa3NJR05vYjJsalpUb2daR0YwWVNCOUtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQWdJSDBzWEhKY2JseHlYRzRnSUNBZ0lDQWdJSEpsYlc5MlpVaHBaMmhzYVdkb2REb2dablZ1WTNScGIyNG9LU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdWNtVnpkV3gwY3k1bWFXNWtLRndpTG5ObGJHVmpkREl0YUdsbmFHeHBaMmgwWldSY0lpa3VjbVZ0YjNabFEyeGhjM01vWENKelpXeGxZM1F5TFdocFoyaHNhV2RvZEdWa1hDSXBPMXh5WEc0Z0lDQWdJQ0FnSUgwc1hISmNibHh5WEc0Z0lDQWdJQ0FnSUM4dklHRmljM1J5WVdOMFhISmNiaUFnSUNBZ0lDQWdZMjkxYm5SVFpXeGxZM1JoWW14bFVtVnpkV3gwY3pvZ1puVnVZM1JwYjI0b0tTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lISmxkSFZ5YmlCMGFHbHpMbVpwYm1SSWFXZG9iR2xuYUhSaFlteGxRMmh2YVdObGN5Z3BMbXhsYm1kMGFEdGNjbHh1SUNBZ0lDQWdJQ0I5TEZ4eVhHNWNjbHh1SUNBZ0lDQWdJQ0F2THlCaFluTjBjbUZqZEZ4eVhHNGdJQ0FnSUNBZ0lHaHBaMmhzYVdkb2RGVnVaR1Z5UlhabGJuUTZJR1oxYm1OMGFXOXVJQ2hsZG1WdWRDa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjJZWElnWld3Z1BTQWtLR1YyWlc1MExuUmhjbWRsZENrdVkyeHZjMlZ6ZENoY0lpNXpaV3hsWTNReUxYSmxjM1ZzZEMxelpXeGxZM1JoWW14bFhDSXBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQnBaaUFvWld3dWJHVnVaM1JvSUQ0Z01DQW1KaUFoWld3dWFYTW9YQ0l1YzJWc1pXTjBNaTFvYVdkb2JHbG5hSFJsWkZ3aUtTa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZG1GeUlHTm9iMmxqWlhNZ1BTQjBhR2x6TG1acGJtUklhV2RvYkdsbmFIUmhZbXhsUTJodmFXTmxjeWdwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTVvYVdkb2JHbG5hSFFvWTJodmFXTmxjeTVwYm1SbGVDaGxiQ2twTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0I5SUdWc2MyVWdhV1lnS0dWc0xteGxibWQwYUNBOVBTQXdLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBdkx5QnBaaUIzWlNCaGNtVWdiM1psY2lCaGJpQjFibk5sYkdWamRHRmliR1VnYVhSbGJTQnlaVzF2ZG1VZ1lXeHNJR2hwWjJoc2FXZG9kSE5jY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVjbVZ0YjNabFNHbG5hR3hwWjJoMEtDazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdJQ0I5TEZ4eVhHNWNjbHh1SUNBZ0lDQWdJQ0F2THlCaFluTjBjbUZqZEZ4eVhHNGdJQ0FnSUNBZ0lHeHZZV1JOYjNKbFNXWk9aV1ZrWldRNklHWjFibU4wYVc5dUlDZ3BJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdkbUZ5SUhKbGMzVnNkSE1nUFNCMGFHbHpMbkpsYzNWc2RITXNYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J0YjNKbElEMGdjbVZ6ZFd4MGN5NW1hVzVrS0Z3aWJHa3VjMlZzWldOME1pMXRiM0psTFhKbGMzVnNkSE5jSWlrc1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmlaV3h2ZHl3Z0x5OGdjR2w0Wld4eklIUm9aU0JsYkdWdFpXNTBJR2x6SUdKbGJHOTNJSFJvWlNCelkzSnZiR3dnWm05c1pDd2dZbVZzYjNjOVBUQWdhWE1nZDJobGJpQjBhR1VnWld4bGJXVnVkQ0JwY3lCemRHRnlkR2x1WnlCMGJ5QmlaU0IyYVhOcFlteGxYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J2Wm1aelpYUWdQU0F0TVN3Z0x5OGdhVzVrWlhnZ2IyWWdabWx5YzNRZ1pXeGxiV1Z1ZENCM2FYUm9iM1YwSUdSaGRHRmNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEJoWjJVZ1BTQjBhR2x6TG5KbGMzVnNkSE5RWVdkbElDc2dNU3hjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhObGJHWTlkR2hwY3l4Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUmxjbTA5ZEdocGN5NXpaV0Z5WTJndWRtRnNLQ2tzWEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCamIyNTBaWGgwUFhSb2FYTXVZMjl1ZEdWNGREdGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJR2xtSUNodGIzSmxMbXhsYm1kMGFDQTlQVDBnTUNrZ2NtVjBkWEp1TzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0JpWld4dmR5QTlJRzF2Y21VdWIyWm1jMlYwS0NrdWRHOXdJQzBnY21WemRXeDBjeTV2Wm1aelpYUW9LUzUwYjNBZ0xTQnlaWE4xYkhSekxtaGxhV2RvZENncE8xeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdhV1lnS0dKbGJHOTNJRHc5SUhSb2FYTXViM0IwY3k1c2IyRmtUVzl5WlZCaFpHUnBibWNwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHMXZjbVV1WVdSa1EyeGhjM01vWENKelpXeGxZM1F5TFdGamRHbDJaVndpS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11YjNCMGN5NXhkV1Z5ZVNoN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHVnNaVzFsYm5RNklIUm9hWE11YjNCMGN5NWxiR1Z0Wlc1MExGeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBaWEp0T2lCMFpYSnRMRnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J3WVdkbE9pQndZV2RsTEZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCamIyNTBaWGgwT2lCamIyNTBaWGgwTEZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCdFlYUmphR1Z5T2lCMGFHbHpMbTl3ZEhNdWJXRjBZMmhsY2l4Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1kyRnNiR0poWTJzNklIUm9hWE11WW1sdVpDaG1kVzVqZEdsdmJpQW9aR0YwWVNrZ2UxeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQXZMeUJwWjI1dmNtVWdZU0J5WlhOd2IyNXpaU0JwWmlCMGFHVWdjMlZzWldOME1pQm9ZWE1nWW1WbGJpQmpiRzl6WldRZ1ltVm1iM0psSUdsMElIZGhjeUJ5WldObGFYWmxaRnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2doYzJWc1ppNXZjR1Z1WldRb0tTa2djbVYwZFhKdU8xeHlYRzVjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYzJWc1ppNXZjSFJ6TG5CdmNIVnNZWFJsVW1WemRXeDBjeTVqWVd4c0tIUm9hWE1zSUhKbGMzVnNkSE1zSUdSaGRHRXVjbVZ6ZFd4MGN5d2dlM1JsY20wNklIUmxjbTBzSUhCaFoyVTZJSEJoWjJVc0lHTnZiblJsZUhRNlkyOXVkR1Y0ZEgwcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhObGJHWXVjRzl6ZEhCeWIyTmxjM05TWlhOMWJIUnpLR1JoZEdFc0lHWmhiSE5sTENCbVlXeHpaU2s3WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbUlDaGtZWFJoTG0xdmNtVTlQVDEwY25WbEtTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRzF2Y21VdVpHVjBZV05vS0NrdVlYQndaVzVrVkc4b2NtVnpkV3gwY3lrdWRHVjRkQ2h6Wld4bUxtOXdkSE11Wm05eWJXRjBURzloWkUxdmNtVW9jR0ZuWlNzeEtTazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSGRwYm1SdmR5NXpaWFJVYVcxbGIzVjBLR1oxYm1OMGFXOXVLQ2tnZXlCelpXeG1MbXh2WVdSTmIzSmxTV1pPWldWa1pXUW9LVHNnZlN3Z01UQXBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMGdaV3h6WlNCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHMXZjbVV1Y21WdGIzWmxLQ2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lITmxiR1l1Y0c5emFYUnBiMjVFY205d1pHOTNiaWdwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSE5sYkdZdWNtVnpkV3gwYzFCaFoyVWdQU0J3WVdkbE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhObGJHWXVZMjl1ZEdWNGRDQTlJR1JoZEdFdVkyOXVkR1Y0ZER0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxtOXdkSE11Wld4bGJXVnVkQzUwY21sbloyVnlLSHNnZEhsd1pUb2dYQ0p6Wld4bFkzUXlMV3h2WVdSbFpGd2lMQ0JwZEdWdGN6b2daR0YwWVNCOUtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDBwZlNrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ0lDQjlMRnh5WEc1Y2NseHVJQ0FnSUNBZ0lDQXZLaXBjY2x4dUlDQWdJQ0FnSUNBZ0tpQkVaV1poZFd4MElIUnZhMlZ1YVhwbGNpQm1kVzVqZEdsdmJpQjNhR2xqYUNCa2IyVnpJRzV2ZEdocGJtZGNjbHh1SUNBZ0lDQWdJQ0FnS2k5Y2NseHVJQ0FnSUNBZ0lDQjBiMnRsYm1sNlpUb2dablZ1WTNScGIyNG9LU0I3WEhKY2JseHlYRzRnSUNBZ0lDQWdJSDBzWEhKY2JseHlYRzRnSUNBZ0lDQWdJQzhxS2x4eVhHNGdJQ0FnSUNBZ0lDQXFJRUJ3WVhKaGJTQnBibWwwYVdGc0lIZG9aWFJvWlhJZ2IzSWdibTkwSUhSb2FYTWdhWE1nZEdobElHTmhiR3dnZEc4Z2RHaHBjeUJ0WlhSb2IyUWdjbWxuYUhRZ1lXWjBaWElnZEdobElHUnliM0JrYjNkdUlHaGhjeUJpWldWdUlHOXdaVzVsWkZ4eVhHNGdJQ0FnSUNBZ0lDQXFMMXh5WEc0Z0lDQWdJQ0FnSUM4dklHRmljM1J5WVdOMFhISmNiaUFnSUNBZ0lDQWdkWEJrWVhSbFVtVnpkV3gwY3pvZ1puVnVZM1JwYjI0Z0tHbHVhWFJwWVd3cElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RtRnlJSE5sWVhKamFDQTlJSFJvYVhNdWMyVmhjbU5vTEZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NtVnpkV3gwY3lBOUlIUm9hWE11Y21WemRXeDBjeXhjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUc5d2RITWdQU0IwYUdsekxtOXdkSE1zWEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCa1lYUmhMRnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYzJWc1ppQTlJSFJvYVhNc1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBibkIxZEN4Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUmxjbTBnUFNCelpXRnlZMmd1ZG1Gc0tDa3NYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzWVhOMFZHVnliU0E5SUNRdVpHRjBZU2gwYUdsekxtTnZiblJoYVc1bGNpd2dYQ0p6Wld4bFkzUXlMV3hoYzNRdGRHVnliVndpS1N4Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDOHZJSE5sY1hWbGJtTmxJRzUxYldKbGNpQjFjMlZrSUhSdklHUnliM0FnYjNWMExXOW1MVzl5WkdWeUlISmxjM0J2Ym5ObGMxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjWFZsY25sT2RXMWlaWEk3WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNBdkx5QndjbVYyWlc1MElHUjFjR3hwWTJGMFpTQnhkV1Z5YVdWeklHRm5ZV2x1YzNRZ2RHaGxJSE5oYldVZ2RHVnliVnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQnBaaUFvYVc1cGRHbGhiQ0FoUFQwZ2RISjFaU0FtSmlCc1lYTjBWR1Z5YlNBbUppQmxjWFZoYkNoMFpYSnRMQ0JzWVhOMFZHVnliU2twSUhKbGRIVnlianRjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNRdVpHRjBZU2gwYUdsekxtTnZiblJoYVc1bGNpd2dYQ0p6Wld4bFkzUXlMV3hoYzNRdGRHVnliVndpTENCMFpYSnRLVHRjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUM4dklHbG1JSFJvWlNCelpXRnlZMmdnYVhNZ1kzVnljbVZ1ZEd4NUlHaHBaR1JsYmlCM1pTQmtieUJ1YjNRZ1lXeDBaWElnZEdobElISmxjM1ZzZEhOY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tHbHVhWFJwWVd3Z0lUMDlJSFJ5ZFdVZ0ppWWdLSFJvYVhNdWMyaHZkMU5sWVhKamFFbHVjSFYwSUQwOVBTQm1ZV3h6WlNCOGZDQWhkR2hwY3k1dmNHVnVaV1FvS1NrcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJqdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdablZ1WTNScGIyNGdjRzl6ZEZKbGJtUmxjaWdwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lITmxZWEpqYUM1eVpXMXZkbVZEYkdGemN5aGNJbk5sYkdWamRESXRZV04wYVhabFhDSXBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYzJWc1ppNXdiM05wZEdsdmJrUnliM0JrYjNkdUtDazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJR1oxYm1OMGFXOXVJSEpsYm1SbGNpaG9kRzFzS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWE4xYkhSekxtaDBiV3dvYUhSdGJDazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J3YjNOMFVtVnVaR1Z5S0NrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIRjFaWEo1VG5WdFltVnlJRDBnS3l0MGFHbHpMbkYxWlhKNVEyOTFiblE3WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNCMllYSWdiV0Y0VTJWc1UybDZaU0E5SUhSb2FYTXVaMlYwVFdGNGFXMTFiVk5sYkdWamRHbHZibE5wZW1Vb0tUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLRzFoZUZObGJGTnBlbVVnUGoweEtTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JrWVhSaElEMGdkR2hwY3k1a1lYUmhLQ2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFppQW9KQzVwYzBGeWNtRjVLR1JoZEdFcElDWW1JR1JoZEdFdWJHVnVaM1JvSUQ0OUlHMWhlRk5sYkZOcGVtVWdKaVlnWTJobFkydEdiM0p0WVhSMFpYSW9iM0IwY3k1bWIzSnRZWFJUWld4bFkzUnBiMjVVYjI5Q2FXY3NJRndpWm05eWJXRjBVMlZzWldOMGFXOXVWRzl2UW1sblhDSXBLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVZ1WkdWeUtGd2lQR3hwSUdOc1lYTnpQU2R6Wld4bFkzUXlMWE5sYkdWamRHbHZiaTFzYVcxcGRDYytYQ0lnS3lCdmNIUnpMbVp2Y20xaGRGTmxiR1ZqZEdsdmJsUnZiMEpwWnlodFlYaFRaV3hUYVhwbEtTQXJJRndpUEM5c2FUNWNJaWs3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdU8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2MyVmhjbU5vTG5aaGJDZ3BMbXhsYm1kMGFDQThJRzl3ZEhNdWJXbHVhVzExYlVsdWNIVjBUR1Z1WjNSb0tTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb1kyaGxZMnRHYjNKdFlYUjBaWElvYjNCMGN5NW1iM0p0WVhSSmJuQjFkRlJ2YjFOb2IzSjBMQ0JjSW1admNtMWhkRWx1Y0hWMFZHOXZVMmh2Y25SY0lpa3BJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaVzVrWlhJb1hDSThiR2tnWTJ4aGMzTTlKM05sYkdWamRESXRibTh0Y21WemRXeDBjeWMrWENJZ0t5QnZjSFJ6TG1admNtMWhkRWx1Y0hWMFZHOXZVMmh2Y25Rb2MyVmhjbU5vTG5aaGJDZ3BMQ0J2Y0hSekxtMXBibWx0ZFcxSmJuQjFkRXhsYm1kMGFDa2dLeUJjSWp3dmJHaytYQ0lwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZTQmxiSE5sSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J5Wlc1a1pYSW9YQ0pjSWlrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2FXNXBkR2xoYkNBbUppQjBhR2x6TG5Ob2IzZFRaV0Z5WTJncElIUm9hWE11YzJodmQxTmxZWEpqYUNoMGNuVmxLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhKbGRIVnlianRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tHOXdkSE11YldGNGFXMTFiVWx1Y0hWMFRHVnVaM1JvSUNZbUlITmxZWEpqYUM1MllXd29LUzVzWlc1bmRHZ2dQaUJ2Y0hSekxtMWhlR2x0ZFcxSmJuQjFkRXhsYm1kMGFDa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tHTm9aV05yUm05eWJXRjBkR1Z5S0c5d2RITXVabTl5YldGMFNXNXdkWFJVYjI5TWIyNW5MQ0JjSW1admNtMWhkRWx1Y0hWMFZHOXZURzl1WjF3aUtTa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lISmxibVJsY2loY0lqeHNhU0JqYkdGemN6MG5jMlZzWldOME1pMXVieTF5WlhOMWJIUnpKejVjSWlBcklHOXdkSE11Wm05eWJXRjBTVzV3ZFhSVWIyOU1iMjVuS0hObFlYSmphQzUyWVd3b0tTd2diM0IwY3k1dFlYaHBiWFZ0U1c1d2RYUk1aVzVuZEdncElDc2dYQ0k4TDJ4cFBsd2lLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgwZ1pXeHpaU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVZ1WkdWeUtGd2lYQ0lwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdU8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCOVhISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQnBaaUFvYjNCMGN5NW1iM0p0WVhSVFpXRnlZMmhwYm1jZ0ppWWdkR2hwY3k1bWFXNWtTR2xuYUd4cFoyaDBZV0pzWlVOb2IybGpaWE1vS1M1c1pXNW5kR2dnUFQwOUlEQXBJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhKbGJtUmxjaWhjSWp4c2FTQmpiR0Z6Y3owbmMyVnNaV04wTWkxelpXRnlZMmhwYm1jblBsd2lJQ3NnYjNCMGN5NW1iM0p0WVhSVFpXRnlZMmhwYm1jb0tTQXJJRndpUEM5c2FUNWNJaWs3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUhObFlYSmphQzVoWkdSRGJHRnpjeWhjSW5ObGJHVmpkREl0WVdOMGFYWmxYQ0lwTzF4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTV5WlcxdmRtVklhV2RvYkdsbmFIUW9LVHRjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUM4dklHZHBkbVVnZEdobElIUnZhMlZ1YVhwbGNpQmhJR05vWVc1alpTQjBieUJ3Y21VdGNISnZZMlZ6Y3lCMGFHVWdhVzV3ZFhSY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnYVc1d2RYUWdQU0IwYUdsekxuUnZhMlZ1YVhwbEtDazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2hwYm5CMWRDQWhQU0IxYm1SbFptbHVaV1FnSmlZZ2FXNXdkWFFnSVQwZ2JuVnNiQ2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2MyVmhjbU5vTG5aaGJDaHBibkIxZENrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11Y21WemRXeDBjMUJoWjJVZ1BTQXhPMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnYjNCMGN5NXhkV1Z5ZVNoN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmxiR1Z0Wlc1ME9pQnZjSFJ6TG1Wc1pXMWxiblFzWEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkR1Z5YlRvZ2MyVmhjbU5vTG5aaGJDZ3BMRnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIQmhaMlU2SUhSb2FYTXVjbVZ6ZFd4MGMxQmhaMlVzWEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZMjl1ZEdWNGREb2diblZzYkN4Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J0WVhSamFHVnlPaUJ2Y0hSekxtMWhkR05vWlhJc1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWTJGc2JHSmhZMnM2SUhSb2FYTXVZbWx1WkNobWRXNWpkR2x2YmlBb1pHRjBZU2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RtRnlJR1JsWmpzZ0x5OGdaR1ZtWVhWc2RDQmphRzlwWTJWY2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0F2THlCcFoyNXZjbVVnYjJ4a0lISmxjM0J2Ym5ObGMxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1lnS0hGMVpYSjVUblZ0WW1WeUlDRTlJSFJvYVhNdWNYVmxjbmxEYjNWdWRDa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTQ3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOVhISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnTHk4Z2FXZHViM0psSUdFZ2NtVnpjRzl1YzJVZ2FXWWdkR2hsSUhObGJHVmpkRElnYUdGeklHSmxaVzRnWTJ4dmMyVmtJR0psWm05eVpTQnBkQ0IzWVhNZ2NtVmpaV2wyWldSY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2doZEdocGN5NXZjR1Z1WldRb0tTa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11YzJWaGNtTm9MbkpsYlc5MlpVTnNZWE56S0Z3aWMyVnNaV04wTWkxaFkzUnBkbVZjSWlrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY21WMGRYSnVPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQzh2SUhOaGRtVWdZMjl1ZEdWNGRDd2dhV1lnWVc1NVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG1OdmJuUmxlSFFnUFNBb1pHRjBZUzVqYjI1MFpYaDBQVDA5ZFc1a1pXWnBibVZrS1NBL0lHNTFiR3dnT2lCa1lYUmhMbU52Ym5SbGVIUTdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0F2THlCamNtVmhkR1VnWVNCa1pXWmhkV3gwSUdOb2IybGpaU0JoYm1RZ2NISmxjR1Z1WkNCcGRDQjBieUIwYUdVZ2JHbHpkRnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tIUm9hWE11YjNCMGN5NWpjbVZoZEdWVFpXRnlZMmhEYUc5cFkyVWdKaVlnYzJWaGNtTm9MblpoYkNncElDRTlQU0JjSWx3aUtTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1pHVm1JRDBnZEdocGN5NXZjSFJ6TG1OeVpXRjBaVk5sWVhKamFFTm9iMmxqWlM1allXeHNLSE5sYkdZc0lITmxZWEpqYUM1MllXd29LU3dnWkdGMFlTNXlaWE4xYkhSektUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFppQW9aR1ZtSUNFOVBTQjFibVJsWm1sdVpXUWdKaVlnWkdWbUlDRTlQU0J1ZFd4c0lDWW1JSE5sYkdZdWFXUW9aR1ZtS1NBaFBUMGdkVzVrWldacGJtVmtJQ1ltSUhObGJHWXVhV1FvWkdWbUtTQWhQVDBnYm5Wc2JDa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb0pDaGtZWFJoTG5KbGMzVnNkSE1wTG1acGJIUmxjaWhjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHWjFibU4wYVc5dUlDZ3BJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J5WlhSMWNtNGdaWEYxWVd3b2MyVnNaaTVwWkNoMGFHbHpLU3dnYzJWc1ppNXBaQ2hrWldZcEtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgwcExteGxibWQwYUNBOVBUMGdNQ2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdaR0YwWVM1eVpYTjFiSFJ6TG5WdWMyaHBablFvWkdWbUtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaaUFvWkdGMFlTNXlaWE4xYkhSekxteGxibWQwYUNBOVBUMGdNQ0FtSmlCamFHVmphMFp2Y20xaGRIUmxjaWh2Y0hSekxtWnZjbTFoZEU1dlRXRjBZMmhsY3l3Z1hDSm1iM0p0WVhST2IwMWhkR05vWlhOY0lpa3BJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaVzVrWlhJb1hDSThiR2tnWTJ4aGMzTTlKM05sYkdWamRESXRibTh0Y21WemRXeDBjeWMrWENJZ0t5QnZjSFJ6TG1admNtMWhkRTV2VFdGMFkyaGxjeWh6WldGeVkyZ3VkbUZzS0NrcElDc2dYQ0k4TDJ4cFBsd2lLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200N1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NtVnpkV3gwY3k1bGJYQjBlU2dwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2MyVnNaaTV2Y0hSekxuQnZjSFZzWVhSbFVtVnpkV3gwY3k1allXeHNLSFJvYVhNc0lISmxjM1ZzZEhNc0lHUmhkR0V1Y21WemRXeDBjeXdnZTNSbGNtMDZJSE5sWVhKamFDNTJZV3dvS1N3Z2NHRm5aVG9nZEdocGN5NXlaWE4xYkhSelVHRm5aU3dnWTI5dWRHVjRkRHB1ZFd4c2ZTazdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLR1JoZEdFdWJXOXlaU0E5UFQwZ2RISjFaU0FtSmlCamFHVmphMFp2Y20xaGRIUmxjaWh2Y0hSekxtWnZjbTFoZEV4dllXUk5iM0psTENCY0ltWnZjbTFoZEV4dllXUk5iM0psWENJcEtTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NtVnpkV3gwY3k1aGNIQmxibVFvWENJOGJHa2dZMnhoYzNNOUozTmxiR1ZqZERJdGJXOXlaUzF5WlhOMWJIUnpKejVjSWlBcklITmxiR1l1YjNCMGN5NWxjMk5oY0dWTllYSnJkWEFvYjNCMGN5NW1iM0p0WVhSTWIyRmtUVzl5WlNoMGFHbHpMbkpsYzNWc2RITlFZV2RsS1NrZ0t5QmNJand2YkdrK1hDSXBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIZHBibVJ2ZHk1elpYUlVhVzFsYjNWMEtHWjFibU4wYVc5dUtDa2dleUJ6Wld4bUxteHZZV1JOYjNKbFNXWk9aV1ZrWldRb0tUc2dmU3dnTVRBcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11Y0c5emRIQnliMk5sYzNOU1pYTjFiSFJ6S0dSaGRHRXNJR2x1YVhScFlXd3BPMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIQnZjM1JTWlc1a1pYSW9LVHRjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG05d2RITXVaV3hsYldWdWRDNTBjbWxuWjJWeUtIc2dkSGx3WlRvZ1hDSnpaV3hsWTNReUxXeHZZV1JsWkZ3aUxDQnBkR1Z0Y3pvZ1pHRjBZU0I5S1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZlNsOUtUdGNjbHh1SUNBZ0lDQWdJQ0I5TEZ4eVhHNWNjbHh1SUNBZ0lDQWdJQ0F2THlCaFluTjBjbUZqZEZ4eVhHNGdJQ0FnSUNBZ0lHTmhibU5sYkRvZ1puVnVZM1JwYjI0Z0tDa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG1Oc2IzTmxLQ2s3WEhKY2JpQWdJQ0FnSUNBZ2ZTeGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0x5OGdZV0p6ZEhKaFkzUmNjbHh1SUNBZ0lDQWdJQ0JpYkhWeU9pQm1kVzVqZEdsdmJpQW9LU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQzh2SUdsbUlITmxiR1ZqZEU5dVFteDFjaUE5UFNCMGNuVmxMQ0J6Wld4bFkzUWdkR2hsSUdOMWNuSmxiblJzZVNCb2FXZG9iR2xuYUhSbFpDQnZjSFJwYjI1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tIUm9hWE11YjNCMGN5NXpaV3hsWTNSUGJrSnNkWElwWEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbk5sYkdWamRFaHBaMmhzYVdkb2RHVmtLSHR1YjBadlkzVnpPaUIwY25WbGZTazdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxtTnNiM05sS0NrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVZMjl1ZEdGcGJtVnlMbkpsYlc5MlpVTnNZWE56S0Z3aWMyVnNaV04wTWkxamIyNTBZV2x1WlhJdFlXTjBhWFpsWENJcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBdkx5QnplVzV2Ym5sdGIzVnpJSFJ2SUM1cGN5Z25PbVp2WTNWekp5a3NJSGRvYVdOb0lHbHpJR0YyWVdsc1lXSnNaU0JwYmlCcWNYVmxjbmtnUGowZ01TNDJYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2gwYUdsekxuTmxZWEpqYUZzd1hTQTlQVDBnWkc5amRXMWxiblF1WVdOMGFYWmxSV3hsYldWdWRDa2dleUIwYUdsekxuTmxZWEpqYUM1aWJIVnlLQ2s3SUgxY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NWpiR1ZoY2xObFlYSmphQ2dwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxuTmxiR1ZqZEdsdmJpNW1hVzVrS0Z3aUxuTmxiR1ZqZERJdGMyVmhjbU5vTFdOb2IybGpaUzFtYjJOMWMxd2lLUzV5WlcxdmRtVkRiR0Z6Y3loY0luTmxiR1ZqZERJdGMyVmhjbU5vTFdOb2IybGpaUzFtYjJOMWMxd2lLVHRjY2x4dUlDQWdJQ0FnSUNCOUxGeHlYRzVjY2x4dUlDQWdJQ0FnSUNBdkx5QmhZbk4wY21GamRGeHlYRzRnSUNBZ0lDQWdJR1p2WTNWelUyVmhjbU5vT2lCbWRXNWpkR2x2YmlBb0tTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lHWnZZM1Z6S0hSb2FYTXVjMlZoY21Ob0tUdGNjbHh1SUNBZ0lDQWdJQ0I5TEZ4eVhHNWNjbHh1SUNBZ0lDQWdJQ0F2THlCaFluTjBjbUZqZEZ4eVhHNGdJQ0FnSUNBZ0lITmxiR1ZqZEVocFoyaHNhV2RvZEdWa09pQm1kVzVqZEdsdmJpQW9iM0IwYVc5dWN5a2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjJZWElnYVc1a1pYZzlkR2hwY3k1b2FXZG9iR2xuYUhRb0tTeGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2hwWjJoc2FXZG9kR1ZrUFhSb2FYTXVjbVZ6ZFd4MGN5NW1hVzVrS0Z3aUxuTmxiR1ZqZERJdGFHbG5hR3hwWjJoMFpXUmNJaWtzWEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCa1lYUmhJRDBnYUdsbmFHeHBaMmgwWldRdVkyeHZjMlZ6ZENnbkxuTmxiR1ZqZERJdGNtVnpkV3gwSnlrdVpHRjBZU2hjSW5ObGJHVmpkREl0WkdGMFlWd2lLVHRjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUdsbUlDaGtZWFJoS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG1ocFoyaHNhV2RvZENocGJtUmxlQ2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbTl1VTJWc1pXTjBLR1JoZEdFc0lHOXdkR2x2Ym5NcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCOUlHVnNjMlVnYVdZZ0tHOXdkR2x2Ym5NZ0ppWWdiM0IwYVc5dWN5NXViMFp2WTNWektTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxtTnNiM05sS0NrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ0lDQjlMRnh5WEc1Y2NseHVJQ0FnSUNBZ0lDQXZMeUJoWW5OMGNtRmpkRnh5WEc0Z0lDQWdJQ0FnSUdkbGRGQnNZV05sYUc5c1pHVnlPaUJtZFc1amRHbHZiaUFvS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUhaaGNpQndiR0ZqWldodmJHUmxjazl3ZEdsdmJqdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUhSb2FYTXViM0IwY3k1bGJHVnRaVzUwTG1GMGRISW9YQ0p3YkdGalpXaHZiR1JsY2x3aUtTQjhmRnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NXZjSFJ6TG1Wc1pXMWxiblF1WVhSMGNpaGNJbVJoZEdFdGNHeGhZMlZvYjJ4a1pYSmNJaWtnZkh3Z0x5OGdhbkYxWlhKNUlERXVOQ0JqYjIxd1lYUmNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdWIzQjBjeTVsYkdWdFpXNTBMbVJoZEdFb1hDSndiR0ZqWldodmJHUmxjbHdpS1NCOGZGeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1dmNIUnpMbkJzWVdObGFHOXNaR1Z5SUh4OFhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQW9LSEJzWVdObGFHOXNaR1Z5VDNCMGFXOXVJRDBnZEdocGN5NW5aWFJRYkdGalpXaHZiR1JsY2s5d2RHbHZiaWdwS1NBaFBUMGdkVzVrWldacGJtVmtJRDhnY0d4aFkyVm9iMnhrWlhKUGNIUnBiMjR1ZEdWNGRDZ3BJRG9nZFc1a1pXWnBibVZrS1R0Y2NseHVJQ0FnSUNBZ0lDQjlMRnh5WEc1Y2NseHVJQ0FnSUNBZ0lDQXZMeUJoWW5OMGNtRmpkRnh5WEc0Z0lDQWdJQ0FnSUdkbGRGQnNZV05sYUc5c1pHVnlUM0IwYVc5dU9pQm1kVzVqZEdsdmJpZ3BJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdhV1lnS0hSb2FYTXVjMlZzWldOMEtTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IyWVhJZ1ptbHljM1JQY0hScGIyNGdQU0IwYUdsekxuTmxiR1ZqZEM1amFHbHNaSEpsYmlncExtWnBjbk4wS0NrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaaUFvZEdocGN5NXZjSFJ6TG5Cc1lXTmxhRzlzWkdWeVQzQjBhVzl1SUNFOVBTQjFibVJsWm1sdVpXUWdLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdMeTlFWlhSbGNtMXBibVVnZEdobElIQnNZV05sYUc5c1pHVnlJRzl3ZEdsdmJpQmlZWE5sWkNCdmJpQjBhR1VnYzNCbFkybG1hV1ZrSUhCc1lXTmxhRzlzWkdWeVQzQjBhVzl1SUhObGRIUnBibWRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z0tIUm9hWE11YjNCMGN5NXdiR0ZqWldodmJHUmxjazl3ZEdsdmJpQTlQVDBnWENKbWFYSnpkRndpSUNZbUlHWnBjbk4wVDNCMGFXOXVLU0I4ZkZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQW9kSGx3Wlc5bUlIUm9hWE11YjNCMGN5NXdiR0ZqWldodmJHUmxjazl3ZEdsdmJpQTlQVDBnWENKbWRXNWpkR2x2Ymx3aUlDWW1JSFJvYVhNdWIzQjBjeTV3YkdGalpXaHZiR1JsY2s5d2RHbHZiaWgwYUdsekxuTmxiR1ZqZENrcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmU0JsYkhObElHbG1JQ2htYVhKemRFOXdkR2x2Ymk1MFpYaDBLQ2tnUFQwOUlGd2lYQ0lnSmlZZ1ptbHljM1JQY0hScGIyNHVkbUZzS0NrZ1BUMDlJRndpWENJcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBdkwwNXZJR1Y0Y0d4cFkybDBJSEJzWVdObGFHOXNaR1Z5SUc5d2RHbHZiaUJ6Y0dWamFXWnBaV1FzSUhWelpTQjBhR1VnWm1seWMzUWdhV1lnYVhRbmN5QmliR0Z1YTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQm1hWEp6ZEU5d2RHbHZianRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ0lIMHNYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDOHFLbHh5WEc0Z0lDQWdJQ0FnSUNBcUlFZGxkQ0IwYUdVZ1pHVnphWEpsWkNCM2FXUjBhQ0JtYjNJZ2RHaGxJR052Ym5SaGFXNWxjaUJsYkdWdFpXNTBMaUFnVkdocGN5QnBjMXh5WEc0Z0lDQWdJQ0FnSUNBcUlHUmxjbWwyWldRZ1ptbHljM1FnWm5KdmJTQnZjSFJwYjI0Z1lIZHBaSFJvWUNCd1lYTnpaV1FnZEc4Z2MyVnNaV04wTWl3Z2RHaGxibHh5WEc0Z0lDQWdJQ0FnSUNBcUlIUm9aU0JwYm14cGJtVWdKM04wZVd4bEp5QnZiaUIwYUdVZ2IzSnBaMmx1WVd3Z1pXeGxiV1Z1ZEN3Z1lXNWtJR1pwYm1Gc2JIbGNjbHh1SUNBZ0lDQWdJQ0FnS2lCbVlXeHNjeUJpWVdOcklIUnZJSFJvWlNCcVVYVmxjbmtnWTJGc1kzVnNZWFJsWkNCbGJHVnRaVzUwSUhkcFpIUm9MbHh5WEc0Z0lDQWdJQ0FnSUNBcUwxeHlYRzRnSUNBZ0lDQWdJQzh2SUdGaWMzUnlZV04wWEhKY2JpQWdJQ0FnSUNBZ2FXNXBkRU52Ym5SaGFXNWxjbGRwWkhSb09pQm1kVzVqZEdsdmJpQW9LU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJR1oxYm1OMGFXOXVJSEpsYzI5c2RtVkRiMjUwWVdsdVpYSlhhV1IwYUNncElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFpoY2lCemRIbHNaU3dnWVhSMGNuTXNJRzFoZEdOb1pYTXNJR2tzSUd3N1hISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tIUm9hWE11YjNCMGN5NTNhV1IwYUNBOVBUMGdYQ0p2Wm1aY0lpa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lISmxkSFZ5YmlCdWRXeHNPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlNCbGJITmxJR2xtSUNoMGFHbHpMbTl3ZEhNdWQybGtkR2dnUFQwOUlGd2laV3hsYldWdWRGd2lLWHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z2RHaHBjeTV2Y0hSekxtVnNaVzFsYm5RdWIzVjBaWEpYYVdSMGFDaG1ZV3h6WlNrZ1BUMDlJREFnUHlBbllYVjBieWNnT2lCMGFHbHpMbTl3ZEhNdVpXeGxiV1Z1ZEM1dmRYUmxjbGRwWkhSb0tHWmhiSE5sS1NBcklDZHdlQ2M3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOUlHVnNjMlVnYVdZZ0tIUm9hWE11YjNCMGN5NTNhV1IwYUNBOVBUMGdYQ0pqYjNCNVhDSWdmSHdnZEdocGN5NXZjSFJ6TG5kcFpIUm9JRDA5UFNCY0luSmxjMjlzZG1WY0lpa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDOHZJR05vWldOcklHbG1JSFJvWlhKbElHbHpJR2x1YkdsdVpTQnpkSGxzWlNCdmJpQjBhR1VnWld4bGJXVnVkQ0IwYUdGMElHTnZiblJoYVc1eklIZHBaSFJvWEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjM1I1YkdVZ1BTQjBhR2x6TG05d2RITXVaV3hsYldWdWRDNWhkSFJ5S0NkemRIbHNaU2NwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtSUNoemRIbHNaU0FoUFQwZ2RXNWtaV1pwYm1Wa0tTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR0YwZEhKeklEMGdjM1I1YkdVdWMzQnNhWFFvSnpzbktUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdabTl5SUNocElEMGdNQ3dnYkNBOUlHRjBkSEp6TG14bGJtZDBhRHNnYVNBOElHdzdJR2tnUFNCcElDc2dNU2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiV0YwWTJobGN5QTlJR0YwZEhKelcybGRMbkpsY0d4aFkyVW9MMXhjY3k5bkxDQW5KeWxjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0F1YldGMFkyZ29MMXRlTFYxM2FXUjBhRG9vS0ZzdEsxMC9LRnN3TFRsZEtseGNMaWsvV3pBdE9WMHJLU2h3ZUh4bGJYeGxlSHdsZkdsdWZHTnRmRzF0ZkhCMGZIQmpLU2t2YVNrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2JXRjBZMmhsY3lBaFBUMGdiblZzYkNBbUppQnRZWFJqYUdWekxteGxibWQwYUNBK1BTQXhLVnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQnRZWFJqYUdWeld6RmRPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2RHaHBjeTV2Y0hSekxuZHBaSFJvSUQwOVBTQmNJbkpsYzI5c2RtVmNJaWtnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBdkx5QnVaWGgwSUdOb1pXTnJJR2xtSUdOemN5Z25kMmxrZEdnbktTQmpZVzRnY21WemIyeDJaU0JoSUhkcFpIUm9JSFJvWVhRZ2FYTWdjR1Z5WTJWdWRDQmlZWE5sWkN3Z2RHaHBjeUJwY3lCemIyMWxkR2x0WlhNZ2NHOXpjMmxpYkdWY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0x5OGdkMmhsYmlCaGRIUmhZMmhsWkNCMGJ5QnBibkIxZENCMGVYQmxQV2hwWkdSbGJpQnZjaUJsYkdWdFpXNTBjeUJvYVdSa1pXNGdkbWxoSUdOemMxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnpkSGxzWlNBOUlIUm9hWE11YjNCMGN5NWxiR1Z0Wlc1MExtTnpjeWduZDJsa2RHZ25LVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tITjBlV3hsTG1sdVpHVjRUMllvWENJbFhDSXBJRDRnTUNrZ2NtVjBkWEp1SUhOMGVXeGxPMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0x5OGdabWx1WVd4c2VTd2dabUZzYkdKaFkyc2diMjRnZEdobElHTmhiR04xYkdGMFpXUWdkMmxrZEdnZ2IyWWdkR2hsSUdWc1pXMWxiblJjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJQ2gwYUdsekxtOXdkSE11Wld4bGJXVnVkQzV2ZFhSbGNsZHBaSFJvS0daaGJITmxLU0E5UFQwZ01DQS9JQ2RoZFhSdkp5QTZJSFJvYVhNdWIzQjBjeTVsYkdWdFpXNTBMbTkxZEdWeVYybGtkR2dvWm1Gc2MyVXBJQ3NnSjNCNEp5azdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z2JuVnNiRHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgwZ1pXeHpaU0JwWmlBb0pDNXBjMFoxYm1OMGFXOXVLSFJvYVhNdWIzQjBjeTUzYVdSMGFDa3BJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z2RHaHBjeTV2Y0hSekxuZHBaSFJvS0NrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlJR1ZzYzJVZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUIwYUdsekxtOXdkSE11ZDJsa2RHZzdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdmVHRjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUhaaGNpQjNhV1IwYUNBOUlISmxjMjlzZG1WRGIyNTBZV2x1WlhKWGFXUjBhQzVqWVd4c0tIUm9hWE1wTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2QybGtkR2dnSVQwOUlHNTFiR3dwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11WTI5dWRHRnBibVZ5TG1OemN5aGNJbmRwWkhSb1hDSXNJSGRwWkhSb0tUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJSDBwTzF4eVhHNWNjbHh1SUNBZ0lGTnBibWRzWlZObGJHVmpkRElnUFNCamJHRjZlaWhCWW5OMGNtRmpkRk5sYkdWamRESXNJSHRjY2x4dVhISmNiaUFnSUNBZ0lDQWdMeThnYzJsdVoyeGxYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lHTnlaV0YwWlVOdmJuUmhhVzVsY2pvZ1puVnVZM1JwYjI0Z0tDa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjJZWElnWTI5dWRHRnBibVZ5SUQwZ0pDaGtiMk4xYldWdWRDNWpjbVZoZEdWRmJHVnRaVzUwS0Z3aVpHbDJYQ0lwS1M1aGRIUnlLSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ3aVkyeGhjM05jSWpvZ1hDSnpaV3hsWTNReUxXTnZiblJoYVc1bGNsd2lYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIMHBMbWgwYld3b1cxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYQ0k4WVNCb2NtVm1QU2RxWVhaaGMyTnlhWEIwT25admFXUW9NQ2tuSUc5dVkyeHBZMnM5SjNKbGRIVnliaUJtWVd4elpUc25JR05zWVhOelBTZHpaV3hsWTNReUxXTm9iMmxqWlNjZ2RHRmlhVzVrWlhnOUp5MHhKejVjSWl4Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGd2lJQ0FnUEhOd1lXNGdZMnhoYzNNOUozTmxiR1ZqZERJdFkyaHZjMlZ1Sno0bWJtSnpjRHM4TDNOd1lXNCtQR0ZpWW5JZ1kyeGhjM005SjNObGJHVmpkREl0YzJWaGNtTm9MV05vYjJsalpTMWpiRzl6WlNjK1BDOWhZbUp5UGx3aUxGeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYQ0lnSUNBOGMzQmhiaUJqYkdGemN6MG5jMlZzWldOME1pMWhjbkp2ZHljK1BHa2dZMnhoYzNNOUoyWmhJR1poTFhOdmNuUWdZbkpoYm1RdGFXNW1ieUJ6Wld4bFkzUXlMV1poSno0OEwyaytQQzl6Y0dGdVBsd2lMRnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWENJOEwyRStYQ0lzWEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0lqeHBibkIxZENCamJHRnpjejBuYzJWc1pXTjBNaTFtYjJOMWMzTmxjaUJ6Wld4bFkzUXlMVzltWm5OamNtVmxiaWNnZEhsd1pUMG5kR1Y0ZENjdlBsd2lMRnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWENJOFpHbDJJR05zWVhOelBTZHpaV3hsWTNReUxXUnliM0FnYzJWc1pXTjBNaTFrYVhOd2JHRjVMVzV2Ym1VblBsd2lMRnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWENJZ0lDQThaR2wySUdOc1lYTnpQU2R6Wld4bFkzUXlMWE5sWVhKamFDYytYQ0lzWEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0lpQWdJQ0FnSUNBOGFXNXdkWFFnZEhsd1pUMG5kR1Y0ZENjZ1lYVjBiMk52YlhCc1pYUmxQU2R2Wm1ZbklHRjFkRzlqYjNKeVpXTjBQU2R2Wm1ZbklHRjFkRzlqWVhCcGRHRnNhWHBsUFNkdlptWW5JSE53Wld4c1kyaGxZMnM5SjJaaGJITmxKeUJqYkdGemN6MG5jMlZzWldOME1pMXBibkIxZENjdlBsd2lMRnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWENJZ0lDQThMMlJwZGo1Y0lpeGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRndpSUNBZ1BIVnNJR05zWVhOelBTZHpaV3hsWTNReUxYSmxjM1ZzZEhNblBsd2lMRnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWENJZ0lDQThMM1ZzUGx3aUxGeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYQ0k4TDJScGRqNWNJbDB1YW05cGJpaGNJbHdpS1NrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUJqYjI1MFlXbHVaWEk3WEhKY2JpQWdJQ0FnSUNBZ2ZTeGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0x5OGdjMmx1WjJ4bFhISmNiaUFnSUNBZ0lDQWdaVzVoWW14bFNXNTBaWEptWVdObE9pQm1kVzVqZEdsdmJpZ3BJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdhV1lnS0hSb2FYTXVjR0Z5Wlc1MExtVnVZV0pzWlVsdWRHVnlabUZqWlM1aGNIQnNlU2gwYUdsekxDQmhjbWQxYldWdWRITXBLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbVp2WTNWemMyVnlMbkJ5YjNBb1hDSmthWE5oWW14bFpGd2lMQ0FoZEdocGN5NXBjMGx1ZEdWeVptRmpaVVZ1WVdKc1pXUW9LU2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnSUNCOUxGeHlYRzVjY2x4dUlDQWdJQ0FnSUNBdkx5QnphVzVuYkdWY2NseHVJQ0FnSUNBZ0lDQnZjR1Z1YVc1bk9pQm1kVzVqZEdsdmJpQW9LU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSFpoY2lCbGJDd2djbUZ1WjJVc0lHeGxianRjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUdsbUlDaDBhR2x6TG05d2RITXViV2x1YVcxMWJWSmxjM1ZzZEhOR2IzSlRaV0Z5WTJnZ1BqMGdNQ2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTV6YUc5M1UyVmhjbU5vS0hSeWRXVXBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxuQmhjbVZ1ZEM1dmNHVnVhVzVuTG1Gd2NHeDVLSFJvYVhNc0lHRnlaM1Z0Wlc1MGN5azdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2RHaHBjeTV6YUc5M1UyVmhjbU5vU1c1d2RYUWdJVDA5SUdaaGJITmxLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBdkx5QkpSU0JoY0hCbGJtUnpJR1p2WTNWemMyVnlMblpoYkNncElHRjBJSFJvWlNCbGJtUWdiMllnWm1sbGJHUWdPaThnYzI4Z2QyVWdiV0Z1ZFdGc2JIa2dhVzV6WlhKMElHbDBJR0YwSUhSb1pTQmlaV2RwYm01cGJtY2dkWE5wYm1jZ1lTQnlZVzVuWlZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0x5OGdZV3hzSUc5MGFHVnlJR0p5YjNkelpYSnpJR2hoYm1Sc1pTQjBhR2x6SUdwMWMzUWdabWx1WlZ4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdWMyVmhjbU5vTG5aaGJDaDBhR2x6TG1adlkzVnpjMlZ5TG5aaGJDZ3BLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG5ObFlYSmphQzVtYjJOMWN5Z3BPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQXZMeUJ0YjNabElIUm9aU0JqZFhKemIzSWdkRzhnZEdobElHVnVaQ0JoWm5SbGNpQm1iMk4xYzNOcGJtY3NJRzkwYUdWeWQybHpaU0JwZENCM2FXeHNJR0psSUdGMElIUm9aU0JpWldkcGJtNXBibWNnWVc1a1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUM4dklHNWxkeUIwWlhoMElIZHBiR3dnWVhCd1pXRnlJQ3BpWldadmNtVXFJR1p2WTNWemMyVnlMblpoYkNncFhISmNiaUFnSUNBZ0lDQWdJQ0FnSUdWc0lEMGdkR2hwY3k1elpXRnlZMmd1WjJWMEtEQXBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQnBaaUFvWld3dVkzSmxZWFJsVkdWNGRGSmhibWRsS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlZVzVuWlNBOUlHVnNMbU55WldGMFpWUmxlSFJTWVc1blpTZ3BPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY21GdVoyVXVZMjlzYkdGd2MyVW9abUZzYzJVcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbUZ1WjJVdWMyVnNaV04wS0NrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUgwZ1pXeHpaU0JwWmlBb1pXd3VjMlYwVTJWc1pXTjBhVzl1VW1GdVoyVXBJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd4bGJpQTlJSFJvYVhNdWMyVmhjbU5vTG5aaGJDZ3BMbXhsYm1kMGFEdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR1ZzTG5ObGRGTmxiR1ZqZEdsdmJsSmhibWRsS0d4bGJpd2diR1Z1S1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0x5OGdhVzVwZEdsaGJHbDZaWE1nYzJWaGNtTm9KM01nZG1Gc2RXVWdkMmwwYUNCdVpYaDBVMlZoY21Ob1ZHVnliU0FvYVdZZ1pHVm1hVzVsWkNCaWVTQjFjMlZ5S1Z4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0F2THlCcFoyNXZjbVVnYm1WNGRGTmxZWEpqYUZSbGNtMGdhV1lnZEdobElHUnliM0JrYjNkdUlHbHpJRzl3Wlc1bFpDQmllU0IwYUdVZ2RYTmxjaUJ3Y21WemMybHVaeUJoSUd4bGRIUmxjbHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQnBaaWgwYUdsekxuTmxZWEpqYUM1MllXd29LU0E5UFQwZ1hDSmNJaWtnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWW9kR2hwY3k1dVpYaDBVMlZoY21Ob1ZHVnliU0FoUFNCMWJtUmxabWx1WldRcGUxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVjMlZoY21Ob0xuWmhiQ2gwYUdsekxtNWxlSFJUWldGeVkyaFVaWEp0S1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxuTmxZWEpqYUM1elpXeGxZM1FvS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1bWIyTjFjM05sY2k1d2NtOXdLRndpWkdsellXSnNaV1JjSWl3Z2RISjFaU2t1ZG1Gc0tGd2lYQ0lwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxuVndaR0YwWlZKbGMzVnNkSE1vZEhKMVpTazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11YjNCMGN5NWxiR1Z0Wlc1MExuUnlhV2RuWlhJb0pDNUZkbVZ1ZENoY0luTmxiR1ZqZERJdGIzQmxibHdpS1NrN1hISmNiaUFnSUNBZ0lDQWdmU3hjY2x4dVhISmNiaUFnSUNBZ0lDQWdMeThnYzJsdVoyeGxYSEpjYmlBZ0lDQWdJQ0FnWTJ4dmMyVTZJR1oxYm1OMGFXOXVJQ2h3WVhKaGJYTXBJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdhV1lnS0NGMGFHbHpMbTl3Wlc1bFpDZ3BLU0J5WlhSMWNtNDdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11Y0dGeVpXNTBMbU5zYjNObExtRndjR3g1S0hSb2FYTXNJR0Z5WjNWdFpXNTBjeWs3WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNCd1lYSmhiWE1nUFNCd1lYSmhiWE1nZkh3Z2UyWnZZM1Z6T2lCMGNuVmxmVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1bWIyTjFjM05sY2k1eVpXMXZkbVZCZEhSeUtGd2laR2x6WVdKc1pXUmNJaWs3WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNCcFppQW9jR0Z5WVcxekxtWnZZM1Z6S1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG1adlkzVnpjMlZ5TG1adlkzVnpLQ2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnSUNCOUxGeHlYRzVjY2x4dUlDQWdJQ0FnSUNBdkx5QnphVzVuYkdWY2NseHVJQ0FnSUNBZ0lDQm1iMk4xY3pvZ1puVnVZM1JwYjI0Z0tDa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQnBaaUFvZEdocGN5NXZjR1Z1WldRb0tTa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NWpiRzl6WlNncE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCOUlHVnNjMlVnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTVtYjJOMWMzTmxjaTV5WlcxdmRtVkJkSFJ5S0Z3aVpHbHpZV0pzWldSY0lpazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxtWnZZM1Z6YzJWeUxtWnZZM1Z6S0NrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ0lDQjlMRnh5WEc1Y2NseHVJQ0FnSUNBZ0lDQXZMeUJ6YVc1bmJHVmNjbHh1SUNBZ0lDQWdJQ0JwYzBadlkzVnpaV1E2SUdaMWJtTjBhVzl1SUNncElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUhSb2FYTXVZMjl1ZEdGcGJtVnlMbWhoYzBOc1lYTnpLRndpYzJWc1pXTjBNaTFqYjI1MFlXbHVaWEl0WVdOMGFYWmxYQ0lwTzF4eVhHNGdJQ0FnSUNBZ0lIMHNYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDOHZJSE5wYm1kc1pWeHlYRzRnSUNBZ0lDQWdJR05oYm1ObGJEb2dablZ1WTNScGIyNGdLQ2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxuQmhjbVZ1ZEM1allXNWpaV3d1WVhCd2JIa29kR2hwY3l3Z1lYSm5kVzFsYm5SektUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTVtYjJOMWMzTmxjaTV5WlcxdmRtVkJkSFJ5S0Z3aVpHbHpZV0pzWldSY0lpazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11Wm05amRYTnpaWEl1Wm05amRYTW9LVHRjY2x4dUlDQWdJQ0FnSUNCOUxGeHlYRzVjY2x4dUlDQWdJQ0FnSUNBdkx5QnphVzVuYkdWY2NseHVJQ0FnSUNBZ0lDQmtaWE4wY205NU9pQm1kVzVqZEdsdmJpZ3BJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdKQ2hjSW14aFltVnNXMlp2Y2owblhDSWdLeUIwYUdsekxtWnZZM1Z6YzJWeUxtRjBkSElvSjJsa0p5a2dLeUJjSWlkZFhDSXBYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0F1WVhSMGNpZ25abTl5Snl3Z2RHaHBjeTV2Y0hSekxtVnNaVzFsYm5RdVlYUjBjaWhjSW1sa1hDSXBLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1d1lYSmxiblF1WkdWemRISnZlUzVoY0hCc2VTaDBhR2x6TENCaGNtZDFiV1Z1ZEhNcE8xeHlYRzRnSUNBZ0lDQWdJSDBzWEhKY2JseHlYRzRnSUNBZ0lDQWdJQzh2SUhOcGJtZHNaVnh5WEc0Z0lDQWdJQ0FnSUdsdWFYUkRiMjUwWVdsdVpYSTZJR1oxYm1OMGFXOXVJQ2dwSUh0Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIWmhjaUJ6Wld4bFkzUnBiMjRzWEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCamIyNTBZV2x1WlhJZ1BTQjBhR2x6TG1OdmJuUmhhVzVsY2l4Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHUnliM0JrYjNkdUlEMGdkR2hwY3k1a2NtOXdaRzkzYmp0Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2gwYUdsekxtOXdkSE11YldsdWFXMTFiVkpsYzNWc2RITkdiM0pUWldGeVkyZ2dQQ0F3S1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG5Ob2IzZFRaV0Z5WTJnb1ptRnNjMlVwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0I5SUdWc2MyVWdlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NXphRzkzVTJWaGNtTm9LSFJ5ZFdVcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCOVhISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG5ObGJHVmpkR2x2YmlBOUlITmxiR1ZqZEdsdmJpQTlJR052Ym5SaGFXNWxjaTVtYVc1a0tGd2lMbk5sYkdWamRESXRZMmh2YVdObFhDSXBPMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NW1iMk4xYzNObGNpQTlJR052Ym5SaGFXNWxjaTVtYVc1a0tGd2lMbk5sYkdWamRESXRabTlqZFhOelpYSmNJaWs3WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNBdkx5QnlaWGR5YVhSbElHeGhZbVZzY3lCbWNtOXRJRzl5YVdkcGJtRnNJR1ZzWlcxbGJuUWdkRzhnWm05amRYTnpaWEpjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1bWIyTjFjM05sY2k1aGRIUnlLRndpYVdSY0lpd2dYQ0p6TW1sa1gyRjFkRzluWlc1Y0lpdHVaWGgwVldsa0tDa3BPMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSkNoY0lteGhZbVZzVzJadmNqMG5YQ0lnS3lCMGFHbHpMbTl3ZEhNdVpXeGxiV1Z1ZEM1aGRIUnlLRndpYVdSY0lpa2dLeUJjSWlkZFhDSXBYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0F1WVhSMGNpZ25abTl5Snl3Z2RHaHBjeTVtYjJOMWMzTmxjaTVoZEhSeUtDZHBaQ2NwS1R0Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11Wm05amRYTnpaWEl1WVhSMGNpaGNJblJoWW1sdVpHVjRYQ0lzSUhSb2FYTXVaV3hsYldWdWRGUmhZa2x1WkdWNEtUdGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdWMyVmhjbU5vTG05dUtGd2lhMlY1Wkc5M2Jsd2lMQ0IwYUdsekxtSnBibVFvWm5WdVkzUnBiMjRnS0dVcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtSUNnaGRHaHBjeTVwYzBsdWRHVnlabUZqWlVWdVlXSnNaV1FvS1NrZ2NtVjBkWEp1TzF4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtSUNobExuZG9hV05vSUQwOVBTQkxSVmt1VUVGSFJWOVZVQ0I4ZkNCbExuZG9hV05vSUQwOVBTQkxSVmt1VUVGSFJWOUVUMWRPS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnTHk4Z2NISmxkbVZ1ZENCMGFHVWdjR0ZuWlNCbWNtOXRJSE5qY205c2JHbHVaMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHdHBiR3hGZG1WdWRDaGxLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200N1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2MzZHBkR05vSUNobExuZG9hV05vS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWTJGelpTQkxSVmt1VlZBNlhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWTJGelpTQkxSVmt1UkU5WFRqcGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1dGIzWmxTR2xuYUd4cFoyaDBLQ2hsTG5kb2FXTm9JRDA5UFNCTFJWa3VWVkFwSUQ4Z0xURWdPaUF4S1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2EybHNiRVYyWlc1MEtHVXBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J5WlhSMWNtNDdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1kyRnpaU0JMUlZrdVJVNVVSVkk2WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVjMlZzWldOMFNHbG5hR3hwWjJoMFpXUW9LVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYTJsc2JFVjJaVzUwS0dVcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200N1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWTJGelpTQkxSVmt1VkVGQ09seHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQXZMeUJwWmlCelpXeGxZM1JQYmtKc2RYSWdQVDBnZEhKMVpTd2djMlZzWldOMElIUm9aU0JqZFhKeVpXNTBiSGtnYUdsbmFHeHBaMmgwWldRZ2IzQjBhVzl1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbUlDaDBhR2x6TG05d2RITXVjMlZzWldOMFQyNUNiSFZ5S1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxuTmxiR1ZqZEVocFoyaHNhV2RvZEdWa0tIdHViMFp2WTNWek9pQjBjblZsZlNrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdU8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdOaGMyVWdTMFZaTGtWVFF6cGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1allXNWpaV3dvWlNrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHdHBiR3hGZG1WdWRDaGxLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY21WMGRYSnVPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0I5S1NrN1hISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG5ObFlYSmphQzV2YmloY0ltSnNkWEpjSWl3Z2RHaHBjeTVpYVc1a0tHWjFibU4wYVc5dUtHVXBJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUM4dklHRWdkMjl5YTJGeWIzVnVaQ0JtYjNJZ1kyaHliMjFsSUhSdklHdGxaWEFnZEdobElITmxZWEpqYUNCbWFXVnNaQ0JtYjJOMWMzTmxaQ0IzYUdWdUlIUm9aU0J6WTNKdmJHd2dZbUZ5SUdseklIVnpaV1FnZEc4Z2MyTnliMnhzSUhSb1pTQmtjbTl3Wkc5M2JpNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQzh2SUhkcGRHaHZkWFFnZEdocGN5QjBhR1VnYzJWaGNtTm9JR1pwWld4a0lHeHZjMlZ6SUdadlkzVnpJSGRvYVdOb0lHbHpJR0Z1Ym05NWFXNW5YSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb1pHOWpkVzFsYm5RdVlXTjBhWFpsUld4bGJXVnVkQ0E5UFQwZ2RHaHBjeTVpYjJSNUtDa3VaMlYwS0RBcEtTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2QybHVaRzkzTG5ObGRGUnBiV1Z2ZFhRb2RHaHBjeTVpYVc1a0tHWjFibU4wYVc5dUtDa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxuTmxZWEpqYUM1bWIyTjFjeWdwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDBwTENBd0tUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdmU2twTzF4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTVtYjJOMWMzTmxjaTV2YmloY0ltdGxlV1J2ZDI1Y0lpd2dkR2hwY3k1aWFXNWtLR1oxYm1OMGFXOXVJQ2hsS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaaUFvSVhSb2FYTXVhWE5KYm5SbGNtWmhZMlZGYm1GaWJHVmtLQ2twSUhKbGRIVnlianRjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaaUFvWlM1M2FHbGphQ0E5UFQwZ1MwVlpMbFJCUWlCOGZDQkxSVmt1YVhORGIyNTBjbTlzS0dVcElIeDhJRXRGV1M1cGMwWjFibU4wYVc5dVMyVjVLR1VwSUh4OElHVXVkMmhwWTJnZ1BUMDlJRXRGV1M1RlUwTXBJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200N1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLSFJvYVhNdWIzQjBjeTV2Y0dWdVQyNUZiblJsY2lBOVBUMGdabUZzYzJVZ0ppWWdaUzUzYUdsamFDQTlQVDBnUzBWWkxrVk9WRVZTS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYTJsc2JFVjJaVzUwS0dVcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhKbGRIVnlianRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb1pTNTNhR2xqYUNBOVBTQkxSVmt1UkU5WFRpQjhmQ0JsTG5kb2FXTm9JRDA5SUV0RldTNVZVRnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIeDhJQ2hsTG5kb2FXTm9JRDA5SUV0RldTNUZUbFJGVWlBbUppQjBhR2x6TG05d2RITXViM0JsYms5dVJXNTBaWElwS1NCN1hISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2hsTG1Gc2RFdGxlU0I4ZkNCbExtTjBjbXhMWlhrZ2ZId2daUzV6YUdsbWRFdGxlU0I4ZkNCbExtMWxkR0ZMWlhrcElISmxkSFZ5Ymp0Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTV2Y0dWdUtDazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2EybHNiRVYyWlc1MEtHVXBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lISmxkSFZ5Ymp0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFppQW9aUzUzYUdsamFDQTlQU0JMUlZrdVJFVk1SVlJGSUh4OElHVXVkMmhwWTJnZ1BUMGdTMFZaTGtKQlEwdFRVRUZEUlNrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbUlDaDBhR2x6TG05d2RITXVZV3hzYjNkRGJHVmhjaWtnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbU5zWldGeUtDazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd0cGJHeEZkbVZ1ZENobEtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTQ3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUgwcEtUdGNjbHh1WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNCcGJuTjBZV3hzUzJWNVZYQkRhR0Z1WjJWRmRtVnVkQ2gwYUdsekxtWnZZM1Z6YzJWeUtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTVtYjJOMWMzTmxjaTV2YmloY0ltdGxlWFZ3TFdOb1lXNW5aU0JwYm5CMWRGd2lMQ0IwYUdsekxtSnBibVFvWm5WdVkzUnBiMjRvWlNrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1lnS0hSb2FYTXViM0IwY3k1dGFXNXBiWFZ0VW1WemRXeDBjMFp2Y2xObFlYSmphQ0ErUFNBd0tTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1pTNXpkRzl3VUhKdmNHRm5ZWFJwYjI0b0tUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFppQW9kR2hwY3k1dmNHVnVaV1FvS1NrZ2NtVjBkWEp1TzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdWIzQmxiaWdwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCOUtTazdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0J6Wld4bFkzUnBiMjR1YjI0b1hDSnRiM1Z6WldSdmQyNWNJaXdnWENKaFltSnlYQ0lzSUhSb2FYTXVZbWx1WkNobWRXNWpkR2x2YmlBb1pTa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tDRjBhR2x6TG1selNXNTBaWEptWVdObFJXNWhZbXhsWkNncEtTQnlaWFIxY200N1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG1Oc1pXRnlLQ2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcmFXeHNSWFpsYm5SSmJXMWxaR2xoZEdWc2VTaGxLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVZMnh2YzJVb0tUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdWMyVnNaV04wYVc5dUxtWnZZM1Z6S0NrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUgwcEtUdGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSE5sYkdWamRHbHZiaTV2YmloY0ltMXZkWE5sWkc5M2Jsd2lMQ0IwYUdsekxtSnBibVFvWm5WdVkzUnBiMjRnS0dVcElIdGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFppQW9JWFJvYVhNdVkyOXVkR0ZwYm1WeUxtaGhjME5zWVhOektGd2ljMlZzWldOME1pMWpiMjUwWVdsdVpYSXRZV04wYVhabFhDSXBLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1dmNIUnpMbVZzWlcxbGJuUXVkSEpwWjJkbGNpZ2tMa1YyWlc1MEtGd2ljMlZzWldOME1pMW1iMk4xYzF3aUtTazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1lnS0hSb2FYTXViM0JsYm1Wa0tDa3BJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG1Oc2IzTmxLQ2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOUlHVnNjMlVnYVdZZ0tIUm9hWE11YVhOSmJuUmxjbVpoWTJWRmJtRmliR1ZrS0NrcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbTl3Wlc0b0tUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnJhV3hzUlhabGJuUW9aU2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSDBwS1R0Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lHUnliM0JrYjNkdUxtOXVLRndpYlc5MWMyVmtiM2R1WENJc0lIUm9hWE11WW1sdVpDaG1kVzVqZEdsdmJpZ3BJSHNnZEdocGN5NXpaV0Z5WTJndVptOWpkWE1vS1RzZ2ZTa3BPMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnYzJWc1pXTjBhVzl1TG05dUtGd2labTlqZFhOY0lpd2dkR2hwY3k1aWFXNWtLR1oxYm1OMGFXOXVLR1VwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHdHBiR3hGZG1WdWRDaGxLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdmU2twTzF4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTVtYjJOMWMzTmxjaTV2YmloY0ltWnZZM1Z6WENJc0lIUm9hWE11WW1sdVpDaG1kVzVqZEdsdmJpZ3BlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tDRjBhR2x6TG1OdmJuUmhhVzVsY2k1b1lYTkRiR0Z6Y3loY0luTmxiR1ZqZERJdFkyOXVkR0ZwYm1WeUxXRmpkR2wyWlZ3aUtTa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11YjNCMGN5NWxiR1Z0Wlc1MExuUnlhV2RuWlhJb0pDNUZkbVZ1ZENoY0luTmxiR1ZqZERJdFptOWpkWE5jSWlrcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NWpiMjUwWVdsdVpYSXVZV1JrUTJ4aGMzTW9YQ0p6Wld4bFkzUXlMV052Ym5SaGFXNWxjaTFoWTNScGRtVmNJaWs3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSDBwS1M1dmJpaGNJbUpzZFhKY0lpd2dkR2hwY3k1aWFXNWtLR1oxYm1OMGFXOXVLQ2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLQ0YwYUdsekxtOXdaVzVsWkNncEtTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTVqYjI1MFlXbHVaWEl1Y21WdGIzWmxRMnhoYzNNb1hDSnpaV3hsWTNReUxXTnZiblJoYVc1bGNpMWhZM1JwZG1WY0lpazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTV2Y0hSekxtVnNaVzFsYm5RdWRISnBaMmRsY2lna0xrVjJaVzUwS0Z3aWMyVnNaV04wTWkxaWJIVnlYQ0lwS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2ZTa3BPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG5ObFlYSmphQzV2YmloY0ltWnZZM1Z6WENJc0lIUm9hWE11WW1sdVpDaG1kVzVqZEdsdmJpZ3BlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tDRjBhR2x6TG1OdmJuUmhhVzVsY2k1b1lYTkRiR0Z6Y3loY0luTmxiR1ZqZERJdFkyOXVkR0ZwYm1WeUxXRmpkR2wyWlZ3aUtTa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11YjNCMGN5NWxiR1Z0Wlc1MExuUnlhV2RuWlhJb0pDNUZkbVZ1ZENoY0luTmxiR1ZqZERJdFptOWpkWE5jSWlrcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NWpiMjUwWVdsdVpYSXVZV1JrUTJ4aGMzTW9YQ0p6Wld4bFkzUXlMV052Ym5SaGFXNWxjaTFoWTNScGRtVmNJaWs3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSDBwS1R0Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11YVc1cGRFTnZiblJoYVc1bGNsZHBaSFJvS0NrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUhSb2FYTXViM0IwY3k1bGJHVnRaVzUwTG1Ga1pFTnNZWE56S0Z3aWMyVnNaV04wTWkxdlptWnpZM0psWlc1Y0lpazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11YzJWMFVHeGhZMlZvYjJ4a1pYSW9LVHRjY2x4dVhISmNiaUFnSUNBZ0lDQWdmU3hjY2x4dVhISmNiaUFnSUNBZ0lDQWdMeThnYzJsdVoyeGxYSEpjYmlBZ0lDQWdJQ0FnWTJ4bFlYSTZJR1oxYm1OMGFXOXVLSFJ5YVdkblpYSkRhR0Z1WjJVcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RtRnlJR1JoZEdFOWRHaHBjeTV6Wld4bFkzUnBiMjR1WkdGMFlTaGNJbk5sYkdWamRESXRaR0YwWVZ3aUtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLR1JoZEdFcElIc2dMeThnWjNWaGNtUWdZV2RoYVc1emRDQnhkV1YxWldRZ2NYVnBZMnNnWTI5dWMyVmpkWFJwZG1VZ1kyeHBZMnR6WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMllYSWdjR3hoWTJWb2IyeGtaWEpQY0hScGIyNGdQU0IwYUdsekxtZGxkRkJzWVdObGFHOXNaR1Z5VDNCMGFXOXVLQ2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbTl3ZEhNdVpXeGxiV1Z1ZEM1MllXd29jR3hoWTJWb2IyeGtaWEpQY0hScGIyNGdQeUJ3YkdGalpXaHZiR1JsY2s5d2RHbHZiaTUyWVd3b0tTQTZJRndpWENJcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1elpXeGxZM1JwYjI0dVptbHVaQ2hjSWk1elpXeGxZM1F5TFdOb2IzTmxibHdpS1M1bGJYQjBlU2dwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTV6Wld4bFkzUnBiMjR1Y21WdGIzWmxSR0YwWVNoY0luTmxiR1ZqZERJdFpHRjBZVndpS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11YzJWMFVHeGhZMlZvYjJ4a1pYSW9LVHRjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaaUFvZEhKcFoyZGxja05vWVc1blpTQWhQVDBnWm1Gc2MyVXBlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11YjNCMGN5NWxiR1Z0Wlc1MExuUnlhV2RuWlhJb2V5QjBlWEJsT2lCY0luTmxiR1ZqZERJdGNtVnRiM1psWkZ3aUxDQjJZV3c2SUhSb2FYTXVhV1FvWkdGMFlTa3NJR05vYjJsalpUb2daR0YwWVNCOUtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMblJ5YVdkblpYSkRhR0Z1WjJVb2UzSmxiVzkyWldRNlpHRjBZWDBwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lDQWdmU3hjY2x4dVhISmNiaUFnSUNBZ0lDQWdMeW9xWEhKY2JpQWdJQ0FnSUNBZ0lDb2dVMlYwY3lCelpXeGxZM1JwYjI0Z1ltRnpaV1FnYjI0Z2MyOTFjbU5sSUdWc1pXMWxiblFuY3lCMllXeDFaVnh5WEc0Z0lDQWdJQ0FnSUNBcUwxeHlYRzRnSUNBZ0lDQWdJQzh2SUhOcGJtZHNaVnh5WEc0Z0lDQWdJQ0FnSUdsdWFYUlRaV3hsWTNScGIyNDZJR1oxYm1OMGFXOXVJQ2dwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZG1GeUlITmxiR1ZqZEdWa08xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCcFppQW9kR2hwY3k1cGMxQnNZV05sYUc5c1pHVnlUM0IwYVc5dVUyVnNaV04wWldRb0tTa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NTFjR1JoZEdWVFpXeGxZM1JwYjI0b2JuVnNiQ2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbU5zYjNObEtDazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxuTmxkRkJzWVdObGFHOXNaR1Z5S0NrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUgwZ1pXeHpaU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMllYSWdjMlZzWmlBOUlIUm9hWE03WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbTl3ZEhNdWFXNXBkRk5sYkdWamRHbHZiaTVqWVd4c0tHNTFiR3dzSUhSb2FYTXViM0IwY3k1bGJHVnRaVzUwTENCbWRXNWpkR2x2YmloelpXeGxZM1JsWkNsN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tITmxiR1ZqZEdWa0lDRTlQU0IxYm1SbFptbHVaV1FnSmlZZ2MyVnNaV04wWldRZ0lUMDlJRzUxYkd3cElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjMlZzWmk1MWNHUmhkR1ZUWld4bFkzUnBiMjRvYzJWc1pXTjBaV1FwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCelpXeG1MbU5zYjNObEtDazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSE5sYkdZdWMyVjBVR3hoWTJWb2IyeGtaWElvS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOUtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQWdJSDBzWEhKY2JseHlYRzRnSUNBZ0lDQWdJR2x6VUd4aFkyVm9iMnhrWlhKUGNIUnBiMjVUWld4bFkzUmxaRG9nWm5WdVkzUnBiMjRvS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUhaaGNpQndiR0ZqWldodmJHUmxjazl3ZEdsdmJqdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLQ0YwYUdsekxtOXdkSE11Y0d4aFkyVm9iMnhrWlhJcElISmxkSFZ5YmlCbVlXeHpaVHNnTHk4Z2JtOGdjR3hoWTJWb2IyeGtaWElnYzNCbFkybG1hV1ZrSUhOdklHNXZJRzl3ZEdsdmJpQnphRzkxYkdRZ1ltVWdZMjl1YzJsa1pYSmxaRnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z0tDaHdiR0ZqWldodmJHUmxjazl3ZEdsdmJpQTlJSFJvYVhNdVoyVjBVR3hoWTJWb2IyeGtaWEpQY0hScGIyNG9LU2tnSVQwOUlIVnVaR1ZtYVc1bFpDQW1KaUJ3YkdGalpXaHZiR1JsY2s5d2RHbHZiaTVwY3lnbk9uTmxiR1ZqZEdWa0p5a3BYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I4ZkNBb2RHaHBjeTV2Y0hSekxtVnNaVzFsYm5RdWRtRnNLQ2tnUFQwOUlGd2lYQ0lwWEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOGZDQW9kR2hwY3k1dmNIUnpMbVZzWlcxbGJuUXVkbUZzS0NrZ1BUMDlJSFZ1WkdWbWFXNWxaQ2xjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUh4OElDaDBhR2x6TG05d2RITXVaV3hsYldWdWRDNTJZV3dvS1NBOVBUMGdiblZzYkNrN1hISmNiaUFnSUNBZ0lDQWdmU3hjY2x4dVhISmNiaUFnSUNBZ0lDQWdMeThnYzJsdVoyeGxYSEpjYmlBZ0lDQWdJQ0FnY0hKbGNHRnlaVTl3ZEhNNklHWjFibU4wYVc5dUlDZ3BJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdkbUZ5SUc5d2RITWdQU0IwYUdsekxuQmhjbVZ1ZEM1d2NtVndZWEpsVDNCMGN5NWhjSEJzZVNoMGFHbHpMQ0JoY21kMWJXVnVkSE1wTEZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2MyVnNaajEwYUdsek8xeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdhV1lnS0c5d2RITXVaV3hsYldWdWRDNW5aWFFvTUNrdWRHRm5UbUZ0WlM1MGIweHZkMlZ5UTJGelpTZ3BJRDA5UFNCY0luTmxiR1ZqZEZ3aUtTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0F2THlCcGJuTjBZV3hzSUhSb1pTQnpaV3hsWTNScGIyNGdhVzVwZEdsaGJHbDZaWEpjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUc5d2RITXVhVzVwZEZObGJHVmpkR2x2YmlBOUlHWjFibU4wYVc5dUlDaGxiR1Z0Wlc1MExDQmpZV3hzWW1GamF5a2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIWmhjaUJ6Wld4bFkzUmxaQ0E5SUdWc1pXMWxiblF1Wm1sdVpDaGNJanB6Wld4bFkzUmxaRndpS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0F2THlCaElITnBibWRzWlNCelpXeGxZM1FnWW05NElHRnNkMkY1Y3lCb1lYTWdZU0IyWVd4MVpTd2dibThnYm1WbFpDQjBieUJ1ZFd4c0lHTm9aV05ySUNkelpXeGxZM1JsWkNkY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JqWVd4c1ltRmpheWh6Wld4bUxtOXdkR2x2YmxSdlJHRjBZU2h6Wld4bFkzUmxaQ2twTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2ZTQmxiSE5sSUdsbUlDaGNJbVJoZEdGY0lpQnBiaUJ2Y0hSektTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0F2THlCcGJuTjBZV3hzSUdSbFptRjFiSFFnYVc1cGRGTmxiR1ZqZEdsdmJpQjNhR1Z1SUdGd2NHeHBaV1FnZEc4Z2FHbGtaR1Z1SUdsdWNIVjBJR0Z1WkNCa1lYUmhJR2x6SUd4dlkyRnNYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J2Y0hSekxtbHVhWFJUWld4bFkzUnBiMjRnUFNCdmNIUnpMbWx1YVhSVFpXeGxZM1JwYjI0Z2ZId2dablZ1WTNScGIyNGdLR1ZzWlcxbGJuUXNJR05oYkd4aVlXTnJLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkbUZ5SUdsa0lEMGdaV3hsYldWdWRDNTJZV3dvS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0F2TDNObFlYSmphQ0JwYmlCa1lYUmhJR0o1SUdsa0xDQnpkRzl5YVc1bklIUm9aU0JoWTNSMVlXd2diV0YwWTJocGJtY2dhWFJsYlZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFpoY2lCdFlYUmphQ0E5SUc1MWJHdzdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2IzQjBjeTV4ZFdWeWVTaDdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRzFoZEdOb1pYSTZJR1oxYm1OMGFXOXVLSFJsY20wc0lIUmxlSFFzSUdWc0tYdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhaaGNpQnBjMTl0WVhSamFDQTlJR1Z4ZFdGc0tHbGtMQ0J2Y0hSekxtbGtLR1ZzS1NrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2FYTmZiV0YwWTJncElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnRZWFJqYUNBOUlHVnNPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJR2x6WDIxaGRHTm9PMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5TEZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCallXeHNZbUZqYXpvZ0lTUXVhWE5HZFc1amRHbHZiaWhqWVd4c1ltRmpheWtnUHlBa0xtNXZiM0FnT2lCbWRXNWpkR2x2YmlncElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdOaGJHeGlZV05yS0cxaGRHTm9LVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDBwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlHOXdkSE03WEhKY2JpQWdJQ0FnSUNBZ2ZTeGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0x5OGdjMmx1WjJ4bFhISmNiaUFnSUNBZ0lDQWdaMlYwVUd4aFkyVm9iMnhrWlhJNklHWjFibU4wYVc5dUtDa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQXZMeUJwWmlCaElIQnNZV05sYUc5c1pHVnlJR2x6SUhOd1pXTnBabWxsWkNCdmJpQmhJSE5wYm1kc1pTQnpaV3hsWTNRZ2QybDBhRzkxZENCaElIWmhiR2xrSUhCc1lXTmxhRzlzWkdWeUlHOXdkR2x2YmlCcFoyNXZjbVVnYVhSY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tIUm9hWE11YzJWc1pXTjBLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFppQW9kR2hwY3k1blpYUlFiR0ZqWldodmJHUmxjazl3ZEdsdmJpZ3BJRDA5UFNCMWJtUmxabWx1WldRcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnZFc1a1pXWnBibVZrTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCOVhISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z2RHaHBjeTV3WVhKbGJuUXVaMlYwVUd4aFkyVm9iMnhrWlhJdVlYQndiSGtvZEdocGN5d2dZWEpuZFcxbGJuUnpLVHRjY2x4dUlDQWdJQ0FnSUNCOUxGeHlYRzVjY2x4dUlDQWdJQ0FnSUNBdkx5QnphVzVuYkdWY2NseHVJQ0FnSUNBZ0lDQnpaWFJRYkdGalpXaHZiR1JsY2pvZ1puVnVZM1JwYjI0Z0tDa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjJZWElnY0d4aFkyVm9iMnhrWlhJZ1BTQjBhR2x6TG1kbGRGQnNZV05sYUc5c1pHVnlLQ2s3WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNCcFppQW9kR2hwY3k1cGMxQnNZV05sYUc5c1pHVnlUM0IwYVc5dVUyVnNaV04wWldRb0tTQW1KaUJ3YkdGalpXaHZiR1JsY2lBaFBUMGdkVzVrWldacGJtVmtLU0I3WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdMeThnWTJobFkyc2dabTl5SUdFZ2NHeGhZMlZvYjJ4a1pYSWdiM0IwYVc5dUlHbG1JR0YwZEdGamFHVmtJSFJ2SUdFZ2MyVnNaV04wWEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFppQW9kR2hwY3k1elpXeGxZM1FnSmlZZ2RHaHBjeTVuWlhSUWJHRmpaV2h2YkdSbGNrOXdkR2x2YmlncElEMDlQU0IxYm1SbFptbHVaV1FwSUhKbGRIVnlianRjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG5ObGJHVmpkR2x2Ymk1bWFXNWtLRndpTG5ObGJHVmpkREl0WTJodmMyVnVYQ0lwTG1oMGJXd29kR2hwY3k1dmNIUnpMbVZ6WTJGd1pVMWhjbXQxY0Nod2JHRmpaV2h2YkdSbGNpa3BPMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11YzJWc1pXTjBhVzl1TG1Ga1pFTnNZWE56S0Z3aWMyVnNaV04wTWkxa1pXWmhkV3gwWENJcE8xeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVZMjl1ZEdGcGJtVnlMbkpsYlc5MlpVTnNZWE56S0Z3aWMyVnNaV04wTWkxaGJHeHZkMk5zWldGeVhDSXBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJQ0FnZlN4Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnTHk4Z2MybHVaMnhsWEhKY2JpQWdJQ0FnSUNBZ2NHOXpkSEJ5YjJObGMzTlNaWE4xYkhSek9pQm1kVzVqZEdsdmJpQW9aR0YwWVN3Z2FXNXBkR2xoYkN3Z2JtOUlhV2RvYkdsbmFIUlZjR1JoZEdVcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RtRnlJSE5sYkdWamRHVmtJRDBnTUN3Z2MyVnNaaUE5SUhSb2FYTXNJSE5vYjNkVFpXRnlZMmhKYm5CMWRDQTlJSFJ5ZFdVN1hISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQXZMeUJtYVc1a0lIUm9aU0J6Wld4bFkzUmxaQ0JsYkdWdFpXNTBJR2x1SUhSb1pTQnlaWE4xYkhRZ2JHbHpkRnh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NW1hVzVrU0dsbmFHeHBaMmgwWVdKc1pVTm9iMmxqWlhNb0tTNWxZV05vTWlobWRXNWpkR2x2YmlBb2FTd2daV3h0S1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaaUFvWlhGMVlXd29jMlZzWmk1cFpDaGxiRzB1WkdGMFlTaGNJbk5sYkdWamRESXRaR0YwWVZ3aUtTa3NJSE5sYkdZdWIzQjBjeTVsYkdWdFpXNTBMblpoYkNncEtTa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lITmxiR1ZqZEdWa0lEMGdhVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z1ptRnNjMlU3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUgwcE8xeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdMeThnWVc1a0lHaHBaMmhzYVdkb2RDQnBkRnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQnBaaUFvYm05SWFXZG9iR2xuYUhSVmNHUmhkR1VnSVQwOUlHWmhiSE5sS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaaUFvYVc1cGRHbGhiQ0E5UFQwZ2RISjFaU0FtSmlCelpXeGxZM1JsWkNBK1BTQXdLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1b2FXZG9iR2xuYUhRb2MyVnNaV04wWldRcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmU0JsYkhObElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbWhwWjJoc2FXZG9kQ2d3S1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdMeThnYUdsa1pTQjBhR1VnYzJWaGNtTm9JR0p2ZUNCcFppQjBhR2x6SUdseklIUm9aU0JtYVhKemRDQjNaU0JuYjNRZ2RHaGxJSEpsYzNWc2RITWdZVzVrSUhSb1pYSmxJR0Z5WlNCbGJtOTFaMmdnYjJZZ2RHaGxiU0JtYjNJZ2MyVmhjbU5vWEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNCcFppQW9hVzVwZEdsaGJDQTlQVDBnZEhKMVpTa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZG1GeUlHMXBiaUE5SUhSb2FYTXViM0IwY3k1dGFXNXBiWFZ0VW1WemRXeDBjMFp2Y2xObFlYSmphRHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbUlDaHRhVzRnUGowZ01Da2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11YzJodmQxTmxZWEpqYUNoamIzVnVkRkpsYzNWc2RITW9aR0YwWVM1eVpYTjFiSFJ6S1NBK1BTQnRhVzRwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lDQWdmU3hjY2x4dVhISmNiaUFnSUNBZ0lDQWdMeThnYzJsdVoyeGxYSEpjYmlBZ0lDQWdJQ0FnYzJodmQxTmxZWEpqYURvZ1puVnVZM1JwYjI0b2MyaHZkMU5sWVhKamFFbHVjSFYwS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUdsbUlDaDBhR2x6TG5Ob2IzZFRaV0Z5WTJoSmJuQjFkQ0E5UFQwZ2MyaHZkMU5sWVhKamFFbHVjSFYwS1NCeVpYUjFjbTQ3WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbk5vYjNkVFpXRnlZMmhKYm5CMWRDQTlJSE5vYjNkVFpXRnlZMmhKYm5CMWREdGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdVpISnZjR1J2ZDI0dVptbHVaQ2hjSWk1elpXeGxZM1F5TFhObFlYSmphRndpS1M1MGIyZG5iR1ZEYkdGemN5aGNJbk5sYkdWamRESXRjMlZoY21Ob0xXaHBaR1JsYmx3aUxDQWhjMmh2ZDFObFlYSmphRWx1Y0hWMEtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTVrY205d1pHOTNiaTVtYVc1a0tGd2lMbk5sYkdWamRESXRjMlZoY21Ob1hDSXBMblJ2WjJkc1pVTnNZWE56S0Z3aWMyVnNaV04wTWkxdlptWnpZM0psWlc1Y0lpd2dJWE5vYjNkVFpXRnlZMmhKYm5CMWRDazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDOHZZV1JrSUZ3aWMyVnNaV04wTWkxM2FYUm9MWE5sWVhKamFHSnZlRndpSUhSdklIUm9aU0JqYjI1MFlXbHVaWElnYVdZZ2MyVmhjbU5vSUdKdmVDQnBjeUJ6YUc5M2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNBa0tIUm9hWE11WkhKdmNHUnZkMjRzSUhSb2FYTXVZMjl1ZEdGcGJtVnlLUzUwYjJkbmJHVkRiR0Z6Y3loY0luTmxiR1ZqZERJdGQybDBhQzF6WldGeVkyaGliM2hjSWl3Z2MyaHZkMU5sWVhKamFFbHVjSFYwS1R0Y2NseHVJQ0FnSUNBZ0lDQjlMRnh5WEc1Y2NseHVJQ0FnSUNBZ0lDQXZMeUJ6YVc1bmJHVmNjbHh1SUNBZ0lDQWdJQ0J2YmxObGJHVmpkRG9nWm5WdVkzUnBiMjRnS0dSaGRHRXNJRzl3ZEdsdmJuTXBJSHRjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUdsbUlDZ2hkR2hwY3k1MGNtbG5aMlZ5VTJWc1pXTjBLR1JoZEdFcEtTQjdJSEpsZEhWeWJqc2dmVnh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZG1GeUlHOXNaQ0E5SUhSb2FYTXViM0IwY3k1bGJHVnRaVzUwTG5aaGJDZ3BMRnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYjJ4a1JHRjBZU0E5SUhSb2FYTXVaR0YwWVNncE8xeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1dmNIUnpMbVZzWlcxbGJuUXVkbUZzS0hSb2FYTXVhV1FvWkdGMFlTa3BPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG5Wd1pHRjBaVk5sYkdWamRHbHZiaWhrWVhSaEtUdGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdWIzQjBjeTVsYkdWdFpXNTBMblJ5YVdkblpYSW9leUIwZVhCbE9pQmNJbk5sYkdWamRESXRjMlZzWldOMFpXUmNJaXdnZG1Gc09pQjBhR2x6TG1sa0tHUmhkR0VwTENCamFHOXBZMlU2SUdSaGRHRWdmU2s3WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbTVsZUhSVFpXRnlZMmhVWlhKdElEMGdkR2hwY3k1dmNIUnpMbTVsZUhSVFpXRnlZMmhVWlhKdEtHUmhkR0VzSUhSb2FYTXVjMlZoY21Ob0xuWmhiQ2dwS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NWpiRzl6WlNncE8xeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdhV1lnS0NGdmNIUnBiMjV6SUh4OElDRnZjSFJwYjI1ekxtNXZSbTlqZFhNcFhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG5ObGJHVmpkR2x2Ymk1bWIyTjFjeWdwTzF4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLQ0ZsY1hWaGJDaHZiR1FzSUhSb2FYTXVhV1FvWkdGMFlTa3BLU0I3SUhSb2FYTXVkSEpwWjJkbGNrTm9ZVzVuWlNoN1lXUmtaV1E2WkdGMFlTeHlaVzF2ZG1Wa09tOXNaRVJoZEdGOUtUc2dmVnh5WEc0Z0lDQWdJQ0FnSUgwc1hISmNibHh5WEc0Z0lDQWdJQ0FnSUM4dklITnBibWRzWlZ4eVhHNGdJQ0FnSUNBZ0lIVndaR0YwWlZObGJHVmpkR2x2YmpvZ1puVnVZM1JwYjI0Z0tHUmhkR0VwSUh0Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIWmhjaUJqYjI1MFlXbHVaWEk5ZEdocGN5NXpaV3hsWTNScGIyNHVabWx1WkNoY0lpNXpaV3hsWTNReUxXTm9iM05sYmx3aUtTd2dabTl5YldGMGRHVmtMQ0JqYzNORGJHRnpjenRjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVjMlZzWldOMGFXOXVMbVJoZEdFb1hDSnpaV3hsWTNReUxXUmhkR0ZjSWl3Z1pHRjBZU2s3WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNCamIyNTBZV2x1WlhJdVpXMXdkSGtvS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tHUmhkR0VnSVQwOUlHNTFiR3dwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHWnZjbTFoZEhSbFpEMTBhR2x6TG05d2RITXVabTl5YldGMFUyVnNaV04wYVc5dUtHUmhkR0VzSUdOdmJuUmhhVzVsY2l3Z2RHaHBjeTV2Y0hSekxtVnpZMkZ3WlUxaGNtdDFjQ2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdhV1lnS0dadmNtMWhkSFJsWkNBaFBUMGdkVzVrWldacGJtVmtLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCamIyNTBZV2x1WlhJdVlYQndaVzVrS0dadmNtMWhkSFJsWkNrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnWTNOelEyeGhjM005ZEdocGN5NXZjSFJ6TG1admNtMWhkRk5sYkdWamRHbHZia056YzBOc1lYTnpLR1JoZEdFc0lHTnZiblJoYVc1bGNpazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2hqYzNORGJHRnpjeUFoUFQwZ2RXNWtaV1pwYm1Wa0tTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JqYjI1MFlXbHVaWEl1WVdSa1EyeGhjM01vWTNOelEyeGhjM01wTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbk5sYkdWamRHbHZiaTV5WlcxdmRtVkRiR0Z6Y3loY0luTmxiR1ZqZERJdFpHVm1ZWFZzZEZ3aUtUdGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJR2xtSUNoMGFHbHpMbTl3ZEhNdVlXeHNiM2REYkdWaGNpQW1KaUIwYUdsekxtZGxkRkJzWVdObGFHOXNaR1Z5S0NrZ0lUMDlJSFZ1WkdWbWFXNWxaQ2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTVqYjI1MFlXbHVaWEl1WVdSa1EyeGhjM01vWENKelpXeGxZM1F5TFdGc2JHOTNZMnhsWVhKY0lpazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdJQ0I5TEZ4eVhHNWNjbHh1SUNBZ0lDQWdJQ0F2THlCemFXNW5iR1ZjY2x4dUlDQWdJQ0FnSUNCMllXdzZJR1oxYm1OMGFXOXVJQ2dwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZG1GeUlIWmhiQ3hjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSeWFXZG5aWEpEYUdGdVoyVWdQU0JtWVd4elpTeGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR1JoZEdFZ1BTQnVkV3hzTEZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2MyVnNaaUE5SUhSb2FYTXNYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J2YkdSRVlYUmhJRDBnZEdocGN5NWtZWFJoS0NrN1hISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQnBaaUFvWVhKbmRXMWxiblJ6TG14bGJtZDBhQ0E5UFQwZ01Da2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJSFJvYVhNdWIzQjBjeTVsYkdWdFpXNTBMblpoYkNncE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCOVhISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjJZV3dnUFNCaGNtZDFiV1Z1ZEhOYk1GMDdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb1lYSm5kVzFsYm5SekxteGxibWQwYUNBK0lERXBJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSeWFXZG5aWEpEYUdGdVoyVWdQU0JoY21kMWJXVnVkSE5iTVYwN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2gwYUdsekxuTmxiR1ZqZENrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1elpXeGxZM1JjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQXVkbUZzS0haaGJDbGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBdVptbHVaQ2hjSWpwelpXeGxZM1JsWkZ3aUtTNWxZV05vTWlobWRXNWpkR2x2YmlBb2FTd2daV3h0S1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHUmhkR0VnUFNCelpXeG1MbTl3ZEdsdmJsUnZSR0YwWVNobGJHMHBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J5WlhSMWNtNGdabUZzYzJVN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlNrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG5Wd1pHRjBaVk5sYkdWamRHbHZiaWhrWVhSaEtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdWMyVjBVR3hoWTJWb2IyeGtaWElvS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2gwY21sbloyVnlRMmhoYm1kbEtTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTUwY21sbloyVnlRMmhoYm1kbEtIdGhaR1JsWkRvZ1pHRjBZU3dnY21WdGIzWmxaRHB2YkdSRVlYUmhmU2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUgwZ1pXeHpaU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBdkx5QjJZV3dnYVhNZ1lXNGdhV1F1SUNGMllXd2dhWE1nZEhKMVpTQm1iM0lnVzNWdVpHVm1hVzVsWkN4dWRXeHNMQ2NuTERCZElDMGdNQ0JwY3lCc1pXZGhiRnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tDRjJZV3dnSmlZZ2RtRnNJQ0U5UFNBd0tTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTVqYkdWaGNpaDBjbWxuWjJWeVEyaGhibWRsS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J5WlhSMWNtNDdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFppQW9kR2hwY3k1dmNIUnpMbWx1YVhSVFpXeGxZM1JwYjI0Z1BUMDlJSFZ1WkdWbWFXNWxaQ2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJvY205M0lHNWxkeUJGY25KdmNpaGNJbU5oYm01dmRDQmpZV3hzSUhaaGJDZ3BJR2xtSUdsdWFYUlRaV3hsWTNScGIyNG9LU0JwY3lCdWIzUWdaR1ZtYVc1bFpGd2lLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11YjNCMGN5NWxiR1Z0Wlc1MExuWmhiQ2gyWVd3cE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1dmNIUnpMbWx1YVhSVFpXeGxZM1JwYjI0b2RHaHBjeTV2Y0hSekxtVnNaVzFsYm5Rc0lHWjFibU4wYVc5dUtHUmhkR0VwZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSE5sYkdZdWIzQjBjeTVsYkdWdFpXNTBMblpoYkNnaFpHRjBZU0EvSUZ3aVhDSWdPaUJ6Wld4bUxtbGtLR1JoZEdFcEtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCelpXeG1MblZ3WkdGMFpWTmxiR1ZqZEdsdmJpaGtZWFJoS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J6Wld4bUxuTmxkRkJzWVdObGFHOXNaR1Z5S0NrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tIUnlhV2RuWlhKRGFHRnVaMlVwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2MyVnNaaTUwY21sbloyVnlRMmhoYm1kbEtIdGhaR1JsWkRvZ1pHRjBZU3dnY21WdGIzWmxaRHB2YkdSRVlYUmhmU2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlNrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ0lDQjlMRnh5WEc1Y2NseHVJQ0FnSUNBZ0lDQXZMeUJ6YVc1bmJHVmNjbHh1SUNBZ0lDQWdJQ0JqYkdWaGNsTmxZWEpqYURvZ1puVnVZM1JwYjI0Z0tDa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG5ObFlYSmphQzUyWVd3b1hDSmNJaWs3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdVptOWpkWE56WlhJdWRtRnNLRndpWENJcE8xeHlYRzRnSUNBZ0lDQWdJSDBzWEhKY2JseHlYRzRnSUNBZ0lDQWdJQzh2SUhOcGJtZHNaVnh5WEc0Z0lDQWdJQ0FnSUdSaGRHRTZJR1oxYm1OMGFXOXVLSFpoYkhWbEtTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIWmhjaUJrWVhSaExGeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkSEpwWjJkbGNrTm9ZVzVuWlNBOUlHWmhiSE5sTzF4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLR0Z5WjNWdFpXNTBjeTVzWlc1bmRHZ2dQVDA5SURBcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR1JoZEdFZ1BTQjBhR2x6TG5ObGJHVmpkR2x2Ymk1a1lYUmhLRndpYzJWc1pXTjBNaTFrWVhSaFhDSXBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tHUmhkR0VnUFQwZ2RXNWtaV1pwYm1Wa0tTQmtZWFJoSUQwZ2JuVnNiRHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUJrWVhSaE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCOUlHVnNjMlVnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLR0Z5WjNWdFpXNTBjeTVzWlc1bmRHZ2dQaUF4S1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEhKcFoyZGxja05vWVc1blpTQTlJR0Z5WjNWdFpXNTBjMXN4WFR0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtSUNnaGRtRnNkV1VwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxtTnNaV0Z5S0hSeWFXZG5aWEpEYUdGdVoyVXBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlNCbGJITmxJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmtZWFJoSUQwZ2RHaHBjeTVrWVhSaEtDazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTV2Y0hSekxtVnNaVzFsYm5RdWRtRnNLQ0YyWVd4MVpTQS9JRndpWENJZ09pQjBhR2x6TG1sa0tIWmhiSFZsS1NrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NTFjR1JoZEdWVFpXeGxZM1JwYjI0b2RtRnNkV1VwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtSUNoMGNtbG5aMlZ5UTJoaGJtZGxLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVkSEpwWjJkbGNrTm9ZVzVuWlNoN1lXUmtaV1E2SUhaaGJIVmxMQ0J5WlcxdmRtVmtPbVJoZEdGOUtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0I5S1R0Y2NseHVYSEpjYmlBZ0lDQk5kV3gwYVZObGJHVmpkRElnUFNCamJHRjZlaWhCWW5OMGNtRmpkRk5sYkdWamRESXNJSHRjY2x4dVhISmNiaUFnSUNBZ0lDQWdMeThnYlhWc2RHbGNjbHh1SUNBZ0lDQWdJQ0JqY21WaGRHVkRiMjUwWVdsdVpYSTZJR1oxYm1OMGFXOXVJQ2dwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZG1GeUlHTnZiblJoYVc1bGNpQTlJQ1FvWkc5amRXMWxiblF1WTNKbFlYUmxSV3hsYldWdWRDaGNJbVJwZGx3aUtTa3VZWFIwY2loN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNJbU5zWVhOelhDSTZJRndpYzJWc1pXTjBNaTFqYjI1MFlXbHVaWElnYzJWc1pXTjBNaTFqYjI1MFlXbHVaWEl0YlhWc2RHbGNJbHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlLUzVvZEcxc0tGdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRndpUEhWc0lHTnNZWE56UFNkelpXeGxZM1F5TFdOb2IybGpaWE1uUGx3aUxGeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYQ0lnSUR4c2FTQmpiR0Z6Y3owbmMyVnNaV04wTWkxelpXRnlZMmd0Wm1sbGJHUW5QbHdpTEZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hDSWdJQ0FnUEdsdWNIVjBJSFI1Y0dVOUozUmxlSFFuSUdGMWRHOWpiMjF3YkdWMFpUMG5iMlptSnlCaGRYUnZZMjl5Y21WamREMG5iMlptSnlCaGRYUnZZMkZ3YVhSaGJHbDZaVDBuYjJabUp5QnpjR1ZzYkdOb1pXTnJQU2RtWVd4elpTY2dZMnhoYzNNOUozTmxiR1ZqZERJdGFXNXdkWFFuUGx3aUxGeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYQ0lnSUR3dmJHaytYQ0lzWEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0lqd3ZkV3crWENJc1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNJanhrYVhZZ1kyeGhjM005SjNObGJHVmpkREl0WkhKdmNDQnpaV3hsWTNReUxXUnliM0F0YlhWc2RHa2djMlZzWldOME1pMWthWE53YkdGNUxXNXZibVVuUGx3aUxGeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYQ0lnSUNBOGRXd2dZMnhoYzNNOUozTmxiR1ZqZERJdGNtVnpkV3gwY3ljK1hDSXNYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JjSWlBZ0lEd3ZkV3crWENJc1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNJand2WkdsMlBsd2lYUzVxYjJsdUtGd2lYQ0lwS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJR052Ym5SaGFXNWxjanRjY2x4dUlDQWdJQ0FnSUNCOUxGeHlYRzVjY2x4dUlDQWdJQ0FnSUNBdkx5QnRkV3gwYVZ4eVhHNGdJQ0FnSUNBZ0lIQnlaWEJoY21WUGNIUnpPaUJtZFc1amRHbHZiaUFvS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUhaaGNpQnZjSFJ6SUQwZ2RHaHBjeTV3WVhKbGJuUXVjSEpsY0dGeVpVOXdkSE11WVhCd2JIa29kR2hwY3l3Z1lYSm5kVzFsYm5SektTeGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSE5sYkdZOWRHaHBjenRjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUM4dklGUlBSRThnZG1Gc2FXUmhkR1VnY0d4aFkyVm9iMnhrWlhJZ2FYTWdZU0J6ZEhKcGJtY2dhV1lnYzNCbFkybG1hV1ZrWEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNCcFppQW9iM0IwY3k1bGJHVnRaVzUwTG1kbGRDZ3dLUzUwWVdkT1lXMWxMblJ2VEc5M1pYSkRZWE5sS0NrZ1BUMDlJRndpYzJWc1pXTjBYQ0lwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDOHZJR2x1YzNSaGJHd2djM1JvWlNCelpXeGxZM1JwYjI0Z2FXNXBkR2xoYkdsNlpYSmNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRzl3ZEhNdWFXNXBkRk5sYkdWamRHbHZiaUE5SUdaMWJtTjBhVzl1SUNobGJHVnRaVzUwTENCallXeHNZbUZqYXlrZ2UxeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjJZWElnWkdGMFlTQTlJRnRkTzF4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCbGJHVnRaVzUwTG1acGJtUW9YQ0k2YzJWc1pXTjBaV1JjSWlrdVpXRmphRElvWm5WdVkzUnBiMjRnS0drc0lHVnNiU2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCa1lYUmhMbkIxYzJnb2MyVnNaaTV2Y0hScGIyNVViMFJoZEdFb1pXeHRLU2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmU2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZMkZzYkdKaFkyc29aR0YwWVNrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlJR1ZzYzJVZ2FXWWdLRndpWkdGMFlWd2lJR2x1SUc5d2RITXBJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUM4dklHbHVjM1JoYkd3Z1pHVm1ZWFZzZENCcGJtbDBVMlZzWldOMGFXOXVJSGRvWlc0Z1lYQndiR2xsWkNCMGJ5Qm9hV1JrWlc0Z2FXNXdkWFFnWVc1a0lHUmhkR0VnYVhNZ2JHOWpZV3hjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUc5d2RITXVhVzVwZEZObGJHVmpkR2x2YmlBOUlHOXdkSE11YVc1cGRGTmxiR1ZqZEdsdmJpQjhmQ0JtZFc1amRHbHZiaUFvWld4bGJXVnVkQ3dnWTJGc2JHSmhZMnNwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IyWVhJZ2FXUnpJRDBnYzNCc2FYUldZV3dvWld4bGJXVnVkQzUyWVd3b0tTd2diM0IwY3k1elpYQmhjbUYwYjNJcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUM4dmMyVmhjbU5vSUdsdUlHUmhkR0VnWW5rZ1lYSnlZWGtnYjJZZ2FXUnpMQ0J6ZEc5eWFXNW5JRzFoZEdOb2FXNW5JR2wwWlcxeklHbHVJR0VnYkdsemRGeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhaaGNpQnRZWFJqYUdWeklEMGdXMTA3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiM0IwY3k1eGRXVnllU2g3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUcxaGRHTm9aWEk2SUdaMWJtTjBhVzl1S0hSbGNtMHNJSFJsZUhRc0lHVnNLWHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIWmhjaUJwYzE5dFlYUmphQ0E5SUNRdVozSmxjQ2hwWkhNc0lHWjFibU4wYVc5dUtHbGtLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJR1Z4ZFdGc0tHbGtMQ0J2Y0hSekxtbGtLR1ZzS1NrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5S1M1c1pXNW5kR2c3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaaUFvYVhOZmJXRjBZMmdwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCdFlYUmphR1Z6TG5CMWMyZ29aV3dwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUdselgyMWhkR05vTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOUxGeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmpZV3hzWW1GamF6b2dJU1F1YVhOR2RXNWpkR2x2YmloallXeHNZbUZqYXlrZ1B5QWtMbTV2YjNBZ09pQm1kVzVqZEdsdmJpZ3BJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDOHZJSEpsYjNKa1pYSWdiV0YwWTJobGN5QmlZWE5sWkNCdmJpQjBhR1VnYjNKa1pYSWdkR2hsZVNCaGNIQmxZWElnYVc0Z2RHaGxJR2xrY3lCaGNuSmhlU0JpWldOaGRYTmxJSEpwWjJoMElHNXZkMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0x5OGdkR2hsZVNCaGNtVWdhVzRnZEdobElHOXlaR1Z5SUdsdUlIZG9hV05vSUhSb1pYa2dZWEJ3WldGeUlHbHVJR1JoZEdFZ1lYSnlZWGxjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIWmhjaUJ2Y21SbGNtVmtJRDBnVzEwN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JtYjNJZ0tIWmhjaUJwSUQwZ01Ec2dhU0E4SUdsa2N5NXNaVzVuZEdnN0lHa3JLeWtnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhaaGNpQnBaQ0E5SUdsa2MxdHBYVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JtYjNJZ0tIWmhjaUJxSUQwZ01Ec2dhaUE4SUcxaGRHTm9aWE11YkdWdVozUm9PeUJxS3lzcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZG1GeUlHMWhkR05vSUQwZ2JXRjBZMmhsYzF0cVhUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tHVnhkV0ZzS0dsa0xDQnZjSFJ6TG1sa0tHMWhkR05vS1NrcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHOXlaR1Z5WldRdWNIVnphQ2h0WVhSamFDazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnRZWFJqYUdWekxuTndiR2xqWlNocUxDQXhLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR0p5WldGck8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1kyRnNiR0poWTJzb2IzSmtaWEpsWkNrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOUtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDA3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUJ2Y0hSek8xeHlYRzRnSUNBZ0lDQWdJSDBzWEhKY2JseHlYRzRnSUNBZ0lDQWdJSE5sYkdWamRFTm9iMmxqWlRvZ1puVnVZM1JwYjI0Z0tHTm9iMmxqWlNrZ2UxeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdkbUZ5SUhObGJHVmpkR1ZrSUQwZ2RHaHBjeTVqYjI1MFlXbHVaWEl1Wm1sdVpDaGNJaTV6Wld4bFkzUXlMWE5sWVhKamFDMWphRzlwWTJVdFptOWpkWE5jSWlrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUdsbUlDaHpaV3hsWTNSbFpDNXNaVzVuZEdnZ0ppWWdZMmh2YVdObElDWW1JR05vYjJsalpWc3dYU0E5UFNCelpXeGxZM1JsWkZzd1hTa2dlMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZlNCbGJITmxJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbUlDaHpaV3hsWTNSbFpDNXNaVzVuZEdncElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbTl3ZEhNdVpXeGxiV1Z1ZEM1MGNtbG5aMlZ5S0Z3aVkyaHZhV05sTFdSbGMyVnNaV04wWldSY0lpd2djMlZzWldOMFpXUXBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2MyVnNaV04wWldRdWNtVnRiM1psUTJ4aGMzTW9YQ0p6Wld4bFkzUXlMWE5sWVhKamFDMWphRzlwWTJVdFptOWpkWE5jSWlrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaaUFvWTJodmFXTmxJQ1ltSUdOb2IybGpaUzVzWlc1bmRHZ3BJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG1Oc2IzTmxLQ2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZMmh2YVdObExtRmtaRU5zWVhOektGd2ljMlZzWldOME1pMXpaV0Z5WTJndFkyaHZhV05sTFdadlkzVnpYQ0lwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdWIzQjBjeTVsYkdWdFpXNTBMblJ5YVdkblpYSW9YQ0pqYUc5cFkyVXRjMlZzWldOMFpXUmNJaXdnWTJodmFXTmxLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ0lIMHNYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDOHZJRzExYkhScFhISmNiaUFnSUNBZ0lDQWdaR1Z6ZEhKdmVUb2dablZ1WTNScGIyNG9LU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ1FvWENKc1lXSmxiRnRtYjNJOUoxd2lJQ3NnZEdocGN5NXpaV0Z5WTJndVlYUjBjaWduYVdRbktTQXJJRndpSjExY0lpbGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQzVoZEhSeUtDZG1iM0luTENCMGFHbHpMbTl3ZEhNdVpXeGxiV1Z1ZEM1aGRIUnlLRndpYVdSY0lpa3BPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG5CaGNtVnVkQzVrWlhOMGNtOTVMbUZ3Y0d4NUtIUm9hWE1zSUdGeVozVnRaVzUwY3lrN1hISmNiaUFnSUNBZ0lDQWdmU3hjY2x4dVhISmNiaUFnSUNBZ0lDQWdMeThnYlhWc2RHbGNjbHh1SUNBZ0lDQWdJQ0JwYm1sMFEyOXVkR0ZwYm1WeU9pQm1kVzVqZEdsdmJpQW9LU0I3WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNCMllYSWdjMlZzWldOMGIzSWdQU0JjSWk1elpXeGxZM1F5TFdOb2IybGpaWE5jSWl3Z2MyVnNaV04wYVc5dU8xeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1elpXRnlZMmhEYjI1MFlXbHVaWElnUFNCMGFHbHpMbU52Ym5SaGFXNWxjaTVtYVc1a0tGd2lMbk5sYkdWamRESXRjMlZoY21Ob0xXWnBaV3hrWENJcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbk5sYkdWamRHbHZiaUE5SUhObGJHVmpkR2x2YmlBOUlIUm9hWE11WTI5dWRHRnBibVZ5TG1acGJtUW9jMlZzWldOMGIzSXBPMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZG1GeUlGOTBhR2x6SUQwZ2RHaHBjenRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1elpXeGxZM1JwYjI0dWIyNG9YQ0pqYkdsamExd2lMQ0JjSWk1elpXeGxZM1F5TFhObFlYSmphQzFqYUc5cFkyVmNJaXdnWm5WdVkzUnBiMjRnS0dVcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQzh2YTJsc2JFVjJaVzUwS0dVcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdYM1JvYVhNdWMyVmhjbU5vV3pCZExtWnZZM1Z6S0NrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmZkR2hwY3k1elpXeGxZM1JEYUc5cFkyVW9KQ2gwYUdsektTazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIMHBPMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnTHk4Z2NtVjNjbWwwWlNCc1lXSmxiSE1nWm5KdmJTQnZjbWxuYVc1aGJDQmxiR1Z0Wlc1MElIUnZJR1p2WTNWemMyVnlYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11YzJWaGNtTm9MbUYwZEhJb1hDSnBaRndpTENCY0luTXlhV1JmWVhWMGIyZGxibHdpSzI1bGVIUlZhV1FvS1NrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNRb1hDSnNZV0psYkZ0bWIzSTlKMXdpSUNzZ2RHaHBjeTV2Y0hSekxtVnNaVzFsYm5RdVlYUjBjaWhjSW1sa1hDSXBJQ3NnWENJblhWd2lLVnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnTG1GMGRISW9KMlp2Y2ljc0lIUm9hWE11YzJWaGNtTm9MbUYwZEhJb0oybGtKeWtwTzF4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTV6WldGeVkyZ3ViMjRvWENKcGJuQjFkQ0J3WVhOMFpWd2lMQ0IwYUdsekxtSnBibVFvWm5WdVkzUnBiMjRvS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaaUFvSVhSb2FYTXVhWE5KYm5SbGNtWmhZMlZGYm1GaWJHVmtLQ2twSUhKbGRIVnlianRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbUlDZ2hkR2hwY3k1dmNHVnVaV1FvS1NrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSb2FYTXViM0JsYmlncE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlLU2s3WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbk5sWVhKamFDNWhkSFJ5S0Z3aWRHRmlhVzVrWlhoY0lpd2dkR2hwY3k1bGJHVnRaVzUwVkdGaVNXNWtaWGdwTzF4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTVyWlhsa2IzZHVjeUE5SURBN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVjMlZoY21Ob0xtOXVLRndpYTJWNVpHOTNibHdpTENCMGFHbHpMbUpwYm1Rb1puVnVZM1JwYjI0Z0tHVXBJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbUlDZ2hkR2hwY3k1cGMwbHVkR1Z5Wm1GalpVVnVZV0pzWldRb0tTa2djbVYwZFhKdU8xeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNzcmRHaHBjeTVyWlhsa2IzZHVjenRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhaaGNpQnpaV3hsWTNSbFpDQTlJSE5sYkdWamRHbHZiaTVtYVc1a0tGd2lMbk5sYkdWamRESXRjMlZoY21Ob0xXTm9iMmxqWlMxbWIyTjFjMXdpS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIWmhjaUJ3Y21WMklEMGdjMlZzWldOMFpXUXVjSEpsZGloY0lpNXpaV3hsWTNReUxYTmxZWEpqYUMxamFHOXBZMlU2Ym05MEtDNXpaV3hsWTNReUxXeHZZMnRsWkNsY0lpazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IyWVhJZ2JtVjRkQ0E5SUhObGJHVmpkR1ZrTG01bGVIUW9YQ0l1YzJWc1pXTjBNaTF6WldGeVkyZ3RZMmh2YVdObE9tNXZkQ2d1YzJWc1pXTjBNaTFzYjJOclpXUXBYQ0lwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RtRnlJSEJ2Y3lBOUlHZGxkRU4xY25OdmNrbHVabThvZEdocGN5NXpaV0Z5WTJncE8xeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbUlDaHpaV3hsWTNSbFpDNXNaVzVuZEdnZ0ppWmNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBb1pTNTNhR2xqYUNBOVBTQkxSVmt1VEVWR1ZDQjhmQ0JsTG5kb2FXTm9JRDA5SUV0RldTNVNTVWRJVkNCOGZDQmxMbmRvYVdOb0lEMDlJRXRGV1M1Q1FVTkxVMUJCUTBVZ2ZId2daUzUzYUdsamFDQTlQU0JMUlZrdVJFVk1SVlJGSUh4OElHVXVkMmhwWTJnZ1BUMGdTMFZaTGtWT1ZFVlNLU2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFpoY2lCelpXeGxZM1JsWkVOb2IybGpaU0E5SUhObGJHVmpkR1ZrTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtSUNobExuZG9hV05vSUQwOUlFdEZXUzVNUlVaVUlDWW1JSEJ5WlhZdWJHVnVaM1JvS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lITmxiR1ZqZEdWa1EyaHZhV05sSUQwZ2NISmxkanRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1pXeHpaU0JwWmlBb1pTNTNhR2xqYUNBOVBTQkxSVmt1VWtsSFNGUXBJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYzJWc1pXTjBaV1JEYUc5cFkyVWdQU0J1WlhoMExteGxibWQwYUNBL0lHNWxlSFFnT2lCdWRXeHNPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCbGJITmxJR2xtSUNobExuZG9hV05vSUQwOVBTQkxSVmt1UWtGRFMxTlFRVU5GS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11ZFc1elpXeGxZM1FvYzJWc1pXTjBaV1F1Wm1seWMzUW9LU2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVjMlZoY21Ob0xuZHBaSFJvS0RFd0tUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjMlZzWldOMFpXUkRhRzlwWTJVZ1BTQndjbVYyTG14bGJtZDBhQ0EvSUhCeVpYWWdPaUJ1WlhoME8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgwZ1pXeHpaU0JwWmlBb1pTNTNhR2xqYUNBOVBTQkxSVmt1UkVWTVJWUkZLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVkVzV6Wld4bFkzUW9jMlZzWldOMFpXUXVabWx5YzNRb0tTazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdWMyVmhjbU5vTG5kcFpIUm9LREV3S1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2MyVnNaV04wWldSRGFHOXBZMlVnUFNCdVpYaDBMbXhsYm1kMGFDQS9JRzVsZUhRZ09pQnVkV3hzTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDBnWld4elpTQnBaaUFvWlM1M2FHbGphQ0E5UFNCTFJWa3VSVTVVUlZJcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjMlZzWldOMFpXUkRhRzlwWTJVZ1BTQnVkV3hzTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NXpaV3hsWTNSRGFHOXBZMlVvYzJWc1pXTjBaV1JEYUc5cFkyVXBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHdHBiR3hGZG1WdWRDaGxLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaaUFvSVhObGJHVmpkR1ZrUTJodmFXTmxJSHg4SUNGelpXeGxZM1JsWkVOb2IybGpaUzVzWlc1bmRHZ3BJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NXZjR1Z1S0NrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJqdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDBnWld4elpTQnBaaUFvS0NobExuZG9hV05vSUQwOVBTQkxSVmt1UWtGRFMxTlFRVU5GSUNZbUlIUm9hWE11YTJWNVpHOTNibk1nUFQwZ01TbGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOGZDQmxMbmRvYVdOb0lEMDlJRXRGV1M1TVJVWlVLU0FtSmlBb2NHOXpMbTltWm5ObGRDQTlQU0F3SUNZbUlDRndiM011YkdWdVozUm9LU2tnZTF4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbk5sYkdWamRFTm9iMmxqWlNoelpXeGxZM1JwYjI0dVptbHVaQ2hjSWk1elpXeGxZM1F5TFhObFlYSmphQzFqYUc5cFkyVTZibTkwS0M1elpXeGxZM1F5TFd4dlkydGxaQ2xjSWlrdWJHRnpkQ2dwS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JyYVd4c1JYWmxiblFvWlNrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY21WMGRYSnVPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlNCbGJITmxJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG5ObGJHVmpkRU5vYjJsalpTaHVkV3hzS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFppQW9kR2hwY3k1dmNHVnVaV1FvS1NrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhOM2FYUmphQ0FvWlM1M2FHbGphQ2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR05oYzJVZ1MwVlpMbFZRT2x4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR05oYzJVZ1MwVlpMa1JQVjA0NlhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11Ylc5MlpVaHBaMmhzYVdkb2RDZ29aUzUzYUdsamFDQTlQVDBnUzBWWkxsVlFLU0EvSUMweElEb2dNU2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd0cGJHeEZkbVZ1ZENobEtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdU8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdOaGMyVWdTMFZaTGtWT1ZFVlNPbHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxuTmxiR1ZqZEVocFoyaHNhV2RvZEdWa0tDazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3RwYkd4RmRtVnVkQ2hsS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1TzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR05oYzJVZ1MwVlpMbFJCUWpwY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0x5OGdhV1lnYzJWc1pXTjBUMjVDYkhWeUlEMDlJSFJ5ZFdVc0lITmxiR1ZqZENCMGFHVWdZM1Z5Y21WdWRHeDVJR2hwWjJoc2FXZG9kR1ZrSUc5d2RHbHZibHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2RHaHBjeTV2Y0hSekxuTmxiR1ZqZEU5dVFteDFjaWtnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1elpXeGxZM1JJYVdkb2JHbG5hSFJsWkNoN2JtOUdiMk4xY3pwMGNuVmxmU2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTVqYkc5elpTZ3BPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J5WlhSMWNtNDdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1kyRnpaU0JMUlZrdVJWTkRPbHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxtTmhibU5sYkNobEtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhMmxzYkVWMlpXNTBLR1VwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTQ3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtSUNobExuZG9hV05vSUQwOVBTQkxSVmt1VkVGQ0lIeDhJRXRGV1M1cGMwTnZiblJ5YjJ3b1pTa2dmSHdnUzBWWkxtbHpSblZ1WTNScGIyNUxaWGtvWlNsY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjhmQ0JsTG5kb2FXTm9JRDA5UFNCTFJWa3VRa0ZEUzFOUVFVTkZJSHg4SUdVdWQyaHBZMmdnUFQwOUlFdEZXUzVGVTBNcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTQ3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOVhISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tHVXVkMmhwWTJnZ1BUMDlJRXRGV1M1RlRsUkZVaWtnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtSUNoMGFHbHpMbTl3ZEhNdWIzQmxiazl1Ulc1MFpYSWdQVDA5SUdaaGJITmxLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhKbGRIVnlianRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlJR1ZzYzJVZ2FXWWdLR1V1WVd4MFMyVjVJSHg4SUdVdVkzUnliRXRsZVNCOGZDQmxMbk5vYVdaMFMyVjVJSHg4SUdVdWJXVjBZVXRsZVNrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200N1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSb2FYTXViM0JsYmlncE8xeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbUlDaGxMbmRvYVdOb0lEMDlQU0JMUlZrdVVFRkhSVjlWVUNCOGZDQmxMbmRvYVdOb0lEMDlQU0JMUlZrdVVFRkhSVjlFVDFkT0tTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0x5OGdjSEpsZG1WdWRDQjBhR1VnY0dGblpTQm1jbTl0SUhOamNtOXNiR2x1WjF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR3RwYkd4RmRtVnVkQ2hsS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFppQW9aUzUzYUdsamFDQTlQVDBnUzBWWkxrVk9WRVZTS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnTHk4Z2NISmxkbVZ1ZENCbWIzSnRJR1p5YjIwZ1ltVnBibWNnYzNWaWJXbDBkR1ZrWEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhMmxzYkVWMlpXNTBLR1VwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdmU2twTzF4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTV6WldGeVkyZ3ViMjRvWENKclpYbDFjRndpTENCMGFHbHpMbUpwYm1Rb1puVnVZM1JwYjI0Z0tHVXBJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVhMlY1Wkc5M2JuTWdQU0F3TzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTV5WlhOcGVtVlRaV0Z5WTJnb0tUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2ZTbGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0tUdGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdWMyVmhjbU5vTG05dUtGd2lZbXgxY2x3aUxDQjBhR2x6TG1KcGJtUW9ablZ1WTNScGIyNG9aU2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTVqYjI1MFlXbHVaWEl1Y21WdGIzWmxRMnhoYzNNb1hDSnpaV3hsWTNReUxXTnZiblJoYVc1bGNpMWhZM1JwZG1WY0lpazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxuTmxZWEpqYUM1eVpXMXZkbVZEYkdGemN5aGNJbk5sYkdWamRESXRabTlqZFhObFpGd2lLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVjMlZzWldOMFEyaHZhV05sS0c1MWJHd3BPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tDRjBhR2x6TG05d1pXNWxaQ2dwS1NCMGFHbHpMbU5zWldGeVUyVmhjbU5vS0NrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmxMbk4wYjNCSmJXMWxaR2xoZEdWUWNtOXdZV2RoZEdsdmJpZ3BPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NXZjSFJ6TG1Wc1pXMWxiblF1ZEhKcFoyZGxjaWdrTGtWMlpXNTBLRndpYzJWc1pXTjBNaTFpYkhWeVhDSXBLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdmU2twTzF4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTVqYjI1MFlXbHVaWEl1YjI0b1hDSmpiR2xqYTF3aUxDQnpaV3hsWTNSdmNpd2dkR2hwY3k1aWFXNWtLR1oxYm1OMGFXOXVJQ2hsS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaaUFvSVhSb2FYTXVhWE5KYm5SbGNtWmhZMlZGYm1GaWJHVmtLQ2twSUhKbGRIVnlianRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbUlDZ2tLR1V1ZEdGeVoyVjBLUzVqYkc5elpYTjBLRndpTG5ObGJHVmpkREl0YzJWaGNtTm9MV05vYjJsalpWd2lLUzVzWlc1bmRHZ2dQaUF3S1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnTHk4Z1kyeHBZMnRsWkNCcGJuTnBaR1VnWVNCelpXeGxZM1F5SUhObFlYSmphQ0JqYUc5cFkyVXNJR1J2SUc1dmRDQnZjR1Z1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdU8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NXpaV3hsWTNSRGFHOXBZMlVvYm5Wc2JDazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxtTnNaV0Z5VUd4aFkyVm9iMnhrWlhJb0tUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtSUNnaGRHaHBjeTVqYjI1MFlXbHVaWEl1YUdGelEyeGhjM01vWENKelpXeGxZM1F5TFdOdmJuUmhhVzVsY2kxaFkzUnBkbVZjSWlrcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbTl3ZEhNdVpXeGxiV1Z1ZEM1MGNtbG5aMlZ5S0NRdVJYWmxiblFvWENKelpXeGxZM1F5TFdadlkzVnpYQ0lwS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdWIzQmxiaWdwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTVtYjJOMWMxTmxZWEpqYUNncE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdaUzV3Y21WMlpXNTBSR1ZtWVhWc2RDZ3BPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlLU2s3WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbU52Ym5SaGFXNWxjaTV2YmloY0ltWnZZM1Z6WENJc0lITmxiR1ZqZEc5eUxDQjBhR2x6TG1KcGJtUW9ablZ1WTNScGIyNGdLQ2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLQ0YwYUdsekxtbHpTVzUwWlhKbVlXTmxSVzVoWW14bFpDZ3BLU0J5WlhSMWNtNDdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb0lYUm9hWE11WTI5dWRHRnBibVZ5TG1oaGMwTnNZWE56S0Z3aWMyVnNaV04wTWkxamIyNTBZV2x1WlhJdFlXTjBhWFpsWENJcEtTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTV2Y0hSekxtVnNaVzFsYm5RdWRISnBaMmRsY2lna0xrVjJaVzUwS0Z3aWMyVnNaV04wTWkxbWIyTjFjMXdpS1NrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxtTnZiblJoYVc1bGNpNWhaR1JEYkdGemN5aGNJbk5sYkdWamRESXRZMjl1ZEdGcGJtVnlMV0ZqZEdsMlpWd2lLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVaSEp2Y0dSdmQyNHVZV1JrUTJ4aGMzTW9YQ0p6Wld4bFkzUXlMV1J5YjNBdFlXTjBhWFpsWENJcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1amJHVmhjbEJzWVdObGFHOXNaR1Z5S0NrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUgwcEtUdGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdWFXNXBkRU52Ym5SaGFXNWxjbGRwWkhSb0tDazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11YjNCMGN5NWxiR1Z0Wlc1MExtRmtaRU5zWVhOektGd2ljMlZzWldOME1pMXZabVp6WTNKbFpXNWNJaWs3WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNBdkx5QnpaWFFnZEdobElIQnNZV05sYUc5c1pHVnlJR2xtSUc1bFkyVnpjMkZ5ZVZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxtTnNaV0Z5VTJWaGNtTm9LQ2s3WEhKY2JpQWdJQ0FnSUNBZ2ZTeGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0x5OGdiWFZzZEdsY2NseHVJQ0FnSUNBZ0lDQmxibUZpYkdWSmJuUmxjbVpoWTJVNklHWjFibU4wYVc5dUtDa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQnBaaUFvZEdocGN5NXdZWEpsYm5RdVpXNWhZbXhsU1c1MFpYSm1ZV05sTG1Gd2NHeDVLSFJvYVhNc0lHRnlaM1Z0Wlc1MGN5a3BJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVjMlZoY21Ob0xuQnliM0FvWENKa2FYTmhZbXhsWkZ3aUxDQWhkR2hwY3k1cGMwbHVkR1Z5Wm1GalpVVnVZV0pzWldRb0tTazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdJQ0I5TEZ4eVhHNWNjbHh1SUNBZ0lDQWdJQ0F2THlCdGRXeDBhVnh5WEc0Z0lDQWdJQ0FnSUdsdWFYUlRaV3hsWTNScGIyNDZJR1oxYm1OMGFXOXVJQ2dwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZG1GeUlHUmhkR0U3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJR2xtSUNoMGFHbHpMbTl3ZEhNdVpXeGxiV1Z1ZEM1MllXd29LU0E5UFQwZ1hDSmNJaUFtSmlCMGFHbHpMbTl3ZEhNdVpXeGxiV1Z1ZEM1MFpYaDBLQ2tnUFQwOUlGd2lYQ0lwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11ZFhCa1lYUmxVMlZzWldOMGFXOXVLRnRkS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11WTJ4dmMyVW9LVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUM4dklITmxkQ0IwYUdVZ2NHeGhZMlZvYjJ4a1pYSWdhV1lnYm1WalpYTnpZWEo1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbU5zWldGeVUyVmhjbU5vS0NrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tIUm9hWE11YzJWc1pXTjBJSHg4SUhSb2FYTXViM0IwY3k1bGJHVnRaVzUwTG5aaGJDZ3BJQ0U5UFNCY0lsd2lLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMllYSWdjMlZzWmlBOUlIUm9hWE03WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbTl3ZEhNdWFXNXBkRk5sYkdWamRHbHZiaTVqWVd4c0tHNTFiR3dzSUhSb2FYTXViM0IwY3k1bGJHVnRaVzUwTENCbWRXNWpkR2x2Ymloa1lYUmhLWHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaaUFvWkdGMFlTQWhQVDBnZFc1a1pXWnBibVZrSUNZbUlHUmhkR0VnSVQwOUlHNTFiR3dwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2MyVnNaaTUxY0dSaGRHVlRaV3hsWTNScGIyNG9aR0YwWVNrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lITmxiR1l1WTJ4dmMyVW9LVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnTHk4Z2MyVjBJSFJvWlNCd2JHRmpaV2h2YkdSbGNpQnBaaUJ1WldObGMzTmhjbmxjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYzJWc1ppNWpiR1ZoY2xObFlYSmphQ2dwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgwcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lDQWdmU3hjY2x4dVhISmNiaUFnSUNBZ0lDQWdMeThnYlhWc2RHbGNjbHh1SUNBZ0lDQWdJQ0JqYkdWaGNsTmxZWEpqYURvZ1puVnVZM1JwYjI0Z0tDa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjJZWElnY0d4aFkyVm9iMnhrWlhJZ1BTQjBhR2x6TG1kbGRGQnNZV05sYUc5c1pHVnlLQ2tzWEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCdFlYaFhhV1IwYUNBOUlIUm9hWE11WjJWMFRXRjRVMlZoY21Ob1YybGtkR2dvS1R0Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2h3YkdGalpXaHZiR1JsY2lBaFBUMGdkVzVrWldacGJtVmtJQ0FtSmlCMGFHbHpMbWRsZEZaaGJDZ3BMbXhsYm1kMGFDQTlQVDBnTUNBbUppQjBhR2x6TG5ObFlYSmphQzVvWVhORGJHRnpjeWhjSW5ObGJHVmpkREl0Wm05amRYTmxaRndpS1NBOVBUMGdabUZzYzJVcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdWMyVmhjbU5vTG5aaGJDaHdiR0ZqWldodmJHUmxjaWt1WVdSa1EyeGhjM01vWENKelpXeGxZM1F5TFdSbFptRjFiSFJjSWlrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQXZMeUJ6ZEhKbGRHTm9JSFJvWlNCelpXRnlZMmdnWW05NElIUnZJR1oxYkd3Z2QybGtkR2dnYjJZZ2RHaGxJR052Ym5SaGFXNWxjaUJ6YnlCaGN5QnRkV05vSUc5bUlIUm9aU0J3YkdGalpXaHZiR1JsY2lCcGN5QjJhWE5wWW14bElHRnpJSEJ2YzNOcFlteGxYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0F2THlCM1pTQmpiM1ZzWkNCallXeHNJSFJvYVhNdWNtVnphWHBsVTJWaGNtTm9LQ2tzSUdKMWRDQjNaU0JrYnlCdWIzUWdZbVZqWVhWelpTQjBhR0YwSUhKbGNYVnBjbVZ6SUdFZ2MybDZaWElnWVc1a0lIZGxJR1J2SUc1dmRDQjNZVzUwSUhSdklHTnlaV0YwWlNCdmJtVWdjMjhnWldGeWJIa2dZbVZqWVhWelpTQnZaaUJoSUdacGNtVm1iM2dnWW5WbkxDQnpaV1VnSXprME5GeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1elpXRnlZMmd1ZDJsa2RHZ29iV0Y0VjJsa2RHZ2dQaUF3SUQ4Z2JXRjRWMmxrZEdnZ09pQjBhR2x6TG1OdmJuUmhhVzVsY2k1amMzTW9YQ0ozYVdSMGFGd2lLU2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSDBnWld4elpTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxuTmxZWEpqYUM1MllXd29YQ0pjSWlrdWQybGtkR2dvTVRBcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lDQWdmU3hjY2x4dVhISmNiaUFnSUNBZ0lDQWdMeThnYlhWc2RHbGNjbHh1SUNBZ0lDQWdJQ0JqYkdWaGNsQnNZV05sYUc5c1pHVnlPaUJtZFc1amRHbHZiaUFvS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUdsbUlDaDBhR2x6TG5ObFlYSmphQzVvWVhORGJHRnpjeWhjSW5ObGJHVmpkREl0WkdWbVlYVnNkRndpS1NrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1elpXRnlZMmd1ZG1Gc0tGd2lYQ0lwTG5KbGJXOTJaVU5zWVhOektGd2ljMlZzWldOME1pMWtaV1poZFd4MFhDSXBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJQ0FnZlN4Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnTHk4Z2JYVnNkR2xjY2x4dUlDQWdJQ0FnSUNCdmNHVnVhVzVuT2lCbWRXNWpkR2x2YmlBb0tTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11WTJ4bFlYSlFiR0ZqWldodmJHUmxjaWdwT3lBdkx5QnphRzkxYkdRZ1ltVWdaRzl1WlNCaVpXWnZjbVVnYzNWd1pYSWdjMjhnY0d4aFkyVm9iMnhrWlhJZ2FYTWdibTkwSUhWelpXUWdkRzhnYzJWaGNtTm9YSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11Y21WemFYcGxVMlZoY21Ob0tDazdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxuQmhjbVZ1ZEM1dmNHVnVhVzVuTG1Gd2NHeDVLSFJvYVhNc0lHRnlaM1Z0Wlc1MGN5azdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxtWnZZM1Z6VTJWaGNtTm9LQ2s3WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMblZ3WkdGMFpWSmxjM1ZzZEhNb2RISjFaU2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdWMyVmhjbU5vTG1adlkzVnpLQ2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdWIzQjBjeTVsYkdWdFpXNTBMblJ5YVdkblpYSW9KQzVGZG1WdWRDaGNJbk5sYkdWamRESXRiM0JsYmx3aUtTazdYSEpjYmlBZ0lDQWdJQ0FnZlN4Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnTHk4Z2JYVnNkR2xjY2x4dUlDQWdJQ0FnSUNCamJHOXpaVG9nWm5WdVkzUnBiMjRnS0NrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCcFppQW9JWFJvYVhNdWIzQmxibVZrS0NrcElISmxkSFZ5Ymp0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NXdZWEpsYm5RdVkyeHZjMlV1WVhCd2JIa29kR2hwY3l3Z1lYSm5kVzFsYm5SektUdGNjbHh1SUNBZ0lDQWdJQ0I5TEZ4eVhHNWNjbHh1SUNBZ0lDQWdJQ0F2THlCdGRXeDBhVnh5WEc0Z0lDQWdJQ0FnSUdadlkzVnpPaUJtZFc1amRHbHZiaUFvS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVZMnh2YzJVb0tUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTV6WldGeVkyZ3VabTlqZFhNb0tUdGNjbHh1SUNBZ0lDQWdJQ0I5TEZ4eVhHNWNjbHh1SUNBZ0lDQWdJQ0F2THlCdGRXeDBhVnh5WEc0Z0lDQWdJQ0FnSUdselJtOWpkWE5sWkRvZ1puVnVZM1JwYjI0Z0tDa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z2RHaHBjeTV6WldGeVkyZ3VhR0Z6UTJ4aGMzTW9YQ0p6Wld4bFkzUXlMV1p2WTNWelpXUmNJaWs3WEhKY2JpQWdJQ0FnSUNBZ2ZTeGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0x5OGdiWFZzZEdsY2NseHVJQ0FnSUNBZ0lDQjFjR1JoZEdWVFpXeGxZM1JwYjI0NklHWjFibU4wYVc5dUlDaGtZWFJoS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUhaaGNpQnBaSE1nUFNCYlhTd2dabWxzZEdWeVpXUWdQU0JiWFN3Z2MyVnNaaUE5SUhSb2FYTTdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0F2THlCbWFXeDBaWElnYjNWMElHUjFjR3hwWTJGMFpYTmNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0pDaGtZWFJoS1M1bFlXTm9LR1oxYm1OMGFXOXVJQ2dwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2hwYm1SbGVFOW1LSE5sYkdZdWFXUW9kR2hwY3lrc0lHbGtjeWtnUENBd0tTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXUnpMbkIxYzJnb2MyVnNaaTVwWkNoMGFHbHpLU2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdabWxzZEdWeVpXUXVjSFZ6YUNoMGFHbHpLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZlNrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUdSaGRHRWdQU0JtYVd4MFpYSmxaRHRjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVjMlZzWldOMGFXOXVMbVpwYm1Rb1hDSXVjMlZzWldOME1pMXpaV0Z5WTJndFkyaHZhV05sWENJcExuSmxiVzkyWlNncE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBa0tHUmhkR0VwTG1WaFkyZ29ablZ1WTNScGIyNGdLQ2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2MyVnNaaTVoWkdSVFpXeGxZM1JsWkVOb2IybGpaU2gwYUdsektUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2ZTazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lITmxiR1l1Y0c5emRIQnliMk5sYzNOU1pYTjFiSFJ6S0NrN1hISmNiaUFnSUNBZ0lDQWdmU3hjY2x4dVhISmNiaUFnSUNBZ0lDQWdMeThnYlhWc2RHbGNjbHh1SUNBZ0lDQWdJQ0IwYjJ0bGJtbDZaVG9nWm5WdVkzUnBiMjRvS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUhaaGNpQnBibkIxZENBOUlIUm9hWE11YzJWaGNtTm9MblpoYkNncE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCcGJuQjFkQ0E5SUhSb2FYTXViM0IwY3k1MGIydGxibWw2WlhJdVkyRnNiQ2gwYUdsekxDQnBibkIxZEN3Z2RHaHBjeTVrWVhSaEtDa3NJSFJvYVhNdVltbHVaQ2gwYUdsekxtOXVVMlZzWldOMEtTd2dkR2hwY3k1dmNIUnpLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdhV1lnS0dsdWNIVjBJQ0U5SUc1MWJHd2dKaVlnYVc1d2RYUWdJVDBnZFc1a1pXWnBibVZrS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG5ObFlYSmphQzUyWVd3b2FXNXdkWFFwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLR2x1Y0hWMExteGxibWQwYUNBK0lEQXBJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG05d1pXNG9LVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdJQ0I5TEZ4eVhHNWNjbHh1SUNBZ0lDQWdJQ0F2THlCdGRXeDBhVnh5WEc0Z0lDQWdJQ0FnSUc5dVUyVnNaV04wT2lCbWRXNWpkR2x2YmlBb1pHRjBZU3dnYjNCMGFXOXVjeWtnZTF4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLQ0YwYUdsekxuUnlhV2RuWlhKVFpXeGxZM1FvWkdGMFlTa3BJSHNnY21WMGRYSnVPeUI5WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbUZrWkZObGJHVmpkR1ZrUTJodmFXTmxLR1JoZEdFcE8xeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1dmNIUnpMbVZzWlcxbGJuUXVkSEpwWjJkbGNpaDdJSFI1Y0dVNklGd2ljMlZzWldOMFpXUmNJaXdnZG1Gc09pQjBhR2x6TG1sa0tHUmhkR0VwTENCamFHOXBZMlU2SUdSaGRHRWdmU2s3WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNCcFppQW9kR2hwY3k1elpXeGxZM1FnZkh3Z0lYUm9hWE11YjNCMGN5NWpiRzl6WlU5dVUyVnNaV04wS1NCMGFHbHpMbkJ2YzNSd2NtOWpaWE56VW1WemRXeDBjeWhrWVhSaExDQm1ZV3h6WlN3Z2RHaHBjeTV2Y0hSekxtTnNiM05sVDI1VFpXeGxZM1E5UFQxMGNuVmxLVHRjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUdsbUlDaDBhR2x6TG05d2RITXVZMnh2YzJWUGJsTmxiR1ZqZENrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1amJHOXpaU2dwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTV6WldGeVkyZ3VkMmxrZEdnb01UQXBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlJR1ZzYzJVZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1lnS0hSb2FYTXVZMjkxYm5SVFpXeGxZM1JoWW14bFVtVnpkV3gwY3lncFBqQXBJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG5ObFlYSmphQzUzYVdSMGFDZ3hNQ2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1eVpYTnBlbVZUWldGeVkyZ29LVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaaUFvZEdocGN5NW5aWFJOWVhocGJYVnRVMlZzWldOMGFXOXVVMmw2WlNncElENGdNQ0FtSmlCMGFHbHpMblpoYkNncExteGxibWQwYUNBK1BTQjBhR2x6TG1kbGRFMWhlR2x0ZFcxVFpXeGxZM1JwYjI1VGFYcGxLQ2twSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0x5OGdhV1lnZDJVZ2NtVmhZMmhsWkNCdFlYZ2djMlZzWldOMGFXOXVJSE5wZW1VZ2NtVndZV2x1ZENCMGFHVWdjbVZ6ZFd4MGN5QnpieUJqYUc5cFkyVnpYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQzh2SUdGeVpTQnlaWEJzWVdObFpDQjNhWFJvSUhSb1pTQnRZWGdnYzJWc1pXTjBhVzl1SUhKbFlXTm9aV1FnYldWemMyRm5aVnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxuVndaR0YwWlZKbGMzVnNkSE1vZEhKMVpTazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVjRzl6YVhScGIyNUVjbTl3Wkc5M2JpZ3BPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlNCbGJITmxJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQXZMeUJwWmlCdWIzUm9hVzVuSUd4bFpuUWdkRzhnYzJWc1pXTjBJR05zYjNObFhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NWpiRzl6WlNncE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVjMlZoY21Ob0xuZHBaSFJvS0RFd0tUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnTHk4Z2MybHVZMlVnYVhSeklHNXZkQ0J3YjNOemFXSnNaU0IwYnlCelpXeGxZM1FnWVc0Z1pXeGxiV1Z1ZENCMGFHRjBJR2hoY3lCaGJISmxZV1I1SUdKbFpXNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0x5OGdZV1JrWldRZ2QyVWdaRzhnYm05MElHNWxaV1FnZEc4Z1kyaGxZMnNnYVdZZ2RHaHBjeUJwY3lCaElHNWxkeUJsYkdWdFpXNTBJR0psWm05eVpTQm1hWEpwYm1jZ1kyaGhibWRsWEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdWRISnBaMmRsY2tOb1lXNW5aU2g3SUdGa1pHVmtPaUJrWVhSaElIMHBPMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tDRnZjSFJwYjI1eklIeDhJQ0Z2Y0hScGIyNXpMbTV2Um05amRYTXBYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxtWnZZM1Z6VTJWaGNtTm9LQ2s3WEhKY2JpQWdJQ0FnSUNBZ2ZTeGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0x5OGdiWFZzZEdsY2NseHVJQ0FnSUNBZ0lDQmpZVzVqWld3NklHWjFibU4wYVc5dUlDZ3BJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1amJHOXpaU2dwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxtWnZZM1Z6VTJWaGNtTm9LQ2s3WEhKY2JpQWdJQ0FnSUNBZ2ZTeGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ1lXUmtVMlZzWldOMFpXUkRhRzlwWTJVNklHWjFibU4wYVc5dUlDaGtZWFJoS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUhaaGNpQmxibUZpYkdWRGFHOXBZMlVnUFNBaFpHRjBZUzVzYjJOclpXUXNYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JsYm1GaWJHVmtTWFJsYlNBOUlDUW9YSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hDSThiR2tnWTJ4aGMzTTlKM05sYkdWamRESXRjMlZoY21Ob0xXTm9iMmxqWlNjK1hDSWdLMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGd2lJQ0FnSUR4a2FYWStQQzlrYVhZK1hDSWdLMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lGd2lJQ0FnSUR4aElHaHlaV1k5SnlNbklHOXVZMnhwWTJzOUozSmxkSFZ5YmlCbVlXeHpaVHNuSUdOc1lYTnpQU2R6Wld4bFkzUXlMWE5sWVhKamFDMWphRzlwWTJVdFkyeHZjMlVuSUhSaFltbHVaR1Y0UFNjdE1TYytQQzloUGx3aUlDdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0lqd3ZiR2srWENJcExGeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdaR2x6WVdKc1pXUkpkR1Z0SUQwZ0pDaGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCY0lqeHNhU0JqYkdGemN6MG5jMlZzWldOME1pMXpaV0Z5WTJndFkyaHZhV05sSUhObGJHVmpkREl0Ykc5amEyVmtKejVjSWlBclhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWENJOFpHbDJQand2WkdsMlBsd2lJQ3RjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmNJand2YkdrK1hDSXBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjJZWElnWTJodmFXTmxJRDBnWlc1aFlteGxRMmh2YVdObElEOGdaVzVoWW14bFpFbDBaVzBnT2lCa2FYTmhZbXhsWkVsMFpXMHNYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWkNBOUlIUm9hWE11YVdRb1pHRjBZU2tzWEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMllXd2dQU0IwYUdsekxtZGxkRlpoYkNncExGeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdabTl5YldGMGRHVmtMRnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWTNOelEyeGhjM003WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNCbWIzSnRZWFIwWldROWRHaHBjeTV2Y0hSekxtWnZjbTFoZEZObGJHVmpkR2x2Ymloa1lYUmhMQ0JqYUc5cFkyVXVabWx1WkNoY0ltUnBkbHdpS1N3Z2RHaHBjeTV2Y0hSekxtVnpZMkZ3WlUxaGNtdDFjQ2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJR2xtSUNobWIzSnRZWFIwWldRZ0lUMGdkVzVrWldacGJtVmtLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCamFHOXBZMlV1Wm1sdVpDaGNJbVJwZGx3aUtTNXlaWEJzWVdObFYybDBhQ2hjSWp4a2FYWStYQ0lyWm05eWJXRjBkR1ZrSzF3aVBDOWthWFkrWENJcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUdOemMwTnNZWE56UFhSb2FYTXViM0IwY3k1bWIzSnRZWFJUWld4bFkzUnBiMjVEYzNORGJHRnpjeWhrWVhSaExDQmphRzlwWTJVdVptbHVaQ2hjSW1ScGRsd2lLU2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJR2xtSUNoamMzTkRiR0Z6Y3lBaFBTQjFibVJsWm1sdVpXUXBJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdOb2IybGpaUzVoWkdSRGJHRnpjeWhqYzNORGJHRnpjeWs3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUdsbUtHVnVZV0pzWlVOb2IybGpaU2w3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnWTJodmFXTmxMbVpwYm1Rb1hDSXVjMlZzWldOME1pMXpaV0Z5WTJndFkyaHZhV05sTFdOc2IzTmxYQ0lwWEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDNXZiaWhjSW0xdmRYTmxaRzkzYmx3aUxDQnJhV3hzUlhabGJuUXBYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUM1dmJpaGNJbU5zYVdOcklHUmliR05zYVdOclhDSXNJSFJvYVhNdVltbHVaQ2htZFc1amRHbHZiaUFvWlNrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb0lYUm9hWE11YVhOSmJuUmxjbVpoWTJWRmJtRmliR1ZrS0NrcElISmxkSFZ5Ymp0Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNRb1pTNTBZWEpuWlhRcExtTnNiM05sYzNRb1hDSXVjMlZzWldOME1pMXpaV0Z5WTJndFkyaHZhV05sWENJcExtWmhaR1ZQZFhRb0oyWmhjM1FuTENCMGFHbHpMbUpwYm1Rb1puVnVZM1JwYjI0b0tYdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11ZFc1elpXeGxZM1FvSkNobExuUmhjbWRsZENrcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTV6Wld4bFkzUnBiMjR1Wm1sdVpDaGNJaTV6Wld4bFkzUXlMWE5sWVhKamFDMWphRzlwWTJVdFptOWpkWE5jSWlrdWNtVnRiM1psUTJ4aGMzTW9YQ0p6Wld4bFkzUXlMWE5sWVhKamFDMWphRzlwWTJVdFptOWpkWE5jSWlrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbU5zYjNObEtDazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG1adlkzVnpVMlZoY21Ob0tDazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgwcEtTNWtaWEYxWlhWbEtDazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUd0cGJHeEZkbVZ1ZENobEtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQjlLU2t1YjI0b1hDSm1iMk4xYzF3aUxDQjBhR2x6TG1KcGJtUW9ablZ1WTNScGIyNGdLQ2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaaUFvSVhSb2FYTXVhWE5KYm5SbGNtWmhZMlZGYm1GaWJHVmtLQ2twSUhKbGRIVnlianRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTVqYjI1MFlXbHVaWEl1WVdSa1EyeGhjM01vWENKelpXeGxZM1F5TFdOdmJuUmhhVzVsY2kxaFkzUnBkbVZjSWlrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdVpISnZjR1J2ZDI0dVlXUmtRMnhoYzNNb1hDSnpaV3hsWTNReUxXUnliM0F0WVdOMGFYWmxYQ0lwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUgwcEtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdZMmh2YVdObExtUmhkR0VvWENKelpXeGxZM1F5TFdSaGRHRmNJaXdnWkdGMFlTazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lHTm9iMmxqWlM1cGJuTmxjblJDWldadmNtVW9kR2hwY3k1elpXRnlZMmhEYjI1MFlXbHVaWElwTzF4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RtRnNMbkIxYzJnb2FXUXBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG5ObGRGWmhiQ2gyWVd3cE8xeHlYRzRnSUNBZ0lDQWdJSDBzWEhKY2JseHlYRzRnSUNBZ0lDQWdJQzh2SUcxMWJIUnBYSEpjYmlBZ0lDQWdJQ0FnZFc1elpXeGxZM1E2SUdaMWJtTjBhVzl1SUNoelpXeGxZM1JsWkNrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCMllYSWdkbUZzSUQwZ2RHaHBjeTVuWlhSV1lXd29LU3hjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdSaGRHRXNYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwYm1SbGVEdGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSE5sYkdWamRHVmtJRDBnYzJWc1pXTjBaV1F1WTJ4dmMyVnpkQ2hjSWk1elpXeGxZM1F5TFhObFlYSmphQzFqYUc5cFkyVmNJaWs3WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNCcFppQW9jMlZzWldOMFpXUXViR1Z1WjNSb0lEMDlQU0F3S1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhSEp2ZHlCY0lrbHVkbUZzYVdRZ1lYSm5kVzFsYm5RNklGd2lJQ3NnYzJWc1pXTjBaV1FnS3lCY0lpNGdUWFZ6ZENCaVpTQXVjMlZzWldOME1pMXpaV0Z5WTJndFkyaHZhV05sWENJN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lHUmhkR0VnUFNCelpXeGxZM1JsWkM1a1lYUmhLRndpYzJWc1pXTjBNaTFrWVhSaFhDSXBPMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tDRmtZWFJoS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQXZMeUJ3Y21WMlpXNTBJR0VnY21GalpTQmpiMjVrYVhScGIyNGdkMmhsYmlCMGFHVWdKM2duSUdseklHTnNhV05yWldRZ2NtVmhiR3g1SUdaaGMzUWdjbVZ3WldGMFpXUnNlU0IwYUdVZ1pYWmxiblFnWTJGdUlHSmxJSEYxWlhWbFpGeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdMeThnWVc1a0lHbHVkbTlyWldRZ2IyNGdZVzRnWld4bGJXVnVkQ0JoYkhKbFlXUjVJSEpsYlc5MlpXUmNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJqdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdhVzVrWlhnZ1BTQnBibVJsZUU5bUtIUm9hWE11YVdRb1pHRjBZU2tzSUhaaGJDazdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2FXNWtaWGdnUGowZ01Da2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZG1Gc0xuTndiR2xqWlNocGJtUmxlQ3dnTVNrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG5ObGRGWmhiQ2gyWVd3cE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1lnS0hSb2FYTXVjMlZzWldOMEtTQjBhR2x6TG5CdmMzUndjbTlqWlhOelVtVnpkV3gwY3lncE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUhObGJHVmpkR1ZrTG5KbGJXOTJaU2dwTzF4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTV2Y0hSekxtVnNaVzFsYm5RdWRISnBaMmRsY2loN0lIUjVjR1U2SUZ3aWNtVnRiM1psWkZ3aUxDQjJZV3c2SUhSb2FYTXVhV1FvWkdGMFlTa3NJR05vYjJsalpUb2daR0YwWVNCOUtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTUwY21sbloyVnlRMmhoYm1kbEtIc2djbVZ0YjNabFpEb2daR0YwWVNCOUtUdGNjbHh1SUNBZ0lDQWdJQ0I5TEZ4eVhHNWNjbHh1SUNBZ0lDQWdJQ0F2THlCdGRXeDBhVnh5WEc0Z0lDQWdJQ0FnSUhCdmMzUndjbTlqWlhOelVtVnpkV3gwY3pvZ1puVnVZM1JwYjI0Z0tHUmhkR0VzSUdsdWFYUnBZV3dzSUc1dlNHbG5hR3hwWjJoMFZYQmtZWFJsS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUhaaGNpQjJZV3dnUFNCMGFHbHpMbWRsZEZaaGJDZ3BMRnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWTJodmFXTmxjeUE5SUhSb2FYTXVjbVZ6ZFd4MGN5NW1hVzVrS0Z3aUxuTmxiR1ZqZERJdGNtVnpkV3gwWENJcExGeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZMjl0Y0c5MWJtUWdQU0IwYUdsekxuSmxjM1ZzZEhNdVptbHVaQ2hjSWk1elpXeGxZM1F5TFhKbGMzVnNkQzEzYVhSb0xXTm9hV3hrY21WdVhDSXBMRnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYzJWc1ppQTlJSFJvYVhNN1hISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQmphRzlwWTJWekxtVmhZMmd5S0daMWJtTjBhVzl1SUNocExDQmphRzlwWTJVcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFpoY2lCcFpDQTlJSE5sYkdZdWFXUW9ZMmh2YVdObExtUmhkR0VvWENKelpXeGxZM1F5TFdSaGRHRmNJaWtwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLR2x1WkdWNFQyWW9hV1FzSUhaaGJDa2dQajBnTUNrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdOb2IybGpaUzVoWkdSRGJHRnpjeWhjSW5ObGJHVmpkREl0YzJWc1pXTjBaV1JjSWlrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnTHk4Z2JXRnlheUJoYkd3Z1kyaHBiR1J5Wlc0Z2IyWWdkR2hsSUhObGJHVmpkR1ZrSUhCaGNtVnVkQ0JoY3lCelpXeGxZM1JsWkZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR05vYjJsalpTNW1hVzVrS0Z3aUxuTmxiR1ZqZERJdGNtVnpkV3gwTFhObGJHVmpkR0ZpYkdWY0lpa3VZV1JrUTJ4aGMzTW9YQ0p6Wld4bFkzUXlMWE5sYkdWamRHVmtYQ0lwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCOUtUdGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJR052YlhCdmRXNWtMbVZoWTJneUtHWjFibU4wYVc5dUtHa3NJR05vYjJsalpTa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnTHk4Z2FHbGtaU0JoYmlCdmNIUm5jbTkxY0NCcFppQnBkQ0JrYjJWemJuUWdhR0YyWlNCaGJua2djMlZzWldOMFlXSnNaU0JqYUdsc1pISmxibHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tDRmphRzlwWTJVdWFYTW9KeTV6Wld4bFkzUXlMWEpsYzNWc2RDMXpaV3hsWTNSaFlteGxKeWxjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQW1KaUJqYUc5cFkyVXVabWx1WkNoY0lpNXpaV3hsWTNReUxYSmxjM1ZzZEMxelpXeGxZM1JoWW14bE9tNXZkQ2d1YzJWc1pXTjBNaTF6Wld4bFkzUmxaQ2xjSWlrdWJHVnVaM1JvSUQwOVBTQXdLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZMmh2YVdObExtRmtaRU5zWVhOektGd2ljMlZzWldOME1pMXpaV3hsWTNSbFpGd2lLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZlNrN1hISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQnBaaUFvZEdocGN5NW9hV2RvYkdsbmFIUW9LU0E5UFNBdE1TQW1KaUJ1YjBocFoyaHNhV2RvZEZWd1pHRjBaU0FoUFQwZ1ptRnNjMlVwZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2MyVnNaaTVvYVdkb2JHbG5hSFFvTUNrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDOHZTV1lnWVd4c0lISmxjM1ZzZEhNZ1lYSmxJR05vYjNObGJpQnlaVzVrWlhJZ1ptOXliV0YwVG05TlFYUmphR1Z6WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJR2xtS0NGMGFHbHpMbTl3ZEhNdVkzSmxZWFJsVTJWaGNtTm9RMmh2YVdObElDWW1JQ0ZqYUc5cFkyVnpMbVpwYkhSbGNpZ25Mbk5sYkdWamRESXRjbVZ6ZFd4ME9tNXZkQ2d1YzJWc1pXTjBNaTF6Wld4bFkzUmxaQ2tuS1M1c1pXNW5kR2dnUGlBd0tYdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtS0NGa1lYUmhJSHg4SUdSaGRHRWdKaVlnSVdSaGRHRXViVzl5WlNBbUppQjBhR2x6TG5KbGMzVnNkSE11Wm1sdVpDaGNJaTV6Wld4bFkzUXlMVzV2TFhKbGMzVnNkSE5jSWlrdWJHVnVaM1JvSUQwOVBTQXdLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1lnS0dOb1pXTnJSbTl5YldGMGRHVnlLSE5sYkdZdWIzQjBjeTVtYjNKdFlYUk9iMDFoZEdOb1pYTXNJRndpWm05eWJXRjBUbTlOWVhSamFHVnpYQ0lwS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11Y21WemRXeDBjeTVoY0hCbGJtUW9YQ0k4YkdrZ1kyeGhjM005SjNObGJHVmpkREl0Ym04dGNtVnpkV3gwY3ljK1hDSWdLeUJ6Wld4bUxtOXdkSE11Wm05eWJXRjBUbTlOWVhSamFHVnpLSE5sYkdZdWMyVmhjbU5vTG5aaGJDZ3BLU0FySUZ3aVBDOXNhVDVjSWlrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCOVhISmNibHh5WEc0Z0lDQWdJQ0FnSUgwc1hISmNibHh5WEc0Z0lDQWdJQ0FnSUM4dklHMTFiSFJwWEhKY2JpQWdJQ0FnSUNBZ1oyVjBUV0Y0VTJWaGNtTm9WMmxrZEdnNklHWjFibU4wYVc5dUtDa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z2RHaHBjeTV6Wld4bFkzUnBiMjR1ZDJsa2RHZ29LU0F0SUdkbGRGTnBaR1ZDYjNKa1pYSlFZV1JrYVc1bktIUm9hWE11YzJWaGNtTm9LVHRjY2x4dUlDQWdJQ0FnSUNCOUxGeHlYRzVjY2x4dUlDQWdJQ0FnSUNBdkx5QnRkV3gwYVZ4eVhHNGdJQ0FnSUNBZ0lISmxjMmw2WlZObFlYSmphRG9nWm5WdVkzUnBiMjRnS0NrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCMllYSWdiV2x1YVcxMWJWZHBaSFJvTENCc1pXWjBMQ0J0WVhoWGFXUjBhQ3dnWTI5dWRHRnBibVZ5VEdWbWRDd2djMlZoY21Ob1YybGtkR2dzWEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCemFXUmxRbTl5WkdWeVVHRmtaR2x1WnlBOUlHZGxkRk5wWkdWQ2IzSmtaWEpRWVdSa2FXNW5LSFJvYVhNdWMyVmhjbU5vS1R0Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lHMXBibWx0ZFcxWGFXUjBhQ0E5SUcxbFlYTjFjbVZVWlhoMFYybGtkR2dvZEdocGN5NXpaV0Z5WTJncElDc2dNVEE3WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNCc1pXWjBJRDBnZEdocGN5NXpaV0Z5WTJndWIyWm1jMlYwS0NrdWJHVm1kRHRjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUcxaGVGZHBaSFJvSUQwZ2RHaHBjeTV6Wld4bFkzUnBiMjR1ZDJsa2RHZ29LVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdZMjl1ZEdGcGJtVnlUR1ZtZENBOUlIUm9hWE11YzJWc1pXTjBhVzl1TG05bVpuTmxkQ2dwTG14bFpuUTdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0J6WldGeVkyaFhhV1IwYUNBOUlHMWhlRmRwWkhSb0lDMGdLR3hsWm5RZ0xTQmpiMjUwWVdsdVpYSk1aV1owS1NBdElITnBaR1ZDYjNKa1pYSlFZV1JrYVc1bk8xeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdhV1lnS0hObFlYSmphRmRwWkhSb0lEd2diV2x1YVcxMWJWZHBaSFJvS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnpaV0Z5WTJoWGFXUjBhQ0E5SUcxaGVGZHBaSFJvSUMwZ2MybGtaVUp2Y21SbGNsQmhaR1JwYm1jN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2h6WldGeVkyaFhhV1IwYUNBOElEUXdLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCelpXRnlZMmhYYVdSMGFDQTlJRzFoZUZkcFpIUm9JQzBnYzJsa1pVSnZjbVJsY2xCaFpHUnBibWM3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUdsbUlDaHpaV0Z5WTJoWGFXUjBhQ0E4UFNBd0tTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdjMlZoY21Ob1YybGtkR2dnUFNCdGFXNXBiWFZ0VjJsa2RHZzdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdWMyVmhjbU5vTG5kcFpIUm9LSE5sWVhKamFGZHBaSFJvS1R0Y2NseHVJQ0FnSUNBZ0lDQjlMRnh5WEc1Y2NseHVJQ0FnSUNBZ0lDQXZMeUJ0ZFd4MGFWeHlYRzRnSUNBZ0lDQWdJR2RsZEZaaGJEb2dablZ1WTNScGIyNGdLQ2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0IyWVhJZ2RtRnNPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQnBaaUFvZEdocGN5NXpaV3hsWTNRcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFpoYkNBOUlIUm9hWE11YzJWc1pXTjBMblpoYkNncE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlIWmhiQ0E5UFQwZ2JuVnNiQ0EvSUZ0ZElEb2dkbUZzTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0I5SUdWc2MyVWdlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZG1Gc0lEMGdkR2hwY3k1dmNIUnpMbVZzWlcxbGJuUXVkbUZzS0NrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z2MzQnNhWFJXWVd3b2RtRnNMQ0IwYUdsekxtOXdkSE11YzJWd1lYSmhkRzl5S1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ0lIMHNYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDOHZJRzExYkhScFhISmNiaUFnSUNBZ0lDQWdjMlYwVm1Gc09pQm1kVzVqZEdsdmJpQW9kbUZzS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUhaaGNpQjFibWx4ZFdVN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUdsbUlDaDBhR2x6TG5ObGJHVmpkQ2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTV6Wld4bFkzUXVkbUZzS0haaGJDazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIMGdaV3h6WlNCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjFibWx4ZFdVZ1BTQmJYVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUM4dklHWnBiSFJsY2lCdmRYUWdaSFZ3YkdsallYUmxjMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSkNoMllXd3BMbVZoWTJnb1puVnVZM1JwYjI0Z0tDa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2hwYm1SbGVFOW1LSFJvYVhNc0lIVnVhWEYxWlNrZ1BDQXdLU0IxYm1seGRXVXVjSFZ6YUNoMGFHbHpLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgwcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1dmNIUnpMbVZzWlcxbGJuUXVkbUZzS0hWdWFYRjFaUzVzWlc1bmRHZ2dQVDA5SURBZ1B5QmNJbHdpSURvZ2RXNXBjWFZsTG1wdmFXNG9kR2hwY3k1dmNIUnpMbk5sY0dGeVlYUnZjaWtwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUNBZ2ZTeGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0x5OGdiWFZzZEdsY2NseHVJQ0FnSUNBZ0lDQmlkV2xzWkVOb1lXNW5aVVJsZEdGcGJITTZJR1oxYm1OMGFXOXVJQ2h2YkdRc0lHTjFjbkpsYm5RcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RtRnlJR04xY25KbGJuUWdQU0JqZFhKeVpXNTBMbk5zYVdObEtEQXBMRnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYjJ4a0lEMGdiMnhrTG5Oc2FXTmxLREFwTzF4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0x5OGdjbVZ0YjNabElHbHVkR1Z5YzJWamRHbHZiaUJtY205dElHVmhZMmdnWVhKeVlYbGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ1ptOXlJQ2gyWVhJZ2FTQTlJREE3SUdrZ1BDQmpkWEp5Wlc1MExteGxibWQwYURzZ2FTc3JLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCbWIzSWdLSFpoY2lCcUlEMGdNRHNnYWlBOElHOXNaQzVzWlc1bmRHZzdJR29yS3lrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbUlDaGxjWFZoYkNoMGFHbHpMbTl3ZEhNdWFXUW9ZM1Z5Y21WdWRGdHBYU2tzSUhSb2FYTXViM0IwY3k1cFpDaHZiR1JiYWwwcEtTa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JqZFhKeVpXNTBMbk53YkdsalpTaHBMQ0F4S1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FTMHRPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J2YkdRdWMzQnNhV05sS0dvc0lERXBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JxTFMwN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCOVhISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z2UyRmtaR1ZrT2lCamRYSnlaVzUwTENCeVpXMXZkbVZrT2lCdmJHUjlPMXh5WEc0Z0lDQWdJQ0FnSUgwc1hISmNibHh5WEc1Y2NseHVJQ0FnSUNBZ0lDQXZMeUJ0ZFd4MGFWeHlYRzRnSUNBZ0lDQWdJSFpoYkRvZ1puVnVZM1JwYjI0Z0tIWmhiQ3dnZEhKcFoyZGxja05vWVc1blpTa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjJZWElnYjJ4a1JHRjBZU3dnYzJWc1pqMTBhR2x6TENCamFHRnVaMlZFWlhSaGFXeHpPMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tHRnlaM1Z0Wlc1MGN5NXNaVzVuZEdnZ1BUMDlJREFwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lISmxkSFZ5YmlCMGFHbHpMbWRsZEZaaGJDZ3BPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0J2YkdSRVlYUmhQWFJvYVhNdVpHRjBZU2dwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb0lXOXNaRVJoZEdFdWJHVnVaM1JvS1NCdmJHUkVZWFJoUFZ0ZE8xeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdMeThnZG1Gc0lHbHpJR0Z1SUdsa0xpQWhkbUZzSUdseklIUnlkV1VnWm05eUlGdDFibVJsWm1sdVpXUXNiblZzYkN3bkp5d3dYU0F0SURBZ2FYTWdiR1ZuWVd4Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tDRjJZV3dnSmlZZ2RtRnNJQ0U5UFNBd0tTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxtOXdkSE11Wld4bGJXVnVkQzUyWVd3b1hDSmNJaWs3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMblZ3WkdGMFpWTmxiR1ZqZEdsdmJpaGJYU2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbU5zWldGeVUyVmhjbU5vS0NrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaaUFvZEhKcFoyZGxja05vWVc1blpTa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11ZEhKcFoyZGxja05vWVc1blpTaDdZV1JrWldRNklIUm9hWE11WkdGMFlTZ3BMQ0J5WlcxdmRtVmtPaUJ2YkdSRVlYUmhmU2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200N1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDOHZJSFpoYkNCcGN5QmhJR3hwYzNRZ2IyWWdhV1J6WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdWMyVjBWbUZzS0haaGJDazdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2RHaHBjeTV6Wld4bFkzUXBJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSb2FYTXViM0IwY3k1cGJtbDBVMlZzWldOMGFXOXVLSFJvYVhNdWMyVnNaV04wTENCMGFHbHpMbUpwYm1Rb2RHaHBjeTUxY0dSaGRHVlRaV3hsWTNScGIyNHBLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbUlDaDBjbWxuWjJWeVEyaGhibWRsS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NTBjbWxuWjJWeVEyaGhibWRsS0hSb2FYTXVZblZwYkdSRGFHRnVaMlZFWlhSaGFXeHpLRzlzWkVSaGRHRXNJSFJvYVhNdVpHRjBZU2dwS1NrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIMGdaV3h6WlNCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaaUFvZEdocGN5NXZjSFJ6TG1sdWFYUlRaV3hsWTNScGIyNGdQVDA5SUhWdVpHVm1hVzVsWkNrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSb2NtOTNJRzVsZHlCRmNuSnZjaWhjSW5aaGJDZ3BJR05oYm01dmRDQmlaU0JqWVd4c1pXUWdhV1lnYVc1cGRGTmxiR1ZqZEdsdmJpZ3BJR2x6SUc1dmRDQmtaV1pwYm1Wa1hDSXBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdWIzQjBjeTVwYm1sMFUyVnNaV04wYVc5dUtIUm9hWE11YjNCMGN5NWxiR1Z0Wlc1MExDQm1kVzVqZEdsdmJpaGtZWFJoS1h0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IyWVhJZ2FXUnpQU1F1YldGd0tHUmhkR0VzSUhObGJHWXVhV1FwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSE5sYkdZdWMyVjBWbUZzS0dsa2N5azdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2MyVnNaaTUxY0dSaGRHVlRaV3hsWTNScGIyNG9aR0YwWVNrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYzJWc1ppNWpiR1ZoY2xObFlYSmphQ2dwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtSUNoMGNtbG5aMlZ5UTJoaGJtZGxLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhObGJHWXVkSEpwWjJkbGNrTm9ZVzVuWlNoelpXeG1MbUoxYVd4a1EyaGhibWRsUkdWMFlXbHNjeWh2YkdSRVlYUmhMQ0IwYUdsekxtUmhkR0VvS1NrcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMHBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11WTJ4bFlYSlRaV0Z5WTJnb0tUdGNjbHh1SUNBZ0lDQWdJQ0I5TEZ4eVhHNWNjbHh1SUNBZ0lDQWdJQ0F2THlCdGRXeDBhVnh5WEc0Z0lDQWdJQ0FnSUc5dVUyOXlkRk4wWVhKME9pQm1kVzVqZEdsdmJpZ3BJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdhV1lnS0hSb2FYTXVjMlZzWldOMEtTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYUhKdmR5QnVaWGNnUlhKeWIzSW9YQ0pUYjNKMGFXNW5JRzltSUdWc1pXMWxiblJ6SUdseklHNXZkQ0J6ZFhCd2IzSjBaV1FnZDJobGJpQmhkSFJoWTJobFpDQjBieUE4YzJWc1pXTjBQaTRnUVhSMFlXTm9JSFJ2SUR4cGJuQjFkQ0IwZVhCbFBTZG9hV1JrWlc0bkx6NGdhVzV6ZEdWaFpDNWNJaWs3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUM4dklHTnZiR3hoY0hObElITmxZWEpqYUNCbWFXVnNaQ0JwYm5SdklEQWdkMmxrZEdnZ2MyOGdhWFJ6SUdOdmJuUmhhVzVsY2lCallXNGdZbVVnWTI5c2JHRndjMlZrSUdGeklIZGxiR3hjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1elpXRnlZMmd1ZDJsa2RHZ29NQ2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQzh2SUdocFpHVWdkR2hsSUdOdmJuUmhhVzVsY2x4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxuTmxZWEpqYUVOdmJuUmhhVzVsY2k1b2FXUmxLQ2s3WEhKY2JpQWdJQ0FnSUNBZ2ZTeGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0x5OGdiWFZzZEdsY2NseHVJQ0FnSUNBZ0lDQnZibE52Y25SRmJtUTZablZ1WTNScGIyNG9LU0I3WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSUNCMllYSWdkbUZzUFZ0ZExDQnpaV3htUFhSb2FYTTdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0F2THlCemFHOTNJSE5sWVhKamFDQmhibVFnYlc5MlpTQnBkQ0IwYnlCMGFHVWdaVzVrSUc5bUlIUm9aU0JzYVhOMFhISmNiaUFnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVjMlZoY21Ob1EyOXVkR0ZwYm1WeUxuTm9iM2NvS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnTHk4Z2JXRnJaU0J6ZFhKbElIUm9aU0J6WldGeVkyZ2dZMjl1ZEdGcGJtVnlJR2x6SUhSb1pTQnNZWE4wSUdsMFpXMGdhVzRnZEdobElHeHBjM1JjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1elpXRnlZMmhEYjI1MFlXbHVaWEl1WVhCd1pXNWtWRzhvZEdocGN5NXpaV0Z5WTJoRGIyNTBZV2x1WlhJdWNHRnlaVzUwS0NrcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBdkx5QnphVzVqWlNCM1pTQmpiMnhzWVhCelpXUWdkR2hsSUhkcFpIUm9JR2x1SUdSeVlXZFRkR0Z5ZEdWa0xDQjNaU0J5WlhOcGVtVWdhWFFnYUdWeVpWeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbkpsYzJsNlpWTmxZWEpqYUNncE8xeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdMeThnZFhCa1lYUmxJSE5sYkdWamRHbHZibHh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjBhR2x6TG5ObGJHVmpkR2x2Ymk1bWFXNWtLRndpTG5ObGJHVmpkREl0YzJWaGNtTm9MV05vYjJsalpWd2lLUzVsWVdOb0tHWjFibU4wYVc5dUtDa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZG1Gc0xuQjFjMmdvYzJWc1ppNXZjSFJ6TG1sa0tDUW9kR2hwY3lrdVpHRjBZU2hjSW5ObGJHVmpkREl0WkdGMFlWd2lLU2twTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0I5S1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NXpaWFJXWVd3b2RtRnNLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1MGNtbG5aMlZ5UTJoaGJtZGxLQ2s3WEhKY2JpQWdJQ0FnSUNBZ2ZTeGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0x5OGdiWFZzZEdsY2NseHVJQ0FnSUNBZ0lDQmtZWFJoT2lCbWRXNWpkR2x2YmloMllXeDFaWE1zSUhSeWFXZG5aWEpEYUdGdVoyVXBJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdkbUZ5SUhObGJHWTlkR2hwY3l3Z2FXUnpMQ0J2YkdRN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUdsbUlDaGhjbWQxYldWdWRITXViR1Z1WjNSb0lEMDlQU0F3S1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlIUm9hWE11YzJWc1pXTjBhVzl1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQzVtYVc1a0tGd2lMbk5sYkdWamRESXRjMlZoY21Ob0xXTm9iMmxqWlZ3aUtWeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBdWJXRndLR1oxYm1OMGFXOXVLQ2tnZXlCeVpYUjFjbTRnSkNoMGFHbHpLUzVrWVhSaEtGd2ljMlZzWldOME1pMWtZWFJoWENJcE95QjlLVnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQXVaMlYwS0NrN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUgwZ1pXeHpaU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCdmJHUWdQU0IwYUdsekxtUmhkR0VvS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2doZG1Gc2RXVnpLU0I3SUhaaGJIVmxjeUE5SUZ0ZE95QjlYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWkhNZ1BTQWtMbTFoY0NoMllXeDFaWE1zSUdaMWJtTjBhVzl1S0dVcElIc2djbVYwZFhKdUlITmxiR1l1YjNCMGN5NXBaQ2hsS1RzZ2ZTazdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxuTmxkRlpoYkNocFpITXBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NTFjR1JoZEdWVFpXeGxZM1JwYjI0b2RtRnNkV1Z6S1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11WTJ4bFlYSlRaV0Z5WTJnb0tUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtSUNoMGNtbG5aMlZ5UTJoaGJtZGxLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1MGNtbG5aMlZ5UTJoaGJtZGxLSFJvYVhNdVluVnBiR1JEYUdGdVoyVkVaWFJoYVd4ektHOXNaQ3dnZEdocGN5NWtZWFJoS0NrcEtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUgwcE8xeHlYRzVjY2x4dUlDQWdJQ1F1Wm00dWMyVnNaV04wTWlBOUlHWjFibU4wYVc5dUlDZ3BJSHRjY2x4dVhISmNiaUFnSUNBZ0lDQWdkbUZ5SUdGeVozTWdQU0JCY25KaGVTNXdjbTkwYjNSNWNHVXVjMnhwWTJVdVkyRnNiQ2hoY21kMWJXVnVkSE1zSURBcExGeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCdmNIUnpMRnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQnpaV3hsWTNReUxGeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCdFpYUm9iMlFzSUhaaGJIVmxMQ0J0ZFd4MGFYQnNaU3hjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdZV3hzYjNkbFpFMWxkR2h2WkhNZ1BTQmJYQ0oyWVd4Y0lpd2dYQ0prWlhOMGNtOTVYQ0lzSUZ3aWIzQmxibVZrWENJc0lGd2liM0JsYmx3aUxDQmNJbU5zYjNObFhDSXNJRndpWm05amRYTmNJaXdnWENKcGMwWnZZM1Z6WldSY0lpd2dYQ0pqYjI1MFlXbHVaWEpjSWl3Z1hDSmtjbTl3Wkc5M2Jsd2lMQ0JjSW05dVUyOXlkRk4wWVhKMFhDSXNJRndpYjI1VGIzSjBSVzVrWENJc0lGd2laVzVoWW14bFhDSXNJRndpWkdsellXSnNaVndpTENCY0luSmxZV1J2Ym14NVhDSXNJRndpY0c5emFYUnBiMjVFY205d1pHOTNibHdpTENCY0ltUmhkR0ZjSWl3Z1hDSnpaV0Z5WTJoY0lsMHNYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIWmhiSFZsVFdWMGFHOWtjeUE5SUZ0Y0ltOXdaVzVsWkZ3aUxDQmNJbWx6Um05amRYTmxaRndpTENCY0ltTnZiblJoYVc1bGNsd2lMQ0JjSW1SeWIzQmtiM2R1WENKZExGeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCd2NtOXdaWEowZVUxbGRHaHZaSE1nUFNCYlhDSjJZV3hjSWl3Z1hDSmtZWFJoWENKZExGeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCdFpYUm9iMlJ6VFdGd0lEMGdleUJ6WldGeVkyZzZJRndpWlhoMFpYSnVZV3hUWldGeVkyaGNJaUI5TzF4eVhHNWNjbHh1SUNBZ0lDQWdJQ0IwYUdsekxtVmhZMmdvWm5WdVkzUnBiMjRnS0NrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCcFppQW9ZWEpuY3k1c1pXNW5kR2dnUFQwOUlEQWdmSHdnZEhsd1pXOW1LR0Z5WjNOYk1GMHBJRDA5UFNCY0ltOWlhbVZqZEZ3aUtTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J2Y0hSeklEMGdZWEpuY3k1c1pXNW5kR2dnUFQwOUlEQWdQeUI3ZlNBNklDUXVaWGgwWlc1a0tIdDlMQ0JoY21keld6QmRLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUc5d2RITXVaV3hsYldWdWRDQTlJQ1FvZEdocGN5azdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLRzl3ZEhNdVpXeGxiV1Z1ZEM1blpYUW9NQ2t1ZEdGblRtRnRaUzUwYjB4dmQyVnlRMkZ6WlNncElEMDlQU0JjSW5ObGJHVmpkRndpS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYlhWc2RHbHdiR1VnUFNCdmNIUnpMbVZzWlcxbGJuUXVjSEp2Y0NoY0ltMTFiSFJwY0d4bFhDSXBPMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlNCbGJITmxJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnRkV3gwYVhCc1pTQTlJRzl3ZEhNdWJYVnNkR2x3YkdVZ2ZId2dabUZzYzJVN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tGd2lkR0ZuYzF3aUlHbHVJRzl3ZEhNcElIdHZjSFJ6TG0xMWJIUnBjR3hsSUQwZ2JYVnNkR2x3YkdVZ1BTQjBjblZsTzMxY2NseHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCelpXeGxZM1F5SUQwZ2JYVnNkR2x3YkdVZ1B5QnVaWGNnVFhWc2RHbFRaV3hsWTNReUtDa2dPaUJ1WlhjZ1UybHVaMnhsVTJWc1pXTjBNaWdwTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2MyVnNaV04wTWk1cGJtbDBLRzl3ZEhNcE8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCOUlHVnNjMlVnYVdZZ0tIUjVjR1Z2WmloaGNtZHpXekJkS1NBOVBUMGdYQ0p6ZEhKcGJtZGNJaWtnZTF4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtSUNocGJtUmxlRTltS0dGeVozTmJNRjBzSUdGc2JHOTNaV1JOWlhSb2IyUnpLU0E4SURBcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFISnZkeUJjSWxWdWEyNXZkMjRnYldWMGFHOWtPaUJjSWlBcklHRnlaM05iTUYwN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RtRnNkV1VnUFNCMWJtUmxabWx1WldRN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnpaV3hsWTNReUlEMGdKQ2gwYUdsektTNWtZWFJoS0Z3aWMyVnNaV04wTWx3aUtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtSUNoelpXeGxZM1F5SUQwOVBTQjFibVJsWm1sdVpXUXBJSEpsZEhWeWJqdGNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCdFpYUm9iMlE5WVhKbmMxc3dYVHRjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaaUFvYldWMGFHOWtJRDA5UFNCY0ltTnZiblJoYVc1bGNsd2lLU0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkbUZzZFdVZ1BTQnpaV3hsWTNReUxtTnZiblJoYVc1bGNqdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDBnWld4elpTQnBaaUFvYldWMGFHOWtJRDA5UFNCY0ltUnliM0JrYjNkdVhDSXBJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjJZV3gxWlNBOUlITmxiR1ZqZERJdVpISnZjR1J2ZDI0N1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlJR1ZzYzJVZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbUlDaHRaWFJvYjJSelRXRndXMjFsZEdodlpGMHBJRzFsZEdodlpDQTlJRzFsZEdodlpITk5ZWEJiYldWMGFHOWtYVHRjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZG1Gc2RXVWdQU0J6Wld4bFkzUXlXMjFsZEdodlpGMHVZWEJ3Ykhrb2MyVnNaV04wTWl3Z1lYSm5jeTV6YkdsalpTZ3hLU2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaaUFvYVc1a1pYaFBaaWhoY21keld6QmRMQ0IyWVd4MVpVMWxkR2h2WkhNcElENDlJREJjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjhmQ0FvYVc1a1pYaFBaaWhoY21keld6QmRMQ0J3Y205d1pYSjBlVTFsZEdodlpITXBJQ1ltSUdGeVozTXViR1Z1WjNSb0lEMDlJREVwS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJR1poYkhObE95QXZMeUJoWW05eWRDQjBhR1VnYVhSbGNtRjBhVzl1TENCeVpXRmtlU0IwYnlCeVpYUjFjbTRnWm1seWMzUWdiV0YwWTJobFpDQjJZV3gxWlZ4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCOUlHVnNjMlVnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHaHliM2NnWENKSmJuWmhiR2xrSUdGeVozVnRaVzUwY3lCMGJ5QnpaV3hsWTNReUlIQnNkV2RwYmpvZ1hDSWdLeUJoY21kek8xeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lDQWdmU2s3WEhKY2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUNoMllXeDFaU0E5UFQwZ2RXNWtaV1pwYm1Wa0tTQS9JSFJvYVhNZ09pQjJZV3gxWlR0Y2NseHVJQ0FnSUgwN1hISmNibHh5WEc0Z0lDQWdMeThnY0d4MVoybHVJR1JsWm1GMWJIUnpMQ0JoWTJObGMzTnBZbXhsSUhSdklIVnpaWEp6WEhKY2JpQWdJQ0FrTG1adUxuTmxiR1ZqZERJdVpHVm1ZWFZzZEhNZ1BTQjdYSEpjYmlBZ0lDQWdJQ0FnZDJsa2RHZzZJRndpWTI5d2VWd2lMRnh5WEc0Z0lDQWdJQ0FnSUd4dllXUk5iM0psVUdGa1pHbHVaem9nTUN4Y2NseHVJQ0FnSUNBZ0lDQmpiRzl6WlU5dVUyVnNaV04wT2lCMGNuVmxMRnh5WEc0Z0lDQWdJQ0FnSUc5d1pXNVBia1Z1ZEdWeU9pQjBjblZsTEZ4eVhHNGdJQ0FnSUNBZ0lHTnZiblJoYVc1bGNrTnpjem9nZTMwc1hISmNiaUFnSUNBZ0lDQWdaSEp2Y0dSdmQyNURjM002SUh0OUxGeHlYRzRnSUNBZ0lDQWdJR052Ym5SaGFXNWxja056YzBOc1lYTnpPaUJjSWx3aUxGeHlYRzRnSUNBZ0lDQWdJR1J5YjNCa2IzZHVRM056UTJ4aGMzTTZJRndpWENJc1hISmNiaUFnSUNBZ0lDQWdabTl5YldGMFVtVnpkV3gwT2lCbWRXNWpkR2x2YmloeVpYTjFiSFFzSUdOdmJuUmhhVzVsY2l3Z2NYVmxjbmtzSUdWelkyRndaVTFoY210MWNDa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjJZWElnYldGeWEzVndQVnRkTzF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0J0WVhKclRXRjBZMmdvY21WemRXeDBMblJsZUhRc0lIRjFaWEo1TG5SbGNtMHNJRzFoY210MWNDd2daWE5qWVhCbFRXRnlhM1Z3S1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJRzFoY210MWNDNXFiMmx1S0Z3aVhDSXBPMXh5WEc0Z0lDQWdJQ0FnSUgwc1hISmNiaUFnSUNBZ0lDQWdabTl5YldGMFUyVnNaV04wYVc5dU9pQm1kVzVqZEdsdmJpQW9aR0YwWVN3Z1kyOXVkR0ZwYm1WeUxDQmxjMk5oY0dWTllYSnJkWEFwSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJR1JoZEdFZ1B5QmxjMk5oY0dWTllYSnJkWEFvWkdGMFlTNTBaWGgwS1NBNklIVnVaR1ZtYVc1bFpEdGNjbHh1SUNBZ0lDQWdJQ0I5TEZ4eVhHNGdJQ0FnSUNBZ0lITnZjblJTWlhOMWJIUnpPaUJtZFc1amRHbHZiaUFvY21WemRXeDBjeXdnWTI5dWRHRnBibVZ5TENCeGRXVnllU2tnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0J5WlhSMWNtNGdjbVZ6ZFd4MGN6dGNjbHh1SUNBZ0lDQWdJQ0I5TEZ4eVhHNGdJQ0FnSUNBZ0lHWnZjbTFoZEZKbGMzVnNkRU56YzBOc1lYTnpPaUJtZFc1amRHbHZiaWhrWVhSaEtTQjdjbVYwZFhKdUlIVnVaR1ZtYVc1bFpEdDlMRnh5WEc0Z0lDQWdJQ0FnSUdadmNtMWhkRk5sYkdWamRHbHZia056YzBOc1lYTnpPaUJtZFc1amRHbHZiaWhrWVhSaExDQmpiMjUwWVdsdVpYSXBJSHR5WlhSMWNtNGdkVzVrWldacGJtVmtPMzBzWEhKY2JpQWdJQ0FnSUNBZ1ptOXliV0YwVG05TllYUmphR1Z6T2lCbWRXNWpkR2x2YmlBb0tTQjdJSEpsZEhWeWJpQmNJazV2SUcxaGRHTm9aWE1nWm05MWJtUmNJanNnZlN4Y2NseHVJQ0FnSUNBZ0lDQm1iM0p0WVhSSmJuQjFkRlJ2YjFOb2IzSjBPaUJtZFc1amRHbHZiaUFvYVc1d2RYUXNJRzFwYmlrZ2V5QjJZWElnYmlBOUlHMXBiaUF0SUdsdWNIVjBMbXhsYm1kMGFEc2djbVYwZFhKdUlGd2lVR3hsWVhObElHVnVkR1Z5SUZ3aUlDc2diaUFySUZ3aUlHMXZjbVVnWTJoaGNtRmpkR1Z5WENJZ0t5QW9iaUE5UFNBeFB5QmNJbHdpSURvZ1hDSnpYQ0lwT3lCOUxGeHlYRzRnSUNBZ0lDQWdJR1p2Y20xaGRFbHVjSFYwVkc5dlRHOXVaem9nWm5WdVkzUnBiMjRnS0dsdWNIVjBMQ0J0WVhncElIc2dkbUZ5SUc0Z1BTQnBibkIxZEM1c1pXNW5kR2dnTFNCdFlYZzdJSEpsZEhWeWJpQmNJbEJzWldGelpTQmtaV3hsZEdVZ1hDSWdLeUJ1SUNzZ1hDSWdZMmhoY21GamRHVnlYQ0lnS3lBb2JpQTlQU0F4UHlCY0lsd2lJRG9nWENKelhDSXBPeUI5TEZ4eVhHNGdJQ0FnSUNBZ0lHWnZjbTFoZEZObGJHVmpkR2x2YmxSdmIwSnBaem9nWm5WdVkzUnBiMjRnS0d4cGJXbDBLU0I3SUhKbGRIVnliaUJjSWxsdmRTQmpZVzRnYjI1c2VTQnpaV3hsWTNRZ1hDSWdLeUJzYVcxcGRDQXJJRndpSUdsMFpXMWNJaUFySUNoc2FXMXBkQ0E5UFNBeElEOGdYQ0pjSWlBNklGd2ljMXdpS1RzZ2ZTeGNjbHh1SUNBZ0lDQWdJQ0JtYjNKdFlYUk1iMkZrVFc5eVpUb2dablZ1WTNScGIyNGdLSEJoWjJWT2RXMWlaWElwSUhzZ2NtVjBkWEp1SUZ3aVRHOWhaR2x1WnlCdGIzSmxJSEpsYzNWc2RITXVMaTVjSWpzZ2ZTeGNjbHh1SUNBZ0lDQWdJQ0JtYjNKdFlYUlRaV0Z5WTJocGJtYzZJR1oxYm1OMGFXOXVJQ2dwSUhzZ2NtVjBkWEp1SUZ3aVUyVmhjbU5vYVc1bkxpNHVYQ0k3SUgwc1hISmNiaUFnSUNBZ0lDQWdiV2x1YVcxMWJWSmxjM1ZzZEhOR2IzSlRaV0Z5WTJnNklEQXNYSEpjYmlBZ0lDQWdJQ0FnYldsdWFXMTFiVWx1Y0hWMFRHVnVaM1JvT2lBd0xGeHlYRzRnSUNBZ0lDQWdJRzFoZUdsdGRXMUpibkIxZEV4bGJtZDBhRG9nYm5Wc2JDeGNjbHh1SUNBZ0lDQWdJQ0J0WVhocGJYVnRVMlZzWldOMGFXOXVVMmw2WlRvZ01DeGNjbHh1SUNBZ0lDQWdJQ0JwWkRvZ1puVnVZM1JwYjI0Z0tHVXBJSHNnY21WMGRYSnVJR1V1YVdRN0lIMHNYSEpjYmlBZ0lDQWdJQ0FnYldGMFkyaGxjam9nWm5WdVkzUnBiMjRvZEdWeWJTd2dkR1Y0ZENrZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnYzNSeWFYQkVhV0ZqY21sMGFXTnpLQ2NuSzNSbGVIUXBMblJ2VlhCd1pYSkRZWE5sS0NrdWFXNWtaWGhQWmloemRISnBjRVJwWVdOeWFYUnBZM01vSnljcmRHVnliU2t1ZEc5VmNIQmxja05oYzJVb0tTa2dQajBnTUR0Y2NseHVJQ0FnSUNBZ0lDQjlMRnh5WEc0Z0lDQWdJQ0FnSUhObGNHRnlZWFJ2Y2pvZ1hDSXNYQ0lzWEhKY2JpQWdJQ0FnSUNBZ2RHOXJaVzVUWlhCaGNtRjBiM0p6T2lCYlhTeGNjbHh1SUNBZ0lDQWdJQ0IwYjJ0bGJtbDZaWEk2SUdSbFptRjFiSFJVYjJ0bGJtbDZaWElzWEhKY2JpQWdJQ0FnSUNBZ1pYTmpZWEJsVFdGeWEzVndPaUJrWldaaGRXeDBSWE5qWVhCbFRXRnlhM1Z3TEZ4eVhHNGdJQ0FnSUNBZ0lHSnNkWEpQYmtOb1lXNW5aVG9nWm1Gc2MyVXNYSEpjYmlBZ0lDQWdJQ0FnYzJWc1pXTjBUMjVDYkhWeU9pQm1ZV3h6WlN4Y2NseHVJQ0FnSUNBZ0lDQmhaR0Z3ZEVOdmJuUmhhVzVsY2tOemMwTnNZWE56T2lCbWRXNWpkR2x2YmloaktTQjdJSEpsZEhWeWJpQmpPeUI5TEZ4eVhHNGdJQ0FnSUNBZ0lHRmtZWEIwUkhKdmNHUnZkMjVEYzNORGJHRnpjem9nWm5WdVkzUnBiMjRvWXlrZ2V5QnlaWFIxY200Z2JuVnNiRHNnZlN4Y2NseHVJQ0FnSUNBZ0lDQnVaWGgwVTJWaGNtTm9WR1Z5YlRvZ1puVnVZM1JwYjI0b2MyVnNaV04wWldSUFltcGxZM1FzSUdOMWNuSmxiblJUWldGeVkyaFVaWEp0S1NCN0lISmxkSFZ5YmlCMWJtUmxabWx1WldRN0lIMWNjbHh1SUNBZ0lIMDdYSEpjYmx4eVhHNGdJQ0FnSkM1bWJpNXpaV3hsWTNReUxtRnFZWGhFWldaaGRXeDBjeUE5SUh0Y2NseHVJQ0FnSUNBZ0lDQjBjbUZ1YzNCdmNuUTZJQ1F1WVdwaGVDeGNjbHh1SUNBZ0lDQWdJQ0J3WVhKaGJYTTZJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdkSGx3WlRvZ1hDSkhSVlJjSWl4Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnWTJGamFHVTZJR1poYkhObExGeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCa1lYUmhWSGx3WlRvZ1hDSnFjMjl1WENKY2NseHVJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQjlPMXh5WEc1Y2NseHVJQ0FnSUM4dklHVjRjRzl5ZEhOY2NseHVJQ0FnSUhkcGJtUnZkeTVUWld4bFkzUXlJRDBnZTF4eVhHNGdJQ0FnSUNBZ0lIRjFaWEo1T2lCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUdGcVlYZzZJR0ZxWVhnc1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUd4dlkyRnNPaUJzYjJOaGJDeGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RHRm5jem9nZEdGbmMxeHlYRzRnSUNBZ0lDQWdJSDBzSUhWMGFXdzZJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdaR1ZpYjNWdVkyVTZJR1JsWW05MWJtTmxMRnh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQnRZWEpyVFdGMFkyZzZJRzFoY210TllYUmphQ3hjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdaWE5qWVhCbFRXRnlhM1Z3T2lCa1pXWmhkV3gwUlhOallYQmxUV0Z5YTNWd0xGeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCemRISnBjRVJwWVdOeWFYUnBZM002SUhOMGNtbHdSR2xoWTNKcGRHbGpjMXh5WEc0Z0lDQWdJQ0FnSUgwc0lGd2lZMnhoYzNOY0lqb2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQmNJbUZpYzNSeVlXTjBYQ0k2SUVGaWMzUnlZV04wVTJWc1pXTjBNaXhjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdYQ0p6YVc1bmJHVmNJam9nVTJsdVoyeGxVMlZzWldOME1peGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ1hDSnRkV3gwYVZ3aU9pQk5kV3gwYVZObGJHVmpkREpjY2x4dUlDQWdJQ0FnSUNCOVhISmNiaUFnSUNCOU8xeHlYRzVjY2x4dWZTaHFVWFZsY25rcEtUdGNjbHh1WEhKY2JseHVmU2t1WTJGc2JDaG5iRzlpWVd3c0lHMXZaSFZzWlN3Z2RXNWtaV1pwYm1Wa0xDQjFibVJsWm1sdVpXUXBPMXh1SWwxOSIsIihmdW5jdGlvbiAoZ2xvYmFsKXtcblxuOyBqUXVlcnkgPSBnbG9iYWwualF1ZXJ5ID0gcmVxdWlyZShcImpxdWVyeVwiKTtcbjsgdmFyIF9fYnJvd3NlcmlmeV9zaGltX3JlcXVpcmVfXz1yZXF1aXJlOyhmdW5jdGlvbiBicm93c2VyaWZ5U2hpbShtb2R1bGUsIGRlZmluZSwgcmVxdWlyZSkge1xuLyoqXG4gKiBTdXBlciBzaW1wbGUgd3lzaXd5ZyBlZGl0b3Igb24gQm9vdHN0cmFwIHYwLjYuM1xuICogaHR0cDovL3N1bW1lcm5vdGUub3JnL1xuICpcbiAqIHN1bW1lcm5vdGUuanNcbiAqIENvcHlyaWdodCAyMDEzLTIwMTUgQWxhbiBIb25nLiBhbmQgb3RoZXIgY29udHJpYnV0b3JzXG4gKiBzdW1tZXJub3RlIG1heSBiZSBmcmVlbHkgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLi9cbiAqXG4gKiBEYXRlOiAyMDE1LTA0LTA4VDEzOjI4WlxuICovXG4oZnVuY3Rpb24gKGZhY3RvcnkpIHtcblx0LyogZ2xvYmFsIGRlZmluZSAqL1xuXHRpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XG5cdFx0Ly8gQU1ELiBSZWdpc3RlciBhcyBhbiBhbm9ueW1vdXMgbW9kdWxlLlxuXHRcdGRlZmluZShbJ2pxdWVyeSddLCBmYWN0b3J5KTtcblx0fSBlbHNlIHtcblx0XHQvLyBCcm93c2VyIGdsb2JhbHM6IGpRdWVyeVxuXHRcdGZhY3Rvcnkod2luZG93LmpRdWVyeSk7XG5cdH1cbn0oZnVuY3Rpb24gKCQpIHtcblxuXG5cblx0aWYgKCFBcnJheS5wcm90b3R5cGUucmVkdWNlKSB7XG5cdFx0LyoqXG5cdFx0ICogQXJyYXkucHJvdG90eXBlLnJlZHVjZSBwb2x5ZmlsbFxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcblx0XHQgKiBAcGFyYW0ge1ZhbHVlfSBbaW5pdGlhbFZhbHVlXVxuXHRcdCAqIEByZXR1cm4ge1ZhbHVlfVxuXHRcdCAqXG5cdFx0ICogQHNlZSBodHRwOi8vZ29vLmdsL1dOcmlRRFxuXHRcdCAqL1xuXHRcdEFycmF5LnByb3RvdHlwZS5yZWR1Y2UgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcblx0XHRcdHZhciB0ID0gT2JqZWN0KHRoaXMpLCBsZW4gPSB0Lmxlbmd0aCA+Pj4gMCwgayA9IDAsIHZhbHVlO1xuXHRcdFx0aWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHtcblx0XHRcdFx0dmFsdWUgPSBhcmd1bWVudHNbMV07XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR3aGlsZSAoayA8IGxlbiAmJiAhKGsgaW4gdCkpIHtcblx0XHRcdFx0XHRrKys7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGsgPj0gbGVuKSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignUmVkdWNlIG9mIGVtcHR5IGFycmF5IHdpdGggbm8gaW5pdGlhbCB2YWx1ZScpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHZhbHVlID0gdFtrKytdO1xuXHRcdFx0fVxuXHRcdFx0Zm9yICg7IGsgPCBsZW47IGsrKykge1xuXHRcdFx0XHRpZiAoayBpbiB0KSB7XG5cdFx0XHRcdFx0dmFsdWUgPSBjYWxsYmFjayh2YWx1ZSwgdFtrXSwgaywgdCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHR9O1xuXHR9XG5cblx0aWYgKCdmdW5jdGlvbicgIT09IHR5cGVvZiBBcnJheS5wcm90b3R5cGUuZmlsdGVyKSB7XG5cdFx0LyoqXG5cdFx0ICogQXJyYXkucHJvdG90eXBlLmZpbHRlciBwb2x5ZmlsbFxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuY1xuXHRcdCAqIEByZXR1cm4ge0FycmF5fVxuXHRcdCAqXG5cdFx0ICogQHNlZSBodHRwOi8vZ29vLmdsL1QxS0ZucVxuXHRcdCAqL1xuXHRcdEFycmF5LnByb3RvdHlwZS5maWx0ZXIgPSBmdW5jdGlvbiAoZnVuYykge1xuXHRcdFx0dmFyIHQgPSBPYmplY3QodGhpcyksIGxlbiA9IHQubGVuZ3RoID4+PiAwO1xuXG5cdFx0XHR2YXIgcmVzID0gW107XG5cdFx0XHR2YXIgdGhpc0FyZyA9IGFyZ3VtZW50cy5sZW5ndGggPj0gMiA/IGFyZ3VtZW50c1sxXSA6IHZvaWQgMDtcblx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcblx0XHRcdFx0aWYgKGkgaW4gdCkge1xuXHRcdFx0XHRcdHZhciB2YWwgPSB0W2ldO1xuXHRcdFx0XHRcdGlmIChmdW5jLmNhbGwodGhpc0FyZywgdmFsLCBpLCB0KSkge1xuXHRcdFx0XHRcdFx0cmVzLnB1c2godmFsKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHJlcztcblx0XHR9O1xuXHR9XG5cblx0dmFyIGlzU3VwcG9ydEFtZCA9IHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZDtcblxuXHQvKipcblx0ICogcmV0dXJucyB3aGV0aGVyIGZvbnQgaXMgaW5zdGFsbGVkIG9yIG5vdC5cblx0ICpcblx0ICogQHBhcmFtIHtTdHJpbmd9IGZvbnROYW1lXG5cdCAqIEByZXR1cm4ge0Jvb2xlYW59XG5cdCAqL1xuXHR2YXIgaXNGb250SW5zdGFsbGVkID0gZnVuY3Rpb24gKGZvbnROYW1lKSB7XG5cdFx0dmFyIHRlc3RGb250TmFtZSA9IGZvbnROYW1lID09PSAnQ29taWMgU2FucyBNUycgPyAnQ291cmllciBOZXcnIDogJ0NvbWljIFNhbnMgTVMnO1xuXHRcdHZhciAkdGVzdGVyID0gJCgnPGRpdj4nKS5jc3Moe1xuXHRcdFx0cG9zaXRpb246ICdhYnNvbHV0ZScsXG5cdFx0XHRsZWZ0OiAnLTk5OTlweCcsXG5cdFx0XHR0b3A6ICctOTk5OXB4Jyxcblx0XHRcdGZvbnRTaXplOiAnMjAwcHgnXG5cdFx0fSkudGV4dCgnbW1tbW1tbW1td3d3d3d3dycpLmFwcGVuZFRvKGRvY3VtZW50LmJvZHkpO1xuXG5cdFx0dmFyIG9yaWdpbmFsV2lkdGggPSAkdGVzdGVyLmNzcygnZm9udEZhbWlseScsIHRlc3RGb250TmFtZSkud2lkdGgoKTtcblx0XHR2YXIgd2lkdGggPSAkdGVzdGVyLmNzcygnZm9udEZhbWlseScsIGZvbnROYW1lICsgJywnICsgdGVzdEZvbnROYW1lKS53aWR0aCgpO1xuXG5cdFx0JHRlc3Rlci5yZW1vdmUoKTtcblxuXHRcdHJldHVybiBvcmlnaW5hbFdpZHRoICE9PSB3aWR0aDtcblx0fTtcblxuXHQvKipcblx0ICogQGNsYXNzIGNvcmUuYWdlbnRcblx0ICpcblx0ICogT2JqZWN0IHdoaWNoIGNoZWNrIHBsYXRmb3JtIGFuZCBhZ2VudFxuXHQgKlxuXHQgKiBAc2luZ2xldG9uXG5cdCAqIEBhbHRlcm5hdGVDbGFzc05hbWUgYWdlbnRcblx0ICovXG5cdHZhciBhZ2VudCA9IHtcblx0XHQvKiogQHByb3BlcnR5IHtCb29sZWFufSBbaXNNYWM9ZmFsc2VdIHRydWUgaWYgdGhpcyBhZ2VudCBpcyBNYWMgICovXG5cdFx0aXNNYWM6IG5hdmlnYXRvci5hcHBWZXJzaW9uLmluZGV4T2YoJ01hYycpID4gLTEsXG5cdFx0LyoqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gW2lzTVNJRT1mYWxzZV0gdHJ1ZSBpZiB0aGlzIGFnZW50IGlzIGEgSW50ZXJuZXQgRXhwbG9yZXIgICovXG5cdFx0aXNNU0lFOiBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ01TSUUnKSA+IC0xIHx8IG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignVHJpZGVudCcpID4gLTEsXG5cdFx0LyoqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gW2lzRkY9ZmFsc2VdIHRydWUgaWYgdGhpcyBhZ2VudCBpcyBhIEZpcmVmb3ggICovXG5cdFx0aXNGRjogbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdGaXJlZm94JykgPiAtMSxcblx0XHQvKiogQHByb3BlcnR5IHtTdHJpbmd9IGpxdWVyeVZlcnNpb24gY3VycmVudCBqUXVlcnkgdmVyc2lvbiBzdHJpbmcgICovXG5cdFx0anF1ZXJ5VmVyc2lvbjogcGFyc2VGbG9hdCgkLmZuLmpxdWVyeSksXG5cdFx0aXNTdXBwb3J0QW1kOiBpc1N1cHBvcnRBbWQsXG5cdFx0aGFzQ29kZU1pcnJvcjogaXNTdXBwb3J0QW1kID8gcmVxdWlyZS5zcGVjaWZpZWQoJ0NvZGVNaXJyb3InKSA6ICEhd2luZG93LkNvZGVNaXJyb3IsXG5cdFx0aXNGb250SW5zdGFsbGVkOiBpc0ZvbnRJbnN0YWxsZWQsXG5cdFx0aXNXM0NSYW5nZVN1cHBvcnQ6ICEhZG9jdW1lbnQuY3JlYXRlUmFuZ2Vcblx0fTtcblxuXHQvKipcblx0ICogQGNsYXNzIGNvcmUuZnVuY1xuXHQgKlxuXHQgKiBmdW5jIHV0aWxzIChmb3IgaGlnaC1vcmRlciBmdW5jJ3MgYXJnKVxuXHQgKlxuXHQgKiBAc2luZ2xldG9uXG5cdCAqIEBhbHRlcm5hdGVDbGFzc05hbWUgZnVuY1xuXHQgKi9cblx0dmFyIGZ1bmMgPSAoZnVuY3Rpb24gKCkge1xuXHRcdHZhciBlcSA9IGZ1bmN0aW9uIChpdGVtQSkge1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uIChpdGVtQikge1xuXHRcdFx0XHRyZXR1cm4gaXRlbUEgPT09IGl0ZW1CO1xuXHRcdFx0fTtcblx0XHR9O1xuXG5cdFx0dmFyIGVxMiA9IGZ1bmN0aW9uIChpdGVtQSwgaXRlbUIpIHtcblx0XHRcdHJldHVybiBpdGVtQSA9PT0gaXRlbUI7XG5cdFx0fTtcblxuXHRcdHZhciBwZXEyID0gZnVuY3Rpb24gKHByb3BOYW1lKSB7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24gKGl0ZW1BLCBpdGVtQikge1xuXHRcdFx0XHRyZXR1cm4gaXRlbUFbcHJvcE5hbWVdID09PSBpdGVtQltwcm9wTmFtZV07XG5cdFx0XHR9O1xuXHRcdH07XG5cblx0XHR2YXIgb2sgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9O1xuXG5cdFx0dmFyIGZhaWwgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fTtcblxuXHRcdHZhciBub3QgPSBmdW5jdGlvbiAoZikge1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0cmV0dXJuICFmLmFwcGx5KGYsIGFyZ3VtZW50cyk7XG5cdFx0XHR9O1xuXHRcdH07XG5cblx0XHR2YXIgYW5kID0gZnVuY3Rpb24gKGZBLCBmQikge1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uIChpdGVtKSB7XG5cdFx0XHRcdHJldHVybiBmQShpdGVtKSAmJiBmQihpdGVtKTtcblx0XHRcdH07XG5cdFx0fTtcblxuXHRcdHZhciBzZWxmID0gZnVuY3Rpb24gKGEpIHtcblx0XHRcdHJldHVybiBhO1xuXHRcdH07XG5cblx0XHR2YXIgaWRDb3VudGVyID0gMDtcblxuXHRcdC8qKlxuXHRcdCAqIGdlbmVyYXRlIGEgZ2xvYmFsbHktdW5pcXVlIGlkXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gW3ByZWZpeF1cblx0XHQgKi9cblx0XHR2YXIgdW5pcXVlSWQgPSBmdW5jdGlvbiAocHJlZml4KSB7XG5cdFx0XHR2YXIgaWQgPSArK2lkQ291bnRlciArICcnO1xuXHRcdFx0cmV0dXJuIHByZWZpeCA/IHByZWZpeCArIGlkIDogaWQ7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIHJldHVybnMgYm5kIChib3VuZHMpIGZyb20gcmVjdFxuXHRcdCAqXG5cdFx0ICogLSBJRSBDb21wYXRhYmlsaXR5IElzc3VlOiBodHRwOi8vZ29vLmdsL3NSTE9Bb1xuXHRcdCAqIC0gU2Nyb2xsIElzc3VlOiBodHRwOi8vZ29vLmdsL3NOalVjXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge1JlY3R9IHJlY3Rcblx0XHQgKiBAcmV0dXJuIHtPYmplY3R9IGJvdW5kc1xuXHRcdCAqIEByZXR1cm4ge051bWJlcn0gYm91bmRzLnRvcFxuXHRcdCAqIEByZXR1cm4ge051bWJlcn0gYm91bmRzLmxlZnRcblx0XHQgKiBAcmV0dXJuIHtOdW1iZXJ9IGJvdW5kcy53aWR0aFxuXHRcdCAqIEByZXR1cm4ge051bWJlcn0gYm91bmRzLmhlaWdodFxuXHRcdCAqL1xuXHRcdHZhciByZWN0MmJuZCA9IGZ1bmN0aW9uIChyZWN0KSB7XG5cdFx0XHR2YXIgJGRvY3VtZW50ID0gJChkb2N1bWVudCk7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHR0b3A6IHJlY3QudG9wICsgJGRvY3VtZW50LnNjcm9sbFRvcCgpLFxuXHRcdFx0XHRsZWZ0OiByZWN0LmxlZnQgKyAkZG9jdW1lbnQuc2Nyb2xsTGVmdCgpLFxuXHRcdFx0XHR3aWR0aDogcmVjdC5yaWdodCAtIHJlY3QubGVmdCxcblx0XHRcdFx0aGVpZ2h0OiByZWN0LmJvdHRvbSAtIHJlY3QudG9wXG5cdFx0XHR9O1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiByZXR1cm5zIGEgY29weSBvZiB0aGUgb2JqZWN0IHdoZXJlIHRoZSBrZXlzIGhhdmUgYmVjb21lIHRoZSB2YWx1ZXMgYW5kIHRoZSB2YWx1ZXMgdGhlIGtleXMuXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IG9ialxuXHRcdCAqIEByZXR1cm4ge09iamVjdH1cblx0XHQgKi9cblx0XHR2YXIgaW52ZXJ0T2JqZWN0ID0gZnVuY3Rpb24gKG9iaikge1xuXHRcdFx0dmFyIGludmVydGVkID0ge307XG5cdFx0XHRmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG5cdFx0XHRcdGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkge1xuXHRcdFx0XHRcdGludmVydGVkW29ialtrZXldXSA9IGtleTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGludmVydGVkO1xuXHRcdH07XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0ZXE6IGVxLFxuXHRcdFx0ZXEyOiBlcTIsXG5cdFx0XHRwZXEyOiBwZXEyLFxuXHRcdFx0b2s6IG9rLFxuXHRcdFx0ZmFpbDogZmFpbCxcblx0XHRcdHNlbGY6IHNlbGYsXG5cdFx0XHRub3Q6IG5vdCxcblx0XHRcdGFuZDogYW5kLFxuXHRcdFx0dW5pcXVlSWQ6IHVuaXF1ZUlkLFxuXHRcdFx0cmVjdDJibmQ6IHJlY3QyYm5kLFxuXHRcdFx0aW52ZXJ0T2JqZWN0OiBpbnZlcnRPYmplY3Rcblx0XHR9O1xuXHR9KSgpO1xuXG5cdC8qKlxuXHQgKiBAY2xhc3MgY29yZS5saXN0XG5cdCAqXG5cdCAqIGxpc3QgdXRpbHNcblx0ICpcblx0ICogQHNpbmdsZXRvblxuXHQgKiBAYWx0ZXJuYXRlQ2xhc3NOYW1lIGxpc3Rcblx0ICovXG5cdHZhciBsaXN0ID0gKGZ1bmN0aW9uICgpIHtcblx0XHQvKipcblx0XHQgKiByZXR1cm5zIHRoZSBmaXJzdCBpdGVtIG9mIGFuIGFycmF5LlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtBcnJheX0gYXJyYXlcblx0XHQgKi9cblx0XHR2YXIgaGVhZCA9IGZ1bmN0aW9uIChhcnJheSkge1xuXHRcdFx0cmV0dXJuIGFycmF5WzBdO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiByZXR1cm5zIHRoZSBsYXN0IGl0ZW0gb2YgYW4gYXJyYXkuXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge0FycmF5fSBhcnJheVxuXHRcdCAqL1xuXHRcdHZhciBsYXN0ID0gZnVuY3Rpb24gKGFycmF5KSB7XG5cdFx0XHRyZXR1cm4gYXJyYXlbYXJyYXkubGVuZ3RoIC0gMV07XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIHJldHVybnMgZXZlcnl0aGluZyBidXQgdGhlIGxhc3QgZW50cnkgb2YgdGhlIGFycmF5LlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtBcnJheX0gYXJyYXlcblx0XHQgKi9cblx0XHR2YXIgaW5pdGlhbCA9IGZ1bmN0aW9uIChhcnJheSkge1xuXHRcdFx0cmV0dXJuIGFycmF5LnNsaWNlKDAsIGFycmF5Lmxlbmd0aCAtIDEpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiByZXR1cm5zIHRoZSByZXN0IG9mIHRoZSBpdGVtcyBpbiBhbiBhcnJheS5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7QXJyYXl9IGFycmF5XG5cdFx0ICovXG5cdFx0dmFyIHRhaWwgPSBmdW5jdGlvbiAoYXJyYXkpIHtcblx0XHRcdHJldHVybiBhcnJheS5zbGljZSgxKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogcmV0dXJucyBpdGVtIG9mIGFycmF5XG5cdFx0ICovXG5cdFx0dmFyIGZpbmQgPSBmdW5jdGlvbiAoYXJyYXksIHByZWQpIHtcblx0XHRcdGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGFycmF5Lmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuXHRcdFx0XHR2YXIgaXRlbSA9IGFycmF5W2lkeF07XG5cdFx0XHRcdGlmIChwcmVkKGl0ZW0pKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGl0ZW07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogcmV0dXJucyB0cnVlIGlmIGFsbCBvZiB0aGUgdmFsdWVzIGluIHRoZSBhcnJheSBwYXNzIHRoZSBwcmVkaWNhdGUgdHJ1dGggdGVzdC5cblx0XHQgKi9cblx0XHR2YXIgYWxsID0gZnVuY3Rpb24gKGFycmF5LCBwcmVkKSB7XG5cdFx0XHRmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBhcnJheS5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcblx0XHRcdFx0aWYgKCFwcmVkKGFycmF5W2lkeF0pKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogcmV0dXJucyB0cnVlIGlmIHRoZSB2YWx1ZSBpcyBwcmVzZW50IGluIHRoZSBsaXN0LlxuXHRcdCAqL1xuXHRcdHZhciBjb250YWlucyA9IGZ1bmN0aW9uIChhcnJheSwgaXRlbSkge1xuXHRcdFx0cmV0dXJuICQuaW5BcnJheShpdGVtLCBhcnJheSkgIT09IC0xO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBnZXQgc3VtIGZyb20gYSBsaXN0XG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge0FycmF5fSBhcnJheSAtIGFycmF5XG5cdFx0ICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gLSBpdGVyYXRvclxuXHRcdCAqL1xuXHRcdHZhciBzdW0gPSBmdW5jdGlvbiAoYXJyYXksIGZuKSB7XG5cdFx0XHRmbiA9IGZuIHx8IGZ1bmMuc2VsZjtcblx0XHRcdHJldHVybiBhcnJheS5yZWR1Y2UoZnVuY3Rpb24gKG1lbW8sIHYpIHtcblx0XHRcdFx0cmV0dXJuIG1lbW8gKyBmbih2KTtcblx0XHRcdH0sIDApO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiByZXR1cm5zIGEgY29weSBvZiB0aGUgY29sbGVjdGlvbiB3aXRoIGFycmF5IHR5cGUuXG5cdFx0ICogQHBhcmFtIHtDb2xsZWN0aW9ufSBjb2xsZWN0aW9uIC0gY29sbGVjdGlvbiBlZykgbm9kZS5jaGlsZE5vZGVzLCAuLi5cblx0XHQgKi9cblx0XHR2YXIgZnJvbSA9IGZ1bmN0aW9uIChjb2xsZWN0aW9uKSB7XG5cdFx0XHR2YXIgcmVzdWx0ID0gW10sIGlkeCA9IC0xLCBsZW5ndGggPSBjb2xsZWN0aW9uLmxlbmd0aDtcblx0XHRcdHdoaWxlICgrK2lkeCA8IGxlbmd0aCkge1xuXHRcdFx0XHRyZXN1bHRbaWR4XSA9IGNvbGxlY3Rpb25baWR4XTtcblx0XHRcdH1cblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIGNsdXN0ZXIgZWxlbWVudHMgYnkgcHJlZGljYXRlIGZ1bmN0aW9uLlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtBcnJheX0gYXJyYXkgLSBhcnJheVxuXHRcdCAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIC0gcHJlZGljYXRlIGZ1bmN0aW9uIGZvciBjbHVzdGVyIHJ1bGVcblx0XHQgKiBAcGFyYW0ge0FycmF5W119XG5cdFx0ICovXG5cdFx0dmFyIGNsdXN0ZXJCeSA9IGZ1bmN0aW9uIChhcnJheSwgZm4pIHtcblx0XHRcdGlmICghYXJyYXkubGVuZ3RoKSB7IHJldHVybiBbXTsgfVxuXHRcdFx0dmFyIGFUYWlsID0gdGFpbChhcnJheSk7XG5cdFx0XHRyZXR1cm4gYVRhaWwucmVkdWNlKGZ1bmN0aW9uIChtZW1vLCB2KSB7XG5cdFx0XHRcdHZhciBhTGFzdCA9IGxhc3QobWVtbyk7XG5cdFx0XHRcdGlmIChmbihsYXN0KGFMYXN0KSwgdikpIHtcblx0XHRcdFx0XHRhTGFzdFthTGFzdC5sZW5ndGhdID0gdjtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRtZW1vW21lbW8ubGVuZ3RoXSA9IFt2XTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gbWVtbztcblx0XHRcdH0sIFtbaGVhZChhcnJheSldXSk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIHJldHVybnMgYSBjb3B5IG9mIHRoZSBhcnJheSB3aXRoIGFsbCBmYWxzeSB2YWx1ZXMgcmVtb3ZlZFxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtBcnJheX0gYXJyYXkgLSBhcnJheVxuXHRcdCAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIC0gcHJlZGljYXRlIGZ1bmN0aW9uIGZvciBjbHVzdGVyIHJ1bGVcblx0XHQgKi9cblx0XHR2YXIgY29tcGFjdCA9IGZ1bmN0aW9uIChhcnJheSkge1xuXHRcdFx0dmFyIGFSZXN1bHQgPSBbXTtcblx0XHRcdGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGFycmF5Lmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuXHRcdFx0XHRpZiAoYXJyYXlbaWR4XSkgeyBhUmVzdWx0LnB1c2goYXJyYXlbaWR4XSk7IH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBhUmVzdWx0O1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBwcm9kdWNlcyBhIGR1cGxpY2F0ZS1mcmVlIHZlcnNpb24gb2YgdGhlIGFycmF5XG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge0FycmF5fSBhcnJheVxuXHRcdCAqL1xuXHRcdHZhciB1bmlxdWUgPSBmdW5jdGlvbiAoYXJyYXkpIHtcblx0XHRcdHZhciByZXN1bHRzID0gW107XG5cblx0XHRcdGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGFycmF5Lmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuXHRcdFx0XHRpZiAoIWNvbnRhaW5zKHJlc3VsdHMsIGFycmF5W2lkeF0pKSB7XG5cdFx0XHRcdFx0cmVzdWx0cy5wdXNoKGFycmF5W2lkeF0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiByZXR1cm5zIG5leHQgaXRlbS5cblx0XHQgKiBAcGFyYW0ge0FycmF5fSBhcnJheVxuXHRcdCAqL1xuXHRcdHZhciBuZXh0ID0gZnVuY3Rpb24gKGFycmF5LCBpdGVtKSB7XG5cdFx0XHR2YXIgaWR4ID0gYXJyYXkuaW5kZXhPZihpdGVtKTtcblx0XHRcdGlmIChpZHggPT09IC0xKSB7IHJldHVybiBudWxsOyB9XG5cblx0XHRcdHJldHVybiBhcnJheVtpZHggKyAxXTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogcmV0dXJucyBwcmV2IGl0ZW0uXG5cdFx0ICogQHBhcmFtIHtBcnJheX0gYXJyYXlcblx0XHQgKi9cblx0XHR2YXIgcHJldiA9IGZ1bmN0aW9uIChhcnJheSwgaXRlbSkge1xuXHRcdFx0dmFyIGlkeCA9IGFycmF5LmluZGV4T2YoaXRlbSk7XG5cdFx0XHRpZiAoaWR4ID09PSAtMSkgeyByZXR1cm4gbnVsbDsgfVxuXG5cdFx0XHRyZXR1cm4gYXJyYXlbaWR4IC0gMV07XG5cdFx0fTtcblxuXG5cdFx0cmV0dXJuIHtcblx0XHRcdGhlYWQ6IGhlYWQsIGxhc3Q6IGxhc3QsIGluaXRpYWw6IGluaXRpYWwsIHRhaWw6IHRhaWwsXG5cdFx0XHRwcmV2OiBwcmV2LCBuZXh0OiBuZXh0LCBmaW5kOiBmaW5kLCBjb250YWluczogY29udGFpbnMsXG5cdFx0XHRhbGw6IGFsbCwgc3VtOiBzdW0sIGZyb206IGZyb20sXG5cdFx0XHRjbHVzdGVyQnk6IGNsdXN0ZXJCeSwgY29tcGFjdDogY29tcGFjdCwgdW5pcXVlOiB1bmlxdWVcblx0XHR9O1xuXHR9KSgpO1xuXG5cblx0dmFyIE5CU1BfQ0hBUiA9IFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKTtcblx0dmFyIFpFUk9fV0lEVEhfTkJTUF9DSEFSID0gJ1xcdWZlZmYnO1xuXG5cdC8qKlxuXHQgKiBAY2xhc3MgY29yZS5kb21cblx0ICpcblx0ICogRG9tIGZ1bmN0aW9uc1xuXHQgKlxuXHQgKiBAc2luZ2xldG9uXG5cdCAqIEBhbHRlcm5hdGVDbGFzc05hbWUgZG9tXG5cdCAqL1xuXHR2YXIgZG9tID0gKGZ1bmN0aW9uICgpIHtcblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIGlzRWRpdGFibGVcblx0XHQgKlxuXHRcdCAqIHJldHVybnMgd2hldGhlciBub2RlIGlzIGBub3RlLWVkaXRhYmxlYCBvciBub3QuXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge05vZGV9IG5vZGVcblx0XHQgKiBAcmV0dXJuIHtCb29sZWFufVxuXHRcdCAqL1xuXHRcdHZhciBpc0VkaXRhYmxlID0gZnVuY3Rpb24gKG5vZGUpIHtcblx0XHRcdHJldHVybiBub2RlICYmICQobm9kZSkuaGFzQ2xhc3MoJ25vdGUtZWRpdGFibGUnKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCBpc0NvbnRyb2xTaXppbmdcblx0XHQgKlxuXHRcdCAqIHJldHVybnMgd2hldGhlciBub2RlIGlzIGBub3RlLWNvbnRyb2wtc2l6aW5nYCBvciBub3QuXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge05vZGV9IG5vZGVcblx0XHQgKiBAcmV0dXJuIHtCb29sZWFufVxuXHRcdCAqL1xuXHRcdHZhciBpc0NvbnRyb2xTaXppbmcgPSBmdW5jdGlvbiAobm9kZSkge1xuXHRcdFx0cmV0dXJuIG5vZGUgJiYgJChub2RlKS5oYXNDbGFzcygnbm90ZS1jb250cm9sLXNpemluZycpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kICBidWlsZExheW91dEluZm9cblx0XHQgKlxuXHRcdCAqIGJ1aWxkIGxheW91dEluZm8gZnJvbSAkZWRpdG9yKC5ub3RlLWVkaXRvcilcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkZWRpdG9yXG5cdFx0ICogQHJldHVybiB7T2JqZWN0fVxuXHRcdCAqIEByZXR1cm4ge0Z1bmN0aW9ufSByZXR1cm4uZWRpdG9yXG5cdFx0ICogQHJldHVybiB7Tm9kZX0gcmV0dXJuLmRyb3B6b25lXG5cdFx0ICogQHJldHVybiB7Tm9kZX0gcmV0dXJuLnRvb2xiYXJcblx0XHQgKiBAcmV0dXJuIHtOb2RlfSByZXR1cm4uZWRpdGFibGVcblx0XHQgKiBAcmV0dXJuIHtOb2RlfSByZXR1cm4uY29kYWJsZVxuXHRcdCAqIEByZXR1cm4ge05vZGV9IHJldHVybi5wb3BvdmVyXG5cdFx0ICogQHJldHVybiB7Tm9kZX0gcmV0dXJuLmhhbmRsZVxuXHRcdCAqIEByZXR1cm4ge05vZGV9IHJldHVybi5kaWFsb2dcblx0XHQgKi9cblx0XHR2YXIgYnVpbGRMYXlvdXRJbmZvID0gZnVuY3Rpb24gKCRlZGl0b3IpIHtcblx0XHRcdHZhciBtYWtlRmluZGVyO1xuXG5cdFx0XHQvLyBhaXIgbW9kZVxuXHRcdFx0aWYgKCRlZGl0b3IuaGFzQ2xhc3MoJ25vdGUtYWlyLWVkaXRvcicpKSB7XG5cdFx0XHRcdHZhciBpZCA9IGxpc3QubGFzdCgkZWRpdG9yLmF0dHIoJ2lkJykuc3BsaXQoJy0nKSk7XG5cdFx0XHRcdG1ha2VGaW5kZXIgPSBmdW5jdGlvbiAoc0lkUHJlZml4KSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uICgpIHsgcmV0dXJuICQoc0lkUHJlZml4ICsgaWQpOyB9O1xuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0ZWRpdG9yOiBmdW5jdGlvbiAoKSB7IHJldHVybiAkZWRpdG9yOyB9LFxuXHRcdFx0XHRcdGhvbGRlcjogZnVuY3Rpb24gKCkgeyByZXR1cm4gJGVkaXRvci5kYXRhKCdob2xkZXInKTsgfSxcblx0XHRcdFx0XHRlZGl0YWJsZTogZnVuY3Rpb24gKCkgeyByZXR1cm4gJGVkaXRvcjsgfSxcblx0XHRcdFx0XHRwb3BvdmVyOiBtYWtlRmluZGVyKCcjbm90ZS1wb3BvdmVyLScpLFxuXHRcdFx0XHRcdGhhbmRsZTogbWFrZUZpbmRlcignI25vdGUtaGFuZGxlLScpLFxuXHRcdFx0XHRcdGRpYWxvZzogbWFrZUZpbmRlcignI25vdGUtZGlhbG9nLScpXG5cdFx0XHRcdH07XG5cblx0XHRcdFx0Ly8gZnJhbWUgbW9kZVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bWFrZUZpbmRlciA9IGZ1bmN0aW9uIChzQ2xhc3NOYW1lKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uICgpIHsgcmV0dXJuICRlZGl0b3IuZmluZChzQ2xhc3NOYW1lKTsgfTtcblx0XHRcdFx0fTtcblx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRlZGl0b3I6IGZ1bmN0aW9uICgpIHsgcmV0dXJuICRlZGl0b3I7IH0sXG5cdFx0XHRcdFx0aG9sZGVyOiBmdW5jdGlvbiAoKSB7IHJldHVybiAkZWRpdG9yLmRhdGEoJ2hvbGRlcicpOyB9LFxuXHRcdFx0XHRcdGRyb3B6b25lOiBtYWtlRmluZGVyKCcubm90ZS1kcm9wem9uZScpLFxuXHRcdFx0XHRcdHRvb2xiYXI6IG1ha2VGaW5kZXIoJy5ub3RlLXRvb2xiYXInKSxcblx0XHRcdFx0XHRlZGl0YWJsZTogbWFrZUZpbmRlcignLm5vdGUtZWRpdGFibGUnKSxcblx0XHRcdFx0XHRjb2RhYmxlOiBtYWtlRmluZGVyKCcubm90ZS1jb2RhYmxlJyksXG5cdFx0XHRcdFx0c3RhdHVzYmFyOiBtYWtlRmluZGVyKCcubm90ZS1zdGF0dXNiYXInKSxcblx0XHRcdFx0XHRwb3BvdmVyOiBtYWtlRmluZGVyKCcubm90ZS1wb3BvdmVyJyksXG5cdFx0XHRcdFx0aGFuZGxlOiBtYWtlRmluZGVyKCcubm90ZS1oYW5kbGUnKSxcblx0XHRcdFx0XHRkaWFsb2c6IG1ha2VGaW5kZXIoJy5ub3RlLWRpYWxvZycpXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIHJldHVybnMgbWFrZUxheW91dEluZm8gZnJvbSBlZGl0b3IncyBkZXNjZW5kYW50IG5vZGUuXG5cdFx0ICpcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqIEBwYXJhbSB7Tm9kZX0gZGVzY2VuZGFudFxuXHRcdCAqIEByZXR1cm4ge09iamVjdH1cblx0XHQgKi9cblx0XHR2YXIgbWFrZUxheW91dEluZm8gPSBmdW5jdGlvbiAoZGVzY2VuZGFudCkge1xuXHRcdFx0dmFyICR0YXJnZXQgPSAkKGRlc2NlbmRhbnQpLmNsb3Nlc3QoJy5ub3RlLWVkaXRvciwgLm5vdGUtYWlyLWVkaXRvciwgLm5vdGUtYWlyLWxheW91dCcpO1xuXG5cdFx0XHRpZiAoISR0YXJnZXQubGVuZ3RoKSB7XG5cdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0fVxuXG5cdFx0XHR2YXIgJGVkaXRvcjtcblx0XHRcdGlmICgkdGFyZ2V0LmlzKCcubm90ZS1lZGl0b3IsIC5ub3RlLWFpci1lZGl0b3InKSkge1xuXHRcdFx0XHQkZWRpdG9yID0gJHRhcmdldDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdCRlZGl0b3IgPSAkKCcjbm90ZS1lZGl0b3ItJyArIGxpc3QubGFzdCgkdGFyZ2V0LmF0dHIoJ2lkJykuc3BsaXQoJy0nKSkpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gYnVpbGRMYXlvdXRJbmZvKCRlZGl0b3IpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIG1ha2VQcmVkQnlOb2RlTmFtZVxuXHRcdCAqXG5cdFx0ICogcmV0dXJucyBwcmVkaWNhdGUgd2hpY2gganVkZ2Ugd2hldGhlciBub2RlTmFtZSBpcyBzYW1lXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gbm9kZU5hbWVcblx0XHQgKiBAcmV0dXJuIHtGdW5jdGlvbn1cblx0XHQgKi9cblx0XHR2YXIgbWFrZVByZWRCeU5vZGVOYW1lID0gZnVuY3Rpb24gKG5vZGVOYW1lKSB7XG5cdFx0XHRub2RlTmFtZSA9IG5vZGVOYW1lLnRvVXBwZXJDYXNlKCk7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24gKG5vZGUpIHtcblx0XHRcdFx0cmV0dXJuIG5vZGUgJiYgbm9kZS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBub2RlTmFtZTtcblx0XHRcdH07XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2QgaXNUZXh0XG5cdFx0ICpcblx0XHQgKlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtOb2RlfSBub2RlXG5cdFx0ICogQHJldHVybiB7Qm9vbGVhbn0gdHJ1ZSBpZiBub2RlJ3MgdHlwZSBpcyB0ZXh0KDMpXG5cdFx0ICovXG5cdFx0dmFyIGlzVGV4dCA9IGZ1bmN0aW9uIChub2RlKSB7XG5cdFx0XHRyZXR1cm4gbm9kZSAmJiBub2RlLm5vZGVUeXBlID09PSAzO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBleCkgYnIsIGNvbCwgZW1iZWQsIGhyLCBpbWcsIGlucHV0LCAuLi5cblx0XHQgKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL2h0bWwvd2cvZHJhZnRzL2h0bWwvbWFzdGVyL3N5bnRheC5odG1sI3ZvaWQtZWxlbWVudHNcblx0XHQgKi9cblx0XHR2YXIgaXNWb2lkID0gZnVuY3Rpb24gKG5vZGUpIHtcblx0XHRcdHJldHVybiBub2RlICYmIC9eQlJ8XklNR3xeSFIvLnRlc3Qobm9kZS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpKTtcblx0XHR9O1xuXG5cdFx0dmFyIGlzUGFyYSA9IGZ1bmN0aW9uIChub2RlKSB7XG5cdFx0XHRpZiAoaXNFZGl0YWJsZShub2RlKSkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cblx0XHRcdC8vIENocm9tZSh2MzEuMCksIEZGKHYyNS4wLjEpIHVzZSBESVYgZm9yIHBhcmFncmFwaFxuXHRcdFx0cmV0dXJuIG5vZGUgJiYgL15ESVZ8XlB8XkxJfF5IWzEtN10vLnRlc3Qobm9kZS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpKTtcblx0XHR9O1xuXG5cdFx0dmFyIGlzTGkgPSBtYWtlUHJlZEJ5Tm9kZU5hbWUoJ0xJJyk7XG5cblx0XHR2YXIgaXNQdXJlUGFyYSA9IGZ1bmN0aW9uIChub2RlKSB7XG5cdFx0XHRyZXR1cm4gaXNQYXJhKG5vZGUpICYmICFpc0xpKG5vZGUpO1xuXHRcdH07XG5cblx0XHR2YXIgaXNUYWJsZSA9IG1ha2VQcmVkQnlOb2RlTmFtZSgnVEFCTEUnKTtcblxuXHRcdHZhciBpc0lubGluZSA9IGZ1bmN0aW9uIChub2RlKSB7XG5cdFx0XHRyZXR1cm4gIWlzQm9keUNvbnRhaW5lcihub2RlKSAmJlxuXHRcdFx0XHQgICAhaXNMaXN0KG5vZGUpICYmXG5cdFx0XHRcdCAgICFpc1BhcmEobm9kZSkgJiZcblx0XHRcdFx0ICAgIWlzVGFibGUobm9kZSkgJiZcblx0XHRcdFx0ICAgIWlzQmxvY2txdW90ZShub2RlKTtcblx0XHR9O1xuXG5cdFx0dmFyIGlzTGlzdCA9IGZ1bmN0aW9uIChub2RlKSB7XG5cdFx0XHRyZXR1cm4gbm9kZSAmJiAvXlVMfF5PTC8udGVzdChub2RlLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkpO1xuXHRcdH07XG5cblx0XHR2YXIgaXNDZWxsID0gZnVuY3Rpb24gKG5vZGUpIHtcblx0XHRcdHJldHVybiBub2RlICYmIC9eVER8XlRILy50ZXN0KG5vZGUubm9kZU5hbWUudG9VcHBlckNhc2UoKSk7XG5cdFx0fTtcblxuXHRcdHZhciBpc0Jsb2NrcXVvdGUgPSBtYWtlUHJlZEJ5Tm9kZU5hbWUoJ0JMT0NLUVVPVEUnKTtcblxuXHRcdHZhciBpc0JvZHlDb250YWluZXIgPSBmdW5jdGlvbiAobm9kZSkge1xuXHRcdFx0cmV0dXJuIGlzQ2VsbChub2RlKSB8fCBpc0Jsb2NrcXVvdGUobm9kZSkgfHwgaXNFZGl0YWJsZShub2RlKTtcblx0XHR9O1xuXG5cdFx0dmFyIGlzQW5jaG9yID0gbWFrZVByZWRCeU5vZGVOYW1lKCdBJyk7XG5cblx0XHR2YXIgaXNQYXJhSW5saW5lID0gZnVuY3Rpb24gKG5vZGUpIHtcblx0XHRcdHJldHVybiBpc0lubGluZShub2RlKSAmJiAhIWFuY2VzdG9yKG5vZGUsIGlzUGFyYSk7XG5cdFx0fTtcblxuXHRcdHZhciBpc0JvZHlJbmxpbmUgPSBmdW5jdGlvbiAobm9kZSkge1xuXHRcdFx0cmV0dXJuIGlzSW5saW5lKG5vZGUpICYmICFhbmNlc3Rvcihub2RlLCBpc1BhcmEpO1xuXHRcdH07XG5cblx0XHR2YXIgaXNCb2R5ID0gbWFrZVByZWRCeU5vZGVOYW1lKCdCT0RZJyk7XG5cblx0XHQvKipcblx0XHQgKiByZXR1cm5zIHdoZXRoZXIgbm9kZUIgaXMgY2xvc2VzdCBzaWJsaW5nIG9mIG5vZGVBXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge05vZGV9IG5vZGVBXG5cdFx0ICogQHBhcmFtIHtOb2RlfSBub2RlQlxuXHRcdCAqIEByZXR1cm4ge0Jvb2xlYW59XG5cdFx0ICovXG5cdFx0dmFyIGlzQ2xvc2VzdFNpYmxpbmcgPSBmdW5jdGlvbiAobm9kZUEsIG5vZGVCKSB7XG5cdFx0XHRyZXR1cm4gbm9kZUEubmV4dFNpYmxpbmcgPT09IG5vZGVCIHx8XG5cdFx0XHRcdCAgIG5vZGVBLnByZXZpb3VzU2libGluZyA9PT0gbm9kZUI7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIHJldHVybnMgYXJyYXkgb2YgY2xvc2VzdCBzaWJsaW5ncyB3aXRoIG5vZGVcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuXHRcdCAqIEBwYXJhbSB7ZnVuY3Rpb259IFtwcmVkXSAtIHByZWRpY2F0ZSBmdW5jdGlvblxuXHRcdCAqIEByZXR1cm4ge05vZGVbXX1cblx0XHQgKi9cblx0XHR2YXIgd2l0aENsb3Nlc3RTaWJsaW5ncyA9IGZ1bmN0aW9uIChub2RlLCBwcmVkKSB7XG5cdFx0XHRwcmVkID0gcHJlZCB8fCBmdW5jLm9rO1xuXG5cdFx0XHR2YXIgc2libGluZ3MgPSBbXTtcblx0XHRcdGlmIChub2RlLnByZXZpb3VzU2libGluZyAmJiBwcmVkKG5vZGUucHJldmlvdXNTaWJsaW5nKSkge1xuXHRcdFx0XHRzaWJsaW5ncy5wdXNoKG5vZGUucHJldmlvdXNTaWJsaW5nKTtcblx0XHRcdH1cblx0XHRcdHNpYmxpbmdzLnB1c2gobm9kZSk7XG5cdFx0XHRpZiAobm9kZS5uZXh0U2libGluZyAmJiBwcmVkKG5vZGUubmV4dFNpYmxpbmcpKSB7XG5cdFx0XHRcdHNpYmxpbmdzLnB1c2gobm9kZS5uZXh0U2libGluZyk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gc2libGluZ3M7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIGJsYW5rIEhUTUwgZm9yIGN1cnNvciBwb3NpdGlvblxuXHRcdCAqL1xuXHRcdHZhciBibGFua0hUTUwgPSBhZ2VudC5pc01TSUUgPyAnJm5ic3A7JyA6ICc8YnI+JztcblxuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2Qgbm9kZUxlbmd0aFxuXHRcdCAqXG5cdFx0ICogcmV0dXJucyAjdGV4dCdzIHRleHQgc2l6ZSBvciBlbGVtZW50J3MgY2hpbGROb2RlcyBzaXplXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge05vZGV9IG5vZGVcblx0XHQgKi9cblx0XHR2YXIgbm9kZUxlbmd0aCA9IGZ1bmN0aW9uIChub2RlKSB7XG5cdFx0XHRpZiAoaXNUZXh0KG5vZGUpKSB7XG5cdFx0XHRcdHJldHVybiBub2RlLm5vZGVWYWx1ZS5sZW5ndGg7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBub2RlLmNoaWxkTm9kZXMubGVuZ3RoO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiByZXR1cm5zIHdoZXRoZXIgbm9kZSBpcyBlbXB0eSBvciBub3QuXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge05vZGV9IG5vZGVcblx0XHQgKiBAcmV0dXJuIHtCb29sZWFufVxuXHRcdCAqL1xuXHRcdHZhciBpc0VtcHR5ID0gZnVuY3Rpb24gKG5vZGUpIHtcblx0XHRcdHZhciBsZW4gPSBub2RlTGVuZ3RoKG5vZGUpO1xuXG5cdFx0XHRpZiAobGVuID09PSAwKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fSBlbHNlIGlmICghZG9tLmlzVGV4dChub2RlKSAmJiBsZW4gPT09IDEgJiYgbm9kZS5pbm5lckhUTUwgPT09IGJsYW5rSFRNTCkge1xuXHRcdFx0XHQvLyBleCkgPHA+PGJyPjwvcD4sIDxzcGFuPjxicj48L3NwYW4+XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIHBhZGRpbmcgYmxhbmtIVE1MIGlmIG5vZGUgaXMgZW1wdHkgKGZvciBjdXJzb3IgcG9zaXRpb24pXG5cdFx0ICovXG5cdFx0dmFyIHBhZGRpbmdCbGFua0hUTUwgPSBmdW5jdGlvbiAobm9kZSkge1xuXHRcdFx0aWYgKCFpc1ZvaWQobm9kZSkgJiYgIW5vZGVMZW5ndGgobm9kZSkpIHtcblx0XHRcdFx0bm9kZS5pbm5lckhUTUwgPSBibGFua0hUTUw7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIGZpbmQgbmVhcmVzdCBhbmNlc3RvciBwcmVkaWNhdGUgaGl0XG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge05vZGV9IG5vZGVcblx0XHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkIC0gcHJlZGljYXRlIGZ1bmN0aW9uXG5cdFx0ICovXG5cdFx0dmFyIGFuY2VzdG9yID0gZnVuY3Rpb24gKG5vZGUsIHByZWQpIHtcblx0XHRcdHdoaWxlIChub2RlKSB7XG5cdFx0XHRcdGlmIChwcmVkKG5vZGUpKSB7IHJldHVybiBub2RlOyB9XG5cdFx0XHRcdGlmIChpc0VkaXRhYmxlKG5vZGUpKSB7IGJyZWFrOyB9XG5cblx0XHRcdFx0bm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBmaW5kIG5lYXJlc3QgYW5jZXN0b3Igb25seSBzaW5nbGUgY2hpbGQgYmxvb2QgbGluZSBhbmQgcHJlZGljYXRlIGhpdFxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtOb2RlfSBub2RlXG5cdFx0ICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZCAtIHByZWRpY2F0ZSBmdW5jdGlvblxuXHRcdCAqL1xuXHRcdHZhciBzaW5nbGVDaGlsZEFuY2VzdG9yID0gZnVuY3Rpb24gKG5vZGUsIHByZWQpIHtcblx0XHRcdG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG5cblx0XHRcdHdoaWxlIChub2RlKSB7XG5cdFx0XHRcdGlmIChub2RlTGVuZ3RoKG5vZGUpICE9PSAxKSB7IGJyZWFrOyB9XG5cdFx0XHRcdGlmIChwcmVkKG5vZGUpKSB7IHJldHVybiBub2RlOyB9XG5cdFx0XHRcdGlmIChpc0VkaXRhYmxlKG5vZGUpKSB7IGJyZWFrOyB9XG5cblx0XHRcdFx0bm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiByZXR1cm5zIG5ldyBhcnJheSBvZiBhbmNlc3RvciBub2RlcyAodW50aWwgcHJlZGljYXRlIGhpdCkuXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge05vZGV9IG5vZGVcblx0XHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9uYWxdIHByZWQgLSBwcmVkaWNhdGUgZnVuY3Rpb25cblx0XHQgKi9cblx0XHR2YXIgbGlzdEFuY2VzdG9yID0gZnVuY3Rpb24gKG5vZGUsIHByZWQpIHtcblx0XHRcdHByZWQgPSBwcmVkIHx8IGZ1bmMuZmFpbDtcblxuXHRcdFx0dmFyIGFuY2VzdG9ycyA9IFtdO1xuXHRcdFx0YW5jZXN0b3Iobm9kZSwgZnVuY3Rpb24gKGVsKSB7XG5cdFx0XHRcdGlmICghaXNFZGl0YWJsZShlbCkpIHtcblx0XHRcdFx0XHRhbmNlc3RvcnMucHVzaChlbCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gcHJlZChlbCk7XG5cdFx0XHR9KTtcblx0XHRcdHJldHVybiBhbmNlc3RvcnM7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIGZpbmQgZmFydGhlc3QgYW5jZXN0b3IgcHJlZGljYXRlIGhpdFxuXHRcdCAqL1xuXHRcdHZhciBsYXN0QW5jZXN0b3IgPSBmdW5jdGlvbiAobm9kZSwgcHJlZCkge1xuXHRcdFx0dmFyIGFuY2VzdG9ycyA9IGxpc3RBbmNlc3Rvcihub2RlKTtcblx0XHRcdHJldHVybiBsaXN0Lmxhc3QoYW5jZXN0b3JzLmZpbHRlcihwcmVkKSk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIHJldHVybnMgY29tbW9uIGFuY2VzdG9yIG5vZGUgYmV0d2VlbiB0d28gbm9kZXMuXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge05vZGV9IG5vZGVBXG5cdFx0ICogQHBhcmFtIHtOb2RlfSBub2RlQlxuXHRcdCAqL1xuXHRcdHZhciBjb21tb25BbmNlc3RvciA9IGZ1bmN0aW9uIChub2RlQSwgbm9kZUIpIHtcblx0XHRcdHZhciBhbmNlc3RvcnMgPSBsaXN0QW5jZXN0b3Iobm9kZUEpO1xuXHRcdFx0Zm9yICh2YXIgbiA9IG5vZGVCOyBuOyBuID0gbi5wYXJlbnROb2RlKSB7XG5cdFx0XHRcdGlmICgkLmluQXJyYXkobiwgYW5jZXN0b3JzKSA+IC0xKSB7IHJldHVybiBuOyB9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbnVsbDsgLy8gZGlmZmVyZW5jZSBkb2N1bWVudCBhcmVhXG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIGxpc3RpbmcgYWxsIHByZXZpb3VzIHNpYmxpbmdzICh1bnRpbCBwcmVkaWNhdGUgaGl0KS5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuXHRcdCAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25hbF0gcHJlZCAtIHByZWRpY2F0ZSBmdW5jdGlvblxuXHRcdCAqL1xuXHRcdHZhciBsaXN0UHJldiA9IGZ1bmN0aW9uIChub2RlLCBwcmVkKSB7XG5cdFx0XHRwcmVkID0gcHJlZCB8fCBmdW5jLmZhaWw7XG5cblx0XHRcdHZhciBub2RlcyA9IFtdO1xuXHRcdFx0d2hpbGUgKG5vZGUpIHtcblx0XHRcdFx0aWYgKHByZWQobm9kZSkpIHsgYnJlYWs7IH1cblx0XHRcdFx0bm9kZXMucHVzaChub2RlKTtcblx0XHRcdFx0bm9kZSA9IG5vZGUucHJldmlvdXNTaWJsaW5nO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG5vZGVzO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBsaXN0aW5nIG5leHQgc2libGluZ3MgKHVudGlsIHByZWRpY2F0ZSBoaXQpLlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtOb2RlfSBub2RlXG5cdFx0ICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRdIC0gcHJlZGljYXRlIGZ1bmN0aW9uXG5cdFx0ICovXG5cdFx0dmFyIGxpc3ROZXh0ID0gZnVuY3Rpb24gKG5vZGUsIHByZWQpIHtcblx0XHRcdHByZWQgPSBwcmVkIHx8IGZ1bmMuZmFpbDtcblxuXHRcdFx0dmFyIG5vZGVzID0gW107XG5cdFx0XHR3aGlsZSAobm9kZSkge1xuXHRcdFx0XHRpZiAocHJlZChub2RlKSkgeyBicmVhazsgfVxuXHRcdFx0XHRub2Rlcy5wdXNoKG5vZGUpO1xuXHRcdFx0XHRub2RlID0gbm9kZS5uZXh0U2libGluZztcblx0XHRcdH1cblx0XHRcdHJldHVybiBub2Rlcztcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogbGlzdGluZyBkZXNjZW5kYW50IG5vZGVzXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge05vZGV9IG5vZGVcblx0XHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZF0gLSBwcmVkaWNhdGUgZnVuY3Rpb25cblx0XHQgKi9cblx0XHR2YXIgbGlzdERlc2NlbmRhbnQgPSBmdW5jdGlvbiAobm9kZSwgcHJlZCkge1xuXHRcdFx0dmFyIGRlc2NlbmRlbnRzID0gW107XG5cdFx0XHRwcmVkID0gcHJlZCB8fCBmdW5jLm9rO1xuXG5cdFx0XHQvLyBzdGFydCBERlMoZGVwdGggZmlyc3Qgc2VhcmNoKSB3aXRoIG5vZGVcblx0XHRcdChmdW5jdGlvbiBmbldhbGsoY3VycmVudCkge1xuXHRcdFx0XHRpZiAobm9kZSAhPT0gY3VycmVudCAmJiBwcmVkKGN1cnJlbnQpKSB7XG5cdFx0XHRcdFx0ZGVzY2VuZGVudHMucHVzaChjdXJyZW50KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBjdXJyZW50LmNoaWxkTm9kZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG5cdFx0XHRcdFx0Zm5XYWxrKGN1cnJlbnQuY2hpbGROb2Rlc1tpZHhdKTtcblx0XHRcdFx0fVxuXHRcdFx0fSkobm9kZSk7XG5cblx0XHRcdHJldHVybiBkZXNjZW5kZW50cztcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogd3JhcCBub2RlIHdpdGggbmV3IHRhZy5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuXHRcdCAqIEBwYXJhbSB7Tm9kZX0gdGFnTmFtZSBvZiB3cmFwcGVyXG5cdFx0ICogQHJldHVybiB7Tm9kZX0gLSB3cmFwcGVyXG5cdFx0ICovXG5cdFx0dmFyIHdyYXAgPSBmdW5jdGlvbiAobm9kZSwgd3JhcHBlck5hbWUpIHtcblx0XHRcdHZhciBwYXJlbnQgPSBub2RlLnBhcmVudE5vZGU7XG5cdFx0XHR2YXIgd3JhcHBlciA9ICQoJzwnICsgd3JhcHBlck5hbWUgKyAnPicpWzBdO1xuXG5cdFx0XHRwYXJlbnQuaW5zZXJ0QmVmb3JlKHdyYXBwZXIsIG5vZGUpO1xuXHRcdFx0d3JhcHBlci5hcHBlbmRDaGlsZChub2RlKTtcblxuXHRcdFx0cmV0dXJuIHdyYXBwZXI7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIGluc2VydCBub2RlIGFmdGVyIHByZWNlZGluZ1xuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtOb2RlfSBub2RlXG5cdFx0ICogQHBhcmFtIHtOb2RlfSBwcmVjZWRpbmcgLSBwcmVkaWNhdGUgZnVuY3Rpb25cblx0XHQgKi9cblx0XHR2YXIgaW5zZXJ0QWZ0ZXIgPSBmdW5jdGlvbiAobm9kZSwgcHJlY2VkaW5nKSB7XG5cdFx0XHR2YXIgbmV4dCA9IHByZWNlZGluZy5uZXh0U2libGluZywgcGFyZW50ID0gcHJlY2VkaW5nLnBhcmVudE5vZGU7XG5cdFx0XHRpZiAobmV4dCkge1xuXHRcdFx0XHRwYXJlbnQuaW5zZXJ0QmVmb3JlKG5vZGUsIG5leHQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cGFyZW50LmFwcGVuZENoaWxkKG5vZGUpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG5vZGU7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIGFwcGVuZCBlbGVtZW50cy5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuXHRcdCAqIEBwYXJhbSB7Q29sbGVjdGlvbn0gYUNoaWxkXG5cdFx0ICovXG5cdFx0dmFyIGFwcGVuZENoaWxkTm9kZXMgPSBmdW5jdGlvbiAobm9kZSwgYUNoaWxkKSB7XG5cdFx0XHQkLmVhY2goYUNoaWxkLCBmdW5jdGlvbiAoaWR4LCBjaGlsZCkge1xuXHRcdFx0XHRub2RlLmFwcGVuZENoaWxkKGNoaWxkKTtcblx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuIG5vZGU7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIHJldHVybnMgd2hldGhlciBib3VuZGFyeVBvaW50IGlzIGxlZnQgZWRnZSBvciBub3QuXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge0JvdW5kYXJ5UG9pbnR9IHBvaW50XG5cdFx0ICogQHJldHVybiB7Qm9vbGVhbn1cblx0XHQgKi9cblx0XHR2YXIgaXNMZWZ0RWRnZVBvaW50ID0gZnVuY3Rpb24gKHBvaW50KSB7XG5cdFx0XHRyZXR1cm4gcG9pbnQub2Zmc2V0ID09PSAwO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiByZXR1cm5zIHdoZXRoZXIgYm91bmRhcnlQb2ludCBpcyByaWdodCBlZGdlIG9yIG5vdC5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7Qm91bmRhcnlQb2ludH0gcG9pbnRcblx0XHQgKiBAcmV0dXJuIHtCb29sZWFufVxuXHRcdCAqL1xuXHRcdHZhciBpc1JpZ2h0RWRnZVBvaW50ID0gZnVuY3Rpb24gKHBvaW50KSB7XG5cdFx0XHRyZXR1cm4gcG9pbnQub2Zmc2V0ID09PSBub2RlTGVuZ3RoKHBvaW50Lm5vZGUpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiByZXR1cm5zIHdoZXRoZXIgYm91bmRhcnlQb2ludCBpcyBlZGdlIG9yIG5vdC5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7Qm91bmRhcnlQb2ludH0gcG9pbnRcblx0XHQgKiBAcmV0dXJuIHtCb29sZWFufVxuXHRcdCAqL1xuXHRcdHZhciBpc0VkZ2VQb2ludCA9IGZ1bmN0aW9uIChwb2ludCkge1xuXHRcdFx0cmV0dXJuIGlzTGVmdEVkZ2VQb2ludChwb2ludCkgfHwgaXNSaWdodEVkZ2VQb2ludChwb2ludCk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIHJldHVybnMgd2hldGVyIG5vZGUgaXMgbGVmdCBlZGdlIG9mIGFuY2VzdG9yIG9yIG5vdC5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuXHRcdCAqIEBwYXJhbSB7Tm9kZX0gYW5jZXN0b3Jcblx0XHQgKiBAcmV0dXJuIHtCb29sZWFufVxuXHRcdCAqL1xuXHRcdHZhciBpc0xlZnRFZGdlT2YgPSBmdW5jdGlvbiAobm9kZSwgYW5jZXN0b3IpIHtcblx0XHRcdHdoaWxlIChub2RlICYmIG5vZGUgIT09IGFuY2VzdG9yKSB7XG5cdFx0XHRcdGlmIChwb3NpdGlvbihub2RlKSAhPT0gMCkge1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogcmV0dXJucyB3aGV0aGVyIG5vZGUgaXMgcmlnaHQgZWRnZSBvZiBhbmNlc3RvciBvciBub3QuXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge05vZGV9IG5vZGVcblx0XHQgKiBAcGFyYW0ge05vZGV9IGFuY2VzdG9yXG5cdFx0ICogQHJldHVybiB7Qm9vbGVhbn1cblx0XHQgKi9cblx0XHR2YXIgaXNSaWdodEVkZ2VPZiA9IGZ1bmN0aW9uIChub2RlLCBhbmNlc3Rvcikge1xuXHRcdFx0d2hpbGUgKG5vZGUgJiYgbm9kZSAhPT0gYW5jZXN0b3IpIHtcblx0XHRcdFx0aWYgKHBvc2l0aW9uKG5vZGUpICE9PSBub2RlTGVuZ3RoKG5vZGUucGFyZW50Tm9kZSkgLSAxKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiByZXR1cm5zIG9mZnNldCBmcm9tIHBhcmVudC5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuXHRcdCAqL1xuXHRcdHZhciBwb3NpdGlvbiA9IGZ1bmN0aW9uIChub2RlKSB7XG5cdFx0XHR2YXIgb2Zmc2V0ID0gMDtcblx0XHRcdHdoaWxlICgobm9kZSA9IG5vZGUucHJldmlvdXNTaWJsaW5nKSkge1xuXHRcdFx0XHRvZmZzZXQgKz0gMTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBvZmZzZXQ7XG5cdFx0fTtcblxuXHRcdHZhciBoYXNDaGlsZHJlbiA9IGZ1bmN0aW9uIChub2RlKSB7XG5cdFx0XHRyZXR1cm4gISEobm9kZSAmJiBub2RlLmNoaWxkTm9kZXMgJiYgbm9kZS5jaGlsZE5vZGVzLmxlbmd0aCk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIHJldHVybnMgcHJldmlvdXMgYm91bmRhcnlQb2ludFxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtCb3VuZGFyeVBvaW50fSBwb2ludFxuXHRcdCAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNTa2lwSW5uZXJPZmZzZXRcblx0XHQgKiBAcmV0dXJuIHtCb3VuZGFyeVBvaW50fVxuXHRcdCAqL1xuXHRcdHZhciBwcmV2UG9pbnQgPSBmdW5jdGlvbiAocG9pbnQsIGlzU2tpcElubmVyT2Zmc2V0KSB7XG5cdFx0XHR2YXIgbm9kZSwgb2Zmc2V0O1xuXG5cdFx0XHRpZiAocG9pbnQub2Zmc2V0ID09PSAwKSB7XG5cdFx0XHRcdGlmIChpc0VkaXRhYmxlKHBvaW50Lm5vZGUpKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRub2RlID0gcG9pbnQubm9kZS5wYXJlbnROb2RlO1xuXHRcdFx0XHRvZmZzZXQgPSBwb3NpdGlvbihwb2ludC5ub2RlKTtcblx0XHRcdH0gZWxzZSBpZiAoaGFzQ2hpbGRyZW4ocG9pbnQubm9kZSkpIHtcblx0XHRcdFx0bm9kZSA9IHBvaW50Lm5vZGUuY2hpbGROb2Rlc1twb2ludC5vZmZzZXQgLSAxXTtcblx0XHRcdFx0b2Zmc2V0ID0gbm9kZUxlbmd0aChub2RlKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG5vZGUgPSBwb2ludC5ub2RlO1xuXHRcdFx0XHRvZmZzZXQgPSBpc1NraXBJbm5lck9mZnNldCA/IDAgOiBwb2ludC5vZmZzZXQgLSAxO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRub2RlOiBub2RlLFxuXHRcdFx0XHRvZmZzZXQ6IG9mZnNldFxuXHRcdFx0fTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogcmV0dXJucyBuZXh0IGJvdW5kYXJ5UG9pbnRcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7Qm91bmRhcnlQb2ludH0gcG9pbnRcblx0XHQgKiBAcGFyYW0ge0Jvb2xlYW59IGlzU2tpcElubmVyT2Zmc2V0XG5cdFx0ICogQHJldHVybiB7Qm91bmRhcnlQb2ludH1cblx0XHQgKi9cblx0XHR2YXIgbmV4dFBvaW50ID0gZnVuY3Rpb24gKHBvaW50LCBpc1NraXBJbm5lck9mZnNldCkge1xuXHRcdFx0dmFyIG5vZGUsIG9mZnNldDtcblxuXHRcdFx0aWYgKG5vZGVMZW5ndGgocG9pbnQubm9kZSkgPT09IHBvaW50Lm9mZnNldCkge1xuXHRcdFx0XHRpZiAoaXNFZGl0YWJsZShwb2ludC5ub2RlKSkge1xuXHRcdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0bm9kZSA9IHBvaW50Lm5vZGUucGFyZW50Tm9kZTtcblx0XHRcdFx0b2Zmc2V0ID0gcG9zaXRpb24ocG9pbnQubm9kZSkgKyAxO1xuXHRcdFx0fSBlbHNlIGlmIChoYXNDaGlsZHJlbihwb2ludC5ub2RlKSkge1xuXHRcdFx0XHRub2RlID0gcG9pbnQubm9kZS5jaGlsZE5vZGVzW3BvaW50Lm9mZnNldF07XG5cdFx0XHRcdG9mZnNldCA9IDA7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRub2RlID0gcG9pbnQubm9kZTtcblx0XHRcdFx0b2Zmc2V0ID0gaXNTa2lwSW5uZXJPZmZzZXQgPyBub2RlTGVuZ3RoKHBvaW50Lm5vZGUpIDogcG9pbnQub2Zmc2V0ICsgMTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0bm9kZTogbm9kZSxcblx0XHRcdFx0b2Zmc2V0OiBvZmZzZXRcblx0XHRcdH07XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIHJldHVybnMgd2hldGhlciBwb2ludEEgYW5kIHBvaW50QiBpcyBzYW1lIG9yIG5vdC5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7Qm91bmRhcnlQb2ludH0gcG9pbnRBXG5cdFx0ICogQHBhcmFtIHtCb3VuZGFyeVBvaW50fSBwb2ludEJcblx0XHQgKiBAcmV0dXJuIHtCb29sZWFufVxuXHRcdCAqL1xuXHRcdHZhciBpc1NhbWVQb2ludCA9IGZ1bmN0aW9uIChwb2ludEEsIHBvaW50Qikge1xuXHRcdFx0cmV0dXJuIHBvaW50QS5ub2RlID09PSBwb2ludEIubm9kZSAmJiBwb2ludEEub2Zmc2V0ID09PSBwb2ludEIub2Zmc2V0O1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiByZXR1cm5zIHdoZXRoZXIgcG9pbnQgaXMgdmlzaWJsZSAoY2FuIHNldCBjdXJzb3IpIG9yIG5vdC5cblx0XHQgKiBcblx0XHQgKiBAcGFyYW0ge0JvdW5kYXJ5UG9pbnR9IHBvaW50XG5cdFx0ICogQHJldHVybiB7Qm9vbGVhbn1cblx0XHQgKi9cblx0XHR2YXIgaXNWaXNpYmxlUG9pbnQgPSBmdW5jdGlvbiAocG9pbnQpIHtcblx0XHRcdGlmIChpc1RleHQocG9pbnQubm9kZSkgfHwgIWhhc0NoaWxkcmVuKHBvaW50Lm5vZGUpIHx8IGlzRW1wdHkocG9pbnQubm9kZSkpIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cblx0XHRcdHZhciBsZWZ0Tm9kZSA9IHBvaW50Lm5vZGUuY2hpbGROb2Rlc1twb2ludC5vZmZzZXQgLSAxXTtcblx0XHRcdHZhciByaWdodE5vZGUgPSBwb2ludC5ub2RlLmNoaWxkTm9kZXNbcG9pbnQub2Zmc2V0XTtcblx0XHRcdGlmICgoIWxlZnROb2RlIHx8IGlzVm9pZChsZWZ0Tm9kZSkpICYmICghcmlnaHROb2RlIHx8IGlzVm9pZChyaWdodE5vZGUpKSkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIHByZXZQb2ludFV0aWxcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7Qm91bmRhcnlQb2ludH0gcG9pbnRcblx0XHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkXG5cdFx0ICogQHJldHVybiB7Qm91bmRhcnlQb2ludH1cblx0XHQgKi9cblx0XHR2YXIgcHJldlBvaW50VW50aWwgPSBmdW5jdGlvbiAocG9pbnQsIHByZWQpIHtcblx0XHRcdHdoaWxlIChwb2ludCkge1xuXHRcdFx0XHRpZiAocHJlZChwb2ludCkpIHtcblx0XHRcdFx0XHRyZXR1cm4gcG9pbnQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRwb2ludCA9IHByZXZQb2ludChwb2ludCk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIG5leHRQb2ludFVudGlsXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge0JvdW5kYXJ5UG9pbnR9IHBvaW50XG5cdFx0ICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZFxuXHRcdCAqIEByZXR1cm4ge0JvdW5kYXJ5UG9pbnR9XG5cdFx0ICovXG5cdFx0dmFyIG5leHRQb2ludFVudGlsID0gZnVuY3Rpb24gKHBvaW50LCBwcmVkKSB7XG5cdFx0XHR3aGlsZSAocG9pbnQpIHtcblx0XHRcdFx0aWYgKHByZWQocG9pbnQpKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHBvaW50O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cG9pbnQgPSBuZXh0UG9pbnQocG9pbnQpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCB3YWxrUG9pbnRcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7Qm91bmRhcnlQb2ludH0gc3RhcnRQb2ludFxuXHRcdCAqIEBwYXJhbSB7Qm91bmRhcnlQb2ludH0gZW5kUG9pbnRcblx0XHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBoYW5kbGVyXG5cdFx0ICogQHBhcmFtIHtCb29sZWFufSBpc1NraXBJbm5lck9mZnNldFxuXHRcdCAqL1xuXHRcdHZhciB3YWxrUG9pbnQgPSBmdW5jdGlvbiAoc3RhcnRQb2ludCwgZW5kUG9pbnQsIGhhbmRsZXIsIGlzU2tpcElubmVyT2Zmc2V0KSB7XG5cdFx0XHR2YXIgcG9pbnQgPSBzdGFydFBvaW50O1xuXG5cdFx0XHR3aGlsZSAocG9pbnQpIHtcblx0XHRcdFx0aGFuZGxlcihwb2ludCk7XG5cblx0XHRcdFx0aWYgKGlzU2FtZVBvaW50KHBvaW50LCBlbmRQb2ludCkpIHtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHZhciBpc1NraXBPZmZzZXQgPSBpc1NraXBJbm5lck9mZnNldCAmJlxuXHRcdFx0XHRcdFx0XHRcdCAgIHN0YXJ0UG9pbnQubm9kZSAhPT0gcG9pbnQubm9kZSAmJlxuXHRcdFx0XHRcdFx0XHRcdCAgIGVuZFBvaW50Lm5vZGUgIT09IHBvaW50Lm5vZGU7XG5cdFx0XHRcdHBvaW50ID0gbmV4dFBvaW50KHBvaW50LCBpc1NraXBPZmZzZXQpO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIG1ha2VPZmZzZXRQYXRoXG5cdFx0ICpcblx0XHQgKiByZXR1cm4gb2Zmc2V0UGF0aChhcnJheSBvZiBvZmZzZXQpIGZyb20gYW5jZXN0b3Jcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7Tm9kZX0gYW5jZXN0b3IgLSBhbmNlc3RvciBub2RlXG5cdFx0ICogQHBhcmFtIHtOb2RlfSBub2RlXG5cdFx0ICovXG5cdFx0dmFyIG1ha2VPZmZzZXRQYXRoID0gZnVuY3Rpb24gKGFuY2VzdG9yLCBub2RlKSB7XG5cdFx0XHR2YXIgYW5jZXN0b3JzID0gbGlzdEFuY2VzdG9yKG5vZGUsIGZ1bmMuZXEoYW5jZXN0b3IpKTtcblx0XHRcdHJldHVybiAkLm1hcChhbmNlc3RvcnMsIHBvc2l0aW9uKS5yZXZlcnNlKCk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2QgZnJvbU9mZnNldFBhdGhcblx0XHQgKlxuXHRcdCAqIHJldHVybiBlbGVtZW50IGZyb20gb2Zmc2V0UGF0aChhcnJheSBvZiBvZmZzZXQpXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge05vZGV9IGFuY2VzdG9yIC0gYW5jZXN0b3Igbm9kZVxuXHRcdCAqIEBwYXJhbSB7YXJyYXl9IG9mZnNldHMgLSBvZmZzZXRQYXRoXG5cdFx0ICovXG5cdFx0dmFyIGZyb21PZmZzZXRQYXRoID0gZnVuY3Rpb24gKGFuY2VzdG9yLCBvZmZzZXRzKSB7XG5cdFx0XHR2YXIgY3VycmVudCA9IGFuY2VzdG9yO1xuXHRcdFx0Zm9yICh2YXIgaSA9IDAsIGxlbiA9IG9mZnNldHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcblx0XHRcdFx0aWYgKGN1cnJlbnQuY2hpbGROb2Rlcy5sZW5ndGggPD0gb2Zmc2V0c1tpXSkge1xuXHRcdFx0XHRcdGN1cnJlbnQgPSBjdXJyZW50LmNoaWxkTm9kZXNbY3VycmVudC5jaGlsZE5vZGVzLmxlbmd0aCAtIDFdO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGN1cnJlbnQgPSBjdXJyZW50LmNoaWxkTm9kZXNbb2Zmc2V0c1tpXV07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBjdXJyZW50O1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIHNwbGl0Tm9kZVxuXHRcdCAqXG5cdFx0ICogc3BsaXQgZWxlbWVudCBvciAjdGV4dFxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtCb3VuZGFyeVBvaW50fSBwb2ludFxuXHRcdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW2lzU2tpcFBhZGRpbmdCbGFua0hUTUxdXG5cdFx0ICogQHJldHVybiB7Tm9kZX0gcmlnaHQgbm9kZSBvZiBib3VuZGFyeVBvaW50XG5cdFx0ICovXG5cdFx0dmFyIHNwbGl0Tm9kZSA9IGZ1bmN0aW9uIChwb2ludCwgaXNTa2lwUGFkZGluZ0JsYW5rSFRNTCkge1xuXHRcdFx0Ly8gc3BsaXQgI3RleHRcblx0XHRcdGlmIChpc1RleHQocG9pbnQubm9kZSkpIHtcblx0XHRcdFx0Ly8gZWRnZSBjYXNlXG5cdFx0XHRcdGlmIChpc0xlZnRFZGdlUG9pbnQocG9pbnQpKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHBvaW50Lm5vZGU7XG5cdFx0XHRcdH0gZWxzZSBpZiAoaXNSaWdodEVkZ2VQb2ludChwb2ludCkpIHtcblx0XHRcdFx0XHRyZXR1cm4gcG9pbnQubm9kZS5uZXh0U2libGluZztcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBwb2ludC5ub2RlLnNwbGl0VGV4dChwb2ludC5vZmZzZXQpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBzcGxpdCBlbGVtZW50XG5cdFx0XHR2YXIgY2hpbGROb2RlID0gcG9pbnQubm9kZS5jaGlsZE5vZGVzW3BvaW50Lm9mZnNldF07XG5cdFx0XHR2YXIgY2xvbmUgPSBpbnNlcnRBZnRlcihwb2ludC5ub2RlLmNsb25lTm9kZShmYWxzZSksIHBvaW50Lm5vZGUpO1xuXHRcdFx0YXBwZW5kQ2hpbGROb2RlcyhjbG9uZSwgbGlzdE5leHQoY2hpbGROb2RlKSk7XG5cblx0XHRcdGlmICghaXNTa2lwUGFkZGluZ0JsYW5rSFRNTCkge1xuXHRcdFx0XHRwYWRkaW5nQmxhbmtIVE1MKHBvaW50Lm5vZGUpO1xuXHRcdFx0XHRwYWRkaW5nQmxhbmtIVE1MKGNsb25lKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGNsb25lO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIHNwbGl0VHJlZVxuXHRcdCAqXG5cdFx0ICogc3BsaXQgdHJlZSBieSBwb2ludFxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtOb2RlfSByb290IC0gc3BsaXQgcm9vdFxuXHRcdCAqIEBwYXJhbSB7Qm91bmRhcnlQb2ludH0gcG9pbnRcblx0XHQgKiBAcGFyYW0ge0Jvb2xlYW59IFtpc1NraXBQYWRkaW5nQmxhbmtIVE1MXVxuXHRcdCAqIEByZXR1cm4ge05vZGV9IHJpZ2h0IG5vZGUgb2YgYm91bmRhcnlQb2ludFxuXHRcdCAqL1xuXHRcdHZhciBzcGxpdFRyZWUgPSBmdW5jdGlvbiAocm9vdCwgcG9pbnQsIGlzU2tpcFBhZGRpbmdCbGFua0hUTUwpIHtcblx0XHRcdC8vIGV4KSBbI3RleHQsIDxzcGFuPiwgPHA+XVxuXHRcdFx0dmFyIGFuY2VzdG9ycyA9IGxpc3RBbmNlc3Rvcihwb2ludC5ub2RlLCBmdW5jLmVxKHJvb3QpKTtcblxuXHRcdFx0aWYgKCFhbmNlc3RvcnMubGVuZ3RoKSB7XG5cdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0fSBlbHNlIGlmIChhbmNlc3RvcnMubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdHJldHVybiBzcGxpdE5vZGUocG9pbnQsIGlzU2tpcFBhZGRpbmdCbGFua0hUTUwpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gYW5jZXN0b3JzLnJlZHVjZShmdW5jdGlvbiAobm9kZSwgcGFyZW50KSB7XG5cdFx0XHRcdHZhciBjbG9uZSA9IGluc2VydEFmdGVyKHBhcmVudC5jbG9uZU5vZGUoZmFsc2UpLCBwYXJlbnQpO1xuXG5cdFx0XHRcdGlmIChub2RlID09PSBwb2ludC5ub2RlKSB7XG5cdFx0XHRcdFx0bm9kZSA9IHNwbGl0Tm9kZShwb2ludCwgaXNTa2lwUGFkZGluZ0JsYW5rSFRNTCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRhcHBlbmRDaGlsZE5vZGVzKGNsb25lLCBsaXN0TmV4dChub2RlKSk7XG5cblx0XHRcdFx0aWYgKCFpc1NraXBQYWRkaW5nQmxhbmtIVE1MKSB7XG5cdFx0XHRcdFx0cGFkZGluZ0JsYW5rSFRNTChwYXJlbnQpO1xuXHRcdFx0XHRcdHBhZGRpbmdCbGFua0hUTUwoY2xvbmUpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBjbG9uZTtcblx0XHRcdH0pO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBzcGxpdCBwb2ludFxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtQb2ludH0gcG9pbnRcblx0XHQgKiBAcGFyYW0ge0Jvb2xlYW59IGlzSW5saW5lXG5cdFx0ICogQHJldHVybiB7T2JqZWN0fVxuXHRcdCAqL1xuXHRcdHZhciBzcGxpdFBvaW50ID0gZnVuY3Rpb24gKHBvaW50LCBpc0lubGluZSkge1xuXHRcdFx0Ly8gZmluZCBzcGxpdFJvb3QsIGNvbnRhaW5lclxuXHRcdFx0Ly8gIC0gaW5saW5lOiBzcGxpdFJvb3QgaXMgYSBjaGlsZCBvZiBwYXJhZ3JhcGhcblx0XHRcdC8vICAtIGJsb2NrOiBzcGxpdFJvb3QgaXMgYSBjaGlsZCBvZiBib2R5Q29udGFpbmVyXG5cdFx0XHR2YXIgcHJlZCA9IGlzSW5saW5lID8gaXNQYXJhIDogaXNCb2R5Q29udGFpbmVyO1xuXHRcdFx0dmFyIGFuY2VzdG9ycyA9IGxpc3RBbmNlc3Rvcihwb2ludC5ub2RlLCBwcmVkKTtcblx0XHRcdHZhciB0b3BBbmNlc3RvciA9IGxpc3QubGFzdChhbmNlc3RvcnMpIHx8IHBvaW50Lm5vZGU7XG5cblx0XHRcdHZhciBzcGxpdFJvb3QsIGNvbnRhaW5lcjtcblx0XHRcdGlmIChwcmVkKHRvcEFuY2VzdG9yKSkge1xuXHRcdFx0XHRzcGxpdFJvb3QgPSBhbmNlc3RvcnNbYW5jZXN0b3JzLmxlbmd0aCAtIDJdO1xuXHRcdFx0XHRjb250YWluZXIgPSB0b3BBbmNlc3Rvcjtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHNwbGl0Um9vdCA9IHRvcEFuY2VzdG9yO1xuXHRcdFx0XHRjb250YWluZXIgPSBzcGxpdFJvb3QucGFyZW50Tm9kZTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gc3BsaXQgd2l0aCBzcGxpdFRyZWVcblx0XHRcdHZhciBwaXZvdCA9IHNwbGl0Um9vdCAmJiBzcGxpdFRyZWUoc3BsaXRSb290LCBwb2ludCwgaXNJbmxpbmUpO1xuXG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRyaWdodE5vZGU6IHBpdm90LFxuXHRcdFx0XHRjb250YWluZXI6IGNvbnRhaW5lclxuXHRcdFx0fTtcblx0XHR9O1xuXG5cdFx0dmFyIGNyZWF0ZSA9IGZ1bmN0aW9uIChub2RlTmFtZSkge1xuXHRcdFx0cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobm9kZU5hbWUpO1xuXHRcdH07XG5cblx0XHR2YXIgY3JlYXRlVGV4dCA9IGZ1bmN0aW9uICh0ZXh0KSB7XG5cdFx0XHRyZXR1cm4gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGV4dCk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2QgcmVtb3ZlXG5cdFx0ICpcblx0XHQgKiByZW1vdmUgbm9kZSwgKGlzUmVtb3ZlQ2hpbGQ6IHJlbW92ZSBjaGlsZCBvciBub3QpXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge05vZGV9IG5vZGVcblx0XHQgKiBAcGFyYW0ge0Jvb2xlYW59IGlzUmVtb3ZlQ2hpbGRcblx0XHQgKi9cblx0XHR2YXIgcmVtb3ZlID0gZnVuY3Rpb24gKG5vZGUsIGlzUmVtb3ZlQ2hpbGQpIHtcblx0XHRcdGlmICghbm9kZSB8fCAhbm9kZS5wYXJlbnROb2RlKSB7IHJldHVybjsgfVxuXHRcdFx0aWYgKG5vZGUucmVtb3ZlTm9kZSkgeyByZXR1cm4gbm9kZS5yZW1vdmVOb2RlKGlzUmVtb3ZlQ2hpbGQpOyB9XG5cblx0XHRcdHZhciBwYXJlbnQgPSBub2RlLnBhcmVudE5vZGU7XG5cdFx0XHRpZiAoIWlzUmVtb3ZlQ2hpbGQpIHtcblx0XHRcdFx0dmFyIG5vZGVzID0gW107XG5cdFx0XHRcdHZhciBpLCBsZW47XG5cdFx0XHRcdGZvciAoaSA9IDAsIGxlbiA9IG5vZGUuY2hpbGROb2Rlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuXHRcdFx0XHRcdG5vZGVzLnB1c2gobm9kZS5jaGlsZE5vZGVzW2ldKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGZvciAoaSA9IDAsIGxlbiA9IG5vZGVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0XHRcdFx0cGFyZW50Lmluc2VydEJlZm9yZShub2Rlc1tpXSwgbm9kZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cGFyZW50LnJlbW92ZUNoaWxkKG5vZGUpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIHJlbW92ZVdoaWxlXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge05vZGV9IG5vZGVcblx0XHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkXG5cdFx0ICovXG5cdFx0dmFyIHJlbW92ZVdoaWxlID0gZnVuY3Rpb24gKG5vZGUsIHByZWQpIHtcblx0XHRcdHdoaWxlIChub2RlKSB7XG5cdFx0XHRcdGlmIChpc0VkaXRhYmxlKG5vZGUpIHx8ICFwcmVkKG5vZGUpKSB7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR2YXIgcGFyZW50ID0gbm9kZS5wYXJlbnROb2RlO1xuXHRcdFx0XHRyZW1vdmUobm9kZSk7XG5cdFx0XHRcdG5vZGUgPSBwYXJlbnQ7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2QgcmVwbGFjZVxuXHRcdCAqXG5cdFx0ICogcmVwbGFjZSBub2RlIHdpdGggcHJvdmlkZWQgbm9kZU5hbWVcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSBub2RlTmFtZVxuXHRcdCAqIEByZXR1cm4ge05vZGV9IC0gbmV3IG5vZGVcblx0XHQgKi9cblx0XHR2YXIgcmVwbGFjZSA9IGZ1bmN0aW9uIChub2RlLCBub2RlTmFtZSkge1xuXHRcdFx0aWYgKG5vZGUubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gbm9kZU5hbWUudG9VcHBlckNhc2UoKSkge1xuXHRcdFx0XHRyZXR1cm4gbm9kZTtcblx0XHRcdH1cblxuXHRcdFx0dmFyIG5ld05vZGUgPSBjcmVhdGUobm9kZU5hbWUpO1xuXG5cdFx0XHRpZiAobm9kZS5zdHlsZS5jc3NUZXh0KSB7XG5cdFx0XHRcdG5ld05vZGUuc3R5bGUuY3NzVGV4dCA9IG5vZGUuc3R5bGUuY3NzVGV4dDtcblx0XHRcdH1cblxuXHRcdFx0YXBwZW5kQ2hpbGROb2RlcyhuZXdOb2RlLCBsaXN0LmZyb20obm9kZS5jaGlsZE5vZGVzKSk7XG5cdFx0XHRpbnNlcnRBZnRlcihuZXdOb2RlLCBub2RlKTtcblx0XHRcdHJlbW92ZShub2RlKTtcblxuXHRcdFx0cmV0dXJuIG5ld05vZGU7XG5cdFx0fTtcblxuXHRcdHZhciBpc1RleHRhcmVhID0gbWFrZVByZWRCeU5vZGVOYW1lKCdURVhUQVJFQScpO1xuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCBodG1sXG5cdFx0ICpcblx0XHQgKiBnZXQgdGhlIEhUTUwgY29udGVudHMgb2Ygbm9kZVxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRub2RlXG5cdFx0ICogQHBhcmFtIHtCb29sZWFufSBbaXNOZXdsaW5lT25CbG9ja11cblx0XHQgKi9cblx0XHR2YXIgaHRtbCA9IGZ1bmN0aW9uICgkbm9kZSwgaXNOZXdsaW5lT25CbG9jaykge1xuXHRcdFx0dmFyIG1hcmt1cCA9IGlzVGV4dGFyZWEoJG5vZGVbMF0pID8gJG5vZGUudmFsKCkgOiAkbm9kZS5odG1sKCk7XG5cblx0XHRcdGlmIChpc05ld2xpbmVPbkJsb2NrKSB7XG5cdFx0XHRcdHZhciByZWdleFRhZyA9IC88KFxcLz8pKFxcYig/ISEpW14+XFxzXSopKC4qPykoXFxzKlxcLz8+KS9nO1xuXHRcdFx0XHRtYXJrdXAgPSBtYXJrdXAucmVwbGFjZShyZWdleFRhZywgZnVuY3Rpb24gKG1hdGNoLCBlbmRTbGFzaCwgbmFtZSkge1xuXHRcdFx0XHRcdG5hbWUgPSBuYW1lLnRvVXBwZXJDYXNlKCk7XG5cdFx0XHRcdFx0dmFyIGlzRW5kT2ZJbmxpbmVDb250YWluZXIgPSAvXkRJVnxeVER8XlRIfF5QfF5MSXxeSFsxLTddLy50ZXN0KG5hbWUpICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgISFlbmRTbGFzaDtcblx0XHRcdFx0XHR2YXIgaXNCbG9ja05vZGUgPSAvXkJMT0NLUVVPVEV8XlRBQkxFfF5UQk9EWXxeVFJ8XkhSfF5VTHxeT0wvLnRlc3QobmFtZSk7XG5cblx0XHRcdFx0XHRyZXR1cm4gbWF0Y2ggKyAoKGlzRW5kT2ZJbmxpbmVDb250YWluZXIgfHwgaXNCbG9ja05vZGUpID8gJ1xcbicgOiAnJyk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRtYXJrdXAgPSAkLnRyaW0obWFya3VwKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIG1hcmt1cDtcblx0XHR9O1xuXG5cdFx0dmFyIHZhbHVlID0gZnVuY3Rpb24gKCR0ZXh0YXJlYSwgc3RyaXBMaW5lYnJlYWtzKSB7XG5cdFx0XHR2YXIgdmFsID0gJHRleHRhcmVhLnZhbCgpO1xuXHRcdFx0aWYgKHN0cmlwTGluZWJyZWFrcykge1xuXHRcdFx0XHRyZXR1cm4gdmFsLnJlcGxhY2UoL1tcXG5cXHJdL2csICcnKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB2YWw7XG5cdFx0fTtcblxuXHRcdHJldHVybiB7XG5cdFx0XHQvKiogQHByb3BlcnR5IHtTdHJpbmd9IE5CU1BfQ0hBUiAqL1xuXHRcdFx0TkJTUF9DSEFSOiBOQlNQX0NIQVIsXG5cdFx0XHQvKiogQHByb3BlcnR5IHtTdHJpbmd9IFpFUk9fV0lEVEhfTkJTUF9DSEFSICovXG5cdFx0XHRaRVJPX1dJRFRIX05CU1BfQ0hBUjogWkVST19XSURUSF9OQlNQX0NIQVIsXG5cdFx0XHQvKiogQHByb3BlcnR5IHtTdHJpbmd9IGJsYW5rICovXG5cdFx0XHRibGFuazogYmxhbmtIVE1MLFxuXHRcdFx0LyoqIEBwcm9wZXJ0eSB7U3RyaW5nfSBlbXB0eVBhcmEgKi9cblx0XHRcdGVtcHR5UGFyYTogJzxwPicgKyBibGFua0hUTUwgKyAnPC9wPicsXG5cdFx0XHRtYWtlUHJlZEJ5Tm9kZU5hbWU6IG1ha2VQcmVkQnlOb2RlTmFtZSxcblx0XHRcdGlzRWRpdGFibGU6IGlzRWRpdGFibGUsXG5cdFx0XHRpc0NvbnRyb2xTaXppbmc6IGlzQ29udHJvbFNpemluZyxcblx0XHRcdGJ1aWxkTGF5b3V0SW5mbzogYnVpbGRMYXlvdXRJbmZvLFxuXHRcdFx0bWFrZUxheW91dEluZm86IG1ha2VMYXlvdXRJbmZvLFxuXHRcdFx0aXNUZXh0OiBpc1RleHQsXG5cdFx0XHRpc1ZvaWQ6IGlzVm9pZCxcblx0XHRcdGlzUGFyYTogaXNQYXJhLFxuXHRcdFx0aXNQdXJlUGFyYTogaXNQdXJlUGFyYSxcblx0XHRcdGlzSW5saW5lOiBpc0lubGluZSxcblx0XHRcdGlzQm9keUlubGluZTogaXNCb2R5SW5saW5lLFxuXHRcdFx0aXNCb2R5OiBpc0JvZHksXG5cdFx0XHRpc1BhcmFJbmxpbmU6IGlzUGFyYUlubGluZSxcblx0XHRcdGlzTGlzdDogaXNMaXN0LFxuXHRcdFx0aXNUYWJsZTogaXNUYWJsZSxcblx0XHRcdGlzQ2VsbDogaXNDZWxsLFxuXHRcdFx0aXNCbG9ja3F1b3RlOiBpc0Jsb2NrcXVvdGUsXG5cdFx0XHRpc0JvZHlDb250YWluZXI6IGlzQm9keUNvbnRhaW5lcixcblx0XHRcdGlzQW5jaG9yOiBpc0FuY2hvcixcblx0XHRcdGlzRGl2OiBtYWtlUHJlZEJ5Tm9kZU5hbWUoJ0RJVicpLFxuXHRcdFx0aXNMaTogaXNMaSxcblx0XHRcdGlzQlI6IG1ha2VQcmVkQnlOb2RlTmFtZSgnQlInKSxcblx0XHRcdGlzU3BhbjogbWFrZVByZWRCeU5vZGVOYW1lKCdTUEFOJyksXG5cdFx0XHRpc0I6IG1ha2VQcmVkQnlOb2RlTmFtZSgnQicpLFxuXHRcdFx0aXNVOiBtYWtlUHJlZEJ5Tm9kZU5hbWUoJ1UnKSxcblx0XHRcdGlzUzogbWFrZVByZWRCeU5vZGVOYW1lKCdTJyksXG5cdFx0XHRpc0k6IG1ha2VQcmVkQnlOb2RlTmFtZSgnSScpLFxuXHRcdFx0aXNJbWc6IG1ha2VQcmVkQnlOb2RlTmFtZSgnSU1HJyksXG5cdFx0XHRpc1RleHRhcmVhOiBpc1RleHRhcmVhLFxuXHRcdFx0aXNFbXB0eTogaXNFbXB0eSxcblx0XHRcdGlzRW1wdHlBbmNob3I6IGZ1bmMuYW5kKGlzQW5jaG9yLCBpc0VtcHR5KSxcblx0XHRcdGlzQ2xvc2VzdFNpYmxpbmc6IGlzQ2xvc2VzdFNpYmxpbmcsXG5cdFx0XHR3aXRoQ2xvc2VzdFNpYmxpbmdzOiB3aXRoQ2xvc2VzdFNpYmxpbmdzLFxuXHRcdFx0bm9kZUxlbmd0aDogbm9kZUxlbmd0aCxcblx0XHRcdGlzTGVmdEVkZ2VQb2ludDogaXNMZWZ0RWRnZVBvaW50LFxuXHRcdFx0aXNSaWdodEVkZ2VQb2ludDogaXNSaWdodEVkZ2VQb2ludCxcblx0XHRcdGlzRWRnZVBvaW50OiBpc0VkZ2VQb2ludCxcblx0XHRcdGlzTGVmdEVkZ2VPZjogaXNMZWZ0RWRnZU9mLFxuXHRcdFx0aXNSaWdodEVkZ2VPZjogaXNSaWdodEVkZ2VPZixcblx0XHRcdHByZXZQb2ludDogcHJldlBvaW50LFxuXHRcdFx0bmV4dFBvaW50OiBuZXh0UG9pbnQsXG5cdFx0XHRpc1NhbWVQb2ludDogaXNTYW1lUG9pbnQsXG5cdFx0XHRpc1Zpc2libGVQb2ludDogaXNWaXNpYmxlUG9pbnQsXG5cdFx0XHRwcmV2UG9pbnRVbnRpbDogcHJldlBvaW50VW50aWwsXG5cdFx0XHRuZXh0UG9pbnRVbnRpbDogbmV4dFBvaW50VW50aWwsXG5cdFx0XHR3YWxrUG9pbnQ6IHdhbGtQb2ludCxcblx0XHRcdGFuY2VzdG9yOiBhbmNlc3Rvcixcblx0XHRcdHNpbmdsZUNoaWxkQW5jZXN0b3I6IHNpbmdsZUNoaWxkQW5jZXN0b3IsXG5cdFx0XHRsaXN0QW5jZXN0b3I6IGxpc3RBbmNlc3Rvcixcblx0XHRcdGxhc3RBbmNlc3RvcjogbGFzdEFuY2VzdG9yLFxuXHRcdFx0bGlzdE5leHQ6IGxpc3ROZXh0LFxuXHRcdFx0bGlzdFByZXY6IGxpc3RQcmV2LFxuXHRcdFx0bGlzdERlc2NlbmRhbnQ6IGxpc3REZXNjZW5kYW50LFxuXHRcdFx0Y29tbW9uQW5jZXN0b3I6IGNvbW1vbkFuY2VzdG9yLFxuXHRcdFx0d3JhcDogd3JhcCxcblx0XHRcdGluc2VydEFmdGVyOiBpbnNlcnRBZnRlcixcblx0XHRcdGFwcGVuZENoaWxkTm9kZXM6IGFwcGVuZENoaWxkTm9kZXMsXG5cdFx0XHRwb3NpdGlvbjogcG9zaXRpb24sXG5cdFx0XHRoYXNDaGlsZHJlbjogaGFzQ2hpbGRyZW4sXG5cdFx0XHRtYWtlT2Zmc2V0UGF0aDogbWFrZU9mZnNldFBhdGgsXG5cdFx0XHRmcm9tT2Zmc2V0UGF0aDogZnJvbU9mZnNldFBhdGgsXG5cdFx0XHRzcGxpdFRyZWU6IHNwbGl0VHJlZSxcblx0XHRcdHNwbGl0UG9pbnQ6IHNwbGl0UG9pbnQsXG5cdFx0XHRjcmVhdGU6IGNyZWF0ZSxcblx0XHRcdGNyZWF0ZVRleHQ6IGNyZWF0ZVRleHQsXG5cdFx0XHRyZW1vdmU6IHJlbW92ZSxcblx0XHRcdHJlbW92ZVdoaWxlOiByZW1vdmVXaGlsZSxcblx0XHRcdHJlcGxhY2U6IHJlcGxhY2UsXG5cdFx0XHRodG1sOiBodG1sLFxuXHRcdFx0dmFsdWU6IHZhbHVlXG5cdFx0fTtcblx0fSkoKTtcblxuXG5cdHZhciByYW5nZSA9IChmdW5jdGlvbiAoKSB7XG5cblx0XHQvKipcblx0XHQgKiByZXR1cm4gYm91bmRhcnlQb2ludCBmcm9tIFRleHRSYW5nZSwgaW5zcGlyZWQgYnkgQW5keSBOYSdzIEh1c2t5UmFuZ2UuanNcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7VGV4dFJhbmdlfSB0ZXh0UmFuZ2Vcblx0XHQgKiBAcGFyYW0ge0Jvb2xlYW59IGlzU3RhcnRcblx0XHQgKiBAcmV0dXJuIHtCb3VuZGFyeVBvaW50fVxuXHRcdCAqXG5cdFx0ICogQHNlZSBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvaWUvbXM1MzU4NzIodj12cy44NSkuYXNweFxuXHRcdCAqL1xuXHRcdHZhciB0ZXh0UmFuZ2VUb1BvaW50ID0gZnVuY3Rpb24gKHRleHRSYW5nZSwgaXNTdGFydCkge1xuXHRcdFx0dmFyIGNvbnRhaW5lciA9IHRleHRSYW5nZS5wYXJlbnRFbGVtZW50KCksIG9mZnNldDtcblxuXHRcdFx0dmFyIHRlc3RlciA9IGRvY3VtZW50LmJvZHkuY3JlYXRlVGV4dFJhbmdlKCksIHByZXZDb250YWluZXI7XG5cdFx0XHR2YXIgY2hpbGROb2RlcyA9IGxpc3QuZnJvbShjb250YWluZXIuY2hpbGROb2Rlcyk7XG5cdFx0XHRmb3IgKG9mZnNldCA9IDA7IG9mZnNldCA8IGNoaWxkTm9kZXMubGVuZ3RoOyBvZmZzZXQrKykge1xuXHRcdFx0XHRpZiAoZG9tLmlzVGV4dChjaGlsZE5vZGVzW29mZnNldF0pKSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGVzdGVyLm1vdmVUb0VsZW1lbnRUZXh0KGNoaWxkTm9kZXNbb2Zmc2V0XSk7XG5cdFx0XHRcdGlmICh0ZXN0ZXIuY29tcGFyZUVuZFBvaW50cygnU3RhcnRUb1N0YXJ0JywgdGV4dFJhbmdlKSA+PSAwKSB7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdFx0cHJldkNvbnRhaW5lciA9IGNoaWxkTm9kZXNbb2Zmc2V0XTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKG9mZnNldCAhPT0gMCAmJiBkb20uaXNUZXh0KGNoaWxkTm9kZXNbb2Zmc2V0IC0gMV0pKSB7XG5cdFx0XHRcdHZhciB0ZXh0UmFuZ2VTdGFydCA9IGRvY3VtZW50LmJvZHkuY3JlYXRlVGV4dFJhbmdlKCksIGN1clRleHROb2RlID0gbnVsbDtcblx0XHRcdFx0dGV4dFJhbmdlU3RhcnQubW92ZVRvRWxlbWVudFRleHQocHJldkNvbnRhaW5lciB8fCBjb250YWluZXIpO1xuXHRcdFx0XHR0ZXh0UmFuZ2VTdGFydC5jb2xsYXBzZSghcHJldkNvbnRhaW5lcik7XG5cdFx0XHRcdGN1clRleHROb2RlID0gcHJldkNvbnRhaW5lciA/IHByZXZDb250YWluZXIubmV4dFNpYmxpbmcgOiBjb250YWluZXIuZmlyc3RDaGlsZDtcblxuXHRcdFx0XHR2YXIgcG9pbnRUZXN0ZXIgPSB0ZXh0UmFuZ2UuZHVwbGljYXRlKCk7XG5cdFx0XHRcdHBvaW50VGVzdGVyLnNldEVuZFBvaW50KCdTdGFydFRvU3RhcnQnLCB0ZXh0UmFuZ2VTdGFydCk7XG5cdFx0XHRcdHZhciB0ZXh0Q291bnQgPSBwb2ludFRlc3Rlci50ZXh0LnJlcGxhY2UoL1tcXHJcXG5dL2csICcnKS5sZW5ndGg7XG5cblx0XHRcdFx0d2hpbGUgKHRleHRDb3VudCA+IGN1clRleHROb2RlLm5vZGVWYWx1ZS5sZW5ndGggJiYgY3VyVGV4dE5vZGUubmV4dFNpYmxpbmcpIHtcblx0XHRcdFx0XHR0ZXh0Q291bnQgLT0gY3VyVGV4dE5vZGUubm9kZVZhbHVlLmxlbmd0aDtcblx0XHRcdFx0XHRjdXJUZXh0Tm9kZSA9IGN1clRleHROb2RlLm5leHRTaWJsaW5nO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0LyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuXHRcdFx0XHR2YXIgZHVtbXkgPSBjdXJUZXh0Tm9kZS5ub2RlVmFsdWU7IC8vIGVuZm9yY2UgSUUgdG8gcmUtcmVmZXJlbmNlIGN1clRleHROb2RlLCBoYWNrXG5cdFx0XHRcdC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG5cblx0XHRcdFx0aWYgKGlzU3RhcnQgJiYgY3VyVGV4dE5vZGUubmV4dFNpYmxpbmcgJiYgZG9tLmlzVGV4dChjdXJUZXh0Tm9kZS5uZXh0U2libGluZykgJiZcblx0XHRcdFx0XHR0ZXh0Q291bnQgPT09IGN1clRleHROb2RlLm5vZGVWYWx1ZS5sZW5ndGgpIHtcblx0XHRcdFx0XHR0ZXh0Q291bnQgLT0gY3VyVGV4dE5vZGUubm9kZVZhbHVlLmxlbmd0aDtcblx0XHRcdFx0XHRjdXJUZXh0Tm9kZSA9IGN1clRleHROb2RlLm5leHRTaWJsaW5nO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y29udGFpbmVyID0gY3VyVGV4dE5vZGU7XG5cdFx0XHRcdG9mZnNldCA9IHRleHRDb3VudDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0Y29udDogY29udGFpbmVyLFxuXHRcdFx0XHRvZmZzZXQ6IG9mZnNldFxuXHRcdFx0fTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogcmV0dXJuIFRleHRSYW5nZSBmcm9tIGJvdW5kYXJ5IHBvaW50IChpbnNwaXJlZCBieSBnb29nbGUgY2xvc3VyZS1saWJyYXJ5KVxuXHRcdCAqIEBwYXJhbSB7Qm91bmRhcnlQb2ludH0gcG9pbnRcblx0XHQgKiBAcmV0dXJuIHtUZXh0UmFuZ2V9XG5cdFx0ICovXG5cdFx0dmFyIHBvaW50VG9UZXh0UmFuZ2UgPSBmdW5jdGlvbiAocG9pbnQpIHtcblx0XHRcdHZhciB0ZXh0UmFuZ2VJbmZvID0gZnVuY3Rpb24gKGNvbnRhaW5lciwgb2Zmc2V0KSB7XG5cdFx0XHRcdHZhciBub2RlLCBpc0NvbGxhcHNlVG9TdGFydDtcblxuXHRcdFx0XHRpZiAoZG9tLmlzVGV4dChjb250YWluZXIpKSB7XG5cdFx0XHRcdFx0dmFyIHByZXZUZXh0Tm9kZXMgPSBkb20ubGlzdFByZXYoY29udGFpbmVyLCBmdW5jLm5vdChkb20uaXNUZXh0KSk7XG5cdFx0XHRcdFx0dmFyIHByZXZDb250YWluZXIgPSBsaXN0Lmxhc3QocHJldlRleHROb2RlcykucHJldmlvdXNTaWJsaW5nO1xuXHRcdFx0XHRcdG5vZGUgPSBwcmV2Q29udGFpbmVyIHx8IGNvbnRhaW5lci5wYXJlbnROb2RlO1xuXHRcdFx0XHRcdG9mZnNldCArPSBsaXN0LnN1bShsaXN0LnRhaWwocHJldlRleHROb2RlcyksIGRvbS5ub2RlTGVuZ3RoKTtcblx0XHRcdFx0XHRpc0NvbGxhcHNlVG9TdGFydCA9ICFwcmV2Q29udGFpbmVyO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG5vZGUgPSBjb250YWluZXIuY2hpbGROb2Rlc1tvZmZzZXRdIHx8IGNvbnRhaW5lcjtcblx0XHRcdFx0XHRpZiAoZG9tLmlzVGV4dChub2RlKSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRleHRSYW5nZUluZm8obm9kZSwgMCk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0b2Zmc2V0ID0gMDtcblx0XHRcdFx0XHRpc0NvbGxhcHNlVG9TdGFydCA9IGZhbHNlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRub2RlOiBub2RlLFxuXHRcdFx0XHRcdGNvbGxhcHNlVG9TdGFydDogaXNDb2xsYXBzZVRvU3RhcnQsXG5cdFx0XHRcdFx0b2Zmc2V0OiBvZmZzZXRcblx0XHRcdFx0fTtcblx0XHRcdH07XG5cblx0XHRcdHZhciB0ZXh0UmFuZ2UgPSBkb2N1bWVudC5ib2R5LmNyZWF0ZVRleHRSYW5nZSgpO1xuXHRcdFx0dmFyIGluZm8gPSB0ZXh0UmFuZ2VJbmZvKHBvaW50Lm5vZGUsIHBvaW50Lm9mZnNldCk7XG5cblx0XHRcdHRleHRSYW5nZS5tb3ZlVG9FbGVtZW50VGV4dChpbmZvLm5vZGUpO1xuXHRcdFx0dGV4dFJhbmdlLmNvbGxhcHNlKGluZm8uY29sbGFwc2VUb1N0YXJ0KTtcblx0XHRcdHRleHRSYW5nZS5tb3ZlU3RhcnQoJ2NoYXJhY3RlcicsIGluZm8ub2Zmc2V0KTtcblx0XHRcdHJldHVybiB0ZXh0UmFuZ2U7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIFdyYXBwZWQgUmFuZ2Vcblx0XHQgKlxuXHRcdCAqIEBjb25zdHJ1Y3RvclxuXHRcdCAqIEBwYXJhbSB7Tm9kZX0gc2MgLSBzdGFydCBjb250YWluZXJcblx0XHQgKiBAcGFyYW0ge051bWJlcn0gc28gLSBzdGFydCBvZmZzZXRcblx0XHQgKiBAcGFyYW0ge05vZGV9IGVjIC0gZW5kIGNvbnRhaW5lclxuXHRcdCAqIEBwYXJhbSB7TnVtYmVyfSBlbyAtIGVuZCBvZmZzZXRcblx0XHQgKi9cblx0XHR2YXIgV3JhcHBlZFJhbmdlID0gZnVuY3Rpb24gKHNjLCBzbywgZWMsIGVvKSB7XG5cdFx0XHR0aGlzLnNjID0gc2M7XG5cdFx0XHR0aGlzLnNvID0gc287XG5cdFx0XHR0aGlzLmVjID0gZWM7XG5cdFx0XHR0aGlzLmVvID0gZW87XG5cblx0XHRcdC8vIG5hdGl2ZVJhbmdlOiBnZXQgbmF0aXZlUmFuZ2UgZnJvbSBzYywgc28sIGVjLCBlb1xuXHRcdFx0dmFyIG5hdGl2ZVJhbmdlID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRpZiAoYWdlbnQuaXNXM0NSYW5nZVN1cHBvcnQpIHtcblx0XHRcdFx0XHR2YXIgdzNjUmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuXHRcdFx0XHRcdHczY1JhbmdlLnNldFN0YXJ0KHNjLCBzbyk7XG5cdFx0XHRcdFx0dzNjUmFuZ2Uuc2V0RW5kKGVjLCBlbyk7XG5cblx0XHRcdFx0XHRyZXR1cm4gdzNjUmFuZ2U7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dmFyIHRleHRSYW5nZSA9IHBvaW50VG9UZXh0UmFuZ2Uoe1xuXHRcdFx0XHRcdFx0bm9kZTogc2MsXG5cdFx0XHRcdFx0XHRvZmZzZXQ6IHNvXG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHR0ZXh0UmFuZ2Uuc2V0RW5kUG9pbnQoJ0VuZFRvRW5kJywgcG9pbnRUb1RleHRSYW5nZSh7XG5cdFx0XHRcdFx0XHRub2RlOiBlYyxcblx0XHRcdFx0XHRcdG9mZnNldDogZW9cblx0XHRcdFx0XHR9KSk7XG5cblx0XHRcdFx0XHRyZXR1cm4gdGV4dFJhbmdlO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXG5cdFx0XHR0aGlzLmdldFBvaW50cyA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRzYzogc2MsXG5cdFx0XHRcdFx0c286IHNvLFxuXHRcdFx0XHRcdGVjOiBlYyxcblx0XHRcdFx0XHRlbzogZW9cblx0XHRcdFx0fTtcblx0XHRcdH07XG5cblx0XHRcdHRoaXMuZ2V0U3RhcnRQb2ludCA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRub2RlOiBzYyxcblx0XHRcdFx0XHRvZmZzZXQ6IHNvXG5cdFx0XHRcdH07XG5cdFx0XHR9O1xuXG5cdFx0XHR0aGlzLmdldEVuZFBvaW50ID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdG5vZGU6IGVjLFxuXHRcdFx0XHRcdG9mZnNldDogZW9cblx0XHRcdFx0fTtcblx0XHRcdH07XG5cblx0XHRcdC8qKlxuXHRcdFx0ICogc2VsZWN0IHVwZGF0ZSB2aXNpYmxlIHJhbmdlXG5cdFx0XHQgKi9cblx0XHRcdHRoaXMuc2VsZWN0ID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0XHR2YXIgbmF0aXZlUm5nID0gbmF0aXZlUmFuZ2UoKTtcblx0XHRcdFx0aWYgKGFnZW50LmlzVzNDUmFuZ2VTdXBwb3J0KSB7XG5cdFx0XHRcdFx0dmFyIHNlbGVjdGlvbiA9IGRvY3VtZW50LmdldFNlbGVjdGlvbigpO1xuXHRcdFx0XHRcdGlmIChzZWxlY3Rpb24ucmFuZ2VDb3VudCA+IDApIHtcblx0XHRcdFx0XHRcdHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0c2VsZWN0aW9uLmFkZFJhbmdlKG5hdGl2ZVJuZyk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bmF0aXZlUm5nLnNlbGVjdCgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXG5cdFx0XHQvKipcblx0XHRcdCAqIEByZXR1cm4ge1dyYXBwZWRSYW5nZX1cblx0XHRcdCAqL1xuXHRcdFx0dGhpcy5ub3JtYWxpemUgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdFx0LyoqXG5cdFx0XHRcdCAqIEBwYXJhbSB7Qm91bmRhcnlQb2ludH0gcG9pbnRcblx0XHRcdFx0ICogQHJldHVybiB7Qm91bmRhcnlQb2ludH1cblx0XHRcdFx0ICovXG5cdFx0XHRcdHZhciBnZXRWaXNpYmxlUG9pbnQgPSBmdW5jdGlvbiAocG9pbnQpIHtcblx0XHRcdFx0XHRpZiAoIWRvbS5pc1Zpc2libGVQb2ludChwb2ludCkpIHtcblx0XHRcdFx0XHRcdGlmIChkb20uaXNMZWZ0RWRnZVBvaW50KHBvaW50KSkge1xuXHRcdFx0XHRcdFx0XHRwb2ludCA9IGRvbS5uZXh0UG9pbnRVbnRpbChwb2ludCwgZG9tLmlzVmlzaWJsZVBvaW50KTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHBvaW50ID0gZG9tLnByZXZQb2ludFVudGlsKHBvaW50LCBkb20uaXNWaXNpYmxlUG9pbnQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gcG9pbnQ7XG5cdFx0XHRcdH07XG5cblx0XHRcdFx0dmFyIHN0YXJ0UG9pbnQgPSBnZXRWaXNpYmxlUG9pbnQodGhpcy5nZXRTdGFydFBvaW50KCkpO1xuXHRcdFx0XHR2YXIgZW5kUG9pbnQgPSBnZXRWaXNpYmxlUG9pbnQodGhpcy5nZXRFbmRQb2ludCgpKTtcblxuXHRcdFx0XHRyZXR1cm4gbmV3IFdyYXBwZWRSYW5nZShcblx0XHRcdFx0ICBzdGFydFBvaW50Lm5vZGUsXG5cdFx0XHRcdCAgc3RhcnRQb2ludC5vZmZzZXQsXG5cdFx0XHRcdCAgZW5kUG9pbnQubm9kZSxcblx0XHRcdFx0ICBlbmRQb2ludC5vZmZzZXRcblx0XHRcdFx0KTtcblx0XHRcdH07XG5cblx0XHRcdC8qKlxuXHRcdFx0ICogcmV0dXJucyBtYXRjaGVkIG5vZGVzIG9uIHJhbmdlXG5cdFx0XHQgKlxuXHRcdFx0ICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRdIC0gcHJlZGljYXRlIGZ1bmN0aW9uXG5cdFx0XHQgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG5cdFx0XHQgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmluY2x1ZGVBbmNlc3Rvcl1cblx0XHRcdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuZnVsbHlDb250YWluc11cblx0XHRcdCAqIEByZXR1cm4ge05vZGVbXX1cblx0XHRcdCAqL1xuXHRcdFx0dGhpcy5ub2RlcyA9IGZ1bmN0aW9uIChwcmVkLCBvcHRpb25zKSB7XG5cdFx0XHRcdHByZWQgPSBwcmVkIHx8IGZ1bmMub2s7XG5cblx0XHRcdFx0dmFyIGluY2x1ZGVBbmNlc3RvciA9IG9wdGlvbnMgJiYgb3B0aW9ucy5pbmNsdWRlQW5jZXN0b3I7XG5cdFx0XHRcdHZhciBmdWxseUNvbnRhaW5zID0gb3B0aW9ucyAmJiBvcHRpb25zLmZ1bGx5Q29udGFpbnM7XG5cblx0XHRcdFx0Ly8gVE9ETyBjb21wYXJlIHBvaW50cyBhbmQgc29ydFxuXHRcdFx0XHR2YXIgc3RhcnRQb2ludCA9IHRoaXMuZ2V0U3RhcnRQb2ludCgpO1xuXHRcdFx0XHR2YXIgZW5kUG9pbnQgPSB0aGlzLmdldEVuZFBvaW50KCk7XG5cblx0XHRcdFx0dmFyIG5vZGVzID0gW107XG5cdFx0XHRcdHZhciBsZWZ0RWRnZU5vZGVzID0gW107XG5cblx0XHRcdFx0ZG9tLndhbGtQb2ludChzdGFydFBvaW50LCBlbmRQb2ludCwgZnVuY3Rpb24gKHBvaW50KSB7XG5cdFx0XHRcdFx0aWYgKGRvbS5pc0VkaXRhYmxlKHBvaW50Lm5vZGUpKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0dmFyIG5vZGU7XG5cdFx0XHRcdFx0aWYgKGZ1bGx5Q29udGFpbnMpIHtcblx0XHRcdFx0XHRcdGlmIChkb20uaXNMZWZ0RWRnZVBvaW50KHBvaW50KSkge1xuXHRcdFx0XHRcdFx0XHRsZWZ0RWRnZU5vZGVzLnB1c2gocG9pbnQubm9kZSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAoZG9tLmlzUmlnaHRFZGdlUG9pbnQocG9pbnQpICYmIGxpc3QuY29udGFpbnMobGVmdEVkZ2VOb2RlcywgcG9pbnQubm9kZSkpIHtcblx0XHRcdFx0XHRcdFx0bm9kZSA9IHBvaW50Lm5vZGU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChpbmNsdWRlQW5jZXN0b3IpIHtcblx0XHRcdFx0XHRcdG5vZGUgPSBkb20uYW5jZXN0b3IocG9pbnQubm9kZSwgcHJlZCk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdG5vZGUgPSBwb2ludC5ub2RlO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmIChub2RlICYmIHByZWQobm9kZSkpIHtcblx0XHRcdFx0XHRcdG5vZGVzLnB1c2gobm9kZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LCB0cnVlKTtcblxuXHRcdFx0XHRyZXR1cm4gbGlzdC51bmlxdWUobm9kZXMpO1xuXHRcdFx0fTtcblxuXHRcdFx0LyoqXG5cdFx0XHQgKiByZXR1cm5zIGNvbW1vbkFuY2VzdG9yIG9mIHJhbmdlXG5cdFx0XHQgKiBAcmV0dXJuIHtFbGVtZW50fSAtIGNvbW1vbkFuY2VzdG9yXG5cdFx0XHQgKi9cblx0XHRcdHRoaXMuY29tbW9uQW5jZXN0b3IgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHJldHVybiBkb20uY29tbW9uQW5jZXN0b3Ioc2MsIGVjKTtcblx0XHRcdH07XG5cblx0XHRcdC8qKlxuXHRcdFx0ICogcmV0dXJucyBleHBhbmRlZCByYW5nZSBieSBwcmVkXG5cdFx0XHQgKlxuXHRcdFx0ICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZCAtIHByZWRpY2F0ZSBmdW5jdGlvblxuXHRcdFx0ICogQHJldHVybiB7V3JhcHBlZFJhbmdlfVxuXHRcdFx0ICovXG5cdFx0XHR0aGlzLmV4cGFuZCA9IGZ1bmN0aW9uIChwcmVkKSB7XG5cdFx0XHRcdHZhciBzdGFydEFuY2VzdG9yID0gZG9tLmFuY2VzdG9yKHNjLCBwcmVkKTtcblx0XHRcdFx0dmFyIGVuZEFuY2VzdG9yID0gZG9tLmFuY2VzdG9yKGVjLCBwcmVkKTtcblxuXHRcdFx0XHRpZiAoIXN0YXJ0QW5jZXN0b3IgJiYgIWVuZEFuY2VzdG9yKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG5ldyBXcmFwcGVkUmFuZ2Uoc2MsIHNvLCBlYywgZW8pO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dmFyIGJvdW5kYXJ5UG9pbnRzID0gdGhpcy5nZXRQb2ludHMoKTtcblxuXHRcdFx0XHRpZiAoc3RhcnRBbmNlc3Rvcikge1xuXHRcdFx0XHRcdGJvdW5kYXJ5UG9pbnRzLnNjID0gc3RhcnRBbmNlc3Rvcjtcblx0XHRcdFx0XHRib3VuZGFyeVBvaW50cy5zbyA9IDA7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoZW5kQW5jZXN0b3IpIHtcblx0XHRcdFx0XHRib3VuZGFyeVBvaW50cy5lYyA9IGVuZEFuY2VzdG9yO1xuXHRcdFx0XHRcdGJvdW5kYXJ5UG9pbnRzLmVvID0gZG9tLm5vZGVMZW5ndGgoZW5kQW5jZXN0b3IpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIG5ldyBXcmFwcGVkUmFuZ2UoXG5cdFx0XHRcdCAgYm91bmRhcnlQb2ludHMuc2MsXG5cdFx0XHRcdCAgYm91bmRhcnlQb2ludHMuc28sXG5cdFx0XHRcdCAgYm91bmRhcnlQb2ludHMuZWMsXG5cdFx0XHRcdCAgYm91bmRhcnlQb2ludHMuZW9cblx0XHRcdFx0KTtcblx0XHRcdH07XG5cblx0XHRcdC8qKlxuXHRcdFx0ICogQHBhcmFtIHtCb29sZWFufSBpc0NvbGxhcHNlVG9TdGFydFxuXHRcdFx0ICogQHJldHVybiB7V3JhcHBlZFJhbmdlfVxuXHRcdFx0ICovXG5cdFx0XHR0aGlzLmNvbGxhcHNlID0gZnVuY3Rpb24gKGlzQ29sbGFwc2VUb1N0YXJ0KSB7XG5cdFx0XHRcdGlmIChpc0NvbGxhcHNlVG9TdGFydCkge1xuXHRcdFx0XHRcdHJldHVybiBuZXcgV3JhcHBlZFJhbmdlKHNjLCBzbywgc2MsIHNvKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZXR1cm4gbmV3IFdyYXBwZWRSYW5nZShlYywgZW8sIGVjLCBlbyk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cblx0XHRcdC8qKlxuXHRcdFx0ICogc3BsaXRUZXh0IG9uIHJhbmdlXG5cdFx0XHQgKi9cblx0XHRcdHRoaXMuc3BsaXRUZXh0ID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0XHR2YXIgaXNTYW1lQ29udGFpbmVyID0gc2MgPT09IGVjO1xuXHRcdFx0XHR2YXIgYm91bmRhcnlQb2ludHMgPSB0aGlzLmdldFBvaW50cygpO1xuXG5cdFx0XHRcdGlmIChkb20uaXNUZXh0KGVjKSAmJiAhZG9tLmlzRWRnZVBvaW50KHRoaXMuZ2V0RW5kUG9pbnQoKSkpIHtcblx0XHRcdFx0XHRlYy5zcGxpdFRleHQoZW8pO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKGRvbS5pc1RleHQoc2MpICYmICFkb20uaXNFZGdlUG9pbnQodGhpcy5nZXRTdGFydFBvaW50KCkpKSB7XG5cdFx0XHRcdFx0Ym91bmRhcnlQb2ludHMuc2MgPSBzYy5zcGxpdFRleHQoc28pO1xuXHRcdFx0XHRcdGJvdW5kYXJ5UG9pbnRzLnNvID0gMDtcblxuXHRcdFx0XHRcdGlmIChpc1NhbWVDb250YWluZXIpIHtcblx0XHRcdFx0XHRcdGJvdW5kYXJ5UG9pbnRzLmVjID0gYm91bmRhcnlQb2ludHMuc2M7XG5cdFx0XHRcdFx0XHRib3VuZGFyeVBvaW50cy5lbyA9IGVvIC0gc287XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIG5ldyBXcmFwcGVkUmFuZ2UoXG5cdFx0XHRcdCAgYm91bmRhcnlQb2ludHMuc2MsXG5cdFx0XHRcdCAgYm91bmRhcnlQb2ludHMuc28sXG5cdFx0XHRcdCAgYm91bmRhcnlQb2ludHMuZWMsXG5cdFx0XHRcdCAgYm91bmRhcnlQb2ludHMuZW9cblx0XHRcdFx0KTtcblx0XHRcdH07XG5cblx0XHRcdC8qKlxuXHRcdFx0ICogZGVsZXRlIGNvbnRlbnRzIG9uIHJhbmdlXG5cdFx0XHQgKiBAcmV0dXJuIHtXcmFwcGVkUmFuZ2V9XG5cdFx0XHQgKi9cblx0XHRcdHRoaXMuZGVsZXRlQ29udGVudHMgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdGlmICh0aGlzLmlzQ29sbGFwc2VkKCkpIHtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHZhciBybmcgPSB0aGlzLnNwbGl0VGV4dCgpO1xuXHRcdFx0XHR2YXIgbm9kZXMgPSBybmcubm9kZXMobnVsbCwge1xuXHRcdFx0XHRcdGZ1bGx5Q29udGFpbnM6IHRydWVcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0Ly8gZmluZCBuZXcgY3Vyc29yIHBvaW50XG5cdFx0XHRcdHZhciBwb2ludCA9IGRvbS5wcmV2UG9pbnRVbnRpbChybmcuZ2V0U3RhcnRQb2ludCgpLCBmdW5jdGlvbiAocG9pbnQpIHtcblx0XHRcdFx0XHRyZXR1cm4gIWxpc3QuY29udGFpbnMobm9kZXMsIHBvaW50Lm5vZGUpO1xuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHR2YXIgZW1wdHlQYXJlbnRzID0gW107XG5cdFx0XHRcdCQuZWFjaChub2RlcywgZnVuY3Rpb24gKGlkeCwgbm9kZSkge1xuXHRcdFx0XHRcdC8vIGZpbmQgZW1wdHkgcGFyZW50c1xuXHRcdFx0XHRcdHZhciBwYXJlbnQgPSBub2RlLnBhcmVudE5vZGU7XG5cdFx0XHRcdFx0aWYgKHBvaW50Lm5vZGUgIT09IHBhcmVudCAmJiBkb20ubm9kZUxlbmd0aChwYXJlbnQpID09PSAxKSB7XG5cdFx0XHRcdFx0XHRlbXB0eVBhcmVudHMucHVzaChwYXJlbnQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRkb20ucmVtb3ZlKG5vZGUsIGZhbHNlKTtcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0Ly8gcmVtb3ZlIGVtcHR5IHBhcmVudHNcblx0XHRcdFx0JC5lYWNoKGVtcHR5UGFyZW50cywgZnVuY3Rpb24gKGlkeCwgbm9kZSkge1xuXHRcdFx0XHRcdGRvbS5yZW1vdmUobm9kZSwgZmFsc2UpO1xuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHRyZXR1cm4gbmV3IFdyYXBwZWRSYW5nZShcblx0XHRcdFx0ICBwb2ludC5ub2RlLFxuXHRcdFx0XHQgIHBvaW50Lm9mZnNldCxcblx0XHRcdFx0ICBwb2ludC5ub2RlLFxuXHRcdFx0XHQgIHBvaW50Lm9mZnNldFxuXHRcdFx0XHQpLm5vcm1hbGl6ZSgpO1xuXHRcdFx0fTtcblxuXHRcdFx0LyoqXG5cdFx0XHQgKiBtYWtlSXNPbjogcmV0dXJuIGlzT24ocHJlZCkgZnVuY3Rpb25cblx0XHRcdCAqL1xuXHRcdFx0dmFyIG1ha2VJc09uID0gZnVuY3Rpb24gKHByZWQpIHtcblx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHR2YXIgYW5jZXN0b3IgPSBkb20uYW5jZXN0b3Ioc2MsIHByZWQpO1xuXHRcdFx0XHRcdHJldHVybiAhIWFuY2VzdG9yICYmIChhbmNlc3RvciA9PT0gZG9tLmFuY2VzdG9yKGVjLCBwcmVkKSk7XG5cdFx0XHRcdH07XG5cdFx0XHR9O1xuXG5cdFx0XHQvLyBpc09uRWRpdGFibGU6IGp1ZGdlIHdoZXRoZXIgcmFuZ2UgaXMgb24gZWRpdGFibGUgb3Igbm90XG5cdFx0XHR0aGlzLmlzT25FZGl0YWJsZSA9IG1ha2VJc09uKGRvbS5pc0VkaXRhYmxlKTtcblx0XHRcdC8vIGlzT25MaXN0OiBqdWRnZSB3aGV0aGVyIHJhbmdlIGlzIG9uIGxpc3Qgbm9kZSBvciBub3Rcblx0XHRcdHRoaXMuaXNPbkxpc3QgPSBtYWtlSXNPbihkb20uaXNMaXN0KTtcblx0XHRcdC8vIGlzT25BbmNob3I6IGp1ZGdlIHdoZXRoZXIgcmFuZ2UgaXMgb24gYW5jaG9yIG5vZGUgb3Igbm90XG5cdFx0XHR0aGlzLmlzT25BbmNob3IgPSBtYWtlSXNPbihkb20uaXNBbmNob3IpO1xuXHRcdFx0Ly8gaXNPbkFuY2hvcjoganVkZ2Ugd2hldGhlciByYW5nZSBpcyBvbiBjZWxsIG5vZGUgb3Igbm90XG5cdFx0XHR0aGlzLmlzT25DZWxsID0gbWFrZUlzT24oZG9tLmlzQ2VsbCk7XG5cblx0XHRcdC8qKlxuXHRcdFx0ICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZFxuXHRcdFx0ICogQHJldHVybiB7Qm9vbGVhbn1cblx0XHRcdCAqL1xuXHRcdFx0dGhpcy5pc0xlZnRFZGdlT2YgPSBmdW5jdGlvbiAocHJlZCkge1xuXHRcdFx0XHRpZiAoIWRvbS5pc0xlZnRFZGdlUG9pbnQodGhpcy5nZXRTdGFydFBvaW50KCkpKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dmFyIG5vZGUgPSBkb20uYW5jZXN0b3IodGhpcy5zYywgcHJlZCk7XG5cdFx0XHRcdHJldHVybiBub2RlICYmIGRvbS5pc0xlZnRFZGdlT2YodGhpcy5zYywgbm9kZSk7XG5cdFx0XHR9O1xuXG5cdFx0XHQvKipcblx0XHRcdCAqIHJldHVybnMgd2hldGhlciByYW5nZSB3YXMgY29sbGFwc2VkIG9yIG5vdFxuXHRcdFx0ICovXG5cdFx0XHR0aGlzLmlzQ29sbGFwc2VkID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRyZXR1cm4gc2MgPT09IGVjICYmIHNvID09PSBlbztcblx0XHRcdH07XG5cblx0XHRcdC8qKlxuXHRcdFx0ICogd3JhcCBpbmxpbmUgbm9kZXMgd2hpY2ggY2hpbGRyZW4gb2YgYm9keSB3aXRoIHBhcmFncmFwaFxuXHRcdFx0ICpcblx0XHRcdCAqIEByZXR1cm4ge1dyYXBwZWRSYW5nZX1cblx0XHRcdCAqL1xuXHRcdFx0dGhpcy53cmFwQm9keUlubGluZVdpdGhQYXJhID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRpZiAoZG9tLmlzQm9keUNvbnRhaW5lcihzYykgJiYgZG9tLmlzRW1wdHkoc2MpKSB7XG5cdFx0XHRcdFx0c2MuaW5uZXJIVE1MID0gZG9tLmVtcHR5UGFyYTtcblx0XHRcdFx0XHRyZXR1cm4gbmV3IFdyYXBwZWRSYW5nZShzYy5maXJzdENoaWxkLCAwLCBzYy5maXJzdENoaWxkLCAwKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChkb20uaXNQYXJhSW5saW5lKHNjKSB8fCBkb20uaXNQYXJhKHNjKSkge1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLm5vcm1hbGl6ZSgpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gZmluZCBpbmxpbmUgdG9wIGFuY2VzdG9yXG5cdFx0XHRcdHZhciB0b3BBbmNlc3Rvcjtcblx0XHRcdFx0aWYgKGRvbS5pc0lubGluZShzYykpIHtcblx0XHRcdFx0XHR2YXIgYW5jZXN0b3JzID0gZG9tLmxpc3RBbmNlc3RvcihzYywgZnVuYy5ub3QoZG9tLmlzSW5saW5lKSk7XG5cdFx0XHRcdFx0dG9wQW5jZXN0b3IgPSBsaXN0Lmxhc3QoYW5jZXN0b3JzKTtcblx0XHRcdFx0XHRpZiAoIWRvbS5pc0lubGluZSh0b3BBbmNlc3RvcikpIHtcblx0XHRcdFx0XHRcdHRvcEFuY2VzdG9yID0gYW5jZXN0b3JzW2FuY2VzdG9ycy5sZW5ndGggLSAyXSB8fCBzYy5jaGlsZE5vZGVzW3NvXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dG9wQW5jZXN0b3IgPSBzYy5jaGlsZE5vZGVzW3NvID4gMCA/IHNvIC0gMSA6IDBdO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gc2libGluZ3Mgbm90IGluIHBhcmFncmFwaFxuXHRcdFx0XHR2YXIgaW5saW5lU2libGluZ3MgPSBkb20ubGlzdFByZXYodG9wQW5jZXN0b3IsIGRvbS5pc1BhcmFJbmxpbmUpLnJldmVyc2UoKTtcblx0XHRcdFx0aW5saW5lU2libGluZ3MgPSBpbmxpbmVTaWJsaW5ncy5jb25jYXQoZG9tLmxpc3ROZXh0KHRvcEFuY2VzdG9yLm5leHRTaWJsaW5nLCBkb20uaXNQYXJhSW5saW5lKSk7XG5cblx0XHRcdFx0Ly8gd3JhcCB3aXRoIHBhcmFncmFwaFxuXHRcdFx0XHRpZiAoaW5saW5lU2libGluZ3MubGVuZ3RoKSB7XG5cdFx0XHRcdFx0dmFyIHBhcmEgPSBkb20ud3JhcChsaXN0LmhlYWQoaW5saW5lU2libGluZ3MpLCAncCcpO1xuXHRcdFx0XHRcdGRvbS5hcHBlbmRDaGlsZE5vZGVzKHBhcmEsIGxpc3QudGFpbChpbmxpbmVTaWJsaW5ncykpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHRoaXMubm9ybWFsaXplKCk7XG5cdFx0XHR9O1xuXG5cdFx0XHQvKipcblx0XHRcdCAqIGluc2VydCBub2RlIGF0IGN1cnJlbnQgY3Vyc29yXG5cdFx0XHQgKlxuXHRcdFx0ICogQHBhcmFtIHtOb2RlfSBub2RlXG5cdFx0XHQgKiBAcmV0dXJuIHtOb2RlfVxuXHRcdFx0ICovXG5cdFx0XHR0aGlzLmluc2VydE5vZGUgPSBmdW5jdGlvbiAobm9kZSkge1xuXHRcdFx0XHR2YXIgcm5nID0gdGhpcy53cmFwQm9keUlubGluZVdpdGhQYXJhKCkuZGVsZXRlQ29udGVudHMoKTtcblx0XHRcdFx0dmFyIGluZm8gPSBkb20uc3BsaXRQb2ludChybmcuZ2V0U3RhcnRQb2ludCgpLCBkb20uaXNJbmxpbmUobm9kZSkpO1xuXG5cdFx0XHRcdGlmIChpbmZvLnJpZ2h0Tm9kZSkge1xuXHRcdFx0XHRcdGluZm8ucmlnaHROb2RlLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG5vZGUsIGluZm8ucmlnaHROb2RlKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRpbmZvLmNvbnRhaW5lci5hcHBlbmRDaGlsZChub2RlKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBub2RlO1xuXHRcdFx0fTtcblxuXHRcdFx0LyoqXG5cdFx0XHQgKiByZXR1cm5zIHRleHQgaW4gcmFuZ2Vcblx0XHRcdCAqXG5cdFx0XHQgKiBAcmV0dXJuIHtTdHJpbmd9XG5cdFx0XHQgKi9cblx0XHRcdHRoaXMudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHZhciBuYXRpdmVSbmcgPSBuYXRpdmVSYW5nZSgpO1xuXHRcdFx0XHRyZXR1cm4gYWdlbnQuaXNXM0NSYW5nZVN1cHBvcnQgPyBuYXRpdmVSbmcudG9TdHJpbmcoKSA6IG5hdGl2ZVJuZy50ZXh0O1xuXHRcdFx0fTtcblxuXHRcdFx0LyoqXG5cdFx0XHQgKiBjcmVhdGUgb2Zmc2V0UGF0aCBib29rbWFya1xuXHRcdFx0ICpcblx0XHRcdCAqIEBwYXJhbSB7Tm9kZX0gZWRpdGFibGVcblx0XHRcdCAqL1xuXHRcdFx0dGhpcy5ib29rbWFyayA9IGZ1bmN0aW9uIChlZGl0YWJsZSkge1xuXHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdHM6IHtcblx0XHRcdFx0XHRcdHBhdGg6IGRvbS5tYWtlT2Zmc2V0UGF0aChlZGl0YWJsZSwgc2MpLFxuXHRcdFx0XHRcdFx0b2Zmc2V0OiBzb1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0ZToge1xuXHRcdFx0XHRcdFx0cGF0aDogZG9tLm1ha2VPZmZzZXRQYXRoKGVkaXRhYmxlLCBlYyksXG5cdFx0XHRcdFx0XHRvZmZzZXQ6IGVvXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXHRcdFx0fTtcblxuXHRcdFx0LyoqXG5cdFx0XHQgKiBjcmVhdGUgb2Zmc2V0UGF0aCBib29rbWFyayBiYXNlIG9uIHBhcmFncmFwaFxuXHRcdFx0ICpcblx0XHRcdCAqIEBwYXJhbSB7Tm9kZVtdfSBwYXJhc1xuXHRcdFx0ICovXG5cdFx0XHR0aGlzLnBhcmFCb29rbWFyayA9IGZ1bmN0aW9uIChwYXJhcykge1xuXHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdHM6IHtcblx0XHRcdFx0XHRcdHBhdGg6IGxpc3QudGFpbChkb20ubWFrZU9mZnNldFBhdGgobGlzdC5oZWFkKHBhcmFzKSwgc2MpKSxcblx0XHRcdFx0XHRcdG9mZnNldDogc29cblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdGU6IHtcblx0XHRcdFx0XHRcdHBhdGg6IGxpc3QudGFpbChkb20ubWFrZU9mZnNldFBhdGgobGlzdC5sYXN0KHBhcmFzKSwgZWMpKSxcblx0XHRcdFx0XHRcdG9mZnNldDogZW9cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH07XG5cdFx0XHR9O1xuXG5cdFx0XHQvKipcblx0XHRcdCAqIGdldENsaWVudFJlY3RzXG5cdFx0XHQgKiBAcmV0dXJuIHtSZWN0W119XG5cdFx0XHQgKi9cblx0XHRcdHRoaXMuZ2V0Q2xpZW50UmVjdHMgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHZhciBuYXRpdmVSbmcgPSBuYXRpdmVSYW5nZSgpO1xuXHRcdFx0XHRyZXR1cm4gbmF0aXZlUm5nLmdldENsaWVudFJlY3RzKCk7XG5cdFx0XHR9O1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBAY2xhc3MgY29yZS5yYW5nZVxuXHRcdCAqXG5cdFx0ICogRGF0YSBzdHJ1Y3R1cmVcblx0XHQgKiAgKiBCb3VuZGFyeVBvaW50OiBhIHBvaW50IG9mIGRvbSB0cmVlXG5cdFx0ICogICogQm91bmRhcnlQb2ludHM6IHR3byBib3VuZGFyeVBvaW50cyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzdGFydCBhbmQgdGhlIGVuZCBvZiB0aGUgUmFuZ2Vcblx0XHQgKlxuXHRcdCAqIFNlZSB0byBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMi1UcmF2ZXJzYWwtUmFuZ2UvcmFuZ2VzLmh0bWwjTGV2ZWwtMi1SYW5nZS1Qb3NpdGlvblxuXHRcdCAqXG5cdFx0ICogQHNpbmdsZXRvblxuXHRcdCAqIEBhbHRlcm5hdGVDbGFzc05hbWUgcmFuZ2Vcblx0XHQgKi9cblx0XHRyZXR1cm4ge1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBAbWV0aG9kXG5cdFx0XHQgKiBcblx0XHRcdCAqIGNyZWF0ZSBSYW5nZSBPYmplY3QgRnJvbSBhcmd1bWVudHMgb3IgQnJvd3NlciBTZWxlY3Rpb25cblx0XHRcdCAqXG5cdFx0XHQgKiBAcGFyYW0ge05vZGV9IHNjIC0gc3RhcnQgY29udGFpbmVyXG5cdFx0XHQgKiBAcGFyYW0ge051bWJlcn0gc28gLSBzdGFydCBvZmZzZXRcblx0XHRcdCAqIEBwYXJhbSB7Tm9kZX0gZWMgLSBlbmQgY29udGFpbmVyXG5cdFx0XHQgKiBAcGFyYW0ge051bWJlcn0gZW8gLSBlbmQgb2Zmc2V0XG5cdFx0XHQgKiBAcmV0dXJuIHtXcmFwcGVkUmFuZ2V9XG5cdFx0XHQgKi9cblx0XHRcdGNyZWF0ZTogZnVuY3Rpb24gKHNjLCBzbywgZWMsIGVvKSB7XG5cdFx0XHRcdGlmICghYXJndW1lbnRzLmxlbmd0aCkgeyAvLyBmcm9tIEJyb3dzZXIgU2VsZWN0aW9uXG5cdFx0XHRcdFx0aWYgKGFnZW50LmlzVzNDUmFuZ2VTdXBwb3J0KSB7XG5cdFx0XHRcdFx0XHR2YXIgc2VsZWN0aW9uID0gZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCk7XG5cdFx0XHRcdFx0XHRpZiAoc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDApIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGRvbS5pc0JvZHkoc2VsZWN0aW9uLmFuY2hvck5vZGUpKSB7XG5cdFx0XHRcdFx0XHRcdC8vIEZpcmVmb3g6IHJldHVybnMgZW50aXJlIGJvZHkgYXMgcmFuZ2Ugb24gaW5pdGlhbGl6YXRpb24uIFdlIHdvbid0IG5ldmVyIG5lZWQgaXQuXG5cdFx0XHRcdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR2YXIgbmF0aXZlUm5nID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XG5cdFx0XHRcdFx0XHRzYyA9IG5hdGl2ZVJuZy5zdGFydENvbnRhaW5lcjtcblx0XHRcdFx0XHRcdHNvID0gbmF0aXZlUm5nLnN0YXJ0T2Zmc2V0O1xuXHRcdFx0XHRcdFx0ZWMgPSBuYXRpdmVSbmcuZW5kQ29udGFpbmVyO1xuXHRcdFx0XHRcdFx0ZW8gPSBuYXRpdmVSbmcuZW5kT2Zmc2V0O1xuXHRcdFx0XHRcdH0gZWxzZSB7IC8vIElFODogVGV4dFJhbmdlXG5cdFx0XHRcdFx0XHR2YXIgdGV4dFJhbmdlID0gZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCk7XG5cdFx0XHRcdFx0XHR2YXIgdGV4dFJhbmdlRW5kID0gdGV4dFJhbmdlLmR1cGxpY2F0ZSgpO1xuXHRcdFx0XHRcdFx0dGV4dFJhbmdlRW5kLmNvbGxhcHNlKGZhbHNlKTtcblx0XHRcdFx0XHRcdHZhciB0ZXh0UmFuZ2VTdGFydCA9IHRleHRSYW5nZTtcblx0XHRcdFx0XHRcdHRleHRSYW5nZVN0YXJ0LmNvbGxhcHNlKHRydWUpO1xuXG5cdFx0XHRcdFx0XHR2YXIgc3RhcnRQb2ludCA9IHRleHRSYW5nZVRvUG9pbnQodGV4dFJhbmdlU3RhcnQsIHRydWUpLFxuXHRcdFx0XHRcdFx0ZW5kUG9pbnQgPSB0ZXh0UmFuZ2VUb1BvaW50KHRleHRSYW5nZUVuZCwgZmFsc2UpO1xuXG5cdFx0XHRcdFx0XHQvLyBzYW1lIHZpc2libGUgcG9pbnQgY2FzZTogcmFuZ2Ugd2FzIGNvbGxhcHNlZC5cblx0XHRcdFx0XHRcdGlmIChkb20uaXNUZXh0KHN0YXJ0UG9pbnQubm9kZSkgJiYgZG9tLmlzTGVmdEVkZ2VQb2ludChzdGFydFBvaW50KSAmJlxuXHRcdFx0XHRcdFx0XHRkb20uaXNUZXh0Tm9kZShlbmRQb2ludC5ub2RlKSAmJiBkb20uaXNSaWdodEVkZ2VQb2ludChlbmRQb2ludCkgJiZcblx0XHRcdFx0XHRcdFx0ZW5kUG9pbnQubm9kZS5uZXh0U2libGluZyA9PT0gc3RhcnRQb2ludC5ub2RlKSB7XG5cdFx0XHRcdFx0XHRcdHN0YXJ0UG9pbnQgPSBlbmRQb2ludDtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0c2MgPSBzdGFydFBvaW50LmNvbnQ7XG5cdFx0XHRcdFx0XHRzbyA9IHN0YXJ0UG9pbnQub2Zmc2V0O1xuXHRcdFx0XHRcdFx0ZWMgPSBlbmRQb2ludC5jb250O1xuXHRcdFx0XHRcdFx0ZW8gPSBlbmRQb2ludC5vZmZzZXQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHsgLy9jb2xsYXBzZWRcblx0XHRcdFx0XHRlYyA9IHNjO1xuXHRcdFx0XHRcdGVvID0gc287XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIG5ldyBXcmFwcGVkUmFuZ2Uoc2MsIHNvLCBlYywgZW8pO1xuXHRcdFx0fSxcblxuXHRcdFx0LyoqXG5cdFx0XHQgKiBAbWV0aG9kIFxuXHRcdFx0ICogXG5cdFx0XHQgKiBjcmVhdGUgV3JhcHBlZFJhbmdlIGZyb20gbm9kZVxuXHRcdFx0ICpcblx0XHRcdCAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuXHRcdFx0ICogQHJldHVybiB7V3JhcHBlZFJhbmdlfVxuXHRcdFx0ICovXG5cdFx0XHRjcmVhdGVGcm9tTm9kZTogZnVuY3Rpb24gKG5vZGUpIHtcblx0XHRcdFx0dmFyIHNjID0gbm9kZTtcblx0XHRcdFx0dmFyIHNvID0gMDtcblx0XHRcdFx0dmFyIGVjID0gbm9kZTtcblx0XHRcdFx0dmFyIGVvID0gZG9tLm5vZGVMZW5ndGgoZWMpO1xuXG5cdFx0XHRcdC8vIGJyb3dzZXJzIGNhbid0IHRhcmdldCBhIHBpY3R1cmUgb3Igdm9pZCBub2RlXG5cdFx0XHRcdGlmIChkb20uaXNWb2lkKHNjKSkge1xuXHRcdFx0XHRcdHNvID0gZG9tLmxpc3RQcmV2KHNjKS5sZW5ndGggLSAxO1xuXHRcdFx0XHRcdHNjID0gc2MucGFyZW50Tm9kZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoZG9tLmlzQlIoZWMpKSB7XG5cdFx0XHRcdFx0ZW8gPSBkb20ubGlzdFByZXYoZWMpLmxlbmd0aCAtIDE7XG5cdFx0XHRcdFx0ZWMgPSBlYy5wYXJlbnROb2RlO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGRvbS5pc1ZvaWQoZWMpKSB7XG5cdFx0XHRcdFx0ZW8gPSBkb20ubGlzdFByZXYoZWMpLmxlbmd0aDtcblx0XHRcdFx0XHRlYyA9IGVjLnBhcmVudE5vZGU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gdGhpcy5jcmVhdGUoc2MsIHNvLCBlYywgZW8pO1xuXHRcdFx0fSxcblxuXHRcdFx0LyoqXG5cdFx0XHQgKiBAbWV0aG9kIFxuXHRcdFx0ICogXG5cdFx0XHQgKiBjcmVhdGUgV3JhcHBlZFJhbmdlIGZyb20gYm9va21hcmtcblx0XHRcdCAqXG5cdFx0XHQgKiBAcGFyYW0ge05vZGV9IGVkaXRhYmxlXG5cdFx0XHQgKiBAcGFyYW0ge09iamVjdH0gYm9va21hcmtcblx0XHRcdCAqIEByZXR1cm4ge1dyYXBwZWRSYW5nZX1cblx0XHRcdCAqL1xuXHRcdFx0Y3JlYXRlRnJvbUJvb2ttYXJrOiBmdW5jdGlvbiAoZWRpdGFibGUsIGJvb2ttYXJrKSB7XG5cdFx0XHRcdHZhciBzYyA9IGRvbS5mcm9tT2Zmc2V0UGF0aChlZGl0YWJsZSwgYm9va21hcmsucy5wYXRoKTtcblx0XHRcdFx0dmFyIHNvID0gYm9va21hcmsucy5vZmZzZXQ7XG5cdFx0XHRcdHZhciBlYyA9IGRvbS5mcm9tT2Zmc2V0UGF0aChlZGl0YWJsZSwgYm9va21hcmsuZS5wYXRoKTtcblx0XHRcdFx0dmFyIGVvID0gYm9va21hcmsuZS5vZmZzZXQ7XG5cdFx0XHRcdHJldHVybiBuZXcgV3JhcHBlZFJhbmdlKHNjLCBzbywgZWMsIGVvKTtcblx0XHRcdH0sXG5cblx0XHRcdC8qKlxuXHRcdFx0ICogQG1ldGhvZCBcblx0XHRcdCAqXG5cdFx0XHQgKiBjcmVhdGUgV3JhcHBlZFJhbmdlIGZyb20gcGFyYUJvb2ttYXJrXG5cdFx0XHQgKlxuXHRcdFx0ICogQHBhcmFtIHtPYmplY3R9IGJvb2ttYXJrXG5cdFx0XHQgKiBAcGFyYW0ge05vZGVbXX0gcGFyYXNcblx0XHRcdCAqIEByZXR1cm4ge1dyYXBwZWRSYW5nZX1cblx0XHRcdCAqL1xuXHRcdFx0Y3JlYXRlRnJvbVBhcmFCb29rbWFyazogZnVuY3Rpb24gKGJvb2ttYXJrLCBwYXJhcykge1xuXHRcdFx0XHR2YXIgc28gPSBib29rbWFyay5zLm9mZnNldDtcblx0XHRcdFx0dmFyIGVvID0gYm9va21hcmsuZS5vZmZzZXQ7XG5cdFx0XHRcdHZhciBzYyA9IGRvbS5mcm9tT2Zmc2V0UGF0aChsaXN0LmhlYWQocGFyYXMpLCBib29rbWFyay5zLnBhdGgpO1xuXHRcdFx0XHR2YXIgZWMgPSBkb20uZnJvbU9mZnNldFBhdGgobGlzdC5sYXN0KHBhcmFzKSwgYm9va21hcmsuZS5wYXRoKTtcblxuXHRcdFx0XHRyZXR1cm4gbmV3IFdyYXBwZWRSYW5nZShzYywgc28sIGVjLCBlbyk7XG5cdFx0XHR9XG5cdFx0fTtcblx0fSkoKTtcblxuXHQvKipcblx0ICogQGNsYXNzIGRlZmF1bHRzIFxuXHQgKiBcblx0ICogQHNpbmdsZXRvblxuXHQgKi9cblx0dmFyIGRlZmF1bHRzID0ge1xuXHRcdC8qKiBAcHJvcGVydHkgKi9cblx0XHR2ZXJzaW9uOiAnMC42LjMnLFxuXG5cdFx0LyoqXG5cdFx0ICogXG5cdFx0ICogZm9yIGV2ZW50IG9wdGlvbnMsIHJlZmVyZW5jZSB0byBFdmVudEhhbmRsZXIuYXR0YWNoXG5cdFx0ICogXG5cdFx0ICogQHByb3BlcnR5IHtPYmplY3R9IG9wdGlvbnMgXG5cdFx0ICogQHByb3BlcnR5IHtTdHJpbmcvTnVtYmVyfSBbb3B0aW9ucy53aWR0aD1udWxsXSBzZXQgZWRpdG9yIHdpZHRoIFxuXHRcdCAqIEBwcm9wZXJ0eSB7U3RyaW5nL051bWJlcn0gW29wdGlvbnMuaGVpZ2h0PW51bGxdIHNldCBlZGl0b3IgaGVpZ2h0LCBleCkgMzAwXG5cdFx0ICogQHByb3BlcnR5IHtTdHJpbmcvTnVtYmVyfSBvcHRpb25zLm1pbkhlaWdodCBzZXQgbWluaW11bSBoZWlnaHQgb2YgZWRpdG9yXG5cdFx0ICogQHByb3BlcnR5IHtTdHJpbmcvTnVtYmVyfSBvcHRpb25zLm1heEhlaWdodFxuXHRcdCAqIEBwcm9wZXJ0eSB7U3RyaW5nL051bWJlcn0gb3B0aW9ucy5mb2N1cyBcblx0XHQgKiBAcHJvcGVydHkge051bWJlcn0gb3B0aW9ucy50YWJzaXplIFxuXHRcdCAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gb3B0aW9ucy5zdHlsZVdpdGhTcGFuXG5cdFx0ICogQHByb3BlcnR5IHtPYmplY3R9IG9wdGlvbnMuY29kZW1pcnJvclxuXHRcdCAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBbb3B0aW9ucy5jb2RlbWlycm9yLm1vZGU9J3RleHQvaHRtbCddXG5cdFx0ICogQHByb3BlcnR5IHtPYmplY3R9IFtvcHRpb25zLmNvZGVtaXJyb3IuaHRtbE1vZGU9dHJ1ZV1cblx0XHQgKiBAcHJvcGVydHkge09iamVjdH0gW29wdGlvbnMuY29kZW1pcnJvci5saW5lTnVtYmVycz10cnVlXVxuXHRcdCAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBbb3B0aW9ucy5sYW5nPWVuLVVTXSBsYW5ndWFnZSAnZW4tVVMnLCAna28tS1InLCAuLi5cblx0XHQgKiBAcHJvcGVydHkge1N0cmluZ30gW29wdGlvbnMuZGlyZWN0aW9uPW51bGxdIHRleHQgZGlyZWN0aW9uLCBleCkgJ3J0bCdcblx0XHQgKiBAcHJvcGVydHkge0FycmF5fSBbb3B0aW9ucy50b29sYmFyXVxuXHRcdCAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gW29wdGlvbnMuYWlyTW9kZT1mYWxzZV1cblx0XHQgKiBAcHJvcGVydHkge0FycmF5fSBbb3B0aW9ucy5haXJQb3BvdmVyXVxuXHRcdCAqIEBwcm9wZXJ0eSB7RnVjbnRpb259IFtvcHRpb25zLm9uSW5pdF0gaW5pdGlhbGl6ZVxuXHRcdCAqIEBwcm9wZXJ0eSB7RnVjbnRpb259IFtvcHRpb25zLm9uc3VibWl0XVxuXHRcdCAqL1xuXHRcdG9wdGlvbnM6IHtcblx0XHRcdHdpZHRoOiBudWxsLCAgICAgICAgICAgICAgICAgIC8vIHNldCBlZGl0b3Igd2lkdGhcblx0XHRcdGhlaWdodDogbnVsbCwgICAgICAgICAgICAgICAgIC8vIHNldCBlZGl0b3IgaGVpZ2h0LCBleCkgMzAwXG5cblx0XHRcdG1pbkhlaWdodDogbnVsbCwgICAgICAgICAgICAgIC8vIHNldCBtaW5pbXVtIGhlaWdodCBvZiBlZGl0b3Jcblx0XHRcdG1heEhlaWdodDogbnVsbCwgICAgICAgICAgICAgIC8vIHNldCBtYXhpbXVtIGhlaWdodCBvZiBlZGl0b3JcblxuXHRcdFx0Zm9jdXM6IGZhbHNlLCAgICAgICAgICAgICAgICAgLy8gc2V0IGZvY3VzIHRvIGVkaXRhYmxlIGFyZWEgYWZ0ZXIgaW5pdGlhbGl6aW5nIHN1bW1lcm5vdGVcblxuXHRcdFx0dGFic2l6ZTogNCwgICAgICAgICAgICAgICAgICAgLy8gc2l6ZSBvZiB0YWIgZXgpIDIgb3IgNFxuXHRcdFx0c3R5bGVXaXRoU3BhbjogdHJ1ZSwgICAgICAgICAgLy8gc3R5bGUgd2l0aCBzcGFuIChDaHJvbWUgYW5kIEZGIG9ubHkpXG5cblx0XHRcdGRpc2FibGVMaW5rVGFyZ2V0OiBmYWxzZSwgICAgIC8vIGhpZGUgbGluayBUYXJnZXQgQ2hlY2tib3hcblx0XHRcdGRpc2FibGVEcmFnQW5kRHJvcDogZmFsc2UsICAgIC8vIGRpc2FibGUgZHJhZyBhbmQgZHJvcCBldmVudFxuXHRcdFx0ZGlzYWJsZVJlc2l6ZUVkaXRvcjogZmFsc2UsICAgLy8gZGlzYWJsZSByZXNpemluZyBlZGl0b3JcblxuXHRcdFx0c2hvcnRjdXRzOiB0cnVlLCAgICAgICAgICAgICAgLy8gZW5hYmxlIGtleWJvYXJkIHNob3J0Y3V0c1xuXG5cdFx0XHRwbGFjZWhvbGRlcjogZmFsc2UsICAgICAgICAgICAvLyBlbmFibGUgcGxhY2Vob2xkZXIgdGV4dFxuXHRcdFx0cHJldHRpZnlIdG1sOiB0cnVlLCAgICAgICAgICAgLy8gZW5hYmxlIHByZXR0aWZ5aW5nIGh0bWwgd2hpbGUgdG9nZ2xpbmcgY29kZXZpZXdcblxuXHRcdFx0aWNvblByZWZpeDogJ2ZhIGZhLScsICAgICAgICAgLy8gcHJlZml4IGZvciBjc3MgaWNvbiBjbGFzc2VzXG5cblx0XHRcdGNvZGVtaXJyb3I6IHsgICAgICAgICAgICAgICAgIC8vIGNvZGVtaXJyb3Igb3B0aW9uc1xuXHRcdFx0XHRtb2RlOiAndGV4dC9odG1sJyxcblx0XHRcdFx0aHRtbE1vZGU6IHRydWUsXG5cdFx0XHRcdGxpbmVOdW1iZXJzOiB0cnVlXG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBsYW5ndWFnZVxuXHRcdFx0bGFuZzogJ2VuLVVTJywgICAgICAgICAgICAgICAgLy8gbGFuZ3VhZ2UgJ2VuLVVTJywgJ2tvLUtSJywgLi4uXG5cdFx0XHRkaXJlY3Rpb246IG51bGwsICAgICAgICAgICAgICAvLyB0ZXh0IGRpcmVjdGlvbiwgZXgpICdydGwnXG5cblx0XHRcdC8vIHRvb2xiYXJcblx0XHRcdHRvb2xiYXI6IFtcblx0XHRcdCAgWydzdHlsZScsIFsnc3R5bGUnXV0sXG5cdFx0XHQgIFsnZm9udCcsIFsnYm9sZCcsICdpdGFsaWMnLCAndW5kZXJsaW5lJywgJ2NsZWFyJ11dLFxuXHRcdFx0ICBbJ2ZvbnRuYW1lJywgWydmb250bmFtZSddXSxcblx0XHRcdCAgWydjb2xvcicsIFsnY29sb3InXV0sXG5cdFx0XHQgIFsncGFyYScsIFsndWwnLCAnb2wnLCAncGFyYWdyYXBoJ11dLFxuXHRcdFx0ICBbJ2hlaWdodCcsIFsnaGVpZ2h0J11dLFxuXHRcdFx0ICBbJ3RhYmxlJywgWyd0YWJsZSddXSxcblx0XHRcdCAgWydpbnNlcnQnLCBbJ2xpbmsnLCAncGljdHVyZScsICdociddXSxcblx0XHRcdCAgWyd2aWV3JywgWydmdWxsc2NyZWVuJywgJ2NvZGV2aWV3J11dLFxuXHRcdFx0ICBbJ2hlbHAnLCBbJ2hlbHAnXV1cblx0XHRcdF0sXG5cblx0XHRcdC8vIGFpciBtb2RlOiBpbmxpbmUgZWRpdG9yXG5cdFx0XHRhaXJNb2RlOiBmYWxzZSxcblx0XHRcdC8vIGFpclBvcG92ZXI6IFtcblx0XHRcdC8vICAgWydzdHlsZScsIFsnc3R5bGUnXV0sXG5cdFx0XHQvLyAgIFsnZm9udCcsIFsnYm9sZCcsICdpdGFsaWMnLCAndW5kZXJsaW5lJywgJ2NsZWFyJ11dLFxuXHRcdFx0Ly8gICBbJ2ZvbnRuYW1lJywgWydmb250bmFtZSddXSxcblx0XHRcdC8vICAgWydjb2xvcicsIFsnY29sb3InXV0sXG5cdFx0XHQvLyAgIFsncGFyYScsIFsndWwnLCAnb2wnLCAncGFyYWdyYXBoJ11dLFxuXHRcdFx0Ly8gICBbJ2hlaWdodCcsIFsnaGVpZ2h0J11dLFxuXHRcdFx0Ly8gICBbJ3RhYmxlJywgWyd0YWJsZSddXSxcblx0XHRcdC8vICAgWydpbnNlcnQnLCBbJ2xpbmsnLCAncGljdHVyZSddXSxcblx0XHRcdC8vICAgWydoZWxwJywgWydoZWxwJ11dXG5cdFx0XHQvLyBdLFxuXHRcdFx0YWlyUG9wb3ZlcjogW1xuXHRcdFx0ICBbJ2NvbG9yJywgWydjb2xvciddXSxcblx0XHRcdCAgWydmb250JywgWydib2xkJywgJ3VuZGVybGluZScsICdjbGVhciddXSxcblx0XHRcdCAgWydwYXJhJywgWyd1bCcsICdwYXJhZ3JhcGgnXV0sXG5cdFx0XHQgIFsndGFibGUnLCBbJ3RhYmxlJ11dLFxuXHRcdFx0ICBbJ2luc2VydCcsIFsnbGluaycsICdwaWN0dXJlJ11dXG5cdFx0XHRdLFxuXG5cdFx0XHQvLyBzdHlsZSB0YWdcblx0XHRcdHN0eWxlVGFnczogWydwJywgJ2Jsb2NrcXVvdGUnLCAncHJlJywgJ2gxJywgJ2gyJywgJ2gzJywgJ2g0JywgJ2g1JywgJ2g2J10sXG5cblx0XHRcdC8vIGRlZmF1bHQgZm9udE5hbWVcblx0XHRcdGRlZmF1bHRGb250TmFtZTogJ0hlbHZldGljYSBOZXVlJyxcblxuXHRcdFx0Ly8gZm9udE5hbWVcblx0XHRcdGZvbnROYW1lczogW1xuXHRcdFx0ICAnQXJpYWwnLCAnQXJpYWwgQmxhY2snLCAnQ29taWMgU2FucyBNUycsICdDb3VyaWVyIE5ldycsXG5cdFx0XHQgICdIZWx2ZXRpY2EgTmV1ZScsICdIZWx2ZXRpY2EnLCAnSW1wYWN0JywgJ0x1Y2lkYSBHcmFuZGUnLFxuXHRcdFx0ICAnVGFob21hJywgJ1RpbWVzIE5ldyBSb21hbicsICdWZXJkYW5hJ1xuXHRcdFx0XSxcblx0XHRcdGZvbnROYW1lc0lnbm9yZUNoZWNrOiBbXSxcblxuXHRcdFx0Ly8gcGFsbGV0ZSBjb2xvcnMobiB4IG4pXG5cdFx0XHRjb2xvcnM6IFtcblx0XHRcdCAgWycjMDAwMDAwJywgJyM0MjQyNDInLCAnIzYzNjM2MycsICcjOUM5Qzk0JywgJyNDRUM2Q0UnLCAnI0VGRUZFRicsICcjRjdGN0Y3JywgJyNGRkZGRkYnXSxcblx0XHRcdCAgWycjRkYwMDAwJywgJyNGRjlDMDAnLCAnI0ZGRkYwMCcsICcjMDBGRjAwJywgJyMwMEZGRkYnLCAnIzAwMDBGRicsICcjOUMwMEZGJywgJyNGRjAwRkYnXSxcblx0XHRcdCAgWycjRjdDNkNFJywgJyNGRkU3Q0UnLCAnI0ZGRUZDNicsICcjRDZFRkQ2JywgJyNDRURFRTcnLCAnI0NFRTdGNycsICcjRDZENkU3JywgJyNFN0Q2REUnXSxcblx0XHRcdCAgWycjRTc5QzlDJywgJyNGRkM2OUMnLCAnI0ZGRTc5QycsICcjQjVENkE1JywgJyNBNUM2Q0UnLCAnIzlDQzZFRicsICcjQjVBNUQ2JywgJyNENkE1QkQnXSxcblx0XHRcdCAgWycjRTc2MzYzJywgJyNGN0FENkInLCAnI0ZGRDY2MycsICcjOTRCRDdCJywgJyM3M0E1QUQnLCAnIzZCQURERScsICcjOEM3QkM2JywgJyNDNjdCQTUnXSxcblx0XHRcdCAgWycjQ0UwMDAwJywgJyNFNzk0MzknLCAnI0VGQzYzMScsICcjNkJBNTRBJywgJyM0QTdCOEMnLCAnIzM5ODRDNicsICcjNjM0QUE1JywgJyNBNTRBN0InXSxcblx0XHRcdCAgWycjOUMwMDAwJywgJyNCNTYzMDgnLCAnI0JEOTQwMCcsICcjMzk3QjIxJywgJyMxMDRBNUEnLCAnIzA4NTI5NCcsICcjMzExODczJywgJyM3MzE4NDInXSxcblx0XHRcdCAgWycjNjMwMDAwJywgJyM3QjM5MDAnLCAnIzg0NjMwMCcsICcjMjk1MjE4JywgJyMwODMxMzknLCAnIzAwMzE2MycsICcjMjExMDRBJywgJyM0QTEwMzEnXVxuXHRcdFx0XSxcblxuXHRcdFx0Ly8gbGluZUhlaWdodFxuXHRcdFx0bGluZUhlaWdodHM6IFsnMS4wJywgJzEuMicsICcxLjQnLCAnMS41JywgJzEuNicsICcxLjgnLCAnMi4wJywgJzMuMCddLFxuXG5cdFx0XHQvLyBpbnNlcnRUYWJsZSBtYXggc2l6ZVxuXHRcdFx0aW5zZXJ0VGFibGVNYXhTaXplOiB7XG5cdFx0XHRcdGNvbDogMTAsXG5cdFx0XHRcdHJvdzogMTBcblx0XHRcdH0sXG5cblx0XHRcdC8vIGltYWdlXG5cdFx0XHRtYXhpbXVtSW1hZ2VGaWxlU2l6ZTogbnVsbCwgLy8gc2l6ZSBpbiBieXRlcywgbnVsbCA9IG5vIGxpbWl0XG5cblx0XHRcdC8vIGNhbGxiYWNrc1xuXHRcdFx0b25pbml0OiBudWxsLCAgICAgICAgICAgICAvLyBpbml0aWFsaXplXG5cdFx0XHRvbmZvY3VzOiBudWxsLCAgICAgICAgICAgIC8vIGVkaXRhYmxlIGhhcyBmb2N1c1xuXHRcdFx0b25ibHVyOiBudWxsLCAgICAgICAgICAgICAvLyBlZGl0YWJsZSBvdXQgb2YgZm9jdXNcblx0XHRcdG9uZW50ZXI6IG51bGwsICAgICAgICAgICAgLy8gZW50ZXIga2V5IHByZXNzZWRcblx0XHRcdG9ua2V5dXA6IG51bGwsICAgICAgICAgICAgLy8ga2V5dXBcblx0XHRcdG9ua2V5ZG93bjogbnVsbCwgICAgICAgICAgLy8ga2V5ZG93blxuXHRcdFx0b25JbWFnZVVwbG9hZDogbnVsbCwgICAgICAvLyBpbWFnZVVwbG9hZFxuXHRcdFx0b25JbWFnZVVwbG9hZEVycm9yOiBudWxsLCAvLyBpbWFnZVVwbG9hZEVycm9yXG5cdFx0XHRvbk1lZGlhRGVsZXRlOiBudWxsLCAgICAgIC8vIG1lZGlhIGRlbGV0ZVxuXHRcdFx0b25Ub29sYmFyQ2xpY2s6IG51bGwsXG5cdFx0XHRvbnN1Ym1pdDogbnVsbCxcblxuXHRcdFx0LyoqXG5cdFx0XHQgKiBtYW5pcHVsYXRlIGxpbmsgYWRkcmVzcyB3aGVuIHVzZXIgY3JlYXRlIGxpbmtcblx0XHRcdCAqIEBwYXJhbSB7U3RyaW5nfSBzTGlua1VybFxuXHRcdFx0ICogQHJldHVybiB7U3RyaW5nfVxuXHRcdFx0ICovXG5cdFx0XHRvbkNyZWF0ZUxpbms6IGZ1bmN0aW9uIChzTGlua1VybCkge1xuXHRcdFx0XHRpZiAoc0xpbmtVcmwuaW5kZXhPZignQCcpICE9PSAtMSAmJiBzTGlua1VybC5pbmRleE9mKCc6JykgPT09IC0xKSB7XG5cdFx0XHRcdFx0c0xpbmtVcmwgPSAnbWFpbHRvOicgKyBzTGlua1VybDtcblx0XHRcdFx0fSBlbHNlIGlmIChzTGlua1VybC5pbmRleE9mKCc6Ly8nKSA9PT0gLTEpIHtcblx0XHRcdFx0XHRzTGlua1VybCA9ICdodHRwOi8vJyArIHNMaW5rVXJsO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHNMaW5rVXJsO1xuXHRcdFx0fSxcblxuXHRcdFx0a2V5TWFwOiB7XG5cdFx0XHRcdHBjOiB7XG5cdFx0XHRcdFx0J0VOVEVSJzogJ2luc2VydFBhcmFncmFwaCcsXG5cdFx0XHRcdFx0J0NUUkwrWic6ICd1bmRvJyxcblx0XHRcdFx0XHQnQ1RSTCtZJzogJ3JlZG8nLFxuXHRcdFx0XHRcdCdUQUInOiAndGFiJyxcblx0XHRcdFx0XHQnU0hJRlQrVEFCJzogJ3VudGFiJyxcblx0XHRcdFx0XHQnQ1RSTCtCJzogJ2JvbGQnLFxuXHRcdFx0XHRcdCdDVFJMK0knOiAnaXRhbGljJyxcblx0XHRcdFx0XHQnQ1RSTCtVJzogJ3VuZGVybGluZScsXG5cdFx0XHRcdFx0J0NUUkwrU0hJRlQrUyc6ICdzdHJpa2V0aHJvdWdoJyxcblx0XHRcdFx0XHQnQ1RSTCtCQUNLU0xBU0gnOiAncmVtb3ZlRm9ybWF0Jyxcblx0XHRcdFx0XHQnQ1RSTCtTSElGVCtMJzogJ2p1c3RpZnlMZWZ0Jyxcblx0XHRcdFx0XHQnQ1RSTCtTSElGVCtFJzogJ2p1c3RpZnlDZW50ZXInLFxuXHRcdFx0XHRcdCdDVFJMK1NISUZUK1InOiAnanVzdGlmeVJpZ2h0Jyxcblx0XHRcdFx0XHQnQ1RSTCtTSElGVCtKJzogJ2p1c3RpZnlGdWxsJyxcblx0XHRcdFx0XHQnQ1RSTCtTSElGVCtOVU03JzogJ2luc2VydFVub3JkZXJlZExpc3QnLFxuXHRcdFx0XHRcdCdDVFJMK1NISUZUK05VTTgnOiAnaW5zZXJ0T3JkZXJlZExpc3QnLFxuXHRcdFx0XHRcdCdDVFJMK0xFRlRCUkFDS0VUJzogJ291dGRlbnQnLFxuXHRcdFx0XHRcdCdDVFJMK1JJR0hUQlJBQ0tFVCc6ICdpbmRlbnQnLFxuXHRcdFx0XHRcdCdDVFJMK05VTTAnOiAnZm9ybWF0UGFyYScsXG5cdFx0XHRcdFx0J0NUUkwrTlVNMSc6ICdmb3JtYXRIMScsXG5cdFx0XHRcdFx0J0NUUkwrTlVNMic6ICdmb3JtYXRIMicsXG5cdFx0XHRcdFx0J0NUUkwrTlVNMyc6ICdmb3JtYXRIMycsXG5cdFx0XHRcdFx0J0NUUkwrTlVNNCc6ICdmb3JtYXRINCcsXG5cdFx0XHRcdFx0J0NUUkwrTlVNNSc6ICdmb3JtYXRINScsXG5cdFx0XHRcdFx0J0NUUkwrTlVNNic6ICdmb3JtYXRINicsXG5cdFx0XHRcdFx0J0NUUkwrRU5URVInOiAnaW5zZXJ0SG9yaXpvbnRhbFJ1bGUnLFxuXHRcdFx0XHRcdCdDVFJMK0snOiAnc2hvd0xpbmtEaWFsb2cnXG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0bWFjOiB7XG5cdFx0XHRcdFx0J0VOVEVSJzogJ2luc2VydFBhcmFncmFwaCcsXG5cdFx0XHRcdFx0J0NNRCtaJzogJ3VuZG8nLFxuXHRcdFx0XHRcdCdDTUQrU0hJRlQrWic6ICdyZWRvJyxcblx0XHRcdFx0XHQnVEFCJzogJ3RhYicsXG5cdFx0XHRcdFx0J1NISUZUK1RBQic6ICd1bnRhYicsXG5cdFx0XHRcdFx0J0NNRCtCJzogJ2JvbGQnLFxuXHRcdFx0XHRcdCdDTUQrSSc6ICdpdGFsaWMnLFxuXHRcdFx0XHRcdCdDTUQrVSc6ICd1bmRlcmxpbmUnLFxuXHRcdFx0XHRcdCdDTUQrU0hJRlQrUyc6ICdzdHJpa2V0aHJvdWdoJyxcblx0XHRcdFx0XHQnQ01EK0JBQ0tTTEFTSCc6ICdyZW1vdmVGb3JtYXQnLFxuXHRcdFx0XHRcdCdDTUQrU0hJRlQrTCc6ICdqdXN0aWZ5TGVmdCcsXG5cdFx0XHRcdFx0J0NNRCtTSElGVCtFJzogJ2p1c3RpZnlDZW50ZXInLFxuXHRcdFx0XHRcdCdDTUQrU0hJRlQrUic6ICdqdXN0aWZ5UmlnaHQnLFxuXHRcdFx0XHRcdCdDTUQrU0hJRlQrSic6ICdqdXN0aWZ5RnVsbCcsXG5cdFx0XHRcdFx0J0NNRCtTSElGVCtOVU03JzogJ2luc2VydFVub3JkZXJlZExpc3QnLFxuXHRcdFx0XHRcdCdDTUQrU0hJRlQrTlVNOCc6ICdpbnNlcnRPcmRlcmVkTGlzdCcsXG5cdFx0XHRcdFx0J0NNRCtMRUZUQlJBQ0tFVCc6ICdvdXRkZW50Jyxcblx0XHRcdFx0XHQnQ01EK1JJR0hUQlJBQ0tFVCc6ICdpbmRlbnQnLFxuXHRcdFx0XHRcdCdDTUQrTlVNMCc6ICdmb3JtYXRQYXJhJyxcblx0XHRcdFx0XHQnQ01EK05VTTEnOiAnZm9ybWF0SDEnLFxuXHRcdFx0XHRcdCdDTUQrTlVNMic6ICdmb3JtYXRIMicsXG5cdFx0XHRcdFx0J0NNRCtOVU0zJzogJ2Zvcm1hdEgzJyxcblx0XHRcdFx0XHQnQ01EK05VTTQnOiAnZm9ybWF0SDQnLFxuXHRcdFx0XHRcdCdDTUQrTlVNNSc6ICdmb3JtYXRINScsXG5cdFx0XHRcdFx0J0NNRCtOVU02JzogJ2Zvcm1hdEg2Jyxcblx0XHRcdFx0XHQnQ01EK0VOVEVSJzogJ2luc2VydEhvcml6b250YWxSdWxlJyxcblx0XHRcdFx0XHQnQ01EK0snOiAnc2hvd0xpbmtEaWFsb2cnXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0Ly8gZGVmYXVsdCBsYW5ndWFnZTogZW4tVVNcblx0XHRsYW5nOiB7XG5cdFx0XHQnZW4tVVMnOiB7XG5cdFx0XHRcdGZvbnQ6IHtcblx0XHRcdFx0XHRib2xkOiAnQm9sZCcsXG5cdFx0XHRcdFx0aXRhbGljOiAnSXRhbGljJyxcblx0XHRcdFx0XHR1bmRlcmxpbmU6ICdVbmRlcmxpbmUnLFxuXHRcdFx0XHRcdGNsZWFyOiAnUmVtb3ZlIEZvbnQgU3R5bGUnLFxuXHRcdFx0XHRcdGhlaWdodDogJ0xpbmUgSGVpZ2h0Jyxcblx0XHRcdFx0XHRuYW1lOiAnRm9udCBGYW1pbHknXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGltYWdlOiB7XG5cdFx0XHRcdFx0aW1hZ2U6ICdQaWN0dXJlJyxcblx0XHRcdFx0XHRpbnNlcnQ6ICdJbnNlcnQgSW1hZ2UnLFxuXHRcdFx0XHRcdHJlc2l6ZUZ1bGw6ICdSZXNpemUgRnVsbCcsXG5cdFx0XHRcdFx0cmVzaXplSGFsZjogJ1Jlc2l6ZSBIYWxmJyxcblx0XHRcdFx0XHRyZXNpemVRdWFydGVyOiAnUmVzaXplIFF1YXJ0ZXInLFxuXHRcdFx0XHRcdGZsb2F0TGVmdDogJ0Zsb2F0IExlZnQnLFxuXHRcdFx0XHRcdGZsb2F0UmlnaHQ6ICdGbG9hdCBSaWdodCcsXG5cdFx0XHRcdFx0ZmxvYXROb25lOiAnRmxvYXQgTm9uZScsXG5cdFx0XHRcdFx0c2hhcGVSb3VuZGVkOiAnU2hhcGU6IFJvdW5kZWQnLFxuXHRcdFx0XHRcdHNoYXBlQ2lyY2xlOiAnU2hhcGU6IENpcmNsZScsXG5cdFx0XHRcdFx0c2hhcGVUaHVtYm5haWw6ICdTaGFwZTogVGh1bWJuYWlsJyxcblx0XHRcdFx0XHRzaGFwZU5vbmU6ICdTaGFwZTogTm9uZScsXG5cdFx0XHRcdFx0ZHJhZ0ltYWdlSGVyZTogJ0RyYWcgaW1hZ2Ugb3IgdGV4dCBoZXJlJyxcblx0XHRcdFx0XHRkcm9wSW1hZ2U6ICdEcm9wIGltYWdlIG9yIFRleHQnLFxuXHRcdFx0XHRcdHNlbGVjdEZyb21GaWxlczogJ1NlbGVjdCBmcm9tIGZpbGVzJyxcblx0XHRcdFx0XHRtYXhpbXVtRmlsZVNpemU6ICdNYXhpbXVtIGZpbGUgc2l6ZScsXG5cdFx0XHRcdFx0bWF4aW11bUZpbGVTaXplRXJyb3I6ICdNYXhpbXVtIGZpbGUgc2l6ZSBleGNlZWRlZC4nLFxuXHRcdFx0XHRcdHVybDogJ0ltYWdlIFVSTCcsXG5cdFx0XHRcdFx0cmVtb3ZlOiAnUmVtb3ZlIEltYWdlJ1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRsaW5rOiB7XG5cdFx0XHRcdFx0bGluazogJ0xpbmsnLFxuXHRcdFx0XHRcdGluc2VydDogJ0luc2VydCBMaW5rJyxcblx0XHRcdFx0XHR1bmxpbms6ICdVbmxpbmsnLFxuXHRcdFx0XHRcdGVkaXQ6ICdFZGl0Jyxcblx0XHRcdFx0XHR0ZXh0VG9EaXNwbGF5OiAnVGV4dCB0byBkaXNwbGF5Jyxcblx0XHRcdFx0XHR1cmw6ICdUbyB3aGF0IFVSTCBzaG91bGQgdGhpcyBsaW5rIGdvPycsXG5cdFx0XHRcdFx0b3BlbkluTmV3V2luZG93OiAnT3BlbiBpbiBuZXcgd2luZG93J1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0YWJsZToge1xuXHRcdFx0XHRcdHRhYmxlOiAnVGFibGUnXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGhyOiB7XG5cdFx0XHRcdFx0aW5zZXJ0OiAnSW5zZXJ0IEhvcml6b250YWwgUnVsZSdcblx0XHRcdFx0fSxcblx0XHRcdFx0c3R5bGU6IHtcblx0XHRcdFx0XHRzdHlsZTogJ1N0eWxlJyxcblx0XHRcdFx0XHRub3JtYWw6ICdOb3JtYWwnLFxuXHRcdFx0XHRcdGJsb2NrcXVvdGU6ICdRdW90ZScsXG5cdFx0XHRcdFx0cHJlOiAnQ29kZScsXG5cdFx0XHRcdFx0aDE6ICdIZWFkZXIgMScsXG5cdFx0XHRcdFx0aDI6ICdIZWFkZXIgMicsXG5cdFx0XHRcdFx0aDM6ICdIZWFkZXIgMycsXG5cdFx0XHRcdFx0aDQ6ICdIZWFkZXIgNCcsXG5cdFx0XHRcdFx0aDU6ICdIZWFkZXIgNScsXG5cdFx0XHRcdFx0aDY6ICdIZWFkZXIgNidcblx0XHRcdFx0fSxcblx0XHRcdFx0bGlzdHM6IHtcblx0XHRcdFx0XHR1bm9yZGVyZWQ6ICdVbm9yZGVyZWQgbGlzdCcsXG5cdFx0XHRcdFx0b3JkZXJlZDogJ09yZGVyZWQgbGlzdCdcblx0XHRcdFx0fSxcblx0XHRcdFx0b3B0aW9uczoge1xuXHRcdFx0XHRcdGhlbHA6ICdIZWxwJyxcblx0XHRcdFx0XHRmdWxsc2NyZWVuOiAnRnVsbCBTY3JlZW4nLFxuXHRcdFx0XHRcdGNvZGV2aWV3OiAnQ29kZSBWaWV3J1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRwYXJhZ3JhcGg6IHtcblx0XHRcdFx0XHRwYXJhZ3JhcGg6ICdQYXJhZ3JhcGgnLFxuXHRcdFx0XHRcdG91dGRlbnQ6ICdPdXRkZW50Jyxcblx0XHRcdFx0XHRpbmRlbnQ6ICdJbmRlbnQnLFxuXHRcdFx0XHRcdGxlZnQ6ICdBbGlnbiBsZWZ0Jyxcblx0XHRcdFx0XHRjZW50ZXI6ICdBbGlnbiBjZW50ZXInLFxuXHRcdFx0XHRcdHJpZ2h0OiAnQWxpZ24gcmlnaHQnLFxuXHRcdFx0XHRcdGp1c3RpZnk6ICdKdXN0aWZ5IGZ1bGwnXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGNvbG9yOiB7XG5cdFx0XHRcdFx0cmVjZW50OiAnUmVjZW50IENvbG9yJyxcblx0XHRcdFx0XHRtb3JlOiAnTW9yZSBDb2xvcicsXG5cdFx0XHRcdFx0YmFja2dyb3VuZDogJ0JhY2tncm91bmQgQ29sb3InLFxuXHRcdFx0XHRcdGZvcmVncm91bmQ6ICdGb3JlZ3JvdW5kIENvbG9yJyxcblx0XHRcdFx0XHR0cmFuc3BhcmVudDogJ1RyYW5zcGFyZW50Jyxcblx0XHRcdFx0XHRzZXRUcmFuc3BhcmVudDogJ1NldCB0cmFuc3BhcmVudCcsXG5cdFx0XHRcdFx0cmVzZXQ6ICdSZXNldCcsXG5cdFx0XHRcdFx0cmVzZXRUb0RlZmF1bHQ6ICdSZXNldCB0byBkZWZhdWx0J1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRzaG9ydGN1dDoge1xuXHRcdFx0XHRcdHNob3J0Y3V0czogJ0tleWJvYXJkIHNob3J0Y3V0cycsXG5cdFx0XHRcdFx0Y2xvc2U6ICdDbG9zZScsXG5cdFx0XHRcdFx0dGV4dEZvcm1hdHRpbmc6ICdUZXh0IGZvcm1hdHRpbmcnLFxuXHRcdFx0XHRcdGFjdGlvbjogJ0FjdGlvbicsXG5cdFx0XHRcdFx0cGFyYWdyYXBoRm9ybWF0dGluZzogJ1BhcmFncmFwaCBmb3JtYXR0aW5nJyxcblx0XHRcdFx0XHRkb2N1bWVudFN0eWxlOiAnRG9jdW1lbnQgU3R5bGUnLFxuXHRcdFx0XHRcdGV4dHJhS2V5czogJ0V4dHJhIGtleXMnXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGhpc3Rvcnk6IHtcblx0XHRcdFx0XHR1bmRvOiAnVW5kbycsXG5cdFx0XHRcdFx0cmVkbzogJ1JlZG8nXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH07XG5cblx0LyoqXG5cdCAqIEBjbGFzcyBjb3JlLmFzeW5jXG5cdCAqXG5cdCAqIEFzeW5jIGZ1bmN0aW9ucyB3aGljaCByZXR1cm5zIGBQcm9taXNlYFxuXHQgKlxuXHQgKiBAc2luZ2xldG9uXG5cdCAqIEBhbHRlcm5hdGVDbGFzc05hbWUgYXN5bmNcblx0ICovXG5cdHZhciBhc3luYyA9IChmdW5jdGlvbiAoKSB7XG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCByZWFkRmlsZUFzRGF0YVVSTFxuXHRcdCAqXG5cdFx0ICogcmVhZCBjb250ZW50cyBvZiBmaWxlIGFzIHJlcHJlc2VudGluZyBVUkxcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7RmlsZX0gZmlsZVxuXHRcdCAqIEByZXR1cm4ge1Byb21pc2V9IC0gdGhlbjogc0RhdGFVcmxcblx0XHQgKi9cblx0XHR2YXIgcmVhZEZpbGVBc0RhdGFVUkwgPSBmdW5jdGlvbiAoZmlsZSkge1xuXHRcdFx0cmV0dXJuICQuRGVmZXJyZWQoZnVuY3Rpb24gKGRlZmVycmVkKSB7XG5cdFx0XHRcdCQuZXh0ZW5kKG5ldyBGaWxlUmVhZGVyKCksIHtcblx0XHRcdFx0XHRvbmxvYWQ6IGZ1bmN0aW9uIChlKSB7XG5cdFx0XHRcdFx0XHR2YXIgc0RhdGFVUkwgPSBlLnRhcmdldC5yZXN1bHQ7XG5cdFx0XHRcdFx0XHRkZWZlcnJlZC5yZXNvbHZlKHNEYXRhVVJMKTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdG9uZXJyb3I6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdGRlZmVycmVkLnJlamVjdCh0aGlzKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pLnJlYWRBc0RhdGFVUkwoZmlsZSk7XG5cdFx0XHR9KS5wcm9taXNlKCk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2QgY3JlYXRlSW1hZ2Vcblx0XHQgKlxuXHRcdCAqIGNyZWF0ZSBgPGltYWdlPmAgZnJvbSB1cmwgc3RyaW5nXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gc1VybFxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSBmaWxlbmFtZVxuXHRcdCAqIEByZXR1cm4ge1Byb21pc2V9IC0gdGhlbjogJGltYWdlXG5cdFx0ICovXG5cdFx0dmFyIGNyZWF0ZUltYWdlID0gZnVuY3Rpb24gKHNVcmwsIGZpbGVuYW1lKSB7XG5cdFx0XHRyZXR1cm4gJC5EZWZlcnJlZChmdW5jdGlvbiAoZGVmZXJyZWQpIHtcblx0XHRcdFx0dmFyICRpbWcgPSAkKCc8aW1nPicpO1xuXG5cdFx0XHRcdCRpbWcub25lKCdsb2FkJywgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdCRpbWcub2ZmKCdlcnJvciBhYm9ydCcpO1xuXHRcdFx0XHRcdGRlZmVycmVkLnJlc29sdmUoJGltZyk7XG5cdFx0XHRcdH0pLm9uZSgnZXJyb3IgYWJvcnQnLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0JGltZy5vZmYoJ2xvYWQnKS5kZXRhY2goKTtcblx0XHRcdFx0XHRkZWZlcnJlZC5yZWplY3QoJGltZyk7XG5cdFx0XHRcdH0pLmNzcyh7XG5cdFx0XHRcdFx0ZGlzcGxheTogJ25vbmUnXG5cdFx0XHRcdH0pLmFwcGVuZFRvKGRvY3VtZW50LmJvZHkpLmF0dHIoe1xuXHRcdFx0XHRcdCdzcmMnOiBzVXJsLFxuXHRcdFx0XHRcdCdkYXRhLWZpbGVuYW1lJzogZmlsZW5hbWVcblx0XHRcdFx0fSk7XG5cdFx0XHR9KS5wcm9taXNlKCk7XG5cdFx0fTtcblxuXHRcdHJldHVybiB7XG5cdFx0XHRyZWFkRmlsZUFzRGF0YVVSTDogcmVhZEZpbGVBc0RhdGFVUkwsXG5cdFx0XHRjcmVhdGVJbWFnZTogY3JlYXRlSW1hZ2Vcblx0XHR9O1xuXHR9KSgpO1xuXG5cdC8qKlxuXHQgKiBAY2xhc3MgY29yZS5rZXlcblx0ICpcblx0ICogT2JqZWN0IGZvciBrZXljb2Rlcy5cblx0ICpcblx0ICogQHNpbmdsZXRvblxuXHQgKiBAYWx0ZXJuYXRlQ2xhc3NOYW1lIGtleVxuXHQgKi9cblx0dmFyIGtleSA9IHtcblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIGlzRWRpdFxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtOdW1iZXJ9IGtleUNvZGVcblx0XHQgKiBAcmV0dXJuIHtCb29sZWFufVxuXHRcdCAqL1xuXHRcdGlzRWRpdDogZnVuY3Rpb24gKGtleUNvZGUpIHtcblx0XHRcdHJldHVybiBsaXN0LmNvbnRhaW5zKFs4LCA5LCAxMywgMzJdLCBrZXlDb2RlKTtcblx0XHR9LFxuXHRcdC8qKlxuXHRcdCAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBuYW1lRnJvbUNvZGVcblx0XHQgKiBAcHJvcGVydHkge1N0cmluZ30gbmFtZUZyb21Db2RlLjggXCJCQUNLU1BBQ0VcIlxuXHRcdCAqL1xuXHRcdG5hbWVGcm9tQ29kZToge1xuXHRcdFx0JzgnOiAnQkFDS1NQQUNFJyxcblx0XHRcdCc5JzogJ1RBQicsXG5cdFx0XHQnMTMnOiAnRU5URVInLFxuXHRcdFx0JzMyJzogJ1NQQUNFJyxcblxuXHRcdFx0Ly8gTnVtYmVyOiAwLTlcblx0XHRcdCc0OCc6ICdOVU0wJyxcblx0XHRcdCc0OSc6ICdOVU0xJyxcblx0XHRcdCc1MCc6ICdOVU0yJyxcblx0XHRcdCc1MSc6ICdOVU0zJyxcblx0XHRcdCc1Mic6ICdOVU00Jyxcblx0XHRcdCc1Myc6ICdOVU01Jyxcblx0XHRcdCc1NCc6ICdOVU02Jyxcblx0XHRcdCc1NSc6ICdOVU03Jyxcblx0XHRcdCc1Nic6ICdOVU04JyxcblxuXHRcdFx0Ly8gQWxwaGFiZXQ6IGEtelxuXHRcdFx0JzY2JzogJ0InLFxuXHRcdFx0JzY5JzogJ0UnLFxuXHRcdFx0JzczJzogJ0knLFxuXHRcdFx0Jzc0JzogJ0onLFxuXHRcdFx0Jzc1JzogJ0snLFxuXHRcdFx0Jzc2JzogJ0wnLFxuXHRcdFx0JzgyJzogJ1InLFxuXHRcdFx0JzgzJzogJ1MnLFxuXHRcdFx0Jzg1JzogJ1UnLFxuXHRcdFx0Jzg5JzogJ1knLFxuXHRcdFx0JzkwJzogJ1onLFxuXG5cdFx0XHQnMTkxJzogJ1NMQVNIJyxcblx0XHRcdCcyMTknOiAnTEVGVEJSQUNLRVQnLFxuXHRcdFx0JzIyMCc6ICdCQUNLU0xBU0gnLFxuXHRcdFx0JzIyMSc6ICdSSUdIVEJSQUNLRVQnXG5cdFx0fVxuXHR9O1xuXG5cdC8qKlxuXHQgKiBAY2xhc3MgZWRpdGluZy5IaXN0b3J5XG5cdCAqXG5cdCAqIEVkaXRvciBIaXN0b3J5XG5cdCAqXG5cdCAqL1xuXHR2YXIgSGlzdG9yeSA9IGZ1bmN0aW9uICgkZWRpdGFibGUpIHtcblx0XHR2YXIgc3RhY2sgPSBbXSwgc3RhY2tPZmZzZXQgPSAtMTtcblx0XHR2YXIgZWRpdGFibGUgPSAkZWRpdGFibGVbMF07XG5cblx0XHR2YXIgbWFrZVNuYXBzaG90ID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0dmFyIHJuZyA9IHJhbmdlLmNyZWF0ZSgpO1xuXHRcdFx0dmFyIGVtcHR5Qm9va21hcmsgPSB7IHM6IHsgcGF0aDogW10sIG9mZnNldDogMCB9LCBlOiB7IHBhdGg6IFtdLCBvZmZzZXQ6IDAgfSB9O1xuXG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRjb250ZW50czogJGVkaXRhYmxlLmh0bWwoKSxcblx0XHRcdFx0Ym9va21hcms6IChybmcgPyBybmcuYm9va21hcmsoZWRpdGFibGUpIDogZW1wdHlCb29rbWFyaylcblx0XHRcdH07XG5cdFx0fTtcblxuXHRcdHZhciBhcHBseVNuYXBzaG90ID0gZnVuY3Rpb24gKHNuYXBzaG90KSB7XG5cdFx0XHRpZiAoc25hcHNob3QuY29udGVudHMgIT09IG51bGwpIHtcblx0XHRcdFx0JGVkaXRhYmxlLmh0bWwoc25hcHNob3QuY29udGVudHMpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHNuYXBzaG90LmJvb2ttYXJrICE9PSBudWxsKSB7XG5cdFx0XHRcdHJhbmdlLmNyZWF0ZUZyb21Cb29rbWFyayhlZGl0YWJsZSwgc25hcHNob3QuYm9va21hcmspLnNlbGVjdCgpO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiB1bmRvXG5cdFx0ICovXG5cdFx0dGhpcy51bmRvID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0aWYgKDAgPCBzdGFja09mZnNldCkge1xuXHRcdFx0XHRzdGFja09mZnNldC0tO1xuXHRcdFx0XHRhcHBseVNuYXBzaG90KHN0YWNrW3N0YWNrT2Zmc2V0XSk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIHJlZG9cblx0XHQgKi9cblx0XHR0aGlzLnJlZG8gPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRpZiAoc3RhY2subGVuZ3RoIC0gMSA+IHN0YWNrT2Zmc2V0KSB7XG5cdFx0XHRcdHN0YWNrT2Zmc2V0Kys7XG5cdFx0XHRcdGFwcGx5U25hcHNob3Qoc3RhY2tbc3RhY2tPZmZzZXRdKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogcmVjb3JkZWQgdW5kb1xuXHRcdCAqL1xuXHRcdHRoaXMucmVjb3JkVW5kbyA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdHN0YWNrT2Zmc2V0Kys7XG5cblx0XHRcdC8vIFdhc2ggb3V0IHN0YWNrIGFmdGVyIHN0YWNrT2Zmc2V0XG5cdFx0XHRpZiAoc3RhY2subGVuZ3RoID4gc3RhY2tPZmZzZXQpIHtcblx0XHRcdFx0c3RhY2sgPSBzdGFjay5zbGljZSgwLCBzdGFja09mZnNldCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIENyZWF0ZSBuZXcgc25hcHNob3QgYW5kIHB1c2ggaXQgdG8gdGhlIGVuZFxuXHRcdFx0c3RhY2sucHVzaChtYWtlU25hcHNob3QoKSk7XG5cdFx0fTtcblxuXHRcdC8vIENyZWF0ZSBmaXJzdCB1bmRvIHN0YWNrXG5cdFx0dGhpcy5yZWNvcmRVbmRvKCk7XG5cdH07XG5cblx0LyoqXG5cdCAqIEBjbGFzcyBlZGl0aW5nLlN0eWxlXG5cdCAqXG5cdCAqIFN0eWxlXG5cdCAqXG5cdCAqL1xuXHR2YXIgU3R5bGUgPSBmdW5jdGlvbiAoKSB7XG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCBqUXVlcnlDU1Ncblx0XHQgKlxuXHRcdCAqIHBhc3NpbmcgYW4gYXJyYXkgb2Ygc3R5bGUgcHJvcGVydGllcyB0byAuY3NzKClcblx0XHQgKiB3aWxsIHJlc3VsdCBpbiBhbiBvYmplY3Qgb2YgcHJvcGVydHktdmFsdWUgcGFpcnMuXG5cdFx0ICogKGNvbXBhYmlsaXR5IHdpdGggdmVyc2lvbiA8IDEuOSlcblx0XHQgKlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICogQHBhcmFtICB7alF1ZXJ5fSAkb2JqXG5cdFx0ICogQHBhcmFtICB7QXJyYXl9IHByb3BlcnR5TmFtZXMgLSBBbiBhcnJheSBvZiBvbmUgb3IgbW9yZSBDU1MgcHJvcGVydGllcy5cblx0XHQgKiBAcmV0dXJuIHtPYmplY3R9XG5cdFx0ICovXG5cdFx0dmFyIGpRdWVyeUNTUyA9IGZ1bmN0aW9uICgkb2JqLCBwcm9wZXJ0eU5hbWVzKSB7XG5cdFx0XHRpZiAoYWdlbnQuanF1ZXJ5VmVyc2lvbiA8IDEuOSkge1xuXHRcdFx0XHR2YXIgcmVzdWx0ID0ge307XG5cdFx0XHRcdCQuZWFjaChwcm9wZXJ0eU5hbWVzLCBmdW5jdGlvbiAoaWR4LCBwcm9wZXJ0eU5hbWUpIHtcblx0XHRcdFx0XHRyZXN1bHRbcHJvcGVydHlOYW1lXSA9ICRvYmouY3NzKHByb3BlcnR5TmFtZSk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuICRvYmouY3NzLmNhbGwoJG9iaiwgcHJvcGVydHlOYW1lcyk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIHBhcmFncmFwaCBsZXZlbCBzdHlsZVxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtXcmFwcGVkUmFuZ2V9IHJuZ1xuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBzdHlsZUluZm9cblx0XHQgKi9cblx0XHR0aGlzLnN0eWxlUGFyYSA9IGZ1bmN0aW9uIChybmcsIHN0eWxlSW5mbykge1xuXHRcdFx0JC5lYWNoKHJuZy5ub2Rlcyhkb20uaXNQYXJhLCB7XG5cdFx0XHRcdGluY2x1ZGVBbmNlc3RvcjogdHJ1ZVxuXHRcdFx0fSksIGZ1bmN0aW9uIChpZHgsIHBhcmEpIHtcblx0XHRcdFx0JChwYXJhKS5jc3Moc3R5bGVJbmZvKTtcblx0XHRcdH0pO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBpbnNlcnQgYW5kIHJldHVybnMgc3R5bGVOb2RlcyBvbiByYW5nZS5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7V3JhcHBlZFJhbmdlfSBybmdcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gb3B0aW9ucyBmb3Igc3R5bGVOb2Rlc1xuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5ub2RlTmFtZV0gLSBkZWZhdWx0OiBgU1BBTmBcblx0XHQgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmV4cGFuZENsb3Nlc3RTaWJsaW5nXSAtIGRlZmF1bHQ6IGBmYWxzZWBcblx0XHQgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLm9ubHlQYXJ0aWFsQ29udGFpbnNdIC0gZGVmYXVsdDogYGZhbHNlYFxuXHRcdCAqIEByZXR1cm4ge05vZGVbXX1cblx0XHQgKi9cblx0XHR0aGlzLnN0eWxlTm9kZXMgPSBmdW5jdGlvbiAocm5nLCBvcHRpb25zKSB7XG5cdFx0XHRybmcgPSBybmcuc3BsaXRUZXh0KCk7XG5cblx0XHRcdHZhciBub2RlTmFtZSA9IG9wdGlvbnMgJiYgb3B0aW9ucy5ub2RlTmFtZSB8fCAnU1BBTic7XG5cdFx0XHR2YXIgZXhwYW5kQ2xvc2VzdFNpYmxpbmcgPSAhIShvcHRpb25zICYmIG9wdGlvbnMuZXhwYW5kQ2xvc2VzdFNpYmxpbmcpO1xuXHRcdFx0dmFyIG9ubHlQYXJ0aWFsQ29udGFpbnMgPSAhIShvcHRpb25zICYmIG9wdGlvbnMub25seVBhcnRpYWxDb250YWlucyk7XG5cblx0XHRcdGlmIChybmcuaXNDb2xsYXBzZWQoKSkge1xuXHRcdFx0XHRyZXR1cm4gcm5nLmluc2VydE5vZGUoZG9tLmNyZWF0ZShub2RlTmFtZSkpO1xuXHRcdFx0fVxuXG5cdFx0XHR2YXIgcHJlZCA9IGRvbS5tYWtlUHJlZEJ5Tm9kZU5hbWUobm9kZU5hbWUpO1xuXHRcdFx0dmFyIG5vZGVzID0gJC5tYXAocm5nLm5vZGVzKGRvbS5pc1RleHQsIHtcblx0XHRcdFx0ZnVsbHlDb250YWluczogdHJ1ZVxuXHRcdFx0fSksIGZ1bmN0aW9uICh0ZXh0KSB7XG5cdFx0XHRcdHJldHVybiBkb20uc2luZ2xlQ2hpbGRBbmNlc3Rvcih0ZXh0LCBwcmVkKSB8fCBkb20ud3JhcCh0ZXh0LCBub2RlTmFtZSk7XG5cdFx0XHR9KTtcblxuXHRcdFx0aWYgKGV4cGFuZENsb3Nlc3RTaWJsaW5nKSB7XG5cdFx0XHRcdGlmIChvbmx5UGFydGlhbENvbnRhaW5zKSB7XG5cdFx0XHRcdFx0dmFyIG5vZGVzSW5SYW5nZSA9IHJuZy5ub2RlcygpO1xuXHRcdFx0XHRcdC8vIGNvbXBvc2Ugd2l0aCBwYXJ0aWFsIGNvbnRhaW5zIHByZWRpY2F0aW9uXG5cdFx0XHRcdFx0cHJlZCA9IGZ1bmMuYW5kKHByZWQsIGZ1bmN0aW9uIChub2RlKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gbGlzdC5jb250YWlucyhub2Rlc0luUmFuZ2UsIG5vZGUpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuICQubWFwKG5vZGVzLCBmdW5jdGlvbiAobm9kZSkge1xuXHRcdFx0XHRcdHZhciBzaWJsaW5ncyA9IGRvbS53aXRoQ2xvc2VzdFNpYmxpbmdzKG5vZGUsIHByZWQpO1xuXHRcdFx0XHRcdHZhciBoZWFkID0gbGlzdC5oZWFkKHNpYmxpbmdzKTtcblx0XHRcdFx0XHR2YXIgdGFpbHMgPSBsaXN0LnRhaWwoc2libGluZ3MpO1xuXHRcdFx0XHRcdCQuZWFjaCh0YWlscywgZnVuY3Rpb24gKGlkeCwgZWxlbSkge1xuXHRcdFx0XHRcdFx0ZG9tLmFwcGVuZENoaWxkTm9kZXMoaGVhZCwgZWxlbS5jaGlsZE5vZGVzKTtcblx0XHRcdFx0XHRcdGRvbS5yZW1vdmUoZWxlbSk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0cmV0dXJuIGxpc3QuaGVhZChzaWJsaW5ncyk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuIG5vZGVzO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBnZXQgY3VycmVudCBzdHlsZSBvbiBjdXJzb3Jcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7V3JhcHBlZFJhbmdlfSBybmdcblx0XHQgKiBAcGFyYW0ge05vZGV9IHRhcmdldCAtIHRhcmdldCBlbGVtZW50IG9uIGV2ZW50XG5cdFx0ICogQHJldHVybiB7T2JqZWN0fSAtIG9iamVjdCBjb250YWlucyBzdHlsZSBwcm9wZXJ0aWVzLlxuXHRcdCAqL1xuXHRcdHRoaXMuY3VycmVudCA9IGZ1bmN0aW9uIChybmcsIHRhcmdldCkge1xuXHRcdFx0dmFyICRjb250ID0gJChkb20uaXNUZXh0KHJuZy5zYykgPyBybmcuc2MucGFyZW50Tm9kZSA6IHJuZy5zYyk7XG5cdFx0XHR2YXIgcHJvcGVydGllcyA9IFsnZm9udC1mYW1pbHknLCAnZm9udC1zaXplJywgJ3RleHQtYWxpZ24nLCAnbGlzdC1zdHlsZS10eXBlJywgJ2xpbmUtaGVpZ2h0J107XG5cdFx0XHR2YXIgc3R5bGVJbmZvID0galF1ZXJ5Q1NTKCRjb250LCBwcm9wZXJ0aWVzKSB8fCB7fTtcblxuXHRcdFx0c3R5bGVJbmZvWydmb250LXNpemUnXSA9IHBhcnNlSW50KHN0eWxlSW5mb1snZm9udC1zaXplJ10sIDEwKTtcblxuXHRcdFx0Ly8gZG9jdW1lbnQucXVlcnlDb21tYW5kU3RhdGUgZm9yIHRvZ2dsZSBzdGF0ZVxuXHRcdFx0c3R5bGVJbmZvWydmb250LWJvbGQnXSA9IGRvY3VtZW50LnF1ZXJ5Q29tbWFuZFN0YXRlKCdib2xkJykgPyAnYm9sZCcgOiAnbm9ybWFsJztcblx0XHRcdHN0eWxlSW5mb1snZm9udC1pdGFsaWMnXSA9IGRvY3VtZW50LnF1ZXJ5Q29tbWFuZFN0YXRlKCdpdGFsaWMnKSA/ICdpdGFsaWMnIDogJ25vcm1hbCc7XG5cdFx0XHRzdHlsZUluZm9bJ2ZvbnQtdW5kZXJsaW5lJ10gPSBkb2N1bWVudC5xdWVyeUNvbW1hbmRTdGF0ZSgndW5kZXJsaW5lJykgPyAndW5kZXJsaW5lJyA6ICdub3JtYWwnO1xuXHRcdFx0c3R5bGVJbmZvWydmb250LXN0cmlrZXRocm91Z2gnXSA9IGRvY3VtZW50LnF1ZXJ5Q29tbWFuZFN0YXRlKCdzdHJpa2VUaHJvdWdoJykgPyAnc3RyaWtldGhyb3VnaCcgOiAnbm9ybWFsJztcblx0XHRcdHN0eWxlSW5mb1snZm9udC1zdXBlcnNjcmlwdCddID0gZG9jdW1lbnQucXVlcnlDb21tYW5kU3RhdGUoJ3N1cGVyc2NyaXB0JykgPyAnc3VwZXJzY3JpcHQnIDogJ25vcm1hbCc7XG5cdFx0XHRzdHlsZUluZm9bJ2ZvbnQtc3Vic2NyaXB0J10gPSBkb2N1bWVudC5xdWVyeUNvbW1hbmRTdGF0ZSgnc3Vic2NyaXB0JykgPyAnc3Vic2NyaXB0JyA6ICdub3JtYWwnO1xuXG5cdFx0XHQvLyBsaXN0LXN0eWxlLXR5cGUgdG8gbGlzdC1zdHlsZSh1bm9yZGVyZWQsIG9yZGVyZWQpXG5cdFx0XHRpZiAoIXJuZy5pc09uTGlzdCgpKSB7XG5cdFx0XHRcdHN0eWxlSW5mb1snbGlzdC1zdHlsZSddID0gJ25vbmUnO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dmFyIGFPcmRlcmVkVHlwZSA9IFsnY2lyY2xlJywgJ2Rpc2MnLCAnZGlzYy1sZWFkaW5nLXplcm8nLCAnc3F1YXJlJ107XG5cdFx0XHRcdHZhciBpc1Vub3JkZXJlZCA9ICQuaW5BcnJheShzdHlsZUluZm9bJ2xpc3Qtc3R5bGUtdHlwZSddLCBhT3JkZXJlZFR5cGUpID4gLTE7XG5cdFx0XHRcdHN0eWxlSW5mb1snbGlzdC1zdHlsZSddID0gaXNVbm9yZGVyZWQgPyAndW5vcmRlcmVkJyA6ICdvcmRlcmVkJztcblx0XHRcdH1cblxuXHRcdFx0dmFyIHBhcmEgPSBkb20uYW5jZXN0b3Iocm5nLnNjLCBkb20uaXNQYXJhKTtcblx0XHRcdGlmIChwYXJhICYmIHBhcmEuc3R5bGVbJ2xpbmUtaGVpZ2h0J10pIHtcblx0XHRcdFx0c3R5bGVJbmZvWydsaW5lLWhlaWdodCddID0gcGFyYS5zdHlsZS5saW5lSGVpZ2h0O1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dmFyIGxpbmVIZWlnaHQgPSBwYXJzZUludChzdHlsZUluZm9bJ2xpbmUtaGVpZ2h0J10sIDEwKSAvIHBhcnNlSW50KHN0eWxlSW5mb1snZm9udC1zaXplJ10sIDEwKTtcblx0XHRcdFx0c3R5bGVJbmZvWydsaW5lLWhlaWdodCddID0gbGluZUhlaWdodC50b0ZpeGVkKDEpO1xuXHRcdFx0fVxuXG5cdFx0XHRzdHlsZUluZm8uaW1hZ2UgPSBkb20uaXNJbWcodGFyZ2V0KSAmJiB0YXJnZXQ7XG5cdFx0XHRzdHlsZUluZm8uYW5jaG9yID0gcm5nLmlzT25BbmNob3IoKSAmJiBkb20uYW5jZXN0b3Iocm5nLnNjLCBkb20uaXNBbmNob3IpO1xuXHRcdFx0c3R5bGVJbmZvLmFuY2VzdG9ycyA9IGRvbS5saXN0QW5jZXN0b3Iocm5nLnNjLCBkb20uaXNFZGl0YWJsZSk7XG5cdFx0XHRzdHlsZUluZm8ucmFuZ2UgPSBybmc7XG5cblx0XHRcdHJldHVybiBzdHlsZUluZm87XG5cdFx0fTtcblx0fTtcblxuXG5cdC8qKlxuXHQgKiBAY2xhc3MgZWRpdGluZy5UeXBpbmdcblx0ICpcblx0ICogVHlwaW5nXG5cdCAqXG5cdCAqL1xuXHR2YXIgVHlwaW5nID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0LyoqXG5cdFx0ICogaW5zZXJ0IHRhYlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRlZGl0YWJsZVxuXHRcdCAqIEBwYXJhbSB7V3JhcHBlZFJhbmdlfSBybmdcblx0XHQgKiBAcGFyYW0ge051bWJlcn0gdGFic2l6ZVxuXHRcdCAqL1xuXHRcdHRoaXMuaW5zZXJ0VGFiID0gZnVuY3Rpb24gKCRlZGl0YWJsZSwgcm5nLCB0YWJzaXplKSB7XG5cdFx0XHR2YXIgdGFiID0gZG9tLmNyZWF0ZVRleHQobmV3IEFycmF5KHRhYnNpemUgKyAxKS5qb2luKGRvbS5OQlNQX0NIQVIpKTtcblx0XHRcdHJuZyA9IHJuZy5kZWxldGVDb250ZW50cygpO1xuXHRcdFx0cm5nLmluc2VydE5vZGUodGFiLCB0cnVlKTtcblxuXHRcdFx0cm5nID0gcmFuZ2UuY3JlYXRlKHRhYiwgdGFic2l6ZSk7XG5cdFx0XHRybmcuc2VsZWN0KCk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIGluc2VydCBwYXJhZ3JhcGhcblx0XHQgKi9cblx0XHR0aGlzLmluc2VydFBhcmFncmFwaCA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdHZhciBybmcgPSByYW5nZS5jcmVhdGUoKTtcblxuXHRcdFx0Ly8gZGVsZXRlQ29udGVudHMgb24gcmFuZ2UuXG5cdFx0XHRybmcgPSBybmcuZGVsZXRlQ29udGVudHMoKTtcblxuXHRcdFx0Ly8gV3JhcCByYW5nZSBpZiBpdCBuZWVkcyB0byBiZSB3cmFwcGVkIGJ5IHBhcmFncmFwaFxuXHRcdFx0cm5nID0gcm5nLndyYXBCb2R5SW5saW5lV2l0aFBhcmEoKTtcblxuXHRcdFx0Ly8gZmluZGluZyBwYXJhZ3JhcGhcblx0XHRcdHZhciBzcGxpdFJvb3QgPSBkb20uYW5jZXN0b3Iocm5nLnNjLCBkb20uaXNQYXJhKTtcblxuXHRcdFx0dmFyIG5leHRQYXJhO1xuXHRcdFx0Ly8gb24gcGFyYWdyYXBoOiBzcGxpdCBwYXJhZ3JhcGhcblx0XHRcdGlmIChzcGxpdFJvb3QpIHtcblx0XHRcdFx0bmV4dFBhcmEgPSBkb20uc3BsaXRUcmVlKHNwbGl0Um9vdCwgcm5nLmdldFN0YXJ0UG9pbnQoKSk7XG5cblx0XHRcdFx0dmFyIGVtcHR5QW5jaG9ycyA9IGRvbS5saXN0RGVzY2VuZGFudChzcGxpdFJvb3QsIGRvbS5pc0VtcHR5QW5jaG9yKTtcblx0XHRcdFx0ZW1wdHlBbmNob3JzID0gZW1wdHlBbmNob3JzLmNvbmNhdChkb20ubGlzdERlc2NlbmRhbnQobmV4dFBhcmEsIGRvbS5pc0VtcHR5QW5jaG9yKSk7XG5cblx0XHRcdFx0JC5lYWNoKGVtcHR5QW5jaG9ycywgZnVuY3Rpb24gKGlkeCwgYW5jaG9yKSB7XG5cdFx0XHRcdFx0ZG9tLnJlbW92ZShhbmNob3IpO1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0Ly8gbm8gcGFyYWdyYXBoOiBpbnNlcnQgZW1wdHkgcGFyYWdyYXBoXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR2YXIgbmV4dCA9IHJuZy5zYy5jaGlsZE5vZGVzW3JuZy5zb107XG5cdFx0XHRcdG5leHRQYXJhID0gJChkb20uZW1wdHlQYXJhKVswXTtcblx0XHRcdFx0aWYgKG5leHQpIHtcblx0XHRcdFx0XHRybmcuc2MuaW5zZXJ0QmVmb3JlKG5leHRQYXJhLCBuZXh0KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRybmcuc2MuYXBwZW5kQ2hpbGQobmV4dFBhcmEpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHJhbmdlLmNyZWF0ZShuZXh0UGFyYSwgMCkubm9ybWFsaXplKCkuc2VsZWN0KCk7XG5cdFx0fTtcblxuXHR9O1xuXG5cdC8qKlxuXHQgKiBAY2xhc3MgZWRpdGluZy5UYWJsZVxuXHQgKlxuXHQgKiBUYWJsZVxuXHQgKlxuXHQgKi9cblx0dmFyIFRhYmxlID0gZnVuY3Rpb24gKCkge1xuXHRcdC8qKlxuXHRcdCAqIGhhbmRsZSB0YWIga2V5XG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge1dyYXBwZWRSYW5nZX0gcm5nXG5cdFx0ICogQHBhcmFtIHtCb29sZWFufSBpc1NoaWZ0XG5cdFx0ICovXG5cdFx0dGhpcy50YWIgPSBmdW5jdGlvbiAocm5nLCBpc1NoaWZ0KSB7XG5cdFx0XHR2YXIgY2VsbCA9IGRvbS5hbmNlc3RvcihybmcuY29tbW9uQW5jZXN0b3IoKSwgZG9tLmlzQ2VsbCk7XG5cdFx0XHR2YXIgdGFibGUgPSBkb20uYW5jZXN0b3IoY2VsbCwgZG9tLmlzVGFibGUpO1xuXHRcdFx0dmFyIGNlbGxzID0gZG9tLmxpc3REZXNjZW5kYW50KHRhYmxlLCBkb20uaXNDZWxsKTtcblxuXHRcdFx0dmFyIG5leHRDZWxsID0gbGlzdFtpc1NoaWZ0ID8gJ3ByZXYnIDogJ25leHQnXShjZWxscywgY2VsbCk7XG5cdFx0XHRpZiAobmV4dENlbGwpIHtcblx0XHRcdFx0cmFuZ2UuY3JlYXRlKG5leHRDZWxsLCAwKS5zZWxlY3QoKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogY3JlYXRlIGVtcHR5IHRhYmxlIGVsZW1lbnRcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7TnVtYmVyfSByb3dDb3VudFxuXHRcdCAqIEBwYXJhbSB7TnVtYmVyfSBjb2xDb3VudFxuXHRcdCAqIEByZXR1cm4ge05vZGV9XG5cdFx0ICovXG5cdFx0dGhpcy5jcmVhdGVUYWJsZSA9IGZ1bmN0aW9uIChjb2xDb3VudCwgcm93Q291bnQpIHtcblx0XHRcdHZhciB0ZHMgPSBbXSwgdGRIVE1MO1xuXHRcdFx0Zm9yICh2YXIgaWR4Q29sID0gMDsgaWR4Q29sIDwgY29sQ291bnQ7IGlkeENvbCsrKSB7XG5cdFx0XHRcdHRkcy5wdXNoKCc8dGQ+JyArIGRvbS5ibGFuayArICc8L3RkPicpO1xuXHRcdFx0fVxuXHRcdFx0dGRIVE1MID0gdGRzLmpvaW4oJycpO1xuXG5cdFx0XHR2YXIgdHJzID0gW10sIHRySFRNTDtcblx0XHRcdGZvciAodmFyIGlkeFJvdyA9IDA7IGlkeFJvdyA8IHJvd0NvdW50OyBpZHhSb3crKykge1xuXHRcdFx0XHR0cnMucHVzaCgnPHRyPicgKyB0ZEhUTUwgKyAnPC90cj4nKTtcblx0XHRcdH1cblx0XHRcdHRySFRNTCA9IHRycy5qb2luKCcnKTtcblx0XHRcdHJldHVybiAkKCc8dGFibGUgY2xhc3M9XCJ0YWJsZSB0YWJsZS1ib3JkZXJlZFwiPicgKyB0ckhUTUwgKyAnPC90YWJsZT4nKVswXTtcblx0XHR9O1xuXHR9O1xuXG5cblx0LyoqXG5cdCAqIEBjbGFzcyBlZGl0aW5nLkJ1bGxldFxuXHQgKlxuXHQgKiBAYWx0ZXJuYXRlQ2xhc3NOYW1lIEJ1bGxldFxuXHQgKi9cblx0dmFyIEJ1bGxldCA9IGZ1bmN0aW9uICgpIHtcblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIGluc2VydE9yZGVyZWRMaXN0XG5cdFx0ICpcblx0XHQgKiB0b2dnbGUgb3JkZXJlZCBsaXN0XG5cdFx0ICpcblx0XHQgKiBAdHlwZSBjb21tYW5kXG5cdFx0ICovXG5cdFx0dGhpcy5pbnNlcnRPcmRlcmVkTGlzdCA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdHRoaXMudG9nZ2xlTGlzdCgnT0wnKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCBpbnNlcnRVbm9yZGVyZWRMaXN0XG5cdFx0ICpcblx0XHQgKiB0b2dnbGUgdW5vcmRlcmVkIGxpc3Rcblx0XHQgKlxuXHRcdCAqIEB0eXBlIGNvbW1hbmRcblx0XHQgKi9cblx0XHR0aGlzLmluc2VydFVub3JkZXJlZExpc3QgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHR0aGlzLnRvZ2dsZUxpc3QoJ1VMJyk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2QgaW5kZW50XG5cdFx0ICpcblx0XHQgKiBpbmRlbnRcblx0XHQgKlxuXHRcdCAqIEB0eXBlIGNvbW1hbmRcblx0XHQgKi9cblx0XHR0aGlzLmluZGVudCA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdHZhciBzZWxmID0gdGhpcztcblx0XHRcdHZhciBybmcgPSByYW5nZS5jcmVhdGUoKS53cmFwQm9keUlubGluZVdpdGhQYXJhKCk7XG5cblx0XHRcdHZhciBwYXJhcyA9IHJuZy5ub2Rlcyhkb20uaXNQYXJhLCB7IGluY2x1ZGVBbmNlc3RvcjogdHJ1ZSB9KTtcblx0XHRcdHZhciBjbHVzdGVyZWRzID0gbGlzdC5jbHVzdGVyQnkocGFyYXMsIGZ1bmMucGVxMigncGFyZW50Tm9kZScpKTtcblxuXHRcdFx0JC5lYWNoKGNsdXN0ZXJlZHMsIGZ1bmN0aW9uIChpZHgsIHBhcmFzKSB7XG5cdFx0XHRcdHZhciBoZWFkID0gbGlzdC5oZWFkKHBhcmFzKTtcblx0XHRcdFx0aWYgKGRvbS5pc0xpKGhlYWQpKSB7XG5cdFx0XHRcdFx0c2VsZi53cmFwTGlzdChwYXJhcywgaGVhZC5wYXJlbnROb2RlLm5vZGVOYW1lKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQkLmVhY2gocGFyYXMsIGZ1bmN0aW9uIChpZHgsIHBhcmEpIHtcblx0XHRcdFx0XHRcdCQocGFyYSkuY3NzKCdtYXJnaW5MZWZ0JywgZnVuY3Rpb24gKGlkeCwgdmFsKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiAocGFyc2VJbnQodmFsLCAxMCkgfHwgMCkgKyAyNTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblxuXHRcdFx0cm5nLnNlbGVjdCgpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIG91dGRlbnRcblx0XHQgKlxuXHRcdCAqIG91dGRlbnRcblx0XHQgKlxuXHRcdCAqIEB0eXBlIGNvbW1hbmRcblx0XHQgKi9cblx0XHR0aGlzLm91dGRlbnQgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHR2YXIgc2VsZiA9IHRoaXM7XG5cdFx0XHR2YXIgcm5nID0gcmFuZ2UuY3JlYXRlKCkud3JhcEJvZHlJbmxpbmVXaXRoUGFyYSgpO1xuXG5cdFx0XHR2YXIgcGFyYXMgPSBybmcubm9kZXMoZG9tLmlzUGFyYSwgeyBpbmNsdWRlQW5jZXN0b3I6IHRydWUgfSk7XG5cdFx0XHR2YXIgY2x1c3RlcmVkcyA9IGxpc3QuY2x1c3RlckJ5KHBhcmFzLCBmdW5jLnBlcTIoJ3BhcmVudE5vZGUnKSk7XG5cblx0XHRcdCQuZWFjaChjbHVzdGVyZWRzLCBmdW5jdGlvbiAoaWR4LCBwYXJhcykge1xuXHRcdFx0XHR2YXIgaGVhZCA9IGxpc3QuaGVhZChwYXJhcyk7XG5cdFx0XHRcdGlmIChkb20uaXNMaShoZWFkKSkge1xuXHRcdFx0XHRcdHNlbGYucmVsZWFzZUxpc3QoW3BhcmFzXSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0JC5lYWNoKHBhcmFzLCBmdW5jdGlvbiAoaWR4LCBwYXJhKSB7XG5cdFx0XHRcdFx0XHQkKHBhcmEpLmNzcygnbWFyZ2luTGVmdCcsIGZ1bmN0aW9uIChpZHgsIHZhbCkge1xuXHRcdFx0XHRcdFx0XHR2YWwgPSAocGFyc2VJbnQodmFsLCAxMCkgfHwgMCk7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB2YWwgPiAyNSA/IHZhbCAtIDI1IDogJyc7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cblx0XHRcdHJuZy5zZWxlY3QoKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCB0b2dnbGVMaXN0XG5cdFx0ICpcblx0XHQgKiB0b2dnbGUgbGlzdFxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IGxpc3ROYW1lIC0gT0wgb3IgVUxcblx0XHQgKi9cblx0XHR0aGlzLnRvZ2dsZUxpc3QgPSBmdW5jdGlvbiAobGlzdE5hbWUpIHtcblx0XHRcdHZhciBzZWxmID0gdGhpcztcblx0XHRcdHZhciBybmcgPSByYW5nZS5jcmVhdGUoKS53cmFwQm9keUlubGluZVdpdGhQYXJhKCk7XG5cblx0XHRcdHZhciBwYXJhcyA9IHJuZy5ub2Rlcyhkb20uaXNQYXJhLCB7IGluY2x1ZGVBbmNlc3RvcjogdHJ1ZSB9KTtcblx0XHRcdHZhciBib29rbWFyayA9IHJuZy5wYXJhQm9va21hcmsocGFyYXMpO1xuXHRcdFx0dmFyIGNsdXN0ZXJlZHMgPSBsaXN0LmNsdXN0ZXJCeShwYXJhcywgZnVuYy5wZXEyKCdwYXJlbnROb2RlJykpO1xuXG5cdFx0XHQvLyBwYXJhZ3JhcGggdG8gbGlzdFxuXHRcdFx0aWYgKGxpc3QuZmluZChwYXJhcywgZG9tLmlzUHVyZVBhcmEpKSB7XG5cdFx0XHRcdHZhciB3cmFwcGVkUGFyYXMgPSBbXTtcblx0XHRcdFx0JC5lYWNoKGNsdXN0ZXJlZHMsIGZ1bmN0aW9uIChpZHgsIHBhcmFzKSB7XG5cdFx0XHRcdFx0d3JhcHBlZFBhcmFzID0gd3JhcHBlZFBhcmFzLmNvbmNhdChzZWxmLndyYXBMaXN0KHBhcmFzLCBsaXN0TmFtZSkpO1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0cGFyYXMgPSB3cmFwcGVkUGFyYXM7XG5cdFx0XHRcdC8vIGxpc3QgdG8gcGFyYWdyYXBoIG9yIGNoYW5nZSBsaXN0IHN0eWxlXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR2YXIgZGlmZkxpc3RzID0gcm5nLm5vZGVzKGRvbS5pc0xpc3QsIHtcblx0XHRcdFx0XHRpbmNsdWRlQW5jZXN0b3I6IHRydWVcblx0XHRcdFx0fSkuZmlsdGVyKGZ1bmN0aW9uIChsaXN0Tm9kZSkge1xuXHRcdFx0XHRcdHJldHVybiAhJC5ub2RlTmFtZShsaXN0Tm9kZSwgbGlzdE5hbWUpO1xuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHRpZiAoZGlmZkxpc3RzLmxlbmd0aCkge1xuXHRcdFx0XHRcdCQuZWFjaChkaWZmTGlzdHMsIGZ1bmN0aW9uIChpZHgsIGxpc3ROb2RlKSB7XG5cdFx0XHRcdFx0XHRkb20ucmVwbGFjZShsaXN0Tm9kZSwgbGlzdE5hbWUpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHBhcmFzID0gdGhpcy5yZWxlYXNlTGlzdChjbHVzdGVyZWRzLCB0cnVlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyYW5nZS5jcmVhdGVGcm9tUGFyYUJvb2ttYXJrKGJvb2ttYXJrLCBwYXJhcykuc2VsZWN0KCk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2Qgd3JhcExpc3Rcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7Tm9kZVtdfSBwYXJhc1xuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSBsaXN0TmFtZVxuXHRcdCAqIEByZXR1cm4ge05vZGVbXX1cblx0XHQgKi9cblx0XHR0aGlzLndyYXBMaXN0ID0gZnVuY3Rpb24gKHBhcmFzLCBsaXN0TmFtZSkge1xuXHRcdFx0dmFyIGhlYWQgPSBsaXN0LmhlYWQocGFyYXMpO1xuXHRcdFx0dmFyIGxhc3QgPSBsaXN0Lmxhc3QocGFyYXMpO1xuXG5cdFx0XHR2YXIgcHJldkxpc3QgPSBkb20uaXNMaXN0KGhlYWQucHJldmlvdXNTaWJsaW5nKSAmJiBoZWFkLnByZXZpb3VzU2libGluZztcblx0XHRcdHZhciBuZXh0TGlzdCA9IGRvbS5pc0xpc3QobGFzdC5uZXh0U2libGluZykgJiYgbGFzdC5uZXh0U2libGluZztcblxuXHRcdFx0dmFyIGxpc3ROb2RlID0gcHJldkxpc3QgfHwgZG9tLmluc2VydEFmdGVyKGRvbS5jcmVhdGUobGlzdE5hbWUgfHwgJ1VMJyksIGxhc3QpO1xuXG5cdFx0XHQvLyBQIHRvIExJXG5cdFx0XHRwYXJhcyA9ICQubWFwKHBhcmFzLCBmdW5jdGlvbiAocGFyYSkge1xuXHRcdFx0XHRyZXR1cm4gZG9tLmlzUHVyZVBhcmEocGFyYSkgPyBkb20ucmVwbGFjZShwYXJhLCAnTEknKSA6IHBhcmE7XG5cdFx0XHR9KTtcblxuXHRcdFx0Ly8gYXBwZW5kIHRvIGxpc3QoPHVsPiwgPG9sPilcblx0XHRcdGRvbS5hcHBlbmRDaGlsZE5vZGVzKGxpc3ROb2RlLCBwYXJhcyk7XG5cblx0XHRcdGlmIChuZXh0TGlzdCkge1xuXHRcdFx0XHRkb20uYXBwZW5kQ2hpbGROb2RlcyhsaXN0Tm9kZSwgbGlzdC5mcm9tKG5leHRMaXN0LmNoaWxkTm9kZXMpKTtcblx0XHRcdFx0ZG9tLnJlbW92ZShuZXh0TGlzdCk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBwYXJhcztcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCByZWxlYXNlTGlzdFxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtBcnJheVtdfSBjbHVzdGVyZWRzXG5cdFx0ICogQHBhcmFtIHtCb29sZWFufSBpc0VzY2Fwc2VUb0JvZHlcblx0XHQgKiBAcmV0dXJuIHtOb2RlW119XG5cdFx0ICovXG5cdFx0dGhpcy5yZWxlYXNlTGlzdCA9IGZ1bmN0aW9uIChjbHVzdGVyZWRzLCBpc0VzY2Fwc2VUb0JvZHkpIHtcblx0XHRcdHZhciByZWxlYXNlZFBhcmFzID0gW107XG5cblx0XHRcdCQuZWFjaChjbHVzdGVyZWRzLCBmdW5jdGlvbiAoaWR4LCBwYXJhcykge1xuXHRcdFx0XHR2YXIgaGVhZCA9IGxpc3QuaGVhZChwYXJhcyk7XG5cdFx0XHRcdHZhciBsYXN0ID0gbGlzdC5sYXN0KHBhcmFzKTtcblxuXHRcdFx0XHR2YXIgaGVhZExpc3QgPSBpc0VzY2Fwc2VUb0JvZHkgPyBkb20ubGFzdEFuY2VzdG9yKGhlYWQsIGRvbS5pc0xpc3QpIDpcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCBoZWFkLnBhcmVudE5vZGU7XG5cdFx0XHRcdHZhciBsYXN0TGlzdCA9IGhlYWRMaXN0LmNoaWxkTm9kZXMubGVuZ3RoID4gMSA/IGRvbS5zcGxpdFRyZWUoaGVhZExpc3QsIHtcblx0XHRcdFx0XHRub2RlOiBsYXN0LnBhcmVudE5vZGUsXG5cdFx0XHRcdFx0b2Zmc2V0OiBkb20ucG9zaXRpb24obGFzdCkgKyAxXG5cdFx0XHRcdH0sIHRydWUpIDogbnVsbDtcblxuXHRcdFx0XHR2YXIgbWlkZGxlTGlzdCA9IGRvbS5zcGxpdFRyZWUoaGVhZExpc3QsIHtcblx0XHRcdFx0XHRub2RlOiBoZWFkLnBhcmVudE5vZGUsXG5cdFx0XHRcdFx0b2Zmc2V0OiBkb20ucG9zaXRpb24oaGVhZClcblx0XHRcdFx0fSwgdHJ1ZSk7XG5cblx0XHRcdFx0cGFyYXMgPSBpc0VzY2Fwc2VUb0JvZHkgPyBkb20ubGlzdERlc2NlbmRhbnQobWlkZGxlTGlzdCwgZG9tLmlzTGkpIDpcblx0XHRcdFx0XHRcdFx0XHRcdFx0ICBsaXN0LmZyb20obWlkZGxlTGlzdC5jaGlsZE5vZGVzKS5maWx0ZXIoZG9tLmlzTGkpO1xuXG5cdFx0XHRcdC8vIExJIHRvIFBcblx0XHRcdFx0aWYgKGlzRXNjYXBzZVRvQm9keSB8fCAhZG9tLmlzTGlzdChoZWFkTGlzdC5wYXJlbnROb2RlKSkge1xuXHRcdFx0XHRcdHBhcmFzID0gJC5tYXAocGFyYXMsIGZ1bmN0aW9uIChwYXJhKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZG9tLnJlcGxhY2UocGFyYSwgJ1AnKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdCQuZWFjaChsaXN0LmZyb20ocGFyYXMpLnJldmVyc2UoKSwgZnVuY3Rpb24gKGlkeCwgcGFyYSkge1xuXHRcdFx0XHRcdGRvbS5pbnNlcnRBZnRlcihwYXJhLCBoZWFkTGlzdCk7XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdC8vIHJlbW92ZSBlbXB0eSBsaXN0c1xuXHRcdFx0XHR2YXIgcm9vdExpc3RzID0gbGlzdC5jb21wYWN0KFtoZWFkTGlzdCwgbWlkZGxlTGlzdCwgbGFzdExpc3RdKTtcblx0XHRcdFx0JC5lYWNoKHJvb3RMaXN0cywgZnVuY3Rpb24gKGlkeCwgcm9vdExpc3QpIHtcblx0XHRcdFx0XHR2YXIgbGlzdE5vZGVzID0gW3Jvb3RMaXN0XS5jb25jYXQoZG9tLmxpc3REZXNjZW5kYW50KHJvb3RMaXN0LCBkb20uaXNMaXN0KSk7XG5cdFx0XHRcdFx0JC5lYWNoKGxpc3ROb2Rlcy5yZXZlcnNlKCksIGZ1bmN0aW9uIChpZHgsIGxpc3ROb2RlKSB7XG5cdFx0XHRcdFx0XHRpZiAoIWRvbS5ub2RlTGVuZ3RoKGxpc3ROb2RlKSkge1xuXHRcdFx0XHRcdFx0XHRkb20ucmVtb3ZlKGxpc3ROb2RlLCB0cnVlKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0cmVsZWFzZWRQYXJhcyA9IHJlbGVhc2VkUGFyYXMuY29uY2F0KHBhcmFzKTtcblx0XHRcdH0pO1xuXG5cdFx0XHRyZXR1cm4gcmVsZWFzZWRQYXJhcztcblx0XHR9O1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBAY2xhc3MgZWRpdGluZy5FZGl0b3Jcblx0ICpcblx0ICogRWRpdG9yXG5cdCAqXG5cdCAqL1xuXHR2YXIgRWRpdG9yID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHN0eWxlID0gbmV3IFN0eWxlKCk7XG5cdFx0dmFyIHRhYmxlID0gbmV3IFRhYmxlKCk7XG5cdFx0dmFyIHR5cGluZyA9IG5ldyBUeXBpbmcoKTtcblx0XHR2YXIgYnVsbGV0ID0gbmV3IEJ1bGxldCgpO1xuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCBjcmVhdGVSYW5nZVxuXHRcdCAqXG5cdFx0ICogY3JlYXRlIHJhbmdlXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGVkaXRhYmxlXG5cdFx0ICogQHJldHVybiB7V3JhcHBlZFJhbmdlfVxuXHRcdCAqL1xuXHRcdHRoaXMuY3JlYXRlUmFuZ2UgPSBmdW5jdGlvbiAoJGVkaXRhYmxlKSB7XG5cdFx0XHQkZWRpdGFibGUuZm9jdXMoKTtcblx0XHRcdHJldHVybiByYW5nZS5jcmVhdGUoKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCBzYXZlUmFuZ2Vcblx0XHQgKlxuXHRcdCAqIHNhdmUgY3VycmVudCByYW5nZVxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRlZGl0YWJsZVxuXHRcdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW3RoZW5Db2xsYXBzZT1mYWxzZV1cblx0XHQgKi9cblx0XHR0aGlzLnNhdmVSYW5nZSA9IGZ1bmN0aW9uICgkZWRpdGFibGUsIHRoZW5Db2xsYXBzZSkge1xuXHRcdFx0JGVkaXRhYmxlLmZvY3VzKCk7XG5cdFx0XHQkZWRpdGFibGUuZGF0YSgncmFuZ2UnLCByYW5nZS5jcmVhdGUoKSk7XG5cdFx0XHRpZiAodGhlbkNvbGxhcHNlKSB7XG5cdFx0XHRcdHJhbmdlLmNyZWF0ZSgpLmNvbGxhcHNlKCkuc2VsZWN0KCk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2Qgc2F2ZVJhbmdlXG5cdFx0ICpcblx0XHQgKiBzYXZlIGN1cnJlbnQgbm9kZSBsaXN0IHRvICRlZGl0YWJsZS5kYXRhKCdjaGlsZE5vZGVzJylcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkZWRpdGFibGVcblx0XHQgKi9cblx0XHR0aGlzLnNhdmVOb2RlID0gZnVuY3Rpb24gKCRlZGl0YWJsZSkge1xuXHRcdFx0Ly8gY29weSBjaGlsZCBub2RlIHJlZmVyZW5jZVxuXHRcdFx0dmFyIGNvcHkgPSBbXTtcblx0XHRcdGZvciAodmFyIGtleSA9IDAsIGxlbiA9ICRlZGl0YWJsZVswXS5jaGlsZE5vZGVzLmxlbmd0aDsga2V5IDwgbGVuOyBrZXkrKykge1xuXHRcdFx0XHRjb3B5LnB1c2goJGVkaXRhYmxlWzBdLmNoaWxkTm9kZXNba2V5XSk7XG5cdFx0XHR9XG5cdFx0XHQkZWRpdGFibGUuZGF0YSgnY2hpbGROb2RlcycsIGNvcHkpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIHJlc3RvcmVSYW5nZVxuXHRcdCAqXG5cdFx0ICogcmVzdG9yZSBsYXRlbHkgcmFuZ2Vcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkZWRpdGFibGVcblx0XHQgKi9cblx0XHR0aGlzLnJlc3RvcmVSYW5nZSA9IGZ1bmN0aW9uICgkZWRpdGFibGUpIHtcblx0XHRcdHZhciBybmcgPSAkZWRpdGFibGUuZGF0YSgncmFuZ2UnKTtcblx0XHRcdGlmIChybmcpIHtcblx0XHRcdFx0cm5nLnNlbGVjdCgpO1xuXHRcdFx0XHQkZWRpdGFibGUuZm9jdXMoKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCByZXN0b3JlTm9kZVxuXHRcdCAqXG5cdFx0ICogcmVzdG9yZSBsYXRlbHkgbm9kZSBsaXN0XG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGVkaXRhYmxlXG5cdFx0ICovXG5cdFx0dGhpcy5yZXN0b3JlTm9kZSA9IGZ1bmN0aW9uICgkZWRpdGFibGUpIHtcblx0XHRcdCRlZGl0YWJsZS5odG1sKCcnKTtcblx0XHRcdHZhciBjaGlsZCA9ICRlZGl0YWJsZS5kYXRhKCdjaGlsZE5vZGVzJyk7XG5cdFx0XHRmb3IgKHZhciBpbmRleCA9IDAsIGxlbiA9IGNoaWxkLmxlbmd0aDsgaW5kZXggPCBsZW47IGluZGV4KyspIHtcblx0XHRcdFx0JGVkaXRhYmxlWzBdLmFwcGVuZENoaWxkKGNoaWxkW2luZGV4XSk7XG5cdFx0XHR9XG5cdFx0fTtcblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIGN1cnJlbnRTdHlsZVxuXHRcdCAqXG5cdFx0ICogY3VycmVudCBzdHlsZVxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcblx0XHQgKiBAcmV0dXJuIHtCb29sZWFufSBmYWxzZSBpZiByYW5nZSBpcyBub1xuXHRcdCAqL1xuXHRcdHRoaXMuY3VycmVudFN0eWxlID0gZnVuY3Rpb24gKHRhcmdldCkge1xuXHRcdFx0dmFyIHJuZyA9IHJhbmdlLmNyZWF0ZSgpO1xuXHRcdFx0cmV0dXJuIHJuZyA/IHJuZy5pc09uRWRpdGFibGUoKSAmJiBzdHlsZS5jdXJyZW50KHJuZywgdGFyZ2V0KSA6IGZhbHNlO1xuXHRcdH07XG5cblx0XHR2YXIgdHJpZ2dlck9uQmVmb3JlQ2hhbmdlID0gdGhpcy50cmlnZ2VyT25CZWZvcmVDaGFuZ2UgPSBmdW5jdGlvbiAoJGVkaXRhYmxlKSB7XG5cdFx0XHR2YXIgb25CZWZvcmVDaGFuZ2UgPSAkZWRpdGFibGUuZGF0YSgnY2FsbGJhY2tzJykub25CZWZvcmVDaGFuZ2U7XG5cdFx0XHRpZiAob25CZWZvcmVDaGFuZ2UpIHtcblx0XHRcdFx0b25CZWZvcmVDaGFuZ2UoJGVkaXRhYmxlLmh0bWwoKSwgJGVkaXRhYmxlKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0dmFyIHRyaWdnZXJPbkNoYW5nZSA9IHRoaXMudHJpZ2dlck9uQ2hhbmdlID0gZnVuY3Rpb24gKCRlZGl0YWJsZSkge1xuXHRcdFx0dmFyIG9uQ2hhbmdlID0gJGVkaXRhYmxlLmRhdGEoJ2NhbGxiYWNrcycpLm9uQ2hhbmdlO1xuXHRcdFx0aWYgKG9uQ2hhbmdlKSB7XG5cdFx0XHRcdG9uQ2hhbmdlKCRlZGl0YWJsZS5odG1sKCksICRlZGl0YWJsZSk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2QgdW5kb1xuXHRcdCAqIHVuZG9cblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGVkaXRhYmxlXG5cdFx0ICovXG5cdFx0dGhpcy51bmRvID0gZnVuY3Rpb24gKCRlZGl0YWJsZSkge1xuXHRcdFx0dHJpZ2dlck9uQmVmb3JlQ2hhbmdlKCRlZGl0YWJsZSk7XG5cdFx0XHQkZWRpdGFibGUuZGF0YSgnTm90ZUhpc3RvcnknKS51bmRvKCk7XG5cdFx0XHR0cmlnZ2VyT25DaGFuZ2UoJGVkaXRhYmxlKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCByZWRvXG5cdFx0ICogcmVkb1xuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkZWRpdGFibGVcblx0XHQgKi9cblx0XHR0aGlzLnJlZG8gPSBmdW5jdGlvbiAoJGVkaXRhYmxlKSB7XG5cdFx0XHR0cmlnZ2VyT25CZWZvcmVDaGFuZ2UoJGVkaXRhYmxlKTtcblx0XHRcdCRlZGl0YWJsZS5kYXRhKCdOb3RlSGlzdG9yeScpLnJlZG8oKTtcblx0XHRcdHRyaWdnZXJPbkNoYW5nZSgkZWRpdGFibGUpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIGJlZm9yZUNvbW1hbmRcblx0XHQgKiBiZWZvcmUgY29tbWFuZFxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkZWRpdGFibGVcblx0XHQgKi9cblx0XHR2YXIgYmVmb3JlQ29tbWFuZCA9IHRoaXMuYmVmb3JlQ29tbWFuZCA9IGZ1bmN0aW9uICgkZWRpdGFibGUpIHtcblx0XHRcdHRyaWdnZXJPbkJlZm9yZUNoYW5nZSgkZWRpdGFibGUpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIGFmdGVyQ29tbWFuZFxuXHRcdCAqIGFmdGVyIGNvbW1hbmRcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGVkaXRhYmxlXG5cdFx0ICovXG5cdFx0dmFyIGFmdGVyQ29tbWFuZCA9IHRoaXMuYWZ0ZXJDb21tYW5kID0gZnVuY3Rpb24gKCRlZGl0YWJsZSkge1xuXHRcdFx0JGVkaXRhYmxlLmRhdGEoJ05vdGVIaXN0b3J5JykucmVjb3JkVW5kbygpO1xuXHRcdFx0dHJpZ2dlck9uQ2hhbmdlKCRlZGl0YWJsZSk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2QgYm9sZFxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkZWRpdGFibGVcblx0XHQgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuXHRcdCAqL1xuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCBpdGFsaWNcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGVkaXRhYmxlXG5cdFx0ICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcblx0XHQgKi9cblxuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2QgdW5kZXJsaW5lXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRlZGl0YWJsZVxuXHRcdCAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlXG5cdFx0ICovXG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIHN0cmlrZXRocm91Z2hcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGVkaXRhYmxlXG5cdFx0ICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcblx0XHQgKi9cblxuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2QgZm9ybWF0QmxvY2tcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGVkaXRhYmxlXG5cdFx0ICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcblx0XHQgKi9cblxuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2Qgc3VwZXJzY3JpcHRcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGVkaXRhYmxlXG5cdFx0ICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcblx0XHQgKi9cblxuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2Qgc3Vic2NyaXB0XG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRlZGl0YWJsZVxuXHRcdCAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlXG5cdFx0ICovXG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIGp1c3RpZnlMZWZ0XG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRlZGl0YWJsZVxuXHRcdCAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlXG5cdFx0ICovXG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIGp1c3RpZnlDZW50ZXJcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGVkaXRhYmxlXG5cdFx0ICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcblx0XHQgKi9cblxuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2QganVzdGlmeVJpZ2h0XG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRlZGl0YWJsZVxuXHRcdCAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlXG5cdFx0ICovXG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIGp1c3RpZnlGdWxsXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRlZGl0YWJsZVxuXHRcdCAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlXG5cdFx0ICovXG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIGZvcm1hdEJsb2NrXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRlZGl0YWJsZVxuXHRcdCAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlXG5cdFx0ICovXG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIHJlbW92ZUZvcm1hdFxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkZWRpdGFibGVcblx0XHQgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuXHRcdCAqL1xuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCBiYWNrQ29sb3Jcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGVkaXRhYmxlXG5cdFx0ICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcblx0XHQgKi9cblxuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2QgZm9yZUNvbG9yXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRlZGl0YWJsZVxuXHRcdCAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlXG5cdFx0ICovXG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIGluc2VydEhvcml6b250YWxSdWxlXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRlZGl0YWJsZVxuXHRcdCAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlXG5cdFx0ICovXG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIGZvbnROYW1lXG5cdFx0ICpcblx0XHQgKiBjaGFuZ2UgZm9udCBuYW1lXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGVkaXRhYmxlXG5cdFx0ICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcblx0XHQgKi9cblxuXHRcdC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cblx0XHQvLyBuYXRpdmUgY29tbWFuZHMod2l0aCBleGVjQ29tbWFuZCksIGdlbmVyYXRlIGZ1bmN0aW9uIGZvciBleGVjQ29tbWFuZFxuXHRcdHZhciBjb21tYW5kcyA9IFsnYm9sZCcsICdpdGFsaWMnLCAndW5kZXJsaW5lJywgJ3N0cmlrZXRocm91Z2gnLCAnc3VwZXJzY3JpcHQnLCAnc3Vic2NyaXB0Jyxcblx0XHRcdFx0XHRcdCdqdXN0aWZ5TGVmdCcsICdqdXN0aWZ5Q2VudGVyJywgJ2p1c3RpZnlSaWdodCcsICdqdXN0aWZ5RnVsbCcsXG5cdFx0XHRcdFx0XHQnZm9ybWF0QmxvY2snLCAncmVtb3ZlRm9ybWF0Jyxcblx0XHRcdFx0XHRcdCdiYWNrQ29sb3InLCAnZm9yZUNvbG9yJywgJ2luc2VydEhvcml6b250YWxSdWxlJywgJ2ZvbnROYW1lJ107XG5cblx0XHRmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBjb21tYW5kcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcblx0XHRcdHRoaXNbY29tbWFuZHNbaWR4XV0gPSAoZnVuY3Rpb24gKHNDbWQpIHtcblx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uICgkZWRpdGFibGUsIHZhbHVlKSB7XG5cdFx0XHRcdFx0YmVmb3JlQ29tbWFuZCgkZWRpdGFibGUpO1xuXG5cdFx0XHRcdFx0ZG9jdW1lbnQuZXhlY0NvbW1hbmQoc0NtZCwgZmFsc2UsIHZhbHVlKTtcblxuXHRcdFx0XHRcdGFmdGVyQ29tbWFuZCgkZWRpdGFibGUpO1xuXHRcdFx0XHR9O1xuXHRcdFx0fSkoY29tbWFuZHNbaWR4XSk7XG5cdFx0fVxuXHRcdC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG5cblx0XHQvKipcblx0XHQgKiBAbWV0aG9kIHRhYlxuXHRcdCAqXG5cdFx0ICogaGFuZGxlIHRhYiBrZXlcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkZWRpdGFibGVcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuXHRcdCAqL1xuXHRcdHRoaXMudGFiID0gZnVuY3Rpb24gKCRlZGl0YWJsZSwgb3B0aW9ucykge1xuXHRcdFx0dmFyIHJuZyA9IHJhbmdlLmNyZWF0ZSgpO1xuXHRcdFx0aWYgKHJuZy5pc0NvbGxhcHNlZCgpICYmIHJuZy5pc09uQ2VsbCgpKSB7XG5cdFx0XHRcdHRhYmxlLnRhYihybmcpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0YmVmb3JlQ29tbWFuZCgkZWRpdGFibGUpO1xuXHRcdFx0XHR0eXBpbmcuaW5zZXJ0VGFiKCRlZGl0YWJsZSwgcm5nLCBvcHRpb25zLnRhYnNpemUpO1xuXHRcdFx0XHRhZnRlckNvbW1hbmQoJGVkaXRhYmxlKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogQG1ldGhvZCB1bnRhYlxuXHRcdCAqXG5cdFx0ICogaGFuZGxlIHNoaWZ0K3RhYiBrZXlcblx0XHQgKlxuXHRcdCAqL1xuXHRcdHRoaXMudW50YWIgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHR2YXIgcm5nID0gcmFuZ2UuY3JlYXRlKCk7XG5cdFx0XHRpZiAocm5nLmlzQ29sbGFwc2VkKCkgJiYgcm5nLmlzT25DZWxsKCkpIHtcblx0XHRcdFx0dGFibGUudGFiKHJuZywgdHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2QgaW5zZXJ0UGFyYWdyYXBoXG5cdFx0ICpcblx0XHQgKiBpbnNlcnQgcGFyYWdyYXBoXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge05vZGV9ICRlZGl0YWJsZVxuXHRcdCAqL1xuXHRcdHRoaXMuaW5zZXJ0UGFyYWdyYXBoID0gZnVuY3Rpb24gKCRlZGl0YWJsZSkge1xuXHRcdFx0YmVmb3JlQ29tbWFuZCgkZWRpdGFibGUpO1xuXHRcdFx0dHlwaW5nLmluc2VydFBhcmFncmFwaCgkZWRpdGFibGUpO1xuXHRcdFx0YWZ0ZXJDb21tYW5kKCRlZGl0YWJsZSk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2QgaW5zZXJ0T3JkZXJlZExpc3Rcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkZWRpdGFibGVcblx0XHQgKi9cblx0XHR0aGlzLmluc2VydE9yZGVyZWRMaXN0ID0gZnVuY3Rpb24gKCRlZGl0YWJsZSkge1xuXHRcdFx0YmVmb3JlQ29tbWFuZCgkZWRpdGFibGUpO1xuXHRcdFx0YnVsbGV0Lmluc2VydE9yZGVyZWRMaXN0KCRlZGl0YWJsZSk7XG5cdFx0XHRhZnRlckNvbW1hbmQoJGVkaXRhYmxlKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRlZGl0YWJsZVxuXHRcdCAqL1xuXHRcdHRoaXMuaW5zZXJ0VW5vcmRlcmVkTGlzdCA9IGZ1bmN0aW9uICgkZWRpdGFibGUpIHtcblx0XHRcdGJlZm9yZUNvbW1hbmQoJGVkaXRhYmxlKTtcblx0XHRcdGJ1bGxldC5pbnNlcnRVbm9yZGVyZWRMaXN0KCRlZGl0YWJsZSk7XG5cdFx0XHRhZnRlckNvbW1hbmQoJGVkaXRhYmxlKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRlZGl0YWJsZVxuXHRcdCAqL1xuXHRcdHRoaXMuaW5kZW50ID0gZnVuY3Rpb24gKCRlZGl0YWJsZSkge1xuXHRcdFx0YmVmb3JlQ29tbWFuZCgkZWRpdGFibGUpO1xuXHRcdFx0YnVsbGV0LmluZGVudCgkZWRpdGFibGUpO1xuXHRcdFx0YWZ0ZXJDb21tYW5kKCRlZGl0YWJsZSk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkZWRpdGFibGVcblx0XHQgKi9cblx0XHR0aGlzLm91dGRlbnQgPSBmdW5jdGlvbiAoJGVkaXRhYmxlKSB7XG5cdFx0XHRiZWZvcmVDb21tYW5kKCRlZGl0YWJsZSk7XG5cdFx0XHRidWxsZXQub3V0ZGVudCgkZWRpdGFibGUpO1xuXHRcdFx0YWZ0ZXJDb21tYW5kKCRlZGl0YWJsZSk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIGluc2VydCBpbWFnZVxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRlZGl0YWJsZVxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSBzVXJsXG5cdFx0ICovXG5cdFx0dGhpcy5pbnNlcnRJbWFnZSA9IGZ1bmN0aW9uICgkZWRpdGFibGUsIHNVcmwsIGZpbGVuYW1lKSB7XG5cdFx0XHRhc3luYy5jcmVhdGVJbWFnZShzVXJsLCBmaWxlbmFtZSkudGhlbihmdW5jdGlvbiAoJGltYWdlKSB7XG5cdFx0XHRcdGJlZm9yZUNvbW1hbmQoJGVkaXRhYmxlKTtcblx0XHRcdFx0JGltYWdlLmNzcyh7XG5cdFx0XHRcdFx0ZGlzcGxheTogJycsXG5cdFx0XHRcdFx0d2lkdGg6IE1hdGgubWluKCRlZGl0YWJsZS53aWR0aCgpLCAkaW1hZ2Uud2lkdGgoKSlcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHJhbmdlLmNyZWF0ZSgpLmluc2VydE5vZGUoJGltYWdlWzBdKTtcblx0XHRcdFx0cmFuZ2UuY3JlYXRlRnJvbU5vZGUoJGltYWdlWzBdKS5jb2xsYXBzZSgpLnNlbGVjdCgpO1xuXHRcdFx0XHRhZnRlckNvbW1hbmQoJGVkaXRhYmxlKTtcblx0XHRcdH0pLmZhaWwoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHR2YXIgY2FsbGJhY2tzID0gJGVkaXRhYmxlLmRhdGEoJ2NhbGxiYWNrcycpO1xuXHRcdFx0XHRpZiAoY2FsbGJhY2tzLm9uSW1hZ2VVcGxvYWRFcnJvcikge1xuXHRcdFx0XHRcdGNhbGxiYWNrcy5vbkltYWdlVXBsb2FkRXJyb3IoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2QgaW5zZXJ0Tm9kZVxuXHRcdCAqIGluc2VydCBub2RlXG5cdFx0ICogQHBhcmFtIHtOb2RlfSAkZWRpdGFibGVcblx0XHQgKiBAcGFyYW0ge05vZGV9IG5vZGVcblx0XHQgKi9cblx0XHR0aGlzLmluc2VydE5vZGUgPSBmdW5jdGlvbiAoJGVkaXRhYmxlLCBub2RlKSB7XG5cdFx0XHRiZWZvcmVDb21tYW5kKCRlZGl0YWJsZSk7XG5cdFx0XHR2YXIgcm5nID0gdGhpcy5jcmVhdGVSYW5nZSgkZWRpdGFibGUpO1xuXHRcdFx0cm5nLmluc2VydE5vZGUobm9kZSk7XG5cdFx0XHRyYW5nZS5jcmVhdGVGcm9tTm9kZShub2RlKS5jb2xsYXBzZSgpLnNlbGVjdCgpO1xuXHRcdFx0YWZ0ZXJDb21tYW5kKCRlZGl0YWJsZSk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIGluc2VydCB0ZXh0XG5cdFx0ICogQHBhcmFtIHtOb2RlfSAkZWRpdGFibGVcblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gdGV4dFxuXHRcdCAqL1xuXHRcdHRoaXMuaW5zZXJ0VGV4dCA9IGZ1bmN0aW9uICgkZWRpdGFibGUsIHRleHQpIHtcblx0XHRcdGJlZm9yZUNvbW1hbmQoJGVkaXRhYmxlKTtcblx0XHRcdHZhciBybmcgPSB0aGlzLmNyZWF0ZVJhbmdlKCRlZGl0YWJsZSk7XG5cdFx0XHR2YXIgdGV4dE5vZGUgPSBybmcuaW5zZXJ0Tm9kZShkb20uY3JlYXRlVGV4dCh0ZXh0KSk7XG5cdFx0XHRyYW5nZS5jcmVhdGUodGV4dE5vZGUsIGRvbS5ub2RlTGVuZ3RoKHRleHROb2RlKSkuc2VsZWN0KCk7XG5cdFx0XHRhZnRlckNvbW1hbmQoJGVkaXRhYmxlKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogZm9ybWF0QmxvY2tcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkZWRpdGFibGVcblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gdGFnTmFtZVxuXHRcdCAqL1xuXHRcdHRoaXMuZm9ybWF0QmxvY2sgPSBmdW5jdGlvbiAoJGVkaXRhYmxlLCB0YWdOYW1lKSB7XG5cdFx0XHRiZWZvcmVDb21tYW5kKCRlZGl0YWJsZSk7XG5cdFx0XHR0YWdOYW1lID0gYWdlbnQuaXNNU0lFID8gJzwnICsgdGFnTmFtZSArICc+JyA6IHRhZ05hbWU7XG5cdFx0XHRkb2N1bWVudC5leGVjQ29tbWFuZCgnRm9ybWF0QmxvY2snLCBmYWxzZSwgdGFnTmFtZSk7XG5cdFx0XHRhZnRlckNvbW1hbmQoJGVkaXRhYmxlKTtcblx0XHR9O1xuXG5cdFx0dGhpcy5mb3JtYXRQYXJhID0gZnVuY3Rpb24gKCRlZGl0YWJsZSkge1xuXHRcdFx0YmVmb3JlQ29tbWFuZCgkZWRpdGFibGUpO1xuXHRcdFx0dGhpcy5mb3JtYXRCbG9jaygkZWRpdGFibGUsICdQJyk7XG5cdFx0XHRhZnRlckNvbW1hbmQoJGVkaXRhYmxlKTtcblx0XHR9O1xuXG5cdFx0LyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuXHRcdGZvciAodmFyIGlkeCA9IDE7IGlkeCA8PSA2OyBpZHgrKykge1xuXHRcdFx0dGhpc1snZm9ybWF0SCcgKyBpZHhdID0gZnVuY3Rpb24gKGlkeCkge1xuXHRcdFx0XHRyZXR1cm4gZnVuY3Rpb24gKCRlZGl0YWJsZSkge1xuXHRcdFx0XHRcdHRoaXMuZm9ybWF0QmxvY2soJGVkaXRhYmxlLCAnSCcgKyBpZHgpO1xuXHRcdFx0XHR9O1xuXHRcdFx0fShpZHgpO1xuXHRcdH07XG5cdFx0LyoganNoaW50IGlnbm9yZTplbmQgKi9cblxuXHRcdC8qKlxuXHRcdCAqIGZvbnRzaXplXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGVkaXRhYmxlXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlIC0gcHhcblx0XHQgKi9cblx0XHR0aGlzLmZvbnRTaXplID0gZnVuY3Rpb24gKCRlZGl0YWJsZSwgdmFsdWUpIHtcblx0XHRcdGJlZm9yZUNvbW1hbmQoJGVkaXRhYmxlKTtcblxuXHRcdFx0dmFyIHJuZyA9IHRoaXMuY3JlYXRlUmFuZ2UoJGVkaXRhYmxlKTtcblx0XHRcdHZhciBzcGFucyA9IHN0eWxlLnN0eWxlTm9kZXMocm5nKTtcblx0XHRcdCQuZWFjaChzcGFucywgZnVuY3Rpb24gKGlkeCwgc3Bhbikge1xuXHRcdFx0XHQkKHNwYW4pLmNzcyh7XG5cdFx0XHRcdFx0J2ZvbnQtc2l6ZSc6IHZhbHVlICsgJ3B4J1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXG5cdFx0XHRhZnRlckNvbW1hbmQoJGVkaXRhYmxlKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogbGluZUhlaWdodFxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkZWRpdGFibGVcblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gdmFsdWVcblx0XHQgKi9cblx0XHR0aGlzLmxpbmVIZWlnaHQgPSBmdW5jdGlvbiAoJGVkaXRhYmxlLCB2YWx1ZSkge1xuXHRcdFx0YmVmb3JlQ29tbWFuZCgkZWRpdGFibGUpO1xuXHRcdFx0c3R5bGUuc3R5bGVQYXJhKHJhbmdlLmNyZWF0ZSgpLCB7XG5cdFx0XHRcdGxpbmVIZWlnaHQ6IHZhbHVlXG5cdFx0XHR9KTtcblx0XHRcdGFmdGVyQ29tbWFuZCgkZWRpdGFibGUpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiB1bmxpbmtcblx0XHQgKlxuXHRcdCAqIEB0eXBlIGNvbW1hbmRcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkZWRpdGFibGVcblx0XHQgKi9cblx0XHR0aGlzLnVubGluayA9IGZ1bmN0aW9uICgkZWRpdGFibGUpIHtcblx0XHRcdHZhciBybmcgPSByYW5nZS5jcmVhdGUoKTtcblx0XHRcdGlmIChybmcuaXNPbkFuY2hvcigpKSB7XG5cdFx0XHRcdHZhciBhbmNob3IgPSBkb20uYW5jZXN0b3Iocm5nLnNjLCBkb20uaXNBbmNob3IpO1xuXHRcdFx0XHRybmcgPSByYW5nZS5jcmVhdGVGcm9tTm9kZShhbmNob3IpO1xuXHRcdFx0XHRybmcuc2VsZWN0KCk7XG5cblx0XHRcdFx0YmVmb3JlQ29tbWFuZCgkZWRpdGFibGUpO1xuXHRcdFx0XHRkb2N1bWVudC5leGVjQ29tbWFuZCgndW5saW5rJyk7XG5cdFx0XHRcdGFmdGVyQ29tbWFuZCgkZWRpdGFibGUpO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBjcmVhdGUgbGluayAoY29tbWFuZClcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkZWRpdGFibGVcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gbGlua0luZm9cblx0XHQgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuXHRcdCAqL1xuXHRcdHRoaXMuY3JlYXRlTGluayA9IGZ1bmN0aW9uICgkZWRpdGFibGUsIGxpbmtJbmZvLCBvcHRpb25zKSB7XG5cdFx0XHR2YXIgbGlua1VybCA9IGxpbmtJbmZvLnVybDtcblx0XHRcdHZhciBsaW5rVGV4dCA9IGxpbmtJbmZvLnRleHQ7XG5cdFx0XHR2YXIgaXNOZXdXaW5kb3cgPSBsaW5rSW5mby5uZXdXaW5kb3c7XG5cdFx0XHR2YXIgcm5nID0gbGlua0luZm8ucmFuZ2U7XG5cdFx0XHR2YXIgaXNUZXh0Q2hhbmdlZCA9IHJuZy50b1N0cmluZygpICE9PSBsaW5rVGV4dDtcblxuXHRcdFx0YmVmb3JlQ29tbWFuZCgkZWRpdGFibGUpO1xuXG5cdFx0XHRpZiAob3B0aW9ucy5vbkNyZWF0ZUxpbmspIHtcblx0XHRcdFx0bGlua1VybCA9IG9wdGlvbnMub25DcmVhdGVMaW5rKGxpbmtVcmwpO1xuXHRcdFx0fVxuXG5cdFx0XHR2YXIgYW5jaG9ycztcblx0XHRcdGlmIChpc1RleHRDaGFuZ2VkKSB7XG5cdFx0XHRcdC8vIENyZWF0ZSBhIG5ldyBsaW5rIHdoZW4gdGV4dCBjaGFuZ2VkLlxuXHRcdFx0XHR2YXIgYW5jaG9yID0gcm5nLmluc2VydE5vZGUoJCgnPEE+JyArIGxpbmtUZXh0ICsgJzwvQT4nKVswXSk7XG5cdFx0XHRcdGFuY2hvcnMgPSBbYW5jaG9yXTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGFuY2hvcnMgPSBzdHlsZS5zdHlsZU5vZGVzKHJuZywge1xuXHRcdFx0XHRcdG5vZGVOYW1lOiAnQScsXG5cdFx0XHRcdFx0ZXhwYW5kQ2xvc2VzdFNpYmxpbmc6IHRydWUsXG5cdFx0XHRcdFx0b25seVBhcnRpYWxDb250YWluczogdHJ1ZVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblxuXHRcdFx0JC5lYWNoKGFuY2hvcnMsIGZ1bmN0aW9uIChpZHgsIGFuY2hvcikge1xuXHRcdFx0XHQkKGFuY2hvcikuYXR0cignaHJlZicsIGxpbmtVcmwpO1xuXHRcdFx0XHRpZiAoaXNOZXdXaW5kb3cpIHtcblx0XHRcdFx0XHQkKGFuY2hvcikuYXR0cigndGFyZ2V0JywgJ19ibGFuaycpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdCQoYW5jaG9yKS5yZW1vdmVBdHRyKCd0YXJnZXQnKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cblx0XHRcdHZhciBzdGFydFJhbmdlID0gcmFuZ2UuY3JlYXRlRnJvbU5vZGUobGlzdC5oZWFkKGFuY2hvcnMpKS5jb2xsYXBzZSh0cnVlKTtcblx0XHRcdHZhciBzdGFydFBvaW50ID0gc3RhcnRSYW5nZS5nZXRTdGFydFBvaW50KCk7XG5cdFx0XHR2YXIgZW5kUmFuZ2UgPSByYW5nZS5jcmVhdGVGcm9tTm9kZShsaXN0Lmxhc3QoYW5jaG9ycykpLmNvbGxhcHNlKCk7XG5cdFx0XHR2YXIgZW5kUG9pbnQgPSBlbmRSYW5nZS5nZXRFbmRQb2ludCgpO1xuXG5cdFx0XHRyYW5nZS5jcmVhdGUoXG5cdFx0XHQgIHN0YXJ0UG9pbnQubm9kZSxcblx0XHRcdCAgc3RhcnRQb2ludC5vZmZzZXQsXG5cdFx0XHQgIGVuZFBvaW50Lm5vZGUsXG5cdFx0XHQgIGVuZFBvaW50Lm9mZnNldFxuXHRcdFx0KS5zZWxlY3QoKTtcblxuXHRcdFx0YWZ0ZXJDb21tYW5kKCRlZGl0YWJsZSk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIHJldHVybnMgbGluayBpbmZvXG5cdFx0ICpcblx0XHQgKiBAcmV0dXJuIHtPYmplY3R9XG5cdFx0ICogQHJldHVybiB7V3JhcHBlZFJhbmdlfSByZXR1cm4ucmFuZ2Vcblx0XHQgKiBAcmV0dXJuIHtTdHJpbmd9IHJldHVybi50ZXh0XG5cdFx0ICogQHJldHVybiB7Qm9vbGVhbn0gW3JldHVybi5pc05ld1dpbmRvdz10cnVlXVxuXHRcdCAqIEByZXR1cm4ge1N0cmluZ30gW3JldHVybi51cmw9XCJcIl1cblx0XHQgKi9cblx0XHR0aGlzLmdldExpbmtJbmZvID0gZnVuY3Rpb24gKCRlZGl0YWJsZSkge1xuXHRcdFx0JGVkaXRhYmxlLmZvY3VzKCk7XG5cblx0XHRcdHZhciBybmcgPSByYW5nZS5jcmVhdGUoKS5leHBhbmQoZG9tLmlzQW5jaG9yKTtcblxuXHRcdFx0Ly8gR2V0IHRoZSBmaXJzdCBhbmNob3Igb24gcmFuZ2UoZm9yIGVkaXQpLlxuXHRcdFx0dmFyICRhbmNob3IgPSAkKGxpc3QuaGVhZChybmcubm9kZXMoZG9tLmlzQW5jaG9yKSkpO1xuXG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRyYW5nZTogcm5nLFxuXHRcdFx0XHR0ZXh0OiBybmcudG9TdHJpbmcoKSxcblx0XHRcdFx0aXNOZXdXaW5kb3c6ICRhbmNob3IubGVuZ3RoID8gJGFuY2hvci5hdHRyKCd0YXJnZXQnKSA9PT0gJ19ibGFuaycgOiBmYWxzZSxcblx0XHRcdFx0dXJsOiAkYW5jaG9yLmxlbmd0aCA/ICRhbmNob3IuYXR0cignaHJlZicpIDogJydcblx0XHRcdH07XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIHNldHRpbmcgY29sb3Jcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7Tm9kZX0gJGVkaXRhYmxlXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IHNPYmpDb2xvciAgY29sb3IgY29kZVxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSBzT2JqQ29sb3IuZm9yZUNvbG9yIGZvcmVncm91bmQgY29sb3Jcblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gc09iakNvbG9yLmJhY2tDb2xvciBiYWNrZ3JvdW5kIGNvbG9yXG5cdFx0ICovXG5cdFx0dGhpcy5jb2xvciA9IGZ1bmN0aW9uICgkZWRpdGFibGUsIHNPYmpDb2xvcikge1xuXHRcdFx0dmFyIG9Db2xvciA9IEpTT04ucGFyc2Uoc09iakNvbG9yKTtcblx0XHRcdHZhciBmb3JlQ29sb3IgPSBvQ29sb3IuZm9yZUNvbG9yLCBiYWNrQ29sb3IgPSBvQ29sb3IuYmFja0NvbG9yO1xuXG5cdFx0XHRiZWZvcmVDb21tYW5kKCRlZGl0YWJsZSk7XG5cblx0XHRcdGlmIChmb3JlQ29sb3IpIHsgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2ZvcmVDb2xvcicsIGZhbHNlLCBmb3JlQ29sb3IpOyB9XG5cdFx0XHRpZiAoYmFja0NvbG9yKSB7IGRvY3VtZW50LmV4ZWNDb21tYW5kKCdiYWNrQ29sb3InLCBmYWxzZSwgYmFja0NvbG9yKTsgfVxuXG5cdFx0XHRhZnRlckNvbW1hbmQoJGVkaXRhYmxlKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogaW5zZXJ0IFRhYmxlXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge05vZGV9ICRlZGl0YWJsZVxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSBzRGltIGRpbWVuc2lvbiBvZiB0YWJsZSAoZXggOiBcIjV4NVwiKVxuXHRcdCAqL1xuXHRcdHRoaXMuaW5zZXJ0VGFibGUgPSBmdW5jdGlvbiAoJGVkaXRhYmxlLCBzRGltKSB7XG5cdFx0XHR2YXIgZGltZW5zaW9uID0gc0RpbS5zcGxpdCgneCcpO1xuXHRcdFx0YmVmb3JlQ29tbWFuZCgkZWRpdGFibGUpO1xuXG5cdFx0XHR2YXIgcm5nID0gcmFuZ2UuY3JlYXRlKCk7XG5cdFx0XHRybmcgPSBybmcuZGVsZXRlQ29udGVudHMoKTtcblx0XHRcdHJuZy5pbnNlcnROb2RlKHRhYmxlLmNyZWF0ZVRhYmxlKGRpbWVuc2lvblswXSwgZGltZW5zaW9uWzFdKSk7XG5cdFx0XHRhZnRlckNvbW1hbmQoJGVkaXRhYmxlKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogZmxvYXQgbWVcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkZWRpdGFibGVcblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gdmFsdWVcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJHRhcmdldFxuXHRcdCAqL1xuXHRcdHRoaXMuZmxvYXRNZSA9IGZ1bmN0aW9uICgkZWRpdGFibGUsIHZhbHVlLCAkdGFyZ2V0KSB7XG5cdFx0XHRiZWZvcmVDb21tYW5kKCRlZGl0YWJsZSk7XG5cdFx0XHQkdGFyZ2V0LmNzcygnZmxvYXQnLCB2YWx1ZSk7XG5cdFx0XHRhZnRlckNvbW1hbmQoJGVkaXRhYmxlKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogY2hhbmdlIGltYWdlIHNoYXBlXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGVkaXRhYmxlXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlIGNzcyBjbGFzc1xuXHRcdCAqIEBwYXJhbSB7Tm9kZX0gJHRhcmdldFxuXHRcdCAqL1xuXHRcdHRoaXMuaW1hZ2VTaGFwZSA9IGZ1bmN0aW9uICgkZWRpdGFibGUsIHZhbHVlLCAkdGFyZ2V0KSB7XG5cdFx0XHRiZWZvcmVDb21tYW5kKCRlZGl0YWJsZSk7XG5cblx0XHRcdCR0YXJnZXQucmVtb3ZlQ2xhc3MoJ2ltZy1yb3VuZGVkIGltZy1jaXJjbGUgaW1nLXRodW1ibmFpbCcpO1xuXG5cdFx0XHRpZiAodmFsdWUpIHtcblx0XHRcdFx0JHRhcmdldC5hZGRDbGFzcyh2YWx1ZSk7XG5cdFx0XHR9XG5cblx0XHRcdGFmdGVyQ29tbWFuZCgkZWRpdGFibGUpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiByZXNpemUgb3ZlcmxheSBlbGVtZW50XG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRlZGl0YWJsZVxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSB2YWx1ZVxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkdGFyZ2V0IC0gdGFyZ2V0IGVsZW1lbnRcblx0XHQgKi9cblx0XHR0aGlzLnJlc2l6ZSA9IGZ1bmN0aW9uICgkZWRpdGFibGUsIHZhbHVlLCAkdGFyZ2V0KSB7XG5cdFx0XHRiZWZvcmVDb21tYW5kKCRlZGl0YWJsZSk7XG5cblx0XHRcdCR0YXJnZXQuY3NzKHtcblx0XHRcdFx0d2lkdGg6IHZhbHVlICogMTAwICsgJyUnLFxuXHRcdFx0XHRoZWlnaHQ6ICcnXG5cdFx0XHR9KTtcblxuXHRcdFx0YWZ0ZXJDb21tYW5kKCRlZGl0YWJsZSk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIEBwYXJhbSB7UG9zaXRpb259IHBvc1xuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkdGFyZ2V0IC0gdGFyZ2V0IGVsZW1lbnRcblx0XHQgKiBAcGFyYW0ge0Jvb2xlYW59IFtiS2VlcFJhdGlvXSAtIGtlZXAgcmF0aW9cblx0XHQgKi9cblx0XHR0aGlzLnJlc2l6ZVRvID0gZnVuY3Rpb24gKHBvcywgJHRhcmdldCwgYktlZXBSYXRpbykge1xuXHRcdFx0dmFyIGltYWdlU2l6ZTtcblx0XHRcdGlmIChiS2VlcFJhdGlvKSB7XG5cdFx0XHRcdHZhciBuZXdSYXRpbyA9IHBvcy55IC8gcG9zLng7XG5cdFx0XHRcdHZhciByYXRpbyA9ICR0YXJnZXQuZGF0YSgncmF0aW8nKTtcblx0XHRcdFx0aW1hZ2VTaXplID0ge1xuXHRcdFx0XHRcdHdpZHRoOiByYXRpbyA+IG5ld1JhdGlvID8gcG9zLnggOiBwb3MueSAvIHJhdGlvLFxuXHRcdFx0XHRcdGhlaWdodDogcmF0aW8gPiBuZXdSYXRpbyA/IHBvcy54ICogcmF0aW8gOiBwb3MueVxuXHRcdFx0XHR9O1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aW1hZ2VTaXplID0ge1xuXHRcdFx0XHRcdHdpZHRoOiBwb3MueCxcblx0XHRcdFx0XHRoZWlnaHQ6IHBvcy55XG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cblx0XHRcdCR0YXJnZXQuY3NzKGltYWdlU2l6ZSk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIHJlbW92ZSBtZWRpYSBvYmplY3Rcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkZWRpdGFibGVcblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gdmFsdWUgLSBkdW1teSBhcmd1bWVudCAoZm9yIGtlZXAgaW50ZXJmYWNlKVxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkdGFyZ2V0IC0gdGFyZ2V0IGVsZW1lbnRcblx0XHQgKi9cblx0XHR0aGlzLnJlbW92ZU1lZGlhID0gZnVuY3Rpb24gKCRlZGl0YWJsZSwgdmFsdWUsICR0YXJnZXQpIHtcblx0XHRcdGJlZm9yZUNvbW1hbmQoJGVkaXRhYmxlKTtcblx0XHRcdCR0YXJnZXQuZGV0YWNoKCk7XG5cblx0XHRcdHZhciBjYWxsYmFja3MgPSAkZWRpdGFibGUuZGF0YSgnY2FsbGJhY2tzJyk7XG5cdFx0XHRpZiAoY2FsbGJhY2tzICYmIGNhbGxiYWNrcy5vbk1lZGlhRGVsZXRlKSB7XG5cdFx0XHRcdGNhbGxiYWNrcy5vbk1lZGlhRGVsZXRlKCR0YXJnZXQsIHRoaXMsICRlZGl0YWJsZSk7XG5cdFx0XHR9XG5cblx0XHRcdGFmdGVyQ29tbWFuZCgkZWRpdGFibGUpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBzZXQgZm9jdXNcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSAkZWRpdGFibGVcblx0XHQgKi9cblx0XHR0aGlzLmZvY3VzID0gZnVuY3Rpb24gKCRlZGl0YWJsZSkge1xuXHRcdFx0JGVkaXRhYmxlLmZvY3VzKCk7XG5cdFx0fTtcblx0fTtcblxuXHQvKipcblx0ICogQGNsYXNzIG1vZHVsZS5CdXR0b25cblx0ICpcblx0ICogQnV0dG9uXG5cdCAqL1xuXHR2YXIgQnV0dG9uID0gZnVuY3Rpb24gKCkge1xuXHRcdC8qKlxuXHRcdCAqIHVwZGF0ZSBidXR0b24gc3RhdHVzXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGNvbnRhaW5lclxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBzdHlsZUluZm9cblx0XHQgKi9cblx0XHR0aGlzLnVwZGF0ZSA9IGZ1bmN0aW9uICgkY29udGFpbmVyLCBzdHlsZUluZm8pIHtcblx0XHRcdC8qKlxuXHRcdFx0ICogaGFuZGxlIGRyb3Bkb3duJ3MgY2hlY2sgbWFyayAoZm9yIGZvbnRuYW1lLCBmb250c2l6ZSwgbGluZUhlaWdodCkuXG5cdFx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGJ0blxuXHRcdFx0ICogQHBhcmFtIHtOdW1iZXJ9IHZhbHVlXG5cdFx0XHQgKi9cblx0XHRcdHZhciBjaGVja0Ryb3Bkb3duTWVudSA9IGZ1bmN0aW9uICgkYnRuLCB2YWx1ZSkge1xuXHRcdFx0XHQkYnRuLmZpbmQoJy5kcm9wZG93bi1tZW51IGxpIGEnKS5lYWNoKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHQvLyBhbHdheXMgY29tcGFyZSBzdHJpbmcgdG8gYXZvaWQgY3JlYXRpbmcgYW5vdGhlciBmdW5jLlxuXHRcdFx0XHRcdHZhciBpc0NoZWNrZWQgPSAoJCh0aGlzKS5kYXRhKCd2YWx1ZScpICsgJycpID09PSAodmFsdWUgKyAnJyk7XG5cdFx0XHRcdFx0dGhpcy5jbGFzc05hbWUgPSBpc0NoZWNrZWQgPyAnY2hlY2tlZCcgOiAnJztcblx0XHRcdFx0fSk7XG5cdFx0XHR9O1xuXG5cdFx0XHQvKipcblx0XHRcdCAqIHVwZGF0ZSBidXR0b24gc3RhdGUoYWN0aXZlIG9yIG5vdCkuXG5cdFx0XHQgKlxuXHRcdFx0ICogQHByaXZhdGVcblx0XHRcdCAqIEBwYXJhbSB7U3RyaW5nfSBzZWxlY3RvclxuXHRcdFx0ICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZFxuXHRcdFx0ICovXG5cdFx0XHR2YXIgYnRuU3RhdGUgPSBmdW5jdGlvbiAoc2VsZWN0b3IsIHByZWQpIHtcblx0XHRcdFx0dmFyICRidG4gPSAkY29udGFpbmVyLmZpbmQoc2VsZWN0b3IpO1xuXHRcdFx0XHQkYnRuLnRvZ2dsZUNsYXNzKCdhY3RpdmUnLCBwcmVkKCkpO1xuXHRcdFx0fTtcblxuXHRcdFx0aWYgKHN0eWxlSW5mby5pbWFnZSkge1xuXHRcdFx0XHR2YXIgJGltZyA9ICQoc3R5bGVJbmZvLmltYWdlKTtcblxuXHRcdFx0XHRidG5TdGF0ZSgnYnV0dG9uW2RhdGEtZXZlbnQ9XCJpbWFnZVNoYXBlXCJdW2RhdGEtdmFsdWU9XCJpbWctcm91bmRlZFwiXScsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRyZXR1cm4gJGltZy5oYXNDbGFzcygnaW1nLXJvdW5kZWQnKTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGJ0blN0YXRlKCdidXR0b25bZGF0YS1ldmVudD1cImltYWdlU2hhcGVcIl1bZGF0YS12YWx1ZT1cImltZy1jaXJjbGVcIl0nLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0cmV0dXJuICRpbWcuaGFzQ2xhc3MoJ2ltZy1jaXJjbGUnKTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGJ0blN0YXRlKCdidXR0b25bZGF0YS1ldmVudD1cImltYWdlU2hhcGVcIl1bZGF0YS12YWx1ZT1cImltZy10aHVtYm5haWxcIl0nLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0cmV0dXJuICRpbWcuaGFzQ2xhc3MoJ2ltZy10aHVtYm5haWwnKTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGJ0blN0YXRlKCdidXR0b25bZGF0YS1ldmVudD1cImltYWdlU2hhcGVcIl06bm90KFtkYXRhLXZhbHVlXSknLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0cmV0dXJuICEkaW1nLmlzKCcuaW1nLXJvdW5kZWQsIC5pbWctY2lyY2xlLCAuaW1nLXRodW1ibmFpbCcpO1xuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHR2YXIgaW1nRmxvYXQgPSAkaW1nLmNzcygnZmxvYXQnKTtcblx0XHRcdFx0YnRuU3RhdGUoJ2J1dHRvbltkYXRhLWV2ZW50PVwiZmxvYXRNZVwiXVtkYXRhLXZhbHVlPVwibGVmdFwiXScsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRyZXR1cm4gaW1nRmxvYXQgPT09ICdsZWZ0Jztcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGJ0blN0YXRlKCdidXR0b25bZGF0YS1ldmVudD1cImZsb2F0TWVcIl1bZGF0YS12YWx1ZT1cInJpZ2h0XCJdJywgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdHJldHVybiBpbWdGbG9hdCA9PT0gJ3JpZ2h0Jztcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGJ0blN0YXRlKCdidXR0b25bZGF0YS1ldmVudD1cImZsb2F0TWVcIl1bZGF0YS12YWx1ZT1cIm5vbmVcIl0nLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGltZ0Zsb2F0ICE9PSAnbGVmdCcgJiYgaW1nRmxvYXQgIT09ICdyaWdodCc7XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdHZhciBzdHlsZSA9ICRpbWcuYXR0cignc3R5bGUnKTtcblx0XHRcdFx0YnRuU3RhdGUoJ2J1dHRvbltkYXRhLWV2ZW50PVwicmVzaXplXCJdW2RhdGEtdmFsdWU9XCIxXCJdJywgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdHJldHVybiAhIS8oXnxcXHMpKG1heC0pP3dpZHRoXFxzKjpcXHMqMTAwJS8udGVzdChzdHlsZSk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRidG5TdGF0ZSgnYnV0dG9uW2RhdGEtZXZlbnQ9XCJyZXNpemVcIl1bZGF0YS12YWx1ZT1cIjAuNVwiXScsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRyZXR1cm4gISEvKF58XFxzKShtYXgtKT93aWR0aFxccyo6XFxzKjUwJS8udGVzdChzdHlsZSk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRidG5TdGF0ZSgnYnV0dG9uW2RhdGEtZXZlbnQ9XCJyZXNpemVcIl1bZGF0YS12YWx1ZT1cIjAuMjVcIl0nLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0cmV0dXJuICEhLyhefFxccykobWF4LSk/d2lkdGhcXHMqOlxccyoyNSUvLnRlc3Qoc3R5bGUpO1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBmb250bmFtZVxuXHRcdFx0dmFyICRmb250bmFtZSA9ICRjb250YWluZXIuZmluZCgnLm5vdGUtZm9udG5hbWUnKTtcblx0XHRcdGlmICgkZm9udG5hbWUubGVuZ3RoKSB7XG5cdFx0XHRcdHZhciBzZWxlY3RlZEZvbnQgPSBzdHlsZUluZm9bJ2ZvbnQtZmFtaWx5J107XG5cdFx0XHRcdGlmICghIXNlbGVjdGVkRm9udCkge1xuXG5cdFx0XHRcdFx0dmFyIGxpc3QgPSBzZWxlY3RlZEZvbnQuc3BsaXQoJywnKTtcblx0XHRcdFx0XHRmb3IgKHZhciBpID0gMCwgbGVuID0gbGlzdC5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuXHRcdFx0XHRcdFx0c2VsZWN0ZWRGb250ID0gbGlzdFtpXS5yZXBsYWNlKC9bXFwnXFxcIl0vZywgJycpLnJlcGxhY2UoL1xccyskLywgJycpLnJlcGxhY2UoL15cXHMrLywgJycpO1xuXHRcdFx0XHRcdFx0aWYgKGFnZW50LmlzRm9udEluc3RhbGxlZChzZWxlY3RlZEZvbnQpKSB7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdCRmb250bmFtZS5maW5kKCcubm90ZS1jdXJyZW50LWZvbnRuYW1lJykudGV4dChzZWxlY3RlZEZvbnQpO1xuXHRcdFx0XHRcdGNoZWNrRHJvcGRvd25NZW51KCRmb250bmFtZSwgc2VsZWN0ZWRGb250KTtcblxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIGZvbnRzaXplXG5cdFx0XHR2YXIgJGZvbnRzaXplID0gJGNvbnRhaW5lci5maW5kKCcubm90ZS1mb250c2l6ZScpO1xuXHRcdFx0JGZvbnRzaXplLmZpbmQoJy5ub3RlLWN1cnJlbnQtZm9udHNpemUnKS50ZXh0KHN0eWxlSW5mb1snZm9udC1zaXplJ10pO1xuXHRcdFx0Y2hlY2tEcm9wZG93bk1lbnUoJGZvbnRzaXplLCBwYXJzZUZsb2F0KHN0eWxlSW5mb1snZm9udC1zaXplJ10pKTtcblxuXHRcdFx0Ly8gbGluZWhlaWdodFxuXHRcdFx0dmFyICRsaW5lSGVpZ2h0ID0gJGNvbnRhaW5lci5maW5kKCcubm90ZS1oZWlnaHQnKTtcblx0XHRcdGNoZWNrRHJvcGRvd25NZW51KCRsaW5lSGVpZ2h0LCBwYXJzZUZsb2F0KHN0eWxlSW5mb1snbGluZS1oZWlnaHQnXSkpO1xuXG5cdFx0XHRidG5TdGF0ZSgnYnV0dG9uW2RhdGEtZXZlbnQ9XCJib2xkXCJdJywgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRyZXR1cm4gc3R5bGVJbmZvWydmb250LWJvbGQnXSA9PT0gJ2JvbGQnO1xuXHRcdFx0fSk7XG5cdFx0XHRidG5TdGF0ZSgnYnV0dG9uW2RhdGEtZXZlbnQ9XCJpdGFsaWNcIl0nLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHJldHVybiBzdHlsZUluZm9bJ2ZvbnQtaXRhbGljJ10gPT09ICdpdGFsaWMnO1xuXHRcdFx0fSk7XG5cdFx0XHRidG5TdGF0ZSgnYnV0dG9uW2RhdGEtZXZlbnQ9XCJ1bmRlcmxpbmVcIl0nLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHJldHVybiBzdHlsZUluZm9bJ2ZvbnQtdW5kZXJsaW5lJ10gPT09ICd1bmRlcmxpbmUnO1xuXHRcdFx0fSk7XG5cdFx0XHRidG5TdGF0ZSgnYnV0dG9uW2RhdGEtZXZlbnQ9XCJzdHJpa2V0aHJvdWdoXCJdJywgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRyZXR1cm4gc3R5bGVJbmZvWydmb250LXN0cmlrZXRocm91Z2gnXSA9PT0gJ3N0cmlrZXRocm91Z2gnO1xuXHRcdFx0fSk7XG5cdFx0XHRidG5TdGF0ZSgnYnV0dG9uW2RhdGEtZXZlbnQ9XCJzdXBlcnNjcmlwdFwiXScsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0cmV0dXJuIHN0eWxlSW5mb1snZm9udC1zdXBlcnNjcmlwdCddID09PSAnc3VwZXJzY3JpcHQnO1xuXHRcdFx0fSk7XG5cdFx0XHRidG5TdGF0ZSgnYnV0dG9uW2RhdGEtZXZlbnQ9XCJzdWJzY3JpcHRcIl0nLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHJldHVybiBzdHlsZUluZm9bJ2ZvbnQtc3Vic2NyaXB0J10gPT09ICdzdWJzY3JpcHQnO1xuXHRcdFx0fSk7XG5cdFx0XHRidG5TdGF0ZSgnYnV0dG9uW2RhdGEtZXZlbnQ9XCJqdXN0aWZ5TGVmdFwiXScsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0cmV0dXJuIHN0eWxlSW5mb1sndGV4dC1hbGlnbiddID09PSAnbGVmdCcgfHwgc3R5bGVJbmZvWyd0ZXh0LWFsaWduJ10gPT09ICdzdGFydCc7XG5cdFx0XHR9KTtcblx0XHRcdGJ0blN0YXRlKCdidXR0b25bZGF0YS1ldmVudD1cImp1c3RpZnlDZW50ZXJcIl0nLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHJldHVybiBzdHlsZUluZm9bJ3RleHQtYWxpZ24nXSA9PT0gJ2NlbnRlcic7XG5cdFx0XHR9KTtcblx0XHRcdGJ0blN0YXRlKCdidXR0b25bZGF0YS1ldmVudD1cImp1c3RpZnlSaWdodFwiXScsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0cmV0dXJuIHN0eWxlSW5mb1sndGV4dC1hbGlnbiddID09PSAncmlnaHQnO1xuXHRcdFx0fSk7XG5cdFx0XHRidG5TdGF0ZSgnYnV0dG9uW2RhdGEtZXZlbnQ9XCJqdXN0aWZ5RnVsbFwiXScsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0cmV0dXJuIHN0eWxlSW5mb1sndGV4dC1hbGlnbiddID09PSAnanVzdGlmeSc7XG5cdFx0XHR9KTtcblx0XHRcdGJ0blN0YXRlKCdidXR0b25bZGF0YS1ldmVudD1cImluc2VydFVub3JkZXJlZExpc3RcIl0nLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHJldHVybiBzdHlsZUluZm9bJ2xpc3Qtc3R5bGUnXSA9PT0gJ3Vub3JkZXJlZCc7XG5cdFx0XHR9KTtcblx0XHRcdGJ0blN0YXRlKCdidXR0b25bZGF0YS1ldmVudD1cImluc2VydE9yZGVyZWRMaXN0XCJdJywgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRyZXR1cm4gc3R5bGVJbmZvWydsaXN0LXN0eWxlJ10gPT09ICdvcmRlcmVkJztcblx0XHRcdH0pO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiB1cGRhdGUgcmVjZW50IGNvbG9yXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge05vZGV9IGJ1dHRvblxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSBldmVudE5hbWVcblx0XHQgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuXHRcdCAqL1xuXHRcdHRoaXMudXBkYXRlUmVjZW50Q29sb3IgPSBmdW5jdGlvbiAoYnV0dG9uLCBldmVudE5hbWUsIHZhbHVlKSB7XG5cdFx0XHR2YXIgJGNvbG9yID0gJChidXR0b24pLmNsb3Nlc3QoJy5ub3RlLWNvbG9yJyk7XG5cdFx0XHR2YXIgJHJlY2VudENvbG9yID0gJGNvbG9yLmZpbmQoJy5ub3RlLXJlY2VudC1jb2xvcicpO1xuXHRcdFx0dmFyIGNvbG9ySW5mbyA9IEpTT04ucGFyc2UoJHJlY2VudENvbG9yLmF0dHIoJ2RhdGEtdmFsdWUnKSk7XG5cdFx0XHRjb2xvckluZm9bZXZlbnROYW1lXSA9IHZhbHVlO1xuXHRcdFx0JHJlY2VudENvbG9yLmF0dHIoJ2RhdGEtdmFsdWUnLCBKU09OLnN0cmluZ2lmeShjb2xvckluZm8pKTtcblx0XHRcdHZhciBzS2V5ID0gZXZlbnROYW1lID09PSAnYmFja0NvbG9yJyA/ICdiYWNrZ3JvdW5kLWNvbG9yJyA6ICdjb2xvcic7XG5cdFx0XHQkcmVjZW50Q29sb3IuZmluZCgnaScpLmNzcyhzS2V5LCB2YWx1ZSk7XG5cdFx0fTtcblx0fTtcblxuXHQvKipcblx0ICogQGNsYXNzIG1vZHVsZS5Ub29sYmFyXG5cdCAqXG5cdCAqIFRvb2xiYXJcblx0ICovXG5cdHZhciBUb29sYmFyID0gZnVuY3Rpb24gKCkge1xuXHRcdHZhciBidXR0b24gPSBuZXcgQnV0dG9uKCk7XG5cblx0XHR0aGlzLnVwZGF0ZSA9IGZ1bmN0aW9uICgkdG9vbGJhciwgc3R5bGVJbmZvKSB7XG5cdFx0XHRidXR0b24udXBkYXRlKCR0b29sYmFyLCBzdHlsZUluZm8pO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBAcGFyYW0ge05vZGV9IGJ1dHRvblxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSBldmVudE5hbWVcblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gdmFsdWVcblx0XHQgKi9cblx0XHR0aGlzLnVwZGF0ZVJlY2VudENvbG9yID0gZnVuY3Rpb24gKGJ1dHRvbk5vZGUsIGV2ZW50TmFtZSwgdmFsdWUpIHtcblx0XHRcdGJ1dHRvbi51cGRhdGVSZWNlbnRDb2xvcihidXR0b25Ob2RlLCBldmVudE5hbWUsIHZhbHVlKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogYWN0aXZhdGUgYnV0dG9ucyBleGNsdWRlIGNvZGV2aWV3XG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICR0b29sYmFyXG5cdFx0ICovXG5cdFx0dGhpcy5hY3RpdmF0ZSA9IGZ1bmN0aW9uICgkdG9vbGJhcikge1xuXHRcdFx0JHRvb2xiYXIuZmluZCgnYnV0dG9uJylcblx0XHRcdFx0XHQubm90KCdidXR0b25bZGF0YS1ldmVudD1cImNvZGV2aWV3XCJdJylcblx0XHRcdFx0XHQucmVtb3ZlQ2xhc3MoJ2Rpc2FibGVkJyk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIGRlYWN0aXZhdGUgYnV0dG9ucyBleGNsdWRlIGNvZGV2aWV3XG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICR0b29sYmFyXG5cdFx0ICovXG5cdFx0dGhpcy5kZWFjdGl2YXRlID0gZnVuY3Rpb24gKCR0b29sYmFyKSB7XG5cdFx0XHQkdG9vbGJhci5maW5kKCdidXR0b24nKVxuXHRcdFx0XHRcdC5ub3QoJ2J1dHRvbltkYXRhLWV2ZW50PVwiY29kZXZpZXdcIl0nKVxuXHRcdFx0XHRcdC5hZGRDbGFzcygnZGlzYWJsZWQnKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRjb250YWluZXJcblx0XHQgKiBAcGFyYW0ge0Jvb2xlYW59IFtiRnVsbHNjcmVlbj1mYWxzZV1cblx0XHQgKi9cblx0XHR0aGlzLnVwZGF0ZUZ1bGxzY3JlZW4gPSBmdW5jdGlvbiAoJGNvbnRhaW5lciwgYkZ1bGxzY3JlZW4pIHtcblx0XHRcdHZhciAkYnRuID0gJGNvbnRhaW5lci5maW5kKCdidXR0b25bZGF0YS1ldmVudD1cImZ1bGxzY3JlZW5cIl0nKTtcblx0XHRcdCRidG4udG9nZ2xlQ2xhc3MoJ2FjdGl2ZScsIGJGdWxsc2NyZWVuKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRjb250YWluZXJcblx0XHQgKiBAcGFyYW0ge0Jvb2xlYW59IFtpc0NvZGV2aWV3PWZhbHNlXVxuXHRcdCAqL1xuXHRcdHRoaXMudXBkYXRlQ29kZXZpZXcgPSBmdW5jdGlvbiAoJGNvbnRhaW5lciwgaXNDb2Rldmlldykge1xuXHRcdFx0dmFyICRidG4gPSAkY29udGFpbmVyLmZpbmQoJ2J1dHRvbltkYXRhLWV2ZW50PVwiY29kZXZpZXdcIl0nKTtcblx0XHRcdCRidG4udG9nZ2xlQ2xhc3MoJ2FjdGl2ZScsIGlzQ29kZXZpZXcpO1xuXG5cdFx0XHRpZiAoaXNDb2Rldmlldykge1xuXHRcdFx0XHR0aGlzLmRlYWN0aXZhdGUoJGNvbnRhaW5lcik7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGlzLmFjdGl2YXRlKCRjb250YWluZXIpO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBnZXQgYnV0dG9uIGluIHRvb2xiYXIgXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGVkaXRhYmxlXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcblx0XHQgKiBAcmV0dXJuIHtqUXVlcnl9XG5cdFx0ICovXG5cdFx0dGhpcy5nZXQgPSBmdW5jdGlvbiAoJGVkaXRhYmxlLCBuYW1lKSB7XG5cdFx0XHR2YXIgJHRvb2xiYXIgPSBkb20ubWFrZUxheW91dEluZm8oJGVkaXRhYmxlKS50b29sYmFyKCk7XG5cblx0XHRcdHJldHVybiAkdG9vbGJhci5maW5kKCdbZGF0YS1uYW1lPScgKyBuYW1lICsgJ10nKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogc2V0IGJ1dHRvbiBzdGF0ZVxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkZWRpdGFibGVcblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuXHRcdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW2lzQWN0aXZlPXRydWVdXG5cdFx0ICovXG5cdFx0dGhpcy5zZXRCdXR0b25TdGF0ZSA9IGZ1bmN0aW9uICgkZWRpdGFibGUsIG5hbWUsIGlzQWN0aXZlKSB7XG5cdFx0XHRpc0FjdGl2ZSA9IChpc0FjdGl2ZSA9PT0gZmFsc2UpID8gZmFsc2UgOiB0cnVlO1xuXG5cdFx0XHR2YXIgJGJ1dHRvbiA9IHRoaXMuZ2V0KCRlZGl0YWJsZSwgbmFtZSk7XG5cdFx0XHQkYnV0dG9uLnRvZ2dsZUNsYXNzKCdhY3RpdmUnLCBpc0FjdGl2ZSk7XG5cdFx0fTtcblx0fTtcblxuXHR2YXIgRURJVEFCTEVfUEFERElORyA9IDI0O1xuXG5cdHZhciBTdGF0dXNiYXIgPSBmdW5jdGlvbiAoKSB7XG5cdFx0dmFyICRkb2N1bWVudCA9ICQoZG9jdW1lbnQpO1xuXG5cdFx0dGhpcy5hdHRhY2ggPSBmdW5jdGlvbiAobGF5b3V0SW5mbywgb3B0aW9ucykge1xuXHRcdFx0aWYgKCFvcHRpb25zLmRpc2FibGVSZXNpemVFZGl0b3IpIHtcblx0XHRcdFx0bGF5b3V0SW5mby5zdGF0dXNiYXIoKS5vbignbW91c2Vkb3duJywgaFN0YXR1c2Jhck1vdXNlZG93bik7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIGBtb3VzZWRvd25gIGV2ZW50IGhhbmRsZXIgb24gc3RhdHVzYmFyXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGV2ZW50XG5cdFx0ICovXG5cdFx0dmFyIGhTdGF0dXNiYXJNb3VzZWRvd24gPSBmdW5jdGlvbiAoZXZlbnQpIHtcblx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuXHRcdFx0dmFyICRlZGl0YWJsZSA9IGRvbS5tYWtlTGF5b3V0SW5mbyhldmVudC50YXJnZXQpLmVkaXRhYmxlKCk7XG5cdFx0XHR2YXIgZWRpdGFibGVUb3AgPSAkZWRpdGFibGUub2Zmc2V0KCkudG9wIC0gJGRvY3VtZW50LnNjcm9sbFRvcCgpO1xuXG5cdFx0XHR2YXIgbGF5b3V0SW5mbyA9IGRvbS5tYWtlTGF5b3V0SW5mbyhldmVudC5jdXJyZW50VGFyZ2V0IHx8IGV2ZW50LnRhcmdldCk7XG5cdFx0XHR2YXIgb3B0aW9ucyA9IGxheW91dEluZm8uZWRpdG9yKCkuZGF0YSgnb3B0aW9ucycpO1xuXG5cdFx0XHQkZG9jdW1lbnQub24oJ21vdXNlbW92ZScsIGZ1bmN0aW9uIChldmVudCkge1xuXHRcdFx0XHR2YXIgbkhlaWdodCA9IGV2ZW50LmNsaWVudFkgLSAoZWRpdGFibGVUb3AgKyBFRElUQUJMRV9QQURESU5HKTtcblxuXHRcdFx0XHRuSGVpZ2h0ID0gKG9wdGlvbnMubWluSGVpZ2h0ID4gMCkgPyBNYXRoLm1heChuSGVpZ2h0LCBvcHRpb25zLm1pbkhlaWdodCkgOiBuSGVpZ2h0O1xuXHRcdFx0XHRuSGVpZ2h0ID0gKG9wdGlvbnMubWF4SGVpZ2h0ID4gMCkgPyBNYXRoLm1pbihuSGVpZ2h0LCBvcHRpb25zLm1heEhlaWdodCkgOiBuSGVpZ2h0O1xuXG5cdFx0XHRcdCRlZGl0YWJsZS5oZWlnaHQobkhlaWdodCk7XG5cdFx0XHR9KS5vbmUoJ21vdXNldXAnLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdCRkb2N1bWVudC5vZmYoJ21vdXNlbW92ZScpO1xuXHRcdFx0fSk7XG5cdFx0fTtcblx0fTtcblxuXHQvKipcblx0ICogQGNsYXNzIG1vZHVsZS5Qb3BvdmVyXG5cdCAqXG5cdCAqIFBvcG92ZXIgKGh0dHA6Ly9nZXRib290c3RyYXAuY29tL2phdmFzY3JpcHQvI3BvcG92ZXJzKVxuXHQgKlxuXHQgKi9cblx0dmFyIFBvcG92ZXIgPSBmdW5jdGlvbiAoKSB7XG5cdFx0dmFyIGJ1dHRvbiA9IG5ldyBCdXR0b24oKTtcblxuXHRcdC8qKlxuXHRcdCAqIHJldHVybnMgcG9zaXRpb24gZnJvbSBwbGFjZWhvbGRlclxuXHRcdCAqXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKiBAcGFyYW0ge05vZGV9IHBsYWNlaG9sZGVyXG5cdFx0ICogQHBhcmFtIHtCb29sZWFufSBpc0Fpck1vZGVcblx0XHQgKiBAcmV0dXJuIHtPYmplY3R9XG5cdFx0ICogQHJldHVybiB7TnVtYmVyfSByZXR1cm4ubGVmdFxuXHRcdCAqIEByZXR1cm4ge051bWJlcn0gcmV0dXJuLnRvcFxuXHRcdCAqL1xuXHRcdHZhciBwb3NGcm9tUGxhY2Vob2xkZXIgPSBmdW5jdGlvbiAocGxhY2Vob2xkZXIsIGlzQWlyTW9kZSkge1xuXHRcdFx0dmFyICRwbGFjZWhvbGRlciA9ICQocGxhY2Vob2xkZXIpO1xuXHRcdFx0dmFyIHBvcyA9IGlzQWlyTW9kZSA/ICRwbGFjZWhvbGRlci5vZmZzZXQoKSA6ICRwbGFjZWhvbGRlci5wb3NpdGlvbigpO1xuXHRcdFx0dmFyIGhlaWdodCA9ICRwbGFjZWhvbGRlci5vdXRlckhlaWdodCh0cnVlKTsgLy8gaW5jbHVkZSBtYXJnaW5cblxuXHRcdFx0Ly8gcG9wb3ZlciBiZWxvdyBwbGFjZWhvbGRlci5cblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGxlZnQ6IHBvcy5sZWZ0LFxuXHRcdFx0XHR0b3A6IHBvcy50b3AgKyBoZWlnaHRcblx0XHRcdH07XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIHNob3cgcG9wb3ZlclxuXHRcdCAqXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gcG9wb3ZlclxuXHRcdCAqIEBwYXJhbSB7UG9zaXRpb259IHBvc1xuXHRcdCAqL1xuXHRcdHZhciBzaG93UG9wb3ZlciA9IGZ1bmN0aW9uICgkcG9wb3ZlciwgcG9zKSB7XG5cdFx0XHQkcG9wb3Zlci5jc3Moe1xuXHRcdFx0XHRkaXNwbGF5OiAnYmxvY2snLFxuXHRcdFx0XHRsZWZ0OiBwb3MubGVmdCxcblx0XHRcdFx0dG9wOiBwb3MudG9wXG5cdFx0XHR9KTtcblx0XHR9O1xuXG5cdFx0dmFyIFBYX1BPUE9WRVJfQVJST1dfT0ZGU0VUX1ggPSAyMDtcblxuXHRcdC8qKlxuXHRcdCAqIHVwZGF0ZSBjdXJyZW50IHN0YXRlXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRwb3BvdmVyIC0gcG9wb3ZlciBjb250YWluZXJcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gc3R5bGVJbmZvIC0gc3R5bGUgb2JqZWN0XG5cdFx0ICogQHBhcmFtIHtCb29sZWFufSBpc0Fpck1vZGVcblx0XHQgKi9cblx0XHR0aGlzLnVwZGF0ZSA9IGZ1bmN0aW9uICgkcG9wb3Zlciwgc3R5bGVJbmZvLCBpc0Fpck1vZGUpIHtcblx0XHRcdGJ1dHRvbi51cGRhdGUoJHBvcG92ZXIsIHN0eWxlSW5mbyk7XG5cblx0XHRcdHZhciAkbGlua1BvcG92ZXIgPSAkcG9wb3Zlci5maW5kKCcubm90ZS1saW5rLXBvcG92ZXInKTtcblx0XHRcdGlmIChzdHlsZUluZm8uYW5jaG9yKSB7XG5cdFx0XHRcdHZhciAkYW5jaG9yID0gJGxpbmtQb3BvdmVyLmZpbmQoJ2EnKTtcblx0XHRcdFx0dmFyIGhyZWYgPSAkKHN0eWxlSW5mby5hbmNob3IpLmF0dHIoJ2hyZWYnKTtcblx0XHRcdFx0dmFyIHRhcmdldCA9ICQoc3R5bGVJbmZvLmFuY2hvcikuYXR0cigndGFyZ2V0Jyk7XG5cdFx0XHRcdCRhbmNob3IuYXR0cignaHJlZicsIGhyZWYpLmh0bWwoaHJlZik7XG5cdFx0XHRcdGlmICghdGFyZ2V0KSB7XG5cdFx0XHRcdFx0JGFuY2hvci5yZW1vdmVBdHRyKCd0YXJnZXQnKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQkYW5jaG9yLmF0dHIoJ3RhcmdldCcsICdfYmxhbmsnKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRzaG93UG9wb3ZlcigkbGlua1BvcG92ZXIsIHBvc0Zyb21QbGFjZWhvbGRlcihzdHlsZUluZm8uYW5jaG9yLCBpc0Fpck1vZGUpKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdCRsaW5rUG9wb3Zlci5oaWRlKCk7XG5cdFx0XHR9XG5cblx0XHRcdHZhciAkaW1hZ2VQb3BvdmVyID0gJHBvcG92ZXIuZmluZCgnLm5vdGUtaW1hZ2UtcG9wb3ZlcicpO1xuXHRcdFx0aWYgKHN0eWxlSW5mby5pbWFnZSkge1xuXHRcdFx0XHRzaG93UG9wb3ZlcigkaW1hZ2VQb3BvdmVyLCBwb3NGcm9tUGxhY2Vob2xkZXIoc3R5bGVJbmZvLmltYWdlLCBpc0Fpck1vZGUpKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdCRpbWFnZVBvcG92ZXIuaGlkZSgpO1xuXHRcdFx0fVxuXG5cdFx0XHR2YXIgJGFpclBvcG92ZXIgPSAkcG9wb3Zlci5maW5kKCcubm90ZS1haXItcG9wb3ZlcicpO1xuXHRcdFx0aWYgKGlzQWlyTW9kZSAmJiAhc3R5bGVJbmZvLnJhbmdlLmlzQ29sbGFwc2VkKCkpIHtcblx0XHRcdFx0dmFyIHJlY3QgPSBsaXN0Lmxhc3Qoc3R5bGVJbmZvLnJhbmdlLmdldENsaWVudFJlY3RzKCkpO1xuXHRcdFx0XHRpZiAocmVjdCkge1xuXHRcdFx0XHRcdHZhciBibmQgPSBmdW5jLnJlY3QyYm5kKHJlY3QpO1xuXHRcdFx0XHRcdHNob3dQb3BvdmVyKCRhaXJQb3BvdmVyLCB7XG5cdFx0XHRcdFx0XHRsZWZ0OiBNYXRoLm1heChibmQubGVmdCArIGJuZC53aWR0aCAvIDIgLSBQWF9QT1BPVkVSX0FSUk9XX09GRlNFVF9YLCAwKSxcblx0XHRcdFx0XHRcdHRvcDogYm5kLnRvcCArIGJuZC5oZWlnaHRcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0JGFpclBvcG92ZXIuaGlkZSgpO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBAcGFyYW0ge05vZGV9IGJ1dHRvblxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSBldmVudE5hbWVcblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gdmFsdWVcblx0XHQgKi9cblx0XHR0aGlzLnVwZGF0ZVJlY2VudENvbG9yID0gZnVuY3Rpb24gKGJ1dHRvbiwgZXZlbnROYW1lLCB2YWx1ZSkge1xuXHRcdFx0YnV0dG9uLnVwZGF0ZVJlY2VudENvbG9yKGJ1dHRvbiwgZXZlbnROYW1lLCB2YWx1ZSk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIGhpZGUgYWxsIHBvcG92ZXJzXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRwb3BvdmVyIC0gcG9wb3ZlciBjb250YWluZXJcblx0XHQgKi9cblx0XHR0aGlzLmhpZGUgPSBmdW5jdGlvbiAoJHBvcG92ZXIpIHtcblx0XHRcdCRwb3BvdmVyLmNoaWxkcmVuKCkuaGlkZSgpO1xuXHRcdH07XG5cdH07XG5cblx0LyoqXG5cdCAqIEBjbGFzcyBtb2R1bGUuSGFuZGxlXG5cdCAqXG5cdCAqIEhhbmRsZVxuXHQgKi9cblx0dmFyIEhhbmRsZSA9IGZ1bmN0aW9uIChoYW5kbGVyKSB7XG5cdFx0dmFyICRkb2N1bWVudCA9ICQoZG9jdW1lbnQpO1xuXG5cdFx0LyoqXG5cdFx0ICogYG1vdXNlZG93bmAgZXZlbnQgaGFuZGxlciBvbiAkaGFuZGxlXG5cdFx0ICogIC0gY29udHJvbFNpemluZzogcmVzaXplIGltYWdlXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGV2ZW50XG5cdFx0ICovXG5cdFx0dmFyIGhIYW5kbGVNb3VzZWRvd24gPSBmdW5jdGlvbiAoZXZlbnQpIHtcblx0XHRcdGlmIChkb20uaXNDb250cm9sU2l6aW5nKGV2ZW50LnRhcmdldCkpIHtcblx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cblx0XHRcdFx0dmFyIGxheW91dEluZm8gPSBkb20ubWFrZUxheW91dEluZm8oZXZlbnQudGFyZ2V0KSxcblx0XHRcdFx0XHQkaGFuZGxlID0gbGF5b3V0SW5mby5oYW5kbGUoKSxcblx0XHRcdFx0XHQkcG9wb3ZlciA9IGxheW91dEluZm8ucG9wb3ZlcigpLFxuXHRcdFx0XHRcdCRlZGl0YWJsZSA9IGxheW91dEluZm8uZWRpdGFibGUoKSxcblx0XHRcdFx0XHQkZWRpdG9yID0gbGF5b3V0SW5mby5lZGl0b3IoKTtcblxuXHRcdFx0XHR2YXIgdGFyZ2V0ID0gJGhhbmRsZS5maW5kKCcubm90ZS1jb250cm9sLXNlbGVjdGlvbicpLmRhdGEoJ3RhcmdldCcpLFxuXHRcdFx0XHRcdCR0YXJnZXQgPSAkKHRhcmdldCksIHBvc1N0YXJ0ID0gJHRhcmdldC5vZmZzZXQoKSxcblx0XHRcdFx0XHRzY3JvbGxUb3AgPSAkZG9jdW1lbnQuc2Nyb2xsVG9wKCk7XG5cblx0XHRcdFx0dmFyIGlzQWlyTW9kZSA9ICRlZGl0b3IuZGF0YSgnb3B0aW9ucycpLmFpck1vZGU7XG5cblx0XHRcdFx0JGRvY3VtZW50Lm9uKCdtb3VzZW1vdmUnLCBmdW5jdGlvbiAoZXZlbnQpIHtcblx0XHRcdFx0XHRoYW5kbGVyLmludm9rZSgnZWRpdG9yLnJlc2l6ZVRvJywge1xuXHRcdFx0XHRcdFx0eDogZXZlbnQuY2xpZW50WCAtIHBvc1N0YXJ0LmxlZnQsXG5cdFx0XHRcdFx0XHR5OiBldmVudC5jbGllbnRZIC0gKHBvc1N0YXJ0LnRvcCAtIHNjcm9sbFRvcClcblx0XHRcdFx0XHR9LCAkdGFyZ2V0LCAhZXZlbnQuc2hpZnRLZXkpO1xuXG5cdFx0XHRcdFx0aGFuZGxlci5pbnZva2UoJ2hhbmRsZS51cGRhdGUnLCAkaGFuZGxlLCB7IGltYWdlOiB0YXJnZXQgfSwgaXNBaXJNb2RlKTtcblx0XHRcdFx0XHRoYW5kbGVyLmludm9rZSgncG9wb3Zlci51cGRhdGUnLCAkcG9wb3ZlciwgeyBpbWFnZTogdGFyZ2V0IH0sIGlzQWlyTW9kZSk7XG5cdFx0XHRcdH0pLm9uZSgnbW91c2V1cCcsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHQkZG9jdW1lbnQub2ZmKCdtb3VzZW1vdmUnKTtcblx0XHRcdFx0XHRoYW5kbGVyLmludm9rZSgnZWRpdG9yLmFmdGVyQ29tbWFuZCcsICRlZGl0YWJsZSk7XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdGlmICghJHRhcmdldC5kYXRhKCdyYXRpbycpKSB7IC8vIG9yaWdpbmFsIHJhdGlvLlxuXHRcdFx0XHRcdCR0YXJnZXQuZGF0YSgncmF0aW8nLCAkdGFyZ2V0LmhlaWdodCgpIC8gJHRhcmdldC53aWR0aCgpKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cblx0XHR0aGlzLmF0dGFjaCA9IGZ1bmN0aW9uIChsYXlvdXRJbmZvKSB7XG5cdFx0XHRsYXlvdXRJbmZvLmhhbmRsZSgpLm9uKCdtb3VzZWRvd24nLCBoSGFuZGxlTW91c2Vkb3duKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogdXBkYXRlIGhhbmRsZVxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkaGFuZGxlXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IHN0eWxlSW5mb1xuXHRcdCAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNBaXJNb2RlXG5cdFx0ICovXG5cdFx0dGhpcy51cGRhdGUgPSBmdW5jdGlvbiAoJGhhbmRsZSwgc3R5bGVJbmZvLCBpc0Fpck1vZGUpIHtcblx0XHRcdHZhciAkc2VsZWN0aW9uID0gJGhhbmRsZS5maW5kKCcubm90ZS1jb250cm9sLXNlbGVjdGlvbicpO1xuXHRcdFx0aWYgKHN0eWxlSW5mby5pbWFnZSkge1xuXHRcdFx0XHR2YXIgJGltYWdlID0gJChzdHlsZUluZm8uaW1hZ2UpO1xuXHRcdFx0XHR2YXIgcG9zID0gaXNBaXJNb2RlID8gJGltYWdlLm9mZnNldCgpIDogJGltYWdlLnBvc2l0aW9uKCk7XG5cblx0XHRcdFx0Ly8gaW5jbHVkZSBtYXJnaW5cblx0XHRcdFx0dmFyIGltYWdlU2l6ZSA9IHtcblx0XHRcdFx0XHR3OiAkaW1hZ2Uub3V0ZXJXaWR0aCh0cnVlKSxcblx0XHRcdFx0XHRoOiAkaW1hZ2Uub3V0ZXJIZWlnaHQodHJ1ZSlcblx0XHRcdFx0fTtcblxuXHRcdFx0XHQkc2VsZWN0aW9uLmNzcyh7XG5cdFx0XHRcdFx0ZGlzcGxheTogJ2Jsb2NrJyxcblx0XHRcdFx0XHRsZWZ0OiBwb3MubGVmdCxcblx0XHRcdFx0XHR0b3A6IHBvcy50b3AsXG5cdFx0XHRcdFx0d2lkdGg6IGltYWdlU2l6ZS53LFxuXHRcdFx0XHRcdGhlaWdodDogaW1hZ2VTaXplLmhcblx0XHRcdFx0fSkuZGF0YSgndGFyZ2V0Jywgc3R5bGVJbmZvLmltYWdlKTsgLy8gc2F2ZSBjdXJyZW50IGltYWdlIGVsZW1lbnQuXG5cdFx0XHRcdHZhciBzaXppbmdUZXh0ID0gaW1hZ2VTaXplLncgKyAneCcgKyBpbWFnZVNpemUuaDtcblx0XHRcdFx0JHNlbGVjdGlvbi5maW5kKCcubm90ZS1jb250cm9sLXNlbGVjdGlvbi1pbmZvJykudGV4dChzaXppbmdUZXh0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdCRzZWxlY3Rpb24uaGlkZSgpO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBoaWRlXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGhhbmRsZVxuXHRcdCAqL1xuXHRcdHRoaXMuaGlkZSA9IGZ1bmN0aW9uICgkaGFuZGxlKSB7XG5cdFx0XHQkaGFuZGxlLmNoaWxkcmVuKCkuaGlkZSgpO1xuXHRcdH07XG5cdH07XG5cblx0dmFyIEZ1bGxzY3JlZW4gPSBmdW5jdGlvbiAoaGFuZGxlcikge1xuXHRcdHZhciAkd2luZG93ID0gJCh3aW5kb3cpO1xuXHRcdHZhciAkc2Nyb2xsYmFyID0gJCgnaHRtbCwgYm9keScpO1xuXG5cdFx0LyoqXG5cdFx0ICogdG9nZ2xlIGZ1bGxzY3JlZW5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBsYXlvdXRJbmZvXG5cdFx0ICovXG5cdFx0dGhpcy50b2dnbGUgPSBmdW5jdGlvbiAobGF5b3V0SW5mbykge1xuXG5cdFx0XHR2YXIgJGVkaXRvciA9IGxheW91dEluZm8uZWRpdG9yKCksXG5cdFx0XHRcdCR0b29sYmFyID0gbGF5b3V0SW5mby50b29sYmFyKCksXG5cdFx0XHRcdCRlZGl0YWJsZSA9IGxheW91dEluZm8uZWRpdGFibGUoKSxcblx0XHRcdFx0JGNvZGFibGUgPSBsYXlvdXRJbmZvLmNvZGFibGUoKTtcblxuXHRcdFx0dmFyIHJlc2l6ZSA9IGZ1bmN0aW9uIChzaXplKSB7XG5cdFx0XHRcdCRlZGl0YWJsZS5jc3MoJ2hlaWdodCcsIHNpemUuaCk7XG5cdFx0XHRcdCRjb2RhYmxlLmNzcygnaGVpZ2h0Jywgc2l6ZS5oKTtcblx0XHRcdFx0aWYgKCRjb2RhYmxlLmRhdGEoJ2NtZWRpdG9yJykpIHtcblx0XHRcdFx0XHQkY29kYWJsZS5kYXRhKCdjbWVkaXRvcicpLnNldHNpemUobnVsbCwgc2l6ZS5oKTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblxuXHRcdFx0JGVkaXRvci50b2dnbGVDbGFzcygnZnVsbHNjcmVlbicpO1xuXHRcdFx0dmFyIGlzRnVsbHNjcmVlbiA9ICRlZGl0b3IuaGFzQ2xhc3MoJ2Z1bGxzY3JlZW4nKTtcblx0XHRcdGlmIChpc0Z1bGxzY3JlZW4pIHtcblx0XHRcdFx0JGVkaXRhYmxlLmRhdGEoJ29yZ2hlaWdodCcsICRlZGl0YWJsZS5jc3MoJ2hlaWdodCcpKTtcblxuXHRcdFx0XHQkd2luZG93Lm9uKCdyZXNpemUnLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0cmVzaXplKHtcblx0XHRcdFx0XHRcdGg6ICR3aW5kb3cuaGVpZ2h0KCkgLSAkdG9vbGJhci5vdXRlckhlaWdodCgpIC0gMTQyXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR9KS50cmlnZ2VyKCdyZXNpemUnKTtcblxuXHRcdFx0XHQkc2Nyb2xsYmFyLmNzcygnb3ZlcmZsb3cnLCAnaGlkZGVuJyk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQkd2luZG93Lm9mZigncmVzaXplJyk7XG5cdFx0XHRcdHJlc2l6ZSh7XG5cdFx0XHRcdFx0aDogJGVkaXRhYmxlLmRhdGEoJ29yZ2hlaWdodCcpXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHQkc2Nyb2xsYmFyLmNzcygnb3ZlcmZsb3cnLCAndmlzaWJsZScpO1xuXHRcdFx0fVxuXG5cdFx0XHRoYW5kbGVyLmludm9rZSgndG9vbGJhci51cGRhdGVGdWxsc2NyZWVuJywgJHRvb2xiYXIsIGlzRnVsbHNjcmVlbik7XG5cdFx0fTtcblx0fTtcblxuXG5cdHZhciBDb2RlTWlycm9yO1xuXHRpZiAoYWdlbnQuaGFzQ29kZU1pcnJvcikge1xuXHRcdGlmIChhZ2VudC5pc1N1cHBvcnRBbWQpIHtcblx0XHRcdF9fYnJvd3NlcmlmeV9zaGltX3JlcXVpcmVfXyhbJ0NvZGVNaXJyb3InXSwgZnVuY3Rpb24gKGNtKSB7XG5cdFx0XHRcdENvZGVNaXJyb3IgPSBjbTtcblx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRDb2RlTWlycm9yID0gd2luZG93LkNvZGVNaXJyb3I7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEBjbGFzcyBDb2Rldmlld1xuXHQgKi9cblx0dmFyIENvZGV2aWV3ID0gZnVuY3Rpb24gKGhhbmRsZXIpIHtcblxuXHRcdHRoaXMuc3luYyA9IGZ1bmN0aW9uIChsYXlvdXRJbmZvKSB7XG5cdFx0XHR2YXIgaXNDb2RldmlldyA9IGhhbmRsZXIuaW52b2tlKCdjb2Rldmlldy5pc0FjdGl2YXRlZCcsIGxheW91dEluZm8pO1xuXHRcdFx0aWYgKGlzQ29kZXZpZXcgJiYgYWdlbnQuaGFzQ29kZU1pcnJvcikge1xuXHRcdFx0XHRsYXlvdXRJbmZvLmNvZGFibGUoKS5kYXRhKCdjbUVkaXRvcicpLnNhdmUoKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IGxheW91dEluZm9cblx0XHQgKiBAcmV0dXJuIHtCb29sZWFufVxuXHRcdCAqL1xuXHRcdHRoaXMuaXNBY3RpdmF0ZWQgPSBmdW5jdGlvbiAobGF5b3V0SW5mbykge1xuXHRcdFx0dmFyICRlZGl0b3IgPSBsYXlvdXRJbmZvLmVkaXRvcigpO1xuXHRcdFx0cmV0dXJuICRlZGl0b3IuaGFzQ2xhc3MoJ2NvZGV2aWV3Jyk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIHRvZ2dsZSBjb2Rldmlld1xuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IGxheW91dEluZm9cblx0XHQgKi9cblx0XHR0aGlzLnRvZ2dsZSA9IGZ1bmN0aW9uIChsYXlvdXRJbmZvKSB7XG5cdFx0XHRpZiAodGhpcy5pc0FjdGl2YXRlZChsYXlvdXRJbmZvKSkge1xuXHRcdFx0XHR0aGlzLmRlYWN0aXZhdGUobGF5b3V0SW5mbyk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGlzLmFjdGl2YXRlKGxheW91dEluZm8pO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBhY3RpdmF0ZSBjb2RlIHZpZXdcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBsYXlvdXRJbmZvXG5cdFx0ICovXG5cdFx0dGhpcy5hY3RpdmF0ZSA9IGZ1bmN0aW9uIChsYXlvdXRJbmZvKSB7XG5cdFx0XHR2YXIgJGVkaXRvciA9IGxheW91dEluZm8uZWRpdG9yKCksXG5cdFx0XHRcdCR0b29sYmFyID0gbGF5b3V0SW5mby50b29sYmFyKCksXG5cdFx0XHRcdCRlZGl0YWJsZSA9IGxheW91dEluZm8uZWRpdGFibGUoKSxcblx0XHRcdFx0JGNvZGFibGUgPSBsYXlvdXRJbmZvLmNvZGFibGUoKSxcblx0XHRcdFx0JHBvcG92ZXIgPSBsYXlvdXRJbmZvLnBvcG92ZXIoKSxcblx0XHRcdFx0JGhhbmRsZSA9IGxheW91dEluZm8uaGFuZGxlKCk7XG5cblx0XHRcdHZhciBvcHRpb25zID0gJGVkaXRvci5kYXRhKCdvcHRpb25zJyk7XG5cblx0XHRcdCRjb2RhYmxlLnZhbChkb20uaHRtbCgkZWRpdGFibGUsIG9wdGlvbnMucHJldHRpZnlIdG1sKSk7XG5cbiAgICAgICAgICAgIC8vIHVuY29tbWVudCBzY3JpcHQgdGFncyBzbyB0aGV5J3JlIGNvcnJlY3QgaW4gY29kZSB2aWV3XG5cdFx0XHQkY29kYWJsZS52YWwoJGNvZGFibGUudmFsKCkucmVwbGFjZSgnPCEtLTxzY3JpcHQnLCAnPHNjcmlwdCcpKTtcclxuXHRcdFx0JGNvZGFibGUudmFsKCRjb2RhYmxlLnZhbCgpLnJlcGxhY2UoJzwvc2NyaXB0Pi0tPicsICc8L3NjcmlwdD4nKSk7XG5cblx0XHRcdCRjb2RhYmxlLmhlaWdodCgkZWRpdGFibGUuaGVpZ2h0KCkpO1xuXG5cdFx0XHRoYW5kbGVyLmludm9rZSgndG9vbGJhci51cGRhdGVDb2RldmlldycsICR0b29sYmFyLCB0cnVlKTtcblx0XHRcdGhhbmRsZXIuaW52b2tlKCdwb3BvdmVyLmhpZGUnLCAkcG9wb3Zlcik7XG5cdFx0XHRoYW5kbGVyLmludm9rZSgnaGFuZGxlLmhpZGUnLCAkaGFuZGxlKTtcblxuXHRcdFx0JGVkaXRvci5hZGRDbGFzcygnY29kZXZpZXcnKTtcblxuXHRcdFx0JGNvZGFibGUuZm9jdXMoKTtcblxuXHRcdFx0Ly8gYWN0aXZhdGUgQ29kZU1pcnJvciBhcyBjb2RhYmxlXG5cdFx0XHRpZiAoYWdlbnQuaGFzQ29kZU1pcnJvcikge1xuXHRcdFx0XHR2YXIgY21FZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYSgkY29kYWJsZVswXSwgb3B0aW9ucy5jb2RlbWlycm9yKTtcblxuXHRcdFx0XHQvLyBDb2RlTWlycm9yIFRlcm5TZXJ2ZXJcblx0XHRcdFx0aWYgKG9wdGlvbnMuY29kZW1pcnJvci50ZXJuKSB7XG5cdFx0XHRcdFx0dmFyIHNlcnZlciA9IG5ldyBDb2RlTWlycm9yLlRlcm5TZXJ2ZXIob3B0aW9ucy5jb2RlbWlycm9yLnRlcm4pO1xuXHRcdFx0XHRcdGNtRWRpdG9yLnRlcm5TZXJ2ZXIgPSBzZXJ2ZXI7XG5cdFx0XHRcdFx0Y21FZGl0b3Iub24oJ2N1cnNvckFjdGl2aXR5JywgZnVuY3Rpb24gKGNtKSB7XG5cdFx0XHRcdFx0XHRzZXJ2ZXIudXBkYXRlQXJnSGludHMoY20pO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gQ29kZU1pcnJvciBoYXNuJ3QgUGFkZGluZy5cblx0XHRcdFx0Y21FZGl0b3Iuc2V0U2l6ZShudWxsLCAkZWRpdGFibGUub3V0ZXJIZWlnaHQoKSk7XG5cdFx0XHRcdCRjb2RhYmxlLmRhdGEoJ2NtRWRpdG9yJywgY21FZGl0b3IpO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBkZWFjdGl2YXRlIGNvZGUgdmlld1xuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IGxheW91dEluZm9cblx0XHQgKi9cblx0XHR0aGlzLmRlYWN0aXZhdGUgPSBmdW5jdGlvbiAobGF5b3V0SW5mbykge1xuXHRcdFx0dmFyICRlZGl0b3IgPSBsYXlvdXRJbmZvLmVkaXRvcigpLFxuXHRcdFx0XHQkdG9vbGJhciA9IGxheW91dEluZm8udG9vbGJhcigpLFxuXHRcdFx0XHQkZWRpdGFibGUgPSBsYXlvdXRJbmZvLmVkaXRhYmxlKCksXG5cdFx0XHRcdCRjb2RhYmxlID0gbGF5b3V0SW5mby5jb2RhYmxlKCk7XG5cblx0XHRcdHZhciBvcHRpb25zID0gJGVkaXRvci5kYXRhKCdvcHRpb25zJyk7XG5cblx0XHRcdC8vIGRlYWN0aXZhdGUgQ29kZU1pcnJvciBhcyBjb2RhYmxlXG5cdFx0XHRpZiAoYWdlbnQuaGFzQ29kZU1pcnJvcikge1xuXHRcdFx0XHR2YXIgY21FZGl0b3IgPSAkY29kYWJsZS5kYXRhKCdjbUVkaXRvcicpO1xuXHRcdFx0XHQkY29kYWJsZS52YWwoY21FZGl0b3IuZ2V0VmFsdWUoKSk7XG5cdFx0XHRcdGNtRWRpdG9yLnRvVGV4dEFyZWEoKTtcblx0XHRcdH1cblxuXHRcdFx0JGVkaXRhYmxlLmh0bWwoZG9tLnZhbHVlKCRjb2RhYmxlLCBvcHRpb25zLnByZXR0aWZ5SHRtbCkgfHwgZG9tLmVtcHR5UGFyYSk7XG5cblx0XHQgICAgLy8gcmVwbGFjZSBzY3JpcHQgdGFncyBzbyB0aGV5J3JlIG5vdCBleGVjdXRlZCB3aGVuIGxvYWRlZCBpbiBhZG1pblxuXHRcdFx0dmFyIGNvZGVUb1JlcGxhY2UgPSAkZWRpdGFibGUuaHRtbCgpO1xyXG5cclxuXHRcdFx0Y29kZVRvUmVwbGFjZSA9IGNvZGVUb1JlcGxhY2UucmVwbGFjZSgnPHNjcmlwdCcsICc8IS0tPHNjcmlwdCcpO1xyXG5cdFx0XHRjb2RlVG9SZXBsYWNlID0gY29kZVRvUmVwbGFjZS5yZXBsYWNlKCc8L3NjcmlwdD4nLCAnPC9zY3JpcHQ+LS0+Jyk7XHJcblxyXG5cdFx0XHQkZWRpdGFibGUuaHRtbChjb2RlVG9SZXBsYWNlKTtcblxuXHRcdFx0JGVkaXRhYmxlLmhlaWdodChvcHRpb25zLmhlaWdodCA/ICRjb2RhYmxlLmhlaWdodCgpIDogJ2F1dG8nKTtcblx0XHRcdCRlZGl0b3IucmVtb3ZlQ2xhc3MoJ2NvZGV2aWV3Jyk7XG5cblx0XHRcdCRlZGl0YWJsZS5mb2N1cygpO1xuXG5cdFx0XHRoYW5kbGVyLmludm9rZSgndG9vbGJhci51cGRhdGVDb2RldmlldycsICR0b29sYmFyLCBmYWxzZSk7XG5cbiAgICAgICAgICAgIHdpbmRvdy5zdG9wKCk7XG5cdFx0fTtcblx0fTtcblxuXHR2YXIgRHJhZ0FuZERyb3AgPSBmdW5jdGlvbiAoaGFuZGxlcikge1xuXHRcdHZhciAkZG9jdW1lbnQgPSAkKGRvY3VtZW50KTtcblxuXHRcdC8qKlxuXHRcdCAqIGF0dGFjaCBEcmFnIGFuZCBEcm9wIEV2ZW50c1xuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IGxheW91dEluZm8gLSBsYXlvdXQgSW5mb3JtYXRpb25zXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcblx0XHQgKi9cblx0XHR0aGlzLmF0dGFjaCA9IGZ1bmN0aW9uIChsYXlvdXRJbmZvLCBvcHRpb25zKSB7XG5cdFx0XHRpZiAob3B0aW9ucy5haXJNb2RlIHx8IG9wdGlvbnMuZGlzYWJsZURyYWdBbmREcm9wKSB7XG5cdFx0XHRcdC8vIHByZXZlbnQgZGVmYXVsdCBkcm9wIGV2ZW50XG5cdFx0XHRcdCRkb2N1bWVudC5vbignZHJvcCcsIGZ1bmN0aW9uIChlKSB7XG5cdFx0XHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuYXR0YWNoRHJhZ0FuZERyb3BFdmVudChsYXlvdXRJbmZvLCBvcHRpb25zKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogYXR0YWNoIERyYWcgYW5kIERyb3AgRXZlbnRzXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gbGF5b3V0SW5mbyAtIGxheW91dCBJbmZvcm1hdGlvbnNcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuXHRcdCAqL1xuXHRcdHRoaXMuYXR0YWNoRHJhZ0FuZERyb3BFdmVudCA9IGZ1bmN0aW9uIChsYXlvdXRJbmZvLCBvcHRpb25zKSB7XG5cdFx0XHR2YXIgY29sbGVjdGlvbiA9ICQoKSxcblx0XHRcdFx0JGVkaXRvciA9IGxheW91dEluZm8uZWRpdG9yKCksXG5cdFx0XHRcdCRkcm9wem9uZSA9IGxheW91dEluZm8uZHJvcHpvbmUoKSxcblx0XHRcdFx0JGRyb3B6b25lTWVzc2FnZSA9ICRkcm9wem9uZS5maW5kKCcubm90ZS1kcm9wem9uZS1tZXNzYWdlJyk7XG5cblx0XHRcdC8vIHNob3cgZHJvcHpvbmUgb24gZHJhZ2VudGVyIHdoZW4gZHJhZ2dpbmcgYSBvYmplY3QgdG8gZG9jdW1lbnRcblx0XHRcdC8vIC1idXQgb25seSBpZiB0aGUgZWRpdG9yIGlzIHZpc2libGUsIGkuZS4gaGFzIGEgcG9zaXRpdmUgd2lkdGggYW5kIGhlaWdodFxuXHRcdFx0JGRvY3VtZW50Lm9uKCdkcmFnZW50ZXInLCBmdW5jdGlvbiAoZSkge1xuXHRcdFx0XHR2YXIgaXNDb2RldmlldyA9IGhhbmRsZXIuaW52b2tlKCdjb2Rldmlldy5pc0FjdGl2YXRlZCcsIGxheW91dEluZm8pO1xuXHRcdFx0XHR2YXIgaGFzRWRpdG9yU2l6ZSA9ICRlZGl0b3Iud2lkdGgoKSA+IDAgJiYgJGVkaXRvci5oZWlnaHQoKSA+IDA7XG5cdFx0XHRcdGlmICghaXNDb2RldmlldyAmJiAhY29sbGVjdGlvbi5sZW5ndGggJiYgaGFzRWRpdG9yU2l6ZSkge1xuXHRcdFx0XHRcdCRlZGl0b3IuYWRkQ2xhc3MoJ2RyYWdvdmVyJyk7XG5cdFx0XHRcdFx0JGRyb3B6b25lLndpZHRoKCRlZGl0b3Iud2lkdGgoKSk7XG5cdFx0XHRcdFx0JGRyb3B6b25lLmhlaWdodCgkZWRpdG9yLmhlaWdodCgpKTtcblx0XHRcdFx0XHQkZHJvcHpvbmVNZXNzYWdlLnRleHQob3B0aW9ucy5sYW5nSW5mby5pbWFnZS5kcmFnSW1hZ2VIZXJlKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb2xsZWN0aW9uID0gY29sbGVjdGlvbi5hZGQoZS50YXJnZXQpO1xuXHRcdFx0fSkub24oJ2RyYWdsZWF2ZScsIGZ1bmN0aW9uIChlKSB7XG5cdFx0XHRcdGNvbGxlY3Rpb24gPSBjb2xsZWN0aW9uLm5vdChlLnRhcmdldCk7XG5cdFx0XHRcdGlmICghY29sbGVjdGlvbi5sZW5ndGgpIHtcblx0XHRcdFx0XHQkZWRpdG9yLnJlbW92ZUNsYXNzKCdkcmFnb3ZlcicpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KS5vbignZHJvcCcsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0Y29sbGVjdGlvbiA9ICQoKTtcblx0XHRcdFx0JGVkaXRvci5yZW1vdmVDbGFzcygnZHJhZ292ZXInKTtcblx0XHRcdH0pO1xuXG5cdFx0XHQvLyBjaGFuZ2UgZHJvcHpvbmUncyBtZXNzYWdlIG9uIGhvdmVyLlxuXHRcdFx0JGRyb3B6b25lLm9uKCdkcmFnZW50ZXInLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdCRkcm9wem9uZS5hZGRDbGFzcygnaG92ZXInKTtcblx0XHRcdFx0JGRyb3B6b25lTWVzc2FnZS50ZXh0KG9wdGlvbnMubGFuZ0luZm8uaW1hZ2UuZHJvcEltYWdlKTtcblx0XHRcdH0pLm9uKCdkcmFnbGVhdmUnLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdCRkcm9wem9uZS5yZW1vdmVDbGFzcygnaG92ZXInKTtcblx0XHRcdFx0JGRyb3B6b25lTWVzc2FnZS50ZXh0KG9wdGlvbnMubGFuZ0luZm8uaW1hZ2UuZHJhZ0ltYWdlSGVyZSk7XG5cdFx0XHR9KTtcblxuXHRcdFx0Ly8gYXR0YWNoIGRyb3BJbWFnZVxuXHRcdFx0JGRyb3B6b25lLm9uKCdkcm9wJywgZnVuY3Rpb24gKGV2ZW50KSB7XG5cdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cblx0XHRcdFx0dmFyIGRhdGFUcmFuc2ZlciA9IGV2ZW50Lm9yaWdpbmFsRXZlbnQuZGF0YVRyYW5zZmVyO1xuXHRcdFx0XHR2YXIgaHRtbCA9IGRhdGFUcmFuc2Zlci5nZXREYXRhKCd0ZXh0L2h0bWwnKTtcblx0XHRcdFx0dmFyIHRleHQgPSBkYXRhVHJhbnNmZXIuZ2V0RGF0YSgndGV4dC9wbGFpbicpO1xuXG5cdFx0XHRcdHZhciBsYXlvdXRJbmZvID0gZG9tLm1ha2VMYXlvdXRJbmZvKGV2ZW50LmN1cnJlbnRUYXJnZXQgfHwgZXZlbnQudGFyZ2V0KTtcblxuXHRcdFx0XHRpZiAoZGF0YVRyYW5zZmVyICYmIGRhdGFUcmFuc2Zlci5maWxlcyAmJiBkYXRhVHJhbnNmZXIuZmlsZXMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0bGF5b3V0SW5mby5lZGl0YWJsZSgpLmZvY3VzKCk7XG5cdFx0XHRcdFx0aGFuZGxlci5pbnNlcnRJbWFnZXMobGF5b3V0SW5mbywgZGF0YVRyYW5zZmVyLmZpbGVzKTtcblx0XHRcdFx0fSBlbHNlIGlmIChodG1sKSB7XG5cdFx0XHRcdFx0JChodG1sKS5lYWNoKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdGxheW91dEluZm8uZWRpdGFibGUoKS5mb2N1cygpO1xuXHRcdFx0XHRcdFx0aGFuZGxlci5pbnZva2UoJ2VkaXRvci5pbnNlcnROb2RlJywgbGF5b3V0SW5mby5lZGl0YWJsZSgpLCB0aGlzKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSBlbHNlIGlmICh0ZXh0KSB7XG5cdFx0XHRcdFx0bGF5b3V0SW5mby5lZGl0YWJsZSgpLmZvY3VzKCk7XG5cdFx0XHRcdFx0aGFuZGxlci5pbnZva2UoJ2VkaXRvci5pbnNlcnRUZXh0JywgbGF5b3V0SW5mby5lZGl0YWJsZSgpLCB0ZXh0KTtcblx0XHRcdFx0fVxuXHRcdFx0fSkub24oJ2RyYWdvdmVyJywgZmFsc2UpOyAvLyBwcmV2ZW50IGRlZmF1bHQgZHJhZ292ZXIgZXZlbnRcblx0XHR9O1xuXHR9O1xuXG5cdHZhciBDbGlwYm9hcmQgPSBmdW5jdGlvbiAoaGFuZGxlcikge1xuXG5cdFx0dGhpcy5hdHRhY2ggPSBmdW5jdGlvbiAobGF5b3V0SW5mbykge1xuXHRcdFx0bGF5b3V0SW5mby5lZGl0YWJsZSgpLm9uKCdwYXN0ZScsIGhQYXN0ZUNsaXBib2FyZEltYWdlKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogcGFzdGUgY2xpcGJvYXJkIGltYWdlXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuXHRcdCAqL1xuXHRcdHZhciBoUGFzdGVDbGlwYm9hcmRJbWFnZSA9IGZ1bmN0aW9uIChldmVudCkge1xuXHRcdFx0dmFyIGNsaXBib2FyZERhdGEgPSBldmVudC5vcmlnaW5hbEV2ZW50LmNsaXBib2FyZERhdGE7XG5cdFx0XHR2YXIgbGF5b3V0SW5mbyA9IGRvbS5tYWtlTGF5b3V0SW5mbyhldmVudC5jdXJyZW50VGFyZ2V0IHx8IGV2ZW50LnRhcmdldCk7XG5cdFx0XHR2YXIgJGVkaXRhYmxlID0gbGF5b3V0SW5mby5lZGl0YWJsZSgpO1xuXG5cdFx0XHRpZiAoIWNsaXBib2FyZERhdGEgfHwgIWNsaXBib2FyZERhdGEuaXRlbXMgfHwgIWNsaXBib2FyZERhdGEuaXRlbXMubGVuZ3RoKSB7XG5cdFx0XHRcdHZhciBjYWxsYmFja3MgPSAkZWRpdGFibGUuZGF0YSgnY2FsbGJhY2tzJyk7XG5cdFx0XHRcdC8vIG9ubHkgY2FuIHJ1biBpZiBpdCBoYXMgb25JbWFnZVVwbG9hZCBtZXRob2Rcblx0XHRcdFx0aWYgKCFjYWxsYmFja3Mub25JbWFnZVVwbG9hZCkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIHNhdmUgY3Vyc29yXG5cdFx0XHRcdGhhbmRsZXIuaW52b2tlKCdlZGl0b3Iuc2F2ZU5vZGUnLCAkZWRpdGFibGUpO1xuXHRcdFx0XHRoYW5kbGVyLmludm9rZSgnZWRpdG9yLnNhdmVSYW5nZScsICRlZGl0YWJsZSk7XG5cblx0XHRcdFx0JGVkaXRhYmxlLmh0bWwoJycpO1xuXG5cdFx0XHRcdHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdHZhciAkaW1nID0gJGVkaXRhYmxlLmZpbmQoJ2ltZycpO1xuXG5cdFx0XHRcdFx0Ly8gaWYgaW1nIGlzIG5vIGluIGNsaXBib2FyZCwgaW5zZXJ0IHRleHQgb3IgZG9tXG5cdFx0XHRcdFx0aWYgKCEkaW1nLmxlbmd0aCB8fCAkaW1nWzBdLnNyYy5pbmRleE9mKCdkYXRhOicpID09PSAtMSkge1xuXHRcdFx0XHRcdFx0dmFyIGh0bWwgPSAkZWRpdGFibGUuaHRtbCgpO1xuXG5cdFx0XHRcdFx0XHRoYW5kbGVyLmludm9rZSgnZWRpdG9yLnJlc3RvcmVOb2RlJywgJGVkaXRhYmxlKTtcblx0XHRcdFx0XHRcdGhhbmRsZXIuaW52b2tlKCdlZGl0b3IucmVzdG9yZVJhbmdlJywgJGVkaXRhYmxlKTtcblxuXHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0Ly8gaW5zZXJ0IG5vcm1hbCBkb20gY29kZVxuXHRcdFx0XHRcdFx0XHQkKGh0bWwpLmVhY2goZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdCRlZGl0YWJsZS5mb2N1cygpO1xuXHRcdFx0XHRcdFx0XHRcdGhhbmRsZXIuaW52b2tlKCdlZGl0b3IuaW5zZXJ0Tm9kZScsICRlZGl0YWJsZSwgdGhpcyk7XG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fSBjYXRjaCAoZXgpIHtcblx0XHRcdFx0XHRcdFx0Ly8gaW5zZXJ0IHRleHRcblx0XHRcdFx0XHRcdFx0JGVkaXRhYmxlLmZvY3VzKCk7XG5cdFx0XHRcdFx0XHRcdGhhbmRsZXIuaW52b2tlKCdlZGl0b3IuaW5zZXJ0VGV4dCcsICRlZGl0YWJsZSwgaHRtbCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0dmFyIGRhdGF1cmkgPSAkaW1nWzBdLnNyYztcblxuXHRcdFx0XHRcdHZhciBkYXRhID0gYXRvYihkYXRhdXJpLnNwbGl0KCcsJylbMV0pO1xuXHRcdFx0XHRcdHZhciBhcnJheSA9IG5ldyBVaW50OEFycmF5KGRhdGEubGVuZ3RoKTtcblx0XHRcdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRcdGFycmF5W2ldID0gZGF0YS5jaGFyQ29kZUF0KGkpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHZhciBibG9iID0gbmV3IEJsb2IoW2FycmF5XSwgeyB0eXBlOiAnaW1hZ2UvcG5nJyB9KTtcblx0XHRcdFx0XHRibG9iLm5hbWUgPSAnY2xpcGJvYXJkLnBuZyc7XG5cblx0XHRcdFx0XHRoYW5kbGVyLmludm9rZSgnZWRpdG9yLnJlc3RvcmVOb2RlJywgJGVkaXRhYmxlKTtcblx0XHRcdFx0XHRoYW5kbGVyLmludm9rZSgnZWRpdG9yLnJlc3RvcmVSYW5nZScsICRlZGl0YWJsZSk7XG5cdFx0XHRcdFx0aGFuZGxlci5pbnNlcnRJbWFnZXMobGF5b3V0SW5mbywgW2Jsb2JdKTtcblxuXHRcdFx0XHRcdGhhbmRsZXIuaW52b2tlKCdlZGl0b3IuYWZ0ZXJDb21tYW5kJywgJGVkaXRhYmxlKTtcblx0XHRcdFx0fSwgMCk7XG5cblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHR2YXIgaXRlbSA9IGxpc3QuaGVhZChjbGlwYm9hcmREYXRhLml0ZW1zKTtcblx0XHRcdHZhciBpc0NsaXBib2FyZEltYWdlID0gaXRlbS5raW5kID09PSAnZmlsZScgJiYgaXRlbS50eXBlLmluZGV4T2YoJ2ltYWdlLycpICE9PSAtMTtcblxuXHRcdFx0aWYgKGlzQ2xpcGJvYXJkSW1hZ2UpIHtcblx0XHRcdFx0aGFuZGxlci5pbnNlcnRJbWFnZXMobGF5b3V0SW5mbywgW2l0ZW0uZ2V0QXNGaWxlKCldKTtcblx0XHRcdH1cblxuXHRcdFx0aGFuZGxlci5pbnZva2UoJ2VkaXRvci5hZnRlckNvbW1hbmQnLCAkZWRpdGFibGUpO1xuXHRcdH07XG5cdH07XG5cblx0dmFyIExpbmtEaWFsb2cgPSBmdW5jdGlvbiAoaGFuZGxlcikge1xuXG5cdFx0LyoqXG5cdFx0ICogdG9nZ2xlIGJ1dHRvbiBzdGF0dXNcblx0XHQgKlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRidG5cblx0XHQgKiBAcGFyYW0ge0Jvb2xlYW59IGlzRW5hYmxlXG5cdFx0ICovXG5cdFx0dmFyIHRvZ2dsZUJ0biA9IGZ1bmN0aW9uICgkYnRuLCBpc0VuYWJsZSkge1xuXHRcdFx0JGJ0bi50b2dnbGVDbGFzcygnZGlzYWJsZWQnLCAhaXNFbmFibGUpO1xuXHRcdFx0JGJ0bi5hdHRyKCdkaXNhYmxlZCcsICFpc0VuYWJsZSk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIFNob3cgbGluayBkaWFsb2cgYW5kIHNldCBldmVudCBoYW5kbGVycyBvbiBkaWFsb2cgY29udHJvbHMuXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGVkaXRhYmxlXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRkaWFsb2dcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gbGlua0luZm9cblx0XHQgKiBAcmV0dXJuIHtQcm9taXNlfVxuXHRcdCAqL1xuXHRcdHRoaXMuc2hvd0xpbmtEaWFsb2cgPSBmdW5jdGlvbiAoJGVkaXRhYmxlLCAkZGlhbG9nLCBsaW5rSW5mbykge1xuXHRcdFx0cmV0dXJuICQuRGVmZXJyZWQoZnVuY3Rpb24gKGRlZmVycmVkKSB7XG5cdFx0XHRcdHZhciAkbGlua0RpYWxvZyA9ICRkaWFsb2cuZmluZCgnLm5vdGUtbGluay1kaWFsb2cnKTtcblxuXHRcdFx0XHR2YXIgJGxpbmtUZXh0ID0gJGxpbmtEaWFsb2cuZmluZCgnLm5vdGUtbGluay10ZXh0JyksXG5cdFx0XHRcdCRsaW5rVXJsID0gJGxpbmtEaWFsb2cuZmluZCgnLm5vdGUtbGluay11cmwnKSxcblx0XHRcdFx0JGxpbmtCdG4gPSAkbGlua0RpYWxvZy5maW5kKCcubm90ZS1saW5rLWJ0bicpLFxuXHRcdFx0XHQkb3BlbkluTmV3V2luZG93ID0gJGxpbmtEaWFsb2cuZmluZCgnaW5wdXRbdHlwZT1jaGVja2JveF0nKTtcblxuXHRcdFx0XHQkbGlua0RpYWxvZy5vbmUoJ3Nob3duLmJzLm1vZGFsJywgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdCRsaW5rVGV4dC52YWwobGlua0luZm8udGV4dCk7XG5cblx0XHRcdFx0XHQkbGlua1RleHQub24oJ2lucHV0JywgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0Ly8gaWYgbGlua3RleHQgd2FzIG1vZGlmaWVkIGJ5IGtleXVwLFxuXHRcdFx0XHRcdFx0Ly8gc3RvcCBjbG9uaW5nIHRleHQgZnJvbSBsaW5rVXJsXG5cdFx0XHRcdFx0XHRsaW5rSW5mby50ZXh0ID0gJGxpbmtUZXh0LnZhbCgpO1xuXHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0Ly8gaWYgbm8gdXJsIHdhcyBnaXZlbiwgY29weSB0ZXh0IHRvIHVybFxuXHRcdFx0XHRcdGlmICghbGlua0luZm8udXJsKSB7XG5cdFx0XHRcdFx0XHRsaW5rSW5mby51cmwgPSBsaW5rSW5mby50ZXh0O1xuXHRcdFx0XHRcdFx0dG9nZ2xlQnRuKCRsaW5rQnRuLCBsaW5rSW5mby50ZXh0KTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQkbGlua1VybC5vbignaW5wdXQnLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHR0b2dnbGVCdG4oJGxpbmtCdG4sICRsaW5rVXJsLnZhbCgpKTtcblx0XHRcdFx0XHRcdC8vIGRpc3BsYXkgc2FtZSBsaW5rIG9uIGBUZXh0IHRvIGRpc3BsYXlgIGlucHV0XG5cdFx0XHRcdFx0XHQvLyB3aGVuIGNyZWF0ZSBhIG5ldyBsaW5rXG5cdFx0XHRcdFx0XHRpZiAoIWxpbmtJbmZvLnRleHQpIHtcblx0XHRcdFx0XHRcdFx0JGxpbmtUZXh0LnZhbCgkbGlua1VybC52YWwoKSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSkudmFsKGxpbmtJbmZvLnVybCkudHJpZ2dlcignZm9jdXMnKS50cmlnZ2VyKCdzZWxlY3QnKTtcblxuXHRcdFx0XHRcdCRvcGVuSW5OZXdXaW5kb3cucHJvcCgnY2hlY2tlZCcsIGxpbmtJbmZvLm5ld1dpbmRvdyk7XG5cblx0XHRcdFx0XHQkbGlua0J0bi5vbmUoJ2NsaWNrJywgZnVuY3Rpb24gKGV2ZW50KSB7XG5cdFx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG5cdFx0XHRcdFx0XHRkZWZlcnJlZC5yZXNvbHZlKHtcblx0XHRcdFx0XHRcdFx0cmFuZ2U6IGxpbmtJbmZvLnJhbmdlLFxuXHRcdFx0XHRcdFx0XHR1cmw6ICRsaW5rVXJsLnZhbCgpLFxuXHRcdFx0XHRcdFx0XHR0ZXh0OiAkbGlua1RleHQudmFsKCksXG5cdFx0XHRcdFx0XHRcdG5ld1dpbmRvdzogJG9wZW5Jbk5ld1dpbmRvdy5pcygnOmNoZWNrZWQnKVxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHQkbGlua0RpYWxvZy5tb2RhbCgnaGlkZScpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9KS5vbmUoJ2hpZGRlbi5icy5tb2RhbCcsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHQvLyBkZXRhY2ggZXZlbnRzXG5cdFx0XHRcdFx0JGxpbmtUZXh0Lm9mZignaW5wdXQnKTtcblx0XHRcdFx0XHQkbGlua1VybC5vZmYoJ2lucHV0Jyk7XG5cdFx0XHRcdFx0JGxpbmtCdG4ub2ZmKCdjbGljaycpO1xuXG5cdFx0XHRcdFx0aWYgKGRlZmVycmVkLnN0YXRlKCkgPT09ICdwZW5kaW5nJykge1xuXHRcdFx0XHRcdFx0ZGVmZXJyZWQucmVqZWN0KCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KS5tb2RhbCgnc2hvdycpO1xuXHRcdFx0fSkucHJvbWlzZSgpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gbGF5b3V0SW5mb1xuXHRcdCAqL1xuXHRcdHRoaXMuc2hvdyA9IGZ1bmN0aW9uIChsYXlvdXRJbmZvKSB7XG5cdFx0XHR2YXIgJGVkaXRvciA9IGxheW91dEluZm8uZWRpdG9yKCksXG5cdFx0XHRcdCRkaWFsb2cgPSBsYXlvdXRJbmZvLmRpYWxvZygpLFxuXHRcdFx0XHQkZWRpdGFibGUgPSBsYXlvdXRJbmZvLmVkaXRhYmxlKCksXG5cdFx0XHRcdCRwb3BvdmVyID0gbGF5b3V0SW5mby5wb3BvdmVyKCksXG5cdFx0XHRcdGxpbmtJbmZvID0gaGFuZGxlci5pbnZva2UoJ2VkaXRvci5nZXRMaW5rSW5mbycsICRlZGl0YWJsZSk7XG5cblx0XHRcdHZhciBvcHRpb25zID0gJGVkaXRvci5kYXRhKCdvcHRpb25zJyk7XG5cblx0XHRcdGhhbmRsZXIuaW52b2tlKCdlZGl0b3Iuc2F2ZVJhbmdlJywgJGVkaXRhYmxlKTtcblx0XHRcdHRoaXMuc2hvd0xpbmtEaWFsb2coJGVkaXRhYmxlLCAkZGlhbG9nLCBsaW5rSW5mbykudGhlbihmdW5jdGlvbiAobGlua0luZm8pIHtcblx0XHRcdFx0aGFuZGxlci5pbnZva2UoJ2VkaXRvci5yZXN0b3JlUmFuZ2UnLCAkZWRpdGFibGUpO1xuXHRcdFx0XHRoYW5kbGVyLmludm9rZSgnZWRpdG9yLmNyZWF0ZUxpbmsnLCAkZWRpdGFibGUsIGxpbmtJbmZvLCBvcHRpb25zKTtcblx0XHRcdFx0Ly8gaGlkZSBwb3BvdmVyIGFmdGVyIGNyZWF0aW5nIGxpbmtcblx0XHRcdFx0aGFuZGxlci5pbnZva2UoJ3BvcG92ZXIuaGlkZScsICRwb3BvdmVyKTtcblx0XHRcdH0pLmZhaWwoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRoYW5kbGVyLmludm9rZSgnZWRpdG9yLnJlc3RvcmVSYW5nZScsICRlZGl0YWJsZSk7XG5cdFx0XHR9KTtcblx0XHR9O1xuXHR9O1xuXG5cdHZhciBJbWFnZURpYWxvZyA9IGZ1bmN0aW9uIChoYW5kbGVyKSB7XG5cdFx0LyoqXG5cdFx0ICogdG9nZ2xlIGJ1dHRvbiBzdGF0dXNcblx0XHQgKlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRidG5cblx0XHQgKiBAcGFyYW0ge0Jvb2xlYW59IGlzRW5hYmxlXG5cdFx0ICovXG5cdFx0dmFyIHRvZ2dsZUJ0biA9IGZ1bmN0aW9uICgkYnRuLCBpc0VuYWJsZSkge1xuXHRcdFx0JGJ0bi50b2dnbGVDbGFzcygnZGlzYWJsZWQnLCAhaXNFbmFibGUpO1xuXHRcdFx0JGJ0bi5hdHRyKCdkaXNhYmxlZCcsICFpc0VuYWJsZSk7XG5cdFx0fTtcblxuXHRcdHRoaXMuc2hvdyA9IGZ1bmN0aW9uIChsYXlvdXRJbmZvKSB7XG5cdFx0XHR2YXIgJGRpYWxvZyA9IGxheW91dEluZm8uZGlhbG9nKCksXG5cdFx0XHRcdCRlZGl0YWJsZSA9IGxheW91dEluZm8uZWRpdGFibGUoKTtcblxuXHRcdFx0aGFuZGxlci5pbnZva2UoJ2VkaXRvci5zYXZlUmFuZ2UnLCAkZWRpdGFibGUpO1xuXHRcdFx0dGhpcy5zaG93SW1hZ2VEaWFsb2coJGVkaXRhYmxlLCAkZGlhbG9nKS50aGVuKGZ1bmN0aW9uIChkYXRhKSB7XG5cdFx0XHRcdGhhbmRsZXIuaW52b2tlKCdlZGl0b3IucmVzdG9yZVJhbmdlJywgJGVkaXRhYmxlKTtcblxuXHRcdFx0XHRpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRcdFx0Ly8gaW1hZ2UgdXJsXG5cdFx0XHRcdFx0aGFuZGxlci5pbnZva2UoJ2VkaXRvci5pbnNlcnRJbWFnZScsICRlZGl0YWJsZSwgZGF0YSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gYXJyYXkgb2YgZmlsZXNcblx0XHRcdFx0XHRoYW5kbGVyLmluc2VydEltYWdlcyhsYXlvdXRJbmZvLCBkYXRhKTtcblx0XHRcdFx0fVxuXHRcdFx0fSkuZmFpbChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdGhhbmRsZXIuaW52b2tlKCdlZGl0b3IucmVzdG9yZVJhbmdlJywgJGVkaXRhYmxlKTtcblx0XHRcdH0pO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBzaG93IGltYWdlIGRpYWxvZ1xuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRlZGl0YWJsZVxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkZGlhbG9nXG5cdFx0ICogQHJldHVybiB7UHJvbWlzZX1cblx0XHQgKi9cblx0XHR0aGlzLnNob3dJbWFnZURpYWxvZyA9IGZ1bmN0aW9uICgkZWRpdGFibGUsICRkaWFsb2cpIHtcblx0XHRcdHJldHVybiAkLkRlZmVycmVkKGZ1bmN0aW9uIChkZWZlcnJlZCkge1xuXHRcdFx0XHR2YXIgJGltYWdlRGlhbG9nID0gJGRpYWxvZy5maW5kKCcubm90ZS1pbWFnZS1kaWFsb2cnKTtcblxuXHRcdFx0XHR2YXIgJGltYWdlSW5wdXQgPSAkZGlhbG9nLmZpbmQoJy5ub3RlLWltYWdlLWlucHV0JyksXG5cdFx0XHRcdFx0JGltYWdlVXJsID0gJGRpYWxvZy5maW5kKCcubm90ZS1pbWFnZS11cmwnKSxcblx0XHRcdFx0XHQkaW1hZ2VCdG4gPSAkZGlhbG9nLmZpbmQoJy5ub3RlLWltYWdlLWJ0bicpO1xuXG5cdFx0XHRcdCRpbWFnZURpYWxvZy5vbmUoJ3Nob3duLmJzLm1vZGFsJywgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdC8vIENsb25pbmcgaW1hZ2VJbnB1dCB0byBjbGVhciBlbGVtZW50LlxuXHRcdFx0XHRcdCRpbWFnZUlucHV0LnJlcGxhY2VXaXRoKCRpbWFnZUlucHV0LmNsb25lKClcblx0XHRcdFx0XHQgIC5vbignY2hhbmdlJywgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdCAgXHRkZWZlcnJlZC5yZXNvbHZlKHRoaXMuZmlsZXMgfHwgdGhpcy52YWx1ZSk7XG5cdFx0XHRcdFx0ICBcdCRpbWFnZURpYWxvZy5tb2RhbCgnaGlkZScpO1xuXHRcdFx0XHRcdCAgfSlcblx0XHRcdFx0XHQgIC52YWwoJycpXG5cdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdCRpbWFnZUJ0bi5jbGljayhmdW5jdGlvbiAoZXZlbnQpIHtcblx0XHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cblx0XHRcdFx0XHRcdGRlZmVycmVkLnJlc29sdmUoJGltYWdlVXJsLnZhbCgpKTtcblx0XHRcdFx0XHRcdCRpbWFnZURpYWxvZy5tb2RhbCgnaGlkZScpO1xuXHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0JGltYWdlVXJsLm9uKCdrZXl1cCBwYXN0ZScsIGZ1bmN0aW9uIChldmVudCkge1xuXHRcdFx0XHRcdFx0dmFyIHVybDtcblxuXHRcdFx0XHRcdFx0aWYgKGV2ZW50LnR5cGUgPT09ICdwYXN0ZScpIHtcblx0XHRcdFx0XHRcdFx0dXJsID0gZXZlbnQub3JpZ2luYWxFdmVudC5jbGlwYm9hcmREYXRhLmdldERhdGEoJ3RleHQnKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHVybCA9ICRpbWFnZVVybC52YWwoKTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0dG9nZ2xlQnRuKCRpbWFnZUJ0biwgdXJsKTtcblx0XHRcdFx0XHR9KS52YWwoJycpLnRyaWdnZXIoJ2ZvY3VzJyk7XG5cdFx0XHRcdH0pLm9uZSgnaGlkZGVuLmJzLm1vZGFsJywgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdCRpbWFnZUlucHV0Lm9mZignY2hhbmdlJyk7XG5cdFx0XHRcdFx0JGltYWdlVXJsLm9mZigna2V5dXAgcGFzdGUnKTtcblx0XHRcdFx0XHQkaW1hZ2VCdG4ub2ZmKCdjbGljaycpO1xuXG5cdFx0XHRcdFx0aWYgKGRlZmVycmVkLnN0YXRlKCkgPT09ICdwZW5kaW5nJykge1xuXHRcdFx0XHRcdFx0ZGVmZXJyZWQucmVqZWN0KCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KS5tb2RhbCgnc2hvdycpO1xuXHRcdFx0fSk7XG5cdFx0fTtcblx0fTtcblxuXHR2YXIgSGVscERpYWxvZyA9IGZ1bmN0aW9uIChoYW5kbGVyKSB7XG5cdFx0LyoqXG5cdFx0ICogc2hvdyBoZWxwIGRpYWxvZ1xuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRlZGl0YWJsZVxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkZGlhbG9nXG5cdFx0ICogQHJldHVybiB7UHJvbWlzZX1cblx0XHQgKi9cblx0XHR0aGlzLnNob3dIZWxwRGlhbG9nID0gZnVuY3Rpb24gKCRlZGl0YWJsZSwgJGRpYWxvZykge1xuXHRcdFx0cmV0dXJuICQuRGVmZXJyZWQoZnVuY3Rpb24gKGRlZmVycmVkKSB7XG5cdFx0XHRcdHZhciAkaGVscERpYWxvZyA9ICRkaWFsb2cuZmluZCgnLm5vdGUtaGVscC1kaWFsb2cnKTtcblxuXHRcdFx0XHQkaGVscERpYWxvZy5vbmUoJ2hpZGRlbi5icy5tb2RhbCcsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRkZWZlcnJlZC5yZXNvbHZlKCk7XG5cdFx0XHRcdH0pLm1vZGFsKCdzaG93Jyk7XG5cdFx0XHR9KS5wcm9taXNlKCk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBsYXlvdXRJbmZvXG5cdFx0ICovXG5cdFx0dGhpcy5zaG93ID0gZnVuY3Rpb24gKGxheW91dEluZm8pIHtcblx0XHRcdHZhciAkZGlhbG9nID0gbGF5b3V0SW5mby5kaWFsb2coKSxcblx0XHRcdFx0JGVkaXRhYmxlID0gbGF5b3V0SW5mby5lZGl0YWJsZSgpO1xuXG5cdFx0XHRoYW5kbGVyLmludm9rZSgnZWRpdG9yLnNhdmVSYW5nZScsICRlZGl0YWJsZSwgdHJ1ZSk7XG5cdFx0XHR0aGlzLnNob3dIZWxwRGlhbG9nKCRlZGl0YWJsZSwgJGRpYWxvZykudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdGhhbmRsZXIuaW52b2tlKCdlZGl0b3IucmVzdG9yZVJhbmdlJywgJGVkaXRhYmxlKTtcblx0XHRcdH0pO1xuXHRcdH07XG5cdH07XG5cblxuXHQvKipcblx0ICogQGNsYXNzIEV2ZW50SGFuZGxlclxuXHQgKlxuXHQgKiBFdmVudEhhbmRsZXJcblx0ICogIC0gVE9ETzogbmV3IGluc3RhbmNlIHBlciBhIGVkaXRvclxuXHQgKiAgLSBUT0RPOiByZW5hbWUgRXZlbnRIYW5kbGVyXG5cdCAqL1xuXHR2YXIgRXZlbnRIYW5kbGVyID0gZnVuY3Rpb24gKCkge1xuXHRcdC8qKlxuXHRcdCAqIE1vZHVsZXNcblx0XHQgKi9cblx0XHR2YXIgbW9kdWxlcyA9IHRoaXMubW9kdWxlcyA9IHtcblx0XHRcdGVkaXRvcjogbmV3IEVkaXRvcih0aGlzKSxcblx0XHRcdHRvb2xiYXI6IG5ldyBUb29sYmFyKHRoaXMpLFxuXHRcdFx0c3RhdHVzYmFyOiBuZXcgU3RhdHVzYmFyKHRoaXMpLFxuXHRcdFx0cG9wb3ZlcjogbmV3IFBvcG92ZXIodGhpcyksXG5cdFx0XHRoYW5kbGU6IG5ldyBIYW5kbGUodGhpcyksXG5cdFx0XHRmdWxsc2NyZWVuOiBuZXcgRnVsbHNjcmVlbih0aGlzKSxcblx0XHRcdGNvZGV2aWV3OiBuZXcgQ29kZXZpZXcodGhpcyksXG5cdFx0XHRkcmFnQW5kRHJvcDogbmV3IERyYWdBbmREcm9wKHRoaXMpLFxuXHRcdFx0Y2xpcGJvYXJkOiBuZXcgQ2xpcGJvYXJkKHRoaXMpLFxuXHRcdFx0bGlua0RpYWxvZzogbmV3IExpbmtEaWFsb2codGhpcyksXG5cdFx0XHRpbWFnZURpYWxvZzogbmV3IEltYWdlRGlhbG9nKHRoaXMpLFxuXHRcdFx0aGVscERpYWxvZzogbmV3IEhlbHBEaWFsb2codGhpcylcblx0XHR9O1xuXG5cdFx0Ly8gVE9ETyByZWZhY3RvciBtb2R1bGVzIGFuZCBldmVudEhhbmRsZXJcblx0XHQvLyAgLSByZW1vdmUgdGhpcyBtZXRob2QgYW5kIHVzZSBjdXN0b20gZXZlbnQgZnJvbSAkaG9sZGVyIGluc3RlYWRcblx0XHR0aGlzLmludm9rZSA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdHZhciBtb2R1bGVBbmRNZXRob2QgPSBsaXN0LmhlYWQobGlzdC5mcm9tKGFyZ3VtZW50cykpO1xuXHRcdFx0dmFyIGFyZ3MgPSBsaXN0LnRhaWwobGlzdC5mcm9tKGFyZ3VtZW50cykpO1xuXG5cdFx0XHR2YXIgc3BsaXRzID0gbW9kdWxlQW5kTWV0aG9kLnNwbGl0KCcuJyk7XG5cdFx0XHR2YXIgaGFzU2VwYXJhdG9yID0gc3BsaXRzLmxlbmd0aCA+IDE7XG5cdFx0XHR2YXIgbW9kdWxlTmFtZSA9IGhhc1NlcGFyYXRvciAmJiBsaXN0LmhlYWQoc3BsaXRzKTtcblx0XHRcdHZhciBtZXRob2ROYW1lID0gaGFzU2VwYXJhdG9yID8gbGlzdC5sYXN0KHNwbGl0cykgOiBsaXN0LmhlYWQoc3BsaXRzKTtcblxuXHRcdFx0dmFyIG1vZHVsZSA9IHRoaXMuZ2V0TW9kdWxlKG1vZHVsZU5hbWUpO1xuXHRcdFx0dmFyIG1ldGhvZCA9IG1vZHVsZVttZXRob2ROYW1lXTtcblxuXHRcdFx0cmV0dXJuIG1ldGhvZCAmJiBtZXRob2QuYXBwbHkobW9kdWxlLCBhcmdzKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogcmV0dXJucyBtb2R1bGVcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSBtb2R1bGVOYW1lIC0gbmFtZSBvZiBtb2R1bGVcblx0XHQgKiBAcmV0dXJuIHtNb2R1bGV9IC0gZGVmYXVsdHMgaXMgZWRpdG9yXG5cdFx0ICovXG5cdFx0dGhpcy5nZXRNb2R1bGUgPSBmdW5jdGlvbiAobW9kdWxlTmFtZSkge1xuXHRcdFx0cmV0dXJuIHRoaXMubW9kdWxlc1ttb2R1bGVOYW1lXSB8fCB0aGlzLm1vZHVsZXMuZWRpdG9yO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBpbnNlcnQgSW1hZ2VzIGZyb20gZmlsZSBhcnJheS5cblx0XHQgKlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IGxheW91dEluZm9cblx0XHQgKiBAcGFyYW0ge0ZpbGVbXX0gZmlsZXNcblx0XHQgKi9cblx0XHR0aGlzLmluc2VydEltYWdlcyA9IGZ1bmN0aW9uIChsYXlvdXRJbmZvLCBmaWxlcykge1xuXHRcdFx0dmFyICRlZGl0b3IgPSBsYXlvdXRJbmZvLmVkaXRvcigpLFxuXHRcdFx0XHQkZWRpdGFibGUgPSBsYXlvdXRJbmZvLmVkaXRhYmxlKCksXG5cdFx0XHRcdCRob2xkZXIgPSBsYXlvdXRJbmZvLmhvbGRlcigpO1xuXG5cdFx0XHR2YXIgY2FsbGJhY2tzID0gJGVkaXRhYmxlLmRhdGEoJ2NhbGxiYWNrcycpO1xuXHRcdFx0dmFyIG9wdGlvbnMgPSAkZWRpdG9yLmRhdGEoJ29wdGlvbnMnKTtcblxuXHRcdFx0Ly8gSWYgb25JbWFnZVVwbG9hZCBvcHRpb25zIHNldHRlZFxuXHRcdFx0aWYgKGNhbGxiYWNrcy5vbkltYWdlVXBsb2FkKSB7XG5cdFx0XHRcdGNhbGxiYWNrcy5vbkltYWdlVXBsb2FkKGZpbGVzLCBtb2R1bGVzLmVkaXRvciwgJGVkaXRhYmxlKTtcblx0XHRcdFx0YmluZEN1c3RvbUV2ZW50KCRob2xkZXIsICdpbWFnZS51cGxvYWQnKShbZmlsZXNdKTtcblx0XHRcdFx0Ly8gZWxzZSBpbnNlcnQgSW1hZ2UgYXMgZGF0YVVSTFxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0JC5lYWNoKGZpbGVzLCBmdW5jdGlvbiAoaWR4LCBmaWxlKSB7XG5cdFx0XHRcdFx0dmFyIGZpbGVuYW1lID0gZmlsZS5uYW1lO1xuXHRcdFx0XHRcdGlmIChvcHRpb25zLm1heGltdW1JbWFnZUZpbGVTaXplICYmIG9wdGlvbnMubWF4aW11bUltYWdlRmlsZVNpemUgPCBmaWxlLnNpemUpIHtcblx0XHRcdFx0XHRcdGlmIChjYWxsYmFja3Mub25JbWFnZVVwbG9hZEVycm9yKSB7XG5cdFx0XHRcdFx0XHRcdGNhbGxiYWNrcy5vbkltYWdlVXBsb2FkRXJyb3Iob3B0aW9ucy5sYW5nSW5mby5pbWFnZS5tYXhpbXVtRmlsZVNpemVFcnJvcik7XG5cdFx0XHRcdFx0XHRcdGJpbmRDdXN0b21FdmVudCgkaG9sZGVyLCAnaW1hZ2UudXBsb2FkLmVycm9yJykob3B0aW9ucy5sYW5nSW5mby5pbWFnZS5tYXhpbXVtRmlsZVNpemVFcnJvcik7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRhbGVydChvcHRpb25zLmxhbmdJbmZvLmltYWdlLm1heGltdW1GaWxlU2l6ZUVycm9yKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0YXN5bmMucmVhZEZpbGVBc0RhdGFVUkwoZmlsZSkudGhlbihmdW5jdGlvbiAoc0RhdGFVUkwpIHtcblx0XHRcdFx0XHRcdFx0bW9kdWxlcy5lZGl0b3IuaW5zZXJ0SW1hZ2UoJGVkaXRhYmxlLCBzRGF0YVVSTCwgZmlsZW5hbWUpO1xuXHRcdFx0XHRcdFx0fSkuZmFpbChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdGlmIChjYWxsYmFja3Mub25JbWFnZVVwbG9hZEVycm9yKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y2FsbGJhY2tzLm9uSW1hZ2VVcGxvYWRFcnJvcigpO1xuXHRcdFx0XHRcdFx0XHRcdGJpbmRDdXN0b21FdmVudCgkaG9sZGVyLCAnaW1hZ2UudXBsb2FkLmVycm9yJykob3B0aW9ucy5sYW5nSW5mby5pbWFnZS5tYXhpbXVtRmlsZVNpemVFcnJvcik7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdHZhciBjb21tYW5kcyA9IHtcblx0XHRcdC8qKlxuXHRcdFx0ICogQHBhcmFtIHtPYmplY3R9IGxheW91dEluZm9cblx0XHRcdCAqL1xuXHRcdFx0c2hvd0xpbmtEaWFsb2c6IGZ1bmN0aW9uIChsYXlvdXRJbmZvKSB7XG5cdFx0XHRcdG1vZHVsZXMubGlua0RpYWxvZy5zaG93KGxheW91dEluZm8pO1xuXHRcdFx0fSxcblxuXHRcdFx0LyoqXG5cdFx0XHQgKiBAcGFyYW0ge09iamVjdH0gbGF5b3V0SW5mb1xuXHRcdFx0ICovXG5cdFx0XHRzaG93SW1hZ2VEaWFsb2c6IGZ1bmN0aW9uIChsYXlvdXRJbmZvKSB7XG5cdFx0XHRcdG1vZHVsZXMuaW1hZ2VEaWFsb2cuc2hvdyhsYXlvdXRJbmZvKTtcblx0XHRcdH0sXG5cblx0XHRcdC8qKlxuXHRcdFx0ICogQHBhcmFtIHtPYmplY3R9IGxheW91dEluZm9cblx0XHRcdCAqL1xuXHRcdFx0c2hvd0hlbHBEaWFsb2c6IGZ1bmN0aW9uIChsYXlvdXRJbmZvKSB7XG5cdFx0XHRcdG1vZHVsZXMuaGVscERpYWxvZy5zaG93KGxheW91dEluZm8pO1xuXHRcdFx0fSxcblxuXHRcdFx0LyoqXG5cdFx0XHQgKiBAcGFyYW0ge09iamVjdH0gbGF5b3V0SW5mb1xuXHRcdFx0ICovXG5cdFx0XHRmdWxsc2NyZWVuOiBmdW5jdGlvbiAobGF5b3V0SW5mbykge1xuXHRcdFx0XHRtb2R1bGVzLmZ1bGxzY3JlZW4udG9nZ2xlKGxheW91dEluZm8pO1xuXHRcdFx0fSxcblxuXHRcdFx0LyoqXG5cdFx0XHQgKiBAcGFyYW0ge09iamVjdH0gbGF5b3V0SW5mb1xuXHRcdFx0ICovXG5cdFx0XHRjb2RldmlldzogZnVuY3Rpb24gKGxheW91dEluZm8pIHtcblx0XHRcdFx0bW9kdWxlcy5jb2Rldmlldy50b2dnbGUobGF5b3V0SW5mbyk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdHZhciBoTW91c2Vkb3duID0gZnVuY3Rpb24gKGV2ZW50KSB7XG5cdFx0XHQvL3ByZXZlbnREZWZhdWx0IFNlbGVjdGlvbiBmb3IgRkYsIElFOCtcblx0XHRcdGlmIChkb20uaXNJbWcoZXZlbnQudGFyZ2V0KSkge1xuXHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHR2YXIgaFRvb2xiYXJBbmRQb3BvdmVyVXBkYXRlID0gZnVuY3Rpb24gKGV2ZW50KSB7XG5cdFx0XHQvLyBkZWxheSBmb3IgcmFuZ2UgYWZ0ZXIgbW91c2V1cFxuXHRcdFx0c2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHZhciBsYXlvdXRJbmZvID0gZG9tLm1ha2VMYXlvdXRJbmZvKGV2ZW50LmN1cnJlbnRUYXJnZXQgfHwgZXZlbnQudGFyZ2V0KTtcblx0XHRcdFx0dmFyIHN0eWxlSW5mbyA9IG1vZHVsZXMuZWRpdG9yLmN1cnJlbnRTdHlsZShldmVudC50YXJnZXQpO1xuXHRcdFx0XHRpZiAoIXN0eWxlSW5mbykgeyByZXR1cm47IH1cblxuXHRcdFx0XHR2YXIgaXNBaXJNb2RlID0gbGF5b3V0SW5mby5lZGl0b3IoKS5kYXRhKCdvcHRpb25zJykuYWlyTW9kZTtcblx0XHRcdFx0aWYgKCFpc0Fpck1vZGUpIHtcblx0XHRcdFx0XHRtb2R1bGVzLnRvb2xiYXIudXBkYXRlKGxheW91dEluZm8udG9vbGJhcigpLCBzdHlsZUluZm8pO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0bW9kdWxlcy5wb3BvdmVyLnVwZGF0ZShsYXlvdXRJbmZvLnBvcG92ZXIoKSwgc3R5bGVJbmZvLCBpc0Fpck1vZGUpO1xuXHRcdFx0XHRtb2R1bGVzLmhhbmRsZS51cGRhdGUobGF5b3V0SW5mby5oYW5kbGUoKSwgc3R5bGVJbmZvLCBpc0Fpck1vZGUpO1xuXHRcdFx0fSwgMCk7XG5cdFx0fTtcblxuXHRcdHZhciBoU2Nyb2xsID0gZnVuY3Rpb24gKGV2ZW50KSB7XG5cdFx0XHR2YXIgbGF5b3V0SW5mbyA9IGRvbS5tYWtlTGF5b3V0SW5mbyhldmVudC5jdXJyZW50VGFyZ2V0IHx8IGV2ZW50LnRhcmdldCk7XG5cdFx0XHQvL2hpZGUgcG9wb3ZlciBhbmQgaGFuZGxlIHdoZW4gc2Nyb2xsZWRcblx0XHRcdG1vZHVsZXMucG9wb3Zlci5oaWRlKGxheW91dEluZm8ucG9wb3ZlcigpKTtcblx0XHRcdG1vZHVsZXMuaGFuZGxlLmhpZGUobGF5b3V0SW5mby5oYW5kbGUoKSk7XG5cdFx0fTtcblxuXHRcdHZhciBoVG9vbGJhckFuZFBvcG92ZXJNb3VzZWRvd24gPSBmdW5jdGlvbiAoZXZlbnQpIHtcblx0XHRcdC8vIHByZXZlbnQgZGVmYXVsdCBldmVudCB3aGVuIGluc2VydFRhYmxlIChGRiwgV2Via2l0KVxuXHRcdFx0dmFyICRidG4gPSAkKGV2ZW50LnRhcmdldCkuY2xvc2VzdCgnW2RhdGEtZXZlbnRdJyk7XG5cdFx0XHRpZiAoJGJ0bi5sZW5ndGgpIHtcblx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0dmFyIGhUb29sYmFyQW5kUG9wb3ZlckNsaWNrID0gZnVuY3Rpb24gKGV2ZW50KSB7XG5cdFx0XHR2YXIgJGJ0biA9ICQoZXZlbnQudGFyZ2V0KS5jbG9zZXN0KCdbZGF0YS1ldmVudF0nKTtcblxuXHRcdFx0aWYgKCRidG4ubGVuZ3RoKSB7XG5cdFx0XHRcdHZhciBldmVudE5hbWUgPSAkYnRuLmF0dHIoJ2RhdGEtZXZlbnQnKSxcblx0XHRcdFx0XHR2YWx1ZSA9ICRidG4uYXR0cignZGF0YS12YWx1ZScpLFxuXHRcdFx0XHRcdGhpZGUgPSAkYnRuLmF0dHIoJ2RhdGEtaGlkZScpO1xuXG5cdFx0XHRcdHZhciBsYXlvdXRJbmZvID0gZG9tLm1ha2VMYXlvdXRJbmZvKGV2ZW50LnRhcmdldCk7XG5cblx0XHRcdFx0Ly8gYmVmb3JlIGNvbW1hbmQ6IGRldGVjdCBjb250cm9sIHNlbGVjdGlvbiBlbGVtZW50KCR0YXJnZXQpXG5cdFx0XHRcdHZhciAkdGFyZ2V0O1xuXHRcdFx0XHRpZiAoJC5pbkFycmF5KGV2ZW50TmFtZSwgWydyZXNpemUnLCAnZmxvYXRNZScsICdyZW1vdmVNZWRpYScsICdpbWFnZVNoYXBlJ10pICE9PSAtMSkge1xuXHRcdFx0XHRcdHZhciAkc2VsZWN0aW9uID0gbGF5b3V0SW5mby5oYW5kbGUoKS5maW5kKCcubm90ZS1jb250cm9sLXNlbGVjdGlvbicpO1xuXHRcdFx0XHRcdCR0YXJnZXQgPSAkKCRzZWxlY3Rpb24uZGF0YSgndGFyZ2V0JykpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gSWYgcmVxdWVzdGVkLCBoaWRlIHRoZSBwb3BvdmVyIHdoZW4gdGhlIGJ1dHRvbiBpcyBjbGlja2VkLlxuXHRcdFx0XHQvLyBVc2VmdWwgZm9yIHRoaW5ncyBsaWtlIHNob3dIZWxwRGlhbG9nLlxuXHRcdFx0XHRpZiAoaGlkZSkge1xuXHRcdFx0XHRcdCRidG4ucGFyZW50cygnLnBvcG92ZXInKS5oaWRlKCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoJC5pc0Z1bmN0aW9uKCQuc3VtbWVybm90ZS5wbHVnaW5FdmVudHNbZXZlbnROYW1lXSkpIHtcblx0XHRcdFx0XHQkLnN1bW1lcm5vdGUucGx1Z2luRXZlbnRzW2V2ZW50TmFtZV0oZXZlbnQsIG1vZHVsZXMuZWRpdG9yLCBsYXlvdXRJbmZvLCB2YWx1ZSk7XG5cdFx0XHRcdH0gZWxzZSBpZiAobW9kdWxlcy5lZGl0b3JbZXZlbnROYW1lXSkgeyAvLyBvbiBjb21tYW5kXG5cdFx0XHRcdFx0dmFyICRlZGl0YWJsZSA9IGxheW91dEluZm8uZWRpdGFibGUoKTtcblx0XHRcdFx0XHQkZWRpdGFibGUuZm9jdXMoKTtcblx0XHRcdFx0XHRtb2R1bGVzLmVkaXRvcltldmVudE5hbWVdKCRlZGl0YWJsZSwgdmFsdWUsICR0YXJnZXQpO1xuXHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRcdH0gZWxzZSBpZiAoY29tbWFuZHNbZXZlbnROYW1lXSkge1xuXHRcdFx0XHRcdGNvbW1hbmRzW2V2ZW50TmFtZV0uY2FsbCh0aGlzLCBsYXlvdXRJbmZvKTtcblx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gYWZ0ZXIgY29tbWFuZFxuXHRcdFx0XHRpZiAoJC5pbkFycmF5KGV2ZW50TmFtZSwgWydiYWNrQ29sb3InLCAnZm9yZUNvbG9yJ10pICE9PSAtMSkge1xuXHRcdFx0XHRcdHZhciBvcHRpb25zID0gbGF5b3V0SW5mby5lZGl0b3IoKS5kYXRhKCdvcHRpb25zJywgb3B0aW9ucyk7XG5cdFx0XHRcdFx0dmFyIG1vZHVsZSA9IG9wdGlvbnMuYWlyTW9kZSA/IG1vZHVsZXMucG9wb3ZlciA6IG1vZHVsZXMudG9vbGJhcjtcblx0XHRcdFx0XHRtb2R1bGUudXBkYXRlUmVjZW50Q29sb3IobGlzdC5oZWFkKCRidG4pLCBldmVudE5hbWUsIHZhbHVlKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGhUb29sYmFyQW5kUG9wb3ZlclVwZGF0ZShldmVudCk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdHZhciBQWF9QRVJfRU0gPSAxODtcblx0XHR2YXIgaERpbWVuc2lvblBpY2tlck1vdmUgPSBmdW5jdGlvbiAoZXZlbnQsIG9wdGlvbnMpIHtcblx0XHRcdHZhciAkcGlja2VyID0gJChldmVudC50YXJnZXQucGFyZW50Tm9kZSk7IC8vIHRhcmdldCBpcyBtb3VzZWNhdGNoZXJcblx0XHRcdHZhciAkZGltZW5zaW9uRGlzcGxheSA9ICRwaWNrZXIubmV4dCgpO1xuXHRcdFx0dmFyICRjYXRjaGVyID0gJHBpY2tlci5maW5kKCcubm90ZS1kaW1lbnNpb24tcGlja2VyLW1vdXNlY2F0Y2hlcicpO1xuXHRcdFx0dmFyICRoaWdobGlnaHRlZCA9ICRwaWNrZXIuZmluZCgnLm5vdGUtZGltZW5zaW9uLXBpY2tlci1oaWdobGlnaHRlZCcpO1xuXHRcdFx0dmFyICR1bmhpZ2hsaWdodGVkID0gJHBpY2tlci5maW5kKCcubm90ZS1kaW1lbnNpb24tcGlja2VyLXVuaGlnaGxpZ2h0ZWQnKTtcblxuXHRcdFx0dmFyIHBvc09mZnNldDtcblx0XHRcdC8vIEhUTUw1IHdpdGggalF1ZXJ5IC0gZS5vZmZzZXRYIGlzIHVuZGVmaW5lZCBpbiBGaXJlZm94XG5cdFx0XHRpZiAoZXZlbnQub2Zmc2V0WCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHZhciBwb3NDYXRjaGVyID0gJChldmVudC50YXJnZXQpLm9mZnNldCgpO1xuXHRcdFx0XHRwb3NPZmZzZXQgPSB7XG5cdFx0XHRcdFx0eDogZXZlbnQucGFnZVggLSBwb3NDYXRjaGVyLmxlZnQsXG5cdFx0XHRcdFx0eTogZXZlbnQucGFnZVkgLSBwb3NDYXRjaGVyLnRvcFxuXHRcdFx0XHR9O1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cG9zT2Zmc2V0ID0ge1xuXHRcdFx0XHRcdHg6IGV2ZW50Lm9mZnNldFgsXG5cdFx0XHRcdFx0eTogZXZlbnQub2Zmc2V0WVxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXG5cdFx0XHR2YXIgZGltID0ge1xuXHRcdFx0XHRjOiBNYXRoLmNlaWwocG9zT2Zmc2V0LnggLyBQWF9QRVJfRU0pIHx8IDEsXG5cdFx0XHRcdHI6IE1hdGguY2VpbChwb3NPZmZzZXQueSAvIFBYX1BFUl9FTSkgfHwgMVxuXHRcdFx0fTtcblxuXHRcdFx0JGhpZ2hsaWdodGVkLmNzcyh7IHdpZHRoOiBkaW0uYyArICdlbScsIGhlaWdodDogZGltLnIgKyAnZW0nIH0pO1xuXHRcdFx0JGNhdGNoZXIuYXR0cignZGF0YS12YWx1ZScsIGRpbS5jICsgJ3gnICsgZGltLnIpO1xuXG5cdFx0XHRpZiAoMyA8IGRpbS5jICYmIGRpbS5jIDwgb3B0aW9ucy5pbnNlcnRUYWJsZU1heFNpemUuY29sKSB7XG5cdFx0XHRcdCR1bmhpZ2hsaWdodGVkLmNzcyh7IHdpZHRoOiBkaW0uYyArIDEgKyAnZW0nIH0pO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoMyA8IGRpbS5yICYmIGRpbS5yIDwgb3B0aW9ucy5pbnNlcnRUYWJsZU1heFNpemUucm93KSB7XG5cdFx0XHRcdCR1bmhpZ2hsaWdodGVkLmNzcyh7IGhlaWdodDogZGltLnIgKyAxICsgJ2VtJyB9KTtcblx0XHRcdH1cblxuXHRcdFx0JGRpbWVuc2lvbkRpc3BsYXkuaHRtbChkaW0uYyArICcgeCAnICsgZGltLnIpO1xuXHRcdH07XG5cblx0XHR2YXIgYmluZEN1c3RvbUV2ZW50ID0gZnVuY3Rpb24gKCRob2xkZXIsIGV2ZW50TmFtZSkge1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0cmV0dXJuICRob2xkZXIudHJpZ2dlcignc3VtbWVybm90ZS4nICsgZXZlbnROYW1lLCBhcmd1bWVudHMpO1xuXHRcdFx0fTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogYmluZCBLZXlNYXAgb24ga2V5ZG93blxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IGxheW91dEluZm9cblx0XHQgKiBAcGFyYW0ge09iamVjdH0ga2V5TWFwXG5cdFx0ICovXG5cdFx0dGhpcy5iaW5kS2V5TWFwID0gZnVuY3Rpb24gKGxheW91dEluZm8sIGtleU1hcCkge1xuXHRcdFx0dmFyICRlZGl0b3IgPSBsYXlvdXRJbmZvLmVkaXRvcigpO1xuXHRcdFx0dmFyICRlZGl0YWJsZSA9IGxheW91dEluZm8uZWRpdGFibGUoKTtcblxuXHRcdFx0JGVkaXRhYmxlLm9uKCdrZXlkb3duJywgZnVuY3Rpb24gKGV2ZW50KSB7XG5cdFx0XHRcdHZhciBrZXlzID0gW107XG5cblx0XHRcdFx0Ly8gbW9kaWZpZXJcblx0XHRcdFx0aWYgKGV2ZW50Lm1ldGFLZXkpIHsga2V5cy5wdXNoKCdDTUQnKTsgfVxuXHRcdFx0XHRpZiAoZXZlbnQuY3RybEtleSAmJiAhZXZlbnQuYWx0S2V5KSB7IGtleXMucHVzaCgnQ1RSTCcpOyB9XG5cdFx0XHRcdGlmIChldmVudC5zaGlmdEtleSkgeyBrZXlzLnB1c2goJ1NISUZUJyk7IH1cblxuXHRcdFx0XHQvLyBrZXljb2RlXG5cdFx0XHRcdHZhciBrZXlOYW1lID0ga2V5Lm5hbWVGcm9tQ29kZVtldmVudC5rZXlDb2RlXTtcblx0XHRcdFx0aWYgKGtleU5hbWUpIHtcblx0XHRcdFx0XHRrZXlzLnB1c2goa2V5TmFtZSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR2YXIgZXZlbnROYW1lID0ga2V5TWFwW2tleXMuam9pbignKycpXTtcblx0XHRcdFx0aWYgKGV2ZW50TmFtZSkge1xuXHRcdFx0XHRcdGlmICgkLnN1bW1lcm5vdGUucGx1Z2luRXZlbnRzW2V2ZW50TmFtZV0pIHtcblx0XHRcdFx0XHRcdHZhciBwbHVnaW4gPSAkLnN1bW1lcm5vdGUucGx1Z2luRXZlbnRzW2V2ZW50TmFtZV07XG5cdFx0XHRcdFx0XHRpZiAoJC5pc0Z1bmN0aW9uKHBsdWdpbikpIHtcblx0XHRcdFx0XHRcdFx0cGx1Z2luKGV2ZW50LCBtb2R1bGVzLmVkaXRvciwgbGF5b3V0SW5mbyk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChtb2R1bGVzLmVkaXRvcltldmVudE5hbWVdKSB7XG5cdFx0XHRcdFx0XHRtb2R1bGVzLmVkaXRvcltldmVudE5hbWVdKCRlZGl0YWJsZSwgJGVkaXRvci5kYXRhKCdvcHRpb25zJykpO1xuXHRcdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKGNvbW1hbmRzW2V2ZW50TmFtZV0pIHtcblx0XHRcdFx0XHRcdGNvbW1hbmRzW2V2ZW50TmFtZV0uY2FsbCh0aGlzLCBsYXlvdXRJbmZvKTtcblx0XHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKGtleS5pc0VkaXQoZXZlbnQua2V5Q29kZSkpIHtcblx0XHRcdFx0XHRtb2R1bGVzLmVkaXRvci5hZnRlckNvbW1hbmQoJGVkaXRhYmxlKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIGF0dGFjaCBldmVudGhhbmRsZXJcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBsYXlvdXRJbmZvIC0gbGF5b3V0IEluZm9ybWF0aW9uc1xuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gdXNlciBvcHRpb25zIGluY2x1ZGUgY3VzdG9tIGV2ZW50IGhhbmRsZXJzXG5cdFx0ICogQHBhcmFtIHtmdW5jdGlvbihldmVudCl9IFtvcHRpb25zLm9uZW50ZXJdIC0gZW50ZXIga2V5IGhhbmRsZXJcblx0XHQgKiBAcGFyYW0ge2Z1bmN0aW9uKGV2ZW50KX0gW29wdGlvbnMub25mb2N1c11cblx0XHQgKiBAcGFyYW0ge2Z1bmN0aW9uKGV2ZW50KX0gW29wdGlvbnMub25ibHVyXVxuXHRcdCAqIEBwYXJhbSB7ZnVuY3Rpb24oZXZlbnQpfSBbb3B0aW9ucy5vbmtleXVwXVxuXHRcdCAqIEBwYXJhbSB7ZnVuY3Rpb24oZXZlbnQpfSBbb3B0aW9ucy5vbmtleWRvd25dXG5cdFx0ICogQHBhcmFtIHtmdW5jdGlvbihldmVudCl9IFtvcHRpb25zLm9ucGFzdGVdXG5cdFx0ICogQHBhcmFtIHtmdW5jdGlvbihldmVudCl9IFtvcHRpb25zLm9uVG9vbEJhcmNsaWNrXVxuXHRcdCAqIEBwYXJhbSB7ZnVuY3Rpb24oZXZlbnQpfSBbb3B0aW9ucy5vbkNoYW5nZV1cblx0XHQgKi9cblx0XHR0aGlzLmF0dGFjaCA9IGZ1bmN0aW9uIChsYXlvdXRJbmZvLCBvcHRpb25zKSB7XG5cdFx0XHQvLyBoYW5kbGVycyBmb3IgZWRpdGFibGVcblx0XHRcdGlmIChvcHRpb25zLnNob3J0Y3V0cykge1xuXHRcdFx0XHR0aGlzLmJpbmRLZXlNYXAobGF5b3V0SW5mbywgb3B0aW9ucy5rZXlNYXBbYWdlbnQuaXNNYWMgPyAnbWFjJyA6ICdwYyddKTtcblx0XHRcdH1cblx0XHRcdGxheW91dEluZm8uZWRpdGFibGUoKS5vbignbW91c2Vkb3duJywgaE1vdXNlZG93bik7XG5cdFx0XHRsYXlvdXRJbmZvLmVkaXRhYmxlKCkub24oJ2tleXVwIG1vdXNldXAnLCBoVG9vbGJhckFuZFBvcG92ZXJVcGRhdGUpO1xuXHRcdFx0bGF5b3V0SW5mby5lZGl0YWJsZSgpLm9uKCdzY3JvbGwnLCBoU2Nyb2xsKTtcblx0XHRcdG1vZHVsZXMuY2xpcGJvYXJkLmF0dGFjaChsYXlvdXRJbmZvLCBvcHRpb25zKTtcblxuXHRcdFx0Ly8gaGFuZGxlciBmb3IgaGFuZGxlIGFuZCBwb3BvdmVyXG5cdFx0XHRtb2R1bGVzLmhhbmRsZS5hdHRhY2gobGF5b3V0SW5mbywgb3B0aW9ucyk7XG5cdFx0XHRsYXlvdXRJbmZvLnBvcG92ZXIoKS5vbignY2xpY2snLCBoVG9vbGJhckFuZFBvcG92ZXJDbGljayk7XG5cdFx0XHRsYXlvdXRJbmZvLnBvcG92ZXIoKS5vbignbW91c2Vkb3duJywgaFRvb2xiYXJBbmRQb3BvdmVyTW91c2Vkb3duKTtcblxuXHRcdFx0Ly8gaGFuZGxlciBmb3IgZHJhZyBhbmQgZHJvcFxuXHRcdFx0bW9kdWxlcy5kcmFnQW5kRHJvcC5hdHRhY2gobGF5b3V0SW5mbywgb3B0aW9ucyk7XG5cblx0XHRcdC8vIGhhbmRsZXJzIGZvciBmcmFtZSBtb2RlICh0b29sYmFyLCBzdGF0dXNiYXIpXG5cdFx0XHRpZiAoIW9wdGlvbnMuYWlyTW9kZSkge1xuXHRcdFx0XHQvLyBoYW5kbGVyIGZvciB0b29sYmFyXG5cdFx0XHRcdGxheW91dEluZm8udG9vbGJhcigpLm9uKCdjbGljaycsIGhUb29sYmFyQW5kUG9wb3ZlckNsaWNrKTtcblx0XHRcdFx0bGF5b3V0SW5mby50b29sYmFyKCkub24oJ21vdXNlZG93bicsIGhUb29sYmFyQW5kUG9wb3Zlck1vdXNlZG93bik7XG5cblx0XHRcdFx0Ly8gaGFuZGxlciBmb3Igc3RhdHVzYmFyXG5cdFx0XHRcdG1vZHVsZXMuc3RhdHVzYmFyLmF0dGFjaChsYXlvdXRJbmZvLCBvcHRpb25zKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gaGFuZGxlciBmb3IgdGFibGUgZGltZW5zaW9uXG5cdFx0XHR2YXIgJGNhdGNoZXJDb250YWluZXIgPSBvcHRpb25zLmFpck1vZGUgPyBsYXlvdXRJbmZvLnBvcG92ZXIoKSA6XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCAgbGF5b3V0SW5mby50b29sYmFyKCk7XG5cdFx0XHR2YXIgJGNhdGNoZXIgPSAkY2F0Y2hlckNvbnRhaW5lci5maW5kKCcubm90ZS1kaW1lbnNpb24tcGlja2VyLW1vdXNlY2F0Y2hlcicpO1xuXHRcdFx0JGNhdGNoZXIuY3NzKHtcblx0XHRcdFx0d2lkdGg6IG9wdGlvbnMuaW5zZXJ0VGFibGVNYXhTaXplLmNvbCArICdlbScsXG5cdFx0XHRcdGhlaWdodDogb3B0aW9ucy5pbnNlcnRUYWJsZU1heFNpemUucm93ICsgJ2VtJ1xuXHRcdFx0fSkub24oJ21vdXNlbW92ZScsIGZ1bmN0aW9uIChldmVudCkge1xuXHRcdFx0XHRoRGltZW5zaW9uUGlja2VyTW92ZShldmVudCwgb3B0aW9ucyk7XG5cdFx0XHR9KTtcblxuXHRcdFx0Ly8gc2F2ZSBvcHRpb25zIG9uIGVkaXRvclxuXHRcdFx0bGF5b3V0SW5mby5lZGl0b3IoKS5kYXRhKCdvcHRpb25zJywgb3B0aW9ucyk7XG5cblx0XHRcdC8vIHJldCBzdHlsZVdpdGhDU1MgZm9yIGJhY2tDb2xvciAvIGZvcmVDb2xvciBjbGVhcmluZyB3aXRoICdpbmhlcml0Jy5cblx0XHRcdGlmICghYWdlbnQuaXNNU0lFKSB7XG5cdFx0XHRcdC8vIHByb3RlY3QgRkYgRXJyb3I6IE5TX0VSUk9SX0ZBSUxVUkU6IEZhaWx1cmVcblx0XHRcdFx0c2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0ZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ3N0eWxlV2l0aENTUycsIDAsIG9wdGlvbnMuc3R5bGVXaXRoU3Bhbik7XG5cdFx0XHRcdH0sIDApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBIaXN0b3J5XG5cdFx0XHR2YXIgaGlzdG9yeSA9IG5ldyBIaXN0b3J5KGxheW91dEluZm8uZWRpdGFibGUoKSk7XG5cdFx0XHRsYXlvdXRJbmZvLmVkaXRhYmxlKCkuZGF0YSgnTm90ZUhpc3RvcnknLCBoaXN0b3J5KTtcblxuXHRcdFx0Ly8gYmFzaWMgZXZlbnQgY2FsbGJhY2tzIChsb3dlcmNhc2UpXG5cdFx0XHQvLyBlbnRlciwgZm9jdXMsIGJsdXIsIGtleXVwLCBrZXlkb3duXG5cdFx0XHRpZiAob3B0aW9ucy5vbmVudGVyKSB7XG5cdFx0XHRcdGxheW91dEluZm8uZWRpdGFibGUoKS5rZXlwcmVzcyhmdW5jdGlvbiAoZXZlbnQpIHtcblx0XHRcdFx0XHRpZiAoZXZlbnQua2V5Q29kZSA9PT0ga2V5LkVOVEVSKSB7IG9wdGlvbnMub25lbnRlcihldmVudCk7IH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChvcHRpb25zLm9uZm9jdXMpIHsgbGF5b3V0SW5mby5lZGl0YWJsZSgpLmZvY3VzKG9wdGlvbnMub25mb2N1cyk7IH1cblx0XHRcdGlmIChvcHRpb25zLm9uYmx1cikgeyBsYXlvdXRJbmZvLmVkaXRhYmxlKCkuYmx1cihvcHRpb25zLm9uYmx1cik7IH1cblx0XHRcdGlmIChvcHRpb25zLm9ua2V5dXApIHsgbGF5b3V0SW5mby5lZGl0YWJsZSgpLmtleXVwKG9wdGlvbnMub25rZXl1cCk7IH1cblx0XHRcdGlmIChvcHRpb25zLm9ua2V5ZG93bikgeyBsYXlvdXRJbmZvLmVkaXRhYmxlKCkua2V5ZG93bihvcHRpb25zLm9ua2V5ZG93bik7IH1cblx0XHRcdGlmIChvcHRpb25zLm9ucGFzdGUpIHsgbGF5b3V0SW5mby5lZGl0YWJsZSgpLm9uKCdwYXN0ZScsIG9wdGlvbnMub25wYXN0ZSk7IH1cblxuXHRcdFx0Ly8gY2FsbGJhY2tzIGZvciBhZHZhbmNlZCBmZWF0dXJlcyAoY2FtZWwpXG5cblx0XHRcdC8vIG9uVG9vbGJhckNsaWNrXG5cdFx0XHRpZiAob3B0aW9ucy5vblRvb2xiYXJDbGljaykge1xuXHRcdFx0XHRsYXlvdXRJbmZvLnRvb2xiYXIoKS5jbGljayhvcHRpb25zLm9uVG9vbGJhckNsaWNrKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gb25DaGFuZ2Vcblx0XHRcdGlmIChvcHRpb25zLm9uQ2hhbmdlKSB7XG5cdFx0XHRcdHZhciBoQ2hhbmdlID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdG1vZHVsZXMuZWRpdG9yLnRyaWdnZXJPbkNoYW5nZShsYXlvdXRJbmZvLmVkaXRhYmxlKCkpO1xuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdGlmIChhZ2VudC5pc01TSUUpIHtcblx0XHRcdFx0XHR2YXIgc0RvbUV2ZW50cyA9ICdET01DaGFyYWN0ZXJEYXRhTW9kaWZpZWQgRE9NU3VidHJlZU1vZGlmaWVkIERPTU5vZGVJbnNlcnRlZCc7XG5cdFx0XHRcdFx0bGF5b3V0SW5mby5lZGl0YWJsZSgpLm9uKHNEb21FdmVudHMsIGhDaGFuZ2UpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGxheW91dEluZm8uZWRpdGFibGUoKS5vbignaW5wdXQnLCBoQ2hhbmdlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBBbGwgZWRpdG9yIHN0YXR1cyB3aWxsIGJlIHNhdmVkIG9uIGVkaXRhYmxlIHdpdGgganF1ZXJ5J3MgZGF0YVxuXHRcdFx0Ly8gZm9yIHN1cHBvcnQgbXVsdGlwbGUgZWRpdG9yIHdpdGggc2luZ2xldG9uIG9iamVjdC5cblx0XHRcdGxheW91dEluZm8uZWRpdGFibGUoKS5kYXRhKCdjYWxsYmFja3MnLCB7XG5cdFx0XHRcdG9uQmVmb3JlQ2hhbmdlOiBvcHRpb25zLm9uQmVmb3JlQ2hhbmdlLFxuXHRcdFx0XHRvbkNoYW5nZTogb3B0aW9ucy5vbkNoYW5nZSxcblx0XHRcdFx0b25BdXRvU2F2ZTogb3B0aW9ucy5vbkF1dG9TYXZlLFxuXHRcdFx0XHRvbkltYWdlVXBsb2FkOiBvcHRpb25zLm9uSW1hZ2VVcGxvYWQsXG5cdFx0XHRcdG9uSW1hZ2VVcGxvYWRFcnJvcjogb3B0aW9ucy5vbkltYWdlVXBsb2FkRXJyb3IsXG5cdFx0XHRcdG9uRmlsZVVwbG9hZDogb3B0aW9ucy5vbkZpbGVVcGxvYWQsXG5cdFx0XHRcdG9uRmlsZVVwbG9hZEVycm9yOiBvcHRpb25zLm9uRmlsZVVwbG9hZCxcblx0XHRcdFx0b25NZWRpYURlbGV0ZTogb3B0aW9ucy5vbk1lZGlhRGVsZXRlXG5cdFx0XHR9KTtcblxuXHRcdFx0Ly8gVGV4dGFyZWE6IGF1dG8gZmlsbGluZyB0aGUgY29kZSBiZWZvcmUgZm9ybSBzdWJtaXQuXG5cdFx0XHRpZiAoZG9tLmlzVGV4dGFyZWEobGlzdC5oZWFkKGxheW91dEluZm8uaG9sZGVyKCkpKSkge1xuXHRcdFx0XHRsYXlvdXRJbmZvLmhvbGRlcigpLmNsb3Nlc3QoJ2Zvcm0nKS5zdWJtaXQoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdHZhciBjb250ZW50cyA9IGxheW91dEluZm8uaG9sZGVyKCkuY29kZSgpO1xuXHRcdFx0XHRcdGxheW91dEluZm8uaG9sZGVyKCkudmFsKGNvbnRlbnRzKTtcblxuXHRcdFx0XHRcdC8vIGNhbGxiYWNrIG9uIHN1Ym1pdFxuXHRcdFx0XHRcdGlmIChvcHRpb25zLm9uc3VibWl0KSB7XG5cdFx0XHRcdFx0XHRvcHRpb25zLm9uc3VibWl0KGNvbnRlbnRzKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBhdHRhY2gganF1ZXJ5IGN1c3RvbSBldmVudFxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IGxheW91dEluZm8gLSBsYXlvdXQgSW5mb3JtYXRpb25zXG5cdFx0ICovXG5cdFx0dGhpcy5hdHRhY2hDdXN0b21FdmVudCA9IGZ1bmN0aW9uIChsYXlvdXRJbmZvLCBvcHRpb25zKSB7XG5cdFx0XHR2YXIgJGhvbGRlciA9IGxheW91dEluZm8uaG9sZGVyKCk7XG5cdFx0XHR2YXIgJGVkaXRhYmxlID0gbGF5b3V0SW5mby5lZGl0YWJsZSgpO1xuXG5cdFx0XHQkZWRpdGFibGUub24oJ21vdXNlZG93bicsIGJpbmRDdXN0b21FdmVudCgkaG9sZGVyLCAnbW91c2Vkb3duJykpO1xuXHRcdFx0JGVkaXRhYmxlLm9uKCdrZXl1cCBtb3VzZXVwJywgYmluZEN1c3RvbUV2ZW50KCRob2xkZXIsICd1cGRhdGUnKSk7XG5cdFx0XHQkZWRpdGFibGUub24oJ3Njcm9sbCcsIGJpbmRDdXN0b21FdmVudCgkaG9sZGVyLCAnc2Nyb2xsJykpO1xuXG5cdFx0XHQvLyBiYXNpYyBldmVudCBjYWxsYmFja3MgKGxvd2VyY2FzZSlcblx0XHRcdC8vIGVudGVyLCBmb2N1cywgYmx1ciwga2V5dXAsIGtleWRvd25cblx0XHRcdCRlZGl0YWJsZS5rZXlwcmVzcyhmdW5jdGlvbiAoZXZlbnQpIHtcblx0XHRcdFx0aWYgKGV2ZW50LmtleUNvZGUgPT09IGtleS5FTlRFUikge1xuXHRcdFx0XHRcdGJpbmRDdXN0b21FdmVudCgkaG9sZGVyLCAnZW50ZXInKS5jYWxsKHRoaXMsIGV2ZW50KTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cblx0XHRcdCRlZGl0YWJsZS5mb2N1cyhiaW5kQ3VzdG9tRXZlbnQoJGhvbGRlciwgJ2ZvY3VzJykpO1xuXHRcdFx0JGVkaXRhYmxlLmJsdXIoYmluZEN1c3RvbUV2ZW50KCRob2xkZXIsICdibHVyJykpO1xuXHRcdFx0JGVkaXRhYmxlLmtleXVwKGJpbmRDdXN0b21FdmVudCgkaG9sZGVyLCAna2V5dXAnKSk7XG5cdFx0XHQkZWRpdGFibGUua2V5ZG93bihiaW5kQ3VzdG9tRXZlbnQoJGhvbGRlciwgJ2tleWRvd24nKSk7XG5cdFx0XHQkZWRpdGFibGUub24oJ3Bhc3RlJywgYmluZEN1c3RvbUV2ZW50KCRob2xkZXIsICdwYXN0ZScpKTtcblxuXHRcdFx0Ly8gY2FsbGJhY2tzIGZvciBhZHZhbmNlZCBmZWF0dXJlcyAoY2FtZWwpXG5cdFx0XHRpZiAoIW9wdGlvbnMuYWlyTW9kZSkge1xuXHRcdFx0XHRsYXlvdXRJbmZvLnRvb2xiYXIoKS5jbGljayhiaW5kQ3VzdG9tRXZlbnQoJGhvbGRlciwgJ3Rvb2xiYXIuY2xpY2snKSk7XG5cdFx0XHRcdGxheW91dEluZm8ucG9wb3ZlcigpLmNsaWNrKGJpbmRDdXN0b21FdmVudCgkaG9sZGVyLCAncG9wb3Zlci5jbGljaycpKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGFnZW50LmlzTVNJRSkge1xuXHRcdFx0XHR2YXIgc0RvbUV2ZW50cyA9ICdET01DaGFyYWN0ZXJEYXRhTW9kaWZpZWQgRE9NU3VidHJlZU1vZGlmaWVkIERPTU5vZGVJbnNlcnRlZCc7XG5cdFx0XHRcdCRlZGl0YWJsZS5vbihzRG9tRXZlbnRzLCBiaW5kQ3VzdG9tRXZlbnQoJGhvbGRlciwgJ2NoYW5nZScpKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdCRlZGl0YWJsZS5vbignaW5wdXQnLCBiaW5kQ3VzdG9tRXZlbnQoJGhvbGRlciwgJ2NoYW5nZScpKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gVGV4dGFyZWE6IGF1dG8gZmlsbGluZyB0aGUgY29kZSBiZWZvcmUgZm9ybSBzdWJtaXQuXG5cdFx0XHRpZiAoZG9tLmlzVGV4dGFyZWEobGlzdC5oZWFkKCRob2xkZXIpKSkge1xuXHRcdFx0XHQkaG9sZGVyLmNsb3Nlc3QoJ2Zvcm0nKS5zdWJtaXQoZnVuY3Rpb24gKGUpIHtcblx0XHRcdFx0XHR2YXIgY29udGVudHMgPSAkaG9sZGVyLmNvZGUoKTtcblx0XHRcdFx0XHRiaW5kQ3VzdG9tRXZlbnQoJGhvbGRlciwgJ3N1Ym1pdCcpLmNhbGwodGhpcywgZSwgY29udGVudHMpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gZmlyZSBpbml0IGV2ZW50XG5cdFx0XHRiaW5kQ3VzdG9tRXZlbnQoJGhvbGRlciwgJ2luaXQnKSgpO1xuXG5cdFx0XHQvLyBmaXJlIHBsdWdpbiBpbml0IGV2ZW50XG5cdFx0XHRmb3IgKHZhciBpID0gMCwgbGVuID0gJC5zdW1tZXJub3RlLnBsdWdpbnMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcblx0XHRcdFx0aWYgKCQuaXNGdW5jdGlvbigkLnN1bW1lcm5vdGUucGx1Z2luc1tpXS5pbml0KSkge1xuXHRcdFx0XHRcdCQuc3VtbWVybm90ZS5wbHVnaW5zW2ldLmluaXQobGF5b3V0SW5mbyk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0dGhpcy5kZXRhY2ggPSBmdW5jdGlvbiAobGF5b3V0SW5mbywgb3B0aW9ucykge1xuXHRcdFx0bGF5b3V0SW5mby5ob2xkZXIoKS5vZmYoKTtcblx0XHRcdGxheW91dEluZm8uZWRpdGFibGUoKS5vZmYoKTtcblxuXHRcdFx0bGF5b3V0SW5mby5wb3BvdmVyKCkub2ZmKCk7XG5cdFx0XHRsYXlvdXRJbmZvLmhhbmRsZSgpLm9mZigpO1xuXHRcdFx0bGF5b3V0SW5mby5kaWFsb2coKS5vZmYoKTtcblxuXHRcdFx0aWYgKCFvcHRpb25zLmFpck1vZGUpIHtcblx0XHRcdFx0bGF5b3V0SW5mby5kcm9wem9uZSgpLm9mZigpO1xuXHRcdFx0XHRsYXlvdXRJbmZvLnRvb2xiYXIoKS5vZmYoKTtcblx0XHRcdFx0bGF5b3V0SW5mby5zdGF0dXNiYXIoKS5vZmYoKTtcblx0XHRcdH1cblx0XHR9O1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBAY2xhc3MgUmVuZGVyZXJcblx0ICpcblx0ICogcmVuZGVyZXJcblx0ICpcblx0ICogcmVuZGVyaW5nIHRvb2xiYXIgYW5kIGVkaXRhYmxlXG5cdCAqL1xuXHR2YXIgUmVuZGVyZXIgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHQvKipcblx0XHQgKiBib290c3RyYXAgYnV0dG9uIHRlbXBsYXRlXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gbGFiZWwgYnV0dG9uIG5hbWVcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIGJ1dHRvbiBvcHRpb25zXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmV2ZW50XSBkYXRhLWV2ZW50XG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmNsYXNzTmFtZV0gYnV0dG9uJ3MgY2xhc3MgbmFtZVxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy52YWx1ZV0gZGF0YS12YWx1ZVxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy50aXRsZV0gYnV0dG9uJ3MgdGl0bGUgZm9yIHBvcHVwXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmRyb3Bkb3duXSBkcm9wZG93biBodG1sXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmhpZGVdIGRhdGEtaGlkZVxuXHRcdCAqL1xuXHRcdHZhciB0cGxCdXR0b24gPSBmdW5jdGlvbiAobGFiZWwsIG9wdGlvbnMpIHtcblx0XHRcdHZhciBldmVudCA9IG9wdGlvbnMuZXZlbnQ7XG5cdFx0XHR2YXIgdmFsdWUgPSBvcHRpb25zLnZhbHVlO1xuXHRcdFx0dmFyIHRpdGxlID0gb3B0aW9ucy50aXRsZTtcblx0XHRcdHZhciBjbGFzc05hbWUgPSBvcHRpb25zLmNsYXNzTmFtZTtcblx0XHRcdHZhciBkcm9wZG93biA9IG9wdGlvbnMuZHJvcGRvd247XG5cdFx0XHR2YXIgaGlkZSA9IG9wdGlvbnMuaGlkZTtcblxuXHRcdFx0cmV0dXJuICc8YnV0dG9uIHR5cGU9XCJidXR0b25cIicgK1xuXHRcdFx0XHRcdCAgICcgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHQgYnRuLXNtIGJ0bi1zbWFsbCcgK1xuXHRcdFx0XHRcdFx0IChjbGFzc05hbWUgPyAnICcgKyBjbGFzc05hbWUgOiAnJykgK1xuXHRcdFx0XHRcdFx0IChkcm9wZG93biA/ICcgZHJvcGRvd24tdG9nZ2xlJyA6ICcnKSArXG5cdFx0XHRcdFx0ICAgJ1wiJyArXG5cdFx0XHRcdFx0ICAgKGRyb3Bkb3duID8gJyBkYXRhLXRvZ2dsZT1cImRyb3Bkb3duXCInIDogJycpICtcblx0XHRcdFx0XHQgICAodGl0bGUgPyAnIHRpdGxlPVwiJyArIHRpdGxlICsgJ1wiJyA6ICcnKSArXG5cdFx0XHRcdFx0ICAgKGV2ZW50ID8gJyBkYXRhLWV2ZW50PVwiJyArIGV2ZW50ICsgJ1wiJyA6ICcnKSArXG5cdFx0XHRcdFx0ICAgKHZhbHVlID8gJyBkYXRhLXZhbHVlPVxcJycgKyB2YWx1ZSArICdcXCcnIDogJycpICtcblx0XHRcdFx0XHQgICAoaGlkZSA/ICcgZGF0YS1oaWRlPVxcJycgKyBoaWRlICsgJ1xcJycgOiAnJykgK1xuXHRcdFx0XHRcdCAgICcgdGFiaW5kZXg9XCItMVwiPicgK1xuXHRcdFx0XHRcdCBsYWJlbCArXG5cdFx0XHRcdFx0IChkcm9wZG93biA/ICcgPHNwYW4gY2xhc3M9XCJjYXJldFwiPjwvc3Bhbj4nIDogJycpICtcblx0XHRcdFx0ICAgJzwvYnV0dG9uPicgK1xuXHRcdFx0XHQgICAoZHJvcGRvd24gfHwgJycpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBib290c3RyYXAgaWNvbiBidXR0b24gdGVtcGxhdGVcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSBpY29uQ2xhc3NOYW1lXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5ldmVudF1cblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMudmFsdWVdXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnRpdGxlXVxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5kcm9wZG93bl1cblx0XHQgKi9cblx0XHR2YXIgdHBsSWNvbkJ1dHRvbiA9IGZ1bmN0aW9uIChpY29uQ2xhc3NOYW1lLCBvcHRpb25zKSB7XG5cdFx0XHR2YXIgbGFiZWwgPSAnPGkgY2xhc3M9XCInICsgaWNvbkNsYXNzTmFtZSArICdcIj48L2k+Jztcblx0XHRcdHJldHVybiB0cGxCdXR0b24obGFiZWwsIG9wdGlvbnMpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBib290c3RyYXAgcG9wb3ZlciB0ZW1wbGF0ZVxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IGNsYXNzTmFtZVxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSBjb250ZW50XG5cdFx0ICovXG5cdFx0dmFyIHRwbFBvcG92ZXIgPSBmdW5jdGlvbiAoY2xhc3NOYW1lLCBjb250ZW50KSB7XG5cdFx0XHR2YXIgJHBvcG92ZXIgPSAkKCc8ZGl2IGNsYXNzPVwiJyArIGNsYXNzTmFtZSArICcgcG9wb3ZlciBib3R0b20gaW5cIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+JyArXG5cdFx0XHRcdFx0ICc8ZGl2IGNsYXNzPVwiYXJyb3dcIj48L2Rpdj4nICtcblx0XHRcdFx0XHQgJzxkaXYgY2xhc3M9XCJwb3BvdmVyLWNvbnRlbnRcIj4nICtcblx0XHRcdFx0XHQgJzwvZGl2PicgK1xuXHRcdFx0XHQgICAnPC9kaXY+Jyk7XG5cblx0XHRcdCRwb3BvdmVyLmZpbmQoJy5wb3BvdmVyLWNvbnRlbnQnKS5hcHBlbmQoY29udGVudCk7XG5cdFx0XHRyZXR1cm4gJHBvcG92ZXI7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIGJvb3RzdHJhcCBkaWFsb2cgdGVtcGxhdGVcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSBjbGFzc05hbWVcblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gW3RpdGxlPScnXVxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSBib2R5XG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IFtmb290ZXI9JyddXG5cdFx0ICovXG5cdFx0dmFyIHRwbERpYWxvZyA9IGZ1bmN0aW9uIChjbGFzc05hbWUsIHRpdGxlLCBib2R5LCBmb290ZXIpIHtcblx0XHRcdHJldHVybiAnPGRpdiBjbGFzcz1cIicgKyBjbGFzc05hbWUgKyAnIG1vZGFsXCIgYXJpYS1oaWRkZW49XCJmYWxzZVwiPicgK1xuXHRcdFx0XHRcdCAnPGRpdiBjbGFzcz1cIm1vZGFsLWRpYWxvZ1wiPicgK1xuXHRcdFx0XHRcdCAgICc8ZGl2IGNsYXNzPVwibW9kYWwtY29udGVudFwiPicgK1xuXHRcdFx0XHRcdFx0ICh0aXRsZSA/XG5cdFx0XHRcdFx0XHQgJzxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj4nICtcblx0XHRcdFx0XHRcdCAgICc8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNsb3NlXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgdGFiaW5kZXg9XCItMVwiPiZ0aW1lczs8L2J1dHRvbj4nICtcblx0XHRcdFx0XHRcdCAgICc8aDQgY2xhc3M9XCJtb2RhbC10aXRsZVwiPicgKyB0aXRsZSArICc8L2g0PicgK1xuXHRcdFx0XHRcdFx0ICc8L2Rpdj4nIDogJydcblx0XHRcdFx0XHRcdCApICtcblx0XHRcdFx0XHRcdCAnPGZvcm0gY2xhc3M9XCJub3RlLW1vZGFsLWZvcm1cIj4nICtcblx0XHRcdFx0XHRcdCAgICc8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiPicgKyBib2R5ICsgJzwvZGl2PicgK1xuXHRcdFx0XHRcdFx0ICAgKGZvb3RlciA/XG5cdFx0XHRcdFx0XHQgICAnPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPicgKyBmb290ZXIgKyAnPC9kaXY+JyA6ICcnXG5cdFx0XHRcdFx0XHQgICApICtcblx0XHRcdFx0XHRcdCAnPC9mb3JtPicgK1xuXHRcdFx0XHRcdCAgICc8L2Rpdj4nICtcblx0XHRcdFx0XHQgJzwvZGl2PicgK1xuXHRcdFx0XHQgICAnPC9kaXY+Jztcblx0XHR9O1xuXG5cdFx0dmFyIHRwbEJ1dHRvbkluZm8gPSB7XG5cdFx0XHRwaWN0dXJlOiBmdW5jdGlvbiAobGFuZywgb3B0aW9ucykge1xuXHRcdFx0XHRyZXR1cm4gdHBsSWNvbkJ1dHRvbihvcHRpb25zLmljb25QcmVmaXggKyAncGljdHVyZS1vJywge1xuXHRcdFx0XHRcdGV2ZW50OiAnc2hvd0ltYWdlRGlhbG9nJyxcblx0XHRcdFx0XHR0aXRsZTogbGFuZy5pbWFnZS5pbWFnZSxcblx0XHRcdFx0XHRoaWRlOiB0cnVlXG5cdFx0XHRcdH0pO1xuXHRcdFx0fSxcblx0XHRcdGxpbms6IGZ1bmN0aW9uIChsYW5nLCBvcHRpb25zKSB7XG5cdFx0XHRcdHJldHVybiB0cGxJY29uQnV0dG9uKG9wdGlvbnMuaWNvblByZWZpeCArICdsaW5rJywge1xuXHRcdFx0XHRcdGV2ZW50OiAnc2hvd0xpbmtEaWFsb2cnLFxuXHRcdFx0XHRcdHRpdGxlOiBsYW5nLmxpbmsubGluayxcblx0XHRcdFx0XHRoaWRlOiB0cnVlXG5cdFx0XHRcdH0pO1xuXHRcdFx0fSxcblx0XHRcdHRhYmxlOiBmdW5jdGlvbiAobGFuZywgb3B0aW9ucykge1xuXHRcdFx0XHR2YXIgZHJvcGRvd24gPSAnPHVsIGNsYXNzPVwibm90ZS10YWJsZSBkcm9wZG93bi1tZW51XCI+JyArXG5cdFx0XHRcdFx0XHRcdFx0ICc8ZGl2IGNsYXNzPVwibm90ZS1kaW1lbnNpb24tcGlja2VyXCI+JyArXG5cdFx0XHRcdFx0XHRcdFx0ICAgJzxkaXYgY2xhc3M9XCJub3RlLWRpbWVuc2lvbi1waWNrZXItbW91c2VjYXRjaGVyXCIgZGF0YS1ldmVudD1cImluc2VydFRhYmxlXCIgZGF0YS12YWx1ZT1cIjF4MVwiPjwvZGl2PicgK1xuXHRcdFx0XHRcdFx0XHRcdCAgICc8ZGl2IGNsYXNzPVwibm90ZS1kaW1lbnNpb24tcGlja2VyLWhpZ2hsaWdodGVkXCI+PC9kaXY+JyArXG5cdFx0XHRcdFx0XHRcdFx0ICAgJzxkaXYgY2xhc3M9XCJub3RlLWRpbWVuc2lvbi1waWNrZXItdW5oaWdobGlnaHRlZFwiPjwvZGl2PicgK1xuXHRcdFx0XHRcdFx0XHRcdCAnPC9kaXY+JyArXG5cdFx0XHRcdFx0XHRcdFx0ICc8ZGl2IGNsYXNzPVwibm90ZS1kaW1lbnNpb24tZGlzcGxheVwiPiAxIHggMSA8L2Rpdj4nICtcblx0XHRcdFx0XHRcdFx0ICAgJzwvdWw+Jztcblx0XHRcdFx0cmV0dXJuIHRwbEljb25CdXR0b24ob3B0aW9ucy5pY29uUHJlZml4ICsgJ3RhYmxlJywge1xuXHRcdFx0XHRcdHRpdGxlOiBsYW5nLnRhYmxlLnRhYmxlLFxuXHRcdFx0XHRcdGRyb3Bkb3duOiBkcm9wZG93blxuXHRcdFx0XHR9KTtcblx0XHRcdH0sXG5cdFx0XHRzdHlsZTogZnVuY3Rpb24gKGxhbmcsIG9wdGlvbnMpIHtcblx0XHRcdFx0dmFyIGl0ZW1zID0gb3B0aW9ucy5zdHlsZVRhZ3MucmVkdWNlKGZ1bmN0aW9uIChtZW1vLCB2KSB7XG5cdFx0XHRcdFx0dmFyIGxhYmVsID0gbGFuZy5zdHlsZVt2ID09PSAncCcgPyAnbm9ybWFsJyA6IHZdO1xuXHRcdFx0XHRcdHJldHVybiBtZW1vICsgJzxsaT48YSBkYXRhLWV2ZW50PVwiZm9ybWF0QmxvY2tcIiBocmVmPVwiI1wiIGRhdGEtdmFsdWU9XCInICsgdiArICdcIj4nICtcblx0XHRcdFx0XHRcdFx0IChcblx0XHRcdFx0XHRcdFx0ICAgKHYgPT09ICdwJyB8fCB2ID09PSAncHJlJykgPyBsYWJlbCA6XG5cdFx0XHRcdFx0XHRcdCAgICc8JyArIHYgKyAnPicgKyBsYWJlbCArICc8LycgKyB2ICsgJz4nXG5cdFx0XHRcdFx0XHRcdCApICtcblx0XHRcdFx0XHRcdCAgICc8L2E+PC9saT4nO1xuXHRcdFx0XHR9LCAnJyk7XG5cblx0XHRcdFx0cmV0dXJuIHRwbEljb25CdXR0b24ob3B0aW9ucy5pY29uUHJlZml4ICsgJ21hZ2ljJywge1xuXHRcdFx0XHRcdHRpdGxlOiBsYW5nLnN0eWxlLnN0eWxlLFxuXHRcdFx0XHRcdGRyb3Bkb3duOiAnPHVsIGNsYXNzPVwiZHJvcGRvd24tbWVudVwiPicgKyBpdGVtcyArICc8L3VsPidcblx0XHRcdFx0fSk7XG5cdFx0XHR9LFxuXHRcdFx0Zm9udG5hbWU6IGZ1bmN0aW9uIChsYW5nLCBvcHRpb25zKSB7XG5cdFx0XHRcdHZhciByZWFsRm9udExpc3QgPSBbXTtcblx0XHRcdFx0dmFyIGl0ZW1zID0gb3B0aW9ucy5mb250TmFtZXMucmVkdWNlKGZ1bmN0aW9uIChtZW1vLCB2KSB7XG5cdFx0XHRcdFx0aWYgKCFhZ2VudC5pc0ZvbnRJbnN0YWxsZWQodikgJiYgb3B0aW9ucy5mb250TmFtZXNJZ25vcmVDaGVjay5pbmRleE9mKHYpID09PSAtMSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG1lbW87XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJlYWxGb250TGlzdC5wdXNoKHYpO1xuXHRcdFx0XHRcdHJldHVybiBtZW1vICsgJzxsaT48YSBkYXRhLWV2ZW50PVwiZm9udE5hbWVcIiBocmVmPVwiI1wiIGRhdGEtdmFsdWU9XCInICsgdiArICdcIiBzdHlsZT1cImZvbnQtZmFtaWx5OlxcJycgKyB2ICsgJ1xcJ1wiPicgK1xuXHRcdFx0XHRcdFx0XHRcdFx0JzxpIGNsYXNzPVwiJyArIG9wdGlvbnMuaWNvblByZWZpeCArICdjaGVja1wiPjwvaT4gJyArIHYgK1xuXHRcdFx0XHRcdFx0XHRcdCAgJzwvYT48L2xpPic7XG5cdFx0XHRcdH0sICcnKTtcblxuXHRcdFx0XHR2YXIgaGFzRGVmYXVsdEZvbnQgPSBhZ2VudC5pc0ZvbnRJbnN0YWxsZWQob3B0aW9ucy5kZWZhdWx0Rm9udE5hbWUpO1xuXHRcdFx0XHR2YXIgZGVmYXVsdEZvbnROYW1lID0gKGhhc0RlZmF1bHRGb250KSA/IG9wdGlvbnMuZGVmYXVsdEZvbnROYW1lIDogcmVhbEZvbnRMaXN0WzBdO1xuXG5cdFx0XHRcdHZhciBsYWJlbCA9ICc8c3BhbiBjbGFzcz1cIm5vdGUtY3VycmVudC1mb250bmFtZVwiPicgK1xuXHRcdFx0XHRcdFx0XHRcdGRlZmF1bHRGb250TmFtZSArXG5cdFx0XHRcdFx0XHRcdCAnPC9zcGFuPic7XG5cdFx0XHRcdHJldHVybiB0cGxCdXR0b24obGFiZWwsIHtcblx0XHRcdFx0XHR0aXRsZTogbGFuZy5mb250Lm5hbWUsXG5cdFx0XHRcdFx0ZHJvcGRvd246ICc8dWwgY2xhc3M9XCJkcm9wZG93bi1tZW51XCI+JyArIGl0ZW1zICsgJzwvdWw+J1xuXHRcdFx0XHR9KTtcblx0XHRcdH0sXG5cdFx0XHRjb2xvcjogZnVuY3Rpb24gKGxhbmcsIG9wdGlvbnMpIHtcblx0XHRcdFx0dmFyIGNvbG9yQnV0dG9uTGFiZWwgPSAnPGkgY2xhc3M9XCInICsgb3B0aW9ucy5pY29uUHJlZml4ICsgJ2ZvbnRcIiBzdHlsZT1cImNvbG9yOmJsYWNrO2JhY2tncm91bmQtY29sb3I6eWVsbG93O1wiPjwvaT4nO1xuXHRcdFx0XHR2YXIgY29sb3JCdXR0b24gPSB0cGxCdXR0b24oY29sb3JCdXR0b25MYWJlbCwge1xuXHRcdFx0XHRcdGNsYXNzTmFtZTogJ25vdGUtcmVjZW50LWNvbG9yJyxcblx0XHRcdFx0XHR0aXRsZTogbGFuZy5jb2xvci5yZWNlbnQsXG5cdFx0XHRcdFx0ZXZlbnQ6ICdjb2xvcicsXG5cdFx0XHRcdFx0dmFsdWU6ICd7XCJiYWNrQ29sb3JcIjpcInllbGxvd1wifSdcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0dmFyIGRyb3Bkb3duID0gJzx1bCBjbGFzcz1cImRyb3Bkb3duLW1lbnVcIj4nICtcblx0XHRcdFx0XHRcdFx0XHQgJzxsaT4nICtcblx0XHRcdFx0XHRcdFx0XHQgICAnPGRpdiBjbGFzcz1cImJ0bi1ncm91cFwiPicgK1xuXHRcdFx0XHRcdFx0XHRcdFx0ICc8ZGl2IGNsYXNzPVwibm90ZS1wYWxldHRlLXRpdGxlXCI+JyArIGxhbmcuY29sb3IuYmFja2dyb3VuZCArICc8L2Rpdj4nICtcblx0XHRcdFx0XHRcdFx0XHRcdCAnPGRpdiBjbGFzcz1cIm5vdGUtY29sb3ItcmVzZXRcIiBkYXRhLWV2ZW50PVwiYmFja0NvbG9yXCInICtcblx0XHRcdFx0XHRcdFx0XHRcdCAgICcgZGF0YS12YWx1ZT1cImluaGVyaXRcIiB0aXRsZT1cIicgKyBsYW5nLmNvbG9yLnRyYW5zcGFyZW50ICsgJ1wiPicgK1xuXHRcdFx0XHRcdFx0XHRcdFx0ICAgbGFuZy5jb2xvci5zZXRUcmFuc3BhcmVudCArXG5cdFx0XHRcdFx0XHRcdFx0XHQgJzwvZGl2PicgK1xuXHRcdFx0XHRcdFx0XHRcdFx0ICc8ZGl2IGNsYXNzPVwibm90ZS1jb2xvci1wYWxldHRlXCIgZGF0YS10YXJnZXQtZXZlbnQ9XCJiYWNrQ29sb3JcIj48L2Rpdj4nICtcblx0XHRcdFx0XHRcdFx0XHQgICAnPC9kaXY+JyArXG5cdFx0XHRcdFx0XHRcdFx0ICAgJzxkaXYgY2xhc3M9XCJidG4tZ3JvdXBcIj4nICtcblx0XHRcdFx0XHRcdFx0XHRcdCAnPGRpdiBjbGFzcz1cIm5vdGUtcGFsZXR0ZS10aXRsZVwiPicgKyBsYW5nLmNvbG9yLmZvcmVncm91bmQgKyAnPC9kaXY+JyArXG5cdFx0XHRcdFx0XHRcdFx0XHQgJzxkaXYgY2xhc3M9XCJub3RlLWNvbG9yLXJlc2V0XCIgZGF0YS1ldmVudD1cImZvcmVDb2xvclwiIGRhdGEtdmFsdWU9XCJpbmhlcml0XCIgdGl0bGU9XCInICsgbGFuZy5jb2xvci5yZXNldCArICdcIj4nICtcblx0XHRcdFx0XHRcdFx0XHRcdCAgIGxhbmcuY29sb3IucmVzZXRUb0RlZmF1bHQgK1xuXHRcdFx0XHRcdFx0XHRcdFx0ICc8L2Rpdj4nICtcblx0XHRcdFx0XHRcdFx0XHRcdCAnPGRpdiBjbGFzcz1cIm5vdGUtY29sb3ItcGFsZXR0ZVwiIGRhdGEtdGFyZ2V0LWV2ZW50PVwiZm9yZUNvbG9yXCI+PC9kaXY+JyArXG5cdFx0XHRcdFx0XHRcdFx0ICAgJzwvZGl2PicgK1xuXHRcdFx0XHRcdFx0XHRcdCAnPC9saT4nICtcblx0XHRcdFx0XHRcdFx0ICAgJzwvdWw+JztcblxuXHRcdFx0XHR2YXIgbW9yZUJ1dHRvbiA9IHRwbEJ1dHRvbignJywge1xuXHRcdFx0XHRcdHRpdGxlOiBsYW5nLmNvbG9yLm1vcmUsXG5cdFx0XHRcdFx0ZHJvcGRvd246IGRyb3Bkb3duXG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdHJldHVybiBjb2xvckJ1dHRvbiArIG1vcmVCdXR0b247XG5cdFx0XHR9LFxuXHRcdFx0Ym9sZDogZnVuY3Rpb24gKGxhbmcsIG9wdGlvbnMpIHtcblx0XHRcdFx0cmV0dXJuIHRwbEljb25CdXR0b24ob3B0aW9ucy5pY29uUHJlZml4ICsgJ2JvbGQnLCB7XG5cdFx0XHRcdFx0ZXZlbnQ6ICdib2xkJyxcblx0XHRcdFx0XHR0aXRsZTogbGFuZy5mb250LmJvbGRcblx0XHRcdFx0fSk7XG5cdFx0XHR9LFxuXHRcdFx0aXRhbGljOiBmdW5jdGlvbiAobGFuZywgb3B0aW9ucykge1xuXHRcdFx0XHRyZXR1cm4gdHBsSWNvbkJ1dHRvbihvcHRpb25zLmljb25QcmVmaXggKyAnaXRhbGljJywge1xuXHRcdFx0XHRcdGV2ZW50OiAnaXRhbGljJyxcblx0XHRcdFx0XHR0aXRsZTogbGFuZy5mb250Lml0YWxpY1xuXHRcdFx0XHR9KTtcblx0XHRcdH0sXG5cdFx0XHR1bmRlcmxpbmU6IGZ1bmN0aW9uIChsYW5nLCBvcHRpb25zKSB7XG5cdFx0XHRcdHJldHVybiB0cGxJY29uQnV0dG9uKG9wdGlvbnMuaWNvblByZWZpeCArICd1bmRlcmxpbmUnLCB7XG5cdFx0XHRcdFx0ZXZlbnQ6ICd1bmRlcmxpbmUnLFxuXHRcdFx0XHRcdHRpdGxlOiBsYW5nLmZvbnQudW5kZXJsaW5lXG5cdFx0XHRcdH0pO1xuXHRcdFx0fSxcblx0XHRcdGNsZWFyOiBmdW5jdGlvbiAobGFuZywgb3B0aW9ucykge1xuXHRcdFx0XHRyZXR1cm4gdHBsSWNvbkJ1dHRvbihvcHRpb25zLmljb25QcmVmaXggKyAnZXJhc2VyJywge1xuXHRcdFx0XHRcdGV2ZW50OiAncmVtb3ZlRm9ybWF0Jyxcblx0XHRcdFx0XHR0aXRsZTogbGFuZy5mb250LmNsZWFyXG5cdFx0XHRcdH0pO1xuXHRcdFx0fSxcblx0XHRcdHVsOiBmdW5jdGlvbiAobGFuZywgb3B0aW9ucykge1xuXHRcdFx0XHRyZXR1cm4gdHBsSWNvbkJ1dHRvbihvcHRpb25zLmljb25QcmVmaXggKyAnbGlzdC11bCcsIHtcblx0XHRcdFx0XHRldmVudDogJ2luc2VydFVub3JkZXJlZExpc3QnLFxuXHRcdFx0XHRcdHRpdGxlOiBsYW5nLmxpc3RzLnVub3JkZXJlZFxuXHRcdFx0XHR9KTtcblx0XHRcdH0sXG5cdFx0XHRvbDogZnVuY3Rpb24gKGxhbmcsIG9wdGlvbnMpIHtcblx0XHRcdFx0cmV0dXJuIHRwbEljb25CdXR0b24ob3B0aW9ucy5pY29uUHJlZml4ICsgJ2xpc3Qtb2wnLCB7XG5cdFx0XHRcdFx0ZXZlbnQ6ICdpbnNlcnRPcmRlcmVkTGlzdCcsXG5cdFx0XHRcdFx0dGl0bGU6IGxhbmcubGlzdHMub3JkZXJlZFxuXHRcdFx0XHR9KTtcblx0XHRcdH0sXG5cdFx0XHRwYXJhZ3JhcGg6IGZ1bmN0aW9uIChsYW5nLCBvcHRpb25zKSB7XG5cdFx0XHRcdHZhciBsZWZ0QnV0dG9uID0gdHBsSWNvbkJ1dHRvbihvcHRpb25zLmljb25QcmVmaXggKyAnYWxpZ24tbGVmdCcsIHtcblx0XHRcdFx0XHR0aXRsZTogbGFuZy5wYXJhZ3JhcGgubGVmdCxcblx0XHRcdFx0XHRldmVudDogJ2p1c3RpZnlMZWZ0J1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0dmFyIGNlbnRlckJ1dHRvbiA9IHRwbEljb25CdXR0b24ob3B0aW9ucy5pY29uUHJlZml4ICsgJ2FsaWduLWNlbnRlcicsIHtcblx0XHRcdFx0XHR0aXRsZTogbGFuZy5wYXJhZ3JhcGguY2VudGVyLFxuXHRcdFx0XHRcdGV2ZW50OiAnanVzdGlmeUNlbnRlcidcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHZhciByaWdodEJ1dHRvbiA9IHRwbEljb25CdXR0b24ob3B0aW9ucy5pY29uUHJlZml4ICsgJ2FsaWduLXJpZ2h0Jywge1xuXHRcdFx0XHRcdHRpdGxlOiBsYW5nLnBhcmFncmFwaC5yaWdodCxcblx0XHRcdFx0XHRldmVudDogJ2p1c3RpZnlSaWdodCdcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHZhciBqdXN0aWZ5QnV0dG9uID0gdHBsSWNvbkJ1dHRvbihvcHRpb25zLmljb25QcmVmaXggKyAnYWxpZ24tanVzdGlmeScsIHtcblx0XHRcdFx0XHR0aXRsZTogbGFuZy5wYXJhZ3JhcGguanVzdGlmeSxcblx0XHRcdFx0XHRldmVudDogJ2p1c3RpZnlGdWxsJ1xuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHR2YXIgb3V0ZGVudEJ1dHRvbiA9IHRwbEljb25CdXR0b24ob3B0aW9ucy5pY29uUHJlZml4ICsgJ291dGRlbnQnLCB7XG5cdFx0XHRcdFx0dGl0bGU6IGxhbmcucGFyYWdyYXBoLm91dGRlbnQsXG5cdFx0XHRcdFx0ZXZlbnQ6ICdvdXRkZW50J1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0dmFyIGluZGVudEJ1dHRvbiA9IHRwbEljb25CdXR0b24ob3B0aW9ucy5pY29uUHJlZml4ICsgJ2luZGVudCcsIHtcblx0XHRcdFx0XHR0aXRsZTogbGFuZy5wYXJhZ3JhcGguaW5kZW50LFxuXHRcdFx0XHRcdGV2ZW50OiAnaW5kZW50J1xuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHR2YXIgZHJvcGRvd24gPSAnPGRpdiBjbGFzcz1cImRyb3Bkb3duLW1lbnVcIj4nICtcblx0XHRcdFx0XHRcdFx0XHQgJzxkaXYgY2xhc3M9XCJub3RlLWFsaWduIGJ0bi1ncm91cFwiPicgK1xuXHRcdFx0XHRcdFx0XHRcdCAgIGxlZnRCdXR0b24gKyBjZW50ZXJCdXR0b24gKyByaWdodEJ1dHRvbiArIGp1c3RpZnlCdXR0b24gK1xuXHRcdFx0XHRcdFx0XHRcdCAnPC9kaXY+JyArXG5cdFx0XHRcdFx0XHRcdFx0ICc8ZGl2IGNsYXNzPVwibm90ZS1saXN0IGJ0bi1ncm91cFwiPicgK1xuXHRcdFx0XHRcdFx0XHRcdCAgIGluZGVudEJ1dHRvbiArIG91dGRlbnRCdXR0b24gK1xuXHRcdFx0XHRcdFx0XHRcdCAnPC9kaXY+JyArXG5cdFx0XHRcdFx0XHRcdCAgICc8L2Rpdj4nO1xuXG5cdFx0XHRcdHJldHVybiB0cGxJY29uQnV0dG9uKG9wdGlvbnMuaWNvblByZWZpeCArICdhbGlnbi1sZWZ0Jywge1xuXHRcdFx0XHRcdHRpdGxlOiBsYW5nLnBhcmFncmFwaC5wYXJhZ3JhcGgsXG5cdFx0XHRcdFx0ZHJvcGRvd246IGRyb3Bkb3duXG5cdFx0XHRcdH0pO1xuXHRcdFx0fSxcblx0XHRcdGhlaWdodDogZnVuY3Rpb24gKGxhbmcsIG9wdGlvbnMpIHtcblx0XHRcdFx0dmFyIGl0ZW1zID0gb3B0aW9ucy5saW5lSGVpZ2h0cy5yZWR1Y2UoZnVuY3Rpb24gKG1lbW8sIHYpIHtcblx0XHRcdFx0XHRyZXR1cm4gbWVtbyArICc8bGk+PGEgZGF0YS1ldmVudD1cImxpbmVIZWlnaHRcIiBocmVmPVwiI1wiIGRhdGEtdmFsdWU9XCInICsgcGFyc2VGbG9hdCh2KSArICdcIj4nICtcblx0XHRcdFx0XHRcdFx0XHRcdCc8aSBjbGFzcz1cIicgKyBvcHRpb25zLmljb25QcmVmaXggKyAnY2hlY2tcIj48L2k+ICcgKyB2ICtcblx0XHRcdFx0XHRcdFx0XHQgICc8L2E+PC9saT4nO1xuXHRcdFx0XHR9LCAnJyk7XG5cblx0XHRcdFx0cmV0dXJuIHRwbEljb25CdXR0b24ob3B0aW9ucy5pY29uUHJlZml4ICsgJ3RleHQtaGVpZ2h0Jywge1xuXHRcdFx0XHRcdHRpdGxlOiBsYW5nLmZvbnQuaGVpZ2h0LFxuXHRcdFx0XHRcdGRyb3Bkb3duOiAnPHVsIGNsYXNzPVwiZHJvcGRvd24tbWVudVwiPicgKyBpdGVtcyArICc8L3VsPidcblx0XHRcdFx0fSk7XG5cblx0XHRcdH0sXG5cdFx0XHRoZWxwOiBmdW5jdGlvbiAobGFuZywgb3B0aW9ucykge1xuXHRcdFx0XHRyZXR1cm4gdHBsSWNvbkJ1dHRvbihvcHRpb25zLmljb25QcmVmaXggKyAncXVlc3Rpb24nLCB7XG5cdFx0XHRcdFx0ZXZlbnQ6ICdzaG93SGVscERpYWxvZycsXG5cdFx0XHRcdFx0dGl0bGU6IGxhbmcub3B0aW9ucy5oZWxwLFxuXHRcdFx0XHRcdGhpZGU6IHRydWVcblx0XHRcdFx0fSk7XG5cdFx0XHR9LFxuXHRcdFx0ZnVsbHNjcmVlbjogZnVuY3Rpb24gKGxhbmcsIG9wdGlvbnMpIHtcblx0XHRcdFx0cmV0dXJuIHRwbEljb25CdXR0b24ob3B0aW9ucy5pY29uUHJlZml4ICsgJ2Fycm93cy1hbHQnLCB7XG5cdFx0XHRcdFx0ZXZlbnQ6ICdmdWxsc2NyZWVuJyxcblx0XHRcdFx0XHR0aXRsZTogbGFuZy5vcHRpb25zLmZ1bGxzY3JlZW5cblx0XHRcdFx0fSk7XG5cdFx0XHR9LFxuXHRcdFx0Y29kZXZpZXc6IGZ1bmN0aW9uIChsYW5nLCBvcHRpb25zKSB7XG5cdFx0XHRcdHJldHVybiB0cGxJY29uQnV0dG9uKG9wdGlvbnMuaWNvblByZWZpeCArICdjb2RlJywge1xuXHRcdFx0XHRcdGV2ZW50OiAnY29kZXZpZXcnLFxuXHRcdFx0XHRcdHRpdGxlOiBsYW5nLm9wdGlvbnMuY29kZXZpZXdcblx0XHRcdFx0fSk7XG5cdFx0XHR9LFxuXHRcdFx0dW5kbzogZnVuY3Rpb24gKGxhbmcsIG9wdGlvbnMpIHtcblx0XHRcdFx0cmV0dXJuIHRwbEljb25CdXR0b24ob3B0aW9ucy5pY29uUHJlZml4ICsgJ3VuZG8nLCB7XG5cdFx0XHRcdFx0ZXZlbnQ6ICd1bmRvJyxcblx0XHRcdFx0XHR0aXRsZTogbGFuZy5oaXN0b3J5LnVuZG9cblx0XHRcdFx0fSk7XG5cdFx0XHR9LFxuXHRcdFx0cmVkbzogZnVuY3Rpb24gKGxhbmcsIG9wdGlvbnMpIHtcblx0XHRcdFx0cmV0dXJuIHRwbEljb25CdXR0b24ob3B0aW9ucy5pY29uUHJlZml4ICsgJ3JlcGVhdCcsIHtcblx0XHRcdFx0XHRldmVudDogJ3JlZG8nLFxuXHRcdFx0XHRcdHRpdGxlOiBsYW5nLmhpc3RvcnkucmVkb1xuXHRcdFx0XHR9KTtcblx0XHRcdH0sXG5cdFx0XHRocjogZnVuY3Rpb24gKGxhbmcsIG9wdGlvbnMpIHtcblx0XHRcdFx0cmV0dXJuIHRwbEljb25CdXR0b24ob3B0aW9ucy5pY29uUHJlZml4ICsgJ21pbnVzJywge1xuXHRcdFx0XHRcdGV2ZW50OiAnaW5zZXJ0SG9yaXpvbnRhbFJ1bGUnLFxuXHRcdFx0XHRcdHRpdGxlOiBsYW5nLmhyLmluc2VydFxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0dmFyIHRwbFBvcG92ZXJzID0gZnVuY3Rpb24gKGxhbmcsIG9wdGlvbnMpIHtcblx0XHRcdHZhciB0cGxMaW5rUG9wb3ZlciA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0dmFyIGxpbmtCdXR0b24gPSB0cGxJY29uQnV0dG9uKG9wdGlvbnMuaWNvblByZWZpeCArICdlZGl0Jywge1xuXHRcdFx0XHRcdHRpdGxlOiBsYW5nLmxpbmsuZWRpdCxcblx0XHRcdFx0XHRldmVudDogJ3Nob3dMaW5rRGlhbG9nJyxcblx0XHRcdFx0XHRoaWRlOiB0cnVlXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR2YXIgdW5saW5rQnV0dG9uID0gdHBsSWNvbkJ1dHRvbihvcHRpb25zLmljb25QcmVmaXggKyAndW5saW5rJywge1xuXHRcdFx0XHRcdHRpdGxlOiBsYW5nLmxpbmsudW5saW5rLFxuXHRcdFx0XHRcdGV2ZW50OiAndW5saW5rJ1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0dmFyIGNvbnRlbnQgPSAnPGEgaHJlZj1cImh0dHA6Ly93d3cuZ29vZ2xlLmNvbVwiIHRhcmdldD1cIl9ibGFua1wiPnd3dy5nb29nbGUuY29tPC9hPiZuYnNwOyZuYnNwOycgK1xuXHRcdFx0XHRcdFx0XHQgICc8ZGl2IGNsYXNzPVwibm90ZS1pbnNlcnQgYnRuLWdyb3VwXCI+JyArXG5cdFx0XHRcdFx0XHRcdFx0bGlua0J1dHRvbiArIHVubGlua0J1dHRvbiArXG5cdFx0XHRcdFx0XHRcdCAgJzwvZGl2Pic7XG5cdFx0XHRcdHJldHVybiB0cGxQb3BvdmVyKCdub3RlLWxpbmstcG9wb3ZlcicsIGNvbnRlbnQpO1xuXHRcdFx0fTtcblxuXHRcdFx0dmFyIHRwbEltYWdlUG9wb3ZlciA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0dmFyIGZ1bGxCdXR0b24gPSB0cGxCdXR0b24oJzxzcGFuIGNsYXNzPVwibm90ZS1mb250c2l6ZS0xMFwiPjEwMCU8L3NwYW4+Jywge1xuXHRcdFx0XHRcdHRpdGxlOiBsYW5nLmltYWdlLnJlc2l6ZUZ1bGwsXG5cdFx0XHRcdFx0ZXZlbnQ6ICdyZXNpemUnLFxuXHRcdFx0XHRcdHZhbHVlOiAnMSdcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHZhciBoYWxmQnV0dG9uID0gdHBsQnV0dG9uKCc8c3BhbiBjbGFzcz1cIm5vdGUtZm9udHNpemUtMTBcIj41MCU8L3NwYW4+Jywge1xuXHRcdFx0XHRcdHRpdGxlOiBsYW5nLmltYWdlLnJlc2l6ZUhhbGYsXG5cdFx0XHRcdFx0ZXZlbnQ6ICdyZXNpemUnLFxuXHRcdFx0XHRcdHZhbHVlOiAnMC41J1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0dmFyIHF1YXJ0ZXJCdXR0b24gPSB0cGxCdXR0b24oJzxzcGFuIGNsYXNzPVwibm90ZS1mb250c2l6ZS0xMFwiPjI1JTwvc3Bhbj4nLCB7XG5cdFx0XHRcdFx0dGl0bGU6IGxhbmcuaW1hZ2UucmVzaXplUXVhcnRlcixcblx0XHRcdFx0XHRldmVudDogJ3Jlc2l6ZScsXG5cdFx0XHRcdFx0dmFsdWU6ICcwLjI1J1xuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHR2YXIgbGVmdEJ1dHRvbiA9IHRwbEljb25CdXR0b24ob3B0aW9ucy5pY29uUHJlZml4ICsgJ2FsaWduLWxlZnQnLCB7XG5cdFx0XHRcdFx0dGl0bGU6IGxhbmcuaW1hZ2UuZmxvYXRMZWZ0LFxuXHRcdFx0XHRcdGV2ZW50OiAnZmxvYXRNZScsXG5cdFx0XHRcdFx0dmFsdWU6ICdsZWZ0J1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0dmFyIHJpZ2h0QnV0dG9uID0gdHBsSWNvbkJ1dHRvbihvcHRpb25zLmljb25QcmVmaXggKyAnYWxpZ24tcmlnaHQnLCB7XG5cdFx0XHRcdFx0dGl0bGU6IGxhbmcuaW1hZ2UuZmxvYXRSaWdodCxcblx0XHRcdFx0XHRldmVudDogJ2Zsb2F0TWUnLFxuXHRcdFx0XHRcdHZhbHVlOiAncmlnaHQnXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR2YXIganVzdGlmeUJ1dHRvbiA9IHRwbEljb25CdXR0b24ob3B0aW9ucy5pY29uUHJlZml4ICsgJ2FsaWduLWp1c3RpZnknLCB7XG5cdFx0XHRcdFx0dGl0bGU6IGxhbmcuaW1hZ2UuZmxvYXROb25lLFxuXHRcdFx0XHRcdGV2ZW50OiAnZmxvYXRNZScsXG5cdFx0XHRcdFx0dmFsdWU6ICdub25lJ1xuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHR2YXIgcm91bmRlZEJ1dHRvbiA9IHRwbEljb25CdXR0b24ob3B0aW9ucy5pY29uUHJlZml4ICsgJ3NxdWFyZScsIHtcblx0XHRcdFx0XHR0aXRsZTogbGFuZy5pbWFnZS5zaGFwZVJvdW5kZWQsXG5cdFx0XHRcdFx0ZXZlbnQ6ICdpbWFnZVNoYXBlJyxcblx0XHRcdFx0XHR2YWx1ZTogJ2ltZy1yb3VuZGVkJ1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0dmFyIGNpcmNsZUJ1dHRvbiA9IHRwbEljb25CdXR0b24ob3B0aW9ucy5pY29uUHJlZml4ICsgJ2NpcmNsZS1vJywge1xuXHRcdFx0XHRcdHRpdGxlOiBsYW5nLmltYWdlLnNoYXBlQ2lyY2xlLFxuXHRcdFx0XHRcdGV2ZW50OiAnaW1hZ2VTaGFwZScsXG5cdFx0XHRcdFx0dmFsdWU6ICdpbWctY2lyY2xlJ1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0dmFyIHRodW1ibmFpbEJ1dHRvbiA9IHRwbEljb25CdXR0b24ob3B0aW9ucy5pY29uUHJlZml4ICsgJ3BpY3R1cmUtbycsIHtcblx0XHRcdFx0XHR0aXRsZTogbGFuZy5pbWFnZS5zaGFwZVRodW1ibmFpbCxcblx0XHRcdFx0XHRldmVudDogJ2ltYWdlU2hhcGUnLFxuXHRcdFx0XHRcdHZhbHVlOiAnaW1nLXRodW1ibmFpbCdcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHZhciBub25lQnV0dG9uID0gdHBsSWNvbkJ1dHRvbihvcHRpb25zLmljb25QcmVmaXggKyAndGltZXMnLCB7XG5cdFx0XHRcdFx0dGl0bGU6IGxhbmcuaW1hZ2Uuc2hhcGVOb25lLFxuXHRcdFx0XHRcdGV2ZW50OiAnaW1hZ2VTaGFwZScsXG5cdFx0XHRcdFx0dmFsdWU6ICcnXG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdHZhciByZW1vdmVCdXR0b24gPSB0cGxJY29uQnV0dG9uKG9wdGlvbnMuaWNvblByZWZpeCArICd0cmFzaC1vJywge1xuXHRcdFx0XHRcdHRpdGxlOiBsYW5nLmltYWdlLnJlbW92ZSxcblx0XHRcdFx0XHRldmVudDogJ3JlbW92ZU1lZGlhJyxcblx0XHRcdFx0XHR2YWx1ZTogJ25vbmUnXG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdHZhciBjb250ZW50ID0gJzxkaXYgY2xhc3M9XCJidG4tZ3JvdXBcIj4nICsgZnVsbEJ1dHRvbiArIGhhbGZCdXR0b24gKyBxdWFydGVyQnV0dG9uICsgJzwvZGl2PicgK1xuXHRcdFx0XHRcdFx0XHQgICc8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwXCI+JyArIGxlZnRCdXR0b24gKyByaWdodEJ1dHRvbiArIGp1c3RpZnlCdXR0b24gKyAnPC9kaXY+JyArXG5cdFx0XHRcdFx0XHRcdCAgJzxkaXYgY2xhc3M9XCJidG4tZ3JvdXBcIj4nICsgcm91bmRlZEJ1dHRvbiArIGNpcmNsZUJ1dHRvbiArIHRodW1ibmFpbEJ1dHRvbiArIG5vbmVCdXR0b24gKyAnPC9kaXY+JyArXG5cdFx0XHRcdFx0XHRcdCAgJzxkaXYgY2xhc3M9XCJidG4tZ3JvdXBcIj4nICsgcmVtb3ZlQnV0dG9uICsgJzwvZGl2Pic7XG5cdFx0XHRcdHJldHVybiB0cGxQb3BvdmVyKCdub3RlLWltYWdlLXBvcG92ZXInLCBjb250ZW50KTtcblx0XHRcdH07XG5cblx0XHRcdHZhciB0cGxBaXJQb3BvdmVyID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0XHR2YXIgJGNvbnRlbnQgPSAkKCc8ZGl2IC8+Jyk7XG5cdFx0XHRcdGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IG9wdGlvbnMuYWlyUG9wb3Zlci5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcblx0XHRcdFx0XHR2YXIgZ3JvdXAgPSBvcHRpb25zLmFpclBvcG92ZXJbaWR4XTtcblxuXHRcdFx0XHRcdHZhciAkZ3JvdXAgPSAkKCc8ZGl2IGNsYXNzPVwibm90ZS0nICsgZ3JvdXBbMF0gKyAnIGJ0bi1ncm91cFwiPicpO1xuXHRcdFx0XHRcdGZvciAodmFyIGkgPSAwLCBsZW5Hcm91cCA9IGdyb3VwWzFdLmxlbmd0aDsgaSA8IGxlbkdyb3VwOyBpKyspIHtcblx0XHRcdFx0XHRcdHZhciAkYnV0dG9uID0gJCh0cGxCdXR0b25JbmZvW2dyb3VwWzFdW2ldXShsYW5nLCBvcHRpb25zKSk7XG5cblx0XHRcdFx0XHRcdCRidXR0b24uYXR0cignZGF0YS1uYW1lJywgZ3JvdXBbMV1baV0pO1xuXG5cdFx0XHRcdFx0XHQkZ3JvdXAuYXBwZW5kKCRidXR0b24pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQkY29udGVudC5hcHBlbmQoJGdyb3VwKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiB0cGxQb3BvdmVyKCdub3RlLWFpci1wb3BvdmVyJywgJGNvbnRlbnQuY2hpbGRyZW4oKSk7XG5cdFx0XHR9O1xuXG5cdFx0XHR2YXIgJG5vdGVQb3BvdmVyID0gJCgnPGRpdiBjbGFzcz1cIm5vdGUtcG9wb3ZlclwiIC8+Jyk7XG5cblx0XHRcdCRub3RlUG9wb3Zlci5hcHBlbmQodHBsTGlua1BvcG92ZXIoKSk7XG5cdFx0XHQkbm90ZVBvcG92ZXIuYXBwZW5kKHRwbEltYWdlUG9wb3ZlcigpKTtcblxuXHRcdFx0aWYgKG9wdGlvbnMuYWlyTW9kZSkge1xuXHRcdFx0XHQkbm90ZVBvcG92ZXIuYXBwZW5kKHRwbEFpclBvcG92ZXIoKSk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiAkbm90ZVBvcG92ZXI7XG5cdFx0fTtcblxuXHRcdHZhciB0cGxIYW5kbGVzID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0cmV0dXJuICc8ZGl2IGNsYXNzPVwibm90ZS1oYW5kbGVcIj4nICtcblx0XHRcdFx0XHQgJzxkaXYgY2xhc3M9XCJub3RlLWNvbnRyb2wtc2VsZWN0aW9uXCI+JyArXG5cdFx0XHRcdFx0ICAgJzxkaXYgY2xhc3M9XCJub3RlLWNvbnRyb2wtc2VsZWN0aW9uLWJnXCI+PC9kaXY+JyArXG5cdFx0XHRcdFx0ICAgJzxkaXYgY2xhc3M9XCJub3RlLWNvbnRyb2wtaG9sZGVyIG5vdGUtY29udHJvbC1ud1wiPjwvZGl2PicgK1xuXHRcdFx0XHRcdCAgICc8ZGl2IGNsYXNzPVwibm90ZS1jb250cm9sLWhvbGRlciBub3RlLWNvbnRyb2wtbmVcIj48L2Rpdj4nICtcblx0XHRcdFx0XHQgICAnPGRpdiBjbGFzcz1cIm5vdGUtY29udHJvbC1ob2xkZXIgbm90ZS1jb250cm9sLXN3XCI+PC9kaXY+JyArXG5cdFx0XHRcdFx0ICAgJzxkaXYgY2xhc3M9XCJub3RlLWNvbnRyb2wtc2l6aW5nIG5vdGUtY29udHJvbC1zZVwiPjwvZGl2PicgK1xuXHRcdFx0XHRcdCAgICc8ZGl2IGNsYXNzPVwibm90ZS1jb250cm9sLXNlbGVjdGlvbi1pbmZvXCI+PC9kaXY+JyArXG5cdFx0XHRcdFx0ICc8L2Rpdj4nICtcblx0XHRcdFx0ICAgJzwvZGl2Pic7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIHNob3J0Y3V0IHRhYmxlIHRlbXBsYXRlXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IHRpdGxlXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IGJvZHlcblx0XHQgKi9cblx0XHR2YXIgdHBsU2hvcnRjdXQgPSBmdW5jdGlvbiAodGl0bGUsIGtleXMpIHtcblx0XHRcdHZhciBrZXlDbGFzcyA9ICdub3RlLXNob3J0Y3V0LWNvbCBjb2wteHMtNiBub3RlLXNob3J0Y3V0LSc7XG5cdFx0XHR2YXIgYm9keSA9IFtdO1xuXG5cdFx0XHRmb3IgKHZhciBpIGluIGtleXMpIHtcblx0XHRcdFx0aWYgKGtleXMuaGFzT3duUHJvcGVydHkoaSkpIHtcblx0XHRcdFx0XHRib2R5LnB1c2goXG5cdFx0XHRcdFx0ICAnPGRpdiBjbGFzcz1cIicgKyBrZXlDbGFzcyArICdrZXlcIj4nICsga2V5c1tpXS5rYmQgKyAnPC9kaXY+JyArXG5cdFx0XHRcdFx0ICAnPGRpdiBjbGFzcz1cIicgKyBrZXlDbGFzcyArICduYW1lXCI+JyArIGtleXNbaV0udGV4dCArICc8L2Rpdj4nXG5cdFx0XHRcdFx0ICApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiAnPGRpdiBjbGFzcz1cIm5vdGUtc2hvcnRjdXQtcm93IHJvd1wiPjxkaXYgY2xhc3M9XCInICsga2V5Q2xhc3MgKyAndGl0bGUgY29sLXhzLW9mZnNldC02XCI+JyArIHRpdGxlICsgJzwvZGl2PjwvZGl2PicgK1xuXHRcdFx0XHQgICAnPGRpdiBjbGFzcz1cIm5vdGUtc2hvcnRjdXQtcm93IHJvd1wiPicgKyBib2R5LmpvaW4oJzwvZGl2PjxkaXYgY2xhc3M9XCJub3RlLXNob3J0Y3V0LXJvdyByb3dcIj4nKSArICc8L2Rpdj4nO1xuXHRcdH07XG5cblx0XHR2YXIgdHBsU2hvcnRjdXRUZXh0ID0gZnVuY3Rpb24gKGxhbmcpIHtcblx0XHRcdHZhciBrZXlzID0gW1xuXHRcdFx0ICB7IGtiZDogJ+KMmCArIEInLCB0ZXh0OiBsYW5nLmZvbnQuYm9sZCB9LFxuXHRcdFx0ICB7IGtiZDogJ+KMmCArIEknLCB0ZXh0OiBsYW5nLmZvbnQuaXRhbGljIH0sXG5cdFx0XHQgIHsga2JkOiAn4oyYICsgVScsIHRleHQ6IGxhbmcuZm9udC51bmRlcmxpbmUgfSxcblx0XHRcdCAgeyBrYmQ6ICfijJggKyBcXFxcJywgdGV4dDogbGFuZy5mb250LmNsZWFyIH1cblx0XHRcdF07XG5cblx0XHRcdHJldHVybiB0cGxTaG9ydGN1dChsYW5nLnNob3J0Y3V0LnRleHRGb3JtYXR0aW5nLCBrZXlzKTtcblx0XHR9O1xuXG5cdFx0dmFyIHRwbFNob3J0Y3V0QWN0aW9uID0gZnVuY3Rpb24gKGxhbmcpIHtcblx0XHRcdHZhciBrZXlzID0gW1xuXHRcdFx0ICB7IGtiZDogJ+KMmCArIFonLCB0ZXh0OiBsYW5nLmhpc3RvcnkudW5kbyB9LFxuXHRcdFx0ICB7IGtiZDogJ+KMmCArIOKHpyArIFonLCB0ZXh0OiBsYW5nLmhpc3RvcnkucmVkbyB9LFxuXHRcdFx0ICB7IGtiZDogJ+KMmCArIF0nLCB0ZXh0OiBsYW5nLnBhcmFncmFwaC5pbmRlbnQgfSxcblx0XHRcdCAgeyBrYmQ6ICfijJggKyBbJywgdGV4dDogbGFuZy5wYXJhZ3JhcGgub3V0ZGVudCB9LFxuXHRcdFx0ICB7IGtiZDogJ+KMmCArIEVOVEVSJywgdGV4dDogbGFuZy5oci5pbnNlcnQgfVxuXHRcdFx0XTtcblxuXHRcdFx0cmV0dXJuIHRwbFNob3J0Y3V0KGxhbmcuc2hvcnRjdXQuYWN0aW9uLCBrZXlzKTtcblx0XHR9O1xuXG5cdFx0dmFyIHRwbFNob3J0Y3V0UGFyYSA9IGZ1bmN0aW9uIChsYW5nKSB7XG5cdFx0XHR2YXIga2V5cyA9IFtcblx0XHRcdCAgeyBrYmQ6ICfijJggKyDih6cgKyBMJywgdGV4dDogbGFuZy5wYXJhZ3JhcGgubGVmdCB9LFxuXHRcdFx0ICB7IGtiZDogJ+KMmCArIOKHpyArIEUnLCB0ZXh0OiBsYW5nLnBhcmFncmFwaC5jZW50ZXIgfSxcblx0XHRcdCAgeyBrYmQ6ICfijJggKyDih6cgKyBSJywgdGV4dDogbGFuZy5wYXJhZ3JhcGgucmlnaHQgfSxcblx0XHRcdCAgeyBrYmQ6ICfijJggKyDih6cgKyBKJywgdGV4dDogbGFuZy5wYXJhZ3JhcGguanVzdGlmeSB9LFxuXHRcdFx0ICB7IGtiZDogJ+KMmCArIOKHpyArIE5VTTcnLCB0ZXh0OiBsYW5nLmxpc3RzLm9yZGVyZWQgfSxcblx0XHRcdCAgeyBrYmQ6ICfijJggKyDih6cgKyBOVU04JywgdGV4dDogbGFuZy5saXN0cy51bm9yZGVyZWQgfVxuXHRcdFx0XTtcblxuXHRcdFx0cmV0dXJuIHRwbFNob3J0Y3V0KGxhbmcuc2hvcnRjdXQucGFyYWdyYXBoRm9ybWF0dGluZywga2V5cyk7XG5cdFx0fTtcblxuXHRcdHZhciB0cGxTaG9ydGN1dFN0eWxlID0gZnVuY3Rpb24gKGxhbmcpIHtcblx0XHRcdHZhciBrZXlzID0gW1xuXHRcdFx0ICB7IGtiZDogJ+KMmCArIE5VTTAnLCB0ZXh0OiBsYW5nLnN0eWxlLm5vcm1hbCB9LFxuXHRcdFx0ICB7IGtiZDogJ+KMmCArIE5VTTEnLCB0ZXh0OiBsYW5nLnN0eWxlLmgxIH0sXG5cdFx0XHQgIHsga2JkOiAn4oyYICsgTlVNMicsIHRleHQ6IGxhbmcuc3R5bGUuaDIgfSxcblx0XHRcdCAgeyBrYmQ6ICfijJggKyBOVU0zJywgdGV4dDogbGFuZy5zdHlsZS5oMyB9LFxuXHRcdFx0ICB7IGtiZDogJ+KMmCArIE5VTTQnLCB0ZXh0OiBsYW5nLnN0eWxlLmg0IH0sXG5cdFx0XHQgIHsga2JkOiAn4oyYICsgTlVNNScsIHRleHQ6IGxhbmcuc3R5bGUuaDUgfSxcblx0XHRcdCAgeyBrYmQ6ICfijJggKyBOVU02JywgdGV4dDogbGFuZy5zdHlsZS5oNiB9XG5cdFx0XHRdO1xuXG5cdFx0XHRyZXR1cm4gdHBsU2hvcnRjdXQobGFuZy5zaG9ydGN1dC5kb2N1bWVudFN0eWxlLCBrZXlzKTtcblx0XHR9O1xuXG5cdFx0dmFyIHRwbEV4dHJhU2hvcnRjdXRzID0gZnVuY3Rpb24gKGxhbmcsIG9wdGlvbnMpIHtcblx0XHRcdHZhciBleHRyYUtleXMgPSBvcHRpb25zLmV4dHJhS2V5cztcblx0XHRcdHZhciBrZXlzID0gW107XG5cblx0XHRcdGZvciAodmFyIGtleSBpbiBleHRyYUtleXMpIHtcblx0XHRcdFx0aWYgKGV4dHJhS2V5cy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG5cdFx0XHRcdFx0a2V5cy5wdXNoKHsga2JkOiBrZXksIHRleHQ6IGV4dHJhS2V5c1trZXldIH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0cGxTaG9ydGN1dChsYW5nLnNob3J0Y3V0LmV4dHJhS2V5cywga2V5cyk7XG5cdFx0fTtcblxuXHRcdHZhciB0cGxTaG9ydGN1dFRhYmxlID0gZnVuY3Rpb24gKGxhbmcsIG9wdGlvbnMpIHtcblx0XHRcdHZhciBjb2xDbGFzcyA9ICdjbGFzcz1cIm5vdGUtc2hvcnRjdXQgbm90ZS1zaG9ydGN1dC1jb2wgY29sLXNtLTYgY29sLXhzLTEyXCInO1xuXHRcdFx0dmFyIHRlbXBsYXRlID0gW1xuXHRcdFx0ICAnPGRpdiAnICsgY29sQ2xhc3MgKyAnPicgKyB0cGxTaG9ydGN1dEFjdGlvbihsYW5nLCBvcHRpb25zKSArICc8L2Rpdj4nICtcblx0XHRcdCAgJzxkaXYgJyArIGNvbENsYXNzICsgJz4nICsgdHBsU2hvcnRjdXRUZXh0KGxhbmcsIG9wdGlvbnMpICsgJzwvZGl2PicsXG5cdFx0XHQgICc8ZGl2ICcgKyBjb2xDbGFzcyArICc+JyArIHRwbFNob3J0Y3V0U3R5bGUobGFuZywgb3B0aW9ucykgKyAnPC9kaXY+JyArXG5cdFx0XHQgICc8ZGl2ICcgKyBjb2xDbGFzcyArICc+JyArIHRwbFNob3J0Y3V0UGFyYShsYW5nLCBvcHRpb25zKSArICc8L2Rpdj4nXG5cdFx0XHRdO1xuXG5cdFx0XHRpZiAob3B0aW9ucy5leHRyYUtleXMpIHtcblx0XHRcdFx0dGVtcGxhdGUucHVzaCgnPGRpdiAnICsgY29sQ2xhc3MgKyAnPicgKyB0cGxFeHRyYVNob3J0Y3V0cyhsYW5nLCBvcHRpb25zKSArICc8L2Rpdj4nKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuICc8ZGl2IGNsYXNzPVwibm90ZS1zaG9ydGN1dC1yb3cgcm93XCI+JyArXG5cdFx0XHRcdFx0IHRlbXBsYXRlLmpvaW4oJzwvZGl2PjxkaXYgY2xhc3M9XCJub3RlLXNob3J0Y3V0LXJvdyByb3dcIj4nKSArXG5cdFx0XHRcdCAgICc8L2Rpdj4nO1xuXHRcdH07XG5cblx0XHR2YXIgcmVwbGFjZU1hY0tleXMgPSBmdW5jdGlvbiAoc0h0bWwpIHtcblx0XHRcdHJldHVybiBzSHRtbC5yZXBsYWNlKC/ijJgvZywgJ0N0cmwnKS5yZXBsYWNlKC/ih6cvZywgJ1NoaWZ0Jyk7XG5cdFx0fTtcblxuXHRcdHZhciB0cGxEaWFsb2dJbmZvID0ge1xuXHRcdFx0aW1hZ2U6IGZ1bmN0aW9uIChsYW5nLCBvcHRpb25zKSB7XG5cdFx0XHRcdHZhciBpbWFnZUxpbWl0YXRpb24gPSAnJztcblx0XHRcdFx0aWYgKG9wdGlvbnMubWF4aW11bUltYWdlRmlsZVNpemUpIHtcblx0XHRcdFx0XHR2YXIgdW5pdCA9IE1hdGguZmxvb3IoTWF0aC5sb2cob3B0aW9ucy5tYXhpbXVtSW1hZ2VGaWxlU2l6ZSkgLyBNYXRoLmxvZygxMDI0KSk7XG5cdFx0XHRcdFx0dmFyIHJlYWRhYmxlU2l6ZSA9IChvcHRpb25zLm1heGltdW1JbWFnZUZpbGVTaXplIC8gTWF0aC5wb3coMTAyNCwgdW5pdCkpLnRvRml4ZWQoMikgKiAxICtcblx0XHRcdFx0XHRcdFx0XHRcdCAgICcgJyArICcgS01HVFAnW3VuaXRdICsgJ0InO1xuXHRcdFx0XHRcdGltYWdlTGltaXRhdGlvbiA9ICc8c21hbGw+JyArIGxhbmcuaW1hZ2UubWF4aW11bUZpbGVTaXplICsgJyA6ICcgKyByZWFkYWJsZVNpemUgKyAnPC9zbWFsbD4nO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dmFyIGJvZHkgPSAnPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93LWZsdWlkIG5vdGUtZ3JvdXAtc2VsZWN0LWZyb20tZmlsZXNcIj4nICtcblx0XHRcdFx0XHRcdFx0ICc8bGFiZWw+JyArIGxhbmcuaW1hZ2Uuc2VsZWN0RnJvbUZpbGVzICsgJzwvbGFiZWw+JyArXG5cdFx0XHRcdFx0XHRcdCAnPGlucHV0IGNsYXNzPVwibm90ZS1pbWFnZS1pbnB1dFwiIHR5cGU9XCJmaWxlXCIgbmFtZT1cImZpbGVzXCIgYWNjZXB0PVwiaW1hZ2UvKlwiIG11bHRpcGxlPVwibXVsdGlwbGVcIiAvPicgK1xuXHRcdFx0XHRcdFx0XHQgaW1hZ2VMaW1pdGF0aW9uICtcblx0XHRcdFx0XHRcdCAgICc8L2Rpdj4nICtcblx0XHRcdFx0XHRcdCAgICc8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3ctZmx1aWRcIj4nICtcblx0XHRcdFx0XHRcdFx0ICc8bGFiZWw+JyArIGxhbmcuaW1hZ2UudXJsICsgJzwvbGFiZWw+JyArXG5cdFx0XHRcdFx0XHRcdCAnPGlucHV0IGNsYXNzPVwibm90ZS1pbWFnZS11cmwgZm9ybS1jb250cm9sIHNwYW4xMlwiIHR5cGU9XCJ0ZXh0XCIgLz4nICtcblx0XHRcdFx0XHRcdCAgICc8L2Rpdj4nO1xuXHRcdFx0XHR2YXIgZm9vdGVyID0gJzxidXR0b24gaHJlZj1cIiNcIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBub3RlLWltYWdlLWJ0biBkaXNhYmxlZFwiIGRpc2FibGVkPicgKyBsYW5nLmltYWdlLmluc2VydCArICc8L2J1dHRvbj4nO1xuXHRcdFx0XHRyZXR1cm4gdHBsRGlhbG9nKCdub3RlLWltYWdlLWRpYWxvZycsIGxhbmcuaW1hZ2UuaW5zZXJ0LCBib2R5LCBmb290ZXIpO1xuXHRcdFx0fSxcblxuXHRcdFx0bGluazogZnVuY3Rpb24gKGxhbmcsIG9wdGlvbnMpIHtcblx0XHRcdFx0dmFyIGJvZHkgPSAnPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93LWZsdWlkXCI+JyArXG5cdFx0XHRcdFx0XHRcdCAnPGxhYmVsPicgKyBsYW5nLmxpbmsudGV4dFRvRGlzcGxheSArICc8L2xhYmVsPicgK1xuXHRcdFx0XHRcdFx0XHQgJzxpbnB1dCBjbGFzcz1cIm5vdGUtbGluay10ZXh0IGZvcm0tY29udHJvbCBzcGFuMTJcIiB0eXBlPVwidGV4dFwiIC8+JyArXG5cdFx0XHRcdFx0XHQgICAnPC9kaXY+JyArXG5cdFx0XHRcdFx0XHQgICAnPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93LWZsdWlkXCI+JyArXG5cdFx0XHRcdFx0XHRcdCAnPGxhYmVsPicgKyBsYW5nLmxpbmsudXJsICsgJzwvbGFiZWw+JyArXG5cdFx0XHRcdFx0XHRcdCAnPGlucHV0IGNsYXNzPVwibm90ZS1saW5rLXVybCBmb3JtLWNvbnRyb2wgc3BhbjEyXCIgdHlwZT1cInRleHRcIiAvPicgK1xuXHRcdFx0XHRcdFx0ICAgJzwvZGl2PicgK1xuXHRcdFx0XHRcdFx0ICAgKCFvcHRpb25zLmRpc2FibGVMaW5rVGFyZ2V0ID9cblx0XHRcdFx0XHRcdFx0ICc8ZGl2IGNsYXNzPVwiY2hlY2tib3hcIj4nICtcblx0XHRcdFx0XHRcdFx0ICAgJzxsYWJlbD4nICsgJzxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjaGVja2VkPiAnICtcblx0XHRcdFx0XHRcdFx0XHQgbGFuZy5saW5rLm9wZW5Jbk5ld1dpbmRvdyArXG5cdFx0XHRcdFx0XHRcdCAgICc8L2xhYmVsPicgK1xuXHRcdFx0XHRcdFx0XHQgJzwvZGl2PicgOiAnJ1xuXHRcdFx0XHRcdFx0ICAgKTtcblx0XHRcdFx0dmFyIGZvb3RlciA9ICc8YnV0dG9uIGhyZWY9XCIjXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgbm90ZS1saW5rLWJ0biBkaXNhYmxlZFwiIGRpc2FibGVkPicgKyBsYW5nLmxpbmsuaW5zZXJ0ICsgJzwvYnV0dG9uPic7XG5cdFx0XHRcdHJldHVybiB0cGxEaWFsb2coJ25vdGUtbGluay1kaWFsb2cnLCBsYW5nLmxpbmsuaW5zZXJ0LCBib2R5LCBmb290ZXIpO1xuXHRcdFx0fSxcblxuXHRcdFx0aGVscDogZnVuY3Rpb24gKGxhbmcsIG9wdGlvbnMpIHtcblx0XHRcdFx0dmFyIGJvZHkgPSAnPGEgY2xhc3M9XCJtb2RhbC1jbG9zZSBwdWxsLXJpZ2h0XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgdGFiaW5kZXg9XCItMVwiPicgKyBsYW5nLnNob3J0Y3V0LmNsb3NlICsgJzwvYT4nICtcblx0XHRcdFx0XHRcdCAgICc8ZGl2IGNsYXNzPVwidGl0bGVcIj4nICsgbGFuZy5zaG9ydGN1dC5zaG9ydGN1dHMgKyAnPC9kaXY+JyArXG5cdFx0XHRcdFx0XHQgICAoYWdlbnQuaXNNYWMgPyB0cGxTaG9ydGN1dFRhYmxlKGxhbmcsIG9wdGlvbnMpIDogcmVwbGFjZU1hY0tleXModHBsU2hvcnRjdXRUYWJsZShsYW5nLCBvcHRpb25zKSkpICtcblx0XHRcdFx0XHRcdCAgICc8cCBjbGFzcz1cInRleHQtY2VudGVyXCI+JyArXG5cdFx0XHRcdFx0XHRcdCAnPGEgaHJlZj1cIi8vc3VtbWVybm90ZS5vcmcvXCIgdGFyZ2V0PVwiX2JsYW5rXCI+U3VtbWVybm90ZSAwLjYuMzwvYT4gwrcgJyArXG5cdFx0XHRcdFx0XHRcdCAnPGEgaHJlZj1cIi8vZ2l0aHViLmNvbS9zdW1tZXJub3RlL3N1bW1lcm5vdGVcIiB0YXJnZXQ9XCJfYmxhbmtcIj5Qcm9qZWN0PC9hPiDCtyAnICtcblx0XHRcdFx0XHRcdFx0ICc8YSBocmVmPVwiLy9naXRodWIuY29tL3N1bW1lcm5vdGUvc3VtbWVybm90ZS9pc3N1ZXNcIiB0YXJnZXQ9XCJfYmxhbmtcIj5Jc3N1ZXM8L2E+JyArXG5cdFx0XHRcdFx0XHQgICAnPC9wPic7XG5cdFx0XHRcdHJldHVybiB0cGxEaWFsb2coJ25vdGUtaGVscC1kaWFsb2cnLCAnJywgYm9keSwgJycpO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHR2YXIgdHBsRGlhbG9ncyA9IGZ1bmN0aW9uIChsYW5nLCBvcHRpb25zKSB7XG5cdFx0XHR2YXIgZGlhbG9ncyA9ICcnO1xuXG5cdFx0XHQkLmVhY2godHBsRGlhbG9nSW5mbywgZnVuY3Rpb24gKGlkeCwgdHBsRGlhbG9nKSB7XG5cdFx0XHRcdGRpYWxvZ3MgKz0gdHBsRGlhbG9nKGxhbmcsIG9wdGlvbnMpO1xuXHRcdFx0fSk7XG5cblx0XHRcdHJldHVybiAnPGRpdiBjbGFzcz1cIm5vdGUtZGlhbG9nXCI+JyArIGRpYWxvZ3MgKyAnPC9kaXY+Jztcblx0XHR9O1xuXG5cdFx0dmFyIHRwbFN0YXR1c2JhciA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdHJldHVybiAnPGRpdiBjbGFzcz1cIm5vdGUtcmVzaXplYmFyXCI+JyArXG5cdFx0XHRcdFx0ICc8ZGl2IGNsYXNzPVwibm90ZS1pY29uLWJhclwiPjwvZGl2PicgK1xuXHRcdFx0XHRcdCAnPGRpdiBjbGFzcz1cIm5vdGUtaWNvbi1iYXJcIj48L2Rpdj4nICtcblx0XHRcdFx0XHQgJzxkaXYgY2xhc3M9XCJub3RlLWljb24tYmFyXCI+PC9kaXY+JyArXG5cdFx0XHRcdCAgICc8L2Rpdj4nO1xuXHRcdH07XG5cblx0XHR2YXIgcmVwcmVzZW50U2hvcnRjdXQgPSBmdW5jdGlvbiAoc3RyKSB7XG5cdFx0XHRpZiAoYWdlbnQuaXNNYWMpIHtcblx0XHRcdFx0c3RyID0gc3RyLnJlcGxhY2UoJ0NNRCcsICfijJgnKS5yZXBsYWNlKCdTSElGVCcsICfih6cnKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHN0ci5yZXBsYWNlKCdCQUNLU0xBU0gnLCAnXFxcXCcpXG5cdFx0XHRcdFx0ICAucmVwbGFjZSgnU0xBU0gnLCAnLycpXG5cdFx0XHRcdFx0ICAucmVwbGFjZSgnTEVGVEJSQUNLRVQnLCAnWycpXG5cdFx0XHRcdFx0ICAucmVwbGFjZSgnUklHSFRCUkFDS0VUJywgJ10nKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogY3JlYXRlVG9vbHRpcFxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtqUXVlcnl9ICRjb250YWluZXJcblx0XHQgKiBAcGFyYW0ge09iamVjdH0ga2V5TWFwXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IFtzUGxhY2VtZW50XVxuXHRcdCAqL1xuXHRcdHZhciBjcmVhdGVUb29sdGlwID0gZnVuY3Rpb24gKCRjb250YWluZXIsIGtleU1hcCwgc1BsYWNlbWVudCkge1xuXHRcdFx0dmFyIGludmVydGVkS2V5TWFwID0gZnVuYy5pbnZlcnRPYmplY3Qoa2V5TWFwKTtcblx0XHRcdHZhciAkYnV0dG9ucyA9ICRjb250YWluZXIuZmluZCgnYnV0dG9uJyk7XG5cblx0XHRcdCRidXR0b25zLmVhY2goZnVuY3Rpb24gKGksIGVsQnRuKSB7XG5cdFx0XHRcdHZhciAkYnRuID0gJChlbEJ0bik7XG5cdFx0XHRcdHZhciBzU2hvcnRjdXQgPSBpbnZlcnRlZEtleU1hcFskYnRuLmRhdGEoJ2V2ZW50JyldO1xuXHRcdFx0XHRpZiAoc1Nob3J0Y3V0KSB7XG5cdFx0XHRcdFx0JGJ0bi5hdHRyKCd0aXRsZScsIGZ1bmN0aW9uIChpLCB2KSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdiArICcgKCcgKyByZXByZXNlbnRTaG9ydGN1dChzU2hvcnRjdXQpICsgJyknO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIGJvb3RzdHJhcCB0b29sdGlwIG9uIGJ0bi1ncm91cCBidWdcblx0XHRcdFx0Ly8gaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2lzc3Vlcy81Njg3XG5cdFx0XHR9KS50b29sdGlwKHtcblx0XHRcdFx0Y29udGFpbmVyOiAnYm9keScsXG5cdFx0XHRcdHRyaWdnZXI6ICdob3ZlcicsXG5cdFx0XHRcdHBsYWNlbWVudDogc1BsYWNlbWVudCB8fCAndG9wJ1xuXHRcdFx0fSkub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHQkKHRoaXMpLnRvb2x0aXAoJ2hpZGUnKTtcblx0XHRcdH0pO1xuXHRcdH07XG5cblx0XHQvLyBjcmVhdGVQYWxldHRlXG5cdFx0dmFyIGNyZWF0ZVBhbGV0dGUgPSBmdW5jdGlvbiAoJGNvbnRhaW5lciwgb3B0aW9ucykge1xuXHRcdFx0dmFyIGNvbG9ySW5mbyA9IG9wdGlvbnMuY29sb3JzO1xuXHRcdFx0JGNvbnRhaW5lci5maW5kKCcubm90ZS1jb2xvci1wYWxldHRlJykuZWFjaChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHZhciAkcGFsZXR0ZSA9ICQodGhpcyksIGV2ZW50TmFtZSA9ICRwYWxldHRlLmF0dHIoJ2RhdGEtdGFyZ2V0LWV2ZW50Jyk7XG5cdFx0XHRcdHZhciBwYWxldHRlQ29udGVudHMgPSBbXTtcblx0XHRcdFx0Zm9yICh2YXIgcm93ID0gMCwgbGVuUm93ID0gY29sb3JJbmZvLmxlbmd0aDsgcm93IDwgbGVuUm93OyByb3crKykge1xuXHRcdFx0XHRcdHZhciBjb2xvcnMgPSBjb2xvckluZm9bcm93XTtcblx0XHRcdFx0XHR2YXIgYnV0dG9ucyA9IFtdO1xuXHRcdFx0XHRcdGZvciAodmFyIGNvbCA9IDAsIGxlbkNvbCA9IGNvbG9ycy5sZW5ndGg7IGNvbCA8IGxlbkNvbDsgY29sKyspIHtcblx0XHRcdFx0XHRcdHZhciBjb2xvciA9IGNvbG9yc1tjb2xdO1xuXHRcdFx0XHRcdFx0YnV0dG9ucy5wdXNoKFsnPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJub3RlLWNvbG9yLWJ0blwiIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjonLCBjb2xvcixcblx0XHRcdFx0XHRcdFx0XHRcdCAgICc7XCIgZGF0YS1ldmVudD1cIicsIGV2ZW50TmFtZSxcblx0XHRcdFx0XHRcdFx0XHRcdCAgICdcIiBkYXRhLXZhbHVlPVwiJywgY29sb3IsXG5cdFx0XHRcdFx0XHRcdFx0XHQgICAnXCIgdGl0bGU9XCInLCBjb2xvcixcblx0XHRcdFx0XHRcdFx0XHRcdCAgICdcIiBkYXRhLXRvZ2dsZT1cImJ1dHRvblwiIHRhYmluZGV4PVwiLTFcIj48L2J1dHRvbj4nXS5qb2luKCcnKSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHBhbGV0dGVDb250ZW50cy5wdXNoKCc8ZGl2IGNsYXNzPVwibm90ZS1jb2xvci1yb3dcIj4nICsgYnV0dG9ucy5qb2luKCcnKSArICc8L2Rpdj4nKTtcblx0XHRcdFx0fVxuXHRcdFx0XHQkcGFsZXR0ZS5odG1sKHBhbGV0dGVDb250ZW50cy5qb2luKCcnKSk7XG5cdFx0XHR9KTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogY3JlYXRlIHN1bW1lcm5vdGUgbGF5b3V0IChhaXIgbW9kZSlcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fSAkaG9sZGVyXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcblx0XHQgKi9cblx0XHR0aGlzLmNyZWF0ZUxheW91dEJ5QWlyTW9kZSA9IGZ1bmN0aW9uICgkaG9sZGVyLCBvcHRpb25zKSB7XG5cdFx0XHR2YXIgbGFuZ0luZm8gPSBvcHRpb25zLmxhbmdJbmZvO1xuXHRcdFx0dmFyIGtleU1hcCA9IG9wdGlvbnMua2V5TWFwW2FnZW50LmlzTWFjID8gJ21hYycgOiAncGMnXTtcblx0XHRcdHZhciBpZCA9IGZ1bmMudW5pcXVlSWQoKTtcblxuXHRcdFx0JGhvbGRlci5hZGRDbGFzcygnbm90ZS1haXItZWRpdG9yIG5vdGUtZWRpdGFibGUnKTtcblx0XHRcdCRob2xkZXIuYXR0cih7XG5cdFx0XHRcdCdpZCc6ICdub3RlLWVkaXRvci0nICsgaWQsXG5cdFx0XHRcdCdjb250ZW50RWRpdGFibGUnOiB0cnVlXG5cdFx0XHR9KTtcblxuXHRcdFx0dmFyIGJvZHkgPSBkb2N1bWVudC5ib2R5O1xuXG5cdFx0XHQvLyBjcmVhdGUgUG9wb3ZlclxuXHRcdFx0dmFyICRwb3BvdmVyID0gJCh0cGxQb3BvdmVycyhsYW5nSW5mbywgb3B0aW9ucykpO1xuXHRcdFx0JHBvcG92ZXIuYWRkQ2xhc3MoJ25vdGUtYWlyLWxheW91dCcpO1xuXHRcdFx0JHBvcG92ZXIuYXR0cignaWQnLCAnbm90ZS1wb3BvdmVyLScgKyBpZCk7XG5cdFx0XHQkcG9wb3Zlci5hcHBlbmRUbyhib2R5KTtcblx0XHRcdGNyZWF0ZVRvb2x0aXAoJHBvcG92ZXIsIGtleU1hcCk7XG5cdFx0XHRjcmVhdGVQYWxldHRlKCRwb3BvdmVyLCBvcHRpb25zKTtcblxuXHRcdFx0Ly8gY3JlYXRlIEhhbmRsZVxuXHRcdFx0dmFyICRoYW5kbGUgPSAkKHRwbEhhbmRsZXMoKSk7XG5cdFx0XHQkaGFuZGxlLmFkZENsYXNzKCdub3RlLWFpci1sYXlvdXQnKTtcblx0XHRcdCRoYW5kbGUuYXR0cignaWQnLCAnbm90ZS1oYW5kbGUtJyArIGlkKTtcblx0XHRcdCRoYW5kbGUuYXBwZW5kVG8oYm9keSk7XG5cblx0XHRcdC8vIGNyZWF0ZSBEaWFsb2dcblx0XHRcdHZhciAkZGlhbG9nID0gJCh0cGxEaWFsb2dzKGxhbmdJbmZvLCBvcHRpb25zKSk7XG5cdFx0XHQkZGlhbG9nLmFkZENsYXNzKCdub3RlLWFpci1sYXlvdXQnKTtcblx0XHRcdCRkaWFsb2cuYXR0cignaWQnLCAnbm90ZS1kaWFsb2ctJyArIGlkKTtcblx0XHRcdCRkaWFsb2cuZmluZCgnYnV0dG9uLmNsb3NlLCBhLm1vZGFsLWNsb3NlJykuY2xpY2soZnVuY3Rpb24gKCkge1xuXHRcdFx0XHQkKHRoaXMpLmNsb3Nlc3QoJy5tb2RhbCcpLm1vZGFsKCdoaWRlJyk7XG5cdFx0XHR9KTtcblx0XHRcdCRkaWFsb2cuYXBwZW5kVG8oYm9keSk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIGNyZWF0ZSBzdW1tZXJub3RlIGxheW91dCAobm9ybWFsIG1vZGUpXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGhvbGRlclxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG5cdFx0ICovXG5cdFx0dGhpcy5jcmVhdGVMYXlvdXRCeUZyYW1lID0gZnVuY3Rpb24gKCRob2xkZXIsIG9wdGlvbnMpIHtcblx0XHRcdHZhciBsYW5nSW5mbyA9IG9wdGlvbnMubGFuZ0luZm87XG5cblx0XHRcdHZhciBpc0NvbnRlbnRFZGl0YWJsZSA9ICEkaG9sZGVyLmlzKCc6ZGlzYWJsZWQnKTtcblxuXHRcdFx0Ly8wMS4gY3JlYXRlIEVkaXRvclxuXHRcdFx0dmFyICRlZGl0b3IgPSAkKCc8ZGl2IGNsYXNzPVwibm90ZS1lZGl0b3IgZWRpdGFibGUtJyArIGlzQ29udGVudEVkaXRhYmxlICsgJ1wiPjwvZGl2PicpO1xuXHRcdFx0aWYgKG9wdGlvbnMud2lkdGgpIHtcblx0XHRcdFx0JGVkaXRvci53aWR0aChvcHRpb25zLndpZHRoKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8wMi4gc3RhdHVzYmFyIChyZXNpemViYXIpXG5cdFx0XHRpZiAob3B0aW9ucy5oZWlnaHQgPiAwKSB7XG5cdFx0XHRcdCQoJzxkaXYgY2xhc3M9XCJub3RlLXN0YXR1c2JhclwiPicgKyAob3B0aW9ucy5kaXNhYmxlUmVzaXplRWRpdG9yID8gJycgOiB0cGxTdGF0dXNiYXIoKSkgKyAnPC9kaXY+JykucHJlcGVuZFRvKCRlZGl0b3IpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLzAzLiBjcmVhdGUgRWRpdGFibGVcblxuXHRcdFx0dmFyICRlZGl0YWJsZSA9ICQoJzxkaXYgY2xhc3M9XCJub3RlLWVkaXRhYmxlXCIgY29udGVudEVkaXRhYmxlPVwiJyArIGlzQ29udGVudEVkaXRhYmxlICsgJ1wiPjwvZGl2PicpXG5cdFx0XHRcdC5wcmVwZW5kVG8oJGVkaXRvcik7XG5cdFx0XHRpZiAob3B0aW9ucy5oZWlnaHQpIHtcblx0XHRcdFx0JGVkaXRhYmxlLmhlaWdodChvcHRpb25zLmhlaWdodCk7XG5cdFx0XHR9XG5cdFx0XHRpZiAob3B0aW9ucy5kaXJlY3Rpb24pIHtcblx0XHRcdFx0JGVkaXRhYmxlLmF0dHIoJ2RpcicsIG9wdGlvbnMuZGlyZWN0aW9uKTtcblx0XHRcdH1cblx0XHRcdHZhciBwbGFjZWhvbGRlciA9ICRob2xkZXIuYXR0cigncGxhY2Vob2xkZXInKSB8fCBvcHRpb25zLnBsYWNlaG9sZGVyO1xuXHRcdFx0aWYgKHBsYWNlaG9sZGVyKSB7XG5cdFx0XHRcdCRlZGl0YWJsZS5hdHRyKCdkYXRhLXBsYWNlaG9sZGVyJywgcGxhY2Vob2xkZXIpO1xuXHRcdFx0fVxuXG5cdFx0XHQkZWRpdGFibGUuaHRtbChkb20uaHRtbCgkaG9sZGVyKSk7XG5cblx0XHRcdC8vMDMxLiBjcmVhdGUgY29kYWJsZVxuXHRcdFx0JCgnPHRleHRhcmVhIGNsYXNzPVwibm90ZS1jb2RhYmxlXCI+PC90ZXh0YXJlYT4nKS5wcmVwZW5kVG8oJGVkaXRvcik7XG5cblx0XHRcdC8vMDQuIGNyZWF0ZSBUb29sYmFyXG5cdFx0XHR2YXIgJHRvb2xiYXIgPSAkKCc8ZGl2IGNsYXNzPVwibm90ZS10b29sYmFyIGJ0bi10b29sYmFyXCIgLz4nKTtcblx0XHRcdGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IG9wdGlvbnMudG9vbGJhci5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcblx0XHRcdFx0dmFyIGdyb3VwTmFtZSA9IG9wdGlvbnMudG9vbGJhcltpZHhdWzBdO1xuXHRcdFx0XHR2YXIgZ3JvdXBCdXR0b25zID0gb3B0aW9ucy50b29sYmFyW2lkeF1bMV07XG5cblx0XHRcdFx0dmFyICRncm91cCA9ICQoJzxkaXYgY2xhc3M9XCJub3RlLScgKyBncm91cE5hbWUgKyAnIGJ0bi1ncm91cFwiIC8+Jyk7XG5cdFx0XHRcdGZvciAodmFyIGkgPSAwLCBidG5MZW5ndGggPSBncm91cEJ1dHRvbnMubGVuZ3RoOyBpIDwgYnRuTGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHR2YXIgYnV0dG9uSW5mbyA9IHRwbEJ1dHRvbkluZm9bZ3JvdXBCdXR0b25zW2ldXTtcblx0XHRcdFx0XHQvLyBjb250aW51ZSBjcmVhdGluZyB0b29sYmFyIGV2ZW4gaWYgYSBidXR0b24gZG9lc24ndCBleGlzdFxuXHRcdFx0XHRcdGlmICghJC5pc0Z1bmN0aW9uKGJ1dHRvbkluZm8pKSB7IGNvbnRpbnVlOyB9XG5cblx0XHRcdFx0XHR2YXIgJGJ1dHRvbiA9ICQoYnV0dG9uSW5mbyhsYW5nSW5mbywgb3B0aW9ucykpO1xuXHRcdFx0XHRcdCRidXR0b24uYXR0cignZGF0YS1uYW1lJywgZ3JvdXBCdXR0b25zW2ldKTsgIC8vIHNldCBidXR0b24ncyBhbGlhcywgYmVjdWFzZSB0byBnZXQgYnV0dG9uIGVsZW1lbnQgZnJvbSAkdG9vbGJhclxuXHRcdFx0XHRcdCRncm91cC5hcHBlbmQoJGJ1dHRvbik7XG5cdFx0XHRcdH1cblx0XHRcdFx0JHRvb2xiYXIuYXBwZW5kKCRncm91cCk7XG5cdFx0XHR9XG5cblx0XHRcdCR0b29sYmFyLnByZXBlbmRUbygkZWRpdG9yKTtcblx0XHRcdHZhciBrZXlNYXAgPSBvcHRpb25zLmtleU1hcFthZ2VudC5pc01hYyA/ICdtYWMnIDogJ3BjJ107XG5cdFx0XHRjcmVhdGVQYWxldHRlKCR0b29sYmFyLCBvcHRpb25zKTtcblx0XHRcdGNyZWF0ZVRvb2x0aXAoJHRvb2xiYXIsIGtleU1hcCwgJ2JvdHRvbScpO1xuXG5cdFx0XHQvLzA1LiBjcmVhdGUgUG9wb3ZlclxuXHRcdFx0dmFyICRwb3BvdmVyID0gJCh0cGxQb3BvdmVycyhsYW5nSW5mbywgb3B0aW9ucykpLnByZXBlbmRUbygkZWRpdG9yKTtcblx0XHRcdGNyZWF0ZVBhbGV0dGUoJHBvcG92ZXIsIG9wdGlvbnMpO1xuXHRcdFx0Y3JlYXRlVG9vbHRpcCgkcG9wb3Zlciwga2V5TWFwKTtcblxuXHRcdFx0Ly8wNi4gaGFuZGxlKGNvbnRyb2wgc2VsZWN0aW9uLCAuLi4pXG5cdFx0XHQkKHRwbEhhbmRsZXMoKSkucHJlcGVuZFRvKCRlZGl0b3IpO1xuXG5cdFx0XHQvLzA3LiBjcmVhdGUgRGlhbG9nXG5cdFx0XHR2YXIgJGRpYWxvZyA9ICQodHBsRGlhbG9ncyhsYW5nSW5mbywgb3B0aW9ucykpLnByZXBlbmRUbygkZWRpdG9yKTtcblx0XHRcdCRkaWFsb2cuZmluZCgnYnV0dG9uLmNsb3NlLCBhLm1vZGFsLWNsb3NlJykuY2xpY2soZnVuY3Rpb24gKCkge1xuXHRcdFx0XHQkKHRoaXMpLmNsb3Nlc3QoJy5tb2RhbCcpLm1vZGFsKCdoaWRlJyk7XG5cdFx0XHR9KTtcblxuXHRcdFx0Ly8wOC4gY3JlYXRlIERyb3B6b25lXG5cdFx0XHQkKCc8ZGl2IGNsYXNzPVwibm90ZS1kcm9wem9uZVwiPjxkaXYgY2xhc3M9XCJub3RlLWRyb3B6b25lLW1lc3NhZ2VcIj48L2Rpdj48L2Rpdj4nKS5wcmVwZW5kVG8oJGVkaXRvcik7XG5cblx0XHRcdC8vMDkuIEVkaXRvci9Ib2xkZXIgc3dpdGNoXG5cdFx0XHQkZWRpdG9yLmluc2VydEFmdGVyKCRob2xkZXIpO1xuXHRcdFx0JGhvbGRlci5oaWRlKCk7XG5cdFx0fTtcblxuXHRcdHRoaXMuaGFzTm90ZUVkaXRvciA9IGZ1bmN0aW9uICgkaG9sZGVyKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5ub3RlRWRpdG9yRnJvbUhvbGRlcigkaG9sZGVyKS5sZW5ndGggPiAwO1xuXHRcdH07XG5cblx0XHR0aGlzLm5vdGVFZGl0b3JGcm9tSG9sZGVyID0gZnVuY3Rpb24gKCRob2xkZXIpIHtcblx0XHRcdGlmICgkaG9sZGVyLmhhc0NsYXNzKCdub3RlLWFpci1lZGl0b3InKSkge1xuXHRcdFx0XHRyZXR1cm4gJGhvbGRlcjtcblx0XHRcdH0gZWxzZSBpZiAoJGhvbGRlci5uZXh0KCkuaGFzQ2xhc3MoJ25vdGUtZWRpdG9yJykpIHtcblx0XHRcdFx0cmV0dXJuICRob2xkZXIubmV4dCgpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuICQoKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogY3JlYXRlIHN1bW1lcm5vdGUgbGF5b3V0XG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGhvbGRlclxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG5cdFx0ICovXG5cdFx0dGhpcy5jcmVhdGVMYXlvdXQgPSBmdW5jdGlvbiAoJGhvbGRlciwgb3B0aW9ucykge1xuXHRcdFx0aWYgKG9wdGlvbnMuYWlyTW9kZSkge1xuXHRcdFx0XHR0aGlzLmNyZWF0ZUxheW91dEJ5QWlyTW9kZSgkaG9sZGVyLCBvcHRpb25zKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuY3JlYXRlTGF5b3V0QnlGcmFtZSgkaG9sZGVyLCBvcHRpb25zKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogcmV0dXJucyBsYXlvdXRJbmZvIGZyb20gaG9sZGVyXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGhvbGRlciAtIHBsYWNlaG9sZGVyXG5cdFx0ICogQHJldHVybiB7T2JqZWN0fVxuXHRcdCAqL1xuXHRcdHRoaXMubGF5b3V0SW5mb0Zyb21Ib2xkZXIgPSBmdW5jdGlvbiAoJGhvbGRlcikge1xuXHRcdFx0dmFyICRlZGl0b3IgPSB0aGlzLm5vdGVFZGl0b3JGcm9tSG9sZGVyKCRob2xkZXIpO1xuXHRcdFx0aWYgKCEkZWRpdG9yLmxlbmd0aCkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdC8vIGNvbm5lY3QgJGhvbGRlciB0byAkZWRpdG9yXG5cdFx0XHQkZWRpdG9yLmRhdGEoJ2hvbGRlcicsICRob2xkZXIpO1xuXG5cdFx0XHRyZXR1cm4gZG9tLmJ1aWxkTGF5b3V0SW5mbygkZWRpdG9yKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogcmVtb3ZlTGF5b3V0XG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge2pRdWVyeX0gJGhvbGRlciAtIHBsYWNlaG9sZGVyXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IGxheW91dEluZm9cblx0XHQgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuXHRcdCAqXG5cdFx0ICovXG5cdFx0dGhpcy5yZW1vdmVMYXlvdXQgPSBmdW5jdGlvbiAoJGhvbGRlciwgbGF5b3V0SW5mbywgb3B0aW9ucykge1xuXHRcdFx0aWYgKG9wdGlvbnMuYWlyTW9kZSkge1xuXHRcdFx0XHQkaG9sZGVyLnJlbW92ZUNsYXNzKCdub3RlLWFpci1lZGl0b3Igbm90ZS1lZGl0YWJsZScpXG5cdFx0XHRcdFx0ICAgLnJlbW92ZUF0dHIoJ2lkIGNvbnRlbnRFZGl0YWJsZScpO1xuXG5cdFx0XHRcdGxheW91dEluZm8ucG9wb3ZlcigpLnJlbW92ZSgpO1xuXHRcdFx0XHRsYXlvdXRJbmZvLmhhbmRsZSgpLnJlbW92ZSgpO1xuXHRcdFx0XHRsYXlvdXRJbmZvLmRpYWxvZygpLnJlbW92ZSgpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0JGhvbGRlci5odG1sKGxheW91dEluZm8uZWRpdGFibGUoKS5odG1sKCkpO1xuXG5cdFx0XHRcdGxheW91dEluZm8uZWRpdG9yKCkucmVtb3ZlKCk7XG5cdFx0XHRcdCRob2xkZXIuc2hvdygpO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKlxuXHRcdCAqIEByZXR1cm4ge09iamVjdH1cblx0XHQgKiBAcmV0dXJuIHtmdW5jdGlvbihsYWJlbCwgb3B0aW9ucz0pOnN0cmluZ30gcmV0dXJuLmJ1dHRvbiB7QGxpbmsgI3RwbEJ1dHRvbiBmdW5jdGlvbiB0byBtYWtlIHRleHQgYnV0dG9ufVxuXHRcdCAqIEByZXR1cm4ge2Z1bmN0aW9uKGljb25DbGFzcywgb3B0aW9ucz0pOnN0cmluZ30gcmV0dXJuLmljb25CdXR0b24ge0BsaW5rICN0cGxJY29uQnV0dG9uIGZ1bmN0aW9uIHRvIG1ha2UgaWNvbiBidXR0b259XG5cdFx0ICogQHJldHVybiB7ZnVuY3Rpb24oY2xhc3NOYW1lLCB0aXRsZT0sIGJvZHk9LCBmb290ZXI9KTpzdHJpbmd9IHJldHVybi5kaWFsb2cge0BsaW5rICN0cGxEaWFsb2cgZnVuY3Rpb24gdG8gbWFrZSBkaWFsb2d9XG5cdFx0ICovXG5cdFx0dGhpcy5nZXRUZW1wbGF0ZSA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGJ1dHRvbjogdHBsQnV0dG9uLFxuXHRcdFx0XHRpY29uQnV0dG9uOiB0cGxJY29uQnV0dG9uLFxuXHRcdFx0XHRkaWFsb2c6IHRwbERpYWxvZ1xuXHRcdFx0fTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogYWRkIGJ1dHRvbiBpbmZvcm1hdGlvblxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgYnV0dG9uIG5hbWVcblx0XHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBidXR0b25JbmZvIGZ1bmN0aW9uIHRvIG1ha2UgYnV0dG9uLCByZWZlcmVuY2UgdG8ge0BsaW5rICN0cGxCdXR0b259LHtAbGluayAjdHBsSWNvbkJ1dHRvbn1cblx0XHQgKi9cblx0XHR0aGlzLmFkZEJ1dHRvbkluZm8gPSBmdW5jdGlvbiAobmFtZSwgYnV0dG9uSW5mbykge1xuXHRcdFx0dHBsQnV0dG9uSW5mb1tuYW1lXSA9IGJ1dHRvbkluZm87XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcblx0XHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBkaWFsb2dJbmZvIGZ1bmN0aW9uIHRvIG1ha2UgZGlhbG9nLCByZWZlcmVuY2UgdG8ge0BsaW5rICN0cGxEaWFsb2d9XG5cdFx0ICovXG5cdFx0dGhpcy5hZGREaWFsb2dJbmZvID0gZnVuY3Rpb24gKG5hbWUsIGRpYWxvZ0luZm8pIHtcblx0XHRcdHRwbERpYWxvZ0luZm9bbmFtZV0gPSBkaWFsb2dJbmZvO1xuXHRcdH07XG5cdH07XG5cblxuXHQvLyBqUXVlcnkgbmFtZXNwYWNlIGZvciBzdW1tZXJub3RlXG5cdC8qKlxuXHQgKiBAY2xhc3MgJC5zdW1tZXJub3RlIFxuXHQgKiBcblx0ICogc3VtbWVybm90ZSBhdHRyaWJ1dGUgIFxuXHQgKiBcblx0ICogQG1peGluIGRlZmF1bHRzXG5cdCAqIEBzaW5nbGV0b24gIFxuXHQgKiBcblx0ICovXG5cdCQuc3VtbWVybm90ZSA9ICQuc3VtbWVybm90ZSB8fCB7fTtcblxuXHQvLyBleHRlbmRzIGRlZmF1bHQgc2V0dGluZ3Ncblx0Ly8gIC0gJC5zdW1tZXJub3RlLnZlcnNpb25cblx0Ly8gIC0gJC5zdW1tZXJub3RlLm9wdGlvbnNcblx0Ly8gIC0gJC5zdW1tZXJub3RlLmxhbmdcblx0JC5leHRlbmQoJC5zdW1tZXJub3RlLCBkZWZhdWx0cyk7XG5cblx0dmFyIHJlbmRlcmVyID0gbmV3IFJlbmRlcmVyKCk7XG5cdHZhciBldmVudEhhbmRsZXIgPSBuZXcgRXZlbnRIYW5kbGVyKCk7XG5cblx0JC5leHRlbmQoJC5zdW1tZXJub3RlLCB7XG5cdFx0LyoqIEBwcm9wZXJ0eSB7UmVuZGVyZXJ9ICovXG5cdFx0cmVuZGVyZXI6IHJlbmRlcmVyLFxuXHRcdC8qKiBAcHJvcGVydHkge0V2ZW50SGFuZGxlcn0gKi9cblx0XHRldmVudEhhbmRsZXI6IGV2ZW50SGFuZGxlcixcblx0XHQvKiogXG5cdFx0ICogQHByb3BlcnR5IHtPYmplY3R9IGNvcmUgXG5cdFx0ICogQHByb3BlcnR5IHtjb3JlLmFnZW50fSBjb3JlLmFnZW50IFxuXHRcdCAqIEBwcm9wZXJ0eSB7Y29yZS5kb219IGNvcmUuZG9tXG5cdFx0ICogQHByb3BlcnR5IHtjb3JlLnJhbmdlfSBjb3JlLnJhbmdlIFxuXHRcdCAqL1xuXHRcdGNvcmU6IHtcblx0XHRcdGFnZW50OiBhZ2VudCxcblx0XHRcdGRvbTogZG9tLFxuXHRcdFx0cmFuZ2U6IHJhbmdlXG5cdFx0fSxcblx0XHQvKiogXG5cdFx0ICogQHByb3BlcnR5IHtPYmplY3R9IFxuXHRcdCAqIHBsdWdpbkV2ZW50cyBldmVudCBsaXN0IGZvciBwbHVnaW5zXG5cdFx0ICogZXZlbnQgaGFzIG5hbWUgYW5kIGNhbGxiYWNrIGZ1bmN0aW9uLlxuXHRcdCAqIFxuXHRcdCAqIGBgYCBcblx0XHQgKiAkLnN1bW1lcm5vdGUuYWRkUGx1Z2luKHtcblx0XHQgKiAgICAgZXZlbnRzIDoge1xuXHRcdCAqICAgICAgICAgICdoZWxsbycgOiBmdW5jdGlvbihsYXlvdXRJbmZvLCB2YWx1ZSwgJHRhcmdldCkge1xuXHRcdCAqICAgICAgICAgICAgICBjb25zb2xlLmxvZygnZXZlbnQgbmFtZSBpcyBoZWxsbywgdmFsdWUgaXMgJyArIHZhbHVlICk7XG5cdFx0ICogICAgICAgICAgfVxuXHRcdCAqICAgICB9ICAgICBcblx0XHQgKiB9KVxuXHRcdCAqIGBgYFxuXHRcdCAqIFxuXHRcdCAqICogZXZlbnQgbmFtZSBpcyBkYXRhLWV2ZW50IHByb3BlcnR5LlxuXHRcdCAqICogbGF5b3V0SW5mbyBpcyBhIHN1bW1lcm5vdGUgbGF5b3V0IGluZm9ybWF0aW9uLlxuXHRcdCAqICogdmFsdWUgaXMgZGF0YS12YWx1ZSBwcm9wZXJ0eS5cblx0XHQgKi9cblx0XHRwbHVnaW5FdmVudHM6IHt9LFxuXG5cdFx0cGx1Z2luczogW11cblx0fSk7XG5cblx0LyoqXG5cdCAqIEBtZXRob2QgYWRkUGx1Z2luXG5cdCAqXG5cdCAqIGFkZCBQbHVnaW4gaW4gU3VtbWVybm90ZSBcblx0ICogXG5cdCAqIFN1bW1lcm5vdGUgY2FuIG1ha2UgYSBvd24gcGx1Z2luLlxuXHQgKlxuXHQgKiAjIyMgRGVmaW5lIHBsdWdpblxuXHQgKiBgYGBcblx0ICogLy8gZ2V0IHRlbXBsYXRlIGZ1bmN0aW9uICBcblx0ICogdmFyIHRtcGwgPSAkLnN1bW1lcm5vdGUucmVuZGVyZXIuZ2V0VGVtcGxhdGUoKTtcblx0ICogXG5cdCAqIC8vIGFkZCBhIGJ1dHRvbiAgIFxuXHQgKiAkLnN1bW1lcm5vdGUuYWRkUGx1Z2luKHtcblx0ICogICAgIGJ1dHRvbnMgOiB7XG5cdCAqICAgICAgICAvLyBcImhlbGxvXCIgIGlzIGJ1dHRvbidzIG5hbWVzcGFjZS4gICAgICBcblx0ICogICAgICAgIFwiaGVsbG9cIiA6IGZ1bmN0aW9uKGxhbmcsIG9wdGlvbnMpIHtcblx0ICogICAgICAgICAgICAvLyBtYWtlIGljb24gYnV0dG9uIGJ5IHRlbXBsYXRlIGZ1bmN0aW9uICAgICAgICAgIFxuXHQgKiAgICAgICAgICAgIHJldHVybiB0bXBsLmljb25CdXR0b24oJ2ZhIGZhLWhlYWRlcicsIHtcblx0ICogICAgICAgICAgICAgICAgLy8gY2FsbGJhY2sgZnVuY3Rpb24gbmFtZSB3aGVuIGJ1dHRvbiBjbGlja2VkIFxuXHQgKiAgICAgICAgICAgICAgICBldmVudCA6ICdoZWxsbycsXG5cdCAqICAgICAgICAgICAgICAgIC8vIHNldCBkYXRhLXZhbHVlIHByb3BlcnR5ICAgICAgICAgICAgICAgICBcblx0ICogICAgICAgICAgICAgICAgdmFsdWUgOiAnaGVsbG8nLCAgICAgICAgICAgICAgICBcblx0ICogICAgICAgICAgICAgICAgaGlkZSA6IHRydWVcblx0ICogICAgICAgICAgICB9KTsgICAgICAgICAgIFxuXHQgKiAgICAgICAgfVxuXHQgKiAgICAgXG5cdCAqICAgICB9LCBcblx0ICogICAgIFxuXHQgKiAgICAgZXZlbnRzIDoge1xuXHQgKiAgICAgICAgXCJoZWxsb1wiIDogZnVuY3Rpb24obGF5b3V0SW5mbywgdmFsdWUpIHtcblx0ICogICAgICAgICAgICAvLyBoZXJlIGlzIGV2ZW50IGNvZGUgXG5cdCAqICAgICAgICB9XG5cdCAqICAgICB9ICAgICBcblx0ICogfSk7XG5cdCAqIGBgYCBcblx0ICogIyMjIFVzZSBhIHBsdWdpbiBpbiB0b29sYmFyXG5cdCAqIFxuXHQgKiBgYGAgXG5cdCAqICAgICQoXCIjZWRpdG9yXCIpLnN1bW1lcm5vdGUoe1xuXHQgKiAgICAuLi5cblx0ICogICAgdG9vbGJhciA6IFtcblx0ICogICAgICAgIC8vIGRpc3BsYXkgaGVsbG8gcGx1Z2luIGluIHRvb2xiYXIgICAgIFxuXHQgKiAgICAgICAgWydncm91cCcsIFsgJ2hlbGxvJyBdXVxuXHQgKiAgICBdXG5cdCAqICAgIC4uLiAgICBcblx0ICogICAgfSk7XG5cdCAqIGBgYFxuXHQgKiAgXG5cdCAqICBcblx0ICogQHBhcmFtIHtPYmplY3R9IHBsdWdpblxuXHQgKiBAcGFyYW0ge09iamVjdH0gW3BsdWdpbi5idXR0b25zXSBkZWZpbmUgcGx1Z2luIGJ1dHRvbi4gZm9yIGRldGFpbCwgc2VlIHRvIFJlbmRlcmVyLmFkZEJ1dHRvbkluZm9cblx0ICogQHBhcmFtIHtPYmplY3R9IFtwbHVnaW4uZGlhbG9nc10gZGVmaW5lIHBsdWdpbiBkaWFsb2cuIGZvciBkZXRhaWwsIHNlZSB0byBSZW5kZXJlci5hZGREaWFsb2dJbmZvXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbcGx1Z2luLmV2ZW50c10gYWRkIGV2ZW50IGluICQuc3VtbWVybm90ZS5wbHVnaW5FdmVudHMgXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbcGx1Z2luLmxhbmdzXSB1cGRhdGUgJC5zdW1tZXJub3RlLmxhbmdcblx0ICogQHBhcmFtIHtPYmplY3R9IFtwbHVnaW4ub3B0aW9uc10gdXBkYXRlICQuc3VtbWVybm90ZS5vcHRpb25zXG5cdCAqL1xuXHQkLnN1bW1lcm5vdGUuYWRkUGx1Z2luID0gZnVuY3Rpb24gKHBsdWdpbikge1xuXG5cdFx0Ly8gc2F2ZSBwbHVnaW4gbGlzdFxuXHRcdCQuc3VtbWVybm90ZS5wbHVnaW5zLnB1c2gocGx1Z2luKTtcblxuXHRcdGlmIChwbHVnaW4uYnV0dG9ucykge1xuXHRcdFx0JC5lYWNoKHBsdWdpbi5idXR0b25zLCBmdW5jdGlvbiAobmFtZSwgYnV0dG9uKSB7XG5cdFx0XHRcdHJlbmRlcmVyLmFkZEJ1dHRvbkluZm8obmFtZSwgYnV0dG9uKTtcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdGlmIChwbHVnaW4uZGlhbG9ncykge1xuXHRcdFx0JC5lYWNoKHBsdWdpbi5kaWFsb2dzLCBmdW5jdGlvbiAobmFtZSwgZGlhbG9nKSB7XG5cdFx0XHRcdHJlbmRlcmVyLmFkZERpYWxvZ0luZm8obmFtZSwgZGlhbG9nKTtcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdGlmIChwbHVnaW4uZXZlbnRzKSB7XG5cdFx0XHQkLmVhY2gocGx1Z2luLmV2ZW50cywgZnVuY3Rpb24gKG5hbWUsIGV2ZW50KSB7XG5cdFx0XHRcdCQuc3VtbWVybm90ZS5wbHVnaW5FdmVudHNbbmFtZV0gPSBldmVudDtcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdGlmIChwbHVnaW4ubGFuZ3MpIHtcblx0XHRcdCQuZWFjaChwbHVnaW4ubGFuZ3MsIGZ1bmN0aW9uIChsb2NhbGUsIGxhbmcpIHtcblx0XHRcdFx0aWYgKCQuc3VtbWVybm90ZS5sYW5nW2xvY2FsZV0pIHtcblx0XHRcdFx0XHQkLmV4dGVuZCgkLnN1bW1lcm5vdGUubGFuZ1tsb2NhbGVdLCBsYW5nKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0aWYgKHBsdWdpbi5vcHRpb25zKSB7XG5cdFx0XHQkLmV4dGVuZCgkLnN1bW1lcm5vdGUub3B0aW9ucywgcGx1Z2luLm9wdGlvbnMpO1xuXHRcdH1cblx0fTtcblxuXHQvKlxuXHQgKiBleHRlbmQgJC5mblxuXHQgKi9cblx0JC5mbi5leHRlbmQoe1xuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2Rcblx0XHQgKiBJbml0aWFsaXplIHN1bW1lcm5vdGVcblx0XHQgKiAgLSBjcmVhdGUgZWRpdG9yIGxheW91dCBhbmQgYXR0YWNoIE1vdXNlIGFuZCBrZXlib2FyZCBldmVudHMuXG5cdFx0ICogXG5cdFx0ICogYGBgXG5cdFx0ICogJChcIiNzdW1tZXJub3RlXCIpLnN1bW1lcm5vdGUoIHsgb3B0aW9ucyAuLn0gKTtcblx0XHQgKiBgYGBcblx0XHQgKiAgIFxuXHRcdCAqIEBtZW1iZXIgJC5mblxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fFN0cmluZ30gb3B0aW9ucyByZWZlcmVuY2UgdG8gJC5zdW1tZXJub3RlLm9wdGlvbnNcblx0XHQgKiBAcmV0dXJuIHt0aGlzfVxuXHRcdCAqL1xuXHRcdHN1bW1lcm5vdGU6IGZ1bmN0aW9uICgpIHtcblx0XHRcdC8vIGNoZWNrIGZpcnN0IGFyZ3VtZW50J3MgdHlwZVxuXHRcdFx0Ly8gIC0ge1N0cmluZ306IEV4dGVybmFsIEFQSSBjYWxsIHt7bW9kdWxlfX0ue3ttZXRob2R9fVxuXHRcdFx0Ly8gIC0ge09iamVjdH06IGluaXQgb3B0aW9uc1xuXHRcdFx0dmFyIHR5cGUgPSAkLnR5cGUobGlzdC5oZWFkKGFyZ3VtZW50cykpO1xuXHRcdFx0dmFyIGlzRXh0ZXJuYWxBUElDYWxsZWQgPSB0eXBlID09PSAnc3RyaW5nJztcblx0XHRcdHZhciBpc0luaXRPcHRpb25zID0gdHlwZSA9PT0gJ29iamVjdCc7XG5cblx0XHRcdC8vIGV4dGVuZCBkZWZhdWx0IG9wdGlvbnMgd2l0aCBjdXN0b20gdXNlciBvcHRpb25zXG5cdFx0XHR2YXIgb3B0aW9ucyA9IGlzSW5pdE9wdGlvbnMgPyBsaXN0LmhlYWQoYXJndW1lbnRzKSA6IHt9O1xuXHRcdFx0b3B0aW9ucyA9ICQuZXh0ZW5kKHRydWUsIHt9LCAkLnN1bW1lcm5vdGUub3B0aW9ucywgb3B0aW9ucyk7XG5cblx0XHRcdC8vIEluY2x1ZGUgbGFuZ0luZm8gaW4gb3B0aW9ucyBmb3IgbGF0ZXIgdXNlLCBlLmcuIGZvciBpbWFnZSBkcmFnLW4tZHJvcFxuXHRcdFx0Ly8gU2V0dXAgbGFuZ3VhZ2UgaW5mbyB3aXRoIGVuLVVTIGFzIGRlZmF1bHRcblx0XHRcdG9wdGlvbnMubGFuZ0luZm8gPSAkLmV4dGVuZCh0cnVlLCB7fSwgJC5zdW1tZXJub3RlLmxhbmdbJ2VuLVVTJ10sICQuc3VtbWVybm90ZS5sYW5nW29wdGlvbnMubGFuZ10pO1xuXG5cdFx0XHR0aGlzLmVhY2goZnVuY3Rpb24gKGlkeCwgaG9sZGVyKSB7XG5cdFx0XHRcdHZhciAkaG9sZGVyID0gJChob2xkZXIpO1xuXG5cdFx0XHRcdC8vIGlmIGxheW91dCBpc24ndCBjcmVhdGVkIHlldCwgY3JlYXRlTGF5b3V0IGFuZCBhdHRhY2ggZXZlbnRzXG5cdFx0XHRcdGlmICghcmVuZGVyZXIuaGFzTm90ZUVkaXRvcigkaG9sZGVyKSkge1xuXHRcdFx0XHRcdHJlbmRlcmVyLmNyZWF0ZUxheW91dCgkaG9sZGVyLCBvcHRpb25zKTtcblxuXHRcdFx0XHRcdHZhciBsYXlvdXRJbmZvID0gcmVuZGVyZXIubGF5b3V0SW5mb0Zyb21Ib2xkZXIoJGhvbGRlcik7XG5cblx0XHRcdFx0XHRldmVudEhhbmRsZXIuYXR0YWNoKGxheW91dEluZm8sIG9wdGlvbnMpO1xuXHRcdFx0XHRcdGV2ZW50SGFuZGxlci5hdHRhY2hDdXN0b21FdmVudChsYXlvdXRJbmZvLCBvcHRpb25zKTtcblxuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblxuXHRcdFx0Ly8gY2FsbGJhY2sgb24gaW5pdFxuXHRcdFx0aWYgKCFpc0V4dGVybmFsQVBJQ2FsbGVkICYmIHRoaXMubGVuZ3RoICYmIG9wdGlvbnMub25pbml0KSB7XG5cdFx0XHRcdG9wdGlvbnMub25pbml0KCk7XG5cdFx0XHR9XG5cblx0XHRcdHZhciAkZmlyc3QgPSB0aGlzLmZpcnN0KCk7XG5cdFx0XHRpZiAoJGZpcnN0Lmxlbmd0aCkge1xuXHRcdFx0XHR2YXIgbGF5b3V0SW5mbyA9IHJlbmRlcmVyLmxheW91dEluZm9Gcm9tSG9sZGVyKCRmaXJzdCk7XG5cblx0XHRcdFx0Ly8gZXh0ZXJuYWwgQVBJXG5cdFx0XHRcdGlmIChpc0V4dGVybmFsQVBJQ2FsbGVkKSB7XG5cdFx0XHRcdFx0dmFyIG1vZHVsZUFuZE1ldGhvZCA9IGxpc3QuaGVhZChsaXN0LmZyb20oYXJndW1lbnRzKSk7XG5cdFx0XHRcdFx0dmFyIGFyZ3MgPSBsaXN0LnRhaWwobGlzdC5mcm9tKGFyZ3VtZW50cykpO1xuXG5cdFx0XHRcdFx0Ly8gVE9ETyBub3cgZXh0ZXJuYWwgQVBJIG9ubHkgd29ya3MgZm9yIGVkaXRvclxuXHRcdFx0XHRcdHZhciBwYXJhbXMgPSBbbW9kdWxlQW5kTWV0aG9kLCBsYXlvdXRJbmZvLmVkaXRhYmxlKCldLmNvbmNhdChhcmdzKTtcblx0XHRcdFx0XHRyZXR1cm4gZXZlbnRIYW5kbGVyLmludm9rZS5hcHBseShldmVudEhhbmRsZXIsIHBhcmFtcyk7XG5cdFx0XHRcdH0gZWxzZSBpZiAob3B0aW9ucy5mb2N1cykge1xuXHRcdFx0XHRcdC8vIGZvY3VzIG9uIGZpcnN0IGVkaXRhYmxlIGVsZW1lbnQgZm9yIGluaXRpYWxpemUgZWRpdG9yXG5cdFx0XHRcdFx0bGF5b3V0SW5mby5lZGl0YWJsZSgpLmZvY3VzKCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2QgXG5cdFx0ICogXG5cdFx0ICogZ2V0IHRoZSBIVE1MIGNvbnRlbnRzIG9mIG5vdGUgb3Igc2V0IHRoZSBIVE1MIGNvbnRlbnRzIG9mIG5vdGUuXG5cdFx0ICpcblx0XHQgKiAqIGdldCBjb250ZW50cyBcblx0XHQgKiBgYGBcblx0XHQgKiB2YXIgY29udGVudCA9ICQoXCIjc3VtbWVybm90ZVwiKS5jb2RlKCk7XG5cdFx0ICogYGBgXG5cdFx0ICogKiBzZXQgY29udGVudHMgXG5cdFx0ICpcblx0XHQgKiBgYGBcblx0XHQgKiAkKFwiI3N1bW1lcm5vdGVcIikuY29kZShodG1sKTtcblx0XHQgKiBgYGBcblx0XHQgKlxuXHRcdCAqIEBtZW1iZXIgJC5mbiBcblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gW2h0bWxdIC0gSFRNTCBjb250ZW50cyhvcHRpb25hbCwgc2V0KVxuXHRcdCAqIEByZXR1cm4ge3RoaXN8U3RyaW5nfSAtIGNvbnRleHQoc2V0KSBvciBIVE1MIGNvbnRlbnRzIG9mIG5vdGUoZ2V0KS5cblx0XHQgKi9cblx0XHRjb2RlOiBmdW5jdGlvbiAoaHRtbCkge1xuXHRcdFx0Ly8gZ2V0IHRoZSBIVE1MIGNvbnRlbnRzIG9mIG5vdGVcblx0XHRcdGlmIChodG1sID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0dmFyICRob2xkZXIgPSB0aGlzLmZpcnN0KCk7XG5cdFx0XHRcdGlmICghJGhvbGRlci5sZW5ndGgpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR2YXIgbGF5b3V0SW5mbyA9IHJlbmRlcmVyLmxheW91dEluZm9Gcm9tSG9sZGVyKCRob2xkZXIpO1xuXHRcdFx0XHR2YXIgJGVkaXRhYmxlID0gbGF5b3V0SW5mbyAmJiBsYXlvdXRJbmZvLmVkaXRhYmxlKCk7XG5cblx0XHRcdFx0aWYgKCRlZGl0YWJsZSAmJiAkZWRpdGFibGUubGVuZ3RoKSB7XG5cdFx0XHRcdFx0dmFyIGlzQ29kZXZpZXcgPSBldmVudEhhbmRsZXIuaW52b2tlKCdjb2Rldmlldy5pc0FjdGl2YXRlZCcsIGxheW91dEluZm8pO1xuXHRcdFx0XHRcdGV2ZW50SGFuZGxlci5pbnZva2UoJ2NvZGV2aWV3LnN5bmMnLCBsYXlvdXRJbmZvKTtcblx0XHRcdFx0XHRyZXR1cm4gaXNDb2RldmlldyA/IGxheW91dEluZm8uY29kYWJsZSgpLnZhbCgpIDpcblx0XHRcdFx0XHRcdFx0XHRcdFx0bGF5b3V0SW5mby5lZGl0YWJsZSgpLmh0bWwoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gZG9tLmlzVGV4dGFyZWEoJGhvbGRlclswXSkgPyAkaG9sZGVyLnZhbCgpIDogJGhvbGRlci5odG1sKCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIHNldCB0aGUgSFRNTCBjb250ZW50cyBvZiBub3RlXG5cdFx0XHR0aGlzLmVhY2goZnVuY3Rpb24gKGksIGhvbGRlcikge1xuXHRcdFx0XHR2YXIgbGF5b3V0SW5mbyA9IHJlbmRlcmVyLmxheW91dEluZm9Gcm9tSG9sZGVyKCQoaG9sZGVyKSk7XG5cdFx0XHRcdHZhciAkZWRpdGFibGUgPSBsYXlvdXRJbmZvICYmIGxheW91dEluZm8uZWRpdGFibGUoKTtcblx0XHRcdFx0aWYgKCRlZGl0YWJsZSkge1xuXHRcdFx0XHRcdCRlZGl0YWJsZS5odG1sKGh0bWwpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIEBtZXRob2Rcblx0XHQgKiBcblx0XHQgKiBkZXN0cm95IEVkaXRvciBMYXlvdXQgYW5kIGRldGFjaCBLZXkgYW5kIE1vdXNlIEV2ZW50XG5cdFx0ICpcblx0XHQgKiBAbWVtYmVyICQuZm5cblx0XHQgKiBAcmV0dXJuIHt0aGlzfVxuXHRcdCAqL1xuXHRcdGRlc3Ryb3k6IGZ1bmN0aW9uICgpIHtcblx0XHRcdHRoaXMuZWFjaChmdW5jdGlvbiAoaWR4LCBob2xkZXIpIHtcblx0XHRcdFx0dmFyICRob2xkZXIgPSAkKGhvbGRlcik7XG5cblx0XHRcdFx0aWYgKCFyZW5kZXJlci5oYXNOb3RlRWRpdG9yKCRob2xkZXIpKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dmFyIGluZm8gPSByZW5kZXJlci5sYXlvdXRJbmZvRnJvbUhvbGRlcigkaG9sZGVyKTtcblx0XHRcdFx0dmFyIG9wdGlvbnMgPSBpbmZvLmVkaXRvcigpLmRhdGEoJ29wdGlvbnMnKTtcblxuXHRcdFx0XHRldmVudEhhbmRsZXIuZGV0YWNoKGluZm8sIG9wdGlvbnMpO1xuXHRcdFx0XHRyZW5kZXJlci5yZW1vdmVMYXlvdXQoJGhvbGRlciwgaW5mbywgb3B0aW9ucyk7XG5cdFx0XHR9KTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXHR9KTtcbn0pKTtcblxufSkuY2FsbChnbG9iYWwsIG1vZHVsZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQpO1xuXG59KS5jYWxsKHRoaXMsdHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiA/IGdsb2JhbCA6IHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiID8gc2VsZiA6IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgPyB3aW5kb3cgOiB7fSlcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0OnV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklsTmpjbWx3ZEhNdmJHbGlMM04xYlcxbGNtNXZkR1V1YW5NaVhTd2libUZ0WlhNaU9sdGRMQ0p0WVhCd2FXNW5jeUk2SWp0QlFVRkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQklpd2labWxzWlNJNkltZGxibVZ5WVhSbFpDNXFjeUlzSW5OdmRYSmpaVkp2YjNRaU9pSWlMQ0p6YjNWeVkyVnpRMjl1ZEdWdWRDSTZXeUpjYmpzZ2FsRjFaWEo1SUQwZ1oyeHZZbUZzTG1wUmRXVnllU0E5SUhKbGNYVnBjbVVvWENKcWNYVmxjbmxjSWlrN1hHNDdJSFpoY2lCZlgySnliM2R6WlhKcFpubGZjMmhwYlY5eVpYRjFhWEpsWDE4OWNtVnhkV2x5WlRzb1puVnVZM1JwYjI0Z1luSnZkM05sY21sbWVWTm9hVzBvYlc5a2RXeGxMQ0JrWldacGJtVXNJSEpsY1hWcGNtVXBJSHRjYmk4cUtseHVJQ29nVTNWd1pYSWdjMmx0Y0d4bElIZDVjMmwzZVdjZ1pXUnBkRzl5SUc5dUlFSnZiM1J6ZEhKaGNDQjJNQzQyTGpOY2JpQXFJR2gwZEhBNkx5OXpkVzF0WlhKdWIzUmxMbTl5Wnk5Y2JpQXFYRzRnS2lCemRXMXRaWEp1YjNSbExtcHpYRzRnS2lCRGIzQjVjbWxuYUhRZ01qQXhNeTB5TURFMUlFRnNZVzRnU0c5dVp5NGdZVzVrSUc5MGFHVnlJR052Ym5SeWFXSjFkRzl5YzF4dUlDb2djM1Z0YldWeWJtOTBaU0J0WVhrZ1ltVWdabkpsWld4NUlHUnBjM1J5YVdKMWRHVmtJSFZ1WkdWeUlIUm9aU0JOU1ZRZ2JHbGpaVzV6WlM0dlhHNGdLbHh1SUNvZ1JHRjBaVG9nTWpBeE5TMHdOQzB3T0ZReE16b3lPRnBjYmlBcUwxeHVLR1oxYm1OMGFXOXVJQ2htWVdOMGIzSjVLU0I3WEc1Y2RDOHFJR2RzYjJKaGJDQmtaV1pwYm1VZ0tpOWNibHgwYVdZZ0tIUjVjR1Z2WmlCa1pXWnBibVVnUFQwOUlDZG1kVzVqZEdsdmJpY2dKaVlnWkdWbWFXNWxMbUZ0WkNrZ2UxeHVYSFJjZEM4dklFRk5SQzRnVW1WbmFYTjBaWElnWVhNZ1lXNGdZVzV2Ym5sdGIzVnpJRzF2WkhWc1pTNWNibHgwWEhSa1pXWnBibVVvV3lkcWNYVmxjbmtuWFN3Z1ptRmpkRzl5ZVNrN1hHNWNkSDBnWld4elpTQjdYRzVjZEZ4MEx5OGdRbkp2ZDNObGNpQm5iRzlpWVd4ek9pQnFVWFZsY25sY2JseDBYSFJtWVdOMGIzSjVLSGRwYm1SdmR5NXFVWFZsY25rcE8xeHVYSFI5WEc1OUtHWjFibU4wYVc5dUlDZ2tLU0I3WEc1Y2JseHVYRzVjZEdsbUlDZ2hRWEp5WVhrdWNISnZkRzkwZVhCbExuSmxaSFZqWlNrZ2UxeHVYSFJjZEM4cUtseHVYSFJjZENBcUlFRnljbUY1TG5CeWIzUnZkSGx3WlM1eVpXUjFZMlVnY0c5c2VXWnBiR3hjYmx4MFhIUWdLbHh1WEhSY2RDQXFJRUJ3WVhKaGJTQjdSblZ1WTNScGIyNTlJR05oYkd4aVlXTnJYRzVjZEZ4MElDb2dRSEJoY21GdElIdFdZV3gxWlgwZ1cybHVhWFJwWVd4V1lXeDFaVjFjYmx4MFhIUWdLaUJBY21WMGRYSnVJSHRXWVd4MVpYMWNibHgwWEhRZ0tseHVYSFJjZENBcUlFQnpaV1VnYUhSMGNEb3ZMMmR2Ynk1bmJDOVhUbkpwVVVSY2JseDBYSFFnS2k5Y2JseDBYSFJCY25KaGVTNXdjbTkwYjNSNWNHVXVjbVZrZFdObElEMGdablZ1WTNScGIyNGdLR05oYkd4aVlXTnJLU0I3WEc1Y2RGeDBYSFIyWVhJZ2RDQTlJRTlpYW1WamRDaDBhR2x6S1N3Z2JHVnVJRDBnZEM1c1pXNW5kR2dnUGo0K0lEQXNJR3NnUFNBd0xDQjJZV3gxWlR0Y2JseDBYSFJjZEdsbUlDaGhjbWQxYldWdWRITXViR1Z1WjNSb0lEMDlQU0F5S1NCN1hHNWNkRngwWEhSY2RIWmhiSFZsSUQwZ1lYSm5kVzFsYm5Seld6RmRPMXh1WEhSY2RGeDBmU0JsYkhObElIdGNibHgwWEhSY2RGeDBkMmhwYkdVZ0tHc2dQQ0JzWlc0Z0ppWWdJU2hySUdsdUlIUXBLU0I3WEc1Y2RGeDBYSFJjZEZ4MGF5c3JPMXh1WEhSY2RGeDBYSFI5WEc1Y2RGeDBYSFJjZEdsbUlDaHJJRDQ5SUd4bGJpa2dlMXh1WEhSY2RGeDBYSFJjZEhSb2NtOTNJRzVsZHlCVWVYQmxSWEp5YjNJb0oxSmxaSFZqWlNCdlppQmxiWEIwZVNCaGNuSmhlU0IzYVhSb0lHNXZJR2x1YVhScFlXd2dkbUZzZFdVbktUdGNibHgwWEhSY2RGeDBmVnh1WEhSY2RGeDBYSFIyWVd4MVpTQTlJSFJiYXlzclhUdGNibHgwWEhSY2RIMWNibHgwWEhSY2RHWnZjaUFvT3lCcklEd2diR1Z1T3lCckt5c3BJSHRjYmx4MFhIUmNkRngwYVdZZ0tHc2dhVzRnZENrZ2UxeHVYSFJjZEZ4MFhIUmNkSFpoYkhWbElEMGdZMkZzYkdKaFkyc29kbUZzZFdVc0lIUmJhMTBzSUdzc0lIUXBPMXh1WEhSY2RGeDBYSFI5WEc1Y2RGeDBYSFI5WEc1Y2RGeDBYSFJ5WlhSMWNtNGdkbUZzZFdVN1hHNWNkRngwZlR0Y2JseDBmVnh1WEc1Y2RHbG1JQ2duWm5WdVkzUnBiMjRuSUNFOVBTQjBlWEJsYjJZZ1FYSnlZWGt1Y0hKdmRHOTBlWEJsTG1acGJIUmxjaWtnZTF4dVhIUmNkQzhxS2x4dVhIUmNkQ0FxSUVGeWNtRjVMbkJ5YjNSdmRIbHdaUzVtYVd4MFpYSWdjRzlzZVdacGJHeGNibHgwWEhRZ0tseHVYSFJjZENBcUlFQndZWEpoYlNCN1JuVnVZM1JwYjI1OUlHWjFibU5jYmx4MFhIUWdLaUJBY21WMGRYSnVJSHRCY25KaGVYMWNibHgwWEhRZ0tseHVYSFJjZENBcUlFQnpaV1VnYUhSMGNEb3ZMMmR2Ynk1bmJDOVVNVXRHYm5GY2JseDBYSFFnS2k5Y2JseDBYSFJCY25KaGVTNXdjbTkwYjNSNWNHVXVabWxzZEdWeUlEMGdablZ1WTNScGIyNGdLR1oxYm1NcElIdGNibHgwWEhSY2RIWmhjaUIwSUQwZ1QySnFaV04wS0hSb2FYTXBMQ0JzWlc0Z1BTQjBMbXhsYm1kMGFDQStQajRnTUR0Y2JseHVYSFJjZEZ4MGRtRnlJSEpsY3lBOUlGdGRPMXh1WEhSY2RGeDBkbUZ5SUhSb2FYTkJjbWNnUFNCaGNtZDFiV1Z1ZEhNdWJHVnVaM1JvSUQ0OUlESWdQeUJoY21kMWJXVnVkSE5iTVYwZ09pQjJiMmxrSURBN1hHNWNkRngwWEhSbWIzSWdLSFpoY2lCcElEMGdNRHNnYVNBOElHeGxianNnYVNzcktTQjdYRzVjZEZ4MFhIUmNkR2xtSUNocElHbHVJSFFwSUh0Y2JseDBYSFJjZEZ4MFhIUjJZWElnZG1Gc0lEMGdkRnRwWFR0Y2JseDBYSFJjZEZ4MFhIUnBaaUFvWm5WdVl5NWpZV3hzS0hSb2FYTkJjbWNzSUhaaGJDd2dhU3dnZENrcElIdGNibHgwWEhSY2RGeDBYSFJjZEhKbGN5NXdkWE5vS0haaGJDazdYRzVjZEZ4MFhIUmNkRngwZlZ4dVhIUmNkRngwWEhSOVhHNWNkRngwWEhSOVhHNWNibHgwWEhSY2RISmxkSFZ5YmlCeVpYTTdYRzVjZEZ4MGZUdGNibHgwZlZ4dVhHNWNkSFpoY2lCcGMxTjFjSEJ2Y25SQmJXUWdQU0IwZVhCbGIyWWdaR1ZtYVc1bElEMDlQU0FuWm5WdVkzUnBiMjRuSUNZbUlHUmxabWx1WlM1aGJXUTdYRzVjYmx4MEx5b3FYRzVjZENBcUlISmxkSFZ5Ym5NZ2QyaGxkR2hsY2lCbWIyNTBJR2x6SUdsdWMzUmhiR3hsWkNCdmNpQnViM1F1WEc1Y2RDQXFYRzVjZENBcUlFQndZWEpoYlNCN1UzUnlhVzVuZlNCbWIyNTBUbUZ0WlZ4dVhIUWdLaUJBY21WMGRYSnVJSHRDYjI5c1pXRnVmVnh1WEhRZ0tpOWNibHgwZG1GeUlHbHpSbTl1ZEVsdWMzUmhiR3hsWkNBOUlHWjFibU4wYVc5dUlDaG1iMjUwVG1GdFpTa2dlMXh1WEhSY2RIWmhjaUIwWlhOMFJtOXVkRTVoYldVZ1BTQm1iMjUwVG1GdFpTQTlQVDBnSjBOdmJXbGpJRk5oYm5NZ1RWTW5JRDhnSjBOdmRYSnBaWElnVG1WM0p5QTZJQ2REYjIxcFl5QlRZVzV6SUUxVEp6dGNibHgwWEhSMllYSWdKSFJsYzNSbGNpQTlJQ1FvSnp4a2FYWStKeWt1WTNOektIdGNibHgwWEhSY2RIQnZjMmwwYVc5dU9pQW5ZV0p6YjJ4MWRHVW5MRnh1WEhSY2RGeDBiR1ZtZERvZ0p5MDVPVGs1Y0hnbkxGeHVYSFJjZEZ4MGRHOXdPaUFuTFRrNU9UbHdlQ2NzWEc1Y2RGeDBYSFJtYjI1MFUybDZaVG9nSnpJd01IQjRKMXh1WEhSY2RIMHBMblJsZUhRb0oyMXRiVzF0YlcxdGJYZDNkM2QzZDNjbktTNWhjSEJsYm1SVWJ5aGtiMk4xYldWdWRDNWliMlI1S1R0Y2JseHVYSFJjZEhaaGNpQnZjbWxuYVc1aGJGZHBaSFJvSUQwZ0pIUmxjM1JsY2k1amMzTW9KMlp2Ym5SR1lXMXBiSGtuTENCMFpYTjBSbTl1ZEU1aGJXVXBMbmRwWkhSb0tDazdYRzVjZEZ4MGRtRnlJSGRwWkhSb0lEMGdKSFJsYzNSbGNpNWpjM01vSjJadmJuUkdZVzFwYkhrbkxDQm1iMjUwVG1GdFpTQXJJQ2NzSnlBcklIUmxjM1JHYjI1MFRtRnRaU2t1ZDJsa2RHZ29LVHRjYmx4dVhIUmNkQ1IwWlhOMFpYSXVjbVZ0YjNabEtDazdYRzVjYmx4MFhIUnlaWFIxY200Z2IzSnBaMmx1WVd4WGFXUjBhQ0FoUFQwZ2QybGtkR2c3WEc1Y2RIMDdYRzVjYmx4MEx5b3FYRzVjZENBcUlFQmpiR0Z6Y3lCamIzSmxMbUZuWlc1MFhHNWNkQ0FxWEc1Y2RDQXFJRTlpYW1WamRDQjNhR2xqYUNCamFHVmpheUJ3YkdGMFptOXliU0JoYm1RZ1lXZGxiblJjYmx4MElDcGNibHgwSUNvZ1FITnBibWRzWlhSdmJseHVYSFFnS2lCQVlXeDBaWEp1WVhSbFEyeGhjM05PWVcxbElHRm5aVzUwWEc1Y2RDQXFMMXh1WEhSMllYSWdZV2RsYm5RZ1BTQjdYRzVjZEZ4MEx5b3FJRUJ3Y205d1pYSjBlU0I3UW05dmJHVmhibjBnVzJselRXRmpQV1poYkhObFhTQjBjblZsSUdsbUlIUm9hWE1nWVdkbGJuUWdhWE1nVFdGaklDQXFMMXh1WEhSY2RHbHpUV0ZqT2lCdVlYWnBaMkYwYjNJdVlYQndWbVZ5YzJsdmJpNXBibVJsZUU5bUtDZE5ZV01uS1NBK0lDMHhMRnh1WEhSY2RDOHFLaUJBY0hKdmNHVnlkSGtnZTBKdmIyeGxZVzU5SUZ0cGMwMVRTVVU5Wm1Gc2MyVmRJSFJ5ZFdVZ2FXWWdkR2hwY3lCaFoyVnVkQ0JwY3lCaElFbHVkR1Z5Ym1WMElFVjRjR3h2Y21WeUlDQXFMMXh1WEhSY2RHbHpUVk5KUlRvZ2JtRjJhV2RoZEc5eUxuVnpaWEpCWjJWdWRDNXBibVJsZUU5bUtDZE5VMGxGSnlrZ1BpQXRNU0I4ZkNCdVlYWnBaMkYwYjNJdWRYTmxja0ZuWlc1MExtbHVaR1Y0VDJZb0oxUnlhV1JsYm5RbktTQStJQzB4TEZ4dVhIUmNkQzhxS2lCQWNISnZjR1Z5ZEhrZ2UwSnZiMnhsWVc1OUlGdHBjMFpHUFdaaGJITmxYU0IwY25WbElHbG1JSFJvYVhNZ1lXZGxiblFnYVhNZ1lTQkdhWEpsWm05NElDQXFMMXh1WEhSY2RHbHpSa1k2SUc1aGRtbG5ZWFJ2Y2k1MWMyVnlRV2RsYm5RdWFXNWtaWGhQWmlnblJtbHlaV1p2ZUNjcElENGdMVEVzWEc1Y2RGeDBMeW9xSUVCd2NtOXdaWEowZVNCN1UzUnlhVzVuZlNCcWNYVmxjbmxXWlhKemFXOXVJR04xY25KbGJuUWdhbEYxWlhKNUlIWmxjbk5wYjI0Z2MzUnlhVzVuSUNBcUwxeHVYSFJjZEdweGRXVnllVlpsY25OcGIyNDZJSEJoY25ObFJteHZZWFFvSkM1bWJpNXFjWFZsY25rcExGeHVYSFJjZEdselUzVndjRzl5ZEVGdFpEb2dhWE5UZFhCd2IzSjBRVzFrTEZ4dVhIUmNkR2hoYzBOdlpHVk5hWEp5YjNJNklHbHpVM1Z3Y0c5eWRFRnRaQ0EvSUhKbGNYVnBjbVV1YzNCbFkybG1hV1ZrS0NkRGIyUmxUV2x5Y205eUp5a2dPaUFoSVhkcGJtUnZkeTVEYjJSbFRXbHljbTl5TEZ4dVhIUmNkR2x6Um05dWRFbHVjM1JoYkd4bFpEb2dhWE5HYjI1MFNXNXpkR0ZzYkdWa0xGeHVYSFJjZEdselZ6TkRVbUZ1WjJWVGRYQndiM0owT2lBaElXUnZZM1Z0Wlc1MExtTnlaV0YwWlZKaGJtZGxYRzVjZEgwN1hHNWNibHgwTHlvcVhHNWNkQ0FxSUVCamJHRnpjeUJqYjNKbExtWjFibU5jYmx4MElDcGNibHgwSUNvZ1puVnVZeUIxZEdsc2N5QW9abTl5SUdocFoyZ3RiM0prWlhJZ1puVnVZeWR6SUdGeVp5bGNibHgwSUNwY2JseDBJQ29nUUhOcGJtZHNaWFJ2Ymx4dVhIUWdLaUJBWVd4MFpYSnVZWFJsUTJ4aGMzTk9ZVzFsSUdaMWJtTmNibHgwSUNvdlhHNWNkSFpoY2lCbWRXNWpJRDBnS0daMWJtTjBhVzl1SUNncElIdGNibHgwWEhSMllYSWdaWEVnUFNCbWRXNWpkR2x2YmlBb2FYUmxiVUVwSUh0Y2JseDBYSFJjZEhKbGRIVnliaUJtZFc1amRHbHZiaUFvYVhSbGJVSXBJSHRjYmx4MFhIUmNkRngwY21WMGRYSnVJR2wwWlcxQklEMDlQU0JwZEdWdFFqdGNibHgwWEhSY2RIMDdYRzVjZEZ4MGZUdGNibHh1WEhSY2RIWmhjaUJsY1RJZ1BTQm1kVzVqZEdsdmJpQW9hWFJsYlVFc0lHbDBaVzFDS1NCN1hHNWNkRngwWEhSeVpYUjFjbTRnYVhSbGJVRWdQVDA5SUdsMFpXMUNPMXh1WEhSY2RIMDdYRzVjYmx4MFhIUjJZWElnY0dWeE1pQTlJR1oxYm1OMGFXOXVJQ2h3Y205d1RtRnRaU2tnZTF4dVhIUmNkRngwY21WMGRYSnVJR1oxYm1OMGFXOXVJQ2hwZEdWdFFTd2dhWFJsYlVJcElIdGNibHgwWEhSY2RGeDBjbVYwZFhKdUlHbDBaVzFCVzNCeWIzQk9ZVzFsWFNBOVBUMGdhWFJsYlVKYmNISnZjRTVoYldWZE8xeHVYSFJjZEZ4MGZUdGNibHgwWEhSOU8xeHVYRzVjZEZ4MGRtRnlJRzlySUQwZ1puVnVZM1JwYjI0Z0tDa2dlMXh1WEhSY2RGeDBjbVYwZFhKdUlIUnlkV1U3WEc1Y2RGeDBmVHRjYmx4dVhIUmNkSFpoY2lCbVlXbHNJRDBnWm5WdVkzUnBiMjRnS0NrZ2UxeHVYSFJjZEZ4MGNtVjBkWEp1SUdaaGJITmxPMXh1WEhSY2RIMDdYRzVjYmx4MFhIUjJZWElnYm05MElEMGdablZ1WTNScGIyNGdLR1lwSUh0Y2JseDBYSFJjZEhKbGRIVnliaUJtZFc1amRHbHZiaUFvS1NCN1hHNWNkRngwWEhSY2RISmxkSFZ5YmlBaFppNWhjSEJzZVNobUxDQmhjbWQxYldWdWRITXBPMXh1WEhSY2RGeDBmVHRjYmx4MFhIUjlPMXh1WEc1Y2RGeDBkbUZ5SUdGdVpDQTlJR1oxYm1OMGFXOXVJQ2htUVN3Z1prSXBJSHRjYmx4MFhIUmNkSEpsZEhWeWJpQm1kVzVqZEdsdmJpQW9hWFJsYlNrZ2UxeHVYSFJjZEZ4MFhIUnlaWFIxY200Z1prRW9hWFJsYlNrZ0ppWWdaa0lvYVhSbGJTazdYRzVjZEZ4MFhIUjlPMXh1WEhSY2RIMDdYRzVjYmx4MFhIUjJZWElnYzJWc1ppQTlJR1oxYm1OMGFXOXVJQ2hoS1NCN1hHNWNkRngwWEhSeVpYUjFjbTRnWVR0Y2JseDBYSFI5TzF4dVhHNWNkRngwZG1GeUlHbGtRMjkxYm5SbGNpQTlJREE3WEc1Y2JseDBYSFF2S2lwY2JseDBYSFFnS2lCblpXNWxjbUYwWlNCaElHZHNiMkpoYkd4NUxYVnVhWEYxWlNCcFpGeHVYSFJjZENBcVhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0VGRISnBibWQ5SUZ0d2NtVm1hWGhkWEc1Y2RGeDBJQ292WEc1Y2RGeDBkbUZ5SUhWdWFYRjFaVWxrSUQwZ1puVnVZM1JwYjI0Z0tIQnlaV1pwZUNrZ2UxeHVYSFJjZEZ4MGRtRnlJR2xrSUQwZ0t5dHBaRU52ZFc1MFpYSWdLeUFuSnp0Y2JseDBYSFJjZEhKbGRIVnliaUJ3Y21WbWFYZ2dQeUJ3Y21WbWFYZ2dLeUJwWkNBNklHbGtPMXh1WEhSY2RIMDdYRzVjYmx4MFhIUXZLaXBjYmx4MFhIUWdLaUJ5WlhSMWNtNXpJR0p1WkNBb1ltOTFibVJ6S1NCbWNtOXRJSEpsWTNSY2JseDBYSFFnS2x4dVhIUmNkQ0FxSUMwZ1NVVWdRMjl0Y0dGMFlXSnBiR2wwZVNCSmMzTjFaVG9nYUhSMGNEb3ZMMmR2Ynk1bmJDOXpVa3hQUVc5Y2JseDBYSFFnS2lBdElGTmpjbTlzYkNCSmMzTjFaVG9nYUhSMGNEb3ZMMmR2Ynk1bmJDOXpUbXBWWTF4dVhIUmNkQ0FxWEc1Y2RGeDBJQ29nUUhCaGNtRnRJSHRTWldOMGZTQnlaV04wWEc1Y2RGeDBJQ29nUUhKbGRIVnliaUI3VDJKcVpXTjBmU0JpYjNWdVpITmNibHgwWEhRZ0tpQkFjbVYwZFhKdUlIdE9kVzFpWlhKOUlHSnZkVzVrY3k1MGIzQmNibHgwWEhRZ0tpQkFjbVYwZFhKdUlIdE9kVzFpWlhKOUlHSnZkVzVrY3k1c1pXWjBYRzVjZEZ4MElDb2dRSEpsZEhWeWJpQjdUblZ0WW1WeWZTQmliM1Z1WkhNdWQybGtkR2hjYmx4MFhIUWdLaUJBY21WMGRYSnVJSHRPZFcxaVpYSjlJR0p2ZFc1a2N5NW9aV2xuYUhSY2JseDBYSFFnS2k5Y2JseDBYSFIyWVhJZ2NtVmpkREppYm1RZ1BTQm1kVzVqZEdsdmJpQW9jbVZqZENrZ2UxeHVYSFJjZEZ4MGRtRnlJQ1JrYjJOMWJXVnVkQ0E5SUNRb1pHOWpkVzFsYm5RcE8xeHVYSFJjZEZ4MGNtVjBkWEp1SUh0Y2JseDBYSFJjZEZ4MGRHOXdPaUJ5WldOMExuUnZjQ0FySUNSa2IyTjFiV1Z1ZEM1elkzSnZiR3hVYjNBb0tTeGNibHgwWEhSY2RGeDBiR1ZtZERvZ2NtVmpkQzVzWldaMElDc2dKR1J2WTNWdFpXNTBMbk5qY205c2JFeGxablFvS1N4Y2JseDBYSFJjZEZ4MGQybGtkR2c2SUhKbFkzUXVjbWxuYUhRZ0xTQnlaV04wTG14bFpuUXNYRzVjZEZ4MFhIUmNkR2hsYVdkb2REb2djbVZqZEM1aWIzUjBiMjBnTFNCeVpXTjBMblJ2Y0Z4dVhIUmNkRngwZlR0Y2JseDBYSFI5TzF4dVhHNWNkRngwTHlvcVhHNWNkRngwSUNvZ2NtVjBkWEp1Y3lCaElHTnZjSGtnYjJZZ2RHaGxJRzlpYW1WamRDQjNhR1Z5WlNCMGFHVWdhMlY1Y3lCb1lYWmxJR0psWTI5dFpTQjBhR1VnZG1Gc2RXVnpJR0Z1WkNCMGFHVWdkbUZzZFdWeklIUm9aU0JyWlhsekxseHVYSFJjZENBcUlFQndZWEpoYlNCN1QySnFaV04wZlNCdlltcGNibHgwWEhRZ0tpQkFjbVYwZFhKdUlIdFBZbXBsWTNSOVhHNWNkRngwSUNvdlhHNWNkRngwZG1GeUlHbHVkbVZ5ZEU5aWFtVmpkQ0E5SUdaMWJtTjBhVzl1SUNodlltb3BJSHRjYmx4MFhIUmNkSFpoY2lCcGJuWmxjblJsWkNBOUlIdDlPMXh1WEhSY2RGeDBabTl5SUNoMllYSWdhMlY1SUdsdUlHOWlhaWtnZTF4dVhIUmNkRngwWEhScFppQW9iMkpxTG1oaGMwOTNibEJ5YjNCbGNuUjVLR3RsZVNrcElIdGNibHgwWEhSY2RGeDBYSFJwYm5abGNuUmxaRnR2WW1wYmEyVjVYVjBnUFNCclpYazdYRzVjZEZ4MFhIUmNkSDFjYmx4MFhIUmNkSDFjYmx4MFhIUmNkSEpsZEhWeWJpQnBiblpsY25SbFpEdGNibHgwWEhSOU8xeHVYRzVjZEZ4MGNtVjBkWEp1SUh0Y2JseDBYSFJjZEdWeE9pQmxjU3hjYmx4MFhIUmNkR1Z4TWpvZ1pYRXlMRnh1WEhSY2RGeDBjR1Z4TWpvZ2NHVnhNaXhjYmx4MFhIUmNkRzlyT2lCdmF5eGNibHgwWEhSY2RHWmhhV3c2SUdaaGFXd3NYRzVjZEZ4MFhIUnpaV3htT2lCelpXeG1MRnh1WEhSY2RGeDBibTkwT2lCdWIzUXNYRzVjZEZ4MFhIUmhibVE2SUdGdVpDeGNibHgwWEhSY2RIVnVhWEYxWlVsa09pQjFibWx4ZFdWSlpDeGNibHgwWEhSY2RISmxZM1F5WW01a09pQnlaV04wTW1KdVpDeGNibHgwWEhSY2RHbHVkbVZ5ZEU5aWFtVmpkRG9nYVc1MlpYSjBUMkpxWldOMFhHNWNkRngwZlR0Y2JseDBmU2tvS1R0Y2JseHVYSFF2S2lwY2JseDBJQ29nUUdOc1lYTnpJR052Y21VdWJHbHpkRnh1WEhRZ0tseHVYSFFnS2lCc2FYTjBJSFYwYVd4elhHNWNkQ0FxWEc1Y2RDQXFJRUJ6YVc1bmJHVjBiMjVjYmx4MElDb2dRR0ZzZEdWeWJtRjBaVU5zWVhOelRtRnRaU0JzYVhOMFhHNWNkQ0FxTDF4dVhIUjJZWElnYkdsemRDQTlJQ2htZFc1amRHbHZiaUFvS1NCN1hHNWNkRngwTHlvcVhHNWNkRngwSUNvZ2NtVjBkWEp1Y3lCMGFHVWdabWx5YzNRZ2FYUmxiU0J2WmlCaGJpQmhjbkpoZVM1Y2JseDBYSFFnS2x4dVhIUmNkQ0FxSUVCd1lYSmhiU0I3UVhKeVlYbDlJR0Z5Y21GNVhHNWNkRngwSUNvdlhHNWNkRngwZG1GeUlHaGxZV1FnUFNCbWRXNWpkR2x2YmlBb1lYSnlZWGtwSUh0Y2JseDBYSFJjZEhKbGRIVnliaUJoY25KaGVWc3dYVHRjYmx4MFhIUjlPMXh1WEc1Y2RGeDBMeW9xWEc1Y2RGeDBJQ29nY21WMGRYSnVjeUIwYUdVZ2JHRnpkQ0JwZEdWdElHOW1JR0Z1SUdGeWNtRjVMbHh1WEhSY2RDQXFYRzVjZEZ4MElDb2dRSEJoY21GdElIdEJjbkpoZVgwZ1lYSnlZWGxjYmx4MFhIUWdLaTljYmx4MFhIUjJZWElnYkdGemRDQTlJR1oxYm1OMGFXOXVJQ2hoY25KaGVTa2dlMXh1WEhSY2RGeDBjbVYwZFhKdUlHRnljbUY1VzJGeWNtRjVMbXhsYm1kMGFDQXRJREZkTzF4dVhIUmNkSDA3WEc1Y2JseDBYSFF2S2lwY2JseDBYSFFnS2lCeVpYUjFjbTV6SUdWMlpYSjVkR2hwYm1jZ1luVjBJSFJvWlNCc1lYTjBJR1Z1ZEhKNUlHOW1JSFJvWlNCaGNuSmhlUzVjYmx4MFhIUWdLbHh1WEhSY2RDQXFJRUJ3WVhKaGJTQjdRWEp5WVhsOUlHRnljbUY1WEc1Y2RGeDBJQ292WEc1Y2RGeDBkbUZ5SUdsdWFYUnBZV3dnUFNCbWRXNWpkR2x2YmlBb1lYSnlZWGtwSUh0Y2JseDBYSFJjZEhKbGRIVnliaUJoY25KaGVTNXpiR2xqWlNnd0xDQmhjbkpoZVM1c1pXNW5kR2dnTFNBeEtUdGNibHgwWEhSOU8xeHVYRzVjZEZ4MEx5b3FYRzVjZEZ4MElDb2djbVYwZFhKdWN5QjBhR1VnY21WemRDQnZaaUIwYUdVZ2FYUmxiWE1nYVc0Z1lXNGdZWEp5WVhrdVhHNWNkRngwSUNwY2JseDBYSFFnS2lCQWNHRnlZVzBnZTBGeWNtRjVmU0JoY25KaGVWeHVYSFJjZENBcUwxeHVYSFJjZEhaaGNpQjBZV2xzSUQwZ1puVnVZM1JwYjI0Z0tHRnljbUY1S1NCN1hHNWNkRngwWEhSeVpYUjFjbTRnWVhKeVlYa3VjMnhwWTJVb01TazdYRzVjZEZ4MGZUdGNibHh1WEhSY2RDOHFLbHh1WEhSY2RDQXFJSEpsZEhWeWJuTWdhWFJsYlNCdlppQmhjbkpoZVZ4dVhIUmNkQ0FxTDF4dVhIUmNkSFpoY2lCbWFXNWtJRDBnWm5WdVkzUnBiMjRnS0dGeWNtRjVMQ0J3Y21Wa0tTQjdYRzVjZEZ4MFhIUm1iM0lnS0haaGNpQnBaSGdnUFNBd0xDQnNaVzRnUFNCaGNuSmhlUzVzWlc1bmRHZzdJR2xrZUNBOElHeGxianNnYVdSNEt5c3BJSHRjYmx4MFhIUmNkRngwZG1GeUlHbDBaVzBnUFNCaGNuSmhlVnRwWkhoZE8xeHVYSFJjZEZ4MFhIUnBaaUFvY0hKbFpDaHBkR1Z0S1NrZ2UxeHVYSFJjZEZ4MFhIUmNkSEpsZEhWeWJpQnBkR1Z0TzF4dVhIUmNkRngwWEhSOVhHNWNkRngwWEhSOVhHNWNkRngwZlR0Y2JseHVYSFJjZEM4cUtseHVYSFJjZENBcUlISmxkSFZ5Ym5NZ2RISjFaU0JwWmlCaGJHd2diMllnZEdobElIWmhiSFZsY3lCcGJpQjBhR1VnWVhKeVlYa2djR0Z6Y3lCMGFHVWdjSEpsWkdsallYUmxJSFJ5ZFhSb0lIUmxjM1F1WEc1Y2RGeDBJQ292WEc1Y2RGeDBkbUZ5SUdGc2JDQTlJR1oxYm1OMGFXOXVJQ2hoY25KaGVTd2djSEpsWkNrZ2UxeHVYSFJjZEZ4MFptOXlJQ2gyWVhJZ2FXUjRJRDBnTUN3Z2JHVnVJRDBnWVhKeVlYa3ViR1Z1WjNSb095QnBaSGdnUENCc1pXNDdJR2xrZUNzcktTQjdYRzVjZEZ4MFhIUmNkR2xtSUNnaGNISmxaQ2hoY25KaGVWdHBaSGhkS1NrZ2UxeHVYSFJjZEZ4MFhIUmNkSEpsZEhWeWJpQm1ZV3h6WlR0Y2JseDBYSFJjZEZ4MGZWeHVYSFJjZEZ4MGZWeHVYSFJjZEZ4MGNtVjBkWEp1SUhSeWRXVTdYRzVjZEZ4MGZUdGNibHh1WEhSY2RDOHFLbHh1WEhSY2RDQXFJSEpsZEhWeWJuTWdkSEoxWlNCcFppQjBhR1VnZG1Gc2RXVWdhWE1nY0hKbGMyVnVkQ0JwYmlCMGFHVWdiR2x6ZEM1Y2JseDBYSFFnS2k5Y2JseDBYSFIyWVhJZ1kyOXVkR0ZwYm5NZ1BTQm1kVzVqZEdsdmJpQW9ZWEp5WVhrc0lHbDBaVzBwSUh0Y2JseDBYSFJjZEhKbGRIVnliaUFrTG1sdVFYSnlZWGtvYVhSbGJTd2dZWEp5WVhrcElDRTlQU0F0TVR0Y2JseDBYSFI5TzF4dVhHNWNkRngwTHlvcVhHNWNkRngwSUNvZ1oyVjBJSE4xYlNCbWNtOXRJR0VnYkdsemRGeHVYSFJjZENBcVhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0QmNuSmhlWDBnWVhKeVlYa2dMU0JoY25KaGVWeHVYSFJjZENBcUlFQndZWEpoYlNCN1JuVnVZM1JwYjI1OUlHWnVJQzBnYVhSbGNtRjBiM0pjYmx4MFhIUWdLaTljYmx4MFhIUjJZWElnYzNWdElEMGdablZ1WTNScGIyNGdLR0Z5Y21GNUxDQm1iaWtnZTF4dVhIUmNkRngwWm00Z1BTQm1iaUI4ZkNCbWRXNWpMbk5sYkdZN1hHNWNkRngwWEhSeVpYUjFjbTRnWVhKeVlYa3VjbVZrZFdObEtHWjFibU4wYVc5dUlDaHRaVzF2TENCMktTQjdYRzVjZEZ4MFhIUmNkSEpsZEhWeWJpQnRaVzF2SUNzZ1ptNG9kaWs3WEc1Y2RGeDBYSFI5TENBd0tUdGNibHgwWEhSOU8xeHVYRzVjZEZ4MEx5b3FYRzVjZEZ4MElDb2djbVYwZFhKdWN5QmhJR052Y0hrZ2IyWWdkR2hsSUdOdmJHeGxZM1JwYjI0Z2QybDBhQ0JoY25KaGVTQjBlWEJsTGx4dVhIUmNkQ0FxSUVCd1lYSmhiU0I3UTI5c2JHVmpkR2x2Ym4wZ1kyOXNiR1ZqZEdsdmJpQXRJR052Ykd4bFkzUnBiMjRnWldjcElHNXZaR1V1WTJocGJHUk9iMlJsY3l3Z0xpNHVYRzVjZEZ4MElDb3ZYRzVjZEZ4MGRtRnlJR1p5YjIwZ1BTQm1kVzVqZEdsdmJpQW9ZMjlzYkdWamRHbHZiaWtnZTF4dVhIUmNkRngwZG1GeUlISmxjM1ZzZENBOUlGdGRMQ0JwWkhnZ1BTQXRNU3dnYkdWdVozUm9JRDBnWTI5c2JHVmpkR2x2Ymk1c1pXNW5kR2c3WEc1Y2RGeDBYSFIzYUdsc1pTQW9LeXRwWkhnZ1BDQnNaVzVuZEdncElIdGNibHgwWEhSY2RGeDBjbVZ6ZFd4MFcybGtlRjBnUFNCamIyeHNaV04wYVc5dVcybGtlRjA3WEc1Y2RGeDBYSFI5WEc1Y2RGeDBYSFJ5WlhSMWNtNGdjbVZ6ZFd4ME8xeHVYSFJjZEgwN1hHNWNibHgwWEhRdktpcGNibHgwWEhRZ0tpQmpiSFZ6ZEdWeUlHVnNaVzFsYm5SeklHSjVJSEJ5WldScFkyRjBaU0JtZFc1amRHbHZiaTVjYmx4MFhIUWdLbHh1WEhSY2RDQXFJRUJ3WVhKaGJTQjdRWEp5WVhsOUlHRnljbUY1SUMwZ1lYSnlZWGxjYmx4MFhIUWdLaUJBY0dGeVlXMGdlMFoxYm1OMGFXOXVmU0JtYmlBdElIQnlaV1JwWTJGMFpTQm1kVzVqZEdsdmJpQm1iM0lnWTJ4MWMzUmxjaUJ5ZFd4bFhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0QmNuSmhlVnRkZlZ4dVhIUmNkQ0FxTDF4dVhIUmNkSFpoY2lCamJIVnpkR1Z5UW5rZ1BTQm1kVzVqZEdsdmJpQW9ZWEp5WVhrc0lHWnVLU0I3WEc1Y2RGeDBYSFJwWmlBb0lXRnljbUY1TG14bGJtZDBhQ2tnZXlCeVpYUjFjbTRnVzEwN0lIMWNibHgwWEhSY2RIWmhjaUJoVkdGcGJDQTlJSFJoYVd3b1lYSnlZWGtwTzF4dVhIUmNkRngwY21WMGRYSnVJR0ZVWVdsc0xuSmxaSFZqWlNobWRXNWpkR2x2YmlBb2JXVnRieXdnZGlrZ2UxeHVYSFJjZEZ4MFhIUjJZWElnWVV4aGMzUWdQU0JzWVhOMEtHMWxiVzhwTzF4dVhIUmNkRngwWEhScFppQW9abTRvYkdGemRDaGhUR0Z6ZENrc0lIWXBLU0I3WEc1Y2RGeDBYSFJjZEZ4MFlVeGhjM1JiWVV4aGMzUXViR1Z1WjNSb1hTQTlJSFk3WEc1Y2RGeDBYSFJjZEgwZ1pXeHpaU0I3WEc1Y2RGeDBYSFJjZEZ4MGJXVnRiMXR0WlcxdkxteGxibWQwYUYwZ1BTQmJkbDA3WEc1Y2RGeDBYSFJjZEgxY2JseDBYSFJjZEZ4MGNtVjBkWEp1SUcxbGJXODdYRzVjZEZ4MFhIUjlMQ0JiVzJobFlXUW9ZWEp5WVhrcFhWMHBPMXh1WEhSY2RIMDdYRzVjYmx4MFhIUXZLaXBjYmx4MFhIUWdLaUJ5WlhSMWNtNXpJR0VnWTI5d2VTQnZaaUIwYUdVZ1lYSnlZWGtnZDJsMGFDQmhiR3dnWm1Gc2Mza2dkbUZzZFdWeklISmxiVzkyWldSY2JseDBYSFFnS2x4dVhIUmNkQ0FxSUVCd1lYSmhiU0I3UVhKeVlYbDlJR0Z5Y21GNUlDMGdZWEp5WVhsY2JseDBYSFFnS2lCQWNHRnlZVzBnZTBaMWJtTjBhVzl1ZlNCbWJpQXRJSEJ5WldScFkyRjBaU0JtZFc1amRHbHZiaUJtYjNJZ1kyeDFjM1JsY2lCeWRXeGxYRzVjZEZ4MElDb3ZYRzVjZEZ4MGRtRnlJR052YlhCaFkzUWdQU0JtZFc1amRHbHZiaUFvWVhKeVlYa3BJSHRjYmx4MFhIUmNkSFpoY2lCaFVtVnpkV3gwSUQwZ1cxMDdYRzVjZEZ4MFhIUm1iM0lnS0haaGNpQnBaSGdnUFNBd0xDQnNaVzRnUFNCaGNuSmhlUzVzWlc1bmRHZzdJR2xrZUNBOElHeGxianNnYVdSNEt5c3BJSHRjYmx4MFhIUmNkRngwYVdZZ0tHRnljbUY1VzJsa2VGMHBJSHNnWVZKbGMzVnNkQzV3ZFhOb0tHRnljbUY1VzJsa2VGMHBPeUI5WEc1Y2RGeDBYSFI5WEc1Y2RGeDBYSFJ5WlhSMWNtNGdZVkpsYzNWc2REdGNibHgwWEhSOU8xeHVYRzVjZEZ4MEx5b3FYRzVjZEZ4MElDb2djSEp2WkhWalpYTWdZU0JrZFhCc2FXTmhkR1V0Wm5KbFpTQjJaWEp6YVc5dUlHOW1JSFJvWlNCaGNuSmhlVnh1WEhSY2RDQXFYRzVjZEZ4MElDb2dRSEJoY21GdElIdEJjbkpoZVgwZ1lYSnlZWGxjYmx4MFhIUWdLaTljYmx4MFhIUjJZWElnZFc1cGNYVmxJRDBnWm5WdVkzUnBiMjRnS0dGeWNtRjVLU0I3WEc1Y2RGeDBYSFIyWVhJZ2NtVnpkV3gwY3lBOUlGdGRPMXh1WEc1Y2RGeDBYSFJtYjNJZ0tIWmhjaUJwWkhnZ1BTQXdMQ0JzWlc0Z1BTQmhjbkpoZVM1c1pXNW5kR2c3SUdsa2VDQThJR3hsYmpzZ2FXUjRLeXNwSUh0Y2JseDBYSFJjZEZ4MGFXWWdLQ0ZqYjI1MFlXbHVjeWh5WlhOMWJIUnpMQ0JoY25KaGVWdHBaSGhkS1NrZ2UxeHVYSFJjZEZ4MFhIUmNkSEpsYzNWc2RITXVjSFZ6YUNoaGNuSmhlVnRwWkhoZEtUdGNibHgwWEhSY2RGeDBmVnh1WEhSY2RGeDBmVnh1WEc1Y2RGeDBYSFJ5WlhSMWNtNGdjbVZ6ZFd4MGN6dGNibHgwWEhSOU8xeHVYRzVjZEZ4MEx5b3FYRzVjZEZ4MElDb2djbVYwZFhKdWN5QnVaWGgwSUdsMFpXMHVYRzVjZEZ4MElDb2dRSEJoY21GdElIdEJjbkpoZVgwZ1lYSnlZWGxjYmx4MFhIUWdLaTljYmx4MFhIUjJZWElnYm1WNGRDQTlJR1oxYm1OMGFXOXVJQ2hoY25KaGVTd2dhWFJsYlNrZ2UxeHVYSFJjZEZ4MGRtRnlJR2xrZUNBOUlHRnljbUY1TG1sdVpHVjRUMllvYVhSbGJTazdYRzVjZEZ4MFhIUnBaaUFvYVdSNElEMDlQU0F0TVNrZ2V5QnlaWFIxY200Z2JuVnNiRHNnZlZ4dVhHNWNkRngwWEhSeVpYUjFjbTRnWVhKeVlYbGJhV1I0SUNzZ01WMDdYRzVjZEZ4MGZUdGNibHh1WEhSY2RDOHFLbHh1WEhSY2RDQXFJSEpsZEhWeWJuTWdjSEpsZGlCcGRHVnRMbHh1WEhSY2RDQXFJRUJ3WVhKaGJTQjdRWEp5WVhsOUlHRnljbUY1WEc1Y2RGeDBJQ292WEc1Y2RGeDBkbUZ5SUhCeVpYWWdQU0JtZFc1amRHbHZiaUFvWVhKeVlYa3NJR2wwWlcwcElIdGNibHgwWEhSY2RIWmhjaUJwWkhnZ1BTQmhjbkpoZVM1cGJtUmxlRTltS0dsMFpXMHBPMXh1WEhSY2RGeDBhV1lnS0dsa2VDQTlQVDBnTFRFcElIc2djbVYwZFhKdUlHNTFiR3c3SUgxY2JseHVYSFJjZEZ4MGNtVjBkWEp1SUdGeWNtRjVXMmxrZUNBdElERmRPMXh1WEhSY2RIMDdYRzVjYmx4dVhIUmNkSEpsZEhWeWJpQjdYRzVjZEZ4MFhIUm9aV0ZrT2lCb1pXRmtMQ0JzWVhOME9pQnNZWE4wTENCcGJtbDBhV0ZzT2lCcGJtbDBhV0ZzTENCMFlXbHNPaUIwWVdsc0xGeHVYSFJjZEZ4MGNISmxkam9nY0hKbGRpd2dibVY0ZERvZ2JtVjRkQ3dnWm1sdVpEb2dabWx1WkN3Z1kyOXVkR0ZwYm5NNklHTnZiblJoYVc1ekxGeHVYSFJjZEZ4MFlXeHNPaUJoYkd3c0lITjFiVG9nYzNWdExDQm1jbTl0T2lCbWNtOXRMRnh1WEhSY2RGeDBZMngxYzNSbGNrSjVPaUJqYkhWemRHVnlRbmtzSUdOdmJYQmhZM1E2SUdOdmJYQmhZM1FzSUhWdWFYRjFaVG9nZFc1cGNYVmxYRzVjZEZ4MGZUdGNibHgwZlNrb0tUdGNibHh1WEc1Y2RIWmhjaUJPUWxOUVgwTklRVklnUFNCVGRISnBibWN1Wm5KdmJVTm9ZWEpEYjJSbEtERTJNQ2s3WEc1Y2RIWmhjaUJhUlZKUFgxZEpSRlJJWDA1Q1UxQmZRMGhCVWlBOUlDZGNYSFZtWldabUp6dGNibHh1WEhRdktpcGNibHgwSUNvZ1FHTnNZWE56SUdOdmNtVXVaRzl0WEc1Y2RDQXFYRzVjZENBcUlFUnZiU0JtZFc1amRHbHZibk5jYmx4MElDcGNibHgwSUNvZ1FITnBibWRzWlhSdmJseHVYSFFnS2lCQVlXeDBaWEp1WVhSbFEyeGhjM05PWVcxbElHUnZiVnh1WEhRZ0tpOWNibHgwZG1GeUlHUnZiU0E5SUNobWRXNWpkR2x2YmlBb0tTQjdYRzVjZEZ4MEx5b3FYRzVjZEZ4MElDb2dRRzFsZEdodlpDQnBjMFZrYVhSaFlteGxYRzVjZEZ4MElDcGNibHgwWEhRZ0tpQnlaWFIxY201eklIZG9aWFJvWlhJZ2JtOWtaU0JwY3lCZ2JtOTBaUzFsWkdsMFlXSnNaV0FnYjNJZ2JtOTBMbHh1WEhSY2RDQXFYRzVjZEZ4MElDb2dRSEJoY21GdElIdE9iMlJsZlNCdWIyUmxYRzVjZEZ4MElDb2dRSEpsZEhWeWJpQjdRbTl2YkdWaGJuMWNibHgwWEhRZ0tpOWNibHgwWEhSMllYSWdhWE5GWkdsMFlXSnNaU0E5SUdaMWJtTjBhVzl1SUNodWIyUmxLU0I3WEc1Y2RGeDBYSFJ5WlhSMWNtNGdibTlrWlNBbUppQWtLRzV2WkdVcExtaGhjME5zWVhOektDZHViM1JsTFdWa2FYUmhZbXhsSnlrN1hHNWNkRngwZlR0Y2JseHVYSFJjZEM4cUtseHVYSFJjZENBcUlFQnRaWFJvYjJRZ2FYTkRiMjUwY205c1UybDZhVzVuWEc1Y2RGeDBJQ3BjYmx4MFhIUWdLaUJ5WlhSMWNtNXpJSGRvWlhSb1pYSWdibTlrWlNCcGN5QmdibTkwWlMxamIyNTBjbTlzTFhOcGVtbHVaMkFnYjNJZ2JtOTBMbHh1WEhSY2RDQXFYRzVjZEZ4MElDb2dRSEJoY21GdElIdE9iMlJsZlNCdWIyUmxYRzVjZEZ4MElDb2dRSEpsZEhWeWJpQjdRbTl2YkdWaGJuMWNibHgwWEhRZ0tpOWNibHgwWEhSMllYSWdhWE5EYjI1MGNtOXNVMmw2YVc1bklEMGdablZ1WTNScGIyNGdLRzV2WkdVcElIdGNibHgwWEhSY2RISmxkSFZ5YmlCdWIyUmxJQ1ltSUNRb2JtOWtaU2t1YUdGelEyeGhjM01vSjI1dmRHVXRZMjl1ZEhKdmJDMXphWHBwYm1jbktUdGNibHgwWEhSOU8xeHVYRzVjZEZ4MEx5b3FYRzVjZEZ4MElDb2dRRzFsZEdodlpDQWdZblZwYkdSTVlYbHZkWFJKYm1adlhHNWNkRngwSUNwY2JseDBYSFFnS2lCaWRXbHNaQ0JzWVhsdmRYUkpibVp2SUdaeWIyMGdKR1ZrYVhSdmNpZ3VibTkwWlMxbFpHbDBiM0lwWEc1Y2RGeDBJQ3BjYmx4MFhIUWdLaUJBY0dGeVlXMGdlMnBSZFdWeWVYMGdKR1ZrYVhSdmNseHVYSFJjZENBcUlFQnlaWFIxY200Z2UwOWlhbVZqZEgxY2JseDBYSFFnS2lCQWNtVjBkWEp1SUh0R2RXNWpkR2x2Ym4wZ2NtVjBkWEp1TG1Wa2FYUnZjbHh1WEhSY2RDQXFJRUJ5WlhSMWNtNGdlMDV2WkdWOUlISmxkSFZ5Ymk1a2NtOXdlbTl1WlZ4dVhIUmNkQ0FxSUVCeVpYUjFjbTRnZTA1dlpHVjlJSEpsZEhWeWJpNTBiMjlzWW1GeVhHNWNkRngwSUNvZ1FISmxkSFZ5YmlCN1RtOWtaWDBnY21WMGRYSnVMbVZrYVhSaFlteGxYRzVjZEZ4MElDb2dRSEpsZEhWeWJpQjdUbTlrWlgwZ2NtVjBkWEp1TG1OdlpHRmliR1ZjYmx4MFhIUWdLaUJBY21WMGRYSnVJSHRPYjJSbGZTQnlaWFIxY200dWNHOXdiM1psY2x4dVhIUmNkQ0FxSUVCeVpYUjFjbTRnZTA1dlpHVjlJSEpsZEhWeWJpNW9ZVzVrYkdWY2JseDBYSFFnS2lCQWNtVjBkWEp1SUh0T2IyUmxmU0J5WlhSMWNtNHVaR2xoYkc5blhHNWNkRngwSUNvdlhHNWNkRngwZG1GeUlHSjFhV3hrVEdGNWIzVjBTVzVtYnlBOUlHWjFibU4wYVc5dUlDZ2taV1JwZEc5eUtTQjdYRzVjZEZ4MFhIUjJZWElnYldGclpVWnBibVJsY2p0Y2JseHVYSFJjZEZ4MEx5OGdZV2x5SUcxdlpHVmNibHgwWEhSY2RHbG1JQ2drWldScGRHOXlMbWhoYzBOc1lYTnpLQ2R1YjNSbExXRnBjaTFsWkdsMGIzSW5LU2tnZTF4dVhIUmNkRngwWEhSMllYSWdhV1FnUFNCc2FYTjBMbXhoYzNRb0pHVmthWFJ2Y2k1aGRIUnlLQ2RwWkNjcExuTndiR2wwS0NjdEp5a3BPMXh1WEhSY2RGeDBYSFJ0WVd0bFJtbHVaR1Z5SUQwZ1puVnVZM1JwYjI0Z0tITkpaRkJ5WldacGVDa2dlMXh1WEhSY2RGeDBYSFJjZEhKbGRIVnliaUJtZFc1amRHbHZiaUFvS1NCN0lISmxkSFZ5YmlBa0tITkpaRkJ5WldacGVDQXJJR2xrS1RzZ2ZUdGNibHgwWEhSY2RGeDBmVHRjYmx4dVhIUmNkRngwWEhSeVpYUjFjbTRnZTF4dVhIUmNkRngwWEhSY2RHVmthWFJ2Y2pvZ1puVnVZM1JwYjI0Z0tDa2dleUJ5WlhSMWNtNGdKR1ZrYVhSdmNqc2dmU3hjYmx4MFhIUmNkRngwWEhSb2IyeGtaWEk2SUdaMWJtTjBhVzl1SUNncElIc2djbVYwZFhKdUlDUmxaR2wwYjNJdVpHRjBZU2duYUc5c1pHVnlKeWs3SUgwc1hHNWNkRngwWEhSY2RGeDBaV1JwZEdGaWJHVTZJR1oxYm1OMGFXOXVJQ2dwSUhzZ2NtVjBkWEp1SUNSbFpHbDBiM0k3SUgwc1hHNWNkRngwWEhSY2RGeDBjRzl3YjNabGNqb2diV0ZyWlVacGJtUmxjaWduSTI1dmRHVXRjRzl3YjNabGNpMG5LU3hjYmx4MFhIUmNkRngwWEhSb1lXNWtiR1U2SUcxaGEyVkdhVzVrWlhJb0p5TnViM1JsTFdoaGJtUnNaUzBuS1N4Y2JseDBYSFJjZEZ4MFhIUmthV0ZzYjJjNklHMWhhMlZHYVc1a1pYSW9KeU51YjNSbExXUnBZV3h2WnkwbktWeHVYSFJjZEZ4MFhIUjlPMXh1WEc1Y2RGeDBYSFJjZEM4dklHWnlZVzFsSUcxdlpHVmNibHgwWEhSY2RIMGdaV3h6WlNCN1hHNWNkRngwWEhSY2RHMWhhMlZHYVc1a1pYSWdQU0JtZFc1amRHbHZiaUFvYzBOc1lYTnpUbUZ0WlNrZ2UxeHVYSFJjZEZ4MFhIUmNkSEpsZEhWeWJpQm1kVzVqZEdsdmJpQW9LU0I3SUhKbGRIVnliaUFrWldScGRHOXlMbVpwYm1Rb2MwTnNZWE56VG1GdFpTazdJSDA3WEc1Y2RGeDBYSFJjZEgwN1hHNWNkRngwWEhSY2RISmxkSFZ5YmlCN1hHNWNkRngwWEhSY2RGeDBaV1JwZEc5eU9pQm1kVzVqZEdsdmJpQW9LU0I3SUhKbGRIVnliaUFrWldScGRHOXlPeUI5TEZ4dVhIUmNkRngwWEhSY2RHaHZiR1JsY2pvZ1puVnVZM1JwYjI0Z0tDa2dleUJ5WlhSMWNtNGdKR1ZrYVhSdmNpNWtZWFJoS0Nkb2IyeGtaWEluS1RzZ2ZTeGNibHgwWEhSY2RGeDBYSFJrY205d2VtOXVaVG9nYldGclpVWnBibVJsY2lnbkxtNXZkR1V0WkhKdmNIcHZibVVuS1N4Y2JseDBYSFJjZEZ4MFhIUjBiMjlzWW1GeU9pQnRZV3RsUm1sdVpHVnlLQ2N1Ym05MFpTMTBiMjlzWW1GeUp5a3NYRzVjZEZ4MFhIUmNkRngwWldScGRHRmliR1U2SUcxaGEyVkdhVzVrWlhJb0p5NXViM1JsTFdWa2FYUmhZbXhsSnlrc1hHNWNkRngwWEhSY2RGeDBZMjlrWVdKc1pUb2diV0ZyWlVacGJtUmxjaWduTG01dmRHVXRZMjlrWVdKc1pTY3BMRnh1WEhSY2RGeDBYSFJjZEhOMFlYUjFjMkpoY2pvZ2JXRnJaVVpwYm1SbGNpZ25MbTV2ZEdVdGMzUmhkSFZ6WW1GeUp5a3NYRzVjZEZ4MFhIUmNkRngwY0c5d2IzWmxjam9nYldGclpVWnBibVJsY2lnbkxtNXZkR1V0Y0c5d2IzWmxjaWNwTEZ4dVhIUmNkRngwWEhSY2RHaGhibVJzWlRvZ2JXRnJaVVpwYm1SbGNpZ25MbTV2ZEdVdGFHRnVaR3hsSnlrc1hHNWNkRngwWEhSY2RGeDBaR2xoYkc5bk9pQnRZV3RsUm1sdVpHVnlLQ2N1Ym05MFpTMWthV0ZzYjJjbktWeHVYSFJjZEZ4MFhIUjlPMXh1WEhSY2RGeDBmVnh1WEhSY2RIMDdYRzVjYmx4MFhIUXZLaXBjYmx4MFhIUWdLaUJ5WlhSMWNtNXpJRzFoYTJWTVlYbHZkWFJKYm1adklHWnliMjBnWldScGRHOXlKM01nWkdWelkyVnVaR0Z1ZENCdWIyUmxMbHh1WEhSY2RDQXFYRzVjZEZ4MElDb2dRSEJ5YVhaaGRHVmNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UwNXZaR1Y5SUdSbGMyTmxibVJoYm5SY2JseDBYSFFnS2lCQWNtVjBkWEp1SUh0UFltcGxZM1I5WEc1Y2RGeDBJQ292WEc1Y2RGeDBkbUZ5SUcxaGEyVk1ZWGx2ZFhSSmJtWnZJRDBnWm5WdVkzUnBiMjRnS0dSbGMyTmxibVJoYm5RcElIdGNibHgwWEhSY2RIWmhjaUFrZEdGeVoyVjBJRDBnSkNoa1pYTmpaVzVrWVc1MEtTNWpiRzl6WlhOMEtDY3VibTkwWlMxbFpHbDBiM0lzSUM1dWIzUmxMV0ZwY2kxbFpHbDBiM0lzSUM1dWIzUmxMV0ZwY2kxc1lYbHZkWFFuS1R0Y2JseHVYSFJjZEZ4MGFXWWdLQ0VrZEdGeVoyVjBMbXhsYm1kMGFDa2dlMXh1WEhSY2RGeDBYSFJ5WlhSMWNtNGdiblZzYkR0Y2JseDBYSFJjZEgxY2JseHVYSFJjZEZ4MGRtRnlJQ1JsWkdsMGIzSTdYRzVjZEZ4MFhIUnBaaUFvSkhSaGNtZGxkQzVwY3lnbkxtNXZkR1V0WldScGRHOXlMQ0F1Ym05MFpTMWhhWEl0WldScGRHOXlKeWtwSUh0Y2JseDBYSFJjZEZ4MEpHVmthWFJ2Y2lBOUlDUjBZWEpuWlhRN1hHNWNkRngwWEhSOUlHVnNjMlVnZTF4dVhIUmNkRngwWEhRa1pXUnBkRzl5SUQwZ0pDZ25JMjV2ZEdVdFpXUnBkRzl5TFNjZ0t5QnNhWE4wTG14aGMzUW9KSFJoY21kbGRDNWhkSFJ5S0NkcFpDY3BMbk53YkdsMEtDY3RKeWtwS1R0Y2JseDBYSFJjZEgxY2JseHVYSFJjZEZ4MGNtVjBkWEp1SUdKMWFXeGtUR0Y1YjNWMFNXNW1ieWdrWldScGRHOXlLVHRjYmx4MFhIUjlPMXh1WEc1Y2RGeDBMeW9xWEc1Y2RGeDBJQ29nUUcxbGRHaHZaQ0J0WVd0bFVISmxaRUo1VG05a1pVNWhiV1ZjYmx4MFhIUWdLbHh1WEhSY2RDQXFJSEpsZEhWeWJuTWdjSEpsWkdsallYUmxJSGRvYVdOb0lHcDFaR2RsSUhkb1pYUm9aWElnYm05a1pVNWhiV1VnYVhNZ2MyRnRaVnh1WEhSY2RDQXFYRzVjZEZ4MElDb2dRSEJoY21GdElIdFRkSEpwYm1kOUlHNXZaR1ZPWVcxbFhHNWNkRngwSUNvZ1FISmxkSFZ5YmlCN1JuVnVZM1JwYjI1OVhHNWNkRngwSUNvdlhHNWNkRngwZG1GeUlHMWhhMlZRY21Wa1FubE9iMlJsVG1GdFpTQTlJR1oxYm1OMGFXOXVJQ2h1YjJSbFRtRnRaU2tnZTF4dVhIUmNkRngwYm05a1pVNWhiV1VnUFNCdWIyUmxUbUZ0WlM1MGIxVndjR1Z5UTJGelpTZ3BPMXh1WEhSY2RGeDBjbVYwZFhKdUlHWjFibU4wYVc5dUlDaHViMlJsS1NCN1hHNWNkRngwWEhSY2RISmxkSFZ5YmlCdWIyUmxJQ1ltSUc1dlpHVXVibTlrWlU1aGJXVXVkRzlWY0hCbGNrTmhjMlVvS1NBOVBUMGdibTlrWlU1aGJXVTdYRzVjZEZ4MFhIUjlPMXh1WEhSY2RIMDdYRzVjYmx4MFhIUXZLaXBjYmx4MFhIUWdLaUJBYldWMGFHOWtJR2x6VkdWNGRGeHVYSFJjZENBcVhHNWNkRngwSUNwY2JseDBYSFFnS2x4dVhIUmNkQ0FxSUVCd1lYSmhiU0I3VG05a1pYMGdibTlrWlZ4dVhIUmNkQ0FxSUVCeVpYUjFjbTRnZTBKdmIyeGxZVzU5SUhSeWRXVWdhV1lnYm05a1pTZHpJSFI1Y0dVZ2FYTWdkR1Y0ZENnektWeHVYSFJjZENBcUwxeHVYSFJjZEhaaGNpQnBjMVJsZUhRZ1BTQm1kVzVqZEdsdmJpQW9ibTlrWlNrZ2UxeHVYSFJjZEZ4MGNtVjBkWEp1SUc1dlpHVWdKaVlnYm05a1pTNXViMlJsVkhsd1pTQTlQVDBnTXp0Y2JseDBYSFI5TzF4dVhHNWNkRngwTHlvcVhHNWNkRngwSUNvZ1pYZ3BJR0p5TENCamIyd3NJR1Z0WW1Wa0xDQm9jaXdnYVcxbkxDQnBibkIxZEN3Z0xpNHVYRzVjZEZ4MElDb2dRSE5sWlNCb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk5b2RHMXNMM2RuTDJSeVlXWjBjeTlvZEcxc0wyMWhjM1JsY2k5emVXNTBZWGd1YUhSdGJDTjJiMmxrTFdWc1pXMWxiblJ6WEc1Y2RGeDBJQ292WEc1Y2RGeDBkbUZ5SUdselZtOXBaQ0E5SUdaMWJtTjBhVzl1SUNodWIyUmxLU0I3WEc1Y2RGeDBYSFJ5WlhSMWNtNGdibTlrWlNBbUppQXZYa0pTZkY1SlRVZDhYa2hTTHk1MFpYTjBLRzV2WkdVdWJtOWtaVTVoYldVdWRHOVZjSEJsY2tOaGMyVW9LU2s3WEc1Y2RGeDBmVHRjYmx4dVhIUmNkSFpoY2lCcGMxQmhjbUVnUFNCbWRXNWpkR2x2YmlBb2JtOWtaU2tnZTF4dVhIUmNkRngwYVdZZ0tHbHpSV1JwZEdGaWJHVW9ibTlrWlNrcElIdGNibHgwWEhSY2RGeDBjbVYwZFhKdUlHWmhiSE5sTzF4dVhIUmNkRngwZlZ4dVhHNWNkRngwWEhRdkx5QkRhSEp2YldVb2RqTXhMakFwTENCR1JpaDJNalV1TUM0eEtTQjFjMlVnUkVsV0lHWnZjaUJ3WVhKaFozSmhjR2hjYmx4MFhIUmNkSEpsZEhWeWJpQnViMlJsSUNZbUlDOWVSRWxXZkY1UWZGNU1TWHhlU0ZzeExUZGRMeTUwWlhOMEtHNXZaR1V1Ym05a1pVNWhiV1V1ZEc5VmNIQmxja05oYzJVb0tTazdYRzVjZEZ4MGZUdGNibHh1WEhSY2RIWmhjaUJwYzB4cElEMGdiV0ZyWlZCeVpXUkNlVTV2WkdWT1lXMWxLQ2RNU1NjcE8xeHVYRzVjZEZ4MGRtRnlJR2x6VUhWeVpWQmhjbUVnUFNCbWRXNWpkR2x2YmlBb2JtOWtaU2tnZTF4dVhIUmNkRngwY21WMGRYSnVJR2x6VUdGeVlTaHViMlJsS1NBbUppQWhhWE5NYVNodWIyUmxLVHRjYmx4MFhIUjlPMXh1WEc1Y2RGeDBkbUZ5SUdselZHRmliR1VnUFNCdFlXdGxVSEpsWkVKNVRtOWtaVTVoYldVb0oxUkJRa3hGSnlrN1hHNWNibHgwWEhSMllYSWdhWE5KYm14cGJtVWdQU0JtZFc1amRHbHZiaUFvYm05a1pTa2dlMXh1WEhSY2RGeDBjbVYwZFhKdUlDRnBjMEp2WkhsRGIyNTBZV2x1WlhJb2JtOWtaU2tnSmlaY2JseDBYSFJjZEZ4MElDQWdJV2x6VEdsemRDaHViMlJsS1NBbUpseHVYSFJjZEZ4MFhIUWdJQ0FoYVhOUVlYSmhLRzV2WkdVcElDWW1YRzVjZEZ4MFhIUmNkQ0FnSUNGcGMxUmhZbXhsS0c1dlpHVXBJQ1ltWEc1Y2RGeDBYSFJjZENBZ0lDRnBjMEpzYjJOcmNYVnZkR1VvYm05a1pTazdYRzVjZEZ4MGZUdGNibHh1WEhSY2RIWmhjaUJwYzB4cGMzUWdQU0JtZFc1amRHbHZiaUFvYm05a1pTa2dlMXh1WEhSY2RGeDBjbVYwZFhKdUlHNXZaR1VnSmlZZ0wxNVZUSHhlVDB3dkxuUmxjM1FvYm05a1pTNXViMlJsVG1GdFpTNTBiMVZ3Y0dWeVEyRnpaU2dwS1R0Y2JseDBYSFI5TzF4dVhHNWNkRngwZG1GeUlHbHpRMlZzYkNBOUlHWjFibU4wYVc5dUlDaHViMlJsS1NCN1hHNWNkRngwWEhSeVpYUjFjbTRnYm05a1pTQW1KaUF2WGxSRWZGNVVTQzh1ZEdWemRDaHViMlJsTG01dlpHVk9ZVzFsTG5SdlZYQndaWEpEWVhObEtDa3BPMXh1WEhSY2RIMDdYRzVjYmx4MFhIUjJZWElnYVhOQ2JHOWphM0YxYjNSbElEMGdiV0ZyWlZCeVpXUkNlVTV2WkdWT1lXMWxLQ2RDVEU5RFMxRlZUMVJGSnlrN1hHNWNibHgwWEhSMllYSWdhWE5DYjJSNVEyOXVkR0ZwYm1WeUlEMGdablZ1WTNScGIyNGdLRzV2WkdVcElIdGNibHgwWEhSY2RISmxkSFZ5YmlCcGMwTmxiR3dvYm05a1pTa2dmSHdnYVhOQ2JHOWphM0YxYjNSbEtHNXZaR1VwSUh4OElHbHpSV1JwZEdGaWJHVW9ibTlrWlNrN1hHNWNkRngwZlR0Y2JseHVYSFJjZEhaaGNpQnBjMEZ1WTJodmNpQTlJRzFoYTJWUWNtVmtRbmxPYjJSbFRtRnRaU2duUVNjcE8xeHVYRzVjZEZ4MGRtRnlJR2x6VUdGeVlVbHViR2x1WlNBOUlHWjFibU4wYVc5dUlDaHViMlJsS1NCN1hHNWNkRngwWEhSeVpYUjFjbTRnYVhOSmJteHBibVVvYm05a1pTa2dKaVlnSVNGaGJtTmxjM1J2Y2lodWIyUmxMQ0JwYzFCaGNtRXBPMXh1WEhSY2RIMDdYRzVjYmx4MFhIUjJZWElnYVhOQ2IyUjVTVzVzYVc1bElEMGdablZ1WTNScGIyNGdLRzV2WkdVcElIdGNibHgwWEhSY2RISmxkSFZ5YmlCcGMwbHViR2x1WlNodWIyUmxLU0FtSmlBaFlXNWpaWE4wYjNJb2JtOWtaU3dnYVhOUVlYSmhLVHRjYmx4MFhIUjlPMXh1WEc1Y2RGeDBkbUZ5SUdselFtOWtlU0E5SUcxaGEyVlFjbVZrUW5sT2IyUmxUbUZ0WlNnblFrOUVXU2NwTzF4dVhHNWNkRngwTHlvcVhHNWNkRngwSUNvZ2NtVjBkWEp1Y3lCM2FHVjBhR1Z5SUc1dlpHVkNJR2x6SUdOc2IzTmxjM1FnYzJsaWJHbHVaeUJ2WmlCdWIyUmxRVnh1WEhSY2RDQXFYRzVjZEZ4MElDb2dRSEJoY21GdElIdE9iMlJsZlNCdWIyUmxRVnh1WEhSY2RDQXFJRUJ3WVhKaGJTQjdUbTlrWlgwZ2JtOWtaVUpjYmx4MFhIUWdLaUJBY21WMGRYSnVJSHRDYjI5c1pXRnVmVnh1WEhSY2RDQXFMMXh1WEhSY2RIWmhjaUJwYzBOc2IzTmxjM1JUYVdKc2FXNW5JRDBnWm5WdVkzUnBiMjRnS0c1dlpHVkJMQ0J1YjJSbFFpa2dlMXh1WEhSY2RGeDBjbVYwZFhKdUlHNXZaR1ZCTG01bGVIUlRhV0pzYVc1bklEMDlQU0J1YjJSbFFpQjhmRnh1WEhSY2RGeDBYSFFnSUNCdWIyUmxRUzV3Y21WMmFXOTFjMU5wWW14cGJtY2dQVDA5SUc1dlpHVkNPMXh1WEhSY2RIMDdYRzVjYmx4MFhIUXZLaXBjYmx4MFhIUWdLaUJ5WlhSMWNtNXpJR0Z5Y21GNUlHOW1JR05zYjNObGMzUWdjMmxpYkdsdVozTWdkMmwwYUNCdWIyUmxYRzVjZEZ4MElDcGNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UwNXZaR1Y5SUc1dlpHVmNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UyWjFibU4wYVc5dWZTQmJjSEpsWkYwZ0xTQndjbVZrYVdOaGRHVWdablZ1WTNScGIyNWNibHgwWEhRZ0tpQkFjbVYwZFhKdUlIdE9iMlJsVzExOVhHNWNkRngwSUNvdlhHNWNkRngwZG1GeUlIZHBkR2hEYkc5elpYTjBVMmxpYkdsdVozTWdQU0JtZFc1amRHbHZiaUFvYm05a1pTd2djSEpsWkNrZ2UxeHVYSFJjZEZ4MGNISmxaQ0E5SUhCeVpXUWdmSHdnWm5WdVl5NXZhenRjYmx4dVhIUmNkRngwZG1GeUlITnBZbXhwYm1keklEMGdXMTA3WEc1Y2RGeDBYSFJwWmlBb2JtOWtaUzV3Y21WMmFXOTFjMU5wWW14cGJtY2dKaVlnY0hKbFpDaHViMlJsTG5CeVpYWnBiM1Z6VTJsaWJHbHVaeWtwSUh0Y2JseDBYSFJjZEZ4MGMybGliR2x1WjNNdWNIVnphQ2h1YjJSbExuQnlaWFpwYjNWelUybGliR2x1WnlrN1hHNWNkRngwWEhSOVhHNWNkRngwWEhSemFXSnNhVzVuY3k1d2RYTm9LRzV2WkdVcE8xeHVYSFJjZEZ4MGFXWWdLRzV2WkdVdWJtVjRkRk5wWW14cGJtY2dKaVlnY0hKbFpDaHViMlJsTG01bGVIUlRhV0pzYVc1bktTa2dlMXh1WEhSY2RGeDBYSFJ6YVdKc2FXNW5jeTV3ZFhOb0tHNXZaR1V1Ym1WNGRGTnBZbXhwYm1jcE8xeHVYSFJjZEZ4MGZWeHVYSFJjZEZ4MGNtVjBkWEp1SUhOcFlteHBibWR6TzF4dVhIUmNkSDA3WEc1Y2JseDBYSFF2S2lwY2JseDBYSFFnS2lCaWJHRnVheUJJVkUxTUlHWnZjaUJqZFhKemIzSWdjRzl6YVhScGIyNWNibHgwWEhRZ0tpOWNibHgwWEhSMllYSWdZbXhoYm10SVZFMU1JRDBnWVdkbGJuUXVhWE5OVTBsRklEOGdKeVp1WW5Od095Y2dPaUFuUEdKeVBpYzdYRzVjYmx4MFhIUXZLaXBjYmx4MFhIUWdLaUJBYldWMGFHOWtJRzV2WkdWTVpXNW5kR2hjYmx4MFhIUWdLbHh1WEhSY2RDQXFJSEpsZEhWeWJuTWdJM1JsZUhRbmN5QjBaWGgwSUhOcGVtVWdiM0lnWld4bGJXVnVkQ2R6SUdOb2FXeGtUbTlrWlhNZ2MybDZaVnh1WEhSY2RDQXFYRzVjZEZ4MElDb2dRSEJoY21GdElIdE9iMlJsZlNCdWIyUmxYRzVjZEZ4MElDb3ZYRzVjZEZ4MGRtRnlJRzV2WkdWTVpXNW5kR2dnUFNCbWRXNWpkR2x2YmlBb2JtOWtaU2tnZTF4dVhIUmNkRngwYVdZZ0tHbHpWR1Y0ZENodWIyUmxLU2tnZTF4dVhIUmNkRngwWEhSeVpYUjFjbTRnYm05a1pTNXViMlJsVm1Gc2RXVXViR1Z1WjNSb08xeHVYSFJjZEZ4MGZWeHVYRzVjZEZ4MFhIUnlaWFIxY200Z2JtOWtaUzVqYUdsc1pFNXZaR1Z6TG14bGJtZDBhRHRjYmx4MFhIUjlPMXh1WEc1Y2RGeDBMeW9xWEc1Y2RGeDBJQ29nY21WMGRYSnVjeUIzYUdWMGFHVnlJRzV2WkdVZ2FYTWdaVzF3ZEhrZ2IzSWdibTkwTGx4dVhIUmNkQ0FxWEc1Y2RGeDBJQ29nUUhCaGNtRnRJSHRPYjJSbGZTQnViMlJsWEc1Y2RGeDBJQ29nUUhKbGRIVnliaUI3UW05dmJHVmhibjFjYmx4MFhIUWdLaTljYmx4MFhIUjJZWElnYVhORmJYQjBlU0E5SUdaMWJtTjBhVzl1SUNodWIyUmxLU0I3WEc1Y2RGeDBYSFIyWVhJZ2JHVnVJRDBnYm05a1pVeGxibWQwYUNodWIyUmxLVHRjYmx4dVhIUmNkRngwYVdZZ0tHeGxiaUE5UFQwZ01Da2dlMXh1WEhSY2RGeDBYSFJ5WlhSMWNtNGdkSEoxWlR0Y2JseDBYSFJjZEgwZ1pXeHpaU0JwWmlBb0lXUnZiUzVwYzFSbGVIUW9ibTlrWlNrZ0ppWWdiR1Z1SUQwOVBTQXhJQ1ltSUc1dlpHVXVhVzV1WlhKSVZFMU1JRDA5UFNCaWJHRnVhMGhVVFV3cElIdGNibHgwWEhSY2RGeDBMeThnWlhncElEeHdQanhpY2o0OEwzQStMQ0E4YzNCaGJqNDhZbkkrUEM5emNHRnVQbHh1WEhSY2RGeDBYSFJ5WlhSMWNtNGdkSEoxWlR0Y2JseDBYSFJjZEgxY2JseHVYSFJjZEZ4MGNtVjBkWEp1SUdaaGJITmxPMXh1WEhSY2RIMDdYRzVjYmx4MFhIUXZLaXBjYmx4MFhIUWdLaUJ3WVdSa2FXNW5JR0pzWVc1clNGUk5UQ0JwWmlCdWIyUmxJR2x6SUdWdGNIUjVJQ2htYjNJZ1kzVnljMjl5SUhCdmMybDBhVzl1S1Z4dVhIUmNkQ0FxTDF4dVhIUmNkSFpoY2lCd1lXUmthVzVuUW14aGJtdElWRTFNSUQwZ1puVnVZM1JwYjI0Z0tHNXZaR1VwSUh0Y2JseDBYSFJjZEdsbUlDZ2hhWE5XYjJsa0tHNXZaR1VwSUNZbUlDRnViMlJsVEdWdVozUm9LRzV2WkdVcEtTQjdYRzVjZEZ4MFhIUmNkRzV2WkdVdWFXNXVaWEpJVkUxTUlEMGdZbXhoYm10SVZFMU1PMXh1WEhSY2RGeDBmVnh1WEhSY2RIMDdYRzVjYmx4MFhIUXZLaXBjYmx4MFhIUWdLaUJtYVc1a0lHNWxZWEpsYzNRZ1lXNWpaWE4wYjNJZ2NISmxaR2xqWVhSbElHaHBkRnh1WEhSY2RDQXFYRzVjZEZ4MElDb2dRSEJoY21GdElIdE9iMlJsZlNCdWIyUmxYRzVjZEZ4MElDb2dRSEJoY21GdElIdEdkVzVqZEdsdmJuMGdjSEpsWkNBdElIQnlaV1JwWTJGMFpTQm1kVzVqZEdsdmJseHVYSFJjZENBcUwxeHVYSFJjZEhaaGNpQmhibU5sYzNSdmNpQTlJR1oxYm1OMGFXOXVJQ2h1YjJSbExDQndjbVZrS1NCN1hHNWNkRngwWEhSM2FHbHNaU0FvYm05a1pTa2dlMXh1WEhSY2RGeDBYSFJwWmlBb2NISmxaQ2h1YjJSbEtTa2dleUJ5WlhSMWNtNGdibTlrWlRzZ2ZWeHVYSFJjZEZ4MFhIUnBaaUFvYVhORlpHbDBZV0pzWlNodWIyUmxLU2tnZXlCaWNtVmhhenNnZlZ4dVhHNWNkRngwWEhSY2RHNXZaR1VnUFNCdWIyUmxMbkJoY21WdWRFNXZaR1U3WEc1Y2RGeDBYSFI5WEc1Y2RGeDBYSFJ5WlhSMWNtNGdiblZzYkR0Y2JseDBYSFI5TzF4dVhHNWNkRngwTHlvcVhHNWNkRngwSUNvZ1ptbHVaQ0J1WldGeVpYTjBJR0Z1WTJWemRHOXlJRzl1YkhrZ2MybHVaMnhsSUdOb2FXeGtJR0pzYjI5a0lHeHBibVVnWVc1a0lIQnlaV1JwWTJGMFpTQm9hWFJjYmx4MFhIUWdLbHh1WEhSY2RDQXFJRUJ3WVhKaGJTQjdUbTlrWlgwZ2JtOWtaVnh1WEhSY2RDQXFJRUJ3WVhKaGJTQjdSblZ1WTNScGIyNTlJSEJ5WldRZ0xTQndjbVZrYVdOaGRHVWdablZ1WTNScGIyNWNibHgwWEhRZ0tpOWNibHgwWEhSMllYSWdjMmx1WjJ4bFEyaHBiR1JCYm1ObGMzUnZjaUE5SUdaMWJtTjBhVzl1SUNodWIyUmxMQ0J3Y21Wa0tTQjdYRzVjZEZ4MFhIUnViMlJsSUQwZ2JtOWtaUzV3WVhKbGJuUk9iMlJsTzF4dVhHNWNkRngwWEhSM2FHbHNaU0FvYm05a1pTa2dlMXh1WEhSY2RGeDBYSFJwWmlBb2JtOWtaVXhsYm1kMGFDaHViMlJsS1NBaFBUMGdNU2tnZXlCaWNtVmhhenNnZlZ4dVhIUmNkRngwWEhScFppQW9jSEpsWkNodWIyUmxLU2tnZXlCeVpYUjFjbTRnYm05a1pUc2dmVnh1WEhSY2RGeDBYSFJwWmlBb2FYTkZaR2wwWVdKc1pTaHViMlJsS1NrZ2V5QmljbVZoYXpzZ2ZWeHVYRzVjZEZ4MFhIUmNkRzV2WkdVZ1BTQnViMlJsTG5CaGNtVnVkRTV2WkdVN1hHNWNkRngwWEhSOVhHNWNkRngwWEhSeVpYUjFjbTRnYm5Wc2JEdGNibHgwWEhSOU8xeHVYRzVjZEZ4MEx5b3FYRzVjZEZ4MElDb2djbVYwZFhKdWN5QnVaWGNnWVhKeVlYa2diMllnWVc1alpYTjBiM0lnYm05a1pYTWdLSFZ1ZEdsc0lIQnlaV1JwWTJGMFpTQm9hWFFwTGx4dVhIUmNkQ0FxWEc1Y2RGeDBJQ29nUUhCaGNtRnRJSHRPYjJSbGZTQnViMlJsWEc1Y2RGeDBJQ29nUUhCaGNtRnRJSHRHZFc1amRHbHZibjBnVzI5d2RHbHZibUZzWFNCd2NtVmtJQzBnY0hKbFpHbGpZWFJsSUdaMWJtTjBhVzl1WEc1Y2RGeDBJQ292WEc1Y2RGeDBkbUZ5SUd4cGMzUkJibU5sYzNSdmNpQTlJR1oxYm1OMGFXOXVJQ2h1YjJSbExDQndjbVZrS1NCN1hHNWNkRngwWEhSd2NtVmtJRDBnY0hKbFpDQjhmQ0JtZFc1akxtWmhhV3c3WEc1Y2JseDBYSFJjZEhaaGNpQmhibU5sYzNSdmNuTWdQU0JiWFR0Y2JseDBYSFJjZEdGdVkyVnpkRzl5S0c1dlpHVXNJR1oxYm1OMGFXOXVJQ2hsYkNrZ2UxeHVYSFJjZEZ4MFhIUnBaaUFvSVdselJXUnBkR0ZpYkdVb1pXd3BLU0I3WEc1Y2RGeDBYSFJjZEZ4MFlXNWpaWE4wYjNKekxuQjFjMmdvWld3cE8xeHVYSFJjZEZ4MFhIUjlYRzVjYmx4MFhIUmNkRngwY21WMGRYSnVJSEJ5WldRb1pXd3BPMXh1WEhSY2RGeDBmU2s3WEc1Y2RGeDBYSFJ5WlhSMWNtNGdZVzVqWlhOMGIzSnpPMXh1WEhSY2RIMDdYRzVjYmx4MFhIUXZLaXBjYmx4MFhIUWdLaUJtYVc1a0lHWmhjblJvWlhOMElHRnVZMlZ6ZEc5eUlIQnlaV1JwWTJGMFpTQm9hWFJjYmx4MFhIUWdLaTljYmx4MFhIUjJZWElnYkdGemRFRnVZMlZ6ZEc5eUlEMGdablZ1WTNScGIyNGdLRzV2WkdVc0lIQnlaV1FwSUh0Y2JseDBYSFJjZEhaaGNpQmhibU5sYzNSdmNuTWdQU0JzYVhOMFFXNWpaWE4wYjNJb2JtOWtaU2s3WEc1Y2RGeDBYSFJ5WlhSMWNtNGdiR2x6ZEM1c1lYTjBLR0Z1WTJWemRHOXljeTVtYVd4MFpYSW9jSEpsWkNrcE8xeHVYSFJjZEgwN1hHNWNibHgwWEhRdktpcGNibHgwWEhRZ0tpQnlaWFIxY201eklHTnZiVzF2YmlCaGJtTmxjM1J2Y2lCdWIyUmxJR0psZEhkbFpXNGdkSGR2SUc1dlpHVnpMbHh1WEhSY2RDQXFYRzVjZEZ4MElDb2dRSEJoY21GdElIdE9iMlJsZlNCdWIyUmxRVnh1WEhSY2RDQXFJRUJ3WVhKaGJTQjdUbTlrWlgwZ2JtOWtaVUpjYmx4MFhIUWdLaTljYmx4MFhIUjJZWElnWTI5dGJXOXVRVzVqWlhOMGIzSWdQU0JtZFc1amRHbHZiaUFvYm05a1pVRXNJRzV2WkdWQ0tTQjdYRzVjZEZ4MFhIUjJZWElnWVc1alpYTjBiM0p6SUQwZ2JHbHpkRUZ1WTJWemRHOXlLRzV2WkdWQktUdGNibHgwWEhSY2RHWnZjaUFvZG1GeUlHNGdQU0J1YjJSbFFqc2dianNnYmlBOUlHNHVjR0Z5Wlc1MFRtOWtaU2tnZTF4dVhIUmNkRngwWEhScFppQW9KQzVwYmtGeWNtRjVLRzRzSUdGdVkyVnpkRzl5Y3lrZ1BpQXRNU2tnZXlCeVpYUjFjbTRnYmpzZ2ZWeHVYSFJjZEZ4MGZWeHVYSFJjZEZ4MGNtVjBkWEp1SUc1MWJHdzdJQzh2SUdScFptWmxjbVZ1WTJVZ1pHOWpkVzFsYm5RZ1lYSmxZVnh1WEhSY2RIMDdYRzVjYmx4MFhIUXZLaXBjYmx4MFhIUWdLaUJzYVhOMGFXNW5JR0ZzYkNCd2NtVjJhVzkxY3lCemFXSnNhVzVuY3lBb2RXNTBhV3dnY0hKbFpHbGpZWFJsSUdocGRDa3VYRzVjZEZ4MElDcGNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UwNXZaR1Y5SUc1dlpHVmNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UwWjFibU4wYVc5dWZTQmJiM0IwYVc5dVlXeGRJSEJ5WldRZ0xTQndjbVZrYVdOaGRHVWdablZ1WTNScGIyNWNibHgwWEhRZ0tpOWNibHgwWEhSMllYSWdiR2x6ZEZCeVpYWWdQU0JtZFc1amRHbHZiaUFvYm05a1pTd2djSEpsWkNrZ2UxeHVYSFJjZEZ4MGNISmxaQ0E5SUhCeVpXUWdmSHdnWm5WdVl5NW1ZV2xzTzF4dVhHNWNkRngwWEhSMllYSWdibTlrWlhNZ1BTQmJYVHRjYmx4MFhIUmNkSGRvYVd4bElDaHViMlJsS1NCN1hHNWNkRngwWEhSY2RHbG1JQ2h3Y21Wa0tHNXZaR1VwS1NCN0lHSnlaV0ZyT3lCOVhHNWNkRngwWEhSY2RHNXZaR1Z6TG5CMWMyZ29ibTlrWlNrN1hHNWNkRngwWEhSY2RHNXZaR1VnUFNCdWIyUmxMbkJ5WlhacGIzVnpVMmxpYkdsdVp6dGNibHgwWEhSY2RIMWNibHgwWEhSY2RISmxkSFZ5YmlCdWIyUmxjenRjYmx4MFhIUjlPMXh1WEc1Y2RGeDBMeW9xWEc1Y2RGeDBJQ29nYkdsemRHbHVaeUJ1WlhoMElITnBZbXhwYm1keklDaDFiblJwYkNCd2NtVmthV05oZEdVZ2FHbDBLUzVjYmx4MFhIUWdLbHh1WEhSY2RDQXFJRUJ3WVhKaGJTQjdUbTlrWlgwZ2JtOWtaVnh1WEhSY2RDQXFJRUJ3WVhKaGJTQjdSblZ1WTNScGIyNTlJRnR3Y21Wa1hTQXRJSEJ5WldScFkyRjBaU0JtZFc1amRHbHZibHh1WEhSY2RDQXFMMXh1WEhSY2RIWmhjaUJzYVhOMFRtVjRkQ0E5SUdaMWJtTjBhVzl1SUNodWIyUmxMQ0J3Y21Wa0tTQjdYRzVjZEZ4MFhIUndjbVZrSUQwZ2NISmxaQ0I4ZkNCbWRXNWpMbVpoYVd3N1hHNWNibHgwWEhSY2RIWmhjaUJ1YjJSbGN5QTlJRnRkTzF4dVhIUmNkRngwZDJocGJHVWdLRzV2WkdVcElIdGNibHgwWEhSY2RGeDBhV1lnS0hCeVpXUW9ibTlrWlNrcElIc2dZbkpsWVdzN0lIMWNibHgwWEhSY2RGeDBibTlrWlhNdWNIVnphQ2h1YjJSbEtUdGNibHgwWEhSY2RGeDBibTlrWlNBOUlHNXZaR1V1Ym1WNGRGTnBZbXhwYm1jN1hHNWNkRngwWEhSOVhHNWNkRngwWEhSeVpYUjFjbTRnYm05a1pYTTdYRzVjZEZ4MGZUdGNibHh1WEhSY2RDOHFLbHh1WEhSY2RDQXFJR3hwYzNScGJtY2daR1Z6WTJWdVpHRnVkQ0J1YjJSbGMxeHVYSFJjZENBcVhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0T2IyUmxmU0J1YjJSbFhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0R2RXNWpkR2x2Ym4wZ1czQnlaV1JkSUMwZ2NISmxaR2xqWVhSbElHWjFibU4wYVc5dVhHNWNkRngwSUNvdlhHNWNkRngwZG1GeUlHeHBjM1JFWlhOalpXNWtZVzUwSUQwZ1puVnVZM1JwYjI0Z0tHNXZaR1VzSUhCeVpXUXBJSHRjYmx4MFhIUmNkSFpoY2lCa1pYTmpaVzVrWlc1MGN5QTlJRnRkTzF4dVhIUmNkRngwY0hKbFpDQTlJSEJ5WldRZ2ZId2dablZ1WXk1dmF6dGNibHh1WEhSY2RGeDBMeThnYzNSaGNuUWdSRVpUS0dSbGNIUm9JR1pwY25OMElITmxZWEpqYUNrZ2QybDBhQ0J1YjJSbFhHNWNkRngwWEhRb1puVnVZM1JwYjI0Z1ptNVhZV3hyS0dOMWNuSmxiblFwSUh0Y2JseDBYSFJjZEZ4MGFXWWdLRzV2WkdVZ0lUMDlJR04xY25KbGJuUWdKaVlnY0hKbFpDaGpkWEp5Wlc1MEtTa2dlMXh1WEhSY2RGeDBYSFJjZEdSbGMyTmxibVJsYm5SekxuQjFjMmdvWTNWeWNtVnVkQ2s3WEc1Y2RGeDBYSFJjZEgxY2JseDBYSFJjZEZ4MFptOXlJQ2gyWVhJZ2FXUjRJRDBnTUN3Z2JHVnVJRDBnWTNWeWNtVnVkQzVqYUdsc1pFNXZaR1Z6TG14bGJtZDBhRHNnYVdSNElEd2diR1Z1T3lCcFpIZ3JLeWtnZTF4dVhIUmNkRngwWEhSY2RHWnVWMkZzYXloamRYSnlaVzUwTG1Ob2FXeGtUbTlrWlhOYmFXUjRYU2s3WEc1Y2RGeDBYSFJjZEgxY2JseDBYSFJjZEgwcEtHNXZaR1VwTzF4dVhHNWNkRngwWEhSeVpYUjFjbTRnWkdWelkyVnVaR1Z1ZEhNN1hHNWNkRngwZlR0Y2JseHVYSFJjZEM4cUtseHVYSFJjZENBcUlIZHlZWEFnYm05a1pTQjNhWFJvSUc1bGR5QjBZV2N1WEc1Y2RGeDBJQ3BjYmx4MFhIUWdLaUJBY0dGeVlXMGdlMDV2WkdWOUlHNXZaR1ZjYmx4MFhIUWdLaUJBY0dGeVlXMGdlMDV2WkdWOUlIUmhaMDVoYldVZ2IyWWdkM0poY0hCbGNseHVYSFJjZENBcUlFQnlaWFIxY200Z2UwNXZaR1Y5SUMwZ2QzSmhjSEJsY2x4dVhIUmNkQ0FxTDF4dVhIUmNkSFpoY2lCM2NtRndJRDBnWm5WdVkzUnBiMjRnS0c1dlpHVXNJSGR5WVhCd1pYSk9ZVzFsS1NCN1hHNWNkRngwWEhSMllYSWdjR0Z5Wlc1MElEMGdibTlrWlM1d1lYSmxiblJPYjJSbE8xeHVYSFJjZEZ4MGRtRnlJSGR5WVhCd1pYSWdQU0FrS0NjOEp5QXJJSGR5WVhCd1pYSk9ZVzFsSUNzZ0p6NG5LVnN3WFR0Y2JseHVYSFJjZEZ4MGNHRnlaVzUwTG1sdWMyVnlkRUpsWm05eVpTaDNjbUZ3Y0dWeUxDQnViMlJsS1R0Y2JseDBYSFJjZEhkeVlYQndaWEl1WVhCd1pXNWtRMmhwYkdRb2JtOWtaU2s3WEc1Y2JseDBYSFJjZEhKbGRIVnliaUIzY21Gd2NHVnlPMXh1WEhSY2RIMDdYRzVjYmx4MFhIUXZLaXBjYmx4MFhIUWdLaUJwYm5ObGNuUWdibTlrWlNCaFpuUmxjaUJ3Y21WalpXUnBibWRjYmx4MFhIUWdLbHh1WEhSY2RDQXFJRUJ3WVhKaGJTQjdUbTlrWlgwZ2JtOWtaVnh1WEhSY2RDQXFJRUJ3WVhKaGJTQjdUbTlrWlgwZ2NISmxZMlZrYVc1bklDMGdjSEpsWkdsallYUmxJR1oxYm1OMGFXOXVYRzVjZEZ4MElDb3ZYRzVjZEZ4MGRtRnlJR2x1YzJWeWRFRm1kR1Z5SUQwZ1puVnVZM1JwYjI0Z0tHNXZaR1VzSUhCeVpXTmxaR2x1WnlrZ2UxeHVYSFJjZEZ4MGRtRnlJRzVsZUhRZ1BTQndjbVZqWldScGJtY3VibVY0ZEZOcFlteHBibWNzSUhCaGNtVnVkQ0E5SUhCeVpXTmxaR2x1Wnk1d1lYSmxiblJPYjJSbE8xeHVYSFJjZEZ4MGFXWWdLRzVsZUhRcElIdGNibHgwWEhSY2RGeDBjR0Z5Wlc1MExtbHVjMlZ5ZEVKbFptOXlaU2h1YjJSbExDQnVaWGgwS1R0Y2JseDBYSFJjZEgwZ1pXeHpaU0I3WEc1Y2RGeDBYSFJjZEhCaGNtVnVkQzVoY0hCbGJtUkRhR2xzWkNodWIyUmxLVHRjYmx4MFhIUmNkSDFjYmx4MFhIUmNkSEpsZEhWeWJpQnViMlJsTzF4dVhIUmNkSDA3WEc1Y2JseDBYSFF2S2lwY2JseDBYSFFnS2lCaGNIQmxibVFnWld4bGJXVnVkSE11WEc1Y2RGeDBJQ3BjYmx4MFhIUWdLaUJBY0dGeVlXMGdlMDV2WkdWOUlHNXZaR1ZjYmx4MFhIUWdLaUJBY0dGeVlXMGdlME52Ykd4bFkzUnBiMjU5SUdGRGFHbHNaRnh1WEhSY2RDQXFMMXh1WEhSY2RIWmhjaUJoY0hCbGJtUkRhR2xzWkU1dlpHVnpJRDBnWm5WdVkzUnBiMjRnS0c1dlpHVXNJR0ZEYUdsc1pDa2dlMXh1WEhSY2RGeDBKQzVsWVdOb0tHRkRhR2xzWkN3Z1puVnVZM1JwYjI0Z0tHbGtlQ3dnWTJocGJHUXBJSHRjYmx4MFhIUmNkRngwYm05a1pTNWhjSEJsYm1SRGFHbHNaQ2hqYUdsc1pDazdYRzVjZEZ4MFhIUjlLVHRjYmx4MFhIUmNkSEpsZEhWeWJpQnViMlJsTzF4dVhIUmNkSDA3WEc1Y2JseDBYSFF2S2lwY2JseDBYSFFnS2lCeVpYUjFjbTV6SUhkb1pYUm9aWElnWW05MWJtUmhjbmxRYjJsdWRDQnBjeUJzWldaMElHVmtaMlVnYjNJZ2JtOTBMbHh1WEhSY2RDQXFYRzVjZEZ4MElDb2dRSEJoY21GdElIdENiM1Z1WkdGeWVWQnZhVzUwZlNCd2IybHVkRnh1WEhSY2RDQXFJRUJ5WlhSMWNtNGdlMEp2YjJ4bFlXNTlYRzVjZEZ4MElDb3ZYRzVjZEZ4MGRtRnlJR2x6VEdWbWRFVmtaMlZRYjJsdWRDQTlJR1oxYm1OMGFXOXVJQ2h3YjJsdWRDa2dlMXh1WEhSY2RGeDBjbVYwZFhKdUlIQnZhVzUwTG05bVpuTmxkQ0E5UFQwZ01EdGNibHgwWEhSOU8xeHVYRzVjZEZ4MEx5b3FYRzVjZEZ4MElDb2djbVYwZFhKdWN5QjNhR1YwYUdWeUlHSnZkVzVrWVhKNVVHOXBiblFnYVhNZ2NtbG5hSFFnWldSblpTQnZjaUJ1YjNRdVhHNWNkRngwSUNwY2JseDBYSFFnS2lCQWNHRnlZVzBnZTBKdmRXNWtZWEo1VUc5cGJuUjlJSEJ2YVc1MFhHNWNkRngwSUNvZ1FISmxkSFZ5YmlCN1FtOXZiR1ZoYm4xY2JseDBYSFFnS2k5Y2JseDBYSFIyWVhJZ2FYTlNhV2RvZEVWa1oyVlFiMmx1ZENBOUlHWjFibU4wYVc5dUlDaHdiMmx1ZENrZ2UxeHVYSFJjZEZ4MGNtVjBkWEp1SUhCdmFXNTBMbTltWm5ObGRDQTlQVDBnYm05a1pVeGxibWQwYUNod2IybHVkQzV1YjJSbEtUdGNibHgwWEhSOU8xeHVYRzVjZEZ4MEx5b3FYRzVjZEZ4MElDb2djbVYwZFhKdWN5QjNhR1YwYUdWeUlHSnZkVzVrWVhKNVVHOXBiblFnYVhNZ1pXUm5aU0J2Y2lCdWIzUXVYRzVjZEZ4MElDcGNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UwSnZkVzVrWVhKNVVHOXBiblI5SUhCdmFXNTBYRzVjZEZ4MElDb2dRSEpsZEhWeWJpQjdRbTl2YkdWaGJuMWNibHgwWEhRZ0tpOWNibHgwWEhSMllYSWdhWE5GWkdkbFVHOXBiblFnUFNCbWRXNWpkR2x2YmlBb2NHOXBiblFwSUh0Y2JseDBYSFJjZEhKbGRIVnliaUJwYzB4bFpuUkZaR2RsVUc5cGJuUW9jRzlwYm5RcElIeDhJR2x6VW1sbmFIUkZaR2RsVUc5cGJuUW9jRzlwYm5RcE8xeHVYSFJjZEgwN1hHNWNibHgwWEhRdktpcGNibHgwWEhRZ0tpQnlaWFIxY201eklIZG9aWFJsY2lCdWIyUmxJR2x6SUd4bFpuUWdaV1JuWlNCdlppQmhibU5sYzNSdmNpQnZjaUJ1YjNRdVhHNWNkRngwSUNwY2JseDBYSFFnS2lCQWNHRnlZVzBnZTA1dlpHVjlJRzV2WkdWY2JseDBYSFFnS2lCQWNHRnlZVzBnZTA1dlpHVjlJR0Z1WTJWemRHOXlYRzVjZEZ4MElDb2dRSEpsZEhWeWJpQjdRbTl2YkdWaGJuMWNibHgwWEhRZ0tpOWNibHgwWEhSMllYSWdhWE5NWldaMFJXUm5aVTltSUQwZ1puVnVZM1JwYjI0Z0tHNXZaR1VzSUdGdVkyVnpkRzl5S1NCN1hHNWNkRngwWEhSM2FHbHNaU0FvYm05a1pTQW1KaUJ1YjJSbElDRTlQU0JoYm1ObGMzUnZjaWtnZTF4dVhIUmNkRngwWEhScFppQW9jRzl6YVhScGIyNG9ibTlrWlNrZ0lUMDlJREFwSUh0Y2JseDBYSFJjZEZ4MFhIUnlaWFIxY200Z1ptRnNjMlU3WEc1Y2RGeDBYSFJjZEgxY2JseDBYSFJjZEZ4MGJtOWtaU0E5SUc1dlpHVXVjR0Z5Wlc1MFRtOWtaVHRjYmx4MFhIUmNkSDFjYmx4dVhIUmNkRngwY21WMGRYSnVJSFJ5ZFdVN1hHNWNkRngwZlR0Y2JseHVYSFJjZEM4cUtseHVYSFJjZENBcUlISmxkSFZ5Ym5NZ2QyaGxkR2hsY2lCdWIyUmxJR2x6SUhKcFoyaDBJR1ZrWjJVZ2IyWWdZVzVqWlhOMGIzSWdiM0lnYm05MExseHVYSFJjZENBcVhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0T2IyUmxmU0J1YjJSbFhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0T2IyUmxmU0JoYm1ObGMzUnZjbHh1WEhSY2RDQXFJRUJ5WlhSMWNtNGdlMEp2YjJ4bFlXNTlYRzVjZEZ4MElDb3ZYRzVjZEZ4MGRtRnlJR2x6VW1sbmFIUkZaR2RsVDJZZ1BTQm1kVzVqZEdsdmJpQW9ibTlrWlN3Z1lXNWpaWE4wYjNJcElIdGNibHgwWEhSY2RIZG9hV3hsSUNodWIyUmxJQ1ltSUc1dlpHVWdJVDA5SUdGdVkyVnpkRzl5S1NCN1hHNWNkRngwWEhSY2RHbG1JQ2h3YjNOcGRHbHZiaWh1YjJSbEtTQWhQVDBnYm05a1pVeGxibWQwYUNodWIyUmxMbkJoY21WdWRFNXZaR1VwSUMwZ01Ta2dlMXh1WEhSY2RGeDBYSFJjZEhKbGRIVnliaUJtWVd4elpUdGNibHgwWEhSY2RGeDBmVnh1WEhSY2RGeDBYSFJ1YjJSbElEMGdibTlrWlM1d1lYSmxiblJPYjJSbE8xeHVYSFJjZEZ4MGZWeHVYRzVjZEZ4MFhIUnlaWFIxY200Z2RISjFaVHRjYmx4MFhIUjlPMXh1WEc1Y2RGeDBMeW9xWEc1Y2RGeDBJQ29nY21WMGRYSnVjeUJ2Wm1aelpYUWdabkp2YlNCd1lYSmxiblF1WEc1Y2RGeDBJQ3BjYmx4MFhIUWdLaUJBY0dGeVlXMGdlMDV2WkdWOUlHNXZaR1ZjYmx4MFhIUWdLaTljYmx4MFhIUjJZWElnY0c5emFYUnBiMjRnUFNCbWRXNWpkR2x2YmlBb2JtOWtaU2tnZTF4dVhIUmNkRngwZG1GeUlHOW1abk5sZENBOUlEQTdYRzVjZEZ4MFhIUjNhR2xzWlNBb0tHNXZaR1VnUFNCdWIyUmxMbkJ5WlhacGIzVnpVMmxpYkdsdVp5a3BJSHRjYmx4MFhIUmNkRngwYjJabWMyVjBJQ3M5SURFN1hHNWNkRngwWEhSOVhHNWNkRngwWEhSeVpYUjFjbTRnYjJabWMyVjBPMXh1WEhSY2RIMDdYRzVjYmx4MFhIUjJZWElnYUdGelEyaHBiR1J5Wlc0Z1BTQm1kVzVqZEdsdmJpQW9ibTlrWlNrZ2UxeHVYSFJjZEZ4MGNtVjBkWEp1SUNFaEtHNXZaR1VnSmlZZ2JtOWtaUzVqYUdsc1pFNXZaR1Z6SUNZbUlHNXZaR1V1WTJocGJHUk9iMlJsY3k1c1pXNW5kR2dwTzF4dVhIUmNkSDA3WEc1Y2JseDBYSFF2S2lwY2JseDBYSFFnS2lCeVpYUjFjbTV6SUhCeVpYWnBiM1Z6SUdKdmRXNWtZWEo1VUc5cGJuUmNibHgwWEhRZ0tseHVYSFJjZENBcUlFQndZWEpoYlNCN1FtOTFibVJoY25sUWIybHVkSDBnY0c5cGJuUmNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UwSnZiMnhsWVc1OUlHbHpVMnRwY0VsdWJtVnlUMlptYzJWMFhHNWNkRngwSUNvZ1FISmxkSFZ5YmlCN1FtOTFibVJoY25sUWIybHVkSDFjYmx4MFhIUWdLaTljYmx4MFhIUjJZWElnY0hKbGRsQnZhVzUwSUQwZ1puVnVZM1JwYjI0Z0tIQnZhVzUwTENCcGMxTnJhWEJKYm01bGNrOW1abk5sZENrZ2UxeHVYSFJjZEZ4MGRtRnlJRzV2WkdVc0lHOW1abk5sZER0Y2JseHVYSFJjZEZ4MGFXWWdLSEJ2YVc1MExtOW1abk5sZENBOVBUMGdNQ2tnZTF4dVhIUmNkRngwWEhScFppQW9hWE5GWkdsMFlXSnNaU2h3YjJsdWRDNXViMlJsS1NrZ2UxeHVYSFJjZEZ4MFhIUmNkSEpsZEhWeWJpQnVkV3hzTzF4dVhIUmNkRngwWEhSOVhHNWNibHgwWEhSY2RGeDBibTlrWlNBOUlIQnZhVzUwTG01dlpHVXVjR0Z5Wlc1MFRtOWtaVHRjYmx4MFhIUmNkRngwYjJabWMyVjBJRDBnY0c5emFYUnBiMjRvY0c5cGJuUXVibTlrWlNrN1hHNWNkRngwWEhSOUlHVnNjMlVnYVdZZ0tHaGhjME5vYVd4a2NtVnVLSEJ2YVc1MExtNXZaR1VwS1NCN1hHNWNkRngwWEhSY2RHNXZaR1VnUFNCd2IybHVkQzV1YjJSbExtTm9hV3hrVG05a1pYTmJjRzlwYm5RdWIyWm1jMlYwSUMwZ01WMDdYRzVjZEZ4MFhIUmNkRzltWm5ObGRDQTlJRzV2WkdWTVpXNW5kR2dvYm05a1pTazdYRzVjZEZ4MFhIUjlJR1ZzYzJVZ2UxeHVYSFJjZEZ4MFhIUnViMlJsSUQwZ2NHOXBiblF1Ym05a1pUdGNibHgwWEhSY2RGeDBiMlptYzJWMElEMGdhWE5UYTJsd1NXNXVaWEpQWm1aelpYUWdQeUF3SURvZ2NHOXBiblF1YjJabWMyVjBJQzBnTVR0Y2JseDBYSFJjZEgxY2JseHVYSFJjZEZ4MGNtVjBkWEp1SUh0Y2JseDBYSFJjZEZ4MGJtOWtaVG9nYm05a1pTeGNibHgwWEhSY2RGeDBiMlptYzJWME9pQnZabVp6WlhSY2JseDBYSFJjZEgwN1hHNWNkRngwZlR0Y2JseHVYSFJjZEM4cUtseHVYSFJjZENBcUlISmxkSFZ5Ym5NZ2JtVjRkQ0JpYjNWdVpHRnllVkJ2YVc1MFhHNWNkRngwSUNwY2JseDBYSFFnS2lCQWNHRnlZVzBnZTBKdmRXNWtZWEo1VUc5cGJuUjlJSEJ2YVc1MFhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0Q2IyOXNaV0Z1ZlNCcGMxTnJhWEJKYm01bGNrOW1abk5sZEZ4dVhIUmNkQ0FxSUVCeVpYUjFjbTRnZTBKdmRXNWtZWEo1VUc5cGJuUjlYRzVjZEZ4MElDb3ZYRzVjZEZ4MGRtRnlJRzVsZUhSUWIybHVkQ0E5SUdaMWJtTjBhVzl1SUNod2IybHVkQ3dnYVhOVGEybHdTVzV1WlhKUFptWnpaWFFwSUh0Y2JseDBYSFJjZEhaaGNpQnViMlJsTENCdlptWnpaWFE3WEc1Y2JseDBYSFJjZEdsbUlDaHViMlJsVEdWdVozUm9LSEJ2YVc1MExtNXZaR1VwSUQwOVBTQndiMmx1ZEM1dlptWnpaWFFwSUh0Y2JseDBYSFJjZEZ4MGFXWWdLR2x6UldScGRHRmliR1VvY0c5cGJuUXVibTlrWlNrcElIdGNibHgwWEhSY2RGeDBYSFJ5WlhSMWNtNGdiblZzYkR0Y2JseDBYSFJjZEZ4MGZWeHVYRzVjZEZ4MFhIUmNkRzV2WkdVZ1BTQndiMmx1ZEM1dWIyUmxMbkJoY21WdWRFNXZaR1U3WEc1Y2RGeDBYSFJjZEc5bVpuTmxkQ0E5SUhCdmMybDBhVzl1S0hCdmFXNTBMbTV2WkdVcElDc2dNVHRjYmx4MFhIUmNkSDBnWld4elpTQnBaaUFvYUdGelEyaHBiR1J5Wlc0b2NHOXBiblF1Ym05a1pTa3BJSHRjYmx4MFhIUmNkRngwYm05a1pTQTlJSEJ2YVc1MExtNXZaR1V1WTJocGJHUk9iMlJsYzF0d2IybHVkQzV2Wm1aelpYUmRPMXh1WEhSY2RGeDBYSFJ2Wm1aelpYUWdQU0F3TzF4dVhIUmNkRngwZlNCbGJITmxJSHRjYmx4MFhIUmNkRngwYm05a1pTQTlJSEJ2YVc1MExtNXZaR1U3WEc1Y2RGeDBYSFJjZEc5bVpuTmxkQ0E5SUdselUydHBjRWx1Ym1WeVQyWm1jMlYwSUQ4Z2JtOWtaVXhsYm1kMGFDaHdiMmx1ZEM1dWIyUmxLU0E2SUhCdmFXNTBMbTltWm5ObGRDQXJJREU3WEc1Y2RGeDBYSFI5WEc1Y2JseDBYSFJjZEhKbGRIVnliaUI3WEc1Y2RGeDBYSFJjZEc1dlpHVTZJRzV2WkdVc1hHNWNkRngwWEhSY2RHOW1abk5sZERvZ2IyWm1jMlYwWEc1Y2RGeDBYSFI5TzF4dVhIUmNkSDA3WEc1Y2JseDBYSFF2S2lwY2JseDBYSFFnS2lCeVpYUjFjbTV6SUhkb1pYUm9aWElnY0c5cGJuUkJJR0Z1WkNCd2IybHVkRUlnYVhNZ2MyRnRaU0J2Y2lCdWIzUXVYRzVjZEZ4MElDcGNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UwSnZkVzVrWVhKNVVHOXBiblI5SUhCdmFXNTBRVnh1WEhSY2RDQXFJRUJ3WVhKaGJTQjdRbTkxYm1SaGNubFFiMmx1ZEgwZ2NHOXBiblJDWEc1Y2RGeDBJQ29nUUhKbGRIVnliaUI3UW05dmJHVmhibjFjYmx4MFhIUWdLaTljYmx4MFhIUjJZWElnYVhOVFlXMWxVRzlwYm5RZ1BTQm1kVzVqZEdsdmJpQW9jRzlwYm5SQkxDQndiMmx1ZEVJcElIdGNibHgwWEhSY2RISmxkSFZ5YmlCd2IybHVkRUV1Ym05a1pTQTlQVDBnY0c5cGJuUkNMbTV2WkdVZ0ppWWdjRzlwYm5SQkxtOW1abk5sZENBOVBUMGdjRzlwYm5SQ0xtOW1abk5sZER0Y2JseDBYSFI5TzF4dVhHNWNkRngwTHlvcVhHNWNkRngwSUNvZ2NtVjBkWEp1Y3lCM2FHVjBhR1Z5SUhCdmFXNTBJR2x6SUhacGMybGliR1VnS0dOaGJpQnpaWFFnWTNWeWMyOXlLU0J2Y2lCdWIzUXVYRzVjZEZ4MElDb2dYRzVjZEZ4MElDb2dRSEJoY21GdElIdENiM1Z1WkdGeWVWQnZhVzUwZlNCd2IybHVkRnh1WEhSY2RDQXFJRUJ5WlhSMWNtNGdlMEp2YjJ4bFlXNTlYRzVjZEZ4MElDb3ZYRzVjZEZ4MGRtRnlJR2x6Vm1semFXSnNaVkJ2YVc1MElEMGdablZ1WTNScGIyNGdLSEJ2YVc1MEtTQjdYRzVjZEZ4MFhIUnBaaUFvYVhOVVpYaDBLSEJ2YVc1MExtNXZaR1VwSUh4OElDRm9ZWE5EYUdsc1pISmxiaWh3YjJsdWRDNXViMlJsS1NCOGZDQnBjMFZ0Y0hSNUtIQnZhVzUwTG01dlpHVXBLU0I3WEc1Y2RGeDBYSFJjZEhKbGRIVnliaUIwY25WbE8xeHVYSFJjZEZ4MGZWeHVYRzVjZEZ4MFhIUjJZWElnYkdWbWRFNXZaR1VnUFNCd2IybHVkQzV1YjJSbExtTm9hV3hrVG05a1pYTmJjRzlwYm5RdWIyWm1jMlYwSUMwZ01WMDdYRzVjZEZ4MFhIUjJZWElnY21sbmFIUk9iMlJsSUQwZ2NHOXBiblF1Ym05a1pTNWphR2xzWkU1dlpHVnpXM0J2YVc1MExtOW1abk5sZEYwN1hHNWNkRngwWEhScFppQW9LQ0ZzWldaMFRtOWtaU0I4ZkNCcGMxWnZhV1FvYkdWbWRFNXZaR1VwS1NBbUppQW9JWEpwWjJoMFRtOWtaU0I4ZkNCcGMxWnZhV1FvY21sbmFIUk9iMlJsS1NrcElIdGNibHgwWEhSY2RGeDBjbVYwZFhKdUlIUnlkV1U3WEc1Y2RGeDBYSFI5WEc1Y2JseDBYSFJjZEhKbGRIVnliaUJtWVd4elpUdGNibHgwWEhSOU8xeHVYRzVjZEZ4MEx5b3FYRzVjZEZ4MElDb2dRRzFsZEdodlpDQndjbVYyVUc5cGJuUlZkR2xzWEc1Y2RGeDBJQ3BjYmx4MFhIUWdLaUJBY0dGeVlXMGdlMEp2ZFc1a1lYSjVVRzlwYm5SOUlIQnZhVzUwWEc1Y2RGeDBJQ29nUUhCaGNtRnRJSHRHZFc1amRHbHZibjBnY0hKbFpGeHVYSFJjZENBcUlFQnlaWFIxY200Z2UwSnZkVzVrWVhKNVVHOXBiblI5WEc1Y2RGeDBJQ292WEc1Y2RGeDBkbUZ5SUhCeVpYWlFiMmx1ZEZWdWRHbHNJRDBnWm5WdVkzUnBiMjRnS0hCdmFXNTBMQ0J3Y21Wa0tTQjdYRzVjZEZ4MFhIUjNhR2xzWlNBb2NHOXBiblFwSUh0Y2JseDBYSFJjZEZ4MGFXWWdLSEJ5WldRb2NHOXBiblFwS1NCN1hHNWNkRngwWEhSY2RGeDBjbVYwZFhKdUlIQnZhVzUwTzF4dVhIUmNkRngwWEhSOVhHNWNibHgwWEhSY2RGeDBjRzlwYm5RZ1BTQndjbVYyVUc5cGJuUW9jRzlwYm5RcE8xeHVYSFJjZEZ4MGZWeHVYRzVjZEZ4MFhIUnlaWFIxY200Z2JuVnNiRHRjYmx4MFhIUjlPMXh1WEc1Y2RGeDBMeW9xWEc1Y2RGeDBJQ29nUUcxbGRHaHZaQ0J1WlhoMFVHOXBiblJWYm5ScGJGeHVYSFJjZENBcVhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0Q2IzVnVaR0Z5ZVZCdmFXNTBmU0J3YjJsdWRGeHVYSFJjZENBcUlFQndZWEpoYlNCN1JuVnVZM1JwYjI1OUlIQnlaV1JjYmx4MFhIUWdLaUJBY21WMGRYSnVJSHRDYjNWdVpHRnllVkJ2YVc1MGZWeHVYSFJjZENBcUwxeHVYSFJjZEhaaGNpQnVaWGgwVUc5cGJuUlZiblJwYkNBOUlHWjFibU4wYVc5dUlDaHdiMmx1ZEN3Z2NISmxaQ2tnZTF4dVhIUmNkRngwZDJocGJHVWdLSEJ2YVc1MEtTQjdYRzVjZEZ4MFhIUmNkR2xtSUNod2NtVmtLSEJ2YVc1MEtTa2dlMXh1WEhSY2RGeDBYSFJjZEhKbGRIVnliaUJ3YjJsdWREdGNibHgwWEhSY2RGeDBmVnh1WEc1Y2RGeDBYSFJjZEhCdmFXNTBJRDBnYm1WNGRGQnZhVzUwS0hCdmFXNTBLVHRjYmx4MFhIUmNkSDFjYmx4dVhIUmNkRngwY21WMGRYSnVJRzUxYkd3N1hHNWNkRngwZlR0Y2JseHVYSFJjZEM4cUtseHVYSFJjZENBcUlFQnRaWFJvYjJRZ2QyRnNhMUJ2YVc1MFhHNWNkRngwSUNwY2JseDBYSFFnS2lCQWNHRnlZVzBnZTBKdmRXNWtZWEo1VUc5cGJuUjlJSE4wWVhKMFVHOXBiblJjYmx4MFhIUWdLaUJBY0dGeVlXMGdlMEp2ZFc1a1lYSjVVRzlwYm5SOUlHVnVaRkJ2YVc1MFhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0R2RXNWpkR2x2Ym4wZ2FHRnVaR3hsY2x4dVhIUmNkQ0FxSUVCd1lYSmhiU0I3UW05dmJHVmhibjBnYVhOVGEybHdTVzV1WlhKUFptWnpaWFJjYmx4MFhIUWdLaTljYmx4MFhIUjJZWElnZDJGc2ExQnZhVzUwSUQwZ1puVnVZM1JwYjI0Z0tITjBZWEowVUc5cGJuUXNJR1Z1WkZCdmFXNTBMQ0JvWVc1a2JHVnlMQ0JwYzFOcmFYQkpibTVsY2s5bVpuTmxkQ2tnZTF4dVhIUmNkRngwZG1GeUlIQnZhVzUwSUQwZ2MzUmhjblJRYjJsdWREdGNibHh1WEhSY2RGeDBkMmhwYkdVZ0tIQnZhVzUwS1NCN1hHNWNkRngwWEhSY2RHaGhibVJzWlhJb2NHOXBiblFwTzF4dVhHNWNkRngwWEhSY2RHbG1JQ2hwYzFOaGJXVlFiMmx1ZENod2IybHVkQ3dnWlc1a1VHOXBiblFwS1NCN1hHNWNkRngwWEhSY2RGeDBZbkpsWVdzN1hHNWNkRngwWEhSY2RIMWNibHh1WEhSY2RGeDBYSFIyWVhJZ2FYTlRhMmx3VDJabWMyVjBJRDBnYVhOVGEybHdTVzV1WlhKUFptWnpaWFFnSmlaY2JseDBYSFJjZEZ4MFhIUmNkRngwWEhRZ0lDQnpkR0Z5ZEZCdmFXNTBMbTV2WkdVZ0lUMDlJSEJ2YVc1MExtNXZaR1VnSmlaY2JseDBYSFJjZEZ4MFhIUmNkRngwWEhRZ0lDQmxibVJRYjJsdWRDNXViMlJsSUNFOVBTQndiMmx1ZEM1dWIyUmxPMXh1WEhSY2RGeDBYSFJ3YjJsdWRDQTlJRzVsZUhSUWIybHVkQ2h3YjJsdWRDd2dhWE5UYTJsd1QyWm1jMlYwS1R0Y2JseDBYSFJjZEgxY2JseDBYSFI5TzF4dVhHNWNkRngwTHlvcVhHNWNkRngwSUNvZ1FHMWxkR2h2WkNCdFlXdGxUMlptYzJWMFVHRjBhRnh1WEhSY2RDQXFYRzVjZEZ4MElDb2djbVYwZFhKdUlHOW1abk5sZEZCaGRHZ29ZWEp5WVhrZ2IyWWdiMlptYzJWMEtTQm1jbTl0SUdGdVkyVnpkRzl5WEc1Y2RGeDBJQ3BjYmx4MFhIUWdLaUJBY0dGeVlXMGdlMDV2WkdWOUlHRnVZMlZ6ZEc5eUlDMGdZVzVqWlhOMGIzSWdibTlrWlZ4dVhIUmNkQ0FxSUVCd1lYSmhiU0I3VG05a1pYMGdibTlrWlZ4dVhIUmNkQ0FxTDF4dVhIUmNkSFpoY2lCdFlXdGxUMlptYzJWMFVHRjBhQ0E5SUdaMWJtTjBhVzl1SUNoaGJtTmxjM1J2Y2l3Z2JtOWtaU2tnZTF4dVhIUmNkRngwZG1GeUlHRnVZMlZ6ZEc5eWN5QTlJR3hwYzNSQmJtTmxjM1J2Y2lodWIyUmxMQ0JtZFc1akxtVnhLR0Z1WTJWemRHOXlLU2s3WEc1Y2RGeDBYSFJ5WlhSMWNtNGdKQzV0WVhBb1lXNWpaWE4wYjNKekxDQndiM05wZEdsdmJpa3VjbVYyWlhKelpTZ3BPMXh1WEhSY2RIMDdYRzVjYmx4MFhIUXZLaXBjYmx4MFhIUWdLaUJBYldWMGFHOWtJR1p5YjIxUFptWnpaWFJRWVhSb1hHNWNkRngwSUNwY2JseDBYSFFnS2lCeVpYUjFjbTRnWld4bGJXVnVkQ0JtY205dElHOW1abk5sZEZCaGRHZ29ZWEp5WVhrZ2IyWWdiMlptYzJWMEtWeHVYSFJjZENBcVhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0T2IyUmxmU0JoYm1ObGMzUnZjaUF0SUdGdVkyVnpkRzl5SUc1dlpHVmNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UyRnljbUY1ZlNCdlptWnpaWFJ6SUMwZ2IyWm1jMlYwVUdGMGFGeHVYSFJjZENBcUwxeHVYSFJjZEhaaGNpQm1jbTl0VDJabWMyVjBVR0YwYUNBOUlHWjFibU4wYVc5dUlDaGhibU5sYzNSdmNpd2diMlptYzJWMGN5a2dlMXh1WEhSY2RGeDBkbUZ5SUdOMWNuSmxiblFnUFNCaGJtTmxjM1J2Y2p0Y2JseDBYSFJjZEdadmNpQW9kbUZ5SUdrZ1BTQXdMQ0JzWlc0Z1BTQnZabVp6WlhSekxteGxibWQwYURzZ2FTQThJR3hsYmpzZ2FTc3JLU0I3WEc1Y2RGeDBYSFJjZEdsbUlDaGpkWEp5Wlc1MExtTm9hV3hrVG05a1pYTXViR1Z1WjNSb0lEdzlJRzltWm5ObGRITmJhVjBwSUh0Y2JseDBYSFJjZEZ4MFhIUmpkWEp5Wlc1MElEMGdZM1Z5Y21WdWRDNWphR2xzWkU1dlpHVnpXMk4xY25KbGJuUXVZMmhwYkdST2IyUmxjeTVzWlc1bmRHZ2dMU0F4WFR0Y2JseDBYSFJjZEZ4MGZTQmxiSE5sSUh0Y2JseDBYSFJjZEZ4MFhIUmpkWEp5Wlc1MElEMGdZM1Z5Y21WdWRDNWphR2xzWkU1dlpHVnpXMjltWm5ObGRITmJhVjFkTzF4dVhIUmNkRngwWEhSOVhHNWNkRngwWEhSOVhHNWNkRngwWEhSeVpYUjFjbTRnWTNWeWNtVnVkRHRjYmx4MFhIUjlPMXh1WEc1Y2RGeDBMeW9xWEc1Y2RGeDBJQ29nUUcxbGRHaHZaQ0J6Y0d4cGRFNXZaR1ZjYmx4MFhIUWdLbHh1WEhSY2RDQXFJSE53YkdsMElHVnNaVzFsYm5RZ2IzSWdJM1JsZUhSY2JseDBYSFFnS2x4dVhIUmNkQ0FxSUVCd1lYSmhiU0I3UW05MWJtUmhjbmxRYjJsdWRIMGdjRzlwYm5SY2JseDBYSFFnS2lCQWNHRnlZVzBnZTBKdmIyeGxZVzU5SUZ0cGMxTnJhWEJRWVdSa2FXNW5RbXhoYm10SVZFMU1YVnh1WEhSY2RDQXFJRUJ5WlhSMWNtNGdlMDV2WkdWOUlISnBaMmgwSUc1dlpHVWdiMllnWW05MWJtUmhjbmxRYjJsdWRGeHVYSFJjZENBcUwxeHVYSFJjZEhaaGNpQnpjR3hwZEU1dlpHVWdQU0JtZFc1amRHbHZiaUFvY0c5cGJuUXNJR2x6VTJ0cGNGQmhaR1JwYm1kQ2JHRnVhMGhVVFV3cElIdGNibHgwWEhSY2RDOHZJSE53YkdsMElDTjBaWGgwWEc1Y2RGeDBYSFJwWmlBb2FYTlVaWGgwS0hCdmFXNTBMbTV2WkdVcEtTQjdYRzVjZEZ4MFhIUmNkQzh2SUdWa1oyVWdZMkZ6WlZ4dVhIUmNkRngwWEhScFppQW9hWE5NWldaMFJXUm5aVkJ2YVc1MEtIQnZhVzUwS1NrZ2UxeHVYSFJjZEZ4MFhIUmNkSEpsZEhWeWJpQndiMmx1ZEM1dWIyUmxPMXh1WEhSY2RGeDBYSFI5SUdWc2MyVWdhV1lnS0dselVtbG5hSFJGWkdkbFVHOXBiblFvY0c5cGJuUXBLU0I3WEc1Y2RGeDBYSFJjZEZ4MGNtVjBkWEp1SUhCdmFXNTBMbTV2WkdVdWJtVjRkRk5wWW14cGJtYzdYRzVjZEZ4MFhIUmNkSDFjYmx4dVhIUmNkRngwWEhSeVpYUjFjbTRnY0c5cGJuUXVibTlrWlM1emNHeHBkRlJsZUhRb2NHOXBiblF1YjJabWMyVjBLVHRjYmx4MFhIUmNkSDFjYmx4dVhIUmNkRngwTHk4Z2MzQnNhWFFnWld4bGJXVnVkRnh1WEhSY2RGeDBkbUZ5SUdOb2FXeGtUbTlrWlNBOUlIQnZhVzUwTG01dlpHVXVZMmhwYkdST2IyUmxjMXR3YjJsdWRDNXZabVp6WlhSZE8xeHVYSFJjZEZ4MGRtRnlJR05zYjI1bElEMGdhVzV6WlhKMFFXWjBaWElvY0c5cGJuUXVibTlrWlM1amJHOXVaVTV2WkdVb1ptRnNjMlVwTENCd2IybHVkQzV1YjJSbEtUdGNibHgwWEhSY2RHRndjR1Z1WkVOb2FXeGtUbTlrWlhNb1kyeHZibVVzSUd4cGMzUk9aWGgwS0dOb2FXeGtUbTlrWlNrcE8xeHVYRzVjZEZ4MFhIUnBaaUFvSVdselUydHBjRkJoWkdScGJtZENiR0Z1YTBoVVRVd3BJSHRjYmx4MFhIUmNkRngwY0dGa1pHbHVaMEpzWVc1clNGUk5UQ2h3YjJsdWRDNXViMlJsS1R0Y2JseDBYSFJjZEZ4MGNHRmtaR2x1WjBKc1lXNXJTRlJOVENoamJHOXVaU2s3WEc1Y2RGeDBYSFI5WEc1Y2JseDBYSFJjZEhKbGRIVnliaUJqYkc5dVpUdGNibHgwWEhSOU8xeHVYRzVjZEZ4MEx5b3FYRzVjZEZ4MElDb2dRRzFsZEdodlpDQnpjR3hwZEZSeVpXVmNibHgwWEhRZ0tseHVYSFJjZENBcUlITndiR2wwSUhSeVpXVWdZbmtnY0c5cGJuUmNibHgwWEhRZ0tseHVYSFJjZENBcUlFQndZWEpoYlNCN1RtOWtaWDBnY205dmRDQXRJSE53YkdsMElISnZiM1JjYmx4MFhIUWdLaUJBY0dGeVlXMGdlMEp2ZFc1a1lYSjVVRzlwYm5SOUlIQnZhVzUwWEc1Y2RGeDBJQ29nUUhCaGNtRnRJSHRDYjI5c1pXRnVmU0JiYVhOVGEybHdVR0ZrWkdsdVowSnNZVzVyU0ZSTlRGMWNibHgwWEhRZ0tpQkFjbVYwZFhKdUlIdE9iMlJsZlNCeWFXZG9kQ0J1YjJSbElHOW1JR0p2ZFc1a1lYSjVVRzlwYm5SY2JseDBYSFFnS2k5Y2JseDBYSFIyWVhJZ2MzQnNhWFJVY21WbElEMGdablZ1WTNScGIyNGdLSEp2YjNRc0lIQnZhVzUwTENCcGMxTnJhWEJRWVdSa2FXNW5RbXhoYm10SVZFMU1LU0I3WEc1Y2RGeDBYSFF2THlCbGVDa2dXeU4wWlhoMExDQThjM0JoYmo0c0lEeHdQbDFjYmx4MFhIUmNkSFpoY2lCaGJtTmxjM1J2Y25NZ1BTQnNhWE4wUVc1alpYTjBiM0lvY0c5cGJuUXVibTlrWlN3Z1puVnVZeTVsY1NoeWIyOTBLU2s3WEc1Y2JseDBYSFJjZEdsbUlDZ2hZVzVqWlhOMGIzSnpMbXhsYm1kMGFDa2dlMXh1WEhSY2RGeDBYSFJ5WlhSMWNtNGdiblZzYkR0Y2JseDBYSFJjZEgwZ1pXeHpaU0JwWmlBb1lXNWpaWE4wYjNKekxteGxibWQwYUNBOVBUMGdNU2tnZTF4dVhIUmNkRngwWEhSeVpYUjFjbTRnYzNCc2FYUk9iMlJsS0hCdmFXNTBMQ0JwYzFOcmFYQlFZV1JrYVc1blFteGhibXRJVkUxTUtUdGNibHgwWEhSY2RIMWNibHh1WEhSY2RGeDBjbVYwZFhKdUlHRnVZMlZ6ZEc5eWN5NXlaV1IxWTJVb1puVnVZM1JwYjI0Z0tHNXZaR1VzSUhCaGNtVnVkQ2tnZTF4dVhIUmNkRngwWEhSMllYSWdZMnh2Ym1VZ1BTQnBibk5sY25SQlpuUmxjaWh3WVhKbGJuUXVZMnh2Ym1WT2IyUmxLR1poYkhObEtTd2djR0Z5Wlc1MEtUdGNibHh1WEhSY2RGeDBYSFJwWmlBb2JtOWtaU0E5UFQwZ2NHOXBiblF1Ym05a1pTa2dlMXh1WEhSY2RGeDBYSFJjZEc1dlpHVWdQU0J6Y0d4cGRFNXZaR1VvY0c5cGJuUXNJR2x6VTJ0cGNGQmhaR1JwYm1kQ2JHRnVhMGhVVFV3cE8xeHVYSFJjZEZ4MFhIUjlYRzVjYmx4MFhIUmNkRngwWVhCd1pXNWtRMmhwYkdST2IyUmxjeWhqYkc5dVpTd2diR2x6ZEU1bGVIUW9ibTlrWlNrcE8xeHVYRzVjZEZ4MFhIUmNkR2xtSUNnaGFYTlRhMmx3VUdGa1pHbHVaMEpzWVc1clNGUk5UQ2tnZTF4dVhIUmNkRngwWEhSY2RIQmhaR1JwYm1kQ2JHRnVhMGhVVFV3b2NHRnlaVzUwS1R0Y2JseDBYSFJjZEZ4MFhIUndZV1JrYVc1blFteGhibXRJVkUxTUtHTnNiMjVsS1R0Y2JseDBYSFJjZEZ4MGZWeHVYSFJjZEZ4MFhIUnlaWFIxY200Z1kyeHZibVU3WEc1Y2RGeDBYSFI5S1R0Y2JseDBYSFI5TzF4dVhHNWNkRngwTHlvcVhHNWNkRngwSUNvZ2MzQnNhWFFnY0c5cGJuUmNibHgwWEhRZ0tseHVYSFJjZENBcUlFQndZWEpoYlNCN1VHOXBiblI5SUhCdmFXNTBYRzVjZEZ4MElDb2dRSEJoY21GdElIdENiMjlzWldGdWZTQnBjMGx1YkdsdVpWeHVYSFJjZENBcUlFQnlaWFIxY200Z2UwOWlhbVZqZEgxY2JseDBYSFFnS2k5Y2JseDBYSFIyWVhJZ2MzQnNhWFJRYjJsdWRDQTlJR1oxYm1OMGFXOXVJQ2h3YjJsdWRDd2dhWE5KYm14cGJtVXBJSHRjYmx4MFhIUmNkQzh2SUdacGJtUWdjM0JzYVhSU2IyOTBMQ0JqYjI1MFlXbHVaWEpjYmx4MFhIUmNkQzh2SUNBdElHbHViR2x1WlRvZ2MzQnNhWFJTYjI5MElHbHpJR0VnWTJocGJHUWdiMllnY0dGeVlXZHlZWEJvWEc1Y2RGeDBYSFF2THlBZ0xTQmliRzlqYXpvZ2MzQnNhWFJTYjI5MElHbHpJR0VnWTJocGJHUWdiMllnWW05a2VVTnZiblJoYVc1bGNseHVYSFJjZEZ4MGRtRnlJSEJ5WldRZ1BTQnBjMGx1YkdsdVpTQS9JR2x6VUdGeVlTQTZJR2x6UW05a2VVTnZiblJoYVc1bGNqdGNibHgwWEhSY2RIWmhjaUJoYm1ObGMzUnZjbk1nUFNCc2FYTjBRVzVqWlhOMGIzSW9jRzlwYm5RdWJtOWtaU3dnY0hKbFpDazdYRzVjZEZ4MFhIUjJZWElnZEc5d1FXNWpaWE4wYjNJZ1BTQnNhWE4wTG14aGMzUW9ZVzVqWlhOMGIzSnpLU0I4ZkNCd2IybHVkQzV1YjJSbE8xeHVYRzVjZEZ4MFhIUjJZWElnYzNCc2FYUlNiMjkwTENCamIyNTBZV2x1WlhJN1hHNWNkRngwWEhScFppQW9jSEpsWkNoMGIzQkJibU5sYzNSdmNpa3BJSHRjYmx4MFhIUmNkRngwYzNCc2FYUlNiMjkwSUQwZ1lXNWpaWE4wYjNKelcyRnVZMlZ6ZEc5eWN5NXNaVzVuZEdnZ0xTQXlYVHRjYmx4MFhIUmNkRngwWTI5dWRHRnBibVZ5SUQwZ2RHOXdRVzVqWlhOMGIzSTdYRzVjZEZ4MFhIUjlJR1ZzYzJVZ2UxeHVYSFJjZEZ4MFhIUnpjR3hwZEZKdmIzUWdQU0IwYjNCQmJtTmxjM1J2Y2p0Y2JseDBYSFJjZEZ4MFkyOXVkR0ZwYm1WeUlEMGdjM0JzYVhSU2IyOTBMbkJoY21WdWRFNXZaR1U3WEc1Y2RGeDBYSFI5WEc1Y2JseDBYSFJjZEM4dklITndiR2wwSUhkcGRHZ2djM0JzYVhSVWNtVmxYRzVjZEZ4MFhIUjJZWElnY0dsMmIzUWdQU0J6Y0d4cGRGSnZiM1FnSmlZZ2MzQnNhWFJVY21WbEtITndiR2wwVW05dmRDd2djRzlwYm5Rc0lHbHpTVzVzYVc1bEtUdGNibHh1WEhSY2RGeDBjbVYwZFhKdUlIdGNibHgwWEhSY2RGeDBjbWxuYUhST2IyUmxPaUJ3YVhadmRDeGNibHgwWEhSY2RGeDBZMjl1ZEdGcGJtVnlPaUJqYjI1MFlXbHVaWEpjYmx4MFhIUmNkSDA3WEc1Y2RGeDBmVHRjYmx4dVhIUmNkSFpoY2lCamNtVmhkR1VnUFNCbWRXNWpkR2x2YmlBb2JtOWtaVTVoYldVcElIdGNibHgwWEhSY2RISmxkSFZ5YmlCa2IyTjFiV1Z1ZEM1amNtVmhkR1ZGYkdWdFpXNTBLRzV2WkdWT1lXMWxLVHRjYmx4MFhIUjlPMXh1WEc1Y2RGeDBkbUZ5SUdOeVpXRjBaVlJsZUhRZ1BTQm1kVzVqZEdsdmJpQW9kR1Y0ZENrZ2UxeHVYSFJjZEZ4MGNtVjBkWEp1SUdSdlkzVnRaVzUwTG1OeVpXRjBaVlJsZUhST2IyUmxLSFJsZUhRcE8xeHVYSFJjZEgwN1hHNWNibHgwWEhRdktpcGNibHgwWEhRZ0tpQkFiV1YwYUc5a0lISmxiVzkyWlZ4dVhIUmNkQ0FxWEc1Y2RGeDBJQ29nY21WdGIzWmxJRzV2WkdVc0lDaHBjMUpsYlc5MlpVTm9hV3hrT2lCeVpXMXZkbVVnWTJocGJHUWdiM0lnYm05MEtWeHVYSFJjZENBcVhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0T2IyUmxmU0J1YjJSbFhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0Q2IyOXNaV0Z1ZlNCcGMxSmxiVzkyWlVOb2FXeGtYRzVjZEZ4MElDb3ZYRzVjZEZ4MGRtRnlJSEpsYlc5MlpTQTlJR1oxYm1OMGFXOXVJQ2h1YjJSbExDQnBjMUpsYlc5MlpVTm9hV3hrS1NCN1hHNWNkRngwWEhScFppQW9JVzV2WkdVZ2ZId2dJVzV2WkdVdWNHRnlaVzUwVG05a1pTa2dleUJ5WlhSMWNtNDdJSDFjYmx4MFhIUmNkR2xtSUNodWIyUmxMbkpsYlc5MlpVNXZaR1VwSUhzZ2NtVjBkWEp1SUc1dlpHVXVjbVZ0YjNabFRtOWtaU2hwYzFKbGJXOTJaVU5vYVd4a0tUc2dmVnh1WEc1Y2RGeDBYSFIyWVhJZ2NHRnlaVzUwSUQwZ2JtOWtaUzV3WVhKbGJuUk9iMlJsTzF4dVhIUmNkRngwYVdZZ0tDRnBjMUpsYlc5MlpVTm9hV3hrS1NCN1hHNWNkRngwWEhSY2RIWmhjaUJ1YjJSbGN5QTlJRnRkTzF4dVhIUmNkRngwWEhSMllYSWdhU3dnYkdWdU8xeHVYSFJjZEZ4MFhIUm1iM0lnS0drZ1BTQXdMQ0JzWlc0Z1BTQnViMlJsTG1Ob2FXeGtUbTlrWlhNdWJHVnVaM1JvT3lCcElEd2diR1Z1T3lCcEt5c3BJSHRjYmx4MFhIUmNkRngwWEhSdWIyUmxjeTV3ZFhOb0tHNXZaR1V1WTJocGJHUk9iMlJsYzF0cFhTazdYRzVjZEZ4MFhIUmNkSDFjYmx4dVhIUmNkRngwWEhSbWIzSWdLR2tnUFNBd0xDQnNaVzRnUFNCdWIyUmxjeTVzWlc1bmRHZzdJR2tnUENCc1pXNDdJR2tyS3lrZ2UxeHVYSFJjZEZ4MFhIUmNkSEJoY21WdWRDNXBibk5sY25SQ1pXWnZjbVVvYm05a1pYTmJhVjBzSUc1dlpHVXBPMXh1WEhSY2RGeDBYSFI5WEc1Y2RGeDBYSFI5WEc1Y2JseDBYSFJjZEhCaGNtVnVkQzV5WlcxdmRtVkRhR2xzWkNodWIyUmxLVHRjYmx4MFhIUjlPMXh1WEc1Y2RGeDBMeW9xWEc1Y2RGeDBJQ29nUUcxbGRHaHZaQ0J5WlcxdmRtVlhhR2xzWlZ4dVhIUmNkQ0FxWEc1Y2RGeDBJQ29nUUhCaGNtRnRJSHRPYjJSbGZTQnViMlJsWEc1Y2RGeDBJQ29nUUhCaGNtRnRJSHRHZFc1amRHbHZibjBnY0hKbFpGeHVYSFJjZENBcUwxeHVYSFJjZEhaaGNpQnlaVzF2ZG1WWGFHbHNaU0E5SUdaMWJtTjBhVzl1SUNodWIyUmxMQ0J3Y21Wa0tTQjdYRzVjZEZ4MFhIUjNhR2xzWlNBb2JtOWtaU2tnZTF4dVhIUmNkRngwWEhScFppQW9hWE5GWkdsMFlXSnNaU2h1YjJSbEtTQjhmQ0FoY0hKbFpDaHViMlJsS1NrZ2UxeHVYSFJjZEZ4MFhIUmNkR0p5WldGck8xeHVYSFJjZEZ4MFhIUjlYRzVjYmx4MFhIUmNkRngwZG1GeUlIQmhjbVZ1ZENBOUlHNXZaR1V1Y0dGeVpXNTBUbTlrWlR0Y2JseDBYSFJjZEZ4MGNtVnRiM1psS0c1dlpHVXBPMXh1WEhSY2RGeDBYSFJ1YjJSbElEMGdjR0Z5Wlc1ME8xeHVYSFJjZEZ4MGZWeHVYSFJjZEgwN1hHNWNibHgwWEhRdktpcGNibHgwWEhRZ0tpQkFiV1YwYUc5a0lISmxjR3hoWTJWY2JseDBYSFFnS2x4dVhIUmNkQ0FxSUhKbGNHeGhZMlVnYm05a1pTQjNhWFJvSUhCeWIzWnBaR1ZrSUc1dlpHVk9ZVzFsWEc1Y2RGeDBJQ3BjYmx4MFhIUWdLaUJBY0dGeVlXMGdlMDV2WkdWOUlHNXZaR1ZjYmx4MFhIUWdLaUJBY0dGeVlXMGdlMU4wY21sdVozMGdibTlrWlU1aGJXVmNibHgwWEhRZ0tpQkFjbVYwZFhKdUlIdE9iMlJsZlNBdElHNWxkeUJ1YjJSbFhHNWNkRngwSUNvdlhHNWNkRngwZG1GeUlISmxjR3hoWTJVZ1BTQm1kVzVqZEdsdmJpQW9ibTlrWlN3Z2JtOWtaVTVoYldVcElIdGNibHgwWEhSY2RHbG1JQ2h1YjJSbExtNXZaR1ZPWVcxbExuUnZWWEJ3WlhKRFlYTmxLQ2tnUFQwOUlHNXZaR1ZPWVcxbExuUnZWWEJ3WlhKRFlYTmxLQ2twSUh0Y2JseDBYSFJjZEZ4MGNtVjBkWEp1SUc1dlpHVTdYRzVjZEZ4MFhIUjlYRzVjYmx4MFhIUmNkSFpoY2lCdVpYZE9iMlJsSUQwZ1kzSmxZWFJsS0c1dlpHVk9ZVzFsS1R0Y2JseHVYSFJjZEZ4MGFXWWdLRzV2WkdVdWMzUjViR1V1WTNOelZHVjRkQ2tnZTF4dVhIUmNkRngwWEhSdVpYZE9iMlJsTG5OMGVXeGxMbU56YzFSbGVIUWdQU0J1YjJSbExuTjBlV3hsTG1OemMxUmxlSFE3WEc1Y2RGeDBYSFI5WEc1Y2JseDBYSFJjZEdGd2NHVnVaRU5vYVd4a1RtOWtaWE1vYm1WM1RtOWtaU3dnYkdsemRDNW1jbTl0S0c1dlpHVXVZMmhwYkdST2IyUmxjeWtwTzF4dVhIUmNkRngwYVc1elpYSjBRV1owWlhJb2JtVjNUbTlrWlN3Z2JtOWtaU2s3WEc1Y2RGeDBYSFJ5WlcxdmRtVW9ibTlrWlNrN1hHNWNibHgwWEhSY2RISmxkSFZ5YmlCdVpYZE9iMlJsTzF4dVhIUmNkSDA3WEc1Y2JseDBYSFIyWVhJZ2FYTlVaWGgwWVhKbFlTQTlJRzFoYTJWUWNtVmtRbmxPYjJSbFRtRnRaU2duVkVWWVZFRlNSVUVuS1R0Y2JseHVYSFJjZEM4cUtseHVYSFJjZENBcUlFQnRaWFJvYjJRZ2FIUnRiRnh1WEhSY2RDQXFYRzVjZEZ4MElDb2daMlYwSUhSb1pTQklWRTFNSUdOdmJuUmxiblJ6SUc5bUlHNXZaR1ZjYmx4MFhIUWdLbHh1WEhSY2RDQXFJRUJ3WVhKaGJTQjdhbEYxWlhKNWZTQWtibTlrWlZ4dVhIUmNkQ0FxSUVCd1lYSmhiU0I3UW05dmJHVmhibjBnVzJselRtVjNiR2x1WlU5dVFteHZZMnRkWEc1Y2RGeDBJQ292WEc1Y2RGeDBkbUZ5SUdoMGJXd2dQU0JtZFc1amRHbHZiaUFvSkc1dlpHVXNJR2x6VG1WM2JHbHVaVTl1UW14dlkyc3BJSHRjYmx4MFhIUmNkSFpoY2lCdFlYSnJkWEFnUFNCcGMxUmxlSFJoY21WaEtDUnViMlJsV3pCZEtTQS9JQ1J1YjJSbExuWmhiQ2dwSURvZ0pHNXZaR1V1YUhSdGJDZ3BPMXh1WEc1Y2RGeDBYSFJwWmlBb2FYTk9aWGRzYVc1bFQyNUNiRzlqYXlrZ2UxeHVYSFJjZEZ4MFhIUjJZWElnY21WblpYaFVZV2NnUFNBdlBDaGNYQzgvS1NoY1hHSW9QeUVoS1Z0ZVBseGNjMTBxS1NndUtqOHBLRnhjY3lwY1hDOC9QaWt2Wnp0Y2JseDBYSFJjZEZ4MGJXRnlhM1Z3SUQwZ2JXRnlhM1Z3TG5KbGNHeGhZMlVvY21WblpYaFVZV2NzSUdaMWJtTjBhVzl1SUNodFlYUmphQ3dnWlc1a1UyeGhjMmdzSUc1aGJXVXBJSHRjYmx4MFhIUmNkRngwWEhSdVlXMWxJRDBnYm1GdFpTNTBiMVZ3Y0dWeVEyRnpaU2dwTzF4dVhIUmNkRngwWEhSY2RIWmhjaUJwYzBWdVpFOW1TVzVzYVc1bFEyOXVkR0ZwYm1WeUlEMGdMMTVFU1ZaOFhsUkVmRjVVU0h4ZVVIeGVURWw4WGtoYk1TMDNYUzh1ZEdWemRDaHVZVzFsS1NBbUpseHVYSFJjZEZ4MFhIUmNkRngwWEhSY2RGeDBYSFJjZEZ4MElDRWhaVzVrVTJ4aGMyZzdYRzVjZEZ4MFhIUmNkRngwZG1GeUlHbHpRbXh2WTJ0T2IyUmxJRDBnTDE1Q1RFOURTMUZWVDFSRmZGNVVRVUpNUlh4ZVZFSlBSRmw4WGxSU2ZGNUlVbnhlVlV4OFhrOU1MeTUwWlhOMEtHNWhiV1VwTzF4dVhHNWNkRngwWEhSY2RGeDBjbVYwZFhKdUlHMWhkR05vSUNzZ0tDaHBjMFZ1WkU5bVNXNXNhVzVsUTI5dWRHRnBibVZ5SUh4OElHbHpRbXh2WTJ0T2IyUmxLU0EvSUNkY1hHNG5JRG9nSnljcE8xeHVYSFJjZEZ4MFhIUjlLVHRjYmx4MFhIUmNkRngwYldGeWEzVndJRDBnSkM1MGNtbHRLRzFoY210MWNDazdYRzVjZEZ4MFhIUjlYRzVjYmx4MFhIUmNkSEpsZEhWeWJpQnRZWEpyZFhBN1hHNWNkRngwZlR0Y2JseHVYSFJjZEhaaGNpQjJZV3gxWlNBOUlHWjFibU4wYVc5dUlDZ2tkR1Y0ZEdGeVpXRXNJSE4wY21sd1RHbHVaV0p5WldGcmN5a2dlMXh1WEhSY2RGeDBkbUZ5SUhaaGJDQTlJQ1IwWlhoMFlYSmxZUzUyWVd3b0tUdGNibHgwWEhSY2RHbG1JQ2h6ZEhKcGNFeHBibVZpY21WaGEzTXBJSHRjYmx4MFhIUmNkRngwY21WMGRYSnVJSFpoYkM1eVpYQnNZV05sS0M5YlhGeHVYRnh5WFM5bkxDQW5KeWs3WEc1Y2RGeDBYSFI5WEc1Y2RGeDBYSFJ5WlhSMWNtNGdkbUZzTzF4dVhIUmNkSDA3WEc1Y2JseDBYSFJ5WlhSMWNtNGdlMXh1WEhSY2RGeDBMeW9xSUVCd2NtOXdaWEowZVNCN1UzUnlhVzVuZlNCT1FsTlFYME5JUVZJZ0tpOWNibHgwWEhSY2RFNUNVMUJmUTBoQlVqb2dUa0pUVUY5RFNFRlNMRnh1WEhSY2RGeDBMeW9xSUVCd2NtOXdaWEowZVNCN1UzUnlhVzVuZlNCYVJWSlBYMWRKUkZSSVgwNUNVMUJmUTBoQlVpQXFMMXh1WEhSY2RGeDBXa1ZTVDE5WFNVUlVTRjlPUWxOUVgwTklRVkk2SUZwRlVrOWZWMGxFVkVoZlRrSlRVRjlEU0VGU0xGeHVYSFJjZEZ4MEx5b3FJRUJ3Y205d1pYSjBlU0I3VTNSeWFXNW5mU0JpYkdGdWF5QXFMMXh1WEhSY2RGeDBZbXhoYm1zNklHSnNZVzVyU0ZSTlRDeGNibHgwWEhSY2RDOHFLaUJBY0hKdmNHVnlkSGtnZTFOMGNtbHVaMzBnWlcxd2RIbFFZWEpoSUNvdlhHNWNkRngwWEhSbGJYQjBlVkJoY21FNklDYzhjRDRuSUNzZ1lteGhibXRJVkUxTUlDc2dKend2Y0Q0bkxGeHVYSFJjZEZ4MGJXRnJaVkJ5WldSQ2VVNXZaR1ZPWVcxbE9pQnRZV3RsVUhKbFpFSjVUbTlrWlU1aGJXVXNYRzVjZEZ4MFhIUnBjMFZrYVhSaFlteGxPaUJwYzBWa2FYUmhZbXhsTEZ4dVhIUmNkRngwYVhORGIyNTBjbTlzVTJsNmFXNW5PaUJwYzBOdmJuUnliMnhUYVhwcGJtY3NYRzVjZEZ4MFhIUmlkV2xzWkV4aGVXOTFkRWx1Wm04NklHSjFhV3hrVEdGNWIzVjBTVzVtYnl4Y2JseDBYSFJjZEcxaGEyVk1ZWGx2ZFhSSmJtWnZPaUJ0WVd0bFRHRjViM1YwU1c1bWJ5eGNibHgwWEhSY2RHbHpWR1Y0ZERvZ2FYTlVaWGgwTEZ4dVhIUmNkRngwYVhOV2IybGtPaUJwYzFadmFXUXNYRzVjZEZ4MFhIUnBjMUJoY21FNklHbHpVR0Z5WVN4Y2JseDBYSFJjZEdselVIVnlaVkJoY21FNklHbHpVSFZ5WlZCaGNtRXNYRzVjZEZ4MFhIUnBjMGx1YkdsdVpUb2dhWE5KYm14cGJtVXNYRzVjZEZ4MFhIUnBjMEp2WkhsSmJteHBibVU2SUdselFtOWtlVWx1YkdsdVpTeGNibHgwWEhSY2RHbHpRbTlrZVRvZ2FYTkNiMlI1TEZ4dVhIUmNkRngwYVhOUVlYSmhTVzVzYVc1bE9pQnBjMUJoY21GSmJteHBibVVzWEc1Y2RGeDBYSFJwYzB4cGMzUTZJR2x6VEdsemRDeGNibHgwWEhSY2RHbHpWR0ZpYkdVNklHbHpWR0ZpYkdVc1hHNWNkRngwWEhScGMwTmxiR3c2SUdselEyVnNiQ3hjYmx4MFhIUmNkR2x6UW14dlkydHhkVzkwWlRvZ2FYTkNiRzlqYTNGMWIzUmxMRnh1WEhSY2RGeDBhWE5DYjJSNVEyOXVkR0ZwYm1WeU9pQnBjMEp2WkhsRGIyNTBZV2x1WlhJc1hHNWNkRngwWEhScGMwRnVZMmh2Y2pvZ2FYTkJibU5vYjNJc1hHNWNkRngwWEhScGMwUnBkam9nYldGclpWQnlaV1JDZVU1dlpHVk9ZVzFsS0NkRVNWWW5LU3hjYmx4MFhIUmNkR2x6VEdrNklHbHpUR2tzWEc1Y2RGeDBYSFJwYzBKU09pQnRZV3RsVUhKbFpFSjVUbTlrWlU1aGJXVW9KMEpTSnlrc1hHNWNkRngwWEhScGMxTndZVzQ2SUcxaGEyVlFjbVZrUW5sT2IyUmxUbUZ0WlNnblUxQkJUaWNwTEZ4dVhIUmNkRngwYVhOQ09pQnRZV3RsVUhKbFpFSjVUbTlrWlU1aGJXVW9KMEluS1N4Y2JseDBYSFJjZEdselZUb2diV0ZyWlZCeVpXUkNlVTV2WkdWT1lXMWxLQ2RWSnlrc1hHNWNkRngwWEhScGMxTTZJRzFoYTJWUWNtVmtRbmxPYjJSbFRtRnRaU2duVXljcExGeHVYSFJjZEZ4MGFYTkpPaUJ0WVd0bFVISmxaRUo1VG05a1pVNWhiV1VvSjBrbktTeGNibHgwWEhSY2RHbHpTVzFuT2lCdFlXdGxVSEpsWkVKNVRtOWtaVTVoYldVb0owbE5SeWNwTEZ4dVhIUmNkRngwYVhOVVpYaDBZWEpsWVRvZ2FYTlVaWGgwWVhKbFlTeGNibHgwWEhSY2RHbHpSVzF3ZEhrNklHbHpSVzF3ZEhrc1hHNWNkRngwWEhScGMwVnRjSFI1UVc1amFHOXlPaUJtZFc1akxtRnVaQ2hwYzBGdVkyaHZjaXdnYVhORmJYQjBlU2tzWEc1Y2RGeDBYSFJwYzBOc2IzTmxjM1JUYVdKc2FXNW5PaUJwYzBOc2IzTmxjM1JUYVdKc2FXNW5MRnh1WEhSY2RGeDBkMmwwYUVOc2IzTmxjM1JUYVdKc2FXNW5jem9nZDJsMGFFTnNiM05sYzNSVGFXSnNhVzVuY3l4Y2JseDBYSFJjZEc1dlpHVk1aVzVuZEdnNklHNXZaR1ZNWlc1bmRHZ3NYRzVjZEZ4MFhIUnBjMHhsWm5SRlpHZGxVRzlwYm5RNklHbHpUR1ZtZEVWa1oyVlFiMmx1ZEN4Y2JseDBYSFJjZEdselVtbG5hSFJGWkdkbFVHOXBiblE2SUdselVtbG5hSFJGWkdkbFVHOXBiblFzWEc1Y2RGeDBYSFJwYzBWa1oyVlFiMmx1ZERvZ2FYTkZaR2RsVUc5cGJuUXNYRzVjZEZ4MFhIUnBjMHhsWm5SRlpHZGxUMlk2SUdselRHVm1kRVZrWjJWUFppeGNibHgwWEhSY2RHbHpVbWxuYUhSRlpHZGxUMlk2SUdselVtbG5hSFJGWkdkbFQyWXNYRzVjZEZ4MFhIUndjbVYyVUc5cGJuUTZJSEJ5WlhaUWIybHVkQ3hjYmx4MFhIUmNkRzVsZUhSUWIybHVkRG9nYm1WNGRGQnZhVzUwTEZ4dVhIUmNkRngwYVhOVFlXMWxVRzlwYm5RNklHbHpVMkZ0WlZCdmFXNTBMRnh1WEhSY2RGeDBhWE5XYVhOcFlteGxVRzlwYm5RNklHbHpWbWx6YVdKc1pWQnZhVzUwTEZ4dVhIUmNkRngwY0hKbGRsQnZhVzUwVlc1MGFXdzZJSEJ5WlhaUWIybHVkRlZ1ZEdsc0xGeHVYSFJjZEZ4MGJtVjRkRkJ2YVc1MFZXNTBhV3c2SUc1bGVIUlFiMmx1ZEZWdWRHbHNMRnh1WEhSY2RGeDBkMkZzYTFCdmFXNTBPaUIzWVd4clVHOXBiblFzWEc1Y2RGeDBYSFJoYm1ObGMzUnZjam9nWVc1alpYTjBiM0lzWEc1Y2RGeDBYSFJ6YVc1bmJHVkRhR2xzWkVGdVkyVnpkRzl5T2lCemFXNW5iR1ZEYUdsc1pFRnVZMlZ6ZEc5eUxGeHVYSFJjZEZ4MGJHbHpkRUZ1WTJWemRHOXlPaUJzYVhOMFFXNWpaWE4wYjNJc1hHNWNkRngwWEhSc1lYTjBRVzVqWlhOMGIzSTZJR3hoYzNSQmJtTmxjM1J2Y2l4Y2JseDBYSFJjZEd4cGMzUk9aWGgwT2lCc2FYTjBUbVY0ZEN4Y2JseDBYSFJjZEd4cGMzUlFjbVYyT2lCc2FYTjBVSEpsZGl4Y2JseDBYSFJjZEd4cGMzUkVaWE5qWlc1a1lXNTBPaUJzYVhOMFJHVnpZMlZ1WkdGdWRDeGNibHgwWEhSY2RHTnZiVzF2YmtGdVkyVnpkRzl5T2lCamIyMXRiMjVCYm1ObGMzUnZjaXhjYmx4MFhIUmNkSGR5WVhBNklIZHlZWEFzWEc1Y2RGeDBYSFJwYm5ObGNuUkJablJsY2pvZ2FXNXpaWEowUVdaMFpYSXNYRzVjZEZ4MFhIUmhjSEJsYm1SRGFHbHNaRTV2WkdWek9pQmhjSEJsYm1SRGFHbHNaRTV2WkdWekxGeHVYSFJjZEZ4MGNHOXphWFJwYjI0NklIQnZjMmwwYVc5dUxGeHVYSFJjZEZ4MGFHRnpRMmhwYkdSeVpXNDZJR2hoYzBOb2FXeGtjbVZ1TEZ4dVhIUmNkRngwYldGclpVOW1abk5sZEZCaGRHZzZJRzFoYTJWUFptWnpaWFJRWVhSb0xGeHVYSFJjZEZ4MFpuSnZiVTltWm5ObGRGQmhkR2c2SUdaeWIyMVBabVp6WlhSUVlYUm9MRnh1WEhSY2RGeDBjM0JzYVhSVWNtVmxPaUJ6Y0d4cGRGUnlaV1VzWEc1Y2RGeDBYSFJ6Y0d4cGRGQnZhVzUwT2lCemNHeHBkRkJ2YVc1MExGeHVYSFJjZEZ4MFkzSmxZWFJsT2lCamNtVmhkR1VzWEc1Y2RGeDBYSFJqY21WaGRHVlVaWGgwT2lCamNtVmhkR1ZVWlhoMExGeHVYSFJjZEZ4MGNtVnRiM1psT2lCeVpXMXZkbVVzWEc1Y2RGeDBYSFJ5WlcxdmRtVlhhR2xzWlRvZ2NtVnRiM1psVjJocGJHVXNYRzVjZEZ4MFhIUnlaWEJzWVdObE9pQnlaWEJzWVdObExGeHVYSFJjZEZ4MGFIUnRiRG9nYUhSdGJDeGNibHgwWEhSY2RIWmhiSFZsT2lCMllXeDFaVnh1WEhSY2RIMDdYRzVjZEgwcEtDazdYRzVjYmx4dVhIUjJZWElnY21GdVoyVWdQU0FvWm5WdVkzUnBiMjRnS0NrZ2UxeHVYRzVjZEZ4MEx5b3FYRzVjZEZ4MElDb2djbVYwZFhKdUlHSnZkVzVrWVhKNVVHOXBiblFnWm5KdmJTQlVaWGgwVW1GdVoyVXNJR2x1YzNCcGNtVmtJR0o1SUVGdVpIa2dUbUVuY3lCSWRYTnJlVkpoYm1kbExtcHpYRzVjZEZ4MElDcGNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UxUmxlSFJTWVc1blpYMGdkR1Y0ZEZKaGJtZGxYRzVjZEZ4MElDb2dRSEJoY21GdElIdENiMjlzWldGdWZTQnBjMU4wWVhKMFhHNWNkRngwSUNvZ1FISmxkSFZ5YmlCN1FtOTFibVJoY25sUWIybHVkSDFjYmx4MFhIUWdLbHh1WEhSY2RDQXFJRUJ6WldVZ2FIUjBjRG92TDIxelpHNHViV2xqY205emIyWjBMbU52YlM5bGJpMTFjeTlzYVdKeVlYSjVMMmxsTDIxek5UTTFPRGN5S0hZOWRuTXVPRFVwTG1GemNIaGNibHgwWEhRZ0tpOWNibHgwWEhSMllYSWdkR1Y0ZEZKaGJtZGxWRzlRYjJsdWRDQTlJR1oxYm1OMGFXOXVJQ2gwWlhoMFVtRnVaMlVzSUdselUzUmhjblFwSUh0Y2JseDBYSFJjZEhaaGNpQmpiMjUwWVdsdVpYSWdQU0IwWlhoMFVtRnVaMlV1Y0dGeVpXNTBSV3hsYldWdWRDZ3BMQ0J2Wm1aelpYUTdYRzVjYmx4MFhIUmNkSFpoY2lCMFpYTjBaWElnUFNCa2IyTjFiV1Z1ZEM1aWIyUjVMbU55WldGMFpWUmxlSFJTWVc1blpTZ3BMQ0J3Y21WMlEyOXVkR0ZwYm1WeU8xeHVYSFJjZEZ4MGRtRnlJR05vYVd4a1RtOWtaWE1nUFNCc2FYTjBMbVp5YjIwb1kyOXVkR0ZwYm1WeUxtTm9hV3hrVG05a1pYTXBPMXh1WEhSY2RGeDBabTl5SUNodlptWnpaWFFnUFNBd095QnZabVp6WlhRZ1BDQmphR2xzWkU1dlpHVnpMbXhsYm1kMGFEc2diMlptYzJWMEt5c3BJSHRjYmx4MFhIUmNkRngwYVdZZ0tHUnZiUzVwYzFSbGVIUW9ZMmhwYkdST2IyUmxjMXR2Wm1aelpYUmRLU2tnZTF4dVhIUmNkRngwWEhSY2RHTnZiblJwYm5WbE8xeHVYSFJjZEZ4MFhIUjlYRzVjZEZ4MFhIUmNkSFJsYzNSbGNpNXRiM1psVkc5RmJHVnRaVzUwVkdWNGRDaGphR2xzWkU1dlpHVnpXMjltWm5ObGRGMHBPMXh1WEhSY2RGeDBYSFJwWmlBb2RHVnpkR1Z5TG1OdmJYQmhjbVZGYm1SUWIybHVkSE1vSjFOMFlYSjBWRzlUZEdGeWRDY3NJSFJsZUhSU1lXNW5aU2tnUGowZ01Da2dlMXh1WEhSY2RGeDBYSFJjZEdKeVpXRnJPMXh1WEhSY2RGeDBYSFI5WEc1Y2RGeDBYSFJjZEhCeVpYWkRiMjUwWVdsdVpYSWdQU0JqYUdsc1pFNXZaR1Z6VzI5bVpuTmxkRjA3WEc1Y2RGeDBYSFI5WEc1Y2JseDBYSFJjZEdsbUlDaHZabVp6WlhRZ0lUMDlJREFnSmlZZ1pHOXRMbWx6VkdWNGRDaGphR2xzWkU1dlpHVnpXMjltWm5ObGRDQXRJREZkS1NrZ2UxeHVYSFJjZEZ4MFhIUjJZWElnZEdWNGRGSmhibWRsVTNSaGNuUWdQU0JrYjJOMWJXVnVkQzVpYjJSNUxtTnlaV0YwWlZSbGVIUlNZVzVuWlNncExDQmpkWEpVWlhoMFRtOWtaU0E5SUc1MWJHdzdYRzVjZEZ4MFhIUmNkSFJsZUhSU1lXNW5aVk4wWVhKMExtMXZkbVZVYjBWc1pXMWxiblJVWlhoMEtIQnlaWFpEYjI1MFlXbHVaWElnZkh3Z1kyOXVkR0ZwYm1WeUtUdGNibHgwWEhSY2RGeDBkR1Y0ZEZKaGJtZGxVM1JoY25RdVkyOXNiR0Z3YzJVb0lYQnlaWFpEYjI1MFlXbHVaWElwTzF4dVhIUmNkRngwWEhSamRYSlVaWGgwVG05a1pTQTlJSEJ5WlhaRGIyNTBZV2x1WlhJZ1B5QndjbVYyUTI5dWRHRnBibVZ5TG01bGVIUlRhV0pzYVc1bklEb2dZMjl1ZEdGcGJtVnlMbVpwY25OMFEyaHBiR1E3WEc1Y2JseDBYSFJjZEZ4MGRtRnlJSEJ2YVc1MFZHVnpkR1Z5SUQwZ2RHVjRkRkpoYm1kbExtUjFjR3hwWTJGMFpTZ3BPMXh1WEhSY2RGeDBYSFJ3YjJsdWRGUmxjM1JsY2k1elpYUkZibVJRYjJsdWRDZ25VM1JoY25SVWIxTjBZWEowSnl3Z2RHVjRkRkpoYm1kbFUzUmhjblFwTzF4dVhIUmNkRngwWEhSMllYSWdkR1Y0ZEVOdmRXNTBJRDBnY0c5cGJuUlVaWE4wWlhJdWRHVjRkQzV5WlhCc1lXTmxLQzliWEZ4eVhGeHVYUzluTENBbkp5a3ViR1Z1WjNSb08xeHVYRzVjZEZ4MFhIUmNkSGRvYVd4bElDaDBaWGgwUTI5MWJuUWdQaUJqZFhKVVpYaDBUbTlrWlM1dWIyUmxWbUZzZFdVdWJHVnVaM1JvSUNZbUlHTjFjbFJsZUhST2IyUmxMbTVsZUhSVGFXSnNhVzVuS1NCN1hHNWNkRngwWEhSY2RGeDBkR1Y0ZEVOdmRXNTBJQzA5SUdOMWNsUmxlSFJPYjJSbExtNXZaR1ZXWVd4MVpTNXNaVzVuZEdnN1hHNWNkRngwWEhSY2RGeDBZM1Z5VkdWNGRFNXZaR1VnUFNCamRYSlVaWGgwVG05a1pTNXVaWGgwVTJsaWJHbHVaenRjYmx4MFhIUmNkRngwZlZ4dVhHNWNkRngwWEhSY2RDOHFJR3B6YUdsdWRDQnBaMjV2Y21VNmMzUmhjblFnS2k5Y2JseDBYSFJjZEZ4MGRtRnlJR1IxYlcxNUlEMGdZM1Z5VkdWNGRFNXZaR1V1Ym05a1pWWmhiSFZsT3lBdkx5QmxibVp2Y21ObElFbEZJSFJ2SUhKbExYSmxabVZ5Wlc1alpTQmpkWEpVWlhoMFRtOWtaU3dnYUdGamExeHVYSFJjZEZ4MFhIUXZLaUJxYzJocGJuUWdhV2R1YjNKbE9tVnVaQ0FxTDF4dVhHNWNkRngwWEhSY2RHbG1JQ2hwYzFOMFlYSjBJQ1ltSUdOMWNsUmxlSFJPYjJSbExtNWxlSFJUYVdKc2FXNW5JQ1ltSUdSdmJTNXBjMVJsZUhRb1kzVnlWR1Y0ZEU1dlpHVXVibVY0ZEZOcFlteHBibWNwSUNZbVhHNWNkRngwWEhSY2RGeDBkR1Y0ZEVOdmRXNTBJRDA5UFNCamRYSlVaWGgwVG05a1pTNXViMlJsVm1Gc2RXVXViR1Z1WjNSb0tTQjdYRzVjZEZ4MFhIUmNkRngwZEdWNGRFTnZkVzUwSUMwOUlHTjFjbFJsZUhST2IyUmxMbTV2WkdWV1lXeDFaUzVzWlc1bmRHZzdYRzVjZEZ4MFhIUmNkRngwWTNWeVZHVjRkRTV2WkdVZ1BTQmpkWEpVWlhoMFRtOWtaUzV1WlhoMFUybGliR2x1Wnp0Y2JseDBYSFJjZEZ4MGZWeHVYRzVjZEZ4MFhIUmNkR052Ym5SaGFXNWxjaUE5SUdOMWNsUmxlSFJPYjJSbE8xeHVYSFJjZEZ4MFhIUnZabVp6WlhRZ1BTQjBaWGgwUTI5MWJuUTdYRzVjZEZ4MFhIUjlYRzVjYmx4MFhIUmNkSEpsZEhWeWJpQjdYRzVjZEZ4MFhIUmNkR052Ym5RNklHTnZiblJoYVc1bGNpeGNibHgwWEhSY2RGeDBiMlptYzJWME9pQnZabVp6WlhSY2JseDBYSFJjZEgwN1hHNWNkRngwZlR0Y2JseHVYSFJjZEM4cUtseHVYSFJjZENBcUlISmxkSFZ5YmlCVVpYaDBVbUZ1WjJVZ1puSnZiU0JpYjNWdVpHRnllU0J3YjJsdWRDQW9hVzV6Y0dseVpXUWdZbmtnWjI5dloyeGxJR05zYjNOMWNtVXRiR2xpY21GeWVTbGNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UwSnZkVzVrWVhKNVVHOXBiblI5SUhCdmFXNTBYRzVjZEZ4MElDb2dRSEpsZEhWeWJpQjdWR1Y0ZEZKaGJtZGxmVnh1WEhSY2RDQXFMMXh1WEhSY2RIWmhjaUJ3YjJsdWRGUnZWR1Y0ZEZKaGJtZGxJRDBnWm5WdVkzUnBiMjRnS0hCdmFXNTBLU0I3WEc1Y2RGeDBYSFIyWVhJZ2RHVjRkRkpoYm1kbFNXNW1ieUE5SUdaMWJtTjBhVzl1SUNoamIyNTBZV2x1WlhJc0lHOW1abk5sZENrZ2UxeHVYSFJjZEZ4MFhIUjJZWElnYm05a1pTd2dhWE5EYjJ4c1lYQnpaVlJ2VTNSaGNuUTdYRzVjYmx4MFhIUmNkRngwYVdZZ0tHUnZiUzVwYzFSbGVIUW9ZMjl1ZEdGcGJtVnlLU2tnZTF4dVhIUmNkRngwWEhSY2RIWmhjaUJ3Y21WMlZHVjRkRTV2WkdWeklEMGdaRzl0TG14cGMzUlFjbVYyS0dOdmJuUmhhVzVsY2l3Z1puVnVZeTV1YjNRb1pHOXRMbWx6VkdWNGRDa3BPMXh1WEhSY2RGeDBYSFJjZEhaaGNpQndjbVYyUTI5dWRHRnBibVZ5SUQwZ2JHbHpkQzVzWVhOMEtIQnlaWFpVWlhoMFRtOWtaWE1wTG5CeVpYWnBiM1Z6VTJsaWJHbHVaenRjYmx4MFhIUmNkRngwWEhSdWIyUmxJRDBnY0hKbGRrTnZiblJoYVc1bGNpQjhmQ0JqYjI1MFlXbHVaWEl1Y0dGeVpXNTBUbTlrWlR0Y2JseDBYSFJjZEZ4MFhIUnZabVp6WlhRZ0t6MGdiR2x6ZEM1emRXMG9iR2x6ZEM1MFlXbHNLSEJ5WlhaVVpYaDBUbTlrWlhNcExDQmtiMjB1Ym05a1pVeGxibWQwYUNrN1hHNWNkRngwWEhSY2RGeDBhWE5EYjJ4c1lYQnpaVlJ2VTNSaGNuUWdQU0FoY0hKbGRrTnZiblJoYVc1bGNqdGNibHgwWEhSY2RGeDBmU0JsYkhObElIdGNibHgwWEhSY2RGeDBYSFJ1YjJSbElEMGdZMjl1ZEdGcGJtVnlMbU5vYVd4a1RtOWtaWE5iYjJabWMyVjBYU0I4ZkNCamIyNTBZV2x1WlhJN1hHNWNkRngwWEhSY2RGeDBhV1lnS0dSdmJTNXBjMVJsZUhRb2JtOWtaU2twSUh0Y2JseDBYSFJjZEZ4MFhIUmNkSEpsZEhWeWJpQjBaWGgwVW1GdVoyVkpibVp2S0c1dlpHVXNJREFwTzF4dVhIUmNkRngwWEhSY2RIMWNibHh1WEhSY2RGeDBYSFJjZEc5bVpuTmxkQ0E5SURBN1hHNWNkRngwWEhSY2RGeDBhWE5EYjJ4c1lYQnpaVlJ2VTNSaGNuUWdQU0JtWVd4elpUdGNibHgwWEhSY2RGeDBmVnh1WEc1Y2RGeDBYSFJjZEhKbGRIVnliaUI3WEc1Y2RGeDBYSFJjZEZ4MGJtOWtaVG9nYm05a1pTeGNibHgwWEhSY2RGeDBYSFJqYjJ4c1lYQnpaVlJ2VTNSaGNuUTZJR2x6UTI5c2JHRndjMlZVYjFOMFlYSjBMRnh1WEhSY2RGeDBYSFJjZEc5bVpuTmxkRG9nYjJabWMyVjBYRzVjZEZ4MFhIUmNkSDA3WEc1Y2RGeDBYSFI5TzF4dVhHNWNkRngwWEhSMllYSWdkR1Y0ZEZKaGJtZGxJRDBnWkc5amRXMWxiblF1WW05a2VTNWpjbVZoZEdWVVpYaDBVbUZ1WjJVb0tUdGNibHgwWEhSY2RIWmhjaUJwYm1adklEMGdkR1Y0ZEZKaGJtZGxTVzVtYnlod2IybHVkQzV1YjJSbExDQndiMmx1ZEM1dlptWnpaWFFwTzF4dVhHNWNkRngwWEhSMFpYaDBVbUZ1WjJVdWJXOTJaVlJ2Uld4bGJXVnVkRlJsZUhRb2FXNW1ieTV1YjJSbEtUdGNibHgwWEhSY2RIUmxlSFJTWVc1blpTNWpiMnhzWVhCelpTaHBibVp2TG1OdmJHeGhjSE5sVkc5VGRHRnlkQ2s3WEc1Y2RGeDBYSFIwWlhoMFVtRnVaMlV1Ylc5MlpWTjBZWEowS0NkamFHRnlZV04wWlhJbkxDQnBibVp2TG05bVpuTmxkQ2s3WEc1Y2RGeDBYSFJ5WlhSMWNtNGdkR1Y0ZEZKaGJtZGxPMXh1WEhSY2RIMDdYRzVjYmx4MFhIUXZLaXBjYmx4MFhIUWdLaUJYY21Gd2NHVmtJRkpoYm1kbFhHNWNkRngwSUNwY2JseDBYSFFnS2lCQVkyOXVjM1J5ZFdOMGIzSmNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UwNXZaR1Y5SUhOaklDMGdjM1JoY25RZ1kyOXVkR0ZwYm1WeVhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0T2RXMWlaWEo5SUhOdklDMGdjM1JoY25RZ2IyWm1jMlYwWEc1Y2RGeDBJQ29nUUhCaGNtRnRJSHRPYjJSbGZTQmxZeUF0SUdWdVpDQmpiMjUwWVdsdVpYSmNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UwNTFiV0psY24wZ1pXOGdMU0JsYm1RZ2IyWm1jMlYwWEc1Y2RGeDBJQ292WEc1Y2RGeDBkbUZ5SUZkeVlYQndaV1JTWVc1blpTQTlJR1oxYm1OMGFXOXVJQ2h6WXl3Z2MyOHNJR1ZqTENCbGJ5a2dlMXh1WEhSY2RGeDBkR2hwY3k1ell5QTlJSE5qTzF4dVhIUmNkRngwZEdocGN5NXpieUE5SUhOdk8xeHVYSFJjZEZ4MGRHaHBjeTVsWXlBOUlHVmpPMXh1WEhSY2RGeDBkR2hwY3k1bGJ5QTlJR1Z2TzF4dVhHNWNkRngwWEhRdkx5QnVZWFJwZG1WU1lXNW5aVG9nWjJWMElHNWhkR2wyWlZKaGJtZGxJR1p5YjIwZ2MyTXNJSE52TENCbFl5d2daVzljYmx4MFhIUmNkSFpoY2lCdVlYUnBkbVZTWVc1blpTQTlJR1oxYm1OMGFXOXVJQ2dwSUh0Y2JseDBYSFJjZEZ4MGFXWWdLR0ZuWlc1MExtbHpWek5EVW1GdVoyVlRkWEJ3YjNKMEtTQjdYRzVjZEZ4MFhIUmNkRngwZG1GeUlIY3pZMUpoYm1kbElEMGdaRzlqZFcxbGJuUXVZM0psWVhSbFVtRnVaMlVvS1R0Y2JseDBYSFJjZEZ4MFhIUjNNMk5TWVc1blpTNXpaWFJUZEdGeWRDaHpZeXdnYzI4cE8xeHVYSFJjZEZ4MFhIUmNkSGN6WTFKaGJtZGxMbk5sZEVWdVpDaGxZeXdnWlc4cE8xeHVYRzVjZEZ4MFhIUmNkRngwY21WMGRYSnVJSGN6WTFKaGJtZGxPMXh1WEhSY2RGeDBYSFI5SUdWc2MyVWdlMXh1WEhSY2RGeDBYSFJjZEhaaGNpQjBaWGgwVW1GdVoyVWdQU0J3YjJsdWRGUnZWR1Y0ZEZKaGJtZGxLSHRjYmx4MFhIUmNkRngwWEhSY2RHNXZaR1U2SUhOakxGeHVYSFJjZEZ4MFhIUmNkRngwYjJabWMyVjBPaUJ6YjF4dVhIUmNkRngwWEhSY2RIMHBPMXh1WEc1Y2RGeDBYSFJjZEZ4MGRHVjRkRkpoYm1kbExuTmxkRVZ1WkZCdmFXNTBLQ2RGYm1SVWIwVnVaQ2NzSUhCdmFXNTBWRzlVWlhoMFVtRnVaMlVvZTF4dVhIUmNkRngwWEhSY2RGeDBibTlrWlRvZ1pXTXNYRzVjZEZ4MFhIUmNkRngwWEhSdlptWnpaWFE2SUdWdlhHNWNkRngwWEhSY2RGeDBmU2twTzF4dVhHNWNkRngwWEhSY2RGeDBjbVYwZFhKdUlIUmxlSFJTWVc1blpUdGNibHgwWEhSY2RGeDBmVnh1WEhSY2RGeDBmVHRjYmx4dVhIUmNkRngwZEdocGN5NW5aWFJRYjJsdWRITWdQU0JtZFc1amRHbHZiaUFvS1NCN1hHNWNkRngwWEhSY2RISmxkSFZ5YmlCN1hHNWNkRngwWEhSY2RGeDBjMk02SUhOakxGeHVYSFJjZEZ4MFhIUmNkSE52T2lCemJ5eGNibHgwWEhSY2RGeDBYSFJsWXpvZ1pXTXNYRzVjZEZ4MFhIUmNkRngwWlc4NklHVnZYRzVjZEZ4MFhIUmNkSDA3WEc1Y2RGeDBYSFI5TzF4dVhHNWNkRngwWEhSMGFHbHpMbWRsZEZOMFlYSjBVRzlwYm5RZ1BTQm1kVzVqZEdsdmJpQW9LU0I3WEc1Y2RGeDBYSFJjZEhKbGRIVnliaUI3WEc1Y2RGeDBYSFJjZEZ4MGJtOWtaVG9nYzJNc1hHNWNkRngwWEhSY2RGeDBiMlptYzJWME9pQnpiMXh1WEhSY2RGeDBYSFI5TzF4dVhIUmNkRngwZlR0Y2JseHVYSFJjZEZ4MGRHaHBjeTVuWlhSRmJtUlFiMmx1ZENBOUlHWjFibU4wYVc5dUlDZ3BJSHRjYmx4MFhIUmNkRngwY21WMGRYSnVJSHRjYmx4MFhIUmNkRngwWEhSdWIyUmxPaUJsWXl4Y2JseDBYSFJjZEZ4MFhIUnZabVp6WlhRNklHVnZYRzVjZEZ4MFhIUmNkSDA3WEc1Y2RGeDBYSFI5TzF4dVhHNWNkRngwWEhRdktpcGNibHgwWEhSY2RDQXFJSE5sYkdWamRDQjFjR1JoZEdVZ2RtbHphV0pzWlNCeVlXNW5aVnh1WEhSY2RGeDBJQ292WEc1Y2RGeDBYSFIwYUdsekxuTmxiR1ZqZENBOUlHWjFibU4wYVc5dUlDZ3BJSHRjYmx4MFhIUmNkRngwZG1GeUlHNWhkR2wyWlZKdVp5QTlJRzVoZEdsMlpWSmhibWRsS0NrN1hHNWNkRngwWEhSY2RHbG1JQ2hoWjJWdWRDNXBjMWN6UTFKaGJtZGxVM1Z3Y0c5eWRDa2dlMXh1WEhSY2RGeDBYSFJjZEhaaGNpQnpaV3hsWTNScGIyNGdQU0JrYjJOMWJXVnVkQzVuWlhSVFpXeGxZM1JwYjI0b0tUdGNibHgwWEhSY2RGeDBYSFJwWmlBb2MyVnNaV04wYVc5dUxuSmhibWRsUTI5MWJuUWdQaUF3S1NCN1hHNWNkRngwWEhSY2RGeDBYSFJ6Wld4bFkzUnBiMjR1Y21WdGIzWmxRV3hzVW1GdVoyVnpLQ2s3WEc1Y2RGeDBYSFJjZEZ4MGZWeHVYSFJjZEZ4MFhIUmNkSE5sYkdWamRHbHZiaTVoWkdSU1lXNW5aU2h1WVhScGRtVlNibWNwTzF4dVhIUmNkRngwWEhSOUlHVnNjMlVnZTF4dVhIUmNkRngwWEhSY2RHNWhkR2wyWlZKdVp5NXpaV3hsWTNRb0tUdGNibHgwWEhSY2RGeDBmVnh1WEhSY2RGeDBmVHRjYmx4dVhIUmNkRngwTHlvcVhHNWNkRngwWEhRZ0tpQkFjbVYwZFhKdUlIdFhjbUZ3Y0dWa1VtRnVaMlY5WEc1Y2RGeDBYSFFnS2k5Y2JseDBYSFJjZEhSb2FYTXVibTl5YldGc2FYcGxJRDBnWm5WdVkzUnBiMjRnS0NrZ2UxeHVYRzVjZEZ4MFhIUmNkQzhxS2x4dVhIUmNkRngwWEhRZ0tpQkFjR0Z5WVcwZ2UwSnZkVzVrWVhKNVVHOXBiblI5SUhCdmFXNTBYRzVjZEZ4MFhIUmNkQ0FxSUVCeVpYUjFjbTRnZTBKdmRXNWtZWEo1VUc5cGJuUjlYRzVjZEZ4MFhIUmNkQ0FxTDF4dVhIUmNkRngwWEhSMllYSWdaMlYwVm1semFXSnNaVkJ2YVc1MElEMGdablZ1WTNScGIyNGdLSEJ2YVc1MEtTQjdYRzVjZEZ4MFhIUmNkRngwYVdZZ0tDRmtiMjB1YVhOV2FYTnBZbXhsVUc5cGJuUW9jRzlwYm5RcEtTQjdYRzVjZEZ4MFhIUmNkRngwWEhScFppQW9aRzl0TG1selRHVm1kRVZrWjJWUWIybHVkQ2h3YjJsdWRDa3BJSHRjYmx4MFhIUmNkRngwWEhSY2RGeDBjRzlwYm5RZ1BTQmtiMjB1Ym1WNGRGQnZhVzUwVlc1MGFXd29jRzlwYm5Rc0lHUnZiUzVwYzFacGMybGliR1ZRYjJsdWRDazdYRzVjZEZ4MFhIUmNkRngwWEhSOUlHVnNjMlVnZTF4dVhIUmNkRngwWEhSY2RGeDBYSFJ3YjJsdWRDQTlJR1J2YlM1d2NtVjJVRzlwYm5SVmJuUnBiQ2h3YjJsdWRDd2daRzl0TG1selZtbHphV0pzWlZCdmFXNTBLVHRjYmx4MFhIUmNkRngwWEhSY2RIMWNibHgwWEhSY2RGeDBYSFI5WEc1Y2RGeDBYSFJjZEZ4MGNtVjBkWEp1SUhCdmFXNTBPMXh1WEhSY2RGeDBYSFI5TzF4dVhHNWNkRngwWEhSY2RIWmhjaUJ6ZEdGeWRGQnZhVzUwSUQwZ1oyVjBWbWx6YVdKc1pWQnZhVzUwS0hSb2FYTXVaMlYwVTNSaGNuUlFiMmx1ZENncEtUdGNibHgwWEhSY2RGeDBkbUZ5SUdWdVpGQnZhVzUwSUQwZ1oyVjBWbWx6YVdKc1pWQnZhVzUwS0hSb2FYTXVaMlYwUlc1a1VHOXBiblFvS1NrN1hHNWNibHgwWEhSY2RGeDBjbVYwZFhKdUlHNWxkeUJYY21Gd2NHVmtVbUZ1WjJVb1hHNWNkRngwWEhSY2RDQWdjM1JoY25SUWIybHVkQzV1YjJSbExGeHVYSFJjZEZ4MFhIUWdJSE4wWVhKMFVHOXBiblF1YjJabWMyVjBMRnh1WEhSY2RGeDBYSFFnSUdWdVpGQnZhVzUwTG01dlpHVXNYRzVjZEZ4MFhIUmNkQ0FnWlc1a1VHOXBiblF1YjJabWMyVjBYRzVjZEZ4MFhIUmNkQ2s3WEc1Y2RGeDBYSFI5TzF4dVhHNWNkRngwWEhRdktpcGNibHgwWEhSY2RDQXFJSEpsZEhWeWJuTWdiV0YwWTJobFpDQnViMlJsY3lCdmJpQnlZVzVuWlZ4dVhIUmNkRngwSUNwY2JseDBYSFJjZENBcUlFQndZWEpoYlNCN1JuVnVZM1JwYjI1OUlGdHdjbVZrWFNBdElIQnlaV1JwWTJGMFpTQm1kVzVqZEdsdmJseHVYSFJjZEZ4MElDb2dRSEJoY21GdElIdFBZbXBsWTNSOUlGdHZjSFJwYjI1elhWeHVYSFJjZEZ4MElDb2dRSEJoY21GdElIdENiMjlzWldGdWZTQmJiM0IwYVc5dWN5NXBibU5zZFdSbFFXNWpaWE4wYjNKZFhHNWNkRngwWEhRZ0tpQkFjR0Z5WVcwZ2UwSnZiMnhsWVc1OUlGdHZjSFJwYjI1ekxtWjFiR3g1UTI5dWRHRnBibk5kWEc1Y2RGeDBYSFFnS2lCQWNtVjBkWEp1SUh0T2IyUmxXMTE5WEc1Y2RGeDBYSFFnS2k5Y2JseDBYSFJjZEhSb2FYTXVibTlrWlhNZ1BTQm1kVzVqZEdsdmJpQW9jSEpsWkN3Z2IzQjBhVzl1Y3lrZ2UxeHVYSFJjZEZ4MFhIUndjbVZrSUQwZ2NISmxaQ0I4ZkNCbWRXNWpMbTlyTzF4dVhHNWNkRngwWEhSY2RIWmhjaUJwYm1Oc2RXUmxRVzVqWlhOMGIzSWdQU0J2Y0hScGIyNXpJQ1ltSUc5d2RHbHZibk11YVc1amJIVmtaVUZ1WTJWemRHOXlPMXh1WEhSY2RGeDBYSFIyWVhJZ1puVnNiSGxEYjI1MFlXbHVjeUE5SUc5d2RHbHZibk1nSmlZZ2IzQjBhVzl1Y3k1bWRXeHNlVU52Ym5SaGFXNXpPMXh1WEc1Y2RGeDBYSFJjZEM4dklGUlBSRThnWTI5dGNHRnlaU0J3YjJsdWRITWdZVzVrSUhOdmNuUmNibHgwWEhSY2RGeDBkbUZ5SUhOMFlYSjBVRzlwYm5RZ1BTQjBhR2x6TG1kbGRGTjBZWEowVUc5cGJuUW9LVHRjYmx4MFhIUmNkRngwZG1GeUlHVnVaRkJ2YVc1MElEMGdkR2hwY3k1blpYUkZibVJRYjJsdWRDZ3BPMXh1WEc1Y2RGeDBYSFJjZEhaaGNpQnViMlJsY3lBOUlGdGRPMXh1WEhSY2RGeDBYSFIyWVhJZ2JHVm1kRVZrWjJWT2IyUmxjeUE5SUZ0ZE8xeHVYRzVjZEZ4MFhIUmNkR1J2YlM1M1lXeHJVRzlwYm5Rb2MzUmhjblJRYjJsdWRDd2daVzVrVUc5cGJuUXNJR1oxYm1OMGFXOXVJQ2h3YjJsdWRDa2dlMXh1WEhSY2RGeDBYSFJjZEdsbUlDaGtiMjB1YVhORlpHbDBZV0pzWlNod2IybHVkQzV1YjJSbEtTa2dlMXh1WEhSY2RGeDBYSFJjZEZ4MGNtVjBkWEp1TzF4dVhIUmNkRngwWEhSY2RIMWNibHh1WEhSY2RGeDBYSFJjZEhaaGNpQnViMlJsTzF4dVhIUmNkRngwWEhSY2RHbG1JQ2htZFd4c2VVTnZiblJoYVc1ektTQjdYRzVjZEZ4MFhIUmNkRngwWEhScFppQW9aRzl0TG1selRHVm1kRVZrWjJWUWIybHVkQ2h3YjJsdWRDa3BJSHRjYmx4MFhIUmNkRngwWEhSY2RGeDBiR1ZtZEVWa1oyVk9iMlJsY3k1d2RYTm9LSEJ2YVc1MExtNXZaR1VwTzF4dVhIUmNkRngwWEhSY2RGeDBmVnh1WEhSY2RGeDBYSFJjZEZ4MGFXWWdLR1J2YlM1cGMxSnBaMmgwUldSblpWQnZhVzUwS0hCdmFXNTBLU0FtSmlCc2FYTjBMbU52Ym5SaGFXNXpLR3hsWm5SRlpHZGxUbTlrWlhNc0lIQnZhVzUwTG01dlpHVXBLU0I3WEc1Y2RGeDBYSFJjZEZ4MFhIUmNkRzV2WkdVZ1BTQndiMmx1ZEM1dWIyUmxPMXh1WEhSY2RGeDBYSFJjZEZ4MGZWeHVYSFJjZEZ4MFhIUmNkSDBnWld4elpTQnBaaUFvYVc1amJIVmtaVUZ1WTJWemRHOXlLU0I3WEc1Y2RGeDBYSFJjZEZ4MFhIUnViMlJsSUQwZ1pHOXRMbUZ1WTJWemRHOXlLSEJ2YVc1MExtNXZaR1VzSUhCeVpXUXBPMXh1WEhSY2RGeDBYSFJjZEgwZ1pXeHpaU0I3WEc1Y2RGeDBYSFJjZEZ4MFhIUnViMlJsSUQwZ2NHOXBiblF1Ym05a1pUdGNibHgwWEhSY2RGeDBYSFI5WEc1Y2JseDBYSFJjZEZ4MFhIUnBaaUFvYm05a1pTQW1KaUJ3Y21Wa0tHNXZaR1VwS1NCN1hHNWNkRngwWEhSY2RGeDBYSFJ1YjJSbGN5NXdkWE5vS0c1dlpHVXBPMXh1WEhSY2RGeDBYSFJjZEgxY2JseDBYSFJjZEZ4MGZTd2dkSEoxWlNrN1hHNWNibHgwWEhSY2RGeDBjbVYwZFhKdUlHeHBjM1F1ZFc1cGNYVmxLRzV2WkdWektUdGNibHgwWEhSY2RIMDdYRzVjYmx4MFhIUmNkQzhxS2x4dVhIUmNkRngwSUNvZ2NtVjBkWEp1Y3lCamIyMXRiMjVCYm1ObGMzUnZjaUJ2WmlCeVlXNW5aVnh1WEhSY2RGeDBJQ29nUUhKbGRIVnliaUI3Uld4bGJXVnVkSDBnTFNCamIyMXRiMjVCYm1ObGMzUnZjbHh1WEhSY2RGeDBJQ292WEc1Y2RGeDBYSFIwYUdsekxtTnZiVzF2YmtGdVkyVnpkRzl5SUQwZ1puVnVZM1JwYjI0Z0tDa2dlMXh1WEhSY2RGeDBYSFJ5WlhSMWNtNGdaRzl0TG1OdmJXMXZia0Z1WTJWemRHOXlLSE5qTENCbFl5azdYRzVjZEZ4MFhIUjlPMXh1WEc1Y2RGeDBYSFF2S2lwY2JseDBYSFJjZENBcUlISmxkSFZ5Ym5NZ1pYaHdZVzVrWldRZ2NtRnVaMlVnWW5rZ2NISmxaRnh1WEhSY2RGeDBJQ3BjYmx4MFhIUmNkQ0FxSUVCd1lYSmhiU0I3Um5WdVkzUnBiMjU5SUhCeVpXUWdMU0J3Y21Wa2FXTmhkR1VnWm5WdVkzUnBiMjVjYmx4MFhIUmNkQ0FxSUVCeVpYUjFjbTRnZTFkeVlYQndaV1JTWVc1blpYMWNibHgwWEhSY2RDQXFMMXh1WEhSY2RGeDBkR2hwY3k1bGVIQmhibVFnUFNCbWRXNWpkR2x2YmlBb2NISmxaQ2tnZTF4dVhIUmNkRngwWEhSMllYSWdjM1JoY25SQmJtTmxjM1J2Y2lBOUlHUnZiUzVoYm1ObGMzUnZjaWh6WXl3Z2NISmxaQ2s3WEc1Y2RGeDBYSFJjZEhaaGNpQmxibVJCYm1ObGMzUnZjaUE5SUdSdmJTNWhibU5sYzNSdmNpaGxZeXdnY0hKbFpDazdYRzVjYmx4MFhIUmNkRngwYVdZZ0tDRnpkR0Z5ZEVGdVkyVnpkRzl5SUNZbUlDRmxibVJCYm1ObGMzUnZjaWtnZTF4dVhIUmNkRngwWEhSY2RISmxkSFZ5YmlCdVpYY2dWM0poY0hCbFpGSmhibWRsS0hOakxDQnpieXdnWldNc0lHVnZLVHRjYmx4MFhIUmNkRngwZlZ4dVhHNWNkRngwWEhSY2RIWmhjaUJpYjNWdVpHRnllVkJ2YVc1MGN5QTlJSFJvYVhNdVoyVjBVRzlwYm5SektDazdYRzVjYmx4MFhIUmNkRngwYVdZZ0tITjBZWEowUVc1alpYTjBiM0lwSUh0Y2JseDBYSFJjZEZ4MFhIUmliM1Z1WkdGeWVWQnZhVzUwY3k1ell5QTlJSE4wWVhKMFFXNWpaWE4wYjNJN1hHNWNkRngwWEhSY2RGeDBZbTkxYm1SaGNubFFiMmx1ZEhNdWMyOGdQU0F3TzF4dVhIUmNkRngwWEhSOVhHNWNibHgwWEhSY2RGeDBhV1lnS0dWdVpFRnVZMlZ6ZEc5eUtTQjdYRzVjZEZ4MFhIUmNkRngwWW05MWJtUmhjbmxRYjJsdWRITXVaV01nUFNCbGJtUkJibU5sYzNSdmNqdGNibHgwWEhSY2RGeDBYSFJpYjNWdVpHRnllVkJ2YVc1MGN5NWxieUE5SUdSdmJTNXViMlJsVEdWdVozUm9LR1Z1WkVGdVkyVnpkRzl5S1R0Y2JseDBYSFJjZEZ4MGZWeHVYRzVjZEZ4MFhIUmNkSEpsZEhWeWJpQnVaWGNnVjNKaGNIQmxaRkpoYm1kbEtGeHVYSFJjZEZ4MFhIUWdJR0p2ZFc1a1lYSjVVRzlwYm5SekxuTmpMRnh1WEhSY2RGeDBYSFFnSUdKdmRXNWtZWEo1VUc5cGJuUnpMbk52TEZ4dVhIUmNkRngwWEhRZ0lHSnZkVzVrWVhKNVVHOXBiblJ6TG1WakxGeHVYSFJjZEZ4MFhIUWdJR0p2ZFc1a1lYSjVVRzlwYm5SekxtVnZYRzVjZEZ4MFhIUmNkQ2s3WEc1Y2RGeDBYSFI5TzF4dVhHNWNkRngwWEhRdktpcGNibHgwWEhSY2RDQXFJRUJ3WVhKaGJTQjdRbTl2YkdWaGJuMGdhWE5EYjJ4c1lYQnpaVlJ2VTNSaGNuUmNibHgwWEhSY2RDQXFJRUJ5WlhSMWNtNGdlMWR5WVhCd1pXUlNZVzVuWlgxY2JseDBYSFJjZENBcUwxeHVYSFJjZEZ4MGRHaHBjeTVqYjJ4c1lYQnpaU0E5SUdaMWJtTjBhVzl1SUNocGMwTnZiR3hoY0hObFZHOVRkR0Z5ZENrZ2UxeHVYSFJjZEZ4MFhIUnBaaUFvYVhORGIyeHNZWEJ6WlZSdlUzUmhjblFwSUh0Y2JseDBYSFJjZEZ4MFhIUnlaWFIxY200Z2JtVjNJRmR5WVhCd1pXUlNZVzVuWlNoell5d2djMjhzSUhOakxDQnpieWs3WEc1Y2RGeDBYSFJjZEgwZ1pXeHpaU0I3WEc1Y2RGeDBYSFJjZEZ4MGNtVjBkWEp1SUc1bGR5QlhjbUZ3Y0dWa1VtRnVaMlVvWldNc0lHVnZMQ0JsWXl3Z1pXOHBPMXh1WEhSY2RGeDBYSFI5WEc1Y2RGeDBYSFI5TzF4dVhHNWNkRngwWEhRdktpcGNibHgwWEhSY2RDQXFJSE53YkdsMFZHVjRkQ0J2YmlCeVlXNW5aVnh1WEhSY2RGeDBJQ292WEc1Y2RGeDBYSFIwYUdsekxuTndiR2wwVkdWNGRDQTlJR1oxYm1OMGFXOXVJQ2dwSUh0Y2JseDBYSFJjZEZ4MGRtRnlJR2x6VTJGdFpVTnZiblJoYVc1bGNpQTlJSE5qSUQwOVBTQmxZenRjYmx4MFhIUmNkRngwZG1GeUlHSnZkVzVrWVhKNVVHOXBiblJ6SUQwZ2RHaHBjeTVuWlhSUWIybHVkSE1vS1R0Y2JseHVYSFJjZEZ4MFhIUnBaaUFvWkc5dExtbHpWR1Y0ZENobFl5a2dKaVlnSVdSdmJTNXBjMFZrWjJWUWIybHVkQ2gwYUdsekxtZGxkRVZ1WkZCdmFXNTBLQ2twS1NCN1hHNWNkRngwWEhSY2RGeDBaV011YzNCc2FYUlVaWGgwS0dWdktUdGNibHgwWEhSY2RGeDBmVnh1WEc1Y2RGeDBYSFJjZEdsbUlDaGtiMjB1YVhOVVpYaDBLSE5qS1NBbUppQWhaRzl0TG1selJXUm5aVkJ2YVc1MEtIUm9hWE11WjJWMFUzUmhjblJRYjJsdWRDZ3BLU2tnZTF4dVhIUmNkRngwWEhSY2RHSnZkVzVrWVhKNVVHOXBiblJ6TG5OaklEMGdjMk11YzNCc2FYUlVaWGgwS0hOdktUdGNibHgwWEhSY2RGeDBYSFJpYjNWdVpHRnllVkJ2YVc1MGN5NXpieUE5SURBN1hHNWNibHgwWEhSY2RGeDBYSFJwWmlBb2FYTlRZVzFsUTI5dWRHRnBibVZ5S1NCN1hHNWNkRngwWEhSY2RGeDBYSFJpYjNWdVpHRnllVkJ2YVc1MGN5NWxZeUE5SUdKdmRXNWtZWEo1VUc5cGJuUnpMbk5qTzF4dVhIUmNkRngwWEhSY2RGeDBZbTkxYm1SaGNubFFiMmx1ZEhNdVpXOGdQU0JsYnlBdElITnZPMXh1WEhSY2RGeDBYSFJjZEgxY2JseDBYSFJjZEZ4MGZWeHVYRzVjZEZ4MFhIUmNkSEpsZEhWeWJpQnVaWGNnVjNKaGNIQmxaRkpoYm1kbEtGeHVYSFJjZEZ4MFhIUWdJR0p2ZFc1a1lYSjVVRzlwYm5SekxuTmpMRnh1WEhSY2RGeDBYSFFnSUdKdmRXNWtZWEo1VUc5cGJuUnpMbk52TEZ4dVhIUmNkRngwWEhRZ0lHSnZkVzVrWVhKNVVHOXBiblJ6TG1WakxGeHVYSFJjZEZ4MFhIUWdJR0p2ZFc1a1lYSjVVRzlwYm5SekxtVnZYRzVjZEZ4MFhIUmNkQ2s3WEc1Y2RGeDBYSFI5TzF4dVhHNWNkRngwWEhRdktpcGNibHgwWEhSY2RDQXFJR1JsYkdWMFpTQmpiMjUwWlc1MGN5QnZiaUJ5WVc1blpWeHVYSFJjZEZ4MElDb2dRSEpsZEhWeWJpQjdWM0poY0hCbFpGSmhibWRsZlZ4dVhIUmNkRngwSUNvdlhHNWNkRngwWEhSMGFHbHpMbVJsYkdWMFpVTnZiblJsYm5SeklEMGdablZ1WTNScGIyNGdLQ2tnZTF4dVhIUmNkRngwWEhScFppQW9kR2hwY3k1cGMwTnZiR3hoY0hObFpDZ3BLU0I3WEc1Y2RGeDBYSFJjZEZ4MGNtVjBkWEp1SUhSb2FYTTdYRzVjZEZ4MFhIUmNkSDFjYmx4dVhIUmNkRngwWEhSMllYSWdjbTVuSUQwZ2RHaHBjeTV6Y0d4cGRGUmxlSFFvS1R0Y2JseDBYSFJjZEZ4MGRtRnlJRzV2WkdWeklEMGdjbTVuTG01dlpHVnpLRzUxYkd3c0lIdGNibHgwWEhSY2RGeDBYSFJtZFd4c2VVTnZiblJoYVc1ek9pQjBjblZsWEc1Y2RGeDBYSFJjZEgwcE8xeHVYRzVjZEZ4MFhIUmNkQzh2SUdacGJtUWdibVYzSUdOMWNuTnZjaUJ3YjJsdWRGeHVYSFJjZEZ4MFhIUjJZWElnY0c5cGJuUWdQU0JrYjIwdWNISmxkbEJ2YVc1MFZXNTBhV3dvY201bkxtZGxkRk4wWVhKMFVHOXBiblFvS1N3Z1puVnVZM1JwYjI0Z0tIQnZhVzUwS1NCN1hHNWNkRngwWEhSY2RGeDBjbVYwZFhKdUlDRnNhWE4wTG1OdmJuUmhhVzV6S0c1dlpHVnpMQ0J3YjJsdWRDNXViMlJsS1R0Y2JseDBYSFJjZEZ4MGZTazdYRzVjYmx4MFhIUmNkRngwZG1GeUlHVnRjSFI1VUdGeVpXNTBjeUE5SUZ0ZE8xeHVYSFJjZEZ4MFhIUWtMbVZoWTJnb2JtOWtaWE1zSUdaMWJtTjBhVzl1SUNocFpIZ3NJRzV2WkdVcElIdGNibHgwWEhSY2RGeDBYSFF2THlCbWFXNWtJR1Z0Y0hSNUlIQmhjbVZ1ZEhOY2JseDBYSFJjZEZ4MFhIUjJZWElnY0dGeVpXNTBJRDBnYm05a1pTNXdZWEpsYm5ST2IyUmxPMXh1WEhSY2RGeDBYSFJjZEdsbUlDaHdiMmx1ZEM1dWIyUmxJQ0U5UFNCd1lYSmxiblFnSmlZZ1pHOXRMbTV2WkdWTVpXNW5kR2dvY0dGeVpXNTBLU0E5UFQwZ01Ta2dlMXh1WEhSY2RGeDBYSFJjZEZ4MFpXMXdkSGxRWVhKbGJuUnpMbkIxYzJnb2NHRnlaVzUwS1R0Y2JseDBYSFJjZEZ4MFhIUjlYRzVjZEZ4MFhIUmNkRngwWkc5dExuSmxiVzkyWlNodWIyUmxMQ0JtWVd4elpTazdYRzVjZEZ4MFhIUmNkSDBwTzF4dVhHNWNkRngwWEhSY2RDOHZJSEpsYlc5MlpTQmxiWEIwZVNCd1lYSmxiblJ6WEc1Y2RGeDBYSFJjZENRdVpXRmphQ2hsYlhCMGVWQmhjbVZ1ZEhNc0lHWjFibU4wYVc5dUlDaHBaSGdzSUc1dlpHVXBJSHRjYmx4MFhIUmNkRngwWEhSa2IyMHVjbVZ0YjNabEtHNXZaR1VzSUdaaGJITmxLVHRjYmx4MFhIUmNkRngwZlNrN1hHNWNibHgwWEhSY2RGeDBjbVYwZFhKdUlHNWxkeUJYY21Gd2NHVmtVbUZ1WjJVb1hHNWNkRngwWEhSY2RDQWdjRzlwYm5RdWJtOWtaU3hjYmx4MFhIUmNkRngwSUNCd2IybHVkQzV2Wm1aelpYUXNYRzVjZEZ4MFhIUmNkQ0FnY0c5cGJuUXVibTlrWlN4Y2JseDBYSFJjZEZ4MElDQndiMmx1ZEM1dlptWnpaWFJjYmx4MFhIUmNkRngwS1M1dWIzSnRZV3hwZW1Vb0tUdGNibHgwWEhSY2RIMDdYRzVjYmx4MFhIUmNkQzhxS2x4dVhIUmNkRngwSUNvZ2JXRnJaVWx6VDI0NklISmxkSFZ5YmlCcGMwOXVLSEJ5WldRcElHWjFibU4wYVc5dVhHNWNkRngwWEhRZ0tpOWNibHgwWEhSY2RIWmhjaUJ0WVd0bFNYTlBiaUE5SUdaMWJtTjBhVzl1SUNod2NtVmtLU0I3WEc1Y2RGeDBYSFJjZEhKbGRIVnliaUJtZFc1amRHbHZiaUFvS1NCN1hHNWNkRngwWEhSY2RGeDBkbUZ5SUdGdVkyVnpkRzl5SUQwZ1pHOXRMbUZ1WTJWemRHOXlLSE5qTENCd2NtVmtLVHRjYmx4MFhIUmNkRngwWEhSeVpYUjFjbTRnSVNGaGJtTmxjM1J2Y2lBbUppQW9ZVzVqWlhOMGIzSWdQVDA5SUdSdmJTNWhibU5sYzNSdmNpaGxZeXdnY0hKbFpDa3BPMXh1WEhSY2RGeDBYSFI5TzF4dVhIUmNkRngwZlR0Y2JseHVYSFJjZEZ4MEx5OGdhWE5QYmtWa2FYUmhZbXhsT2lCcWRXUm5aU0IzYUdWMGFHVnlJSEpoYm1kbElHbHpJRzl1SUdWa2FYUmhZbXhsSUc5eUlHNXZkRnh1WEhSY2RGeDBkR2hwY3k1cGMwOXVSV1JwZEdGaWJHVWdQU0J0WVd0bFNYTlBiaWhrYjIwdWFYTkZaR2wwWVdKc1pTazdYRzVjZEZ4MFhIUXZMeUJwYzA5dVRHbHpkRG9nYW5Wa1oyVWdkMmhsZEdobGNpQnlZVzVuWlNCcGN5QnZiaUJzYVhOMElHNXZaR1VnYjNJZ2JtOTBYRzVjZEZ4MFhIUjBhR2x6TG1selQyNU1hWE4wSUQwZ2JXRnJaVWx6VDI0b1pHOXRMbWx6VEdsemRDazdYRzVjZEZ4MFhIUXZMeUJwYzA5dVFXNWphRzl5T2lCcWRXUm5aU0IzYUdWMGFHVnlJSEpoYm1kbElHbHpJRzl1SUdGdVkyaHZjaUJ1YjJSbElHOXlJRzV2ZEZ4dVhIUmNkRngwZEdocGN5NXBjMDl1UVc1amFHOXlJRDBnYldGclpVbHpUMjRvWkc5dExtbHpRVzVqYUc5eUtUdGNibHgwWEhSY2RDOHZJR2x6VDI1QmJtTm9iM0k2SUdwMVpHZGxJSGRvWlhSb1pYSWdjbUZ1WjJVZ2FYTWdiMjRnWTJWc2JDQnViMlJsSUc5eUlHNXZkRnh1WEhSY2RGeDBkR2hwY3k1cGMwOXVRMlZzYkNBOUlHMWhhMlZKYzA5dUtHUnZiUzVwYzBObGJHd3BPMXh1WEc1Y2RGeDBYSFF2S2lwY2JseDBYSFJjZENBcUlFQndZWEpoYlNCN1JuVnVZM1JwYjI1OUlIQnlaV1JjYmx4MFhIUmNkQ0FxSUVCeVpYUjFjbTRnZTBKdmIyeGxZVzU5WEc1Y2RGeDBYSFFnS2k5Y2JseDBYSFJjZEhSb2FYTXVhWE5NWldaMFJXUm5aVTltSUQwZ1puVnVZM1JwYjI0Z0tIQnlaV1FwSUh0Y2JseDBYSFJjZEZ4MGFXWWdLQ0ZrYjIwdWFYTk1aV1owUldSblpWQnZhVzUwS0hSb2FYTXVaMlYwVTNSaGNuUlFiMmx1ZENncEtTa2dlMXh1WEhSY2RGeDBYSFJjZEhKbGRIVnliaUJtWVd4elpUdGNibHgwWEhSY2RGeDBmVnh1WEc1Y2RGeDBYSFJjZEhaaGNpQnViMlJsSUQwZ1pHOXRMbUZ1WTJWemRHOXlLSFJvYVhNdWMyTXNJSEJ5WldRcE8xeHVYSFJjZEZ4MFhIUnlaWFIxY200Z2JtOWtaU0FtSmlCa2IyMHVhWE5NWldaMFJXUm5aVTltS0hSb2FYTXVjMk1zSUc1dlpHVXBPMXh1WEhSY2RGeDBmVHRjYmx4dVhIUmNkRngwTHlvcVhHNWNkRngwWEhRZ0tpQnlaWFIxY201eklIZG9aWFJvWlhJZ2NtRnVaMlVnZDJGeklHTnZiR3hoY0hObFpDQnZjaUJ1YjNSY2JseDBYSFJjZENBcUwxeHVYSFJjZEZ4MGRHaHBjeTVwYzBOdmJHeGhjSE5sWkNBOUlHWjFibU4wYVc5dUlDZ3BJSHRjYmx4MFhIUmNkRngwY21WMGRYSnVJSE5qSUQwOVBTQmxZeUFtSmlCemJ5QTlQVDBnWlc4N1hHNWNkRngwWEhSOU8xeHVYRzVjZEZ4MFhIUXZLaXBjYmx4MFhIUmNkQ0FxSUhkeVlYQWdhVzVzYVc1bElHNXZaR1Z6SUhkb2FXTm9JR05vYVd4a2NtVnVJRzltSUdKdlpIa2dkMmwwYUNCd1lYSmhaM0poY0doY2JseDBYSFJjZENBcVhHNWNkRngwWEhRZ0tpQkFjbVYwZFhKdUlIdFhjbUZ3Y0dWa1VtRnVaMlY5WEc1Y2RGeDBYSFFnS2k5Y2JseDBYSFJjZEhSb2FYTXVkM0poY0VKdlpIbEpibXhwYm1WWGFYUm9VR0Z5WVNBOUlHWjFibU4wYVc5dUlDZ3BJSHRjYmx4MFhIUmNkRngwYVdZZ0tHUnZiUzVwYzBKdlpIbERiMjUwWVdsdVpYSW9jMk1wSUNZbUlHUnZiUzVwYzBWdGNIUjVLSE5qS1NrZ2UxeHVYSFJjZEZ4MFhIUmNkSE5qTG1sdWJtVnlTRlJOVENBOUlHUnZiUzVsYlhCMGVWQmhjbUU3WEc1Y2RGeDBYSFJjZEZ4MGNtVjBkWEp1SUc1bGR5QlhjbUZ3Y0dWa1VtRnVaMlVvYzJNdVptbHljM1JEYUdsc1pDd2dNQ3dnYzJNdVptbHljM1JEYUdsc1pDd2dNQ2s3WEc1Y2RGeDBYSFJjZEgxY2JseHVYSFJjZEZ4MFhIUnBaaUFvWkc5dExtbHpVR0Z5WVVsdWJHbHVaU2h6WXlrZ2ZId2daRzl0TG1selVHRnlZU2h6WXlrcElIdGNibHgwWEhSY2RGeDBYSFJ5WlhSMWNtNGdkR2hwY3k1dWIzSnRZV3hwZW1Vb0tUdGNibHgwWEhSY2RGeDBmVnh1WEc1Y2RGeDBYSFJjZEM4dklHWnBibVFnYVc1c2FXNWxJSFJ2Y0NCaGJtTmxjM1J2Y2x4dVhIUmNkRngwWEhSMllYSWdkRzl3UVc1alpYTjBiM0k3WEc1Y2RGeDBYSFJjZEdsbUlDaGtiMjB1YVhOSmJteHBibVVvYzJNcEtTQjdYRzVjZEZ4MFhIUmNkRngwZG1GeUlHRnVZMlZ6ZEc5eWN5QTlJR1J2YlM1c2FYTjBRVzVqWlhOMGIzSW9jMk1zSUdaMWJtTXVibTkwS0dSdmJTNXBjMGx1YkdsdVpTa3BPMXh1WEhSY2RGeDBYSFJjZEhSdmNFRnVZMlZ6ZEc5eUlEMGdiR2x6ZEM1c1lYTjBLR0Z1WTJWemRHOXljeWs3WEc1Y2RGeDBYSFJjZEZ4MGFXWWdLQ0ZrYjIwdWFYTkpibXhwYm1Vb2RHOXdRVzVqWlhOMGIzSXBLU0I3WEc1Y2RGeDBYSFJjZEZ4MFhIUjBiM0JCYm1ObGMzUnZjaUE5SUdGdVkyVnpkRzl5YzF0aGJtTmxjM1J2Y25NdWJHVnVaM1JvSUMwZ01sMGdmSHdnYzJNdVkyaHBiR1JPYjJSbGMxdHpiMTA3WEc1Y2RGeDBYSFJjZEZ4MGZWeHVYSFJjZEZ4MFhIUjlJR1ZzYzJVZ2UxeHVYSFJjZEZ4MFhIUmNkSFJ2Y0VGdVkyVnpkRzl5SUQwZ2MyTXVZMmhwYkdST2IyUmxjMXR6YnlBK0lEQWdQeUJ6YnlBdElERWdPaUF3WFR0Y2JseDBYSFJjZEZ4MGZWeHVYRzVjZEZ4MFhIUmNkQzh2SUhOcFlteHBibWR6SUc1dmRDQnBiaUJ3WVhKaFozSmhjR2hjYmx4MFhIUmNkRngwZG1GeUlHbHViR2x1WlZOcFlteHBibWR6SUQwZ1pHOXRMbXhwYzNSUWNtVjJLSFJ2Y0VGdVkyVnpkRzl5TENCa2IyMHVhWE5RWVhKaFNXNXNhVzVsS1M1eVpYWmxjbk5sS0NrN1hHNWNkRngwWEhSY2RHbHViR2x1WlZOcFlteHBibWR6SUQwZ2FXNXNhVzVsVTJsaWJHbHVaM011WTI5dVkyRjBLR1J2YlM1c2FYTjBUbVY0ZENoMGIzQkJibU5sYzNSdmNpNXVaWGgwVTJsaWJHbHVaeXdnWkc5dExtbHpVR0Z5WVVsdWJHbHVaU2twTzF4dVhHNWNkRngwWEhSY2RDOHZJSGR5WVhBZ2QybDBhQ0J3WVhKaFozSmhjR2hjYmx4MFhIUmNkRngwYVdZZ0tHbHViR2x1WlZOcFlteHBibWR6TG14bGJtZDBhQ2tnZTF4dVhIUmNkRngwWEhSY2RIWmhjaUJ3WVhKaElEMGdaRzl0TG5keVlYQW9iR2x6ZEM1b1pXRmtLR2x1YkdsdVpWTnBZbXhwYm1kektTd2dKM0FuS1R0Y2JseDBYSFJjZEZ4MFhIUmtiMjB1WVhCd1pXNWtRMmhwYkdST2IyUmxjeWh3WVhKaExDQnNhWE4wTG5SaGFXd29hVzVzYVc1bFUybGliR2x1WjNNcEtUdGNibHgwWEhSY2RGeDBmVnh1WEc1Y2RGeDBYSFJjZEhKbGRIVnliaUIwYUdsekxtNXZjbTFoYkdsNlpTZ3BPMXh1WEhSY2RGeDBmVHRjYmx4dVhIUmNkRngwTHlvcVhHNWNkRngwWEhRZ0tpQnBibk5sY25RZ2JtOWtaU0JoZENCamRYSnlaVzUwSUdOMWNuTnZjbHh1WEhSY2RGeDBJQ3BjYmx4MFhIUmNkQ0FxSUVCd1lYSmhiU0I3VG05a1pYMGdibTlrWlZ4dVhIUmNkRngwSUNvZ1FISmxkSFZ5YmlCN1RtOWtaWDFjYmx4MFhIUmNkQ0FxTDF4dVhIUmNkRngwZEdocGN5NXBibk5sY25ST2IyUmxJRDBnWm5WdVkzUnBiMjRnS0c1dlpHVXBJSHRjYmx4MFhIUmNkRngwZG1GeUlISnVaeUE5SUhSb2FYTXVkM0poY0VKdlpIbEpibXhwYm1WWGFYUm9VR0Z5WVNncExtUmxiR1YwWlVOdmJuUmxiblJ6S0NrN1hHNWNkRngwWEhSY2RIWmhjaUJwYm1adklEMGdaRzl0TG5Od2JHbDBVRzlwYm5Rb2NtNW5MbWRsZEZOMFlYSjBVRzlwYm5Rb0tTd2daRzl0TG1selNXNXNhVzVsS0c1dlpHVXBLVHRjYmx4dVhIUmNkRngwWEhScFppQW9hVzVtYnk1eWFXZG9kRTV2WkdVcElIdGNibHgwWEhSY2RGeDBYSFJwYm1adkxuSnBaMmgwVG05a1pTNXdZWEpsYm5ST2IyUmxMbWx1YzJWeWRFSmxabTl5WlNodWIyUmxMQ0JwYm1adkxuSnBaMmgwVG05a1pTazdYRzVjZEZ4MFhIUmNkSDBnWld4elpTQjdYRzVjZEZ4MFhIUmNkRngwYVc1bWJ5NWpiMjUwWVdsdVpYSXVZWEJ3Wlc1a1EyaHBiR1FvYm05a1pTazdYRzVjZEZ4MFhIUmNkSDFjYmx4dVhIUmNkRngwWEhSeVpYUjFjbTRnYm05a1pUdGNibHgwWEhSY2RIMDdYRzVjYmx4MFhIUmNkQzhxS2x4dVhIUmNkRngwSUNvZ2NtVjBkWEp1Y3lCMFpYaDBJR2x1SUhKaGJtZGxYRzVjZEZ4MFhIUWdLbHh1WEhSY2RGeDBJQ29nUUhKbGRIVnliaUI3VTNSeWFXNW5mVnh1WEhSY2RGeDBJQ292WEc1Y2RGeDBYSFIwYUdsekxuUnZVM1J5YVc1bklEMGdablZ1WTNScGIyNGdLQ2tnZTF4dVhIUmNkRngwWEhSMllYSWdibUYwYVhabFVtNW5JRDBnYm1GMGFYWmxVbUZ1WjJVb0tUdGNibHgwWEhSY2RGeDBjbVYwZFhKdUlHRm5aVzUwTG1selZ6TkRVbUZ1WjJWVGRYQndiM0owSUQ4Z2JtRjBhWFpsVW01bkxuUnZVM1J5YVc1bktDa2dPaUJ1WVhScGRtVlNibWN1ZEdWNGREdGNibHgwWEhSY2RIMDdYRzVjYmx4MFhIUmNkQzhxS2x4dVhIUmNkRngwSUNvZ1kzSmxZWFJsSUc5bVpuTmxkRkJoZEdnZ1ltOXZhMjFoY210Y2JseDBYSFJjZENBcVhHNWNkRngwWEhRZ0tpQkFjR0Z5WVcwZ2UwNXZaR1Y5SUdWa2FYUmhZbXhsWEc1Y2RGeDBYSFFnS2k5Y2JseDBYSFJjZEhSb2FYTXVZbTl2YTIxaGNtc2dQU0JtZFc1amRHbHZiaUFvWldScGRHRmliR1VwSUh0Y2JseDBYSFJjZEZ4MGNtVjBkWEp1SUh0Y2JseDBYSFJjZEZ4MFhIUnpPaUI3WEc1Y2RGeDBYSFJjZEZ4MFhIUndZWFJvT2lCa2IyMHViV0ZyWlU5bVpuTmxkRkJoZEdnb1pXUnBkR0ZpYkdVc0lITmpLU3hjYmx4MFhIUmNkRngwWEhSY2RHOW1abk5sZERvZ2MyOWNibHgwWEhSY2RGeDBYSFI5TEZ4dVhIUmNkRngwWEhSY2RHVTZJSHRjYmx4MFhIUmNkRngwWEhSY2RIQmhkR2c2SUdSdmJTNXRZV3RsVDJabWMyVjBVR0YwYUNobFpHbDBZV0pzWlN3Z1pXTXBMRnh1WEhSY2RGeDBYSFJjZEZ4MGIyWm1jMlYwT2lCbGIxeHVYSFJjZEZ4MFhIUmNkSDFjYmx4MFhIUmNkRngwZlR0Y2JseDBYSFJjZEgwN1hHNWNibHgwWEhSY2RDOHFLbHh1WEhSY2RGeDBJQ29nWTNKbFlYUmxJRzltWm5ObGRGQmhkR2dnWW05dmEyMWhjbXNnWW1GelpTQnZiaUJ3WVhKaFozSmhjR2hjYmx4MFhIUmNkQ0FxWEc1Y2RGeDBYSFFnS2lCQWNHRnlZVzBnZTA1dlpHVmJYWDBnY0dGeVlYTmNibHgwWEhSY2RDQXFMMXh1WEhSY2RGeDBkR2hwY3k1d1lYSmhRbTl2YTIxaGNtc2dQU0JtZFc1amRHbHZiaUFvY0dGeVlYTXBJSHRjYmx4MFhIUmNkRngwY21WMGRYSnVJSHRjYmx4MFhIUmNkRngwWEhSek9pQjdYRzVjZEZ4MFhIUmNkRngwWEhSd1lYUm9PaUJzYVhOMExuUmhhV3dvWkc5dExtMWhhMlZQWm1aelpYUlFZWFJvS0d4cGMzUXVhR1ZoWkNod1lYSmhjeWtzSUhOaktTa3NYRzVjZEZ4MFhIUmNkRngwWEhSdlptWnpaWFE2SUhOdlhHNWNkRngwWEhSY2RGeDBmU3hjYmx4MFhIUmNkRngwWEhSbE9pQjdYRzVjZEZ4MFhIUmNkRngwWEhSd1lYUm9PaUJzYVhOMExuUmhhV3dvWkc5dExtMWhhMlZQWm1aelpYUlFZWFJvS0d4cGMzUXViR0Z6ZENod1lYSmhjeWtzSUdWaktTa3NYRzVjZEZ4MFhIUmNkRngwWEhSdlptWnpaWFE2SUdWdlhHNWNkRngwWEhSY2RGeDBmVnh1WEhSY2RGeDBYSFI5TzF4dVhIUmNkRngwZlR0Y2JseHVYSFJjZEZ4MEx5b3FYRzVjZEZ4MFhIUWdLaUJuWlhSRGJHbGxiblJTWldOMGMxeHVYSFJjZEZ4MElDb2dRSEpsZEhWeWJpQjdVbVZqZEZ0ZGZWeHVYSFJjZEZ4MElDb3ZYRzVjZEZ4MFhIUjBhR2x6TG1kbGRFTnNhV1Z1ZEZKbFkzUnpJRDBnWm5WdVkzUnBiMjRnS0NrZ2UxeHVYSFJjZEZ4MFhIUjJZWElnYm1GMGFYWmxVbTVuSUQwZ2JtRjBhWFpsVW1GdVoyVW9LVHRjYmx4MFhIUmNkRngwY21WMGRYSnVJRzVoZEdsMlpWSnVaeTVuWlhSRGJHbGxiblJTWldOMGN5Z3BPMXh1WEhSY2RGeDBmVHRjYmx4MFhIUjlPMXh1WEc1Y2RGeDBMeW9xWEc1Y2RGeDBJQ29nUUdOc1lYTnpJR052Y21VdWNtRnVaMlZjYmx4MFhIUWdLbHh1WEhSY2RDQXFJRVJoZEdFZ2MzUnlkV04wZFhKbFhHNWNkRngwSUNvZ0lDb2dRbTkxYm1SaGNubFFiMmx1ZERvZ1lTQndiMmx1ZENCdlppQmtiMjBnZEhKbFpWeHVYSFJjZENBcUlDQXFJRUp2ZFc1a1lYSjVVRzlwYm5Sek9pQjBkMjhnWW05MWJtUmhjbmxRYjJsdWRITWdZMjl5Y21WemNHOXVaR2x1WnlCMGJ5QjBhR1VnYzNSaGNuUWdZVzVrSUhSb1pTQmxibVFnYjJZZ2RHaGxJRkpoYm1kbFhHNWNkRngwSUNwY2JseDBYSFFnS2lCVFpXVWdkRzhnYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2VkZJdlJFOU5MVXhsZG1Wc0xUSXRWSEpoZG1WeWMyRnNMVkpoYm1kbEwzSmhibWRsY3k1b2RHMXNJMHhsZG1Wc0xUSXRVbUZ1WjJVdFVHOXphWFJwYjI1Y2JseDBYSFFnS2x4dVhIUmNkQ0FxSUVCemFXNW5iR1YwYjI1Y2JseDBYSFFnS2lCQVlXeDBaWEp1WVhSbFEyeGhjM05PWVcxbElISmhibWRsWEc1Y2RGeDBJQ292WEc1Y2RGeDBjbVYwZFhKdUlIdGNibHgwWEhSY2RDOHFLbHh1WEhSY2RGeDBJQ29nUUcxbGRHaHZaRnh1WEhSY2RGeDBJQ29nWEc1Y2RGeDBYSFFnS2lCamNtVmhkR1VnVW1GdVoyVWdUMkpxWldOMElFWnliMjBnWVhKbmRXMWxiblJ6SUc5eUlFSnliM2R6WlhJZ1UyVnNaV04wYVc5dVhHNWNkRngwWEhRZ0tseHVYSFJjZEZ4MElDb2dRSEJoY21GdElIdE9iMlJsZlNCell5QXRJSE4wWVhKMElHTnZiblJoYVc1bGNseHVYSFJjZEZ4MElDb2dRSEJoY21GdElIdE9kVzFpWlhKOUlITnZJQzBnYzNSaGNuUWdiMlptYzJWMFhHNWNkRngwWEhRZ0tpQkFjR0Z5WVcwZ2UwNXZaR1Y5SUdWaklDMGdaVzVrSUdOdmJuUmhhVzVsY2x4dVhIUmNkRngwSUNvZ1FIQmhjbUZ0SUh0T2RXMWlaWEo5SUdWdklDMGdaVzVrSUc5bVpuTmxkRnh1WEhSY2RGeDBJQ29nUUhKbGRIVnliaUI3VjNKaGNIQmxaRkpoYm1kbGZWeHVYSFJjZEZ4MElDb3ZYRzVjZEZ4MFhIUmpjbVZoZEdVNklHWjFibU4wYVc5dUlDaHpZeXdnYzI4c0lHVmpMQ0JsYnlrZ2UxeHVYSFJjZEZ4MFhIUnBaaUFvSVdGeVozVnRaVzUwY3k1c1pXNW5kR2dwSUhzZ0x5OGdabkp2YlNCQ2NtOTNjMlZ5SUZObGJHVmpkR2x2Ymx4dVhIUmNkRngwWEhSY2RHbG1JQ2hoWjJWdWRDNXBjMWN6UTFKaGJtZGxVM1Z3Y0c5eWRDa2dlMXh1WEhSY2RGeDBYSFJjZEZ4MGRtRnlJSE5sYkdWamRHbHZiaUE5SUdSdlkzVnRaVzUwTG1kbGRGTmxiR1ZqZEdsdmJpZ3BPMXh1WEhSY2RGeDBYSFJjZEZ4MGFXWWdLSE5sYkdWamRHbHZiaTV5WVc1blpVTnZkVzUwSUQwOVBTQXdLU0I3WEc1Y2RGeDBYSFJjZEZ4MFhIUmNkSEpsZEhWeWJpQnVkV3hzTzF4dVhIUmNkRngwWEhSY2RGeDBmU0JsYkhObElHbG1JQ2hrYjIwdWFYTkNiMlI1S0hObGJHVmpkR2x2Ymk1aGJtTm9iM0pPYjJSbEtTa2dlMXh1WEhSY2RGeDBYSFJjZEZ4MFhIUXZMeUJHYVhKbFptOTRPaUJ5WlhSMWNtNXpJR1Z1ZEdseVpTQmliMlI1SUdGeklISmhibWRsSUc5dUlHbHVhWFJwWVd4cGVtRjBhVzl1TGlCWFpTQjNiMjRuZENCdVpYWmxjaUJ1WldWa0lHbDBMbHh1WEhSY2RGeDBYSFJjZEZ4MFhIUnlaWFIxY200Z2JuVnNiRHRjYmx4MFhIUmNkRngwWEhSY2RIMWNibHh1WEhSY2RGeDBYSFJjZEZ4MGRtRnlJRzVoZEdsMlpWSnVaeUE5SUhObGJHVmpkR2x2Ymk1blpYUlNZVzVuWlVGMEtEQXBPMXh1WEhSY2RGeDBYSFJjZEZ4MGMyTWdQU0J1WVhScGRtVlNibWN1YzNSaGNuUkRiMjUwWVdsdVpYSTdYRzVjZEZ4MFhIUmNkRngwWEhSemJ5QTlJRzVoZEdsMlpWSnVaeTV6ZEdGeWRFOW1abk5sZER0Y2JseDBYSFJjZEZ4MFhIUmNkR1ZqSUQwZ2JtRjBhWFpsVW01bkxtVnVaRU52Ym5SaGFXNWxjanRjYmx4MFhIUmNkRngwWEhSY2RHVnZJRDBnYm1GMGFYWmxVbTVuTG1WdVpFOW1abk5sZER0Y2JseDBYSFJjZEZ4MFhIUjlJR1ZzYzJVZ2V5QXZMeUJKUlRnNklGUmxlSFJTWVc1blpWeHVYSFJjZEZ4MFhIUmNkRngwZG1GeUlIUmxlSFJTWVc1blpTQTlJR1J2WTNWdFpXNTBMbk5sYkdWamRHbHZiaTVqY21WaGRHVlNZVzVuWlNncE8xeHVYSFJjZEZ4MFhIUmNkRngwZG1GeUlIUmxlSFJTWVc1blpVVnVaQ0E5SUhSbGVIUlNZVzVuWlM1a2RYQnNhV05oZEdVb0tUdGNibHgwWEhSY2RGeDBYSFJjZEhSbGVIUlNZVzVuWlVWdVpDNWpiMnhzWVhCelpTaG1ZV3h6WlNrN1hHNWNkRngwWEhSY2RGeDBYSFIyWVhJZ2RHVjRkRkpoYm1kbFUzUmhjblFnUFNCMFpYaDBVbUZ1WjJVN1hHNWNkRngwWEhSY2RGeDBYSFIwWlhoMFVtRnVaMlZUZEdGeWRDNWpiMnhzWVhCelpTaDBjblZsS1R0Y2JseHVYSFJjZEZ4MFhIUmNkRngwZG1GeUlITjBZWEowVUc5cGJuUWdQU0IwWlhoMFVtRnVaMlZVYjFCdmFXNTBLSFJsZUhSU1lXNW5aVk4wWVhKMExDQjBjblZsS1N4Y2JseDBYSFJjZEZ4MFhIUmNkR1Z1WkZCdmFXNTBJRDBnZEdWNGRGSmhibWRsVkc5UWIybHVkQ2gwWlhoMFVtRnVaMlZGYm1Rc0lHWmhiSE5sS1R0Y2JseHVYSFJjZEZ4MFhIUmNkRngwTHk4Z2MyRnRaU0IyYVhOcFlteGxJSEJ2YVc1MElHTmhjMlU2SUhKaGJtZGxJSGRoY3lCamIyeHNZWEJ6WldRdVhHNWNkRngwWEhSY2RGeDBYSFJwWmlBb1pHOXRMbWx6VkdWNGRDaHpkR0Z5ZEZCdmFXNTBMbTV2WkdVcElDWW1JR1J2YlM1cGMweGxablJGWkdkbFVHOXBiblFvYzNSaGNuUlFiMmx1ZENrZ0ppWmNibHgwWEhSY2RGeDBYSFJjZEZ4MFpHOXRMbWx6VkdWNGRFNXZaR1VvWlc1a1VHOXBiblF1Ym05a1pTa2dKaVlnWkc5dExtbHpVbWxuYUhSRlpHZGxVRzlwYm5Rb1pXNWtVRzlwYm5RcElDWW1YRzVjZEZ4MFhIUmNkRngwWEhSY2RHVnVaRkJ2YVc1MExtNXZaR1V1Ym1WNGRGTnBZbXhwYm1jZ1BUMDlJSE4wWVhKMFVHOXBiblF1Ym05a1pTa2dlMXh1WEhSY2RGeDBYSFJjZEZ4MFhIUnpkR0Z5ZEZCdmFXNTBJRDBnWlc1a1VHOXBiblE3WEc1Y2RGeDBYSFJjZEZ4MFhIUjlYRzVjYmx4MFhIUmNkRngwWEhSY2RITmpJRDBnYzNSaGNuUlFiMmx1ZEM1amIyNTBPMXh1WEhSY2RGeDBYSFJjZEZ4MGMyOGdQU0J6ZEdGeWRGQnZhVzUwTG05bVpuTmxkRHRjYmx4MFhIUmNkRngwWEhSY2RHVmpJRDBnWlc1a1VHOXBiblF1WTI5dWREdGNibHgwWEhSY2RGeDBYSFJjZEdWdklEMGdaVzVrVUc5cGJuUXViMlptYzJWME8xeHVYSFJjZEZ4MFhIUmNkSDFjYmx4MFhIUmNkRngwZlNCbGJITmxJR2xtSUNoaGNtZDFiV1Z1ZEhNdWJHVnVaM1JvSUQwOVBTQXlLU0I3SUM4dlkyOXNiR0Z3YzJWa1hHNWNkRngwWEhSY2RGeDBaV01nUFNCell6dGNibHgwWEhSY2RGeDBYSFJsYnlBOUlITnZPMXh1WEhSY2RGeDBYSFI5WEc1Y2RGeDBYSFJjZEhKbGRIVnliaUJ1WlhjZ1YzSmhjSEJsWkZKaGJtZGxLSE5qTENCemJ5d2daV01zSUdWdktUdGNibHgwWEhSY2RIMHNYRzVjYmx4MFhIUmNkQzhxS2x4dVhIUmNkRngwSUNvZ1FHMWxkR2h2WkNCY2JseDBYSFJjZENBcUlGeHVYSFJjZEZ4MElDb2dZM0psWVhSbElGZHlZWEJ3WldSU1lXNW5aU0JtY205dElHNXZaR1ZjYmx4MFhIUmNkQ0FxWEc1Y2RGeDBYSFFnS2lCQWNHRnlZVzBnZTA1dlpHVjlJRzV2WkdWY2JseDBYSFJjZENBcUlFQnlaWFIxY200Z2UxZHlZWEJ3WldSU1lXNW5aWDFjYmx4MFhIUmNkQ0FxTDF4dVhIUmNkRngwWTNKbFlYUmxSbkp2YlU1dlpHVTZJR1oxYm1OMGFXOXVJQ2h1YjJSbEtTQjdYRzVjZEZ4MFhIUmNkSFpoY2lCell5QTlJRzV2WkdVN1hHNWNkRngwWEhSY2RIWmhjaUJ6YnlBOUlEQTdYRzVjZEZ4MFhIUmNkSFpoY2lCbFl5QTlJRzV2WkdVN1hHNWNkRngwWEhSY2RIWmhjaUJsYnlBOUlHUnZiUzV1YjJSbFRHVnVaM1JvS0dWaktUdGNibHh1WEhSY2RGeDBYSFF2THlCaWNtOTNjMlZ5Y3lCallXNG5kQ0IwWVhKblpYUWdZU0J3YVdOMGRYSmxJRzl5SUhadmFXUWdibTlrWlZ4dVhIUmNkRngwWEhScFppQW9aRzl0TG1selZtOXBaQ2h6WXlrcElIdGNibHgwWEhSY2RGeDBYSFJ6YnlBOUlHUnZiUzVzYVhOMFVISmxkaWh6WXlrdWJHVnVaM1JvSUMwZ01UdGNibHgwWEhSY2RGeDBYSFJ6WXlBOUlITmpMbkJoY21WdWRFNXZaR1U3WEc1Y2RGeDBYSFJjZEgxY2JseDBYSFJjZEZ4MGFXWWdLR1J2YlM1cGMwSlNLR1ZqS1NrZ2UxeHVYSFJjZEZ4MFhIUmNkR1Z2SUQwZ1pHOXRMbXhwYzNSUWNtVjJLR1ZqS1M1c1pXNW5kR2dnTFNBeE8xeHVYSFJjZEZ4MFhIUmNkR1ZqSUQwZ1pXTXVjR0Z5Wlc1MFRtOWtaVHRjYmx4MFhIUmNkRngwZlNCbGJITmxJR2xtSUNoa2IyMHVhWE5XYjJsa0tHVmpLU2tnZTF4dVhIUmNkRngwWEhSY2RHVnZJRDBnWkc5dExteHBjM1JRY21WMktHVmpLUzVzWlc1bmRHZzdYRzVjZEZ4MFhIUmNkRngwWldNZ1BTQmxZeTV3WVhKbGJuUk9iMlJsTzF4dVhIUmNkRngwWEhSOVhHNWNibHgwWEhSY2RGeDBjbVYwZFhKdUlIUm9hWE11WTNKbFlYUmxLSE5qTENCemJ5d2daV01zSUdWdktUdGNibHgwWEhSY2RIMHNYRzVjYmx4MFhIUmNkQzhxS2x4dVhIUmNkRngwSUNvZ1FHMWxkR2h2WkNCY2JseDBYSFJjZENBcUlGeHVYSFJjZEZ4MElDb2dZM0psWVhSbElGZHlZWEJ3WldSU1lXNW5aU0JtY205dElHSnZiMnR0WVhKclhHNWNkRngwWEhRZ0tseHVYSFJjZEZ4MElDb2dRSEJoY21GdElIdE9iMlJsZlNCbFpHbDBZV0pzWlZ4dVhIUmNkRngwSUNvZ1FIQmhjbUZ0SUh0UFltcGxZM1I5SUdKdmIydHRZWEpyWEc1Y2RGeDBYSFFnS2lCQWNtVjBkWEp1SUh0WGNtRndjR1ZrVW1GdVoyVjlYRzVjZEZ4MFhIUWdLaTljYmx4MFhIUmNkR055WldGMFpVWnliMjFDYjI5cmJXRnlhem9nWm5WdVkzUnBiMjRnS0dWa2FYUmhZbXhsTENCaWIyOXJiV0Z5YXlrZ2UxeHVYSFJjZEZ4MFhIUjJZWElnYzJNZ1BTQmtiMjB1Wm5KdmJVOW1abk5sZEZCaGRHZ29aV1JwZEdGaWJHVXNJR0p2YjJ0dFlYSnJMbk11Y0dGMGFDazdYRzVjZEZ4MFhIUmNkSFpoY2lCemJ5QTlJR0p2YjJ0dFlYSnJMbk11YjJabWMyVjBPMXh1WEhSY2RGeDBYSFIyWVhJZ1pXTWdQU0JrYjIwdVpuSnZiVTltWm5ObGRGQmhkR2dvWldScGRHRmliR1VzSUdKdmIydHRZWEpyTG1VdWNHRjBhQ2s3WEc1Y2RGeDBYSFJjZEhaaGNpQmxieUE5SUdKdmIydHRZWEpyTG1VdWIyWm1jMlYwTzF4dVhIUmNkRngwWEhSeVpYUjFjbTRnYm1WM0lGZHlZWEJ3WldSU1lXNW5aU2h6WXl3Z2MyOHNJR1ZqTENCbGJ5azdYRzVjZEZ4MFhIUjlMRnh1WEc1Y2RGeDBYSFF2S2lwY2JseDBYSFJjZENBcUlFQnRaWFJvYjJRZ1hHNWNkRngwWEhRZ0tseHVYSFJjZEZ4MElDb2dZM0psWVhSbElGZHlZWEJ3WldSU1lXNW5aU0JtY205dElIQmhjbUZDYjI5cmJXRnlhMXh1WEhSY2RGeDBJQ3BjYmx4MFhIUmNkQ0FxSUVCd1lYSmhiU0I3VDJKcVpXTjBmU0JpYjI5cmJXRnlhMXh1WEhSY2RGeDBJQ29nUUhCaGNtRnRJSHRPYjJSbFcxMTlJSEJoY21GelhHNWNkRngwWEhRZ0tpQkFjbVYwZFhKdUlIdFhjbUZ3Y0dWa1VtRnVaMlY5WEc1Y2RGeDBYSFFnS2k5Y2JseDBYSFJjZEdOeVpXRjBaVVp5YjIxUVlYSmhRbTl2YTIxaGNtczZJR1oxYm1OMGFXOXVJQ2hpYjI5cmJXRnlheXdnY0dGeVlYTXBJSHRjYmx4MFhIUmNkRngwZG1GeUlITnZJRDBnWW05dmEyMWhjbXN1Y3k1dlptWnpaWFE3WEc1Y2RGeDBYSFJjZEhaaGNpQmxieUE5SUdKdmIydHRZWEpyTG1VdWIyWm1jMlYwTzF4dVhIUmNkRngwWEhSMllYSWdjMk1nUFNCa2IyMHVabkp2YlU5bVpuTmxkRkJoZEdnb2JHbHpkQzVvWldGa0tIQmhjbUZ6S1N3Z1ltOXZhMjFoY21zdWN5NXdZWFJvS1R0Y2JseDBYSFJjZEZ4MGRtRnlJR1ZqSUQwZ1pHOXRMbVp5YjIxUFptWnpaWFJRWVhSb0tHeHBjM1F1YkdGemRDaHdZWEpoY3lrc0lHSnZiMnR0WVhKckxtVXVjR0YwYUNrN1hHNWNibHgwWEhSY2RGeDBjbVYwZFhKdUlHNWxkeUJYY21Gd2NHVmtVbUZ1WjJVb2MyTXNJSE52TENCbFl5d2daVzhwTzF4dVhIUmNkRngwZlZ4dVhIUmNkSDA3WEc1Y2RIMHBLQ2s3WEc1Y2JseDBMeW9xWEc1Y2RDQXFJRUJqYkdGemN5QmtaV1poZFd4MGN5QmNibHgwSUNvZ1hHNWNkQ0FxSUVCemFXNW5iR1YwYjI1Y2JseDBJQ292WEc1Y2RIWmhjaUJrWldaaGRXeDBjeUE5SUh0Y2JseDBYSFF2S2lvZ1FIQnliM0JsY25SNUlDb3ZYRzVjZEZ4MGRtVnljMmx2YmpvZ0p6QXVOaTR6Snl4Y2JseHVYSFJjZEM4cUtseHVYSFJjZENBcUlGeHVYSFJjZENBcUlHWnZjaUJsZG1WdWRDQnZjSFJwYjI1ekxDQnlaV1psY21WdVkyVWdkRzhnUlhabGJuUklZVzVrYkdWeUxtRjBkR0ZqYUZ4dVhIUmNkQ0FxSUZ4dVhIUmNkQ0FxSUVCd2NtOXdaWEowZVNCN1QySnFaV04wZlNCdmNIUnBiMjV6SUZ4dVhIUmNkQ0FxSUVCd2NtOXdaWEowZVNCN1UzUnlhVzVuTDA1MWJXSmxjbjBnVzI5d2RHbHZibk11ZDJsa2RHZzliblZzYkYwZ2MyVjBJR1ZrYVhSdmNpQjNhV1IwYUNCY2JseDBYSFFnS2lCQWNISnZjR1Z5ZEhrZ2UxTjBjbWx1Wnk5T2RXMWlaWEo5SUZ0dmNIUnBiMjV6TG1obGFXZG9kRDF1ZFd4c1hTQnpaWFFnWldScGRHOXlJR2hsYVdkb2RDd2daWGdwSURNd01GeHVYSFJjZENBcUlFQndjbTl3WlhKMGVTQjdVM1J5YVc1bkwwNTFiV0psY24wZ2IzQjBhVzl1Y3k1dGFXNUlaV2xuYUhRZ2MyVjBJRzFwYm1sdGRXMGdhR1ZwWjJoMElHOW1JR1ZrYVhSdmNseHVYSFJjZENBcUlFQndjbTl3WlhKMGVTQjdVM1J5YVc1bkwwNTFiV0psY24wZ2IzQjBhVzl1Y3k1dFlYaElaV2xuYUhSY2JseDBYSFFnS2lCQWNISnZjR1Z5ZEhrZ2UxTjBjbWx1Wnk5T2RXMWlaWEo5SUc5d2RHbHZibk11Wm05amRYTWdYRzVjZEZ4MElDb2dRSEJ5YjNCbGNuUjVJSHRPZFcxaVpYSjlJRzl3ZEdsdmJuTXVkR0ZpYzJsNlpTQmNibHgwWEhRZ0tpQkFjSEp2Y0dWeWRIa2dlMEp2YjJ4bFlXNTlJRzl3ZEdsdmJuTXVjM1I1YkdWWGFYUm9VM0JoYmx4dVhIUmNkQ0FxSUVCd2NtOXdaWEowZVNCN1QySnFaV04wZlNCdmNIUnBiMjV6TG1OdlpHVnRhWEp5YjNKY2JseDBYSFFnS2lCQWNISnZjR1Z5ZEhrZ2UwOWlhbVZqZEgwZ1cyOXdkR2x2Ym5NdVkyOWtaVzFwY25KdmNpNXRiMlJsUFNkMFpYaDBMMmgwYld3blhWeHVYSFJjZENBcUlFQndjbTl3WlhKMGVTQjdUMkpxWldOMGZTQmJiM0IwYVc5dWN5NWpiMlJsYldseWNtOXlMbWgwYld4TmIyUmxQWFJ5ZFdWZFhHNWNkRngwSUNvZ1FIQnliM0JsY25SNUlIdFBZbXBsWTNSOUlGdHZjSFJwYjI1ekxtTnZaR1Z0YVhKeWIzSXViR2x1WlU1MWJXSmxjbk05ZEhKMVpWMWNibHgwWEhRZ0tpQkFjSEp2Y0dWeWRIa2dlMU4wY21sdVozMGdXMjl3ZEdsdmJuTXViR0Z1WnoxbGJpMVZVMTBnYkdGdVozVmhaMlVnSjJWdUxWVlRKeXdnSjJ0dkxVdFNKeXdnTGk0dVhHNWNkRngwSUNvZ1FIQnliM0JsY25SNUlIdFRkSEpwYm1kOUlGdHZjSFJwYjI1ekxtUnBjbVZqZEdsdmJqMXVkV3hzWFNCMFpYaDBJR1JwY21WamRHbHZiaXdnWlhncElDZHlkR3duWEc1Y2RGeDBJQ29nUUhCeWIzQmxjblI1SUh0QmNuSmhlWDBnVzI5d2RHbHZibk11ZEc5dmJHSmhjbDFjYmx4MFhIUWdLaUJBY0hKdmNHVnlkSGtnZTBKdmIyeGxZVzU5SUZ0dmNIUnBiMjV6TG1GcGNrMXZaR1U5Wm1Gc2MyVmRYRzVjZEZ4MElDb2dRSEJ5YjNCbGNuUjVJSHRCY25KaGVYMGdXMjl3ZEdsdmJuTXVZV2x5VUc5d2IzWmxjbDFjYmx4MFhIUWdLaUJBY0hKdmNHVnlkSGtnZTBaMVkyNTBhVzl1ZlNCYmIzQjBhVzl1Y3k1dmJrbHVhWFJkSUdsdWFYUnBZV3hwZW1WY2JseDBYSFFnS2lCQWNISnZjR1Z5ZEhrZ2UwWjFZMjUwYVc5dWZTQmJiM0IwYVc5dWN5NXZibk4xWW0xcGRGMWNibHgwWEhRZ0tpOWNibHgwWEhSdmNIUnBiMjV6T2lCN1hHNWNkRngwWEhSM2FXUjBhRG9nYm5Wc2JDd2dJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQXZMeUJ6WlhRZ1pXUnBkRzl5SUhkcFpIUm9YRzVjZEZ4MFhIUm9aV2xuYUhRNklHNTFiR3dzSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0F2THlCelpYUWdaV1JwZEc5eUlHaGxhV2RvZEN3Z1pYZ3BJRE13TUZ4dVhHNWNkRngwWEhSdGFXNUlaV2xuYUhRNklHNTFiR3dzSUNBZ0lDQWdJQ0FnSUNBZ0lDQXZMeUJ6WlhRZ2JXbHVhVzExYlNCb1pXbG5hSFFnYjJZZ1pXUnBkRzl5WEc1Y2RGeDBYSFJ0WVhoSVpXbG5hSFE2SUc1MWJHd3NJQ0FnSUNBZ0lDQWdJQ0FnSUNBdkx5QnpaWFFnYldGNGFXMTFiU0JvWldsbmFIUWdiMllnWldScGRHOXlYRzVjYmx4MFhIUmNkR1p2WTNWek9pQm1ZV3h6WlN3Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUM4dklITmxkQ0JtYjJOMWN5QjBieUJsWkdsMFlXSnNaU0JoY21WaElHRm1kR1Z5SUdsdWFYUnBZV3hwZW1sdVp5QnpkVzF0WlhKdWIzUmxYRzVjYmx4MFhIUmNkSFJoWW5OcGVtVTZJRFFzSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUM4dklITnBlbVVnYjJZZ2RHRmlJR1Y0S1NBeUlHOXlJRFJjYmx4MFhIUmNkSE4wZVd4bFYybDBhRk53WVc0NklIUnlkV1VzSUNBZ0lDQWdJQ0FnSUM4dklITjBlV3hsSUhkcGRHZ2djM0JoYmlBb1EyaHliMjFsSUdGdVpDQkdSaUJ2Ym14NUtWeHVYRzVjZEZ4MFhIUmthWE5oWW14bFRHbHVhMVJoY21kbGREb2dabUZzYzJVc0lDQWdJQ0F2THlCb2FXUmxJR3hwYm1zZ1ZHRnlaMlYwSUVOb1pXTnJZbTk0WEc1Y2RGeDBYSFJrYVhOaFlteGxSSEpoWjBGdVpFUnliM0E2SUdaaGJITmxMQ0FnSUNBdkx5QmthWE5oWW14bElHUnlZV2NnWVc1a0lHUnliM0FnWlhabGJuUmNibHgwWEhSY2RHUnBjMkZpYkdWU1pYTnBlbVZGWkdsMGIzSTZJR1poYkhObExDQWdJQzh2SUdScGMyRmliR1VnY21WemFYcHBibWNnWldScGRHOXlYRzVjYmx4MFhIUmNkSE5vYjNKMFkzVjBjem9nZEhKMVpTd2dJQ0FnSUNBZ0lDQWdJQ0FnSUM4dklHVnVZV0pzWlNCclpYbGliMkZ5WkNCemFHOXlkR04xZEhOY2JseHVYSFJjZEZ4MGNHeGhZMlZvYjJ4a1pYSTZJR1poYkhObExDQWdJQ0FnSUNBZ0lDQWdMeThnWlc1aFlteGxJSEJzWVdObGFHOXNaR1Z5SUhSbGVIUmNibHgwWEhSY2RIQnlaWFIwYVdaNVNIUnRiRG9nZEhKMVpTd2dJQ0FnSUNBZ0lDQWdJQzh2SUdWdVlXSnNaU0J3Y21WMGRHbG1lV2x1WnlCb2RHMXNJSGRvYVd4bElIUnZaMmRzYVc1bklHTnZaR1YyYVdWM1hHNWNibHgwWEhSY2RHbGpiMjVRY21WbWFYZzZJQ2RtWVNCbVlTMG5MQ0FnSUNBZ0lDQWdJQzh2SUhCeVpXWnBlQ0JtYjNJZ1kzTnpJR2xqYjI0Z1kyeGhjM05sYzF4dVhHNWNkRngwWEhSamIyUmxiV2x5Y205eU9pQjdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQXZMeUJqYjJSbGJXbHljbTl5SUc5d2RHbHZibk5jYmx4MFhIUmNkRngwYlc5a1pUb2dKM1JsZUhRdmFIUnRiQ2NzWEc1Y2RGeDBYSFJjZEdoMGJXeE5iMlJsT2lCMGNuVmxMRnh1WEhSY2RGeDBYSFJzYVc1bFRuVnRZbVZ5Y3pvZ2RISjFaVnh1WEhSY2RGeDBmU3hjYmx4dVhIUmNkRngwTHk4Z2JHRnVaM1ZoWjJWY2JseDBYSFJjZEd4aGJtYzZJQ2RsYmkxVlV5Y3NJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDOHZJR3hoYm1kMVlXZGxJQ2RsYmkxVlV5Y3NJQ2RyYnkxTFVpY3NJQzR1TGx4dVhIUmNkRngwWkdseVpXTjBhVzl1T2lCdWRXeHNMQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0x5OGdkR1Y0ZENCa2FYSmxZM1JwYjI0c0lHVjRLU0FuY25Sc0oxeHVYRzVjZEZ4MFhIUXZMeUIwYjI5c1ltRnlYRzVjZEZ4MFhIUjBiMjlzWW1GeU9pQmJYRzVjZEZ4MFhIUWdJRnNuYzNSNWJHVW5MQ0JiSjNOMGVXeGxKMTFkTEZ4dVhIUmNkRngwSUNCYkoyWnZiblFuTENCYkoySnZiR1FuTENBbmFYUmhiR2xqSnl3Z0ozVnVaR1Z5YkdsdVpTY3NJQ2RqYkdWaGNpZGRYU3hjYmx4MFhIUmNkQ0FnV3lkbWIyNTBibUZ0WlNjc0lGc25abTl1ZEc1aGJXVW5YVjBzWEc1Y2RGeDBYSFFnSUZzblkyOXNiM0luTENCYkoyTnZiRzl5SjExZExGeHVYSFJjZEZ4MElDQmJKM0JoY21FbkxDQmJKM1ZzSnl3Z0oyOXNKeXdnSjNCaGNtRm5jbUZ3YUNkZFhTeGNibHgwWEhSY2RDQWdXeWRvWldsbmFIUW5MQ0JiSjJobGFXZG9kQ2RkWFN4Y2JseDBYSFJjZENBZ1d5ZDBZV0pzWlNjc0lGc25kR0ZpYkdVblhWMHNYRzVjZEZ4MFhIUWdJRnNuYVc1elpYSjBKeXdnV3lkc2FXNXJKeXdnSjNCcFkzUjFjbVVuTENBbmFISW5YVjBzWEc1Y2RGeDBYSFFnSUZzbmRtbGxkeWNzSUZzblpuVnNiSE5qY21WbGJpY3NJQ2RqYjJSbGRtbGxkeWRkWFN4Y2JseDBYSFJjZENBZ1d5ZG9aV3h3Snl3Z1d5ZG9aV3h3SjExZFhHNWNkRngwWEhSZExGeHVYRzVjZEZ4MFhIUXZMeUJoYVhJZ2JXOWtaVG9nYVc1c2FXNWxJR1ZrYVhSdmNseHVYSFJjZEZ4MFlXbHlUVzlrWlRvZ1ptRnNjMlVzWEc1Y2RGeDBYSFF2THlCaGFYSlFiM0J2ZG1WeU9pQmJYRzVjZEZ4MFhIUXZMeUFnSUZzbmMzUjViR1VuTENCYkozTjBlV3hsSjExZExGeHVYSFJjZEZ4MEx5OGdJQ0JiSjJadmJuUW5MQ0JiSjJKdmJHUW5MQ0FuYVhSaGJHbGpKeXdnSjNWdVpHVnliR2x1WlNjc0lDZGpiR1ZoY2lkZFhTeGNibHgwWEhSY2RDOHZJQ0FnV3lkbWIyNTBibUZ0WlNjc0lGc25abTl1ZEc1aGJXVW5YVjBzWEc1Y2RGeDBYSFF2THlBZ0lGc25ZMjlzYjNJbkxDQmJKMk52Ykc5eUoxMWRMRnh1WEhSY2RGeDBMeThnSUNCYkozQmhjbUVuTENCYkozVnNKeXdnSjI5c0p5d2dKM0JoY21GbmNtRndhQ2RkWFN4Y2JseDBYSFJjZEM4dklDQWdXeWRvWldsbmFIUW5MQ0JiSjJobGFXZG9kQ2RkWFN4Y2JseDBYSFJjZEM4dklDQWdXeWQwWVdKc1pTY3NJRnNuZEdGaWJHVW5YVjBzWEc1Y2RGeDBYSFF2THlBZ0lGc25hVzV6WlhKMEp5d2dXeWRzYVc1ckp5d2dKM0JwWTNSMWNtVW5YVjBzWEc1Y2RGeDBYSFF2THlBZ0lGc25hR1ZzY0Njc0lGc25hR1ZzY0NkZFhWeHVYSFJjZEZ4MEx5OGdYU3hjYmx4MFhIUmNkR0ZwY2xCdmNHOTJaWEk2SUZ0Y2JseDBYSFJjZENBZ1d5ZGpiMnh2Y2ljc0lGc25ZMjlzYjNJblhWMHNYRzVjZEZ4MFhIUWdJRnNuWm05dWRDY3NJRnNuWW05c1pDY3NJQ2QxYm1SbGNteHBibVVuTENBblkyeGxZWEluWFYwc1hHNWNkRngwWEhRZ0lGc25jR0Z5WVNjc0lGc25kV3duTENBbmNHRnlZV2R5WVhCb0oxMWRMRnh1WEhSY2RGeDBJQ0JiSjNSaFlteGxKeXdnV3lkMFlXSnNaU2RkWFN4Y2JseDBYSFJjZENBZ1d5ZHBibk5sY25RbkxDQmJKMnhwYm1zbkxDQW5jR2xqZEhWeVpTZGRYVnh1WEhSY2RGeDBYU3hjYmx4dVhIUmNkRngwTHk4Z2MzUjViR1VnZEdGblhHNWNkRngwWEhSemRIbHNaVlJoWjNNNklGc25jQ2NzSUNkaWJHOWphM0YxYjNSbEp5d2dKM0J5WlNjc0lDZG9NU2NzSUNkb01pY3NJQ2RvTXljc0lDZG9OQ2NzSUNkb05TY3NJQ2RvTmlkZExGeHVYRzVjZEZ4MFhIUXZMeUJrWldaaGRXeDBJR1p2Ym5ST1lXMWxYRzVjZEZ4MFhIUmtaV1poZFd4MFJtOXVkRTVoYldVNklDZElaV3gyWlhScFkyRWdUbVYxWlNjc1hHNWNibHgwWEhSY2RDOHZJR1p2Ym5ST1lXMWxYRzVjZEZ4MFhIUm1iMjUwVG1GdFpYTTZJRnRjYmx4MFhIUmNkQ0FnSjBGeWFXRnNKeXdnSjBGeWFXRnNJRUpzWVdOckp5d2dKME52YldsaklGTmhibk1nVFZNbkxDQW5RMjkxY21sbGNpQk9aWGNuTEZ4dVhIUmNkRngwSUNBblNHVnNkbVYwYVdOaElFNWxkV1VuTENBblNHVnNkbVYwYVdOaEp5d2dKMGx0Y0dGamRDY3NJQ2RNZFdOcFpHRWdSM0poYm1SbEp5eGNibHgwWEhSY2RDQWdKMVJoYUc5dFlTY3NJQ2RVYVcxbGN5Qk9aWGNnVW05dFlXNG5MQ0FuVm1WeVpHRnVZU2RjYmx4MFhIUmNkRjBzWEc1Y2RGeDBYSFJtYjI1MFRtRnRaWE5KWjI1dmNtVkRhR1ZqYXpvZ1cxMHNYRzVjYmx4MFhIUmNkQzh2SUhCaGJHeGxkR1VnWTI5c2IzSnpLRzRnZUNCdUtWeHVYSFJjZEZ4MFkyOXNiM0p6T2lCYlhHNWNkRngwWEhRZ0lGc25JekF3TURBd01DY3NJQ2NqTkRJME1qUXlKeXdnSnlNMk16WXpOak1uTENBbkl6bERPVU01TkNjc0lDY2pRMFZETmtORkp5d2dKeU5GUmtWR1JVWW5MQ0FuSTBZM1JqZEdOeWNzSUNjalJrWkdSa1pHSjEwc1hHNWNkRngwWEhRZ0lGc25JMFpHTURBd01DY3NJQ2NqUmtZNVF6QXdKeXdnSnlOR1JrWkdNREFuTENBbkl6QXdSa1l3TUNjc0lDY2pNREJHUmtaR0p5d2dKeU13TURBd1JrWW5MQ0FuSXpsRE1EQkdSaWNzSUNjalJrWXdNRVpHSjEwc1hHNWNkRngwWEhRZ0lGc25JMFkzUXpaRFJTY3NJQ2NqUmtaRk4wTkZKeXdnSnlOR1JrVkdRelluTENBbkkwUTJSVVpFTmljc0lDY2pRMFZFUlVVM0p5d2dKeU5EUlVVM1JqY25MQ0FuSTBRMlJEWkZOeWNzSUNjalJUZEVOa1JGSjEwc1hHNWNkRngwWEhRZ0lGc25JMFUzT1VNNVF5Y3NJQ2NqUmtaRE5qbERKeXdnSnlOR1JrVTNPVU1uTENBbkkwSTFSRFpCTlNjc0lDY2pRVFZETmtORkp5d2dKeU01UTBNMlJVWW5MQ0FuSTBJMVFUVkVOaWNzSUNjalJEWkJOVUpFSjEwc1hHNWNkRngwWEhRZ0lGc25JMFUzTmpNMk15Y3NJQ2NqUmpkQlJEWkNKeXdnSnlOR1JrUTJOak1uTENBbkl6azBRa1EzUWljc0lDY2pOek5CTlVGRUp5d2dKeU0yUWtGRVJFVW5MQ0FuSXpoRE4wSkROaWNzSUNjalF6WTNRa0UxSjEwc1hHNWNkRngwWEhRZ0lGc25JME5GTURBd01DY3NJQ2NqUlRjNU5ETTVKeXdnSnlORlJrTTJNekVuTENBbkl6WkNRVFUwUVNjc0lDY2pORUUzUWpoREp5d2dKeU16T1RnMFF6WW5MQ0FuSXpZek5FRkJOU2NzSUNjalFUVTBRVGRDSjEwc1hHNWNkRngwWEhRZ0lGc25JemxETURBd01DY3NJQ2NqUWpVMk16QTRKeXdnSnlOQ1JEazBNREFuTENBbkl6TTVOMEl5TVNjc0lDY2pNVEEwUVRWQkp5d2dKeU13T0RVeU9UUW5MQ0FuSXpNeE1UZzNNeWNzSUNjak56TXhPRFF5SjEwc1hHNWNkRngwWEhRZ0lGc25Jell6TURBd01DY3NJQ2NqTjBJek9UQXdKeXdnSnlNNE5EWXpNREFuTENBbkl6STVOVEl4T0Njc0lDY2pNRGd6TVRNNUp5d2dKeU13TURNeE5qTW5MQ0FuSXpJeE1UQTBRU2NzSUNjak5FRXhNRE14SjExY2JseDBYSFJjZEYwc1hHNWNibHgwWEhSY2RDOHZJR3hwYm1WSVpXbG5hSFJjYmx4MFhIUmNkR3hwYm1WSVpXbG5hSFJ6T2lCYkp6RXVNQ2NzSUNjeExqSW5MQ0FuTVM0MEp5d2dKekV1TlNjc0lDY3hMalluTENBbk1TNDRKeXdnSnpJdU1DY3NJQ2N6TGpBblhTeGNibHh1WEhSY2RGeDBMeThnYVc1elpYSjBWR0ZpYkdVZ2JXRjRJSE5wZW1WY2JseDBYSFJjZEdsdWMyVnlkRlJoWW14bFRXRjRVMmw2WlRvZ2UxeHVYSFJjZEZ4MFhIUmpiMnc2SURFd0xGeHVYSFJjZEZ4MFhIUnliM2M2SURFd1hHNWNkRngwWEhSOUxGeHVYRzVjZEZ4MFhIUXZMeUJwYldGblpWeHVYSFJjZEZ4MGJXRjRhVzExYlVsdFlXZGxSbWxzWlZOcGVtVTZJRzUxYkd3c0lDOHZJSE5wZW1VZ2FXNGdZbmwwWlhNc0lHNTFiR3dnUFNCdWJ5QnNhVzFwZEZ4dVhHNWNkRngwWEhRdkx5QmpZV3hzWW1GamEzTmNibHgwWEhSY2RHOXVhVzVwZERvZ2JuVnNiQ3dnSUNBZ0lDQWdJQ0FnSUNBZ0x5OGdhVzVwZEdsaGJHbDZaVnh1WEhSY2RGeDBiMjVtYjJOMWN6b2diblZzYkN3Z0lDQWdJQ0FnSUNBZ0lDQXZMeUJsWkdsMFlXSnNaU0JvWVhNZ1ptOWpkWE5jYmx4MFhIUmNkRzl1WW14MWNqb2diblZzYkN3Z0lDQWdJQ0FnSUNBZ0lDQWdMeThnWldScGRHRmliR1VnYjNWMElHOW1JR1p2WTNWelhHNWNkRngwWEhSdmJtVnVkR1Z5T2lCdWRXeHNMQ0FnSUNBZ0lDQWdJQ0FnSUM4dklHVnVkR1Z5SUd0bGVTQndjbVZ6YzJWa1hHNWNkRngwWEhSdmJtdGxlWFZ3T2lCdWRXeHNMQ0FnSUNBZ0lDQWdJQ0FnSUM4dklHdGxlWFZ3WEc1Y2RGeDBYSFJ2Ym10bGVXUnZkMjQ2SUc1MWJHd3NJQ0FnSUNBZ0lDQWdJQzh2SUd0bGVXUnZkMjVjYmx4MFhIUmNkRzl1U1cxaFoyVlZjR3h2WVdRNklHNTFiR3dzSUNBZ0lDQWdMeThnYVcxaFoyVlZjR3h2WVdSY2JseDBYSFJjZEc5dVNXMWhaMlZWY0d4dllXUkZjbkp2Y2pvZ2JuVnNiQ3dnTHk4Z2FXMWhaMlZWY0d4dllXUkZjbkp2Y2x4dVhIUmNkRngwYjI1TlpXUnBZVVJsYkdWMFpUb2diblZzYkN3Z0lDQWdJQ0F2THlCdFpXUnBZU0JrWld4bGRHVmNibHgwWEhSY2RHOXVWRzl2YkdKaGNrTnNhV05yT2lCdWRXeHNMRnh1WEhSY2RGeDBiMjV6ZFdKdGFYUTZJRzUxYkd3c1hHNWNibHgwWEhSY2RDOHFLbHh1WEhSY2RGeDBJQ29nYldGdWFYQjFiR0YwWlNCc2FXNXJJR0ZrWkhKbGMzTWdkMmhsYmlCMWMyVnlJR055WldGMFpTQnNhVzVyWEc1Y2RGeDBYSFFnS2lCQWNHRnlZVzBnZTFOMGNtbHVaMzBnYzB4cGJtdFZjbXhjYmx4MFhIUmNkQ0FxSUVCeVpYUjFjbTRnZTFOMGNtbHVaMzFjYmx4MFhIUmNkQ0FxTDF4dVhIUmNkRngwYjI1RGNtVmhkR1ZNYVc1ck9pQm1kVzVqZEdsdmJpQW9jMHhwYm10VmNtd3BJSHRjYmx4MFhIUmNkRngwYVdZZ0tITk1hVzVyVlhKc0xtbHVaR1Y0VDJZb0owQW5LU0FoUFQwZ0xURWdKaVlnYzB4cGJtdFZjbXd1YVc1a1pYaFBaaWduT2ljcElEMDlQU0F0TVNrZ2UxeHVYSFJjZEZ4MFhIUmNkSE5NYVc1clZYSnNJRDBnSjIxaGFXeDBiem9uSUNzZ2MweHBibXRWY213N1hHNWNkRngwWEhSY2RIMGdaV3h6WlNCcFppQW9jMHhwYm10VmNtd3VhVzVrWlhoUFppZ25PaTh2SnlrZ1BUMDlJQzB4S1NCN1hHNWNkRngwWEhSY2RGeDBjMHhwYm10VmNtd2dQU0FuYUhSMGNEb3ZMeWNnS3lCelRHbHVhMVZ5YkR0Y2JseDBYSFJjZEZ4MGZWeHVYRzVjZEZ4MFhIUmNkSEpsZEhWeWJpQnpUR2x1YTFWeWJEdGNibHgwWEhSY2RIMHNYRzVjYmx4MFhIUmNkR3RsZVUxaGNEb2dlMXh1WEhSY2RGeDBYSFJ3WXpvZ2UxeHVYSFJjZEZ4MFhIUmNkQ2RGVGxSRlVpYzZJQ2RwYm5ObGNuUlFZWEpoWjNKaGNHZ25MRnh1WEhSY2RGeDBYSFJjZENkRFZGSk1LMW9uT2lBbmRXNWtieWNzWEc1Y2RGeDBYSFJjZEZ4MEowTlVVa3dyV1NjNklDZHlaV1J2Snl4Y2JseDBYSFJjZEZ4MFhIUW5WRUZDSnpvZ0ozUmhZaWNzWEc1Y2RGeDBYSFJjZEZ4MEoxTklTVVpVSzFSQlFpYzZJQ2QxYm5SaFlpY3NYRzVjZEZ4MFhIUmNkRngwSjBOVVVrd3JRaWM2SUNkaWIyeGtKeXhjYmx4MFhIUmNkRngwWEhRblExUlNUQ3RKSnpvZ0oybDBZV3hwWXljc1hHNWNkRngwWEhSY2RGeDBKME5VVWt3clZTYzZJQ2QxYm1SbGNteHBibVVuTEZ4dVhIUmNkRngwWEhSY2RDZERWRkpNSzFOSVNVWlVLMU1uT2lBbmMzUnlhV3RsZEdoeWIzVm5hQ2NzWEc1Y2RGeDBYSFJjZEZ4MEowTlVVa3dyUWtGRFMxTk1RVk5JSnpvZ0ozSmxiVzkyWlVadmNtMWhkQ2NzWEc1Y2RGeDBYSFJjZEZ4MEowTlVVa3dyVTBoSlJsUXJUQ2M2SUNkcWRYTjBhV1o1VEdWbWRDY3NYRzVjZEZ4MFhIUmNkRngwSjBOVVVrd3JVMGhKUmxRclJTYzZJQ2RxZFhOMGFXWjVRMlZ1ZEdWeUp5eGNibHgwWEhSY2RGeDBYSFFuUTFSU1RDdFRTRWxHVkN0U0p6b2dKMnAxYzNScFpubFNhV2RvZENjc1hHNWNkRngwWEhSY2RGeDBKME5VVWt3clUwaEpSbFFyU2ljNklDZHFkWE4wYVdaNVJuVnNiQ2NzWEc1Y2RGeDBYSFJjZEZ4MEowTlVVa3dyVTBoSlJsUXJUbFZOTnljNklDZHBibk5sY25SVmJtOXlaR1Z5WldSTWFYTjBKeXhjYmx4MFhIUmNkRngwWEhRblExUlNUQ3RUU0VsR1ZDdE9WVTA0SnpvZ0oybHVjMlZ5ZEU5eVpHVnlaV1JNYVhOMEp5eGNibHgwWEhSY2RGeDBYSFFuUTFSU1RDdE1SVVpVUWxKQlEwdEZWQ2M2SUNkdmRYUmtaVzUwSnl4Y2JseDBYSFJjZEZ4MFhIUW5RMVJTVEN0U1NVZElWRUpTUVVOTFJWUW5PaUFuYVc1a1pXNTBKeXhjYmx4MFhIUmNkRngwWEhRblExUlNUQ3RPVlUwd0p6b2dKMlp2Y20xaGRGQmhjbUVuTEZ4dVhIUmNkRngwWEhSY2RDZERWRkpNSzA1VlRURW5PaUFuWm05eWJXRjBTREVuTEZ4dVhIUmNkRngwWEhSY2RDZERWRkpNSzA1VlRUSW5PaUFuWm05eWJXRjBTREluTEZ4dVhIUmNkRngwWEhSY2RDZERWRkpNSzA1VlRUTW5PaUFuWm05eWJXRjBTRE1uTEZ4dVhIUmNkRngwWEhSY2RDZERWRkpNSzA1VlRUUW5PaUFuWm05eWJXRjBTRFFuTEZ4dVhIUmNkRngwWEhSY2RDZERWRkpNSzA1VlRUVW5PaUFuWm05eWJXRjBTRFVuTEZ4dVhIUmNkRngwWEhSY2RDZERWRkpNSzA1VlRUWW5PaUFuWm05eWJXRjBTRFluTEZ4dVhIUmNkRngwWEhSY2RDZERWRkpNSzBWT1ZFVlNKem9nSjJsdWMyVnlkRWh2Y21sNmIyNTBZV3hTZFd4bEp5eGNibHgwWEhSY2RGeDBYSFFuUTFSU1RDdExKem9nSjNOb2IzZE1hVzVyUkdsaGJHOW5KMXh1WEhSY2RGeDBYSFI5TEZ4dVhHNWNkRngwWEhSY2RHMWhZem9nZTF4dVhIUmNkRngwWEhSY2RDZEZUbFJGVWljNklDZHBibk5sY25SUVlYSmhaM0poY0dnbkxGeHVYSFJjZEZ4MFhIUmNkQ2REVFVRcldpYzZJQ2QxYm1Sdkp5eGNibHgwWEhSY2RGeDBYSFFuUTAxRUsxTklTVVpVSzFvbk9pQW5jbVZrYnljc1hHNWNkRngwWEhSY2RGeDBKMVJCUWljNklDZDBZV0luTEZ4dVhIUmNkRngwWEhSY2RDZFRTRWxHVkN0VVFVSW5PaUFuZFc1MFlXSW5MRnh1WEhSY2RGeDBYSFJjZENkRFRVUXJRaWM2SUNkaWIyeGtKeXhjYmx4MFhIUmNkRngwWEhRblEwMUVLMGtuT2lBbmFYUmhiR2xqSnl4Y2JseDBYSFJjZEZ4MFhIUW5RMDFFSzFVbk9pQW5kVzVrWlhKc2FXNWxKeXhjYmx4MFhIUmNkRngwWEhRblEwMUVLMU5JU1VaVUsxTW5PaUFuYzNSeWFXdGxkR2h5YjNWbmFDY3NYRzVjZEZ4MFhIUmNkRngwSjBOTlJDdENRVU5MVTB4QlUwZ25PaUFuY21WdGIzWmxSbTl5YldGMEp5eGNibHgwWEhSY2RGeDBYSFFuUTAxRUsxTklTVVpVSzB3bk9pQW5hblZ6ZEdsbWVVeGxablFuTEZ4dVhIUmNkRngwWEhSY2RDZERUVVFyVTBoSlJsUXJSU2M2SUNkcWRYTjBhV1o1UTJWdWRHVnlKeXhjYmx4MFhIUmNkRngwWEhRblEwMUVLMU5JU1VaVUsxSW5PaUFuYW5WemRHbG1lVkpwWjJoMEp5eGNibHgwWEhSY2RGeDBYSFFuUTAxRUsxTklTVVpVSzBvbk9pQW5hblZ6ZEdsbWVVWjFiR3duTEZ4dVhIUmNkRngwWEhSY2RDZERUVVFyVTBoSlJsUXJUbFZOTnljNklDZHBibk5sY25SVmJtOXlaR1Z5WldSTWFYTjBKeXhjYmx4MFhIUmNkRngwWEhRblEwMUVLMU5JU1VaVUswNVZUVGduT2lBbmFXNXpaWEowVDNKa1pYSmxaRXhwYzNRbkxGeHVYSFJjZEZ4MFhIUmNkQ2REVFVRclRFVkdWRUpTUVVOTFJWUW5PaUFuYjNWMFpHVnVkQ2NzWEc1Y2RGeDBYSFJjZEZ4MEowTk5SQ3RTU1VkSVZFSlNRVU5MUlZRbk9pQW5hVzVrWlc1MEp5eGNibHgwWEhSY2RGeDBYSFFuUTAxRUswNVZUVEFuT2lBblptOXliV0YwVUdGeVlTY3NYRzVjZEZ4MFhIUmNkRngwSjBOTlJDdE9WVTB4SnpvZ0oyWnZjbTFoZEVneEp5eGNibHgwWEhSY2RGeDBYSFFuUTAxRUswNVZUVEluT2lBblptOXliV0YwU0RJbkxGeHVYSFJjZEZ4MFhIUmNkQ2REVFVRclRsVk5NeWM2SUNkbWIzSnRZWFJJTXljc1hHNWNkRngwWEhSY2RGeDBKME5OUkN0T1ZVMDBKem9nSjJadmNtMWhkRWcwSnl4Y2JseDBYSFJjZEZ4MFhIUW5RMDFFSzA1VlRUVW5PaUFuWm05eWJXRjBTRFVuTEZ4dVhIUmNkRngwWEhSY2RDZERUVVFyVGxWTk5pYzZJQ2RtYjNKdFlYUklOaWNzWEc1Y2RGeDBYSFJjZEZ4MEowTk5SQ3RGVGxSRlVpYzZJQ2RwYm5ObGNuUkliM0pwZW05dWRHRnNVblZzWlNjc1hHNWNkRngwWEhSY2RGeDBKME5OUkN0TEp6b2dKM05vYjNkTWFXNXJSR2xoYkc5bkoxeHVYSFJjZEZ4MFhIUjlYRzVjZEZ4MFhIUjlYRzVjZEZ4MGZTeGNibHh1WEhSY2RDOHZJR1JsWm1GMWJIUWdiR0Z1WjNWaFoyVTZJR1Z1TFZWVFhHNWNkRngwYkdGdVp6b2dlMXh1WEhSY2RGeDBKMlZ1TFZWVEp6b2dlMXh1WEhSY2RGeDBYSFJtYjI1ME9pQjdYRzVjZEZ4MFhIUmNkRngwWW05c1pEb2dKMEp2YkdRbkxGeHVYSFJjZEZ4MFhIUmNkR2wwWVd4cFl6b2dKMGwwWVd4cFl5Y3NYRzVjZEZ4MFhIUmNkRngwZFc1a1pYSnNhVzVsT2lBblZXNWtaWEpzYVc1bEp5eGNibHgwWEhSY2RGeDBYSFJqYkdWaGNqb2dKMUpsYlc5MlpTQkdiMjUwSUZOMGVXeGxKeXhjYmx4MFhIUmNkRngwWEhSb1pXbG5hSFE2SUNkTWFXNWxJRWhsYVdkb2RDY3NYRzVjZEZ4MFhIUmNkRngwYm1GdFpUb2dKMFp2Ym5RZ1JtRnRhV3g1SjF4dVhIUmNkRngwWEhSOUxGeHVYSFJjZEZ4MFhIUnBiV0ZuWlRvZ2UxeHVYSFJjZEZ4MFhIUmNkR2x0WVdkbE9pQW5VR2xqZEhWeVpTY3NYRzVjZEZ4MFhIUmNkRngwYVc1elpYSjBPaUFuU1c1elpYSjBJRWx0WVdkbEp5eGNibHgwWEhSY2RGeDBYSFJ5WlhOcGVtVkdkV3hzT2lBblVtVnphWHBsSUVaMWJHd25MRnh1WEhSY2RGeDBYSFJjZEhKbGMybDZaVWhoYkdZNklDZFNaWE5wZW1VZ1NHRnNaaWNzWEc1Y2RGeDBYSFJjZEZ4MGNtVnphWHBsVVhWaGNuUmxjam9nSjFKbGMybDZaU0JSZFdGeWRHVnlKeXhjYmx4MFhIUmNkRngwWEhSbWJHOWhkRXhsWm5RNklDZEdiRzloZENCTVpXWjBKeXhjYmx4MFhIUmNkRngwWEhSbWJHOWhkRkpwWjJoME9pQW5SbXh2WVhRZ1VtbG5hSFFuTEZ4dVhIUmNkRngwWEhSY2RHWnNiMkYwVG05dVpUb2dKMFpzYjJGMElFNXZibVVuTEZ4dVhIUmNkRngwWEhSY2RITm9ZWEJsVW05MWJtUmxaRG9nSjFOb1lYQmxPaUJTYjNWdVpHVmtKeXhjYmx4MFhIUmNkRngwWEhSemFHRndaVU5wY21Oc1pUb2dKMU5vWVhCbE9pQkRhWEpqYkdVbkxGeHVYSFJjZEZ4MFhIUmNkSE5vWVhCbFZHaDFiV0p1WVdsc09pQW5VMmhoY0dVNklGUm9kVzFpYm1GcGJDY3NYRzVjZEZ4MFhIUmNkRngwYzJoaGNHVk9iMjVsT2lBblUyaGhjR1U2SUU1dmJtVW5MRnh1WEhSY2RGeDBYSFJjZEdSeVlXZEpiV0ZuWlVobGNtVTZJQ2RFY21GbklHbHRZV2RsSUc5eUlIUmxlSFFnYUdWeVpTY3NYRzVjZEZ4MFhIUmNkRngwWkhKdmNFbHRZV2RsT2lBblJISnZjQ0JwYldGblpTQnZjaUJVWlhoMEp5eGNibHgwWEhSY2RGeDBYSFJ6Wld4bFkzUkdjbTl0Um1sc1pYTTZJQ2RUWld4bFkzUWdabkp2YlNCbWFXeGxjeWNzWEc1Y2RGeDBYSFJjZEZ4MGJXRjRhVzExYlVacGJHVlRhWHBsT2lBblRXRjRhVzExYlNCbWFXeGxJSE5wZW1VbkxGeHVYSFJjZEZ4MFhIUmNkRzFoZUdsdGRXMUdhV3hsVTJsNlpVVnljbTl5T2lBblRXRjRhVzExYlNCbWFXeGxJSE5wZW1VZ1pYaGpaV1ZrWldRdUp5eGNibHgwWEhSY2RGeDBYSFIxY213NklDZEpiV0ZuWlNCVlVrd25MRnh1WEhSY2RGeDBYSFJjZEhKbGJXOTJaVG9nSjFKbGJXOTJaU0JKYldGblpTZGNibHgwWEhSY2RGeDBmU3hjYmx4MFhIUmNkRngwYkdsdWF6b2dlMXh1WEhSY2RGeDBYSFJjZEd4cGJtczZJQ2RNYVc1ckp5eGNibHgwWEhSY2RGeDBYSFJwYm5ObGNuUTZJQ2RKYm5ObGNuUWdUR2x1YXljc1hHNWNkRngwWEhSY2RGeDBkVzVzYVc1ck9pQW5WVzVzYVc1ckp5eGNibHgwWEhSY2RGeDBYSFJsWkdsME9pQW5SV1JwZENjc1hHNWNkRngwWEhSY2RGeDBkR1Y0ZEZSdlJHbHpjR3hoZVRvZ0oxUmxlSFFnZEc4Z1pHbHpjR3hoZVNjc1hHNWNkRngwWEhSY2RGeDBkWEpzT2lBblZHOGdkMmhoZENCVlVrd2djMmh2ZFd4a0lIUm9hWE1nYkdsdWF5Qm5iejhuTEZ4dVhIUmNkRngwWEhSY2RHOXdaVzVKYms1bGQxZHBibVJ2ZHpvZ0owOXdaVzRnYVc0Z2JtVjNJSGRwYm1SdmR5ZGNibHgwWEhSY2RGeDBmU3hjYmx4MFhIUmNkRngwZEdGaWJHVTZJSHRjYmx4MFhIUmNkRngwWEhSMFlXSnNaVG9nSjFSaFlteGxKMXh1WEhSY2RGeDBYSFI5TEZ4dVhIUmNkRngwWEhSb2Nqb2dlMXh1WEhSY2RGeDBYSFJjZEdsdWMyVnlkRG9nSjBsdWMyVnlkQ0JJYjNKcGVtOXVkR0ZzSUZKMWJHVW5YRzVjZEZ4MFhIUmNkSDBzWEc1Y2RGeDBYSFJjZEhOMGVXeGxPaUI3WEc1Y2RGeDBYSFJjZEZ4MGMzUjViR1U2SUNkVGRIbHNaU2NzWEc1Y2RGeDBYSFJjZEZ4MGJtOXliV0ZzT2lBblRtOXliV0ZzSnl4Y2JseDBYSFJjZEZ4MFhIUmliRzlqYTNGMWIzUmxPaUFuVVhWdmRHVW5MRnh1WEhSY2RGeDBYSFJjZEhCeVpUb2dKME52WkdVbkxGeHVYSFJjZEZ4MFhIUmNkR2d4T2lBblNHVmhaR1Z5SURFbkxGeHVYSFJjZEZ4MFhIUmNkR2d5T2lBblNHVmhaR1Z5SURJbkxGeHVYSFJjZEZ4MFhIUmNkR2d6T2lBblNHVmhaR1Z5SURNbkxGeHVYSFJjZEZ4MFhIUmNkR2cwT2lBblNHVmhaR1Z5SURRbkxGeHVYSFJjZEZ4MFhIUmNkR2cxT2lBblNHVmhaR1Z5SURVbkxGeHVYSFJjZEZ4MFhIUmNkR2cyT2lBblNHVmhaR1Z5SURZblhHNWNkRngwWEhSY2RIMHNYRzVjZEZ4MFhIUmNkR3hwYzNSek9pQjdYRzVjZEZ4MFhIUmNkRngwZFc1dmNtUmxjbVZrT2lBblZXNXZjbVJsY21Wa0lHeHBjM1FuTEZ4dVhIUmNkRngwWEhSY2RHOXlaR1Z5WldRNklDZFBjbVJsY21Wa0lHeHBjM1FuWEc1Y2RGeDBYSFJjZEgwc1hHNWNkRngwWEhSY2RHOXdkR2x2Ym5NNklIdGNibHgwWEhSY2RGeDBYSFJvWld4d09pQW5TR1ZzY0Njc1hHNWNkRngwWEhSY2RGeDBablZzYkhOamNtVmxiam9nSjBaMWJHd2dVMk55WldWdUp5eGNibHgwWEhSY2RGeDBYSFJqYjJSbGRtbGxkem9nSjBOdlpHVWdWbWxsZHlkY2JseDBYSFJjZEZ4MGZTeGNibHgwWEhSY2RGeDBjR0Z5WVdkeVlYQm9PaUI3WEc1Y2RGeDBYSFJjZEZ4MGNHRnlZV2R5WVhCb09pQW5VR0Z5WVdkeVlYQm9KeXhjYmx4MFhIUmNkRngwWEhSdmRYUmtaVzUwT2lBblQzVjBaR1Z1ZENjc1hHNWNkRngwWEhSY2RGeDBhVzVrWlc1ME9pQW5TVzVrWlc1MEp5eGNibHgwWEhSY2RGeDBYSFJzWldaME9pQW5RV3hwWjI0Z2JHVm1kQ2NzWEc1Y2RGeDBYSFJjZEZ4MFkyVnVkR1Z5T2lBblFXeHBaMjRnWTJWdWRHVnlKeXhjYmx4MFhIUmNkRngwWEhSeWFXZG9kRG9nSjBGc2FXZHVJSEpwWjJoMEp5eGNibHgwWEhSY2RGeDBYSFJxZFhOMGFXWjVPaUFuU25WemRHbG1lU0JtZFd4c0oxeHVYSFJjZEZ4MFhIUjlMRnh1WEhSY2RGeDBYSFJqYjJ4dmNqb2dlMXh1WEhSY2RGeDBYSFJjZEhKbFkyVnVkRG9nSjFKbFkyVnVkQ0JEYjJ4dmNpY3NYRzVjZEZ4MFhIUmNkRngwYlc5eVpUb2dKMDF2Y21VZ1EyOXNiM0luTEZ4dVhIUmNkRngwWEhSY2RHSmhZMnRuY205MWJtUTZJQ2RDWVdOclozSnZkVzVrSUVOdmJHOXlKeXhjYmx4MFhIUmNkRngwWEhSbWIzSmxaM0p2ZFc1a09pQW5SbTl5WldkeWIzVnVaQ0JEYjJ4dmNpY3NYRzVjZEZ4MFhIUmNkRngwZEhKaGJuTndZWEpsYm5RNklDZFVjbUZ1YzNCaGNtVnVkQ2NzWEc1Y2RGeDBYSFJjZEZ4MGMyVjBWSEpoYm5Od1lYSmxiblE2SUNkVFpYUWdkSEpoYm5Od1lYSmxiblFuTEZ4dVhIUmNkRngwWEhSY2RISmxjMlYwT2lBblVtVnpaWFFuTEZ4dVhIUmNkRngwWEhSY2RISmxjMlYwVkc5RVpXWmhkV3gwT2lBblVtVnpaWFFnZEc4Z1pHVm1ZWFZzZENkY2JseDBYSFJjZEZ4MGZTeGNibHgwWEhSY2RGeDBjMmh2Y25SamRYUTZJSHRjYmx4MFhIUmNkRngwWEhSemFHOXlkR04xZEhNNklDZExaWGxpYjJGeVpDQnphRzl5ZEdOMWRITW5MRnh1WEhSY2RGeDBYSFJjZEdOc2IzTmxPaUFuUTJ4dmMyVW5MRnh1WEhSY2RGeDBYSFJjZEhSbGVIUkdiM0p0WVhSMGFXNW5PaUFuVkdWNGRDQm1iM0p0WVhSMGFXNW5KeXhjYmx4MFhIUmNkRngwWEhSaFkzUnBiMjQ2SUNkQlkzUnBiMjRuTEZ4dVhIUmNkRngwWEhSY2RIQmhjbUZuY21Gd2FFWnZjbTFoZEhScGJtYzZJQ2RRWVhKaFozSmhjR2dnWm05eWJXRjBkR2x1Wnljc1hHNWNkRngwWEhSY2RGeDBaRzlqZFcxbGJuUlRkSGxzWlRvZ0owUnZZM1Z0Wlc1MElGTjBlV3hsSnl4Y2JseDBYSFJjZEZ4MFhIUmxlSFJ5WVV0bGVYTTZJQ2RGZUhSeVlTQnJaWGx6SjF4dVhIUmNkRngwWEhSOUxGeHVYSFJjZEZ4MFhIUm9hWE4wYjNKNU9pQjdYRzVjZEZ4MFhIUmNkRngwZFc1a2J6b2dKMVZ1Wkc4bkxGeHVYSFJjZEZ4MFhIUmNkSEpsWkc4NklDZFNaV1J2SjF4dVhIUmNkRngwWEhSOVhHNWNkRngwWEhSOVhHNWNkRngwZlZ4dVhIUjlPMXh1WEc1Y2RDOHFLbHh1WEhRZ0tpQkFZMnhoYzNNZ1kyOXlaUzVoYzNsdVkxeHVYSFFnS2x4dVhIUWdLaUJCYzNsdVl5Qm1kVzVqZEdsdmJuTWdkMmhwWTJnZ2NtVjBkWEp1Y3lCZ1VISnZiV2x6WldCY2JseDBJQ3BjYmx4MElDb2dRSE5wYm1kc1pYUnZibHh1WEhRZ0tpQkFZV3gwWlhKdVlYUmxRMnhoYzNOT1lXMWxJR0Z6ZVc1alhHNWNkQ0FxTDF4dVhIUjJZWElnWVhONWJtTWdQU0FvWm5WdVkzUnBiMjRnS0NrZ2UxeHVYSFJjZEM4cUtseHVYSFJjZENBcUlFQnRaWFJvYjJRZ2NtVmhaRVpwYkdWQmMwUmhkR0ZWVWt4Y2JseDBYSFFnS2x4dVhIUmNkQ0FxSUhKbFlXUWdZMjl1ZEdWdWRITWdiMllnWm1sc1pTQmhjeUJ5WlhCeVpYTmxiblJwYm1jZ1ZWSk1YRzVjZEZ4MElDcGNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UwWnBiR1Y5SUdacGJHVmNibHgwWEhRZ0tpQkFjbVYwZFhKdUlIdFFjbTl0YVhObGZTQXRJSFJvWlc0NklITkVZWFJoVlhKc1hHNWNkRngwSUNvdlhHNWNkRngwZG1GeUlISmxZV1JHYVd4bFFYTkVZWFJoVlZKTUlEMGdablZ1WTNScGIyNGdLR1pwYkdVcElIdGNibHgwWEhSY2RISmxkSFZ5YmlBa0xrUmxabVZ5Y21Wa0tHWjFibU4wYVc5dUlDaGtaV1psY25KbFpDa2dlMXh1WEhSY2RGeDBYSFFrTG1WNGRHVnVaQ2h1WlhjZ1JtbHNaVkpsWVdSbGNpZ3BMQ0I3WEc1Y2RGeDBYSFJjZEZ4MGIyNXNiMkZrT2lCbWRXNWpkR2x2YmlBb1pTa2dlMXh1WEhSY2RGeDBYSFJjZEZ4MGRtRnlJSE5FWVhSaFZWSk1JRDBnWlM1MFlYSm5aWFF1Y21WemRXeDBPMXh1WEhSY2RGeDBYSFJjZEZ4MFpHVm1aWEp5WldRdWNtVnpiMngyWlNoelJHRjBZVlZTVENrN1hHNWNkRngwWEhSY2RGeDBmU3hjYmx4MFhIUmNkRngwWEhSdmJtVnljbTl5T2lCbWRXNWpkR2x2YmlBb0tTQjdYRzVjZEZ4MFhIUmNkRngwWEhSa1pXWmxjbkpsWkM1eVpXcGxZM1FvZEdocGN5azdYRzVjZEZ4MFhIUmNkRngwZlZ4dVhIUmNkRngwWEhSOUtTNXlaV0ZrUVhORVlYUmhWVkpNS0dacGJHVXBPMXh1WEhSY2RGeDBmU2t1Y0hKdmJXbHpaU2dwTzF4dVhIUmNkSDA3WEc1Y2JseDBYSFF2S2lwY2JseDBYSFFnS2lCQWJXVjBhRzlrSUdOeVpXRjBaVWx0WVdkbFhHNWNkRngwSUNwY2JseDBYSFFnS2lCamNtVmhkR1VnWUR4cGJXRm5aVDVnSUdaeWIyMGdkWEpzSUhOMGNtbHVaMXh1WEhSY2RDQXFYRzVjZEZ4MElDb2dRSEJoY21GdElIdFRkSEpwYm1kOUlITlZjbXhjYmx4MFhIUWdLaUJBY0dGeVlXMGdlMU4wY21sdVozMGdabWxzWlc1aGJXVmNibHgwWEhRZ0tpQkFjbVYwZFhKdUlIdFFjbTl0YVhObGZTQXRJSFJvWlc0NklDUnBiV0ZuWlZ4dVhIUmNkQ0FxTDF4dVhIUmNkSFpoY2lCamNtVmhkR1ZKYldGblpTQTlJR1oxYm1OMGFXOXVJQ2h6VlhKc0xDQm1hV3hsYm1GdFpTa2dlMXh1WEhSY2RGeDBjbVYwZFhKdUlDUXVSR1ZtWlhKeVpXUW9ablZ1WTNScGIyNGdLR1JsWm1WeWNtVmtLU0I3WEc1Y2RGeDBYSFJjZEhaaGNpQWthVzFuSUQwZ0pDZ25QR2x0Wno0bktUdGNibHh1WEhSY2RGeDBYSFFrYVcxbkxtOXVaU2duYkc5aFpDY3NJR1oxYm1OMGFXOXVJQ2dwSUh0Y2JseDBYSFJjZEZ4MFhIUWthVzFuTG05bVppZ25aWEp5YjNJZ1lXSnZjblFuS1R0Y2JseDBYSFJjZEZ4MFhIUmtaV1psY25KbFpDNXlaWE52YkhabEtDUnBiV2NwTzF4dVhIUmNkRngwWEhSOUtTNXZibVVvSjJWeWNtOXlJR0ZpYjNKMEp5d2dablZ1WTNScGIyNGdLQ2tnZTF4dVhIUmNkRngwWEhSY2RDUnBiV2N1YjJabUtDZHNiMkZrSnlrdVpHVjBZV05vS0NrN1hHNWNkRngwWEhSY2RGeDBaR1ZtWlhKeVpXUXVjbVZxWldOMEtDUnBiV2NwTzF4dVhIUmNkRngwWEhSOUtTNWpjM01vZTF4dVhIUmNkRngwWEhSY2RHUnBjM0JzWVhrNklDZHViMjVsSjF4dVhIUmNkRngwWEhSOUtTNWhjSEJsYm1SVWJ5aGtiMk4xYldWdWRDNWliMlI1S1M1aGRIUnlLSHRjYmx4MFhIUmNkRngwWEhRbmMzSmpKem9nYzFWeWJDeGNibHgwWEhSY2RGeDBYSFFuWkdGMFlTMW1hV3hsYm1GdFpTYzZJR1pwYkdWdVlXMWxYRzVjZEZ4MFhIUmNkSDBwTzF4dVhIUmNkRngwZlNrdWNISnZiV2x6WlNncE8xeHVYSFJjZEgwN1hHNWNibHgwWEhSeVpYUjFjbTRnZTF4dVhIUmNkRngwY21WaFpFWnBiR1ZCYzBSaGRHRlZVa3c2SUhKbFlXUkdhV3hsUVhORVlYUmhWVkpNTEZ4dVhIUmNkRngwWTNKbFlYUmxTVzFoWjJVNklHTnlaV0YwWlVsdFlXZGxYRzVjZEZ4MGZUdGNibHgwZlNrb0tUdGNibHh1WEhRdktpcGNibHgwSUNvZ1FHTnNZWE56SUdOdmNtVXVhMlY1WEc1Y2RDQXFYRzVjZENBcUlFOWlhbVZqZENCbWIzSWdhMlY1WTI5a1pYTXVYRzVjZENBcVhHNWNkQ0FxSUVCemFXNW5iR1YwYjI1Y2JseDBJQ29nUUdGc2RHVnlibUYwWlVOc1lYTnpUbUZ0WlNCclpYbGNibHgwSUNvdlhHNWNkSFpoY2lCclpYa2dQU0I3WEc1Y2RGeDBMeW9xWEc1Y2RGeDBJQ29nUUcxbGRHaHZaQ0JwYzBWa2FYUmNibHgwWEhRZ0tseHVYSFJjZENBcUlFQndZWEpoYlNCN1RuVnRZbVZ5ZlNCclpYbERiMlJsWEc1Y2RGeDBJQ29nUUhKbGRIVnliaUI3UW05dmJHVmhibjFjYmx4MFhIUWdLaTljYmx4MFhIUnBjMFZrYVhRNklHWjFibU4wYVc5dUlDaHJaWGxEYjJSbEtTQjdYRzVjZEZ4MFhIUnlaWFIxY200Z2JHbHpkQzVqYjI1MFlXbHVjeWhiT0N3Z09Td2dNVE1zSURNeVhTd2dhMlY1UTI5a1pTazdYRzVjZEZ4MGZTeGNibHgwWEhRdktpcGNibHgwWEhRZ0tpQkFjSEp2Y0dWeWRIa2dlMDlpYW1WamRIMGdibUZ0WlVaeWIyMURiMlJsWEc1Y2RGeDBJQ29nUUhCeWIzQmxjblI1SUh0VGRISnBibWQ5SUc1aGJXVkdjbTl0UTI5a1pTNDRJRndpUWtGRFMxTlFRVU5GWENKY2JseDBYSFFnS2k5Y2JseDBYSFJ1WVcxbFJuSnZiVU52WkdVNklIdGNibHgwWEhSY2RDYzRKem9nSjBKQlEwdFRVRUZEUlNjc1hHNWNkRngwWEhRbk9TYzZJQ2RVUVVJbkxGeHVYSFJjZEZ4MEp6RXpKem9nSjBWT1ZFVlNKeXhjYmx4MFhIUmNkQ2N6TWljNklDZFRVRUZEUlNjc1hHNWNibHgwWEhSY2RDOHZJRTUxYldKbGNqb2dNQzA1WEc1Y2RGeDBYSFFuTkRnbk9pQW5UbFZOTUNjc1hHNWNkRngwWEhRbk5Ea25PaUFuVGxWTk1TY3NYRzVjZEZ4MFhIUW5OVEFuT2lBblRsVk5NaWNzWEc1Y2RGeDBYSFFuTlRFbk9pQW5UbFZOTXljc1hHNWNkRngwWEhRbk5USW5PaUFuVGxWTk5DY3NYRzVjZEZ4MFhIUW5OVE1uT2lBblRsVk5OU2NzWEc1Y2RGeDBYSFFuTlRRbk9pQW5UbFZOTmljc1hHNWNkRngwWEhRbk5UVW5PaUFuVGxWTk55Y3NYRzVjZEZ4MFhIUW5OVFluT2lBblRsVk5PQ2NzWEc1Y2JseDBYSFJjZEM4dklFRnNjR2hoWW1WME9pQmhMWHBjYmx4MFhIUmNkQ2MyTmljNklDZENKeXhjYmx4MFhIUmNkQ2MyT1NjNklDZEZKeXhjYmx4MFhIUmNkQ2MzTXljNklDZEpKeXhjYmx4MFhIUmNkQ2MzTkNjNklDZEtKeXhjYmx4MFhIUmNkQ2MzTlNjNklDZExKeXhjYmx4MFhIUmNkQ2MzTmljNklDZE1KeXhjYmx4MFhIUmNkQ2M0TWljNklDZFNKeXhjYmx4MFhIUmNkQ2M0TXljNklDZFRKeXhjYmx4MFhIUmNkQ2M0TlNjNklDZFZKeXhjYmx4MFhIUmNkQ2M0T1NjNklDZFpKeXhjYmx4MFhIUmNkQ2M1TUNjNklDZGFKeXhjYmx4dVhIUmNkRngwSnpFNU1TYzZJQ2RUVEVGVFNDY3NYRzVjZEZ4MFhIUW5NakU1SnpvZ0oweEZSbFJDVWtGRFMwVlVKeXhjYmx4MFhIUmNkQ2N5TWpBbk9pQW5Ra0ZEUzFOTVFWTklKeXhjYmx4MFhIUmNkQ2N5TWpFbk9pQW5Va2xIU0ZSQ1VrRkRTMFZVSjF4dVhIUmNkSDFjYmx4MGZUdGNibHh1WEhRdktpcGNibHgwSUNvZ1FHTnNZWE56SUdWa2FYUnBibWN1U0dsemRHOXllVnh1WEhRZ0tseHVYSFFnS2lCRlpHbDBiM0lnU0dsemRHOXllVnh1WEhRZ0tseHVYSFFnS2k5Y2JseDBkbUZ5SUVocGMzUnZjbmtnUFNCbWRXNWpkR2x2YmlBb0pHVmthWFJoWW14bEtTQjdYRzVjZEZ4MGRtRnlJSE4wWVdOcklEMGdXMTBzSUhOMFlXTnJUMlptYzJWMElEMGdMVEU3WEc1Y2RGeDBkbUZ5SUdWa2FYUmhZbXhsSUQwZ0pHVmthWFJoWW14bFd6QmRPMXh1WEc1Y2RGeDBkbUZ5SUcxaGEyVlRibUZ3YzJodmRDQTlJR1oxYm1OMGFXOXVJQ2dwSUh0Y2JseDBYSFJjZEhaaGNpQnlibWNnUFNCeVlXNW5aUzVqY21WaGRHVW9LVHRjYmx4MFhIUmNkSFpoY2lCbGJYQjBlVUp2YjJ0dFlYSnJJRDBnZXlCek9pQjdJSEJoZEdnNklGdGRMQ0J2Wm1aelpYUTZJREFnZlN3Z1pUb2dleUJ3WVhSb09pQmJYU3dnYjJabWMyVjBPaUF3SUgwZ2ZUdGNibHh1WEhSY2RGeDBjbVYwZFhKdUlIdGNibHgwWEhSY2RGeDBZMjl1ZEdWdWRITTZJQ1JsWkdsMFlXSnNaUzVvZEcxc0tDa3NYRzVjZEZ4MFhIUmNkR0p2YjJ0dFlYSnJPaUFvY201bklEOGdjbTVuTG1KdmIydHRZWEpyS0dWa2FYUmhZbXhsS1NBNklHVnRjSFI1UW05dmEyMWhjbXNwWEc1Y2RGeDBYSFI5TzF4dVhIUmNkSDA3WEc1Y2JseDBYSFIyWVhJZ1lYQndiSGxUYm1Gd2MyaHZkQ0E5SUdaMWJtTjBhVzl1SUNoemJtRndjMmh2ZENrZ2UxeHVYSFJjZEZ4MGFXWWdLSE51WVhCemFHOTBMbU52Ym5SbGJuUnpJQ0U5UFNCdWRXeHNLU0I3WEc1Y2RGeDBYSFJjZENSbFpHbDBZV0pzWlM1b2RHMXNLSE51WVhCemFHOTBMbU52Ym5SbGJuUnpLVHRjYmx4MFhIUmNkSDFjYmx4MFhIUmNkR2xtSUNoemJtRndjMmh2ZEM1aWIyOXJiV0Z5YXlBaFBUMGdiblZzYkNrZ2UxeHVYSFJjZEZ4MFhIUnlZVzVuWlM1amNtVmhkR1ZHY205dFFtOXZhMjFoY21zb1pXUnBkR0ZpYkdVc0lITnVZWEJ6YUc5MExtSnZiMnR0WVhKcktTNXpaV3hsWTNRb0tUdGNibHgwWEhSY2RIMWNibHgwWEhSOU8xeHVYRzVjZEZ4MEx5b3FYRzVjZEZ4MElDb2dkVzVrYjF4dVhIUmNkQ0FxTDF4dVhIUmNkSFJvYVhNdWRXNWtieUE5SUdaMWJtTjBhVzl1SUNncElIdGNibHgwWEhSY2RHbG1JQ2d3SUR3Z2MzUmhZMnRQWm1aelpYUXBJSHRjYmx4MFhIUmNkRngwYzNSaFkydFBabVp6WlhRdExUdGNibHgwWEhSY2RGeDBZWEJ3YkhsVGJtRndjMmh2ZENoemRHRmphMXR6ZEdGamEwOW1abk5sZEYwcE8xeHVYSFJjZEZ4MGZWeHVYSFJjZEgwN1hHNWNibHgwWEhRdktpcGNibHgwWEhRZ0tpQnlaV1J2WEc1Y2RGeDBJQ292WEc1Y2RGeDBkR2hwY3k1eVpXUnZJRDBnWm5WdVkzUnBiMjRnS0NrZ2UxeHVYSFJjZEZ4MGFXWWdLSE4wWVdOckxteGxibWQwYUNBdElERWdQaUJ6ZEdGamEwOW1abk5sZENrZ2UxeHVYSFJjZEZ4MFhIUnpkR0ZqYTA5bVpuTmxkQ3NyTzF4dVhIUmNkRngwWEhSaGNIQnNlVk51WVhCemFHOTBLSE4wWVdOclczTjBZV05yVDJabWMyVjBYU2s3WEc1Y2RGeDBYSFI5WEc1Y2RGeDBmVHRjYmx4dVhIUmNkQzhxS2x4dVhIUmNkQ0FxSUhKbFkyOXlaR1ZrSUhWdVpHOWNibHgwWEhRZ0tpOWNibHgwWEhSMGFHbHpMbkpsWTI5eVpGVnVaRzhnUFNCbWRXNWpkR2x2YmlBb0tTQjdYRzVjZEZ4MFhIUnpkR0ZqYTA5bVpuTmxkQ3NyTzF4dVhHNWNkRngwWEhRdkx5QlhZWE5vSUc5MWRDQnpkR0ZqYXlCaFpuUmxjaUJ6ZEdGamEwOW1abk5sZEZ4dVhIUmNkRngwYVdZZ0tITjBZV05yTG14bGJtZDBhQ0ErSUhOMFlXTnJUMlptYzJWMEtTQjdYRzVjZEZ4MFhIUmNkSE4wWVdOcklEMGdjM1JoWTJzdWMyeHBZMlVvTUN3Z2MzUmhZMnRQWm1aelpYUXBPMXh1WEhSY2RGeDBmVnh1WEc1Y2RGeDBYSFF2THlCRGNtVmhkR1VnYm1WM0lITnVZWEJ6YUc5MElHRnVaQ0J3ZFhOb0lHbDBJSFJ2SUhSb1pTQmxibVJjYmx4MFhIUmNkSE4wWVdOckxuQjFjMmdvYldGclpWTnVZWEJ6YUc5MEtDa3BPMXh1WEhSY2RIMDdYRzVjYmx4MFhIUXZMeUJEY21WaGRHVWdabWx5YzNRZ2RXNWtieUJ6ZEdGamExeHVYSFJjZEhSb2FYTXVjbVZqYjNKa1ZXNWtieWdwTzF4dVhIUjlPMXh1WEc1Y2RDOHFLbHh1WEhRZ0tpQkFZMnhoYzNNZ1pXUnBkR2x1Wnk1VGRIbHNaVnh1WEhRZ0tseHVYSFFnS2lCVGRIbHNaVnh1WEhRZ0tseHVYSFFnS2k5Y2JseDBkbUZ5SUZOMGVXeGxJRDBnWm5WdVkzUnBiMjRnS0NrZ2UxeHVYSFJjZEM4cUtseHVYSFJjZENBcUlFQnRaWFJvYjJRZ2FsRjFaWEo1UTFOVFhHNWNkRngwSUNwY2JseDBYSFFnS2lCd1lYTnphVzVuSUdGdUlHRnljbUY1SUc5bUlITjBlV3hsSUhCeWIzQmxjblJwWlhNZ2RHOGdMbU56Y3lncFhHNWNkRngwSUNvZ2QybHNiQ0J5WlhOMWJIUWdhVzRnWVc0Z2IySnFaV04wSUc5bUlIQnliM0JsY25SNUxYWmhiSFZsSUhCaGFYSnpMbHh1WEhSY2RDQXFJQ2hqYjIxd1lXSnBiR2wwZVNCM2FYUm9JSFpsY25OcGIyNGdQQ0F4TGprcFhHNWNkRngwSUNwY2JseDBYSFFnS2lCQWNISnBkbUYwWlZ4dVhIUmNkQ0FxSUVCd1lYSmhiU0FnZTJwUmRXVnllWDBnSkc5aWFseHVYSFJjZENBcUlFQndZWEpoYlNBZ2UwRnljbUY1ZlNCd2NtOXdaWEowZVU1aGJXVnpJQzBnUVc0Z1lYSnlZWGtnYjJZZ2IyNWxJRzl5SUcxdmNtVWdRMU5USUhCeWIzQmxjblJwWlhNdVhHNWNkRngwSUNvZ1FISmxkSFZ5YmlCN1QySnFaV04wZlZ4dVhIUmNkQ0FxTDF4dVhIUmNkSFpoY2lCcVVYVmxjbmxEVTFNZ1BTQm1kVzVqZEdsdmJpQW9KRzlpYWl3Z2NISnZjR1Z5ZEhsT1lXMWxjeWtnZTF4dVhIUmNkRngwYVdZZ0tHRm5aVzUwTG1weGRXVnllVlpsY25OcGIyNGdQQ0F4TGprcElIdGNibHgwWEhSY2RGeDBkbUZ5SUhKbGMzVnNkQ0E5SUh0OU8xeHVYSFJjZEZ4MFhIUWtMbVZoWTJnb2NISnZjR1Z5ZEhsT1lXMWxjeXdnWm5WdVkzUnBiMjRnS0dsa2VDd2djSEp2Y0dWeWRIbE9ZVzFsS1NCN1hHNWNkRngwWEhSY2RGeDBjbVZ6ZFd4MFczQnliM0JsY25SNVRtRnRaVjBnUFNBa2IySnFMbU56Y3lod2NtOXdaWEowZVU1aGJXVXBPMXh1WEhSY2RGeDBYSFI5S1R0Y2JseDBYSFJjZEZ4MGNtVjBkWEp1SUhKbGMzVnNkRHRjYmx4MFhIUmNkSDFjYmx4MFhIUmNkSEpsZEhWeWJpQWtiMkpxTG1OemN5NWpZV3hzS0NSdlltb3NJSEJ5YjNCbGNuUjVUbUZ0WlhNcE8xeHVYSFJjZEgwN1hHNWNibHgwWEhRdktpcGNibHgwWEhRZ0tpQndZWEpoWjNKaGNHZ2diR1YyWld3Z2MzUjViR1ZjYmx4MFhIUWdLbHh1WEhSY2RDQXFJRUJ3WVhKaGJTQjdWM0poY0hCbFpGSmhibWRsZlNCeWJtZGNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UwOWlhbVZqZEgwZ2MzUjViR1ZKYm1adlhHNWNkRngwSUNvdlhHNWNkRngwZEdocGN5NXpkSGxzWlZCaGNtRWdQU0JtZFc1amRHbHZiaUFvY201bkxDQnpkSGxzWlVsdVptOHBJSHRjYmx4MFhIUmNkQ1F1WldGamFDaHlibWN1Ym05a1pYTW9aRzl0TG1selVHRnlZU3dnZTF4dVhIUmNkRngwWEhScGJtTnNkV1JsUVc1alpYTjBiM0k2SUhSeWRXVmNibHgwWEhSY2RIMHBMQ0JtZFc1amRHbHZiaUFvYVdSNExDQndZWEpoS1NCN1hHNWNkRngwWEhSY2RDUW9jR0Z5WVNrdVkzTnpLSE4wZVd4bFNXNW1ieWs3WEc1Y2RGeDBYSFI5S1R0Y2JseDBYSFI5TzF4dVhHNWNkRngwTHlvcVhHNWNkRngwSUNvZ2FXNXpaWEowSUdGdVpDQnlaWFIxY201eklITjBlV3hsVG05a1pYTWdiMjRnY21GdVoyVXVYRzVjZEZ4MElDcGNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UxZHlZWEJ3WldSU1lXNW5aWDBnY201blhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0UFltcGxZM1I5SUZ0dmNIUnBiMjV6WFNBdElHOXdkR2x2Ym5NZ1ptOXlJSE4wZVd4bFRtOWtaWE5jYmx4MFhIUWdLaUJBY0dGeVlXMGdlMU4wY21sdVozMGdXMjl3ZEdsdmJuTXVibTlrWlU1aGJXVmRJQzBnWkdWbVlYVnNkRG9nWUZOUVFVNWdYRzVjZEZ4MElDb2dRSEJoY21GdElIdENiMjlzWldGdWZTQmJiM0IwYVc5dWN5NWxlSEJoYm1SRGJHOXpaWE4wVTJsaWJHbHVaMTBnTFNCa1pXWmhkV3gwT2lCZ1ptRnNjMlZnWEc1Y2RGeDBJQ29nUUhCaGNtRnRJSHRDYjI5c1pXRnVmU0JiYjNCMGFXOXVjeTV2Ym14NVVHRnlkR2xoYkVOdmJuUmhhVzV6WFNBdElHUmxabUYxYkhRNklHQm1ZV3h6WldCY2JseDBYSFFnS2lCQWNtVjBkWEp1SUh0T2IyUmxXMTE5WEc1Y2RGeDBJQ292WEc1Y2RGeDBkR2hwY3k1emRIbHNaVTV2WkdWeklEMGdablZ1WTNScGIyNGdLSEp1Wnl3Z2IzQjBhVzl1Y3lrZ2UxeHVYSFJjZEZ4MGNtNW5JRDBnY201bkxuTndiR2wwVkdWNGRDZ3BPMXh1WEc1Y2RGeDBYSFIyWVhJZ2JtOWtaVTVoYldVZ1BTQnZjSFJwYjI1eklDWW1JRzl3ZEdsdmJuTXVibTlrWlU1aGJXVWdmSHdnSjFOUVFVNG5PMXh1WEhSY2RGeDBkbUZ5SUdWNGNHRnVaRU5zYjNObGMzUlRhV0pzYVc1bklEMGdJU0VvYjNCMGFXOXVjeUFtSmlCdmNIUnBiMjV6TG1WNGNHRnVaRU5zYjNObGMzUlRhV0pzYVc1bktUdGNibHgwWEhSY2RIWmhjaUJ2Ym14NVVHRnlkR2xoYkVOdmJuUmhhVzV6SUQwZ0lTRW9iM0IwYVc5dWN5QW1KaUJ2Y0hScGIyNXpMbTl1YkhsUVlYSjBhV0ZzUTI5dWRHRnBibk1wTzF4dVhHNWNkRngwWEhScFppQW9jbTVuTG1selEyOXNiR0Z3YzJWa0tDa3BJSHRjYmx4MFhIUmNkRngwY21WMGRYSnVJSEp1Wnk1cGJuTmxjblJPYjJSbEtHUnZiUzVqY21WaGRHVW9ibTlrWlU1aGJXVXBLVHRjYmx4MFhIUmNkSDFjYmx4dVhIUmNkRngwZG1GeUlIQnlaV1FnUFNCa2IyMHViV0ZyWlZCeVpXUkNlVTV2WkdWT1lXMWxLRzV2WkdWT1lXMWxLVHRjYmx4MFhIUmNkSFpoY2lCdWIyUmxjeUE5SUNRdWJXRndLSEp1Wnk1dWIyUmxjeWhrYjIwdWFYTlVaWGgwTENCN1hHNWNkRngwWEhSY2RHWjFiR3g1UTI5dWRHRnBibk02SUhSeWRXVmNibHgwWEhSY2RIMHBMQ0JtZFc1amRHbHZiaUFvZEdWNGRDa2dlMXh1WEhSY2RGeDBYSFJ5WlhSMWNtNGdaRzl0TG5OcGJtZHNaVU5vYVd4a1FXNWpaWE4wYjNJb2RHVjRkQ3dnY0hKbFpDa2dmSHdnWkc5dExuZHlZWEFvZEdWNGRDd2dibTlrWlU1aGJXVXBPMXh1WEhSY2RGeDBmU2s3WEc1Y2JseDBYSFJjZEdsbUlDaGxlSEJoYm1SRGJHOXpaWE4wVTJsaWJHbHVaeWtnZTF4dVhIUmNkRngwWEhScFppQW9iMjVzZVZCaGNuUnBZV3hEYjI1MFlXbHVjeWtnZTF4dVhIUmNkRngwWEhSY2RIWmhjaUJ1YjJSbGMwbHVVbUZ1WjJVZ1BTQnlibWN1Ym05a1pYTW9LVHRjYmx4MFhIUmNkRngwWEhRdkx5QmpiMjF3YjNObElIZHBkR2dnY0dGeWRHbGhiQ0JqYjI1MFlXbHVjeUJ3Y21Wa2FXTmhkR2x2Ymx4dVhIUmNkRngwWEhSY2RIQnlaV1FnUFNCbWRXNWpMbUZ1WkNod2NtVmtMQ0JtZFc1amRHbHZiaUFvYm05a1pTa2dlMXh1WEhSY2RGeDBYSFJjZEZ4MGNtVjBkWEp1SUd4cGMzUXVZMjl1ZEdGcGJuTW9ibTlrWlhOSmJsSmhibWRsTENCdWIyUmxLVHRjYmx4MFhIUmNkRngwWEhSOUtUdGNibHgwWEhSY2RGeDBmVnh1WEc1Y2RGeDBYSFJjZEhKbGRIVnliaUFrTG0xaGNDaHViMlJsY3l3Z1puVnVZM1JwYjI0Z0tHNXZaR1VwSUh0Y2JseDBYSFJjZEZ4MFhIUjJZWElnYzJsaWJHbHVaM01nUFNCa2IyMHVkMmwwYUVOc2IzTmxjM1JUYVdKc2FXNW5jeWh1YjJSbExDQndjbVZrS1R0Y2JseDBYSFJjZEZ4MFhIUjJZWElnYUdWaFpDQTlJR3hwYzNRdWFHVmhaQ2h6YVdKc2FXNW5jeWs3WEc1Y2RGeDBYSFJjZEZ4MGRtRnlJSFJoYVd4eklEMGdiR2x6ZEM1MFlXbHNLSE5wWW14cGJtZHpLVHRjYmx4MFhIUmNkRngwWEhRa0xtVmhZMmdvZEdGcGJITXNJR1oxYm1OMGFXOXVJQ2hwWkhnc0lHVnNaVzBwSUh0Y2JseDBYSFJjZEZ4MFhIUmNkR1J2YlM1aGNIQmxibVJEYUdsc1pFNXZaR1Z6S0dobFlXUXNJR1ZzWlcwdVkyaHBiR1JPYjJSbGN5azdYRzVjZEZ4MFhIUmNkRngwWEhSa2IyMHVjbVZ0YjNabEtHVnNaVzBwTzF4dVhIUmNkRngwWEhSY2RIMHBPMXh1WEhSY2RGeDBYSFJjZEhKbGRIVnliaUJzYVhOMExtaGxZV1FvYzJsaWJHbHVaM01wTzF4dVhIUmNkRngwWEhSOUtUdGNibHgwWEhSY2RIMGdaV3h6WlNCN1hHNWNkRngwWEhSY2RISmxkSFZ5YmlCdWIyUmxjenRjYmx4MFhIUmNkSDFjYmx4MFhIUjlPMXh1WEc1Y2RGeDBMeW9xWEc1Y2RGeDBJQ29nWjJWMElHTjFjbkpsYm5RZ2MzUjViR1VnYjI0Z1kzVnljMjl5WEc1Y2RGeDBJQ3BjYmx4MFhIUWdLaUJBY0dGeVlXMGdlMWR5WVhCd1pXUlNZVzVuWlgwZ2NtNW5YRzVjZEZ4MElDb2dRSEJoY21GdElIdE9iMlJsZlNCMFlYSm5aWFFnTFNCMFlYSm5aWFFnWld4bGJXVnVkQ0J2YmlCbGRtVnVkRnh1WEhSY2RDQXFJRUJ5WlhSMWNtNGdlMDlpYW1WamRIMGdMU0J2WW1wbFkzUWdZMjl1ZEdGcGJuTWdjM1I1YkdVZ2NISnZjR1Z5ZEdsbGN5NWNibHgwWEhRZ0tpOWNibHgwWEhSMGFHbHpMbU4xY25KbGJuUWdQU0JtZFc1amRHbHZiaUFvY201bkxDQjBZWEpuWlhRcElIdGNibHgwWEhSY2RIWmhjaUFrWTI5dWRDQTlJQ1FvWkc5dExtbHpWR1Y0ZENoeWJtY3VjMk1wSUQ4Z2NtNW5Mbk5qTG5CaGNtVnVkRTV2WkdVZ09pQnlibWN1YzJNcE8xeHVYSFJjZEZ4MGRtRnlJSEJ5YjNCbGNuUnBaWE1nUFNCYkoyWnZiblF0Wm1GdGFXeDVKeXdnSjJadmJuUXRjMmw2WlNjc0lDZDBaWGgwTFdGc2FXZHVKeXdnSjJ4cGMzUXRjM1I1YkdVdGRIbHdaU2NzSUNkc2FXNWxMV2hsYVdkb2RDZGRPMXh1WEhSY2RGeDBkbUZ5SUhOMGVXeGxTVzVtYnlBOUlHcFJkV1Z5ZVVOVFV5Z2tZMjl1ZEN3Z2NISnZjR1Z5ZEdsbGN5a2dmSHdnZTMwN1hHNWNibHgwWEhSY2RITjBlV3hsU1c1bWIxc25abTl1ZEMxemFYcGxKMTBnUFNCd1lYSnpaVWx1ZENoemRIbHNaVWx1Wm05YkoyWnZiblF0YzJsNlpTZGRMQ0F4TUNrN1hHNWNibHgwWEhSY2RDOHZJR1J2WTNWdFpXNTBMbkYxWlhKNVEyOXRiV0Z1WkZOMFlYUmxJR1p2Y2lCMGIyZG5iR1VnYzNSaGRHVmNibHgwWEhSY2RITjBlV3hsU1c1bWIxc25abTl1ZEMxaWIyeGtKMTBnUFNCa2IyTjFiV1Z1ZEM1eGRXVnllVU52YlcxaGJtUlRkR0YwWlNnblltOXNaQ2NwSUQ4Z0oySnZiR1FuSURvZ0oyNXZjbTFoYkNjN1hHNWNkRngwWEhSemRIbHNaVWx1Wm05YkoyWnZiblF0YVhSaGJHbGpKMTBnUFNCa2IyTjFiV1Z1ZEM1eGRXVnllVU52YlcxaGJtUlRkR0YwWlNnbmFYUmhiR2xqSnlrZ1B5QW5hWFJoYkdsakp5QTZJQ2R1YjNKdFlXd25PMXh1WEhSY2RGeDBjM1I1YkdWSmJtWnZXeWRtYjI1MExYVnVaR1Z5YkdsdVpTZGRJRDBnWkc5amRXMWxiblF1Y1hWbGNubERiMjF0WVc1a1UzUmhkR1VvSjNWdVpHVnliR2x1WlNjcElEOGdKM1Z1WkdWeWJHbHVaU2NnT2lBbmJtOXliV0ZzSnp0Y2JseDBYSFJjZEhOMGVXeGxTVzVtYjFzblptOXVkQzF6ZEhKcGEyVjBhSEp2ZFdkb0oxMGdQU0JrYjJOMWJXVnVkQzV4ZFdWeWVVTnZiVzFoYm1SVGRHRjBaU2duYzNSeWFXdGxWR2h5YjNWbmFDY3BJRDhnSjNOMGNtbHJaWFJvY205MVoyZ25JRG9nSjI1dmNtMWhiQ2M3WEc1Y2RGeDBYSFJ6ZEhsc1pVbHVabTliSjJadmJuUXRjM1Z3WlhKelkzSnBjSFFuWFNBOUlHUnZZM1Z0Wlc1MExuRjFaWEo1UTI5dGJXRnVaRk4wWVhSbEtDZHpkWEJsY25OamNtbHdkQ2NwSUQ4Z0ozTjFjR1Z5YzJOeWFYQjBKeUE2SUNkdWIzSnRZV3duTzF4dVhIUmNkRngwYzNSNWJHVkpibVp2V3lkbWIyNTBMWE4xWW5OamNtbHdkQ2RkSUQwZ1pHOWpkVzFsYm5RdWNYVmxjbmxEYjIxdFlXNWtVM1JoZEdVb0ozTjFZbk5qY21sd2RDY3BJRDhnSjNOMVluTmpjbWx3ZENjZ09pQW5ibTl5YldGc0p6dGNibHh1WEhSY2RGeDBMeThnYkdsemRDMXpkSGxzWlMxMGVYQmxJSFJ2SUd4cGMzUXRjM1I1YkdVb2RXNXZjbVJsY21Wa0xDQnZjbVJsY21Wa0tWeHVYSFJjZEZ4MGFXWWdLQ0Z5Ym1jdWFYTlBia3hwYzNRb0tTa2dlMXh1WEhSY2RGeDBYSFJ6ZEhsc1pVbHVabTliSjJ4cGMzUXRjM1I1YkdVblhTQTlJQ2R1YjI1bEp6dGNibHgwWEhSY2RIMGdaV3h6WlNCN1hHNWNkRngwWEhSY2RIWmhjaUJoVDNKa1pYSmxaRlI1Y0dVZ1BTQmJKMk5wY21Oc1pTY3NJQ2RrYVhOakp5d2dKMlJwYzJNdGJHVmhaR2x1WnkxNlpYSnZKeXdnSjNOeGRXRnlaU2RkTzF4dVhIUmNkRngwWEhSMllYSWdhWE5WYm05eVpHVnlaV1FnUFNBa0xtbHVRWEp5WVhrb2MzUjViR1ZKYm1adld5ZHNhWE4wTFhOMGVXeGxMWFI1Y0dVblhTd2dZVTl5WkdWeVpXUlVlWEJsS1NBK0lDMHhPMXh1WEhSY2RGeDBYSFJ6ZEhsc1pVbHVabTliSjJ4cGMzUXRjM1I1YkdVblhTQTlJR2x6Vlc1dmNtUmxjbVZrSUQ4Z0ozVnViM0prWlhKbFpDY2dPaUFuYjNKa1pYSmxaQ2M3WEc1Y2RGeDBYSFI5WEc1Y2JseDBYSFJjZEhaaGNpQndZWEpoSUQwZ1pHOXRMbUZ1WTJWemRHOXlLSEp1Wnk1ell5d2daRzl0TG1selVHRnlZU2s3WEc1Y2RGeDBYSFJwWmlBb2NHRnlZU0FtSmlCd1lYSmhMbk4wZVd4bFd5ZHNhVzVsTFdobGFXZG9kQ2RkS1NCN1hHNWNkRngwWEhSY2RITjBlV3hsU1c1bWIxc25iR2x1WlMxb1pXbG5hSFFuWFNBOUlIQmhjbUV1YzNSNWJHVXViR2x1WlVobGFXZG9kRHRjYmx4MFhIUmNkSDBnWld4elpTQjdYRzVjZEZ4MFhIUmNkSFpoY2lCc2FXNWxTR1ZwWjJoMElEMGdjR0Z5YzJWSmJuUW9jM1I1YkdWSmJtWnZXeWRzYVc1bExXaGxhV2RvZENkZExDQXhNQ2tnTHlCd1lYSnpaVWx1ZENoemRIbHNaVWx1Wm05YkoyWnZiblF0YzJsNlpTZGRMQ0F4TUNrN1hHNWNkRngwWEhSY2RITjBlV3hsU1c1bWIxc25iR2x1WlMxb1pXbG5hSFFuWFNBOUlHeHBibVZJWldsbmFIUXVkRzlHYVhobFpDZ3hLVHRjYmx4MFhIUmNkSDFjYmx4dVhIUmNkRngwYzNSNWJHVkpibVp2TG1sdFlXZGxJRDBnWkc5dExtbHpTVzFuS0hSaGNtZGxkQ2tnSmlZZ2RHRnlaMlYwTzF4dVhIUmNkRngwYzNSNWJHVkpibVp2TG1GdVkyaHZjaUE5SUhKdVp5NXBjMDl1UVc1amFHOXlLQ2tnSmlZZ1pHOXRMbUZ1WTJWemRHOXlLSEp1Wnk1ell5d2daRzl0TG1selFXNWphRzl5S1R0Y2JseDBYSFJjZEhOMGVXeGxTVzVtYnk1aGJtTmxjM1J2Y25NZ1BTQmtiMjB1YkdsemRFRnVZMlZ6ZEc5eUtISnVaeTV6WXl3Z1pHOXRMbWx6UldScGRHRmliR1VwTzF4dVhIUmNkRngwYzNSNWJHVkpibVp2TG5KaGJtZGxJRDBnY201bk8xeHVYRzVjZEZ4MFhIUnlaWFIxY200Z2MzUjViR1ZKYm1adk8xeHVYSFJjZEgwN1hHNWNkSDA3WEc1Y2JseHVYSFF2S2lwY2JseDBJQ29nUUdOc1lYTnpJR1ZrYVhScGJtY3VWSGx3YVc1blhHNWNkQ0FxWEc1Y2RDQXFJRlI1Y0dsdVoxeHVYSFFnS2x4dVhIUWdLaTljYmx4MGRtRnlJRlI1Y0dsdVp5QTlJR1oxYm1OMGFXOXVJQ2dwSUh0Y2JseHVYSFJjZEM4cUtseHVYSFJjZENBcUlHbHVjMlZ5ZENCMFlXSmNibHgwWEhRZ0tseHVYSFJjZENBcUlFQndZWEpoYlNCN2FsRjFaWEo1ZlNBa1pXUnBkR0ZpYkdWY2JseDBYSFFnS2lCQWNHRnlZVzBnZTFkeVlYQndaV1JTWVc1blpYMGdjbTVuWEc1Y2RGeDBJQ29nUUhCaGNtRnRJSHRPZFcxaVpYSjlJSFJoWW5OcGVtVmNibHgwWEhRZ0tpOWNibHgwWEhSMGFHbHpMbWx1YzJWeWRGUmhZaUE5SUdaMWJtTjBhVzl1SUNna1pXUnBkR0ZpYkdVc0lISnVaeXdnZEdGaWMybDZaU2tnZTF4dVhIUmNkRngwZG1GeUlIUmhZaUE5SUdSdmJTNWpjbVZoZEdWVVpYaDBLRzVsZHlCQmNuSmhlU2gwWVdKemFYcGxJQ3NnTVNrdWFtOXBiaWhrYjIwdVRrSlRVRjlEU0VGU0tTazdYRzVjZEZ4MFhIUnlibWNnUFNCeWJtY3VaR1ZzWlhSbFEyOXVkR1Z1ZEhNb0tUdGNibHgwWEhSY2RISnVaeTVwYm5ObGNuUk9iMlJsS0hSaFlpd2dkSEoxWlNrN1hHNWNibHgwWEhSY2RISnVaeUE5SUhKaGJtZGxMbU55WldGMFpTaDBZV0lzSUhSaFluTnBlbVVwTzF4dVhIUmNkRngwY201bkxuTmxiR1ZqZENncE8xeHVYSFJjZEgwN1hHNWNibHgwWEhRdktpcGNibHgwWEhRZ0tpQnBibk5sY25RZ2NHRnlZV2R5WVhCb1hHNWNkRngwSUNvdlhHNWNkRngwZEdocGN5NXBibk5sY25SUVlYSmhaM0poY0dnZ1BTQm1kVzVqZEdsdmJpQW9LU0I3WEc1Y2RGeDBYSFIyWVhJZ2NtNW5JRDBnY21GdVoyVXVZM0psWVhSbEtDazdYRzVjYmx4MFhIUmNkQzh2SUdSbGJHVjBaVU52Ym5SbGJuUnpJRzl1SUhKaGJtZGxMbHh1WEhSY2RGeDBjbTVuSUQwZ2NtNW5MbVJsYkdWMFpVTnZiblJsYm5SektDazdYRzVjYmx4MFhIUmNkQzh2SUZkeVlYQWdjbUZ1WjJVZ2FXWWdhWFFnYm1WbFpITWdkRzhnWW1VZ2QzSmhjSEJsWkNCaWVTQndZWEpoWjNKaGNHaGNibHgwWEhSY2RISnVaeUE5SUhKdVp5NTNjbUZ3UW05a2VVbHViR2x1WlZkcGRHaFFZWEpoS0NrN1hHNWNibHgwWEhSY2RDOHZJR1pwYm1ScGJtY2djR0Z5WVdkeVlYQm9YRzVjZEZ4MFhIUjJZWElnYzNCc2FYUlNiMjkwSUQwZ1pHOXRMbUZ1WTJWemRHOXlLSEp1Wnk1ell5d2daRzl0TG1selVHRnlZU2s3WEc1Y2JseDBYSFJjZEhaaGNpQnVaWGgwVUdGeVlUdGNibHgwWEhSY2RDOHZJRzl1SUhCaGNtRm5jbUZ3YURvZ2MzQnNhWFFnY0dGeVlXZHlZWEJvWEc1Y2RGeDBYSFJwWmlBb2MzQnNhWFJTYjI5MEtTQjdYRzVjZEZ4MFhIUmNkRzVsZUhSUVlYSmhJRDBnWkc5dExuTndiR2wwVkhKbFpTaHpjR3hwZEZKdmIzUXNJSEp1Wnk1blpYUlRkR0Z5ZEZCdmFXNTBLQ2twTzF4dVhHNWNkRngwWEhSY2RIWmhjaUJsYlhCMGVVRnVZMmh2Y25NZ1BTQmtiMjB1YkdsemRFUmxjMk5sYm1SaGJuUW9jM0JzYVhSU2IyOTBMQ0JrYjIwdWFYTkZiWEIwZVVGdVkyaHZjaWs3WEc1Y2RGeDBYSFJjZEdWdGNIUjVRVzVqYUc5eWN5QTlJR1Z0Y0hSNVFXNWphRzl5Y3k1amIyNWpZWFFvWkc5dExteHBjM1JFWlhOalpXNWtZVzUwS0c1bGVIUlFZWEpoTENCa2IyMHVhWE5GYlhCMGVVRnVZMmh2Y2lrcE8xeHVYRzVjZEZ4MFhIUmNkQ1F1WldGamFDaGxiWEIwZVVGdVkyaHZjbk1zSUdaMWJtTjBhVzl1SUNocFpIZ3NJR0Z1WTJodmNpa2dlMXh1WEhSY2RGeDBYSFJjZEdSdmJTNXlaVzF2ZG1Vb1lXNWphRzl5S1R0Y2JseDBYSFJjZEZ4MGZTazdYRzVjZEZ4MFhIUmNkQzh2SUc1dklIQmhjbUZuY21Gd2FEb2dhVzV6WlhKMElHVnRjSFI1SUhCaGNtRm5jbUZ3YUZ4dVhIUmNkRngwZlNCbGJITmxJSHRjYmx4MFhIUmNkRngwZG1GeUlHNWxlSFFnUFNCeWJtY3VjMk11WTJocGJHUk9iMlJsYzF0eWJtY3VjMjlkTzF4dVhIUmNkRngwWEhSdVpYaDBVR0Z5WVNBOUlDUW9aRzl0TG1WdGNIUjVVR0Z5WVNsYk1GMDdYRzVjZEZ4MFhIUmNkR2xtSUNodVpYaDBLU0I3WEc1Y2RGeDBYSFJjZEZ4MGNtNW5Mbk5qTG1sdWMyVnlkRUpsWm05eVpTaHVaWGgwVUdGeVlTd2dibVY0ZENrN1hHNWNkRngwWEhSY2RIMGdaV3h6WlNCN1hHNWNkRngwWEhSY2RGeDBjbTVuTG5OakxtRndjR1Z1WkVOb2FXeGtLRzVsZUhSUVlYSmhLVHRjYmx4MFhIUmNkRngwZlZ4dVhIUmNkRngwZlZ4dVhHNWNkRngwWEhSeVlXNW5aUzVqY21WaGRHVW9ibVY0ZEZCaGNtRXNJREFwTG01dmNtMWhiR2w2WlNncExuTmxiR1ZqZENncE8xeHVYSFJjZEgwN1hHNWNibHgwZlR0Y2JseHVYSFF2S2lwY2JseDBJQ29nUUdOc1lYTnpJR1ZrYVhScGJtY3VWR0ZpYkdWY2JseDBJQ3BjYmx4MElDb2dWR0ZpYkdWY2JseDBJQ3BjYmx4MElDb3ZYRzVjZEhaaGNpQlVZV0pzWlNBOUlHWjFibU4wYVc5dUlDZ3BJSHRjYmx4MFhIUXZLaXBjYmx4MFhIUWdLaUJvWVc1a2JHVWdkR0ZpSUd0bGVWeHVYSFJjZENBcVhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0WGNtRndjR1ZrVW1GdVoyVjlJSEp1WjF4dVhIUmNkQ0FxSUVCd1lYSmhiU0I3UW05dmJHVmhibjBnYVhOVGFHbG1kRnh1WEhSY2RDQXFMMXh1WEhSY2RIUm9hWE11ZEdGaUlEMGdablZ1WTNScGIyNGdLSEp1Wnl3Z2FYTlRhR2xtZENrZ2UxeHVYSFJjZEZ4MGRtRnlJR05sYkd3Z1BTQmtiMjB1WVc1alpYTjBiM0lvY201bkxtTnZiVzF2YmtGdVkyVnpkRzl5S0Nrc0lHUnZiUzVwYzBObGJHd3BPMXh1WEhSY2RGeDBkbUZ5SUhSaFlteGxJRDBnWkc5dExtRnVZMlZ6ZEc5eUtHTmxiR3dzSUdSdmJTNXBjMVJoWW14bEtUdGNibHgwWEhSY2RIWmhjaUJqWld4c2N5QTlJR1J2YlM1c2FYTjBSR1Z6WTJWdVpHRnVkQ2gwWVdKc1pTd2daRzl0TG1selEyVnNiQ2s3WEc1Y2JseDBYSFJjZEhaaGNpQnVaWGgwUTJWc2JDQTlJR3hwYzNSYmFYTlRhR2xtZENBL0lDZHdjbVYySnlBNklDZHVaWGgwSjEwb1kyVnNiSE1zSUdObGJHd3BPMXh1WEhSY2RGeDBhV1lnS0c1bGVIUkRaV3hzS1NCN1hHNWNkRngwWEhSY2RISmhibWRsTG1OeVpXRjBaU2h1WlhoMFEyVnNiQ3dnTUNrdWMyVnNaV04wS0NrN1hHNWNkRngwWEhSOVhHNWNkRngwZlR0Y2JseHVYSFJjZEM4cUtseHVYSFJjZENBcUlHTnlaV0YwWlNCbGJYQjBlU0IwWVdKc1pTQmxiR1Z0Wlc1MFhHNWNkRngwSUNwY2JseDBYSFFnS2lCQWNHRnlZVzBnZTA1MWJXSmxjbjBnY205M1EyOTFiblJjYmx4MFhIUWdLaUJBY0dGeVlXMGdlMDUxYldKbGNuMGdZMjlzUTI5MWJuUmNibHgwWEhRZ0tpQkFjbVYwZFhKdUlIdE9iMlJsZlZ4dVhIUmNkQ0FxTDF4dVhIUmNkSFJvYVhNdVkzSmxZWFJsVkdGaWJHVWdQU0JtZFc1amRHbHZiaUFvWTI5c1EyOTFiblFzSUhKdmQwTnZkVzUwS1NCN1hHNWNkRngwWEhSMllYSWdkR1J6SUQwZ1cxMHNJSFJrU0ZSTlREdGNibHgwWEhSY2RHWnZjaUFvZG1GeUlHbGtlRU52YkNBOUlEQTdJR2xrZUVOdmJDQThJR052YkVOdmRXNTBPeUJwWkhoRGIyd3JLeWtnZTF4dVhIUmNkRngwWEhSMFpITXVjSFZ6YUNnblBIUmtQaWNnS3lCa2IyMHVZbXhoYm1zZ0t5QW5QQzkwWkQ0bktUdGNibHgwWEhSY2RIMWNibHgwWEhSY2RIUmtTRlJOVENBOUlIUmtjeTVxYjJsdUtDY25LVHRjYmx4dVhIUmNkRngwZG1GeUlIUnljeUE5SUZ0ZExDQjBja2hVVFV3N1hHNWNkRngwWEhSbWIzSWdLSFpoY2lCcFpIaFNiM2NnUFNBd095QnBaSGhTYjNjZ1BDQnliM2REYjNWdWREc2dhV1I0VW05M0t5c3BJSHRjYmx4MFhIUmNkRngwZEhKekxuQjFjMmdvSnp4MGNqNG5JQ3NnZEdSSVZFMU1JQ3NnSnp3dmRISStKeWs3WEc1Y2RGeDBYSFI5WEc1Y2RGeDBYSFIwY2toVVRVd2dQU0IwY25NdWFtOXBiaWduSnlrN1hHNWNkRngwWEhSeVpYUjFjbTRnSkNnblBIUmhZbXhsSUdOc1lYTnpQVndpZEdGaWJHVWdkR0ZpYkdVdFltOXlaR1Z5WldSY0lqNG5JQ3NnZEhKSVZFMU1JQ3NnSnp3dmRHRmliR1UrSnlsYk1GMDdYRzVjZEZ4MGZUdGNibHgwZlR0Y2JseHVYRzVjZEM4cUtseHVYSFFnS2lCQVkyeGhjM01nWldScGRHbHVaeTVDZFd4c1pYUmNibHgwSUNwY2JseDBJQ29nUUdGc2RHVnlibUYwWlVOc1lYTnpUbUZ0WlNCQ2RXeHNaWFJjYmx4MElDb3ZYRzVjZEhaaGNpQkNkV3hzWlhRZ1BTQm1kVzVqZEdsdmJpQW9LU0I3WEc1Y2RGeDBMeW9xWEc1Y2RGeDBJQ29nUUcxbGRHaHZaQ0JwYm5ObGNuUlBjbVJsY21Wa1RHbHpkRnh1WEhSY2RDQXFYRzVjZEZ4MElDb2dkRzluWjJ4bElHOXlaR1Z5WldRZ2JHbHpkRnh1WEhSY2RDQXFYRzVjZEZ4MElDb2dRSFI1Y0dVZ1kyOXRiV0Z1WkZ4dVhIUmNkQ0FxTDF4dVhIUmNkSFJvYVhNdWFXNXpaWEowVDNKa1pYSmxaRXhwYzNRZ1BTQm1kVzVqZEdsdmJpQW9LU0I3WEc1Y2RGeDBYSFIwYUdsekxuUnZaMmRzWlV4cGMzUW9KMDlNSnlrN1hHNWNkRngwZlR0Y2JseHVYSFJjZEM4cUtseHVYSFJjZENBcUlFQnRaWFJvYjJRZ2FXNXpaWEowVlc1dmNtUmxjbVZrVEdsemRGeHVYSFJjZENBcVhHNWNkRngwSUNvZ2RHOW5aMnhsSUhWdWIzSmtaWEpsWkNCc2FYTjBYRzVjZEZ4MElDcGNibHgwWEhRZ0tpQkFkSGx3WlNCamIyMXRZVzVrWEc1Y2RGeDBJQ292WEc1Y2RGeDBkR2hwY3k1cGJuTmxjblJWYm05eVpHVnlaV1JNYVhOMElEMGdablZ1WTNScGIyNGdLQ2tnZTF4dVhIUmNkRngwZEdocGN5NTBiMmRuYkdWTWFYTjBLQ2RWVENjcE8xeHVYSFJjZEgwN1hHNWNibHgwWEhRdktpcGNibHgwWEhRZ0tpQkFiV1YwYUc5a0lHbHVaR1Z1ZEZ4dVhIUmNkQ0FxWEc1Y2RGeDBJQ29nYVc1a1pXNTBYRzVjZEZ4MElDcGNibHgwWEhRZ0tpQkFkSGx3WlNCamIyMXRZVzVrWEc1Y2RGeDBJQ292WEc1Y2RGeDBkR2hwY3k1cGJtUmxiblFnUFNCbWRXNWpkR2x2YmlBb0tTQjdYRzVjZEZ4MFhIUjJZWElnYzJWc1ppQTlJSFJvYVhNN1hHNWNkRngwWEhSMllYSWdjbTVuSUQwZ2NtRnVaMlV1WTNKbFlYUmxLQ2t1ZDNKaGNFSnZaSGxKYm14cGJtVlhhWFJvVUdGeVlTZ3BPMXh1WEc1Y2RGeDBYSFIyWVhJZ2NHRnlZWE1nUFNCeWJtY3VibTlrWlhNb1pHOXRMbWx6VUdGeVlTd2dleUJwYm1Oc2RXUmxRVzVqWlhOMGIzSTZJSFJ5ZFdVZ2ZTazdYRzVjZEZ4MFhIUjJZWElnWTJ4MWMzUmxjbVZrY3lBOUlHeHBjM1F1WTJ4MWMzUmxja0o1S0hCaGNtRnpMQ0JtZFc1akxuQmxjVElvSjNCaGNtVnVkRTV2WkdVbktTazdYRzVjYmx4MFhIUmNkQ1F1WldGamFDaGpiSFZ6ZEdWeVpXUnpMQ0JtZFc1amRHbHZiaUFvYVdSNExDQndZWEpoY3lrZ2UxeHVYSFJjZEZ4MFhIUjJZWElnYUdWaFpDQTlJR3hwYzNRdWFHVmhaQ2h3WVhKaGN5azdYRzVjZEZ4MFhIUmNkR2xtSUNoa2IyMHVhWE5NYVNob1pXRmtLU2tnZTF4dVhIUmNkRngwWEhSY2RITmxiR1l1ZDNKaGNFeHBjM1FvY0dGeVlYTXNJR2hsWVdRdWNHRnlaVzUwVG05a1pTNXViMlJsVG1GdFpTazdYRzVjZEZ4MFhIUmNkSDBnWld4elpTQjdYRzVjZEZ4MFhIUmNkRngwSkM1bFlXTm9LSEJoY21GekxDQm1kVzVqZEdsdmJpQW9hV1I0TENCd1lYSmhLU0I3WEc1Y2RGeDBYSFJjZEZ4MFhIUWtLSEJoY21FcExtTnpjeWduYldGeVoybHVUR1ZtZENjc0lHWjFibU4wYVc5dUlDaHBaSGdzSUhaaGJDa2dlMXh1WEhSY2RGeDBYSFJjZEZ4MFhIUnlaWFIxY200Z0tIQmhjbk5sU1c1MEtIWmhiQ3dnTVRBcElIeDhJREFwSUNzZ01qVTdYRzVjZEZ4MFhIUmNkRngwWEhSOUtUdGNibHgwWEhSY2RGeDBYSFI5S1R0Y2JseDBYSFJjZEZ4MGZWeHVYSFJjZEZ4MGZTazdYRzVjYmx4MFhIUmNkSEp1Wnk1elpXeGxZM1FvS1R0Y2JseDBYSFI5TzF4dVhHNWNkRngwTHlvcVhHNWNkRngwSUNvZ1FHMWxkR2h2WkNCdmRYUmtaVzUwWEc1Y2RGeDBJQ3BjYmx4MFhIUWdLaUJ2ZFhSa1pXNTBYRzVjZEZ4MElDcGNibHgwWEhRZ0tpQkFkSGx3WlNCamIyMXRZVzVrWEc1Y2RGeDBJQ292WEc1Y2RGeDBkR2hwY3k1dmRYUmtaVzUwSUQwZ1puVnVZM1JwYjI0Z0tDa2dlMXh1WEhSY2RGeDBkbUZ5SUhObGJHWWdQU0IwYUdsek8xeHVYSFJjZEZ4MGRtRnlJSEp1WnlBOUlISmhibWRsTG1OeVpXRjBaU2dwTG5keVlYQkNiMlI1U1c1c2FXNWxWMmwwYUZCaGNtRW9LVHRjYmx4dVhIUmNkRngwZG1GeUlIQmhjbUZ6SUQwZ2NtNW5MbTV2WkdWektHUnZiUzVwYzFCaGNtRXNJSHNnYVc1amJIVmtaVUZ1WTJWemRHOXlPaUIwY25WbElIMHBPMXh1WEhSY2RGeDBkbUZ5SUdOc2RYTjBaWEpsWkhNZ1BTQnNhWE4wTG1Oc2RYTjBaWEpDZVNod1lYSmhjeXdnWm5WdVl5NXdaWEV5S0Nkd1lYSmxiblJPYjJSbEp5a3BPMXh1WEc1Y2RGeDBYSFFrTG1WaFkyZ29ZMngxYzNSbGNtVmtjeXdnWm5WdVkzUnBiMjRnS0dsa2VDd2djR0Z5WVhNcElIdGNibHgwWEhSY2RGeDBkbUZ5SUdobFlXUWdQU0JzYVhOMExtaGxZV1FvY0dGeVlYTXBPMXh1WEhSY2RGeDBYSFJwWmlBb1pHOXRMbWx6VEdrb2FHVmhaQ2twSUh0Y2JseDBYSFJjZEZ4MFhIUnpaV3htTG5KbGJHVmhjMlZNYVhOMEtGdHdZWEpoYzEwcE8xeHVYSFJjZEZ4MFhIUjlJR1ZzYzJVZ2UxeHVYSFJjZEZ4MFhIUmNkQ1F1WldGamFDaHdZWEpoY3l3Z1puVnVZM1JwYjI0Z0tHbGtlQ3dnY0dGeVlTa2dlMXh1WEhSY2RGeDBYSFJjZEZ4MEpDaHdZWEpoS1M1amMzTW9KMjFoY21kcGJreGxablFuTENCbWRXNWpkR2x2YmlBb2FXUjRMQ0IyWVd3cElIdGNibHgwWEhSY2RGeDBYSFJjZEZ4MGRtRnNJRDBnS0hCaGNuTmxTVzUwS0haaGJDd2dNVEFwSUh4OElEQXBPMXh1WEhSY2RGeDBYSFJjZEZ4MFhIUnlaWFIxY200Z2RtRnNJRDRnTWpVZ1B5QjJZV3dnTFNBeU5TQTZJQ2NuTzF4dVhIUmNkRngwWEhSY2RGeDBmU2s3WEc1Y2RGeDBYSFJjZEZ4MGZTazdYRzVjZEZ4MFhIUmNkSDFjYmx4MFhIUmNkSDBwTzF4dVhHNWNkRngwWEhSeWJtY3VjMlZzWldOMEtDazdYRzVjZEZ4MGZUdGNibHh1WEhSY2RDOHFLbHh1WEhSY2RDQXFJRUJ0WlhSb2IyUWdkRzluWjJ4bFRHbHpkRnh1WEhSY2RDQXFYRzVjZEZ4MElDb2dkRzluWjJ4bElHeHBjM1JjYmx4MFhIUWdLbHh1WEhSY2RDQXFJRUJ3WVhKaGJTQjdVM1J5YVc1bmZTQnNhWE4wVG1GdFpTQXRJRTlNSUc5eUlGVk1YRzVjZEZ4MElDb3ZYRzVjZEZ4MGRHaHBjeTUwYjJkbmJHVk1hWE4wSUQwZ1puVnVZM1JwYjI0Z0tHeHBjM1JPWVcxbEtTQjdYRzVjZEZ4MFhIUjJZWElnYzJWc1ppQTlJSFJvYVhNN1hHNWNkRngwWEhSMllYSWdjbTVuSUQwZ2NtRnVaMlV1WTNKbFlYUmxLQ2t1ZDNKaGNFSnZaSGxKYm14cGJtVlhhWFJvVUdGeVlTZ3BPMXh1WEc1Y2RGeDBYSFIyWVhJZ2NHRnlZWE1nUFNCeWJtY3VibTlrWlhNb1pHOXRMbWx6VUdGeVlTd2dleUJwYm1Oc2RXUmxRVzVqWlhOMGIzSTZJSFJ5ZFdVZ2ZTazdYRzVjZEZ4MFhIUjJZWElnWW05dmEyMWhjbXNnUFNCeWJtY3VjR0Z5WVVKdmIydHRZWEpyS0hCaGNtRnpLVHRjYmx4MFhIUmNkSFpoY2lCamJIVnpkR1Z5WldSeklEMGdiR2x6ZEM1amJIVnpkR1Z5UW5rb2NHRnlZWE1zSUdaMWJtTXVjR1Z4TWlnbmNHRnlaVzUwVG05a1pTY3BLVHRjYmx4dVhIUmNkRngwTHk4Z2NHRnlZV2R5WVhCb0lIUnZJR3hwYzNSY2JseDBYSFJjZEdsbUlDaHNhWE4wTG1acGJtUW9jR0Z5WVhNc0lHUnZiUzVwYzFCMWNtVlFZWEpoS1NrZ2UxeHVYSFJjZEZ4MFhIUjJZWElnZDNKaGNIQmxaRkJoY21GeklEMGdXMTA3WEc1Y2RGeDBYSFJjZENRdVpXRmphQ2hqYkhWemRHVnlaV1J6TENCbWRXNWpkR2x2YmlBb2FXUjRMQ0J3WVhKaGN5a2dlMXh1WEhSY2RGeDBYSFJjZEhkeVlYQndaV1JRWVhKaGN5QTlJSGR5WVhCd1pXUlFZWEpoY3k1amIyNWpZWFFvYzJWc1ppNTNjbUZ3VEdsemRDaHdZWEpoY3l3Z2JHbHpkRTVoYldVcEtUdGNibHgwWEhSY2RGeDBmU2s3WEc1Y2RGeDBYSFJjZEhCaGNtRnpJRDBnZDNKaGNIQmxaRkJoY21Gek8xeHVYSFJjZEZ4MFhIUXZMeUJzYVhOMElIUnZJSEJoY21GbmNtRndhQ0J2Y2lCamFHRnVaMlVnYkdsemRDQnpkSGxzWlZ4dVhIUmNkRngwZlNCbGJITmxJSHRjYmx4MFhIUmNkRngwZG1GeUlHUnBabVpNYVhOMGN5QTlJSEp1Wnk1dWIyUmxjeWhrYjIwdWFYTk1hWE4wTENCN1hHNWNkRngwWEhSY2RGeDBhVzVqYkhWa1pVRnVZMlZ6ZEc5eU9pQjBjblZsWEc1Y2RGeDBYSFJjZEgwcExtWnBiSFJsY2lobWRXNWpkR2x2YmlBb2JHbHpkRTV2WkdVcElIdGNibHgwWEhSY2RGeDBYSFJ5WlhSMWNtNGdJU1F1Ym05a1pVNWhiV1VvYkdsemRFNXZaR1VzSUd4cGMzUk9ZVzFsS1R0Y2JseDBYSFJjZEZ4MGZTazdYRzVjYmx4MFhIUmNkRngwYVdZZ0tHUnBabVpNYVhOMGN5NXNaVzVuZEdncElIdGNibHgwWEhSY2RGeDBYSFFrTG1WaFkyZ29aR2xtWmt4cGMzUnpMQ0JtZFc1amRHbHZiaUFvYVdSNExDQnNhWE4wVG05a1pTa2dlMXh1WEhSY2RGeDBYSFJjZEZ4MFpHOXRMbkpsY0d4aFkyVW9iR2x6ZEU1dlpHVXNJR3hwYzNST1lXMWxLVHRjYmx4MFhIUmNkRngwWEhSOUtUdGNibHgwWEhSY2RGeDBmU0JsYkhObElIdGNibHgwWEhSY2RGeDBYSFJ3WVhKaGN5QTlJSFJvYVhNdWNtVnNaV0Z6WlV4cGMzUW9ZMngxYzNSbGNtVmtjeXdnZEhKMVpTazdYRzVjZEZ4MFhIUmNkSDFjYmx4MFhIUmNkSDFjYmx4dVhIUmNkRngwY21GdVoyVXVZM0psWVhSbFJuSnZiVkJoY21GQ2IyOXJiV0Z5YXloaWIyOXJiV0Z5YXl3Z2NHRnlZWE1wTG5ObGJHVmpkQ2dwTzF4dVhIUmNkSDA3WEc1Y2JseDBYSFF2S2lwY2JseDBYSFFnS2lCQWJXVjBhRzlrSUhkeVlYQk1hWE4wWEc1Y2RGeDBJQ3BjYmx4MFhIUWdLaUJBY0dGeVlXMGdlMDV2WkdWYlhYMGdjR0Z5WVhOY2JseDBYSFFnS2lCQWNHRnlZVzBnZTFOMGNtbHVaMzBnYkdsemRFNWhiV1ZjYmx4MFhIUWdLaUJBY21WMGRYSnVJSHRPYjJSbFcxMTlYRzVjZEZ4MElDb3ZYRzVjZEZ4MGRHaHBjeTUzY21Gd1RHbHpkQ0E5SUdaMWJtTjBhVzl1SUNod1lYSmhjeXdnYkdsemRFNWhiV1VwSUh0Y2JseDBYSFJjZEhaaGNpQm9aV0ZrSUQwZ2JHbHpkQzVvWldGa0tIQmhjbUZ6S1R0Y2JseDBYSFJjZEhaaGNpQnNZWE4wSUQwZ2JHbHpkQzVzWVhOMEtIQmhjbUZ6S1R0Y2JseHVYSFJjZEZ4MGRtRnlJSEJ5WlhaTWFYTjBJRDBnWkc5dExtbHpUR2x6ZENob1pXRmtMbkJ5WlhacGIzVnpVMmxpYkdsdVp5a2dKaVlnYUdWaFpDNXdjbVYyYVc5MWMxTnBZbXhwYm1jN1hHNWNkRngwWEhSMllYSWdibVY0ZEV4cGMzUWdQU0JrYjIwdWFYTk1hWE4wS0d4aGMzUXVibVY0ZEZOcFlteHBibWNwSUNZbUlHeGhjM1F1Ym1WNGRGTnBZbXhwYm1jN1hHNWNibHgwWEhSY2RIWmhjaUJzYVhOMFRtOWtaU0E5SUhCeVpYWk1hWE4wSUh4OElHUnZiUzVwYm5ObGNuUkJablJsY2loa2IyMHVZM0psWVhSbEtHeHBjM1JPWVcxbElIeDhJQ2RWVENjcExDQnNZWE4wS1R0Y2JseHVYSFJjZEZ4MEx5OGdVQ0IwYnlCTVNWeHVYSFJjZEZ4MGNHRnlZWE1nUFNBa0xtMWhjQ2h3WVhKaGN5d2dablZ1WTNScGIyNGdLSEJoY21FcElIdGNibHgwWEhSY2RGeDBjbVYwZFhKdUlHUnZiUzVwYzFCMWNtVlFZWEpoS0hCaGNtRXBJRDhnWkc5dExuSmxjR3hoWTJVb2NHRnlZU3dnSjB4Skp5a2dPaUJ3WVhKaE8xeHVYSFJjZEZ4MGZTazdYRzVjYmx4MFhIUmNkQzh2SUdGd2NHVnVaQ0IwYnlCc2FYTjBLRHgxYkQ0c0lEeHZiRDRwWEc1Y2RGeDBYSFJrYjIwdVlYQndaVzVrUTJocGJHUk9iMlJsY3loc2FYTjBUbTlrWlN3Z2NHRnlZWE1wTzF4dVhHNWNkRngwWEhScFppQW9ibVY0ZEV4cGMzUXBJSHRjYmx4MFhIUmNkRngwWkc5dExtRndjR1Z1WkVOb2FXeGtUbTlrWlhNb2JHbHpkRTV2WkdVc0lHeHBjM1F1Wm5KdmJTaHVaWGgwVEdsemRDNWphR2xzWkU1dlpHVnpLU2s3WEc1Y2RGeDBYSFJjZEdSdmJTNXlaVzF2ZG1Vb2JtVjRkRXhwYzNRcE8xeHVYSFJjZEZ4MGZWeHVYRzVjZEZ4MFhIUnlaWFIxY200Z2NHRnlZWE03WEc1Y2RGeDBmVHRjYmx4dVhIUmNkQzhxS2x4dVhIUmNkQ0FxSUVCdFpYUm9iMlFnY21Wc1pXRnpaVXhwYzNSY2JseDBYSFFnS2x4dVhIUmNkQ0FxSUVCd1lYSmhiU0I3UVhKeVlYbGJYWDBnWTJ4MWMzUmxjbVZrYzF4dVhIUmNkQ0FxSUVCd1lYSmhiU0I3UW05dmJHVmhibjBnYVhORmMyTmhjSE5sVkc5Q2IyUjVYRzVjZEZ4MElDb2dRSEpsZEhWeWJpQjdUbTlrWlZ0ZGZWeHVYSFJjZENBcUwxeHVYSFJjZEhSb2FYTXVjbVZzWldGelpVeHBjM1FnUFNCbWRXNWpkR2x2YmlBb1kyeDFjM1JsY21Wa2N5d2dhWE5GYzJOaGNITmxWRzlDYjJSNUtTQjdYRzVjZEZ4MFhIUjJZWElnY21Wc1pXRnpaV1JRWVhKaGN5QTlJRnRkTzF4dVhHNWNkRngwWEhRa0xtVmhZMmdvWTJ4MWMzUmxjbVZrY3l3Z1puVnVZM1JwYjI0Z0tHbGtlQ3dnY0dGeVlYTXBJSHRjYmx4MFhIUmNkRngwZG1GeUlHaGxZV1FnUFNCc2FYTjBMbWhsWVdRb2NHRnlZWE1wTzF4dVhIUmNkRngwWEhSMllYSWdiR0Z6ZENBOUlHeHBjM1F1YkdGemRDaHdZWEpoY3lrN1hHNWNibHgwWEhSY2RGeDBkbUZ5SUdobFlXUk1hWE4wSUQwZ2FYTkZjMk5oY0hObFZHOUNiMlI1SUQ4Z1pHOXRMbXhoYzNSQmJtTmxjM1J2Y2lob1pXRmtMQ0JrYjIwdWFYTk1hWE4wS1NBNlhHNWNkRngwWEhSY2RGeDBYSFJjZEZ4MFhIUmNkRngwWEhRZ2FHVmhaQzV3WVhKbGJuUk9iMlJsTzF4dVhIUmNkRngwWEhSMllYSWdiR0Z6ZEV4cGMzUWdQU0JvWldGa1RHbHpkQzVqYUdsc1pFNXZaR1Z6TG14bGJtZDBhQ0ErSURFZ1B5QmtiMjB1YzNCc2FYUlVjbVZsS0dobFlXUk1hWE4wTENCN1hHNWNkRngwWEhSY2RGeDBibTlrWlRvZ2JHRnpkQzV3WVhKbGJuUk9iMlJsTEZ4dVhIUmNkRngwWEhSY2RHOW1abk5sZERvZ1pHOXRMbkJ2YzJsMGFXOXVLR3hoYzNRcElDc2dNVnh1WEhSY2RGeDBYSFI5TENCMGNuVmxLU0E2SUc1MWJHdzdYRzVjYmx4MFhIUmNkRngwZG1GeUlHMXBaR1JzWlV4cGMzUWdQU0JrYjIwdWMzQnNhWFJVY21WbEtHaGxZV1JNYVhOMExDQjdYRzVjZEZ4MFhIUmNkRngwYm05a1pUb2dhR1ZoWkM1d1lYSmxiblJPYjJSbExGeHVYSFJjZEZ4MFhIUmNkRzltWm5ObGREb2daRzl0TG5CdmMybDBhVzl1S0dobFlXUXBYRzVjZEZ4MFhIUmNkSDBzSUhSeWRXVXBPMXh1WEc1Y2RGeDBYSFJjZEhCaGNtRnpJRDBnYVhORmMyTmhjSE5sVkc5Q2IyUjVJRDhnWkc5dExteHBjM1JFWlhOalpXNWtZVzUwS0cxcFpHUnNaVXhwYzNRc0lHUnZiUzVwYzB4cEtTQTZYRzVjZEZ4MFhIUmNkRngwWEhSY2RGeDBYSFJjZENBZ2JHbHpkQzVtY205dEtHMXBaR1JzWlV4cGMzUXVZMmhwYkdST2IyUmxjeWt1Wm1sc2RHVnlLR1J2YlM1cGMweHBLVHRjYmx4dVhIUmNkRngwWEhRdkx5Qk1TU0IwYnlCUVhHNWNkRngwWEhSY2RHbG1JQ2hwYzBWelkyRndjMlZVYjBKdlpIa2dmSHdnSVdSdmJTNXBjMHhwYzNRb2FHVmhaRXhwYzNRdWNHRnlaVzUwVG05a1pTa3BJSHRjYmx4MFhIUmNkRngwWEhSd1lYSmhjeUE5SUNRdWJXRndLSEJoY21GekxDQm1kVzVqZEdsdmJpQW9jR0Z5WVNrZ2UxeHVYSFJjZEZ4MFhIUmNkRngwY21WMGRYSnVJR1J2YlM1eVpYQnNZV05sS0hCaGNtRXNJQ2RRSnlrN1hHNWNkRngwWEhSY2RGeDBmU2s3WEc1Y2RGeDBYSFJjZEgxY2JseHVYSFJjZEZ4MFhIUWtMbVZoWTJnb2JHbHpkQzVtY205dEtIQmhjbUZ6S1M1eVpYWmxjbk5sS0Nrc0lHWjFibU4wYVc5dUlDaHBaSGdzSUhCaGNtRXBJSHRjYmx4MFhIUmNkRngwWEhSa2IyMHVhVzV6WlhKMFFXWjBaWElvY0dGeVlTd2dhR1ZoWkV4cGMzUXBPMXh1WEhSY2RGeDBYSFI5S1R0Y2JseHVYSFJjZEZ4MFhIUXZMeUJ5WlcxdmRtVWdaVzF3ZEhrZ2JHbHpkSE5jYmx4MFhIUmNkRngwZG1GeUlISnZiM1JNYVhOMGN5QTlJR3hwYzNRdVkyOXRjR0ZqZENoYmFHVmhaRXhwYzNRc0lHMXBaR1JzWlV4cGMzUXNJR3hoYzNSTWFYTjBYU2s3WEc1Y2RGeDBYSFJjZENRdVpXRmphQ2h5YjI5MFRHbHpkSE1zSUdaMWJtTjBhVzl1SUNocFpIZ3NJSEp2YjNSTWFYTjBLU0I3WEc1Y2RGeDBYSFJjZEZ4MGRtRnlJR3hwYzNST2IyUmxjeUE5SUZ0eWIyOTBUR2x6ZEYwdVkyOXVZMkYwS0dSdmJTNXNhWE4wUkdWelkyVnVaR0Z1ZENoeWIyOTBUR2x6ZEN3Z1pHOXRMbWx6VEdsemRDa3BPMXh1WEhSY2RGeDBYSFJjZENRdVpXRmphQ2hzYVhOMFRtOWtaWE11Y21WMlpYSnpaU2dwTENCbWRXNWpkR2x2YmlBb2FXUjRMQ0JzYVhOMFRtOWtaU2tnZTF4dVhIUmNkRngwWEhSY2RGeDBhV1lnS0NGa2IyMHVibTlrWlV4bGJtZDBhQ2hzYVhOMFRtOWtaU2twSUh0Y2JseDBYSFJjZEZ4MFhIUmNkRngwWkc5dExuSmxiVzkyWlNoc2FYTjBUbTlrWlN3Z2RISjFaU2s3WEc1Y2RGeDBYSFJjZEZ4MFhIUjlYRzVjZEZ4MFhIUmNkRngwZlNrN1hHNWNkRngwWEhSY2RIMHBPMXh1WEc1Y2RGeDBYSFJjZEhKbGJHVmhjMlZrVUdGeVlYTWdQU0J5Wld4bFlYTmxaRkJoY21GekxtTnZibU5oZENod1lYSmhjeWs3WEc1Y2RGeDBYSFI5S1R0Y2JseHVYSFJjZEZ4MGNtVjBkWEp1SUhKbGJHVmhjMlZrVUdGeVlYTTdYRzVjZEZ4MGZUdGNibHgwZlR0Y2JseHVYSFF2S2lwY2JseDBJQ29nUUdOc1lYTnpJR1ZrYVhScGJtY3VSV1JwZEc5eVhHNWNkQ0FxWEc1Y2RDQXFJRVZrYVhSdmNseHVYSFFnS2x4dVhIUWdLaTljYmx4MGRtRnlJRVZrYVhSdmNpQTlJR1oxYm1OMGFXOXVJQ2dwSUh0Y2JseHVYSFJjZEhaaGNpQnpkSGxzWlNBOUlHNWxkeUJUZEhsc1pTZ3BPMXh1WEhSY2RIWmhjaUIwWVdKc1pTQTlJRzVsZHlCVVlXSnNaU2dwTzF4dVhIUmNkSFpoY2lCMGVYQnBibWNnUFNCdVpYY2dWSGx3YVc1bktDazdYRzVjZEZ4MGRtRnlJR0oxYkd4bGRDQTlJRzVsZHlCQ2RXeHNaWFFvS1R0Y2JseHVYSFJjZEM4cUtseHVYSFJjZENBcUlFQnRaWFJvYjJRZ1kzSmxZWFJsVW1GdVoyVmNibHgwWEhRZ0tseHVYSFJjZENBcUlHTnlaV0YwWlNCeVlXNW5aVnh1WEhSY2RDQXFYRzVjZEZ4MElDb2dRSEJoY21GdElIdHFVWFZsY25sOUlDUmxaR2wwWVdKc1pWeHVYSFJjZENBcUlFQnlaWFIxY200Z2UxZHlZWEJ3WldSU1lXNW5aWDFjYmx4MFhIUWdLaTljYmx4MFhIUjBhR2x6TG1OeVpXRjBaVkpoYm1kbElEMGdablZ1WTNScGIyNGdLQ1JsWkdsMFlXSnNaU2tnZTF4dVhIUmNkRngwSkdWa2FYUmhZbXhsTG1adlkzVnpLQ2s3WEc1Y2RGeDBYSFJ5WlhSMWNtNGdjbUZ1WjJVdVkzSmxZWFJsS0NrN1hHNWNkRngwZlR0Y2JseHVYSFJjZEM4cUtseHVYSFJjZENBcUlFQnRaWFJvYjJRZ2MyRjJaVkpoYm1kbFhHNWNkRngwSUNwY2JseDBYSFFnS2lCellYWmxJR04xY25KbGJuUWdjbUZ1WjJWY2JseDBYSFFnS2x4dVhIUmNkQ0FxSUVCd1lYSmhiU0I3YWxGMVpYSjVmU0FrWldScGRHRmliR1ZjYmx4MFhIUWdLaUJBY0dGeVlXMGdlMEp2YjJ4bFlXNTlJRnQwYUdWdVEyOXNiR0Z3YzJVOVptRnNjMlZkWEc1Y2RGeDBJQ292WEc1Y2RGeDBkR2hwY3k1ellYWmxVbUZ1WjJVZ1BTQm1kVzVqZEdsdmJpQW9KR1ZrYVhSaFlteGxMQ0IwYUdWdVEyOXNiR0Z3YzJVcElIdGNibHgwWEhSY2RDUmxaR2wwWVdKc1pTNW1iMk4xY3lncE8xeHVYSFJjZEZ4MEpHVmthWFJoWW14bExtUmhkR0VvSjNKaGJtZGxKeXdnY21GdVoyVXVZM0psWVhSbEtDa3BPMXh1WEhSY2RGeDBhV1lnS0hSb1pXNURiMnhzWVhCelpTa2dlMXh1WEhSY2RGeDBYSFJ5WVc1blpTNWpjbVZoZEdVb0tTNWpiMnhzWVhCelpTZ3BMbk5sYkdWamRDZ3BPMXh1WEhSY2RGeDBmVnh1WEhSY2RIMDdYRzVjYmx4MFhIUXZLaXBjYmx4MFhIUWdLaUJBYldWMGFHOWtJSE5oZG1WU1lXNW5aVnh1WEhSY2RDQXFYRzVjZEZ4MElDb2djMkYyWlNCamRYSnlaVzUwSUc1dlpHVWdiR2x6ZENCMGJ5QWtaV1JwZEdGaWJHVXVaR0YwWVNnblkyaHBiR1JPYjJSbGN5Y3BYRzVjZEZ4MElDcGNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UycFJkV1Z5ZVgwZ0pHVmthWFJoWW14bFhHNWNkRngwSUNvdlhHNWNkRngwZEdocGN5NXpZWFpsVG05a1pTQTlJR1oxYm1OMGFXOXVJQ2drWldScGRHRmliR1VwSUh0Y2JseDBYSFJjZEM4dklHTnZjSGtnWTJocGJHUWdibTlrWlNCeVpXWmxjbVZ1WTJWY2JseDBYSFJjZEhaaGNpQmpiM0I1SUQwZ1cxMDdYRzVjZEZ4MFhIUm1iM0lnS0haaGNpQnJaWGtnUFNBd0xDQnNaVzRnUFNBa1pXUnBkR0ZpYkdWYk1GMHVZMmhwYkdST2IyUmxjeTVzWlc1bmRHZzdJR3RsZVNBOElHeGxianNnYTJWNUt5c3BJSHRjYmx4MFhIUmNkRngwWTI5d2VTNXdkWE5vS0NSbFpHbDBZV0pzWlZzd1hTNWphR2xzWkU1dlpHVnpXMnRsZVYwcE8xeHVYSFJjZEZ4MGZWeHVYSFJjZEZ4MEpHVmthWFJoWW14bExtUmhkR0VvSjJOb2FXeGtUbTlrWlhNbkxDQmpiM0I1S1R0Y2JseDBYSFI5TzF4dVhHNWNkRngwTHlvcVhHNWNkRngwSUNvZ1FHMWxkR2h2WkNCeVpYTjBiM0psVW1GdVoyVmNibHgwWEhRZ0tseHVYSFJjZENBcUlISmxjM1J2Y21VZ2JHRjBaV3g1SUhKaGJtZGxYRzVjZEZ4MElDcGNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UycFJkV1Z5ZVgwZ0pHVmthWFJoWW14bFhHNWNkRngwSUNvdlhHNWNkRngwZEdocGN5NXlaWE4wYjNKbFVtRnVaMlVnUFNCbWRXNWpkR2x2YmlBb0pHVmthWFJoWW14bEtTQjdYRzVjZEZ4MFhIUjJZWElnY201bklEMGdKR1ZrYVhSaFlteGxMbVJoZEdFb0ozSmhibWRsSnlrN1hHNWNkRngwWEhScFppQW9jbTVuS1NCN1hHNWNkRngwWEhSY2RISnVaeTV6Wld4bFkzUW9LVHRjYmx4MFhIUmNkRngwSkdWa2FYUmhZbXhsTG1adlkzVnpLQ2s3WEc1Y2RGeDBYSFI5WEc1Y2RGeDBmVHRjYmx4dVhIUmNkQzhxS2x4dVhIUmNkQ0FxSUVCdFpYUm9iMlFnY21WemRHOXlaVTV2WkdWY2JseDBYSFFnS2x4dVhIUmNkQ0FxSUhKbGMzUnZjbVVnYkdGMFpXeDVJRzV2WkdVZ2JHbHpkRnh1WEhSY2RDQXFYRzVjZEZ4MElDb2dRSEJoY21GdElIdHFVWFZsY25sOUlDUmxaR2wwWVdKc1pWeHVYSFJjZENBcUwxeHVYSFJjZEhSb2FYTXVjbVZ6ZEc5eVpVNXZaR1VnUFNCbWRXNWpkR2x2YmlBb0pHVmthWFJoWW14bEtTQjdYRzVjZEZ4MFhIUWtaV1JwZEdGaWJHVXVhSFJ0YkNnbkp5azdYRzVjZEZ4MFhIUjJZWElnWTJocGJHUWdQU0FrWldScGRHRmliR1V1WkdGMFlTZ25ZMmhwYkdST2IyUmxjeWNwTzF4dVhIUmNkRngwWm05eUlDaDJZWElnYVc1a1pYZ2dQU0F3TENCc1pXNGdQU0JqYUdsc1pDNXNaVzVuZEdnN0lHbHVaR1Y0SUR3Z2JHVnVPeUJwYm1SbGVDc3JLU0I3WEc1Y2RGeDBYSFJjZENSbFpHbDBZV0pzWlZzd1hTNWhjSEJsYm1SRGFHbHNaQ2hqYUdsc1pGdHBibVJsZUYwcE8xeHVYSFJjZEZ4MGZWeHVYSFJjZEgwN1hHNWNkRngwTHlvcVhHNWNkRngwSUNvZ1FHMWxkR2h2WkNCamRYSnlaVzUwVTNSNWJHVmNibHgwWEhRZ0tseHVYSFJjZENBcUlHTjFjbkpsYm5RZ2MzUjViR1ZjYmx4MFhIUWdLbHh1WEhSY2RDQXFJRUJ3WVhKaGJTQjdUbTlrWlgwZ2RHRnlaMlYwWEc1Y2RGeDBJQ29nUUhKbGRIVnliaUI3UW05dmJHVmhibjBnWm1Gc2MyVWdhV1lnY21GdVoyVWdhWE1nYm05Y2JseDBYSFFnS2k5Y2JseDBYSFIwYUdsekxtTjFjbkpsYm5SVGRIbHNaU0E5SUdaMWJtTjBhVzl1SUNoMFlYSm5aWFFwSUh0Y2JseDBYSFJjZEhaaGNpQnlibWNnUFNCeVlXNW5aUzVqY21WaGRHVW9LVHRjYmx4MFhIUmNkSEpsZEhWeWJpQnlibWNnUHlCeWJtY3VhWE5QYmtWa2FYUmhZbXhsS0NrZ0ppWWdjM1I1YkdVdVkzVnljbVZ1ZENoeWJtY3NJSFJoY21kbGRDa2dPaUJtWVd4elpUdGNibHgwWEhSOU8xeHVYRzVjZEZ4MGRtRnlJSFJ5YVdkblpYSlBia0psWm05eVpVTm9ZVzVuWlNBOUlIUm9hWE11ZEhKcFoyZGxjazl1UW1WbWIzSmxRMmhoYm1kbElEMGdablZ1WTNScGIyNGdLQ1JsWkdsMFlXSnNaU2tnZTF4dVhIUmNkRngwZG1GeUlHOXVRbVZtYjNKbFEyaGhibWRsSUQwZ0pHVmthWFJoWW14bExtUmhkR0VvSjJOaGJHeGlZV05yY3ljcExtOXVRbVZtYjNKbFEyaGhibWRsTzF4dVhIUmNkRngwYVdZZ0tHOXVRbVZtYjNKbFEyaGhibWRsS1NCN1hHNWNkRngwWEhSY2RHOXVRbVZtYjNKbFEyaGhibWRsS0NSbFpHbDBZV0pzWlM1b2RHMXNLQ2tzSUNSbFpHbDBZV0pzWlNrN1hHNWNkRngwWEhSOVhHNWNkRngwZlR0Y2JseHVYSFJjZEhaaGNpQjBjbWxuWjJWeVQyNURhR0Z1WjJVZ1BTQjBhR2x6TG5SeWFXZG5aWEpQYmtOb1lXNW5aU0E5SUdaMWJtTjBhVzl1SUNna1pXUnBkR0ZpYkdVcElIdGNibHgwWEhSY2RIWmhjaUJ2YmtOb1lXNW5aU0E5SUNSbFpHbDBZV0pzWlM1a1lYUmhLQ2RqWVd4c1ltRmphM01uS1M1dmJrTm9ZVzVuWlR0Y2JseDBYSFJjZEdsbUlDaHZia05vWVc1blpTa2dlMXh1WEhSY2RGeDBYSFJ2YmtOb1lXNW5aU2drWldScGRHRmliR1V1YUhSdGJDZ3BMQ0FrWldScGRHRmliR1VwTzF4dVhIUmNkRngwZlZ4dVhIUmNkSDA3WEc1Y2JseDBYSFF2S2lwY2JseDBYSFFnS2lCQWJXVjBhRzlrSUhWdVpHOWNibHgwWEhRZ0tpQjFibVJ2WEc1Y2RGeDBJQ29nUUhCaGNtRnRJSHRxVVhWbGNubDlJQ1JsWkdsMFlXSnNaVnh1WEhSY2RDQXFMMXh1WEhSY2RIUm9hWE11ZFc1a2J5QTlJR1oxYm1OMGFXOXVJQ2drWldScGRHRmliR1VwSUh0Y2JseDBYSFJjZEhSeWFXZG5aWEpQYmtKbFptOXlaVU5vWVc1blpTZ2taV1JwZEdGaWJHVXBPMXh1WEhSY2RGeDBKR1ZrYVhSaFlteGxMbVJoZEdFb0owNXZkR1ZJYVhOMGIzSjVKeWt1ZFc1a2J5Z3BPMXh1WEhSY2RGeDBkSEpwWjJkbGNrOXVRMmhoYm1kbEtDUmxaR2wwWVdKc1pTazdYRzVjZEZ4MGZUdGNibHh1WEhSY2RDOHFLbHh1WEhSY2RDQXFJRUJ0WlhSb2IyUWdjbVZrYjF4dVhIUmNkQ0FxSUhKbFpHOWNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UycFJkV1Z5ZVgwZ0pHVmthWFJoWW14bFhHNWNkRngwSUNvdlhHNWNkRngwZEdocGN5NXlaV1J2SUQwZ1puVnVZM1JwYjI0Z0tDUmxaR2wwWVdKc1pTa2dlMXh1WEhSY2RGeDBkSEpwWjJkbGNrOXVRbVZtYjNKbFEyaGhibWRsS0NSbFpHbDBZV0pzWlNrN1hHNWNkRngwWEhRa1pXUnBkR0ZpYkdVdVpHRjBZU2duVG05MFpVaHBjM1J2Y25rbktTNXlaV1J2S0NrN1hHNWNkRngwWEhSMGNtbG5aMlZ5VDI1RGFHRnVaMlVvSkdWa2FYUmhZbXhsS1R0Y2JseDBYSFI5TzF4dVhHNWNkRngwTHlvcVhHNWNkRngwSUNvZ1FHMWxkR2h2WkNCaVpXWnZjbVZEYjIxdFlXNWtYRzVjZEZ4MElDb2dZbVZtYjNKbElHTnZiVzFoYm1SY2JseDBYSFFnS2lCQWNHRnlZVzBnZTJwUmRXVnllWDBnSkdWa2FYUmhZbXhsWEc1Y2RGeDBJQ292WEc1Y2RGeDBkbUZ5SUdKbFptOXlaVU52YlcxaGJtUWdQU0IwYUdsekxtSmxabTl5WlVOdmJXMWhibVFnUFNCbWRXNWpkR2x2YmlBb0pHVmthWFJoWW14bEtTQjdYRzVjZEZ4MFhIUjBjbWxuWjJWeVQyNUNaV1p2Y21WRGFHRnVaMlVvSkdWa2FYUmhZbXhsS1R0Y2JseDBYSFI5TzF4dVhHNWNkRngwTHlvcVhHNWNkRngwSUNvZ1FHMWxkR2h2WkNCaFpuUmxja052YlcxaGJtUmNibHgwWEhRZ0tpQmhablJsY2lCamIyMXRZVzVrWEc1Y2RGeDBJQ29nUUhCaGNtRnRJSHRxVVhWbGNubDlJQ1JsWkdsMFlXSnNaVnh1WEhSY2RDQXFMMXh1WEhSY2RIWmhjaUJoWm5SbGNrTnZiVzFoYm1RZ1BTQjBhR2x6TG1GbWRHVnlRMjl0YldGdVpDQTlJR1oxYm1OMGFXOXVJQ2drWldScGRHRmliR1VwSUh0Y2JseDBYSFJjZENSbFpHbDBZV0pzWlM1a1lYUmhLQ2RPYjNSbFNHbHpkRzl5ZVNjcExuSmxZMjl5WkZWdVpHOG9LVHRjYmx4MFhIUmNkSFJ5YVdkblpYSlBia05vWVc1blpTZ2taV1JwZEdGaWJHVXBPMXh1WEhSY2RIMDdYRzVjYmx4MFhIUXZLaXBjYmx4MFhIUWdLaUJBYldWMGFHOWtJR0p2YkdSY2JseDBYSFFnS2lCQWNHRnlZVzBnZTJwUmRXVnllWDBnSkdWa2FYUmhZbXhsWEc1Y2RGeDBJQ29nUUhCaGNtRnRJSHROYVhobFpIMGdkbUZzZFdWY2JseDBYSFFnS2k5Y2JseHVYSFJjZEM4cUtseHVYSFJjZENBcUlFQnRaWFJvYjJRZ2FYUmhiR2xqWEc1Y2RGeDBJQ29nUUhCaGNtRnRJSHRxVVhWbGNubDlJQ1JsWkdsMFlXSnNaVnh1WEhSY2RDQXFJRUJ3WVhKaGJTQjdUV2w0WldSOUlIWmhiSFZsWEc1Y2RGeDBJQ292WEc1Y2JseDBYSFF2S2lwY2JseDBYSFFnS2lCQWJXVjBhRzlrSUhWdVpHVnliR2x1WlZ4dVhIUmNkQ0FxSUVCd1lYSmhiU0I3YWxGMVpYSjVmU0FrWldScGRHRmliR1ZjYmx4MFhIUWdLaUJBY0dGeVlXMGdlMDFwZUdWa2ZTQjJZV3gxWlZ4dVhIUmNkQ0FxTDF4dVhHNWNkRngwTHlvcVhHNWNkRngwSUNvZ1FHMWxkR2h2WkNCemRISnBhMlYwYUhKdmRXZG9YRzVjZEZ4MElDb2dRSEJoY21GdElIdHFVWFZsY25sOUlDUmxaR2wwWVdKc1pWeHVYSFJjZENBcUlFQndZWEpoYlNCN1RXbDRaV1I5SUhaaGJIVmxYRzVjZEZ4MElDb3ZYRzVjYmx4MFhIUXZLaXBjYmx4MFhIUWdLaUJBYldWMGFHOWtJR1p2Y20xaGRFSnNiMk5yWEc1Y2RGeDBJQ29nUUhCaGNtRnRJSHRxVVhWbGNubDlJQ1JsWkdsMFlXSnNaVnh1WEhSY2RDQXFJRUJ3WVhKaGJTQjdUV2w0WldSOUlIWmhiSFZsWEc1Y2RGeDBJQ292WEc1Y2JseDBYSFF2S2lwY2JseDBYSFFnS2lCQWJXVjBhRzlrSUhOMWNHVnljMk55YVhCMFhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0cVVYVmxjbmw5SUNSbFpHbDBZV0pzWlZ4dVhIUmNkQ0FxSUVCd1lYSmhiU0I3VFdsNFpXUjlJSFpoYkhWbFhHNWNkRngwSUNvdlhHNWNibHgwWEhRdktpcGNibHgwWEhRZ0tpQkFiV1YwYUc5a0lITjFZbk5qY21sd2RGeHVYSFJjZENBcUlFQndZWEpoYlNCN2FsRjFaWEo1ZlNBa1pXUnBkR0ZpYkdWY2JseDBYSFFnS2lCQWNHRnlZVzBnZTAxcGVHVmtmU0IyWVd4MVpWeHVYSFJjZENBcUwxeHVYRzVjZEZ4MEx5b3FYRzVjZEZ4MElDb2dRRzFsZEdodlpDQnFkWE4wYVdaNVRHVm1kRnh1WEhSY2RDQXFJRUJ3WVhKaGJTQjdhbEYxWlhKNWZTQWtaV1JwZEdGaWJHVmNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UwMXBlR1ZrZlNCMllXeDFaVnh1WEhSY2RDQXFMMXh1WEc1Y2RGeDBMeW9xWEc1Y2RGeDBJQ29nUUcxbGRHaHZaQ0JxZFhOMGFXWjVRMlZ1ZEdWeVhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0cVVYVmxjbmw5SUNSbFpHbDBZV0pzWlZ4dVhIUmNkQ0FxSUVCd1lYSmhiU0I3VFdsNFpXUjlJSFpoYkhWbFhHNWNkRngwSUNvdlhHNWNibHgwWEhRdktpcGNibHgwWEhRZ0tpQkFiV1YwYUc5a0lHcDFjM1JwWm5sU2FXZG9kRnh1WEhSY2RDQXFJRUJ3WVhKaGJTQjdhbEYxWlhKNWZTQWtaV1JwZEdGaWJHVmNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UwMXBlR1ZrZlNCMllXeDFaVnh1WEhSY2RDQXFMMXh1WEc1Y2RGeDBMeW9xWEc1Y2RGeDBJQ29nUUcxbGRHaHZaQ0JxZFhOMGFXWjVSblZzYkZ4dVhIUmNkQ0FxSUVCd1lYSmhiU0I3YWxGMVpYSjVmU0FrWldScGRHRmliR1ZjYmx4MFhIUWdLaUJBY0dGeVlXMGdlMDFwZUdWa2ZTQjJZV3gxWlZ4dVhIUmNkQ0FxTDF4dVhHNWNkRngwTHlvcVhHNWNkRngwSUNvZ1FHMWxkR2h2WkNCbWIzSnRZWFJDYkc5amExeHVYSFJjZENBcUlFQndZWEpoYlNCN2FsRjFaWEo1ZlNBa1pXUnBkR0ZpYkdWY2JseDBYSFFnS2lCQWNHRnlZVzBnZTAxcGVHVmtmU0IyWVd4MVpWeHVYSFJjZENBcUwxeHVYRzVjZEZ4MEx5b3FYRzVjZEZ4MElDb2dRRzFsZEdodlpDQnlaVzF2ZG1WR2IzSnRZWFJjYmx4MFhIUWdLaUJBY0dGeVlXMGdlMnBSZFdWeWVYMGdKR1ZrYVhSaFlteGxYRzVjZEZ4MElDb2dRSEJoY21GdElIdE5hWGhsWkgwZ2RtRnNkV1ZjYmx4MFhIUWdLaTljYmx4dVhIUmNkQzhxS2x4dVhIUmNkQ0FxSUVCdFpYUm9iMlFnWW1GamEwTnZiRzl5WEc1Y2RGeDBJQ29nUUhCaGNtRnRJSHRxVVhWbGNubDlJQ1JsWkdsMFlXSnNaVnh1WEhSY2RDQXFJRUJ3WVhKaGJTQjdUV2w0WldSOUlIWmhiSFZsWEc1Y2RGeDBJQ292WEc1Y2JseDBYSFF2S2lwY2JseDBYSFFnS2lCQWJXVjBhRzlrSUdadmNtVkRiMnh2Y2x4dVhIUmNkQ0FxSUVCd1lYSmhiU0I3YWxGMVpYSjVmU0FrWldScGRHRmliR1ZjYmx4MFhIUWdLaUJBY0dGeVlXMGdlMDFwZUdWa2ZTQjJZV3gxWlZ4dVhIUmNkQ0FxTDF4dVhHNWNkRngwTHlvcVhHNWNkRngwSUNvZ1FHMWxkR2h2WkNCcGJuTmxjblJJYjNKcGVtOXVkR0ZzVW5Wc1pWeHVYSFJjZENBcUlFQndZWEpoYlNCN2FsRjFaWEo1ZlNBa1pXUnBkR0ZpYkdWY2JseDBYSFFnS2lCQWNHRnlZVzBnZTAxcGVHVmtmU0IyWVd4MVpWeHVYSFJjZENBcUwxeHVYRzVjZEZ4MEx5b3FYRzVjZEZ4MElDb2dRRzFsZEdodlpDQm1iMjUwVG1GdFpWeHVYSFJjZENBcVhHNWNkRngwSUNvZ1kyaGhibWRsSUdadmJuUWdibUZ0WlZ4dVhIUmNkQ0FxWEc1Y2RGeDBJQ29nUUhCaGNtRnRJSHRxVVhWbGNubDlJQ1JsWkdsMFlXSnNaVnh1WEhSY2RDQXFJRUJ3WVhKaGJTQjdUV2w0WldSOUlIWmhiSFZsWEc1Y2RGeDBJQ292WEc1Y2JseDBYSFF2S2lCcWMyaHBiblFnYVdkdWIzSmxPbk4wWVhKMElDb3ZYRzVjZEZ4MEx5OGdibUYwYVhabElHTnZiVzFoYm1SektIZHBkR2dnWlhobFkwTnZiVzFoYm1RcExDQm5aVzVsY21GMFpTQm1kVzVqZEdsdmJpQm1iM0lnWlhobFkwTnZiVzFoYm1SY2JseDBYSFIyWVhJZ1kyOXRiV0Z1WkhNZ1BTQmJKMkp2YkdRbkxDQW5hWFJoYkdsakp5d2dKM1Z1WkdWeWJHbHVaU2NzSUNkemRISnBhMlYwYUhKdmRXZG9KeXdnSjNOMWNHVnljMk55YVhCMEp5d2dKM04xWW5OamNtbHdkQ2NzWEc1Y2RGeDBYSFJjZEZ4MFhIUW5hblZ6ZEdsbWVVeGxablFuTENBbmFuVnpkR2xtZVVObGJuUmxjaWNzSUNkcWRYTjBhV1o1VW1sbmFIUW5MQ0FuYW5WemRHbG1lVVoxYkd3bkxGeHVYSFJjZEZ4MFhIUmNkRngwSjJadmNtMWhkRUpzYjJOckp5d2dKM0psYlc5MlpVWnZjbTFoZENjc1hHNWNkRngwWEhSY2RGeDBYSFFuWW1GamEwTnZiRzl5Snl3Z0oyWnZjbVZEYjJ4dmNpY3NJQ2RwYm5ObGNuUkliM0pwZW05dWRHRnNVblZzWlNjc0lDZG1iMjUwVG1GdFpTZGRPMXh1WEc1Y2RGeDBabTl5SUNoMllYSWdhV1I0SUQwZ01Dd2diR1Z1SUQwZ1kyOXRiV0Z1WkhNdWJHVnVaM1JvT3lCcFpIZ2dQQ0JzWlc0N0lHbGtlQ3NyS1NCN1hHNWNkRngwWEhSMGFHbHpXMk52YlcxaGJtUnpXMmxrZUYxZElEMGdLR1oxYm1OMGFXOXVJQ2h6UTIxa0tTQjdYRzVjZEZ4MFhIUmNkSEpsZEhWeWJpQm1kVzVqZEdsdmJpQW9KR1ZrYVhSaFlteGxMQ0IyWVd4MVpTa2dlMXh1WEhSY2RGeDBYSFJjZEdKbFptOXlaVU52YlcxaGJtUW9KR1ZrYVhSaFlteGxLVHRjYmx4dVhIUmNkRngwWEhSY2RHUnZZM1Z0Wlc1MExtVjRaV05EYjIxdFlXNWtLSE5EYldRc0lHWmhiSE5sTENCMllXeDFaU2s3WEc1Y2JseDBYSFJjZEZ4MFhIUmhablJsY2tOdmJXMWhibVFvSkdWa2FYUmhZbXhsS1R0Y2JseDBYSFJjZEZ4MGZUdGNibHgwWEhSY2RIMHBLR052YlcxaGJtUnpXMmxrZUYwcE8xeHVYSFJjZEgxY2JseDBYSFF2S2lCcWMyaHBiblFnYVdkdWIzSmxPbVZ1WkNBcUwxeHVYRzVjZEZ4MEx5b3FYRzVjZEZ4MElDb2dRRzFsZEdodlpDQjBZV0pjYmx4MFhIUWdLbHh1WEhSY2RDQXFJR2hoYm1Sc1pTQjBZV0lnYTJWNVhHNWNkRngwSUNwY2JseDBYSFFnS2lCQWNHRnlZVzBnZTJwUmRXVnllWDBnSkdWa2FYUmhZbXhsWEc1Y2RGeDBJQ29nUUhCaGNtRnRJSHRQWW1wbFkzUjlJRzl3ZEdsdmJuTmNibHgwWEhRZ0tpOWNibHgwWEhSMGFHbHpMblJoWWlBOUlHWjFibU4wYVc5dUlDZ2taV1JwZEdGaWJHVXNJRzl3ZEdsdmJuTXBJSHRjYmx4MFhIUmNkSFpoY2lCeWJtY2dQU0J5WVc1blpTNWpjbVZoZEdVb0tUdGNibHgwWEhSY2RHbG1JQ2h5Ym1jdWFYTkRiMnhzWVhCelpXUW9LU0FtSmlCeWJtY3VhWE5QYmtObGJHd29LU2tnZTF4dVhIUmNkRngwWEhSMFlXSnNaUzUwWVdJb2NtNW5LVHRjYmx4MFhIUmNkSDBnWld4elpTQjdYRzVjZEZ4MFhIUmNkR0psWm05eVpVTnZiVzFoYm1Rb0pHVmthWFJoWW14bEtUdGNibHgwWEhSY2RGeDBkSGx3YVc1bkxtbHVjMlZ5ZEZSaFlpZ2taV1JwZEdGaWJHVXNJSEp1Wnl3Z2IzQjBhVzl1Y3k1MFlXSnphWHBsS1R0Y2JseDBYSFJjZEZ4MFlXWjBaWEpEYjIxdFlXNWtLQ1JsWkdsMFlXSnNaU2s3WEc1Y2RGeDBYSFI5WEc1Y2RGeDBmVHRjYmx4dVhIUmNkQzhxS2x4dVhIUmNkQ0FxSUVCdFpYUm9iMlFnZFc1MFlXSmNibHgwWEhRZ0tseHVYSFJjZENBcUlHaGhibVJzWlNCemFHbG1kQ3QwWVdJZ2EyVjVYRzVjZEZ4MElDcGNibHgwWEhRZ0tpOWNibHgwWEhSMGFHbHpMblZ1ZEdGaUlEMGdablZ1WTNScGIyNGdLQ2tnZTF4dVhIUmNkRngwZG1GeUlISnVaeUE5SUhKaGJtZGxMbU55WldGMFpTZ3BPMXh1WEhSY2RGeDBhV1lnS0hKdVp5NXBjME52Ykd4aGNITmxaQ2dwSUNZbUlISnVaeTVwYzA5dVEyVnNiQ2dwS1NCN1hHNWNkRngwWEhSY2RIUmhZbXhsTG5SaFlpaHlibWNzSUhSeWRXVXBPMXh1WEhSY2RGeDBmVnh1WEhSY2RIMDdYRzVjYmx4MFhIUXZLaXBjYmx4MFhIUWdLaUJBYldWMGFHOWtJR2x1YzJWeWRGQmhjbUZuY21Gd2FGeHVYSFJjZENBcVhHNWNkRngwSUNvZ2FXNXpaWEowSUhCaGNtRm5jbUZ3YUZ4dVhIUmNkQ0FxWEc1Y2RGeDBJQ29nUUhCaGNtRnRJSHRPYjJSbGZTQWtaV1JwZEdGaWJHVmNibHgwWEhRZ0tpOWNibHgwWEhSMGFHbHpMbWx1YzJWeWRGQmhjbUZuY21Gd2FDQTlJR1oxYm1OMGFXOXVJQ2drWldScGRHRmliR1VwSUh0Y2JseDBYSFJjZEdKbFptOXlaVU52YlcxaGJtUW9KR1ZrYVhSaFlteGxLVHRjYmx4MFhIUmNkSFI1Y0dsdVp5NXBibk5sY25SUVlYSmhaM0poY0dnb0pHVmthWFJoWW14bEtUdGNibHgwWEhSY2RHRm1kR1Z5UTI5dGJXRnVaQ2drWldScGRHRmliR1VwTzF4dVhIUmNkSDA3WEc1Y2JseDBYSFF2S2lwY2JseDBYSFFnS2lCQWJXVjBhRzlrSUdsdWMyVnlkRTl5WkdWeVpXUk1hWE4wWEc1Y2RGeDBJQ3BjYmx4MFhIUWdLaUJBY0dGeVlXMGdlMnBSZFdWeWVYMGdKR1ZrYVhSaFlteGxYRzVjZEZ4MElDb3ZYRzVjZEZ4MGRHaHBjeTVwYm5ObGNuUlBjbVJsY21Wa1RHbHpkQ0E5SUdaMWJtTjBhVzl1SUNna1pXUnBkR0ZpYkdVcElIdGNibHgwWEhSY2RHSmxabTl5WlVOdmJXMWhibVFvSkdWa2FYUmhZbXhsS1R0Y2JseDBYSFJjZEdKMWJHeGxkQzVwYm5ObGNuUlBjbVJsY21Wa1RHbHpkQ2drWldScGRHRmliR1VwTzF4dVhIUmNkRngwWVdaMFpYSkRiMjF0WVc1a0tDUmxaR2wwWVdKc1pTazdYRzVjZEZ4MGZUdGNibHh1WEhSY2RDOHFLbHh1WEhSY2RDQXFJRUJ3WVhKaGJTQjdhbEYxWlhKNWZTQWtaV1JwZEdGaWJHVmNibHgwWEhRZ0tpOWNibHgwWEhSMGFHbHpMbWx1YzJWeWRGVnViM0prWlhKbFpFeHBjM1FnUFNCbWRXNWpkR2x2YmlBb0pHVmthWFJoWW14bEtTQjdYRzVjZEZ4MFhIUmlaV1p2Y21WRGIyMXRZVzVrS0NSbFpHbDBZV0pzWlNrN1hHNWNkRngwWEhSaWRXeHNaWFF1YVc1elpYSjBWVzV2Y21SbGNtVmtUR2x6ZENna1pXUnBkR0ZpYkdVcE8xeHVYSFJjZEZ4MFlXWjBaWEpEYjIxdFlXNWtLQ1JsWkdsMFlXSnNaU2s3WEc1Y2RGeDBmVHRjYmx4dVhIUmNkQzhxS2x4dVhIUmNkQ0FxSUVCd1lYSmhiU0I3YWxGMVpYSjVmU0FrWldScGRHRmliR1ZjYmx4MFhIUWdLaTljYmx4MFhIUjBhR2x6TG1sdVpHVnVkQ0E5SUdaMWJtTjBhVzl1SUNna1pXUnBkR0ZpYkdVcElIdGNibHgwWEhSY2RHSmxabTl5WlVOdmJXMWhibVFvSkdWa2FYUmhZbXhsS1R0Y2JseDBYSFJjZEdKMWJHeGxkQzVwYm1SbGJuUW9KR1ZrYVhSaFlteGxLVHRjYmx4MFhIUmNkR0ZtZEdWeVEyOXRiV0Z1WkNna1pXUnBkR0ZpYkdVcE8xeHVYSFJjZEgwN1hHNWNibHgwWEhRdktpcGNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UycFJkV1Z5ZVgwZ0pHVmthWFJoWW14bFhHNWNkRngwSUNvdlhHNWNkRngwZEdocGN5NXZkWFJrWlc1MElEMGdablZ1WTNScGIyNGdLQ1JsWkdsMFlXSnNaU2tnZTF4dVhIUmNkRngwWW1WbWIzSmxRMjl0YldGdVpDZ2taV1JwZEdGaWJHVXBPMXh1WEhSY2RGeDBZblZzYkdWMExtOTFkR1JsYm5Rb0pHVmthWFJoWW14bEtUdGNibHgwWEhSY2RHRm1kR1Z5UTI5dGJXRnVaQ2drWldScGRHRmliR1VwTzF4dVhIUmNkSDA3WEc1Y2JseDBYSFF2S2lwY2JseDBYSFFnS2lCcGJuTmxjblFnYVcxaFoyVmNibHgwWEhRZ0tseHVYSFJjZENBcUlFQndZWEpoYlNCN2FsRjFaWEo1ZlNBa1pXUnBkR0ZpYkdWY2JseDBYSFFnS2lCQWNHRnlZVzBnZTFOMGNtbHVaMzBnYzFWeWJGeHVYSFJjZENBcUwxeHVYSFJjZEhSb2FYTXVhVzV6WlhKMFNXMWhaMlVnUFNCbWRXNWpkR2x2YmlBb0pHVmthWFJoWW14bExDQnpWWEpzTENCbWFXeGxibUZ0WlNrZ2UxeHVYSFJjZEZ4MFlYTjVibU11WTNKbFlYUmxTVzFoWjJVb2MxVnliQ3dnWm1sc1pXNWhiV1VwTG5Sb1pXNG9ablZ1WTNScGIyNGdLQ1JwYldGblpTa2dlMXh1WEhSY2RGeDBYSFJpWldadmNtVkRiMjF0WVc1a0tDUmxaR2wwWVdKc1pTazdYRzVjZEZ4MFhIUmNkQ1JwYldGblpTNWpjM01vZTF4dVhIUmNkRngwWEhSY2RHUnBjM0JzWVhrNklDY25MRnh1WEhSY2RGeDBYSFJjZEhkcFpIUm9PaUJOWVhSb0xtMXBiaWdrWldScGRHRmliR1V1ZDJsa2RHZ29LU3dnSkdsdFlXZGxMbmRwWkhSb0tDa3BYRzVjZEZ4MFhIUmNkSDBwTzF4dVhIUmNkRngwWEhSeVlXNW5aUzVqY21WaGRHVW9LUzVwYm5ObGNuUk9iMlJsS0NScGJXRm5aVnN3WFNrN1hHNWNkRngwWEhSY2RISmhibWRsTG1OeVpXRjBaVVp5YjIxT2IyUmxLQ1JwYldGblpWc3dYU2t1WTI5c2JHRndjMlVvS1M1elpXeGxZM1FvS1R0Y2JseDBYSFJjZEZ4MFlXWjBaWEpEYjIxdFlXNWtLQ1JsWkdsMFlXSnNaU2s3WEc1Y2RGeDBYSFI5S1M1bVlXbHNLR1oxYm1OMGFXOXVJQ2dwSUh0Y2JseDBYSFJjZEZ4MGRtRnlJR05oYkd4aVlXTnJjeUE5SUNSbFpHbDBZV0pzWlM1a1lYUmhLQ2RqWVd4c1ltRmphM01uS1R0Y2JseDBYSFJjZEZ4MGFXWWdLR05oYkd4aVlXTnJjeTV2YmtsdFlXZGxWWEJzYjJGa1JYSnliM0lwSUh0Y2JseDBYSFJjZEZ4MFhIUmpZV3hzWW1GamEzTXViMjVKYldGblpWVndiRzloWkVWeWNtOXlLQ2s3WEc1Y2RGeDBYSFJjZEgxY2JseDBYSFJjZEgwcE8xeHVYSFJjZEgwN1hHNWNibHgwWEhRdktpcGNibHgwWEhRZ0tpQkFiV1YwYUc5a0lHbHVjMlZ5ZEU1dlpHVmNibHgwWEhRZ0tpQnBibk5sY25RZ2JtOWtaVnh1WEhSY2RDQXFJRUJ3WVhKaGJTQjdUbTlrWlgwZ0pHVmthWFJoWW14bFhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0T2IyUmxmU0J1YjJSbFhHNWNkRngwSUNvdlhHNWNkRngwZEdocGN5NXBibk5sY25ST2IyUmxJRDBnWm5WdVkzUnBiMjRnS0NSbFpHbDBZV0pzWlN3Z2JtOWtaU2tnZTF4dVhIUmNkRngwWW1WbWIzSmxRMjl0YldGdVpDZ2taV1JwZEdGaWJHVXBPMXh1WEhSY2RGeDBkbUZ5SUhKdVp5QTlJSFJvYVhNdVkzSmxZWFJsVW1GdVoyVW9KR1ZrYVhSaFlteGxLVHRjYmx4MFhIUmNkSEp1Wnk1cGJuTmxjblJPYjJSbEtHNXZaR1VwTzF4dVhIUmNkRngwY21GdVoyVXVZM0psWVhSbFJuSnZiVTV2WkdVb2JtOWtaU2t1WTI5c2JHRndjMlVvS1M1elpXeGxZM1FvS1R0Y2JseDBYSFJjZEdGbWRHVnlRMjl0YldGdVpDZ2taV1JwZEdGaWJHVXBPMXh1WEhSY2RIMDdYRzVjYmx4MFhIUXZLaXBjYmx4MFhIUWdLaUJwYm5ObGNuUWdkR1Y0ZEZ4dVhIUmNkQ0FxSUVCd1lYSmhiU0I3VG05a1pYMGdKR1ZrYVhSaFlteGxYRzVjZEZ4MElDb2dRSEJoY21GdElIdFRkSEpwYm1kOUlIUmxlSFJjYmx4MFhIUWdLaTljYmx4MFhIUjBhR2x6TG1sdWMyVnlkRlJsZUhRZ1BTQm1kVzVqZEdsdmJpQW9KR1ZrYVhSaFlteGxMQ0IwWlhoMEtTQjdYRzVjZEZ4MFhIUmlaV1p2Y21WRGIyMXRZVzVrS0NSbFpHbDBZV0pzWlNrN1hHNWNkRngwWEhSMllYSWdjbTVuSUQwZ2RHaHBjeTVqY21WaGRHVlNZVzVuWlNna1pXUnBkR0ZpYkdVcE8xeHVYSFJjZEZ4MGRtRnlJSFJsZUhST2IyUmxJRDBnY201bkxtbHVjMlZ5ZEU1dlpHVW9aRzl0TG1OeVpXRjBaVlJsZUhRb2RHVjRkQ2twTzF4dVhIUmNkRngwY21GdVoyVXVZM0psWVhSbEtIUmxlSFJPYjJSbExDQmtiMjB1Ym05a1pVeGxibWQwYUNoMFpYaDBUbTlrWlNrcExuTmxiR1ZqZENncE8xeHVYSFJjZEZ4MFlXWjBaWEpEYjIxdFlXNWtLQ1JsWkdsMFlXSnNaU2s3WEc1Y2RGeDBmVHRjYmx4dVhIUmNkQzhxS2x4dVhIUmNkQ0FxSUdadmNtMWhkRUpzYjJOclhHNWNkRngwSUNwY2JseDBYSFFnS2lCQWNHRnlZVzBnZTJwUmRXVnllWDBnSkdWa2FYUmhZbXhsWEc1Y2RGeDBJQ29nUUhCaGNtRnRJSHRUZEhKcGJtZDlJSFJoWjA1aGJXVmNibHgwWEhRZ0tpOWNibHgwWEhSMGFHbHpMbVp2Y20xaGRFSnNiMk5ySUQwZ1puVnVZM1JwYjI0Z0tDUmxaR2wwWVdKc1pTd2dkR0ZuVG1GdFpTa2dlMXh1WEhSY2RGeDBZbVZtYjNKbFEyOXRiV0Z1WkNna1pXUnBkR0ZpYkdVcE8xeHVYSFJjZEZ4MGRHRm5UbUZ0WlNBOUlHRm5aVzUwTG1selRWTkpSU0EvSUNjOEp5QXJJSFJoWjA1aGJXVWdLeUFuUGljZ09pQjBZV2RPWVcxbE8xeHVYSFJjZEZ4MFpHOWpkVzFsYm5RdVpYaGxZME52YlcxaGJtUW9KMFp2Y20xaGRFSnNiMk5ySnl3Z1ptRnNjMlVzSUhSaFowNWhiV1VwTzF4dVhIUmNkRngwWVdaMFpYSkRiMjF0WVc1a0tDUmxaR2wwWVdKc1pTazdYRzVjZEZ4MGZUdGNibHh1WEhSY2RIUm9hWE11Wm05eWJXRjBVR0Z5WVNBOUlHWjFibU4wYVc5dUlDZ2taV1JwZEdGaWJHVXBJSHRjYmx4MFhIUmNkR0psWm05eVpVTnZiVzFoYm1Rb0pHVmthWFJoWW14bEtUdGNibHgwWEhSY2RIUm9hWE11Wm05eWJXRjBRbXh2WTJzb0pHVmthWFJoWW14bExDQW5VQ2NwTzF4dVhIUmNkRngwWVdaMFpYSkRiMjF0WVc1a0tDUmxaR2wwWVdKc1pTazdYRzVjZEZ4MGZUdGNibHh1WEhSY2RDOHFJR3B6YUdsdWRDQnBaMjV2Y21VNmMzUmhjblFnS2k5Y2JseDBYSFJtYjNJZ0tIWmhjaUJwWkhnZ1BTQXhPeUJwWkhnZ1BEMGdOanNnYVdSNEt5c3BJSHRjYmx4MFhIUmNkSFJvYVhOYkoyWnZjbTFoZEVnbklDc2dhV1I0WFNBOUlHWjFibU4wYVc5dUlDaHBaSGdwSUh0Y2JseDBYSFJjZEZ4MGNtVjBkWEp1SUdaMWJtTjBhVzl1SUNna1pXUnBkR0ZpYkdVcElIdGNibHgwWEhSY2RGeDBYSFIwYUdsekxtWnZjbTFoZEVKc2IyTnJLQ1JsWkdsMFlXSnNaU3dnSjBnbklDc2dhV1I0S1R0Y2JseDBYSFJjZEZ4MGZUdGNibHgwWEhSY2RIMG9hV1I0S1R0Y2JseDBYSFI5TzF4dVhIUmNkQzhxSUdwemFHbHVkQ0JwWjI1dmNtVTZaVzVrSUNvdlhHNWNibHgwWEhRdktpcGNibHgwWEhRZ0tpQm1iMjUwYzJsNlpWeHVYSFJjZENBcVhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0cVVYVmxjbmw5SUNSbFpHbDBZV0pzWlZ4dVhIUmNkQ0FxSUVCd1lYSmhiU0I3VTNSeWFXNW5mU0IyWVd4MVpTQXRJSEI0WEc1Y2RGeDBJQ292WEc1Y2RGeDBkR2hwY3k1bWIyNTBVMmw2WlNBOUlHWjFibU4wYVc5dUlDZ2taV1JwZEdGaWJHVXNJSFpoYkhWbEtTQjdYRzVjZEZ4MFhIUmlaV1p2Y21WRGIyMXRZVzVrS0NSbFpHbDBZV0pzWlNrN1hHNWNibHgwWEhSY2RIWmhjaUJ5Ym1jZ1BTQjBhR2x6TG1OeVpXRjBaVkpoYm1kbEtDUmxaR2wwWVdKc1pTazdYRzVjZEZ4MFhIUjJZWElnYzNCaGJuTWdQU0J6ZEhsc1pTNXpkSGxzWlU1dlpHVnpLSEp1WnlrN1hHNWNkRngwWEhRa0xtVmhZMmdvYzNCaGJuTXNJR1oxYm1OMGFXOXVJQ2hwWkhnc0lITndZVzRwSUh0Y2JseDBYSFJjZEZ4MEpDaHpjR0Z1S1M1amMzTW9lMXh1WEhSY2RGeDBYSFJjZENkbWIyNTBMWE5wZW1Vbk9pQjJZV3gxWlNBcklDZHdlQ2RjYmx4MFhIUmNkRngwZlNrN1hHNWNkRngwWEhSOUtUdGNibHh1WEhSY2RGeDBZV1owWlhKRGIyMXRZVzVrS0NSbFpHbDBZV0pzWlNrN1hHNWNkRngwZlR0Y2JseHVYSFJjZEM4cUtseHVYSFJjZENBcUlHeHBibVZJWldsbmFIUmNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UycFJkV1Z5ZVgwZ0pHVmthWFJoWW14bFhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0VGRISnBibWQ5SUhaaGJIVmxYRzVjZEZ4MElDb3ZYRzVjZEZ4MGRHaHBjeTVzYVc1bFNHVnBaMmgwSUQwZ1puVnVZM1JwYjI0Z0tDUmxaR2wwWVdKc1pTd2dkbUZzZFdVcElIdGNibHgwWEhSY2RHSmxabTl5WlVOdmJXMWhibVFvSkdWa2FYUmhZbXhsS1R0Y2JseDBYSFJjZEhOMGVXeGxMbk4wZVd4bFVHRnlZU2h5WVc1blpTNWpjbVZoZEdVb0tTd2dlMXh1WEhSY2RGeDBYSFJzYVc1bFNHVnBaMmgwT2lCMllXeDFaVnh1WEhSY2RGeDBmU2s3WEc1Y2RGeDBYSFJoWm5SbGNrTnZiVzFoYm1Rb0pHVmthWFJoWW14bEtUdGNibHgwWEhSOU8xeHVYRzVjZEZ4MEx5b3FYRzVjZEZ4MElDb2dkVzVzYVc1clhHNWNkRngwSUNwY2JseDBYSFFnS2lCQWRIbHdaU0JqYjIxdFlXNWtYRzVjZEZ4MElDcGNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UycFJkV1Z5ZVgwZ0pHVmthWFJoWW14bFhHNWNkRngwSUNvdlhHNWNkRngwZEdocGN5NTFibXhwYm1zZ1BTQm1kVzVqZEdsdmJpQW9KR1ZrYVhSaFlteGxLU0I3WEc1Y2RGeDBYSFIyWVhJZ2NtNW5JRDBnY21GdVoyVXVZM0psWVhSbEtDazdYRzVjZEZ4MFhIUnBaaUFvY201bkxtbHpUMjVCYm1Ob2IzSW9LU2tnZTF4dVhIUmNkRngwWEhSMllYSWdZVzVqYUc5eUlEMGdaRzl0TG1GdVkyVnpkRzl5S0hKdVp5NXpZeXdnWkc5dExtbHpRVzVqYUc5eUtUdGNibHgwWEhSY2RGeDBjbTVuSUQwZ2NtRnVaMlV1WTNKbFlYUmxSbkp2YlU1dlpHVW9ZVzVqYUc5eUtUdGNibHgwWEhSY2RGeDBjbTVuTG5ObGJHVmpkQ2dwTzF4dVhHNWNkRngwWEhSY2RHSmxabTl5WlVOdmJXMWhibVFvSkdWa2FYUmhZbXhsS1R0Y2JseDBYSFJjZEZ4MFpHOWpkVzFsYm5RdVpYaGxZME52YlcxaGJtUW9KM1Z1YkdsdWF5Y3BPMXh1WEhSY2RGeDBYSFJoWm5SbGNrTnZiVzFoYm1Rb0pHVmthWFJoWW14bEtUdGNibHgwWEhSY2RIMWNibHgwWEhSOU8xeHVYRzVjZEZ4MEx5b3FYRzVjZEZ4MElDb2dZM0psWVhSbElHeHBibXNnS0dOdmJXMWhibVFwWEc1Y2RGeDBJQ3BjYmx4MFhIUWdLaUJBY0dGeVlXMGdlMnBSZFdWeWVYMGdKR1ZrYVhSaFlteGxYRzVjZEZ4MElDb2dRSEJoY21GdElIdFBZbXBsWTNSOUlHeHBibXRKYm1adlhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0UFltcGxZM1I5SUc5d2RHbHZibk5jYmx4MFhIUWdLaTljYmx4MFhIUjBhR2x6TG1OeVpXRjBaVXhwYm1zZ1BTQm1kVzVqZEdsdmJpQW9KR1ZrYVhSaFlteGxMQ0JzYVc1clNXNW1ieXdnYjNCMGFXOXVjeWtnZTF4dVhIUmNkRngwZG1GeUlHeHBibXRWY213Z1BTQnNhVzVyU1c1bWJ5NTFjbXc3WEc1Y2RGeDBYSFIyWVhJZ2JHbHVhMVJsZUhRZ1BTQnNhVzVyU1c1bWJ5NTBaWGgwTzF4dVhIUmNkRngwZG1GeUlHbHpUbVYzVjJsdVpHOTNJRDBnYkdsdWEwbHVabTh1Ym1WM1YybHVaRzkzTzF4dVhIUmNkRngwZG1GeUlISnVaeUE5SUd4cGJtdEpibVp2TG5KaGJtZGxPMXh1WEhSY2RGeDBkbUZ5SUdselZHVjRkRU5vWVc1blpXUWdQU0J5Ym1jdWRHOVRkSEpwYm1jb0tTQWhQVDBnYkdsdWExUmxlSFE3WEc1Y2JseDBYSFJjZEdKbFptOXlaVU52YlcxaGJtUW9KR1ZrYVhSaFlteGxLVHRjYmx4dVhIUmNkRngwYVdZZ0tHOXdkR2x2Ym5NdWIyNURjbVZoZEdWTWFXNXJLU0I3WEc1Y2RGeDBYSFJjZEd4cGJtdFZjbXdnUFNCdmNIUnBiMjV6TG05dVEzSmxZWFJsVEdsdWF5aHNhVzVyVlhKc0tUdGNibHgwWEhSY2RIMWNibHh1WEhSY2RGeDBkbUZ5SUdGdVkyaHZjbk03WEc1Y2RGeDBYSFJwWmlBb2FYTlVaWGgwUTJoaGJtZGxaQ2tnZTF4dVhIUmNkRngwWEhRdkx5QkRjbVZoZEdVZ1lTQnVaWGNnYkdsdWF5QjNhR1Z1SUhSbGVIUWdZMmhoYm1kbFpDNWNibHgwWEhSY2RGeDBkbUZ5SUdGdVkyaHZjaUE5SUhKdVp5NXBibk5sY25ST2IyUmxLQ1FvSnp4QlBpY2dLeUJzYVc1clZHVjRkQ0FySUNjOEwwRStKeWxiTUYwcE8xeHVYSFJjZEZ4MFhIUmhibU5vYjNKeklEMGdXMkZ1WTJodmNsMDdYRzVjZEZ4MFhIUjlJR1ZzYzJVZ2UxeHVYSFJjZEZ4MFhIUmhibU5vYjNKeklEMGdjM1I1YkdVdWMzUjViR1ZPYjJSbGN5aHlibWNzSUh0Y2JseDBYSFJjZEZ4MFhIUnViMlJsVG1GdFpUb2dKMEVuTEZ4dVhIUmNkRngwWEhSY2RHVjRjR0Z1WkVOc2IzTmxjM1JUYVdKc2FXNW5PaUIwY25WbExGeHVYSFJjZEZ4MFhIUmNkRzl1YkhsUVlYSjBhV0ZzUTI5dWRHRnBibk02SUhSeWRXVmNibHgwWEhSY2RGeDBmU2s3WEc1Y2RGeDBYSFI5WEc1Y2JseDBYSFJjZENRdVpXRmphQ2hoYm1Ob2IzSnpMQ0JtZFc1amRHbHZiaUFvYVdSNExDQmhibU5vYjNJcElIdGNibHgwWEhSY2RGeDBKQ2hoYm1Ob2IzSXBMbUYwZEhJb0oyaHlaV1luTENCc2FXNXJWWEpzS1R0Y2JseDBYSFJjZEZ4MGFXWWdLR2x6VG1WM1YybHVaRzkzS1NCN1hHNWNkRngwWEhSY2RGeDBKQ2hoYm1Ob2IzSXBMbUYwZEhJb0ozUmhjbWRsZENjc0lDZGZZbXhoYm1zbktUdGNibHgwWEhSY2RGeDBmU0JsYkhObElIdGNibHgwWEhSY2RGeDBYSFFrS0dGdVkyaHZjaWt1Y21WdGIzWmxRWFIwY2lnbmRHRnlaMlYwSnlrN1hHNWNkRngwWEhSY2RIMWNibHgwWEhSY2RIMHBPMXh1WEc1Y2RGeDBYSFIyWVhJZ2MzUmhjblJTWVc1blpTQTlJSEpoYm1kbExtTnlaV0YwWlVaeWIyMU9iMlJsS0d4cGMzUXVhR1ZoWkNoaGJtTm9iM0p6S1NrdVkyOXNiR0Z3YzJVb2RISjFaU2s3WEc1Y2RGeDBYSFIyWVhJZ2MzUmhjblJRYjJsdWRDQTlJSE4wWVhKMFVtRnVaMlV1WjJWMFUzUmhjblJRYjJsdWRDZ3BPMXh1WEhSY2RGeDBkbUZ5SUdWdVpGSmhibWRsSUQwZ2NtRnVaMlV1WTNKbFlYUmxSbkp2YlU1dlpHVW9iR2x6ZEM1c1lYTjBLR0Z1WTJodmNuTXBLUzVqYjJ4c1lYQnpaU2dwTzF4dVhIUmNkRngwZG1GeUlHVnVaRkJ2YVc1MElEMGdaVzVrVW1GdVoyVXVaMlYwUlc1a1VHOXBiblFvS1R0Y2JseHVYSFJjZEZ4MGNtRnVaMlV1WTNKbFlYUmxLRnh1WEhSY2RGeDBJQ0J6ZEdGeWRGQnZhVzUwTG01dlpHVXNYRzVjZEZ4MFhIUWdJSE4wWVhKMFVHOXBiblF1YjJabWMyVjBMRnh1WEhSY2RGeDBJQ0JsYm1SUWIybHVkQzV1YjJSbExGeHVYSFJjZEZ4MElDQmxibVJRYjJsdWRDNXZabVp6WlhSY2JseDBYSFJjZENrdWMyVnNaV04wS0NrN1hHNWNibHgwWEhSY2RHRm1kR1Z5UTI5dGJXRnVaQ2drWldScGRHRmliR1VwTzF4dVhIUmNkSDA3WEc1Y2JseDBYSFF2S2lwY2JseDBYSFFnS2lCeVpYUjFjbTV6SUd4cGJtc2dhVzVtYjF4dVhIUmNkQ0FxWEc1Y2RGeDBJQ29nUUhKbGRIVnliaUI3VDJKcVpXTjBmVnh1WEhSY2RDQXFJRUJ5WlhSMWNtNGdlMWR5WVhCd1pXUlNZVzVuWlgwZ2NtVjBkWEp1TG5KaGJtZGxYRzVjZEZ4MElDb2dRSEpsZEhWeWJpQjdVM1J5YVc1bmZTQnlaWFIxY200dWRHVjRkRnh1WEhSY2RDQXFJRUJ5WlhSMWNtNGdlMEp2YjJ4bFlXNTlJRnR5WlhSMWNtNHVhWE5PWlhkWGFXNWtiM2M5ZEhKMVpWMWNibHgwWEhRZ0tpQkFjbVYwZFhKdUlIdFRkSEpwYm1kOUlGdHlaWFIxY200dWRYSnNQVndpWENKZFhHNWNkRngwSUNvdlhHNWNkRngwZEdocGN5NW5aWFJNYVc1clNXNW1ieUE5SUdaMWJtTjBhVzl1SUNna1pXUnBkR0ZpYkdVcElIdGNibHgwWEhSY2RDUmxaR2wwWVdKc1pTNW1iMk4xY3lncE8xeHVYRzVjZEZ4MFhIUjJZWElnY201bklEMGdjbUZ1WjJVdVkzSmxZWFJsS0NrdVpYaHdZVzVrS0dSdmJTNXBjMEZ1WTJodmNpazdYRzVjYmx4MFhIUmNkQzh2SUVkbGRDQjBhR1VnWm1seWMzUWdZVzVqYUc5eUlHOXVJSEpoYm1kbEtHWnZjaUJsWkdsMEtTNWNibHgwWEhSY2RIWmhjaUFrWVc1amFHOXlJRDBnSkNoc2FYTjBMbWhsWVdRb2NtNW5MbTV2WkdWektHUnZiUzVwYzBGdVkyaHZjaWtwS1R0Y2JseHVYSFJjZEZ4MGNtVjBkWEp1SUh0Y2JseDBYSFJjZEZ4MGNtRnVaMlU2SUhKdVp5eGNibHgwWEhSY2RGeDBkR1Y0ZERvZ2NtNW5MblJ2VTNSeWFXNW5LQ2tzWEc1Y2RGeDBYSFJjZEdselRtVjNWMmx1Wkc5M09pQWtZVzVqYUc5eUxteGxibWQwYUNBL0lDUmhibU5vYjNJdVlYUjBjaWduZEdGeVoyVjBKeWtnUFQwOUlDZGZZbXhoYm1zbklEb2dabUZzYzJVc1hHNWNkRngwWEhSY2RIVnliRG9nSkdGdVkyaHZjaTVzWlc1bmRHZ2dQeUFrWVc1amFHOXlMbUYwZEhJb0oyaHlaV1luS1NBNklDY25YRzVjZEZ4MFhIUjlPMXh1WEhSY2RIMDdYRzVjYmx4MFhIUXZLaXBjYmx4MFhIUWdLaUJ6WlhSMGFXNW5JR052Ykc5eVhHNWNkRngwSUNwY2JseDBYSFFnS2lCQWNHRnlZVzBnZTA1dlpHVjlJQ1JsWkdsMFlXSnNaVnh1WEhSY2RDQXFJRUJ3WVhKaGJTQjdUMkpxWldOMGZTQnpUMkpxUTI5c2IzSWdJR052Ykc5eUlHTnZaR1ZjYmx4MFhIUWdLaUJBY0dGeVlXMGdlMU4wY21sdVozMGdjMDlpYWtOdmJHOXlMbVp2Y21WRGIyeHZjaUJtYjNKbFozSnZkVzVrSUdOdmJHOXlYRzVjZEZ4MElDb2dRSEJoY21GdElIdFRkSEpwYm1kOUlITlBZbXBEYjJ4dmNpNWlZV05yUTI5c2IzSWdZbUZqYTJkeWIzVnVaQ0JqYjJ4dmNseHVYSFJjZENBcUwxeHVYSFJjZEhSb2FYTXVZMjlzYjNJZ1BTQm1kVzVqZEdsdmJpQW9KR1ZrYVhSaFlteGxMQ0J6VDJKcVEyOXNiM0lwSUh0Y2JseDBYSFJjZEhaaGNpQnZRMjlzYjNJZ1BTQktVMDlPTG5CaGNuTmxLSE5QWW1wRGIyeHZjaWs3WEc1Y2RGeDBYSFIyWVhJZ1ptOXlaVU52Ykc5eUlEMGdiME52Ykc5eUxtWnZjbVZEYjJ4dmNpd2dZbUZqYTBOdmJHOXlJRDBnYjBOdmJHOXlMbUpoWTJ0RGIyeHZjanRjYmx4dVhIUmNkRngwWW1WbWIzSmxRMjl0YldGdVpDZ2taV1JwZEdGaWJHVXBPMXh1WEc1Y2RGeDBYSFJwWmlBb1ptOXlaVU52Ykc5eUtTQjdJR1J2WTNWdFpXNTBMbVY0WldORGIyMXRZVzVrS0NkbWIzSmxRMjlzYjNJbkxDQm1ZV3h6WlN3Z1ptOXlaVU52Ykc5eUtUc2dmVnh1WEhSY2RGeDBhV1lnS0dKaFkydERiMnh2Y2lrZ2V5QmtiMk4xYldWdWRDNWxlR1ZqUTI5dGJXRnVaQ2duWW1GamEwTnZiRzl5Snl3Z1ptRnNjMlVzSUdKaFkydERiMnh2Y2lrN0lIMWNibHh1WEhSY2RGeDBZV1owWlhKRGIyMXRZVzVrS0NSbFpHbDBZV0pzWlNrN1hHNWNkRngwZlR0Y2JseHVYSFJjZEM4cUtseHVYSFJjZENBcUlHbHVjMlZ5ZENCVVlXSnNaVnh1WEhSY2RDQXFYRzVjZEZ4MElDb2dRSEJoY21GdElIdE9iMlJsZlNBa1pXUnBkR0ZpYkdWY2JseDBYSFFnS2lCQWNHRnlZVzBnZTFOMGNtbHVaMzBnYzBScGJTQmthVzFsYm5OcGIyNGdiMllnZEdGaWJHVWdLR1Y0SURvZ1hDSTFlRFZjSWlsY2JseDBYSFFnS2k5Y2JseDBYSFIwYUdsekxtbHVjMlZ5ZEZSaFlteGxJRDBnWm5WdVkzUnBiMjRnS0NSbFpHbDBZV0pzWlN3Z2MwUnBiU2tnZTF4dVhIUmNkRngwZG1GeUlHUnBiV1Z1YzJsdmJpQTlJSE5FYVcwdWMzQnNhWFFvSjNnbktUdGNibHgwWEhSY2RHSmxabTl5WlVOdmJXMWhibVFvSkdWa2FYUmhZbXhsS1R0Y2JseHVYSFJjZEZ4MGRtRnlJSEp1WnlBOUlISmhibWRsTG1OeVpXRjBaU2dwTzF4dVhIUmNkRngwY201bklEMGdjbTVuTG1SbGJHVjBaVU52Ym5SbGJuUnpLQ2s3WEc1Y2RGeDBYSFJ5Ym1jdWFXNXpaWEowVG05a1pTaDBZV0pzWlM1amNtVmhkR1ZVWVdKc1pTaGthVzFsYm5OcGIyNWJNRjBzSUdScGJXVnVjMmx2YmxzeFhTa3BPMXh1WEhSY2RGeDBZV1owWlhKRGIyMXRZVzVrS0NSbFpHbDBZV0pzWlNrN1hHNWNkRngwZlR0Y2JseHVYSFJjZEM4cUtseHVYSFJjZENBcUlHWnNiMkYwSUcxbFhHNWNkRngwSUNwY2JseDBYSFFnS2lCQWNHRnlZVzBnZTJwUmRXVnllWDBnSkdWa2FYUmhZbXhsWEc1Y2RGeDBJQ29nUUhCaGNtRnRJSHRUZEhKcGJtZDlJSFpoYkhWbFhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0cVVYVmxjbmw5SUNSMFlYSm5aWFJjYmx4MFhIUWdLaTljYmx4MFhIUjBhR2x6TG1ac2IyRjBUV1VnUFNCbWRXNWpkR2x2YmlBb0pHVmthWFJoWW14bExDQjJZV3gxWlN3Z0pIUmhjbWRsZENrZ2UxeHVYSFJjZEZ4MFltVm1iM0psUTI5dGJXRnVaQ2drWldScGRHRmliR1VwTzF4dVhIUmNkRngwSkhSaGNtZGxkQzVqYzNNb0oyWnNiMkYwSnl3Z2RtRnNkV1VwTzF4dVhIUmNkRngwWVdaMFpYSkRiMjF0WVc1a0tDUmxaR2wwWVdKc1pTazdYRzVjZEZ4MGZUdGNibHh1WEhSY2RDOHFLbHh1WEhSY2RDQXFJR05vWVc1blpTQnBiV0ZuWlNCemFHRndaVnh1WEhSY2RDQXFYRzVjZEZ4MElDb2dRSEJoY21GdElIdHFVWFZsY25sOUlDUmxaR2wwWVdKc1pWeHVYSFJjZENBcUlFQndZWEpoYlNCN1UzUnlhVzVuZlNCMllXeDFaU0JqYzNNZ1kyeGhjM05jYmx4MFhIUWdLaUJBY0dGeVlXMGdlMDV2WkdWOUlDUjBZWEpuWlhSY2JseDBYSFFnS2k5Y2JseDBYSFIwYUdsekxtbHRZV2RsVTJoaGNHVWdQU0JtZFc1amRHbHZiaUFvSkdWa2FYUmhZbXhsTENCMllXeDFaU3dnSkhSaGNtZGxkQ2tnZTF4dVhIUmNkRngwWW1WbWIzSmxRMjl0YldGdVpDZ2taV1JwZEdGaWJHVXBPMXh1WEc1Y2RGeDBYSFFrZEdGeVoyVjBMbkpsYlc5MlpVTnNZWE56S0NkcGJXY3RjbTkxYm1SbFpDQnBiV2N0WTJseVkyeGxJR2x0WnkxMGFIVnRZbTVoYVd3bktUdGNibHh1WEhSY2RGeDBhV1lnS0haaGJIVmxLU0I3WEc1Y2RGeDBYSFJjZENSMFlYSm5aWFF1WVdSa1EyeGhjM01vZG1Gc2RXVXBPMXh1WEhSY2RGeDBmVnh1WEc1Y2RGeDBYSFJoWm5SbGNrTnZiVzFoYm1Rb0pHVmthWFJoWW14bEtUdGNibHgwWEhSOU8xeHVYRzVjZEZ4MEx5b3FYRzVjZEZ4MElDb2djbVZ6YVhwbElHOTJaWEpzWVhrZ1pXeGxiV1Z1ZEZ4dVhIUmNkQ0FxSUVCd1lYSmhiU0I3YWxGMVpYSjVmU0FrWldScGRHRmliR1ZjYmx4MFhIUWdLaUJBY0dGeVlXMGdlMU4wY21sdVozMGdkbUZzZFdWY2JseDBYSFFnS2lCQWNHRnlZVzBnZTJwUmRXVnllWDBnSkhSaGNtZGxkQ0F0SUhSaGNtZGxkQ0JsYkdWdFpXNTBYRzVjZEZ4MElDb3ZYRzVjZEZ4MGRHaHBjeTV5WlhOcGVtVWdQU0JtZFc1amRHbHZiaUFvSkdWa2FYUmhZbXhsTENCMllXeDFaU3dnSkhSaGNtZGxkQ2tnZTF4dVhIUmNkRngwWW1WbWIzSmxRMjl0YldGdVpDZ2taV1JwZEdGaWJHVXBPMXh1WEc1Y2RGeDBYSFFrZEdGeVoyVjBMbU56Y3loN1hHNWNkRngwWEhSY2RIZHBaSFJvT2lCMllXeDFaU0FxSURFd01DQXJJQ2NsSnl4Y2JseDBYSFJjZEZ4MGFHVnBaMmgwT2lBbkoxeHVYSFJjZEZ4MGZTazdYRzVjYmx4MFhIUmNkR0ZtZEdWeVEyOXRiV0Z1WkNna1pXUnBkR0ZpYkdVcE8xeHVYSFJjZEgwN1hHNWNibHgwWEhRdktpcGNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UxQnZjMmwwYVc5dWZTQndiM05jYmx4MFhIUWdLaUJBY0dGeVlXMGdlMnBSZFdWeWVYMGdKSFJoY21kbGRDQXRJSFJoY21kbGRDQmxiR1Z0Wlc1MFhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0Q2IyOXNaV0Z1ZlNCYllrdGxaWEJTWVhScGIxMGdMU0JyWldWd0lISmhkR2x2WEc1Y2RGeDBJQ292WEc1Y2RGeDBkR2hwY3k1eVpYTnBlbVZVYnlBOUlHWjFibU4wYVc5dUlDaHdiM01zSUNSMFlYSm5aWFFzSUdKTFpXVndVbUYwYVc4cElIdGNibHgwWEhSY2RIWmhjaUJwYldGblpWTnBlbVU3WEc1Y2RGeDBYSFJwWmlBb1lrdGxaWEJTWVhScGJ5a2dlMXh1WEhSY2RGeDBYSFIyWVhJZ2JtVjNVbUYwYVc4Z1BTQndiM011ZVNBdklIQnZjeTU0TzF4dVhIUmNkRngwWEhSMllYSWdjbUYwYVc4Z1BTQWtkR0Z5WjJWMExtUmhkR0VvSjNKaGRHbHZKeWs3WEc1Y2RGeDBYSFJjZEdsdFlXZGxVMmw2WlNBOUlIdGNibHgwWEhSY2RGeDBYSFIzYVdSMGFEb2djbUYwYVc4Z1BpQnVaWGRTWVhScGJ5QS9JSEJ2Y3k1NElEb2djRzl6TG5rZ0x5QnlZWFJwYnl4Y2JseDBYSFJjZEZ4MFhIUm9aV2xuYUhRNklISmhkR2x2SUQ0Z2JtVjNVbUYwYVc4Z1B5QndiM011ZUNBcUlISmhkR2x2SURvZ2NHOXpMbmxjYmx4MFhIUmNkRngwZlR0Y2JseDBYSFJjZEgwZ1pXeHpaU0I3WEc1Y2RGeDBYSFJjZEdsdFlXZGxVMmw2WlNBOUlIdGNibHgwWEhSY2RGeDBYSFIzYVdSMGFEb2djRzl6TG5nc1hHNWNkRngwWEhSY2RGeDBhR1ZwWjJoME9pQndiM011ZVZ4dVhIUmNkRngwWEhSOU8xeHVYSFJjZEZ4MGZWeHVYRzVjZEZ4MFhIUWtkR0Z5WjJWMExtTnpjeWhwYldGblpWTnBlbVVwTzF4dVhIUmNkSDA3WEc1Y2JseDBYSFF2S2lwY2JseDBYSFFnS2lCeVpXMXZkbVVnYldWa2FXRWdiMkpxWldOMFhHNWNkRngwSUNwY2JseDBYSFFnS2lCQWNHRnlZVzBnZTJwUmRXVnllWDBnSkdWa2FYUmhZbXhsWEc1Y2RGeDBJQ29nUUhCaGNtRnRJSHRUZEhKcGJtZDlJSFpoYkhWbElDMGdaSFZ0YlhrZ1lYSm5kVzFsYm5RZ0tHWnZjaUJyWldWd0lHbHVkR1Z5Wm1GalpTbGNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UycFJkV1Z5ZVgwZ0pIUmhjbWRsZENBdElIUmhjbWRsZENCbGJHVnRaVzUwWEc1Y2RGeDBJQ292WEc1Y2RGeDBkR2hwY3k1eVpXMXZkbVZOWldScFlTQTlJR1oxYm1OMGFXOXVJQ2drWldScGRHRmliR1VzSUhaaGJIVmxMQ0FrZEdGeVoyVjBLU0I3WEc1Y2RGeDBYSFJpWldadmNtVkRiMjF0WVc1a0tDUmxaR2wwWVdKc1pTazdYRzVjZEZ4MFhIUWtkR0Z5WjJWMExtUmxkR0ZqYUNncE8xeHVYRzVjZEZ4MFhIUjJZWElnWTJGc2JHSmhZMnR6SUQwZ0pHVmthWFJoWW14bExtUmhkR0VvSjJOaGJHeGlZV05yY3ljcE8xeHVYSFJjZEZ4MGFXWWdLR05oYkd4aVlXTnJjeUFtSmlCallXeHNZbUZqYTNNdWIyNU5aV1JwWVVSbGJHVjBaU2tnZTF4dVhIUmNkRngwWEhSallXeHNZbUZqYTNNdWIyNU5aV1JwWVVSbGJHVjBaU2drZEdGeVoyVjBMQ0IwYUdsekxDQWtaV1JwZEdGaWJHVXBPMXh1WEhSY2RGeDBmVnh1WEc1Y2RGeDBYSFJoWm5SbGNrTnZiVzFoYm1Rb0pHVmthWFJoWW14bEtUdGNibHgwWEhSOU8xeHVYRzVjZEZ4MEx5b3FYRzVjZEZ4MElDb2djMlYwSUdadlkzVnpYRzVjZEZ4MElDcGNibHgwWEhRZ0tpQkFjR0Z5WVcwZ0pHVmthWFJoWW14bFhHNWNkRngwSUNvdlhHNWNkRngwZEdocGN5NW1iMk4xY3lBOUlHWjFibU4wYVc5dUlDZ2taV1JwZEdGaWJHVXBJSHRjYmx4MFhIUmNkQ1JsWkdsMFlXSnNaUzVtYjJOMWN5Z3BPMXh1WEhSY2RIMDdYRzVjZEgwN1hHNWNibHgwTHlvcVhHNWNkQ0FxSUVCamJHRnpjeUJ0YjJSMWJHVXVRblYwZEc5dVhHNWNkQ0FxWEc1Y2RDQXFJRUoxZEhSdmJseHVYSFFnS2k5Y2JseDBkbUZ5SUVKMWRIUnZiaUE5SUdaMWJtTjBhVzl1SUNncElIdGNibHgwWEhRdktpcGNibHgwWEhRZ0tpQjFjR1JoZEdVZ1luVjBkRzl1SUhOMFlYUjFjMXh1WEhSY2RDQXFYRzVjZEZ4MElDb2dRSEJoY21GdElIdHFVWFZsY25sOUlDUmpiMjUwWVdsdVpYSmNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UwOWlhbVZqZEgwZ2MzUjViR1ZKYm1adlhHNWNkRngwSUNvdlhHNWNkRngwZEdocGN5NTFjR1JoZEdVZ1BTQm1kVzVqZEdsdmJpQW9KR052Ym5SaGFXNWxjaXdnYzNSNWJHVkpibVp2S1NCN1hHNWNkRngwWEhRdktpcGNibHgwWEhSY2RDQXFJR2hoYm1Sc1pTQmtjbTl3Wkc5M2JpZHpJR05vWldOcklHMWhjbXNnS0dadmNpQm1iMjUwYm1GdFpTd2dabTl1ZEhOcGVtVXNJR3hwYm1WSVpXbG5hSFFwTGx4dVhIUmNkRngwSUNvZ1FIQmhjbUZ0SUh0cVVYVmxjbmw5SUNSaWRHNWNibHgwWEhSY2RDQXFJRUJ3WVhKaGJTQjdUblZ0WW1WeWZTQjJZV3gxWlZ4dVhIUmNkRngwSUNvdlhHNWNkRngwWEhSMllYSWdZMmhsWTJ0RWNtOXdaRzkzYmsxbGJuVWdQU0JtZFc1amRHbHZiaUFvSkdKMGJpd2dkbUZzZFdVcElIdGNibHgwWEhSY2RGeDBKR0owYmk1bWFXNWtLQ2N1WkhKdmNHUnZkMjR0YldWdWRTQnNhU0JoSnlrdVpXRmphQ2htZFc1amRHbHZiaUFvS1NCN1hHNWNkRngwWEhSY2RGeDBMeThnWVd4M1lYbHpJR052YlhCaGNtVWdjM1J5YVc1bklIUnZJR0YyYjJsa0lHTnlaV0YwYVc1bklHRnViM1JvWlhJZ1puVnVZeTVjYmx4MFhIUmNkRngwWEhSMllYSWdhWE5EYUdWamEyVmtJRDBnS0NRb2RHaHBjeWt1WkdGMFlTZ25kbUZzZFdVbktTQXJJQ2NuS1NBOVBUMGdLSFpoYkhWbElDc2dKeWNwTzF4dVhIUmNkRngwWEhSY2RIUm9hWE11WTJ4aGMzTk9ZVzFsSUQwZ2FYTkRhR1ZqYTJWa0lEOGdKMk5vWldOclpXUW5JRG9nSnljN1hHNWNkRngwWEhSY2RIMHBPMXh1WEhSY2RGeDBmVHRjYmx4dVhIUmNkRngwTHlvcVhHNWNkRngwWEhRZ0tpQjFjR1JoZEdVZ1luVjBkRzl1SUhOMFlYUmxLR0ZqZEdsMlpTQnZjaUJ1YjNRcExseHVYSFJjZEZ4MElDcGNibHgwWEhSY2RDQXFJRUJ3Y21sMllYUmxYRzVjZEZ4MFhIUWdLaUJBY0dGeVlXMGdlMU4wY21sdVozMGdjMlZzWldOMGIzSmNibHgwWEhSY2RDQXFJRUJ3WVhKaGJTQjdSblZ1WTNScGIyNTlJSEJ5WldSY2JseDBYSFJjZENBcUwxeHVYSFJjZEZ4MGRtRnlJR0owYmxOMFlYUmxJRDBnWm5WdVkzUnBiMjRnS0hObGJHVmpkRzl5TENCd2NtVmtLU0I3WEc1Y2RGeDBYSFJjZEhaaGNpQWtZblJ1SUQwZ0pHTnZiblJoYVc1bGNpNW1hVzVrS0hObGJHVmpkRzl5S1R0Y2JseDBYSFJjZEZ4MEpHSjBiaTUwYjJkbmJHVkRiR0Z6Y3lnbllXTjBhWFpsSnl3Z2NISmxaQ2dwS1R0Y2JseDBYSFJjZEgwN1hHNWNibHgwWEhSY2RHbG1JQ2h6ZEhsc1pVbHVabTh1YVcxaFoyVXBJSHRjYmx4MFhIUmNkRngwZG1GeUlDUnBiV2NnUFNBa0tITjBlV3hsU1c1bWJ5NXBiV0ZuWlNrN1hHNWNibHgwWEhSY2RGeDBZblJ1VTNSaGRHVW9KMkoxZEhSdmJsdGtZWFJoTFdWMlpXNTBQVndpYVcxaFoyVlRhR0Z3WlZ3aVhWdGtZWFJoTFhaaGJIVmxQVndpYVcxbkxYSnZkVzVrWldSY0lsMG5MQ0JtZFc1amRHbHZiaUFvS1NCN1hHNWNkRngwWEhSY2RGeDBjbVYwZFhKdUlDUnBiV2N1YUdGelEyeGhjM01vSjJsdFp5MXliM1Z1WkdWa0p5azdYRzVjZEZ4MFhIUmNkSDBwTzF4dVhIUmNkRngwWEhSaWRHNVRkR0YwWlNnblluVjBkRzl1VzJSaGRHRXRaWFpsYm5ROVhDSnBiV0ZuWlZOb1lYQmxYQ0pkVzJSaGRHRXRkbUZzZFdVOVhDSnBiV2N0WTJseVkyeGxYQ0pkSnl3Z1puVnVZM1JwYjI0Z0tDa2dlMXh1WEhSY2RGeDBYSFJjZEhKbGRIVnliaUFrYVcxbkxtaGhjME5zWVhOektDZHBiV2N0WTJseVkyeGxKeWs3WEc1Y2RGeDBYSFJjZEgwcE8xeHVYSFJjZEZ4MFhIUmlkRzVUZEdGMFpTZ25ZblYwZEc5dVcyUmhkR0V0WlhabGJuUTlYQ0pwYldGblpWTm9ZWEJsWENKZFcyUmhkR0V0ZG1Gc2RXVTlYQ0pwYldjdGRHaDFiV0p1WVdsc1hDSmRKeXdnWm5WdVkzUnBiMjRnS0NrZ2UxeHVYSFJjZEZ4MFhIUmNkSEpsZEhWeWJpQWthVzFuTG1oaGMwTnNZWE56S0NkcGJXY3RkR2gxYldKdVlXbHNKeWs3WEc1Y2RGeDBYSFJjZEgwcE8xeHVYSFJjZEZ4MFhIUmlkRzVUZEdGMFpTZ25ZblYwZEc5dVcyUmhkR0V0WlhabGJuUTlYQ0pwYldGblpWTm9ZWEJsWENKZE9tNXZkQ2hiWkdGMFlTMTJZV3gxWlYwcEp5d2dablZ1WTNScGIyNGdLQ2tnZTF4dVhIUmNkRngwWEhSY2RISmxkSFZ5YmlBaEpHbHRaeTVwY3lnbkxtbHRaeTF5YjNWdVpHVmtMQ0F1YVcxbkxXTnBjbU5zWlN3Z0xtbHRaeTEwYUhWdFltNWhhV3duS1R0Y2JseDBYSFJjZEZ4MGZTazdYRzVjYmx4MFhIUmNkRngwZG1GeUlHbHRaMFpzYjJGMElEMGdKR2x0Wnk1amMzTW9KMlpzYjJGMEp5azdYRzVjZEZ4MFhIUmNkR0owYmxOMFlYUmxLQ2RpZFhSMGIyNWJaR0YwWVMxbGRtVnVkRDFjSW1ac2IyRjBUV1ZjSWwxYlpHRjBZUzEyWVd4MVpUMWNJbXhsWm5SY0lsMG5MQ0JtZFc1amRHbHZiaUFvS1NCN1hHNWNkRngwWEhSY2RGeDBjbVYwZFhKdUlHbHRaMFpzYjJGMElEMDlQU0FuYkdWbWRDYzdYRzVjZEZ4MFhIUmNkSDBwTzF4dVhIUmNkRngwWEhSaWRHNVRkR0YwWlNnblluVjBkRzl1VzJSaGRHRXRaWFpsYm5ROVhDSm1iRzloZEUxbFhDSmRXMlJoZEdFdGRtRnNkV1U5WENKeWFXZG9kRndpWFNjc0lHWjFibU4wYVc5dUlDZ3BJSHRjYmx4MFhIUmNkRngwWEhSeVpYUjFjbTRnYVcxblJteHZZWFFnUFQwOUlDZHlhV2RvZENjN1hHNWNkRngwWEhSY2RIMHBPMXh1WEhSY2RGeDBYSFJpZEc1VGRHRjBaU2duWW5WMGRHOXVXMlJoZEdFdFpYWmxiblE5WENKbWJHOWhkRTFsWENKZFcyUmhkR0V0ZG1Gc2RXVTlYQ0p1YjI1bFhDSmRKeXdnWm5WdVkzUnBiMjRnS0NrZ2UxeHVYSFJjZEZ4MFhIUmNkSEpsZEhWeWJpQnBiV2RHYkc5aGRDQWhQVDBnSjJ4bFpuUW5JQ1ltSUdsdFowWnNiMkYwSUNFOVBTQW5jbWxuYUhRbk8xeHVYSFJjZEZ4MFhIUjlLVHRjYmx4dVhIUmNkRngwWEhSMllYSWdjM1I1YkdVZ1BTQWthVzFuTG1GMGRISW9KM04wZVd4bEp5azdYRzVjZEZ4MFhIUmNkR0owYmxOMFlYUmxLQ2RpZFhSMGIyNWJaR0YwWVMxbGRtVnVkRDFjSW5KbGMybDZaVndpWFZ0a1lYUmhMWFpoYkhWbFBWd2lNVndpWFNjc0lHWjFibU4wYVc5dUlDZ3BJSHRjYmx4MFhIUmNkRngwWEhSeVpYUjFjbTRnSVNFdktGNThYRnh6S1NodFlYZ3RLVDkzYVdSMGFGeGNjeW82WEZ4ektqRXdNQ1V2TG5SbGMzUW9jM1I1YkdVcE8xeHVYSFJjZEZ4MFhIUjlLVHRjYmx4MFhIUmNkRngwWW5SdVUzUmhkR1VvSjJKMWRIUnZibHRrWVhSaExXVjJaVzUwUFZ3aWNtVnphWHBsWENKZFcyUmhkR0V0ZG1Gc2RXVTlYQ0l3TGpWY0lsMG5MQ0JtZFc1amRHbHZiaUFvS1NCN1hHNWNkRngwWEhSY2RGeDBjbVYwZFhKdUlDRWhMeWhlZkZ4Y2N5a29iV0Y0TFNrL2QybGtkR2hjWEhNcU9seGNjeW8xTUNVdkxuUmxjM1FvYzNSNWJHVXBPMXh1WEhSY2RGeDBYSFI5S1R0Y2JseDBYSFJjZEZ4MFluUnVVM1JoZEdVb0oySjFkSFJ2Ymx0a1lYUmhMV1YyWlc1MFBWd2ljbVZ6YVhwbFhDSmRXMlJoZEdFdGRtRnNkV1U5WENJd0xqSTFYQ0pkSnl3Z1puVnVZM1JwYjI0Z0tDa2dlMXh1WEhSY2RGeDBYSFJjZEhKbGRIVnliaUFoSVM4b1hueGNYSE1wS0cxaGVDMHBQM2RwWkhSb1hGeHpLanBjWEhNcU1qVWxMeTUwWlhOMEtITjBlV3hsS1R0Y2JseDBYSFJjZEZ4MGZTazdYRzVjZEZ4MFhIUmNkSEpsZEhWeWJqdGNibHgwWEhSY2RIMWNibHh1WEhSY2RGeDBMeThnWm05dWRHNWhiV1ZjYmx4MFhIUmNkSFpoY2lBa1ptOXVkRzVoYldVZ1BTQWtZMjl1ZEdGcGJtVnlMbVpwYm1Rb0p5NXViM1JsTFdadmJuUnVZVzFsSnlrN1hHNWNkRngwWEhScFppQW9KR1p2Ym5SdVlXMWxMbXhsYm1kMGFDa2dlMXh1WEhSY2RGeDBYSFIyWVhJZ2MyVnNaV04wWldSR2IyNTBJRDBnYzNSNWJHVkpibVp2V3lkbWIyNTBMV1poYldsc2VTZGRPMXh1WEhSY2RGeDBYSFJwWmlBb0lTRnpaV3hsWTNSbFpFWnZiblFwSUh0Y2JseHVYSFJjZEZ4MFhIUmNkSFpoY2lCc2FYTjBJRDBnYzJWc1pXTjBaV1JHYjI1MExuTndiR2wwS0Njc0p5azdYRzVjZEZ4MFhIUmNkRngwWm05eUlDaDJZWElnYVNBOUlEQXNJR3hsYmlBOUlHeHBjM1F1YkdWdVozUm9PeUJwSUR3Z2JHVnVPeUJwS3lzcElIdGNibHgwWEhSY2RGeDBYSFJjZEhObGJHVmpkR1ZrUm05dWRDQTlJR3hwYzNSYmFWMHVjbVZ3YkdGalpTZ3ZXMXhjSjF4Y1hDSmRMMmNzSUNjbktTNXlaWEJzWVdObEtDOWNYSE1ySkM4c0lDY25LUzV5WlhCc1lXTmxLQzllWEZ4ekt5OHNJQ2NuS1R0Y2JseDBYSFJjZEZ4MFhIUmNkR2xtSUNoaFoyVnVkQzVwYzBadmJuUkpibk4wWVd4c1pXUW9jMlZzWldOMFpXUkdiMjUwS1NrZ2UxeHVYSFJjZEZ4MFhIUmNkRngwWEhSaWNtVmhhenRjYmx4MFhIUmNkRngwWEhSY2RIMWNibHgwWEhSY2RGeDBYSFI5WEc1Y2JseDBYSFJjZEZ4MFhIUWtabTl1ZEc1aGJXVXVabWx1WkNnbkxtNXZkR1V0WTNWeWNtVnVkQzFtYjI1MGJtRnRaU2NwTG5SbGVIUW9jMlZzWldOMFpXUkdiMjUwS1R0Y2JseDBYSFJjZEZ4MFhIUmphR1ZqYTBSeWIzQmtiM2R1VFdWdWRTZ2tabTl1ZEc1aGJXVXNJSE5sYkdWamRHVmtSbTl1ZENrN1hHNWNibHgwWEhSY2RGeDBmVnh1WEhSY2RGeDBmVnh1WEc1Y2RGeDBYSFF2THlCbWIyNTBjMmw2WlZ4dVhIUmNkRngwZG1GeUlDUm1iMjUwYzJsNlpTQTlJQ1JqYjI1MFlXbHVaWEl1Wm1sdVpDZ25MbTV2ZEdVdFptOXVkSE5wZW1VbktUdGNibHgwWEhSY2RDUm1iMjUwYzJsNlpTNW1hVzVrS0NjdWJtOTBaUzFqZFhKeVpXNTBMV1p2Ym5SemFYcGxKeWt1ZEdWNGRDaHpkSGxzWlVsdVptOWJKMlp2Ym5RdGMybDZaU2RkS1R0Y2JseDBYSFJjZEdOb1pXTnJSSEp2Y0dSdmQyNU5aVzUxS0NSbWIyNTBjMmw2WlN3Z2NHRnljMlZHYkc5aGRDaHpkSGxzWlVsdVptOWJKMlp2Ym5RdGMybDZaU2RkS1NrN1hHNWNibHgwWEhSY2RDOHZJR3hwYm1Wb1pXbG5hSFJjYmx4MFhIUmNkSFpoY2lBa2JHbHVaVWhsYVdkb2RDQTlJQ1JqYjI1MFlXbHVaWEl1Wm1sdVpDZ25MbTV2ZEdVdGFHVnBaMmgwSnlrN1hHNWNkRngwWEhSamFHVmphMFJ5YjNCa2IzZHVUV1Z1ZFNna2JHbHVaVWhsYVdkb2RDd2djR0Z5YzJWR2JHOWhkQ2h6ZEhsc1pVbHVabTliSjJ4cGJtVXRhR1ZwWjJoMEoxMHBLVHRjYmx4dVhIUmNkRngwWW5SdVUzUmhkR1VvSjJKMWRIUnZibHRrWVhSaExXVjJaVzUwUFZ3aVltOXNaRndpWFNjc0lHWjFibU4wYVc5dUlDZ3BJSHRjYmx4MFhIUmNkRngwY21WMGRYSnVJSE4wZVd4bFNXNW1iMXNuWm05dWRDMWliMnhrSjEwZ1BUMDlJQ2RpYjJ4a0p6dGNibHgwWEhSY2RIMHBPMXh1WEhSY2RGeDBZblJ1VTNSaGRHVW9KMkoxZEhSdmJsdGtZWFJoTFdWMlpXNTBQVndpYVhSaGJHbGpYQ0pkSnl3Z1puVnVZM1JwYjI0Z0tDa2dlMXh1WEhSY2RGeDBYSFJ5WlhSMWNtNGdjM1I1YkdWSmJtWnZXeWRtYjI1MExXbDBZV3hwWXlkZElEMDlQU0FuYVhSaGJHbGpKenRjYmx4MFhIUmNkSDBwTzF4dVhIUmNkRngwWW5SdVUzUmhkR1VvSjJKMWRIUnZibHRrWVhSaExXVjJaVzUwUFZ3aWRXNWtaWEpzYVc1bFhDSmRKeXdnWm5WdVkzUnBiMjRnS0NrZ2UxeHVYSFJjZEZ4MFhIUnlaWFIxY200Z2MzUjViR1ZKYm1adld5ZG1iMjUwTFhWdVpHVnliR2x1WlNkZElEMDlQU0FuZFc1a1pYSnNhVzVsSnp0Y2JseDBYSFJjZEgwcE8xeHVYSFJjZEZ4MFluUnVVM1JoZEdVb0oySjFkSFJ2Ymx0a1lYUmhMV1YyWlc1MFBWd2ljM1J5YVd0bGRHaHliM1ZuYUZ3aVhTY3NJR1oxYm1OMGFXOXVJQ2dwSUh0Y2JseDBYSFJjZEZ4MGNtVjBkWEp1SUhOMGVXeGxTVzVtYjFzblptOXVkQzF6ZEhKcGEyVjBhSEp2ZFdkb0oxMGdQVDA5SUNkemRISnBhMlYwYUhKdmRXZG9KenRjYmx4MFhIUmNkSDBwTzF4dVhIUmNkRngwWW5SdVUzUmhkR1VvSjJKMWRIUnZibHRrWVhSaExXVjJaVzUwUFZ3aWMzVndaWEp6WTNKcGNIUmNJbDBuTENCbWRXNWpkR2x2YmlBb0tTQjdYRzVjZEZ4MFhIUmNkSEpsZEhWeWJpQnpkSGxzWlVsdVptOWJKMlp2Ym5RdGMzVndaWEp6WTNKcGNIUW5YU0E5UFQwZ0ozTjFjR1Z5YzJOeWFYQjBKenRjYmx4MFhIUmNkSDBwTzF4dVhIUmNkRngwWW5SdVUzUmhkR1VvSjJKMWRIUnZibHRrWVhSaExXVjJaVzUwUFZ3aWMzVmljMk55YVhCMFhDSmRKeXdnWm5WdVkzUnBiMjRnS0NrZ2UxeHVYSFJjZEZ4MFhIUnlaWFIxY200Z2MzUjViR1ZKYm1adld5ZG1iMjUwTFhOMVluTmpjbWx3ZENkZElEMDlQU0FuYzNWaWMyTnlhWEIwSnp0Y2JseDBYSFJjZEgwcE8xeHVYSFJjZEZ4MFluUnVVM1JoZEdVb0oySjFkSFJ2Ymx0a1lYUmhMV1YyWlc1MFBWd2lhblZ6ZEdsbWVVeGxablJjSWwwbkxDQm1kVzVqZEdsdmJpQW9LU0I3WEc1Y2RGeDBYSFJjZEhKbGRIVnliaUJ6ZEhsc1pVbHVabTliSjNSbGVIUXRZV3hwWjI0blhTQTlQVDBnSjJ4bFpuUW5JSHg4SUhOMGVXeGxTVzVtYjFzbmRHVjRkQzFoYkdsbmJpZGRJRDA5UFNBbmMzUmhjblFuTzF4dVhIUmNkRngwZlNrN1hHNWNkRngwWEhSaWRHNVRkR0YwWlNnblluVjBkRzl1VzJSaGRHRXRaWFpsYm5ROVhDSnFkWE4wYVdaNVEyVnVkR1Z5WENKZEp5d2dablZ1WTNScGIyNGdLQ2tnZTF4dVhIUmNkRngwWEhSeVpYUjFjbTRnYzNSNWJHVkpibVp2V3lkMFpYaDBMV0ZzYVdkdUoxMGdQVDA5SUNkalpXNTBaWEluTzF4dVhIUmNkRngwZlNrN1hHNWNkRngwWEhSaWRHNVRkR0YwWlNnblluVjBkRzl1VzJSaGRHRXRaWFpsYm5ROVhDSnFkWE4wYVdaNVVtbG5hSFJjSWwwbkxDQm1kVzVqZEdsdmJpQW9LU0I3WEc1Y2RGeDBYSFJjZEhKbGRIVnliaUJ6ZEhsc1pVbHVabTliSjNSbGVIUXRZV3hwWjI0blhTQTlQVDBnSjNKcFoyaDBKenRjYmx4MFhIUmNkSDBwTzF4dVhIUmNkRngwWW5SdVUzUmhkR1VvSjJKMWRIUnZibHRrWVhSaExXVjJaVzUwUFZ3aWFuVnpkR2xtZVVaMWJHeGNJbDBuTENCbWRXNWpkR2x2YmlBb0tTQjdYRzVjZEZ4MFhIUmNkSEpsZEhWeWJpQnpkSGxzWlVsdVptOWJKM1JsZUhRdFlXeHBaMjRuWFNBOVBUMGdKMnAxYzNScFpua25PMXh1WEhSY2RGeDBmU2s3WEc1Y2RGeDBYSFJpZEc1VGRHRjBaU2duWW5WMGRHOXVXMlJoZEdFdFpYWmxiblE5WENKcGJuTmxjblJWYm05eVpHVnlaV1JNYVhOMFhDSmRKeXdnWm5WdVkzUnBiMjRnS0NrZ2UxeHVYSFJjZEZ4MFhIUnlaWFIxY200Z2MzUjViR1ZKYm1adld5ZHNhWE4wTFhOMGVXeGxKMTBnUFQwOUlDZDFibTl5WkdWeVpXUW5PMXh1WEhSY2RGeDBmU2s3WEc1Y2RGeDBYSFJpZEc1VGRHRjBaU2duWW5WMGRHOXVXMlJoZEdFdFpYWmxiblE5WENKcGJuTmxjblJQY21SbGNtVmtUR2x6ZEZ3aVhTY3NJR1oxYm1OMGFXOXVJQ2dwSUh0Y2JseDBYSFJjZEZ4MGNtVjBkWEp1SUhOMGVXeGxTVzVtYjFzbmJHbHpkQzF6ZEhsc1pTZGRJRDA5UFNBbmIzSmtaWEpsWkNjN1hHNWNkRngwWEhSOUtUdGNibHgwWEhSOU8xeHVYRzVjZEZ4MEx5b3FYRzVjZEZ4MElDb2dkWEJrWVhSbElISmxZMlZ1ZENCamIyeHZjbHh1WEhSY2RDQXFYRzVjZEZ4MElDb2dRSEJoY21GdElIdE9iMlJsZlNCaWRYUjBiMjVjYmx4MFhIUWdLaUJBY0dGeVlXMGdlMU4wY21sdVozMGdaWFpsYm5ST1lXMWxYRzVjZEZ4MElDb2dRSEJoY21GdElIdE5hWGhsWkgwZ2RtRnNkV1ZjYmx4MFhIUWdLaTljYmx4MFhIUjBhR2x6TG5Wd1pHRjBaVkpsWTJWdWRFTnZiRzl5SUQwZ1puVnVZM1JwYjI0Z0tHSjFkSFJ2Yml3Z1pYWmxiblJPWVcxbExDQjJZV3gxWlNrZ2UxeHVYSFJjZEZ4MGRtRnlJQ1JqYjJ4dmNpQTlJQ1FvWW5WMGRHOXVLUzVqYkc5elpYTjBLQ2N1Ym05MFpTMWpiMnh2Y2ljcE8xeHVYSFJjZEZ4MGRtRnlJQ1J5WldObGJuUkRiMnh2Y2lBOUlDUmpiMnh2Y2k1bWFXNWtLQ2N1Ym05MFpTMXlaV05sYm5RdFkyOXNiM0luS1R0Y2JseDBYSFJjZEhaaGNpQmpiMnh2Y2tsdVptOGdQU0JLVTA5T0xuQmhjbk5sS0NSeVpXTmxiblJEYjJ4dmNpNWhkSFJ5S0Nka1lYUmhMWFpoYkhWbEp5a3BPMXh1WEhSY2RGeDBZMjlzYjNKSmJtWnZXMlYyWlc1MFRtRnRaVjBnUFNCMllXeDFaVHRjYmx4MFhIUmNkQ1J5WldObGJuUkRiMnh2Y2k1aGRIUnlLQ2RrWVhSaExYWmhiSFZsSnl3Z1NsTlBUaTV6ZEhKcGJtZHBabmtvWTI5c2IzSkpibVp2S1NrN1hHNWNkRngwWEhSMllYSWdjMHRsZVNBOUlHVjJaVzUwVG1GdFpTQTlQVDBnSjJKaFkydERiMnh2Y2ljZ1B5QW5ZbUZqYTJkeWIzVnVaQzFqYjJ4dmNpY2dPaUFuWTI5c2IzSW5PMXh1WEhSY2RGeDBKSEpsWTJWdWRFTnZiRzl5TG1acGJtUW9KMmtuS1M1amMzTW9jMHRsZVN3Z2RtRnNkV1VwTzF4dVhIUmNkSDA3WEc1Y2RIMDdYRzVjYmx4MEx5b3FYRzVjZENBcUlFQmpiR0Z6Y3lCdGIyUjFiR1V1Vkc5dmJHSmhjbHh1WEhRZ0tseHVYSFFnS2lCVWIyOXNZbUZ5WEc1Y2RDQXFMMXh1WEhSMllYSWdWRzl2YkdKaGNpQTlJR1oxYm1OMGFXOXVJQ2dwSUh0Y2JseDBYSFIyWVhJZ1luVjBkRzl1SUQwZ2JtVjNJRUoxZEhSdmJpZ3BPMXh1WEc1Y2RGeDBkR2hwY3k1MWNHUmhkR1VnUFNCbWRXNWpkR2x2YmlBb0pIUnZiMnhpWVhJc0lITjBlV3hsU1c1bWJ5a2dlMXh1WEhSY2RGeDBZblYwZEc5dUxuVndaR0YwWlNna2RHOXZiR0poY2l3Z2MzUjViR1ZKYm1adktUdGNibHgwWEhSOU8xeHVYRzVjZEZ4MEx5b3FYRzVjZEZ4MElDb2dRSEJoY21GdElIdE9iMlJsZlNCaWRYUjBiMjVjYmx4MFhIUWdLaUJBY0dGeVlXMGdlMU4wY21sdVozMGdaWFpsYm5ST1lXMWxYRzVjZEZ4MElDb2dRSEJoY21GdElIdFRkSEpwYm1kOUlIWmhiSFZsWEc1Y2RGeDBJQ292WEc1Y2RGeDBkR2hwY3k1MWNHUmhkR1ZTWldObGJuUkRiMnh2Y2lBOUlHWjFibU4wYVc5dUlDaGlkWFIwYjI1T2IyUmxMQ0JsZG1WdWRFNWhiV1VzSUhaaGJIVmxLU0I3WEc1Y2RGeDBYSFJpZFhSMGIyNHVkWEJrWVhSbFVtVmpaVzUwUTI5c2IzSW9ZblYwZEc5dVRtOWtaU3dnWlhabGJuUk9ZVzFsTENCMllXeDFaU2s3WEc1Y2RGeDBmVHRjYmx4dVhIUmNkQzhxS2x4dVhIUmNkQ0FxSUdGamRHbDJZWFJsSUdKMWRIUnZibk1nWlhoamJIVmtaU0JqYjJSbGRtbGxkMXh1WEhSY2RDQXFJRUJ3WVhKaGJTQjdhbEYxWlhKNWZTQWtkRzl2YkdKaGNseHVYSFJjZENBcUwxeHVYSFJjZEhSb2FYTXVZV04wYVhaaGRHVWdQU0JtZFc1amRHbHZiaUFvSkhSdmIyeGlZWElwSUh0Y2JseDBYSFJjZENSMGIyOXNZbUZ5TG1acGJtUW9KMkoxZEhSdmJpY3BYRzVjZEZ4MFhIUmNkRngwTG01dmRDZ25ZblYwZEc5dVcyUmhkR0V0WlhabGJuUTlYQ0pqYjJSbGRtbGxkMXdpWFNjcFhHNWNkRngwWEhSY2RGeDBMbkpsYlc5MlpVTnNZWE56S0Nka2FYTmhZbXhsWkNjcE8xeHVYSFJjZEgwN1hHNWNibHgwWEhRdktpcGNibHgwWEhRZ0tpQmtaV0ZqZEdsMllYUmxJR0oxZEhSdmJuTWdaWGhqYkhWa1pTQmpiMlJsZG1sbGQxeHVYSFJjZENBcUlFQndZWEpoYlNCN2FsRjFaWEo1ZlNBa2RHOXZiR0poY2x4dVhIUmNkQ0FxTDF4dVhIUmNkSFJvYVhNdVpHVmhZM1JwZG1GMFpTQTlJR1oxYm1OMGFXOXVJQ2drZEc5dmJHSmhjaWtnZTF4dVhIUmNkRngwSkhSdmIyeGlZWEl1Wm1sdVpDZ25ZblYwZEc5dUp5bGNibHgwWEhSY2RGeDBYSFF1Ym05MEtDZGlkWFIwYjI1YlpHRjBZUzFsZG1WdWREMWNJbU52WkdWMmFXVjNYQ0pkSnlsY2JseDBYSFJjZEZ4MFhIUXVZV1JrUTJ4aGMzTW9KMlJwYzJGaWJHVmtKeWs3WEc1Y2RGeDBmVHRjYmx4dVhIUmNkQzhxS2x4dVhIUmNkQ0FxSUVCd1lYSmhiU0I3YWxGMVpYSjVmU0FrWTI5dWRHRnBibVZ5WEc1Y2RGeDBJQ29nUUhCaGNtRnRJSHRDYjI5c1pXRnVmU0JiWWtaMWJHeHpZM0psWlc0OVptRnNjMlZkWEc1Y2RGeDBJQ292WEc1Y2RGeDBkR2hwY3k1MWNHUmhkR1ZHZFd4c2MyTnlaV1Z1SUQwZ1puVnVZM1JwYjI0Z0tDUmpiMjUwWVdsdVpYSXNJR0pHZFd4c2MyTnlaV1Z1S1NCN1hHNWNkRngwWEhSMllYSWdKR0owYmlBOUlDUmpiMjUwWVdsdVpYSXVabWx1WkNnblluVjBkRzl1VzJSaGRHRXRaWFpsYm5ROVhDSm1kV3hzYzJOeVpXVnVYQ0pkSnlrN1hHNWNkRngwWEhRa1luUnVMblJ2WjJkc1pVTnNZWE56S0NkaFkzUnBkbVVuTENCaVJuVnNiSE5qY21WbGJpazdYRzVjZEZ4MGZUdGNibHh1WEhSY2RDOHFLbHh1WEhSY2RDQXFJRUJ3WVhKaGJTQjdhbEYxWlhKNWZTQWtZMjl1ZEdGcGJtVnlYRzVjZEZ4MElDb2dRSEJoY21GdElIdENiMjlzWldGdWZTQmJhWE5EYjJSbGRtbGxkejFtWVd4elpWMWNibHgwWEhRZ0tpOWNibHgwWEhSMGFHbHpMblZ3WkdGMFpVTnZaR1YyYVdWM0lEMGdablZ1WTNScGIyNGdLQ1JqYjI1MFlXbHVaWElzSUdselEyOWtaWFpwWlhjcElIdGNibHgwWEhSY2RIWmhjaUFrWW5SdUlEMGdKR052Ym5SaGFXNWxjaTVtYVc1a0tDZGlkWFIwYjI1YlpHRjBZUzFsZG1WdWREMWNJbU52WkdWMmFXVjNYQ0pkSnlrN1hHNWNkRngwWEhRa1luUnVMblJ2WjJkc1pVTnNZWE56S0NkaFkzUnBkbVVuTENCcGMwTnZaR1YyYVdWM0tUdGNibHh1WEhSY2RGeDBhV1lnS0dselEyOWtaWFpwWlhjcElIdGNibHgwWEhSY2RGeDBkR2hwY3k1a1pXRmpkR2wyWVhSbEtDUmpiMjUwWVdsdVpYSXBPMXh1WEhSY2RGeDBmU0JsYkhObElIdGNibHgwWEhSY2RGeDBkR2hwY3k1aFkzUnBkbUYwWlNna1kyOXVkR0ZwYm1WeUtUdGNibHgwWEhSY2RIMWNibHgwWEhSOU8xeHVYRzVjZEZ4MEx5b3FYRzVjZEZ4MElDb2daMlYwSUdKMWRIUnZiaUJwYmlCMGIyOXNZbUZ5SUZ4dVhIUmNkQ0FxWEc1Y2RGeDBJQ29nUUhCaGNtRnRJSHRxVVhWbGNubDlJQ1JsWkdsMFlXSnNaVnh1WEhSY2RDQXFJRUJ3WVhKaGJTQjdVM1J5YVc1bmZTQnVZVzFsWEc1Y2RGeDBJQ29nUUhKbGRIVnliaUI3YWxGMVpYSjVmVnh1WEhSY2RDQXFMMXh1WEhSY2RIUm9hWE11WjJWMElEMGdablZ1WTNScGIyNGdLQ1JsWkdsMFlXSnNaU3dnYm1GdFpTa2dlMXh1WEhSY2RGeDBkbUZ5SUNSMGIyOXNZbUZ5SUQwZ1pHOXRMbTFoYTJWTVlYbHZkWFJKYm1adktDUmxaR2wwWVdKc1pTa3VkRzl2YkdKaGNpZ3BPMXh1WEc1Y2RGeDBYSFJ5WlhSMWNtNGdKSFJ2YjJ4aVlYSXVabWx1WkNnblcyUmhkR0V0Ym1GdFpUMG5JQ3NnYm1GdFpTQXJJQ2RkSnlrN1hHNWNkRngwZlR0Y2JseHVYSFJjZEM4cUtseHVYSFJjZENBcUlITmxkQ0JpZFhSMGIyNGdjM1JoZEdWY2JseDBYSFFnS2lCQWNHRnlZVzBnZTJwUmRXVnllWDBnSkdWa2FYUmhZbXhsWEc1Y2RGeDBJQ29nUUhCaGNtRnRJSHRUZEhKcGJtZDlJRzVoYldWY2JseDBYSFFnS2lCQWNHRnlZVzBnZTBKdmIyeGxZVzU5SUZ0cGMwRmpkR2wyWlQxMGNuVmxYVnh1WEhSY2RDQXFMMXh1WEhSY2RIUm9hWE11YzJWMFFuVjBkRzl1VTNSaGRHVWdQU0JtZFc1amRHbHZiaUFvSkdWa2FYUmhZbXhsTENCdVlXMWxMQ0JwYzBGamRHbDJaU2tnZTF4dVhIUmNkRngwYVhOQlkzUnBkbVVnUFNBb2FYTkJZM1JwZG1VZ1BUMDlJR1poYkhObEtTQS9JR1poYkhObElEb2dkSEoxWlR0Y2JseHVYSFJjZEZ4MGRtRnlJQ1JpZFhSMGIyNGdQU0IwYUdsekxtZGxkQ2drWldScGRHRmliR1VzSUc1aGJXVXBPMXh1WEhSY2RGeDBKR0oxZEhSdmJpNTBiMmRuYkdWRGJHRnpjeWduWVdOMGFYWmxKeXdnYVhOQlkzUnBkbVVwTzF4dVhIUmNkSDA3WEc1Y2RIMDdYRzVjYmx4MGRtRnlJRVZFU1ZSQlFreEZYMUJCUkVSSlRrY2dQU0F5TkR0Y2JseHVYSFIyWVhJZ1UzUmhkSFZ6WW1GeUlEMGdablZ1WTNScGIyNGdLQ2tnZTF4dVhIUmNkSFpoY2lBa1pHOWpkVzFsYm5RZ1BTQWtLR1J2WTNWdFpXNTBLVHRjYmx4dVhIUmNkSFJvYVhNdVlYUjBZV05vSUQwZ1puVnVZM1JwYjI0Z0tHeGhlVzkxZEVsdVptOHNJRzl3ZEdsdmJuTXBJSHRjYmx4MFhIUmNkR2xtSUNnaGIzQjBhVzl1Y3k1a2FYTmhZbXhsVW1WemFYcGxSV1JwZEc5eUtTQjdYRzVjZEZ4MFhIUmNkR3hoZVc5MWRFbHVabTh1YzNSaGRIVnpZbUZ5S0NrdWIyNG9KMjF2ZFhObFpHOTNiaWNzSUdoVGRHRjBkWE5pWVhKTmIzVnpaV1J2ZDI0cE8xeHVYSFJjZEZ4MGZWeHVYSFJjZEgwN1hHNWNibHgwWEhRdktpcGNibHgwWEhRZ0tpQmdiVzkxYzJWa2IzZHVZQ0JsZG1WdWRDQm9ZVzVrYkdWeUlHOXVJSE4wWVhSMWMySmhjbHh1WEhSY2RDQXFYRzVjZEZ4MElDb2dRSEJoY21GdElIdE5iM1Z6WlVWMlpXNTBmU0JsZG1WdWRGeHVYSFJjZENBcUwxeHVYSFJjZEhaaGNpQm9VM1JoZEhWelltRnlUVzkxYzJWa2IzZHVJRDBnWm5WdVkzUnBiMjRnS0dWMlpXNTBLU0I3WEc1Y2RGeDBYSFJsZG1WdWRDNXdjbVYyWlc1MFJHVm1ZWFZzZENncE8xeHVYSFJjZEZ4MFpYWmxiblF1YzNSdmNGQnliM0JoWjJGMGFXOXVLQ2s3WEc1Y2JseDBYSFJjZEhaaGNpQWtaV1JwZEdGaWJHVWdQU0JrYjIwdWJXRnJaVXhoZVc5MWRFbHVabThvWlhabGJuUXVkR0Z5WjJWMEtTNWxaR2wwWVdKc1pTZ3BPMXh1WEhSY2RGeDBkbUZ5SUdWa2FYUmhZbXhsVkc5d0lEMGdKR1ZrYVhSaFlteGxMbTltWm5ObGRDZ3BMblJ2Y0NBdElDUmtiMk4xYldWdWRDNXpZM0p2Ykd4VWIzQW9LVHRjYmx4dVhIUmNkRngwZG1GeUlHeGhlVzkxZEVsdVptOGdQU0JrYjIwdWJXRnJaVXhoZVc5MWRFbHVabThvWlhabGJuUXVZM1Z5Y21WdWRGUmhjbWRsZENCOGZDQmxkbVZ1ZEM1MFlYSm5aWFFwTzF4dVhIUmNkRngwZG1GeUlHOXdkR2x2Ym5NZ1BTQnNZWGx2ZFhSSmJtWnZMbVZrYVhSdmNpZ3BMbVJoZEdFb0oyOXdkR2x2Ym5NbktUdGNibHh1WEhSY2RGeDBKR1J2WTNWdFpXNTBMbTl1S0NkdGIzVnpaVzF2ZG1VbkxDQm1kVzVqZEdsdmJpQW9aWFpsYm5RcElIdGNibHgwWEhSY2RGeDBkbUZ5SUc1SVpXbG5hSFFnUFNCbGRtVnVkQzVqYkdsbGJuUlpJQzBnS0dWa2FYUmhZbXhsVkc5d0lDc2dSVVJKVkVGQ1RFVmZVRUZFUkVsT1J5azdYRzVjYmx4MFhIUmNkRngwYmtobGFXZG9kQ0E5SUNodmNIUnBiMjV6TG0xcGJraGxhV2RvZENBK0lEQXBJRDhnVFdGMGFDNXRZWGdvYmtobGFXZG9kQ3dnYjNCMGFXOXVjeTV0YVc1SVpXbG5hSFFwSURvZ2JraGxhV2RvZER0Y2JseDBYSFJjZEZ4MGJraGxhV2RvZENBOUlDaHZjSFJwYjI1ekxtMWhlRWhsYVdkb2RDQStJREFwSUQ4Z1RXRjBhQzV0YVc0b2JraGxhV2RvZEN3Z2IzQjBhVzl1Y3k1dFlYaElaV2xuYUhRcElEb2dia2hsYVdkb2REdGNibHh1WEhSY2RGeDBYSFFrWldScGRHRmliR1V1YUdWcFoyaDBLRzVJWldsbmFIUXBPMXh1WEhSY2RGeDBmU2t1YjI1bEtDZHRiM1Z6WlhWd0p5d2dablZ1WTNScGIyNGdLQ2tnZTF4dVhIUmNkRngwWEhRa1pHOWpkVzFsYm5RdWIyWm1LQ2R0YjNWelpXMXZkbVVuS1R0Y2JseDBYSFJjZEgwcE8xeHVYSFJjZEgwN1hHNWNkSDA3WEc1Y2JseDBMeW9xWEc1Y2RDQXFJRUJqYkdGemN5QnRiMlIxYkdVdVVHOXdiM1psY2x4dVhIUWdLbHh1WEhRZ0tpQlFiM0J2ZG1WeUlDaG9kSFJ3T2k4dloyVjBZbTl2ZEhOMGNtRndMbU52YlM5cVlYWmhjMk55YVhCMEx5TndiM0J2ZG1WeWN5bGNibHgwSUNwY2JseDBJQ292WEc1Y2RIWmhjaUJRYjNCdmRtVnlJRDBnWm5WdVkzUnBiMjRnS0NrZ2UxeHVYSFJjZEhaaGNpQmlkWFIwYjI0Z1BTQnVaWGNnUW5WMGRHOXVLQ2s3WEc1Y2JseDBYSFF2S2lwY2JseDBYSFFnS2lCeVpYUjFjbTV6SUhCdmMybDBhVzl1SUdaeWIyMGdjR3hoWTJWb2IyeGtaWEpjYmx4MFhIUWdLbHh1WEhSY2RDQXFJRUJ3Y21sMllYUmxYRzVjZEZ4MElDb2dRSEJoY21GdElIdE9iMlJsZlNCd2JHRmpaV2h2YkdSbGNseHVYSFJjZENBcUlFQndZWEpoYlNCN1FtOXZiR1ZoYm4wZ2FYTkJhWEpOYjJSbFhHNWNkRngwSUNvZ1FISmxkSFZ5YmlCN1QySnFaV04wZlZ4dVhIUmNkQ0FxSUVCeVpYUjFjbTRnZTA1MWJXSmxjbjBnY21WMGRYSnVMbXhsWm5SY2JseDBYSFFnS2lCQWNtVjBkWEp1SUh0T2RXMWlaWEo5SUhKbGRIVnliaTUwYjNCY2JseDBYSFFnS2k5Y2JseDBYSFIyWVhJZ2NHOXpSbkp2YlZCc1lXTmxhRzlzWkdWeUlEMGdablZ1WTNScGIyNGdLSEJzWVdObGFHOXNaR1Z5TENCcGMwRnBjazF2WkdVcElIdGNibHgwWEhSY2RIWmhjaUFrY0d4aFkyVm9iMnhrWlhJZ1BTQWtLSEJzWVdObGFHOXNaR1Z5S1R0Y2JseDBYSFJjZEhaaGNpQndiM01nUFNCcGMwRnBjazF2WkdVZ1B5QWtjR3hoWTJWb2IyeGtaWEl1YjJabWMyVjBLQ2tnT2lBa2NHeGhZMlZvYjJ4a1pYSXVjRzl6YVhScGIyNG9LVHRjYmx4MFhIUmNkSFpoY2lCb1pXbG5hSFFnUFNBa2NHeGhZMlZvYjJ4a1pYSXViM1YwWlhKSVpXbG5hSFFvZEhKMVpTazdJQzh2SUdsdVkyeDFaR1VnYldGeVoybHVYRzVjYmx4MFhIUmNkQzh2SUhCdmNHOTJaWElnWW1Wc2IzY2djR3hoWTJWb2IyeGtaWEl1WEc1Y2RGeDBYSFJ5WlhSMWNtNGdlMXh1WEhSY2RGeDBYSFJzWldaME9pQndiM011YkdWbWRDeGNibHgwWEhSY2RGeDBkRzl3T2lCd2IzTXVkRzl3SUNzZ2FHVnBaMmgwWEc1Y2RGeDBYSFI5TzF4dVhIUmNkSDA3WEc1Y2JseDBYSFF2S2lwY2JseDBYSFFnS2lCemFHOTNJSEJ2Y0c5MlpYSmNibHgwWEhRZ0tseHVYSFJjZENBcUlFQndjbWwyWVhSbFhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0cVVYVmxjbmw5SUhCdmNHOTJaWEpjYmx4MFhIUWdLaUJBY0dGeVlXMGdlMUJ2YzJsMGFXOXVmU0J3YjNOY2JseDBYSFFnS2k5Y2JseDBYSFIyWVhJZ2MyaHZkMUJ2Y0c5MlpYSWdQU0JtZFc1amRHbHZiaUFvSkhCdmNHOTJaWElzSUhCdmN5a2dlMXh1WEhSY2RGeDBKSEJ2Y0c5MlpYSXVZM056S0h0Y2JseDBYSFJjZEZ4MFpHbHpjR3hoZVRvZ0oySnNiMk5ySnl4Y2JseDBYSFJjZEZ4MGJHVm1kRG9nY0c5ekxteGxablFzWEc1Y2RGeDBYSFJjZEhSdmNEb2djRzl6TG5SdmNGeHVYSFJjZEZ4MGZTazdYRzVjZEZ4MGZUdGNibHh1WEhSY2RIWmhjaUJRV0Y5UVQxQlBWa1ZTWDBGU1VrOVhYMDlHUmxORlZGOVlJRDBnTWpBN1hHNWNibHgwWEhRdktpcGNibHgwWEhRZ0tpQjFjR1JoZEdVZ1kzVnljbVZ1ZENCemRHRjBaVnh1WEhSY2RDQXFJRUJ3WVhKaGJTQjdhbEYxWlhKNWZTQWtjRzl3YjNabGNpQXRJSEJ2Y0c5MlpYSWdZMjl1ZEdGcGJtVnlYRzVjZEZ4MElDb2dRSEJoY21GdElIdFBZbXBsWTNSOUlITjBlV3hsU1c1bWJ5QXRJSE4wZVd4bElHOWlhbVZqZEZ4dVhIUmNkQ0FxSUVCd1lYSmhiU0I3UW05dmJHVmhibjBnYVhOQmFYSk5iMlJsWEc1Y2RGeDBJQ292WEc1Y2RGeDBkR2hwY3k1MWNHUmhkR1VnUFNCbWRXNWpkR2x2YmlBb0pIQnZjRzkyWlhJc0lITjBlV3hsU1c1bWJ5d2dhWE5CYVhKTmIyUmxLU0I3WEc1Y2RGeDBYSFJpZFhSMGIyNHVkWEJrWVhSbEtDUndiM0J2ZG1WeUxDQnpkSGxzWlVsdVptOHBPMXh1WEc1Y2RGeDBYSFIyWVhJZ0pHeHBibXRRYjNCdmRtVnlJRDBnSkhCdmNHOTJaWEl1Wm1sdVpDZ25MbTV2ZEdVdGJHbHVheTF3YjNCdmRtVnlKeWs3WEc1Y2RGeDBYSFJwWmlBb2MzUjViR1ZKYm1adkxtRnVZMmh2Y2lrZ2UxeHVYSFJjZEZ4MFhIUjJZWElnSkdGdVkyaHZjaUE5SUNSc2FXNXJVRzl3YjNabGNpNW1hVzVrS0NkaEp5azdYRzVjZEZ4MFhIUmNkSFpoY2lCb2NtVm1JRDBnSkNoemRIbHNaVWx1Wm04dVlXNWphRzl5S1M1aGRIUnlLQ2RvY21WbUp5azdYRzVjZEZ4MFhIUmNkSFpoY2lCMFlYSm5aWFFnUFNBa0tITjBlV3hsU1c1bWJ5NWhibU5vYjNJcExtRjBkSElvSjNSaGNtZGxkQ2NwTzF4dVhIUmNkRngwWEhRa1lXNWphRzl5TG1GMGRISW9KMmh5WldZbkxDQm9jbVZtS1M1b2RHMXNLR2h5WldZcE8xeHVYSFJjZEZ4MFhIUnBaaUFvSVhSaGNtZGxkQ2tnZTF4dVhIUmNkRngwWEhSY2RDUmhibU5vYjNJdWNtVnRiM1psUVhSMGNpZ25kR0Z5WjJWMEp5azdYRzVjZEZ4MFhIUmNkSDBnWld4elpTQjdYRzVjZEZ4MFhIUmNkRngwSkdGdVkyaHZjaTVoZEhSeUtDZDBZWEpuWlhRbkxDQW5YMkpzWVc1ckp5azdYRzVjZEZ4MFhIUmNkSDFjYmx4MFhIUmNkRngwYzJodmQxQnZjRzkyWlhJb0pHeHBibXRRYjNCdmRtVnlMQ0J3YjNOR2NtOXRVR3hoWTJWb2IyeGtaWElvYzNSNWJHVkpibVp2TG1GdVkyaHZjaXdnYVhOQmFYSk5iMlJsS1NrN1hHNWNkRngwWEhSOUlHVnNjMlVnZTF4dVhIUmNkRngwWEhRa2JHbHVhMUJ2Y0c5MlpYSXVhR2xrWlNncE8xeHVYSFJjZEZ4MGZWeHVYRzVjZEZ4MFhIUjJZWElnSkdsdFlXZGxVRzl3YjNabGNpQTlJQ1J3YjNCdmRtVnlMbVpwYm1Rb0p5NXViM1JsTFdsdFlXZGxMWEJ2Y0c5MlpYSW5LVHRjYmx4MFhIUmNkR2xtSUNoemRIbHNaVWx1Wm04dWFXMWhaMlVwSUh0Y2JseDBYSFJjZEZ4MGMyaHZkMUJ2Y0c5MlpYSW9KR2x0WVdkbFVHOXdiM1psY2l3Z2NHOXpSbkp2YlZCc1lXTmxhRzlzWkdWeUtITjBlV3hsU1c1bWJ5NXBiV0ZuWlN3Z2FYTkJhWEpOYjJSbEtTazdYRzVjZEZ4MFhIUjlJR1ZzYzJVZ2UxeHVYSFJjZEZ4MFhIUWthVzFoWjJWUWIzQnZkbVZ5TG1ocFpHVW9LVHRjYmx4MFhIUmNkSDFjYmx4dVhIUmNkRngwZG1GeUlDUmhhWEpRYjNCdmRtVnlJRDBnSkhCdmNHOTJaWEl1Wm1sdVpDZ25MbTV2ZEdVdFlXbHlMWEJ2Y0c5MlpYSW5LVHRjYmx4MFhIUmNkR2xtSUNocGMwRnBjazF2WkdVZ0ppWWdJWE4wZVd4bFNXNW1ieTV5WVc1blpTNXBjME52Ykd4aGNITmxaQ2dwS1NCN1hHNWNkRngwWEhSY2RIWmhjaUJ5WldOMElEMGdiR2x6ZEM1c1lYTjBLSE4wZVd4bFNXNW1ieTV5WVc1blpTNW5aWFJEYkdsbGJuUlNaV04wY3lncEtUdGNibHgwWEhSY2RGeDBhV1lnS0hKbFkzUXBJSHRjYmx4MFhIUmNkRngwWEhSMllYSWdZbTVrSUQwZ1puVnVZeTV5WldOME1tSnVaQ2h5WldOMEtUdGNibHgwWEhSY2RGeDBYSFJ6YUc5M1VHOXdiM1psY2lna1lXbHlVRzl3YjNabGNpd2dlMXh1WEhSY2RGeDBYSFJjZEZ4MGJHVm1kRG9nVFdGMGFDNXRZWGdvWW01a0xteGxablFnS3lCaWJtUXVkMmxrZEdnZ0x5QXlJQzBnVUZoZlVFOVFUMVpGVWw5QlVsSlBWMTlQUmtaVFJWUmZXQ3dnTUNrc1hHNWNkRngwWEhSY2RGeDBYSFIwYjNBNklHSnVaQzUwYjNBZ0t5QmlibVF1YUdWcFoyaDBYRzVjZEZ4MFhIUmNkRngwZlNrN1hHNWNkRngwWEhSY2RIMWNibHgwWEhSY2RIMGdaV3h6WlNCN1hHNWNkRngwWEhSY2RDUmhhWEpRYjNCdmRtVnlMbWhwWkdVb0tUdGNibHgwWEhSY2RIMWNibHgwWEhSOU8xeHVYRzVjZEZ4MEx5b3FYRzVjZEZ4MElDb2dRSEJoY21GdElIdE9iMlJsZlNCaWRYUjBiMjVjYmx4MFhIUWdLaUJBY0dGeVlXMGdlMU4wY21sdVozMGdaWFpsYm5ST1lXMWxYRzVjZEZ4MElDb2dRSEJoY21GdElIdFRkSEpwYm1kOUlIWmhiSFZsWEc1Y2RGeDBJQ292WEc1Y2RGeDBkR2hwY3k1MWNHUmhkR1ZTWldObGJuUkRiMnh2Y2lBOUlHWjFibU4wYVc5dUlDaGlkWFIwYjI0c0lHVjJaVzUwVG1GdFpTd2dkbUZzZFdVcElIdGNibHgwWEhSY2RHSjFkSFJ2Ymk1MWNHUmhkR1ZTWldObGJuUkRiMnh2Y2loaWRYUjBiMjRzSUdWMlpXNTBUbUZ0WlN3Z2RtRnNkV1VwTzF4dVhIUmNkSDA3WEc1Y2JseDBYSFF2S2lwY2JseDBYSFFnS2lCb2FXUmxJR0ZzYkNCd2IzQnZkbVZ5YzF4dVhIUmNkQ0FxSUVCd1lYSmhiU0I3YWxGMVpYSjVmU0FrY0c5d2IzWmxjaUF0SUhCdmNHOTJaWElnWTI5dWRHRnBibVZ5WEc1Y2RGeDBJQ292WEc1Y2RGeDBkR2hwY3k1b2FXUmxJRDBnWm5WdVkzUnBiMjRnS0NSd2IzQnZkbVZ5S1NCN1hHNWNkRngwWEhRa2NHOXdiM1psY2k1amFHbHNaSEpsYmlncExtaHBaR1VvS1R0Y2JseDBYSFI5TzF4dVhIUjlPMXh1WEc1Y2RDOHFLbHh1WEhRZ0tpQkFZMnhoYzNNZ2JXOWtkV3hsTGtoaGJtUnNaVnh1WEhRZ0tseHVYSFFnS2lCSVlXNWtiR1ZjYmx4MElDb3ZYRzVjZEhaaGNpQklZVzVrYkdVZ1BTQm1kVzVqZEdsdmJpQW9hR0Z1Wkd4bGNpa2dlMXh1WEhSY2RIWmhjaUFrWkc5amRXMWxiblFnUFNBa0tHUnZZM1Z0Wlc1MEtUdGNibHh1WEhSY2RDOHFLbHh1WEhSY2RDQXFJR0J0YjNWelpXUnZkMjVnSUdWMlpXNTBJR2hoYm1Sc1pYSWdiMjRnSkdoaGJtUnNaVnh1WEhSY2RDQXFJQ0F0SUdOdmJuUnliMnhUYVhwcGJtYzZJSEpsYzJsNlpTQnBiV0ZuWlZ4dVhIUmNkQ0FxWEc1Y2RGeDBJQ29nUUhCaGNtRnRJSHROYjNWelpVVjJaVzUwZlNCbGRtVnVkRnh1WEhSY2RDQXFMMXh1WEhSY2RIWmhjaUJvU0dGdVpHeGxUVzkxYzJWa2IzZHVJRDBnWm5WdVkzUnBiMjRnS0dWMlpXNTBLU0I3WEc1Y2RGeDBYSFJwWmlBb1pHOXRMbWx6UTI5dWRISnZiRk5wZW1sdVp5aGxkbVZ1ZEM1MFlYSm5aWFFwS1NCN1hHNWNkRngwWEhSY2RHVjJaVzUwTG5CeVpYWmxiblJFWldaaGRXeDBLQ2s3WEc1Y2RGeDBYSFJjZEdWMlpXNTBMbk4wYjNCUWNtOXdZV2RoZEdsdmJpZ3BPMXh1WEc1Y2RGeDBYSFJjZEhaaGNpQnNZWGx2ZFhSSmJtWnZJRDBnWkc5dExtMWhhMlZNWVhsdmRYUkpibVp2S0dWMlpXNTBMblJoY21kbGRDa3NYRzVjZEZ4MFhIUmNkRngwSkdoaGJtUnNaU0E5SUd4aGVXOTFkRWx1Wm04dWFHRnVaR3hsS0Nrc1hHNWNkRngwWEhSY2RGeDBKSEJ2Y0c5MlpYSWdQU0JzWVhsdmRYUkpibVp2TG5CdmNHOTJaWElvS1N4Y2JseDBYSFJjZEZ4MFhIUWtaV1JwZEdGaWJHVWdQU0JzWVhsdmRYUkpibVp2TG1Wa2FYUmhZbXhsS0Nrc1hHNWNkRngwWEhSY2RGeDBKR1ZrYVhSdmNpQTlJR3hoZVc5MWRFbHVabTh1WldScGRHOXlLQ2s3WEc1Y2JseDBYSFJjZEZ4MGRtRnlJSFJoY21kbGRDQTlJQ1JvWVc1a2JHVXVabWx1WkNnbkxtNXZkR1V0WTI5dWRISnZiQzF6Wld4bFkzUnBiMjRuS1M1a1lYUmhLQ2QwWVhKblpYUW5LU3hjYmx4MFhIUmNkRngwWEhRa2RHRnlaMlYwSUQwZ0pDaDBZWEpuWlhRcExDQndiM05UZEdGeWRDQTlJQ1IwWVhKblpYUXViMlptYzJWMEtDa3NYRzVjZEZ4MFhIUmNkRngwYzJOeWIyeHNWRzl3SUQwZ0pHUnZZM1Z0Wlc1MExuTmpjbTlzYkZSdmNDZ3BPMXh1WEc1Y2RGeDBYSFJjZEhaaGNpQnBjMEZwY2sxdlpHVWdQU0FrWldScGRHOXlMbVJoZEdFb0oyOXdkR2x2Ym5NbktTNWhhWEpOYjJSbE8xeHVYRzVjZEZ4MFhIUmNkQ1JrYjJOMWJXVnVkQzV2YmlnbmJXOTFjMlZ0YjNabEp5d2dablZ1WTNScGIyNGdLR1YyWlc1MEtTQjdYRzVjZEZ4MFhIUmNkRngwYUdGdVpHeGxjaTVwYm5admEyVW9KMlZrYVhSdmNpNXlaWE5wZW1WVWJ5Y3NJSHRjYmx4MFhIUmNkRngwWEhSY2RIZzZJR1YyWlc1MExtTnNhV1Z1ZEZnZ0xTQndiM05UZEdGeWRDNXNaV1owTEZ4dVhIUmNkRngwWEhSY2RGeDBlVG9nWlhabGJuUXVZMnhwWlc1MFdTQXRJQ2h3YjNOVGRHRnlkQzUwYjNBZ0xTQnpZM0p2Ykd4VWIzQXBYRzVjZEZ4MFhIUmNkRngwZlN3Z0pIUmhjbWRsZEN3Z0lXVjJaVzUwTG5Ob2FXWjBTMlY1S1R0Y2JseHVYSFJjZEZ4MFhIUmNkR2hoYm1Sc1pYSXVhVzUyYjJ0bEtDZG9ZVzVrYkdVdWRYQmtZWFJsSnl3Z0pHaGhibVJzWlN3Z2V5QnBiV0ZuWlRvZ2RHRnlaMlYwSUgwc0lHbHpRV2x5VFc5a1pTazdYRzVjZEZ4MFhIUmNkRngwYUdGdVpHeGxjaTVwYm5admEyVW9KM0J2Y0c5MlpYSXVkWEJrWVhSbEp5d2dKSEJ2Y0c5MlpYSXNJSHNnYVcxaFoyVTZJSFJoY21kbGRDQjlMQ0JwYzBGcGNrMXZaR1VwTzF4dVhIUmNkRngwWEhSOUtTNXZibVVvSjIxdmRYTmxkWEFuTENCbWRXNWpkR2x2YmlBb0tTQjdYRzVjZEZ4MFhIUmNkRngwSkdSdlkzVnRaVzUwTG05bVppZ25iVzkxYzJWdGIzWmxKeWs3WEc1Y2RGeDBYSFJjZEZ4MGFHRnVaR3hsY2k1cGJuWnZhMlVvSjJWa2FYUnZjaTVoWm5SbGNrTnZiVzFoYm1RbkxDQWtaV1JwZEdGaWJHVXBPMXh1WEhSY2RGeDBYSFI5S1R0Y2JseHVYSFJjZEZ4MFhIUnBaaUFvSVNSMFlYSm5aWFF1WkdGMFlTZ25jbUYwYVc4bktTa2dleUF2THlCdmNtbG5hVzVoYkNCeVlYUnBieTVjYmx4MFhIUmNkRngwWEhRa2RHRnlaMlYwTG1SaGRHRW9KM0poZEdsdkp5d2dKSFJoY21kbGRDNW9aV2xuYUhRb0tTQXZJQ1IwWVhKblpYUXVkMmxrZEdnb0tTazdYRzVjZEZ4MFhIUmNkSDFjYmx4MFhIUmNkSDFjYmx4MFhIUjlPMXh1WEc1Y2RGeDBkR2hwY3k1aGRIUmhZMmdnUFNCbWRXNWpkR2x2YmlBb2JHRjViM1YwU1c1bWJ5a2dlMXh1WEhSY2RGeDBiR0Y1YjNWMFNXNW1ieTVvWVc1a2JHVW9LUzV2YmlnbmJXOTFjMlZrYjNkdUp5d2dhRWhoYm1Sc1pVMXZkWE5sWkc5M2JpazdYRzVjZEZ4MGZUdGNibHh1WEhSY2RDOHFLbHh1WEhSY2RDQXFJSFZ3WkdGMFpTQm9ZVzVrYkdWY2JseDBYSFFnS2lCQWNHRnlZVzBnZTJwUmRXVnllWDBnSkdoaGJtUnNaVnh1WEhSY2RDQXFJRUJ3WVhKaGJTQjdUMkpxWldOMGZTQnpkSGxzWlVsdVptOWNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UwSnZiMnhsWVc1OUlHbHpRV2x5VFc5a1pWeHVYSFJjZENBcUwxeHVYSFJjZEhSb2FYTXVkWEJrWVhSbElEMGdablZ1WTNScGIyNGdLQ1JvWVc1a2JHVXNJSE4wZVd4bFNXNW1ieXdnYVhOQmFYSk5iMlJsS1NCN1hHNWNkRngwWEhSMllYSWdKSE5sYkdWamRHbHZiaUE5SUNSb1lXNWtiR1V1Wm1sdVpDZ25MbTV2ZEdVdFkyOXVkSEp2YkMxelpXeGxZM1JwYjI0bktUdGNibHgwWEhSY2RHbG1JQ2h6ZEhsc1pVbHVabTh1YVcxaFoyVXBJSHRjYmx4MFhIUmNkRngwZG1GeUlDUnBiV0ZuWlNBOUlDUW9jM1I1YkdWSmJtWnZMbWx0WVdkbEtUdGNibHgwWEhSY2RGeDBkbUZ5SUhCdmN5QTlJR2x6UVdseVRXOWtaU0EvSUNScGJXRm5aUzV2Wm1aelpYUW9LU0E2SUNScGJXRm5aUzV3YjNOcGRHbHZiaWdwTzF4dVhHNWNkRngwWEhSY2RDOHZJR2x1WTJ4MVpHVWdiV0Z5WjJsdVhHNWNkRngwWEhSY2RIWmhjaUJwYldGblpWTnBlbVVnUFNCN1hHNWNkRngwWEhSY2RGeDBkem9nSkdsdFlXZGxMbTkxZEdWeVYybGtkR2dvZEhKMVpTa3NYRzVjZEZ4MFhIUmNkRngwYURvZ0pHbHRZV2RsTG05MWRHVnlTR1ZwWjJoMEtIUnlkV1VwWEc1Y2RGeDBYSFJjZEgwN1hHNWNibHgwWEhSY2RGeDBKSE5sYkdWamRHbHZiaTVqYzNNb2UxeHVYSFJjZEZ4MFhIUmNkR1JwYzNCc1lYazZJQ2RpYkc5amF5Y3NYRzVjZEZ4MFhIUmNkRngwYkdWbWREb2djRzl6TG14bFpuUXNYRzVjZEZ4MFhIUmNkRngwZEc5d09pQndiM011ZEc5d0xGeHVYSFJjZEZ4MFhIUmNkSGRwWkhSb09pQnBiV0ZuWlZOcGVtVXVkeXhjYmx4MFhIUmNkRngwWEhSb1pXbG5hSFE2SUdsdFlXZGxVMmw2WlM1b1hHNWNkRngwWEhSY2RIMHBMbVJoZEdFb0ozUmhjbWRsZENjc0lITjBlV3hsU1c1bWJ5NXBiV0ZuWlNrN0lDOHZJSE5oZG1VZ1kzVnljbVZ1ZENCcGJXRm5aU0JsYkdWdFpXNTBMbHh1WEhSY2RGeDBYSFIyWVhJZ2MybDZhVzVuVkdWNGRDQTlJR2x0WVdkbFUybDZaUzUzSUNzZ0ozZ25JQ3NnYVcxaFoyVlRhWHBsTG1nN1hHNWNkRngwWEhSY2RDUnpaV3hsWTNScGIyNHVabWx1WkNnbkxtNXZkR1V0WTI5dWRISnZiQzF6Wld4bFkzUnBiMjR0YVc1bWJ5Y3BMblJsZUhRb2MybDZhVzVuVkdWNGRDazdYRzVjZEZ4MFhIUjlJR1ZzYzJVZ2UxeHVYSFJjZEZ4MFhIUWtjMlZzWldOMGFXOXVMbWhwWkdVb0tUdGNibHgwWEhSY2RIMWNibHgwWEhSOU8xeHVYRzVjZEZ4MEx5b3FYRzVjZEZ4MElDb2dhR2xrWlZ4dVhIUmNkQ0FxWEc1Y2RGeDBJQ29nUUhCaGNtRnRJSHRxVVhWbGNubDlJQ1JvWVc1a2JHVmNibHgwWEhRZ0tpOWNibHgwWEhSMGFHbHpMbWhwWkdVZ1BTQm1kVzVqZEdsdmJpQW9KR2hoYm1Sc1pTa2dlMXh1WEhSY2RGeDBKR2hoYm1Sc1pTNWphR2xzWkhKbGJpZ3BMbWhwWkdVb0tUdGNibHgwWEhSOU8xeHVYSFI5TzF4dVhHNWNkSFpoY2lCR2RXeHNjMk55WldWdUlEMGdablZ1WTNScGIyNGdLR2hoYm1Sc1pYSXBJSHRjYmx4MFhIUjJZWElnSkhkcGJtUnZkeUE5SUNRb2QybHVaRzkzS1R0Y2JseDBYSFIyWVhJZ0pITmpjbTlzYkdKaGNpQTlJQ1FvSjJoMGJXd3NJR0p2WkhrbktUdGNibHh1WEhSY2RDOHFLbHh1WEhSY2RDQXFJSFJ2WjJkc1pTQm1kV3hzYzJOeVpXVnVYRzVjZEZ4MElDcGNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UwOWlhbVZqZEgwZ2JHRjViM1YwU1c1bWIxeHVYSFJjZENBcUwxeHVYSFJjZEhSb2FYTXVkRzluWjJ4bElEMGdablZ1WTNScGIyNGdLR3hoZVc5MWRFbHVabThwSUh0Y2JseHVYSFJjZEZ4MGRtRnlJQ1JsWkdsMGIzSWdQU0JzWVhsdmRYUkpibVp2TG1Wa2FYUnZjaWdwTEZ4dVhIUmNkRngwWEhRa2RHOXZiR0poY2lBOUlHeGhlVzkxZEVsdVptOHVkRzl2YkdKaGNpZ3BMRnh1WEhSY2RGeDBYSFFrWldScGRHRmliR1VnUFNCc1lYbHZkWFJKYm1adkxtVmthWFJoWW14bEtDa3NYRzVjZEZ4MFhIUmNkQ1JqYjJSaFlteGxJRDBnYkdGNWIzVjBTVzVtYnk1amIyUmhZbXhsS0NrN1hHNWNibHgwWEhSY2RIWmhjaUJ5WlhOcGVtVWdQU0JtZFc1amRHbHZiaUFvYzJsNlpTa2dlMXh1WEhSY2RGeDBYSFFrWldScGRHRmliR1V1WTNOektDZG9aV2xuYUhRbkxDQnphWHBsTG1ncE8xeHVYSFJjZEZ4MFhIUWtZMjlrWVdKc1pTNWpjM01vSjJobGFXZG9kQ2NzSUhOcGVtVXVhQ2s3WEc1Y2RGeDBYSFJjZEdsbUlDZ2tZMjlrWVdKc1pTNWtZWFJoS0NkamJXVmthWFJ2Y2ljcEtTQjdYRzVjZEZ4MFhIUmNkRngwSkdOdlpHRmliR1V1WkdGMFlTZ25ZMjFsWkdsMGIzSW5LUzV6WlhSemFYcGxLRzUxYkd3c0lITnBlbVV1YUNrN1hHNWNkRngwWEhSY2RIMWNibHgwWEhSY2RIMDdYRzVjYmx4MFhIUmNkQ1JsWkdsMGIzSXVkRzluWjJ4bFEyeGhjM01vSjJaMWJHeHpZM0psWlc0bktUdGNibHgwWEhSY2RIWmhjaUJwYzBaMWJHeHpZM0psWlc0Z1BTQWtaV1JwZEc5eUxtaGhjME5zWVhOektDZG1kV3hzYzJOeVpXVnVKeWs3WEc1Y2RGeDBYSFJwWmlBb2FYTkdkV3hzYzJOeVpXVnVLU0I3WEc1Y2RGeDBYSFJjZENSbFpHbDBZV0pzWlM1a1lYUmhLQ2R2Y21kb1pXbG5hSFFuTENBa1pXUnBkR0ZpYkdVdVkzTnpLQ2RvWldsbmFIUW5LU2s3WEc1Y2JseDBYSFJjZEZ4MEpIZHBibVJ2ZHk1dmJpZ25jbVZ6YVhwbEp5d2dablZ1WTNScGIyNGdLQ2tnZTF4dVhIUmNkRngwWEhSY2RISmxjMmw2WlNoN1hHNWNkRngwWEhSY2RGeDBYSFJvT2lBa2QybHVaRzkzTG1obGFXZG9kQ2dwSUMwZ0pIUnZiMnhpWVhJdWIzVjBaWEpJWldsbmFIUW9LU0F0SURFME1seHVYSFJjZEZ4MFhIUjlLVHRjYmx4MFhIUmNkRngwZlNrdWRISnBaMmRsY2lnbmNtVnphWHBsSnlrN1hHNWNibHgwWEhSY2RGeDBKSE5qY205c2JHSmhjaTVqYzNNb0oyOTJaWEptYkc5M0p5d2dKMmhwWkdSbGJpY3BPMXh1WEhSY2RGeDBmU0JsYkhObElIdGNibHgwWEhSY2RGeDBKSGRwYm1SdmR5NXZabVlvSjNKbGMybDZaU2NwTzF4dVhIUmNkRngwWEhSeVpYTnBlbVVvZTF4dVhIUmNkRngwWEhSY2RHZzZJQ1JsWkdsMFlXSnNaUzVrWVhSaEtDZHZjbWRvWldsbmFIUW5LVnh1WEhSY2RGeDBYSFI5S1R0Y2JseDBYSFJjZEZ4MEpITmpjbTlzYkdKaGNpNWpjM01vSjI5MlpYSm1iRzkzSnl3Z0ozWnBjMmxpYkdVbktUdGNibHgwWEhSY2RIMWNibHh1WEhSY2RGeDBhR0Z1Wkd4bGNpNXBiblp2YTJVb0ozUnZiMnhpWVhJdWRYQmtZWFJsUm5Wc2JITmpjbVZsYmljc0lDUjBiMjlzWW1GeUxDQnBjMFoxYkd4elkzSmxaVzRwTzF4dVhIUmNkSDA3WEc1Y2RIMDdYRzVjYmx4dVhIUjJZWElnUTI5a1pVMXBjbkp2Y2p0Y2JseDBhV1lnS0dGblpXNTBMbWhoYzBOdlpHVk5hWEp5YjNJcElIdGNibHgwWEhScFppQW9ZV2RsYm5RdWFYTlRkWEJ3YjNKMFFXMWtLU0I3WEc1Y2RGeDBYSFJmWDJKeWIzZHpaWEpwWm5sZmMyaHBiVjl5WlhGMWFYSmxYMThvV3lkRGIyUmxUV2x5Y205eUoxMHNJR1oxYm1OMGFXOXVJQ2hqYlNrZ2UxeHVYSFJjZEZ4MFhIUkRiMlJsVFdseWNtOXlJRDBnWTIwN1hHNWNkRngwWEhSOUtUdGNibHgwWEhSOUlHVnNjMlVnZTF4dVhIUmNkRngwUTI5a1pVMXBjbkp2Y2lBOUlIZHBibVJ2ZHk1RGIyUmxUV2x5Y205eU8xeHVYSFJjZEgxY2JseDBmVnh1WEc1Y2RDOHFLbHh1WEhRZ0tpQkFZMnhoYzNNZ1EyOWtaWFpwWlhkY2JseDBJQ292WEc1Y2RIWmhjaUJEYjJSbGRtbGxkeUE5SUdaMWJtTjBhVzl1SUNob1lXNWtiR1Z5S1NCN1hHNWNibHgwWEhSMGFHbHpMbk41Ym1NZ1BTQm1kVzVqZEdsdmJpQW9iR0Y1YjNWMFNXNW1ieWtnZTF4dVhIUmNkRngwZG1GeUlHbHpRMjlrWlhacFpYY2dQU0JvWVc1a2JHVnlMbWx1ZG05clpTZ25ZMjlrWlhacFpYY3VhWE5CWTNScGRtRjBaV1FuTENCc1lYbHZkWFJKYm1adktUdGNibHgwWEhSY2RHbG1JQ2hwYzBOdlpHVjJhV1YzSUNZbUlHRm5aVzUwTG1oaGMwTnZaR1ZOYVhKeWIzSXBJSHRjYmx4MFhIUmNkRngwYkdGNWIzVjBTVzVtYnk1amIyUmhZbXhsS0NrdVpHRjBZU2duWTIxRlpHbDBiM0luS1M1ellYWmxLQ2s3WEc1Y2RGeDBYSFI5WEc1Y2RGeDBmVHRjYmx4dVhIUmNkQzhxS2x4dVhIUmNkQ0FxSUVCd1lYSmhiU0I3VDJKcVpXTjBmU0JzWVhsdmRYUkpibVp2WEc1Y2RGeDBJQ29nUUhKbGRIVnliaUI3UW05dmJHVmhibjFjYmx4MFhIUWdLaTljYmx4MFhIUjBhR2x6TG1selFXTjBhWFpoZEdWa0lEMGdablZ1WTNScGIyNGdLR3hoZVc5MWRFbHVabThwSUh0Y2JseDBYSFJjZEhaaGNpQWtaV1JwZEc5eUlEMGdiR0Y1YjNWMFNXNW1ieTVsWkdsMGIzSW9LVHRjYmx4MFhIUmNkSEpsZEhWeWJpQWtaV1JwZEc5eUxtaGhjME5zWVhOektDZGpiMlJsZG1sbGR5Y3BPMXh1WEhSY2RIMDdYRzVjYmx4MFhIUXZLaXBjYmx4MFhIUWdLaUIwYjJkbmJHVWdZMjlrWlhacFpYZGNibHgwWEhRZ0tseHVYSFJjZENBcUlFQndZWEpoYlNCN1QySnFaV04wZlNCc1lYbHZkWFJKYm1adlhHNWNkRngwSUNvdlhHNWNkRngwZEdocGN5NTBiMmRuYkdVZ1BTQm1kVzVqZEdsdmJpQW9iR0Y1YjNWMFNXNW1ieWtnZTF4dVhIUmNkRngwYVdZZ0tIUm9hWE11YVhOQlkzUnBkbUYwWldRb2JHRjViM1YwU1c1bWJ5a3BJSHRjYmx4MFhIUmNkRngwZEdocGN5NWtaV0ZqZEdsMllYUmxLR3hoZVc5MWRFbHVabThwTzF4dVhIUmNkRngwZlNCbGJITmxJSHRjYmx4MFhIUmNkRngwZEdocGN5NWhZM1JwZG1GMFpTaHNZWGx2ZFhSSmJtWnZLVHRjYmx4MFhIUmNkSDFjYmx4MFhIUjlPMXh1WEc1Y2RGeDBMeW9xWEc1Y2RGeDBJQ29nWVdOMGFYWmhkR1VnWTI5a1pTQjJhV1YzWEc1Y2RGeDBJQ3BjYmx4MFhIUWdLaUJBY0dGeVlXMGdlMDlpYW1WamRIMGdiR0Y1YjNWMFNXNW1iMXh1WEhSY2RDQXFMMXh1WEhSY2RIUm9hWE11WVdOMGFYWmhkR1VnUFNCbWRXNWpkR2x2YmlBb2JHRjViM1YwU1c1bWJ5a2dlMXh1WEhSY2RGeDBkbUZ5SUNSbFpHbDBiM0lnUFNCc1lYbHZkWFJKYm1adkxtVmthWFJ2Y2lncExGeHVYSFJjZEZ4MFhIUWtkRzl2YkdKaGNpQTlJR3hoZVc5MWRFbHVabTh1ZEc5dmJHSmhjaWdwTEZ4dVhIUmNkRngwWEhRa1pXUnBkR0ZpYkdVZ1BTQnNZWGx2ZFhSSmJtWnZMbVZrYVhSaFlteGxLQ2tzWEc1Y2RGeDBYSFJjZENSamIyUmhZbXhsSUQwZ2JHRjViM1YwU1c1bWJ5NWpiMlJoWW14bEtDa3NYRzVjZEZ4MFhIUmNkQ1J3YjNCdmRtVnlJRDBnYkdGNWIzVjBTVzVtYnk1d2IzQnZkbVZ5S0Nrc1hHNWNkRngwWEhSY2RDUm9ZVzVrYkdVZ1BTQnNZWGx2ZFhSSmJtWnZMbWhoYm1Sc1pTZ3BPMXh1WEc1Y2RGeDBYSFIyWVhJZ2IzQjBhVzl1Y3lBOUlDUmxaR2wwYjNJdVpHRjBZU2duYjNCMGFXOXVjeWNwTzF4dVhHNWNkRngwWEhRa1kyOWtZV0pzWlM1MllXd29aRzl0TG1oMGJXd29KR1ZrYVhSaFlteGxMQ0J2Y0hScGIyNXpMbkJ5WlhSMGFXWjVTSFJ0YkNrcE8xeHVYRzRnSUNBZ0lDQWdJQ0FnSUNBdkx5QjFibU52YlcxbGJuUWdjMk55YVhCMElIUmhaM01nYzI4Z2RHaGxlU2R5WlNCamIzSnlaV04wSUdsdUlHTnZaR1VnZG1sbGQxeHVYSFJjZEZ4MEpHTnZaR0ZpYkdVdWRtRnNLQ1JqYjJSaFlteGxMblpoYkNncExuSmxjR3hoWTJVb0p6d2hMUzA4YzJOeWFYQjBKeXdnSnp4elkzSnBjSFFuS1NrN1hISmNibHgwWEhSY2RDUmpiMlJoWW14bExuWmhiQ2drWTI5a1lXSnNaUzUyWVd3b0tTNXlaWEJzWVdObEtDYzhMM05qY21sd2RENHRMVDRuTENBblBDOXpZM0pwY0hRK0p5a3BPMXh1WEc1Y2RGeDBYSFFrWTI5a1lXSnNaUzVvWldsbmFIUW9KR1ZrYVhSaFlteGxMbWhsYVdkb2RDZ3BLVHRjYmx4dVhIUmNkRngwYUdGdVpHeGxjaTVwYm5admEyVW9KM1J2YjJ4aVlYSXVkWEJrWVhSbFEyOWtaWFpwWlhjbkxDQWtkRzl2YkdKaGNpd2dkSEoxWlNrN1hHNWNkRngwWEhSb1lXNWtiR1Z5TG1sdWRtOXJaU2duY0c5d2IzWmxjaTVvYVdSbEp5d2dKSEJ2Y0c5MlpYSXBPMXh1WEhSY2RGeDBhR0Z1Wkd4bGNpNXBiblp2YTJVb0oyaGhibVJzWlM1b2FXUmxKeXdnSkdoaGJtUnNaU2s3WEc1Y2JseDBYSFJjZENSbFpHbDBiM0l1WVdSa1EyeGhjM01vSjJOdlpHVjJhV1YzSnlrN1hHNWNibHgwWEhSY2RDUmpiMlJoWW14bExtWnZZM1Z6S0NrN1hHNWNibHgwWEhSY2RDOHZJR0ZqZEdsMllYUmxJRU52WkdWTmFYSnliM0lnWVhNZ1kyOWtZV0pzWlZ4dVhIUmNkRngwYVdZZ0tHRm5aVzUwTG1oaGMwTnZaR1ZOYVhKeWIzSXBJSHRjYmx4MFhIUmNkRngwZG1GeUlHTnRSV1JwZEc5eUlEMGdRMjlrWlUxcGNuSnZjaTVtY205dFZHVjRkRUZ5WldFb0pHTnZaR0ZpYkdWYk1GMHNJRzl3ZEdsdmJuTXVZMjlrWlcxcGNuSnZjaWs3WEc1Y2JseDBYSFJjZEZ4MEx5OGdRMjlrWlUxcGNuSnZjaUJVWlhKdVUyVnlkbVZ5WEc1Y2RGeDBYSFJjZEdsbUlDaHZjSFJwYjI1ekxtTnZaR1Z0YVhKeWIzSXVkR1Z5YmlrZ2UxeHVYSFJjZEZ4MFhIUmNkSFpoY2lCelpYSjJaWElnUFNCdVpYY2dRMjlrWlUxcGNuSnZjaTVVWlhKdVUyVnlkbVZ5S0c5d2RHbHZibk11WTI5a1pXMXBjbkp2Y2k1MFpYSnVLVHRjYmx4MFhIUmNkRngwWEhSamJVVmthWFJ2Y2k1MFpYSnVVMlZ5ZG1WeUlEMGdjMlZ5ZG1WeU8xeHVYSFJjZEZ4MFhIUmNkR050UldScGRHOXlMbTl1S0NkamRYSnpiM0pCWTNScGRtbDBlU2NzSUdaMWJtTjBhVzl1SUNoamJTa2dlMXh1WEhSY2RGeDBYSFJjZEZ4MGMyVnlkbVZ5TG5Wd1pHRjBaVUZ5WjBocGJuUnpLR050S1R0Y2JseDBYSFJjZEZ4MFhIUjlLVHRjYmx4MFhIUmNkRngwZlZ4dVhHNWNkRngwWEhSY2RDOHZJRU52WkdWTmFYSnliM0lnYUdGemJpZDBJRkJoWkdScGJtY3VYRzVjZEZ4MFhIUmNkR050UldScGRHOXlMbk5sZEZOcGVtVW9iblZzYkN3Z0pHVmthWFJoWW14bExtOTFkR1Z5U0dWcFoyaDBLQ2twTzF4dVhIUmNkRngwWEhRa1kyOWtZV0pzWlM1a1lYUmhLQ2RqYlVWa2FYUnZjaWNzSUdOdFJXUnBkRzl5S1R0Y2JseDBYSFJjZEgxY2JseDBYSFI5TzF4dVhHNWNkRngwTHlvcVhHNWNkRngwSUNvZ1pHVmhZM1JwZG1GMFpTQmpiMlJsSUhacFpYZGNibHgwWEhRZ0tseHVYSFJjZENBcUlFQndZWEpoYlNCN1QySnFaV04wZlNCc1lYbHZkWFJKYm1adlhHNWNkRngwSUNvdlhHNWNkRngwZEdocGN5NWtaV0ZqZEdsMllYUmxJRDBnWm5WdVkzUnBiMjRnS0d4aGVXOTFkRWx1Wm04cElIdGNibHgwWEhSY2RIWmhjaUFrWldScGRHOXlJRDBnYkdGNWIzVjBTVzVtYnk1bFpHbDBiM0lvS1N4Y2JseDBYSFJjZEZ4MEpIUnZiMnhpWVhJZ1BTQnNZWGx2ZFhSSmJtWnZMblJ2YjJ4aVlYSW9LU3hjYmx4MFhIUmNkRngwSkdWa2FYUmhZbXhsSUQwZ2JHRjViM1YwU1c1bWJ5NWxaR2wwWVdKc1pTZ3BMRnh1WEhSY2RGeDBYSFFrWTI5a1lXSnNaU0E5SUd4aGVXOTFkRWx1Wm04dVkyOWtZV0pzWlNncE8xeHVYRzVjZEZ4MFhIUjJZWElnYjNCMGFXOXVjeUE5SUNSbFpHbDBiM0l1WkdGMFlTZ25iM0IwYVc5dWN5Y3BPMXh1WEc1Y2RGeDBYSFF2THlCa1pXRmpkR2wyWVhSbElFTnZaR1ZOYVhKeWIzSWdZWE1nWTI5a1lXSnNaVnh1WEhSY2RGeDBhV1lnS0dGblpXNTBMbWhoYzBOdlpHVk5hWEp5YjNJcElIdGNibHgwWEhSY2RGeDBkbUZ5SUdOdFJXUnBkRzl5SUQwZ0pHTnZaR0ZpYkdVdVpHRjBZU2duWTIxRlpHbDBiM0luS1R0Y2JseDBYSFJjZEZ4MEpHTnZaR0ZpYkdVdWRtRnNLR050UldScGRHOXlMbWRsZEZaaGJIVmxLQ2twTzF4dVhIUmNkRngwWEhSamJVVmthWFJ2Y2k1MGIxUmxlSFJCY21WaEtDazdYRzVjZEZ4MFhIUjlYRzVjYmx4MFhIUmNkQ1JsWkdsMFlXSnNaUzVvZEcxc0tHUnZiUzUyWVd4MVpTZ2tZMjlrWVdKc1pTd2diM0IwYVc5dWN5NXdjbVYwZEdsbWVVaDBiV3dwSUh4OElHUnZiUzVsYlhCMGVWQmhjbUVwTzF4dVhHNWNkRngwSUNBZ0lDOHZJSEpsY0d4aFkyVWdjMk55YVhCMElIUmhaM01nYzI4Z2RHaGxlU2R5WlNCdWIzUWdaWGhsWTNWMFpXUWdkMmhsYmlCc2IyRmtaV1FnYVc0Z1lXUnRhVzVjYmx4MFhIUmNkSFpoY2lCamIyUmxWRzlTWlhCc1lXTmxJRDBnSkdWa2FYUmhZbXhsTG1oMGJXd29LVHRjY2x4dVhISmNibHgwWEhSY2RHTnZaR1ZVYjFKbGNHeGhZMlVnUFNCamIyUmxWRzlTWlhCc1lXTmxMbkpsY0d4aFkyVW9Kenh6WTNKcGNIUW5MQ0FuUENFdExUeHpZM0pwY0hRbktUdGNjbHh1WEhSY2RGeDBZMjlrWlZSdlVtVndiR0ZqWlNBOUlHTnZaR1ZVYjFKbGNHeGhZMlV1Y21Wd2JHRmpaU2duUEM5elkzSnBjSFErSnl3Z0p6d3ZjMk55YVhCMFBpMHRQaWNwTzF4eVhHNWNjbHh1WEhSY2RGeDBKR1ZrYVhSaFlteGxMbWgwYld3b1kyOWtaVlJ2VW1Wd2JHRmpaU2s3WEc1Y2JseDBYSFJjZENSbFpHbDBZV0pzWlM1b1pXbG5hSFFvYjNCMGFXOXVjeTVvWldsbmFIUWdQeUFrWTI5a1lXSnNaUzVvWldsbmFIUW9LU0E2SUNkaGRYUnZKeWs3WEc1Y2RGeDBYSFFrWldScGRHOXlMbkpsYlc5MlpVTnNZWE56S0NkamIyUmxkbWxsZHljcE8xeHVYRzVjZEZ4MFhIUWtaV1JwZEdGaWJHVXVabTlqZFhNb0tUdGNibHh1WEhSY2RGeDBhR0Z1Wkd4bGNpNXBiblp2YTJVb0ozUnZiMnhpWVhJdWRYQmtZWFJsUTI5a1pYWnBaWGNuTENBa2RHOXZiR0poY2l3Z1ptRnNjMlVwTzF4dVhHNGdJQ0FnSUNBZ0lDQWdJQ0IzYVc1a2IzY3VjM1J2Y0NncE8xeHVYSFJjZEgwN1hHNWNkSDA3WEc1Y2JseDBkbUZ5SUVSeVlXZEJibVJFY205d0lEMGdablZ1WTNScGIyNGdLR2hoYm1Sc1pYSXBJSHRjYmx4MFhIUjJZWElnSkdSdlkzVnRaVzUwSUQwZ0pDaGtiMk4xYldWdWRDazdYRzVjYmx4MFhIUXZLaXBjYmx4MFhIUWdLaUJoZEhSaFkyZ2dSSEpoWnlCaGJtUWdSSEp2Y0NCRmRtVnVkSE5jYmx4MFhIUWdLbHh1WEhSY2RDQXFJRUJ3WVhKaGJTQjdUMkpxWldOMGZTQnNZWGx2ZFhSSmJtWnZJQzBnYkdGNWIzVjBJRWx1Wm05eWJXRjBhVzl1YzF4dVhIUmNkQ0FxSUVCd1lYSmhiU0I3VDJKcVpXTjBmU0J2Y0hScGIyNXpYRzVjZEZ4MElDb3ZYRzVjZEZ4MGRHaHBjeTVoZEhSaFkyZ2dQU0JtZFc1amRHbHZiaUFvYkdGNWIzVjBTVzVtYnl3Z2IzQjBhVzl1Y3lrZ2UxeHVYSFJjZEZ4MGFXWWdLRzl3ZEdsdmJuTXVZV2x5VFc5a1pTQjhmQ0J2Y0hScGIyNXpMbVJwYzJGaWJHVkVjbUZuUVc1a1JISnZjQ2tnZTF4dVhIUmNkRngwWEhRdkx5QndjbVYyWlc1MElHUmxabUYxYkhRZ1pISnZjQ0JsZG1WdWRGeHVYSFJjZEZ4MFhIUWtaRzlqZFcxbGJuUXViMjRvSjJSeWIzQW5MQ0JtZFc1amRHbHZiaUFvWlNrZ2UxeHVYSFJjZEZ4MFhIUmNkR1V1Y0hKbGRtVnVkRVJsWm1GMWJIUW9LVHRjYmx4MFhIUmNkRngwZlNrN1hHNWNkRngwWEhSOUlHVnNjMlVnZTF4dVhIUmNkRngwWEhSMGFHbHpMbUYwZEdGamFFUnlZV2RCYm1SRWNtOXdSWFpsYm5Rb2JHRjViM1YwU1c1bWJ5d2diM0IwYVc5dWN5azdYRzVjZEZ4MFhIUjlYRzVjZEZ4MGZUdGNibHh1WEhSY2RDOHFLbHh1WEhSY2RDQXFJR0YwZEdGamFDQkVjbUZuSUdGdVpDQkVjbTl3SUVWMlpXNTBjMXh1WEhSY2RDQXFYRzVjZEZ4MElDb2dRSEJoY21GdElIdFBZbXBsWTNSOUlHeGhlVzkxZEVsdVptOGdMU0JzWVhsdmRYUWdTVzVtYjNKdFlYUnBiMjV6WEc1Y2RGeDBJQ29nUUhCaGNtRnRJSHRQWW1wbFkzUjlJRzl3ZEdsdmJuTmNibHgwWEhRZ0tpOWNibHgwWEhSMGFHbHpMbUYwZEdGamFFUnlZV2RCYm1SRWNtOXdSWFpsYm5RZ1BTQm1kVzVqZEdsdmJpQW9iR0Y1YjNWMFNXNW1ieXdnYjNCMGFXOXVjeWtnZTF4dVhIUmNkRngwZG1GeUlHTnZiR3hsWTNScGIyNGdQU0FrS0Nrc1hHNWNkRngwWEhSY2RDUmxaR2wwYjNJZ1BTQnNZWGx2ZFhSSmJtWnZMbVZrYVhSdmNpZ3BMRnh1WEhSY2RGeDBYSFFrWkhKdmNIcHZibVVnUFNCc1lYbHZkWFJKYm1adkxtUnliM0I2YjI1bEtDa3NYRzVjZEZ4MFhIUmNkQ1JrY205d2VtOXVaVTFsYzNOaFoyVWdQU0FrWkhKdmNIcHZibVV1Wm1sdVpDZ25MbTV2ZEdVdFpISnZjSHB2Ym1VdGJXVnpjMkZuWlNjcE8xeHVYRzVjZEZ4MFhIUXZMeUJ6YUc5M0lHUnliM0I2YjI1bElHOXVJR1J5WVdkbGJuUmxjaUIzYUdWdUlHUnlZV2RuYVc1bklHRWdiMkpxWldOMElIUnZJR1J2WTNWdFpXNTBYRzVjZEZ4MFhIUXZMeUF0WW5WMElHOXViSGtnYVdZZ2RHaGxJR1ZrYVhSdmNpQnBjeUIyYVhOcFlteGxMQ0JwTG1VdUlHaGhjeUJoSUhCdmMybDBhWFpsSUhkcFpIUm9JR0Z1WkNCb1pXbG5hSFJjYmx4MFhIUmNkQ1JrYjJOMWJXVnVkQzV2YmlnblpISmhaMlZ1ZEdWeUp5d2dablZ1WTNScGIyNGdLR1VwSUh0Y2JseDBYSFJjZEZ4MGRtRnlJR2x6UTI5a1pYWnBaWGNnUFNCb1lXNWtiR1Z5TG1sdWRtOXJaU2duWTI5a1pYWnBaWGN1YVhOQlkzUnBkbUYwWldRbkxDQnNZWGx2ZFhSSmJtWnZLVHRjYmx4MFhIUmNkRngwZG1GeUlHaGhjMFZrYVhSdmNsTnBlbVVnUFNBa1pXUnBkRzl5TG5kcFpIUm9LQ2tnUGlBd0lDWW1JQ1JsWkdsMGIzSXVhR1ZwWjJoMEtDa2dQaUF3TzF4dVhIUmNkRngwWEhScFppQW9JV2x6UTI5a1pYWnBaWGNnSmlZZ0lXTnZiR3hsWTNScGIyNHViR1Z1WjNSb0lDWW1JR2hoYzBWa2FYUnZjbE5wZW1VcElIdGNibHgwWEhSY2RGeDBYSFFrWldScGRHOXlMbUZrWkVOc1lYTnpLQ2RrY21GbmIzWmxjaWNwTzF4dVhIUmNkRngwWEhSY2RDUmtjbTl3ZW05dVpTNTNhV1IwYUNna1pXUnBkRzl5TG5kcFpIUm9LQ2twTzF4dVhIUmNkRngwWEhSY2RDUmtjbTl3ZW05dVpTNW9aV2xuYUhRb0pHVmthWFJ2Y2k1b1pXbG5hSFFvS1NrN1hHNWNkRngwWEhSY2RGeDBKR1J5YjNCNmIyNWxUV1Z6YzJGblpTNTBaWGgwS0c5d2RHbHZibk11YkdGdVowbHVabTh1YVcxaFoyVXVaSEpoWjBsdFlXZGxTR1Z5WlNrN1hHNWNkRngwWEhSY2RIMWNibHgwWEhSY2RGeDBZMjlzYkdWamRHbHZiaUE5SUdOdmJHeGxZM1JwYjI0dVlXUmtLR1V1ZEdGeVoyVjBLVHRjYmx4MFhIUmNkSDBwTG05dUtDZGtjbUZuYkdWaGRtVW5MQ0JtZFc1amRHbHZiaUFvWlNrZ2UxeHVYSFJjZEZ4MFhIUmpiMnhzWldOMGFXOXVJRDBnWTI5c2JHVmpkR2x2Ymk1dWIzUW9aUzUwWVhKblpYUXBPMXh1WEhSY2RGeDBYSFJwWmlBb0lXTnZiR3hsWTNScGIyNHViR1Z1WjNSb0tTQjdYRzVjZEZ4MFhIUmNkRngwSkdWa2FYUnZjaTV5WlcxdmRtVkRiR0Z6Y3lnblpISmhaMjkyWlhJbktUdGNibHgwWEhSY2RGeDBmVnh1WEhSY2RGeDBmU2t1YjI0b0oyUnliM0FuTENCbWRXNWpkR2x2YmlBb0tTQjdYRzVjZEZ4MFhIUmNkR052Ykd4bFkzUnBiMjRnUFNBa0tDazdYRzVjZEZ4MFhIUmNkQ1JsWkdsMGIzSXVjbVZ0YjNabFEyeGhjM01vSjJSeVlXZHZkbVZ5SnlrN1hHNWNkRngwWEhSOUtUdGNibHh1WEhSY2RGeDBMeThnWTJoaGJtZGxJR1J5YjNCNmIyNWxKM01nYldWemMyRm5aU0J2YmlCb2IzWmxjaTVjYmx4MFhIUmNkQ1JrY205d2VtOXVaUzV2YmlnblpISmhaMlZ1ZEdWeUp5d2dablZ1WTNScGIyNGdLQ2tnZTF4dVhIUmNkRngwWEhRa1pISnZjSHB2Ym1VdVlXUmtRMnhoYzNNb0oyaHZkbVZ5SnlrN1hHNWNkRngwWEhSY2RDUmtjbTl3ZW05dVpVMWxjM05oWjJVdWRHVjRkQ2h2Y0hScGIyNXpMbXhoYm1kSmJtWnZMbWx0WVdkbExtUnliM0JKYldGblpTazdYRzVjZEZ4MFhIUjlLUzV2YmlnblpISmhaMnhsWVhabEp5d2dablZ1WTNScGIyNGdLQ2tnZTF4dVhIUmNkRngwWEhRa1pISnZjSHB2Ym1VdWNtVnRiM1psUTJ4aGMzTW9KMmh2ZG1WeUp5azdYRzVjZEZ4MFhIUmNkQ1JrY205d2VtOXVaVTFsYzNOaFoyVXVkR1Y0ZENodmNIUnBiMjV6TG14aGJtZEpibVp2TG1sdFlXZGxMbVJ5WVdkSmJXRm5aVWhsY21VcE8xeHVYSFJjZEZ4MGZTazdYRzVjYmx4MFhIUmNkQzh2SUdGMGRHRmphQ0JrY205d1NXMWhaMlZjYmx4MFhIUmNkQ1JrY205d2VtOXVaUzV2YmlnblpISnZjQ2NzSUdaMWJtTjBhVzl1SUNobGRtVnVkQ2tnZTF4dVhIUmNkRngwWEhSbGRtVnVkQzV3Y21WMlpXNTBSR1ZtWVhWc2RDZ3BPMXh1WEc1Y2RGeDBYSFJjZEhaaGNpQmtZWFJoVkhKaGJuTm1aWElnUFNCbGRtVnVkQzV2Y21sbmFXNWhiRVYyWlc1MExtUmhkR0ZVY21GdWMyWmxjanRjYmx4MFhIUmNkRngwZG1GeUlHaDBiV3dnUFNCa1lYUmhWSEpoYm5ObVpYSXVaMlYwUkdGMFlTZ25kR1Y0ZEM5b2RHMXNKeWs3WEc1Y2RGeDBYSFJjZEhaaGNpQjBaWGgwSUQwZ1pHRjBZVlJ5WVc1elptVnlMbWRsZEVSaGRHRW9KM1JsZUhRdmNHeGhhVzRuS1R0Y2JseHVYSFJjZEZ4MFhIUjJZWElnYkdGNWIzVjBTVzVtYnlBOUlHUnZiUzV0WVd0bFRHRjViM1YwU1c1bWJ5aGxkbVZ1ZEM1amRYSnlaVzUwVkdGeVoyVjBJSHg4SUdWMlpXNTBMblJoY21kbGRDazdYRzVjYmx4MFhIUmNkRngwYVdZZ0tHUmhkR0ZVY21GdWMyWmxjaUFtSmlCa1lYUmhWSEpoYm5ObVpYSXVabWxzWlhNZ0ppWWdaR0YwWVZSeVlXNXpabVZ5TG1acGJHVnpMbXhsYm1kMGFDa2dlMXh1WEhSY2RGeDBYSFJjZEd4aGVXOTFkRWx1Wm04dVpXUnBkR0ZpYkdVb0tTNW1iMk4xY3lncE8xeHVYSFJjZEZ4MFhIUmNkR2hoYm1Sc1pYSXVhVzV6WlhKMFNXMWhaMlZ6S0d4aGVXOTFkRWx1Wm04c0lHUmhkR0ZVY21GdWMyWmxjaTVtYVd4bGN5azdYRzVjZEZ4MFhIUmNkSDBnWld4elpTQnBaaUFvYUhSdGJDa2dlMXh1WEhSY2RGeDBYSFJjZENRb2FIUnRiQ2t1WldGamFDaG1kVzVqZEdsdmJpQW9LU0I3WEc1Y2RGeDBYSFJjZEZ4MFhIUnNZWGx2ZFhSSmJtWnZMbVZrYVhSaFlteGxLQ2t1Wm05amRYTW9LVHRjYmx4MFhIUmNkRngwWEhSY2RHaGhibVJzWlhJdWFXNTJiMnRsS0NkbFpHbDBiM0l1YVc1elpYSjBUbTlrWlNjc0lHeGhlVzkxZEVsdVptOHVaV1JwZEdGaWJHVW9LU3dnZEdocGN5azdYRzVjZEZ4MFhIUmNkRngwZlNrN1hHNWNkRngwWEhSY2RIMGdaV3h6WlNCcFppQW9kR1Y0ZENrZ2UxeHVYSFJjZEZ4MFhIUmNkR3hoZVc5MWRFbHVabTh1WldScGRHRmliR1VvS1M1bWIyTjFjeWdwTzF4dVhIUmNkRngwWEhSY2RHaGhibVJzWlhJdWFXNTJiMnRsS0NkbFpHbDBiM0l1YVc1elpYSjBWR1Y0ZENjc0lHeGhlVzkxZEVsdVptOHVaV1JwZEdGaWJHVW9LU3dnZEdWNGRDazdYRzVjZEZ4MFhIUmNkSDFjYmx4MFhIUmNkSDBwTG05dUtDZGtjbUZuYjNabGNpY3NJR1poYkhObEtUc2dMeThnY0hKbGRtVnVkQ0JrWldaaGRXeDBJR1J5WVdkdmRtVnlJR1YyWlc1MFhHNWNkRngwZlR0Y2JseDBmVHRjYmx4dVhIUjJZWElnUTJ4cGNHSnZZWEprSUQwZ1puVnVZM1JwYjI0Z0tHaGhibVJzWlhJcElIdGNibHh1WEhSY2RIUm9hWE11WVhSMFlXTm9JRDBnWm5WdVkzUnBiMjRnS0d4aGVXOTFkRWx1Wm04cElIdGNibHgwWEhSY2RHeGhlVzkxZEVsdVptOHVaV1JwZEdGaWJHVW9LUzV2YmlnbmNHRnpkR1VuTENCb1VHRnpkR1ZEYkdsd1ltOWhjbVJKYldGblpTazdYRzVjZEZ4MGZUdGNibHh1WEhSY2RDOHFLbHh1WEhSY2RDQXFJSEJoYzNSbElHTnNhWEJpYjJGeVpDQnBiV0ZuWlZ4dVhIUmNkQ0FxWEc1Y2RGeDBJQ29nUUhCaGNtRnRJSHRGZG1WdWRIMGdaWFpsYm5SY2JseDBYSFFnS2k5Y2JseDBYSFIyWVhJZ2FGQmhjM1JsUTJ4cGNHSnZZWEprU1cxaFoyVWdQU0JtZFc1amRHbHZiaUFvWlhabGJuUXBJSHRjYmx4MFhIUmNkSFpoY2lCamJHbHdZbTloY21SRVlYUmhJRDBnWlhabGJuUXViM0pwWjJsdVlXeEZkbVZ1ZEM1amJHbHdZbTloY21SRVlYUmhPMXh1WEhSY2RGeDBkbUZ5SUd4aGVXOTFkRWx1Wm04Z1BTQmtiMjB1YldGclpVeGhlVzkxZEVsdVptOG9aWFpsYm5RdVkzVnljbVZ1ZEZSaGNtZGxkQ0I4ZkNCbGRtVnVkQzUwWVhKblpYUXBPMXh1WEhSY2RGeDBkbUZ5SUNSbFpHbDBZV0pzWlNBOUlHeGhlVzkxZEVsdVptOHVaV1JwZEdGaWJHVW9LVHRjYmx4dVhIUmNkRngwYVdZZ0tDRmpiR2x3WW05aGNtUkVZWFJoSUh4OElDRmpiR2x3WW05aGNtUkVZWFJoTG1sMFpXMXpJSHg4SUNGamJHbHdZbTloY21SRVlYUmhMbWwwWlcxekxteGxibWQwYUNrZ2UxeHVYSFJjZEZ4MFhIUjJZWElnWTJGc2JHSmhZMnR6SUQwZ0pHVmthWFJoWW14bExtUmhkR0VvSjJOaGJHeGlZV05yY3ljcE8xeHVYSFJjZEZ4MFhIUXZMeUJ2Ym14NUlHTmhiaUJ5ZFc0Z2FXWWdhWFFnYUdGeklHOXVTVzFoWjJWVmNHeHZZV1FnYldWMGFHOWtYRzVjZEZ4MFhIUmNkR2xtSUNnaFkyRnNiR0poWTJ0ekxtOXVTVzFoWjJWVmNHeHZZV1FwSUh0Y2JseDBYSFJjZEZ4MFhIUnlaWFIxY200N1hHNWNkRngwWEhSY2RIMWNibHh1WEhSY2RGeDBYSFF2THlCellYWmxJR04xY25OdmNseHVYSFJjZEZ4MFhIUm9ZVzVrYkdWeUxtbHVkbTlyWlNnblpXUnBkRzl5TG5OaGRtVk9iMlJsSnl3Z0pHVmthWFJoWW14bEtUdGNibHgwWEhSY2RGeDBhR0Z1Wkd4bGNpNXBiblp2YTJVb0oyVmthWFJ2Y2k1ellYWmxVbUZ1WjJVbkxDQWtaV1JwZEdGaWJHVXBPMXh1WEc1Y2RGeDBYSFJjZENSbFpHbDBZV0pzWlM1b2RHMXNLQ2NuS1R0Y2JseHVYSFJjZEZ4MFhIUnpaWFJVYVcxbGIzVjBLR1oxYm1OMGFXOXVJQ2dwSUh0Y2JseDBYSFJjZEZ4MFhIUjJZWElnSkdsdFp5QTlJQ1JsWkdsMFlXSnNaUzVtYVc1a0tDZHBiV2NuS1R0Y2JseHVYSFJjZEZ4MFhIUmNkQzh2SUdsbUlHbHRaeUJwY3lCdWJ5QnBiaUJqYkdsd1ltOWhjbVFzSUdsdWMyVnlkQ0IwWlhoMElHOXlJR1J2YlZ4dVhIUmNkRngwWEhSY2RHbG1JQ2doSkdsdFp5NXNaVzVuZEdnZ2ZId2dKR2x0WjFzd1hTNXpjbU11YVc1a1pYaFBaaWduWkdGMFlUb25LU0E5UFQwZ0xURXBJSHRjYmx4MFhIUmNkRngwWEhSY2RIWmhjaUJvZEcxc0lEMGdKR1ZrYVhSaFlteGxMbWgwYld3b0tUdGNibHh1WEhSY2RGeDBYSFJjZEZ4MGFHRnVaR3hsY2k1cGJuWnZhMlVvSjJWa2FYUnZjaTV5WlhOMGIzSmxUbTlrWlNjc0lDUmxaR2wwWVdKc1pTazdYRzVjZEZ4MFhIUmNkRngwWEhSb1lXNWtiR1Z5TG1sdWRtOXJaU2duWldScGRHOXlMbkpsYzNSdmNtVlNZVzVuWlNjc0lDUmxaR2wwWVdKc1pTazdYRzVjYmx4MFhIUmNkRngwWEhSY2RIUnllU0I3WEc1Y2RGeDBYSFJjZEZ4MFhIUmNkQzh2SUdsdWMyVnlkQ0J1YjNKdFlXd2daRzl0SUdOdlpHVmNibHgwWEhSY2RGeDBYSFJjZEZ4MEpDaG9kRzFzS1M1bFlXTm9LR1oxYm1OMGFXOXVJQ2dwSUh0Y2JseDBYSFJjZEZ4MFhIUmNkRngwWEhRa1pXUnBkR0ZpYkdVdVptOWpkWE1vS1R0Y2JseDBYSFJjZEZ4MFhIUmNkRngwWEhSb1lXNWtiR1Z5TG1sdWRtOXJaU2duWldScGRHOXlMbWx1YzJWeWRFNXZaR1VuTENBa1pXUnBkR0ZpYkdVc0lIUm9hWE1wTzF4dVhIUmNkRngwWEhSY2RGeDBYSFI5S1R0Y2JseDBYSFJjZEZ4MFhIUmNkSDBnWTJGMFkyZ2dLR1Y0S1NCN1hHNWNkRngwWEhSY2RGeDBYSFJjZEM4dklHbHVjMlZ5ZENCMFpYaDBYRzVjZEZ4MFhIUmNkRngwWEhSY2RDUmxaR2wwWVdKc1pTNW1iMk4xY3lncE8xeHVYSFJjZEZ4MFhIUmNkRngwWEhSb1lXNWtiR1Z5TG1sdWRtOXJaU2duWldScGRHOXlMbWx1YzJWeWRGUmxlSFFuTENBa1pXUnBkR0ZpYkdVc0lHaDBiV3dwTzF4dVhIUmNkRngwWEhSY2RGeDBmVnh1WEhSY2RGeDBYSFJjZEZ4MGNtVjBkWEp1TzF4dVhIUmNkRngwWEhSY2RIMWNibHh1WEhSY2RGeDBYSFJjZEhaaGNpQmtZWFJoZFhKcElEMGdKR2x0WjFzd1hTNXpjbU03WEc1Y2JseDBYSFJjZEZ4MFhIUjJZWElnWkdGMFlTQTlJR0YwYjJJb1pHRjBZWFZ5YVM1emNHeHBkQ2duTENjcFd6RmRLVHRjYmx4MFhIUmNkRngwWEhSMllYSWdZWEp5WVhrZ1BTQnVaWGNnVldsdWREaEJjbkpoZVNoa1lYUmhMbXhsYm1kMGFDazdYRzVjZEZ4MFhIUmNkRngwWm05eUlDaDJZWElnYVNBOUlEQTdJR2tnUENCa1lYUmhMbXhsYm1kMGFEc2dhU3NyS1NCN1hHNWNkRngwWEhSY2RGeDBYSFJoY25KaGVWdHBYU0E5SUdSaGRHRXVZMmhoY2tOdlpHVkJkQ2hwS1R0Y2JseDBYSFJjZEZ4MFhIUjlYRzVjYmx4MFhIUmNkRngwWEhSMllYSWdZbXh2WWlBOUlHNWxkeUJDYkc5aUtGdGhjbkpoZVYwc0lIc2dkSGx3WlRvZ0oybHRZV2RsTDNCdVp5Y2dmU2s3WEc1Y2RGeDBYSFJjZEZ4MFlteHZZaTV1WVcxbElEMGdKMk5zYVhCaWIyRnlaQzV3Ym1jbk8xeHVYRzVjZEZ4MFhIUmNkRngwYUdGdVpHeGxjaTVwYm5admEyVW9KMlZrYVhSdmNpNXlaWE4wYjNKbFRtOWtaU2NzSUNSbFpHbDBZV0pzWlNrN1hHNWNkRngwWEhSY2RGeDBhR0Z1Wkd4bGNpNXBiblp2YTJVb0oyVmthWFJ2Y2k1eVpYTjBiM0psVW1GdVoyVW5MQ0FrWldScGRHRmliR1VwTzF4dVhIUmNkRngwWEhSY2RHaGhibVJzWlhJdWFXNXpaWEowU1cxaFoyVnpLR3hoZVc5MWRFbHVabThzSUZ0aWJHOWlYU2s3WEc1Y2JseDBYSFJjZEZ4MFhIUm9ZVzVrYkdWeUxtbHVkbTlyWlNnblpXUnBkRzl5TG1GbWRHVnlRMjl0YldGdVpDY3NJQ1JsWkdsMFlXSnNaU2s3WEc1Y2RGeDBYSFJjZEgwc0lEQXBPMXh1WEc1Y2RGeDBYSFJjZEhKbGRIVnlianRjYmx4MFhIUmNkSDFjYmx4dVhIUmNkRngwZG1GeUlHbDBaVzBnUFNCc2FYTjBMbWhsWVdRb1kyeHBjR0p2WVhKa1JHRjBZUzVwZEdWdGN5azdYRzVjZEZ4MFhIUjJZWElnYVhORGJHbHdZbTloY21SSmJXRm5aU0E5SUdsMFpXMHVhMmx1WkNBOVBUMGdKMlpwYkdVbklDWW1JR2wwWlcwdWRIbHdaUzVwYm1SbGVFOW1LQ2RwYldGblpTOG5LU0FoUFQwZ0xURTdYRzVjYmx4MFhIUmNkR2xtSUNocGMwTnNhWEJpYjJGeVpFbHRZV2RsS1NCN1hHNWNkRngwWEhSY2RHaGhibVJzWlhJdWFXNXpaWEowU1cxaFoyVnpLR3hoZVc5MWRFbHVabThzSUZ0cGRHVnRMbWRsZEVGelJtbHNaU2dwWFNrN1hHNWNkRngwWEhSOVhHNWNibHgwWEhSY2RHaGhibVJzWlhJdWFXNTJiMnRsS0NkbFpHbDBiM0l1WVdaMFpYSkRiMjF0WVc1a0p5d2dKR1ZrYVhSaFlteGxLVHRjYmx4MFhIUjlPMXh1WEhSOU8xeHVYRzVjZEhaaGNpQk1hVzVyUkdsaGJHOW5JRDBnWm5WdVkzUnBiMjRnS0doaGJtUnNaWElwSUh0Y2JseHVYSFJjZEM4cUtseHVYSFJjZENBcUlIUnZaMmRzWlNCaWRYUjBiMjRnYzNSaGRIVnpYRzVjZEZ4MElDcGNibHgwWEhRZ0tpQkFjSEpwZG1GMFpWeHVYSFJjZENBcUlFQndZWEpoYlNCN2FsRjFaWEo1ZlNBa1luUnVYRzVjZEZ4MElDb2dRSEJoY21GdElIdENiMjlzWldGdWZTQnBjMFZ1WVdKc1pWeHVYSFJjZENBcUwxeHVYSFJjZEhaaGNpQjBiMmRuYkdWQ2RHNGdQU0JtZFc1amRHbHZiaUFvSkdKMGJpd2dhWE5GYm1GaWJHVXBJSHRjYmx4MFhIUmNkQ1JpZEc0dWRHOW5aMnhsUTJ4aGMzTW9KMlJwYzJGaWJHVmtKeXdnSVdselJXNWhZbXhsS1R0Y2JseDBYSFJjZENSaWRHNHVZWFIwY2lnblpHbHpZV0pzWldRbkxDQWhhWE5GYm1GaWJHVXBPMXh1WEhSY2RIMDdYRzVjYmx4MFhIUXZLaXBjYmx4MFhIUWdLaUJUYUc5M0lHeHBibXNnWkdsaGJHOW5JR0Z1WkNCelpYUWdaWFpsYm5RZ2FHRnVaR3hsY25NZ2IyNGdaR2xoYkc5bklHTnZiblJ5YjJ4ekxseHVYSFJjZENBcVhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0cVVYVmxjbmw5SUNSbFpHbDBZV0pzWlZ4dVhIUmNkQ0FxSUVCd1lYSmhiU0I3YWxGMVpYSjVmU0FrWkdsaGJHOW5YRzVjZEZ4MElDb2dRSEJoY21GdElIdFBZbXBsWTNSOUlHeHBibXRKYm1adlhHNWNkRngwSUNvZ1FISmxkSFZ5YmlCN1VISnZiV2x6WlgxY2JseDBYSFFnS2k5Y2JseDBYSFIwYUdsekxuTm9iM2RNYVc1clJHbGhiRzluSUQwZ1puVnVZM1JwYjI0Z0tDUmxaR2wwWVdKc1pTd2dKR1JwWVd4dlp5d2diR2x1YTBsdVptOHBJSHRjYmx4MFhIUmNkSEpsZEhWeWJpQWtMa1JsWm1WeWNtVmtLR1oxYm1OMGFXOXVJQ2hrWldabGNuSmxaQ2tnZTF4dVhIUmNkRngwWEhSMllYSWdKR3hwYm10RWFXRnNiMmNnUFNBa1pHbGhiRzluTG1acGJtUW9KeTV1YjNSbExXeHBibXN0WkdsaGJHOW5KeWs3WEc1Y2JseDBYSFJjZEZ4MGRtRnlJQ1JzYVc1clZHVjRkQ0E5SUNSc2FXNXJSR2xoYkc5bkxtWnBibVFvSnk1dWIzUmxMV3hwYm1zdGRHVjRkQ2NwTEZ4dVhIUmNkRngwWEhRa2JHbHVhMVZ5YkNBOUlDUnNhVzVyUkdsaGJHOW5MbVpwYm1Rb0p5NXViM1JsTFd4cGJtc3RkWEpzSnlrc1hHNWNkRngwWEhSY2RDUnNhVzVyUW5SdUlEMGdKR3hwYm10RWFXRnNiMmN1Wm1sdVpDZ25MbTV2ZEdVdGJHbHVheTFpZEc0bktTeGNibHgwWEhSY2RGeDBKRzl3Wlc1SmJrNWxkMWRwYm1SdmR5QTlJQ1JzYVc1clJHbGhiRzluTG1acGJtUW9KMmx1Y0hWMFczUjVjR1U5WTJobFkydGliM2hkSnlrN1hHNWNibHgwWEhSY2RGeDBKR3hwYm10RWFXRnNiMmN1YjI1bEtDZHphRzkzYmk1aWN5NXRiMlJoYkNjc0lHWjFibU4wYVc5dUlDZ3BJSHRjYmx4MFhIUmNkRngwWEhRa2JHbHVhMVJsZUhRdWRtRnNLR3hwYm10SmJtWnZMblJsZUhRcE8xeHVYRzVjZEZ4MFhIUmNkRngwSkd4cGJtdFVaWGgwTG05dUtDZHBibkIxZENjc0lHWjFibU4wYVc5dUlDZ3BJSHRjYmx4MFhIUmNkRngwWEhSY2RDOHZJR2xtSUd4cGJtdDBaWGgwSUhkaGN5QnRiMlJwWm1sbFpDQmllU0JyWlhsMWNDeGNibHgwWEhSY2RGeDBYSFJjZEM4dklITjBiM0FnWTJ4dmJtbHVaeUIwWlhoMElHWnliMjBnYkdsdWExVnliRnh1WEhSY2RGeDBYSFJjZEZ4MGJHbHVhMGx1Wm04dWRHVjRkQ0E5SUNSc2FXNXJWR1Y0ZEM1MllXd29LVHRjYmx4MFhIUmNkRngwWEhSOUtUdGNibHh1WEhSY2RGeDBYSFJjZEM4dklHbG1JRzV2SUhWeWJDQjNZWE1nWjJsMlpXNHNJR052Y0hrZ2RHVjRkQ0IwYnlCMWNteGNibHgwWEhSY2RGeDBYSFJwWmlBb0lXeHBibXRKYm1adkxuVnliQ2tnZTF4dVhIUmNkRngwWEhSY2RGeDBiR2x1YTBsdVptOHVkWEpzSUQwZ2JHbHVhMGx1Wm04dWRHVjRkRHRjYmx4MFhIUmNkRngwWEhSY2RIUnZaMmRzWlVKMGJpZ2tiR2x1YTBKMGJpd2diR2x1YTBsdVptOHVkR1Y0ZENrN1hHNWNkRngwWEhSY2RGeDBmVnh1WEc1Y2RGeDBYSFJjZEZ4MEpHeHBibXRWY213dWIyNG9KMmx1Y0hWMEp5d2dablZ1WTNScGIyNGdLQ2tnZTF4dVhIUmNkRngwWEhSY2RGeDBkRzluWjJ4bFFuUnVLQ1JzYVc1clFuUnVMQ0FrYkdsdWExVnliQzUyWVd3b0tTazdYRzVjZEZ4MFhIUmNkRngwWEhRdkx5QmthWE53YkdGNUlITmhiV1VnYkdsdWF5QnZiaUJnVkdWNGRDQjBieUJrYVhOd2JHRjVZQ0JwYm5CMWRGeHVYSFJjZEZ4MFhIUmNkRngwTHk4Z2QyaGxiaUJqY21WaGRHVWdZU0J1WlhjZ2JHbHVhMXh1WEhSY2RGeDBYSFJjZEZ4MGFXWWdLQ0ZzYVc1clNXNW1ieTUwWlhoMEtTQjdYRzVjZEZ4MFhIUmNkRngwWEhSY2RDUnNhVzVyVkdWNGRDNTJZV3dvSkd4cGJtdFZjbXd1ZG1Gc0tDa3BPMXh1WEhSY2RGeDBYSFJjZEZ4MGZWeHVYSFJjZEZ4MFhIUmNkSDBwTG5aaGJDaHNhVzVyU1c1bWJ5NTFjbXdwTG5SeWFXZG5aWElvSjJadlkzVnpKeWt1ZEhKcFoyZGxjaWduYzJWc1pXTjBKeWs3WEc1Y2JseDBYSFJjZEZ4MFhIUWtiM0JsYmtsdVRtVjNWMmx1Wkc5M0xuQnliM0FvSjJOb1pXTnJaV1FuTENCc2FXNXJTVzVtYnk1dVpYZFhhVzVrYjNjcE8xeHVYRzVjZEZ4MFhIUmNkRngwSkd4cGJtdENkRzR1YjI1bEtDZGpiR2xqYXljc0lHWjFibU4wYVc5dUlDaGxkbVZ1ZENrZ2UxeHVYSFJjZEZ4MFhIUmNkRngwWlhabGJuUXVjSEpsZG1WdWRFUmxabUYxYkhRb0tUdGNibHh1WEhSY2RGeDBYSFJjZEZ4MFpHVm1aWEp5WldRdWNtVnpiMngyWlNoN1hHNWNkRngwWEhSY2RGeDBYSFJjZEhKaGJtZGxPaUJzYVc1clNXNW1ieTV5WVc1blpTeGNibHgwWEhSY2RGeDBYSFJjZEZ4MGRYSnNPaUFrYkdsdWExVnliQzUyWVd3b0tTeGNibHgwWEhSY2RGeDBYSFJjZEZ4MGRHVjRkRG9nSkd4cGJtdFVaWGgwTG5aaGJDZ3BMRnh1WEhSY2RGeDBYSFJjZEZ4MFhIUnVaWGRYYVc1a2IzYzZJQ1J2Y0dWdVNXNU9aWGRYYVc1a2IzY3VhWE1vSnpwamFHVmphMlZrSnlsY2JseDBYSFJjZEZ4MFhIUmNkSDBwTzF4dVhIUmNkRngwWEhSY2RGeDBKR3hwYm10RWFXRnNiMmN1Ylc5a1lXd29KMmhwWkdVbktUdGNibHgwWEhSY2RGeDBYSFI5S1R0Y2JseDBYSFJjZEZ4MGZTa3ViMjVsS0Nkb2FXUmtaVzR1WW5NdWJXOWtZV3duTENCbWRXNWpkR2x2YmlBb0tTQjdYRzVjZEZ4MFhIUmNkRngwTHk4Z1pHVjBZV05vSUdWMlpXNTBjMXh1WEhSY2RGeDBYSFJjZENSc2FXNXJWR1Y0ZEM1dlptWW9KMmx1Y0hWMEp5azdYRzVjZEZ4MFhIUmNkRngwSkd4cGJtdFZjbXd1YjJabUtDZHBibkIxZENjcE8xeHVYSFJjZEZ4MFhIUmNkQ1JzYVc1clFuUnVMbTltWmlnblkyeHBZMnNuS1R0Y2JseHVYSFJjZEZ4MFhIUmNkR2xtSUNoa1pXWmxjbkpsWkM1emRHRjBaU2dwSUQwOVBTQW5jR1Z1WkdsdVp5Y3BJSHRjYmx4MFhIUmNkRngwWEhSY2RHUmxabVZ5Y21Wa0xuSmxhbVZqZENncE8xeHVYSFJjZEZ4MFhIUmNkSDFjYmx4MFhIUmNkRngwZlNrdWJXOWtZV3dvSjNOb2IzY25LVHRjYmx4MFhIUmNkSDBwTG5CeWIyMXBjMlVvS1R0Y2JseDBYSFI5TzF4dVhHNWNkRngwTHlvcVhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0UFltcGxZM1I5SUd4aGVXOTFkRWx1Wm05Y2JseDBYSFFnS2k5Y2JseDBYSFIwYUdsekxuTm9iM2NnUFNCbWRXNWpkR2x2YmlBb2JHRjViM1YwU1c1bWJ5a2dlMXh1WEhSY2RGeDBkbUZ5SUNSbFpHbDBiM0lnUFNCc1lYbHZkWFJKYm1adkxtVmthWFJ2Y2lncExGeHVYSFJjZEZ4MFhIUWtaR2xoYkc5bklEMGdiR0Y1YjNWMFNXNW1ieTVrYVdGc2IyY29LU3hjYmx4MFhIUmNkRngwSkdWa2FYUmhZbXhsSUQwZ2JHRjViM1YwU1c1bWJ5NWxaR2wwWVdKc1pTZ3BMRnh1WEhSY2RGeDBYSFFrY0c5d2IzWmxjaUE5SUd4aGVXOTFkRWx1Wm04dWNHOXdiM1psY2lncExGeHVYSFJjZEZ4MFhIUnNhVzVyU1c1bWJ5QTlJR2hoYm1Sc1pYSXVhVzUyYjJ0bEtDZGxaR2wwYjNJdVoyVjBUR2x1YTBsdVptOG5MQ0FrWldScGRHRmliR1VwTzF4dVhHNWNkRngwWEhSMllYSWdiM0IwYVc5dWN5QTlJQ1JsWkdsMGIzSXVaR0YwWVNnbmIzQjBhVzl1Y3ljcE8xeHVYRzVjZEZ4MFhIUm9ZVzVrYkdWeUxtbHVkbTlyWlNnblpXUnBkRzl5TG5OaGRtVlNZVzVuWlNjc0lDUmxaR2wwWVdKc1pTazdYRzVjZEZ4MFhIUjBhR2x6TG5Ob2IzZE1hVzVyUkdsaGJHOW5LQ1JsWkdsMFlXSnNaU3dnSkdScFlXeHZaeXdnYkdsdWEwbHVabThwTG5Sb1pXNG9ablZ1WTNScGIyNGdLR3hwYm10SmJtWnZLU0I3WEc1Y2RGeDBYSFJjZEdoaGJtUnNaWEl1YVc1MmIydGxLQ2RsWkdsMGIzSXVjbVZ6ZEc5eVpWSmhibWRsSnl3Z0pHVmthWFJoWW14bEtUdGNibHgwWEhSY2RGeDBhR0Z1Wkd4bGNpNXBiblp2YTJVb0oyVmthWFJ2Y2k1amNtVmhkR1ZNYVc1ckp5d2dKR1ZrYVhSaFlteGxMQ0JzYVc1clNXNW1ieXdnYjNCMGFXOXVjeWs3WEc1Y2RGeDBYSFJjZEM4dklHaHBaR1VnY0c5d2IzWmxjaUJoWm5SbGNpQmpjbVZoZEdsdVp5QnNhVzVyWEc1Y2RGeDBYSFJjZEdoaGJtUnNaWEl1YVc1MmIydGxLQ2R3YjNCdmRtVnlMbWhwWkdVbkxDQWtjRzl3YjNabGNpazdYRzVjZEZ4MFhIUjlLUzVtWVdsc0tHWjFibU4wYVc5dUlDZ3BJSHRjYmx4MFhIUmNkRngwYUdGdVpHeGxjaTVwYm5admEyVW9KMlZrYVhSdmNpNXlaWE4wYjNKbFVtRnVaMlVuTENBa1pXUnBkR0ZpYkdVcE8xeHVYSFJjZEZ4MGZTazdYRzVjZEZ4MGZUdGNibHgwZlR0Y2JseHVYSFIyWVhJZ1NXMWhaMlZFYVdGc2IyY2dQU0JtZFc1amRHbHZiaUFvYUdGdVpHeGxjaWtnZTF4dVhIUmNkQzhxS2x4dVhIUmNkQ0FxSUhSdloyZHNaU0JpZFhSMGIyNGdjM1JoZEhWelhHNWNkRngwSUNwY2JseDBYSFFnS2lCQWNISnBkbUYwWlZ4dVhIUmNkQ0FxSUVCd1lYSmhiU0I3YWxGMVpYSjVmU0FrWW5SdVhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0Q2IyOXNaV0Z1ZlNCcGMwVnVZV0pzWlZ4dVhIUmNkQ0FxTDF4dVhIUmNkSFpoY2lCMGIyZG5iR1ZDZEc0Z1BTQm1kVzVqZEdsdmJpQW9KR0owYml3Z2FYTkZibUZpYkdVcElIdGNibHgwWEhSY2RDUmlkRzR1ZEc5bloyeGxRMnhoYzNNb0oyUnBjMkZpYkdWa0p5d2dJV2x6Ulc1aFlteGxLVHRjYmx4MFhIUmNkQ1JpZEc0dVlYUjBjaWduWkdsellXSnNaV1FuTENBaGFYTkZibUZpYkdVcE8xeHVYSFJjZEgwN1hHNWNibHgwWEhSMGFHbHpMbk5vYjNjZ1BTQm1kVzVqZEdsdmJpQW9iR0Y1YjNWMFNXNW1ieWtnZTF4dVhIUmNkRngwZG1GeUlDUmthV0ZzYjJjZ1BTQnNZWGx2ZFhSSmJtWnZMbVJwWVd4dlp5Z3BMRnh1WEhSY2RGeDBYSFFrWldScGRHRmliR1VnUFNCc1lYbHZkWFJKYm1adkxtVmthWFJoWW14bEtDazdYRzVjYmx4MFhIUmNkR2hoYm1Sc1pYSXVhVzUyYjJ0bEtDZGxaR2wwYjNJdWMyRjJaVkpoYm1kbEp5d2dKR1ZrYVhSaFlteGxLVHRjYmx4MFhIUmNkSFJvYVhNdWMyaHZkMGx0WVdkbFJHbGhiRzluS0NSbFpHbDBZV0pzWlN3Z0pHUnBZV3h2WnlrdWRHaGxiaWhtZFc1amRHbHZiaUFvWkdGMFlTa2dlMXh1WEhSY2RGeDBYSFJvWVc1a2JHVnlMbWx1ZG05clpTZ25aV1JwZEc5eUxuSmxjM1J2Y21WU1lXNW5aU2NzSUNSbFpHbDBZV0pzWlNrN1hHNWNibHgwWEhSY2RGeDBhV1lnS0hSNWNHVnZaaUJrWVhSaElEMDlQU0FuYzNSeWFXNW5KeWtnZTF4dVhIUmNkRngwWEhSY2RDOHZJR2x0WVdkbElIVnliRnh1WEhSY2RGeDBYSFJjZEdoaGJtUnNaWEl1YVc1MmIydGxLQ2RsWkdsMGIzSXVhVzV6WlhKMFNXMWhaMlVuTENBa1pXUnBkR0ZpYkdVc0lHUmhkR0VwTzF4dVhIUmNkRngwWEhSOUlHVnNjMlVnZTF4dVhIUmNkRngwWEhSY2RDOHZJR0Z5Y21GNUlHOW1JR1pwYkdWelhHNWNkRngwWEhSY2RGeDBhR0Z1Wkd4bGNpNXBibk5sY25SSmJXRm5aWE1vYkdGNWIzVjBTVzVtYnl3Z1pHRjBZU2s3WEc1Y2RGeDBYSFJjZEgxY2JseDBYSFJjZEgwcExtWmhhV3dvWm5WdVkzUnBiMjRnS0NrZ2UxeHVYSFJjZEZ4MFhIUm9ZVzVrYkdWeUxtbHVkbTlyWlNnblpXUnBkRzl5TG5KbGMzUnZjbVZTWVc1blpTY3NJQ1JsWkdsMFlXSnNaU2s3WEc1Y2RGeDBYSFI5S1R0Y2JseDBYSFI5TzF4dVhHNWNkRngwTHlvcVhHNWNkRngwSUNvZ2MyaHZkeUJwYldGblpTQmthV0ZzYjJkY2JseDBYSFFnS2x4dVhIUmNkQ0FxSUVCd1lYSmhiU0I3YWxGMVpYSjVmU0FrWldScGRHRmliR1ZjYmx4MFhIUWdLaUJBY0dGeVlXMGdlMnBSZFdWeWVYMGdKR1JwWVd4dloxeHVYSFJjZENBcUlFQnlaWFIxY200Z2UxQnliMjFwYzJWOVhHNWNkRngwSUNvdlhHNWNkRngwZEdocGN5NXphRzkzU1cxaFoyVkVhV0ZzYjJjZ1BTQm1kVzVqZEdsdmJpQW9KR1ZrYVhSaFlteGxMQ0FrWkdsaGJHOW5LU0I3WEc1Y2RGeDBYSFJ5WlhSMWNtNGdKQzVFWldabGNuSmxaQ2htZFc1amRHbHZiaUFvWkdWbVpYSnlaV1FwSUh0Y2JseDBYSFJjZEZ4MGRtRnlJQ1JwYldGblpVUnBZV3h2WnlBOUlDUmthV0ZzYjJjdVptbHVaQ2duTG01dmRHVXRhVzFoWjJVdFpHbGhiRzluSnlrN1hHNWNibHgwWEhSY2RGeDBkbUZ5SUNScGJXRm5aVWx1Y0hWMElEMGdKR1JwWVd4dlp5NW1hVzVrS0NjdWJtOTBaUzFwYldGblpTMXBibkIxZENjcExGeHVYSFJjZEZ4MFhIUmNkQ1JwYldGblpWVnliQ0E5SUNSa2FXRnNiMmN1Wm1sdVpDZ25MbTV2ZEdVdGFXMWhaMlV0ZFhKc0p5a3NYRzVjZEZ4MFhIUmNkRngwSkdsdFlXZGxRblJ1SUQwZ0pHUnBZV3h2Wnk1bWFXNWtLQ2N1Ym05MFpTMXBiV0ZuWlMxaWRHNG5LVHRjYmx4dVhIUmNkRngwWEhRa2FXMWhaMlZFYVdGc2IyY3ViMjVsS0NkemFHOTNiaTVpY3k1dGIyUmhiQ2NzSUdaMWJtTjBhVzl1SUNncElIdGNibHgwWEhSY2RGeDBYSFF2THlCRGJHOXVhVzVuSUdsdFlXZGxTVzV3ZFhRZ2RHOGdZMnhsWVhJZ1pXeGxiV1Z1ZEM1Y2JseDBYSFJjZEZ4MFhIUWthVzFoWjJWSmJuQjFkQzV5WlhCc1lXTmxWMmwwYUNna2FXMWhaMlZKYm5CMWRDNWpiRzl1WlNncFhHNWNkRngwWEhSY2RGeDBJQ0F1YjI0b0oyTm9ZVzVuWlNjc0lHWjFibU4wYVc5dUlDZ3BJSHRjYmx4MFhIUmNkRngwWEhRZ0lGeDBaR1ZtWlhKeVpXUXVjbVZ6YjJ4MlpTaDBhR2x6TG1acGJHVnpJSHg4SUhSb2FYTXVkbUZzZFdVcE8xeHVYSFJjZEZ4MFhIUmNkQ0FnWEhRa2FXMWhaMlZFYVdGc2IyY3ViVzlrWVd3b0oyaHBaR1VuS1R0Y2JseDBYSFJjZEZ4MFhIUWdJSDBwWEc1Y2RGeDBYSFJjZEZ4MElDQXVkbUZzS0NjbktWeHVYSFJjZEZ4MFhIUmNkQ2s3WEc1Y2JseDBYSFJjZEZ4MFhIUWthVzFoWjJWQ2RHNHVZMnhwWTJzb1puVnVZM1JwYjI0Z0tHVjJaVzUwS1NCN1hHNWNkRngwWEhSY2RGeDBYSFJsZG1WdWRDNXdjbVYyWlc1MFJHVm1ZWFZzZENncE8xeHVYRzVjZEZ4MFhIUmNkRngwWEhSa1pXWmxjbkpsWkM1eVpYTnZiSFpsS0NScGJXRm5aVlZ5YkM1MllXd29LU2s3WEc1Y2RGeDBYSFJjZEZ4MFhIUWthVzFoWjJWRWFXRnNiMmN1Ylc5a1lXd29KMmhwWkdVbktUdGNibHgwWEhSY2RGeDBYSFI5S1R0Y2JseHVYSFJjZEZ4MFhIUmNkQ1JwYldGblpWVnliQzV2YmlnbmEyVjVkWEFnY0dGemRHVW5MQ0JtZFc1amRHbHZiaUFvWlhabGJuUXBJSHRjYmx4MFhIUmNkRngwWEhSY2RIWmhjaUIxY213N1hHNWNibHgwWEhSY2RGeDBYSFJjZEdsbUlDaGxkbVZ1ZEM1MGVYQmxJRDA5UFNBbmNHRnpkR1VuS1NCN1hHNWNkRngwWEhSY2RGeDBYSFJjZEhWeWJDQTlJR1YyWlc1MExtOXlhV2RwYm1Gc1JYWmxiblF1WTJ4cGNHSnZZWEprUkdGMFlTNW5aWFJFWVhSaEtDZDBaWGgwSnlrN1hHNWNkRngwWEhSY2RGeDBYSFI5SUdWc2MyVWdlMXh1WEhSY2RGeDBYSFJjZEZ4MFhIUjFjbXdnUFNBa2FXMWhaMlZWY213dWRtRnNLQ2s3WEc1Y2RGeDBYSFJjZEZ4MFhIUjlYRzVjYmx4MFhIUmNkRngwWEhSY2RIUnZaMmRzWlVKMGJpZ2thVzFoWjJWQ2RHNHNJSFZ5YkNrN1hHNWNkRngwWEhSY2RGeDBmU2t1ZG1Gc0tDY25LUzUwY21sbloyVnlLQ2RtYjJOMWN5Y3BPMXh1WEhSY2RGeDBYSFI5S1M1dmJtVW9KMmhwWkdSbGJpNWljeTV0YjJSaGJDY3NJR1oxYm1OMGFXOXVJQ2dwSUh0Y2JseDBYSFJjZEZ4MFhIUWthVzFoWjJWSmJuQjFkQzV2Wm1Zb0oyTm9ZVzVuWlNjcE8xeHVYSFJjZEZ4MFhIUmNkQ1JwYldGblpWVnliQzV2Wm1Zb0oydGxlWFZ3SUhCaGMzUmxKeWs3WEc1Y2RGeDBYSFJjZEZ4MEpHbHRZV2RsUW5SdUxtOW1aaWduWTJ4cFkyc25LVHRjYmx4dVhIUmNkRngwWEhSY2RHbG1JQ2hrWldabGNuSmxaQzV6ZEdGMFpTZ3BJRDA5UFNBbmNHVnVaR2x1WnljcElIdGNibHgwWEhSY2RGeDBYSFJjZEdSbFptVnljbVZrTG5KbGFtVmpkQ2dwTzF4dVhIUmNkRngwWEhSY2RIMWNibHgwWEhSY2RGeDBmU2t1Ylc5a1lXd29KM05vYjNjbktUdGNibHgwWEhSY2RIMHBPMXh1WEhSY2RIMDdYRzVjZEgwN1hHNWNibHgwZG1GeUlFaGxiSEJFYVdGc2IyY2dQU0JtZFc1amRHbHZiaUFvYUdGdVpHeGxjaWtnZTF4dVhIUmNkQzhxS2x4dVhIUmNkQ0FxSUhOb2IzY2dhR1ZzY0NCa2FXRnNiMmRjYmx4MFhIUWdLbHh1WEhSY2RDQXFJRUJ3WVhKaGJTQjdhbEYxWlhKNWZTQWtaV1JwZEdGaWJHVmNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UycFJkV1Z5ZVgwZ0pHUnBZV3h2WjF4dVhIUmNkQ0FxSUVCeVpYUjFjbTRnZTFCeWIyMXBjMlY5WEc1Y2RGeDBJQ292WEc1Y2RGeDBkR2hwY3k1emFHOTNTR1ZzY0VScFlXeHZaeUE5SUdaMWJtTjBhVzl1SUNna1pXUnBkR0ZpYkdVc0lDUmthV0ZzYjJjcElIdGNibHgwWEhSY2RISmxkSFZ5YmlBa0xrUmxabVZ5Y21Wa0tHWjFibU4wYVc5dUlDaGtaV1psY25KbFpDa2dlMXh1WEhSY2RGeDBYSFIyWVhJZ0pHaGxiSEJFYVdGc2IyY2dQU0FrWkdsaGJHOW5MbVpwYm1Rb0p5NXViM1JsTFdobGJIQXRaR2xoYkc5bkp5azdYRzVjYmx4MFhIUmNkRngwSkdobGJIQkVhV0ZzYjJjdWIyNWxLQ2RvYVdSa1pXNHVZbk11Ylc5a1lXd25MQ0JtZFc1amRHbHZiaUFvS1NCN1hHNWNkRngwWEhSY2RGeDBaR1ZtWlhKeVpXUXVjbVZ6YjJ4MlpTZ3BPMXh1WEhSY2RGeDBYSFI5S1M1dGIyUmhiQ2duYzJodmR5Y3BPMXh1WEhSY2RGeDBmU2t1Y0hKdmJXbHpaU2dwTzF4dVhIUmNkSDA3WEc1Y2JseDBYSFF2S2lwY2JseDBYSFFnS2lCQWNHRnlZVzBnZTA5aWFtVmpkSDBnYkdGNWIzVjBTVzVtYjF4dVhIUmNkQ0FxTDF4dVhIUmNkSFJvYVhNdWMyaHZkeUE5SUdaMWJtTjBhVzl1SUNoc1lYbHZkWFJKYm1adktTQjdYRzVjZEZ4MFhIUjJZWElnSkdScFlXeHZaeUE5SUd4aGVXOTFkRWx1Wm04dVpHbGhiRzluS0Nrc1hHNWNkRngwWEhSY2RDUmxaR2wwWVdKc1pTQTlJR3hoZVc5MWRFbHVabTh1WldScGRHRmliR1VvS1R0Y2JseHVYSFJjZEZ4MGFHRnVaR3hsY2k1cGJuWnZhMlVvSjJWa2FYUnZjaTV6WVhabFVtRnVaMlVuTENBa1pXUnBkR0ZpYkdVc0lIUnlkV1VwTzF4dVhIUmNkRngwZEdocGN5NXphRzkzU0dWc2NFUnBZV3h2Wnlna1pXUnBkR0ZpYkdVc0lDUmthV0ZzYjJjcExuUm9aVzRvWm5WdVkzUnBiMjRnS0NrZ2UxeHVYSFJjZEZ4MFhIUm9ZVzVrYkdWeUxtbHVkbTlyWlNnblpXUnBkRzl5TG5KbGMzUnZjbVZTWVc1blpTY3NJQ1JsWkdsMFlXSnNaU2s3WEc1Y2RGeDBYSFI5S1R0Y2JseDBYSFI5TzF4dVhIUjlPMXh1WEc1Y2JseDBMeW9xWEc1Y2RDQXFJRUJqYkdGemN5QkZkbVZ1ZEVoaGJtUnNaWEpjYmx4MElDcGNibHgwSUNvZ1JYWmxiblJJWVc1a2JHVnlYRzVjZENBcUlDQXRJRlJQUkU4NklHNWxkeUJwYm5OMFlXNWpaU0J3WlhJZ1lTQmxaR2wwYjNKY2JseDBJQ29nSUMwZ1ZFOUVUem9nY21WdVlXMWxJRVYyWlc1MFNHRnVaR3hsY2x4dVhIUWdLaTljYmx4MGRtRnlJRVYyWlc1MFNHRnVaR3hsY2lBOUlHWjFibU4wYVc5dUlDZ3BJSHRjYmx4MFhIUXZLaXBjYmx4MFhIUWdLaUJOYjJSMWJHVnpYRzVjZEZ4MElDb3ZYRzVjZEZ4MGRtRnlJRzF2WkhWc1pYTWdQU0IwYUdsekxtMXZaSFZzWlhNZ1BTQjdYRzVjZEZ4MFhIUmxaR2wwYjNJNklHNWxkeUJGWkdsMGIzSW9kR2hwY3lrc1hHNWNkRngwWEhSMGIyOXNZbUZ5T2lCdVpYY2dWRzl2YkdKaGNpaDBhR2x6S1N4Y2JseDBYSFJjZEhOMFlYUjFjMkpoY2pvZ2JtVjNJRk4wWVhSMWMySmhjaWgwYUdsektTeGNibHgwWEhSY2RIQnZjRzkyWlhJNklHNWxkeUJRYjNCdmRtVnlLSFJvYVhNcExGeHVYSFJjZEZ4MGFHRnVaR3hsT2lCdVpYY2dTR0Z1Wkd4bEtIUm9hWE1wTEZ4dVhIUmNkRngwWm5Wc2JITmpjbVZsYmpvZ2JtVjNJRVoxYkd4elkzSmxaVzRvZEdocGN5a3NYRzVjZEZ4MFhIUmpiMlJsZG1sbGR6b2dibVYzSUVOdlpHVjJhV1YzS0hSb2FYTXBMRnh1WEhSY2RGeDBaSEpoWjBGdVpFUnliM0E2SUc1bGR5QkVjbUZuUVc1a1JISnZjQ2gwYUdsektTeGNibHgwWEhSY2RHTnNhWEJpYjJGeVpEb2dibVYzSUVOc2FYQmliMkZ5WkNoMGFHbHpLU3hjYmx4MFhIUmNkR3hwYm10RWFXRnNiMmM2SUc1bGR5Qk1hVzVyUkdsaGJHOW5LSFJvYVhNcExGeHVYSFJjZEZ4MGFXMWhaMlZFYVdGc2IyYzZJRzVsZHlCSmJXRm5aVVJwWVd4dlp5aDBhR2x6S1N4Y2JseDBYSFJjZEdobGJIQkVhV0ZzYjJjNklHNWxkeUJJWld4d1JHbGhiRzluS0hSb2FYTXBYRzVjZEZ4MGZUdGNibHh1WEhSY2RDOHZJRlJQUkU4Z2NtVm1ZV04wYjNJZ2JXOWtkV3hsY3lCaGJtUWdaWFpsYm5SSVlXNWtiR1Z5WEc1Y2RGeDBMeThnSUMwZ2NtVnRiM1psSUhSb2FYTWdiV1YwYUc5a0lHRnVaQ0IxYzJVZ1kzVnpkRzl0SUdWMlpXNTBJR1p5YjIwZ0pHaHZiR1JsY2lCcGJuTjBaV0ZrWEc1Y2RGeDBkR2hwY3k1cGJuWnZhMlVnUFNCbWRXNWpkR2x2YmlBb0tTQjdYRzVjZEZ4MFhIUjJZWElnYlc5a2RXeGxRVzVrVFdWMGFHOWtJRDBnYkdsemRDNW9aV0ZrS0d4cGMzUXVabkp2YlNoaGNtZDFiV1Z1ZEhNcEtUdGNibHgwWEhSY2RIWmhjaUJoY21keklEMGdiR2x6ZEM1MFlXbHNLR3hwYzNRdVpuSnZiU2hoY21kMWJXVnVkSE1wS1R0Y2JseHVYSFJjZEZ4MGRtRnlJSE53YkdsMGN5QTlJRzF2WkhWc1pVRnVaRTFsZEdodlpDNXpjR3hwZENnbkxpY3BPMXh1WEhSY2RGeDBkbUZ5SUdoaGMxTmxjR0Z5WVhSdmNpQTlJSE53YkdsMGN5NXNaVzVuZEdnZ1BpQXhPMXh1WEhSY2RGeDBkbUZ5SUcxdlpIVnNaVTVoYldVZ1BTQm9ZWE5UWlhCaGNtRjBiM0lnSmlZZ2JHbHpkQzVvWldGa0tITndiR2wwY3lrN1hHNWNkRngwWEhSMllYSWdiV1YwYUc5a1RtRnRaU0E5SUdoaGMxTmxjR0Z5WVhSdmNpQS9JR3hwYzNRdWJHRnpkQ2h6Y0d4cGRITXBJRG9nYkdsemRDNW9aV0ZrS0hOd2JHbDBjeWs3WEc1Y2JseDBYSFJjZEhaaGNpQnRiMlIxYkdVZ1BTQjBhR2x6TG1kbGRFMXZaSFZzWlNodGIyUjFiR1ZPWVcxbEtUdGNibHgwWEhSY2RIWmhjaUJ0WlhSb2IyUWdQU0J0YjJSMWJHVmJiV1YwYUc5a1RtRnRaVjA3WEc1Y2JseDBYSFJjZEhKbGRIVnliaUJ0WlhSb2IyUWdKaVlnYldWMGFHOWtMbUZ3Y0d4NUtHMXZaSFZzWlN3Z1lYSm5jeWs3WEc1Y2RGeDBmVHRjYmx4dVhIUmNkQzhxS2x4dVhIUmNkQ0FxSUhKbGRIVnlibk1nYlc5a2RXeGxYRzVjZEZ4MElDcGNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UxTjBjbWx1WjMwZ2JXOWtkV3hsVG1GdFpTQXRJRzVoYldVZ2IyWWdiVzlrZFd4bFhHNWNkRngwSUNvZ1FISmxkSFZ5YmlCN1RXOWtkV3hsZlNBdElHUmxabUYxYkhSeklHbHpJR1ZrYVhSdmNseHVYSFJjZENBcUwxeHVYSFJjZEhSb2FYTXVaMlYwVFc5a2RXeGxJRDBnWm5WdVkzUnBiMjRnS0cxdlpIVnNaVTVoYldVcElIdGNibHgwWEhSY2RISmxkSFZ5YmlCMGFHbHpMbTF2WkhWc1pYTmJiVzlrZFd4bFRtRnRaVjBnZkh3Z2RHaHBjeTV0YjJSMWJHVnpMbVZrYVhSdmNqdGNibHgwWEhSOU8xeHVYRzVjZEZ4MEx5b3FYRzVjZEZ4MElDb2dhVzV6WlhKMElFbHRZV2RsY3lCbWNtOXRJR1pwYkdVZ1lYSnlZWGt1WEc1Y2RGeDBJQ3BjYmx4MFhIUWdLaUJBY0hKcGRtRjBaVnh1WEhSY2RDQXFJRUJ3WVhKaGJTQjdUMkpxWldOMGZTQnNZWGx2ZFhSSmJtWnZYRzVjZEZ4MElDb2dRSEJoY21GdElIdEdhV3hsVzExOUlHWnBiR1Z6WEc1Y2RGeDBJQ292WEc1Y2RGeDBkR2hwY3k1cGJuTmxjblJKYldGblpYTWdQU0JtZFc1amRHbHZiaUFvYkdGNWIzVjBTVzVtYnl3Z1ptbHNaWE1wSUh0Y2JseDBYSFJjZEhaaGNpQWtaV1JwZEc5eUlEMGdiR0Y1YjNWMFNXNW1ieTVsWkdsMGIzSW9LU3hjYmx4MFhIUmNkRngwSkdWa2FYUmhZbXhsSUQwZ2JHRjViM1YwU1c1bWJ5NWxaR2wwWVdKc1pTZ3BMRnh1WEhSY2RGeDBYSFFrYUc5c1pHVnlJRDBnYkdGNWIzVjBTVzVtYnk1b2IyeGtaWElvS1R0Y2JseHVYSFJjZEZ4MGRtRnlJR05oYkd4aVlXTnJjeUE5SUNSbFpHbDBZV0pzWlM1a1lYUmhLQ2RqWVd4c1ltRmphM01uS1R0Y2JseDBYSFJjZEhaaGNpQnZjSFJwYjI1eklEMGdKR1ZrYVhSdmNpNWtZWFJoS0NkdmNIUnBiMjV6SnlrN1hHNWNibHgwWEhSY2RDOHZJRWxtSUc5dVNXMWhaMlZWY0d4dllXUWdiM0IwYVc5dWN5QnpaWFIwWldSY2JseDBYSFJjZEdsbUlDaGpZV3hzWW1GamEzTXViMjVKYldGblpWVndiRzloWkNrZ2UxeHVYSFJjZEZ4MFhIUmpZV3hzWW1GamEzTXViMjVKYldGblpWVndiRzloWkNobWFXeGxjeXdnYlc5a2RXeGxjeTVsWkdsMGIzSXNJQ1JsWkdsMFlXSnNaU2s3WEc1Y2RGeDBYSFJjZEdKcGJtUkRkWE4wYjIxRmRtVnVkQ2drYUc5c1pHVnlMQ0FuYVcxaFoyVXVkWEJzYjJGa0p5a29XMlpwYkdWelhTazdYRzVjZEZ4MFhIUmNkQzh2SUdWc2MyVWdhVzV6WlhKMElFbHRZV2RsSUdGeklHUmhkR0ZWVWt4Y2JseDBYSFJjZEgwZ1pXeHpaU0I3WEc1Y2RGeDBYSFJjZENRdVpXRmphQ2htYVd4bGN5d2dablZ1WTNScGIyNGdLR2xrZUN3Z1ptbHNaU2tnZTF4dVhIUmNkRngwWEhSY2RIWmhjaUJtYVd4bGJtRnRaU0E5SUdacGJHVXVibUZ0WlR0Y2JseDBYSFJjZEZ4MFhIUnBaaUFvYjNCMGFXOXVjeTV0WVhocGJYVnRTVzFoWjJWR2FXeGxVMmw2WlNBbUppQnZjSFJwYjI1ekxtMWhlR2x0ZFcxSmJXRm5aVVpwYkdWVGFYcGxJRHdnWm1sc1pTNXphWHBsS1NCN1hHNWNkRngwWEhSY2RGeDBYSFJwWmlBb1kyRnNiR0poWTJ0ekxtOXVTVzFoWjJWVmNHeHZZV1JGY25KdmNpa2dlMXh1WEhSY2RGeDBYSFJjZEZ4MFhIUmpZV3hzWW1GamEzTXViMjVKYldGblpWVndiRzloWkVWeWNtOXlLRzl3ZEdsdmJuTXViR0Z1WjBsdVptOHVhVzFoWjJVdWJXRjRhVzExYlVacGJHVlRhWHBsUlhKeWIzSXBPMXh1WEhSY2RGeDBYSFJjZEZ4MFhIUmlhVzVrUTNWemRHOXRSWFpsYm5Rb0pHaHZiR1JsY2l3Z0oybHRZV2RsTG5Wd2JHOWhaQzVsY25KdmNpY3BLRzl3ZEdsdmJuTXViR0Z1WjBsdVptOHVhVzFoWjJVdWJXRjRhVzExYlVacGJHVlRhWHBsUlhKeWIzSXBPMXh1WEhSY2RGeDBYSFJjZEZ4MGZTQmxiSE5sSUh0Y2JseDBYSFJjZEZ4MFhIUmNkRngwWVd4bGNuUW9iM0IwYVc5dWN5NXNZVzVuU1c1bWJ5NXBiV0ZuWlM1dFlYaHBiWFZ0Um1sc1pWTnBlbVZGY25KdmNpazdYRzVjZEZ4MFhIUmNkRngwWEhSOVhHNWNkRngwWEhSY2RGeDBmU0JsYkhObElIdGNibHgwWEhSY2RGeDBYSFJjZEdGemVXNWpMbkpsWVdSR2FXeGxRWE5FWVhSaFZWSk1LR1pwYkdVcExuUm9aVzRvWm5WdVkzUnBiMjRnS0hORVlYUmhWVkpNS1NCN1hHNWNkRngwWEhSY2RGeDBYSFJjZEcxdlpIVnNaWE11WldScGRHOXlMbWx1YzJWeWRFbHRZV2RsS0NSbFpHbDBZV0pzWlN3Z2MwUmhkR0ZWVWt3c0lHWnBiR1Z1WVcxbEtUdGNibHgwWEhSY2RGeDBYSFJjZEgwcExtWmhhV3dvWm5WdVkzUnBiMjRnS0NrZ2UxeHVYSFJjZEZ4MFhIUmNkRngwWEhScFppQW9ZMkZzYkdKaFkydHpMbTl1U1cxaFoyVlZjR3h2WVdSRmNuSnZjaWtnZTF4dVhIUmNkRngwWEhSY2RGeDBYSFJjZEdOaGJHeGlZV05yY3k1dmJrbHRZV2RsVlhCc2IyRmtSWEp5YjNJb0tUdGNibHgwWEhSY2RGeDBYSFJjZEZ4MFhIUmlhVzVrUTNWemRHOXRSWFpsYm5Rb0pHaHZiR1JsY2l3Z0oybHRZV2RsTG5Wd2JHOWhaQzVsY25KdmNpY3BLRzl3ZEdsdmJuTXViR0Z1WjBsdVptOHVhVzFoWjJVdWJXRjRhVzExYlVacGJHVlRhWHBsUlhKeWIzSXBPMXh1WEhSY2RGeDBYSFJjZEZ4MFhIUjlYRzVjZEZ4MFhIUmNkRngwWEhSOUtUdGNibHgwWEhSY2RGeDBYSFI5WEc1Y2RGeDBYSFJjZEgwcE8xeHVYSFJjZEZ4MGZWeHVYSFJjZEgwN1hHNWNibHgwWEhSMllYSWdZMjl0YldGdVpITWdQU0I3WEc1Y2RGeDBYSFF2S2lwY2JseDBYSFJjZENBcUlFQndZWEpoYlNCN1QySnFaV04wZlNCc1lYbHZkWFJKYm1adlhHNWNkRngwWEhRZ0tpOWNibHgwWEhSY2RITm9iM2RNYVc1clJHbGhiRzluT2lCbWRXNWpkR2x2YmlBb2JHRjViM1YwU1c1bWJ5a2dlMXh1WEhSY2RGeDBYSFJ0YjJSMWJHVnpMbXhwYm10RWFXRnNiMmN1YzJodmR5aHNZWGx2ZFhSSmJtWnZLVHRjYmx4MFhIUmNkSDBzWEc1Y2JseDBYSFJjZEM4cUtseHVYSFJjZEZ4MElDb2dRSEJoY21GdElIdFBZbXBsWTNSOUlHeGhlVzkxZEVsdVptOWNibHgwWEhSY2RDQXFMMXh1WEhSY2RGeDBjMmh2ZDBsdFlXZGxSR2xoYkc5bk9pQm1kVzVqZEdsdmJpQW9iR0Y1YjNWMFNXNW1ieWtnZTF4dVhIUmNkRngwWEhSdGIyUjFiR1Z6TG1sdFlXZGxSR2xoYkc5bkxuTm9iM2NvYkdGNWIzVjBTVzVtYnlrN1hHNWNkRngwWEhSOUxGeHVYRzVjZEZ4MFhIUXZLaXBjYmx4MFhIUmNkQ0FxSUVCd1lYSmhiU0I3VDJKcVpXTjBmU0JzWVhsdmRYUkpibVp2WEc1Y2RGeDBYSFFnS2k5Y2JseDBYSFJjZEhOb2IzZElaV3h3UkdsaGJHOW5PaUJtZFc1amRHbHZiaUFvYkdGNWIzVjBTVzVtYnlrZ2UxeHVYSFJjZEZ4MFhIUnRiMlIxYkdWekxtaGxiSEJFYVdGc2IyY3VjMmh2ZHloc1lYbHZkWFJKYm1adktUdGNibHgwWEhSY2RIMHNYRzVjYmx4MFhIUmNkQzhxS2x4dVhIUmNkRngwSUNvZ1FIQmhjbUZ0SUh0UFltcGxZM1I5SUd4aGVXOTFkRWx1Wm05Y2JseDBYSFJjZENBcUwxeHVYSFJjZEZ4MFpuVnNiSE5qY21WbGJqb2dablZ1WTNScGIyNGdLR3hoZVc5MWRFbHVabThwSUh0Y2JseDBYSFJjZEZ4MGJXOWtkV3hsY3k1bWRXeHNjMk55WldWdUxuUnZaMmRzWlNoc1lYbHZkWFJKYm1adktUdGNibHgwWEhSY2RIMHNYRzVjYmx4MFhIUmNkQzhxS2x4dVhIUmNkRngwSUNvZ1FIQmhjbUZ0SUh0UFltcGxZM1I5SUd4aGVXOTFkRWx1Wm05Y2JseDBYSFJjZENBcUwxeHVYSFJjZEZ4MFkyOWtaWFpwWlhjNklHWjFibU4wYVc5dUlDaHNZWGx2ZFhSSmJtWnZLU0I3WEc1Y2RGeDBYSFJjZEcxdlpIVnNaWE11WTI5a1pYWnBaWGN1ZEc5bloyeGxLR3hoZVc5MWRFbHVabThwTzF4dVhIUmNkRngwZlZ4dVhIUmNkSDA3WEc1Y2JseDBYSFIyWVhJZ2FFMXZkWE5sWkc5M2JpQTlJR1oxYm1OMGFXOXVJQ2hsZG1WdWRDa2dlMXh1WEhSY2RGeDBMeTl3Y21WMlpXNTBSR1ZtWVhWc2RDQlRaV3hsWTNScGIyNGdabTl5SUVaR0xDQkpSVGdyWEc1Y2RGeDBYSFJwWmlBb1pHOXRMbWx6U1cxbktHVjJaVzUwTG5SaGNtZGxkQ2twSUh0Y2JseDBYSFJjZEZ4MFpYWmxiblF1Y0hKbGRtVnVkRVJsWm1GMWJIUW9LVHRjYmx4MFhIUmNkSDFjYmx4MFhIUjlPMXh1WEc1Y2RGeDBkbUZ5SUdoVWIyOXNZbUZ5UVc1a1VHOXdiM1psY2xWd1pHRjBaU0E5SUdaMWJtTjBhVzl1SUNobGRtVnVkQ2tnZTF4dVhIUmNkRngwTHk4Z1pHVnNZWGtnWm05eUlISmhibWRsSUdGbWRHVnlJRzF2ZFhObGRYQmNibHgwWEhSY2RITmxkRlJwYldWdmRYUW9ablZ1WTNScGIyNGdLQ2tnZTF4dVhIUmNkRngwWEhSMllYSWdiR0Y1YjNWMFNXNW1ieUE5SUdSdmJTNXRZV3RsVEdGNWIzVjBTVzVtYnlobGRtVnVkQzVqZFhKeVpXNTBWR0Z5WjJWMElIeDhJR1YyWlc1MExuUmhjbWRsZENrN1hHNWNkRngwWEhSY2RIWmhjaUJ6ZEhsc1pVbHVabThnUFNCdGIyUjFiR1Z6TG1Wa2FYUnZjaTVqZFhKeVpXNTBVM1I1YkdVb1pYWmxiblF1ZEdGeVoyVjBLVHRjYmx4MFhIUmNkRngwYVdZZ0tDRnpkSGxzWlVsdVptOHBJSHNnY21WMGRYSnVPeUI5WEc1Y2JseDBYSFJjZEZ4MGRtRnlJR2x6UVdseVRXOWtaU0E5SUd4aGVXOTFkRWx1Wm04dVpXUnBkRzl5S0NrdVpHRjBZU2duYjNCMGFXOXVjeWNwTG1GcGNrMXZaR1U3WEc1Y2RGeDBYSFJjZEdsbUlDZ2hhWE5CYVhKTmIyUmxLU0I3WEc1Y2RGeDBYSFJjZEZ4MGJXOWtkV3hsY3k1MGIyOXNZbUZ5TG5Wd1pHRjBaU2hzWVhsdmRYUkpibVp2TG5SdmIyeGlZWElvS1N3Z2MzUjViR1ZKYm1adktUdGNibHgwWEhSY2RGeDBmVnh1WEc1Y2RGeDBYSFJjZEcxdlpIVnNaWE11Y0c5d2IzWmxjaTUxY0dSaGRHVW9iR0Y1YjNWMFNXNW1ieTV3YjNCdmRtVnlLQ2tzSUhOMGVXeGxTVzVtYnl3Z2FYTkJhWEpOYjJSbEtUdGNibHgwWEhSY2RGeDBiVzlrZFd4bGN5NW9ZVzVrYkdVdWRYQmtZWFJsS0d4aGVXOTFkRWx1Wm04dWFHRnVaR3hsS0Nrc0lITjBlV3hsU1c1bWJ5d2dhWE5CYVhKTmIyUmxLVHRjYmx4MFhIUmNkSDBzSURBcE8xeHVYSFJjZEgwN1hHNWNibHgwWEhSMllYSWdhRk5qY205c2JDQTlJR1oxYm1OMGFXOXVJQ2hsZG1WdWRDa2dlMXh1WEhSY2RGeDBkbUZ5SUd4aGVXOTFkRWx1Wm04Z1BTQmtiMjB1YldGclpVeGhlVzkxZEVsdVptOG9aWFpsYm5RdVkzVnljbVZ1ZEZSaGNtZGxkQ0I4ZkNCbGRtVnVkQzUwWVhKblpYUXBPMXh1WEhSY2RGeDBMeTlvYVdSbElIQnZjRzkyWlhJZ1lXNWtJR2hoYm1Sc1pTQjNhR1Z1SUhOamNtOXNiR1ZrWEc1Y2RGeDBYSFJ0YjJSMWJHVnpMbkJ2Y0c5MlpYSXVhR2xrWlNoc1lYbHZkWFJKYm1adkxuQnZjRzkyWlhJb0tTazdYRzVjZEZ4MFhIUnRiMlIxYkdWekxtaGhibVJzWlM1b2FXUmxLR3hoZVc5MWRFbHVabTh1YUdGdVpHeGxLQ2twTzF4dVhIUmNkSDA3WEc1Y2JseDBYSFIyWVhJZ2FGUnZiMnhpWVhKQmJtUlFiM0J2ZG1WeVRXOTFjMlZrYjNkdUlEMGdablZ1WTNScGIyNGdLR1YyWlc1MEtTQjdYRzVjZEZ4MFhIUXZMeUJ3Y21WMlpXNTBJR1JsWm1GMWJIUWdaWFpsYm5RZ2QyaGxiaUJwYm5ObGNuUlVZV0pzWlNBb1JrWXNJRmRsWW10cGRDbGNibHgwWEhSY2RIWmhjaUFrWW5SdUlEMGdKQ2hsZG1WdWRDNTBZWEpuWlhRcExtTnNiM05sYzNRb0oxdGtZWFJoTFdWMlpXNTBYU2NwTzF4dVhIUmNkRngwYVdZZ0tDUmlkRzR1YkdWdVozUm9LU0I3WEc1Y2RGeDBYSFJjZEdWMlpXNTBMbkJ5WlhabGJuUkVaV1poZFd4MEtDazdYRzVjZEZ4MFhIUjlYRzVjZEZ4MGZUdGNibHh1WEhSY2RIWmhjaUJvVkc5dmJHSmhja0Z1WkZCdmNHOTJaWEpEYkdsamF5QTlJR1oxYm1OMGFXOXVJQ2hsZG1WdWRDa2dlMXh1WEhSY2RGeDBkbUZ5SUNSaWRHNGdQU0FrS0dWMlpXNTBMblJoY21kbGRDa3VZMnh2YzJWemRDZ25XMlJoZEdFdFpYWmxiblJkSnlrN1hHNWNibHgwWEhSY2RHbG1JQ2drWW5SdUxteGxibWQwYUNrZ2UxeHVYSFJjZEZ4MFhIUjJZWElnWlhabGJuUk9ZVzFsSUQwZ0pHSjBiaTVoZEhSeUtDZGtZWFJoTFdWMlpXNTBKeWtzWEc1Y2RGeDBYSFJjZEZ4MGRtRnNkV1VnUFNBa1luUnVMbUYwZEhJb0oyUmhkR0V0ZG1Gc2RXVW5LU3hjYmx4MFhIUmNkRngwWEhSb2FXUmxJRDBnSkdKMGJpNWhkSFJ5S0Nka1lYUmhMV2hwWkdVbktUdGNibHh1WEhSY2RGeDBYSFIyWVhJZ2JHRjViM1YwU1c1bWJ5QTlJR1J2YlM1dFlXdGxUR0Y1YjNWMFNXNW1ieWhsZG1WdWRDNTBZWEpuWlhRcE8xeHVYRzVjZEZ4MFhIUmNkQzh2SUdKbFptOXlaU0JqYjIxdFlXNWtPaUJrWlhSbFkzUWdZMjl1ZEhKdmJDQnpaV3hsWTNScGIyNGdaV3hsYldWdWRDZ2tkR0Z5WjJWMEtWeHVYSFJjZEZ4MFhIUjJZWElnSkhSaGNtZGxkRHRjYmx4MFhIUmNkRngwYVdZZ0tDUXVhVzVCY25KaGVTaGxkbVZ1ZEU1aGJXVXNJRnNuY21WemFYcGxKeXdnSjJac2IyRjBUV1VuTENBbmNtVnRiM1psVFdWa2FXRW5MQ0FuYVcxaFoyVlRhR0Z3WlNkZEtTQWhQVDBnTFRFcElIdGNibHgwWEhSY2RGeDBYSFIyWVhJZ0pITmxiR1ZqZEdsdmJpQTlJR3hoZVc5MWRFbHVabTh1YUdGdVpHeGxLQ2t1Wm1sdVpDZ25MbTV2ZEdVdFkyOXVkSEp2YkMxelpXeGxZM1JwYjI0bktUdGNibHgwWEhSY2RGeDBYSFFrZEdGeVoyVjBJRDBnSkNna2MyVnNaV04wYVc5dUxtUmhkR0VvSjNSaGNtZGxkQ2NwS1R0Y2JseDBYSFJjZEZ4MGZWeHVYRzVjZEZ4MFhIUmNkQzh2SUVsbUlISmxjWFZsYzNSbFpDd2dhR2xrWlNCMGFHVWdjRzl3YjNabGNpQjNhR1Z1SUhSb1pTQmlkWFIwYjI0Z2FYTWdZMnhwWTJ0bFpDNWNibHgwWEhSY2RGeDBMeThnVlhObFpuVnNJR1p2Y2lCMGFHbHVaM01nYkdsclpTQnphRzkzU0dWc2NFUnBZV3h2Wnk1Y2JseDBYSFJjZEZ4MGFXWWdLR2hwWkdVcElIdGNibHgwWEhSY2RGeDBYSFFrWW5SdUxuQmhjbVZ1ZEhNb0p5NXdiM0J2ZG1WeUp5a3VhR2xrWlNncE8xeHVYSFJjZEZ4MFhIUjlYRzVjYmx4MFhIUmNkRngwYVdZZ0tDUXVhWE5HZFc1amRHbHZiaWdrTG5OMWJXMWxjbTV2ZEdVdWNHeDFaMmx1UlhabGJuUnpXMlYyWlc1MFRtRnRaVjBwS1NCN1hHNWNkRngwWEhSY2RGeDBKQzV6ZFcxdFpYSnViM1JsTG5Cc2RXZHBia1YyWlc1MGMxdGxkbVZ1ZEU1aGJXVmRLR1YyWlc1MExDQnRiMlIxYkdWekxtVmthWFJ2Y2l3Z2JHRjViM1YwU1c1bWJ5d2dkbUZzZFdVcE8xeHVYSFJjZEZ4MFhIUjlJR1ZzYzJVZ2FXWWdLRzF2WkhWc1pYTXVaV1JwZEc5eVcyVjJaVzUwVG1GdFpWMHBJSHNnTHk4Z2IyNGdZMjl0YldGdVpGeHVYSFJjZEZ4MFhIUmNkSFpoY2lBa1pXUnBkR0ZpYkdVZ1BTQnNZWGx2ZFhSSmJtWnZMbVZrYVhSaFlteGxLQ2s3WEc1Y2RGeDBYSFJjZEZ4MEpHVmthWFJoWW14bExtWnZZM1Z6S0NrN1hHNWNkRngwWEhSY2RGeDBiVzlrZFd4bGN5NWxaR2wwYjNKYlpYWmxiblJPWVcxbFhTZ2taV1JwZEdGaWJHVXNJSFpoYkhWbExDQWtkR0Z5WjJWMEtUdGNibHgwWEhSY2RGeDBYSFJsZG1WdWRDNXdjbVYyWlc1MFJHVm1ZWFZzZENncE8xeHVYSFJjZEZ4MFhIUjlJR1ZzYzJVZ2FXWWdLR052YlcxaGJtUnpXMlYyWlc1MFRtRnRaVjBwSUh0Y2JseDBYSFJjZEZ4MFhIUmpiMjF0WVc1a2MxdGxkbVZ1ZEU1aGJXVmRMbU5oYkd3b2RHaHBjeXdnYkdGNWIzVjBTVzVtYnlrN1hHNWNkRngwWEhSY2RGeDBaWFpsYm5RdWNISmxkbVZ1ZEVSbFptRjFiSFFvS1R0Y2JseDBYSFJjZEZ4MGZWeHVYRzVjZEZ4MFhIUmNkQzh2SUdGbWRHVnlJR052YlcxaGJtUmNibHgwWEhSY2RGeDBhV1lnS0NRdWFXNUJjbkpoZVNobGRtVnVkRTVoYldVc0lGc25ZbUZqYTBOdmJHOXlKeXdnSjJadmNtVkRiMnh2Y2lkZEtTQWhQVDBnTFRFcElIdGNibHgwWEhSY2RGeDBYSFIyWVhJZ2IzQjBhVzl1Y3lBOUlHeGhlVzkxZEVsdVptOHVaV1JwZEc5eUtDa3VaR0YwWVNnbmIzQjBhVzl1Y3ljc0lHOXdkR2x2Ym5NcE8xeHVYSFJjZEZ4MFhIUmNkSFpoY2lCdGIyUjFiR1VnUFNCdmNIUnBiMjV6TG1GcGNrMXZaR1VnUHlCdGIyUjFiR1Z6TG5CdmNHOTJaWElnT2lCdGIyUjFiR1Z6TG5SdmIyeGlZWEk3WEc1Y2RGeDBYSFJjZEZ4MGJXOWtkV3hsTG5Wd1pHRjBaVkpsWTJWdWRFTnZiRzl5S0d4cGMzUXVhR1ZoWkNna1luUnVLU3dnWlhabGJuUk9ZVzFsTENCMllXeDFaU2s3WEc1Y2RGeDBYSFJjZEgxY2JseHVYSFJjZEZ4MFhIUm9WRzl2YkdKaGNrRnVaRkJ2Y0c5MlpYSlZjR1JoZEdVb1pYWmxiblFwTzF4dVhIUmNkRngwZlZ4dVhIUmNkSDA3WEc1Y2JseDBYSFIyWVhJZ1VGaGZVRVZTWDBWTklEMGdNVGc3WEc1Y2RGeDBkbUZ5SUdoRWFXMWxibk5wYjI1UWFXTnJaWEpOYjNabElEMGdablZ1WTNScGIyNGdLR1YyWlc1MExDQnZjSFJwYjI1ektTQjdYRzVjZEZ4MFhIUjJZWElnSkhCcFkydGxjaUE5SUNRb1pYWmxiblF1ZEdGeVoyVjBMbkJoY21WdWRFNXZaR1VwT3lBdkx5QjBZWEpuWlhRZ2FYTWdiVzkxYzJWallYUmphR1Z5WEc1Y2RGeDBYSFIyWVhJZ0pHUnBiV1Z1YzJsdmJrUnBjM0JzWVhrZ1BTQWtjR2xqYTJWeUxtNWxlSFFvS1R0Y2JseDBYSFJjZEhaaGNpQWtZMkYwWTJobGNpQTlJQ1J3YVdOclpYSXVabWx1WkNnbkxtNXZkR1V0WkdsdFpXNXphVzl1TFhCcFkydGxjaTF0YjNWelpXTmhkR05vWlhJbktUdGNibHgwWEhSY2RIWmhjaUFrYUdsbmFHeHBaMmgwWldRZ1BTQWtjR2xqYTJWeUxtWnBibVFvSnk1dWIzUmxMV1JwYldWdWMybHZiaTF3YVdOclpYSXRhR2xuYUd4cFoyaDBaV1FuS1R0Y2JseDBYSFJjZEhaaGNpQWtkVzVvYVdkb2JHbG5hSFJsWkNBOUlDUndhV05yWlhJdVptbHVaQ2duTG01dmRHVXRaR2x0Wlc1emFXOXVMWEJwWTJ0bGNpMTFibWhwWjJoc2FXZG9kR1ZrSnlrN1hHNWNibHgwWEhSY2RIWmhjaUJ3YjNOUFptWnpaWFE3WEc1Y2RGeDBYSFF2THlCSVZFMU1OU0IzYVhSb0lHcFJkV1Z5ZVNBdElHVXViMlptYzJWMFdDQnBjeUIxYm1SbFptbHVaV1FnYVc0Z1JtbHlaV1p2ZUZ4dVhIUmNkRngwYVdZZ0tHVjJaVzUwTG05bVpuTmxkRmdnUFQwOUlIVnVaR1ZtYVc1bFpDa2dlMXh1WEhSY2RGeDBYSFIyWVhJZ2NHOXpRMkYwWTJobGNpQTlJQ1FvWlhabGJuUXVkR0Z5WjJWMEtTNXZabVp6WlhRb0tUdGNibHgwWEhSY2RGeDBjRzl6VDJabWMyVjBJRDBnZTF4dVhIUmNkRngwWEhSY2RIZzZJR1YyWlc1MExuQmhaMlZZSUMwZ2NHOXpRMkYwWTJobGNpNXNaV1owTEZ4dVhIUmNkRngwWEhSY2RIazZJR1YyWlc1MExuQmhaMlZaSUMwZ2NHOXpRMkYwWTJobGNpNTBiM0JjYmx4MFhIUmNkRngwZlR0Y2JseDBYSFJjZEgwZ1pXeHpaU0I3WEc1Y2RGeDBYSFJjZEhCdmMwOW1abk5sZENBOUlIdGNibHgwWEhSY2RGeDBYSFI0T2lCbGRtVnVkQzV2Wm1aelpYUllMRnh1WEhSY2RGeDBYSFJjZEhrNklHVjJaVzUwTG05bVpuTmxkRmxjYmx4MFhIUmNkRngwZlR0Y2JseDBYSFJjZEgxY2JseHVYSFJjZEZ4MGRtRnlJR1JwYlNBOUlIdGNibHgwWEhSY2RGeDBZem9nVFdGMGFDNWpaV2xzS0hCdmMwOW1abk5sZEM1NElDOGdVRmhmVUVWU1gwVk5LU0I4ZkNBeExGeHVYSFJjZEZ4MFhIUnlPaUJOWVhSb0xtTmxhV3dvY0c5elQyWm1jMlYwTG5rZ0x5QlFXRjlRUlZKZlJVMHBJSHg4SURGY2JseDBYSFJjZEgwN1hHNWNibHgwWEhSY2RDUm9hV2RvYkdsbmFIUmxaQzVqYzNNb2V5QjNhV1IwYURvZ1pHbHRMbU1nS3lBblpXMG5MQ0JvWldsbmFIUTZJR1JwYlM1eUlDc2dKMlZ0SnlCOUtUdGNibHgwWEhSY2RDUmpZWFJqYUdWeUxtRjBkSElvSjJSaGRHRXRkbUZzZFdVbkxDQmthVzB1WXlBcklDZDRKeUFySUdScGJTNXlLVHRjYmx4dVhIUmNkRngwYVdZZ0tETWdQQ0JrYVcwdVl5QW1KaUJrYVcwdVl5QThJRzl3ZEdsdmJuTXVhVzV6WlhKMFZHRmliR1ZOWVhoVGFYcGxMbU52YkNrZ2UxeHVYSFJjZEZ4MFhIUWtkVzVvYVdkb2JHbG5hSFJsWkM1amMzTW9leUIzYVdSMGFEb2daR2x0TG1NZ0t5QXhJQ3NnSjJWdEp5QjlLVHRjYmx4MFhIUmNkSDFjYmx4dVhIUmNkRngwYVdZZ0tETWdQQ0JrYVcwdWNpQW1KaUJrYVcwdWNpQThJRzl3ZEdsdmJuTXVhVzV6WlhKMFZHRmliR1ZOWVhoVGFYcGxMbkp2ZHlrZ2UxeHVYSFJjZEZ4MFhIUWtkVzVvYVdkb2JHbG5hSFJsWkM1amMzTW9leUJvWldsbmFIUTZJR1JwYlM1eUlDc2dNU0FySUNkbGJTY2dmU2s3WEc1Y2RGeDBYSFI5WEc1Y2JseDBYSFJjZENSa2FXMWxibk5wYjI1RWFYTndiR0Y1TG1oMGJXd29aR2x0TG1NZ0t5QW5JSGdnSnlBcklHUnBiUzV5S1R0Y2JseDBYSFI5TzF4dVhHNWNkRngwZG1GeUlHSnBibVJEZFhOMGIyMUZkbVZ1ZENBOUlHWjFibU4wYVc5dUlDZ2thRzlzWkdWeUxDQmxkbVZ1ZEU1aGJXVXBJSHRjYmx4MFhIUmNkSEpsZEhWeWJpQm1kVzVqZEdsdmJpQW9LU0I3WEc1Y2RGeDBYSFJjZEhKbGRIVnliaUFrYUc5c1pHVnlMblJ5YVdkblpYSW9KM04xYlcxbGNtNXZkR1V1SnlBcklHVjJaVzUwVG1GdFpTd2dZWEpuZFcxbGJuUnpLVHRjYmx4MFhIUmNkSDA3WEc1Y2RGeDBmVHRjYmx4dVhIUmNkQzhxS2x4dVhIUmNkQ0FxSUdKcGJtUWdTMlY1VFdGd0lHOXVJR3RsZVdSdmQyNWNibHgwWEhRZ0tseHVYSFJjZENBcUlFQndZWEpoYlNCN1QySnFaV04wZlNCc1lYbHZkWFJKYm1adlhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0UFltcGxZM1I5SUd0bGVVMWhjRnh1WEhSY2RDQXFMMXh1WEhSY2RIUm9hWE11WW1sdVpFdGxlVTFoY0NBOUlHWjFibU4wYVc5dUlDaHNZWGx2ZFhSSmJtWnZMQ0JyWlhsTllYQXBJSHRjYmx4MFhIUmNkSFpoY2lBa1pXUnBkRzl5SUQwZ2JHRjViM1YwU1c1bWJ5NWxaR2wwYjNJb0tUdGNibHgwWEhSY2RIWmhjaUFrWldScGRHRmliR1VnUFNCc1lYbHZkWFJKYm1adkxtVmthWFJoWW14bEtDazdYRzVjYmx4MFhIUmNkQ1JsWkdsMFlXSnNaUzV2YmlnbmEyVjVaRzkzYmljc0lHWjFibU4wYVc5dUlDaGxkbVZ1ZENrZ2UxeHVYSFJjZEZ4MFhIUjJZWElnYTJWNWN5QTlJRnRkTzF4dVhHNWNkRngwWEhSY2RDOHZJRzF2WkdsbWFXVnlYRzVjZEZ4MFhIUmNkR2xtSUNobGRtVnVkQzV0WlhSaFMyVjVLU0I3SUd0bGVYTXVjSFZ6YUNnblEwMUVKeWs3SUgxY2JseDBYSFJjZEZ4MGFXWWdLR1YyWlc1MExtTjBjbXhMWlhrZ0ppWWdJV1YyWlc1MExtRnNkRXRsZVNrZ2V5QnJaWGx6TG5CMWMyZ29KME5VVWt3bktUc2dmVnh1WEhSY2RGeDBYSFJwWmlBb1pYWmxiblF1YzJocFpuUkxaWGtwSUhzZ2EyVjVjeTV3ZFhOb0tDZFRTRWxHVkNjcE95QjlYRzVjYmx4MFhIUmNkRngwTHk4Z2EyVjVZMjlrWlZ4dVhIUmNkRngwWEhSMllYSWdhMlY1VG1GdFpTQTlJR3RsZVM1dVlXMWxSbkp2YlVOdlpHVmJaWFpsYm5RdWEyVjVRMjlrWlYwN1hHNWNkRngwWEhSY2RHbG1JQ2hyWlhsT1lXMWxLU0I3WEc1Y2RGeDBYSFJjZEZ4MGEyVjVjeTV3ZFhOb0tHdGxlVTVoYldVcE8xeHVYSFJjZEZ4MFhIUjlYRzVjYmx4MFhIUmNkRngwZG1GeUlHVjJaVzUwVG1GdFpTQTlJR3RsZVUxaGNGdHJaWGx6TG1wdmFXNG9KeXNuS1YwN1hHNWNkRngwWEhSY2RHbG1JQ2hsZG1WdWRFNWhiV1VwSUh0Y2JseDBYSFJjZEZ4MFhIUnBaaUFvSkM1emRXMXRaWEp1YjNSbExuQnNkV2RwYmtWMlpXNTBjMXRsZG1WdWRFNWhiV1ZkS1NCN1hHNWNkRngwWEhSY2RGeDBYSFIyWVhJZ2NHeDFaMmx1SUQwZ0pDNXpkVzF0WlhKdWIzUmxMbkJzZFdkcGJrVjJaVzUwYzF0bGRtVnVkRTVoYldWZE8xeHVYSFJjZEZ4MFhIUmNkRngwYVdZZ0tDUXVhWE5HZFc1amRHbHZiaWh3YkhWbmFXNHBLU0I3WEc1Y2RGeDBYSFJjZEZ4MFhIUmNkSEJzZFdkcGJpaGxkbVZ1ZEN3Z2JXOWtkV3hsY3k1bFpHbDBiM0lzSUd4aGVXOTFkRWx1Wm04cE8xeHVYSFJjZEZ4MFhIUmNkRngwZlZ4dVhIUmNkRngwWEhSY2RIMGdaV3h6WlNCcFppQW9iVzlrZFd4bGN5NWxaR2wwYjNKYlpYWmxiblJPWVcxbFhTa2dlMXh1WEhSY2RGeDBYSFJjZEZ4MGJXOWtkV3hsY3k1bFpHbDBiM0piWlhabGJuUk9ZVzFsWFNna1pXUnBkR0ZpYkdVc0lDUmxaR2wwYjNJdVpHRjBZU2duYjNCMGFXOXVjeWNwS1R0Y2JseDBYSFJjZEZ4MFhIUmNkR1YyWlc1MExuQnlaWFpsYm5SRVpXWmhkV3gwS0NrN1hHNWNkRngwWEhSY2RGeDBmU0JsYkhObElHbG1JQ2hqYjIxdFlXNWtjMXRsZG1WdWRFNWhiV1ZkS1NCN1hHNWNkRngwWEhSY2RGeDBYSFJqYjIxdFlXNWtjMXRsZG1WdWRFNWhiV1ZkTG1OaGJHd29kR2hwY3l3Z2JHRjViM1YwU1c1bWJ5azdYRzVjZEZ4MFhIUmNkRngwWEhSbGRtVnVkQzV3Y21WMlpXNTBSR1ZtWVhWc2RDZ3BPMXh1WEhSY2RGeDBYSFJjZEgxY2JseDBYSFJjZEZ4MGZTQmxiSE5sSUdsbUlDaHJaWGt1YVhORlpHbDBLR1YyWlc1MExtdGxlVU52WkdVcEtTQjdYRzVjZEZ4MFhIUmNkRngwYlc5a2RXeGxjeTVsWkdsMGIzSXVZV1owWlhKRGIyMXRZVzVrS0NSbFpHbDBZV0pzWlNrN1hHNWNkRngwWEhSY2RIMWNibHgwWEhSY2RIMHBPMXh1WEhSY2RIMDdYRzVjYmx4MFhIUXZLaXBjYmx4MFhIUWdLaUJoZEhSaFkyZ2daWFpsYm5Sb1lXNWtiR1Z5WEc1Y2RGeDBJQ3BjYmx4MFhIUWdLaUJBY0dGeVlXMGdlMDlpYW1WamRIMGdiR0Y1YjNWMFNXNW1ieUF0SUd4aGVXOTFkQ0JKYm1admNtMWhkR2x2Ym5OY2JseDBYSFFnS2lCQWNHRnlZVzBnZTA5aWFtVmpkSDBnYjNCMGFXOXVjeUF0SUhWelpYSWdiM0IwYVc5dWN5QnBibU5zZFdSbElHTjFjM1J2YlNCbGRtVnVkQ0JvWVc1a2JHVnljMXh1WEhSY2RDQXFJRUJ3WVhKaGJTQjdablZ1WTNScGIyNG9aWFpsYm5RcGZTQmJiM0IwYVc5dWN5NXZibVZ1ZEdWeVhTQXRJR1Z1ZEdWeUlHdGxlU0JvWVc1a2JHVnlYRzVjZEZ4MElDb2dRSEJoY21GdElIdG1kVzVqZEdsdmJpaGxkbVZ1ZENsOUlGdHZjSFJwYjI1ekxtOXVabTlqZFhOZFhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0bWRXNWpkR2x2YmlobGRtVnVkQ2w5SUZ0dmNIUnBiMjV6TG05dVlteDFjbDFjYmx4MFhIUWdLaUJBY0dGeVlXMGdlMloxYm1OMGFXOXVLR1YyWlc1MEtYMGdXMjl3ZEdsdmJuTXViMjVyWlhsMWNGMWNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UyWjFibU4wYVc5dUtHVjJaVzUwS1gwZ1cyOXdkR2x2Ym5NdWIyNXJaWGxrYjNkdVhWeHVYSFJjZENBcUlFQndZWEpoYlNCN1puVnVZM1JwYjI0b1pYWmxiblFwZlNCYmIzQjBhVzl1Y3k1dmJuQmhjM1JsWFZ4dVhIUmNkQ0FxSUVCd1lYSmhiU0I3Wm5WdVkzUnBiMjRvWlhabGJuUXBmU0JiYjNCMGFXOXVjeTV2YmxSdmIyeENZWEpqYkdsamExMWNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UyWjFibU4wYVc5dUtHVjJaVzUwS1gwZ1cyOXdkR2x2Ym5NdWIyNURhR0Z1WjJWZFhHNWNkRngwSUNvdlhHNWNkRngwZEdocGN5NWhkSFJoWTJnZ1BTQm1kVzVqZEdsdmJpQW9iR0Y1YjNWMFNXNW1ieXdnYjNCMGFXOXVjeWtnZTF4dVhIUmNkRngwTHk4Z2FHRnVaR3hsY25NZ1ptOXlJR1ZrYVhSaFlteGxYRzVjZEZ4MFhIUnBaaUFvYjNCMGFXOXVjeTV6YUc5eWRHTjFkSE1wSUh0Y2JseDBYSFJjZEZ4MGRHaHBjeTVpYVc1a1MyVjVUV0Z3S0d4aGVXOTFkRWx1Wm04c0lHOXdkR2x2Ym5NdWEyVjVUV0Z3VzJGblpXNTBMbWx6VFdGaklEOGdKMjFoWXljZ09pQW5jR01uWFNrN1hHNWNkRngwWEhSOVhHNWNkRngwWEhSc1lYbHZkWFJKYm1adkxtVmthWFJoWW14bEtDa3ViMjRvSjIxdmRYTmxaRzkzYmljc0lHaE5iM1Z6WldSdmQyNHBPMXh1WEhSY2RGeDBiR0Y1YjNWMFNXNW1ieTVsWkdsMFlXSnNaU2dwTG05dUtDZHJaWGwxY0NCdGIzVnpaWFZ3Snl3Z2FGUnZiMnhpWVhKQmJtUlFiM0J2ZG1WeVZYQmtZWFJsS1R0Y2JseDBYSFJjZEd4aGVXOTFkRWx1Wm04dVpXUnBkR0ZpYkdVb0tTNXZiaWduYzJOeWIyeHNKeXdnYUZOamNtOXNiQ2s3WEc1Y2RGeDBYSFJ0YjJSMWJHVnpMbU5zYVhCaWIyRnlaQzVoZEhSaFkyZ29iR0Y1YjNWMFNXNW1ieXdnYjNCMGFXOXVjeWs3WEc1Y2JseDBYSFJjZEM4dklHaGhibVJzWlhJZ1ptOXlJR2hoYm1Sc1pTQmhibVFnY0c5d2IzWmxjbHh1WEhSY2RGeDBiVzlrZFd4bGN5NW9ZVzVrYkdVdVlYUjBZV05vS0d4aGVXOTFkRWx1Wm04c0lHOXdkR2x2Ym5NcE8xeHVYSFJjZEZ4MGJHRjViM1YwU1c1bWJ5NXdiM0J2ZG1WeUtDa3ViMjRvSjJOc2FXTnJKeXdnYUZSdmIyeGlZWEpCYm1SUWIzQnZkbVZ5UTJ4cFkyc3BPMXh1WEhSY2RGeDBiR0Y1YjNWMFNXNW1ieTV3YjNCdmRtVnlLQ2t1YjI0b0oyMXZkWE5sWkc5M2JpY3NJR2hVYjI5c1ltRnlRVzVrVUc5d2IzWmxjazF2ZFhObFpHOTNiaWs3WEc1Y2JseDBYSFJjZEM4dklHaGhibVJzWlhJZ1ptOXlJR1J5WVdjZ1lXNWtJR1J5YjNCY2JseDBYSFJjZEcxdlpIVnNaWE11WkhKaFowRnVaRVJ5YjNBdVlYUjBZV05vS0d4aGVXOTFkRWx1Wm04c0lHOXdkR2x2Ym5NcE8xeHVYRzVjZEZ4MFhIUXZMeUJvWVc1a2JHVnljeUJtYjNJZ1puSmhiV1VnYlc5a1pTQW9kRzl2YkdKaGNpd2djM1JoZEhWelltRnlLVnh1WEhSY2RGeDBhV1lnS0NGdmNIUnBiMjV6TG1GcGNrMXZaR1VwSUh0Y2JseDBYSFJjZEZ4MEx5OGdhR0Z1Wkd4bGNpQm1iM0lnZEc5dmJHSmhjbHh1WEhSY2RGeDBYSFJzWVhsdmRYUkpibVp2TG5SdmIyeGlZWElvS1M1dmJpZ25ZMnhwWTJzbkxDQm9WRzl2YkdKaGNrRnVaRkJ2Y0c5MlpYSkRiR2xqYXlrN1hHNWNkRngwWEhSY2RHeGhlVzkxZEVsdVptOHVkRzl2YkdKaGNpZ3BMbTl1S0NkdGIzVnpaV1J2ZDI0bkxDQm9WRzl2YkdKaGNrRnVaRkJ2Y0c5MlpYSk5iM1Z6WldSdmQyNHBPMXh1WEc1Y2RGeDBYSFJjZEM4dklHaGhibVJzWlhJZ1ptOXlJSE4wWVhSMWMySmhjbHh1WEhSY2RGeDBYSFJ0YjJSMWJHVnpMbk4wWVhSMWMySmhjaTVoZEhSaFkyZ29iR0Y1YjNWMFNXNW1ieXdnYjNCMGFXOXVjeWs3WEc1Y2RGeDBYSFI5WEc1Y2JseDBYSFJjZEM4dklHaGhibVJzWlhJZ1ptOXlJSFJoWW14bElHUnBiV1Z1YzJsdmJseHVYSFJjZEZ4MGRtRnlJQ1JqWVhSamFHVnlRMjl1ZEdGcGJtVnlJRDBnYjNCMGFXOXVjeTVoYVhKTmIyUmxJRDhnYkdGNWIzVjBTVzVtYnk1d2IzQnZkbVZ5S0NrZ09seHVYSFJjZEZ4MFhIUmNkRngwWEhSY2RGeDBYSFJjZEZ4MFhIUWdJR3hoZVc5MWRFbHVabTh1ZEc5dmJHSmhjaWdwTzF4dVhIUmNkRngwZG1GeUlDUmpZWFJqYUdWeUlEMGdKR05oZEdOb1pYSkRiMjUwWVdsdVpYSXVabWx1WkNnbkxtNXZkR1V0WkdsdFpXNXphVzl1TFhCcFkydGxjaTF0YjNWelpXTmhkR05vWlhJbktUdGNibHgwWEhSY2RDUmpZWFJqYUdWeUxtTnpjeWg3WEc1Y2RGeDBYSFJjZEhkcFpIUm9PaUJ2Y0hScGIyNXpMbWx1YzJWeWRGUmhZbXhsVFdGNFUybDZaUzVqYjJ3Z0t5QW5aVzBuTEZ4dVhIUmNkRngwWEhSb1pXbG5hSFE2SUc5d2RHbHZibk11YVc1elpYSjBWR0ZpYkdWTllYaFRhWHBsTG5KdmR5QXJJQ2RsYlNkY2JseDBYSFJjZEgwcExtOXVLQ2R0YjNWelpXMXZkbVVuTENCbWRXNWpkR2x2YmlBb1pYWmxiblFwSUh0Y2JseDBYSFJjZEZ4MGFFUnBiV1Z1YzJsdmJsQnBZMnRsY2sxdmRtVW9aWFpsYm5Rc0lHOXdkR2x2Ym5NcE8xeHVYSFJjZEZ4MGZTazdYRzVjYmx4MFhIUmNkQzh2SUhOaGRtVWdiM0IwYVc5dWN5QnZiaUJsWkdsMGIzSmNibHgwWEhSY2RHeGhlVzkxZEVsdVptOHVaV1JwZEc5eUtDa3VaR0YwWVNnbmIzQjBhVzl1Y3ljc0lHOXdkR2x2Ym5NcE8xeHVYRzVjZEZ4MFhIUXZMeUJ5WlhRZ2MzUjViR1ZYYVhSb1ExTlRJR1p2Y2lCaVlXTnJRMjlzYjNJZ0x5Qm1iM0psUTI5c2IzSWdZMnhsWVhKcGJtY2dkMmwwYUNBbmFXNW9aWEpwZENjdVhHNWNkRngwWEhScFppQW9JV0ZuWlc1MExtbHpUVk5KUlNrZ2UxeHVYSFJjZEZ4MFhIUXZMeUJ3Y205MFpXTjBJRVpHSUVWeWNtOXlPaUJPVTE5RlVsSlBVbDlHUVVsTVZWSkZPaUJHWVdsc2RYSmxYRzVjZEZ4MFhIUmNkSE5sZEZScGJXVnZkWFFvWm5WdVkzUnBiMjRnS0NrZ2UxeHVYSFJjZEZ4MFhIUmNkR1J2WTNWdFpXNTBMbVY0WldORGIyMXRZVzVrS0NkemRIbHNaVmRwZEdoRFUxTW5MQ0F3TENCdmNIUnBiMjV6TG5OMGVXeGxWMmwwYUZOd1lXNHBPMXh1WEhSY2RGeDBYSFI5TENBd0tUdGNibHgwWEhSY2RIMWNibHh1WEhSY2RGeDBMeThnU0dsemRHOXllVnh1WEhSY2RGeDBkbUZ5SUdocGMzUnZjbmtnUFNCdVpYY2dTR2x6ZEc5eWVTaHNZWGx2ZFhSSmJtWnZMbVZrYVhSaFlteGxLQ2twTzF4dVhIUmNkRngwYkdGNWIzVjBTVzVtYnk1bFpHbDBZV0pzWlNncExtUmhkR0VvSjA1dmRHVklhWE4wYjNKNUp5d2dhR2x6ZEc5eWVTazdYRzVjYmx4MFhIUmNkQzh2SUdKaGMybGpJR1YyWlc1MElHTmhiR3hpWVdOcmN5QW9iRzkzWlhKallYTmxLVnh1WEhSY2RGeDBMeThnWlc1MFpYSXNJR1p2WTNWekxDQmliSFZ5TENCclpYbDFjQ3dnYTJWNVpHOTNibHh1WEhSY2RGeDBhV1lnS0c5d2RHbHZibk11YjI1bGJuUmxjaWtnZTF4dVhIUmNkRngwWEhSc1lYbHZkWFJKYm1adkxtVmthWFJoWW14bEtDa3VhMlY1Y0hKbGMzTW9ablZ1WTNScGIyNGdLR1YyWlc1MEtTQjdYRzVjZEZ4MFhIUmNkRngwYVdZZ0tHVjJaVzUwTG10bGVVTnZaR1VnUFQwOUlHdGxlUzVGVGxSRlVpa2dleUJ2Y0hScGIyNXpMbTl1Wlc1MFpYSW9aWFpsYm5RcE95QjlYRzVjZEZ4MFhIUmNkSDBwTzF4dVhIUmNkRngwZlZ4dVhHNWNkRngwWEhScFppQW9iM0IwYVc5dWN5NXZibVp2WTNWektTQjdJR3hoZVc5MWRFbHVabTh1WldScGRHRmliR1VvS1M1bWIyTjFjeWh2Y0hScGIyNXpMbTl1Wm05amRYTXBPeUI5WEc1Y2RGeDBYSFJwWmlBb2IzQjBhVzl1Y3k1dmJtSnNkWElwSUhzZ2JHRjViM1YwU1c1bWJ5NWxaR2wwWVdKc1pTZ3BMbUpzZFhJb2IzQjBhVzl1Y3k1dmJtSnNkWElwT3lCOVhHNWNkRngwWEhScFppQW9iM0IwYVc5dWN5NXZibXRsZVhWd0tTQjdJR3hoZVc5MWRFbHVabTh1WldScGRHRmliR1VvS1M1clpYbDFjQ2h2Y0hScGIyNXpMbTl1YTJWNWRYQXBPeUI5WEc1Y2RGeDBYSFJwWmlBb2IzQjBhVzl1Y3k1dmJtdGxlV1J2ZDI0cElIc2diR0Y1YjNWMFNXNW1ieTVsWkdsMFlXSnNaU2dwTG10bGVXUnZkMjRvYjNCMGFXOXVjeTV2Ym10bGVXUnZkMjRwT3lCOVhHNWNkRngwWEhScFppQW9iM0IwYVc5dWN5NXZibkJoYzNSbEtTQjdJR3hoZVc5MWRFbHVabTh1WldScGRHRmliR1VvS1M1dmJpZ25jR0Z6ZEdVbkxDQnZjSFJwYjI1ekxtOXVjR0Z6ZEdVcE95QjlYRzVjYmx4MFhIUmNkQzh2SUdOaGJHeGlZV05yY3lCbWIzSWdZV1IyWVc1alpXUWdabVZoZEhWeVpYTWdLR05oYldWc0tWeHVYRzVjZEZ4MFhIUXZMeUJ2YmxSdmIyeGlZWEpEYkdsamExeHVYSFJjZEZ4MGFXWWdLRzl3ZEdsdmJuTXViMjVVYjI5c1ltRnlRMnhwWTJzcElIdGNibHgwWEhSY2RGeDBiR0Y1YjNWMFNXNW1ieTUwYjI5c1ltRnlLQ2t1WTJ4cFkyc29iM0IwYVc5dWN5NXZibFJ2YjJ4aVlYSkRiR2xqYXlrN1hHNWNkRngwWEhSOVhHNWNibHgwWEhSY2RDOHZJRzl1UTJoaGJtZGxYRzVjZEZ4MFhIUnBaaUFvYjNCMGFXOXVjeTV2YmtOb1lXNW5aU2tnZTF4dVhIUmNkRngwWEhSMllYSWdhRU5vWVc1blpTQTlJR1oxYm1OMGFXOXVJQ2dwSUh0Y2JseDBYSFJjZEZ4MFhIUnRiMlIxYkdWekxtVmthWFJ2Y2k1MGNtbG5aMlZ5VDI1RGFHRnVaMlVvYkdGNWIzVjBTVzVtYnk1bFpHbDBZV0pzWlNncEtUdGNibHgwWEhSY2RGeDBmVHRjYmx4dVhIUmNkRngwWEhScFppQW9ZV2RsYm5RdWFYTk5VMGxGS1NCN1hHNWNkRngwWEhSY2RGeDBkbUZ5SUhORWIyMUZkbVZ1ZEhNZ1BTQW5SRTlOUTJoaGNtRmpkR1Z5UkdGMFlVMXZaR2xtYVdWa0lFUlBUVk4xWW5SeVpXVk5iMlJwWm1sbFpDQkVUMDFPYjJSbFNXNXpaWEowWldRbk8xeHVYSFJjZEZ4MFhIUmNkR3hoZVc5MWRFbHVabTh1WldScGRHRmliR1VvS1M1dmJpaHpSRzl0UlhabGJuUnpMQ0JvUTJoaGJtZGxLVHRjYmx4MFhIUmNkRngwZlNCbGJITmxJSHRjYmx4MFhIUmNkRngwWEhSc1lYbHZkWFJKYm1adkxtVmthWFJoWW14bEtDa3ViMjRvSjJsdWNIVjBKeXdnYUVOb1lXNW5aU2s3WEc1Y2RGeDBYSFJjZEgxY2JseDBYSFJjZEgxY2JseHVYSFJjZEZ4MEx5OGdRV3hzSUdWa2FYUnZjaUJ6ZEdGMGRYTWdkMmxzYkNCaVpTQnpZWFpsWkNCdmJpQmxaR2wwWVdKc1pTQjNhWFJvSUdweGRXVnllU2R6SUdSaGRHRmNibHgwWEhSY2RDOHZJR1p2Y2lCemRYQndiM0owSUcxMWJIUnBjR3hsSUdWa2FYUnZjaUIzYVhSb0lITnBibWRzWlhSdmJpQnZZbXBsWTNRdVhHNWNkRngwWEhSc1lYbHZkWFJKYm1adkxtVmthWFJoWW14bEtDa3VaR0YwWVNnblkyRnNiR0poWTJ0ekp5d2dlMXh1WEhSY2RGeDBYSFJ2YmtKbFptOXlaVU5vWVc1blpUb2diM0IwYVc5dWN5NXZia0psWm05eVpVTm9ZVzVuWlN4Y2JseDBYSFJjZEZ4MGIyNURhR0Z1WjJVNklHOXdkR2x2Ym5NdWIyNURhR0Z1WjJVc1hHNWNkRngwWEhSY2RHOXVRWFYwYjFOaGRtVTZJRzl3ZEdsdmJuTXViMjVCZFhSdlUyRjJaU3hjYmx4MFhIUmNkRngwYjI1SmJXRm5aVlZ3Ykc5aFpEb2diM0IwYVc5dWN5NXZia2x0WVdkbFZYQnNiMkZrTEZ4dVhIUmNkRngwWEhSdmJrbHRZV2RsVlhCc2IyRmtSWEp5YjNJNklHOXdkR2x2Ym5NdWIyNUpiV0ZuWlZWd2JHOWhaRVZ5Y205eUxGeHVYSFJjZEZ4MFhIUnZia1pwYkdWVmNHeHZZV1E2SUc5d2RHbHZibk11YjI1R2FXeGxWWEJzYjJGa0xGeHVYSFJjZEZ4MFhIUnZia1pwYkdWVmNHeHZZV1JGY25KdmNqb2diM0IwYVc5dWN5NXZia1pwYkdWVmNHeHZZV1FzWEc1Y2RGeDBYSFJjZEc5dVRXVmthV0ZFWld4bGRHVTZJRzl3ZEdsdmJuTXViMjVOWldScFlVUmxiR1YwWlZ4dVhIUmNkRngwZlNrN1hHNWNibHgwWEhSY2RDOHZJRlJsZUhSaGNtVmhPaUJoZFhSdklHWnBiR3hwYm1jZ2RHaGxJR052WkdVZ1ltVm1iM0psSUdadmNtMGdjM1ZpYldsMExseHVYSFJjZEZ4MGFXWWdLR1J2YlM1cGMxUmxlSFJoY21WaEtHeHBjM1F1YUdWaFpDaHNZWGx2ZFhSSmJtWnZMbWh2YkdSbGNpZ3BLU2twSUh0Y2JseDBYSFJjZEZ4MGJHRjViM1YwU1c1bWJ5NW9iMnhrWlhJb0tTNWpiRzl6WlhOMEtDZG1iM0p0SnlrdWMzVmliV2wwS0daMWJtTjBhVzl1SUNncElIdGNibHgwWEhSY2RGeDBYSFIyWVhJZ1kyOXVkR1Z1ZEhNZ1BTQnNZWGx2ZFhSSmJtWnZMbWh2YkdSbGNpZ3BMbU52WkdVb0tUdGNibHgwWEhSY2RGeDBYSFJzWVhsdmRYUkpibVp2TG1odmJHUmxjaWdwTG5aaGJDaGpiMjUwWlc1MGN5azdYRzVjYmx4MFhIUmNkRngwWEhRdkx5QmpZV3hzWW1GamF5QnZiaUJ6ZFdKdGFYUmNibHgwWEhSY2RGeDBYSFJwWmlBb2IzQjBhVzl1Y3k1dmJuTjFZbTFwZENrZ2UxeHVYSFJjZEZ4MFhIUmNkRngwYjNCMGFXOXVjeTV2Ym5OMVltMXBkQ2hqYjI1MFpXNTBjeWs3WEc1Y2RGeDBYSFJjZEZ4MGZWeHVYSFJjZEZ4MFhIUjlLVHRjYmx4MFhIUmNkSDFjYmx4MFhIUjlPMXh1WEc1Y2RGeDBMeW9xWEc1Y2RGeDBJQ29nWVhSMFlXTm9JR3B4ZFdWeWVTQmpkWE4wYjIwZ1pYWmxiblJjYmx4MFhIUWdLbHh1WEhSY2RDQXFJRUJ3WVhKaGJTQjdUMkpxWldOMGZTQnNZWGx2ZFhSSmJtWnZJQzBnYkdGNWIzVjBJRWx1Wm05eWJXRjBhVzl1YzF4dVhIUmNkQ0FxTDF4dVhIUmNkSFJvYVhNdVlYUjBZV05vUTNWemRHOXRSWFpsYm5RZ1BTQm1kVzVqZEdsdmJpQW9iR0Y1YjNWMFNXNW1ieXdnYjNCMGFXOXVjeWtnZTF4dVhIUmNkRngwZG1GeUlDUm9iMnhrWlhJZ1BTQnNZWGx2ZFhSSmJtWnZMbWh2YkdSbGNpZ3BPMXh1WEhSY2RGeDBkbUZ5SUNSbFpHbDBZV0pzWlNBOUlHeGhlVzkxZEVsdVptOHVaV1JwZEdGaWJHVW9LVHRjYmx4dVhIUmNkRngwSkdWa2FYUmhZbXhsTG05dUtDZHRiM1Z6WldSdmQyNG5MQ0JpYVc1a1EzVnpkRzl0UlhabGJuUW9KR2h2YkdSbGNpd2dKMjF2ZFhObFpHOTNiaWNwS1R0Y2JseDBYSFJjZENSbFpHbDBZV0pzWlM1dmJpZ25hMlY1ZFhBZ2JXOTFjMlYxY0Njc0lHSnBibVJEZFhOMGIyMUZkbVZ1ZENna2FHOXNaR1Z5TENBbmRYQmtZWFJsSnlrcE8xeHVYSFJjZEZ4MEpHVmthWFJoWW14bExtOXVLQ2R6WTNKdmJHd25MQ0JpYVc1a1EzVnpkRzl0UlhabGJuUW9KR2h2YkdSbGNpd2dKM05qY205c2JDY3BLVHRjYmx4dVhIUmNkRngwTHk4Z1ltRnphV01nWlhabGJuUWdZMkZzYkdKaFkydHpJQ2hzYjNkbGNtTmhjMlVwWEc1Y2RGeDBYSFF2THlCbGJuUmxjaXdnWm05amRYTXNJR0pzZFhJc0lHdGxlWFZ3TENCclpYbGtiM2R1WEc1Y2RGeDBYSFFrWldScGRHRmliR1V1YTJWNWNISmxjM01vWm5WdVkzUnBiMjRnS0dWMlpXNTBLU0I3WEc1Y2RGeDBYSFJjZEdsbUlDaGxkbVZ1ZEM1clpYbERiMlJsSUQwOVBTQnJaWGt1UlU1VVJWSXBJSHRjYmx4MFhIUmNkRngwWEhSaWFXNWtRM1Z6ZEc5dFJYWmxiblFvSkdodmJHUmxjaXdnSjJWdWRHVnlKeWt1WTJGc2JDaDBhR2x6TENCbGRtVnVkQ2s3WEc1Y2RGeDBYSFJjZEgxY2JseDBYSFJjZEgwcE8xeHVYRzVjZEZ4MFhIUWtaV1JwZEdGaWJHVXVabTlqZFhNb1ltbHVaRU4xYzNSdmJVVjJaVzUwS0NSb2IyeGtaWElzSUNkbWIyTjFjeWNwS1R0Y2JseDBYSFJjZENSbFpHbDBZV0pzWlM1aWJIVnlLR0pwYm1SRGRYTjBiMjFGZG1WdWRDZ2thRzlzWkdWeUxDQW5ZbXgxY2ljcEtUdGNibHgwWEhSY2RDUmxaR2wwWVdKc1pTNXJaWGwxY0NoaWFXNWtRM1Z6ZEc5dFJYWmxiblFvSkdodmJHUmxjaXdnSjJ0bGVYVndKeWtwTzF4dVhIUmNkRngwSkdWa2FYUmhZbXhsTG10bGVXUnZkMjRvWW1sdVpFTjFjM1J2YlVWMlpXNTBLQ1JvYjJ4a1pYSXNJQ2RyWlhsa2IzZHVKeWtwTzF4dVhIUmNkRngwSkdWa2FYUmhZbXhsTG05dUtDZHdZWE4wWlNjc0lHSnBibVJEZFhOMGIyMUZkbVZ1ZENna2FHOXNaR1Z5TENBbmNHRnpkR1VuS1NrN1hHNWNibHgwWEhSY2RDOHZJR05oYkd4aVlXTnJjeUJtYjNJZ1lXUjJZVzVqWldRZ1ptVmhkSFZ5WlhNZ0tHTmhiV1ZzS1Z4dVhIUmNkRngwYVdZZ0tDRnZjSFJwYjI1ekxtRnBjazF2WkdVcElIdGNibHgwWEhSY2RGeDBiR0Y1YjNWMFNXNW1ieTUwYjI5c1ltRnlLQ2t1WTJ4cFkyc29ZbWx1WkVOMWMzUnZiVVYyWlc1MEtDUm9iMnhrWlhJc0lDZDBiMjlzWW1GeUxtTnNhV05ySnlrcE8xeHVYSFJjZEZ4MFhIUnNZWGx2ZFhSSmJtWnZMbkJ2Y0c5MlpYSW9LUzVqYkdsamF5aGlhVzVrUTNWemRHOXRSWFpsYm5Rb0pHaHZiR1JsY2l3Z0ozQnZjRzkyWlhJdVkyeHBZMnNuS1NrN1hHNWNkRngwWEhSOVhHNWNibHgwWEhSY2RHbG1JQ2hoWjJWdWRDNXBjMDFUU1VVcElIdGNibHgwWEhSY2RGeDBkbUZ5SUhORWIyMUZkbVZ1ZEhNZ1BTQW5SRTlOUTJoaGNtRmpkR1Z5UkdGMFlVMXZaR2xtYVdWa0lFUlBUVk4xWW5SeVpXVk5iMlJwWm1sbFpDQkVUMDFPYjJSbFNXNXpaWEowWldRbk8xeHVYSFJjZEZ4MFhIUWtaV1JwZEdGaWJHVXViMjRvYzBSdmJVVjJaVzUwY3l3Z1ltbHVaRU4xYzNSdmJVVjJaVzUwS0NSb2IyeGtaWElzSUNkamFHRnVaMlVuS1NrN1hHNWNkRngwWEhSOUlHVnNjMlVnZTF4dVhIUmNkRngwWEhRa1pXUnBkR0ZpYkdVdWIyNG9KMmx1Y0hWMEp5d2dZbWx1WkVOMWMzUnZiVVYyWlc1MEtDUm9iMnhrWlhJc0lDZGphR0Z1WjJVbktTazdYRzVjZEZ4MFhIUjlYRzVjYmx4MFhIUmNkQzh2SUZSbGVIUmhjbVZoT2lCaGRYUnZJR1pwYkd4cGJtY2dkR2hsSUdOdlpHVWdZbVZtYjNKbElHWnZjbTBnYzNWaWJXbDBMbHh1WEhSY2RGeDBhV1lnS0dSdmJTNXBjMVJsZUhSaGNtVmhLR3hwYzNRdWFHVmhaQ2drYUc5c1pHVnlLU2twSUh0Y2JseDBYSFJjZEZ4MEpHaHZiR1JsY2k1amJHOXpaWE4wS0NkbWIzSnRKeWt1YzNWaWJXbDBLR1oxYm1OMGFXOXVJQ2hsS1NCN1hHNWNkRngwWEhSY2RGeDBkbUZ5SUdOdmJuUmxiblJ6SUQwZ0pHaHZiR1JsY2k1amIyUmxLQ2s3WEc1Y2RGeDBYSFJjZEZ4MFltbHVaRU4xYzNSdmJVVjJaVzUwS0NSb2IyeGtaWElzSUNkemRXSnRhWFFuS1M1allXeHNLSFJvYVhNc0lHVXNJR052Ym5SbGJuUnpLVHRjYmx4MFhIUmNkRngwZlNrN1hHNWNkRngwWEhSOVhHNWNibHgwWEhSY2RDOHZJR1pwY21VZ2FXNXBkQ0JsZG1WdWRGeHVYSFJjZEZ4MFltbHVaRU4xYzNSdmJVVjJaVzUwS0NSb2IyeGtaWElzSUNkcGJtbDBKeWtvS1R0Y2JseHVYSFJjZEZ4MEx5OGdabWx5WlNCd2JIVm5hVzRnYVc1cGRDQmxkbVZ1ZEZ4dVhIUmNkRngwWm05eUlDaDJZWElnYVNBOUlEQXNJR3hsYmlBOUlDUXVjM1Z0YldWeWJtOTBaUzV3YkhWbmFXNXpMbXhsYm1kMGFEc2dhU0E4SUd4bGJqc2dhU3NyS1NCN1hHNWNkRngwWEhSY2RHbG1JQ2drTG1selJuVnVZM1JwYjI0b0pDNXpkVzF0WlhKdWIzUmxMbkJzZFdkcGJuTmJhVjB1YVc1cGRDa3BJSHRjYmx4MFhIUmNkRngwWEhRa0xuTjFiVzFsY201dmRHVXVjR3gxWjJsdWMxdHBYUzVwYm1sMEtHeGhlVzkxZEVsdVptOHBPMXh1WEhSY2RGeDBYSFI5WEc1Y2RGeDBYSFI5WEc1Y2RGeDBmVHRjYmx4dVhIUmNkSFJvYVhNdVpHVjBZV05vSUQwZ1puVnVZM1JwYjI0Z0tHeGhlVzkxZEVsdVptOHNJRzl3ZEdsdmJuTXBJSHRjYmx4MFhIUmNkR3hoZVc5MWRFbHVabTh1YUc5c1pHVnlLQ2t1YjJabUtDazdYRzVjZEZ4MFhIUnNZWGx2ZFhSSmJtWnZMbVZrYVhSaFlteGxLQ2t1YjJabUtDazdYRzVjYmx4MFhIUmNkR3hoZVc5MWRFbHVabTh1Y0c5d2IzWmxjaWdwTG05bVppZ3BPMXh1WEhSY2RGeDBiR0Y1YjNWMFNXNW1ieTVvWVc1a2JHVW9LUzV2Wm1Zb0tUdGNibHgwWEhSY2RHeGhlVzkxZEVsdVptOHVaR2xoYkc5bktDa3ViMlptS0NrN1hHNWNibHgwWEhSY2RHbG1JQ2doYjNCMGFXOXVjeTVoYVhKTmIyUmxLU0I3WEc1Y2RGeDBYSFJjZEd4aGVXOTFkRWx1Wm04dVpISnZjSHB2Ym1Vb0tTNXZabVlvS1R0Y2JseDBYSFJjZEZ4MGJHRjViM1YwU1c1bWJ5NTBiMjlzWW1GeUtDa3ViMlptS0NrN1hHNWNkRngwWEhSY2RHeGhlVzkxZEVsdVptOHVjM1JoZEhWelltRnlLQ2t1YjJabUtDazdYRzVjZEZ4MFhIUjlYRzVjZEZ4MGZUdGNibHgwZlR0Y2JseHVYSFF2S2lwY2JseDBJQ29nUUdOc1lYTnpJRkpsYm1SbGNtVnlYRzVjZENBcVhHNWNkQ0FxSUhKbGJtUmxjbVZ5WEc1Y2RDQXFYRzVjZENBcUlISmxibVJsY21sdVp5QjBiMjlzWW1GeUlHRnVaQ0JsWkdsMFlXSnNaVnh1WEhRZ0tpOWNibHgwZG1GeUlGSmxibVJsY21WeUlEMGdablZ1WTNScGIyNGdLQ2tnZTF4dVhHNWNkRngwTHlvcVhHNWNkRngwSUNvZ1ltOXZkSE4wY21Gd0lHSjFkSFJ2YmlCMFpXMXdiR0YwWlZ4dVhIUmNkQ0FxSUVCd2NtbDJZWFJsWEc1Y2RGeDBJQ29nUUhCaGNtRnRJSHRUZEhKcGJtZDlJR3hoWW1Wc0lHSjFkSFJ2YmlCdVlXMWxYRzVjZEZ4MElDb2dRSEJoY21GdElIdFBZbXBsWTNSOUlGdHZjSFJwYjI1elhTQmlkWFIwYjI0Z2IzQjBhVzl1YzF4dVhIUmNkQ0FxSUVCd1lYSmhiU0I3VTNSeWFXNW5mU0JiYjNCMGFXOXVjeTVsZG1WdWRGMGdaR0YwWVMxbGRtVnVkRnh1WEhSY2RDQXFJRUJ3WVhKaGJTQjdVM1J5YVc1bmZTQmJiM0IwYVc5dWN5NWpiR0Z6YzA1aGJXVmRJR0oxZEhSdmJpZHpJR05zWVhOeklHNWhiV1ZjYmx4MFhIUWdLaUJBY0dGeVlXMGdlMU4wY21sdVozMGdXMjl3ZEdsdmJuTXVkbUZzZFdWZElHUmhkR0V0ZG1Gc2RXVmNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UxTjBjbWx1WjMwZ1cyOXdkR2x2Ym5NdWRHbDBiR1ZkSUdKMWRIUnZiaWR6SUhScGRHeGxJR1p2Y2lCd2IzQjFjRnh1WEhSY2RDQXFJRUJ3WVhKaGJTQjdVM1J5YVc1bmZTQmJiM0IwYVc5dWN5NWtjbTl3Wkc5M2JsMGdaSEp2Y0dSdmQyNGdhSFJ0YkZ4dVhIUmNkQ0FxSUVCd1lYSmhiU0I3VTNSeWFXNW5mU0JiYjNCMGFXOXVjeTVvYVdSbFhTQmtZWFJoTFdocFpHVmNibHgwWEhRZ0tpOWNibHgwWEhSMllYSWdkSEJzUW5WMGRHOXVJRDBnWm5WdVkzUnBiMjRnS0d4aFltVnNMQ0J2Y0hScGIyNXpLU0I3WEc1Y2RGeDBYSFIyWVhJZ1pYWmxiblFnUFNCdmNIUnBiMjV6TG1WMlpXNTBPMXh1WEhSY2RGeDBkbUZ5SUhaaGJIVmxJRDBnYjNCMGFXOXVjeTUyWVd4MVpUdGNibHgwWEhSY2RIWmhjaUIwYVhSc1pTQTlJRzl3ZEdsdmJuTXVkR2wwYkdVN1hHNWNkRngwWEhSMllYSWdZMnhoYzNOT1lXMWxJRDBnYjNCMGFXOXVjeTVqYkdGemMwNWhiV1U3WEc1Y2RGeDBYSFIyWVhJZ1pISnZjR1J2ZDI0Z1BTQnZjSFJwYjI1ekxtUnliM0JrYjNkdU8xeHVYSFJjZEZ4MGRtRnlJR2hwWkdVZ1BTQnZjSFJwYjI1ekxtaHBaR1U3WEc1Y2JseDBYSFJjZEhKbGRIVnliaUFuUEdKMWRIUnZiaUIwZVhCbFBWd2lZblYwZEc5dVhDSW5JQ3RjYmx4MFhIUmNkRngwWEhRZ0lDQW5JR05zWVhOelBWd2lZblJ1SUdKMGJpMWtaV1poZFd4MElHSjBiaTF6YlNCaWRHNHRjMjFoYkd3bklDdGNibHgwWEhSY2RGeDBYSFJjZENBb1kyeGhjM05PWVcxbElEOGdKeUFuSUNzZ1kyeGhjM05PWVcxbElEb2dKeWNwSUN0Y2JseDBYSFJjZEZ4MFhIUmNkQ0FvWkhKdmNHUnZkMjRnUHlBbklHUnliM0JrYjNkdUxYUnZaMmRzWlNjZ09pQW5KeWtnSzF4dVhIUmNkRngwWEhSY2RDQWdJQ2RjSWljZ0sxeHVYSFJjZEZ4MFhIUmNkQ0FnSUNoa2NtOXdaRzkzYmlBL0lDY2daR0YwWVMxMGIyZG5iR1U5WENKa2NtOXdaRzkzYmx3aUp5QTZJQ2NuS1NBclhHNWNkRngwWEhSY2RGeDBJQ0FnS0hScGRHeGxJRDhnSnlCMGFYUnNaVDFjSWljZ0t5QjBhWFJzWlNBcklDZGNJaWNnT2lBbkp5a2dLMXh1WEhSY2RGeDBYSFJjZENBZ0lDaGxkbVZ1ZENBL0lDY2daR0YwWVMxbGRtVnVkRDFjSWljZ0t5QmxkbVZ1ZENBcklDZGNJaWNnT2lBbkp5a2dLMXh1WEhSY2RGeDBYSFJjZENBZ0lDaDJZV3gxWlNBL0lDY2daR0YwWVMxMllXeDFaVDFjWENjbklDc2dkbUZzZFdVZ0t5QW5YRnduSnlBNklDY25LU0FyWEc1Y2RGeDBYSFJjZEZ4MElDQWdLR2hwWkdVZ1B5QW5JR1JoZEdFdGFHbGtaVDFjWENjbklDc2dhR2xrWlNBcklDZGNYQ2NuSURvZ0p5Y3BJQ3RjYmx4MFhIUmNkRngwWEhRZ0lDQW5JSFJoWW1sdVpHVjRQVndpTFRGY0lqNG5JQ3RjYmx4MFhIUmNkRngwWEhRZ2JHRmlaV3dnSzF4dVhIUmNkRngwWEhSY2RDQW9aSEp2Y0dSdmQyNGdQeUFuSUR4emNHRnVJR05zWVhOelBWd2lZMkZ5WlhSY0lqNDhMM053WVc0K0p5QTZJQ2NuS1NBclhHNWNkRngwWEhSY2RDQWdJQ2M4TDJKMWRIUnZiajRuSUN0Y2JseDBYSFJjZEZ4MElDQWdLR1J5YjNCa2IzZHVJSHg4SUNjbktUdGNibHgwWEhSOU8xeHVYRzVjZEZ4MEx5b3FYRzVjZEZ4MElDb2dZbTl2ZEhOMGNtRndJR2xqYjI0Z1luVjBkRzl1SUhSbGJYQnNZWFJsWEc1Y2RGeDBJQ29nUUhCeWFYWmhkR1ZjYmx4MFhIUWdLaUJBY0dGeVlXMGdlMU4wY21sdVozMGdhV052YmtOc1lYTnpUbUZ0WlZ4dVhIUmNkQ0FxSUVCd1lYSmhiU0I3VDJKcVpXTjBmU0JiYjNCMGFXOXVjMTFjYmx4MFhIUWdLaUJBY0dGeVlXMGdlMU4wY21sdVozMGdXMjl3ZEdsdmJuTXVaWFpsYm5SZFhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0VGRISnBibWQ5SUZ0dmNIUnBiMjV6TG5aaGJIVmxYVnh1WEhSY2RDQXFJRUJ3WVhKaGJTQjdVM1J5YVc1bmZTQmJiM0IwYVc5dWN5NTBhWFJzWlYxY2JseDBYSFFnS2lCQWNHRnlZVzBnZTFOMGNtbHVaMzBnVzI5d2RHbHZibk11WkhKdmNHUnZkMjVkWEc1Y2RGeDBJQ292WEc1Y2RGeDBkbUZ5SUhSd2JFbGpiMjVDZFhSMGIyNGdQU0JtZFc1amRHbHZiaUFvYVdOdmJrTnNZWE56VG1GdFpTd2diM0IwYVc5dWN5a2dlMXh1WEhSY2RGeDBkbUZ5SUd4aFltVnNJRDBnSnp4cElHTnNZWE56UFZ3aUp5QXJJR2xqYjI1RGJHRnpjMDVoYldVZ0t5QW5YQ0krUEM5cFBpYzdYRzVjZEZ4MFhIUnlaWFIxY200Z2RIQnNRblYwZEc5dUtHeGhZbVZzTENCdmNIUnBiMjV6S1R0Y2JseDBYSFI5TzF4dVhHNWNkRngwTHlvcVhHNWNkRngwSUNvZ1ltOXZkSE4wY21Gd0lIQnZjRzkyWlhJZ2RHVnRjR3hoZEdWY2JseDBYSFFnS2lCQWNISnBkbUYwWlZ4dVhIUmNkQ0FxSUVCd1lYSmhiU0I3VTNSeWFXNW5mU0JqYkdGemMwNWhiV1ZjYmx4MFhIUWdLaUJBY0dGeVlXMGdlMU4wY21sdVozMGdZMjl1ZEdWdWRGeHVYSFJjZENBcUwxeHVYSFJjZEhaaGNpQjBjR3hRYjNCdmRtVnlJRDBnWm5WdVkzUnBiMjRnS0dOc1lYTnpUbUZ0WlN3Z1kyOXVkR1Z1ZENrZ2UxeHVYSFJjZEZ4MGRtRnlJQ1J3YjNCdmRtVnlJRDBnSkNnblBHUnBkaUJqYkdGemN6MWNJaWNnS3lCamJHRnpjMDVoYldVZ0t5QW5JSEJ2Y0c5MlpYSWdZbTkwZEc5dElHbHVYQ0lnYzNSNWJHVTlYQ0prYVhOd2JHRjVPaUJ1YjI1bE8xd2lQaWNnSzF4dVhIUmNkRngwWEhSY2RDQW5QR1JwZGlCamJHRnpjejFjSW1GeWNtOTNYQ0krUEM5a2FYWStKeUFyWEc1Y2RGeDBYSFJjZEZ4MElDYzhaR2wySUdOc1lYTnpQVndpY0c5d2IzWmxjaTFqYjI1MFpXNTBYQ0krSnlBclhHNWNkRngwWEhSY2RGeDBJQ2M4TDJScGRqNG5JQ3RjYmx4MFhIUmNkRngwSUNBZ0p6d3ZaR2wyUGljcE8xeHVYRzVjZEZ4MFhIUWtjRzl3YjNabGNpNW1hVzVrS0NjdWNHOXdiM1psY2kxamIyNTBaVzUwSnlrdVlYQndaVzVrS0dOdmJuUmxiblFwTzF4dVhIUmNkRngwY21WMGRYSnVJQ1J3YjNCdmRtVnlPMXh1WEhSY2RIMDdYRzVjYmx4MFhIUXZLaXBjYmx4MFhIUWdLaUJpYjI5MGMzUnlZWEFnWkdsaGJHOW5JSFJsYlhCc1lYUmxYRzVjZEZ4MElDcGNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UxTjBjbWx1WjMwZ1kyeGhjM05PWVcxbFhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0VGRISnBibWQ5SUZ0MGFYUnNaVDBuSjExY2JseDBYSFFnS2lCQWNHRnlZVzBnZTFOMGNtbHVaMzBnWW05a2VWeHVYSFJjZENBcUlFQndZWEpoYlNCN1UzUnlhVzVuZlNCYlptOXZkR1Z5UFNjblhWeHVYSFJjZENBcUwxeHVYSFJjZEhaaGNpQjBjR3hFYVdGc2IyY2dQU0JtZFc1amRHbHZiaUFvWTJ4aGMzTk9ZVzFsTENCMGFYUnNaU3dnWW05a2VTd2dabTl2ZEdWeUtTQjdYRzVjZEZ4MFhIUnlaWFIxY200Z0p6eGthWFlnWTJ4aGMzTTlYQ0luSUNzZ1kyeGhjM05PWVcxbElDc2dKeUJ0YjJSaGJGd2lJR0Z5YVdFdGFHbGtaR1Z1UFZ3aVptRnNjMlZjSWo0bklDdGNibHgwWEhSY2RGeDBYSFFnSnp4a2FYWWdZMnhoYzNNOVhDSnRiMlJoYkMxa2FXRnNiMmRjSWo0bklDdGNibHgwWEhSY2RGeDBYSFFnSUNBblBHUnBkaUJqYkdGemN6MWNJbTF2WkdGc0xXTnZiblJsYm5SY0lqNG5JQ3RjYmx4MFhIUmNkRngwWEhSY2RDQW9kR2wwYkdVZ1AxeHVYSFJjZEZ4MFhIUmNkRngwSUNjOFpHbDJJR05zWVhOelBWd2liVzlrWVd3dGFHVmhaR1Z5WENJK0p5QXJYRzVjZEZ4MFhIUmNkRngwWEhRZ0lDQW5QR0oxZEhSdmJpQjBlWEJsUFZ3aVluVjBkRzl1WENJZ1kyeGhjM005WENKamJHOXpaVndpSUdGeWFXRXRhR2xrWkdWdVBWd2lkSEoxWlZ3aUlIUmhZbWx1WkdWNFBWd2lMVEZjSWo0bWRHbHRaWE03UEM5aWRYUjBiMjQrSnlBclhHNWNkRngwWEhSY2RGeDBYSFFnSUNBblBHZzBJR05zWVhOelBWd2liVzlrWVd3dGRHbDBiR1ZjSWo0bklDc2dkR2wwYkdVZ0t5QW5QQzlvTkQ0bklDdGNibHgwWEhSY2RGeDBYSFJjZENBblBDOWthWFkrSnlBNklDY25YRzVjZEZ4MFhIUmNkRngwWEhRZ0tTQXJYRzVjZEZ4MFhIUmNkRngwWEhRZ0p6eG1iM0p0SUdOc1lYTnpQVndpYm05MFpTMXRiMlJoYkMxbWIzSnRYQ0krSnlBclhHNWNkRngwWEhSY2RGeDBYSFFnSUNBblBHUnBkaUJqYkdGemN6MWNJbTF2WkdGc0xXSnZaSGxjSWo0bklDc2dZbTlrZVNBcklDYzhMMlJwZGo0bklDdGNibHgwWEhSY2RGeDBYSFJjZENBZ0lDaG1iMjkwWlhJZ1AxeHVYSFJjZEZ4MFhIUmNkRngwSUNBZ0p6eGthWFlnWTJ4aGMzTTlYQ0p0YjJSaGJDMW1iMjkwWlhKY0lqNG5JQ3NnWm05dmRHVnlJQ3NnSnp3dlpHbDJQaWNnT2lBbkoxeHVYSFJjZEZ4MFhIUmNkRngwSUNBZ0tTQXJYRzVjZEZ4MFhIUmNkRngwWEhRZ0p6d3ZabTl5YlQ0bklDdGNibHgwWEhSY2RGeDBYSFFnSUNBblBDOWthWFkrSnlBclhHNWNkRngwWEhSY2RGeDBJQ2M4TDJScGRqNG5JQ3RjYmx4MFhIUmNkRngwSUNBZ0p6d3ZaR2wyUGljN1hHNWNkRngwZlR0Y2JseHVYSFJjZEhaaGNpQjBjR3hDZFhSMGIyNUpibVp2SUQwZ2UxeHVYSFJjZEZ4MGNHbGpkSFZ5WlRvZ1puVnVZM1JwYjI0Z0tHeGhibWNzSUc5d2RHbHZibk1wSUh0Y2JseDBYSFJjZEZ4MGNtVjBkWEp1SUhSd2JFbGpiMjVDZFhSMGIyNG9iM0IwYVc5dWN5NXBZMjl1VUhKbFptbDRJQ3NnSjNCcFkzUjFjbVV0Ynljc0lIdGNibHgwWEhSY2RGeDBYSFJsZG1WdWREb2dKM05vYjNkSmJXRm5aVVJwWVd4dlp5Y3NYRzVjZEZ4MFhIUmNkRngwZEdsMGJHVTZJR3hoYm1jdWFXMWhaMlV1YVcxaFoyVXNYRzVjZEZ4MFhIUmNkRngwYUdsa1pUb2dkSEoxWlZ4dVhIUmNkRngwWEhSOUtUdGNibHgwWEhSY2RIMHNYRzVjZEZ4MFhIUnNhVzVyT2lCbWRXNWpkR2x2YmlBb2JHRnVaeXdnYjNCMGFXOXVjeWtnZTF4dVhIUmNkRngwWEhSeVpYUjFjbTRnZEhCc1NXTnZia0oxZEhSdmJpaHZjSFJwYjI1ekxtbGpiMjVRY21WbWFYZ2dLeUFuYkdsdWF5Y3NJSHRjYmx4MFhIUmNkRngwWEhSbGRtVnVkRG9nSjNOb2IzZE1hVzVyUkdsaGJHOW5KeXhjYmx4MFhIUmNkRngwWEhSMGFYUnNaVG9nYkdGdVp5NXNhVzVyTG14cGJtc3NYRzVjZEZ4MFhIUmNkRngwYUdsa1pUb2dkSEoxWlZ4dVhIUmNkRngwWEhSOUtUdGNibHgwWEhSY2RIMHNYRzVjZEZ4MFhIUjBZV0pzWlRvZ1puVnVZM1JwYjI0Z0tHeGhibWNzSUc5d2RHbHZibk1wSUh0Y2JseDBYSFJjZEZ4MGRtRnlJR1J5YjNCa2IzZHVJRDBnSnp4MWJDQmpiR0Z6Y3oxY0ltNXZkR1V0ZEdGaWJHVWdaSEp2Y0dSdmQyNHRiV1Z1ZFZ3aVBpY2dLMXh1WEhSY2RGeDBYSFJjZEZ4MFhIUmNkQ0FuUEdScGRpQmpiR0Z6Y3oxY0ltNXZkR1V0WkdsdFpXNXphVzl1TFhCcFkydGxjbHdpUGljZ0sxeHVYSFJjZEZ4MFhIUmNkRngwWEhSY2RDQWdJQ2M4WkdsMklHTnNZWE56UFZ3aWJtOTBaUzFrYVcxbGJuTnBiMjR0Y0dsamEyVnlMVzF2ZFhObFkyRjBZMmhsY2x3aUlHUmhkR0V0WlhabGJuUTlYQ0pwYm5ObGNuUlVZV0pzWlZ3aUlHUmhkR0V0ZG1Gc2RXVTlYQ0l4ZURGY0lqNDhMMlJwZGo0bklDdGNibHgwWEhSY2RGeDBYSFJjZEZ4MFhIUWdJQ0FuUEdScGRpQmpiR0Z6Y3oxY0ltNXZkR1V0WkdsdFpXNXphVzl1TFhCcFkydGxjaTFvYVdkb2JHbG5hSFJsWkZ3aVBqd3ZaR2wyUGljZ0sxeHVYSFJjZEZ4MFhIUmNkRngwWEhSY2RDQWdJQ2M4WkdsMklHTnNZWE56UFZ3aWJtOTBaUzFrYVcxbGJuTnBiMjR0Y0dsamEyVnlMWFZ1YUdsbmFHeHBaMmgwWldSY0lqNDhMMlJwZGo0bklDdGNibHgwWEhSY2RGeDBYSFJjZEZ4MFhIUWdKend2WkdsMlBpY2dLMXh1WEhSY2RGeDBYSFJjZEZ4MFhIUmNkQ0FuUEdScGRpQmpiR0Z6Y3oxY0ltNXZkR1V0WkdsdFpXNXphVzl1TFdScGMzQnNZWGxjSWo0Z01TQjRJREVnUEM5a2FYWStKeUFyWEc1Y2RGeDBYSFJjZEZ4MFhIUmNkQ0FnSUNjOEwzVnNQaWM3WEc1Y2RGeDBYSFJjZEhKbGRIVnliaUIwY0d4SlkyOXVRblYwZEc5dUtHOXdkR2x2Ym5NdWFXTnZibEJ5WldacGVDQXJJQ2QwWVdKc1pTY3NJSHRjYmx4MFhIUmNkRngwWEhSMGFYUnNaVG9nYkdGdVp5NTBZV0pzWlM1MFlXSnNaU3hjYmx4MFhIUmNkRngwWEhSa2NtOXdaRzkzYmpvZ1pISnZjR1J2ZDI1Y2JseDBYSFJjZEZ4MGZTazdYRzVjZEZ4MFhIUjlMRnh1WEhSY2RGeDBjM1I1YkdVNklHWjFibU4wYVc5dUlDaHNZVzVuTENCdmNIUnBiMjV6S1NCN1hHNWNkRngwWEhSY2RIWmhjaUJwZEdWdGN5QTlJRzl3ZEdsdmJuTXVjM1I1YkdWVVlXZHpMbkpsWkhWalpTaG1kVzVqZEdsdmJpQW9iV1Z0Ynl3Z2Rpa2dlMXh1WEhSY2RGeDBYSFJjZEhaaGNpQnNZV0psYkNBOUlHeGhibWN1YzNSNWJHVmJkaUE5UFQwZ0ozQW5JRDhnSjI1dmNtMWhiQ2NnT2lCMlhUdGNibHgwWEhSY2RGeDBYSFJ5WlhSMWNtNGdiV1Z0YnlBcklDYzhiR2srUEdFZ1pHRjBZUzFsZG1WdWREMWNJbVp2Y20xaGRFSnNiMk5yWENJZ2FISmxaajFjSWlOY0lpQmtZWFJoTFhaaGJIVmxQVndpSnlBcklIWWdLeUFuWENJK0p5QXJYRzVjZEZ4MFhIUmNkRngwWEhSY2RDQW9YRzVjZEZ4MFhIUmNkRngwWEhSY2RDQWdJQ2gySUQwOVBTQW5jQ2NnZkh3Z2RpQTlQVDBnSjNCeVpTY3BJRDhnYkdGaVpXd2dPbHh1WEhSY2RGeDBYSFJjZEZ4MFhIUWdJQ0FuUENjZ0t5QjJJQ3NnSno0bklDc2diR0ZpWld3Z0t5QW5QQzhuSUNzZ2RpQXJJQ2MrSjF4dVhIUmNkRngwWEhSY2RGeDBYSFFnS1NBclhHNWNkRngwWEhSY2RGeDBYSFFnSUNBblBDOWhQand2YkdrK0p6dGNibHgwWEhSY2RGeDBmU3dnSnljcE8xeHVYRzVjZEZ4MFhIUmNkSEpsZEhWeWJpQjBjR3hKWTI5dVFuVjBkRzl1S0c5d2RHbHZibk11YVdOdmJsQnlaV1pwZUNBcklDZHRZV2RwWXljc0lIdGNibHgwWEhSY2RGeDBYSFIwYVhSc1pUb2diR0Z1Wnk1emRIbHNaUzV6ZEhsc1pTeGNibHgwWEhSY2RGeDBYSFJrY205d1pHOTNiam9nSnp4MWJDQmpiR0Z6Y3oxY0ltUnliM0JrYjNkdUxXMWxiblZjSWo0bklDc2dhWFJsYlhNZ0t5QW5QQzkxYkQ0blhHNWNkRngwWEhSY2RIMHBPMXh1WEhSY2RGeDBmU3hjYmx4MFhIUmNkR1p2Ym5SdVlXMWxPaUJtZFc1amRHbHZiaUFvYkdGdVp5d2diM0IwYVc5dWN5a2dlMXh1WEhSY2RGeDBYSFIyWVhJZ2NtVmhiRVp2Ym5STWFYTjBJRDBnVzEwN1hHNWNkRngwWEhSY2RIWmhjaUJwZEdWdGN5QTlJRzl3ZEdsdmJuTXVabTl1ZEU1aGJXVnpMbkpsWkhWalpTaG1kVzVqZEdsdmJpQW9iV1Z0Ynl3Z2Rpa2dlMXh1WEhSY2RGeDBYSFJjZEdsbUlDZ2hZV2RsYm5RdWFYTkdiMjUwU1c1emRHRnNiR1ZrS0hZcElDWW1JRzl3ZEdsdmJuTXVabTl1ZEU1aGJXVnpTV2R1YjNKbFEyaGxZMnN1YVc1a1pYaFBaaWgyS1NBOVBUMGdMVEVwSUh0Y2JseDBYSFJjZEZ4MFhIUmNkSEpsZEhWeWJpQnRaVzF2TzF4dVhIUmNkRngwWEhSY2RIMWNibHgwWEhSY2RGeDBYSFJ5WldGc1JtOXVkRXhwYzNRdWNIVnphQ2gyS1R0Y2JseDBYSFJjZEZ4MFhIUnlaWFIxY200Z2JXVnRieUFySUNjOGJHaytQR0VnWkdGMFlTMWxkbVZ1ZEQxY0ltWnZiblJPWVcxbFhDSWdhSEpsWmoxY0lpTmNJaUJrWVhSaExYWmhiSFZsUFZ3aUp5QXJJSFlnS3lBblhDSWdjM1I1YkdVOVhDSm1iMjUwTFdaaGJXbHNlVHBjWENjbklDc2dkaUFySUNkY1hDZGNJajRuSUN0Y2JseDBYSFJjZEZ4MFhIUmNkRngwWEhSY2RDYzhhU0JqYkdGemN6MWNJaWNnS3lCdmNIUnBiMjV6TG1samIyNVFjbVZtYVhnZ0t5QW5ZMmhsWTJ0Y0lqNDhMMmsrSUNjZ0t5QjJJQ3RjYmx4MFhIUmNkRngwWEhSY2RGeDBYSFFnSUNjOEwyRStQQzlzYVQ0bk8xeHVYSFJjZEZ4MFhIUjlMQ0FuSnlrN1hHNWNibHgwWEhSY2RGeDBkbUZ5SUdoaGMwUmxabUYxYkhSR2IyNTBJRDBnWVdkbGJuUXVhWE5HYjI1MFNXNXpkR0ZzYkdWa0tHOXdkR2x2Ym5NdVpHVm1ZWFZzZEVadmJuUk9ZVzFsS1R0Y2JseDBYSFJjZEZ4MGRtRnlJR1JsWm1GMWJIUkdiMjUwVG1GdFpTQTlJQ2hvWVhORVpXWmhkV3gwUm05dWRDa2dQeUJ2Y0hScGIyNXpMbVJsWm1GMWJIUkdiMjUwVG1GdFpTQTZJSEpsWVd4R2IyNTBUR2x6ZEZzd1hUdGNibHh1WEhSY2RGeDBYSFIyWVhJZ2JHRmlaV3dnUFNBblBITndZVzRnWTJ4aGMzTTlYQ0p1YjNSbExXTjFjbkpsYm5RdFptOXVkRzVoYldWY0lqNG5JQ3RjYmx4MFhIUmNkRngwWEhSY2RGeDBYSFJrWldaaGRXeDBSbTl1ZEU1aGJXVWdLMXh1WEhSY2RGeDBYSFJjZEZ4MFhIUWdKend2YzNCaGJqNG5PMXh1WEhSY2RGeDBYSFJ5WlhSMWNtNGdkSEJzUW5WMGRHOXVLR3hoWW1Wc0xDQjdYRzVjZEZ4MFhIUmNkRngwZEdsMGJHVTZJR3hoYm1jdVptOXVkQzV1WVcxbExGeHVYSFJjZEZ4MFhIUmNkR1J5YjNCa2IzZHVPaUFuUEhWc0lHTnNZWE56UFZ3aVpISnZjR1J2ZDI0dGJXVnVkVndpUGljZ0t5QnBkR1Z0Y3lBcklDYzhMM1ZzUGlkY2JseDBYSFJjZEZ4MGZTazdYRzVjZEZ4MFhIUjlMRnh1WEhSY2RGeDBZMjlzYjNJNklHWjFibU4wYVc5dUlDaHNZVzVuTENCdmNIUnBiMjV6S1NCN1hHNWNkRngwWEhSY2RIWmhjaUJqYjJ4dmNrSjFkSFJ2Ymt4aFltVnNJRDBnSnp4cElHTnNZWE56UFZ3aUp5QXJJRzl3ZEdsdmJuTXVhV052YmxCeVpXWnBlQ0FySUNkbWIyNTBYQ0lnYzNSNWJHVTlYQ0pqYjJ4dmNqcGliR0ZqYXp0aVlXTnJaM0p2ZFc1a0xXTnZiRzl5T25sbGJHeHZkenRjSWo0OEwyaytKenRjYmx4MFhIUmNkRngwZG1GeUlHTnZiRzl5UW5WMGRHOXVJRDBnZEhCc1FuVjBkRzl1S0dOdmJHOXlRblYwZEc5dVRHRmlaV3dzSUh0Y2JseDBYSFJjZEZ4MFhIUmpiR0Z6YzA1aGJXVTZJQ2R1YjNSbExYSmxZMlZ1ZEMxamIyeHZjaWNzWEc1Y2RGeDBYSFJjZEZ4MGRHbDBiR1U2SUd4aGJtY3VZMjlzYjNJdWNtVmpaVzUwTEZ4dVhIUmNkRngwWEhSY2RHVjJaVzUwT2lBblkyOXNiM0luTEZ4dVhIUmNkRngwWEhSY2RIWmhiSFZsT2lBbmUxd2lZbUZqYTBOdmJHOXlYQ0k2WENKNVpXeHNiM2RjSW4wblhHNWNkRngwWEhSY2RIMHBPMXh1WEc1Y2RGeDBYSFJjZEhaaGNpQmtjbTl3Wkc5M2JpQTlJQ2M4ZFd3Z1kyeGhjM005WENKa2NtOXdaRzkzYmkxdFpXNTFYQ0krSnlBclhHNWNkRngwWEhSY2RGeDBYSFJjZEZ4MElDYzhiR2srSnlBclhHNWNkRngwWEhSY2RGeDBYSFJjZEZ4MElDQWdKenhrYVhZZ1kyeGhjM005WENKaWRHNHRaM0p2ZFhCY0lqNG5JQ3RjYmx4MFhIUmNkRngwWEhSY2RGeDBYSFJjZENBblBHUnBkaUJqYkdGemN6MWNJbTV2ZEdVdGNHRnNaWFIwWlMxMGFYUnNaVndpUGljZ0t5QnNZVzVuTG1OdmJHOXlMbUpoWTJ0bmNtOTFibVFnS3lBblBDOWthWFkrSnlBclhHNWNkRngwWEhSY2RGeDBYSFJjZEZ4MFhIUWdKenhrYVhZZ1kyeGhjM005WENKdWIzUmxMV052Ykc5eUxYSmxjMlYwWENJZ1pHRjBZUzFsZG1WdWREMWNJbUpoWTJ0RGIyeHZjbHdpSnlBclhHNWNkRngwWEhSY2RGeDBYSFJjZEZ4MFhIUWdJQ0FuSUdSaGRHRXRkbUZzZFdVOVhDSnBibWhsY21sMFhDSWdkR2wwYkdVOVhDSW5JQ3NnYkdGdVp5NWpiMnh2Y2k1MGNtRnVjM0JoY21WdWRDQXJJQ2RjSWo0bklDdGNibHgwWEhSY2RGeDBYSFJjZEZ4MFhIUmNkQ0FnSUd4aGJtY3VZMjlzYjNJdWMyVjBWSEpoYm5Od1lYSmxiblFnSzF4dVhIUmNkRngwWEhSY2RGeDBYSFJjZEZ4MElDYzhMMlJwZGo0bklDdGNibHgwWEhSY2RGeDBYSFJjZEZ4MFhIUmNkQ0FuUEdScGRpQmpiR0Z6Y3oxY0ltNXZkR1V0WTI5c2IzSXRjR0ZzWlhSMFpWd2lJR1JoZEdFdGRHRnlaMlYwTFdWMlpXNTBQVndpWW1GamEwTnZiRzl5WENJK1BDOWthWFkrSnlBclhHNWNkRngwWEhSY2RGeDBYSFJjZEZ4MElDQWdKend2WkdsMlBpY2dLMXh1WEhSY2RGeDBYSFJjZEZ4MFhIUmNkQ0FnSUNjOFpHbDJJR05zWVhOelBWd2lZblJ1TFdkeWIzVndYQ0krSnlBclhHNWNkRngwWEhSY2RGeDBYSFJjZEZ4MFhIUWdKenhrYVhZZ1kyeGhjM005WENKdWIzUmxMWEJoYkdWMGRHVXRkR2wwYkdWY0lqNG5JQ3NnYkdGdVp5NWpiMnh2Y2k1bWIzSmxaM0p2ZFc1a0lDc2dKend2WkdsMlBpY2dLMXh1WEhSY2RGeDBYSFJjZEZ4MFhIUmNkRngwSUNjOFpHbDJJR05zWVhOelBWd2libTkwWlMxamIyeHZjaTF5WlhObGRGd2lJR1JoZEdFdFpYWmxiblE5WENKbWIzSmxRMjlzYjNKY0lpQmtZWFJoTFhaaGJIVmxQVndpYVc1b1pYSnBkRndpSUhScGRHeGxQVndpSnlBcklHeGhibWN1WTI5c2IzSXVjbVZ6WlhRZ0t5QW5YQ0krSnlBclhHNWNkRngwWEhSY2RGeDBYSFJjZEZ4MFhIUWdJQ0JzWVc1bkxtTnZiRzl5TG5KbGMyVjBWRzlFWldaaGRXeDBJQ3RjYmx4MFhIUmNkRngwWEhSY2RGeDBYSFJjZENBblBDOWthWFkrSnlBclhHNWNkRngwWEhSY2RGeDBYSFJjZEZ4MFhIUWdKenhrYVhZZ1kyeGhjM005WENKdWIzUmxMV052Ykc5eUxYQmhiR1YwZEdWY0lpQmtZWFJoTFhSaGNtZGxkQzFsZG1WdWREMWNJbVp2Y21WRGIyeHZjbHdpUGp3dlpHbDJQaWNnSzF4dVhIUmNkRngwWEhSY2RGeDBYSFJjZENBZ0lDYzhMMlJwZGo0bklDdGNibHgwWEhSY2RGeDBYSFJjZEZ4MFhIUWdKend2YkdrK0p5QXJYRzVjZEZ4MFhIUmNkRngwWEhSY2RDQWdJQ2M4TDNWc1BpYzdYRzVjYmx4MFhIUmNkRngwZG1GeUlHMXZjbVZDZFhSMGIyNGdQU0IwY0d4Q2RYUjBiMjRvSnljc0lIdGNibHgwWEhSY2RGeDBYSFIwYVhSc1pUb2diR0Z1Wnk1amIyeHZjaTV0YjNKbExGeHVYSFJjZEZ4MFhIUmNkR1J5YjNCa2IzZHVPaUJrY205d1pHOTNibHh1WEhSY2RGeDBYSFI5S1R0Y2JseHVYSFJjZEZ4MFhIUnlaWFIxY200Z1kyOXNiM0pDZFhSMGIyNGdLeUJ0YjNKbFFuVjBkRzl1TzF4dVhIUmNkRngwZlN4Y2JseDBYSFJjZEdKdmJHUTZJR1oxYm1OMGFXOXVJQ2hzWVc1bkxDQnZjSFJwYjI1ektTQjdYRzVjZEZ4MFhIUmNkSEpsZEhWeWJpQjBjR3hKWTI5dVFuVjBkRzl1S0c5d2RHbHZibk11YVdOdmJsQnlaV1pwZUNBcklDZGliMnhrSnl3Z2UxeHVYSFJjZEZ4MFhIUmNkR1YyWlc1ME9pQW5ZbTlzWkNjc1hHNWNkRngwWEhSY2RGeDBkR2wwYkdVNklHeGhibWN1Wm05dWRDNWliMnhrWEc1Y2RGeDBYSFJjZEgwcE8xeHVYSFJjZEZ4MGZTeGNibHgwWEhSY2RHbDBZV3hwWXpvZ1puVnVZM1JwYjI0Z0tHeGhibWNzSUc5d2RHbHZibk1wSUh0Y2JseDBYSFJjZEZ4MGNtVjBkWEp1SUhSd2JFbGpiMjVDZFhSMGIyNG9iM0IwYVc5dWN5NXBZMjl1VUhKbFptbDRJQ3NnSjJsMFlXeHBZeWNzSUh0Y2JseDBYSFJjZEZ4MFhIUmxkbVZ1ZERvZ0oybDBZV3hwWXljc1hHNWNkRngwWEhSY2RGeDBkR2wwYkdVNklHeGhibWN1Wm05dWRDNXBkR0ZzYVdOY2JseDBYSFJjZEZ4MGZTazdYRzVjZEZ4MFhIUjlMRnh1WEhSY2RGeDBkVzVrWlhKc2FXNWxPaUJtZFc1amRHbHZiaUFvYkdGdVp5d2diM0IwYVc5dWN5a2dlMXh1WEhSY2RGeDBYSFJ5WlhSMWNtNGdkSEJzU1dOdmJrSjFkSFJ2YmlodmNIUnBiMjV6TG1samIyNVFjbVZtYVhnZ0t5QW5kVzVrWlhKc2FXNWxKeXdnZTF4dVhIUmNkRngwWEhSY2RHVjJaVzUwT2lBbmRXNWtaWEpzYVc1bEp5eGNibHgwWEhSY2RGeDBYSFIwYVhSc1pUb2diR0Z1Wnk1bWIyNTBMblZ1WkdWeWJHbHVaVnh1WEhSY2RGeDBYSFI5S1R0Y2JseDBYSFJjZEgwc1hHNWNkRngwWEhSamJHVmhjam9nWm5WdVkzUnBiMjRnS0d4aGJtY3NJRzl3ZEdsdmJuTXBJSHRjYmx4MFhIUmNkRngwY21WMGRYSnVJSFJ3YkVsamIyNUNkWFIwYjI0b2IzQjBhVzl1Y3k1cFkyOXVVSEpsWm1sNElDc2dKMlZ5WVhObGNpY3NJSHRjYmx4MFhIUmNkRngwWEhSbGRtVnVkRG9nSjNKbGJXOTJaVVp2Y20xaGRDY3NYRzVjZEZ4MFhIUmNkRngwZEdsMGJHVTZJR3hoYm1jdVptOXVkQzVqYkdWaGNseHVYSFJjZEZ4MFhIUjlLVHRjYmx4MFhIUmNkSDBzWEc1Y2RGeDBYSFIxYkRvZ1puVnVZM1JwYjI0Z0tHeGhibWNzSUc5d2RHbHZibk1wSUh0Y2JseDBYSFJjZEZ4MGNtVjBkWEp1SUhSd2JFbGpiMjVDZFhSMGIyNG9iM0IwYVc5dWN5NXBZMjl1VUhKbFptbDRJQ3NnSjJ4cGMzUXRkV3duTENCN1hHNWNkRngwWEhSY2RGeDBaWFpsYm5RNklDZHBibk5sY25SVmJtOXlaR1Z5WldSTWFYTjBKeXhjYmx4MFhIUmNkRngwWEhSMGFYUnNaVG9nYkdGdVp5NXNhWE4wY3k1MWJtOXlaR1Z5WldSY2JseDBYSFJjZEZ4MGZTazdYRzVjZEZ4MFhIUjlMRnh1WEhSY2RGeDBiMnc2SUdaMWJtTjBhVzl1SUNoc1lXNW5MQ0J2Y0hScGIyNXpLU0I3WEc1Y2RGeDBYSFJjZEhKbGRIVnliaUIwY0d4SlkyOXVRblYwZEc5dUtHOXdkR2x2Ym5NdWFXTnZibEJ5WldacGVDQXJJQ2RzYVhOMExXOXNKeXdnZTF4dVhIUmNkRngwWEhSY2RHVjJaVzUwT2lBbmFXNXpaWEowVDNKa1pYSmxaRXhwYzNRbkxGeHVYSFJjZEZ4MFhIUmNkSFJwZEd4bE9pQnNZVzVuTG14cGMzUnpMbTl5WkdWeVpXUmNibHgwWEhSY2RGeDBmU2s3WEc1Y2RGeDBYSFI5TEZ4dVhIUmNkRngwY0dGeVlXZHlZWEJvT2lCbWRXNWpkR2x2YmlBb2JHRnVaeXdnYjNCMGFXOXVjeWtnZTF4dVhIUmNkRngwWEhSMllYSWdiR1ZtZEVKMWRIUnZiaUE5SUhSd2JFbGpiMjVDZFhSMGIyNG9iM0IwYVc5dWN5NXBZMjl1VUhKbFptbDRJQ3NnSjJGc2FXZHVMV3hsWm5RbkxDQjdYRzVjZEZ4MFhIUmNkRngwZEdsMGJHVTZJR3hoYm1jdWNHRnlZV2R5WVhCb0xteGxablFzWEc1Y2RGeDBYSFJjZEZ4MFpYWmxiblE2SUNkcWRYTjBhV1o1VEdWbWRDZGNibHgwWEhSY2RGeDBmU2s3WEc1Y2RGeDBYSFJjZEhaaGNpQmpaVzUwWlhKQ2RYUjBiMjRnUFNCMGNHeEpZMjl1UW5WMGRHOXVLRzl3ZEdsdmJuTXVhV052YmxCeVpXWnBlQ0FySUNkaGJHbG5iaTFqWlc1MFpYSW5MQ0I3WEc1Y2RGeDBYSFJjZEZ4MGRHbDBiR1U2SUd4aGJtY3VjR0Z5WVdkeVlYQm9MbU5sYm5SbGNpeGNibHgwWEhSY2RGeDBYSFJsZG1WdWREb2dKMnAxYzNScFpubERaVzUwWlhJblhHNWNkRngwWEhSY2RIMHBPMXh1WEhSY2RGeDBYSFIyWVhJZ2NtbG5hSFJDZFhSMGIyNGdQU0IwY0d4SlkyOXVRblYwZEc5dUtHOXdkR2x2Ym5NdWFXTnZibEJ5WldacGVDQXJJQ2RoYkdsbmJpMXlhV2RvZENjc0lIdGNibHgwWEhSY2RGeDBYSFIwYVhSc1pUb2diR0Z1Wnk1d1lYSmhaM0poY0dndWNtbG5hSFFzWEc1Y2RGeDBYSFJjZEZ4MFpYWmxiblE2SUNkcWRYTjBhV1o1VW1sbmFIUW5YRzVjZEZ4MFhIUmNkSDBwTzF4dVhIUmNkRngwWEhSMllYSWdhblZ6ZEdsbWVVSjFkSFJ2YmlBOUlIUndiRWxqYjI1Q2RYUjBiMjRvYjNCMGFXOXVjeTVwWTI5dVVISmxabWw0SUNzZ0oyRnNhV2R1TFdwMWMzUnBabmtuTENCN1hHNWNkRngwWEhSY2RGeDBkR2wwYkdVNklHeGhibWN1Y0dGeVlXZHlZWEJvTG1wMWMzUnBabmtzWEc1Y2RGeDBYSFJjZEZ4MFpYWmxiblE2SUNkcWRYTjBhV1o1Um5Wc2JDZGNibHgwWEhSY2RGeDBmU2s3WEc1Y2JseDBYSFJjZEZ4MGRtRnlJRzkxZEdSbGJuUkNkWFIwYjI0Z1BTQjBjR3hKWTI5dVFuVjBkRzl1S0c5d2RHbHZibk11YVdOdmJsQnlaV1pwZUNBcklDZHZkWFJrWlc1MEp5d2dlMXh1WEhSY2RGeDBYSFJjZEhScGRHeGxPaUJzWVc1bkxuQmhjbUZuY21Gd2FDNXZkWFJrWlc1MExGeHVYSFJjZEZ4MFhIUmNkR1YyWlc1ME9pQW5iM1YwWkdWdWRDZGNibHgwWEhSY2RGeDBmU2s3WEc1Y2RGeDBYSFJjZEhaaGNpQnBibVJsYm5SQ2RYUjBiMjRnUFNCMGNHeEpZMjl1UW5WMGRHOXVLRzl3ZEdsdmJuTXVhV052YmxCeVpXWnBlQ0FySUNkcGJtUmxiblFuTENCN1hHNWNkRngwWEhSY2RGeDBkR2wwYkdVNklHeGhibWN1Y0dGeVlXZHlZWEJvTG1sdVpHVnVkQ3hjYmx4MFhIUmNkRngwWEhSbGRtVnVkRG9nSjJsdVpHVnVkQ2RjYmx4MFhIUmNkRngwZlNrN1hHNWNibHgwWEhSY2RGeDBkbUZ5SUdSeWIzQmtiM2R1SUQwZ0p6eGthWFlnWTJ4aGMzTTlYQ0prY205d1pHOTNiaTF0Wlc1MVhDSStKeUFyWEc1Y2RGeDBYSFJjZEZ4MFhIUmNkRngwSUNjOFpHbDJJR05zWVhOelBWd2libTkwWlMxaGJHbG5iaUJpZEc0dFozSnZkWEJjSWo0bklDdGNibHgwWEhSY2RGeDBYSFJjZEZ4MFhIUWdJQ0JzWldaMFFuVjBkRzl1SUNzZ1kyVnVkR1Z5UW5WMGRHOXVJQ3NnY21sbmFIUkNkWFIwYjI0Z0t5QnFkWE4wYVdaNVFuVjBkRzl1SUN0Y2JseDBYSFJjZEZ4MFhIUmNkRngwWEhRZ0p6d3ZaR2wyUGljZ0sxeHVYSFJjZEZ4MFhIUmNkRngwWEhSY2RDQW5QR1JwZGlCamJHRnpjejFjSW01dmRHVXRiR2x6ZENCaWRHNHRaM0p2ZFhCY0lqNG5JQ3RjYmx4MFhIUmNkRngwWEhSY2RGeDBYSFFnSUNCcGJtUmxiblJDZFhSMGIyNGdLeUJ2ZFhSa1pXNTBRblYwZEc5dUlDdGNibHgwWEhSY2RGeDBYSFJjZEZ4MFhIUWdKend2WkdsMlBpY2dLMXh1WEhSY2RGeDBYSFJjZEZ4MFhIUWdJQ0FuUEM5a2FYWStKenRjYmx4dVhIUmNkRngwWEhSeVpYUjFjbTRnZEhCc1NXTnZia0oxZEhSdmJpaHZjSFJwYjI1ekxtbGpiMjVRY21WbWFYZ2dLeUFuWVd4cFoyNHRiR1ZtZENjc0lIdGNibHgwWEhSY2RGeDBYSFIwYVhSc1pUb2diR0Z1Wnk1d1lYSmhaM0poY0dndWNHRnlZV2R5WVhCb0xGeHVYSFJjZEZ4MFhIUmNkR1J5YjNCa2IzZHVPaUJrY205d1pHOTNibHh1WEhSY2RGeDBYSFI5S1R0Y2JseDBYSFJjZEgwc1hHNWNkRngwWEhSb1pXbG5hSFE2SUdaMWJtTjBhVzl1SUNoc1lXNW5MQ0J2Y0hScGIyNXpLU0I3WEc1Y2RGeDBYSFJjZEhaaGNpQnBkR1Z0Y3lBOUlHOXdkR2x2Ym5NdWJHbHVaVWhsYVdkb2RITXVjbVZrZFdObEtHWjFibU4wYVc5dUlDaHRaVzF2TENCMktTQjdYRzVjZEZ4MFhIUmNkRngwY21WMGRYSnVJRzFsYlc4Z0t5QW5QR3hwUGp4aElHUmhkR0V0WlhabGJuUTlYQ0pzYVc1bFNHVnBaMmgwWENJZ2FISmxaajFjSWlOY0lpQmtZWFJoTFhaaGJIVmxQVndpSnlBcklIQmhjbk5sUm14dllYUW9kaWtnS3lBblhDSStKeUFyWEc1Y2RGeDBYSFJjZEZ4MFhIUmNkRngwWEhRblBHa2dZMnhoYzNNOVhDSW5JQ3NnYjNCMGFXOXVjeTVwWTI5dVVISmxabWw0SUNzZ0oyTm9aV05yWENJK1BDOXBQaUFuSUNzZ2RpQXJYRzVjZEZ4MFhIUmNkRngwWEhSY2RGeDBJQ0FuUEM5aFBqd3ZiR2srSnp0Y2JseDBYSFJjZEZ4MGZTd2dKeWNwTzF4dVhHNWNkRngwWEhSY2RISmxkSFZ5YmlCMGNHeEpZMjl1UW5WMGRHOXVLRzl3ZEdsdmJuTXVhV052YmxCeVpXWnBlQ0FySUNkMFpYaDBMV2hsYVdkb2RDY3NJSHRjYmx4MFhIUmNkRngwWEhSMGFYUnNaVG9nYkdGdVp5NW1iMjUwTG1obGFXZG9kQ3hjYmx4MFhIUmNkRngwWEhSa2NtOXdaRzkzYmpvZ0p6eDFiQ0JqYkdGemN6MWNJbVJ5YjNCa2IzZHVMVzFsYm5WY0lqNG5JQ3NnYVhSbGJYTWdLeUFuUEM5MWJENG5YRzVjZEZ4MFhIUmNkSDBwTzF4dVhHNWNkRngwWEhSOUxGeHVYSFJjZEZ4MGFHVnNjRG9nWm5WdVkzUnBiMjRnS0d4aGJtY3NJRzl3ZEdsdmJuTXBJSHRjYmx4MFhIUmNkRngwY21WMGRYSnVJSFJ3YkVsamIyNUNkWFIwYjI0b2IzQjBhVzl1Y3k1cFkyOXVVSEpsWm1sNElDc2dKM0YxWlhOMGFXOXVKeXdnZTF4dVhIUmNkRngwWEhSY2RHVjJaVzUwT2lBbmMyaHZkMGhsYkhCRWFXRnNiMmNuTEZ4dVhIUmNkRngwWEhSY2RIUnBkR3hsT2lCc1lXNW5MbTl3ZEdsdmJuTXVhR1ZzY0N4Y2JseDBYSFJjZEZ4MFhIUm9hV1JsT2lCMGNuVmxYRzVjZEZ4MFhIUmNkSDBwTzF4dVhIUmNkRngwZlN4Y2JseDBYSFJjZEdaMWJHeHpZM0psWlc0NklHWjFibU4wYVc5dUlDaHNZVzVuTENCdmNIUnBiMjV6S1NCN1hHNWNkRngwWEhSY2RISmxkSFZ5YmlCMGNHeEpZMjl1UW5WMGRHOXVLRzl3ZEdsdmJuTXVhV052YmxCeVpXWnBlQ0FySUNkaGNuSnZkM010WVd4MEp5d2dlMXh1WEhSY2RGeDBYSFJjZEdWMlpXNTBPaUFuWm5Wc2JITmpjbVZsYmljc1hHNWNkRngwWEhSY2RGeDBkR2wwYkdVNklHeGhibWN1YjNCMGFXOXVjeTVtZFd4c2MyTnlaV1Z1WEc1Y2RGeDBYSFJjZEgwcE8xeHVYSFJjZEZ4MGZTeGNibHgwWEhSY2RHTnZaR1YyYVdWM09pQm1kVzVqZEdsdmJpQW9iR0Z1Wnl3Z2IzQjBhVzl1Y3lrZ2UxeHVYSFJjZEZ4MFhIUnlaWFIxY200Z2RIQnNTV052YmtKMWRIUnZiaWh2Y0hScGIyNXpMbWxqYjI1UWNtVm1hWGdnS3lBblkyOWtaU2NzSUh0Y2JseDBYSFJjZEZ4MFhIUmxkbVZ1ZERvZ0oyTnZaR1YyYVdWM0p5eGNibHgwWEhSY2RGeDBYSFIwYVhSc1pUb2diR0Z1Wnk1dmNIUnBiMjV6TG1OdlpHVjJhV1YzWEc1Y2RGeDBYSFJjZEgwcE8xeHVYSFJjZEZ4MGZTeGNibHgwWEhSY2RIVnVaRzg2SUdaMWJtTjBhVzl1SUNoc1lXNW5MQ0J2Y0hScGIyNXpLU0I3WEc1Y2RGeDBYSFJjZEhKbGRIVnliaUIwY0d4SlkyOXVRblYwZEc5dUtHOXdkR2x2Ym5NdWFXTnZibEJ5WldacGVDQXJJQ2QxYm1Sdkp5d2dlMXh1WEhSY2RGeDBYSFJjZEdWMlpXNTBPaUFuZFc1a2J5Y3NYRzVjZEZ4MFhIUmNkRngwZEdsMGJHVTZJR3hoYm1jdWFHbHpkRzl5ZVM1MWJtUnZYRzVjZEZ4MFhIUmNkSDBwTzF4dVhIUmNkRngwZlN4Y2JseDBYSFJjZEhKbFpHODZJR1oxYm1OMGFXOXVJQ2hzWVc1bkxDQnZjSFJwYjI1ektTQjdYRzVjZEZ4MFhIUmNkSEpsZEhWeWJpQjBjR3hKWTI5dVFuVjBkRzl1S0c5d2RHbHZibk11YVdOdmJsQnlaV1pwZUNBcklDZHlaWEJsWVhRbkxDQjdYRzVjZEZ4MFhIUmNkRngwWlhabGJuUTZJQ2R5WldSdkp5eGNibHgwWEhSY2RGeDBYSFIwYVhSc1pUb2diR0Z1Wnk1b2FYTjBiM0o1TG5KbFpHOWNibHgwWEhSY2RGeDBmU2s3WEc1Y2RGeDBYSFI5TEZ4dVhIUmNkRngwYUhJNklHWjFibU4wYVc5dUlDaHNZVzVuTENCdmNIUnBiMjV6S1NCN1hHNWNkRngwWEhSY2RISmxkSFZ5YmlCMGNHeEpZMjl1UW5WMGRHOXVLRzl3ZEdsdmJuTXVhV052YmxCeVpXWnBlQ0FySUNkdGFXNTFjeWNzSUh0Y2JseDBYSFJjZEZ4MFhIUmxkbVZ1ZERvZ0oybHVjMlZ5ZEVodmNtbDZiMjUwWVd4U2RXeGxKeXhjYmx4MFhIUmNkRngwWEhSMGFYUnNaVG9nYkdGdVp5NW9jaTVwYm5ObGNuUmNibHgwWEhSY2RGeDBmU2s3WEc1Y2RGeDBYSFI5WEc1Y2RGeDBmVHRjYmx4dVhIUmNkSFpoY2lCMGNHeFFiM0J2ZG1WeWN5QTlJR1oxYm1OMGFXOXVJQ2hzWVc1bkxDQnZjSFJwYjI1ektTQjdYRzVjZEZ4MFhIUjJZWElnZEhCc1RHbHVhMUJ2Y0c5MlpYSWdQU0JtZFc1amRHbHZiaUFvS1NCN1hHNWNkRngwWEhSY2RIWmhjaUJzYVc1clFuVjBkRzl1SUQwZ2RIQnNTV052YmtKMWRIUnZiaWh2Y0hScGIyNXpMbWxqYjI1UWNtVm1hWGdnS3lBblpXUnBkQ2NzSUh0Y2JseDBYSFJjZEZ4MFhIUjBhWFJzWlRvZ2JHRnVaeTVzYVc1ckxtVmthWFFzWEc1Y2RGeDBYSFJjZEZ4MFpYWmxiblE2SUNkemFHOTNUR2x1YTBScFlXeHZaeWNzWEc1Y2RGeDBYSFJjZEZ4MGFHbGtaVG9nZEhKMVpWeHVYSFJjZEZ4MFhIUjlLVHRjYmx4MFhIUmNkRngwZG1GeUlIVnViR2x1YTBKMWRIUnZiaUE5SUhSd2JFbGpiMjVDZFhSMGIyNG9iM0IwYVc5dWN5NXBZMjl1VUhKbFptbDRJQ3NnSjNWdWJHbHVheWNzSUh0Y2JseDBYSFJjZEZ4MFhIUjBhWFJzWlRvZ2JHRnVaeTVzYVc1ckxuVnViR2x1YXl4Y2JseDBYSFJjZEZ4MFhIUmxkbVZ1ZERvZ0ozVnViR2x1YXlkY2JseDBYSFJjZEZ4MGZTazdYRzVjZEZ4MFhIUmNkSFpoY2lCamIyNTBaVzUwSUQwZ0p6eGhJR2h5WldZOVhDSm9kSFJ3T2k4dmQzZDNMbWR2YjJkc1pTNWpiMjFjSWlCMFlYSm5aWFE5WENKZllteGhibXRjSWo1M2QzY3VaMjl2WjJ4bExtTnZiVHd2WVQ0bWJtSnpjRHNtYm1KemNEc25JQ3RjYmx4MFhIUmNkRngwWEhSY2RGeDBJQ0FuUEdScGRpQmpiR0Z6Y3oxY0ltNXZkR1V0YVc1elpYSjBJR0owYmkxbmNtOTFjRndpUGljZ0sxeHVYSFJjZEZ4MFhIUmNkRngwWEhSY2RHeHBibXRDZFhSMGIyNGdLeUIxYm14cGJtdENkWFIwYjI0Z0sxeHVYSFJjZEZ4MFhIUmNkRngwWEhRZ0lDYzhMMlJwZGo0bk8xeHVYSFJjZEZ4MFhIUnlaWFIxY200Z2RIQnNVRzl3YjNabGNpZ25ibTkwWlMxc2FXNXJMWEJ2Y0c5MlpYSW5MQ0JqYjI1MFpXNTBLVHRjYmx4MFhIUmNkSDA3WEc1Y2JseDBYSFJjZEhaaGNpQjBjR3hKYldGblpWQnZjRzkyWlhJZ1BTQm1kVzVqZEdsdmJpQW9LU0I3WEc1Y2RGeDBYSFJjZEhaaGNpQm1kV3hzUW5WMGRHOXVJRDBnZEhCc1FuVjBkRzl1S0NjOGMzQmhiaUJqYkdGemN6MWNJbTV2ZEdVdFptOXVkSE5wZW1VdE1UQmNJajR4TURBbFBDOXpjR0Z1UGljc0lIdGNibHgwWEhSY2RGeDBYSFIwYVhSc1pUb2diR0Z1Wnk1cGJXRm5aUzV5WlhOcGVtVkdkV3hzTEZ4dVhIUmNkRngwWEhSY2RHVjJaVzUwT2lBbmNtVnphWHBsSnl4Y2JseDBYSFJjZEZ4MFhIUjJZV3gxWlRvZ0p6RW5YRzVjZEZ4MFhIUmNkSDBwTzF4dVhIUmNkRngwWEhSMllYSWdhR0ZzWmtKMWRIUnZiaUE5SUhSd2JFSjFkSFJ2YmlnblBITndZVzRnWTJ4aGMzTTlYQ0p1YjNSbExXWnZiblJ6YVhwbExURXdYQ0krTlRBbFBDOXpjR0Z1UGljc0lIdGNibHgwWEhSY2RGeDBYSFIwYVhSc1pUb2diR0Z1Wnk1cGJXRm5aUzV5WlhOcGVtVklZV3htTEZ4dVhIUmNkRngwWEhSY2RHVjJaVzUwT2lBbmNtVnphWHBsSnl4Y2JseDBYSFJjZEZ4MFhIUjJZV3gxWlRvZ0p6QXVOU2RjYmx4MFhIUmNkRngwZlNrN1hHNWNkRngwWEhSY2RIWmhjaUJ4ZFdGeWRHVnlRblYwZEc5dUlEMGdkSEJzUW5WMGRHOXVLQ2M4YzNCaGJpQmpiR0Z6Y3oxY0ltNXZkR1V0Wm05dWRITnBlbVV0TVRCY0lqNHlOU1U4TDNOd1lXNCtKeXdnZTF4dVhIUmNkRngwWEhSY2RIUnBkR3hsT2lCc1lXNW5MbWx0WVdkbExuSmxjMmw2WlZGMVlYSjBaWElzWEc1Y2RGeDBYSFJjZEZ4MFpYWmxiblE2SUNkeVpYTnBlbVVuTEZ4dVhIUmNkRngwWEhSY2RIWmhiSFZsT2lBbk1DNHlOU2RjYmx4MFhIUmNkRngwZlNrN1hHNWNibHgwWEhSY2RGeDBkbUZ5SUd4bFpuUkNkWFIwYjI0Z1BTQjBjR3hKWTI5dVFuVjBkRzl1S0c5d2RHbHZibk11YVdOdmJsQnlaV1pwZUNBcklDZGhiR2xuYmkxc1pXWjBKeXdnZTF4dVhIUmNkRngwWEhSY2RIUnBkR3hsT2lCc1lXNW5MbWx0WVdkbExtWnNiMkYwVEdWbWRDeGNibHgwWEhSY2RGeDBYSFJsZG1WdWREb2dKMlpzYjJGMFRXVW5MRnh1WEhSY2RGeDBYSFJjZEhaaGJIVmxPaUFuYkdWbWRDZGNibHgwWEhSY2RGeDBmU2s3WEc1Y2RGeDBYSFJjZEhaaGNpQnlhV2RvZEVKMWRIUnZiaUE5SUhSd2JFbGpiMjVDZFhSMGIyNG9iM0IwYVc5dWN5NXBZMjl1VUhKbFptbDRJQ3NnSjJGc2FXZHVMWEpwWjJoMEp5d2dlMXh1WEhSY2RGeDBYSFJjZEhScGRHeGxPaUJzWVc1bkxtbHRZV2RsTG1ac2IyRjBVbWxuYUhRc1hHNWNkRngwWEhSY2RGeDBaWFpsYm5RNklDZG1iRzloZEUxbEp5eGNibHgwWEhSY2RGeDBYSFIyWVd4MVpUb2dKM0pwWjJoMEoxeHVYSFJjZEZ4MFhIUjlLVHRjYmx4MFhIUmNkRngwZG1GeUlHcDFjM1JwWm5sQ2RYUjBiMjRnUFNCMGNHeEpZMjl1UW5WMGRHOXVLRzl3ZEdsdmJuTXVhV052YmxCeVpXWnBlQ0FySUNkaGJHbG5iaTFxZFhOMGFXWjVKeXdnZTF4dVhIUmNkRngwWEhSY2RIUnBkR3hsT2lCc1lXNW5MbWx0WVdkbExtWnNiMkYwVG05dVpTeGNibHgwWEhSY2RGeDBYSFJsZG1WdWREb2dKMlpzYjJGMFRXVW5MRnh1WEhSY2RGeDBYSFJjZEhaaGJIVmxPaUFuYm05dVpTZGNibHgwWEhSY2RGeDBmU2s3WEc1Y2JseDBYSFJjZEZ4MGRtRnlJSEp2ZFc1a1pXUkNkWFIwYjI0Z1BTQjBjR3hKWTI5dVFuVjBkRzl1S0c5d2RHbHZibk11YVdOdmJsQnlaV1pwZUNBcklDZHpjWFZoY21VbkxDQjdYRzVjZEZ4MFhIUmNkRngwZEdsMGJHVTZJR3hoYm1jdWFXMWhaMlV1YzJoaGNHVlNiM1Z1WkdWa0xGeHVYSFJjZEZ4MFhIUmNkR1YyWlc1ME9pQW5hVzFoWjJWVGFHRndaU2NzWEc1Y2RGeDBYSFJjZEZ4MGRtRnNkV1U2SUNkcGJXY3RjbTkxYm1SbFpDZGNibHgwWEhSY2RGeDBmU2s3WEc1Y2RGeDBYSFJjZEhaaGNpQmphWEpqYkdWQ2RYUjBiMjRnUFNCMGNHeEpZMjl1UW5WMGRHOXVLRzl3ZEdsdmJuTXVhV052YmxCeVpXWnBlQ0FySUNkamFYSmpiR1V0Ynljc0lIdGNibHgwWEhSY2RGeDBYSFIwYVhSc1pUb2diR0Z1Wnk1cGJXRm5aUzV6YUdGd1pVTnBjbU5zWlN4Y2JseDBYSFJjZEZ4MFhIUmxkbVZ1ZERvZ0oybHRZV2RsVTJoaGNHVW5MRnh1WEhSY2RGeDBYSFJjZEhaaGJIVmxPaUFuYVcxbkxXTnBjbU5zWlNkY2JseDBYSFJjZEZ4MGZTazdYRzVjZEZ4MFhIUmNkSFpoY2lCMGFIVnRZbTVoYVd4Q2RYUjBiMjRnUFNCMGNHeEpZMjl1UW5WMGRHOXVLRzl3ZEdsdmJuTXVhV052YmxCeVpXWnBlQ0FySUNkd2FXTjBkWEpsTFc4bkxDQjdYRzVjZEZ4MFhIUmNkRngwZEdsMGJHVTZJR3hoYm1jdWFXMWhaMlV1YzJoaGNHVlVhSFZ0WW01aGFXd3NYRzVjZEZ4MFhIUmNkRngwWlhabGJuUTZJQ2RwYldGblpWTm9ZWEJsSnl4Y2JseDBYSFJjZEZ4MFhIUjJZV3gxWlRvZ0oybHRaeTEwYUhWdFltNWhhV3duWEc1Y2RGeDBYSFJjZEgwcE8xeHVYSFJjZEZ4MFhIUjJZWElnYm05dVpVSjFkSFJ2YmlBOUlIUndiRWxqYjI1Q2RYUjBiMjRvYjNCMGFXOXVjeTVwWTI5dVVISmxabWw0SUNzZ0ozUnBiV1Z6Snl3Z2UxeHVYSFJjZEZ4MFhIUmNkSFJwZEd4bE9pQnNZVzVuTG1sdFlXZGxMbk5vWVhCbFRtOXVaU3hjYmx4MFhIUmNkRngwWEhSbGRtVnVkRG9nSjJsdFlXZGxVMmhoY0dVbkxGeHVYSFJjZEZ4MFhIUmNkSFpoYkhWbE9pQW5KMXh1WEhSY2RGeDBYSFI5S1R0Y2JseHVYSFJjZEZ4MFhIUjJZWElnY21WdGIzWmxRblYwZEc5dUlEMGdkSEJzU1dOdmJrSjFkSFJ2YmlodmNIUnBiMjV6TG1samIyNVFjbVZtYVhnZ0t5QW5kSEpoYzJndGJ5Y3NJSHRjYmx4MFhIUmNkRngwWEhSMGFYUnNaVG9nYkdGdVp5NXBiV0ZuWlM1eVpXMXZkbVVzWEc1Y2RGeDBYSFJjZEZ4MFpYWmxiblE2SUNkeVpXMXZkbVZOWldScFlTY3NYRzVjZEZ4MFhIUmNkRngwZG1Gc2RXVTZJQ2R1YjI1bEoxeHVYSFJjZEZ4MFhIUjlLVHRjYmx4dVhIUmNkRngwWEhSMllYSWdZMjl1ZEdWdWRDQTlJQ2M4WkdsMklHTnNZWE56UFZ3aVluUnVMV2R5YjNWd1hDSStKeUFySUdaMWJHeENkWFIwYjI0Z0t5Qm9ZV3htUW5WMGRHOXVJQ3NnY1hWaGNuUmxja0oxZEhSdmJpQXJJQ2M4TDJScGRqNG5JQ3RjYmx4MFhIUmNkRngwWEhSY2RGeDBJQ0FuUEdScGRpQmpiR0Z6Y3oxY0ltSjBiaTFuY205MWNGd2lQaWNnS3lCc1pXWjBRblYwZEc5dUlDc2djbWxuYUhSQ2RYUjBiMjRnS3lCcWRYTjBhV1o1UW5WMGRHOXVJQ3NnSnp3dlpHbDJQaWNnSzF4dVhIUmNkRngwWEhSY2RGeDBYSFFnSUNjOFpHbDJJR05zWVhOelBWd2lZblJ1TFdkeWIzVndYQ0krSnlBcklISnZkVzVrWldSQ2RYUjBiMjRnS3lCamFYSmpiR1ZDZFhSMGIyNGdLeUIwYUhWdFltNWhhV3hDZFhSMGIyNGdLeUJ1YjI1bFFuVjBkRzl1SUNzZ0p6d3ZaR2wyUGljZ0sxeHVYSFJjZEZ4MFhIUmNkRngwWEhRZ0lDYzhaR2wySUdOc1lYTnpQVndpWW5SdUxXZHliM1Z3WENJK0p5QXJJSEpsYlc5MlpVSjFkSFJ2YmlBcklDYzhMMlJwZGo0bk8xeHVYSFJjZEZ4MFhIUnlaWFIxY200Z2RIQnNVRzl3YjNabGNpZ25ibTkwWlMxcGJXRm5aUzF3YjNCdmRtVnlKeXdnWTI5dWRHVnVkQ2s3WEc1Y2RGeDBYSFI5TzF4dVhHNWNkRngwWEhSMllYSWdkSEJzUVdseVVHOXdiM1psY2lBOUlHWjFibU4wYVc5dUlDZ3BJSHRjYmx4MFhIUmNkRngwZG1GeUlDUmpiMjUwWlc1MElEMGdKQ2duUEdScGRpQXZQaWNwTzF4dVhIUmNkRngwWEhSbWIzSWdLSFpoY2lCcFpIZ2dQU0F3TENCc1pXNGdQU0J2Y0hScGIyNXpMbUZwY2xCdmNHOTJaWEl1YkdWdVozUm9PeUJwWkhnZ1BDQnNaVzQ3SUdsa2VDc3JLU0I3WEc1Y2RGeDBYSFJjZEZ4MGRtRnlJR2R5YjNWd0lEMGdiM0IwYVc5dWN5NWhhWEpRYjNCdmRtVnlXMmxrZUYwN1hHNWNibHgwWEhSY2RGeDBYSFIyWVhJZ0pHZHliM1Z3SUQwZ0pDZ25QR1JwZGlCamJHRnpjejFjSW01dmRHVXRKeUFySUdkeWIzVndXekJkSUNzZ0p5QmlkRzR0WjNKdmRYQmNJajRuS1R0Y2JseDBYSFJjZEZ4MFhIUm1iM0lnS0haaGNpQnBJRDBnTUN3Z2JHVnVSM0p2ZFhBZ1BTQm5jbTkxY0ZzeFhTNXNaVzVuZEdnN0lHa2dQQ0JzWlc1SGNtOTFjRHNnYVNzcktTQjdYRzVjZEZ4MFhIUmNkRngwWEhSMllYSWdKR0oxZEhSdmJpQTlJQ1FvZEhCc1FuVjBkRzl1U1c1bWIxdG5jbTkxY0ZzeFhWdHBYVjBvYkdGdVp5d2diM0IwYVc5dWN5a3BPMXh1WEc1Y2RGeDBYSFJjZEZ4MFhIUWtZblYwZEc5dUxtRjBkSElvSjJSaGRHRXRibUZ0WlNjc0lHZHliM1Z3V3pGZFcybGRLVHRjYmx4dVhIUmNkRngwWEhSY2RGeDBKR2R5YjNWd0xtRndjR1Z1WkNna1luVjBkRzl1S1R0Y2JseDBYSFJjZEZ4MFhIUjlYRzVjZEZ4MFhIUmNkRngwSkdOdmJuUmxiblF1WVhCd1pXNWtLQ1JuY205MWNDazdYRzVjZEZ4MFhIUmNkSDFjYmx4dVhIUmNkRngwWEhSeVpYUjFjbTRnZEhCc1VHOXdiM1psY2lnbmJtOTBaUzFoYVhJdGNHOXdiM1psY2ljc0lDUmpiMjUwWlc1MExtTm9hV3hrY21WdUtDa3BPMXh1WEhSY2RGeDBmVHRjYmx4dVhIUmNkRngwZG1GeUlDUnViM1JsVUc5d2IzWmxjaUE5SUNRb0p6eGthWFlnWTJ4aGMzTTlYQ0p1YjNSbExYQnZjRzkyWlhKY0lpQXZQaWNwTzF4dVhHNWNkRngwWEhRa2JtOTBaVkJ2Y0c5MlpYSXVZWEJ3Wlc1a0tIUndiRXhwYm10UWIzQnZkbVZ5S0NrcE8xeHVYSFJjZEZ4MEpHNXZkR1ZRYjNCdmRtVnlMbUZ3Y0dWdVpDaDBjR3hKYldGblpWQnZjRzkyWlhJb0tTazdYRzVjYmx4MFhIUmNkR2xtSUNodmNIUnBiMjV6TG1GcGNrMXZaR1VwSUh0Y2JseDBYSFJjZEZ4MEpHNXZkR1ZRYjNCdmRtVnlMbUZ3Y0dWdVpDaDBjR3hCYVhKUWIzQnZkbVZ5S0NrcE8xeHVYSFJjZEZ4MGZWeHVYRzVjZEZ4MFhIUnlaWFIxY200Z0pHNXZkR1ZRYjNCdmRtVnlPMXh1WEhSY2RIMDdYRzVjYmx4MFhIUjJZWElnZEhCc1NHRnVaR3hsY3lBOUlHWjFibU4wYVc5dUlDZ3BJSHRjYmx4MFhIUmNkSEpsZEhWeWJpQW5QR1JwZGlCamJHRnpjejFjSW01dmRHVXRhR0Z1Wkd4bFhDSStKeUFyWEc1Y2RGeDBYSFJjZEZ4MElDYzhaR2wySUdOc1lYTnpQVndpYm05MFpTMWpiMjUwY205c0xYTmxiR1ZqZEdsdmJsd2lQaWNnSzF4dVhIUmNkRngwWEhSY2RDQWdJQ2M4WkdsMklHTnNZWE56UFZ3aWJtOTBaUzFqYjI1MGNtOXNMWE5sYkdWamRHbHZiaTFpWjF3aVBqd3ZaR2wyUGljZ0sxeHVYSFJjZEZ4MFhIUmNkQ0FnSUNjOFpHbDJJR05zWVhOelBWd2libTkwWlMxamIyNTBjbTlzTFdodmJHUmxjaUJ1YjNSbExXTnZiblJ5YjJ3dGJuZGNJajQ4TDJScGRqNG5JQ3RjYmx4MFhIUmNkRngwWEhRZ0lDQW5QR1JwZGlCamJHRnpjejFjSW01dmRHVXRZMjl1ZEhKdmJDMW9iMnhrWlhJZ2JtOTBaUzFqYjI1MGNtOXNMVzVsWENJK1BDOWthWFkrSnlBclhHNWNkRngwWEhSY2RGeDBJQ0FnSnp4a2FYWWdZMnhoYzNNOVhDSnViM1JsTFdOdmJuUnliMnd0YUc5c1pHVnlJRzV2ZEdVdFkyOXVkSEp2YkMxemQxd2lQand2WkdsMlBpY2dLMXh1WEhSY2RGeDBYSFJjZENBZ0lDYzhaR2wySUdOc1lYTnpQVndpYm05MFpTMWpiMjUwY205c0xYTnBlbWx1WnlCdWIzUmxMV052Ym5SeWIyd3RjMlZjSWo0OEwyUnBkajRuSUN0Y2JseDBYSFJjZEZ4MFhIUWdJQ0FuUEdScGRpQmpiR0Z6Y3oxY0ltNXZkR1V0WTI5dWRISnZiQzF6Wld4bFkzUnBiMjR0YVc1bWIxd2lQand2WkdsMlBpY2dLMXh1WEhSY2RGeDBYSFJjZENBblBDOWthWFkrSnlBclhHNWNkRngwWEhSY2RDQWdJQ2M4TDJScGRqNG5PMXh1WEhSY2RIMDdYRzVjYmx4MFhIUXZLaXBjYmx4MFhIUWdLaUJ6YUc5eWRHTjFkQ0IwWVdKc1pTQjBaVzF3YkdGMFpWeHVYSFJjZENBcUlFQndZWEpoYlNCN1UzUnlhVzVuZlNCMGFYUnNaVnh1WEhSY2RDQXFJRUJ3WVhKaGJTQjdVM1J5YVc1bmZTQmliMlI1WEc1Y2RGeDBJQ292WEc1Y2RGeDBkbUZ5SUhSd2JGTm9iM0owWTNWMElEMGdablZ1WTNScGIyNGdLSFJwZEd4bExDQnJaWGx6S1NCN1hHNWNkRngwWEhSMllYSWdhMlY1UTJ4aGMzTWdQU0FuYm05MFpTMXphRzl5ZEdOMWRDMWpiMndnWTI5c0xYaHpMVFlnYm05MFpTMXphRzl5ZEdOMWRDMG5PMXh1WEhSY2RGeDBkbUZ5SUdKdlpIa2dQU0JiWFR0Y2JseHVYSFJjZEZ4MFptOXlJQ2gyWVhJZ2FTQnBiaUJyWlhsektTQjdYRzVjZEZ4MFhIUmNkR2xtSUNoclpYbHpMbWhoYzA5M2JsQnliM0JsY25SNUtHa3BLU0I3WEc1Y2RGeDBYSFJjZEZ4MFltOWtlUzV3ZFhOb0tGeHVYSFJjZEZ4MFhIUmNkQ0FnSnp4a2FYWWdZMnhoYzNNOVhDSW5JQ3NnYTJWNVEyeGhjM01nS3lBbmEyVjVYQ0krSnlBcklHdGxlWE5iYVYwdWEySmtJQ3NnSnp3dlpHbDJQaWNnSzF4dVhIUmNkRngwWEhSY2RDQWdKenhrYVhZZ1kyeGhjM005WENJbklDc2dhMlY1UTJ4aGMzTWdLeUFuYm1GdFpWd2lQaWNnS3lCclpYbHpXMmxkTG5SbGVIUWdLeUFuUEM5a2FYWStKMXh1WEhSY2RGeDBYSFJjZENBZ0tUdGNibHgwWEhSY2RGeDBmVnh1WEhSY2RGeDBmVnh1WEc1Y2RGeDBYSFJ5WlhSMWNtNGdKenhrYVhZZ1kyeGhjM005WENKdWIzUmxMWE5vYjNKMFkzVjBMWEp2ZHlCeWIzZGNJajQ4WkdsMklHTnNZWE56UFZ3aUp5QXJJR3RsZVVOc1lYTnpJQ3NnSjNScGRHeGxJR052YkMxNGN5MXZabVp6WlhRdE5sd2lQaWNnS3lCMGFYUnNaU0FySUNjOEwyUnBkajQ4TDJScGRqNG5JQ3RjYmx4MFhIUmNkRngwSUNBZ0p6eGthWFlnWTJ4aGMzTTlYQ0p1YjNSbExYTm9iM0owWTNWMExYSnZkeUJ5YjNkY0lqNG5JQ3NnWW05a2VTNXFiMmx1S0NjOEwyUnBkajQ4WkdsMklHTnNZWE56UFZ3aWJtOTBaUzF6YUc5eWRHTjFkQzF5YjNjZ2NtOTNYQ0krSnlrZ0t5QW5QQzlrYVhZK0p6dGNibHgwWEhSOU8xeHVYRzVjZEZ4MGRtRnlJSFJ3YkZOb2IzSjBZM1YwVkdWNGRDQTlJR1oxYm1OMGFXOXVJQ2hzWVc1bktTQjdYRzVjZEZ4MFhIUjJZWElnYTJWNWN5QTlJRnRjYmx4MFhIUmNkQ0FnZXlCclltUTZJQ2ZpakpnZ0t5QkNKeXdnZEdWNGREb2diR0Z1Wnk1bWIyNTBMbUp2YkdRZ2ZTeGNibHgwWEhSY2RDQWdleUJyWW1RNklDZmlqSmdnS3lCSkp5d2dkR1Y0ZERvZ2JHRnVaeTVtYjI1MExtbDBZV3hwWXlCOUxGeHVYSFJjZEZ4MElDQjdJR3RpWkRvZ0orS01tQ0FySUZVbkxDQjBaWGgwT2lCc1lXNW5MbVp2Ym5RdWRXNWtaWEpzYVc1bElIMHNYRzVjZEZ4MFhIUWdJSHNnYTJKa09pQW40b3lZSUNzZ1hGeGNYQ2NzSUhSbGVIUTZJR3hoYm1jdVptOXVkQzVqYkdWaGNpQjlYRzVjZEZ4MFhIUmRPMXh1WEc1Y2RGeDBYSFJ5WlhSMWNtNGdkSEJzVTJodmNuUmpkWFFvYkdGdVp5NXphRzl5ZEdOMWRDNTBaWGgwUm05eWJXRjBkR2x1Wnl3Z2EyVjVjeWs3WEc1Y2RGeDBmVHRjYmx4dVhIUmNkSFpoY2lCMGNHeFRhRzl5ZEdOMWRFRmpkR2x2YmlBOUlHWjFibU4wYVc5dUlDaHNZVzVuS1NCN1hHNWNkRngwWEhSMllYSWdhMlY1Y3lBOUlGdGNibHgwWEhSY2RDQWdleUJyWW1RNklDZmlqSmdnS3lCYUp5d2dkR1Y0ZERvZ2JHRnVaeTVvYVhOMGIzSjVMblZ1Wkc4Z2ZTeGNibHgwWEhSY2RDQWdleUJyWW1RNklDZmlqSmdnS3lEaWg2Y2dLeUJhSnl3Z2RHVjRkRG9nYkdGdVp5NW9hWE4wYjNKNUxuSmxaRzhnZlN4Y2JseDBYSFJjZENBZ2V5QnJZbVE2SUNmaWpKZ2dLeUJkSnl3Z2RHVjRkRG9nYkdGdVp5NXdZWEpoWjNKaGNHZ3VhVzVrWlc1MElIMHNYRzVjZEZ4MFhIUWdJSHNnYTJKa09pQW40b3lZSUNzZ1d5Y3NJSFJsZUhRNklHeGhibWN1Y0dGeVlXZHlZWEJvTG05MWRHUmxiblFnZlN4Y2JseDBYSFJjZENBZ2V5QnJZbVE2SUNmaWpKZ2dLeUJGVGxSRlVpY3NJSFJsZUhRNklHeGhibWN1YUhJdWFXNXpaWEowSUgxY2JseDBYSFJjZEYwN1hHNWNibHgwWEhSY2RISmxkSFZ5YmlCMGNHeFRhRzl5ZEdOMWRDaHNZVzVuTG5Ob2IzSjBZM1YwTG1GamRHbHZiaXdnYTJWNWN5azdYRzVjZEZ4MGZUdGNibHh1WEhSY2RIWmhjaUIwY0d4VGFHOXlkR04xZEZCaGNtRWdQU0JtZFc1amRHbHZiaUFvYkdGdVp5a2dlMXh1WEhSY2RGeDBkbUZ5SUd0bGVYTWdQU0JiWEc1Y2RGeDBYSFFnSUhzZ2EySmtPaUFuNG95WUlDc2c0b2VuSUNzZ1RDY3NJSFJsZUhRNklHeGhibWN1Y0dGeVlXZHlZWEJvTG14bFpuUWdmU3hjYmx4MFhIUmNkQ0FnZXlCclltUTZJQ2ZpakpnZ0t5RGloNmNnS3lCRkp5d2dkR1Y0ZERvZ2JHRnVaeTV3WVhKaFozSmhjR2d1WTJWdWRHVnlJSDBzWEc1Y2RGeDBYSFFnSUhzZ2EySmtPaUFuNG95WUlDc2c0b2VuSUNzZ1VpY3NJSFJsZUhRNklHeGhibWN1Y0dGeVlXZHlZWEJvTG5KcFoyaDBJSDBzWEc1Y2RGeDBYSFFnSUhzZ2EySmtPaUFuNG95WUlDc2c0b2VuSUNzZ1NpY3NJSFJsZUhRNklHeGhibWN1Y0dGeVlXZHlZWEJvTG1wMWMzUnBabmtnZlN4Y2JseDBYSFJjZENBZ2V5QnJZbVE2SUNmaWpKZ2dLeURpaDZjZ0t5Qk9WVTAzSnl3Z2RHVjRkRG9nYkdGdVp5NXNhWE4wY3k1dmNtUmxjbVZrSUgwc1hHNWNkRngwWEhRZ0lIc2dhMkprT2lBbjRveVlJQ3NnNG9lbklDc2dUbFZOT0Njc0lIUmxlSFE2SUd4aGJtY3ViR2x6ZEhNdWRXNXZjbVJsY21Wa0lIMWNibHgwWEhSY2RGMDdYRzVjYmx4MFhIUmNkSEpsZEhWeWJpQjBjR3hUYUc5eWRHTjFkQ2hzWVc1bkxuTm9iM0owWTNWMExuQmhjbUZuY21Gd2FFWnZjbTFoZEhScGJtY3NJR3RsZVhNcE8xeHVYSFJjZEgwN1hHNWNibHgwWEhSMllYSWdkSEJzVTJodmNuUmpkWFJUZEhsc1pTQTlJR1oxYm1OMGFXOXVJQ2hzWVc1bktTQjdYRzVjZEZ4MFhIUjJZWElnYTJWNWN5QTlJRnRjYmx4MFhIUmNkQ0FnZXlCclltUTZJQ2ZpakpnZ0t5Qk9WVTB3Snl3Z2RHVjRkRG9nYkdGdVp5NXpkSGxzWlM1dWIzSnRZV3dnZlN4Y2JseDBYSFJjZENBZ2V5QnJZbVE2SUNmaWpKZ2dLeUJPVlUweEp5d2dkR1Y0ZERvZ2JHRnVaeTV6ZEhsc1pTNW9NU0I5TEZ4dVhIUmNkRngwSUNCN0lHdGlaRG9nSitLTW1DQXJJRTVWVFRJbkxDQjBaWGgwT2lCc1lXNW5Mbk4wZVd4bExtZ3lJSDBzWEc1Y2RGeDBYSFFnSUhzZ2EySmtPaUFuNG95WUlDc2dUbFZOTXljc0lIUmxlSFE2SUd4aGJtY3VjM1I1YkdVdWFETWdmU3hjYmx4MFhIUmNkQ0FnZXlCclltUTZJQ2ZpakpnZ0t5Qk9WVTAwSnl3Z2RHVjRkRG9nYkdGdVp5NXpkSGxzWlM1b05DQjlMRnh1WEhSY2RGeDBJQ0I3SUd0aVpEb2dKK0tNbUNBcklFNVZUVFVuTENCMFpYaDBPaUJzWVc1bkxuTjBlV3hsTG1nMUlIMHNYRzVjZEZ4MFhIUWdJSHNnYTJKa09pQW40b3lZSUNzZ1RsVk5OaWNzSUhSbGVIUTZJR3hoYm1jdWMzUjViR1V1YURZZ2ZWeHVYSFJjZEZ4MFhUdGNibHh1WEhSY2RGeDBjbVYwZFhKdUlIUndiRk5vYjNKMFkzVjBLR3hoYm1jdWMyaHZjblJqZFhRdVpHOWpkVzFsYm5SVGRIbHNaU3dnYTJWNWN5azdYRzVjZEZ4MGZUdGNibHh1WEhSY2RIWmhjaUIwY0d4RmVIUnlZVk5vYjNKMFkzVjBjeUE5SUdaMWJtTjBhVzl1SUNoc1lXNW5MQ0J2Y0hScGIyNXpLU0I3WEc1Y2RGeDBYSFIyWVhJZ1pYaDBjbUZMWlhseklEMGdiM0IwYVc5dWN5NWxlSFJ5WVV0bGVYTTdYRzVjZEZ4MFhIUjJZWElnYTJWNWN5QTlJRnRkTzF4dVhHNWNkRngwWEhSbWIzSWdLSFpoY2lCclpYa2dhVzRnWlhoMGNtRkxaWGx6S1NCN1hHNWNkRngwWEhSY2RHbG1JQ2hsZUhSeVlVdGxlWE11YUdGelQzZHVVSEp2Y0dWeWRIa29hMlY1S1NrZ2UxeHVYSFJjZEZ4MFhIUmNkR3RsZVhNdWNIVnphQ2g3SUd0aVpEb2dhMlY1TENCMFpYaDBPaUJsZUhSeVlVdGxlWE5iYTJWNVhTQjlLVHRjYmx4MFhIUmNkRngwZlZ4dVhIUmNkRngwZlZ4dVhHNWNkRngwWEhSeVpYUjFjbTRnZEhCc1UyaHZjblJqZFhRb2JHRnVaeTV6YUc5eWRHTjFkQzVsZUhSeVlVdGxlWE1zSUd0bGVYTXBPMXh1WEhSY2RIMDdYRzVjYmx4MFhIUjJZWElnZEhCc1UyaHZjblJqZFhSVVlXSnNaU0E5SUdaMWJtTjBhVzl1SUNoc1lXNW5MQ0J2Y0hScGIyNXpLU0I3WEc1Y2RGeDBYSFIyWVhJZ1kyOXNRMnhoYzNNZ1BTQW5ZMnhoYzNNOVhDSnViM1JsTFhOb2IzSjBZM1YwSUc1dmRHVXRjMmh2Y25SamRYUXRZMjlzSUdOdmJDMXpiUzAySUdOdmJDMTRjeTB4TWx3aUp6dGNibHgwWEhSY2RIWmhjaUIwWlcxd2JHRjBaU0E5SUZ0Y2JseDBYSFJjZENBZ0p6eGthWFlnSnlBcklHTnZiRU5zWVhOeklDc2dKejRuSUNzZ2RIQnNVMmh2Y25SamRYUkJZM1JwYjI0b2JHRnVaeXdnYjNCMGFXOXVjeWtnS3lBblBDOWthWFkrSnlBclhHNWNkRngwWEhRZ0lDYzhaR2wySUNjZ0t5QmpiMnhEYkdGemN5QXJJQ2MrSnlBcklIUndiRk5vYjNKMFkzVjBWR1Y0ZENoc1lXNW5MQ0J2Y0hScGIyNXpLU0FySUNjOEwyUnBkajRuTEZ4dVhIUmNkRngwSUNBblBHUnBkaUFuSUNzZ1kyOXNRMnhoYzNNZ0t5QW5QaWNnS3lCMGNHeFRhRzl5ZEdOMWRGTjBlV3hsS0d4aGJtY3NJRzl3ZEdsdmJuTXBJQ3NnSnp3dlpHbDJQaWNnSzF4dVhIUmNkRngwSUNBblBHUnBkaUFuSUNzZ1kyOXNRMnhoYzNNZ0t5QW5QaWNnS3lCMGNHeFRhRzl5ZEdOMWRGQmhjbUVvYkdGdVp5d2diM0IwYVc5dWN5a2dLeUFuUEM5a2FYWStKMXh1WEhSY2RGeDBYVHRjYmx4dVhIUmNkRngwYVdZZ0tHOXdkR2x2Ym5NdVpYaDBjbUZMWlhsektTQjdYRzVjZEZ4MFhIUmNkSFJsYlhCc1lYUmxMbkIxYzJnb0p6eGthWFlnSnlBcklHTnZiRU5zWVhOeklDc2dKejRuSUNzZ2RIQnNSWGgwY21GVGFHOXlkR04xZEhNb2JHRnVaeXdnYjNCMGFXOXVjeWtnS3lBblBDOWthWFkrSnlrN1hHNWNkRngwWEhSOVhHNWNibHgwWEhSY2RISmxkSFZ5YmlBblBHUnBkaUJqYkdGemN6MWNJbTV2ZEdVdGMyaHZjblJqZFhRdGNtOTNJSEp2ZDF3aVBpY2dLMXh1WEhSY2RGeDBYSFJjZENCMFpXMXdiR0YwWlM1cWIybHVLQ2M4TDJScGRqNDhaR2wySUdOc1lYTnpQVndpYm05MFpTMXphRzl5ZEdOMWRDMXliM2NnY205M1hDSStKeWtnSzF4dVhIUmNkRngwWEhRZ0lDQW5QQzlrYVhZK0p6dGNibHgwWEhSOU8xeHVYRzVjZEZ4MGRtRnlJSEpsY0d4aFkyVk5ZV05MWlhseklEMGdablZ1WTNScGIyNGdLSE5JZEcxc0tTQjdYRzVjZEZ4MFhIUnlaWFIxY200Z2MwaDBiV3d1Y21Wd2JHRmpaU2d2NG95WUwyY3NJQ2REZEhKc0p5a3VjbVZ3YkdGalpTZ3Y0b2VuTDJjc0lDZFRhR2xtZENjcE8xeHVYSFJjZEgwN1hHNWNibHgwWEhSMllYSWdkSEJzUkdsaGJHOW5TVzVtYnlBOUlIdGNibHgwWEhSY2RHbHRZV2RsT2lCbWRXNWpkR2x2YmlBb2JHRnVaeXdnYjNCMGFXOXVjeWtnZTF4dVhIUmNkRngwWEhSMllYSWdhVzFoWjJWTWFXMXBkR0YwYVc5dUlEMGdKeWM3WEc1Y2RGeDBYSFJjZEdsbUlDaHZjSFJwYjI1ekxtMWhlR2x0ZFcxSmJXRm5aVVpwYkdWVGFYcGxLU0I3WEc1Y2RGeDBYSFJjZEZ4MGRtRnlJSFZ1YVhRZ1BTQk5ZWFJvTG1ac2IyOXlLRTFoZEdndWJHOW5LRzl3ZEdsdmJuTXViV0Y0YVcxMWJVbHRZV2RsUm1sc1pWTnBlbVVwSUM4Z1RXRjBhQzVzYjJjb01UQXlOQ2twTzF4dVhIUmNkRngwWEhSY2RIWmhjaUJ5WldGa1lXSnNaVk5wZW1VZ1BTQW9iM0IwYVc5dWN5NXRZWGhwYlhWdFNXMWhaMlZHYVd4bFUybDZaU0F2SUUxaGRHZ3VjRzkzS0RFd01qUXNJSFZ1YVhRcEtTNTBiMFpwZUdWa0tESXBJQ29nTVNBclhHNWNkRngwWEhSY2RGeDBYSFJjZEZ4MFhIUWdJQ0FuSUNjZ0t5QW5JRXROUjFSUUoxdDFibWwwWFNBcklDZENKenRjYmx4MFhIUmNkRngwWEhScGJXRm5aVXhwYldsMFlYUnBiMjRnUFNBblBITnRZV3hzUGljZ0t5QnNZVzVuTG1sdFlXZGxMbTFoZUdsdGRXMUdhV3hsVTJsNlpTQXJJQ2NnT2lBbklDc2djbVZoWkdGaWJHVlRhWHBsSUNzZ0p6d3ZjMjFoYkd3K0p6dGNibHgwWEhSY2RGeDBmVnh1WEc1Y2RGeDBYSFJjZEhaaGNpQmliMlI1SUQwZ0p6eGthWFlnWTJ4aGMzTTlYQ0ptYjNKdExXZHliM1Z3SUhKdmR5MW1iSFZwWkNCdWIzUmxMV2R5YjNWd0xYTmxiR1ZqZEMxbWNtOXRMV1pwYkdWelhDSStKeUFyWEc1Y2RGeDBYSFJjZEZ4MFhIUmNkQ0FuUEd4aFltVnNQaWNnS3lCc1lXNW5MbWx0WVdkbExuTmxiR1ZqZEVaeWIyMUdhV3hsY3lBcklDYzhMMnhoWW1Wc1BpY2dLMXh1WEhSY2RGeDBYSFJjZEZ4MFhIUWdKenhwYm5CMWRDQmpiR0Z6Y3oxY0ltNXZkR1V0YVcxaFoyVXRhVzV3ZFhSY0lpQjBlWEJsUFZ3aVptbHNaVndpSUc1aGJXVTlYQ0ptYVd4bGMxd2lJR0ZqWTJWd2REMWNJbWx0WVdkbEx5cGNJaUJ0ZFd4MGFYQnNaVDFjSW0xMWJIUnBjR3hsWENJZ0x6NG5JQ3RjYmx4MFhIUmNkRngwWEhSY2RGeDBJR2x0WVdkbFRHbHRhWFJoZEdsdmJpQXJYRzVjZEZ4MFhIUmNkRngwWEhRZ0lDQW5QQzlrYVhZK0p5QXJYRzVjZEZ4MFhIUmNkRngwWEhRZ0lDQW5QR1JwZGlCamJHRnpjejFjSW1admNtMHRaM0p2ZFhBZ2NtOTNMV1pzZFdsa1hDSStKeUFyWEc1Y2RGeDBYSFJjZEZ4MFhIUmNkQ0FuUEd4aFltVnNQaWNnS3lCc1lXNW5MbWx0WVdkbExuVnliQ0FySUNjOEwyeGhZbVZzUGljZ0sxeHVYSFJjZEZ4MFhIUmNkRngwWEhRZ0p6eHBibkIxZENCamJHRnpjejFjSW01dmRHVXRhVzFoWjJVdGRYSnNJR1p2Y20wdFkyOXVkSEp2YkNCemNHRnVNVEpjSWlCMGVYQmxQVndpZEdWNGRGd2lJQzgrSnlBclhHNWNkRngwWEhSY2RGeDBYSFFnSUNBblBDOWthWFkrSnp0Y2JseDBYSFJjZEZ4MGRtRnlJR1p2YjNSbGNpQTlJQ2M4WW5WMGRHOXVJR2h5WldZOVhDSWpYQ0lnWTJ4aGMzTTlYQ0ppZEc0Z1luUnVMWEJ5YVcxaGNua2dibTkwWlMxcGJXRm5aUzFpZEc0Z1pHbHpZV0pzWldSY0lpQmthWE5oWW14bFpENG5JQ3NnYkdGdVp5NXBiV0ZuWlM1cGJuTmxjblFnS3lBblBDOWlkWFIwYjI0K0p6dGNibHgwWEhSY2RGeDBjbVYwZFhKdUlIUndiRVJwWVd4dlp5Z25ibTkwWlMxcGJXRm5aUzFrYVdGc2IyY25MQ0JzWVc1bkxtbHRZV2RsTG1sdWMyVnlkQ3dnWW05a2VTd2dabTl2ZEdWeUtUdGNibHgwWEhSY2RIMHNYRzVjYmx4MFhIUmNkR3hwYm1zNklHWjFibU4wYVc5dUlDaHNZVzVuTENCdmNIUnBiMjV6S1NCN1hHNWNkRngwWEhSY2RIWmhjaUJpYjJSNUlEMGdKenhrYVhZZ1kyeGhjM005WENKbWIzSnRMV2R5YjNWd0lISnZkeTFtYkhWcFpGd2lQaWNnSzF4dVhIUmNkRngwWEhSY2RGeDBYSFFnSnp4c1lXSmxiRDRuSUNzZ2JHRnVaeTVzYVc1ckxuUmxlSFJVYjBScGMzQnNZWGtnS3lBblBDOXNZV0psYkQ0bklDdGNibHgwWEhSY2RGeDBYSFJjZEZ4MElDYzhhVzV3ZFhRZ1kyeGhjM005WENKdWIzUmxMV3hwYm1zdGRHVjRkQ0JtYjNKdExXTnZiblJ5YjJ3Z2MzQmhiakV5WENJZ2RIbHdaVDFjSW5SbGVIUmNJaUF2UGljZ0sxeHVYSFJjZEZ4MFhIUmNkRngwSUNBZ0p6d3ZaR2wyUGljZ0sxeHVYSFJjZEZ4MFhIUmNkRngwSUNBZ0p6eGthWFlnWTJ4aGMzTTlYQ0ptYjNKdExXZHliM1Z3SUhKdmR5MW1iSFZwWkZ3aVBpY2dLMXh1WEhSY2RGeDBYSFJjZEZ4MFhIUWdKenhzWVdKbGJENG5JQ3NnYkdGdVp5NXNhVzVyTG5WeWJDQXJJQ2M4TDJ4aFltVnNQaWNnSzF4dVhIUmNkRngwWEhSY2RGeDBYSFFnSnp4cGJuQjFkQ0JqYkdGemN6MWNJbTV2ZEdVdGJHbHVheTExY213Z1ptOXliUzFqYjI1MGNtOXNJSE53WVc0eE1sd2lJSFI1Y0dVOVhDSjBaWGgwWENJZ0x6NG5JQ3RjYmx4MFhIUmNkRngwWEhSY2RDQWdJQ2M4TDJScGRqNG5JQ3RjYmx4MFhIUmNkRngwWEhSY2RDQWdJQ2doYjNCMGFXOXVjeTVrYVhOaFlteGxUR2x1YTFSaGNtZGxkQ0EvWEc1Y2RGeDBYSFJjZEZ4MFhIUmNkQ0FuUEdScGRpQmpiR0Z6Y3oxY0ltTm9aV05yWW05NFhDSStKeUFyWEc1Y2RGeDBYSFJjZEZ4MFhIUmNkQ0FnSUNjOGJHRmlaV3crSnlBcklDYzhhVzV3ZFhRZ2RIbHdaVDFjSW1Ob1pXTnJZbTk0WENJZ1kyaGxZMnRsWkQ0Z0p5QXJYRzVjZEZ4MFhIUmNkRngwWEhSY2RGeDBJR3hoYm1jdWJHbHVheTV2Y0dWdVNXNU9aWGRYYVc1a2IzY2dLMXh1WEhSY2RGeDBYSFJjZEZ4MFhIUWdJQ0FuUEM5c1lXSmxiRDRuSUN0Y2JseDBYSFJjZEZ4MFhIUmNkRngwSUNjOEwyUnBkajRuSURvZ0p5ZGNibHgwWEhSY2RGeDBYSFJjZENBZ0lDazdYRzVjZEZ4MFhIUmNkSFpoY2lCbWIyOTBaWElnUFNBblBHSjFkSFJ2YmlCb2NtVm1QVndpSTF3aUlHTnNZWE56UFZ3aVluUnVJR0owYmkxd2NtbHRZWEo1SUc1dmRHVXRiR2x1YXkxaWRHNGdaR2x6WVdKc1pXUmNJaUJrYVhOaFlteGxaRDRuSUNzZ2JHRnVaeTVzYVc1ckxtbHVjMlZ5ZENBcklDYzhMMkoxZEhSdmJqNG5PMXh1WEhSY2RGeDBYSFJ5WlhSMWNtNGdkSEJzUkdsaGJHOW5LQ2R1YjNSbExXeHBibXN0WkdsaGJHOW5KeXdnYkdGdVp5NXNhVzVyTG1sdWMyVnlkQ3dnWW05a2VTd2dabTl2ZEdWeUtUdGNibHgwWEhSY2RIMHNYRzVjYmx4MFhIUmNkR2hsYkhBNklHWjFibU4wYVc5dUlDaHNZVzVuTENCdmNIUnBiMjV6S1NCN1hHNWNkRngwWEhSY2RIWmhjaUJpYjJSNUlEMGdKenhoSUdOc1lYTnpQVndpYlc5a1lXd3RZMnh2YzJVZ2NIVnNiQzF5YVdkb2RGd2lJR0Z5YVdFdGFHbGtaR1Z1UFZ3aWRISjFaVndpSUhSaFltbHVaR1Y0UFZ3aUxURmNJajRuSUNzZ2JHRnVaeTV6YUc5eWRHTjFkQzVqYkc5elpTQXJJQ2M4TDJFK0p5QXJYRzVjZEZ4MFhIUmNkRngwWEhRZ0lDQW5QR1JwZGlCamJHRnpjejFjSW5ScGRHeGxYQ0krSnlBcklHeGhibWN1YzJodmNuUmpkWFF1YzJodmNuUmpkWFJ6SUNzZ0p6d3ZaR2wyUGljZ0sxeHVYSFJjZEZ4MFhIUmNkRngwSUNBZ0tHRm5aVzUwTG1selRXRmpJRDhnZEhCc1UyaHZjblJqZFhSVVlXSnNaU2hzWVc1bkxDQnZjSFJwYjI1ektTQTZJSEpsY0d4aFkyVk5ZV05MWlhsektIUndiRk5vYjNKMFkzVjBWR0ZpYkdVb2JHRnVaeXdnYjNCMGFXOXVjeWtwS1NBclhHNWNkRngwWEhSY2RGeDBYSFFnSUNBblBIQWdZMnhoYzNNOVhDSjBaWGgwTFdObGJuUmxjbHdpUGljZ0sxeHVYSFJjZEZ4MFhIUmNkRngwWEhRZ0p6eGhJR2h5WldZOVhDSXZMM04xYlcxbGNtNXZkR1V1YjNKbkwxd2lJSFJoY21kbGREMWNJbDlpYkdGdWExd2lQbE4xYlcxbGNtNXZkR1VnTUM0MkxqTThMMkUrSU1LM0lDY2dLMXh1WEhSY2RGeDBYSFJjZEZ4MFhIUWdKenhoSUdoeVpXWTlYQ0l2TDJkcGRHaDFZaTVqYjIwdmMzVnRiV1Z5Ym05MFpTOXpkVzF0WlhKdWIzUmxYQ0lnZEdGeVoyVjBQVndpWDJKc1lXNXJYQ0krVUhKdmFtVmpkRHd2WVQ0Z3dyY2dKeUFyWEc1Y2RGeDBYSFJjZEZ4MFhIUmNkQ0FuUEdFZ2FISmxaajFjSWk4dloybDBhSFZpTG1OdmJTOXpkVzF0WlhKdWIzUmxMM04xYlcxbGNtNXZkR1V2YVhOemRXVnpYQ0lnZEdGeVoyVjBQVndpWDJKc1lXNXJYQ0krU1hOemRXVnpQQzloUGljZ0sxeHVYSFJjZEZ4MFhIUmNkRngwSUNBZ0p6d3ZjRDRuTzF4dVhIUmNkRngwWEhSeVpYUjFjbTRnZEhCc1JHbGhiRzluS0NkdWIzUmxMV2hsYkhBdFpHbGhiRzluSnl3Z0p5Y3NJR0p2Wkhrc0lDY25LVHRjYmx4MFhIUmNkSDFjYmx4MFhIUjlPMXh1WEc1Y2RGeDBkbUZ5SUhSd2JFUnBZV3h2WjNNZ1BTQm1kVzVqZEdsdmJpQW9iR0Z1Wnl3Z2IzQjBhVzl1Y3lrZ2UxeHVYSFJjZEZ4MGRtRnlJR1JwWVd4dlozTWdQU0FuSnp0Y2JseHVYSFJjZEZ4MEpDNWxZV05vS0hSd2JFUnBZV3h2WjBsdVptOHNJR1oxYm1OMGFXOXVJQ2hwWkhnc0lIUndiRVJwWVd4dlp5a2dlMXh1WEhSY2RGeDBYSFJrYVdGc2IyZHpJQ3M5SUhSd2JFUnBZV3h2Wnloc1lXNW5MQ0J2Y0hScGIyNXpLVHRjYmx4MFhIUmNkSDBwTzF4dVhHNWNkRngwWEhSeVpYUjFjbTRnSnp4a2FYWWdZMnhoYzNNOVhDSnViM1JsTFdScFlXeHZaMXdpUGljZ0t5QmthV0ZzYjJkeklDc2dKend2WkdsMlBpYzdYRzVjZEZ4MGZUdGNibHh1WEhSY2RIWmhjaUIwY0d4VGRHRjBkWE5pWVhJZ1BTQm1kVzVqZEdsdmJpQW9LU0I3WEc1Y2RGeDBYSFJ5WlhSMWNtNGdKenhrYVhZZ1kyeGhjM005WENKdWIzUmxMWEpsYzJsNlpXSmhjbHdpUGljZ0sxeHVYSFJjZEZ4MFhIUmNkQ0FuUEdScGRpQmpiR0Z6Y3oxY0ltNXZkR1V0YVdOdmJpMWlZWEpjSWo0OEwyUnBkajRuSUN0Y2JseDBYSFJjZEZ4MFhIUWdKenhrYVhZZ1kyeGhjM005WENKdWIzUmxMV2xqYjI0dFltRnlYQ0krUEM5a2FYWStKeUFyWEc1Y2RGeDBYSFJjZEZ4MElDYzhaR2wySUdOc1lYTnpQVndpYm05MFpTMXBZMjl1TFdKaGNsd2lQand2WkdsMlBpY2dLMXh1WEhSY2RGeDBYSFFnSUNBblBDOWthWFkrSnp0Y2JseDBYSFI5TzF4dVhHNWNkRngwZG1GeUlISmxjSEpsYzJWdWRGTm9iM0owWTNWMElEMGdablZ1WTNScGIyNGdLSE4wY2lrZ2UxeHVYSFJjZEZ4MGFXWWdLR0ZuWlc1MExtbHpUV0ZqS1NCN1hHNWNkRngwWEhSY2RITjBjaUE5SUhOMGNpNXlaWEJzWVdObEtDZERUVVFuTENBbjRveVlKeWt1Y21Wd2JHRmpaU2duVTBoSlJsUW5MQ0FuNG9lbkp5azdYRzVjZEZ4MFhIUjlYRzVjYmx4MFhIUmNkSEpsZEhWeWJpQnpkSEl1Y21Wd2JHRmpaU2duUWtGRFMxTk1RVk5JSnl3Z0oxeGNYRnduS1Z4dVhIUmNkRngwWEhSY2RDQWdMbkpsY0d4aFkyVW9KMU5NUVZOSUp5d2dKeThuS1Z4dVhIUmNkRngwWEhSY2RDQWdMbkpsY0d4aFkyVW9KMHhGUmxSQ1VrRkRTMFZVSnl3Z0oxc25LVnh1WEhSY2RGeDBYSFJjZENBZ0xuSmxjR3hoWTJVb0oxSkpSMGhVUWxKQlEwdEZWQ2NzSUNkZEp5azdYRzVjZEZ4MGZUdGNibHh1WEhSY2RDOHFLbHh1WEhSY2RDQXFJR055WldGMFpWUnZiMngwYVhCY2JseDBYSFFnS2x4dVhIUmNkQ0FxSUVCd1lYSmhiU0I3YWxGMVpYSjVmU0FrWTI5dWRHRnBibVZ5WEc1Y2RGeDBJQ29nUUhCaGNtRnRJSHRQWW1wbFkzUjlJR3RsZVUxaGNGeHVYSFJjZENBcUlFQndZWEpoYlNCN1UzUnlhVzVuZlNCYmMxQnNZV05sYldWdWRGMWNibHgwWEhRZ0tpOWNibHgwWEhSMllYSWdZM0psWVhSbFZHOXZiSFJwY0NBOUlHWjFibU4wYVc5dUlDZ2tZMjl1ZEdGcGJtVnlMQ0JyWlhsTllYQXNJSE5RYkdGalpXMWxiblFwSUh0Y2JseDBYSFJjZEhaaGNpQnBiblpsY25SbFpFdGxlVTFoY0NBOUlHWjFibU11YVc1MlpYSjBUMkpxWldOMEtHdGxlVTFoY0NrN1hHNWNkRngwWEhSMllYSWdKR0oxZEhSdmJuTWdQU0FrWTI5dWRHRnBibVZ5TG1acGJtUW9KMkoxZEhSdmJpY3BPMXh1WEc1Y2RGeDBYSFFrWW5WMGRHOXVjeTVsWVdOb0tHWjFibU4wYVc5dUlDaHBMQ0JsYkVKMGJpa2dlMXh1WEhSY2RGeDBYSFIyWVhJZ0pHSjBiaUE5SUNRb1pXeENkRzRwTzF4dVhIUmNkRngwWEhSMllYSWdjMU5vYjNKMFkzVjBJRDBnYVc1MlpYSjBaV1JMWlhsTllYQmJKR0owYmk1a1lYUmhLQ2RsZG1WdWRDY3BYVHRjYmx4MFhIUmNkRngwYVdZZ0tITlRhRzl5ZEdOMWRDa2dlMXh1WEhSY2RGeDBYSFJjZENSaWRHNHVZWFIwY2lnbmRHbDBiR1VuTENCbWRXNWpkR2x2YmlBb2FTd2dkaWtnZTF4dVhIUmNkRngwWEhSY2RGeDBjbVYwZFhKdUlIWWdLeUFuSUNnbklDc2djbVZ3Y21WelpXNTBVMmh2Y25SamRYUW9jMU5vYjNKMFkzVjBLU0FySUNjcEp6dGNibHgwWEhSY2RGeDBYSFI5S1R0Y2JseDBYSFJjZEZ4MGZWeHVYSFJjZEZ4MFhIUXZMeUJpYjI5MGMzUnlZWEFnZEc5dmJIUnBjQ0J2YmlCaWRHNHRaM0p2ZFhBZ1luVm5YRzVjZEZ4MFhIUmNkQzh2SUdoMGRIQnpPaTh2WjJsMGFIVmlMbU52YlM5MGQySnpMMkp2YjNSemRISmhjQzlwYzNOMVpYTXZOVFk0TjF4dVhIUmNkRngwZlNrdWRHOXZiSFJwY0NoN1hHNWNkRngwWEhSY2RHTnZiblJoYVc1bGNqb2dKMkp2WkhrbkxGeHVYSFJjZEZ4MFhIUjBjbWxuWjJWeU9pQW5hRzkyWlhJbkxGeHVYSFJjZEZ4MFhIUndiR0ZqWlcxbGJuUTZJSE5RYkdGalpXMWxiblFnZkh3Z0ozUnZjQ2RjYmx4MFhIUmNkSDBwTG05dUtDZGpiR2xqYXljc0lHWjFibU4wYVc5dUlDZ3BJSHRjYmx4MFhIUmNkRngwSkNoMGFHbHpLUzUwYjI5c2RHbHdLQ2RvYVdSbEp5azdYRzVjZEZ4MFhIUjlLVHRjYmx4MFhIUjlPMXh1WEc1Y2RGeDBMeThnWTNKbFlYUmxVR0ZzWlhSMFpWeHVYSFJjZEhaaGNpQmpjbVZoZEdWUVlXeGxkSFJsSUQwZ1puVnVZM1JwYjI0Z0tDUmpiMjUwWVdsdVpYSXNJRzl3ZEdsdmJuTXBJSHRjYmx4MFhIUmNkSFpoY2lCamIyeHZja2x1Wm04Z1BTQnZjSFJwYjI1ekxtTnZiRzl5Y3p0Y2JseDBYSFJjZENSamIyNTBZV2x1WlhJdVptbHVaQ2duTG01dmRHVXRZMjlzYjNJdGNHRnNaWFIwWlNjcExtVmhZMmdvWm5WdVkzUnBiMjRnS0NrZ2UxeHVYSFJjZEZ4MFhIUjJZWElnSkhCaGJHVjBkR1VnUFNBa0tIUm9hWE1wTENCbGRtVnVkRTVoYldVZ1BTQWtjR0ZzWlhSMFpTNWhkSFJ5S0Nka1lYUmhMWFJoY21kbGRDMWxkbVZ1ZENjcE8xeHVYSFJjZEZ4MFhIUjJZWElnY0dGc1pYUjBaVU52Ym5SbGJuUnpJRDBnVzEwN1hHNWNkRngwWEhSY2RHWnZjaUFvZG1GeUlISnZkeUE5SURBc0lHeGxibEp2ZHlBOUlHTnZiRzl5U1c1bWJ5NXNaVzVuZEdnN0lISnZkeUE4SUd4bGJsSnZkenNnY205M0t5c3BJSHRjYmx4MFhIUmNkRngwWEhSMllYSWdZMjlzYjNKeklEMGdZMjlzYjNKSmJtWnZXM0p2ZDEwN1hHNWNkRngwWEhSY2RGeDBkbUZ5SUdKMWRIUnZibk1nUFNCYlhUdGNibHgwWEhSY2RGeDBYSFJtYjNJZ0tIWmhjaUJqYjJ3Z1BTQXdMQ0JzWlc1RGIyd2dQU0JqYjJ4dmNuTXViR1Z1WjNSb095QmpiMndnUENCc1pXNURiMnc3SUdOdmJDc3JLU0I3WEc1Y2RGeDBYSFJjZEZ4MFhIUjJZWElnWTI5c2IzSWdQU0JqYjJ4dmNuTmJZMjlzWFR0Y2JseDBYSFJjZEZ4MFhIUmNkR0oxZEhSdmJuTXVjSFZ6YUNoYkp6eGlkWFIwYjI0Z2RIbHdaVDFjSW1KMWRIUnZibHdpSUdOc1lYTnpQVndpYm05MFpTMWpiMnh2Y2kxaWRHNWNJaUJ6ZEhsc1pUMWNJbUpoWTJ0bmNtOTFibVF0WTI5c2IzSTZKeXdnWTI5c2IzSXNYRzVjZEZ4MFhIUmNkRngwWEhSY2RGeDBYSFFnSUNBbk8xd2lJR1JoZEdFdFpYWmxiblE5WENJbkxDQmxkbVZ1ZEU1aGJXVXNYRzVjZEZ4MFhIUmNkRngwWEhSY2RGeDBYSFFnSUNBblhDSWdaR0YwWVMxMllXeDFaVDFjSWljc0lHTnZiRzl5TEZ4dVhIUmNkRngwWEhSY2RGeDBYSFJjZEZ4MElDQWdKMXdpSUhScGRHeGxQVndpSnl3Z1kyOXNiM0lzWEc1Y2RGeDBYSFJjZEZ4MFhIUmNkRngwWEhRZ0lDQW5YQ0lnWkdGMFlTMTBiMmRuYkdVOVhDSmlkWFIwYjI1Y0lpQjBZV0pwYm1SbGVEMWNJaTB4WENJK1BDOWlkWFIwYjI0K0oxMHVhbTlwYmlnbkp5a3BPMXh1WEhSY2RGeDBYSFJjZEgxY2JseDBYSFJjZEZ4MFhIUndZV3hsZEhSbFEyOXVkR1Z1ZEhNdWNIVnphQ2duUEdScGRpQmpiR0Z6Y3oxY0ltNXZkR1V0WTI5c2IzSXRjbTkzWENJK0p5QXJJR0oxZEhSdmJuTXVhbTlwYmlnbkp5a2dLeUFuUEM5a2FYWStKeWs3WEc1Y2RGeDBYSFJjZEgxY2JseDBYSFJjZEZ4MEpIQmhiR1YwZEdVdWFIUnRiQ2h3WVd4bGRIUmxRMjl1ZEdWdWRITXVhbTlwYmlnbkp5a3BPMXh1WEhSY2RGeDBmU2s3WEc1Y2RGeDBmVHRjYmx4dVhIUmNkQzhxS2x4dVhIUmNkQ0FxSUdOeVpXRjBaU0J6ZFcxdFpYSnViM1JsSUd4aGVXOTFkQ0FvWVdseUlHMXZaR1VwWEc1Y2RGeDBJQ3BjYmx4MFhIUWdLaUJBY0dGeVlXMGdlMnBSZFdWeWVYMGdKR2h2YkdSbGNseHVYSFJjZENBcUlFQndZWEpoYlNCN1QySnFaV04wZlNCdmNIUnBiMjV6WEc1Y2RGeDBJQ292WEc1Y2RGeDBkR2hwY3k1amNtVmhkR1ZNWVhsdmRYUkNlVUZwY2sxdlpHVWdQU0JtZFc1amRHbHZiaUFvSkdodmJHUmxjaXdnYjNCMGFXOXVjeWtnZTF4dVhIUmNkRngwZG1GeUlHeGhibWRKYm1adklEMGdiM0IwYVc5dWN5NXNZVzVuU1c1bWJ6dGNibHgwWEhSY2RIWmhjaUJyWlhsTllYQWdQU0J2Y0hScGIyNXpMbXRsZVUxaGNGdGhaMlZ1ZEM1cGMwMWhZeUEvSUNkdFlXTW5JRG9nSjNCakoxMDdYRzVjZEZ4MFhIUjJZWElnYVdRZ1BTQm1kVzVqTG5WdWFYRjFaVWxrS0NrN1hHNWNibHgwWEhSY2RDUm9iMnhrWlhJdVlXUmtRMnhoYzNNb0oyNXZkR1V0WVdseUxXVmthWFJ2Y2lCdWIzUmxMV1ZrYVhSaFlteGxKeWs3WEc1Y2RGeDBYSFFrYUc5c1pHVnlMbUYwZEhJb2UxeHVYSFJjZEZ4MFhIUW5hV1FuT2lBbmJtOTBaUzFsWkdsMGIzSXRKeUFySUdsa0xGeHVYSFJjZEZ4MFhIUW5ZMjl1ZEdWdWRFVmthWFJoWW14bEp6b2dkSEoxWlZ4dVhIUmNkRngwZlNrN1hHNWNibHgwWEhSY2RIWmhjaUJpYjJSNUlEMGdaRzlqZFcxbGJuUXVZbTlrZVR0Y2JseHVYSFJjZEZ4MEx5OGdZM0psWVhSbElGQnZjRzkyWlhKY2JseDBYSFJjZEhaaGNpQWtjRzl3YjNabGNpQTlJQ1FvZEhCc1VHOXdiM1psY25Nb2JHRnVaMGx1Wm04c0lHOXdkR2x2Ym5NcEtUdGNibHgwWEhSY2RDUndiM0J2ZG1WeUxtRmtaRU5zWVhOektDZHViM1JsTFdGcGNpMXNZWGx2ZFhRbktUdGNibHgwWEhSY2RDUndiM0J2ZG1WeUxtRjBkSElvSjJsa0p5d2dKMjV2ZEdVdGNHOXdiM1psY2kwbklDc2dhV1FwTzF4dVhIUmNkRngwSkhCdmNHOTJaWEl1WVhCd1pXNWtWRzhvWW05a2VTazdYRzVjZEZ4MFhIUmpjbVZoZEdWVWIyOXNkR2x3S0NSd2IzQnZkbVZ5TENCclpYbE5ZWEFwTzF4dVhIUmNkRngwWTNKbFlYUmxVR0ZzWlhSMFpTZ2tjRzl3YjNabGNpd2diM0IwYVc5dWN5azdYRzVjYmx4MFhIUmNkQzh2SUdOeVpXRjBaU0JJWVc1a2JHVmNibHgwWEhSY2RIWmhjaUFrYUdGdVpHeGxJRDBnSkNoMGNHeElZVzVrYkdWektDa3BPMXh1WEhSY2RGeDBKR2hoYm1Sc1pTNWhaR1JEYkdGemN5Z25ibTkwWlMxaGFYSXRiR0Y1YjNWMEp5azdYRzVjZEZ4MFhIUWthR0Z1Wkd4bExtRjBkSElvSjJsa0p5d2dKMjV2ZEdVdGFHRnVaR3hsTFNjZ0t5QnBaQ2s3WEc1Y2RGeDBYSFFrYUdGdVpHeGxMbUZ3Y0dWdVpGUnZLR0p2WkhrcE8xeHVYRzVjZEZ4MFhIUXZMeUJqY21WaGRHVWdSR2xoYkc5blhHNWNkRngwWEhSMllYSWdKR1JwWVd4dlp5QTlJQ1FvZEhCc1JHbGhiRzluY3loc1lXNW5TVzVtYnl3Z2IzQjBhVzl1Y3lrcE8xeHVYSFJjZEZ4MEpHUnBZV3h2Wnk1aFpHUkRiR0Z6Y3lnbmJtOTBaUzFoYVhJdGJHRjViM1YwSnlrN1hHNWNkRngwWEhRa1pHbGhiRzluTG1GMGRISW9KMmxrSnl3Z0oyNXZkR1V0WkdsaGJHOW5MU2NnS3lCcFpDazdYRzVjZEZ4MFhIUWtaR2xoYkc5bkxtWnBibVFvSjJKMWRIUnZiaTVqYkc5elpTd2dZUzV0YjJSaGJDMWpiRzl6WlNjcExtTnNhV05yS0daMWJtTjBhVzl1SUNncElIdGNibHgwWEhSY2RGeDBKQ2gwYUdsektTNWpiRzl6WlhOMEtDY3ViVzlrWVd3bktTNXRiMlJoYkNnbmFHbGtaU2NwTzF4dVhIUmNkRngwZlNrN1hHNWNkRngwWEhRa1pHbGhiRzluTG1Gd2NHVnVaRlJ2S0dKdlpIa3BPMXh1WEhSY2RIMDdYRzVjYmx4MFhIUXZLaXBjYmx4MFhIUWdLaUJqY21WaGRHVWdjM1Z0YldWeWJtOTBaU0JzWVhsdmRYUWdLRzV2Y20xaGJDQnRiMlJsS1Z4dVhIUmNkQ0FxWEc1Y2RGeDBJQ29nUUhCaGNtRnRJSHRxVVhWbGNubDlJQ1JvYjJ4a1pYSmNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UwOWlhbVZqZEgwZ2IzQjBhVzl1YzF4dVhIUmNkQ0FxTDF4dVhIUmNkSFJvYVhNdVkzSmxZWFJsVEdGNWIzVjBRbmxHY21GdFpTQTlJR1oxYm1OMGFXOXVJQ2drYUc5c1pHVnlMQ0J2Y0hScGIyNXpLU0I3WEc1Y2RGeDBYSFIyWVhJZ2JHRnVaMGx1Wm04Z1BTQnZjSFJwYjI1ekxteGhibWRKYm1adk8xeHVYRzVjZEZ4MFhIUjJZWElnYVhORGIyNTBaVzUwUldScGRHRmliR1VnUFNBaEpHaHZiR1JsY2k1cGN5Z25PbVJwYzJGaWJHVmtKeWs3WEc1Y2JseDBYSFJjZEM4dk1ERXVJR055WldGMFpTQkZaR2wwYjNKY2JseDBYSFJjZEhaaGNpQWtaV1JwZEc5eUlEMGdKQ2duUEdScGRpQmpiR0Z6Y3oxY0ltNXZkR1V0WldScGRHOXlJR1ZrYVhSaFlteGxMU2NnS3lCcGMwTnZiblJsYm5SRlpHbDBZV0pzWlNBcklDZGNJajQ4TDJScGRqNG5LVHRjYmx4MFhIUmNkR2xtSUNodmNIUnBiMjV6TG5kcFpIUm9LU0I3WEc1Y2RGeDBYSFJjZENSbFpHbDBiM0l1ZDJsa2RHZ29iM0IwYVc5dWN5NTNhV1IwYUNrN1hHNWNkRngwWEhSOVhHNWNibHgwWEhSY2RDOHZNREl1SUhOMFlYUjFjMkpoY2lBb2NtVnphWHBsWW1GeUtWeHVYSFJjZEZ4MGFXWWdLRzl3ZEdsdmJuTXVhR1ZwWjJoMElENGdNQ2tnZTF4dVhIUmNkRngwWEhRa0tDYzhaR2wySUdOc1lYTnpQVndpYm05MFpTMXpkR0YwZFhOaVlYSmNJajRuSUNzZ0tHOXdkR2x2Ym5NdVpHbHpZV0pzWlZKbGMybDZaVVZrYVhSdmNpQS9JQ2NuSURvZ2RIQnNVM1JoZEhWelltRnlLQ2twSUNzZ0p6d3ZaR2wyUGljcExuQnlaWEJsYm1SVWJ5Z2taV1JwZEc5eUtUdGNibHgwWEhSY2RIMWNibHh1WEhSY2RGeDBMeTh3TXk0Z1kzSmxZWFJsSUVWa2FYUmhZbXhsWEc1Y2JseDBYSFJjZEhaaGNpQWtaV1JwZEdGaWJHVWdQU0FrS0NjOFpHbDJJR05zWVhOelBWd2libTkwWlMxbFpHbDBZV0pzWlZ3aUlHTnZiblJsYm5SRlpHbDBZV0pzWlQxY0lpY2dLeUJwYzBOdmJuUmxiblJGWkdsMFlXSnNaU0FySUNkY0lqNDhMMlJwZGo0bktWeHVYSFJjZEZ4MFhIUXVjSEpsY0dWdVpGUnZLQ1JsWkdsMGIzSXBPMXh1WEhSY2RGeDBhV1lnS0c5d2RHbHZibk11YUdWcFoyaDBLU0I3WEc1Y2RGeDBYSFJjZENSbFpHbDBZV0pzWlM1b1pXbG5hSFFvYjNCMGFXOXVjeTVvWldsbmFIUXBPMXh1WEhSY2RGeDBmVnh1WEhSY2RGeDBhV1lnS0c5d2RHbHZibk11WkdseVpXTjBhVzl1S1NCN1hHNWNkRngwWEhSY2RDUmxaR2wwWVdKc1pTNWhkSFJ5S0Nka2FYSW5MQ0J2Y0hScGIyNXpMbVJwY21WamRHbHZiaWs3WEc1Y2RGeDBYSFI5WEc1Y2RGeDBYSFIyWVhJZ2NHeGhZMlZvYjJ4a1pYSWdQU0FrYUc5c1pHVnlMbUYwZEhJb0ozQnNZV05sYUc5c1pHVnlKeWtnZkh3Z2IzQjBhVzl1Y3k1d2JHRmpaV2h2YkdSbGNqdGNibHgwWEhSY2RHbG1JQ2h3YkdGalpXaHZiR1JsY2lrZ2UxeHVYSFJjZEZ4MFhIUWtaV1JwZEdGaWJHVXVZWFIwY2lnblpHRjBZUzF3YkdGalpXaHZiR1JsY2ljc0lIQnNZV05sYUc5c1pHVnlLVHRjYmx4MFhIUmNkSDFjYmx4dVhIUmNkRngwSkdWa2FYUmhZbXhsTG1oMGJXd29aRzl0TG1oMGJXd29KR2h2YkdSbGNpa3BPMXh1WEc1Y2RGeDBYSFF2THpBek1TNGdZM0psWVhSbElHTnZaR0ZpYkdWY2JseDBYSFJjZENRb0p6eDBaWGgwWVhKbFlTQmpiR0Z6Y3oxY0ltNXZkR1V0WTI5a1lXSnNaVndpUGp3dmRHVjRkR0Z5WldFK0p5a3VjSEpsY0dWdVpGUnZLQ1JsWkdsMGIzSXBPMXh1WEc1Y2RGeDBYSFF2THpBMExpQmpjbVZoZEdVZ1ZHOXZiR0poY2x4dVhIUmNkRngwZG1GeUlDUjBiMjlzWW1GeUlEMGdKQ2duUEdScGRpQmpiR0Z6Y3oxY0ltNXZkR1V0ZEc5dmJHSmhjaUJpZEc0dGRHOXZiR0poY2x3aUlDOCtKeWs3WEc1Y2RGeDBYSFJtYjNJZ0tIWmhjaUJwWkhnZ1BTQXdMQ0JzWlc0Z1BTQnZjSFJwYjI1ekxuUnZiMnhpWVhJdWJHVnVaM1JvT3lCcFpIZ2dQQ0JzWlc0N0lHbGtlQ3NyS1NCN1hHNWNkRngwWEhSY2RIWmhjaUJuY205MWNFNWhiV1VnUFNCdmNIUnBiMjV6TG5SdmIyeGlZWEpiYVdSNFhWc3dYVHRjYmx4MFhIUmNkRngwZG1GeUlHZHliM1Z3UW5WMGRHOXVjeUE5SUc5d2RHbHZibk11ZEc5dmJHSmhjbHRwWkhoZFd6RmRPMXh1WEc1Y2RGeDBYSFJjZEhaaGNpQWtaM0p2ZFhBZ1BTQWtLQ2M4WkdsMklHTnNZWE56UFZ3aWJtOTBaUzBuSUNzZ1ozSnZkWEJPWVcxbElDc2dKeUJpZEc0dFozSnZkWEJjSWlBdlBpY3BPMXh1WEhSY2RGeDBYSFJtYjNJZ0tIWmhjaUJwSUQwZ01Dd2dZblJ1VEdWdVozUm9JRDBnWjNKdmRYQkNkWFIwYjI1ekxteGxibWQwYURzZ2FTQThJR0owYmt4bGJtZDBhRHNnYVNzcktTQjdYRzVjZEZ4MFhIUmNkRngwZG1GeUlHSjFkSFJ2YmtsdVptOGdQU0IwY0d4Q2RYUjBiMjVKYm1adlcyZHliM1Z3UW5WMGRHOXVjMXRwWFYwN1hHNWNkRngwWEhSY2RGeDBMeThnWTI5dWRHbHVkV1VnWTNKbFlYUnBibWNnZEc5dmJHSmhjaUJsZG1WdUlHbG1JR0VnWW5WMGRHOXVJR1J2WlhOdUozUWdaWGhwYzNSY2JseDBYSFJjZEZ4MFhIUnBaaUFvSVNRdWFYTkdkVzVqZEdsdmJpaGlkWFIwYjI1SmJtWnZLU2tnZXlCamIyNTBhVzUxWlRzZ2ZWeHVYRzVjZEZ4MFhIUmNkRngwZG1GeUlDUmlkWFIwYjI0Z1BTQWtLR0oxZEhSdmJrbHVabThvYkdGdVowbHVabThzSUc5d2RHbHZibk1wS1R0Y2JseDBYSFJjZEZ4MFhIUWtZblYwZEc5dUxtRjBkSElvSjJSaGRHRXRibUZ0WlNjc0lHZHliM1Z3UW5WMGRHOXVjMXRwWFNrN0lDQXZMeUJ6WlhRZ1luVjBkRzl1SjNNZ1lXeHBZWE1zSUdKbFkzVmhjMlVnZEc4Z1oyVjBJR0oxZEhSdmJpQmxiR1Z0Wlc1MElHWnliMjBnSkhSdmIyeGlZWEpjYmx4MFhIUmNkRngwWEhRa1ozSnZkWEF1WVhCd1pXNWtLQ1JpZFhSMGIyNHBPMXh1WEhSY2RGeDBYSFI5WEc1Y2RGeDBYSFJjZENSMGIyOXNZbUZ5TG1Gd2NHVnVaQ2drWjNKdmRYQXBPMXh1WEhSY2RGeDBmVnh1WEc1Y2RGeDBYSFFrZEc5dmJHSmhjaTV3Y21Wd1pXNWtWRzhvSkdWa2FYUnZjaWs3WEc1Y2RGeDBYSFIyWVhJZ2EyVjVUV0Z3SUQwZ2IzQjBhVzl1Y3k1clpYbE5ZWEJiWVdkbGJuUXVhWE5OWVdNZ1B5QW5iV0ZqSnlBNklDZHdZeWRkTzF4dVhIUmNkRngwWTNKbFlYUmxVR0ZzWlhSMFpTZ2tkRzl2YkdKaGNpd2diM0IwYVc5dWN5azdYRzVjZEZ4MFhIUmpjbVZoZEdWVWIyOXNkR2x3S0NSMGIyOXNZbUZ5TENCclpYbE5ZWEFzSUNkaWIzUjBiMjBuS1R0Y2JseHVYSFJjZEZ4MEx5OHdOUzRnWTNKbFlYUmxJRkJ2Y0c5MlpYSmNibHgwWEhSY2RIWmhjaUFrY0c5d2IzWmxjaUE5SUNRb2RIQnNVRzl3YjNabGNuTW9iR0Z1WjBsdVptOHNJRzl3ZEdsdmJuTXBLUzV3Y21Wd1pXNWtWRzhvSkdWa2FYUnZjaWs3WEc1Y2RGeDBYSFJqY21WaGRHVlFZV3hsZEhSbEtDUndiM0J2ZG1WeUxDQnZjSFJwYjI1ektUdGNibHgwWEhSY2RHTnlaV0YwWlZSdmIyeDBhWEFvSkhCdmNHOTJaWElzSUd0bGVVMWhjQ2s3WEc1Y2JseDBYSFJjZEM4dk1EWXVJR2hoYm1Sc1pTaGpiMjUwY205c0lITmxiR1ZqZEdsdmJpd2dMaTR1S1Z4dVhIUmNkRngwSkNoMGNHeElZVzVrYkdWektDa3BMbkJ5WlhCbGJtUlVieWdrWldScGRHOXlLVHRjYmx4dVhIUmNkRngwTHk4d055NGdZM0psWVhSbElFUnBZV3h2WjF4dVhIUmNkRngwZG1GeUlDUmthV0ZzYjJjZ1BTQWtLSFJ3YkVScFlXeHZaM01vYkdGdVowbHVabThzSUc5d2RHbHZibk1wS1M1d2NtVndaVzVrVkc4b0pHVmthWFJ2Y2lrN1hHNWNkRngwWEhRa1pHbGhiRzluTG1acGJtUW9KMkoxZEhSdmJpNWpiRzl6WlN3Z1lTNXRiMlJoYkMxamJHOXpaU2NwTG1Oc2FXTnJLR1oxYm1OMGFXOXVJQ2dwSUh0Y2JseDBYSFJjZEZ4MEpDaDBhR2x6S1M1amJHOXpaWE4wS0NjdWJXOWtZV3duS1M1dGIyUmhiQ2duYUdsa1pTY3BPMXh1WEhSY2RGeDBmU2s3WEc1Y2JseDBYSFJjZEM4dk1EZ3VJR055WldGMFpTQkVjbTl3ZW05dVpWeHVYSFJjZEZ4MEpDZ25QR1JwZGlCamJHRnpjejFjSW01dmRHVXRaSEp2Y0hwdmJtVmNJajQ4WkdsMklHTnNZWE56UFZ3aWJtOTBaUzFrY205d2VtOXVaUzF0WlhOellXZGxYQ0krUEM5a2FYWStQQzlrYVhZK0p5a3VjSEpsY0dWdVpGUnZLQ1JsWkdsMGIzSXBPMXh1WEc1Y2RGeDBYSFF2THpBNUxpQkZaR2wwYjNJdlNHOXNaR1Z5SUhOM2FYUmphRnh1WEhSY2RGeDBKR1ZrYVhSdmNpNXBibk5sY25SQlpuUmxjaWdrYUc5c1pHVnlLVHRjYmx4MFhIUmNkQ1JvYjJ4a1pYSXVhR2xrWlNncE8xeHVYSFJjZEgwN1hHNWNibHgwWEhSMGFHbHpMbWhoYzA1dmRHVkZaR2wwYjNJZ1BTQm1kVzVqZEdsdmJpQW9KR2h2YkdSbGNpa2dlMXh1WEhSY2RGeDBjbVYwZFhKdUlIUm9hWE11Ym05MFpVVmthWFJ2Y2taeWIyMUliMnhrWlhJb0pHaHZiR1JsY2lrdWJHVnVaM1JvSUQ0Z01EdGNibHgwWEhSOU8xeHVYRzVjZEZ4MGRHaHBjeTV1YjNSbFJXUnBkRzl5Um5KdmJVaHZiR1JsY2lBOUlHWjFibU4wYVc5dUlDZ2thRzlzWkdWeUtTQjdYRzVjZEZ4MFhIUnBaaUFvSkdodmJHUmxjaTVvWVhORGJHRnpjeWduYm05MFpTMWhhWEl0WldScGRHOXlKeWtwSUh0Y2JseDBYSFJjZEZ4MGNtVjBkWEp1SUNSb2IyeGtaWEk3WEc1Y2RGeDBYSFI5SUdWc2MyVWdhV1lnS0NSb2IyeGtaWEl1Ym1WNGRDZ3BMbWhoYzBOc1lYTnpLQ2R1YjNSbExXVmthWFJ2Y2ljcEtTQjdYRzVjZEZ4MFhIUmNkSEpsZEhWeWJpQWthRzlzWkdWeUxtNWxlSFFvS1R0Y2JseDBYSFJjZEgwZ1pXeHpaU0I3WEc1Y2RGeDBYSFJjZEhKbGRIVnliaUFrS0NrN1hHNWNkRngwWEhSOVhHNWNkRngwZlR0Y2JseHVYSFJjZEM4cUtseHVYSFJjZENBcUlHTnlaV0YwWlNCemRXMXRaWEp1YjNSbElHeGhlVzkxZEZ4dVhIUmNkQ0FxWEc1Y2RGeDBJQ29nUUhCaGNtRnRJSHRxVVhWbGNubDlJQ1JvYjJ4a1pYSmNibHgwWEhRZ0tpQkFjR0Z5WVcwZ2UwOWlhbVZqZEgwZ2IzQjBhVzl1YzF4dVhIUmNkQ0FxTDF4dVhIUmNkSFJvYVhNdVkzSmxZWFJsVEdGNWIzVjBJRDBnWm5WdVkzUnBiMjRnS0NSb2IyeGtaWElzSUc5d2RHbHZibk1wSUh0Y2JseDBYSFJjZEdsbUlDaHZjSFJwYjI1ekxtRnBjazF2WkdVcElIdGNibHgwWEhSY2RGeDBkR2hwY3k1amNtVmhkR1ZNWVhsdmRYUkNlVUZwY2sxdlpHVW9KR2h2YkdSbGNpd2diM0IwYVc5dWN5azdYRzVjZEZ4MFhIUjlJR1ZzYzJVZ2UxeHVYSFJjZEZ4MFhIUjBhR2x6TG1OeVpXRjBaVXhoZVc5MWRFSjVSbkpoYldVb0pHaHZiR1JsY2l3Z2IzQjBhVzl1Y3lrN1hHNWNkRngwWEhSOVhHNWNkRngwZlR0Y2JseHVYSFJjZEM4cUtseHVYSFJjZENBcUlISmxkSFZ5Ym5NZ2JHRjViM1YwU1c1bWJ5Qm1jbTl0SUdodmJHUmxjbHh1WEhSY2RDQXFYRzVjZEZ4MElDb2dRSEJoY21GdElIdHFVWFZsY25sOUlDUm9iMnhrWlhJZ0xTQndiR0ZqWldodmJHUmxjbHh1WEhSY2RDQXFJRUJ5WlhSMWNtNGdlMDlpYW1WamRIMWNibHgwWEhRZ0tpOWNibHgwWEhSMGFHbHpMbXhoZVc5MWRFbHVabTlHY205dFNHOXNaR1Z5SUQwZ1puVnVZM1JwYjI0Z0tDUm9iMnhrWlhJcElIdGNibHgwWEhSY2RIWmhjaUFrWldScGRHOXlJRDBnZEdocGN5NXViM1JsUldScGRHOXlSbkp2YlVodmJHUmxjaWdrYUc5c1pHVnlLVHRjYmx4MFhIUmNkR2xtSUNnaEpHVmthWFJ2Y2k1c1pXNW5kR2dwSUh0Y2JseDBYSFJjZEZ4MGNtVjBkWEp1TzF4dVhIUmNkRngwZlZ4dVhHNWNkRngwWEhRdkx5QmpiMjV1WldOMElDUm9iMnhrWlhJZ2RHOGdKR1ZrYVhSdmNseHVYSFJjZEZ4MEpHVmthWFJ2Y2k1a1lYUmhLQ2RvYjJ4a1pYSW5MQ0FrYUc5c1pHVnlLVHRjYmx4dVhIUmNkRngwY21WMGRYSnVJR1J2YlM1aWRXbHNaRXhoZVc5MWRFbHVabThvSkdWa2FYUnZjaWs3WEc1Y2RGeDBmVHRjYmx4dVhIUmNkQzhxS2x4dVhIUmNkQ0FxSUhKbGJXOTJaVXhoZVc5MWRGeHVYSFJjZENBcVhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0cVVYVmxjbmw5SUNSb2IyeGtaWElnTFNCd2JHRmpaV2h2YkdSbGNseHVYSFJjZENBcUlFQndZWEpoYlNCN1QySnFaV04wZlNCc1lYbHZkWFJKYm1adlhHNWNkRngwSUNvZ1FIQmhjbUZ0SUh0UFltcGxZM1I5SUc5d2RHbHZibk5jYmx4MFhIUWdLbHh1WEhSY2RDQXFMMXh1WEhSY2RIUm9hWE11Y21WdGIzWmxUR0Y1YjNWMElEMGdablZ1WTNScGIyNGdLQ1JvYjJ4a1pYSXNJR3hoZVc5MWRFbHVabThzSUc5d2RHbHZibk1wSUh0Y2JseDBYSFJjZEdsbUlDaHZjSFJwYjI1ekxtRnBjazF2WkdVcElIdGNibHgwWEhSY2RGeDBKR2h2YkdSbGNpNXlaVzF2ZG1WRGJHRnpjeWduYm05MFpTMWhhWEl0WldScGRHOXlJRzV2ZEdVdFpXUnBkR0ZpYkdVbktWeHVYSFJjZEZ4MFhIUmNkQ0FnSUM1eVpXMXZkbVZCZEhSeUtDZHBaQ0JqYjI1MFpXNTBSV1JwZEdGaWJHVW5LVHRjYmx4dVhIUmNkRngwWEhSc1lYbHZkWFJKYm1adkxuQnZjRzkyWlhJb0tTNXlaVzF2ZG1Vb0tUdGNibHgwWEhSY2RGeDBiR0Y1YjNWMFNXNW1ieTVvWVc1a2JHVW9LUzV5WlcxdmRtVW9LVHRjYmx4MFhIUmNkRngwYkdGNWIzVjBTVzVtYnk1a2FXRnNiMmNvS1M1eVpXMXZkbVVvS1R0Y2JseDBYSFJjZEgwZ1pXeHpaU0I3WEc1Y2RGeDBYSFJjZENSb2IyeGtaWEl1YUhSdGJDaHNZWGx2ZFhSSmJtWnZMbVZrYVhSaFlteGxLQ2t1YUhSdGJDZ3BLVHRjYmx4dVhIUmNkRngwWEhSc1lYbHZkWFJKYm1adkxtVmthWFJ2Y2lncExuSmxiVzkyWlNncE8xeHVYSFJjZEZ4MFhIUWthRzlzWkdWeUxuTm9iM2NvS1R0Y2JseDBYSFJjZEgxY2JseDBYSFI5TzF4dVhHNWNkRngwTHlvcVhHNWNkRngwSUNwY2JseDBYSFFnS2lCQWNtVjBkWEp1SUh0UFltcGxZM1I5WEc1Y2RGeDBJQ29nUUhKbGRIVnliaUI3Wm5WdVkzUnBiMjRvYkdGaVpXd3NJRzl3ZEdsdmJuTTlLVHB6ZEhKcGJtZDlJSEpsZEhWeWJpNWlkWFIwYjI0Z2UwQnNhVzVySUNOMGNHeENkWFIwYjI0Z1puVnVZM1JwYjI0Z2RHOGdiV0ZyWlNCMFpYaDBJR0oxZEhSdmJuMWNibHgwWEhRZ0tpQkFjbVYwZFhKdUlIdG1kVzVqZEdsdmJpaHBZMjl1UTJ4aGMzTXNJRzl3ZEdsdmJuTTlLVHB6ZEhKcGJtZDlJSEpsZEhWeWJpNXBZMjl1UW5WMGRHOXVJSHRBYkdsdWF5QWpkSEJzU1dOdmJrSjFkSFJ2YmlCbWRXNWpkR2x2YmlCMGJ5QnRZV3RsSUdsamIyNGdZblYwZEc5dWZWeHVYSFJjZENBcUlFQnlaWFIxY200Z2UyWjFibU4wYVc5dUtHTnNZWE56VG1GdFpTd2dkR2wwYkdVOUxDQmliMlI1UFN3Z1ptOXZkR1Z5UFNrNmMzUnlhVzVuZlNCeVpYUjFjbTR1WkdsaGJHOW5JSHRBYkdsdWF5QWpkSEJzUkdsaGJHOW5JR1oxYm1OMGFXOXVJSFJ2SUcxaGEyVWdaR2xoYkc5bmZWeHVYSFJjZENBcUwxeHVYSFJjZEhSb2FYTXVaMlYwVkdWdGNHeGhkR1VnUFNCbWRXNWpkR2x2YmlBb0tTQjdYRzVjZEZ4MFhIUnlaWFIxY200Z2UxeHVYSFJjZEZ4MFhIUmlkWFIwYjI0NklIUndiRUoxZEhSdmJpeGNibHgwWEhSY2RGeDBhV052YmtKMWRIUnZiam9nZEhCc1NXTnZia0oxZEhSdmJpeGNibHgwWEhSY2RGeDBaR2xoYkc5bk9pQjBjR3hFYVdGc2IyZGNibHgwWEhSY2RIMDdYRzVjZEZ4MGZUdGNibHh1WEhSY2RDOHFLbHh1WEhSY2RDQXFJR0ZrWkNCaWRYUjBiMjRnYVc1bWIzSnRZWFJwYjI1Y2JseDBYSFFnS2x4dVhIUmNkQ0FxSUVCd1lYSmhiU0I3VTNSeWFXNW5mU0J1WVcxbElHSjFkSFJ2YmlCdVlXMWxYRzVjZEZ4MElDb2dRSEJoY21GdElIdEdkVzVqZEdsdmJuMGdZblYwZEc5dVNXNW1ieUJtZFc1amRHbHZiaUIwYnlCdFlXdGxJR0oxZEhSdmJpd2djbVZtWlhKbGJtTmxJSFJ2SUh0QWJHbHVheUFqZEhCc1FuVjBkRzl1ZlN4N1FHeHBibXNnSTNSd2JFbGpiMjVDZFhSMGIyNTlYRzVjZEZ4MElDb3ZYRzVjZEZ4MGRHaHBjeTVoWkdSQ2RYUjBiMjVKYm1adklEMGdablZ1WTNScGIyNGdLRzVoYldVc0lHSjFkSFJ2YmtsdVptOHBJSHRjYmx4MFhIUmNkSFJ3YkVKMWRIUnZia2x1Wm05YmJtRnRaVjBnUFNCaWRYUjBiMjVKYm1adk8xeHVYSFJjZEgwN1hHNWNibHgwWEhRdktpcGNibHgwWEhRZ0tseHVYSFJjZENBcUlFQndZWEpoYlNCN1UzUnlhVzVuZlNCdVlXMWxYRzVjZEZ4MElDb2dRSEJoY21GdElIdEdkVzVqZEdsdmJuMGdaR2xoYkc5blNXNW1ieUJtZFc1amRHbHZiaUIwYnlCdFlXdGxJR1JwWVd4dlp5d2djbVZtWlhKbGJtTmxJSFJ2SUh0QWJHbHVheUFqZEhCc1JHbGhiRzluZlZ4dVhIUmNkQ0FxTDF4dVhIUmNkSFJvYVhNdVlXUmtSR2xoYkc5blNXNW1ieUE5SUdaMWJtTjBhVzl1SUNodVlXMWxMQ0JrYVdGc2IyZEpibVp2S1NCN1hHNWNkRngwWEhSMGNHeEVhV0ZzYjJkSmJtWnZXMjVoYldWZElEMGdaR2xoYkc5blNXNW1ienRjYmx4MFhIUjlPMXh1WEhSOU8xeHVYRzVjYmx4MEx5OGdhbEYxWlhKNUlHNWhiV1Z6Y0dGalpTQm1iM0lnYzNWdGJXVnlibTkwWlZ4dVhIUXZLaXBjYmx4MElDb2dRR05zWVhOeklDUXVjM1Z0YldWeWJtOTBaU0JjYmx4MElDb2dYRzVjZENBcUlITjFiVzFsY201dmRHVWdZWFIwY21saWRYUmxJQ0JjYmx4MElDb2dYRzVjZENBcUlFQnRhWGhwYmlCa1pXWmhkV3gwYzF4dVhIUWdLaUJBYzJsdVoyeGxkRzl1SUNCY2JseDBJQ29nWEc1Y2RDQXFMMXh1WEhRa0xuTjFiVzFsY201dmRHVWdQU0FrTG5OMWJXMWxjbTV2ZEdVZ2ZId2dlMzA3WEc1Y2JseDBMeThnWlhoMFpXNWtjeUJrWldaaGRXeDBJSE5sZEhScGJtZHpYRzVjZEM4dklDQXRJQ1F1YzNWdGJXVnlibTkwWlM1MlpYSnphVzl1WEc1Y2RDOHZJQ0F0SUNRdWMzVnRiV1Z5Ym05MFpTNXZjSFJwYjI1elhHNWNkQzh2SUNBdElDUXVjM1Z0YldWeWJtOTBaUzVzWVc1blhHNWNkQ1F1WlhoMFpXNWtLQ1F1YzNWdGJXVnlibTkwWlN3Z1pHVm1ZWFZzZEhNcE8xeHVYRzVjZEhaaGNpQnlaVzVrWlhKbGNpQTlJRzVsZHlCU1pXNWtaWEpsY2lncE8xeHVYSFIyWVhJZ1pYWmxiblJJWVc1a2JHVnlJRDBnYm1WM0lFVjJaVzUwU0dGdVpHeGxjaWdwTzF4dVhHNWNkQ1F1WlhoMFpXNWtLQ1F1YzNWdGJXVnlibTkwWlN3Z2UxeHVYSFJjZEM4cUtpQkFjSEp2Y0dWeWRIa2dlMUpsYm1SbGNtVnlmU0FxTDF4dVhIUmNkSEpsYm1SbGNtVnlPaUJ5Wlc1a1pYSmxjaXhjYmx4MFhIUXZLaW9nUUhCeWIzQmxjblI1SUh0RmRtVnVkRWhoYm1Sc1pYSjlJQ292WEc1Y2RGeDBaWFpsYm5SSVlXNWtiR1Z5T2lCbGRtVnVkRWhoYm1Sc1pYSXNYRzVjZEZ4MEx5b3FJRnh1WEhSY2RDQXFJRUJ3Y205d1pYSjBlU0I3VDJKcVpXTjBmU0JqYjNKbElGeHVYSFJjZENBcUlFQndjbTl3WlhKMGVTQjdZMjl5WlM1aFoyVnVkSDBnWTI5eVpTNWhaMlZ1ZENCY2JseDBYSFFnS2lCQWNISnZjR1Z5ZEhrZ2UyTnZjbVV1Wkc5dGZTQmpiM0psTG1SdmJWeHVYSFJjZENBcUlFQndjbTl3WlhKMGVTQjdZMjl5WlM1eVlXNW5aWDBnWTI5eVpTNXlZVzVuWlNCY2JseDBYSFFnS2k5Y2JseDBYSFJqYjNKbE9pQjdYRzVjZEZ4MFhIUmhaMlZ1ZERvZ1lXZGxiblFzWEc1Y2RGeDBYSFJrYjIwNklHUnZiU3hjYmx4MFhIUmNkSEpoYm1kbE9pQnlZVzVuWlZ4dVhIUmNkSDBzWEc1Y2RGeDBMeW9xSUZ4dVhIUmNkQ0FxSUVCd2NtOXdaWEowZVNCN1QySnFaV04wZlNCY2JseDBYSFFnS2lCd2JIVm5hVzVGZG1WdWRITWdaWFpsYm5RZ2JHbHpkQ0JtYjNJZ2NHeDFaMmx1YzF4dVhIUmNkQ0FxSUdWMlpXNTBJR2hoY3lCdVlXMWxJR0Z1WkNCallXeHNZbUZqYXlCbWRXNWpkR2x2Ymk1Y2JseDBYSFFnS2lCY2JseDBYSFFnS2lCZ1lHQWdYRzVjZEZ4MElDb2dKQzV6ZFcxdFpYSnViM1JsTG1Ga1pGQnNkV2RwYmloN1hHNWNkRngwSUNvZ0lDQWdJR1YyWlc1MGN5QTZJSHRjYmx4MFhIUWdLaUFnSUNBZ0lDQWdJQ0FuYUdWc2JHOG5JRG9nWm5WdVkzUnBiMjRvYkdGNWIzVjBTVzVtYnl3Z2RtRnNkV1VzSUNSMFlYSm5aWFFwSUh0Y2JseDBYSFFnS2lBZ0lDQWdJQ0FnSUNBZ0lDQWdZMjl1YzI5c1pTNXNiMmNvSjJWMlpXNTBJRzVoYldVZ2FYTWdhR1ZzYkc4c0lIWmhiSFZsSUdseklDY2dLeUIyWVd4MVpTQXBPMXh1WEhSY2RDQXFJQ0FnSUNBZ0lDQWdJSDFjYmx4MFhIUWdLaUFnSUNBZ2ZTQWdJQ0FnWEc1Y2RGeDBJQ29nZlNsY2JseDBYSFFnS2lCZ1lHQmNibHgwWEhRZ0tpQmNibHgwWEhRZ0tpQXFJR1YyWlc1MElHNWhiV1VnYVhNZ1pHRjBZUzFsZG1WdWRDQndjbTl3WlhKMGVTNWNibHgwWEhRZ0tpQXFJR3hoZVc5MWRFbHVabThnYVhNZ1lTQnpkVzF0WlhKdWIzUmxJR3hoZVc5MWRDQnBibVp2Y20xaGRHbHZiaTVjYmx4MFhIUWdLaUFxSUhaaGJIVmxJR2x6SUdSaGRHRXRkbUZzZFdVZ2NISnZjR1Z5ZEhrdVhHNWNkRngwSUNvdlhHNWNkRngwY0d4MVoybHVSWFpsYm5Sek9pQjdmU3hjYmx4dVhIUmNkSEJzZFdkcGJuTTZJRnRkWEc1Y2RIMHBPMXh1WEc1Y2RDOHFLbHh1WEhRZ0tpQkFiV1YwYUc5a0lHRmtaRkJzZFdkcGJseHVYSFFnS2x4dVhIUWdLaUJoWkdRZ1VHeDFaMmx1SUdsdUlGTjFiVzFsY201dmRHVWdYRzVjZENBcUlGeHVYSFFnS2lCVGRXMXRaWEp1YjNSbElHTmhiaUJ0WVd0bElHRWdiM2R1SUhCc2RXZHBiaTVjYmx4MElDcGNibHgwSUNvZ0l5TWpJRVJsWm1sdVpTQndiSFZuYVc1Y2JseDBJQ29nWUdCZ1hHNWNkQ0FxSUM4dklHZGxkQ0IwWlcxd2JHRjBaU0JtZFc1amRHbHZiaUFnWEc1Y2RDQXFJSFpoY2lCMGJYQnNJRDBnSkM1emRXMXRaWEp1YjNSbExuSmxibVJsY21WeUxtZGxkRlJsYlhCc1lYUmxLQ2s3WEc1Y2RDQXFJRnh1WEhRZ0tpQXZMeUJoWkdRZ1lTQmlkWFIwYjI0Z0lDQmNibHgwSUNvZ0pDNXpkVzF0WlhKdWIzUmxMbUZrWkZCc2RXZHBiaWg3WEc1Y2RDQXFJQ0FnSUNCaWRYUjBiMjV6SURvZ2UxeHVYSFFnS2lBZ0lDQWdJQ0FnTHk4Z1hDSm9aV3hzYjF3aUlDQnBjeUJpZFhSMGIyNG5jeUJ1WVcxbGMzQmhZMlV1SUNBZ0lDQWdYRzVjZENBcUlDQWdJQ0FnSUNCY0ltaGxiR3h2WENJZ09pQm1kVzVqZEdsdmJpaHNZVzVuTENCdmNIUnBiMjV6S1NCN1hHNWNkQ0FxSUNBZ0lDQWdJQ0FnSUNBZ0x5OGdiV0ZyWlNCcFkyOXVJR0oxZEhSdmJpQmllU0IwWlcxd2JHRjBaU0JtZFc1amRHbHZiaUFnSUNBZ0lDQWdJQ0JjYmx4MElDb2dJQ0FnSUNBZ0lDQWdJQ0J5WlhSMWNtNGdkRzF3YkM1cFkyOXVRblYwZEc5dUtDZG1ZU0JtWVMxb1pXRmtaWEluTENCN1hHNWNkQ0FxSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQzh2SUdOaGJHeGlZV05ySUdaMWJtTjBhVzl1SUc1aGJXVWdkMmhsYmlCaWRYUjBiMjRnWTJ4cFkydGxaQ0JjYmx4MElDb2dJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1pYWmxiblFnT2lBbmFHVnNiRzhuTEZ4dVhIUWdLaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQXZMeUJ6WlhRZ1pHRjBZUzEyWVd4MVpTQndjbTl3WlhKMGVTQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hHNWNkQ0FxSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFpoYkhWbElEb2dKMmhsYkd4dkp5d2dJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1hHNWNkQ0FxSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2hwWkdVZ09pQjBjblZsWEc1Y2RDQXFJQ0FnSUNBZ0lDQWdJQ0FnZlNrN0lDQWdJQ0FnSUNBZ0lDQmNibHgwSUNvZ0lDQWdJQ0FnSUgxY2JseDBJQ29nSUNBZ0lGeHVYSFFnS2lBZ0lDQWdmU3dnWEc1Y2RDQXFJQ0FnSUNCY2JseDBJQ29nSUNBZ0lHVjJaVzUwY3lBNklIdGNibHgwSUNvZ0lDQWdJQ0FnSUZ3aWFHVnNiRzljSWlBNklHWjFibU4wYVc5dUtHeGhlVzkxZEVsdVptOHNJSFpoYkhWbEtTQjdYRzVjZENBcUlDQWdJQ0FnSUNBZ0lDQWdMeThnYUdWeVpTQnBjeUJsZG1WdWRDQmpiMlJsSUZ4dVhIUWdLaUFnSUNBZ0lDQWdmVnh1WEhRZ0tpQWdJQ0FnZlNBZ0lDQWdYRzVjZENBcUlIMHBPMXh1WEhRZ0tpQmdZR0FnWEc1Y2RDQXFJQ01qSXlCVmMyVWdZU0J3YkhWbmFXNGdhVzRnZEc5dmJHSmhjbHh1WEhRZ0tpQmNibHgwSUNvZ1lHQmdJRnh1WEhRZ0tpQWdJQ0FrS0Z3aUkyVmthWFJ2Y2x3aUtTNXpkVzF0WlhKdWIzUmxLSHRjYmx4MElDb2dJQ0FnTGk0dVhHNWNkQ0FxSUNBZ0lIUnZiMnhpWVhJZ09pQmJYRzVjZENBcUlDQWdJQ0FnSUNBdkx5QmthWE53YkdGNUlHaGxiR3h2SUhCc2RXZHBiaUJwYmlCMGIyOXNZbUZ5SUNBZ0lDQmNibHgwSUNvZ0lDQWdJQ0FnSUZzblozSnZkWEFuTENCYklDZG9aV3hzYnljZ1hWMWNibHgwSUNvZ0lDQWdYVnh1WEhRZ0tpQWdJQ0F1TGk0Z0lDQWdYRzVjZENBcUlDQWdJSDBwTzF4dVhIUWdLaUJnWUdCY2JseDBJQ29nSUZ4dVhIUWdLaUFnWEc1Y2RDQXFJRUJ3WVhKaGJTQjdUMkpxWldOMGZTQndiSFZuYVc1Y2JseDBJQ29nUUhCaGNtRnRJSHRQWW1wbFkzUjlJRnR3YkhWbmFXNHVZblYwZEc5dWMxMGdaR1ZtYVc1bElIQnNkV2RwYmlCaWRYUjBiMjR1SUdadmNpQmtaWFJoYVd3c0lITmxaU0IwYnlCU1pXNWtaWEpsY2k1aFpHUkNkWFIwYjI1SmJtWnZYRzVjZENBcUlFQndZWEpoYlNCN1QySnFaV04wZlNCYmNHeDFaMmx1TG1ScFlXeHZaM05kSUdSbFptbHVaU0J3YkhWbmFXNGdaR2xoYkc5bkxpQm1iM0lnWkdWMFlXbHNMQ0J6WldVZ2RHOGdVbVZ1WkdWeVpYSXVZV1JrUkdsaGJHOW5TVzVtYjF4dVhIUWdLaUJBY0dGeVlXMGdlMDlpYW1WamRIMGdXM0JzZFdkcGJpNWxkbVZ1ZEhOZElHRmtaQ0JsZG1WdWRDQnBiaUFrTG5OMWJXMWxjbTV2ZEdVdWNHeDFaMmx1UlhabGJuUnpJRnh1WEhRZ0tpQkFjR0Z5WVcwZ2UwOWlhbVZqZEgwZ1czQnNkV2RwYmk1c1lXNW5jMTBnZFhCa1lYUmxJQ1F1YzNWdGJXVnlibTkwWlM1c1lXNW5YRzVjZENBcUlFQndZWEpoYlNCN1QySnFaV04wZlNCYmNHeDFaMmx1TG05d2RHbHZibk5kSUhWd1pHRjBaU0FrTG5OMWJXMWxjbTV2ZEdVdWIzQjBhVzl1YzF4dVhIUWdLaTljYmx4MEpDNXpkVzF0WlhKdWIzUmxMbUZrWkZCc2RXZHBiaUE5SUdaMWJtTjBhVzl1SUNod2JIVm5hVzRwSUh0Y2JseHVYSFJjZEM4dklITmhkbVVnY0d4MVoybHVJR3hwYzNSY2JseDBYSFFrTG5OMWJXMWxjbTV2ZEdVdWNHeDFaMmx1Y3k1d2RYTm9LSEJzZFdkcGJpazdYRzVjYmx4MFhIUnBaaUFvY0d4MVoybHVMbUoxZEhSdmJuTXBJSHRjYmx4MFhIUmNkQ1F1WldGamFDaHdiSFZuYVc0dVluVjBkRzl1Y3l3Z1puVnVZM1JwYjI0Z0tHNWhiV1VzSUdKMWRIUnZiaWtnZTF4dVhIUmNkRngwWEhSeVpXNWtaWEpsY2k1aFpHUkNkWFIwYjI1SmJtWnZLRzVoYldVc0lHSjFkSFJ2YmlrN1hHNWNkRngwWEhSOUtUdGNibHgwWEhSOVhHNWNibHgwWEhScFppQW9jR3gxWjJsdUxtUnBZV3h2WjNNcElIdGNibHgwWEhSY2RDUXVaV0ZqYUNod2JIVm5hVzR1WkdsaGJHOW5jeXdnWm5WdVkzUnBiMjRnS0c1aGJXVXNJR1JwWVd4dlp5a2dlMXh1WEhSY2RGeDBYSFJ5Wlc1a1pYSmxjaTVoWkdSRWFXRnNiMmRKYm1adktHNWhiV1VzSUdScFlXeHZaeWs3WEc1Y2RGeDBYSFI5S1R0Y2JseDBYSFI5WEc1Y2JseDBYSFJwWmlBb2NHeDFaMmx1TG1WMlpXNTBjeWtnZTF4dVhIUmNkRngwSkM1bFlXTm9LSEJzZFdkcGJpNWxkbVZ1ZEhNc0lHWjFibU4wYVc5dUlDaHVZVzFsTENCbGRtVnVkQ2tnZTF4dVhIUmNkRngwWEhRa0xuTjFiVzFsY201dmRHVXVjR3gxWjJsdVJYWmxiblJ6VzI1aGJXVmRJRDBnWlhabGJuUTdYRzVjZEZ4MFhIUjlLVHRjYmx4MFhIUjlYRzVjYmx4MFhIUnBaaUFvY0d4MVoybHVMbXhoYm1kektTQjdYRzVjZEZ4MFhIUWtMbVZoWTJnb2NHeDFaMmx1TG14aGJtZHpMQ0JtZFc1amRHbHZiaUFvYkc5allXeGxMQ0JzWVc1bktTQjdYRzVjZEZ4MFhIUmNkR2xtSUNna0xuTjFiVzFsY201dmRHVXViR0Z1WjF0c2IyTmhiR1ZkS1NCN1hHNWNkRngwWEhSY2RGeDBKQzVsZUhSbGJtUW9KQzV6ZFcxdFpYSnViM1JsTG14aGJtZGJiRzlqWVd4bFhTd2diR0Z1WnlrN1hHNWNkRngwWEhSY2RIMWNibHgwWEhSY2RIMHBPMXh1WEhSY2RIMWNibHh1WEhSY2RHbG1JQ2h3YkhWbmFXNHViM0IwYVc5dWN5a2dlMXh1WEhSY2RGeDBKQzVsZUhSbGJtUW9KQzV6ZFcxdFpYSnViM1JsTG05d2RHbHZibk1zSUhCc2RXZHBiaTV2Y0hScGIyNXpLVHRjYmx4MFhIUjlYRzVjZEgwN1hHNWNibHgwTHlwY2JseDBJQ29nWlhoMFpXNWtJQ1F1Wm01Y2JseDBJQ292WEc1Y2RDUXVabTR1WlhoMFpXNWtLSHRjYmx4MFhIUXZLaXBjYmx4MFhIUWdLaUJBYldWMGFHOWtYRzVjZEZ4MElDb2dTVzVwZEdsaGJHbDZaU0J6ZFcxdFpYSnViM1JsWEc1Y2RGeDBJQ29nSUMwZ1kzSmxZWFJsSUdWa2FYUnZjaUJzWVhsdmRYUWdZVzVrSUdGMGRHRmphQ0JOYjNWelpTQmhibVFnYTJWNVltOWhjbVFnWlhabGJuUnpMbHh1WEhSY2RDQXFJRnh1WEhSY2RDQXFJR0JnWUZ4dVhIUmNkQ0FxSUNRb1hDSWpjM1Z0YldWeWJtOTBaVndpS1M1emRXMXRaWEp1YjNSbEtDQjdJRzl3ZEdsdmJuTWdMaTU5SUNrN1hHNWNkRngwSUNvZ1lHQmdYRzVjZEZ4MElDb2dJQ0JjYmx4MFhIUWdLaUJBYldWdFltVnlJQ1F1Wm01Y2JseDBYSFFnS2lCQWNHRnlZVzBnZTA5aWFtVmpkSHhUZEhKcGJtZDlJRzl3ZEdsdmJuTWdjbVZtWlhKbGJtTmxJSFJ2SUNRdWMzVnRiV1Z5Ym05MFpTNXZjSFJwYjI1elhHNWNkRngwSUNvZ1FISmxkSFZ5YmlCN2RHaHBjMzFjYmx4MFhIUWdLaTljYmx4MFhIUnpkVzF0WlhKdWIzUmxPaUJtZFc1amRHbHZiaUFvS1NCN1hHNWNkRngwWEhRdkx5QmphR1ZqYXlCbWFYSnpkQ0JoY21kMWJXVnVkQ2R6SUhSNWNHVmNibHgwWEhSY2RDOHZJQ0F0SUh0VGRISnBibWQ5T2lCRmVIUmxjbTVoYkNCQlVFa2dZMkZzYkNCN2UyMXZaSFZzWlgxOUxudDdiV1YwYUc5a2ZYMWNibHgwWEhSY2RDOHZJQ0F0SUh0UFltcGxZM1I5T2lCcGJtbDBJRzl3ZEdsdmJuTmNibHgwWEhSY2RIWmhjaUIwZVhCbElEMGdKQzUwZVhCbEtHeHBjM1F1YUdWaFpDaGhjbWQxYldWdWRITXBLVHRjYmx4MFhIUmNkSFpoY2lCcGMwVjRkR1Z5Ym1Gc1FWQkpRMkZzYkdWa0lEMGdkSGx3WlNBOVBUMGdKM04wY21sdVp5YzdYRzVjZEZ4MFhIUjJZWElnYVhOSmJtbDBUM0IwYVc5dWN5QTlJSFI1Y0dVZ1BUMDlJQ2R2WW1wbFkzUW5PMXh1WEc1Y2RGeDBYSFF2THlCbGVIUmxibVFnWkdWbVlYVnNkQ0J2Y0hScGIyNXpJSGRwZEdnZ1kzVnpkRzl0SUhWelpYSWdiM0IwYVc5dWMxeHVYSFJjZEZ4MGRtRnlJRzl3ZEdsdmJuTWdQU0JwYzBsdWFYUlBjSFJwYjI1eklEOGdiR2x6ZEM1b1pXRmtLR0Z5WjNWdFpXNTBjeWtnT2lCN2ZUdGNibHgwWEhSY2RHOXdkR2x2Ym5NZ1BTQWtMbVY0ZEdWdVpDaDBjblZsTENCN2ZTd2dKQzV6ZFcxdFpYSnViM1JsTG05d2RHbHZibk1zSUc5d2RHbHZibk1wTzF4dVhHNWNkRngwWEhRdkx5QkpibU5zZFdSbElHeGhibWRKYm1adklHbHVJRzl3ZEdsdmJuTWdabTl5SUd4aGRHVnlJSFZ6WlN3Z1pTNW5MaUJtYjNJZ2FXMWhaMlVnWkhKaFp5MXVMV1J5YjNCY2JseDBYSFJjZEM4dklGTmxkSFZ3SUd4aGJtZDFZV2RsSUdsdVptOGdkMmwwYUNCbGJpMVZVeUJoY3lCa1pXWmhkV3gwWEc1Y2RGeDBYSFJ2Y0hScGIyNXpMbXhoYm1kSmJtWnZJRDBnSkM1bGVIUmxibVFvZEhKMVpTd2dlMzBzSUNRdWMzVnRiV1Z5Ym05MFpTNXNZVzVuV3lkbGJpMVZVeWRkTENBa0xuTjFiVzFsY201dmRHVXViR0Z1WjF0dmNIUnBiMjV6TG14aGJtZGRLVHRjYmx4dVhIUmNkRngwZEdocGN5NWxZV05vS0daMWJtTjBhVzl1SUNocFpIZ3NJR2h2YkdSbGNpa2dlMXh1WEhSY2RGeDBYSFIyWVhJZ0pHaHZiR1JsY2lBOUlDUW9hRzlzWkdWeUtUdGNibHh1WEhSY2RGeDBYSFF2THlCcFppQnNZWGx2ZFhRZ2FYTnVKM1FnWTNKbFlYUmxaQ0I1WlhRc0lHTnlaV0YwWlV4aGVXOTFkQ0JoYm1RZ1lYUjBZV05vSUdWMlpXNTBjMXh1WEhSY2RGeDBYSFJwWmlBb0lYSmxibVJsY21WeUxtaGhjMDV2ZEdWRlpHbDBiM0lvSkdodmJHUmxjaWtwSUh0Y2JseDBYSFJjZEZ4MFhIUnlaVzVrWlhKbGNpNWpjbVZoZEdWTVlYbHZkWFFvSkdodmJHUmxjaXdnYjNCMGFXOXVjeWs3WEc1Y2JseDBYSFJjZEZ4MFhIUjJZWElnYkdGNWIzVjBTVzVtYnlBOUlISmxibVJsY21WeUxteGhlVzkxZEVsdVptOUdjbTl0U0c5c1pHVnlLQ1JvYjJ4a1pYSXBPMXh1WEc1Y2RGeDBYSFJjZEZ4MFpYWmxiblJJWVc1a2JHVnlMbUYwZEdGamFDaHNZWGx2ZFhSSmJtWnZMQ0J2Y0hScGIyNXpLVHRjYmx4MFhIUmNkRngwWEhSbGRtVnVkRWhoYm1Sc1pYSXVZWFIwWVdOb1EzVnpkRzl0UlhabGJuUW9iR0Y1YjNWMFNXNW1ieXdnYjNCMGFXOXVjeWs3WEc1Y2JseDBYSFJjZEZ4MGZWeHVYSFJjZEZ4MGZTazdYRzVjYmx4MFhIUmNkQzh2SUdOaGJHeGlZV05ySUc5dUlHbHVhWFJjYmx4MFhIUmNkR2xtSUNnaGFYTkZlSFJsY201aGJFRlFTVU5oYkd4bFpDQW1KaUIwYUdsekxteGxibWQwYUNBbUppQnZjSFJwYjI1ekxtOXVhVzVwZENrZ2UxeHVYSFJjZEZ4MFhIUnZjSFJwYjI1ekxtOXVhVzVwZENncE8xeHVYSFJjZEZ4MGZWeHVYRzVjZEZ4MFhIUjJZWElnSkdacGNuTjBJRDBnZEdocGN5NW1hWEp6ZENncE8xeHVYSFJjZEZ4MGFXWWdLQ1JtYVhKemRDNXNaVzVuZEdncElIdGNibHgwWEhSY2RGeDBkbUZ5SUd4aGVXOTFkRWx1Wm04Z1BTQnlaVzVrWlhKbGNpNXNZWGx2ZFhSSmJtWnZSbkp2YlVodmJHUmxjaWdrWm1seWMzUXBPMXh1WEc1Y2RGeDBYSFJjZEM4dklHVjRkR1Z5Ym1Gc0lFRlFTVnh1WEhSY2RGeDBYSFJwWmlBb2FYTkZlSFJsY201aGJFRlFTVU5oYkd4bFpDa2dlMXh1WEhSY2RGeDBYSFJjZEhaaGNpQnRiMlIxYkdWQmJtUk5aWFJvYjJRZ1BTQnNhWE4wTG1obFlXUW9iR2x6ZEM1bWNtOXRLR0Z5WjNWdFpXNTBjeWtwTzF4dVhIUmNkRngwWEhSY2RIWmhjaUJoY21keklEMGdiR2x6ZEM1MFlXbHNLR3hwYzNRdVpuSnZiU2hoY21kMWJXVnVkSE1wS1R0Y2JseHVYSFJjZEZ4MFhIUmNkQzh2SUZSUFJFOGdibTkzSUdWNGRHVnlibUZzSUVGUVNTQnZibXg1SUhkdmNtdHpJR1p2Y2lCbFpHbDBiM0pjYmx4MFhIUmNkRngwWEhSMllYSWdjR0Z5WVcxeklEMGdXMjF2WkhWc1pVRnVaRTFsZEdodlpDd2diR0Y1YjNWMFNXNW1ieTVsWkdsMFlXSnNaU2dwWFM1amIyNWpZWFFvWVhKbmN5azdYRzVjZEZ4MFhIUmNkRngwY21WMGRYSnVJR1YyWlc1MFNHRnVaR3hsY2k1cGJuWnZhMlV1WVhCd2JIa29aWFpsYm5SSVlXNWtiR1Z5TENCd1lYSmhiWE1wTzF4dVhIUmNkRngwWEhSOUlHVnNjMlVnYVdZZ0tHOXdkR2x2Ym5NdVptOWpkWE1wSUh0Y2JseDBYSFJjZEZ4MFhIUXZMeUJtYjJOMWN5QnZiaUJtYVhKemRDQmxaR2wwWVdKc1pTQmxiR1Z0Wlc1MElHWnZjaUJwYm1sMGFXRnNhWHBsSUdWa2FYUnZjbHh1WEhSY2RGeDBYSFJjZEd4aGVXOTFkRWx1Wm04dVpXUnBkR0ZpYkdVb0tTNW1iMk4xY3lncE8xeHVYSFJjZEZ4MFhIUjlYRzVjZEZ4MFhIUjlYRzVjYmx4MFhIUmNkSEpsZEhWeWJpQjBhR2x6TzF4dVhIUmNkSDBzWEc1Y2JseDBYSFF2S2lwY2JseDBYSFFnS2lCQWJXVjBhRzlrSUZ4dVhIUmNkQ0FxSUZ4dVhIUmNkQ0FxSUdkbGRDQjBhR1VnU0ZSTlRDQmpiMjUwWlc1MGN5QnZaaUJ1YjNSbElHOXlJSE5sZENCMGFHVWdTRlJOVENCamIyNTBaVzUwY3lCdlppQnViM1JsTGx4dVhIUmNkQ0FxWEc1Y2RGeDBJQ29nS2lCblpYUWdZMjl1ZEdWdWRITWdYRzVjZEZ4MElDb2dZR0JnWEc1Y2RGeDBJQ29nZG1GeUlHTnZiblJsYm5RZ1BTQWtLRndpSTNOMWJXMWxjbTV2ZEdWY0lpa3VZMjlrWlNncE8xeHVYSFJjZENBcUlHQmdZRnh1WEhSY2RDQXFJQ29nYzJWMElHTnZiblJsYm5SeklGeHVYSFJjZENBcVhHNWNkRngwSUNvZ1lHQmdYRzVjZEZ4MElDb2dKQ2hjSWlOemRXMXRaWEp1YjNSbFhDSXBMbU52WkdVb2FIUnRiQ2s3WEc1Y2RGeDBJQ29nWUdCZ1hHNWNkRngwSUNwY2JseDBYSFFnS2lCQWJXVnRZbVZ5SUNRdVptNGdYRzVjZEZ4MElDb2dRSEJoY21GdElIdFRkSEpwYm1kOUlGdG9kRzFzWFNBdElFaFVUVXdnWTI5dWRHVnVkSE1vYjNCMGFXOXVZV3dzSUhObGRDbGNibHgwWEhRZ0tpQkFjbVYwZFhKdUlIdDBhR2x6ZkZOMGNtbHVaMzBnTFNCamIyNTBaWGgwS0hObGRDa2diM0lnU0ZSTlRDQmpiMjUwWlc1MGN5QnZaaUJ1YjNSbEtHZGxkQ2t1WEc1Y2RGeDBJQ292WEc1Y2RGeDBZMjlrWlRvZ1puVnVZM1JwYjI0Z0tHaDBiV3dwSUh0Y2JseDBYSFJjZEM4dklHZGxkQ0IwYUdVZ1NGUk5UQ0JqYjI1MFpXNTBjeUJ2WmlCdWIzUmxYRzVjZEZ4MFhIUnBaaUFvYUhSdGJDQTlQVDBnZFc1a1pXWnBibVZrS1NCN1hHNWNkRngwWEhSY2RIWmhjaUFrYUc5c1pHVnlJRDBnZEdocGN5NW1hWEp6ZENncE8xeHVYSFJjZEZ4MFhIUnBaaUFvSVNSb2IyeGtaWEl1YkdWdVozUm9LU0I3WEc1Y2RGeDBYSFJjZEZ4MGNtVjBkWEp1TzF4dVhIUmNkRngwWEhSOVhHNWNibHgwWEhSY2RGeDBkbUZ5SUd4aGVXOTFkRWx1Wm04Z1BTQnlaVzVrWlhKbGNpNXNZWGx2ZFhSSmJtWnZSbkp2YlVodmJHUmxjaWdrYUc5c1pHVnlLVHRjYmx4MFhIUmNkRngwZG1GeUlDUmxaR2wwWVdKc1pTQTlJR3hoZVc5MWRFbHVabThnSmlZZ2JHRjViM1YwU1c1bWJ5NWxaR2wwWVdKc1pTZ3BPMXh1WEc1Y2RGeDBYSFJjZEdsbUlDZ2taV1JwZEdGaWJHVWdKaVlnSkdWa2FYUmhZbXhsTG14bGJtZDBhQ2tnZTF4dVhIUmNkRngwWEhSY2RIWmhjaUJwYzBOdlpHVjJhV1YzSUQwZ1pYWmxiblJJWVc1a2JHVnlMbWx1ZG05clpTZ25ZMjlrWlhacFpYY3VhWE5CWTNScGRtRjBaV1FuTENCc1lYbHZkWFJKYm1adktUdGNibHgwWEhSY2RGeDBYSFJsZG1WdWRFaGhibVJzWlhJdWFXNTJiMnRsS0NkamIyUmxkbWxsZHk1emVXNWpKeXdnYkdGNWIzVjBTVzVtYnlrN1hHNWNkRngwWEhSY2RGeDBjbVYwZFhKdUlHbHpRMjlrWlhacFpYY2dQeUJzWVhsdmRYUkpibVp2TG1OdlpHRmliR1VvS1M1MllXd29LU0E2WEc1Y2RGeDBYSFJjZEZ4MFhIUmNkRngwWEhSY2RHeGhlVzkxZEVsdVptOHVaV1JwZEdGaWJHVW9LUzVvZEcxc0tDazdYRzVjZEZ4MFhIUmNkSDFjYmx4MFhIUmNkRngwY21WMGRYSnVJR1J2YlM1cGMxUmxlSFJoY21WaEtDUm9iMnhrWlhKYk1GMHBJRDhnSkdodmJHUmxjaTUyWVd3b0tTQTZJQ1JvYjJ4a1pYSXVhSFJ0YkNncE8xeHVYSFJjZEZ4MGZWeHVYRzVjZEZ4MFhIUXZMeUJ6WlhRZ2RHaGxJRWhVVFV3Z1kyOXVkR1Z1ZEhNZ2IyWWdibTkwWlZ4dVhIUmNkRngwZEdocGN5NWxZV05vS0daMWJtTjBhVzl1SUNocExDQm9iMnhrWlhJcElIdGNibHgwWEhSY2RGeDBkbUZ5SUd4aGVXOTFkRWx1Wm04Z1BTQnlaVzVrWlhKbGNpNXNZWGx2ZFhSSmJtWnZSbkp2YlVodmJHUmxjaWdrS0dodmJHUmxjaWtwTzF4dVhIUmNkRngwWEhSMllYSWdKR1ZrYVhSaFlteGxJRDBnYkdGNWIzVjBTVzVtYnlBbUppQnNZWGx2ZFhSSmJtWnZMbVZrYVhSaFlteGxLQ2s3WEc1Y2RGeDBYSFJjZEdsbUlDZ2taV1JwZEdGaWJHVXBJSHRjYmx4MFhIUmNkRngwWEhRa1pXUnBkR0ZpYkdVdWFIUnRiQ2hvZEcxc0tUdGNibHgwWEhSY2RGeDBmVnh1WEhSY2RGeDBmU2s3WEc1Y2JseDBYSFJjZEhKbGRIVnliaUIwYUdsek8xeHVYSFJjZEgwc1hHNWNibHgwWEhRdktpcGNibHgwWEhRZ0tpQkFiV1YwYUc5a1hHNWNkRngwSUNvZ1hHNWNkRngwSUNvZ1pHVnpkSEp2ZVNCRlpHbDBiM0lnVEdGNWIzVjBJR0Z1WkNCa1pYUmhZMmdnUzJWNUlHRnVaQ0JOYjNWelpTQkZkbVZ1ZEZ4dVhIUmNkQ0FxWEc1Y2RGeDBJQ29nUUcxbGJXSmxjaUFrTG1adVhHNWNkRngwSUNvZ1FISmxkSFZ5YmlCN2RHaHBjMzFjYmx4MFhIUWdLaTljYmx4MFhIUmtaWE4wY205NU9pQm1kVzVqZEdsdmJpQW9LU0I3WEc1Y2RGeDBYSFIwYUdsekxtVmhZMmdvWm5WdVkzUnBiMjRnS0dsa2VDd2dhRzlzWkdWeUtTQjdYRzVjZEZ4MFhIUmNkSFpoY2lBa2FHOXNaR1Z5SUQwZ0pDaG9iMnhrWlhJcE8xeHVYRzVjZEZ4MFhIUmNkR2xtSUNnaGNtVnVaR1Z5WlhJdWFHRnpUbTkwWlVWa2FYUnZjaWdrYUc5c1pHVnlLU2tnZTF4dVhIUmNkRngwWEhSY2RISmxkSFZ5Ymp0Y2JseDBYSFJjZEZ4MGZWeHVYRzVjZEZ4MFhIUmNkSFpoY2lCcGJtWnZJRDBnY21WdVpHVnlaWEl1YkdGNWIzVjBTVzVtYjBaeWIyMUliMnhrWlhJb0pHaHZiR1JsY2lrN1hHNWNkRngwWEhSY2RIWmhjaUJ2Y0hScGIyNXpJRDBnYVc1bWJ5NWxaR2wwYjNJb0tTNWtZWFJoS0NkdmNIUnBiMjV6SnlrN1hHNWNibHgwWEhSY2RGeDBaWFpsYm5SSVlXNWtiR1Z5TG1SbGRHRmphQ2hwYm1adkxDQnZjSFJwYjI1ektUdGNibHgwWEhSY2RGeDBjbVZ1WkdWeVpYSXVjbVZ0YjNabFRHRjViM1YwS0NSb2IyeGtaWElzSUdsdVptOHNJRzl3ZEdsdmJuTXBPMXh1WEhSY2RGeDBmU2s3WEc1Y2JseDBYSFJjZEhKbGRIVnliaUIwYUdsek8xeHVYSFJjZEgxY2JseDBmU2s3WEc1OUtTazdYRzVjYm4wcExtTmhiR3dvWjJ4dlltRnNMQ0J0YjJSMWJHVXNJSFZ1WkdWbWFXNWxaQ3dnZFc1a1pXWnBibVZrS1R0Y2JpSmRmUT09IiwiLy8gVGhpcyBmaWxlIGlzIGF1dG9nZW5lcmF0ZWQgdmlhIHRoZSBgY29tbW9uanNgIEdydW50IHRhc2suIFlvdSBjYW4gcmVxdWlyZSgpIHRoaXMgZmlsZSBpbiBhIENvbW1vbkpTIGVudmlyb25tZW50LlxucmVxdWlyZSgnLi4vLi4vanMvdHJhbnNpdGlvbi5qcycpXG5yZXF1aXJlKCcuLi8uLi9qcy9hbGVydC5qcycpXG5yZXF1aXJlKCcuLi8uLi9qcy9idXR0b24uanMnKVxucmVxdWlyZSgnLi4vLi4vanMvY2Fyb3VzZWwuanMnKVxucmVxdWlyZSgnLi4vLi4vanMvY29sbGFwc2UuanMnKVxucmVxdWlyZSgnLi4vLi4vanMvZHJvcGRvd24uanMnKVxucmVxdWlyZSgnLi4vLi4vanMvbW9kYWwuanMnKVxucmVxdWlyZSgnLi4vLi4vanMvdG9vbHRpcC5qcycpXG5yZXF1aXJlKCcuLi8uLi9qcy9wb3BvdmVyLmpzJylcbnJlcXVpcmUoJy4uLy4uL2pzL3Njcm9sbHNweS5qcycpXG5yZXF1aXJlKCcuLi8uLi9qcy90YWIuanMnKVxucmVxdWlyZSgnLi4vLi4vanMvYWZmaXguanMnKSIsIi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQm9vdHN0cmFwOiBhZmZpeC5qcyB2My4zLjdcbiAqIGh0dHA6Ly9nZXRib290c3RyYXAuY29tL2phdmFzY3JpcHQvI2FmZml4XG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvcHlyaWdodCAyMDExLTIwMTYgVHdpdHRlciwgSW5jLlxuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYXN0ZXIvTElDRU5TRSlcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5cbitmdW5jdGlvbiAoJCkge1xuICAndXNlIHN0cmljdCc7XG5cbiAgLy8gQUZGSVggQ0xBU1MgREVGSU5JVElPTlxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09XG5cbiAgdmFyIEFmZml4ID0gZnVuY3Rpb24gKGVsZW1lbnQsIG9wdGlvbnMpIHtcbiAgICB0aGlzLm9wdGlvbnMgPSAkLmV4dGVuZCh7fSwgQWZmaXguREVGQVVMVFMsIG9wdGlvbnMpXG5cbiAgICB0aGlzLiR0YXJnZXQgPSAkKHRoaXMub3B0aW9ucy50YXJnZXQpXG4gICAgICAub24oJ3Njcm9sbC5icy5hZmZpeC5kYXRhLWFwaScsICQucHJveHkodGhpcy5jaGVja1Bvc2l0aW9uLCB0aGlzKSlcbiAgICAgIC5vbignY2xpY2suYnMuYWZmaXguZGF0YS1hcGknLCAgJC5wcm94eSh0aGlzLmNoZWNrUG9zaXRpb25XaXRoRXZlbnRMb29wLCB0aGlzKSlcblxuICAgIHRoaXMuJGVsZW1lbnQgICAgID0gJChlbGVtZW50KVxuICAgIHRoaXMuYWZmaXhlZCAgICAgID0gbnVsbFxuICAgIHRoaXMudW5waW4gICAgICAgID0gbnVsbFxuICAgIHRoaXMucGlubmVkT2Zmc2V0ID0gbnVsbFxuXG4gICAgdGhpcy5jaGVja1Bvc2l0aW9uKClcbiAgfVxuXG4gIEFmZml4LlZFUlNJT04gID0gJzMuMy43J1xuXG4gIEFmZml4LlJFU0VUICAgID0gJ2FmZml4IGFmZml4LXRvcCBhZmZpeC1ib3R0b20nXG5cbiAgQWZmaXguREVGQVVMVFMgPSB7XG4gICAgb2Zmc2V0OiAwLFxuICAgIHRhcmdldDogd2luZG93XG4gIH1cblxuICBBZmZpeC5wcm90b3R5cGUuZ2V0U3RhdGUgPSBmdW5jdGlvbiAoc2Nyb2xsSGVpZ2h0LCBoZWlnaHQsIG9mZnNldFRvcCwgb2Zmc2V0Qm90dG9tKSB7XG4gICAgdmFyIHNjcm9sbFRvcCAgICA9IHRoaXMuJHRhcmdldC5zY3JvbGxUb3AoKVxuICAgIHZhciBwb3NpdGlvbiAgICAgPSB0aGlzLiRlbGVtZW50Lm9mZnNldCgpXG4gICAgdmFyIHRhcmdldEhlaWdodCA9IHRoaXMuJHRhcmdldC5oZWlnaHQoKVxuXG4gICAgaWYgKG9mZnNldFRvcCAhPSBudWxsICYmIHRoaXMuYWZmaXhlZCA9PSAndG9wJykgcmV0dXJuIHNjcm9sbFRvcCA8IG9mZnNldFRvcCA/ICd0b3AnIDogZmFsc2VcblxuICAgIGlmICh0aGlzLmFmZml4ZWQgPT0gJ2JvdHRvbScpIHtcbiAgICAgIGlmIChvZmZzZXRUb3AgIT0gbnVsbCkgcmV0dXJuIChzY3JvbGxUb3AgKyB0aGlzLnVucGluIDw9IHBvc2l0aW9uLnRvcCkgPyBmYWxzZSA6ICdib3R0b20nXG4gICAgICByZXR1cm4gKHNjcm9sbFRvcCArIHRhcmdldEhlaWdodCA8PSBzY3JvbGxIZWlnaHQgLSBvZmZzZXRCb3R0b20pID8gZmFsc2UgOiAnYm90dG9tJ1xuICAgIH1cblxuICAgIHZhciBpbml0aWFsaXppbmcgICA9IHRoaXMuYWZmaXhlZCA9PSBudWxsXG4gICAgdmFyIGNvbGxpZGVyVG9wICAgID0gaW5pdGlhbGl6aW5nID8gc2Nyb2xsVG9wIDogcG9zaXRpb24udG9wXG4gICAgdmFyIGNvbGxpZGVySGVpZ2h0ID0gaW5pdGlhbGl6aW5nID8gdGFyZ2V0SGVpZ2h0IDogaGVpZ2h0XG5cbiAgICBpZiAob2Zmc2V0VG9wICE9IG51bGwgJiYgc2Nyb2xsVG9wIDw9IG9mZnNldFRvcCkgcmV0dXJuICd0b3AnXG4gICAgaWYgKG9mZnNldEJvdHRvbSAhPSBudWxsICYmIChjb2xsaWRlclRvcCArIGNvbGxpZGVySGVpZ2h0ID49IHNjcm9sbEhlaWdodCAtIG9mZnNldEJvdHRvbSkpIHJldHVybiAnYm90dG9tJ1xuXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBBZmZpeC5wcm90b3R5cGUuZ2V0UGlubmVkT2Zmc2V0ID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICh0aGlzLnBpbm5lZE9mZnNldCkgcmV0dXJuIHRoaXMucGlubmVkT2Zmc2V0XG4gICAgdGhpcy4kZWxlbWVudC5yZW1vdmVDbGFzcyhBZmZpeC5SRVNFVCkuYWRkQ2xhc3MoJ2FmZml4JylcbiAgICB2YXIgc2Nyb2xsVG9wID0gdGhpcy4kdGFyZ2V0LnNjcm9sbFRvcCgpXG4gICAgdmFyIHBvc2l0aW9uICA9IHRoaXMuJGVsZW1lbnQub2Zmc2V0KClcbiAgICByZXR1cm4gKHRoaXMucGlubmVkT2Zmc2V0ID0gcG9zaXRpb24udG9wIC0gc2Nyb2xsVG9wKVxuICB9XG5cbiAgQWZmaXgucHJvdG90eXBlLmNoZWNrUG9zaXRpb25XaXRoRXZlbnRMb29wID0gZnVuY3Rpb24gKCkge1xuICAgIHNldFRpbWVvdXQoJC5wcm94eSh0aGlzLmNoZWNrUG9zaXRpb24sIHRoaXMpLCAxKVxuICB9XG5cbiAgQWZmaXgucHJvdG90eXBlLmNoZWNrUG9zaXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCF0aGlzLiRlbGVtZW50LmlzKCc6dmlzaWJsZScpKSByZXR1cm5cblxuICAgIHZhciBoZWlnaHQgICAgICAgPSB0aGlzLiRlbGVtZW50LmhlaWdodCgpXG4gICAgdmFyIG9mZnNldCAgICAgICA9IHRoaXMub3B0aW9ucy5vZmZzZXRcbiAgICB2YXIgb2Zmc2V0VG9wICAgID0gb2Zmc2V0LnRvcFxuICAgIHZhciBvZmZzZXRCb3R0b20gPSBvZmZzZXQuYm90dG9tXG4gICAgdmFyIHNjcm9sbEhlaWdodCA9IE1hdGgubWF4KCQoZG9jdW1lbnQpLmhlaWdodCgpLCAkKGRvY3VtZW50LmJvZHkpLmhlaWdodCgpKVxuXG4gICAgaWYgKHR5cGVvZiBvZmZzZXQgIT0gJ29iamVjdCcpICAgICAgICAgb2Zmc2V0Qm90dG9tID0gb2Zmc2V0VG9wID0gb2Zmc2V0XG4gICAgaWYgKHR5cGVvZiBvZmZzZXRUb3AgPT0gJ2Z1bmN0aW9uJykgICAgb2Zmc2V0VG9wICAgID0gb2Zmc2V0LnRvcCh0aGlzLiRlbGVtZW50KVxuICAgIGlmICh0eXBlb2Ygb2Zmc2V0Qm90dG9tID09ICdmdW5jdGlvbicpIG9mZnNldEJvdHRvbSA9IG9mZnNldC5ib3R0b20odGhpcy4kZWxlbWVudClcblxuICAgIHZhciBhZmZpeCA9IHRoaXMuZ2V0U3RhdGUoc2Nyb2xsSGVpZ2h0LCBoZWlnaHQsIG9mZnNldFRvcCwgb2Zmc2V0Qm90dG9tKVxuXG4gICAgaWYgKHRoaXMuYWZmaXhlZCAhPSBhZmZpeCkge1xuICAgICAgaWYgKHRoaXMudW5waW4gIT0gbnVsbCkgdGhpcy4kZWxlbWVudC5jc3MoJ3RvcCcsICcnKVxuXG4gICAgICB2YXIgYWZmaXhUeXBlID0gJ2FmZml4JyArIChhZmZpeCA/ICctJyArIGFmZml4IDogJycpXG4gICAgICB2YXIgZSAgICAgICAgID0gJC5FdmVudChhZmZpeFR5cGUgKyAnLmJzLmFmZml4JylcblxuICAgICAgdGhpcy4kZWxlbWVudC50cmlnZ2VyKGUpXG5cbiAgICAgIGlmIChlLmlzRGVmYXVsdFByZXZlbnRlZCgpKSByZXR1cm5cblxuICAgICAgdGhpcy5hZmZpeGVkID0gYWZmaXhcbiAgICAgIHRoaXMudW5waW4gPSBhZmZpeCA9PSAnYm90dG9tJyA/IHRoaXMuZ2V0UGlubmVkT2Zmc2V0KCkgOiBudWxsXG5cbiAgICAgIHRoaXMuJGVsZW1lbnRcbiAgICAgICAgLnJlbW92ZUNsYXNzKEFmZml4LlJFU0VUKVxuICAgICAgICAuYWRkQ2xhc3MoYWZmaXhUeXBlKVxuICAgICAgICAudHJpZ2dlcihhZmZpeFR5cGUucmVwbGFjZSgnYWZmaXgnLCAnYWZmaXhlZCcpICsgJy5icy5hZmZpeCcpXG4gICAgfVxuXG4gICAgaWYgKGFmZml4ID09ICdib3R0b20nKSB7XG4gICAgICB0aGlzLiRlbGVtZW50Lm9mZnNldCh7XG4gICAgICAgIHRvcDogc2Nyb2xsSGVpZ2h0IC0gaGVpZ2h0IC0gb2Zmc2V0Qm90dG9tXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG5cbiAgLy8gQUZGSVggUExVR0lOIERFRklOSVRJT05cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT1cblxuICBmdW5jdGlvbiBQbHVnaW4ob3B0aW9uKSB7XG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgJHRoaXMgICA9ICQodGhpcylcbiAgICAgIHZhciBkYXRhICAgID0gJHRoaXMuZGF0YSgnYnMuYWZmaXgnKVxuICAgICAgdmFyIG9wdGlvbnMgPSB0eXBlb2Ygb3B0aW9uID09ICdvYmplY3QnICYmIG9wdGlvblxuXG4gICAgICBpZiAoIWRhdGEpICR0aGlzLmRhdGEoJ2JzLmFmZml4JywgKGRhdGEgPSBuZXcgQWZmaXgodGhpcywgb3B0aW9ucykpKVxuICAgICAgaWYgKHR5cGVvZiBvcHRpb24gPT0gJ3N0cmluZycpIGRhdGFbb3B0aW9uXSgpXG4gICAgfSlcbiAgfVxuXG4gIHZhciBvbGQgPSAkLmZuLmFmZml4XG5cbiAgJC5mbi5hZmZpeCAgICAgICAgICAgICA9IFBsdWdpblxuICAkLmZuLmFmZml4LkNvbnN0cnVjdG9yID0gQWZmaXhcblxuXG4gIC8vIEFGRklYIE5PIENPTkZMSUNUXG4gIC8vID09PT09PT09PT09PT09PT09XG5cbiAgJC5mbi5hZmZpeC5ub0NvbmZsaWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICQuZm4uYWZmaXggPSBvbGRcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cblxuICAvLyBBRkZJWCBEQVRBLUFQSVxuICAvLyA9PT09PT09PT09PT09PVxuXG4gICQod2luZG93KS5vbignbG9hZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAkKCdbZGF0YS1zcHk9XCJhZmZpeFwiXScpLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgdmFyICRzcHkgPSAkKHRoaXMpXG4gICAgICB2YXIgZGF0YSA9ICRzcHkuZGF0YSgpXG5cbiAgICAgIGRhdGEub2Zmc2V0ID0gZGF0YS5vZmZzZXQgfHwge31cblxuICAgICAgaWYgKGRhdGEub2Zmc2V0Qm90dG9tICE9IG51bGwpIGRhdGEub2Zmc2V0LmJvdHRvbSA9IGRhdGEub2Zmc2V0Qm90dG9tXG4gICAgICBpZiAoZGF0YS5vZmZzZXRUb3AgICAgIT0gbnVsbCkgZGF0YS5vZmZzZXQudG9wICAgID0gZGF0YS5vZmZzZXRUb3BcblxuICAgICAgUGx1Z2luLmNhbGwoJHNweSwgZGF0YSlcbiAgICB9KVxuICB9KVxuXG59KGpRdWVyeSk7XG4iLCIvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEJvb3RzdHJhcDogYWxlcnQuanMgdjMuMy43XG4gKiBodHRwOi8vZ2V0Ym9vdHN0cmFwLmNvbS9qYXZhc2NyaXB0LyNhbGVydHNcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29weXJpZ2h0IDIwMTEtMjAxNiBUd2l0dGVyLCBJbmMuXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21hc3Rlci9MSUNFTlNFKVxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cblxuK2Z1bmN0aW9uICgkKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICAvLyBBTEVSVCBDTEFTUyBERUZJTklUSU9OXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT1cblxuICB2YXIgZGlzbWlzcyA9ICdbZGF0YS1kaXNtaXNzPVwiYWxlcnRcIl0nXG4gIHZhciBBbGVydCAgID0gZnVuY3Rpb24gKGVsKSB7XG4gICAgJChlbCkub24oJ2NsaWNrJywgZGlzbWlzcywgdGhpcy5jbG9zZSlcbiAgfVxuXG4gIEFsZXJ0LlZFUlNJT04gPSAnMy4zLjcnXG5cbiAgQWxlcnQuVFJBTlNJVElPTl9EVVJBVElPTiA9IDE1MFxuXG4gIEFsZXJ0LnByb3RvdHlwZS5jbG9zZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgdmFyICR0aGlzICAgID0gJCh0aGlzKVxuICAgIHZhciBzZWxlY3RvciA9ICR0aGlzLmF0dHIoJ2RhdGEtdGFyZ2V0JylcblxuICAgIGlmICghc2VsZWN0b3IpIHtcbiAgICAgIHNlbGVjdG9yID0gJHRoaXMuYXR0cignaHJlZicpXG4gICAgICBzZWxlY3RvciA9IHNlbGVjdG9yICYmIHNlbGVjdG9yLnJlcGxhY2UoLy4qKD89I1teXFxzXSokKS8sICcnKSAvLyBzdHJpcCBmb3IgaWU3XG4gICAgfVxuXG4gICAgdmFyICRwYXJlbnQgPSAkKHNlbGVjdG9yID09PSAnIycgPyBbXSA6IHNlbGVjdG9yKVxuXG4gICAgaWYgKGUpIGUucHJldmVudERlZmF1bHQoKVxuXG4gICAgaWYgKCEkcGFyZW50Lmxlbmd0aCkge1xuICAgICAgJHBhcmVudCA9ICR0aGlzLmNsb3Nlc3QoJy5hbGVydCcpXG4gICAgfVxuXG4gICAgJHBhcmVudC50cmlnZ2VyKGUgPSAkLkV2ZW50KCdjbG9zZS5icy5hbGVydCcpKVxuXG4gICAgaWYgKGUuaXNEZWZhdWx0UHJldmVudGVkKCkpIHJldHVyblxuXG4gICAgJHBhcmVudC5yZW1vdmVDbGFzcygnaW4nKVxuXG4gICAgZnVuY3Rpb24gcmVtb3ZlRWxlbWVudCgpIHtcbiAgICAgIC8vIGRldGFjaCBmcm9tIHBhcmVudCwgZmlyZSBldmVudCB0aGVuIGNsZWFuIHVwIGRhdGFcbiAgICAgICRwYXJlbnQuZGV0YWNoKCkudHJpZ2dlcignY2xvc2VkLmJzLmFsZXJ0JykucmVtb3ZlKClcbiAgICB9XG5cbiAgICAkLnN1cHBvcnQudHJhbnNpdGlvbiAmJiAkcGFyZW50Lmhhc0NsYXNzKCdmYWRlJykgP1xuICAgICAgJHBhcmVudFxuICAgICAgICAub25lKCdic1RyYW5zaXRpb25FbmQnLCByZW1vdmVFbGVtZW50KVxuICAgICAgICAuZW11bGF0ZVRyYW5zaXRpb25FbmQoQWxlcnQuVFJBTlNJVElPTl9EVVJBVElPTikgOlxuICAgICAgcmVtb3ZlRWxlbWVudCgpXG4gIH1cblxuXG4gIC8vIEFMRVJUIFBMVUdJTiBERUZJTklUSU9OXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgZnVuY3Rpb24gUGx1Z2luKG9wdGlvbikge1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgdmFyICR0aGlzID0gJCh0aGlzKVxuICAgICAgdmFyIGRhdGEgID0gJHRoaXMuZGF0YSgnYnMuYWxlcnQnKVxuXG4gICAgICBpZiAoIWRhdGEpICR0aGlzLmRhdGEoJ2JzLmFsZXJ0JywgKGRhdGEgPSBuZXcgQWxlcnQodGhpcykpKVxuICAgICAgaWYgKHR5cGVvZiBvcHRpb24gPT0gJ3N0cmluZycpIGRhdGFbb3B0aW9uXS5jYWxsKCR0aGlzKVxuICAgIH0pXG4gIH1cblxuICB2YXIgb2xkID0gJC5mbi5hbGVydFxuXG4gICQuZm4uYWxlcnQgICAgICAgICAgICAgPSBQbHVnaW5cbiAgJC5mbi5hbGVydC5Db25zdHJ1Y3RvciA9IEFsZXJ0XG5cblxuICAvLyBBTEVSVCBOTyBDT05GTElDVFxuICAvLyA9PT09PT09PT09PT09PT09PVxuXG4gICQuZm4uYWxlcnQubm9Db25mbGljdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAkLmZuLmFsZXJ0ID0gb2xkXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG5cbiAgLy8gQUxFUlQgREFUQS1BUElcbiAgLy8gPT09PT09PT09PT09PT1cblxuICAkKGRvY3VtZW50KS5vbignY2xpY2suYnMuYWxlcnQuZGF0YS1hcGknLCBkaXNtaXNzLCBBbGVydC5wcm90b3R5cGUuY2xvc2UpXG5cbn0oalF1ZXJ5KTtcbiIsIi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQm9vdHN0cmFwOiBidXR0b24uanMgdjMuMy43XG4gKiBodHRwOi8vZ2V0Ym9vdHN0cmFwLmNvbS9qYXZhc2NyaXB0LyNidXR0b25zXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvcHlyaWdodCAyMDExLTIwMTYgVHdpdHRlciwgSW5jLlxuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYXN0ZXIvTElDRU5TRSlcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5cbitmdW5jdGlvbiAoJCkge1xuICAndXNlIHN0cmljdCc7XG5cbiAgLy8gQlVUVE9OIFBVQkxJQyBDTEFTUyBERUZJTklUSU9OXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHZhciBCdXR0b24gPSBmdW5jdGlvbiAoZWxlbWVudCwgb3B0aW9ucykge1xuICAgIHRoaXMuJGVsZW1lbnQgID0gJChlbGVtZW50KVxuICAgIHRoaXMub3B0aW9ucyAgID0gJC5leHRlbmQoe30sIEJ1dHRvbi5ERUZBVUxUUywgb3B0aW9ucylcbiAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlXG4gIH1cblxuICBCdXR0b24uVkVSU0lPTiAgPSAnMy4zLjcnXG5cbiAgQnV0dG9uLkRFRkFVTFRTID0ge1xuICAgIGxvYWRpbmdUZXh0OiAnbG9hZGluZy4uLidcbiAgfVxuXG4gIEJ1dHRvbi5wcm90b3R5cGUuc2V0U3RhdGUgPSBmdW5jdGlvbiAoc3RhdGUpIHtcbiAgICB2YXIgZCAgICA9ICdkaXNhYmxlZCdcbiAgICB2YXIgJGVsICA9IHRoaXMuJGVsZW1lbnRcbiAgICB2YXIgdmFsICA9ICRlbC5pcygnaW5wdXQnKSA/ICd2YWwnIDogJ2h0bWwnXG4gICAgdmFyIGRhdGEgPSAkZWwuZGF0YSgpXG5cbiAgICBzdGF0ZSArPSAnVGV4dCdcblxuICAgIGlmIChkYXRhLnJlc2V0VGV4dCA9PSBudWxsKSAkZWwuZGF0YSgncmVzZXRUZXh0JywgJGVsW3ZhbF0oKSlcblxuICAgIC8vIHB1c2ggdG8gZXZlbnQgbG9vcCB0byBhbGxvdyBmb3JtcyB0byBzdWJtaXRcbiAgICBzZXRUaW1lb3V0KCQucHJveHkoZnVuY3Rpb24gKCkge1xuICAgICAgJGVsW3ZhbF0oZGF0YVtzdGF0ZV0gPT0gbnVsbCA/IHRoaXMub3B0aW9uc1tzdGF0ZV0gOiBkYXRhW3N0YXRlXSlcblxuICAgICAgaWYgKHN0YXRlID09ICdsb2FkaW5nVGV4dCcpIHtcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlXG4gICAgICAgICRlbC5hZGRDbGFzcyhkKS5hdHRyKGQsIGQpLnByb3AoZCwgdHJ1ZSlcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0xvYWRpbmcpIHtcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZVxuICAgICAgICAkZWwucmVtb3ZlQ2xhc3MoZCkucmVtb3ZlQXR0cihkKS5wcm9wKGQsIGZhbHNlKVxuICAgICAgfVxuICAgIH0sIHRoaXMpLCAwKVxuICB9XG5cbiAgQnV0dG9uLnByb3RvdHlwZS50b2dnbGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGNoYW5nZWQgPSB0cnVlXG4gICAgdmFyICRwYXJlbnQgPSB0aGlzLiRlbGVtZW50LmNsb3Nlc3QoJ1tkYXRhLXRvZ2dsZT1cImJ1dHRvbnNcIl0nKVxuXG4gICAgaWYgKCRwYXJlbnQubGVuZ3RoKSB7XG4gICAgICB2YXIgJGlucHV0ID0gdGhpcy4kZWxlbWVudC5maW5kKCdpbnB1dCcpXG4gICAgICBpZiAoJGlucHV0LnByb3AoJ3R5cGUnKSA9PSAncmFkaW8nKSB7XG4gICAgICAgIGlmICgkaW5wdXQucHJvcCgnY2hlY2tlZCcpKSBjaGFuZ2VkID0gZmFsc2VcbiAgICAgICAgJHBhcmVudC5maW5kKCcuYWN0aXZlJykucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpXG4gICAgICAgIHRoaXMuJGVsZW1lbnQuYWRkQ2xhc3MoJ2FjdGl2ZScpXG4gICAgICB9IGVsc2UgaWYgKCRpbnB1dC5wcm9wKCd0eXBlJykgPT0gJ2NoZWNrYm94Jykge1xuICAgICAgICBpZiAoKCRpbnB1dC5wcm9wKCdjaGVja2VkJykpICE9PSB0aGlzLiRlbGVtZW50Lmhhc0NsYXNzKCdhY3RpdmUnKSkgY2hhbmdlZCA9IGZhbHNlXG4gICAgICAgIHRoaXMuJGVsZW1lbnQudG9nZ2xlQ2xhc3MoJ2FjdGl2ZScpXG4gICAgICB9XG4gICAgICAkaW5wdXQucHJvcCgnY2hlY2tlZCcsIHRoaXMuJGVsZW1lbnQuaGFzQ2xhc3MoJ2FjdGl2ZScpKVxuICAgICAgaWYgKGNoYW5nZWQpICRpbnB1dC50cmlnZ2VyKCdjaGFuZ2UnKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLiRlbGVtZW50LmF0dHIoJ2FyaWEtcHJlc3NlZCcsICF0aGlzLiRlbGVtZW50Lmhhc0NsYXNzKCdhY3RpdmUnKSlcbiAgICAgIHRoaXMuJGVsZW1lbnQudG9nZ2xlQ2xhc3MoJ2FjdGl2ZScpXG4gICAgfVxuICB9XG5cblxuICAvLyBCVVRUT04gUExVR0lOIERFRklOSVRJT05cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgZnVuY3Rpb24gUGx1Z2luKG9wdGlvbikge1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgdmFyICR0aGlzICAgPSAkKHRoaXMpXG4gICAgICB2YXIgZGF0YSAgICA9ICR0aGlzLmRhdGEoJ2JzLmJ1dHRvbicpXG4gICAgICB2YXIgb3B0aW9ucyA9IHR5cGVvZiBvcHRpb24gPT0gJ29iamVjdCcgJiYgb3B0aW9uXG5cbiAgICAgIGlmICghZGF0YSkgJHRoaXMuZGF0YSgnYnMuYnV0dG9uJywgKGRhdGEgPSBuZXcgQnV0dG9uKHRoaXMsIG9wdGlvbnMpKSlcblxuICAgICAgaWYgKG9wdGlvbiA9PSAndG9nZ2xlJykgZGF0YS50b2dnbGUoKVxuICAgICAgZWxzZSBpZiAob3B0aW9uKSBkYXRhLnNldFN0YXRlKG9wdGlvbilcbiAgICB9KVxuICB9XG5cbiAgdmFyIG9sZCA9ICQuZm4uYnV0dG9uXG5cbiAgJC5mbi5idXR0b24gICAgICAgICAgICAgPSBQbHVnaW5cbiAgJC5mbi5idXR0b24uQ29uc3RydWN0b3IgPSBCdXR0b25cblxuXG4gIC8vIEJVVFRPTiBOTyBDT05GTElDVFxuICAvLyA9PT09PT09PT09PT09PT09PT1cblxuICAkLmZuLmJ1dHRvbi5ub0NvbmZsaWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICQuZm4uYnV0dG9uID0gb2xkXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG5cbiAgLy8gQlVUVE9OIERBVEEtQVBJXG4gIC8vID09PT09PT09PT09PT09PVxuXG4gICQoZG9jdW1lbnQpXG4gICAgLm9uKCdjbGljay5icy5idXR0b24uZGF0YS1hcGknLCAnW2RhdGEtdG9nZ2xlXj1cImJ1dHRvblwiXScsIGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgJGJ0biA9ICQoZS50YXJnZXQpLmNsb3Nlc3QoJy5idG4nKVxuICAgICAgUGx1Z2luLmNhbGwoJGJ0biwgJ3RvZ2dsZScpXG4gICAgICBpZiAoISgkKGUudGFyZ2V0KS5pcygnaW5wdXRbdHlwZT1cInJhZGlvXCJdLCBpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0nKSkpIHtcbiAgICAgICAgLy8gUHJldmVudCBkb3VibGUgY2xpY2sgb24gcmFkaW9zLCBhbmQgdGhlIGRvdWJsZSBzZWxlY3Rpb25zIChzbyBjYW5jZWxsYXRpb24pIG9uIGNoZWNrYm94ZXNcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgIC8vIFRoZSB0YXJnZXQgY29tcG9uZW50IHN0aWxsIHJlY2VpdmUgdGhlIGZvY3VzXG4gICAgICAgIGlmICgkYnRuLmlzKCdpbnB1dCxidXR0b24nKSkgJGJ0bi50cmlnZ2VyKCdmb2N1cycpXG4gICAgICAgIGVsc2UgJGJ0bi5maW5kKCdpbnB1dDp2aXNpYmxlLGJ1dHRvbjp2aXNpYmxlJykuZmlyc3QoKS50cmlnZ2VyKCdmb2N1cycpXG4gICAgICB9XG4gICAgfSlcbiAgICAub24oJ2ZvY3VzLmJzLmJ1dHRvbi5kYXRhLWFwaSBibHVyLmJzLmJ1dHRvbi5kYXRhLWFwaScsICdbZGF0YS10b2dnbGVePVwiYnV0dG9uXCJdJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICQoZS50YXJnZXQpLmNsb3Nlc3QoJy5idG4nKS50b2dnbGVDbGFzcygnZm9jdXMnLCAvXmZvY3VzKGluKT8kLy50ZXN0KGUudHlwZSkpXG4gICAgfSlcblxufShqUXVlcnkpO1xuIiwiLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBCb290c3RyYXA6IGNhcm91c2VsLmpzIHYzLjMuN1xuICogaHR0cDovL2dldGJvb3RzdHJhcC5jb20vamF2YXNjcmlwdC8jY2Fyb3VzZWxcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29weXJpZ2h0IDIwMTEtMjAxNiBUd2l0dGVyLCBJbmMuXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21hc3Rlci9MSUNFTlNFKVxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cblxuK2Z1bmN0aW9uICgkKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICAvLyBDQVJPVVNFTCBDTEFTUyBERUZJTklUSU9OXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICB2YXIgQ2Fyb3VzZWwgPSBmdW5jdGlvbiAoZWxlbWVudCwgb3B0aW9ucykge1xuICAgIHRoaXMuJGVsZW1lbnQgICAgPSAkKGVsZW1lbnQpXG4gICAgdGhpcy4kaW5kaWNhdG9ycyA9IHRoaXMuJGVsZW1lbnQuZmluZCgnLmNhcm91c2VsLWluZGljYXRvcnMnKVxuICAgIHRoaXMub3B0aW9ucyAgICAgPSBvcHRpb25zXG4gICAgdGhpcy5wYXVzZWQgICAgICA9IG51bGxcbiAgICB0aGlzLnNsaWRpbmcgICAgID0gbnVsbFxuICAgIHRoaXMuaW50ZXJ2YWwgICAgPSBudWxsXG4gICAgdGhpcy4kYWN0aXZlICAgICA9IG51bGxcbiAgICB0aGlzLiRpdGVtcyAgICAgID0gbnVsbFxuXG4gICAgdGhpcy5vcHRpb25zLmtleWJvYXJkICYmIHRoaXMuJGVsZW1lbnQub24oJ2tleWRvd24uYnMuY2Fyb3VzZWwnLCAkLnByb3h5KHRoaXMua2V5ZG93biwgdGhpcykpXG5cbiAgICB0aGlzLm9wdGlvbnMucGF1c2UgPT0gJ2hvdmVyJyAmJiAhKCdvbnRvdWNoc3RhcnQnIGluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkgJiYgdGhpcy4kZWxlbWVudFxuICAgICAgLm9uKCdtb3VzZWVudGVyLmJzLmNhcm91c2VsJywgJC5wcm94eSh0aGlzLnBhdXNlLCB0aGlzKSlcbiAgICAgIC5vbignbW91c2VsZWF2ZS5icy5jYXJvdXNlbCcsICQucHJveHkodGhpcy5jeWNsZSwgdGhpcykpXG4gIH1cblxuICBDYXJvdXNlbC5WRVJTSU9OICA9ICczLjMuNydcblxuICBDYXJvdXNlbC5UUkFOU0lUSU9OX0RVUkFUSU9OID0gNjAwXG5cbiAgQ2Fyb3VzZWwuREVGQVVMVFMgPSB7XG4gICAgaW50ZXJ2YWw6IDUwMDAsXG4gICAgcGF1c2U6ICdob3ZlcicsXG4gICAgd3JhcDogdHJ1ZSxcbiAgICBrZXlib2FyZDogdHJ1ZVxuICB9XG5cbiAgQ2Fyb3VzZWwucHJvdG90eXBlLmtleWRvd24gPSBmdW5jdGlvbiAoZSkge1xuICAgIGlmICgvaW5wdXR8dGV4dGFyZWEvaS50ZXN0KGUudGFyZ2V0LnRhZ05hbWUpKSByZXR1cm5cbiAgICBzd2l0Y2ggKGUud2hpY2gpIHtcbiAgICAgIGNhc2UgMzc6IHRoaXMucHJldigpOyBicmVha1xuICAgICAgY2FzZSAzOTogdGhpcy5uZXh0KCk7IGJyZWFrXG4gICAgICBkZWZhdWx0OiByZXR1cm5cbiAgICB9XG5cbiAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgfVxuXG4gIENhcm91c2VsLnByb3RvdHlwZS5jeWNsZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgZSB8fCAodGhpcy5wYXVzZWQgPSBmYWxzZSlcblxuICAgIHRoaXMuaW50ZXJ2YWwgJiYgY2xlYXJJbnRlcnZhbCh0aGlzLmludGVydmFsKVxuXG4gICAgdGhpcy5vcHRpb25zLmludGVydmFsXG4gICAgICAmJiAhdGhpcy5wYXVzZWRcbiAgICAgICYmICh0aGlzLmludGVydmFsID0gc2V0SW50ZXJ2YWwoJC5wcm94eSh0aGlzLm5leHQsIHRoaXMpLCB0aGlzLm9wdGlvbnMuaW50ZXJ2YWwpKVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIENhcm91c2VsLnByb3RvdHlwZS5nZXRJdGVtSW5kZXggPSBmdW5jdGlvbiAoaXRlbSkge1xuICAgIHRoaXMuJGl0ZW1zID0gaXRlbS5wYXJlbnQoKS5jaGlsZHJlbignLml0ZW0nKVxuICAgIHJldHVybiB0aGlzLiRpdGVtcy5pbmRleChpdGVtIHx8IHRoaXMuJGFjdGl2ZSlcbiAgfVxuXG4gIENhcm91c2VsLnByb3RvdHlwZS5nZXRJdGVtRm9yRGlyZWN0aW9uID0gZnVuY3Rpb24gKGRpcmVjdGlvbiwgYWN0aXZlKSB7XG4gICAgdmFyIGFjdGl2ZUluZGV4ID0gdGhpcy5nZXRJdGVtSW5kZXgoYWN0aXZlKVxuICAgIHZhciB3aWxsV3JhcCA9IChkaXJlY3Rpb24gPT0gJ3ByZXYnICYmIGFjdGl2ZUluZGV4ID09PSAwKVxuICAgICAgICAgICAgICAgIHx8IChkaXJlY3Rpb24gPT0gJ25leHQnICYmIGFjdGl2ZUluZGV4ID09ICh0aGlzLiRpdGVtcy5sZW5ndGggLSAxKSlcbiAgICBpZiAod2lsbFdyYXAgJiYgIXRoaXMub3B0aW9ucy53cmFwKSByZXR1cm4gYWN0aXZlXG4gICAgdmFyIGRlbHRhID0gZGlyZWN0aW9uID09ICdwcmV2JyA/IC0xIDogMVxuICAgIHZhciBpdGVtSW5kZXggPSAoYWN0aXZlSW5kZXggKyBkZWx0YSkgJSB0aGlzLiRpdGVtcy5sZW5ndGhcbiAgICByZXR1cm4gdGhpcy4kaXRlbXMuZXEoaXRlbUluZGV4KVxuICB9XG5cbiAgQ2Fyb3VzZWwucHJvdG90eXBlLnRvID0gZnVuY3Rpb24gKHBvcykge1xuICAgIHZhciB0aGF0ICAgICAgICA9IHRoaXNcbiAgICB2YXIgYWN0aXZlSW5kZXggPSB0aGlzLmdldEl0ZW1JbmRleCh0aGlzLiRhY3RpdmUgPSB0aGlzLiRlbGVtZW50LmZpbmQoJy5pdGVtLmFjdGl2ZScpKVxuXG4gICAgaWYgKHBvcyA+ICh0aGlzLiRpdGVtcy5sZW5ndGggLSAxKSB8fCBwb3MgPCAwKSByZXR1cm5cblxuICAgIGlmICh0aGlzLnNsaWRpbmcpICAgICAgIHJldHVybiB0aGlzLiRlbGVtZW50Lm9uZSgnc2xpZC5icy5jYXJvdXNlbCcsIGZ1bmN0aW9uICgpIHsgdGhhdC50byhwb3MpIH0pIC8vIHllcywgXCJzbGlkXCJcbiAgICBpZiAoYWN0aXZlSW5kZXggPT0gcG9zKSByZXR1cm4gdGhpcy5wYXVzZSgpLmN5Y2xlKClcblxuICAgIHJldHVybiB0aGlzLnNsaWRlKHBvcyA+IGFjdGl2ZUluZGV4ID8gJ25leHQnIDogJ3ByZXYnLCB0aGlzLiRpdGVtcy5lcShwb3MpKVxuICB9XG5cbiAgQ2Fyb3VzZWwucHJvdG90eXBlLnBhdXNlID0gZnVuY3Rpb24gKGUpIHtcbiAgICBlIHx8ICh0aGlzLnBhdXNlZCA9IHRydWUpXG5cbiAgICBpZiAodGhpcy4kZWxlbWVudC5maW5kKCcubmV4dCwgLnByZXYnKS5sZW5ndGggJiYgJC5zdXBwb3J0LnRyYW5zaXRpb24pIHtcbiAgICAgIHRoaXMuJGVsZW1lbnQudHJpZ2dlcigkLnN1cHBvcnQudHJhbnNpdGlvbi5lbmQpXG4gICAgICB0aGlzLmN5Y2xlKHRydWUpXG4gICAgfVxuXG4gICAgdGhpcy5pbnRlcnZhbCA9IGNsZWFySW50ZXJ2YWwodGhpcy5pbnRlcnZhbClcblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBDYXJvdXNlbC5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodGhpcy5zbGlkaW5nKSByZXR1cm5cbiAgICByZXR1cm4gdGhpcy5zbGlkZSgnbmV4dCcpXG4gIH1cblxuICBDYXJvdXNlbC5wcm90b3R5cGUucHJldiA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodGhpcy5zbGlkaW5nKSByZXR1cm5cbiAgICByZXR1cm4gdGhpcy5zbGlkZSgncHJldicpXG4gIH1cblxuICBDYXJvdXNlbC5wcm90b3R5cGUuc2xpZGUgPSBmdW5jdGlvbiAodHlwZSwgbmV4dCkge1xuICAgIHZhciAkYWN0aXZlICAgPSB0aGlzLiRlbGVtZW50LmZpbmQoJy5pdGVtLmFjdGl2ZScpXG4gICAgdmFyICRuZXh0ICAgICA9IG5leHQgfHwgdGhpcy5nZXRJdGVtRm9yRGlyZWN0aW9uKHR5cGUsICRhY3RpdmUpXG4gICAgdmFyIGlzQ3ljbGluZyA9IHRoaXMuaW50ZXJ2YWxcbiAgICB2YXIgZGlyZWN0aW9uID0gdHlwZSA9PSAnbmV4dCcgPyAnbGVmdCcgOiAncmlnaHQnXG4gICAgdmFyIHRoYXQgICAgICA9IHRoaXNcblxuICAgIGlmICgkbmV4dC5oYXNDbGFzcygnYWN0aXZlJykpIHJldHVybiAodGhpcy5zbGlkaW5nID0gZmFsc2UpXG5cbiAgICB2YXIgcmVsYXRlZFRhcmdldCA9ICRuZXh0WzBdXG4gICAgdmFyIHNsaWRlRXZlbnQgPSAkLkV2ZW50KCdzbGlkZS5icy5jYXJvdXNlbCcsIHtcbiAgICAgIHJlbGF0ZWRUYXJnZXQ6IHJlbGF0ZWRUYXJnZXQsXG4gICAgICBkaXJlY3Rpb246IGRpcmVjdGlvblxuICAgIH0pXG4gICAgdGhpcy4kZWxlbWVudC50cmlnZ2VyKHNsaWRlRXZlbnQpXG4gICAgaWYgKHNsaWRlRXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkpIHJldHVyblxuXG4gICAgdGhpcy5zbGlkaW5nID0gdHJ1ZVxuXG4gICAgaXNDeWNsaW5nICYmIHRoaXMucGF1c2UoKVxuXG4gICAgaWYgKHRoaXMuJGluZGljYXRvcnMubGVuZ3RoKSB7XG4gICAgICB0aGlzLiRpbmRpY2F0b3JzLmZpbmQoJy5hY3RpdmUnKS5yZW1vdmVDbGFzcygnYWN0aXZlJylcbiAgICAgIHZhciAkbmV4dEluZGljYXRvciA9ICQodGhpcy4kaW5kaWNhdG9ycy5jaGlsZHJlbigpW3RoaXMuZ2V0SXRlbUluZGV4KCRuZXh0KV0pXG4gICAgICAkbmV4dEluZGljYXRvciAmJiAkbmV4dEluZGljYXRvci5hZGRDbGFzcygnYWN0aXZlJylcbiAgICB9XG5cbiAgICB2YXIgc2xpZEV2ZW50ID0gJC5FdmVudCgnc2xpZC5icy5jYXJvdXNlbCcsIHsgcmVsYXRlZFRhcmdldDogcmVsYXRlZFRhcmdldCwgZGlyZWN0aW9uOiBkaXJlY3Rpb24gfSkgLy8geWVzLCBcInNsaWRcIlxuICAgIGlmICgkLnN1cHBvcnQudHJhbnNpdGlvbiAmJiB0aGlzLiRlbGVtZW50Lmhhc0NsYXNzKCdzbGlkZScpKSB7XG4gICAgICAkbmV4dC5hZGRDbGFzcyh0eXBlKVxuICAgICAgJG5leHRbMF0ub2Zmc2V0V2lkdGggLy8gZm9yY2UgcmVmbG93XG4gICAgICAkYWN0aXZlLmFkZENsYXNzKGRpcmVjdGlvbilcbiAgICAgICRuZXh0LmFkZENsYXNzKGRpcmVjdGlvbilcbiAgICAgICRhY3RpdmVcbiAgICAgICAgLm9uZSgnYnNUcmFuc2l0aW9uRW5kJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICRuZXh0LnJlbW92ZUNsYXNzKFt0eXBlLCBkaXJlY3Rpb25dLmpvaW4oJyAnKSkuYWRkQ2xhc3MoJ2FjdGl2ZScpXG4gICAgICAgICAgJGFjdGl2ZS5yZW1vdmVDbGFzcyhbJ2FjdGl2ZScsIGRpcmVjdGlvbl0uam9pbignICcpKVxuICAgICAgICAgIHRoYXQuc2xpZGluZyA9IGZhbHNlXG4gICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aGF0LiRlbGVtZW50LnRyaWdnZXIoc2xpZEV2ZW50KVxuICAgICAgICAgIH0sIDApXG4gICAgICAgIH0pXG4gICAgICAgIC5lbXVsYXRlVHJhbnNpdGlvbkVuZChDYXJvdXNlbC5UUkFOU0lUSU9OX0RVUkFUSU9OKVxuICAgIH0gZWxzZSB7XG4gICAgICAkYWN0aXZlLnJlbW92ZUNsYXNzKCdhY3RpdmUnKVxuICAgICAgJG5leHQuYWRkQ2xhc3MoJ2FjdGl2ZScpXG4gICAgICB0aGlzLnNsaWRpbmcgPSBmYWxzZVxuICAgICAgdGhpcy4kZWxlbWVudC50cmlnZ2VyKHNsaWRFdmVudClcbiAgICB9XG5cbiAgICBpc0N5Y2xpbmcgJiYgdGhpcy5jeWNsZSgpXG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cblxuICAvLyBDQVJPVVNFTCBQTFVHSU4gREVGSU5JVElPTlxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIGZ1bmN0aW9uIFBsdWdpbihvcHRpb24pIHtcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciAkdGhpcyAgID0gJCh0aGlzKVxuICAgICAgdmFyIGRhdGEgICAgPSAkdGhpcy5kYXRhKCdicy5jYXJvdXNlbCcpXG4gICAgICB2YXIgb3B0aW9ucyA9ICQuZXh0ZW5kKHt9LCBDYXJvdXNlbC5ERUZBVUxUUywgJHRoaXMuZGF0YSgpLCB0eXBlb2Ygb3B0aW9uID09ICdvYmplY3QnICYmIG9wdGlvbilcbiAgICAgIHZhciBhY3Rpb24gID0gdHlwZW9mIG9wdGlvbiA9PSAnc3RyaW5nJyA/IG9wdGlvbiA6IG9wdGlvbnMuc2xpZGVcblxuICAgICAgaWYgKCFkYXRhKSAkdGhpcy5kYXRhKCdicy5jYXJvdXNlbCcsIChkYXRhID0gbmV3IENhcm91c2VsKHRoaXMsIG9wdGlvbnMpKSlcbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9uID09ICdudW1iZXInKSBkYXRhLnRvKG9wdGlvbilcbiAgICAgIGVsc2UgaWYgKGFjdGlvbikgZGF0YVthY3Rpb25dKClcbiAgICAgIGVsc2UgaWYgKG9wdGlvbnMuaW50ZXJ2YWwpIGRhdGEucGF1c2UoKS5jeWNsZSgpXG4gICAgfSlcbiAgfVxuXG4gIHZhciBvbGQgPSAkLmZuLmNhcm91c2VsXG5cbiAgJC5mbi5jYXJvdXNlbCAgICAgICAgICAgICA9IFBsdWdpblxuICAkLmZuLmNhcm91c2VsLkNvbnN0cnVjdG9yID0gQ2Fyb3VzZWxcblxuXG4gIC8vIENBUk9VU0VMIE5PIENPTkZMSUNUXG4gIC8vID09PT09PT09PT09PT09PT09PT09XG5cbiAgJC5mbi5jYXJvdXNlbC5ub0NvbmZsaWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICQuZm4uY2Fyb3VzZWwgPSBvbGRcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cblxuICAvLyBDQVJPVVNFTCBEQVRBLUFQSVxuICAvLyA9PT09PT09PT09PT09PT09PVxuXG4gIHZhciBjbGlja0hhbmRsZXIgPSBmdW5jdGlvbiAoZSkge1xuICAgIHZhciBocmVmXG4gICAgdmFyICR0aGlzICAgPSAkKHRoaXMpXG4gICAgdmFyICR0YXJnZXQgPSAkKCR0aGlzLmF0dHIoJ2RhdGEtdGFyZ2V0JykgfHwgKGhyZWYgPSAkdGhpcy5hdHRyKCdocmVmJykpICYmIGhyZWYucmVwbGFjZSgvLiooPz0jW15cXHNdKyQpLywgJycpKSAvLyBzdHJpcCBmb3IgaWU3XG4gICAgaWYgKCEkdGFyZ2V0Lmhhc0NsYXNzKCdjYXJvdXNlbCcpKSByZXR1cm5cbiAgICB2YXIgb3B0aW9ucyA9ICQuZXh0ZW5kKHt9LCAkdGFyZ2V0LmRhdGEoKSwgJHRoaXMuZGF0YSgpKVxuICAgIHZhciBzbGlkZUluZGV4ID0gJHRoaXMuYXR0cignZGF0YS1zbGlkZS10bycpXG4gICAgaWYgKHNsaWRlSW5kZXgpIG9wdGlvbnMuaW50ZXJ2YWwgPSBmYWxzZVxuXG4gICAgUGx1Z2luLmNhbGwoJHRhcmdldCwgb3B0aW9ucylcblxuICAgIGlmIChzbGlkZUluZGV4KSB7XG4gICAgICAkdGFyZ2V0LmRhdGEoJ2JzLmNhcm91c2VsJykudG8oc2xpZGVJbmRleClcbiAgICB9XG5cbiAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgfVxuXG4gICQoZG9jdW1lbnQpXG4gICAgLm9uKCdjbGljay5icy5jYXJvdXNlbC5kYXRhLWFwaScsICdbZGF0YS1zbGlkZV0nLCBjbGlja0hhbmRsZXIpXG4gICAgLm9uKCdjbGljay5icy5jYXJvdXNlbC5kYXRhLWFwaScsICdbZGF0YS1zbGlkZS10b10nLCBjbGlja0hhbmRsZXIpXG5cbiAgJCh3aW5kb3cpLm9uKCdsb2FkJywgZnVuY3Rpb24gKCkge1xuICAgICQoJ1tkYXRhLXJpZGU9XCJjYXJvdXNlbFwiXScpLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgdmFyICRjYXJvdXNlbCA9ICQodGhpcylcbiAgICAgIFBsdWdpbi5jYWxsKCRjYXJvdXNlbCwgJGNhcm91c2VsLmRhdGEoKSlcbiAgICB9KVxuICB9KVxuXG59KGpRdWVyeSk7XG4iLCIvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEJvb3RzdHJhcDogY29sbGFwc2UuanMgdjMuMy43XG4gKiBodHRwOi8vZ2V0Ym9vdHN0cmFwLmNvbS9qYXZhc2NyaXB0LyNjb2xsYXBzZVxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDb3B5cmlnaHQgMjAxMS0yMDE2IFR3aXR0ZXIsIEluYy5cbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFzdGVyL0xJQ0VOU0UpXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuLyoganNoaW50IGxhdGVkZWY6IGZhbHNlICovXG5cbitmdW5jdGlvbiAoJCkge1xuICAndXNlIHN0cmljdCc7XG5cbiAgLy8gQ09MTEFQU0UgUFVCTElDIENMQVNTIERFRklOSVRJT05cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICB2YXIgQ29sbGFwc2UgPSBmdW5jdGlvbiAoZWxlbWVudCwgb3B0aW9ucykge1xuICAgIHRoaXMuJGVsZW1lbnQgICAgICA9ICQoZWxlbWVudClcbiAgICB0aGlzLm9wdGlvbnMgICAgICAgPSAkLmV4dGVuZCh7fSwgQ29sbGFwc2UuREVGQVVMVFMsIG9wdGlvbnMpXG4gICAgdGhpcy4kdHJpZ2dlciAgICAgID0gJCgnW2RhdGEtdG9nZ2xlPVwiY29sbGFwc2VcIl1baHJlZj1cIiMnICsgZWxlbWVudC5pZCArICdcIl0sJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAnW2RhdGEtdG9nZ2xlPVwiY29sbGFwc2VcIl1bZGF0YS10YXJnZXQ9XCIjJyArIGVsZW1lbnQuaWQgKyAnXCJdJylcbiAgICB0aGlzLnRyYW5zaXRpb25pbmcgPSBudWxsXG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnBhcmVudCkge1xuICAgICAgdGhpcy4kcGFyZW50ID0gdGhpcy5nZXRQYXJlbnQoKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFkZEFyaWFBbmRDb2xsYXBzZWRDbGFzcyh0aGlzLiRlbGVtZW50LCB0aGlzLiR0cmlnZ2VyKVxuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMudG9nZ2xlKSB0aGlzLnRvZ2dsZSgpXG4gIH1cblxuICBDb2xsYXBzZS5WRVJTSU9OICA9ICczLjMuNydcblxuICBDb2xsYXBzZS5UUkFOU0lUSU9OX0RVUkFUSU9OID0gMzUwXG5cbiAgQ29sbGFwc2UuREVGQVVMVFMgPSB7XG4gICAgdG9nZ2xlOiB0cnVlXG4gIH1cblxuICBDb2xsYXBzZS5wcm90b3R5cGUuZGltZW5zaW9uID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBoYXNXaWR0aCA9IHRoaXMuJGVsZW1lbnQuaGFzQ2xhc3MoJ3dpZHRoJylcbiAgICByZXR1cm4gaGFzV2lkdGggPyAnd2lkdGgnIDogJ2hlaWdodCdcbiAgfVxuXG4gIENvbGxhcHNlLnByb3RvdHlwZS5zaG93ID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICh0aGlzLnRyYW5zaXRpb25pbmcgfHwgdGhpcy4kZWxlbWVudC5oYXNDbGFzcygnaW4nKSkgcmV0dXJuXG5cbiAgICB2YXIgYWN0aXZlc0RhdGFcbiAgICB2YXIgYWN0aXZlcyA9IHRoaXMuJHBhcmVudCAmJiB0aGlzLiRwYXJlbnQuY2hpbGRyZW4oJy5wYW5lbCcpLmNoaWxkcmVuKCcuaW4sIC5jb2xsYXBzaW5nJylcblxuICAgIGlmIChhY3RpdmVzICYmIGFjdGl2ZXMubGVuZ3RoKSB7XG4gICAgICBhY3RpdmVzRGF0YSA9IGFjdGl2ZXMuZGF0YSgnYnMuY29sbGFwc2UnKVxuICAgICAgaWYgKGFjdGl2ZXNEYXRhICYmIGFjdGl2ZXNEYXRhLnRyYW5zaXRpb25pbmcpIHJldHVyblxuICAgIH1cblxuICAgIHZhciBzdGFydEV2ZW50ID0gJC5FdmVudCgnc2hvdy5icy5jb2xsYXBzZScpXG4gICAgdGhpcy4kZWxlbWVudC50cmlnZ2VyKHN0YXJ0RXZlbnQpXG4gICAgaWYgKHN0YXJ0RXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkpIHJldHVyblxuXG4gICAgaWYgKGFjdGl2ZXMgJiYgYWN0aXZlcy5sZW5ndGgpIHtcbiAgICAgIFBsdWdpbi5jYWxsKGFjdGl2ZXMsICdoaWRlJylcbiAgICAgIGFjdGl2ZXNEYXRhIHx8IGFjdGl2ZXMuZGF0YSgnYnMuY29sbGFwc2UnLCBudWxsKVxuICAgIH1cblxuICAgIHZhciBkaW1lbnNpb24gPSB0aGlzLmRpbWVuc2lvbigpXG5cbiAgICB0aGlzLiRlbGVtZW50XG4gICAgICAucmVtb3ZlQ2xhc3MoJ2NvbGxhcHNlJylcbiAgICAgIC5hZGRDbGFzcygnY29sbGFwc2luZycpW2RpbWVuc2lvbl0oMClcbiAgICAgIC5hdHRyKCdhcmlhLWV4cGFuZGVkJywgdHJ1ZSlcblxuICAgIHRoaXMuJHRyaWdnZXJcbiAgICAgIC5yZW1vdmVDbGFzcygnY29sbGFwc2VkJylcbiAgICAgIC5hdHRyKCdhcmlhLWV4cGFuZGVkJywgdHJ1ZSlcblxuICAgIHRoaXMudHJhbnNpdGlvbmluZyA9IDFcblxuICAgIHZhciBjb21wbGV0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuJGVsZW1lbnRcbiAgICAgICAgLnJlbW92ZUNsYXNzKCdjb2xsYXBzaW5nJylcbiAgICAgICAgLmFkZENsYXNzKCdjb2xsYXBzZSBpbicpW2RpbWVuc2lvbl0oJycpXG4gICAgICB0aGlzLnRyYW5zaXRpb25pbmcgPSAwXG4gICAgICB0aGlzLiRlbGVtZW50XG4gICAgICAgIC50cmlnZ2VyKCdzaG93bi5icy5jb2xsYXBzZScpXG4gICAgfVxuXG4gICAgaWYgKCEkLnN1cHBvcnQudHJhbnNpdGlvbikgcmV0dXJuIGNvbXBsZXRlLmNhbGwodGhpcylcblxuICAgIHZhciBzY3JvbGxTaXplID0gJC5jYW1lbENhc2UoWydzY3JvbGwnLCBkaW1lbnNpb25dLmpvaW4oJy0nKSlcblxuICAgIHRoaXMuJGVsZW1lbnRcbiAgICAgIC5vbmUoJ2JzVHJhbnNpdGlvbkVuZCcsICQucHJveHkoY29tcGxldGUsIHRoaXMpKVxuICAgICAgLmVtdWxhdGVUcmFuc2l0aW9uRW5kKENvbGxhcHNlLlRSQU5TSVRJT05fRFVSQVRJT04pW2RpbWVuc2lvbl0odGhpcy4kZWxlbWVudFswXVtzY3JvbGxTaXplXSlcbiAgfVxuXG4gIENvbGxhcHNlLnByb3RvdHlwZS5oaWRlID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICh0aGlzLnRyYW5zaXRpb25pbmcgfHwgIXRoaXMuJGVsZW1lbnQuaGFzQ2xhc3MoJ2luJykpIHJldHVyblxuXG4gICAgdmFyIHN0YXJ0RXZlbnQgPSAkLkV2ZW50KCdoaWRlLmJzLmNvbGxhcHNlJylcbiAgICB0aGlzLiRlbGVtZW50LnRyaWdnZXIoc3RhcnRFdmVudClcbiAgICBpZiAoc3RhcnRFdmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgcmV0dXJuXG5cbiAgICB2YXIgZGltZW5zaW9uID0gdGhpcy5kaW1lbnNpb24oKVxuXG4gICAgdGhpcy4kZWxlbWVudFtkaW1lbnNpb25dKHRoaXMuJGVsZW1lbnRbZGltZW5zaW9uXSgpKVswXS5vZmZzZXRIZWlnaHRcblxuICAgIHRoaXMuJGVsZW1lbnRcbiAgICAgIC5hZGRDbGFzcygnY29sbGFwc2luZycpXG4gICAgICAucmVtb3ZlQ2xhc3MoJ2NvbGxhcHNlIGluJylcbiAgICAgIC5hdHRyKCdhcmlhLWV4cGFuZGVkJywgZmFsc2UpXG5cbiAgICB0aGlzLiR0cmlnZ2VyXG4gICAgICAuYWRkQ2xhc3MoJ2NvbGxhcHNlZCcpXG4gICAgICAuYXR0cignYXJpYS1leHBhbmRlZCcsIGZhbHNlKVxuXG4gICAgdGhpcy50cmFuc2l0aW9uaW5nID0gMVxuXG4gICAgdmFyIGNvbXBsZXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy50cmFuc2l0aW9uaW5nID0gMFxuICAgICAgdGhpcy4kZWxlbWVudFxuICAgICAgICAucmVtb3ZlQ2xhc3MoJ2NvbGxhcHNpbmcnKVxuICAgICAgICAuYWRkQ2xhc3MoJ2NvbGxhcHNlJylcbiAgICAgICAgLnRyaWdnZXIoJ2hpZGRlbi5icy5jb2xsYXBzZScpXG4gICAgfVxuXG4gICAgaWYgKCEkLnN1cHBvcnQudHJhbnNpdGlvbikgcmV0dXJuIGNvbXBsZXRlLmNhbGwodGhpcylcblxuICAgIHRoaXMuJGVsZW1lbnRcbiAgICAgIFtkaW1lbnNpb25dKDApXG4gICAgICAub25lKCdic1RyYW5zaXRpb25FbmQnLCAkLnByb3h5KGNvbXBsZXRlLCB0aGlzKSlcbiAgICAgIC5lbXVsYXRlVHJhbnNpdGlvbkVuZChDb2xsYXBzZS5UUkFOU0lUSU9OX0RVUkFUSU9OKVxuICB9XG5cbiAgQ29sbGFwc2UucHJvdG90eXBlLnRvZ2dsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzW3RoaXMuJGVsZW1lbnQuaGFzQ2xhc3MoJ2luJykgPyAnaGlkZScgOiAnc2hvdyddKClcbiAgfVxuXG4gIENvbGxhcHNlLnByb3RvdHlwZS5nZXRQYXJlbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuICQodGhpcy5vcHRpb25zLnBhcmVudClcbiAgICAgIC5maW5kKCdbZGF0YS10b2dnbGU9XCJjb2xsYXBzZVwiXVtkYXRhLXBhcmVudD1cIicgKyB0aGlzLm9wdGlvbnMucGFyZW50ICsgJ1wiXScpXG4gICAgICAuZWFjaCgkLnByb3h5KGZ1bmN0aW9uIChpLCBlbGVtZW50KSB7XG4gICAgICAgIHZhciAkZWxlbWVudCA9ICQoZWxlbWVudClcbiAgICAgICAgdGhpcy5hZGRBcmlhQW5kQ29sbGFwc2VkQ2xhc3MoZ2V0VGFyZ2V0RnJvbVRyaWdnZXIoJGVsZW1lbnQpLCAkZWxlbWVudClcbiAgICAgIH0sIHRoaXMpKVxuICAgICAgLmVuZCgpXG4gIH1cblxuICBDb2xsYXBzZS5wcm90b3R5cGUuYWRkQXJpYUFuZENvbGxhcHNlZENsYXNzID0gZnVuY3Rpb24gKCRlbGVtZW50LCAkdHJpZ2dlcikge1xuICAgIHZhciBpc09wZW4gPSAkZWxlbWVudC5oYXNDbGFzcygnaW4nKVxuXG4gICAgJGVsZW1lbnQuYXR0cignYXJpYS1leHBhbmRlZCcsIGlzT3BlbilcbiAgICAkdHJpZ2dlclxuICAgICAgLnRvZ2dsZUNsYXNzKCdjb2xsYXBzZWQnLCAhaXNPcGVuKVxuICAgICAgLmF0dHIoJ2FyaWEtZXhwYW5kZWQnLCBpc09wZW4pXG4gIH1cblxuICBmdW5jdGlvbiBnZXRUYXJnZXRGcm9tVHJpZ2dlcigkdHJpZ2dlcikge1xuICAgIHZhciBocmVmXG4gICAgdmFyIHRhcmdldCA9ICR0cmlnZ2VyLmF0dHIoJ2RhdGEtdGFyZ2V0JylcbiAgICAgIHx8IChocmVmID0gJHRyaWdnZXIuYXR0cignaHJlZicpKSAmJiBocmVmLnJlcGxhY2UoLy4qKD89I1teXFxzXSskKS8sICcnKSAvLyBzdHJpcCBmb3IgaWU3XG5cbiAgICByZXR1cm4gJCh0YXJnZXQpXG4gIH1cblxuXG4gIC8vIENPTExBUFNFIFBMVUdJTiBERUZJTklUSU9OXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgZnVuY3Rpb24gUGx1Z2luKG9wdGlvbikge1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgdmFyICR0aGlzICAgPSAkKHRoaXMpXG4gICAgICB2YXIgZGF0YSAgICA9ICR0aGlzLmRhdGEoJ2JzLmNvbGxhcHNlJylcbiAgICAgIHZhciBvcHRpb25zID0gJC5leHRlbmQoe30sIENvbGxhcHNlLkRFRkFVTFRTLCAkdGhpcy5kYXRhKCksIHR5cGVvZiBvcHRpb24gPT0gJ29iamVjdCcgJiYgb3B0aW9uKVxuXG4gICAgICBpZiAoIWRhdGEgJiYgb3B0aW9ucy50b2dnbGUgJiYgL3Nob3d8aGlkZS8udGVzdChvcHRpb24pKSBvcHRpb25zLnRvZ2dsZSA9IGZhbHNlXG4gICAgICBpZiAoIWRhdGEpICR0aGlzLmRhdGEoJ2JzLmNvbGxhcHNlJywgKGRhdGEgPSBuZXcgQ29sbGFwc2UodGhpcywgb3B0aW9ucykpKVxuICAgICAgaWYgKHR5cGVvZiBvcHRpb24gPT0gJ3N0cmluZycpIGRhdGFbb3B0aW9uXSgpXG4gICAgfSlcbiAgfVxuXG4gIHZhciBvbGQgPSAkLmZuLmNvbGxhcHNlXG5cbiAgJC5mbi5jb2xsYXBzZSAgICAgICAgICAgICA9IFBsdWdpblxuICAkLmZuLmNvbGxhcHNlLkNvbnN0cnVjdG9yID0gQ29sbGFwc2VcblxuXG4gIC8vIENPTExBUFNFIE5PIENPTkZMSUNUXG4gIC8vID09PT09PT09PT09PT09PT09PT09XG5cbiAgJC5mbi5jb2xsYXBzZS5ub0NvbmZsaWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICQuZm4uY29sbGFwc2UgPSBvbGRcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cblxuICAvLyBDT0xMQVBTRSBEQVRBLUFQSVxuICAvLyA9PT09PT09PT09PT09PT09PVxuXG4gICQoZG9jdW1lbnQpLm9uKCdjbGljay5icy5jb2xsYXBzZS5kYXRhLWFwaScsICdbZGF0YS10b2dnbGU9XCJjb2xsYXBzZVwiXScsIGZ1bmN0aW9uIChlKSB7XG4gICAgdmFyICR0aGlzICAgPSAkKHRoaXMpXG5cbiAgICBpZiAoISR0aGlzLmF0dHIoJ2RhdGEtdGFyZ2V0JykpIGUucHJldmVudERlZmF1bHQoKVxuXG4gICAgdmFyICR0YXJnZXQgPSBnZXRUYXJnZXRGcm9tVHJpZ2dlcigkdGhpcylcbiAgICB2YXIgZGF0YSAgICA9ICR0YXJnZXQuZGF0YSgnYnMuY29sbGFwc2UnKVxuICAgIHZhciBvcHRpb24gID0gZGF0YSA/ICd0b2dnbGUnIDogJHRoaXMuZGF0YSgpXG5cbiAgICBQbHVnaW4uY2FsbCgkdGFyZ2V0LCBvcHRpb24pXG4gIH0pXG5cbn0oalF1ZXJ5KTtcbiIsIi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQm9vdHN0cmFwOiBkcm9wZG93bi5qcyB2My4zLjdcbiAqIGh0dHA6Ly9nZXRib290c3RyYXAuY29tL2phdmFzY3JpcHQvI2Ryb3Bkb3duc1xuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDb3B5cmlnaHQgMjAxMS0yMDE2IFR3aXR0ZXIsIEluYy5cbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFzdGVyL0xJQ0VOU0UpXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuXG4rZnVuY3Rpb24gKCQpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIC8vIERST1BET1dOIENMQVNTIERFRklOSVRJT05cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHZhciBiYWNrZHJvcCA9ICcuZHJvcGRvd24tYmFja2Ryb3AnXG4gIHZhciB0b2dnbGUgICA9ICdbZGF0YS10b2dnbGU9XCJkcm9wZG93blwiXSdcbiAgdmFyIERyb3Bkb3duID0gZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAkKGVsZW1lbnQpLm9uKCdjbGljay5icy5kcm9wZG93bicsIHRoaXMudG9nZ2xlKVxuICB9XG5cbiAgRHJvcGRvd24uVkVSU0lPTiA9ICczLjMuNydcblxuICBmdW5jdGlvbiBnZXRQYXJlbnQoJHRoaXMpIHtcbiAgICB2YXIgc2VsZWN0b3IgPSAkdGhpcy5hdHRyKCdkYXRhLXRhcmdldCcpXG5cbiAgICBpZiAoIXNlbGVjdG9yKSB7XG4gICAgICBzZWxlY3RvciA9ICR0aGlzLmF0dHIoJ2hyZWYnKVxuICAgICAgc2VsZWN0b3IgPSBzZWxlY3RvciAmJiAvI1tBLVphLXpdLy50ZXN0KHNlbGVjdG9yKSAmJiBzZWxlY3Rvci5yZXBsYWNlKC8uKig/PSNbXlxcc10qJCkvLCAnJykgLy8gc3RyaXAgZm9yIGllN1xuICAgIH1cblxuICAgIHZhciAkcGFyZW50ID0gc2VsZWN0b3IgJiYgJChzZWxlY3RvcilcblxuICAgIHJldHVybiAkcGFyZW50ICYmICRwYXJlbnQubGVuZ3RoID8gJHBhcmVudCA6ICR0aGlzLnBhcmVudCgpXG4gIH1cblxuICBmdW5jdGlvbiBjbGVhck1lbnVzKGUpIHtcbiAgICBpZiAoZSAmJiBlLndoaWNoID09PSAzKSByZXR1cm5cbiAgICAkKGJhY2tkcm9wKS5yZW1vdmUoKVxuICAgICQodG9nZ2xlKS5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciAkdGhpcyAgICAgICAgID0gJCh0aGlzKVxuICAgICAgdmFyICRwYXJlbnQgICAgICAgPSBnZXRQYXJlbnQoJHRoaXMpXG4gICAgICB2YXIgcmVsYXRlZFRhcmdldCA9IHsgcmVsYXRlZFRhcmdldDogdGhpcyB9XG5cbiAgICAgIGlmICghJHBhcmVudC5oYXNDbGFzcygnb3BlbicpKSByZXR1cm5cblxuICAgICAgaWYgKGUgJiYgZS50eXBlID09ICdjbGljaycgJiYgL2lucHV0fHRleHRhcmVhL2kudGVzdChlLnRhcmdldC50YWdOYW1lKSAmJiAkLmNvbnRhaW5zKCRwYXJlbnRbMF0sIGUudGFyZ2V0KSkgcmV0dXJuXG5cbiAgICAgICRwYXJlbnQudHJpZ2dlcihlID0gJC5FdmVudCgnaGlkZS5icy5kcm9wZG93bicsIHJlbGF0ZWRUYXJnZXQpKVxuXG4gICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgcmV0dXJuXG5cbiAgICAgICR0aGlzLmF0dHIoJ2FyaWEtZXhwYW5kZWQnLCAnZmFsc2UnKVxuICAgICAgJHBhcmVudC5yZW1vdmVDbGFzcygnb3BlbicpLnRyaWdnZXIoJC5FdmVudCgnaGlkZGVuLmJzLmRyb3Bkb3duJywgcmVsYXRlZFRhcmdldCkpXG4gICAgfSlcbiAgfVxuXG4gIERyb3Bkb3duLnByb3RvdHlwZS50b2dnbGUgPSBmdW5jdGlvbiAoZSkge1xuICAgIHZhciAkdGhpcyA9ICQodGhpcylcblxuICAgIGlmICgkdGhpcy5pcygnLmRpc2FibGVkLCA6ZGlzYWJsZWQnKSkgcmV0dXJuXG5cbiAgICB2YXIgJHBhcmVudCAgPSBnZXRQYXJlbnQoJHRoaXMpXG4gICAgdmFyIGlzQWN0aXZlID0gJHBhcmVudC5oYXNDbGFzcygnb3BlbicpXG5cbiAgICBjbGVhck1lbnVzKClcblxuICAgIGlmICghaXNBY3RpdmUpIHtcbiAgICAgIGlmICgnb250b3VjaHN0YXJ0JyBpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgJiYgISRwYXJlbnQuY2xvc2VzdCgnLm5hdmJhci1uYXYnKS5sZW5ndGgpIHtcbiAgICAgICAgLy8gaWYgbW9iaWxlIHdlIHVzZSBhIGJhY2tkcm9wIGJlY2F1c2UgY2xpY2sgZXZlbnRzIGRvbid0IGRlbGVnYXRlXG4gICAgICAgICQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpXG4gICAgICAgICAgLmFkZENsYXNzKCdkcm9wZG93bi1iYWNrZHJvcCcpXG4gICAgICAgICAgLmluc2VydEFmdGVyKCQodGhpcykpXG4gICAgICAgICAgLm9uKCdjbGljaycsIGNsZWFyTWVudXMpXG4gICAgICB9XG5cbiAgICAgIHZhciByZWxhdGVkVGFyZ2V0ID0geyByZWxhdGVkVGFyZ2V0OiB0aGlzIH1cbiAgICAgICRwYXJlbnQudHJpZ2dlcihlID0gJC5FdmVudCgnc2hvdy5icy5kcm9wZG93bicsIHJlbGF0ZWRUYXJnZXQpKVxuXG4gICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgcmV0dXJuXG5cbiAgICAgICR0aGlzXG4gICAgICAgIC50cmlnZ2VyKCdmb2N1cycpXG4gICAgICAgIC5hdHRyKCdhcmlhLWV4cGFuZGVkJywgJ3RydWUnKVxuXG4gICAgICAkcGFyZW50XG4gICAgICAgIC50b2dnbGVDbGFzcygnb3BlbicpXG4gICAgICAgIC50cmlnZ2VyKCQuRXZlbnQoJ3Nob3duLmJzLmRyb3Bkb3duJywgcmVsYXRlZFRhcmdldCkpXG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBEcm9wZG93bi5wcm90b3R5cGUua2V5ZG93biA9IGZ1bmN0aW9uIChlKSB7XG4gICAgaWYgKCEvKDM4fDQwfDI3fDMyKS8udGVzdChlLndoaWNoKSB8fCAvaW5wdXR8dGV4dGFyZWEvaS50ZXN0KGUudGFyZ2V0LnRhZ05hbWUpKSByZXR1cm5cblxuICAgIHZhciAkdGhpcyA9ICQodGhpcylcblxuICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgIGUuc3RvcFByb3BhZ2F0aW9uKClcblxuICAgIGlmICgkdGhpcy5pcygnLmRpc2FibGVkLCA6ZGlzYWJsZWQnKSkgcmV0dXJuXG5cbiAgICB2YXIgJHBhcmVudCAgPSBnZXRQYXJlbnQoJHRoaXMpXG4gICAgdmFyIGlzQWN0aXZlID0gJHBhcmVudC5oYXNDbGFzcygnb3BlbicpXG5cbiAgICBpZiAoIWlzQWN0aXZlICYmIGUud2hpY2ggIT0gMjcgfHwgaXNBY3RpdmUgJiYgZS53aGljaCA9PSAyNykge1xuICAgICAgaWYgKGUud2hpY2ggPT0gMjcpICRwYXJlbnQuZmluZCh0b2dnbGUpLnRyaWdnZXIoJ2ZvY3VzJylcbiAgICAgIHJldHVybiAkdGhpcy50cmlnZ2VyKCdjbGljaycpXG4gICAgfVxuXG4gICAgdmFyIGRlc2MgPSAnIGxpOm5vdCguZGlzYWJsZWQpOnZpc2libGUgYSdcbiAgICB2YXIgJGl0ZW1zID0gJHBhcmVudC5maW5kKCcuZHJvcGRvd24tbWVudScgKyBkZXNjKVxuXG4gICAgaWYgKCEkaXRlbXMubGVuZ3RoKSByZXR1cm5cblxuICAgIHZhciBpbmRleCA9ICRpdGVtcy5pbmRleChlLnRhcmdldClcblxuICAgIGlmIChlLndoaWNoID09IDM4ICYmIGluZGV4ID4gMCkgICAgICAgICAgICAgICAgIGluZGV4LS0gICAgICAgICAvLyB1cFxuICAgIGlmIChlLndoaWNoID09IDQwICYmIGluZGV4IDwgJGl0ZW1zLmxlbmd0aCAtIDEpIGluZGV4KysgICAgICAgICAvLyBkb3duXG4gICAgaWYgKCF+aW5kZXgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSAwXG5cbiAgICAkaXRlbXMuZXEoaW5kZXgpLnRyaWdnZXIoJ2ZvY3VzJylcbiAgfVxuXG5cbiAgLy8gRFJPUERPV04gUExVR0lOIERFRklOSVRJT05cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBmdW5jdGlvbiBQbHVnaW4ob3B0aW9uKSB7XG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgJHRoaXMgPSAkKHRoaXMpXG4gICAgICB2YXIgZGF0YSAgPSAkdGhpcy5kYXRhKCdicy5kcm9wZG93bicpXG5cbiAgICAgIGlmICghZGF0YSkgJHRoaXMuZGF0YSgnYnMuZHJvcGRvd24nLCAoZGF0YSA9IG5ldyBEcm9wZG93bih0aGlzKSkpXG4gICAgICBpZiAodHlwZW9mIG9wdGlvbiA9PSAnc3RyaW5nJykgZGF0YVtvcHRpb25dLmNhbGwoJHRoaXMpXG4gICAgfSlcbiAgfVxuXG4gIHZhciBvbGQgPSAkLmZuLmRyb3Bkb3duXG5cbiAgJC5mbi5kcm9wZG93biAgICAgICAgICAgICA9IFBsdWdpblxuICAkLmZuLmRyb3Bkb3duLkNvbnN0cnVjdG9yID0gRHJvcGRvd25cblxuXG4gIC8vIERST1BET1dOIE5PIENPTkZMSUNUXG4gIC8vID09PT09PT09PT09PT09PT09PT09XG5cbiAgJC5mbi5kcm9wZG93bi5ub0NvbmZsaWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICQuZm4uZHJvcGRvd24gPSBvbGRcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cblxuICAvLyBBUFBMWSBUTyBTVEFOREFSRCBEUk9QRE9XTiBFTEVNRU5UU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gICQoZG9jdW1lbnQpXG4gICAgLm9uKCdjbGljay5icy5kcm9wZG93bi5kYXRhLWFwaScsIGNsZWFyTWVudXMpXG4gICAgLm9uKCdjbGljay5icy5kcm9wZG93bi5kYXRhLWFwaScsICcuZHJvcGRvd24gZm9ybScsIGZ1bmN0aW9uIChlKSB7IGUuc3RvcFByb3BhZ2F0aW9uKCkgfSlcbiAgICAub24oJ2NsaWNrLmJzLmRyb3Bkb3duLmRhdGEtYXBpJywgdG9nZ2xlLCBEcm9wZG93bi5wcm90b3R5cGUudG9nZ2xlKVxuICAgIC5vbigna2V5ZG93bi5icy5kcm9wZG93bi5kYXRhLWFwaScsIHRvZ2dsZSwgRHJvcGRvd24ucHJvdG90eXBlLmtleWRvd24pXG4gICAgLm9uKCdrZXlkb3duLmJzLmRyb3Bkb3duLmRhdGEtYXBpJywgJy5kcm9wZG93bi1tZW51JywgRHJvcGRvd24ucHJvdG90eXBlLmtleWRvd24pXG5cbn0oalF1ZXJ5KTtcbiIsIi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQm9vdHN0cmFwOiBtb2RhbC5qcyB2My4zLjdcbiAqIGh0dHA6Ly9nZXRib290c3RyYXAuY29tL2phdmFzY3JpcHQvI21vZGFsc1xuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDb3B5cmlnaHQgMjAxMS0yMDE2IFR3aXR0ZXIsIEluYy5cbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFzdGVyL0xJQ0VOU0UpXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuXG4rZnVuY3Rpb24gKCQpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIC8vIE1PREFMIENMQVNTIERFRklOSVRJT05cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHZhciBNb2RhbCA9IGZ1bmN0aW9uIChlbGVtZW50LCBvcHRpb25zKSB7XG4gICAgdGhpcy5vcHRpb25zICAgICAgICAgICAgID0gb3B0aW9uc1xuICAgIHRoaXMuJGJvZHkgICAgICAgICAgICAgICA9ICQoZG9jdW1lbnQuYm9keSlcbiAgICB0aGlzLiRlbGVtZW50ICAgICAgICAgICAgPSAkKGVsZW1lbnQpXG4gICAgdGhpcy4kZGlhbG9nICAgICAgICAgICAgID0gdGhpcy4kZWxlbWVudC5maW5kKCcubW9kYWwtZGlhbG9nJylcbiAgICB0aGlzLiRiYWNrZHJvcCAgICAgICAgICAgPSBudWxsXG4gICAgdGhpcy5pc1Nob3duICAgICAgICAgICAgID0gbnVsbFxuICAgIHRoaXMub3JpZ2luYWxCb2R5UGFkICAgICA9IG51bGxcbiAgICB0aGlzLnNjcm9sbGJhcldpZHRoICAgICAgPSAwXG4gICAgdGhpcy5pZ25vcmVCYWNrZHJvcENsaWNrID0gZmFsc2VcblxuICAgIGlmICh0aGlzLm9wdGlvbnMucmVtb3RlKSB7XG4gICAgICB0aGlzLiRlbGVtZW50XG4gICAgICAgIC5maW5kKCcubW9kYWwtY29udGVudCcpXG4gICAgICAgIC5sb2FkKHRoaXMub3B0aW9ucy5yZW1vdGUsICQucHJveHkoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHRoaXMuJGVsZW1lbnQudHJpZ2dlcignbG9hZGVkLmJzLm1vZGFsJylcbiAgICAgICAgfSwgdGhpcykpXG4gICAgfVxuICB9XG5cbiAgTW9kYWwuVkVSU0lPTiAgPSAnMy4zLjcnXG5cbiAgTW9kYWwuVFJBTlNJVElPTl9EVVJBVElPTiA9IDMwMFxuICBNb2RhbC5CQUNLRFJPUF9UUkFOU0lUSU9OX0RVUkFUSU9OID0gMTUwXG5cbiAgTW9kYWwuREVGQVVMVFMgPSB7XG4gICAgYmFja2Ryb3A6IHRydWUsXG4gICAga2V5Ym9hcmQ6IHRydWUsXG4gICAgc2hvdzogdHJ1ZVxuICB9XG5cbiAgTW9kYWwucHJvdG90eXBlLnRvZ2dsZSA9IGZ1bmN0aW9uIChfcmVsYXRlZFRhcmdldCkge1xuICAgIHJldHVybiB0aGlzLmlzU2hvd24gPyB0aGlzLmhpZGUoKSA6IHRoaXMuc2hvdyhfcmVsYXRlZFRhcmdldClcbiAgfVxuXG4gIE1vZGFsLnByb3RvdHlwZS5zaG93ID0gZnVuY3Rpb24gKF9yZWxhdGVkVGFyZ2V0KSB7XG4gICAgdmFyIHRoYXQgPSB0aGlzXG4gICAgdmFyIGUgICAgPSAkLkV2ZW50KCdzaG93LmJzLm1vZGFsJywgeyByZWxhdGVkVGFyZ2V0OiBfcmVsYXRlZFRhcmdldCB9KVxuXG4gICAgdGhpcy4kZWxlbWVudC50cmlnZ2VyKGUpXG5cbiAgICBpZiAodGhpcy5pc1Nob3duIHx8IGUuaXNEZWZhdWx0UHJldmVudGVkKCkpIHJldHVyblxuXG4gICAgdGhpcy5pc1Nob3duID0gdHJ1ZVxuXG4gICAgdGhpcy5jaGVja1Njcm9sbGJhcigpXG4gICAgdGhpcy5zZXRTY3JvbGxiYXIoKVxuICAgIHRoaXMuJGJvZHkuYWRkQ2xhc3MoJ21vZGFsLW9wZW4nKVxuXG4gICAgdGhpcy5lc2NhcGUoKVxuICAgIHRoaXMucmVzaXplKClcblxuICAgIHRoaXMuJGVsZW1lbnQub24oJ2NsaWNrLmRpc21pc3MuYnMubW9kYWwnLCAnW2RhdGEtZGlzbWlzcz1cIm1vZGFsXCJdJywgJC5wcm94eSh0aGlzLmhpZGUsIHRoaXMpKVxuXG4gICAgdGhpcy4kZGlhbG9nLm9uKCdtb3VzZWRvd24uZGlzbWlzcy5icy5tb2RhbCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoYXQuJGVsZW1lbnQub25lKCdtb3VzZXVwLmRpc21pc3MuYnMubW9kYWwnLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBpZiAoJChlLnRhcmdldCkuaXModGhhdC4kZWxlbWVudCkpIHRoYXQuaWdub3JlQmFja2Ryb3BDbGljayA9IHRydWVcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIHRoaXMuYmFja2Ryb3AoZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHRyYW5zaXRpb24gPSAkLnN1cHBvcnQudHJhbnNpdGlvbiAmJiB0aGF0LiRlbGVtZW50Lmhhc0NsYXNzKCdmYWRlJylcblxuICAgICAgaWYgKCF0aGF0LiRlbGVtZW50LnBhcmVudCgpLmxlbmd0aCkge1xuICAgICAgICB0aGF0LiRlbGVtZW50LmFwcGVuZFRvKHRoYXQuJGJvZHkpIC8vIGRvbid0IG1vdmUgbW9kYWxzIGRvbSBwb3NpdGlvblxuICAgICAgfVxuXG4gICAgICB0aGF0LiRlbGVtZW50XG4gICAgICAgIC5zaG93KClcbiAgICAgICAgLnNjcm9sbFRvcCgwKVxuXG4gICAgICB0aGF0LmFkanVzdERpYWxvZygpXG5cbiAgICAgIGlmICh0cmFuc2l0aW9uKSB7XG4gICAgICAgIHRoYXQuJGVsZW1lbnRbMF0ub2Zmc2V0V2lkdGggLy8gZm9yY2UgcmVmbG93XG4gICAgICB9XG5cbiAgICAgIHRoYXQuJGVsZW1lbnQuYWRkQ2xhc3MoJ2luJylcblxuICAgICAgdGhhdC5lbmZvcmNlRm9jdXMoKVxuXG4gICAgICB2YXIgZSA9ICQuRXZlbnQoJ3Nob3duLmJzLm1vZGFsJywgeyByZWxhdGVkVGFyZ2V0OiBfcmVsYXRlZFRhcmdldCB9KVxuXG4gICAgICB0cmFuc2l0aW9uID9cbiAgICAgICAgdGhhdC4kZGlhbG9nIC8vIHdhaXQgZm9yIG1vZGFsIHRvIHNsaWRlIGluXG4gICAgICAgICAgLm9uZSgnYnNUcmFuc2l0aW9uRW5kJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhhdC4kZWxlbWVudC50cmlnZ2VyKCdmb2N1cycpLnRyaWdnZXIoZSlcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5lbXVsYXRlVHJhbnNpdGlvbkVuZChNb2RhbC5UUkFOU0lUSU9OX0RVUkFUSU9OKSA6XG4gICAgICAgIHRoYXQuJGVsZW1lbnQudHJpZ2dlcignZm9jdXMnKS50cmlnZ2VyKGUpXG4gICAgfSlcbiAgfVxuXG4gIE1vZGFsLnByb3RvdHlwZS5oaWRlID0gZnVuY3Rpb24gKGUpIHtcbiAgICBpZiAoZSkgZS5wcmV2ZW50RGVmYXVsdCgpXG5cbiAgICBlID0gJC5FdmVudCgnaGlkZS5icy5tb2RhbCcpXG5cbiAgICB0aGlzLiRlbGVtZW50LnRyaWdnZXIoZSlcblxuICAgIGlmICghdGhpcy5pc1Nob3duIHx8IGUuaXNEZWZhdWx0UHJldmVudGVkKCkpIHJldHVyblxuXG4gICAgdGhpcy5pc1Nob3duID0gZmFsc2VcblxuICAgIHRoaXMuZXNjYXBlKClcbiAgICB0aGlzLnJlc2l6ZSgpXG5cbiAgICAkKGRvY3VtZW50KS5vZmYoJ2ZvY3VzaW4uYnMubW9kYWwnKVxuXG4gICAgdGhpcy4kZWxlbWVudFxuICAgICAgLnJlbW92ZUNsYXNzKCdpbicpXG4gICAgICAub2ZmKCdjbGljay5kaXNtaXNzLmJzLm1vZGFsJylcbiAgICAgIC5vZmYoJ21vdXNldXAuZGlzbWlzcy5icy5tb2RhbCcpXG5cbiAgICB0aGlzLiRkaWFsb2cub2ZmKCdtb3VzZWRvd24uZGlzbWlzcy5icy5tb2RhbCcpXG5cbiAgICAkLnN1cHBvcnQudHJhbnNpdGlvbiAmJiB0aGlzLiRlbGVtZW50Lmhhc0NsYXNzKCdmYWRlJykgP1xuICAgICAgdGhpcy4kZWxlbWVudFxuICAgICAgICAub25lKCdic1RyYW5zaXRpb25FbmQnLCAkLnByb3h5KHRoaXMuaGlkZU1vZGFsLCB0aGlzKSlcbiAgICAgICAgLmVtdWxhdGVUcmFuc2l0aW9uRW5kKE1vZGFsLlRSQU5TSVRJT05fRFVSQVRJT04pIDpcbiAgICAgIHRoaXMuaGlkZU1vZGFsKClcbiAgfVxuXG4gIE1vZGFsLnByb3RvdHlwZS5lbmZvcmNlRm9jdXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgJChkb2N1bWVudClcbiAgICAgIC5vZmYoJ2ZvY3VzaW4uYnMubW9kYWwnKSAvLyBndWFyZCBhZ2FpbnN0IGluZmluaXRlIGZvY3VzIGxvb3BcbiAgICAgIC5vbignZm9jdXNpbi5icy5tb2RhbCcsICQucHJveHkoZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgaWYgKGRvY3VtZW50ICE9PSBlLnRhcmdldCAmJlxuICAgICAgICAgICAgdGhpcy4kZWxlbWVudFswXSAhPT0gZS50YXJnZXQgJiZcbiAgICAgICAgICAgICF0aGlzLiRlbGVtZW50LmhhcyhlLnRhcmdldCkubGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy4kZWxlbWVudC50cmlnZ2VyKCdmb2N1cycpXG4gICAgICAgIH1cbiAgICAgIH0sIHRoaXMpKVxuICB9XG5cbiAgTW9kYWwucHJvdG90eXBlLmVzY2FwZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodGhpcy5pc1Nob3duICYmIHRoaXMub3B0aW9ucy5rZXlib2FyZCkge1xuICAgICAgdGhpcy4kZWxlbWVudC5vbigna2V5ZG93bi5kaXNtaXNzLmJzLm1vZGFsJywgJC5wcm94eShmdW5jdGlvbiAoZSkge1xuICAgICAgICBlLndoaWNoID09IDI3ICYmIHRoaXMuaGlkZSgpXG4gICAgICB9LCB0aGlzKSlcbiAgICB9IGVsc2UgaWYgKCF0aGlzLmlzU2hvd24pIHtcbiAgICAgIHRoaXMuJGVsZW1lbnQub2ZmKCdrZXlkb3duLmRpc21pc3MuYnMubW9kYWwnKVxuICAgIH1cbiAgfVxuXG4gIE1vZGFsLnByb3RvdHlwZS5yZXNpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHRoaXMuaXNTaG93bikge1xuICAgICAgJCh3aW5kb3cpLm9uKCdyZXNpemUuYnMubW9kYWwnLCAkLnByb3h5KHRoaXMuaGFuZGxlVXBkYXRlLCB0aGlzKSlcbiAgICB9IGVsc2Uge1xuICAgICAgJCh3aW5kb3cpLm9mZigncmVzaXplLmJzLm1vZGFsJylcbiAgICB9XG4gIH1cblxuICBNb2RhbC5wcm90b3R5cGUuaGlkZU1vZGFsID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciB0aGF0ID0gdGhpc1xuICAgIHRoaXMuJGVsZW1lbnQuaGlkZSgpXG4gICAgdGhpcy5iYWNrZHJvcChmdW5jdGlvbiAoKSB7XG4gICAgICB0aGF0LiRib2R5LnJlbW92ZUNsYXNzKCdtb2RhbC1vcGVuJylcbiAgICAgIHRoYXQucmVzZXRBZGp1c3RtZW50cygpXG4gICAgICB0aGF0LnJlc2V0U2Nyb2xsYmFyKClcbiAgICAgIHRoYXQuJGVsZW1lbnQudHJpZ2dlcignaGlkZGVuLmJzLm1vZGFsJylcbiAgICB9KVxuICB9XG5cbiAgTW9kYWwucHJvdG90eXBlLnJlbW92ZUJhY2tkcm9wID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuJGJhY2tkcm9wICYmIHRoaXMuJGJhY2tkcm9wLnJlbW92ZSgpXG4gICAgdGhpcy4kYmFja2Ryb3AgPSBudWxsXG4gIH1cblxuICBNb2RhbC5wcm90b3R5cGUuYmFja2Ryb3AgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICB2YXIgdGhhdCA9IHRoaXNcbiAgICB2YXIgYW5pbWF0ZSA9IHRoaXMuJGVsZW1lbnQuaGFzQ2xhc3MoJ2ZhZGUnKSA/ICdmYWRlJyA6ICcnXG5cbiAgICBpZiAodGhpcy5pc1Nob3duICYmIHRoaXMub3B0aW9ucy5iYWNrZHJvcCkge1xuICAgICAgdmFyIGRvQW5pbWF0ZSA9ICQuc3VwcG9ydC50cmFuc2l0aW9uICYmIGFuaW1hdGVcblxuICAgICAgdGhpcy4kYmFja2Ryb3AgPSAkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKVxuICAgICAgICAuYWRkQ2xhc3MoJ21vZGFsLWJhY2tkcm9wICcgKyBhbmltYXRlKVxuICAgICAgICAuYXBwZW5kVG8odGhpcy4kYm9keSlcblxuICAgICAgdGhpcy4kZWxlbWVudC5vbignY2xpY2suZGlzbWlzcy5icy5tb2RhbCcsICQucHJveHkoZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgaWYgKHRoaXMuaWdub3JlQmFja2Ryb3BDbGljaykge1xuICAgICAgICAgIHRoaXMuaWdub3JlQmFja2Ryb3BDbGljayA9IGZhbHNlXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGUudGFyZ2V0ICE9PSBlLmN1cnJlbnRUYXJnZXQpIHJldHVyblxuICAgICAgICB0aGlzLm9wdGlvbnMuYmFja2Ryb3AgPT0gJ3N0YXRpYydcbiAgICAgICAgICA/IHRoaXMuJGVsZW1lbnRbMF0uZm9jdXMoKVxuICAgICAgICAgIDogdGhpcy5oaWRlKClcbiAgICAgIH0sIHRoaXMpKVxuXG4gICAgICBpZiAoZG9BbmltYXRlKSB0aGlzLiRiYWNrZHJvcFswXS5vZmZzZXRXaWR0aCAvLyBmb3JjZSByZWZsb3dcblxuICAgICAgdGhpcy4kYmFja2Ryb3AuYWRkQ2xhc3MoJ2luJylcblxuICAgICAgaWYgKCFjYWxsYmFjaykgcmV0dXJuXG5cbiAgICAgIGRvQW5pbWF0ZSA/XG4gICAgICAgIHRoaXMuJGJhY2tkcm9wXG4gICAgICAgICAgLm9uZSgnYnNUcmFuc2l0aW9uRW5kJywgY2FsbGJhY2spXG4gICAgICAgICAgLmVtdWxhdGVUcmFuc2l0aW9uRW5kKE1vZGFsLkJBQ0tEUk9QX1RSQU5TSVRJT05fRFVSQVRJT04pIDpcbiAgICAgICAgY2FsbGJhY2soKVxuXG4gICAgfSBlbHNlIGlmICghdGhpcy5pc1Nob3duICYmIHRoaXMuJGJhY2tkcm9wKSB7XG4gICAgICB0aGlzLiRiYWNrZHJvcC5yZW1vdmVDbGFzcygnaW4nKVxuXG4gICAgICB2YXIgY2FsbGJhY2tSZW1vdmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoYXQucmVtb3ZlQmFja2Ryb3AoKVxuICAgICAgICBjYWxsYmFjayAmJiBjYWxsYmFjaygpXG4gICAgICB9XG4gICAgICAkLnN1cHBvcnQudHJhbnNpdGlvbiAmJiB0aGlzLiRlbGVtZW50Lmhhc0NsYXNzKCdmYWRlJykgP1xuICAgICAgICB0aGlzLiRiYWNrZHJvcFxuICAgICAgICAgIC5vbmUoJ2JzVHJhbnNpdGlvbkVuZCcsIGNhbGxiYWNrUmVtb3ZlKVxuICAgICAgICAgIC5lbXVsYXRlVHJhbnNpdGlvbkVuZChNb2RhbC5CQUNLRFJPUF9UUkFOU0lUSU9OX0RVUkFUSU9OKSA6XG4gICAgICAgIGNhbGxiYWNrUmVtb3ZlKClcblxuICAgIH0gZWxzZSBpZiAoY2FsbGJhY2spIHtcbiAgICAgIGNhbGxiYWNrKClcbiAgICB9XG4gIH1cblxuICAvLyB0aGVzZSBmb2xsb3dpbmcgbWV0aG9kcyBhcmUgdXNlZCB0byBoYW5kbGUgb3ZlcmZsb3dpbmcgbW9kYWxzXG5cbiAgTW9kYWwucHJvdG90eXBlLmhhbmRsZVVwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmFkanVzdERpYWxvZygpXG4gIH1cblxuICBNb2RhbC5wcm90b3R5cGUuYWRqdXN0RGlhbG9nID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBtb2RhbElzT3ZlcmZsb3dpbmcgPSB0aGlzLiRlbGVtZW50WzBdLnNjcm9sbEhlaWdodCA+IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHRcblxuICAgIHRoaXMuJGVsZW1lbnQuY3NzKHtcbiAgICAgIHBhZGRpbmdMZWZ0OiAgIXRoaXMuYm9keUlzT3ZlcmZsb3dpbmcgJiYgbW9kYWxJc092ZXJmbG93aW5nID8gdGhpcy5zY3JvbGxiYXJXaWR0aCA6ICcnLFxuICAgICAgcGFkZGluZ1JpZ2h0OiB0aGlzLmJvZHlJc092ZXJmbG93aW5nICYmICFtb2RhbElzT3ZlcmZsb3dpbmcgPyB0aGlzLnNjcm9sbGJhcldpZHRoIDogJydcbiAgICB9KVxuICB9XG5cbiAgTW9kYWwucHJvdG90eXBlLnJlc2V0QWRqdXN0bWVudHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy4kZWxlbWVudC5jc3Moe1xuICAgICAgcGFkZGluZ0xlZnQ6ICcnLFxuICAgICAgcGFkZGluZ1JpZ2h0OiAnJ1xuICAgIH0pXG4gIH1cblxuICBNb2RhbC5wcm90b3R5cGUuY2hlY2tTY3JvbGxiYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGZ1bGxXaW5kb3dXaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoXG4gICAgaWYgKCFmdWxsV2luZG93V2lkdGgpIHsgLy8gd29ya2Fyb3VuZCBmb3IgbWlzc2luZyB3aW5kb3cuaW5uZXJXaWR0aCBpbiBJRThcbiAgICAgIHZhciBkb2N1bWVudEVsZW1lbnRSZWN0ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgICBmdWxsV2luZG93V2lkdGggPSBkb2N1bWVudEVsZW1lbnRSZWN0LnJpZ2h0IC0gTWF0aC5hYnMoZG9jdW1lbnRFbGVtZW50UmVjdC5sZWZ0KVxuICAgIH1cbiAgICB0aGlzLmJvZHlJc092ZXJmbG93aW5nID0gZG9jdW1lbnQuYm9keS5jbGllbnRXaWR0aCA8IGZ1bGxXaW5kb3dXaWR0aFxuICAgIHRoaXMuc2Nyb2xsYmFyV2lkdGggPSB0aGlzLm1lYXN1cmVTY3JvbGxiYXIoKVxuICB9XG5cbiAgTW9kYWwucHJvdG90eXBlLnNldFNjcm9sbGJhciA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgYm9keVBhZCA9IHBhcnNlSW50KCh0aGlzLiRib2R5LmNzcygncGFkZGluZy1yaWdodCcpIHx8IDApLCAxMClcbiAgICB0aGlzLm9yaWdpbmFsQm9keVBhZCA9IGRvY3VtZW50LmJvZHkuc3R5bGUucGFkZGluZ1JpZ2h0IHx8ICcnXG4gICAgaWYgKHRoaXMuYm9keUlzT3ZlcmZsb3dpbmcpIHRoaXMuJGJvZHkuY3NzKCdwYWRkaW5nLXJpZ2h0JywgYm9keVBhZCArIHRoaXMuc2Nyb2xsYmFyV2lkdGgpXG4gIH1cblxuICBNb2RhbC5wcm90b3R5cGUucmVzZXRTY3JvbGxiYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy4kYm9keS5jc3MoJ3BhZGRpbmctcmlnaHQnLCB0aGlzLm9yaWdpbmFsQm9keVBhZClcbiAgfVxuXG4gIE1vZGFsLnByb3RvdHlwZS5tZWFzdXJlU2Nyb2xsYmFyID0gZnVuY3Rpb24gKCkgeyAvLyB0aHggd2Fsc2hcbiAgICB2YXIgc2Nyb2xsRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgICBzY3JvbGxEaXYuY2xhc3NOYW1lID0gJ21vZGFsLXNjcm9sbGJhci1tZWFzdXJlJ1xuICAgIHRoaXMuJGJvZHkuYXBwZW5kKHNjcm9sbERpdilcbiAgICB2YXIgc2Nyb2xsYmFyV2lkdGggPSBzY3JvbGxEaXYub2Zmc2V0V2lkdGggLSBzY3JvbGxEaXYuY2xpZW50V2lkdGhcbiAgICB0aGlzLiRib2R5WzBdLnJlbW92ZUNoaWxkKHNjcm9sbERpdilcbiAgICByZXR1cm4gc2Nyb2xsYmFyV2lkdGhcbiAgfVxuXG5cbiAgLy8gTU9EQUwgUExVR0lOIERFRklOSVRJT05cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT1cblxuICBmdW5jdGlvbiBQbHVnaW4ob3B0aW9uLCBfcmVsYXRlZFRhcmdldCkge1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgdmFyICR0aGlzICAgPSAkKHRoaXMpXG4gICAgICB2YXIgZGF0YSAgICA9ICR0aGlzLmRhdGEoJ2JzLm1vZGFsJylcbiAgICAgIHZhciBvcHRpb25zID0gJC5leHRlbmQoe30sIE1vZGFsLkRFRkFVTFRTLCAkdGhpcy5kYXRhKCksIHR5cGVvZiBvcHRpb24gPT0gJ29iamVjdCcgJiYgb3B0aW9uKVxuXG4gICAgICBpZiAoIWRhdGEpICR0aGlzLmRhdGEoJ2JzLm1vZGFsJywgKGRhdGEgPSBuZXcgTW9kYWwodGhpcywgb3B0aW9ucykpKVxuICAgICAgaWYgKHR5cGVvZiBvcHRpb24gPT0gJ3N0cmluZycpIGRhdGFbb3B0aW9uXShfcmVsYXRlZFRhcmdldClcbiAgICAgIGVsc2UgaWYgKG9wdGlvbnMuc2hvdykgZGF0YS5zaG93KF9yZWxhdGVkVGFyZ2V0KVxuICAgIH0pXG4gIH1cblxuICB2YXIgb2xkID0gJC5mbi5tb2RhbFxuXG4gICQuZm4ubW9kYWwgICAgICAgICAgICAgPSBQbHVnaW5cbiAgJC5mbi5tb2RhbC5Db25zdHJ1Y3RvciA9IE1vZGFsXG5cblxuICAvLyBNT0RBTCBOTyBDT05GTElDVFxuICAvLyA9PT09PT09PT09PT09PT09PVxuXG4gICQuZm4ubW9kYWwubm9Db25mbGljdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAkLmZuLm1vZGFsID0gb2xkXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG5cbiAgLy8gTU9EQUwgREFUQS1BUElcbiAgLy8gPT09PT09PT09PT09PT1cblxuICAkKGRvY3VtZW50KS5vbignY2xpY2suYnMubW9kYWwuZGF0YS1hcGknLCAnW2RhdGEtdG9nZ2xlPVwibW9kYWxcIl0nLCBmdW5jdGlvbiAoZSkge1xuICAgIHZhciAkdGhpcyAgID0gJCh0aGlzKVxuICAgIHZhciBocmVmICAgID0gJHRoaXMuYXR0cignaHJlZicpXG4gICAgdmFyICR0YXJnZXQgPSAkKCR0aGlzLmF0dHIoJ2RhdGEtdGFyZ2V0JykgfHwgKGhyZWYgJiYgaHJlZi5yZXBsYWNlKC8uKig/PSNbXlxcc10rJCkvLCAnJykpKSAvLyBzdHJpcCBmb3IgaWU3XG4gICAgdmFyIG9wdGlvbiAgPSAkdGFyZ2V0LmRhdGEoJ2JzLm1vZGFsJykgPyAndG9nZ2xlJyA6ICQuZXh0ZW5kKHsgcmVtb3RlOiAhLyMvLnRlc3QoaHJlZikgJiYgaHJlZiB9LCAkdGFyZ2V0LmRhdGEoKSwgJHRoaXMuZGF0YSgpKVxuXG4gICAgaWYgKCR0aGlzLmlzKCdhJykpIGUucHJldmVudERlZmF1bHQoKVxuXG4gICAgJHRhcmdldC5vbmUoJ3Nob3cuYnMubW9kYWwnLCBmdW5jdGlvbiAoc2hvd0V2ZW50KSB7XG4gICAgICBpZiAoc2hvd0V2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpKSByZXR1cm4gLy8gb25seSByZWdpc3RlciBmb2N1cyByZXN0b3JlciBpZiBtb2RhbCB3aWxsIGFjdHVhbGx5IGdldCBzaG93blxuICAgICAgJHRhcmdldC5vbmUoJ2hpZGRlbi5icy5tb2RhbCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgJHRoaXMuaXMoJzp2aXNpYmxlJykgJiYgJHRoaXMudHJpZ2dlcignZm9jdXMnKVxuICAgICAgfSlcbiAgICB9KVxuICAgIFBsdWdpbi5jYWxsKCR0YXJnZXQsIG9wdGlvbiwgdGhpcylcbiAgfSlcblxufShqUXVlcnkpO1xuIiwiLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBCb290c3RyYXA6IHBvcG92ZXIuanMgdjMuMy43XG4gKiBodHRwOi8vZ2V0Ym9vdHN0cmFwLmNvbS9qYXZhc2NyaXB0LyNwb3BvdmVyc1xuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDb3B5cmlnaHQgMjAxMS0yMDE2IFR3aXR0ZXIsIEluYy5cbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFzdGVyL0xJQ0VOU0UpXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuXG4rZnVuY3Rpb24gKCQpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIC8vIFBPUE9WRVIgUFVCTElDIENMQVNTIERFRklOSVRJT05cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHZhciBQb3BvdmVyID0gZnVuY3Rpb24gKGVsZW1lbnQsIG9wdGlvbnMpIHtcbiAgICB0aGlzLmluaXQoJ3BvcG92ZXInLCBlbGVtZW50LCBvcHRpb25zKVxuICB9XG5cbiAgaWYgKCEkLmZuLnRvb2x0aXApIHRocm93IG5ldyBFcnJvcignUG9wb3ZlciByZXF1aXJlcyB0b29sdGlwLmpzJylcblxuICBQb3BvdmVyLlZFUlNJT04gID0gJzMuMy43J1xuXG4gIFBvcG92ZXIuREVGQVVMVFMgPSAkLmV4dGVuZCh7fSwgJC5mbi50b29sdGlwLkNvbnN0cnVjdG9yLkRFRkFVTFRTLCB7XG4gICAgcGxhY2VtZW50OiAncmlnaHQnLFxuICAgIHRyaWdnZXI6ICdjbGljaycsXG4gICAgY29udGVudDogJycsXG4gICAgdGVtcGxhdGU6ICc8ZGl2IGNsYXNzPVwicG9wb3ZlclwiIHJvbGU9XCJ0b29sdGlwXCI+PGRpdiBjbGFzcz1cImFycm93XCI+PC9kaXY+PGgzIGNsYXNzPVwicG9wb3Zlci10aXRsZVwiPjwvaDM+PGRpdiBjbGFzcz1cInBvcG92ZXItY29udGVudFwiPjwvZGl2PjwvZGl2PidcbiAgfSlcblxuXG4gIC8vIE5PVEU6IFBPUE9WRVIgRVhURU5EUyB0b29sdGlwLmpzXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgUG9wb3Zlci5wcm90b3R5cGUgPSAkLmV4dGVuZCh7fSwgJC5mbi50b29sdGlwLkNvbnN0cnVjdG9yLnByb3RvdHlwZSlcblxuICBQb3BvdmVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFBvcG92ZXJcblxuICBQb3BvdmVyLnByb3RvdHlwZS5nZXREZWZhdWx0cyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gUG9wb3Zlci5ERUZBVUxUU1xuICB9XG5cbiAgUG9wb3Zlci5wcm90b3R5cGUuc2V0Q29udGVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgJHRpcCAgICA9IHRoaXMudGlwKClcbiAgICB2YXIgdGl0bGUgICA9IHRoaXMuZ2V0VGl0bGUoKVxuICAgIHZhciBjb250ZW50ID0gdGhpcy5nZXRDb250ZW50KClcblxuICAgICR0aXAuZmluZCgnLnBvcG92ZXItdGl0bGUnKVt0aGlzLm9wdGlvbnMuaHRtbCA/ICdodG1sJyA6ICd0ZXh0J10odGl0bGUpXG4gICAgJHRpcC5maW5kKCcucG9wb3Zlci1jb250ZW50JykuY2hpbGRyZW4oKS5kZXRhY2goKS5lbmQoKVsgLy8gd2UgdXNlIGFwcGVuZCBmb3IgaHRtbCBvYmplY3RzIHRvIG1haW50YWluIGpzIGV2ZW50c1xuICAgICAgdGhpcy5vcHRpb25zLmh0bWwgPyAodHlwZW9mIGNvbnRlbnQgPT0gJ3N0cmluZycgPyAnaHRtbCcgOiAnYXBwZW5kJykgOiAndGV4dCdcbiAgICBdKGNvbnRlbnQpXG5cbiAgICAkdGlwLnJlbW92ZUNsYXNzKCdmYWRlIHRvcCBib3R0b20gbGVmdCByaWdodCBpbicpXG5cbiAgICAvLyBJRTggZG9lc24ndCBhY2NlcHQgaGlkaW5nIHZpYSB0aGUgYDplbXB0eWAgcHNldWRvIHNlbGVjdG9yLCB3ZSBoYXZlIHRvIGRvXG4gICAgLy8gdGhpcyBtYW51YWxseSBieSBjaGVja2luZyB0aGUgY29udGVudHMuXG4gICAgaWYgKCEkdGlwLmZpbmQoJy5wb3BvdmVyLXRpdGxlJykuaHRtbCgpKSAkdGlwLmZpbmQoJy5wb3BvdmVyLXRpdGxlJykuaGlkZSgpXG4gIH1cblxuICBQb3BvdmVyLnByb3RvdHlwZS5oYXNDb250ZW50ID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLmdldFRpdGxlKCkgfHwgdGhpcy5nZXRDb250ZW50KClcbiAgfVxuXG4gIFBvcG92ZXIucHJvdG90eXBlLmdldENvbnRlbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyICRlID0gdGhpcy4kZWxlbWVudFxuICAgIHZhciBvICA9IHRoaXMub3B0aW9uc1xuXG4gICAgcmV0dXJuICRlLmF0dHIoJ2RhdGEtY29udGVudCcpXG4gICAgICB8fCAodHlwZW9mIG8uY29udGVudCA9PSAnZnVuY3Rpb24nID9cbiAgICAgICAgICAgIG8uY29udGVudC5jYWxsKCRlWzBdKSA6XG4gICAgICAgICAgICBvLmNvbnRlbnQpXG4gIH1cblxuICBQb3BvdmVyLnByb3RvdHlwZS5hcnJvdyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gKHRoaXMuJGFycm93ID0gdGhpcy4kYXJyb3cgfHwgdGhpcy50aXAoKS5maW5kKCcuYXJyb3cnKSlcbiAgfVxuXG5cbiAgLy8gUE9QT1ZFUiBQTFVHSU4gREVGSU5JVElPTlxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgZnVuY3Rpb24gUGx1Z2luKG9wdGlvbikge1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgdmFyICR0aGlzICAgPSAkKHRoaXMpXG4gICAgICB2YXIgZGF0YSAgICA9ICR0aGlzLmRhdGEoJ2JzLnBvcG92ZXInKVxuICAgICAgdmFyIG9wdGlvbnMgPSB0eXBlb2Ygb3B0aW9uID09ICdvYmplY3QnICYmIG9wdGlvblxuXG4gICAgICBpZiAoIWRhdGEgJiYgL2Rlc3Ryb3l8aGlkZS8udGVzdChvcHRpb24pKSByZXR1cm5cbiAgICAgIGlmICghZGF0YSkgJHRoaXMuZGF0YSgnYnMucG9wb3ZlcicsIChkYXRhID0gbmV3IFBvcG92ZXIodGhpcywgb3B0aW9ucykpKVxuICAgICAgaWYgKHR5cGVvZiBvcHRpb24gPT0gJ3N0cmluZycpIGRhdGFbb3B0aW9uXSgpXG4gICAgfSlcbiAgfVxuXG4gIHZhciBvbGQgPSAkLmZuLnBvcG92ZXJcblxuICAkLmZuLnBvcG92ZXIgICAgICAgICAgICAgPSBQbHVnaW5cbiAgJC5mbi5wb3BvdmVyLkNvbnN0cnVjdG9yID0gUG9wb3ZlclxuXG5cbiAgLy8gUE9QT1ZFUiBOTyBDT05GTElDVFxuICAvLyA9PT09PT09PT09PT09PT09PT09XG5cbiAgJC5mbi5wb3BvdmVyLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgJC5mbi5wb3BvdmVyID0gb2xkXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG59KGpRdWVyeSk7XG4iLCIvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEJvb3RzdHJhcDogc2Nyb2xsc3B5LmpzIHYzLjMuN1xuICogaHR0cDovL2dldGJvb3RzdHJhcC5jb20vamF2YXNjcmlwdC8jc2Nyb2xsc3B5XG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvcHlyaWdodCAyMDExLTIwMTYgVHdpdHRlciwgSW5jLlxuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYXN0ZXIvTElDRU5TRSlcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5cbitmdW5jdGlvbiAoJCkge1xuICAndXNlIHN0cmljdCc7XG5cbiAgLy8gU0NST0xMU1BZIENMQVNTIERFRklOSVRJT05cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBmdW5jdGlvbiBTY3JvbGxTcHkoZWxlbWVudCwgb3B0aW9ucykge1xuICAgIHRoaXMuJGJvZHkgICAgICAgICAgPSAkKGRvY3VtZW50LmJvZHkpXG4gICAgdGhpcy4kc2Nyb2xsRWxlbWVudCA9ICQoZWxlbWVudCkuaXMoZG9jdW1lbnQuYm9keSkgPyAkKHdpbmRvdykgOiAkKGVsZW1lbnQpXG4gICAgdGhpcy5vcHRpb25zICAgICAgICA9ICQuZXh0ZW5kKHt9LCBTY3JvbGxTcHkuREVGQVVMVFMsIG9wdGlvbnMpXG4gICAgdGhpcy5zZWxlY3RvciAgICAgICA9ICh0aGlzLm9wdGlvbnMudGFyZ2V0IHx8ICcnKSArICcgLm5hdiBsaSA+IGEnXG4gICAgdGhpcy5vZmZzZXRzICAgICAgICA9IFtdXG4gICAgdGhpcy50YXJnZXRzICAgICAgICA9IFtdXG4gICAgdGhpcy5hY3RpdmVUYXJnZXQgICA9IG51bGxcbiAgICB0aGlzLnNjcm9sbEhlaWdodCAgID0gMFxuXG4gICAgdGhpcy4kc2Nyb2xsRWxlbWVudC5vbignc2Nyb2xsLmJzLnNjcm9sbHNweScsICQucHJveHkodGhpcy5wcm9jZXNzLCB0aGlzKSlcbiAgICB0aGlzLnJlZnJlc2goKVxuICAgIHRoaXMucHJvY2VzcygpXG4gIH1cblxuICBTY3JvbGxTcHkuVkVSU0lPTiAgPSAnMy4zLjcnXG5cbiAgU2Nyb2xsU3B5LkRFRkFVTFRTID0ge1xuICAgIG9mZnNldDogMTBcbiAgfVxuXG4gIFNjcm9sbFNweS5wcm90b3R5cGUuZ2V0U2Nyb2xsSGVpZ2h0ID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLiRzY3JvbGxFbGVtZW50WzBdLnNjcm9sbEhlaWdodCB8fCBNYXRoLm1heCh0aGlzLiRib2R5WzBdLnNjcm9sbEhlaWdodCwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbEhlaWdodClcbiAgfVxuXG4gIFNjcm9sbFNweS5wcm90b3R5cGUucmVmcmVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdGhhdCAgICAgICAgICA9IHRoaXNcbiAgICB2YXIgb2Zmc2V0TWV0aG9kICA9ICdvZmZzZXQnXG4gICAgdmFyIG9mZnNldEJhc2UgICAgPSAwXG5cbiAgICB0aGlzLm9mZnNldHMgICAgICA9IFtdXG4gICAgdGhpcy50YXJnZXRzICAgICAgPSBbXVxuICAgIHRoaXMuc2Nyb2xsSGVpZ2h0ID0gdGhpcy5nZXRTY3JvbGxIZWlnaHQoKVxuXG4gICAgaWYgKCEkLmlzV2luZG93KHRoaXMuJHNjcm9sbEVsZW1lbnRbMF0pKSB7XG4gICAgICBvZmZzZXRNZXRob2QgPSAncG9zaXRpb24nXG4gICAgICBvZmZzZXRCYXNlICAgPSB0aGlzLiRzY3JvbGxFbGVtZW50LnNjcm9sbFRvcCgpXG4gICAgfVxuXG4gICAgdGhpcy4kYm9keVxuICAgICAgLmZpbmQodGhpcy5zZWxlY3RvcilcbiAgICAgIC5tYXAoZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgJGVsICAgPSAkKHRoaXMpXG4gICAgICAgIHZhciBocmVmICA9ICRlbC5kYXRhKCd0YXJnZXQnKSB8fCAkZWwuYXR0cignaHJlZicpXG4gICAgICAgIHZhciAkaHJlZiA9IC9eIy4vLnRlc3QoaHJlZikgJiYgJChocmVmKVxuXG4gICAgICAgIHJldHVybiAoJGhyZWZcbiAgICAgICAgICAmJiAkaHJlZi5sZW5ndGhcbiAgICAgICAgICAmJiAkaHJlZi5pcygnOnZpc2libGUnKVxuICAgICAgICAgICYmIFtbJGhyZWZbb2Zmc2V0TWV0aG9kXSgpLnRvcCArIG9mZnNldEJhc2UsIGhyZWZdXSkgfHwgbnVsbFxuICAgICAgfSlcbiAgICAgIC5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhWzBdIC0gYlswXSB9KVxuICAgICAgLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGF0Lm9mZnNldHMucHVzaCh0aGlzWzBdKVxuICAgICAgICB0aGF0LnRhcmdldHMucHVzaCh0aGlzWzFdKVxuICAgICAgfSlcbiAgfVxuXG4gIFNjcm9sbFNweS5wcm90b3R5cGUucHJvY2VzcyA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2Nyb2xsVG9wICAgID0gdGhpcy4kc2Nyb2xsRWxlbWVudC5zY3JvbGxUb3AoKSArIHRoaXMub3B0aW9ucy5vZmZzZXRcbiAgICB2YXIgc2Nyb2xsSGVpZ2h0ID0gdGhpcy5nZXRTY3JvbGxIZWlnaHQoKVxuICAgIHZhciBtYXhTY3JvbGwgICAgPSB0aGlzLm9wdGlvbnMub2Zmc2V0ICsgc2Nyb2xsSGVpZ2h0IC0gdGhpcy4kc2Nyb2xsRWxlbWVudC5oZWlnaHQoKVxuICAgIHZhciBvZmZzZXRzICAgICAgPSB0aGlzLm9mZnNldHNcbiAgICB2YXIgdGFyZ2V0cyAgICAgID0gdGhpcy50YXJnZXRzXG4gICAgdmFyIGFjdGl2ZVRhcmdldCA9IHRoaXMuYWN0aXZlVGFyZ2V0XG4gICAgdmFyIGlcblxuICAgIGlmICh0aGlzLnNjcm9sbEhlaWdodCAhPSBzY3JvbGxIZWlnaHQpIHtcbiAgICAgIHRoaXMucmVmcmVzaCgpXG4gICAgfVxuXG4gICAgaWYgKHNjcm9sbFRvcCA+PSBtYXhTY3JvbGwpIHtcbiAgICAgIHJldHVybiBhY3RpdmVUYXJnZXQgIT0gKGkgPSB0YXJnZXRzW3RhcmdldHMubGVuZ3RoIC0gMV0pICYmIHRoaXMuYWN0aXZhdGUoaSlcbiAgICB9XG5cbiAgICBpZiAoYWN0aXZlVGFyZ2V0ICYmIHNjcm9sbFRvcCA8IG9mZnNldHNbMF0pIHtcbiAgICAgIHRoaXMuYWN0aXZlVGFyZ2V0ID0gbnVsbFxuICAgICAgcmV0dXJuIHRoaXMuY2xlYXIoKVxuICAgIH1cblxuICAgIGZvciAoaSA9IG9mZnNldHMubGVuZ3RoOyBpLS07KSB7XG4gICAgICBhY3RpdmVUYXJnZXQgIT0gdGFyZ2V0c1tpXVxuICAgICAgICAmJiBzY3JvbGxUb3AgPj0gb2Zmc2V0c1tpXVxuICAgICAgICAmJiAob2Zmc2V0c1tpICsgMV0gPT09IHVuZGVmaW5lZCB8fCBzY3JvbGxUb3AgPCBvZmZzZXRzW2kgKyAxXSlcbiAgICAgICAgJiYgdGhpcy5hY3RpdmF0ZSh0YXJnZXRzW2ldKVxuICAgIH1cbiAgfVxuXG4gIFNjcm9sbFNweS5wcm90b3R5cGUuYWN0aXZhdGUgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgdGhpcy5hY3RpdmVUYXJnZXQgPSB0YXJnZXRcblxuICAgIHRoaXMuY2xlYXIoKVxuXG4gICAgdmFyIHNlbGVjdG9yID0gdGhpcy5zZWxlY3RvciArXG4gICAgICAnW2RhdGEtdGFyZ2V0PVwiJyArIHRhcmdldCArICdcIl0sJyArXG4gICAgICB0aGlzLnNlbGVjdG9yICsgJ1tocmVmPVwiJyArIHRhcmdldCArICdcIl0nXG5cbiAgICB2YXIgYWN0aXZlID0gJChzZWxlY3RvcilcbiAgICAgIC5wYXJlbnRzKCdsaScpXG4gICAgICAuYWRkQ2xhc3MoJ2FjdGl2ZScpXG5cbiAgICBpZiAoYWN0aXZlLnBhcmVudCgnLmRyb3Bkb3duLW1lbnUnKS5sZW5ndGgpIHtcbiAgICAgIGFjdGl2ZSA9IGFjdGl2ZVxuICAgICAgICAuY2xvc2VzdCgnbGkuZHJvcGRvd24nKVxuICAgICAgICAuYWRkQ2xhc3MoJ2FjdGl2ZScpXG4gICAgfVxuXG4gICAgYWN0aXZlLnRyaWdnZXIoJ2FjdGl2YXRlLmJzLnNjcm9sbHNweScpXG4gIH1cblxuICBTY3JvbGxTcHkucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKCkge1xuICAgICQodGhpcy5zZWxlY3RvcilcbiAgICAgIC5wYXJlbnRzVW50aWwodGhpcy5vcHRpb25zLnRhcmdldCwgJy5hY3RpdmUnKVxuICAgICAgLnJlbW92ZUNsYXNzKCdhY3RpdmUnKVxuICB9XG5cblxuICAvLyBTQ1JPTExTUFkgUExVR0lOIERFRklOSVRJT05cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgZnVuY3Rpb24gUGx1Z2luKG9wdGlvbikge1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgdmFyICR0aGlzICAgPSAkKHRoaXMpXG4gICAgICB2YXIgZGF0YSAgICA9ICR0aGlzLmRhdGEoJ2JzLnNjcm9sbHNweScpXG4gICAgICB2YXIgb3B0aW9ucyA9IHR5cGVvZiBvcHRpb24gPT0gJ29iamVjdCcgJiYgb3B0aW9uXG5cbiAgICAgIGlmICghZGF0YSkgJHRoaXMuZGF0YSgnYnMuc2Nyb2xsc3B5JywgKGRhdGEgPSBuZXcgU2Nyb2xsU3B5KHRoaXMsIG9wdGlvbnMpKSlcbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9uID09ICdzdHJpbmcnKSBkYXRhW29wdGlvbl0oKVxuICAgIH0pXG4gIH1cblxuICB2YXIgb2xkID0gJC5mbi5zY3JvbGxzcHlcblxuICAkLmZuLnNjcm9sbHNweSAgICAgICAgICAgICA9IFBsdWdpblxuICAkLmZuLnNjcm9sbHNweS5Db25zdHJ1Y3RvciA9IFNjcm9sbFNweVxuXG5cbiAgLy8gU0NST0xMU1BZIE5PIENPTkZMSUNUXG4gIC8vID09PT09PT09PT09PT09PT09PT09PVxuXG4gICQuZm4uc2Nyb2xsc3B5Lm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgJC5mbi5zY3JvbGxzcHkgPSBvbGRcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cblxuICAvLyBTQ1JPTExTUFkgREFUQS1BUElcbiAgLy8gPT09PT09PT09PT09PT09PT09XG5cbiAgJCh3aW5kb3cpLm9uKCdsb2FkLmJzLnNjcm9sbHNweS5kYXRhLWFwaScsIGZ1bmN0aW9uICgpIHtcbiAgICAkKCdbZGF0YS1zcHk9XCJzY3JvbGxcIl0nKS5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciAkc3B5ID0gJCh0aGlzKVxuICAgICAgUGx1Z2luLmNhbGwoJHNweSwgJHNweS5kYXRhKCkpXG4gICAgfSlcbiAgfSlcblxufShqUXVlcnkpO1xuIiwiLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBCb290c3RyYXA6IHRhYi5qcyB2My4zLjdcbiAqIGh0dHA6Ly9nZXRib290c3RyYXAuY29tL2phdmFzY3JpcHQvI3RhYnNcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29weXJpZ2h0IDIwMTEtMjAxNiBUd2l0dGVyLCBJbmMuXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21hc3Rlci9MSUNFTlNFKVxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cblxuK2Z1bmN0aW9uICgkKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICAvLyBUQUIgQ0xBU1MgREVGSU5JVElPTlxuICAvLyA9PT09PT09PT09PT09PT09PT09PVxuXG4gIHZhciBUYWIgPSBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgIC8vIGpzY3M6ZGlzYWJsZSByZXF1aXJlRG9sbGFyQmVmb3JlalF1ZXJ5QXNzaWdubWVudFxuICAgIHRoaXMuZWxlbWVudCA9ICQoZWxlbWVudClcbiAgICAvLyBqc2NzOmVuYWJsZSByZXF1aXJlRG9sbGFyQmVmb3JlalF1ZXJ5QXNzaWdubWVudFxuICB9XG5cbiAgVGFiLlZFUlNJT04gPSAnMy4zLjcnXG5cbiAgVGFiLlRSQU5TSVRJT05fRFVSQVRJT04gPSAxNTBcblxuICBUYWIucHJvdG90eXBlLnNob3cgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyICR0aGlzICAgID0gdGhpcy5lbGVtZW50XG4gICAgdmFyICR1bCAgICAgID0gJHRoaXMuY2xvc2VzdCgndWw6bm90KC5kcm9wZG93bi1tZW51KScpXG4gICAgdmFyIHNlbGVjdG9yID0gJHRoaXMuZGF0YSgndGFyZ2V0JylcblxuICAgIGlmICghc2VsZWN0b3IpIHtcbiAgICAgIHNlbGVjdG9yID0gJHRoaXMuYXR0cignaHJlZicpXG4gICAgICBzZWxlY3RvciA9IHNlbGVjdG9yICYmIHNlbGVjdG9yLnJlcGxhY2UoLy4qKD89I1teXFxzXSokKS8sICcnKSAvLyBzdHJpcCBmb3IgaWU3XG4gICAgfVxuXG4gICAgaWYgKCR0aGlzLnBhcmVudCgnbGknKS5oYXNDbGFzcygnYWN0aXZlJykpIHJldHVyblxuXG4gICAgdmFyICRwcmV2aW91cyA9ICR1bC5maW5kKCcuYWN0aXZlOmxhc3QgYScpXG4gICAgdmFyIGhpZGVFdmVudCA9ICQuRXZlbnQoJ2hpZGUuYnMudGFiJywge1xuICAgICAgcmVsYXRlZFRhcmdldDogJHRoaXNbMF1cbiAgICB9KVxuICAgIHZhciBzaG93RXZlbnQgPSAkLkV2ZW50KCdzaG93LmJzLnRhYicsIHtcbiAgICAgIHJlbGF0ZWRUYXJnZXQ6ICRwcmV2aW91c1swXVxuICAgIH0pXG5cbiAgICAkcHJldmlvdXMudHJpZ2dlcihoaWRlRXZlbnQpXG4gICAgJHRoaXMudHJpZ2dlcihzaG93RXZlbnQpXG5cbiAgICBpZiAoc2hvd0V2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpIHx8IGhpZGVFdmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgcmV0dXJuXG5cbiAgICB2YXIgJHRhcmdldCA9ICQoc2VsZWN0b3IpXG5cbiAgICB0aGlzLmFjdGl2YXRlKCR0aGlzLmNsb3Nlc3QoJ2xpJyksICR1bClcbiAgICB0aGlzLmFjdGl2YXRlKCR0YXJnZXQsICR0YXJnZXQucGFyZW50KCksIGZ1bmN0aW9uICgpIHtcbiAgICAgICRwcmV2aW91cy50cmlnZ2VyKHtcbiAgICAgICAgdHlwZTogJ2hpZGRlbi5icy50YWInLFxuICAgICAgICByZWxhdGVkVGFyZ2V0OiAkdGhpc1swXVxuICAgICAgfSlcbiAgICAgICR0aGlzLnRyaWdnZXIoe1xuICAgICAgICB0eXBlOiAnc2hvd24uYnMudGFiJyxcbiAgICAgICAgcmVsYXRlZFRhcmdldDogJHByZXZpb3VzWzBdXG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICBUYWIucHJvdG90eXBlLmFjdGl2YXRlID0gZnVuY3Rpb24gKGVsZW1lbnQsIGNvbnRhaW5lciwgY2FsbGJhY2spIHtcbiAgICB2YXIgJGFjdGl2ZSAgICA9IGNvbnRhaW5lci5maW5kKCc+IC5hY3RpdmUnKVxuICAgIHZhciB0cmFuc2l0aW9uID0gY2FsbGJhY2tcbiAgICAgICYmICQuc3VwcG9ydC50cmFuc2l0aW9uXG4gICAgICAmJiAoJGFjdGl2ZS5sZW5ndGggJiYgJGFjdGl2ZS5oYXNDbGFzcygnZmFkZScpIHx8ICEhY29udGFpbmVyLmZpbmQoJz4gLmZhZGUnKS5sZW5ndGgpXG5cbiAgICBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgJGFjdGl2ZVxuICAgICAgICAucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpXG4gICAgICAgIC5maW5kKCc+IC5kcm9wZG93bi1tZW51ID4gLmFjdGl2ZScpXG4gICAgICAgICAgLnJlbW92ZUNsYXNzKCdhY3RpdmUnKVxuICAgICAgICAuZW5kKClcbiAgICAgICAgLmZpbmQoJ1tkYXRhLXRvZ2dsZT1cInRhYlwiXScpXG4gICAgICAgICAgLmF0dHIoJ2FyaWEtZXhwYW5kZWQnLCBmYWxzZSlcblxuICAgICAgZWxlbWVudFxuICAgICAgICAuYWRkQ2xhc3MoJ2FjdGl2ZScpXG4gICAgICAgIC5maW5kKCdbZGF0YS10b2dnbGU9XCJ0YWJcIl0nKVxuICAgICAgICAgIC5hdHRyKCdhcmlhLWV4cGFuZGVkJywgdHJ1ZSlcblxuICAgICAgaWYgKHRyYW5zaXRpb24pIHtcbiAgICAgICAgZWxlbWVudFswXS5vZmZzZXRXaWR0aCAvLyByZWZsb3cgZm9yIHRyYW5zaXRpb25cbiAgICAgICAgZWxlbWVudC5hZGRDbGFzcygnaW4nKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWxlbWVudC5yZW1vdmVDbGFzcygnZmFkZScpXG4gICAgICB9XG5cbiAgICAgIGlmIChlbGVtZW50LnBhcmVudCgnLmRyb3Bkb3duLW1lbnUnKS5sZW5ndGgpIHtcbiAgICAgICAgZWxlbWVudFxuICAgICAgICAgIC5jbG9zZXN0KCdsaS5kcm9wZG93bicpXG4gICAgICAgICAgICAuYWRkQ2xhc3MoJ2FjdGl2ZScpXG4gICAgICAgICAgLmVuZCgpXG4gICAgICAgICAgLmZpbmQoJ1tkYXRhLXRvZ2dsZT1cInRhYlwiXScpXG4gICAgICAgICAgICAuYXR0cignYXJpYS1leHBhbmRlZCcsIHRydWUpXG4gICAgICB9XG5cbiAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKClcbiAgICB9XG5cbiAgICAkYWN0aXZlLmxlbmd0aCAmJiB0cmFuc2l0aW9uID9cbiAgICAgICRhY3RpdmVcbiAgICAgICAgLm9uZSgnYnNUcmFuc2l0aW9uRW5kJywgbmV4dClcbiAgICAgICAgLmVtdWxhdGVUcmFuc2l0aW9uRW5kKFRhYi5UUkFOU0lUSU9OX0RVUkFUSU9OKSA6XG4gICAgICBuZXh0KClcblxuICAgICRhY3RpdmUucmVtb3ZlQ2xhc3MoJ2luJylcbiAgfVxuXG5cbiAgLy8gVEFCIFBMVUdJTiBERUZJTklUSU9OXG4gIC8vID09PT09PT09PT09PT09PT09PT09PVxuXG4gIGZ1bmN0aW9uIFBsdWdpbihvcHRpb24pIHtcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciAkdGhpcyA9ICQodGhpcylcbiAgICAgIHZhciBkYXRhICA9ICR0aGlzLmRhdGEoJ2JzLnRhYicpXG5cbiAgICAgIGlmICghZGF0YSkgJHRoaXMuZGF0YSgnYnMudGFiJywgKGRhdGEgPSBuZXcgVGFiKHRoaXMpKSlcbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9uID09ICdzdHJpbmcnKSBkYXRhW29wdGlvbl0oKVxuICAgIH0pXG4gIH1cblxuICB2YXIgb2xkID0gJC5mbi50YWJcblxuICAkLmZuLnRhYiAgICAgICAgICAgICA9IFBsdWdpblxuICAkLmZuLnRhYi5Db25zdHJ1Y3RvciA9IFRhYlxuXG5cbiAgLy8gVEFCIE5PIENPTkZMSUNUXG4gIC8vID09PT09PT09PT09PT09PVxuXG4gICQuZm4udGFiLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgJC5mbi50YWIgPSBvbGRcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cblxuICAvLyBUQUIgREFUQS1BUElcbiAgLy8gPT09PT09PT09PT09XG5cbiAgdmFyIGNsaWNrSGFuZGxlciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgUGx1Z2luLmNhbGwoJCh0aGlzKSwgJ3Nob3cnKVxuICB9XG5cbiAgJChkb2N1bWVudClcbiAgICAub24oJ2NsaWNrLmJzLnRhYi5kYXRhLWFwaScsICdbZGF0YS10b2dnbGU9XCJ0YWJcIl0nLCBjbGlja0hhbmRsZXIpXG4gICAgLm9uKCdjbGljay5icy50YWIuZGF0YS1hcGknLCAnW2RhdGEtdG9nZ2xlPVwicGlsbFwiXScsIGNsaWNrSGFuZGxlcilcblxufShqUXVlcnkpO1xuIiwiLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBCb290c3RyYXA6IHRvb2x0aXAuanMgdjMuMy43XG4gKiBodHRwOi8vZ2V0Ym9vdHN0cmFwLmNvbS9qYXZhc2NyaXB0LyN0b29sdGlwXG4gKiBJbnNwaXJlZCBieSB0aGUgb3JpZ2luYWwgalF1ZXJ5LnRpcHN5IGJ5IEphc29uIEZyYW1lXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvcHlyaWdodCAyMDExLTIwMTYgVHdpdHRlciwgSW5jLlxuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYXN0ZXIvTElDRU5TRSlcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5cbitmdW5jdGlvbiAoJCkge1xuICAndXNlIHN0cmljdCc7XG5cbiAgLy8gVE9PTFRJUCBQVUJMSUMgQ0xBU1MgREVGSU5JVElPTlxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgdmFyIFRvb2x0aXAgPSBmdW5jdGlvbiAoZWxlbWVudCwgb3B0aW9ucykge1xuICAgIHRoaXMudHlwZSAgICAgICA9IG51bGxcbiAgICB0aGlzLm9wdGlvbnMgICAgPSBudWxsXG4gICAgdGhpcy5lbmFibGVkICAgID0gbnVsbFxuICAgIHRoaXMudGltZW91dCAgICA9IG51bGxcbiAgICB0aGlzLmhvdmVyU3RhdGUgPSBudWxsXG4gICAgdGhpcy4kZWxlbWVudCAgID0gbnVsbFxuICAgIHRoaXMuaW5TdGF0ZSAgICA9IG51bGxcblxuICAgIHRoaXMuaW5pdCgndG9vbHRpcCcsIGVsZW1lbnQsIG9wdGlvbnMpXG4gIH1cblxuICBUb29sdGlwLlZFUlNJT04gID0gJzMuMy43J1xuXG4gIFRvb2x0aXAuVFJBTlNJVElPTl9EVVJBVElPTiA9IDE1MFxuXG4gIFRvb2x0aXAuREVGQVVMVFMgPSB7XG4gICAgYW5pbWF0aW9uOiB0cnVlLFxuICAgIHBsYWNlbWVudDogJ3RvcCcsXG4gICAgc2VsZWN0b3I6IGZhbHNlLFxuICAgIHRlbXBsYXRlOiAnPGRpdiBjbGFzcz1cInRvb2x0aXBcIiByb2xlPVwidG9vbHRpcFwiPjxkaXYgY2xhc3M9XCJ0b29sdGlwLWFycm93XCI+PC9kaXY+PGRpdiBjbGFzcz1cInRvb2x0aXAtaW5uZXJcIj48L2Rpdj48L2Rpdj4nLFxuICAgIHRyaWdnZXI6ICdob3ZlciBmb2N1cycsXG4gICAgdGl0bGU6ICcnLFxuICAgIGRlbGF5OiAwLFxuICAgIGh0bWw6IGZhbHNlLFxuICAgIGNvbnRhaW5lcjogZmFsc2UsXG4gICAgdmlld3BvcnQ6IHtcbiAgICAgIHNlbGVjdG9yOiAnYm9keScsXG4gICAgICBwYWRkaW5nOiAwXG4gICAgfVxuICB9XG5cbiAgVG9vbHRpcC5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uICh0eXBlLCBlbGVtZW50LCBvcHRpb25zKSB7XG4gICAgdGhpcy5lbmFibGVkICAgPSB0cnVlXG4gICAgdGhpcy50eXBlICAgICAgPSB0eXBlXG4gICAgdGhpcy4kZWxlbWVudCAgPSAkKGVsZW1lbnQpXG4gICAgdGhpcy5vcHRpb25zICAgPSB0aGlzLmdldE9wdGlvbnMob3B0aW9ucylcbiAgICB0aGlzLiR2aWV3cG9ydCA9IHRoaXMub3B0aW9ucy52aWV3cG9ydCAmJiAkKCQuaXNGdW5jdGlvbih0aGlzLm9wdGlvbnMudmlld3BvcnQpID8gdGhpcy5vcHRpb25zLnZpZXdwb3J0LmNhbGwodGhpcywgdGhpcy4kZWxlbWVudCkgOiAodGhpcy5vcHRpb25zLnZpZXdwb3J0LnNlbGVjdG9yIHx8IHRoaXMub3B0aW9ucy52aWV3cG9ydCkpXG4gICAgdGhpcy5pblN0YXRlICAgPSB7IGNsaWNrOiBmYWxzZSwgaG92ZXI6IGZhbHNlLCBmb2N1czogZmFsc2UgfVxuXG4gICAgaWYgKHRoaXMuJGVsZW1lbnRbMF0gaW5zdGFuY2VvZiBkb2N1bWVudC5jb25zdHJ1Y3RvciAmJiAhdGhpcy5vcHRpb25zLnNlbGVjdG9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2BzZWxlY3RvcmAgb3B0aW9uIG11c3QgYmUgc3BlY2lmaWVkIHdoZW4gaW5pdGlhbGl6aW5nICcgKyB0aGlzLnR5cGUgKyAnIG9uIHRoZSB3aW5kb3cuZG9jdW1lbnQgb2JqZWN0IScpXG4gICAgfVxuXG4gICAgdmFyIHRyaWdnZXJzID0gdGhpcy5vcHRpb25zLnRyaWdnZXIuc3BsaXQoJyAnKVxuXG4gICAgZm9yICh2YXIgaSA9IHRyaWdnZXJzLmxlbmd0aDsgaS0tOykge1xuICAgICAgdmFyIHRyaWdnZXIgPSB0cmlnZ2Vyc1tpXVxuXG4gICAgICBpZiAodHJpZ2dlciA9PSAnY2xpY2snKSB7XG4gICAgICAgIHRoaXMuJGVsZW1lbnQub24oJ2NsaWNrLicgKyB0aGlzLnR5cGUsIHRoaXMub3B0aW9ucy5zZWxlY3RvciwgJC5wcm94eSh0aGlzLnRvZ2dsZSwgdGhpcykpXG4gICAgICB9IGVsc2UgaWYgKHRyaWdnZXIgIT0gJ21hbnVhbCcpIHtcbiAgICAgICAgdmFyIGV2ZW50SW4gID0gdHJpZ2dlciA9PSAnaG92ZXInID8gJ21vdXNlZW50ZXInIDogJ2ZvY3VzaW4nXG4gICAgICAgIHZhciBldmVudE91dCA9IHRyaWdnZXIgPT0gJ2hvdmVyJyA/ICdtb3VzZWxlYXZlJyA6ICdmb2N1c291dCdcblxuICAgICAgICB0aGlzLiRlbGVtZW50Lm9uKGV2ZW50SW4gICsgJy4nICsgdGhpcy50eXBlLCB0aGlzLm9wdGlvbnMuc2VsZWN0b3IsICQucHJveHkodGhpcy5lbnRlciwgdGhpcykpXG4gICAgICAgIHRoaXMuJGVsZW1lbnQub24oZXZlbnRPdXQgKyAnLicgKyB0aGlzLnR5cGUsIHRoaXMub3B0aW9ucy5zZWxlY3RvciwgJC5wcm94eSh0aGlzLmxlYXZlLCB0aGlzKSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLm9wdGlvbnMuc2VsZWN0b3IgP1xuICAgICAgKHRoaXMuX29wdGlvbnMgPSAkLmV4dGVuZCh7fSwgdGhpcy5vcHRpb25zLCB7IHRyaWdnZXI6ICdtYW51YWwnLCBzZWxlY3RvcjogJycgfSkpIDpcbiAgICAgIHRoaXMuZml4VGl0bGUoKVxuICB9XG5cbiAgVG9vbHRpcC5wcm90b3R5cGUuZ2V0RGVmYXVsdHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIFRvb2x0aXAuREVGQVVMVFNcbiAgfVxuXG4gIFRvb2x0aXAucHJvdG90eXBlLmdldE9wdGlvbnMgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSAkLmV4dGVuZCh7fSwgdGhpcy5nZXREZWZhdWx0cygpLCB0aGlzLiRlbGVtZW50LmRhdGEoKSwgb3B0aW9ucylcblxuICAgIGlmIChvcHRpb25zLmRlbGF5ICYmIHR5cGVvZiBvcHRpb25zLmRlbGF5ID09ICdudW1iZXInKSB7XG4gICAgICBvcHRpb25zLmRlbGF5ID0ge1xuICAgICAgICBzaG93OiBvcHRpb25zLmRlbGF5LFxuICAgICAgICBoaWRlOiBvcHRpb25zLmRlbGF5XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG9wdGlvbnNcbiAgfVxuXG4gIFRvb2x0aXAucHJvdG90eXBlLmdldERlbGVnYXRlT3B0aW9ucyA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgb3B0aW9ucyAgPSB7fVxuICAgIHZhciBkZWZhdWx0cyA9IHRoaXMuZ2V0RGVmYXVsdHMoKVxuXG4gICAgdGhpcy5fb3B0aW9ucyAmJiAkLmVhY2godGhpcy5fb3B0aW9ucywgZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICAgIGlmIChkZWZhdWx0c1trZXldICE9IHZhbHVlKSBvcHRpb25zW2tleV0gPSB2YWx1ZVxuICAgIH0pXG5cbiAgICByZXR1cm4gb3B0aW9uc1xuICB9XG5cbiAgVG9vbHRpcC5wcm90b3R5cGUuZW50ZXIgPSBmdW5jdGlvbiAob2JqKSB7XG4gICAgdmFyIHNlbGYgPSBvYmogaW5zdGFuY2VvZiB0aGlzLmNvbnN0cnVjdG9yID9cbiAgICAgIG9iaiA6ICQob2JqLmN1cnJlbnRUYXJnZXQpLmRhdGEoJ2JzLicgKyB0aGlzLnR5cGUpXG5cbiAgICBpZiAoIXNlbGYpIHtcbiAgICAgIHNlbGYgPSBuZXcgdGhpcy5jb25zdHJ1Y3RvcihvYmouY3VycmVudFRhcmdldCwgdGhpcy5nZXREZWxlZ2F0ZU9wdGlvbnMoKSlcbiAgICAgICQob2JqLmN1cnJlbnRUYXJnZXQpLmRhdGEoJ2JzLicgKyB0aGlzLnR5cGUsIHNlbGYpXG4gICAgfVxuXG4gICAgaWYgKG9iaiBpbnN0YW5jZW9mICQuRXZlbnQpIHtcbiAgICAgIHNlbGYuaW5TdGF0ZVtvYmoudHlwZSA9PSAnZm9jdXNpbicgPyAnZm9jdXMnIDogJ2hvdmVyJ10gPSB0cnVlXG4gICAgfVxuXG4gICAgaWYgKHNlbGYudGlwKCkuaGFzQ2xhc3MoJ2luJykgfHwgc2VsZi5ob3ZlclN0YXRlID09ICdpbicpIHtcbiAgICAgIHNlbGYuaG92ZXJTdGF0ZSA9ICdpbidcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNsZWFyVGltZW91dChzZWxmLnRpbWVvdXQpXG5cbiAgICBzZWxmLmhvdmVyU3RhdGUgPSAnaW4nXG5cbiAgICBpZiAoIXNlbGYub3B0aW9ucy5kZWxheSB8fCAhc2VsZi5vcHRpb25zLmRlbGF5LnNob3cpIHJldHVybiBzZWxmLnNob3coKVxuXG4gICAgc2VsZi50aW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoc2VsZi5ob3ZlclN0YXRlID09ICdpbicpIHNlbGYuc2hvdygpXG4gICAgfSwgc2VsZi5vcHRpb25zLmRlbGF5LnNob3cpXG4gIH1cblxuICBUb29sdGlwLnByb3RvdHlwZS5pc0luU3RhdGVUcnVlID0gZnVuY3Rpb24gKCkge1xuICAgIGZvciAodmFyIGtleSBpbiB0aGlzLmluU3RhdGUpIHtcbiAgICAgIGlmICh0aGlzLmluU3RhdGVba2V5XSkgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIFRvb2x0aXAucHJvdG90eXBlLmxlYXZlID0gZnVuY3Rpb24gKG9iaikge1xuICAgIHZhciBzZWxmID0gb2JqIGluc3RhbmNlb2YgdGhpcy5jb25zdHJ1Y3RvciA/XG4gICAgICBvYmogOiAkKG9iai5jdXJyZW50VGFyZ2V0KS5kYXRhKCdicy4nICsgdGhpcy50eXBlKVxuXG4gICAgaWYgKCFzZWxmKSB7XG4gICAgICBzZWxmID0gbmV3IHRoaXMuY29uc3RydWN0b3Iob2JqLmN1cnJlbnRUYXJnZXQsIHRoaXMuZ2V0RGVsZWdhdGVPcHRpb25zKCkpXG4gICAgICAkKG9iai5jdXJyZW50VGFyZ2V0KS5kYXRhKCdicy4nICsgdGhpcy50eXBlLCBzZWxmKVxuICAgIH1cblxuICAgIGlmIChvYmogaW5zdGFuY2VvZiAkLkV2ZW50KSB7XG4gICAgICBzZWxmLmluU3RhdGVbb2JqLnR5cGUgPT0gJ2ZvY3Vzb3V0JyA/ICdmb2N1cycgOiAnaG92ZXInXSA9IGZhbHNlXG4gICAgfVxuXG4gICAgaWYgKHNlbGYuaXNJblN0YXRlVHJ1ZSgpKSByZXR1cm5cblxuICAgIGNsZWFyVGltZW91dChzZWxmLnRpbWVvdXQpXG5cbiAgICBzZWxmLmhvdmVyU3RhdGUgPSAnb3V0J1xuXG4gICAgaWYgKCFzZWxmLm9wdGlvbnMuZGVsYXkgfHwgIXNlbGYub3B0aW9ucy5kZWxheS5oaWRlKSByZXR1cm4gc2VsZi5oaWRlKClcblxuICAgIHNlbGYudGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKHNlbGYuaG92ZXJTdGF0ZSA9PSAnb3V0Jykgc2VsZi5oaWRlKClcbiAgICB9LCBzZWxmLm9wdGlvbnMuZGVsYXkuaGlkZSlcbiAgfVxuXG4gIFRvb2x0aXAucHJvdG90eXBlLnNob3cgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGUgPSAkLkV2ZW50KCdzaG93LmJzLicgKyB0aGlzLnR5cGUpXG5cbiAgICBpZiAodGhpcy5oYXNDb250ZW50KCkgJiYgdGhpcy5lbmFibGVkKSB7XG4gICAgICB0aGlzLiRlbGVtZW50LnRyaWdnZXIoZSlcblxuICAgICAgdmFyIGluRG9tID0gJC5jb250YWlucyh0aGlzLiRlbGVtZW50WzBdLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCB0aGlzLiRlbGVtZW50WzBdKVxuICAgICAgaWYgKGUuaXNEZWZhdWx0UHJldmVudGVkKCkgfHwgIWluRG9tKSByZXR1cm5cbiAgICAgIHZhciB0aGF0ID0gdGhpc1xuXG4gICAgICB2YXIgJHRpcCA9IHRoaXMudGlwKClcblxuICAgICAgdmFyIHRpcElkID0gdGhpcy5nZXRVSUQodGhpcy50eXBlKVxuXG4gICAgICB0aGlzLnNldENvbnRlbnQoKVxuICAgICAgJHRpcC5hdHRyKCdpZCcsIHRpcElkKVxuICAgICAgdGhpcy4kZWxlbWVudC5hdHRyKCdhcmlhLWRlc2NyaWJlZGJ5JywgdGlwSWQpXG5cbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuYW5pbWF0aW9uKSAkdGlwLmFkZENsYXNzKCdmYWRlJylcblxuICAgICAgdmFyIHBsYWNlbWVudCA9IHR5cGVvZiB0aGlzLm9wdGlvbnMucGxhY2VtZW50ID09ICdmdW5jdGlvbicgP1xuICAgICAgICB0aGlzLm9wdGlvbnMucGxhY2VtZW50LmNhbGwodGhpcywgJHRpcFswXSwgdGhpcy4kZWxlbWVudFswXSkgOlxuICAgICAgICB0aGlzLm9wdGlvbnMucGxhY2VtZW50XG5cbiAgICAgIHZhciBhdXRvVG9rZW4gPSAvXFxzP2F1dG8/XFxzPy9pXG4gICAgICB2YXIgYXV0b1BsYWNlID0gYXV0b1Rva2VuLnRlc3QocGxhY2VtZW50KVxuICAgICAgaWYgKGF1dG9QbGFjZSkgcGxhY2VtZW50ID0gcGxhY2VtZW50LnJlcGxhY2UoYXV0b1Rva2VuLCAnJykgfHwgJ3RvcCdcblxuICAgICAgJHRpcFxuICAgICAgICAuZGV0YWNoKClcbiAgICAgICAgLmNzcyh7IHRvcDogMCwgbGVmdDogMCwgZGlzcGxheTogJ2Jsb2NrJyB9KVxuICAgICAgICAuYWRkQ2xhc3MocGxhY2VtZW50KVxuICAgICAgICAuZGF0YSgnYnMuJyArIHRoaXMudHlwZSwgdGhpcylcblxuICAgICAgdGhpcy5vcHRpb25zLmNvbnRhaW5lciA/ICR0aXAuYXBwZW5kVG8odGhpcy5vcHRpb25zLmNvbnRhaW5lcikgOiAkdGlwLmluc2VydEFmdGVyKHRoaXMuJGVsZW1lbnQpXG4gICAgICB0aGlzLiRlbGVtZW50LnRyaWdnZXIoJ2luc2VydGVkLmJzLicgKyB0aGlzLnR5cGUpXG5cbiAgICAgIHZhciBwb3MgICAgICAgICAgPSB0aGlzLmdldFBvc2l0aW9uKClcbiAgICAgIHZhciBhY3R1YWxXaWR0aCAgPSAkdGlwWzBdLm9mZnNldFdpZHRoXG4gICAgICB2YXIgYWN0dWFsSGVpZ2h0ID0gJHRpcFswXS5vZmZzZXRIZWlnaHRcblxuICAgICAgaWYgKGF1dG9QbGFjZSkge1xuICAgICAgICB2YXIgb3JnUGxhY2VtZW50ID0gcGxhY2VtZW50XG4gICAgICAgIHZhciB2aWV3cG9ydERpbSA9IHRoaXMuZ2V0UG9zaXRpb24odGhpcy4kdmlld3BvcnQpXG5cbiAgICAgICAgcGxhY2VtZW50ID0gcGxhY2VtZW50ID09ICdib3R0b20nICYmIHBvcy5ib3R0b20gKyBhY3R1YWxIZWlnaHQgPiB2aWV3cG9ydERpbS5ib3R0b20gPyAndG9wJyAgICA6XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlbWVudCA9PSAndG9wJyAgICAmJiBwb3MudG9wICAgIC0gYWN0dWFsSGVpZ2h0IDwgdmlld3BvcnREaW0udG9wICAgID8gJ2JvdHRvbScgOlxuICAgICAgICAgICAgICAgICAgICBwbGFjZW1lbnQgPT0gJ3JpZ2h0JyAgJiYgcG9zLnJpZ2h0ICArIGFjdHVhbFdpZHRoICA+IHZpZXdwb3J0RGltLndpZHRoICA/ICdsZWZ0JyAgIDpcbiAgICAgICAgICAgICAgICAgICAgcGxhY2VtZW50ID09ICdsZWZ0JyAgICYmIHBvcy5sZWZ0ICAgLSBhY3R1YWxXaWR0aCAgPCB2aWV3cG9ydERpbS5sZWZ0ICAgPyAncmlnaHQnICA6XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlbWVudFxuXG4gICAgICAgICR0aXBcbiAgICAgICAgICAucmVtb3ZlQ2xhc3Mob3JnUGxhY2VtZW50KVxuICAgICAgICAgIC5hZGRDbGFzcyhwbGFjZW1lbnQpXG4gICAgICB9XG5cbiAgICAgIHZhciBjYWxjdWxhdGVkT2Zmc2V0ID0gdGhpcy5nZXRDYWxjdWxhdGVkT2Zmc2V0KHBsYWNlbWVudCwgcG9zLCBhY3R1YWxXaWR0aCwgYWN0dWFsSGVpZ2h0KVxuXG4gICAgICB0aGlzLmFwcGx5UGxhY2VtZW50KGNhbGN1bGF0ZWRPZmZzZXQsIHBsYWNlbWVudClcblxuICAgICAgdmFyIGNvbXBsZXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcHJldkhvdmVyU3RhdGUgPSB0aGF0LmhvdmVyU3RhdGVcbiAgICAgICAgdGhhdC4kZWxlbWVudC50cmlnZ2VyKCdzaG93bi5icy4nICsgdGhhdC50eXBlKVxuICAgICAgICB0aGF0LmhvdmVyU3RhdGUgPSBudWxsXG5cbiAgICAgICAgaWYgKHByZXZIb3ZlclN0YXRlID09ICdvdXQnKSB0aGF0LmxlYXZlKHRoYXQpXG4gICAgICB9XG5cbiAgICAgICQuc3VwcG9ydC50cmFuc2l0aW9uICYmIHRoaXMuJHRpcC5oYXNDbGFzcygnZmFkZScpID9cbiAgICAgICAgJHRpcFxuICAgICAgICAgIC5vbmUoJ2JzVHJhbnNpdGlvbkVuZCcsIGNvbXBsZXRlKVxuICAgICAgICAgIC5lbXVsYXRlVHJhbnNpdGlvbkVuZChUb29sdGlwLlRSQU5TSVRJT05fRFVSQVRJT04pIDpcbiAgICAgICAgY29tcGxldGUoKVxuICAgIH1cbiAgfVxuXG4gIFRvb2x0aXAucHJvdG90eXBlLmFwcGx5UGxhY2VtZW50ID0gZnVuY3Rpb24gKG9mZnNldCwgcGxhY2VtZW50KSB7XG4gICAgdmFyICR0aXAgICA9IHRoaXMudGlwKClcbiAgICB2YXIgd2lkdGggID0gJHRpcFswXS5vZmZzZXRXaWR0aFxuICAgIHZhciBoZWlnaHQgPSAkdGlwWzBdLm9mZnNldEhlaWdodFxuXG4gICAgLy8gbWFudWFsbHkgcmVhZCBtYXJnaW5zIGJlY2F1c2UgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IGluY2x1ZGVzIGRpZmZlcmVuY2VcbiAgICB2YXIgbWFyZ2luVG9wID0gcGFyc2VJbnQoJHRpcC5jc3MoJ21hcmdpbi10b3AnKSwgMTApXG4gICAgdmFyIG1hcmdpbkxlZnQgPSBwYXJzZUludCgkdGlwLmNzcygnbWFyZ2luLWxlZnQnKSwgMTApXG5cbiAgICAvLyB3ZSBtdXN0IGNoZWNrIGZvciBOYU4gZm9yIGllIDgvOVxuICAgIGlmIChpc05hTihtYXJnaW5Ub3ApKSAgbWFyZ2luVG9wICA9IDBcbiAgICBpZiAoaXNOYU4obWFyZ2luTGVmdCkpIG1hcmdpbkxlZnQgPSAwXG5cbiAgICBvZmZzZXQudG9wICArPSBtYXJnaW5Ub3BcbiAgICBvZmZzZXQubGVmdCArPSBtYXJnaW5MZWZ0XG5cbiAgICAvLyAkLmZuLm9mZnNldCBkb2Vzbid0IHJvdW5kIHBpeGVsIHZhbHVlc1xuICAgIC8vIHNvIHdlIHVzZSBzZXRPZmZzZXQgZGlyZWN0bHkgd2l0aCBvdXIgb3duIGZ1bmN0aW9uIEItMFxuICAgICQub2Zmc2V0LnNldE9mZnNldCgkdGlwWzBdLCAkLmV4dGVuZCh7XG4gICAgICB1c2luZzogZnVuY3Rpb24gKHByb3BzKSB7XG4gICAgICAgICR0aXAuY3NzKHtcbiAgICAgICAgICB0b3A6IE1hdGgucm91bmQocHJvcHMudG9wKSxcbiAgICAgICAgICBsZWZ0OiBNYXRoLnJvdW5kKHByb3BzLmxlZnQpXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSwgb2Zmc2V0KSwgMClcblxuICAgICR0aXAuYWRkQ2xhc3MoJ2luJylcblxuICAgIC8vIGNoZWNrIHRvIHNlZSBpZiBwbGFjaW5nIHRpcCBpbiBuZXcgb2Zmc2V0IGNhdXNlZCB0aGUgdGlwIHRvIHJlc2l6ZSBpdHNlbGZcbiAgICB2YXIgYWN0dWFsV2lkdGggID0gJHRpcFswXS5vZmZzZXRXaWR0aFxuICAgIHZhciBhY3R1YWxIZWlnaHQgPSAkdGlwWzBdLm9mZnNldEhlaWdodFxuXG4gICAgaWYgKHBsYWNlbWVudCA9PSAndG9wJyAmJiBhY3R1YWxIZWlnaHQgIT0gaGVpZ2h0KSB7XG4gICAgICBvZmZzZXQudG9wID0gb2Zmc2V0LnRvcCArIGhlaWdodCAtIGFjdHVhbEhlaWdodFxuICAgIH1cblxuICAgIHZhciBkZWx0YSA9IHRoaXMuZ2V0Vmlld3BvcnRBZGp1c3RlZERlbHRhKHBsYWNlbWVudCwgb2Zmc2V0LCBhY3R1YWxXaWR0aCwgYWN0dWFsSGVpZ2h0KVxuXG4gICAgaWYgKGRlbHRhLmxlZnQpIG9mZnNldC5sZWZ0ICs9IGRlbHRhLmxlZnRcbiAgICBlbHNlIG9mZnNldC50b3AgKz0gZGVsdGEudG9wXG5cbiAgICB2YXIgaXNWZXJ0aWNhbCAgICAgICAgICA9IC90b3B8Ym90dG9tLy50ZXN0KHBsYWNlbWVudClcbiAgICB2YXIgYXJyb3dEZWx0YSAgICAgICAgICA9IGlzVmVydGljYWwgPyBkZWx0YS5sZWZ0ICogMiAtIHdpZHRoICsgYWN0dWFsV2lkdGggOiBkZWx0YS50b3AgKiAyIC0gaGVpZ2h0ICsgYWN0dWFsSGVpZ2h0XG4gICAgdmFyIGFycm93T2Zmc2V0UG9zaXRpb24gPSBpc1ZlcnRpY2FsID8gJ29mZnNldFdpZHRoJyA6ICdvZmZzZXRIZWlnaHQnXG5cbiAgICAkdGlwLm9mZnNldChvZmZzZXQpXG4gICAgdGhpcy5yZXBsYWNlQXJyb3coYXJyb3dEZWx0YSwgJHRpcFswXVthcnJvd09mZnNldFBvc2l0aW9uXSwgaXNWZXJ0aWNhbClcbiAgfVxuXG4gIFRvb2x0aXAucHJvdG90eXBlLnJlcGxhY2VBcnJvdyA9IGZ1bmN0aW9uIChkZWx0YSwgZGltZW5zaW9uLCBpc1ZlcnRpY2FsKSB7XG4gICAgdGhpcy5hcnJvdygpXG4gICAgICAuY3NzKGlzVmVydGljYWwgPyAnbGVmdCcgOiAndG9wJywgNTAgKiAoMSAtIGRlbHRhIC8gZGltZW5zaW9uKSArICclJylcbiAgICAgIC5jc3MoaXNWZXJ0aWNhbCA/ICd0b3AnIDogJ2xlZnQnLCAnJylcbiAgfVxuXG4gIFRvb2x0aXAucHJvdG90eXBlLnNldENvbnRlbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyICR0aXAgID0gdGhpcy50aXAoKVxuICAgIHZhciB0aXRsZSA9IHRoaXMuZ2V0VGl0bGUoKVxuXG4gICAgJHRpcC5maW5kKCcudG9vbHRpcC1pbm5lcicpW3RoaXMub3B0aW9ucy5odG1sID8gJ2h0bWwnIDogJ3RleHQnXSh0aXRsZSlcbiAgICAkdGlwLnJlbW92ZUNsYXNzKCdmYWRlIGluIHRvcCBib3R0b20gbGVmdCByaWdodCcpXG4gIH1cblxuICBUb29sdGlwLnByb3RvdHlwZS5oaWRlID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgdmFyIHRoYXQgPSB0aGlzXG4gICAgdmFyICR0aXAgPSAkKHRoaXMuJHRpcClcbiAgICB2YXIgZSAgICA9ICQuRXZlbnQoJ2hpZGUuYnMuJyArIHRoaXMudHlwZSlcblxuICAgIGZ1bmN0aW9uIGNvbXBsZXRlKCkge1xuICAgICAgaWYgKHRoYXQuaG92ZXJTdGF0ZSAhPSAnaW4nKSAkdGlwLmRldGFjaCgpXG4gICAgICBpZiAodGhhdC4kZWxlbWVudCkgeyAvLyBUT0RPOiBDaGVjayB3aGV0aGVyIGd1YXJkaW5nIHRoaXMgY29kZSB3aXRoIHRoaXMgYGlmYCBpcyByZWFsbHkgbmVjZXNzYXJ5LlxuICAgICAgICB0aGF0LiRlbGVtZW50XG4gICAgICAgICAgLnJlbW92ZUF0dHIoJ2FyaWEtZGVzY3JpYmVkYnknKVxuICAgICAgICAgIC50cmlnZ2VyKCdoaWRkZW4uYnMuJyArIHRoYXQudHlwZSlcbiAgICAgIH1cbiAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKClcbiAgICB9XG5cbiAgICB0aGlzLiRlbGVtZW50LnRyaWdnZXIoZSlcblxuICAgIGlmIChlLmlzRGVmYXVsdFByZXZlbnRlZCgpKSByZXR1cm5cblxuICAgICR0aXAucmVtb3ZlQ2xhc3MoJ2luJylcblxuICAgICQuc3VwcG9ydC50cmFuc2l0aW9uICYmICR0aXAuaGFzQ2xhc3MoJ2ZhZGUnKSA/XG4gICAgICAkdGlwXG4gICAgICAgIC5vbmUoJ2JzVHJhbnNpdGlvbkVuZCcsIGNvbXBsZXRlKVxuICAgICAgICAuZW11bGF0ZVRyYW5zaXRpb25FbmQoVG9vbHRpcC5UUkFOU0lUSU9OX0RVUkFUSU9OKSA6XG4gICAgICBjb21wbGV0ZSgpXG5cbiAgICB0aGlzLmhvdmVyU3RhdGUgPSBudWxsXG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgVG9vbHRpcC5wcm90b3R5cGUuZml4VGl0bGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyICRlID0gdGhpcy4kZWxlbWVudFxuICAgIGlmICgkZS5hdHRyKCd0aXRsZScpIHx8IHR5cGVvZiAkZS5hdHRyKCdkYXRhLW9yaWdpbmFsLXRpdGxlJykgIT0gJ3N0cmluZycpIHtcbiAgICAgICRlLmF0dHIoJ2RhdGEtb3JpZ2luYWwtdGl0bGUnLCAkZS5hdHRyKCd0aXRsZScpIHx8ICcnKS5hdHRyKCd0aXRsZScsICcnKVxuICAgIH1cbiAgfVxuXG4gIFRvb2x0aXAucHJvdG90eXBlLmhhc0NvbnRlbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0VGl0bGUoKVxuICB9XG5cbiAgVG9vbHRpcC5wcm90b3R5cGUuZ2V0UG9zaXRpb24gPSBmdW5jdGlvbiAoJGVsZW1lbnQpIHtcbiAgICAkZWxlbWVudCAgID0gJGVsZW1lbnQgfHwgdGhpcy4kZWxlbWVudFxuXG4gICAgdmFyIGVsICAgICA9ICRlbGVtZW50WzBdXG4gICAgdmFyIGlzQm9keSA9IGVsLnRhZ05hbWUgPT0gJ0JPRFknXG5cbiAgICB2YXIgZWxSZWN0ICAgID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICBpZiAoZWxSZWN0LndpZHRoID09IG51bGwpIHtcbiAgICAgIC8vIHdpZHRoIGFuZCBoZWlnaHQgYXJlIG1pc3NpbmcgaW4gSUU4LCBzbyBjb21wdXRlIHRoZW0gbWFudWFsbHk7IHNlZSBodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvaXNzdWVzLzE0MDkzXG4gICAgICBlbFJlY3QgPSAkLmV4dGVuZCh7fSwgZWxSZWN0LCB7IHdpZHRoOiBlbFJlY3QucmlnaHQgLSBlbFJlY3QubGVmdCwgaGVpZ2h0OiBlbFJlY3QuYm90dG9tIC0gZWxSZWN0LnRvcCB9KVxuICAgIH1cbiAgICB2YXIgaXNTdmcgPSB3aW5kb3cuU1ZHRWxlbWVudCAmJiBlbCBpbnN0YW5jZW9mIHdpbmRvdy5TVkdFbGVtZW50XG4gICAgLy8gQXZvaWQgdXNpbmcgJC5vZmZzZXQoKSBvbiBTVkdzIHNpbmNlIGl0IGdpdmVzIGluY29ycmVjdCByZXN1bHRzIGluIGpRdWVyeSAzLlxuICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvaXNzdWVzLzIwMjgwXG4gICAgdmFyIGVsT2Zmc2V0ICA9IGlzQm9keSA/IHsgdG9wOiAwLCBsZWZ0OiAwIH0gOiAoaXNTdmcgPyBudWxsIDogJGVsZW1lbnQub2Zmc2V0KCkpXG4gICAgdmFyIHNjcm9sbCAgICA9IHsgc2Nyb2xsOiBpc0JvZHkgPyBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wIHx8IGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wIDogJGVsZW1lbnQuc2Nyb2xsVG9wKCkgfVxuICAgIHZhciBvdXRlckRpbXMgPSBpc0JvZHkgPyB7IHdpZHRoOiAkKHdpbmRvdykud2lkdGgoKSwgaGVpZ2h0OiAkKHdpbmRvdykuaGVpZ2h0KCkgfSA6IG51bGxcblxuICAgIHJldHVybiAkLmV4dGVuZCh7fSwgZWxSZWN0LCBzY3JvbGwsIG91dGVyRGltcywgZWxPZmZzZXQpXG4gIH1cblxuICBUb29sdGlwLnByb3RvdHlwZS5nZXRDYWxjdWxhdGVkT2Zmc2V0ID0gZnVuY3Rpb24gKHBsYWNlbWVudCwgcG9zLCBhY3R1YWxXaWR0aCwgYWN0dWFsSGVpZ2h0KSB7XG4gICAgcmV0dXJuIHBsYWNlbWVudCA9PSAnYm90dG9tJyA/IHsgdG9wOiBwb3MudG9wICsgcG9zLmhlaWdodCwgICBsZWZ0OiBwb3MubGVmdCArIHBvcy53aWR0aCAvIDIgLSBhY3R1YWxXaWR0aCAvIDIgfSA6XG4gICAgICAgICAgIHBsYWNlbWVudCA9PSAndG9wJyAgICA/IHsgdG9wOiBwb3MudG9wIC0gYWN0dWFsSGVpZ2h0LCBsZWZ0OiBwb3MubGVmdCArIHBvcy53aWR0aCAvIDIgLSBhY3R1YWxXaWR0aCAvIDIgfSA6XG4gICAgICAgICAgIHBsYWNlbWVudCA9PSAnbGVmdCcgICA/IHsgdG9wOiBwb3MudG9wICsgcG9zLmhlaWdodCAvIDIgLSBhY3R1YWxIZWlnaHQgLyAyLCBsZWZ0OiBwb3MubGVmdCAtIGFjdHVhbFdpZHRoIH0gOlxuICAgICAgICAvKiBwbGFjZW1lbnQgPT0gJ3JpZ2h0JyAqLyB7IHRvcDogcG9zLnRvcCArIHBvcy5oZWlnaHQgLyAyIC0gYWN0dWFsSGVpZ2h0IC8gMiwgbGVmdDogcG9zLmxlZnQgKyBwb3Mud2lkdGggfVxuXG4gIH1cblxuICBUb29sdGlwLnByb3RvdHlwZS5nZXRWaWV3cG9ydEFkanVzdGVkRGVsdGEgPSBmdW5jdGlvbiAocGxhY2VtZW50LCBwb3MsIGFjdHVhbFdpZHRoLCBhY3R1YWxIZWlnaHQpIHtcbiAgICB2YXIgZGVsdGEgPSB7IHRvcDogMCwgbGVmdDogMCB9XG4gICAgaWYgKCF0aGlzLiR2aWV3cG9ydCkgcmV0dXJuIGRlbHRhXG5cbiAgICB2YXIgdmlld3BvcnRQYWRkaW5nID0gdGhpcy5vcHRpb25zLnZpZXdwb3J0ICYmIHRoaXMub3B0aW9ucy52aWV3cG9ydC5wYWRkaW5nIHx8IDBcbiAgICB2YXIgdmlld3BvcnREaW1lbnNpb25zID0gdGhpcy5nZXRQb3NpdGlvbih0aGlzLiR2aWV3cG9ydClcblxuICAgIGlmICgvcmlnaHR8bGVmdC8udGVzdChwbGFjZW1lbnQpKSB7XG4gICAgICB2YXIgdG9wRWRnZU9mZnNldCAgICA9IHBvcy50b3AgLSB2aWV3cG9ydFBhZGRpbmcgLSB2aWV3cG9ydERpbWVuc2lvbnMuc2Nyb2xsXG4gICAgICB2YXIgYm90dG9tRWRnZU9mZnNldCA9IHBvcy50b3AgKyB2aWV3cG9ydFBhZGRpbmcgLSB2aWV3cG9ydERpbWVuc2lvbnMuc2Nyb2xsICsgYWN0dWFsSGVpZ2h0XG4gICAgICBpZiAodG9wRWRnZU9mZnNldCA8IHZpZXdwb3J0RGltZW5zaW9ucy50b3ApIHsgLy8gdG9wIG92ZXJmbG93XG4gICAgICAgIGRlbHRhLnRvcCA9IHZpZXdwb3J0RGltZW5zaW9ucy50b3AgLSB0b3BFZGdlT2Zmc2V0XG4gICAgICB9IGVsc2UgaWYgKGJvdHRvbUVkZ2VPZmZzZXQgPiB2aWV3cG9ydERpbWVuc2lvbnMudG9wICsgdmlld3BvcnREaW1lbnNpb25zLmhlaWdodCkgeyAvLyBib3R0b20gb3ZlcmZsb3dcbiAgICAgICAgZGVsdGEudG9wID0gdmlld3BvcnREaW1lbnNpb25zLnRvcCArIHZpZXdwb3J0RGltZW5zaW9ucy5oZWlnaHQgLSBib3R0b21FZGdlT2Zmc2V0XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBsZWZ0RWRnZU9mZnNldCAgPSBwb3MubGVmdCAtIHZpZXdwb3J0UGFkZGluZ1xuICAgICAgdmFyIHJpZ2h0RWRnZU9mZnNldCA9IHBvcy5sZWZ0ICsgdmlld3BvcnRQYWRkaW5nICsgYWN0dWFsV2lkdGhcbiAgICAgIGlmIChsZWZ0RWRnZU9mZnNldCA8IHZpZXdwb3J0RGltZW5zaW9ucy5sZWZ0KSB7IC8vIGxlZnQgb3ZlcmZsb3dcbiAgICAgICAgZGVsdGEubGVmdCA9IHZpZXdwb3J0RGltZW5zaW9ucy5sZWZ0IC0gbGVmdEVkZ2VPZmZzZXRcbiAgICAgIH0gZWxzZSBpZiAocmlnaHRFZGdlT2Zmc2V0ID4gdmlld3BvcnREaW1lbnNpb25zLnJpZ2h0KSB7IC8vIHJpZ2h0IG92ZXJmbG93XG4gICAgICAgIGRlbHRhLmxlZnQgPSB2aWV3cG9ydERpbWVuc2lvbnMubGVmdCArIHZpZXdwb3J0RGltZW5zaW9ucy53aWR0aCAtIHJpZ2h0RWRnZU9mZnNldFxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkZWx0YVxuICB9XG5cbiAgVG9vbHRpcC5wcm90b3R5cGUuZ2V0VGl0bGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHRpdGxlXG4gICAgdmFyICRlID0gdGhpcy4kZWxlbWVudFxuICAgIHZhciBvICA9IHRoaXMub3B0aW9uc1xuXG4gICAgdGl0bGUgPSAkZS5hdHRyKCdkYXRhLW9yaWdpbmFsLXRpdGxlJylcbiAgICAgIHx8ICh0eXBlb2Ygby50aXRsZSA9PSAnZnVuY3Rpb24nID8gby50aXRsZS5jYWxsKCRlWzBdKSA6ICBvLnRpdGxlKVxuXG4gICAgcmV0dXJuIHRpdGxlXG4gIH1cblxuICBUb29sdGlwLnByb3RvdHlwZS5nZXRVSUQgPSBmdW5jdGlvbiAocHJlZml4KSB7XG4gICAgZG8gcHJlZml4ICs9IH5+KE1hdGgucmFuZG9tKCkgKiAxMDAwMDAwKVxuICAgIHdoaWxlIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZChwcmVmaXgpKVxuICAgIHJldHVybiBwcmVmaXhcbiAgfVxuXG4gIFRvb2x0aXAucHJvdG90eXBlLnRpcCA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMuJHRpcCkge1xuICAgICAgdGhpcy4kdGlwID0gJCh0aGlzLm9wdGlvbnMudGVtcGxhdGUpXG4gICAgICBpZiAodGhpcy4kdGlwLmxlbmd0aCAhPSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcih0aGlzLnR5cGUgKyAnIGB0ZW1wbGF0ZWAgb3B0aW9uIG11c3QgY29uc2lzdCBvZiBleGFjdGx5IDEgdG9wLWxldmVsIGVsZW1lbnQhJylcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuJHRpcFxuICB9XG5cbiAgVG9vbHRpcC5wcm90b3R5cGUuYXJyb3cgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuICh0aGlzLiRhcnJvdyA9IHRoaXMuJGFycm93IHx8IHRoaXMudGlwKCkuZmluZCgnLnRvb2x0aXAtYXJyb3cnKSlcbiAgfVxuXG4gIFRvb2x0aXAucHJvdG90eXBlLmVuYWJsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmVuYWJsZWQgPSB0cnVlXG4gIH1cblxuICBUb29sdGlwLnByb3RvdHlwZS5kaXNhYmxlID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlXG4gIH1cblxuICBUb29sdGlwLnByb3RvdHlwZS50b2dnbGVFbmFibGVkID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZW5hYmxlZCA9ICF0aGlzLmVuYWJsZWRcbiAgfVxuXG4gIFRvb2x0aXAucHJvdG90eXBlLnRvZ2dsZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzXG4gICAgaWYgKGUpIHtcbiAgICAgIHNlbGYgPSAkKGUuY3VycmVudFRhcmdldCkuZGF0YSgnYnMuJyArIHRoaXMudHlwZSlcbiAgICAgIGlmICghc2VsZikge1xuICAgICAgICBzZWxmID0gbmV3IHRoaXMuY29uc3RydWN0b3IoZS5jdXJyZW50VGFyZ2V0LCB0aGlzLmdldERlbGVnYXRlT3B0aW9ucygpKVxuICAgICAgICAkKGUuY3VycmVudFRhcmdldCkuZGF0YSgnYnMuJyArIHRoaXMudHlwZSwgc2VsZilcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZSkge1xuICAgICAgc2VsZi5pblN0YXRlLmNsaWNrID0gIXNlbGYuaW5TdGF0ZS5jbGlja1xuICAgICAgaWYgKHNlbGYuaXNJblN0YXRlVHJ1ZSgpKSBzZWxmLmVudGVyKHNlbGYpXG4gICAgICBlbHNlIHNlbGYubGVhdmUoc2VsZilcbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZi50aXAoKS5oYXNDbGFzcygnaW4nKSA/IHNlbGYubGVhdmUoc2VsZikgOiBzZWxmLmVudGVyKHNlbGYpXG4gICAgfVxuICB9XG5cbiAgVG9vbHRpcC5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdGhhdCA9IHRoaXNcbiAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0KVxuICAgIHRoaXMuaGlkZShmdW5jdGlvbiAoKSB7XG4gICAgICB0aGF0LiRlbGVtZW50Lm9mZignLicgKyB0aGF0LnR5cGUpLnJlbW92ZURhdGEoJ2JzLicgKyB0aGF0LnR5cGUpXG4gICAgICBpZiAodGhhdC4kdGlwKSB7XG4gICAgICAgIHRoYXQuJHRpcC5kZXRhY2goKVxuICAgICAgfVxuICAgICAgdGhhdC4kdGlwID0gbnVsbFxuICAgICAgdGhhdC4kYXJyb3cgPSBudWxsXG4gICAgICB0aGF0LiR2aWV3cG9ydCA9IG51bGxcbiAgICAgIHRoYXQuJGVsZW1lbnQgPSBudWxsXG4gICAgfSlcbiAgfVxuXG5cbiAgLy8gVE9PTFRJUCBQTFVHSU4gREVGSU5JVElPTlxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgZnVuY3Rpb24gUGx1Z2luKG9wdGlvbikge1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgdmFyICR0aGlzICAgPSAkKHRoaXMpXG4gICAgICB2YXIgZGF0YSAgICA9ICR0aGlzLmRhdGEoJ2JzLnRvb2x0aXAnKVxuICAgICAgdmFyIG9wdGlvbnMgPSB0eXBlb2Ygb3B0aW9uID09ICdvYmplY3QnICYmIG9wdGlvblxuXG4gICAgICBpZiAoIWRhdGEgJiYgL2Rlc3Ryb3l8aGlkZS8udGVzdChvcHRpb24pKSByZXR1cm5cbiAgICAgIGlmICghZGF0YSkgJHRoaXMuZGF0YSgnYnMudG9vbHRpcCcsIChkYXRhID0gbmV3IFRvb2x0aXAodGhpcywgb3B0aW9ucykpKVxuICAgICAgaWYgKHR5cGVvZiBvcHRpb24gPT0gJ3N0cmluZycpIGRhdGFbb3B0aW9uXSgpXG4gICAgfSlcbiAgfVxuXG4gIHZhciBvbGQgPSAkLmZuLnRvb2x0aXBcblxuICAkLmZuLnRvb2x0aXAgICAgICAgICAgICAgPSBQbHVnaW5cbiAgJC5mbi50b29sdGlwLkNvbnN0cnVjdG9yID0gVG9vbHRpcFxuXG5cbiAgLy8gVE9PTFRJUCBOTyBDT05GTElDVFxuICAvLyA9PT09PT09PT09PT09PT09PT09XG5cbiAgJC5mbi50b29sdGlwLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgJC5mbi50b29sdGlwID0gb2xkXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG59KGpRdWVyeSk7XG4iLCIvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEJvb3RzdHJhcDogdHJhbnNpdGlvbi5qcyB2My4zLjdcbiAqIGh0dHA6Ly9nZXRib290c3RyYXAuY29tL2phdmFzY3JpcHQvI3RyYW5zaXRpb25zXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvcHlyaWdodCAyMDExLTIwMTYgVHdpdHRlciwgSW5jLlxuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYXN0ZXIvTElDRU5TRSlcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5cbitmdW5jdGlvbiAoJCkge1xuICAndXNlIHN0cmljdCc7XG5cbiAgLy8gQ1NTIFRSQU5TSVRJT04gU1VQUE9SVCAoU2hvdXRvdXQ6IGh0dHA6Ly93d3cubW9kZXJuaXpyLmNvbS8pXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIGZ1bmN0aW9uIHRyYW5zaXRpb25FbmQoKSB7XG4gICAgdmFyIGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYm9vdHN0cmFwJylcblxuICAgIHZhciB0cmFuc0VuZEV2ZW50TmFtZXMgPSB7XG4gICAgICBXZWJraXRUcmFuc2l0aW9uIDogJ3dlYmtpdFRyYW5zaXRpb25FbmQnLFxuICAgICAgTW96VHJhbnNpdGlvbiAgICA6ICd0cmFuc2l0aW9uZW5kJyxcbiAgICAgIE9UcmFuc2l0aW9uICAgICAgOiAnb1RyYW5zaXRpb25FbmQgb3RyYW5zaXRpb25lbmQnLFxuICAgICAgdHJhbnNpdGlvbiAgICAgICA6ICd0cmFuc2l0aW9uZW5kJ1xuICAgIH1cblxuICAgIGZvciAodmFyIG5hbWUgaW4gdHJhbnNFbmRFdmVudE5hbWVzKSB7XG4gICAgICBpZiAoZWwuc3R5bGVbbmFtZV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4geyBlbmQ6IHRyYW5zRW5kRXZlbnROYW1lc1tuYW1lXSB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlIC8vIGV4cGxpY2l0IGZvciBpZTggKCAgLl8uKVxuICB9XG5cbiAgLy8gaHR0cDovL2Jsb2cuYWxleG1hY2Nhdy5jb20vY3NzLXRyYW5zaXRpb25zXG4gICQuZm4uZW11bGF0ZVRyYW5zaXRpb25FbmQgPSBmdW5jdGlvbiAoZHVyYXRpb24pIHtcbiAgICB2YXIgY2FsbGVkID0gZmFsc2VcbiAgICB2YXIgJGVsID0gdGhpc1xuICAgICQodGhpcykub25lKCdic1RyYW5zaXRpb25FbmQnLCBmdW5jdGlvbiAoKSB7IGNhbGxlZCA9IHRydWUgfSlcbiAgICB2YXIgY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7IGlmICghY2FsbGVkKSAkKCRlbCkudHJpZ2dlcigkLnN1cHBvcnQudHJhbnNpdGlvbi5lbmQpIH1cbiAgICBzZXRUaW1lb3V0KGNhbGxiYWNrLCBkdXJhdGlvbilcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgJChmdW5jdGlvbiAoKSB7XG4gICAgJC5zdXBwb3J0LnRyYW5zaXRpb24gPSB0cmFuc2l0aW9uRW5kKClcblxuICAgIGlmICghJC5zdXBwb3J0LnRyYW5zaXRpb24pIHJldHVyblxuXG4gICAgJC5ldmVudC5zcGVjaWFsLmJzVHJhbnNpdGlvbkVuZCA9IHtcbiAgICAgIGJpbmRUeXBlOiAkLnN1cHBvcnQudHJhbnNpdGlvbi5lbmQsXG4gICAgICBkZWxlZ2F0ZVR5cGU6ICQuc3VwcG9ydC50cmFuc2l0aW9uLmVuZCxcbiAgICAgIGhhbmRsZTogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgaWYgKCQoZS50YXJnZXQpLmlzKHRoaXMpKSByZXR1cm4gZS5oYW5kbGVPYmouaGFuZGxlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gICAgICB9XG4gICAgfVxuICB9KVxuXG59KGpRdWVyeSk7XG4iLCIvKiFcbiAqIGpRdWVyeSBKYXZhU2NyaXB0IExpYnJhcnkgdjEuMTIuNFxuICogaHR0cDovL2pxdWVyeS5jb20vXG4gKlxuICogSW5jbHVkZXMgU2l6emxlLmpzXG4gKiBodHRwOi8vc2l6emxlanMuY29tL1xuICpcbiAqIENvcHlyaWdodCBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcbiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2VcbiAqXG4gKiBEYXRlOiAyMDE2LTA1LTIwVDE3OjE3WlxuICovXG5cbihmdW5jdGlvbiggZ2xvYmFsLCBmYWN0b3J5ICkge1xuXG5cdGlmICggdHlwZW9mIG1vZHVsZSA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgbW9kdWxlLmV4cG9ydHMgPT09IFwib2JqZWN0XCIgKSB7XG5cdFx0Ly8gRm9yIENvbW1vbkpTIGFuZCBDb21tb25KUy1saWtlIGVudmlyb25tZW50cyB3aGVyZSBhIHByb3BlciBgd2luZG93YFxuXHRcdC8vIGlzIHByZXNlbnQsIGV4ZWN1dGUgdGhlIGZhY3RvcnkgYW5kIGdldCBqUXVlcnkuXG5cdFx0Ly8gRm9yIGVudmlyb25tZW50cyB0aGF0IGRvIG5vdCBoYXZlIGEgYHdpbmRvd2Agd2l0aCBhIGBkb2N1bWVudGBcblx0XHQvLyAoc3VjaCBhcyBOb2RlLmpzKSwgZXhwb3NlIGEgZmFjdG9yeSBhcyBtb2R1bGUuZXhwb3J0cy5cblx0XHQvLyBUaGlzIGFjY2VudHVhdGVzIHRoZSBuZWVkIGZvciB0aGUgY3JlYXRpb24gb2YgYSByZWFsIGB3aW5kb3dgLlxuXHRcdC8vIGUuZy4gdmFyIGpRdWVyeSA9IHJlcXVpcmUoXCJqcXVlcnlcIikod2luZG93KTtcblx0XHQvLyBTZWUgdGlja2V0ICMxNDU0OSBmb3IgbW9yZSBpbmZvLlxuXHRcdG1vZHVsZS5leHBvcnRzID0gZ2xvYmFsLmRvY3VtZW50ID9cblx0XHRcdGZhY3RvcnkoIGdsb2JhbCwgdHJ1ZSApIDpcblx0XHRcdGZ1bmN0aW9uKCB3ICkge1xuXHRcdFx0XHRpZiAoICF3LmRvY3VtZW50ICkge1xuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciggXCJqUXVlcnkgcmVxdWlyZXMgYSB3aW5kb3cgd2l0aCBhIGRvY3VtZW50XCIgKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gZmFjdG9yeSggdyApO1xuXHRcdFx0fTtcblx0fSBlbHNlIHtcblx0XHRmYWN0b3J5KCBnbG9iYWwgKTtcblx0fVxuXG4vLyBQYXNzIHRoaXMgaWYgd2luZG93IGlzIG5vdCBkZWZpbmVkIHlldFxufSh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiID8gd2luZG93IDogdGhpcywgZnVuY3Rpb24oIHdpbmRvdywgbm9HbG9iYWwgKSB7XG5cbi8vIFN1cHBvcnQ6IEZpcmVmb3ggMTgrXG4vLyBDYW4ndCBiZSBpbiBzdHJpY3QgbW9kZSwgc2V2ZXJhbCBsaWJzIGluY2x1ZGluZyBBU1AuTkVUIHRyYWNlXG4vLyB0aGUgc3RhY2sgdmlhIGFyZ3VtZW50cy5jYWxsZXIuY2FsbGVlIGFuZCBGaXJlZm94IGRpZXMgaWZcbi8vIHlvdSB0cnkgdG8gdHJhY2UgdGhyb3VnaCBcInVzZSBzdHJpY3RcIiBjYWxsIGNoYWlucy4gKCMxMzMzNSlcbi8vXCJ1c2Ugc3RyaWN0XCI7XG52YXIgZGVsZXRlZElkcyA9IFtdO1xuXG52YXIgZG9jdW1lbnQgPSB3aW5kb3cuZG9jdW1lbnQ7XG5cbnZhciBzbGljZSA9IGRlbGV0ZWRJZHMuc2xpY2U7XG5cbnZhciBjb25jYXQgPSBkZWxldGVkSWRzLmNvbmNhdDtcblxudmFyIHB1c2ggPSBkZWxldGVkSWRzLnB1c2g7XG5cbnZhciBpbmRleE9mID0gZGVsZXRlZElkcy5pbmRleE9mO1xuXG52YXIgY2xhc3MydHlwZSA9IHt9O1xuXG52YXIgdG9TdHJpbmcgPSBjbGFzczJ0eXBlLnRvU3RyaW5nO1xuXG52YXIgaGFzT3duID0gY2xhc3MydHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxudmFyIHN1cHBvcnQgPSB7fTtcblxuXG5cbnZhclxuXHR2ZXJzaW9uID0gXCIxLjEyLjRcIixcblxuXHQvLyBEZWZpbmUgYSBsb2NhbCBjb3B5IG9mIGpRdWVyeVxuXHRqUXVlcnkgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQgKSB7XG5cblx0XHQvLyBUaGUgalF1ZXJ5IG9iamVjdCBpcyBhY3R1YWxseSBqdXN0IHRoZSBpbml0IGNvbnN0cnVjdG9yICdlbmhhbmNlZCdcblx0XHQvLyBOZWVkIGluaXQgaWYgalF1ZXJ5IGlzIGNhbGxlZCAoanVzdCBhbGxvdyBlcnJvciB0byBiZSB0aHJvd24gaWYgbm90IGluY2x1ZGVkKVxuXHRcdHJldHVybiBuZXcgalF1ZXJ5LmZuLmluaXQoIHNlbGVjdG9yLCBjb250ZXh0ICk7XG5cdH0sXG5cblx0Ly8gU3VwcG9ydDogQW5kcm9pZDw0LjEsIElFPDlcblx0Ly8gTWFrZSBzdXJlIHdlIHRyaW0gQk9NIGFuZCBOQlNQXG5cdHJ0cmltID0gL15bXFxzXFx1RkVGRlxceEEwXSt8W1xcc1xcdUZFRkZcXHhBMF0rJC9nLFxuXG5cdC8vIE1hdGNoZXMgZGFzaGVkIHN0cmluZyBmb3IgY2FtZWxpemluZ1xuXHRybXNQcmVmaXggPSAvXi1tcy0vLFxuXHRyZGFzaEFscGhhID0gLy0oW1xcZGEtel0pL2dpLFxuXG5cdC8vIFVzZWQgYnkgalF1ZXJ5LmNhbWVsQ2FzZSBhcyBjYWxsYmFjayB0byByZXBsYWNlKClcblx0ZmNhbWVsQ2FzZSA9IGZ1bmN0aW9uKCBhbGwsIGxldHRlciApIHtcblx0XHRyZXR1cm4gbGV0dGVyLnRvVXBwZXJDYXNlKCk7XG5cdH07XG5cbmpRdWVyeS5mbiA9IGpRdWVyeS5wcm90b3R5cGUgPSB7XG5cblx0Ly8gVGhlIGN1cnJlbnQgdmVyc2lvbiBvZiBqUXVlcnkgYmVpbmcgdXNlZFxuXHRqcXVlcnk6IHZlcnNpb24sXG5cblx0Y29uc3RydWN0b3I6IGpRdWVyeSxcblxuXHQvLyBTdGFydCB3aXRoIGFuIGVtcHR5IHNlbGVjdG9yXG5cdHNlbGVjdG9yOiBcIlwiLFxuXG5cdC8vIFRoZSBkZWZhdWx0IGxlbmd0aCBvZiBhIGpRdWVyeSBvYmplY3QgaXMgMFxuXHRsZW5ndGg6IDAsXG5cblx0dG9BcnJheTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHNsaWNlLmNhbGwoIHRoaXMgKTtcblx0fSxcblxuXHQvLyBHZXQgdGhlIE50aCBlbGVtZW50IGluIHRoZSBtYXRjaGVkIGVsZW1lbnQgc2V0IE9SXG5cdC8vIEdldCB0aGUgd2hvbGUgbWF0Y2hlZCBlbGVtZW50IHNldCBhcyBhIGNsZWFuIGFycmF5XG5cdGdldDogZnVuY3Rpb24oIG51bSApIHtcblx0XHRyZXR1cm4gbnVtICE9IG51bGwgP1xuXG5cdFx0XHQvLyBSZXR1cm4ganVzdCB0aGUgb25lIGVsZW1lbnQgZnJvbSB0aGUgc2V0XG5cdFx0XHQoIG51bSA8IDAgPyB0aGlzWyBudW0gKyB0aGlzLmxlbmd0aCBdIDogdGhpc1sgbnVtIF0gKSA6XG5cblx0XHRcdC8vIFJldHVybiBhbGwgdGhlIGVsZW1lbnRzIGluIGEgY2xlYW4gYXJyYXlcblx0XHRcdHNsaWNlLmNhbGwoIHRoaXMgKTtcblx0fSxcblxuXHQvLyBUYWtlIGFuIGFycmF5IG9mIGVsZW1lbnRzIGFuZCBwdXNoIGl0IG9udG8gdGhlIHN0YWNrXG5cdC8vIChyZXR1cm5pbmcgdGhlIG5ldyBtYXRjaGVkIGVsZW1lbnQgc2V0KVxuXHRwdXNoU3RhY2s6IGZ1bmN0aW9uKCBlbGVtcyApIHtcblxuXHRcdC8vIEJ1aWxkIGEgbmV3IGpRdWVyeSBtYXRjaGVkIGVsZW1lbnQgc2V0XG5cdFx0dmFyIHJldCA9IGpRdWVyeS5tZXJnZSggdGhpcy5jb25zdHJ1Y3RvcigpLCBlbGVtcyApO1xuXG5cdFx0Ly8gQWRkIHRoZSBvbGQgb2JqZWN0IG9udG8gdGhlIHN0YWNrIChhcyBhIHJlZmVyZW5jZSlcblx0XHRyZXQucHJldk9iamVjdCA9IHRoaXM7XG5cdFx0cmV0LmNvbnRleHQgPSB0aGlzLmNvbnRleHQ7XG5cblx0XHQvLyBSZXR1cm4gdGhlIG5ld2x5LWZvcm1lZCBlbGVtZW50IHNldFxuXHRcdHJldHVybiByZXQ7XG5cdH0sXG5cblx0Ly8gRXhlY3V0ZSBhIGNhbGxiYWNrIGZvciBldmVyeSBlbGVtZW50IGluIHRoZSBtYXRjaGVkIHNldC5cblx0ZWFjaDogZnVuY3Rpb24oIGNhbGxiYWNrICkge1xuXHRcdHJldHVybiBqUXVlcnkuZWFjaCggdGhpcywgY2FsbGJhY2sgKTtcblx0fSxcblxuXHRtYXA6IGZ1bmN0aW9uKCBjYWxsYmFjayApIHtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeS5tYXAoIHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCBpICkge1xuXHRcdFx0cmV0dXJuIGNhbGxiYWNrLmNhbGwoIGVsZW0sIGksIGVsZW0gKTtcblx0XHR9ICkgKTtcblx0fSxcblxuXHRzbGljZTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBzbGljZS5hcHBseSggdGhpcywgYXJndW1lbnRzICkgKTtcblx0fSxcblxuXHRmaXJzdDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuZXEoIDAgKTtcblx0fSxcblxuXHRsYXN0OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5lcSggLTEgKTtcblx0fSxcblxuXHRlcTogZnVuY3Rpb24oIGkgKSB7XG5cdFx0dmFyIGxlbiA9IHRoaXMubGVuZ3RoLFxuXHRcdFx0aiA9ICtpICsgKCBpIDwgMCA/IGxlbiA6IDAgKTtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGogPj0gMCAmJiBqIDwgbGVuID8gWyB0aGlzWyBqIF0gXSA6IFtdICk7XG5cdH0sXG5cblx0ZW5kOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5wcmV2T2JqZWN0IHx8IHRoaXMuY29uc3RydWN0b3IoKTtcblx0fSxcblxuXHQvLyBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuXG5cdC8vIEJlaGF2ZXMgbGlrZSBhbiBBcnJheSdzIG1ldGhvZCwgbm90IGxpa2UgYSBqUXVlcnkgbWV0aG9kLlxuXHRwdXNoOiBwdXNoLFxuXHRzb3J0OiBkZWxldGVkSWRzLnNvcnQsXG5cdHNwbGljZTogZGVsZXRlZElkcy5zcGxpY2Vcbn07XG5cbmpRdWVyeS5leHRlbmQgPSBqUXVlcnkuZm4uZXh0ZW5kID0gZnVuY3Rpb24oKSB7XG5cdHZhciBzcmMsIGNvcHlJc0FycmF5LCBjb3B5LCBuYW1lLCBvcHRpb25zLCBjbG9uZSxcblx0XHR0YXJnZXQgPSBhcmd1bWVudHNbIDAgXSB8fCB7fSxcblx0XHRpID0gMSxcblx0XHRsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoLFxuXHRcdGRlZXAgPSBmYWxzZTtcblxuXHQvLyBIYW5kbGUgYSBkZWVwIGNvcHkgc2l0dWF0aW9uXG5cdGlmICggdHlwZW9mIHRhcmdldCA9PT0gXCJib29sZWFuXCIgKSB7XG5cdFx0ZGVlcCA9IHRhcmdldDtcblxuXHRcdC8vIHNraXAgdGhlIGJvb2xlYW4gYW5kIHRoZSB0YXJnZXRcblx0XHR0YXJnZXQgPSBhcmd1bWVudHNbIGkgXSB8fCB7fTtcblx0XHRpKys7XG5cdH1cblxuXHQvLyBIYW5kbGUgY2FzZSB3aGVuIHRhcmdldCBpcyBhIHN0cmluZyBvciBzb21ldGhpbmcgKHBvc3NpYmxlIGluIGRlZXAgY29weSlcblx0aWYgKCB0eXBlb2YgdGFyZ2V0ICE9PSBcIm9iamVjdFwiICYmICFqUXVlcnkuaXNGdW5jdGlvbiggdGFyZ2V0ICkgKSB7XG5cdFx0dGFyZ2V0ID0ge307XG5cdH1cblxuXHQvLyBleHRlbmQgalF1ZXJ5IGl0c2VsZiBpZiBvbmx5IG9uZSBhcmd1bWVudCBpcyBwYXNzZWRcblx0aWYgKCBpID09PSBsZW5ndGggKSB7XG5cdFx0dGFyZ2V0ID0gdGhpcztcblx0XHRpLS07XG5cdH1cblxuXHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHtcblxuXHRcdC8vIE9ubHkgZGVhbCB3aXRoIG5vbi1udWxsL3VuZGVmaW5lZCB2YWx1ZXNcblx0XHRpZiAoICggb3B0aW9ucyA9IGFyZ3VtZW50c1sgaSBdICkgIT0gbnVsbCApIHtcblxuXHRcdFx0Ly8gRXh0ZW5kIHRoZSBiYXNlIG9iamVjdFxuXHRcdFx0Zm9yICggbmFtZSBpbiBvcHRpb25zICkge1xuXHRcdFx0XHRzcmMgPSB0YXJnZXRbIG5hbWUgXTtcblx0XHRcdFx0Y29weSA9IG9wdGlvbnNbIG5hbWUgXTtcblxuXHRcdFx0XHQvLyBQcmV2ZW50IG5ldmVyLWVuZGluZyBsb29wXG5cdFx0XHRcdGlmICggdGFyZ2V0ID09PSBjb3B5ICkge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gUmVjdXJzZSBpZiB3ZSdyZSBtZXJnaW5nIHBsYWluIG9iamVjdHMgb3IgYXJyYXlzXG5cdFx0XHRcdGlmICggZGVlcCAmJiBjb3B5ICYmICggalF1ZXJ5LmlzUGxhaW5PYmplY3QoIGNvcHkgKSB8fFxuXHRcdFx0XHRcdCggY29weUlzQXJyYXkgPSBqUXVlcnkuaXNBcnJheSggY29weSApICkgKSApIHtcblxuXHRcdFx0XHRcdGlmICggY29weUlzQXJyYXkgKSB7XG5cdFx0XHRcdFx0XHRjb3B5SXNBcnJheSA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0Y2xvbmUgPSBzcmMgJiYgalF1ZXJ5LmlzQXJyYXkoIHNyYyApID8gc3JjIDogW107XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Y2xvbmUgPSBzcmMgJiYgalF1ZXJ5LmlzUGxhaW5PYmplY3QoIHNyYyApID8gc3JjIDoge307XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gTmV2ZXIgbW92ZSBvcmlnaW5hbCBvYmplY3RzLCBjbG9uZSB0aGVtXG5cdFx0XHRcdFx0dGFyZ2V0WyBuYW1lIF0gPSBqUXVlcnkuZXh0ZW5kKCBkZWVwLCBjbG9uZSwgY29weSApO1xuXG5cdFx0XHRcdC8vIERvbid0IGJyaW5nIGluIHVuZGVmaW5lZCB2YWx1ZXNcblx0XHRcdFx0fSBlbHNlIGlmICggY29weSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdHRhcmdldFsgbmFtZSBdID0gY29weTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIFJldHVybiB0aGUgbW9kaWZpZWQgb2JqZWN0XG5cdHJldHVybiB0YXJnZXQ7XG59O1xuXG5qUXVlcnkuZXh0ZW5kKCB7XG5cblx0Ly8gVW5pcXVlIGZvciBlYWNoIGNvcHkgb2YgalF1ZXJ5IG9uIHRoZSBwYWdlXG5cdGV4cGFuZG86IFwialF1ZXJ5XCIgKyAoIHZlcnNpb24gKyBNYXRoLnJhbmRvbSgpICkucmVwbGFjZSggL1xcRC9nLCBcIlwiICksXG5cblx0Ly8gQXNzdW1lIGpRdWVyeSBpcyByZWFkeSB3aXRob3V0IHRoZSByZWFkeSBtb2R1bGVcblx0aXNSZWFkeTogdHJ1ZSxcblxuXHRlcnJvcjogZnVuY3Rpb24oIG1zZyApIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoIG1zZyApO1xuXHR9LFxuXG5cdG5vb3A6IGZ1bmN0aW9uKCkge30sXG5cblx0Ly8gU2VlIHRlc3QvdW5pdC9jb3JlLmpzIGZvciBkZXRhaWxzIGNvbmNlcm5pbmcgaXNGdW5jdGlvbi5cblx0Ly8gU2luY2UgdmVyc2lvbiAxLjMsIERPTSBtZXRob2RzIGFuZCBmdW5jdGlvbnMgbGlrZSBhbGVydFxuXHQvLyBhcmVuJ3Qgc3VwcG9ydGVkLiBUaGV5IHJldHVybiBmYWxzZSBvbiBJRSAoIzI5NjgpLlxuXHRpc0Z1bmN0aW9uOiBmdW5jdGlvbiggb2JqICkge1xuXHRcdHJldHVybiBqUXVlcnkudHlwZSggb2JqICkgPT09IFwiZnVuY3Rpb25cIjtcblx0fSxcblxuXHRpc0FycmF5OiBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uKCBvYmogKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS50eXBlKCBvYmogKSA9PT0gXCJhcnJheVwiO1xuXHR9LFxuXG5cdGlzV2luZG93OiBmdW5jdGlvbiggb2JqICkge1xuXHRcdC8qIGpzaGludCBlcWVxZXE6IGZhbHNlICovXG5cdFx0cmV0dXJuIG9iaiAhPSBudWxsICYmIG9iaiA9PSBvYmoud2luZG93O1xuXHR9LFxuXG5cdGlzTnVtZXJpYzogZnVuY3Rpb24oIG9iaiApIHtcblxuXHRcdC8vIHBhcnNlRmxvYXQgTmFOcyBudW1lcmljLWNhc3QgZmFsc2UgcG9zaXRpdmVzIChudWxsfHRydWV8ZmFsc2V8XCJcIilcblx0XHQvLyAuLi5idXQgbWlzaW50ZXJwcmV0cyBsZWFkaW5nLW51bWJlciBzdHJpbmdzLCBwYXJ0aWN1bGFybHkgaGV4IGxpdGVyYWxzIChcIjB4Li4uXCIpXG5cdFx0Ly8gc3VidHJhY3Rpb24gZm9yY2VzIGluZmluaXRpZXMgdG8gTmFOXG5cdFx0Ly8gYWRkaW5nIDEgY29ycmVjdHMgbG9zcyBvZiBwcmVjaXNpb24gZnJvbSBwYXJzZUZsb2F0ICgjMTUxMDApXG5cdFx0dmFyIHJlYWxTdHJpbmdPYmogPSBvYmogJiYgb2JqLnRvU3RyaW5nKCk7XG5cdFx0cmV0dXJuICFqUXVlcnkuaXNBcnJheSggb2JqICkgJiYgKCByZWFsU3RyaW5nT2JqIC0gcGFyc2VGbG9hdCggcmVhbFN0cmluZ09iaiApICsgMSApID49IDA7XG5cdH0sXG5cblx0aXNFbXB0eU9iamVjdDogZnVuY3Rpb24oIG9iaiApIHtcblx0XHR2YXIgbmFtZTtcblx0XHRmb3IgKCBuYW1lIGluIG9iaiApIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0cmV0dXJuIHRydWU7XG5cdH0sXG5cblx0aXNQbGFpbk9iamVjdDogZnVuY3Rpb24oIG9iaiApIHtcblx0XHR2YXIga2V5O1xuXG5cdFx0Ly8gTXVzdCBiZSBhbiBPYmplY3QuXG5cdFx0Ly8gQmVjYXVzZSBvZiBJRSwgd2UgYWxzbyBoYXZlIHRvIGNoZWNrIHRoZSBwcmVzZW5jZSBvZiB0aGUgY29uc3RydWN0b3IgcHJvcGVydHkuXG5cdFx0Ly8gTWFrZSBzdXJlIHRoYXQgRE9NIG5vZGVzIGFuZCB3aW5kb3cgb2JqZWN0cyBkb24ndCBwYXNzIHRocm91Z2gsIGFzIHdlbGxcblx0XHRpZiAoICFvYmogfHwgalF1ZXJ5LnR5cGUoIG9iaiApICE9PSBcIm9iamVjdFwiIHx8IG9iai5ub2RlVHlwZSB8fCBqUXVlcnkuaXNXaW5kb3coIG9iaiApICkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHRyeSB7XG5cblx0XHRcdC8vIE5vdCBvd24gY29uc3RydWN0b3IgcHJvcGVydHkgbXVzdCBiZSBPYmplY3Rcblx0XHRcdGlmICggb2JqLmNvbnN0cnVjdG9yICYmXG5cdFx0XHRcdCFoYXNPd24uY2FsbCggb2JqLCBcImNvbnN0cnVjdG9yXCIgKSAmJlxuXHRcdFx0XHQhaGFzT3duLmNhbGwoIG9iai5jb25zdHJ1Y3Rvci5wcm90b3R5cGUsIFwiaXNQcm90b3R5cGVPZlwiICkgKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHR9IGNhdGNoICggZSApIHtcblxuXHRcdFx0Ly8gSUU4LDkgV2lsbCB0aHJvdyBleGNlcHRpb25zIG9uIGNlcnRhaW4gaG9zdCBvYmplY3RzICM5ODk3XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gU3VwcG9ydDogSUU8OVxuXHRcdC8vIEhhbmRsZSBpdGVyYXRpb24gb3ZlciBpbmhlcml0ZWQgcHJvcGVydGllcyBiZWZvcmUgb3duIHByb3BlcnRpZXMuXG5cdFx0aWYgKCAhc3VwcG9ydC5vd25GaXJzdCApIHtcblx0XHRcdGZvciAoIGtleSBpbiBvYmogKSB7XG5cdFx0XHRcdHJldHVybiBoYXNPd24uY2FsbCggb2JqLCBrZXkgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBPd24gcHJvcGVydGllcyBhcmUgZW51bWVyYXRlZCBmaXJzdGx5LCBzbyB0byBzcGVlZCB1cCxcblx0XHQvLyBpZiBsYXN0IG9uZSBpcyBvd24sIHRoZW4gYWxsIHByb3BlcnRpZXMgYXJlIG93bi5cblx0XHRmb3IgKCBrZXkgaW4gb2JqICkge31cblxuXHRcdHJldHVybiBrZXkgPT09IHVuZGVmaW5lZCB8fCBoYXNPd24uY2FsbCggb2JqLCBrZXkgKTtcblx0fSxcblxuXHR0eXBlOiBmdW5jdGlvbiggb2JqICkge1xuXHRcdGlmICggb2JqID09IG51bGwgKSB7XG5cdFx0XHRyZXR1cm4gb2JqICsgXCJcIjtcblx0XHR9XG5cdFx0cmV0dXJuIHR5cGVvZiBvYmogPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIG9iaiA9PT0gXCJmdW5jdGlvblwiID9cblx0XHRcdGNsYXNzMnR5cGVbIHRvU3RyaW5nLmNhbGwoIG9iaiApIF0gfHwgXCJvYmplY3RcIiA6XG5cdFx0XHR0eXBlb2Ygb2JqO1xuXHR9LFxuXG5cdC8vIFdvcmthcm91bmRzIGJhc2VkIG9uIGZpbmRpbmdzIGJ5IEppbSBEcmlzY29sbFxuXHQvLyBodHRwOi8vd2VibG9ncy5qYXZhLm5ldC9ibG9nL2RyaXNjb2xsL2FyY2hpdmUvMjAwOS8wOS8wOC9ldmFsLWphdmFzY3JpcHQtZ2xvYmFsLWNvbnRleHRcblx0Z2xvYmFsRXZhbDogZnVuY3Rpb24oIGRhdGEgKSB7XG5cdFx0aWYgKCBkYXRhICYmIGpRdWVyeS50cmltKCBkYXRhICkgKSB7XG5cblx0XHRcdC8vIFdlIHVzZSBleGVjU2NyaXB0IG9uIEludGVybmV0IEV4cGxvcmVyXG5cdFx0XHQvLyBXZSB1c2UgYW4gYW5vbnltb3VzIGZ1bmN0aW9uIHNvIHRoYXQgY29udGV4dCBpcyB3aW5kb3dcblx0XHRcdC8vIHJhdGhlciB0aGFuIGpRdWVyeSBpbiBGaXJlZm94XG5cdFx0XHQoIHdpbmRvdy5leGVjU2NyaXB0IHx8IGZ1bmN0aW9uKCBkYXRhICkge1xuXHRcdFx0XHR3aW5kb3dbIFwiZXZhbFwiIF0uY2FsbCggd2luZG93LCBkYXRhICk7IC8vIGpzY3M6aWdub3JlIHJlcXVpcmVEb3ROb3RhdGlvblxuXHRcdFx0fSApKCBkYXRhICk7XG5cdFx0fVxuXHR9LFxuXG5cdC8vIENvbnZlcnQgZGFzaGVkIHRvIGNhbWVsQ2FzZTsgdXNlZCBieSB0aGUgY3NzIGFuZCBkYXRhIG1vZHVsZXNcblx0Ly8gTWljcm9zb2Z0IGZvcmdvdCB0byBodW1wIHRoZWlyIHZlbmRvciBwcmVmaXggKCM5NTcyKVxuXHRjYW1lbENhc2U6IGZ1bmN0aW9uKCBzdHJpbmcgKSB7XG5cdFx0cmV0dXJuIHN0cmluZy5yZXBsYWNlKCBybXNQcmVmaXgsIFwibXMtXCIgKS5yZXBsYWNlKCByZGFzaEFscGhhLCBmY2FtZWxDYXNlICk7XG5cdH0sXG5cblx0bm9kZU5hbWU6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkge1xuXHRcdHJldHVybiBlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuXHR9LFxuXG5cdGVhY2g6IGZ1bmN0aW9uKCBvYmosIGNhbGxiYWNrICkge1xuXHRcdHZhciBsZW5ndGgsIGkgPSAwO1xuXG5cdFx0aWYgKCBpc0FycmF5TGlrZSggb2JqICkgKSB7XG5cdFx0XHRsZW5ndGggPSBvYmoubGVuZ3RoO1xuXHRcdFx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7XG5cdFx0XHRcdGlmICggY2FsbGJhY2suY2FsbCggb2JqWyBpIF0sIGksIG9ialsgaSBdICkgPT09IGZhbHNlICkge1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGZvciAoIGkgaW4gb2JqICkge1xuXHRcdFx0XHRpZiAoIGNhbGxiYWNrLmNhbGwoIG9ialsgaSBdLCBpLCBvYmpbIGkgXSApID09PSBmYWxzZSApIHtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBvYmo7XG5cdH0sXG5cblx0Ly8gU3VwcG9ydDogQW5kcm9pZDw0LjEsIElFPDlcblx0dHJpbTogZnVuY3Rpb24oIHRleHQgKSB7XG5cdFx0cmV0dXJuIHRleHQgPT0gbnVsbCA/XG5cdFx0XHRcIlwiIDpcblx0XHRcdCggdGV4dCArIFwiXCIgKS5yZXBsYWNlKCBydHJpbSwgXCJcIiApO1xuXHR9LFxuXG5cdC8vIHJlc3VsdHMgaXMgZm9yIGludGVybmFsIHVzYWdlIG9ubHlcblx0bWFrZUFycmF5OiBmdW5jdGlvbiggYXJyLCByZXN1bHRzICkge1xuXHRcdHZhciByZXQgPSByZXN1bHRzIHx8IFtdO1xuXG5cdFx0aWYgKCBhcnIgIT0gbnVsbCApIHtcblx0XHRcdGlmICggaXNBcnJheUxpa2UoIE9iamVjdCggYXJyICkgKSApIHtcblx0XHRcdFx0alF1ZXJ5Lm1lcmdlKCByZXQsXG5cdFx0XHRcdFx0dHlwZW9mIGFyciA9PT0gXCJzdHJpbmdcIiA/XG5cdFx0XHRcdFx0WyBhcnIgXSA6IGFyclxuXHRcdFx0XHQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cHVzaC5jYWxsKCByZXQsIGFyciApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXQ7XG5cdH0sXG5cblx0aW5BcnJheTogZnVuY3Rpb24oIGVsZW0sIGFyciwgaSApIHtcblx0XHR2YXIgbGVuO1xuXG5cdFx0aWYgKCBhcnIgKSB7XG5cdFx0XHRpZiAoIGluZGV4T2YgKSB7XG5cdFx0XHRcdHJldHVybiBpbmRleE9mLmNhbGwoIGFyciwgZWxlbSwgaSApO1xuXHRcdFx0fVxuXG5cdFx0XHRsZW4gPSBhcnIubGVuZ3RoO1xuXHRcdFx0aSA9IGkgPyBpIDwgMCA/IE1hdGgubWF4KCAwLCBsZW4gKyBpICkgOiBpIDogMDtcblxuXHRcdFx0Zm9yICggOyBpIDwgbGVuOyBpKysgKSB7XG5cblx0XHRcdFx0Ly8gU2tpcCBhY2Nlc3NpbmcgaW4gc3BhcnNlIGFycmF5c1xuXHRcdFx0XHRpZiAoIGkgaW4gYXJyICYmIGFyclsgaSBdID09PSBlbGVtICkge1xuXHRcdFx0XHRcdHJldHVybiBpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIC0xO1xuXHR9LFxuXG5cdG1lcmdlOiBmdW5jdGlvbiggZmlyc3QsIHNlY29uZCApIHtcblx0XHR2YXIgbGVuID0gK3NlY29uZC5sZW5ndGgsXG5cdFx0XHRqID0gMCxcblx0XHRcdGkgPSBmaXJzdC5sZW5ndGg7XG5cblx0XHR3aGlsZSAoIGogPCBsZW4gKSB7XG5cdFx0XHRmaXJzdFsgaSsrIF0gPSBzZWNvbmRbIGorKyBdO1xuXHRcdH1cblxuXHRcdC8vIFN1cHBvcnQ6IElFPDlcblx0XHQvLyBXb3JrYXJvdW5kIGNhc3Rpbmcgb2YgLmxlbmd0aCB0byBOYU4gb24gb3RoZXJ3aXNlIGFycmF5bGlrZSBvYmplY3RzIChlLmcuLCBOb2RlTGlzdHMpXG5cdFx0aWYgKCBsZW4gIT09IGxlbiApIHtcblx0XHRcdHdoaWxlICggc2Vjb25kWyBqIF0gIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0Zmlyc3RbIGkrKyBdID0gc2Vjb25kWyBqKysgXTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRmaXJzdC5sZW5ndGggPSBpO1xuXG5cdFx0cmV0dXJuIGZpcnN0O1xuXHR9LFxuXG5cdGdyZXA6IGZ1bmN0aW9uKCBlbGVtcywgY2FsbGJhY2ssIGludmVydCApIHtcblx0XHR2YXIgY2FsbGJhY2tJbnZlcnNlLFxuXHRcdFx0bWF0Y2hlcyA9IFtdLFxuXHRcdFx0aSA9IDAsXG5cdFx0XHRsZW5ndGggPSBlbGVtcy5sZW5ndGgsXG5cdFx0XHRjYWxsYmFja0V4cGVjdCA9ICFpbnZlcnQ7XG5cblx0XHQvLyBHbyB0aHJvdWdoIHRoZSBhcnJheSwgb25seSBzYXZpbmcgdGhlIGl0ZW1zXG5cdFx0Ly8gdGhhdCBwYXNzIHRoZSB2YWxpZGF0b3IgZnVuY3Rpb25cblx0XHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHtcblx0XHRcdGNhbGxiYWNrSW52ZXJzZSA9ICFjYWxsYmFjayggZWxlbXNbIGkgXSwgaSApO1xuXHRcdFx0aWYgKCBjYWxsYmFja0ludmVyc2UgIT09IGNhbGxiYWNrRXhwZWN0ICkge1xuXHRcdFx0XHRtYXRjaGVzLnB1c2goIGVsZW1zWyBpIF0gKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gbWF0Y2hlcztcblx0fSxcblxuXHQvLyBhcmcgaXMgZm9yIGludGVybmFsIHVzYWdlIG9ubHlcblx0bWFwOiBmdW5jdGlvbiggZWxlbXMsIGNhbGxiYWNrLCBhcmcgKSB7XG5cdFx0dmFyIGxlbmd0aCwgdmFsdWUsXG5cdFx0XHRpID0gMCxcblx0XHRcdHJldCA9IFtdO1xuXG5cdFx0Ly8gR28gdGhyb3VnaCB0aGUgYXJyYXksIHRyYW5zbGF0aW5nIGVhY2ggb2YgdGhlIGl0ZW1zIHRvIHRoZWlyIG5ldyB2YWx1ZXNcblx0XHRpZiAoIGlzQXJyYXlMaWtlKCBlbGVtcyApICkge1xuXHRcdFx0bGVuZ3RoID0gZWxlbXMubGVuZ3RoO1xuXHRcdFx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7XG5cdFx0XHRcdHZhbHVlID0gY2FsbGJhY2soIGVsZW1zWyBpIF0sIGksIGFyZyApO1xuXG5cdFx0XHRcdGlmICggdmFsdWUgIT0gbnVsbCApIHtcblx0XHRcdFx0XHRyZXQucHVzaCggdmFsdWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0Ly8gR28gdGhyb3VnaCBldmVyeSBrZXkgb24gdGhlIG9iamVjdCxcblx0XHR9IGVsc2Uge1xuXHRcdFx0Zm9yICggaSBpbiBlbGVtcyApIHtcblx0XHRcdFx0dmFsdWUgPSBjYWxsYmFjayggZWxlbXNbIGkgXSwgaSwgYXJnICk7XG5cblx0XHRcdFx0aWYgKCB2YWx1ZSAhPSBudWxsICkge1xuXHRcdFx0XHRcdHJldC5wdXNoKCB2YWx1ZSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gRmxhdHRlbiBhbnkgbmVzdGVkIGFycmF5c1xuXHRcdHJldHVybiBjb25jYXQuYXBwbHkoIFtdLCByZXQgKTtcblx0fSxcblxuXHQvLyBBIGdsb2JhbCBHVUlEIGNvdW50ZXIgZm9yIG9iamVjdHNcblx0Z3VpZDogMSxcblxuXHQvLyBCaW5kIGEgZnVuY3Rpb24gdG8gYSBjb250ZXh0LCBvcHRpb25hbGx5IHBhcnRpYWxseSBhcHBseWluZyBhbnlcblx0Ly8gYXJndW1lbnRzLlxuXHRwcm94eTogZnVuY3Rpb24oIGZuLCBjb250ZXh0ICkge1xuXHRcdHZhciBhcmdzLCBwcm94eSwgdG1wO1xuXG5cdFx0aWYgKCB0eXBlb2YgY29udGV4dCA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdHRtcCA9IGZuWyBjb250ZXh0IF07XG5cdFx0XHRjb250ZXh0ID0gZm47XG5cdFx0XHRmbiA9IHRtcDtcblx0XHR9XG5cblx0XHQvLyBRdWljayBjaGVjayB0byBkZXRlcm1pbmUgaWYgdGFyZ2V0IGlzIGNhbGxhYmxlLCBpbiB0aGUgc3BlY1xuXHRcdC8vIHRoaXMgdGhyb3dzIGEgVHlwZUVycm9yLCBidXQgd2Ugd2lsbCBqdXN0IHJldHVybiB1bmRlZmluZWQuXG5cdFx0aWYgKCAhalF1ZXJ5LmlzRnVuY3Rpb24oIGZuICkgKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdC8vIFNpbXVsYXRlZCBiaW5kXG5cdFx0YXJncyA9IHNsaWNlLmNhbGwoIGFyZ3VtZW50cywgMiApO1xuXHRcdHByb3h5ID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gZm4uYXBwbHkoIGNvbnRleHQgfHwgdGhpcywgYXJncy5jb25jYXQoIHNsaWNlLmNhbGwoIGFyZ3VtZW50cyApICkgKTtcblx0XHR9O1xuXG5cdFx0Ly8gU2V0IHRoZSBndWlkIG9mIHVuaXF1ZSBoYW5kbGVyIHRvIHRoZSBzYW1lIG9mIG9yaWdpbmFsIGhhbmRsZXIsIHNvIGl0IGNhbiBiZSByZW1vdmVkXG5cdFx0cHJveHkuZ3VpZCA9IGZuLmd1aWQgPSBmbi5ndWlkIHx8IGpRdWVyeS5ndWlkKys7XG5cblx0XHRyZXR1cm4gcHJveHk7XG5cdH0sXG5cblx0bm93OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gKyggbmV3IERhdGUoKSApO1xuXHR9LFxuXG5cdC8vIGpRdWVyeS5zdXBwb3J0IGlzIG5vdCB1c2VkIGluIENvcmUgYnV0IG90aGVyIHByb2plY3RzIGF0dGFjaCB0aGVpclxuXHQvLyBwcm9wZXJ0aWVzIHRvIGl0IHNvIGl0IG5lZWRzIHRvIGV4aXN0LlxuXHRzdXBwb3J0OiBzdXBwb3J0XG59ICk7XG5cbi8vIEpTSGludCB3b3VsZCBlcnJvciBvbiB0aGlzIGNvZGUgZHVlIHRvIHRoZSBTeW1ib2wgbm90IGJlaW5nIGRlZmluZWQgaW4gRVM1LlxuLy8gRGVmaW5pbmcgdGhpcyBnbG9iYWwgaW4gLmpzaGludHJjIHdvdWxkIGNyZWF0ZSBhIGRhbmdlciBvZiB1c2luZyB0aGUgZ2xvYmFsXG4vLyB1bmd1YXJkZWQgaW4gYW5vdGhlciBwbGFjZSwgaXQgc2VlbXMgc2FmZXIgdG8ganVzdCBkaXNhYmxlIEpTSGludCBmb3IgdGhlc2Vcbi8vIHRocmVlIGxpbmVzLlxuLyoganNoaW50IGlnbm9yZTogc3RhcnQgKi9cbmlmICggdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICkge1xuXHRqUXVlcnkuZm5bIFN5bWJvbC5pdGVyYXRvciBdID0gZGVsZXRlZElkc1sgU3ltYm9sLml0ZXJhdG9yIF07XG59XG4vKiBqc2hpbnQgaWdub3JlOiBlbmQgKi9cblxuLy8gUG9wdWxhdGUgdGhlIGNsYXNzMnR5cGUgbWFwXG5qUXVlcnkuZWFjaCggXCJCb29sZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0IEVycm9yIFN5bWJvbFwiLnNwbGl0KCBcIiBcIiApLFxuZnVuY3Rpb24oIGksIG5hbWUgKSB7XG5cdGNsYXNzMnR5cGVbIFwiW29iamVjdCBcIiArIG5hbWUgKyBcIl1cIiBdID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xufSApO1xuXG5mdW5jdGlvbiBpc0FycmF5TGlrZSggb2JqICkge1xuXG5cdC8vIFN1cHBvcnQ6IGlPUyA4LjIgKG5vdCByZXByb2R1Y2libGUgaW4gc2ltdWxhdG9yKVxuXHQvLyBgaW5gIGNoZWNrIHVzZWQgdG8gcHJldmVudCBKSVQgZXJyb3IgKGdoLTIxNDUpXG5cdC8vIGhhc093biBpc24ndCB1c2VkIGhlcmUgZHVlIHRvIGZhbHNlIG5lZ2F0aXZlc1xuXHQvLyByZWdhcmRpbmcgTm9kZWxpc3QgbGVuZ3RoIGluIElFXG5cdHZhciBsZW5ndGggPSAhIW9iaiAmJiBcImxlbmd0aFwiIGluIG9iaiAmJiBvYmoubGVuZ3RoLFxuXHRcdHR5cGUgPSBqUXVlcnkudHlwZSggb2JqICk7XG5cblx0aWYgKCB0eXBlID09PSBcImZ1bmN0aW9uXCIgfHwgalF1ZXJ5LmlzV2luZG93KCBvYmogKSApIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRyZXR1cm4gdHlwZSA9PT0gXCJhcnJheVwiIHx8IGxlbmd0aCA9PT0gMCB8fFxuXHRcdHR5cGVvZiBsZW5ndGggPT09IFwibnVtYmVyXCIgJiYgbGVuZ3RoID4gMCAmJiAoIGxlbmd0aCAtIDEgKSBpbiBvYmo7XG59XG52YXIgU2l6emxlID1cbi8qIVxuICogU2l6emxlIENTUyBTZWxlY3RvciBFbmdpbmUgdjIuMi4xXG4gKiBodHRwOi8vc2l6emxlanMuY29tL1xuICpcbiAqIENvcHlyaWdodCBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcbiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2VcbiAqXG4gKiBEYXRlOiAyMDE1LTEwLTE3XG4gKi9cbihmdW5jdGlvbiggd2luZG93ICkge1xuXG52YXIgaSxcblx0c3VwcG9ydCxcblx0RXhwcixcblx0Z2V0VGV4dCxcblx0aXNYTUwsXG5cdHRva2VuaXplLFxuXHRjb21waWxlLFxuXHRzZWxlY3QsXG5cdG91dGVybW9zdENvbnRleHQsXG5cdHNvcnRJbnB1dCxcblx0aGFzRHVwbGljYXRlLFxuXG5cdC8vIExvY2FsIGRvY3VtZW50IHZhcnNcblx0c2V0RG9jdW1lbnQsXG5cdGRvY3VtZW50LFxuXHRkb2NFbGVtLFxuXHRkb2N1bWVudElzSFRNTCxcblx0cmJ1Z2d5UVNBLFxuXHRyYnVnZ3lNYXRjaGVzLFxuXHRtYXRjaGVzLFxuXHRjb250YWlucyxcblxuXHQvLyBJbnN0YW5jZS1zcGVjaWZpYyBkYXRhXG5cdGV4cGFuZG8gPSBcInNpenpsZVwiICsgMSAqIG5ldyBEYXRlKCksXG5cdHByZWZlcnJlZERvYyA9IHdpbmRvdy5kb2N1bWVudCxcblx0ZGlycnVucyA9IDAsXG5cdGRvbmUgPSAwLFxuXHRjbGFzc0NhY2hlID0gY3JlYXRlQ2FjaGUoKSxcblx0dG9rZW5DYWNoZSA9IGNyZWF0ZUNhY2hlKCksXG5cdGNvbXBpbGVyQ2FjaGUgPSBjcmVhdGVDYWNoZSgpLFxuXHRzb3J0T3JkZXIgPSBmdW5jdGlvbiggYSwgYiApIHtcblx0XHRpZiAoIGEgPT09IGIgKSB7XG5cdFx0XHRoYXNEdXBsaWNhdGUgPSB0cnVlO1xuXHRcdH1cblx0XHRyZXR1cm4gMDtcblx0fSxcblxuXHQvLyBHZW5lcmFsLXB1cnBvc2UgY29uc3RhbnRzXG5cdE1BWF9ORUdBVElWRSA9IDEgPDwgMzEsXG5cblx0Ly8gSW5zdGFuY2UgbWV0aG9kc1xuXHRoYXNPd24gPSAoe30pLmhhc093blByb3BlcnR5LFxuXHRhcnIgPSBbXSxcblx0cG9wID0gYXJyLnBvcCxcblx0cHVzaF9uYXRpdmUgPSBhcnIucHVzaCxcblx0cHVzaCA9IGFyci5wdXNoLFxuXHRzbGljZSA9IGFyci5zbGljZSxcblx0Ly8gVXNlIGEgc3RyaXBwZWQtZG93biBpbmRleE9mIGFzIGl0J3MgZmFzdGVyIHRoYW4gbmF0aXZlXG5cdC8vIGh0dHA6Ly9qc3BlcmYuY29tL3Rob3ItaW5kZXhvZi12cy1mb3IvNVxuXHRpbmRleE9mID0gZnVuY3Rpb24oIGxpc3QsIGVsZW0gKSB7XG5cdFx0dmFyIGkgPSAwLFxuXHRcdFx0bGVuID0gbGlzdC5sZW5ndGg7XG5cdFx0Zm9yICggOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0XHRpZiAoIGxpc3RbaV0gPT09IGVsZW0gKSB7XG5cdFx0XHRcdHJldHVybiBpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gLTE7XG5cdH0sXG5cblx0Ym9vbGVhbnMgPSBcImNoZWNrZWR8c2VsZWN0ZWR8YXN5bmN8YXV0b2ZvY3VzfGF1dG9wbGF5fGNvbnRyb2xzfGRlZmVyfGRpc2FibGVkfGhpZGRlbnxpc21hcHxsb29wfG11bHRpcGxlfG9wZW58cmVhZG9ubHl8cmVxdWlyZWR8c2NvcGVkXCIsXG5cblx0Ly8gUmVndWxhciBleHByZXNzaW9uc1xuXG5cdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtc2VsZWN0b3JzLyN3aGl0ZXNwYWNlXG5cdHdoaXRlc3BhY2UgPSBcIltcXFxceDIwXFxcXHRcXFxcclxcXFxuXFxcXGZdXCIsXG5cblx0Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvQ1NTMjEvc3luZGF0YS5odG1sI3ZhbHVlLWRlZi1pZGVudGlmaWVyXG5cdGlkZW50aWZpZXIgPSBcIig/OlxcXFxcXFxcLnxbXFxcXHctXXxbXlxcXFx4MDAtXFxcXHhhMF0pK1wiLFxuXG5cdC8vIEF0dHJpYnV0ZSBzZWxlY3RvcnM6IGh0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9ycy8jYXR0cmlidXRlLXNlbGVjdG9yc1xuXHRhdHRyaWJ1dGVzID0gXCJcXFxcW1wiICsgd2hpdGVzcGFjZSArIFwiKihcIiArIGlkZW50aWZpZXIgKyBcIikoPzpcIiArIHdoaXRlc3BhY2UgK1xuXHRcdC8vIE9wZXJhdG9yIChjYXB0dXJlIDIpXG5cdFx0XCIqKFsqXiR8IX5dPz0pXCIgKyB3aGl0ZXNwYWNlICtcblx0XHQvLyBcIkF0dHJpYnV0ZSB2YWx1ZXMgbXVzdCBiZSBDU1MgaWRlbnRpZmllcnMgW2NhcHR1cmUgNV0gb3Igc3RyaW5ncyBbY2FwdHVyZSAzIG9yIGNhcHR1cmUgNF1cIlxuXHRcdFwiKig/OicoKD86XFxcXFxcXFwufFteXFxcXFxcXFwnXSkqKSd8XFxcIigoPzpcXFxcXFxcXC58W15cXFxcXFxcXFxcXCJdKSopXFxcInwoXCIgKyBpZGVudGlmaWVyICsgXCIpKXwpXCIgKyB3aGl0ZXNwYWNlICtcblx0XHRcIipcXFxcXVwiLFxuXG5cdHBzZXVkb3MgPSBcIjooXCIgKyBpZGVudGlmaWVyICsgXCIpKD86XFxcXCgoXCIgK1xuXHRcdC8vIFRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIHNlbGVjdG9ycyBuZWVkaW5nIHRva2VuaXplIGluIHRoZSBwcmVGaWx0ZXIsIHByZWZlciBhcmd1bWVudHM6XG5cdFx0Ly8gMS4gcXVvdGVkIChjYXB0dXJlIDM7IGNhcHR1cmUgNCBvciBjYXB0dXJlIDUpXG5cdFx0XCIoJygoPzpcXFxcXFxcXC58W15cXFxcXFxcXCddKSopJ3xcXFwiKCg/OlxcXFxcXFxcLnxbXlxcXFxcXFxcXFxcIl0pKilcXFwiKXxcIiArXG5cdFx0Ly8gMi4gc2ltcGxlIChjYXB0dXJlIDYpXG5cdFx0XCIoKD86XFxcXFxcXFwufFteXFxcXFxcXFwoKVtcXFxcXV18XCIgKyBhdHRyaWJ1dGVzICsgXCIpKil8XCIgK1xuXHRcdC8vIDMuIGFueXRoaW5nIGVsc2UgKGNhcHR1cmUgMilcblx0XHRcIi4qXCIgK1xuXHRcdFwiKVxcXFwpfClcIixcblxuXHQvLyBMZWFkaW5nIGFuZCBub24tZXNjYXBlZCB0cmFpbGluZyB3aGl0ZXNwYWNlLCBjYXB0dXJpbmcgc29tZSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXJzIHByZWNlZGluZyB0aGUgbGF0dGVyXG5cdHJ3aGl0ZXNwYWNlID0gbmV3IFJlZ0V4cCggd2hpdGVzcGFjZSArIFwiK1wiLCBcImdcIiApLFxuXHRydHJpbSA9IG5ldyBSZWdFeHAoIFwiXlwiICsgd2hpdGVzcGFjZSArIFwiK3woKD86XnxbXlxcXFxcXFxcXSkoPzpcXFxcXFxcXC4pKilcIiArIHdoaXRlc3BhY2UgKyBcIiskXCIsIFwiZ1wiICksXG5cblx0cmNvbW1hID0gbmV3IFJlZ0V4cCggXCJeXCIgKyB3aGl0ZXNwYWNlICsgXCIqLFwiICsgd2hpdGVzcGFjZSArIFwiKlwiICksXG5cdHJjb21iaW5hdG9ycyA9IG5ldyBSZWdFeHAoIFwiXlwiICsgd2hpdGVzcGFjZSArIFwiKihbPit+XXxcIiArIHdoaXRlc3BhY2UgKyBcIilcIiArIHdoaXRlc3BhY2UgKyBcIipcIiApLFxuXG5cdHJhdHRyaWJ1dGVRdW90ZXMgPSBuZXcgUmVnRXhwKCBcIj1cIiArIHdoaXRlc3BhY2UgKyBcIiooW15cXFxcXSdcXFwiXSo/KVwiICsgd2hpdGVzcGFjZSArIFwiKlxcXFxdXCIsIFwiZ1wiICksXG5cblx0cnBzZXVkbyA9IG5ldyBSZWdFeHAoIHBzZXVkb3MgKSxcblx0cmlkZW50aWZpZXIgPSBuZXcgUmVnRXhwKCBcIl5cIiArIGlkZW50aWZpZXIgKyBcIiRcIiApLFxuXG5cdG1hdGNoRXhwciA9IHtcblx0XHRcIklEXCI6IG5ldyBSZWdFeHAoIFwiXiMoXCIgKyBpZGVudGlmaWVyICsgXCIpXCIgKSxcblx0XHRcIkNMQVNTXCI6IG5ldyBSZWdFeHAoIFwiXlxcXFwuKFwiICsgaWRlbnRpZmllciArIFwiKVwiICksXG5cdFx0XCJUQUdcIjogbmV3IFJlZ0V4cCggXCJeKFwiICsgaWRlbnRpZmllciArIFwifFsqXSlcIiApLFxuXHRcdFwiQVRUUlwiOiBuZXcgUmVnRXhwKCBcIl5cIiArIGF0dHJpYnV0ZXMgKSxcblx0XHRcIlBTRVVET1wiOiBuZXcgUmVnRXhwKCBcIl5cIiArIHBzZXVkb3MgKSxcblx0XHRcIkNISUxEXCI6IG5ldyBSZWdFeHAoIFwiXjoob25seXxmaXJzdHxsYXN0fG50aHxudGgtbGFzdCktKGNoaWxkfG9mLXR5cGUpKD86XFxcXChcIiArIHdoaXRlc3BhY2UgK1xuXHRcdFx0XCIqKGV2ZW58b2RkfCgoWystXXwpKFxcXFxkKilufClcIiArIHdoaXRlc3BhY2UgKyBcIiooPzooWystXXwpXCIgKyB3aGl0ZXNwYWNlICtcblx0XHRcdFwiKihcXFxcZCspfCkpXCIgKyB3aGl0ZXNwYWNlICsgXCIqXFxcXCl8KVwiLCBcImlcIiApLFxuXHRcdFwiYm9vbFwiOiBuZXcgUmVnRXhwKCBcIl4oPzpcIiArIGJvb2xlYW5zICsgXCIpJFwiLCBcImlcIiApLFxuXHRcdC8vIEZvciB1c2UgaW4gbGlicmFyaWVzIGltcGxlbWVudGluZyAuaXMoKVxuXHRcdC8vIFdlIHVzZSB0aGlzIGZvciBQT1MgbWF0Y2hpbmcgaW4gYHNlbGVjdGBcblx0XHRcIm5lZWRzQ29udGV4dFwiOiBuZXcgUmVnRXhwKCBcIl5cIiArIHdoaXRlc3BhY2UgKyBcIipbPit+XXw6KGV2ZW58b2RkfGVxfGd0fGx0fG50aHxmaXJzdHxsYXN0KSg/OlxcXFwoXCIgK1xuXHRcdFx0d2hpdGVzcGFjZSArIFwiKigoPzotXFxcXGQpP1xcXFxkKilcIiArIHdoaXRlc3BhY2UgKyBcIipcXFxcKXwpKD89W14tXXwkKVwiLCBcImlcIiApXG5cdH0sXG5cblx0cmlucHV0cyA9IC9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbikkL2ksXG5cdHJoZWFkZXIgPSAvXmhcXGQkL2ksXG5cblx0cm5hdGl2ZSA9IC9eW157XStcXHtcXHMqXFxbbmF0aXZlIFxcdy8sXG5cblx0Ly8gRWFzaWx5LXBhcnNlYWJsZS9yZXRyaWV2YWJsZSBJRCBvciBUQUcgb3IgQ0xBU1Mgc2VsZWN0b3JzXG5cdHJxdWlja0V4cHIgPSAvXig/OiMoW1xcdy1dKyl8KFxcdyspfFxcLihbXFx3LV0rKSkkLyxcblxuXHRyc2libGluZyA9IC9bK35dLyxcblx0cmVzY2FwZSA9IC8nfFxcXFwvZyxcblxuXHQvLyBDU1MgZXNjYXBlcyBodHRwOi8vd3d3LnczLm9yZy9UUi9DU1MyMS9zeW5kYXRhLmh0bWwjZXNjYXBlZC1jaGFyYWN0ZXJzXG5cdHJ1bmVzY2FwZSA9IG5ldyBSZWdFeHAoIFwiXFxcXFxcXFwoW1xcXFxkYS1mXXsxLDZ9XCIgKyB3aGl0ZXNwYWNlICsgXCI/fChcIiArIHdoaXRlc3BhY2UgKyBcIil8LilcIiwgXCJpZ1wiICksXG5cdGZ1bmVzY2FwZSA9IGZ1bmN0aW9uKCBfLCBlc2NhcGVkLCBlc2NhcGVkV2hpdGVzcGFjZSApIHtcblx0XHR2YXIgaGlnaCA9IFwiMHhcIiArIGVzY2FwZWQgLSAweDEwMDAwO1xuXHRcdC8vIE5hTiBtZWFucyBub24tY29kZXBvaW50XG5cdFx0Ly8gU3VwcG9ydDogRmlyZWZveDwyNFxuXHRcdC8vIFdvcmthcm91bmQgZXJyb25lb3VzIG51bWVyaWMgaW50ZXJwcmV0YXRpb24gb2YgK1wiMHhcIlxuXHRcdHJldHVybiBoaWdoICE9PSBoaWdoIHx8IGVzY2FwZWRXaGl0ZXNwYWNlID9cblx0XHRcdGVzY2FwZWQgOlxuXHRcdFx0aGlnaCA8IDAgP1xuXHRcdFx0XHQvLyBCTVAgY29kZXBvaW50XG5cdFx0XHRcdFN0cmluZy5mcm9tQ2hhckNvZGUoIGhpZ2ggKyAweDEwMDAwICkgOlxuXHRcdFx0XHQvLyBTdXBwbGVtZW50YWwgUGxhbmUgY29kZXBvaW50IChzdXJyb2dhdGUgcGFpcilcblx0XHRcdFx0U3RyaW5nLmZyb21DaGFyQ29kZSggaGlnaCA+PiAxMCB8IDB4RDgwMCwgaGlnaCAmIDB4M0ZGIHwgMHhEQzAwICk7XG5cdH0sXG5cblx0Ly8gVXNlZCBmb3IgaWZyYW1lc1xuXHQvLyBTZWUgc2V0RG9jdW1lbnQoKVxuXHQvLyBSZW1vdmluZyB0aGUgZnVuY3Rpb24gd3JhcHBlciBjYXVzZXMgYSBcIlBlcm1pc3Npb24gRGVuaWVkXCJcblx0Ly8gZXJyb3IgaW4gSUVcblx0dW5sb2FkSGFuZGxlciA9IGZ1bmN0aW9uKCkge1xuXHRcdHNldERvY3VtZW50KCk7XG5cdH07XG5cbi8vIE9wdGltaXplIGZvciBwdXNoLmFwcGx5KCBfLCBOb2RlTGlzdCApXG50cnkge1xuXHRwdXNoLmFwcGx5KFxuXHRcdChhcnIgPSBzbGljZS5jYWxsKCBwcmVmZXJyZWREb2MuY2hpbGROb2RlcyApKSxcblx0XHRwcmVmZXJyZWREb2MuY2hpbGROb2Rlc1xuXHQpO1xuXHQvLyBTdXBwb3J0OiBBbmRyb2lkPDQuMFxuXHQvLyBEZXRlY3Qgc2lsZW50bHkgZmFpbGluZyBwdXNoLmFwcGx5XG5cdGFyclsgcHJlZmVycmVkRG9jLmNoaWxkTm9kZXMubGVuZ3RoIF0ubm9kZVR5cGU7XG59IGNhdGNoICggZSApIHtcblx0cHVzaCA9IHsgYXBwbHk6IGFyci5sZW5ndGggP1xuXG5cdFx0Ly8gTGV2ZXJhZ2Ugc2xpY2UgaWYgcG9zc2libGVcblx0XHRmdW5jdGlvbiggdGFyZ2V0LCBlbHMgKSB7XG5cdFx0XHRwdXNoX25hdGl2ZS5hcHBseSggdGFyZ2V0LCBzbGljZS5jYWxsKGVscykgKTtcblx0XHR9IDpcblxuXHRcdC8vIFN1cHBvcnQ6IElFPDlcblx0XHQvLyBPdGhlcndpc2UgYXBwZW5kIGRpcmVjdGx5XG5cdFx0ZnVuY3Rpb24oIHRhcmdldCwgZWxzICkge1xuXHRcdFx0dmFyIGogPSB0YXJnZXQubGVuZ3RoLFxuXHRcdFx0XHRpID0gMDtcblx0XHRcdC8vIENhbid0IHRydXN0IE5vZGVMaXN0Lmxlbmd0aFxuXHRcdFx0d2hpbGUgKCAodGFyZ2V0W2orK10gPSBlbHNbaSsrXSkgKSB7fVxuXHRcdFx0dGFyZ2V0Lmxlbmd0aCA9IGogLSAxO1xuXHRcdH1cblx0fTtcbn1cblxuZnVuY3Rpb24gU2l6emxlKCBzZWxlY3RvciwgY29udGV4dCwgcmVzdWx0cywgc2VlZCApIHtcblx0dmFyIG0sIGksIGVsZW0sIG5pZCwgbmlkc2VsZWN0LCBtYXRjaCwgZ3JvdXBzLCBuZXdTZWxlY3Rvcixcblx0XHRuZXdDb250ZXh0ID0gY29udGV4dCAmJiBjb250ZXh0Lm93bmVyRG9jdW1lbnQsXG5cblx0XHQvLyBub2RlVHlwZSBkZWZhdWx0cyB0byA5LCBzaW5jZSBjb250ZXh0IGRlZmF1bHRzIHRvIGRvY3VtZW50XG5cdFx0bm9kZVR5cGUgPSBjb250ZXh0ID8gY29udGV4dC5ub2RlVHlwZSA6IDk7XG5cblx0cmVzdWx0cyA9IHJlc3VsdHMgfHwgW107XG5cblx0Ly8gUmV0dXJuIGVhcmx5IGZyb20gY2FsbHMgd2l0aCBpbnZhbGlkIHNlbGVjdG9yIG9yIGNvbnRleHRcblx0aWYgKCB0eXBlb2Ygc2VsZWN0b3IgIT09IFwic3RyaW5nXCIgfHwgIXNlbGVjdG9yIHx8XG5cdFx0bm9kZVR5cGUgIT09IDEgJiYgbm9kZVR5cGUgIT09IDkgJiYgbm9kZVR5cGUgIT09IDExICkge1xuXG5cdFx0cmV0dXJuIHJlc3VsdHM7XG5cdH1cblxuXHQvLyBUcnkgdG8gc2hvcnRjdXQgZmluZCBvcGVyYXRpb25zIChhcyBvcHBvc2VkIHRvIGZpbHRlcnMpIGluIEhUTUwgZG9jdW1lbnRzXG5cdGlmICggIXNlZWQgKSB7XG5cblx0XHRpZiAoICggY29udGV4dCA/IGNvbnRleHQub3duZXJEb2N1bWVudCB8fCBjb250ZXh0IDogcHJlZmVycmVkRG9jICkgIT09IGRvY3VtZW50ICkge1xuXHRcdFx0c2V0RG9jdW1lbnQoIGNvbnRleHQgKTtcblx0XHR9XG5cdFx0Y29udGV4dCA9IGNvbnRleHQgfHwgZG9jdW1lbnQ7XG5cblx0XHRpZiAoIGRvY3VtZW50SXNIVE1MICkge1xuXG5cdFx0XHQvLyBJZiB0aGUgc2VsZWN0b3IgaXMgc3VmZmljaWVudGx5IHNpbXBsZSwgdHJ5IHVzaW5nIGEgXCJnZXQqQnkqXCIgRE9NIG1ldGhvZFxuXHRcdFx0Ly8gKGV4Y2VwdGluZyBEb2N1bWVudEZyYWdtZW50IGNvbnRleHQsIHdoZXJlIHRoZSBtZXRob2RzIGRvbid0IGV4aXN0KVxuXHRcdFx0aWYgKCBub2RlVHlwZSAhPT0gMTEgJiYgKG1hdGNoID0gcnF1aWNrRXhwci5leGVjKCBzZWxlY3RvciApKSApIHtcblxuXHRcdFx0XHQvLyBJRCBzZWxlY3RvclxuXHRcdFx0XHRpZiAoIChtID0gbWF0Y2hbMV0pICkge1xuXG5cdFx0XHRcdFx0Ly8gRG9jdW1lbnQgY29udGV4dFxuXHRcdFx0XHRcdGlmICggbm9kZVR5cGUgPT09IDkgKSB7XG5cdFx0XHRcdFx0XHRpZiAoIChlbGVtID0gY29udGV4dC5nZXRFbGVtZW50QnlJZCggbSApKSApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSwgT3BlcmEsIFdlYmtpdFxuXHRcdFx0XHRcdFx0XHQvLyBUT0RPOiBpZGVudGlmeSB2ZXJzaW9uc1xuXHRcdFx0XHRcdFx0XHQvLyBnZXRFbGVtZW50QnlJZCBjYW4gbWF0Y2ggZWxlbWVudHMgYnkgbmFtZSBpbnN0ZWFkIG9mIElEXG5cdFx0XHRcdFx0XHRcdGlmICggZWxlbS5pZCA9PT0gbSApIHtcblx0XHRcdFx0XHRcdFx0XHRyZXN1bHRzLnB1c2goIGVsZW0gKTtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBFbGVtZW50IGNvbnRleHRcblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSwgT3BlcmEsIFdlYmtpdFxuXHRcdFx0XHRcdFx0Ly8gVE9ETzogaWRlbnRpZnkgdmVyc2lvbnNcblx0XHRcdFx0XHRcdC8vIGdldEVsZW1lbnRCeUlkIGNhbiBtYXRjaCBlbGVtZW50cyBieSBuYW1lIGluc3RlYWQgb2YgSURcblx0XHRcdFx0XHRcdGlmICggbmV3Q29udGV4dCAmJiAoZWxlbSA9IG5ld0NvbnRleHQuZ2V0RWxlbWVudEJ5SWQoIG0gKSkgJiZcblx0XHRcdFx0XHRcdFx0Y29udGFpbnMoIGNvbnRleHQsIGVsZW0gKSAmJlxuXHRcdFx0XHRcdFx0XHRlbGVtLmlkID09PSBtICkge1xuXG5cdFx0XHRcdFx0XHRcdHJlc3VsdHMucHVzaCggZWxlbSApO1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gVHlwZSBzZWxlY3RvclxuXHRcdFx0XHR9IGVsc2UgaWYgKCBtYXRjaFsyXSApIHtcblx0XHRcdFx0XHRwdXNoLmFwcGx5KCByZXN1bHRzLCBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCBzZWxlY3RvciApICk7XG5cdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cblx0XHRcdFx0Ly8gQ2xhc3Mgc2VsZWN0b3Jcblx0XHRcdFx0fSBlbHNlIGlmICggKG0gPSBtYXRjaFszXSkgJiYgc3VwcG9ydC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICYmXG5cdFx0XHRcdFx0Y29udGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICkge1xuXG5cdFx0XHRcdFx0cHVzaC5hcHBseSggcmVzdWx0cywgY29udGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCBtICkgKTtcblx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBUYWtlIGFkdmFudGFnZSBvZiBxdWVyeVNlbGVjdG9yQWxsXG5cdFx0XHRpZiAoIHN1cHBvcnQucXNhICYmXG5cdFx0XHRcdCFjb21waWxlckNhY2hlWyBzZWxlY3RvciArIFwiIFwiIF0gJiZcblx0XHRcdFx0KCFyYnVnZ3lRU0EgfHwgIXJidWdneVFTQS50ZXN0KCBzZWxlY3RvciApKSApIHtcblxuXHRcdFx0XHRpZiAoIG5vZGVUeXBlICE9PSAxICkge1xuXHRcdFx0XHRcdG5ld0NvbnRleHQgPSBjb250ZXh0O1xuXHRcdFx0XHRcdG5ld1NlbGVjdG9yID0gc2VsZWN0b3I7XG5cblx0XHRcdFx0Ly8gcVNBIGxvb2tzIG91dHNpZGUgRWxlbWVudCBjb250ZXh0LCB3aGljaCBpcyBub3Qgd2hhdCB3ZSB3YW50XG5cdFx0XHRcdC8vIFRoYW5rcyB0byBBbmRyZXcgRHVwb250IGZvciB0aGlzIHdvcmthcm91bmQgdGVjaG5pcXVlXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw9OFxuXHRcdFx0XHQvLyBFeGNsdWRlIG9iamVjdCBlbGVtZW50c1xuXHRcdFx0XHR9IGVsc2UgaWYgKCBjb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgIT09IFwib2JqZWN0XCIgKSB7XG5cblx0XHRcdFx0XHQvLyBDYXB0dXJlIHRoZSBjb250ZXh0IElELCBzZXR0aW5nIGl0IGZpcnN0IGlmIG5lY2Vzc2FyeVxuXHRcdFx0XHRcdGlmICggKG5pZCA9IGNvbnRleHQuZ2V0QXR0cmlidXRlKCBcImlkXCIgKSkgKSB7XG5cdFx0XHRcdFx0XHRuaWQgPSBuaWQucmVwbGFjZSggcmVzY2FwZSwgXCJcXFxcJCZcIiApO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRjb250ZXh0LnNldEF0dHJpYnV0ZSggXCJpZFwiLCAobmlkID0gZXhwYW5kbykgKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBQcmVmaXggZXZlcnkgc2VsZWN0b3IgaW4gdGhlIGxpc3Rcblx0XHRcdFx0XHRncm91cHMgPSB0b2tlbml6ZSggc2VsZWN0b3IgKTtcblx0XHRcdFx0XHRpID0gZ3JvdXBzLmxlbmd0aDtcblx0XHRcdFx0XHRuaWRzZWxlY3QgPSByaWRlbnRpZmllci50ZXN0KCBuaWQgKSA/IFwiI1wiICsgbmlkIDogXCJbaWQ9J1wiICsgbmlkICsgXCInXVwiO1xuXHRcdFx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRcdFx0Z3JvdXBzW2ldID0gbmlkc2VsZWN0ICsgXCIgXCIgKyB0b1NlbGVjdG9yKCBncm91cHNbaV0gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0bmV3U2VsZWN0b3IgPSBncm91cHMuam9pbiggXCIsXCIgKTtcblxuXHRcdFx0XHRcdC8vIEV4cGFuZCBjb250ZXh0IGZvciBzaWJsaW5nIHNlbGVjdG9yc1xuXHRcdFx0XHRcdG5ld0NvbnRleHQgPSByc2libGluZy50ZXN0KCBzZWxlY3RvciApICYmIHRlc3RDb250ZXh0KCBjb250ZXh0LnBhcmVudE5vZGUgKSB8fFxuXHRcdFx0XHRcdFx0Y29udGV4dDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggbmV3U2VsZWN0b3IgKSB7XG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsXG5cdFx0XHRcdFx0XHRcdG5ld0NvbnRleHQucXVlcnlTZWxlY3RvckFsbCggbmV3U2VsZWN0b3IgKVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdFx0XHRcdH0gY2F0Y2ggKCBxc2FFcnJvciApIHtcblx0XHRcdFx0XHR9IGZpbmFsbHkge1xuXHRcdFx0XHRcdFx0aWYgKCBuaWQgPT09IGV4cGFuZG8gKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnRleHQucmVtb3ZlQXR0cmlidXRlKCBcImlkXCIgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBBbGwgb3RoZXJzXG5cdHJldHVybiBzZWxlY3QoIHNlbGVjdG9yLnJlcGxhY2UoIHJ0cmltLCBcIiQxXCIgKSwgY29udGV4dCwgcmVzdWx0cywgc2VlZCApO1xufVxuXG4vKipcbiAqIENyZWF0ZSBrZXktdmFsdWUgY2FjaGVzIG9mIGxpbWl0ZWQgc2l6ZVxuICogQHJldHVybnMge2Z1bmN0aW9uKHN0cmluZywgb2JqZWN0KX0gUmV0dXJucyB0aGUgT2JqZWN0IGRhdGEgYWZ0ZXIgc3RvcmluZyBpdCBvbiBpdHNlbGYgd2l0aFxuICpcdHByb3BlcnR5IG5hbWUgdGhlIChzcGFjZS1zdWZmaXhlZCkgc3RyaW5nIGFuZCAoaWYgdGhlIGNhY2hlIGlzIGxhcmdlciB0aGFuIEV4cHIuY2FjaGVMZW5ndGgpXG4gKlx0ZGVsZXRpbmcgdGhlIG9sZGVzdCBlbnRyeVxuICovXG5mdW5jdGlvbiBjcmVhdGVDYWNoZSgpIHtcblx0dmFyIGtleXMgPSBbXTtcblxuXHRmdW5jdGlvbiBjYWNoZSgga2V5LCB2YWx1ZSApIHtcblx0XHQvLyBVc2UgKGtleSArIFwiIFwiKSB0byBhdm9pZCBjb2xsaXNpb24gd2l0aCBuYXRpdmUgcHJvdG90eXBlIHByb3BlcnRpZXMgKHNlZSBJc3N1ZSAjMTU3KVxuXHRcdGlmICgga2V5cy5wdXNoKCBrZXkgKyBcIiBcIiApID4gRXhwci5jYWNoZUxlbmd0aCApIHtcblx0XHRcdC8vIE9ubHkga2VlcCB0aGUgbW9zdCByZWNlbnQgZW50cmllc1xuXHRcdFx0ZGVsZXRlIGNhY2hlWyBrZXlzLnNoaWZ0KCkgXTtcblx0XHR9XG5cdFx0cmV0dXJuIChjYWNoZVsga2V5ICsgXCIgXCIgXSA9IHZhbHVlKTtcblx0fVxuXHRyZXR1cm4gY2FjaGU7XG59XG5cbi8qKlxuICogTWFyayBhIGZ1bmN0aW9uIGZvciBzcGVjaWFsIHVzZSBieSBTaXp6bGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBtYXJrXG4gKi9cbmZ1bmN0aW9uIG1hcmtGdW5jdGlvbiggZm4gKSB7XG5cdGZuWyBleHBhbmRvIF0gPSB0cnVlO1xuXHRyZXR1cm4gZm47XG59XG5cbi8qKlxuICogU3VwcG9ydCB0ZXN0aW5nIHVzaW5nIGFuIGVsZW1lbnRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFBhc3NlZCB0aGUgY3JlYXRlZCBkaXYgYW5kIGV4cGVjdHMgYSBib29sZWFuIHJlc3VsdFxuICovXG5mdW5jdGlvbiBhc3NlcnQoIGZuICkge1xuXHR2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblxuXHR0cnkge1xuXHRcdHJldHVybiAhIWZuKCBkaXYgKTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fSBmaW5hbGx5IHtcblx0XHQvLyBSZW1vdmUgZnJvbSBpdHMgcGFyZW50IGJ5IGRlZmF1bHRcblx0XHRpZiAoIGRpdi5wYXJlbnROb2RlICkge1xuXHRcdFx0ZGl2LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIGRpdiApO1xuXHRcdH1cblx0XHQvLyByZWxlYXNlIG1lbW9yeSBpbiBJRVxuXHRcdGRpdiA9IG51bGw7XG5cdH1cbn1cblxuLyoqXG4gKiBBZGRzIHRoZSBzYW1lIGhhbmRsZXIgZm9yIGFsbCBvZiB0aGUgc3BlY2lmaWVkIGF0dHJzXG4gKiBAcGFyYW0ge1N0cmluZ30gYXR0cnMgUGlwZS1zZXBhcmF0ZWQgbGlzdCBvZiBhdHRyaWJ1dGVzXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBoYW5kbGVyIFRoZSBtZXRob2QgdGhhdCB3aWxsIGJlIGFwcGxpZWRcbiAqL1xuZnVuY3Rpb24gYWRkSGFuZGxlKCBhdHRycywgaGFuZGxlciApIHtcblx0dmFyIGFyciA9IGF0dHJzLnNwbGl0KFwifFwiKSxcblx0XHRpID0gYXJyLmxlbmd0aDtcblxuXHR3aGlsZSAoIGktLSApIHtcblx0XHRFeHByLmF0dHJIYW5kbGVbIGFycltpXSBdID0gaGFuZGxlcjtcblx0fVxufVxuXG4vKipcbiAqIENoZWNrcyBkb2N1bWVudCBvcmRlciBvZiB0d28gc2libGluZ3NcbiAqIEBwYXJhbSB7RWxlbWVudH0gYVxuICogQHBhcmFtIHtFbGVtZW50fSBiXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBSZXR1cm5zIGxlc3MgdGhhbiAwIGlmIGEgcHJlY2VkZXMgYiwgZ3JlYXRlciB0aGFuIDAgaWYgYSBmb2xsb3dzIGJcbiAqL1xuZnVuY3Rpb24gc2libGluZ0NoZWNrKCBhLCBiICkge1xuXHR2YXIgY3VyID0gYiAmJiBhLFxuXHRcdGRpZmYgPSBjdXIgJiYgYS5ub2RlVHlwZSA9PT0gMSAmJiBiLm5vZGVUeXBlID09PSAxICYmXG5cdFx0XHQoIH5iLnNvdXJjZUluZGV4IHx8IE1BWF9ORUdBVElWRSApIC1cblx0XHRcdCggfmEuc291cmNlSW5kZXggfHwgTUFYX05FR0FUSVZFICk7XG5cblx0Ly8gVXNlIElFIHNvdXJjZUluZGV4IGlmIGF2YWlsYWJsZSBvbiBib3RoIG5vZGVzXG5cdGlmICggZGlmZiApIHtcblx0XHRyZXR1cm4gZGlmZjtcblx0fVxuXG5cdC8vIENoZWNrIGlmIGIgZm9sbG93cyBhXG5cdGlmICggY3VyICkge1xuXHRcdHdoaWxlICggKGN1ciA9IGN1ci5uZXh0U2libGluZykgKSB7XG5cdFx0XHRpZiAoIGN1ciA9PT0gYiApIHtcblx0XHRcdFx0cmV0dXJuIC0xO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiBhID8gMSA6IC0xO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiB0byB1c2UgaW4gcHNldWRvcyBmb3IgaW5wdXQgdHlwZXNcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUlucHV0UHNldWRvKCB0eXBlICkge1xuXHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0dmFyIG5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cdFx0cmV0dXJuIG5hbWUgPT09IFwiaW5wdXRcIiAmJiBlbGVtLnR5cGUgPT09IHR5cGU7XG5cdH07XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVzZSBpbiBwc2V1ZG9zIGZvciBidXR0b25zXG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZVxuICovXG5mdW5jdGlvbiBjcmVhdGVCdXR0b25Qc2V1ZG8oIHR5cGUgKSB7XG5cdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHR2YXIgbmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblx0XHRyZXR1cm4gKG5hbWUgPT09IFwiaW5wdXRcIiB8fCBuYW1lID09PSBcImJ1dHRvblwiKSAmJiBlbGVtLnR5cGUgPT09IHR5cGU7XG5cdH07XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVzZSBpbiBwc2V1ZG9zIGZvciBwb3NpdGlvbmFsc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlUG9zaXRpb25hbFBzZXVkbyggZm4gKSB7XG5cdHJldHVybiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIGFyZ3VtZW50ICkge1xuXHRcdGFyZ3VtZW50ID0gK2FyZ3VtZW50O1xuXHRcdHJldHVybiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQsIG1hdGNoZXMgKSB7XG5cdFx0XHR2YXIgaixcblx0XHRcdFx0bWF0Y2hJbmRleGVzID0gZm4oIFtdLCBzZWVkLmxlbmd0aCwgYXJndW1lbnQgKSxcblx0XHRcdFx0aSA9IG1hdGNoSW5kZXhlcy5sZW5ndGg7XG5cblx0XHRcdC8vIE1hdGNoIGVsZW1lbnRzIGZvdW5kIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXhlc1xuXHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdGlmICggc2VlZFsgKGogPSBtYXRjaEluZGV4ZXNbaV0pIF0gKSB7XG5cdFx0XHRcdFx0c2VlZFtqXSA9ICEobWF0Y2hlc1tqXSA9IHNlZWRbal0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH0pO1xufVxuXG4vKipcbiAqIENoZWNrcyBhIG5vZGUgZm9yIHZhbGlkaXR5IGFzIGEgU2l6emxlIGNvbnRleHRcbiAqIEBwYXJhbSB7RWxlbWVudHxPYmplY3Q9fSBjb250ZXh0XG4gKiBAcmV0dXJucyB7RWxlbWVudHxPYmplY3R8Qm9vbGVhbn0gVGhlIGlucHV0IG5vZGUgaWYgYWNjZXB0YWJsZSwgb3RoZXJ3aXNlIGEgZmFsc3kgdmFsdWVcbiAqL1xuZnVuY3Rpb24gdGVzdENvbnRleHQoIGNvbnRleHQgKSB7XG5cdHJldHVybiBjb250ZXh0ICYmIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lICE9PSBcInVuZGVmaW5lZFwiICYmIGNvbnRleHQ7XG59XG5cbi8vIEV4cG9zZSBzdXBwb3J0IHZhcnMgZm9yIGNvbnZlbmllbmNlXG5zdXBwb3J0ID0gU2l6emxlLnN1cHBvcnQgPSB7fTtcblxuLyoqXG4gKiBEZXRlY3RzIFhNTCBub2Rlc1xuICogQHBhcmFtIHtFbGVtZW50fE9iamVjdH0gZWxlbSBBbiBlbGVtZW50IG9yIGEgZG9jdW1lbnRcbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmZiBlbGVtIGlzIGEgbm9uLUhUTUwgWE1MIG5vZGVcbiAqL1xuaXNYTUwgPSBTaXp6bGUuaXNYTUwgPSBmdW5jdGlvbiggZWxlbSApIHtcblx0Ly8gZG9jdW1lbnRFbGVtZW50IGlzIHZlcmlmaWVkIGZvciBjYXNlcyB3aGVyZSBpdCBkb2Vzbid0IHlldCBleGlzdFxuXHQvLyAoc3VjaCBhcyBsb2FkaW5nIGlmcmFtZXMgaW4gSUUgLSAjNDgzMylcblx0dmFyIGRvY3VtZW50RWxlbWVudCA9IGVsZW0gJiYgKGVsZW0ub3duZXJEb2N1bWVudCB8fCBlbGVtKS5kb2N1bWVudEVsZW1lbnQ7XG5cdHJldHVybiBkb2N1bWVudEVsZW1lbnQgPyBkb2N1bWVudEVsZW1lbnQubm9kZU5hbWUgIT09IFwiSFRNTFwiIDogZmFsc2U7XG59O1xuXG4vKipcbiAqIFNldHMgZG9jdW1lbnQtcmVsYXRlZCB2YXJpYWJsZXMgb25jZSBiYXNlZCBvbiB0aGUgY3VycmVudCBkb2N1bWVudFxuICogQHBhcmFtIHtFbGVtZW50fE9iamVjdH0gW2RvY10gQW4gZWxlbWVudCBvciBkb2N1bWVudCBvYmplY3QgdG8gdXNlIHRvIHNldCB0aGUgZG9jdW1lbnRcbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGN1cnJlbnQgZG9jdW1lbnRcbiAqL1xuc2V0RG9jdW1lbnQgPSBTaXp6bGUuc2V0RG9jdW1lbnQgPSBmdW5jdGlvbiggbm9kZSApIHtcblx0dmFyIGhhc0NvbXBhcmUsIHBhcmVudCxcblx0XHRkb2MgPSBub2RlID8gbm9kZS5vd25lckRvY3VtZW50IHx8IG5vZGUgOiBwcmVmZXJyZWREb2M7XG5cblx0Ly8gUmV0dXJuIGVhcmx5IGlmIGRvYyBpcyBpbnZhbGlkIG9yIGFscmVhZHkgc2VsZWN0ZWRcblx0aWYgKCBkb2MgPT09IGRvY3VtZW50IHx8IGRvYy5ub2RlVHlwZSAhPT0gOSB8fCAhZG9jLmRvY3VtZW50RWxlbWVudCApIHtcblx0XHRyZXR1cm4gZG9jdW1lbnQ7XG5cdH1cblxuXHQvLyBVcGRhdGUgZ2xvYmFsIHZhcmlhYmxlc1xuXHRkb2N1bWVudCA9IGRvYztcblx0ZG9jRWxlbSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcblx0ZG9jdW1lbnRJc0hUTUwgPSAhaXNYTUwoIGRvY3VtZW50ICk7XG5cblx0Ly8gU3VwcG9ydDogSUUgOS0xMSwgRWRnZVxuXHQvLyBBY2Nlc3NpbmcgaWZyYW1lIGRvY3VtZW50cyBhZnRlciB1bmxvYWQgdGhyb3dzIFwicGVybWlzc2lvbiBkZW5pZWRcIiBlcnJvcnMgKGpRdWVyeSAjMTM5MzYpXG5cdGlmICggKHBhcmVudCA9IGRvY3VtZW50LmRlZmF1bHRWaWV3KSAmJiBwYXJlbnQudG9wICE9PSBwYXJlbnQgKSB7XG5cdFx0Ly8gU3VwcG9ydDogSUUgMTFcblx0XHRpZiAoIHBhcmVudC5hZGRFdmVudExpc3RlbmVyICkge1xuXHRcdFx0cGFyZW50LmFkZEV2ZW50TGlzdGVuZXIoIFwidW5sb2FkXCIsIHVubG9hZEhhbmRsZXIsIGZhbHNlICk7XG5cblx0XHQvLyBTdXBwb3J0OiBJRSA5IC0gMTAgb25seVxuXHRcdH0gZWxzZSBpZiAoIHBhcmVudC5hdHRhY2hFdmVudCApIHtcblx0XHRcdHBhcmVudC5hdHRhY2hFdmVudCggXCJvbnVubG9hZFwiLCB1bmxvYWRIYW5kbGVyICk7XG5cdFx0fVxuXHR9XG5cblx0LyogQXR0cmlidXRlc1xuXHQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cblx0Ly8gU3VwcG9ydDogSUU8OFxuXHQvLyBWZXJpZnkgdGhhdCBnZXRBdHRyaWJ1dGUgcmVhbGx5IHJldHVybnMgYXR0cmlidXRlcyBhbmQgbm90IHByb3BlcnRpZXNcblx0Ly8gKGV4Y2VwdGluZyBJRTggYm9vbGVhbnMpXG5cdHN1cHBvcnQuYXR0cmlidXRlcyA9IGFzc2VydChmdW5jdGlvbiggZGl2ICkge1xuXHRcdGRpdi5jbGFzc05hbWUgPSBcImlcIjtcblx0XHRyZXR1cm4gIWRpdi5nZXRBdHRyaWJ1dGUoXCJjbGFzc05hbWVcIik7XG5cdH0pO1xuXG5cdC8qIGdldEVsZW1lbnQocylCeSpcblx0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5cdC8vIENoZWNrIGlmIGdldEVsZW1lbnRzQnlUYWdOYW1lKFwiKlwiKSByZXR1cm5zIG9ubHkgZWxlbWVudHNcblx0c3VwcG9ydC5nZXRFbGVtZW50c0J5VGFnTmFtZSA9IGFzc2VydChmdW5jdGlvbiggZGl2ICkge1xuXHRcdGRpdi5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlQ29tbWVudChcIlwiKSApO1xuXHRcdHJldHVybiAhZGl2LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiKlwiKS5sZW5ndGg7XG5cdH0pO1xuXG5cdC8vIFN1cHBvcnQ6IElFPDlcblx0c3VwcG9ydC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lID0gcm5hdGl2ZS50ZXN0KCBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICk7XG5cblx0Ly8gU3VwcG9ydDogSUU8MTBcblx0Ly8gQ2hlY2sgaWYgZ2V0RWxlbWVudEJ5SWQgcmV0dXJucyBlbGVtZW50cyBieSBuYW1lXG5cdC8vIFRoZSBicm9rZW4gZ2V0RWxlbWVudEJ5SWQgbWV0aG9kcyBkb24ndCBwaWNrIHVwIHByb2dyYW1hdGljYWxseS1zZXQgbmFtZXMsXG5cdC8vIHNvIHVzZSBhIHJvdW5kYWJvdXQgZ2V0RWxlbWVudHNCeU5hbWUgdGVzdFxuXHRzdXBwb3J0LmdldEJ5SWQgPSBhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHtcblx0XHRkb2NFbGVtLmFwcGVuZENoaWxkKCBkaXYgKS5pZCA9IGV4cGFuZG87XG5cdFx0cmV0dXJuICFkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSB8fCAhZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUoIGV4cGFuZG8gKS5sZW5ndGg7XG5cdH0pO1xuXG5cdC8vIElEIGZpbmQgYW5kIGZpbHRlclxuXHRpZiAoIHN1cHBvcnQuZ2V0QnlJZCApIHtcblx0XHRFeHByLmZpbmRbXCJJRFwiXSA9IGZ1bmN0aW9uKCBpZCwgY29udGV4dCApIHtcblx0XHRcdGlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQgIT09IFwidW5kZWZpbmVkXCIgJiYgZG9jdW1lbnRJc0hUTUwgKSB7XG5cdFx0XHRcdHZhciBtID0gY29udGV4dC5nZXRFbGVtZW50QnlJZCggaWQgKTtcblx0XHRcdFx0cmV0dXJuIG0gPyBbIG0gXSA6IFtdO1xuXHRcdFx0fVxuXHRcdH07XG5cdFx0RXhwci5maWx0ZXJbXCJJRFwiXSA9IGZ1bmN0aW9uKCBpZCApIHtcblx0XHRcdHZhciBhdHRySWQgPSBpZC5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApO1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoXCJpZFwiKSA9PT0gYXR0cklkO1xuXHRcdFx0fTtcblx0XHR9O1xuXHR9IGVsc2Uge1xuXHRcdC8vIFN1cHBvcnQ6IElFNi83XG5cdFx0Ly8gZ2V0RWxlbWVudEJ5SWQgaXMgbm90IHJlbGlhYmxlIGFzIGEgZmluZCBzaG9ydGN1dFxuXHRcdGRlbGV0ZSBFeHByLmZpbmRbXCJJRFwiXTtcblxuXHRcdEV4cHIuZmlsdGVyW1wiSURcIl0gPSAgZnVuY3Rpb24oIGlkICkge1xuXHRcdFx0dmFyIGF0dHJJZCA9IGlkLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHZhciBub2RlID0gdHlwZW9mIGVsZW0uZ2V0QXR0cmlidXRlTm9kZSAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuXHRcdFx0XHRcdGVsZW0uZ2V0QXR0cmlidXRlTm9kZShcImlkXCIpO1xuXHRcdFx0XHRyZXR1cm4gbm9kZSAmJiBub2RlLnZhbHVlID09PSBhdHRySWQ7XG5cdFx0XHR9O1xuXHRcdH07XG5cdH1cblxuXHQvLyBUYWdcblx0RXhwci5maW5kW1wiVEFHXCJdID0gc3VwcG9ydC5nZXRFbGVtZW50c0J5VGFnTmFtZSA/XG5cdFx0ZnVuY3Rpb24oIHRhZywgY29udGV4dCApIHtcblx0XHRcdGlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09IFwidW5kZWZpbmVkXCIgKSB7XG5cdFx0XHRcdHJldHVybiBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCB0YWcgKTtcblxuXHRcdFx0Ly8gRG9jdW1lbnRGcmFnbWVudCBub2RlcyBkb24ndCBoYXZlIGdFQlROXG5cdFx0XHR9IGVsc2UgaWYgKCBzdXBwb3J0LnFzYSApIHtcblx0XHRcdFx0cmV0dXJuIGNvbnRleHQucXVlcnlTZWxlY3RvckFsbCggdGFnICk7XG5cdFx0XHR9XG5cdFx0fSA6XG5cblx0XHRmdW5jdGlvbiggdGFnLCBjb250ZXh0ICkge1xuXHRcdFx0dmFyIGVsZW0sXG5cdFx0XHRcdHRtcCA9IFtdLFxuXHRcdFx0XHRpID0gMCxcblx0XHRcdFx0Ly8gQnkgaGFwcHkgY29pbmNpZGVuY2UsIGEgKGJyb2tlbikgZ0VCVE4gYXBwZWFycyBvbiBEb2N1bWVudEZyYWdtZW50IG5vZGVzIHRvb1xuXHRcdFx0XHRyZXN1bHRzID0gY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggdGFnICk7XG5cblx0XHRcdC8vIEZpbHRlciBvdXQgcG9zc2libGUgY29tbWVudHNcblx0XHRcdGlmICggdGFnID09PSBcIipcIiApIHtcblx0XHRcdFx0d2hpbGUgKCAoZWxlbSA9IHJlc3VsdHNbaSsrXSkgKSB7XG5cdFx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXHRcdFx0XHRcdFx0dG1wLnB1c2goIGVsZW0gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gdG1wO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0fTtcblxuXHQvLyBDbGFzc1xuXHRFeHByLmZpbmRbXCJDTEFTU1wiXSA9IHN1cHBvcnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSAmJiBmdW5jdGlvbiggY2xhc3NOYW1lLCBjb250ZXh0ICkge1xuXHRcdGlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBkb2N1bWVudElzSFRNTCApIHtcblx0XHRcdHJldHVybiBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIGNsYXNzTmFtZSApO1xuXHRcdH1cblx0fTtcblxuXHQvKiBRU0EvbWF0Y2hlc1NlbGVjdG9yXG5cdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuXHQvLyBRU0EgYW5kIG1hdGNoZXNTZWxlY3RvciBzdXBwb3J0XG5cblx0Ly8gbWF0Y2hlc1NlbGVjdG9yKDphY3RpdmUpIHJlcG9ydHMgZmFsc2Ugd2hlbiB0cnVlIChJRTkvT3BlcmEgMTEuNSlcblx0cmJ1Z2d5TWF0Y2hlcyA9IFtdO1xuXG5cdC8vIHFTYSg6Zm9jdXMpIHJlcG9ydHMgZmFsc2Ugd2hlbiB0cnVlIChDaHJvbWUgMjEpXG5cdC8vIFdlIGFsbG93IHRoaXMgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBJRTgvOSB0aGF0IHRocm93cyBhbiBlcnJvclxuXHQvLyB3aGVuZXZlciBgZG9jdW1lbnQuYWN0aXZlRWxlbWVudGAgaXMgYWNjZXNzZWQgb24gYW4gaWZyYW1lXG5cdC8vIFNvLCB3ZSBhbGxvdyA6Zm9jdXMgdG8gcGFzcyB0aHJvdWdoIFFTQSBhbGwgdGhlIHRpbWUgdG8gYXZvaWQgdGhlIElFIGVycm9yXG5cdC8vIFNlZSBodHRwOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC8xMzM3OFxuXHRyYnVnZ3lRU0EgPSBbXTtcblxuXHRpZiAoIChzdXBwb3J0LnFzYSA9IHJuYXRpdmUudGVzdCggZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCApKSApIHtcblx0XHQvLyBCdWlsZCBRU0EgcmVnZXhcblx0XHQvLyBSZWdleCBzdHJhdGVneSBhZG9wdGVkIGZyb20gRGllZ28gUGVyaW5pXG5cdFx0YXNzZXJ0KGZ1bmN0aW9uKCBkaXYgKSB7XG5cdFx0XHQvLyBTZWxlY3QgaXMgc2V0IHRvIGVtcHR5IHN0cmluZyBvbiBwdXJwb3NlXG5cdFx0XHQvLyBUaGlzIGlzIHRvIHRlc3QgSUUncyB0cmVhdG1lbnQgb2Ygbm90IGV4cGxpY2l0bHlcblx0XHRcdC8vIHNldHRpbmcgYSBib29sZWFuIGNvbnRlbnQgYXR0cmlidXRlLFxuXHRcdFx0Ly8gc2luY2UgaXRzIHByZXNlbmNlIHNob3VsZCBiZSBlbm91Z2hcblx0XHRcdC8vIGh0dHA6Ly9idWdzLmpxdWVyeS5jb20vdGlja2V0LzEyMzU5XG5cdFx0XHRkb2NFbGVtLmFwcGVuZENoaWxkKCBkaXYgKS5pbm5lckhUTUwgPSBcIjxhIGlkPSdcIiArIGV4cGFuZG8gKyBcIic+PC9hPlwiICtcblx0XHRcdFx0XCI8c2VsZWN0IGlkPSdcIiArIGV4cGFuZG8gKyBcIi1cXHJcXFxcJyBtc2FsbG93Y2FwdHVyZT0nJz5cIiArXG5cdFx0XHRcdFwiPG9wdGlvbiBzZWxlY3RlZD0nJz48L29wdGlvbj48L3NlbGVjdD5cIjtcblxuXHRcdFx0Ly8gU3VwcG9ydDogSUU4LCBPcGVyYSAxMS0xMi4xNlxuXHRcdFx0Ly8gTm90aGluZyBzaG91bGQgYmUgc2VsZWN0ZWQgd2hlbiBlbXB0eSBzdHJpbmdzIGZvbGxvdyBePSBvciAkPSBvciAqPVxuXHRcdFx0Ly8gVGhlIHRlc3QgYXR0cmlidXRlIG11c3QgYmUgdW5rbm93biBpbiBPcGVyYSBidXQgXCJzYWZlXCIgZm9yIFdpblJUXG5cdFx0XHQvLyBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvaWUvaGg0NjUzODguYXNweCNhdHRyaWJ1dGVfc2VjdGlvblxuXHRcdFx0aWYgKCBkaXYucXVlcnlTZWxlY3RvckFsbChcIlttc2FsbG93Y2FwdHVyZV49JyddXCIpLmxlbmd0aCApIHtcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goIFwiWypeJF09XCIgKyB3aGl0ZXNwYWNlICsgXCIqKD86Jyd8XFxcIlxcXCIpXCIgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU3VwcG9ydDogSUU4XG5cdFx0XHQvLyBCb29sZWFuIGF0dHJpYnV0ZXMgYW5kIFwidmFsdWVcIiBhcmUgbm90IHRyZWF0ZWQgY29ycmVjdGx5XG5cdFx0XHRpZiAoICFkaXYucXVlcnlTZWxlY3RvckFsbChcIltzZWxlY3RlZF1cIikubGVuZ3RoICkge1xuXHRcdFx0XHRyYnVnZ3lRU0EucHVzaCggXCJcXFxcW1wiICsgd2hpdGVzcGFjZSArIFwiKig/OnZhbHVlfFwiICsgYm9vbGVhbnMgKyBcIilcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdXBwb3J0OiBDaHJvbWU8MjksIEFuZHJvaWQ8NC40LCBTYWZhcmk8Ny4wKywgaU9TPDcuMCssIFBoYW50b21KUzwxLjkuOCtcblx0XHRcdGlmICggIWRpdi5xdWVyeVNlbGVjdG9yQWxsKCBcIltpZH49XCIgKyBleHBhbmRvICsgXCItXVwiICkubGVuZ3RoICkge1xuXHRcdFx0XHRyYnVnZ3lRU0EucHVzaChcIn49XCIpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBXZWJraXQvT3BlcmEgLSA6Y2hlY2tlZCBzaG91bGQgcmV0dXJuIHNlbGVjdGVkIG9wdGlvbiBlbGVtZW50c1xuXHRcdFx0Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvMjAxMS9SRUMtY3NzMy1zZWxlY3RvcnMtMjAxMTA5MjkvI2NoZWNrZWRcblx0XHRcdC8vIElFOCB0aHJvd3MgZXJyb3IgaGVyZSBhbmQgd2lsbCBub3Qgc2VlIGxhdGVyIHRlc3RzXG5cdFx0XHRpZiAoICFkaXYucXVlcnlTZWxlY3RvckFsbChcIjpjaGVja2VkXCIpLmxlbmd0aCApIHtcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goXCI6Y2hlY2tlZFwiKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU3VwcG9ydDogU2FmYXJpIDgrLCBpT1MgOCtcblx0XHRcdC8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMzY4NTFcblx0XHRcdC8vIEluLXBhZ2UgYHNlbGVjdG9yI2lkIHNpYmluZy1jb21iaW5hdG9yIHNlbGVjdG9yYCBmYWlsc1xuXHRcdFx0aWYgKCAhZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoIFwiYSNcIiArIGV4cGFuZG8gKyBcIisqXCIgKS5sZW5ndGggKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKFwiLiMuK1srfl1cIik7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHtcblx0XHRcdC8vIFN1cHBvcnQ6IFdpbmRvd3MgOCBOYXRpdmUgQXBwc1xuXHRcdFx0Ly8gVGhlIHR5cGUgYW5kIG5hbWUgYXR0cmlidXRlcyBhcmUgcmVzdHJpY3RlZCBkdXJpbmcgLmlubmVySFRNTCBhc3NpZ25tZW50XG5cdFx0XHR2YXIgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XG5cdFx0XHRpbnB1dC5zZXRBdHRyaWJ1dGUoIFwidHlwZVwiLCBcImhpZGRlblwiICk7XG5cdFx0XHRkaXYuYXBwZW5kQ2hpbGQoIGlucHV0ICkuc2V0QXR0cmlidXRlKCBcIm5hbWVcIiwgXCJEXCIgKTtcblxuXHRcdFx0Ly8gU3VwcG9ydDogSUU4XG5cdFx0XHQvLyBFbmZvcmNlIGNhc2Utc2Vuc2l0aXZpdHkgb2YgbmFtZSBhdHRyaWJ1dGVcblx0XHRcdGlmICggZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbbmFtZT1kXVwiKS5sZW5ndGggKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKCBcIm5hbWVcIiArIHdoaXRlc3BhY2UgKyBcIipbKl4kfCF+XT89XCIgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gRkYgMy41IC0gOmVuYWJsZWQvOmRpc2FibGVkIGFuZCBoaWRkZW4gZWxlbWVudHMgKGhpZGRlbiBlbGVtZW50cyBhcmUgc3RpbGwgZW5hYmxlZClcblx0XHRcdC8vIElFOCB0aHJvd3MgZXJyb3IgaGVyZSBhbmQgd2lsbCBub3Qgc2VlIGxhdGVyIHRlc3RzXG5cdFx0XHRpZiAoICFkaXYucXVlcnlTZWxlY3RvckFsbChcIjplbmFibGVkXCIpLmxlbmd0aCApIHtcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goIFwiOmVuYWJsZWRcIiwgXCI6ZGlzYWJsZWRcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBPcGVyYSAxMC0xMSBkb2VzIG5vdCB0aHJvdyBvbiBwb3N0LWNvbW1hIGludmFsaWQgcHNldWRvc1xuXHRcdFx0ZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoXCIqLDp4XCIpO1xuXHRcdFx0cmJ1Z2d5UVNBLnB1c2goXCIsLio6XCIpO1xuXHRcdH0pO1xuXHR9XG5cblx0aWYgKCAoc3VwcG9ydC5tYXRjaGVzU2VsZWN0b3IgPSBybmF0aXZlLnRlc3QoIChtYXRjaGVzID0gZG9jRWxlbS5tYXRjaGVzIHx8XG5cdFx0ZG9jRWxlbS53ZWJraXRNYXRjaGVzU2VsZWN0b3IgfHxcblx0XHRkb2NFbGVtLm1vek1hdGNoZXNTZWxlY3RvciB8fFxuXHRcdGRvY0VsZW0ub01hdGNoZXNTZWxlY3RvciB8fFxuXHRcdGRvY0VsZW0ubXNNYXRjaGVzU2VsZWN0b3IpICkpICkge1xuXG5cdFx0YXNzZXJ0KGZ1bmN0aW9uKCBkaXYgKSB7XG5cdFx0XHQvLyBDaGVjayB0byBzZWUgaWYgaXQncyBwb3NzaWJsZSB0byBkbyBtYXRjaGVzU2VsZWN0b3Jcblx0XHRcdC8vIG9uIGEgZGlzY29ubmVjdGVkIG5vZGUgKElFIDkpXG5cdFx0XHRzdXBwb3J0LmRpc2Nvbm5lY3RlZE1hdGNoID0gbWF0Y2hlcy5jYWxsKCBkaXYsIFwiZGl2XCIgKTtcblxuXHRcdFx0Ly8gVGhpcyBzaG91bGQgZmFpbCB3aXRoIGFuIGV4Y2VwdGlvblxuXHRcdFx0Ly8gR2Vja28gZG9lcyBub3QgZXJyb3IsIHJldHVybnMgZmFsc2UgaW5zdGVhZFxuXHRcdFx0bWF0Y2hlcy5jYWxsKCBkaXYsIFwiW3MhPScnXTp4XCIgKTtcblx0XHRcdHJidWdneU1hdGNoZXMucHVzaCggXCIhPVwiLCBwc2V1ZG9zICk7XG5cdFx0fSk7XG5cdH1cblxuXHRyYnVnZ3lRU0EgPSByYnVnZ3lRU0EubGVuZ3RoICYmIG5ldyBSZWdFeHAoIHJidWdneVFTQS5qb2luKFwifFwiKSApO1xuXHRyYnVnZ3lNYXRjaGVzID0gcmJ1Z2d5TWF0Y2hlcy5sZW5ndGggJiYgbmV3IFJlZ0V4cCggcmJ1Z2d5TWF0Y2hlcy5qb2luKFwifFwiKSApO1xuXG5cdC8qIENvbnRhaW5zXG5cdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblx0aGFzQ29tcGFyZSA9IHJuYXRpdmUudGVzdCggZG9jRWxlbS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiApO1xuXG5cdC8vIEVsZW1lbnQgY29udGFpbnMgYW5vdGhlclxuXHQvLyBQdXJwb3NlZnVsbHkgc2VsZi1leGNsdXNpdmVcblx0Ly8gQXMgaW4sIGFuIGVsZW1lbnQgZG9lcyBub3QgY29udGFpbiBpdHNlbGZcblx0Y29udGFpbnMgPSBoYXNDb21wYXJlIHx8IHJuYXRpdmUudGVzdCggZG9jRWxlbS5jb250YWlucyApID9cblx0XHRmdW5jdGlvbiggYSwgYiApIHtcblx0XHRcdHZhciBhZG93biA9IGEubm9kZVR5cGUgPT09IDkgPyBhLmRvY3VtZW50RWxlbWVudCA6IGEsXG5cdFx0XHRcdGJ1cCA9IGIgJiYgYi5wYXJlbnROb2RlO1xuXHRcdFx0cmV0dXJuIGEgPT09IGJ1cCB8fCAhISggYnVwICYmIGJ1cC5ub2RlVHlwZSA9PT0gMSAmJiAoXG5cdFx0XHRcdGFkb3duLmNvbnRhaW5zID9cblx0XHRcdFx0XHRhZG93bi5jb250YWlucyggYnVwICkgOlxuXHRcdFx0XHRcdGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24gJiYgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggYnVwICkgJiAxNlxuXHRcdFx0KSk7XG5cdFx0fSA6XG5cdFx0ZnVuY3Rpb24oIGEsIGIgKSB7XG5cdFx0XHRpZiAoIGIgKSB7XG5cdFx0XHRcdHdoaWxlICggKGIgPSBiLnBhcmVudE5vZGUpICkge1xuXHRcdFx0XHRcdGlmICggYiA9PT0gYSApIHtcblx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH07XG5cblx0LyogU29ydGluZ1xuXHQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cblx0Ly8gRG9jdW1lbnQgb3JkZXIgc29ydGluZ1xuXHRzb3J0T3JkZXIgPSBoYXNDb21wYXJlID9cblx0ZnVuY3Rpb24oIGEsIGIgKSB7XG5cblx0XHQvLyBGbGFnIGZvciBkdXBsaWNhdGUgcmVtb3ZhbFxuXHRcdGlmICggYSA9PT0gYiApIHtcblx0XHRcdGhhc0R1cGxpY2F0ZSA9IHRydWU7XG5cdFx0XHRyZXR1cm4gMDtcblx0XHR9XG5cblx0XHQvLyBTb3J0IG9uIG1ldGhvZCBleGlzdGVuY2UgaWYgb25seSBvbmUgaW5wdXQgaGFzIGNvbXBhcmVEb2N1bWVudFBvc2l0aW9uXG5cdFx0dmFyIGNvbXBhcmUgPSAhYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiAtICFiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uO1xuXHRcdGlmICggY29tcGFyZSApIHtcblx0XHRcdHJldHVybiBjb21wYXJlO1xuXHRcdH1cblxuXHRcdC8vIENhbGN1bGF0ZSBwb3NpdGlvbiBpZiBib3RoIGlucHV0cyBiZWxvbmcgdG8gdGhlIHNhbWUgZG9jdW1lbnRcblx0XHRjb21wYXJlID0gKCBhLm93bmVyRG9jdW1lbnQgfHwgYSApID09PSAoIGIub3duZXJEb2N1bWVudCB8fCBiICkgP1xuXHRcdFx0YS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggYiApIDpcblxuXHRcdFx0Ly8gT3RoZXJ3aXNlIHdlIGtub3cgdGhleSBhcmUgZGlzY29ubmVjdGVkXG5cdFx0XHQxO1xuXG5cdFx0Ly8gRGlzY29ubmVjdGVkIG5vZGVzXG5cdFx0aWYgKCBjb21wYXJlICYgMSB8fFxuXHRcdFx0KCFzdXBwb3J0LnNvcnREZXRhY2hlZCAmJiBiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBhICkgPT09IGNvbXBhcmUpICkge1xuXG5cdFx0XHQvLyBDaG9vc2UgdGhlIGZpcnN0IGVsZW1lbnQgdGhhdCBpcyByZWxhdGVkIHRvIG91ciBwcmVmZXJyZWQgZG9jdW1lbnRcblx0XHRcdGlmICggYSA9PT0gZG9jdW1lbnQgfHwgYS5vd25lckRvY3VtZW50ID09PSBwcmVmZXJyZWREb2MgJiYgY29udGFpbnMocHJlZmVycmVkRG9jLCBhKSApIHtcblx0XHRcdFx0cmV0dXJuIC0xO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCBiID09PSBkb2N1bWVudCB8fCBiLm93bmVyRG9jdW1lbnQgPT09IHByZWZlcnJlZERvYyAmJiBjb250YWlucyhwcmVmZXJyZWREb2MsIGIpICkge1xuXHRcdFx0XHRyZXR1cm4gMTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gTWFpbnRhaW4gb3JpZ2luYWwgb3JkZXJcblx0XHRcdHJldHVybiBzb3J0SW5wdXQgP1xuXHRcdFx0XHQoIGluZGV4T2YoIHNvcnRJbnB1dCwgYSApIC0gaW5kZXhPZiggc29ydElucHV0LCBiICkgKSA6XG5cdFx0XHRcdDA7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNvbXBhcmUgJiA0ID8gLTEgOiAxO1xuXHR9IDpcblx0ZnVuY3Rpb24oIGEsIGIgKSB7XG5cdFx0Ly8gRXhpdCBlYXJseSBpZiB0aGUgbm9kZXMgYXJlIGlkZW50aWNhbFxuXHRcdGlmICggYSA9PT0gYiApIHtcblx0XHRcdGhhc0R1cGxpY2F0ZSA9IHRydWU7XG5cdFx0XHRyZXR1cm4gMDtcblx0XHR9XG5cblx0XHR2YXIgY3VyLFxuXHRcdFx0aSA9IDAsXG5cdFx0XHRhdXAgPSBhLnBhcmVudE5vZGUsXG5cdFx0XHRidXAgPSBiLnBhcmVudE5vZGUsXG5cdFx0XHRhcCA9IFsgYSBdLFxuXHRcdFx0YnAgPSBbIGIgXTtcblxuXHRcdC8vIFBhcmVudGxlc3Mgbm9kZXMgYXJlIGVpdGhlciBkb2N1bWVudHMgb3IgZGlzY29ubmVjdGVkXG5cdFx0aWYgKCAhYXVwIHx8ICFidXAgKSB7XG5cdFx0XHRyZXR1cm4gYSA9PT0gZG9jdW1lbnQgPyAtMSA6XG5cdFx0XHRcdGIgPT09IGRvY3VtZW50ID8gMSA6XG5cdFx0XHRcdGF1cCA/IC0xIDpcblx0XHRcdFx0YnVwID8gMSA6XG5cdFx0XHRcdHNvcnRJbnB1dCA/XG5cdFx0XHRcdCggaW5kZXhPZiggc29ydElucHV0LCBhICkgLSBpbmRleE9mKCBzb3J0SW5wdXQsIGIgKSApIDpcblx0XHRcdFx0MDtcblxuXHRcdC8vIElmIHRoZSBub2RlcyBhcmUgc2libGluZ3MsIHdlIGNhbiBkbyBhIHF1aWNrIGNoZWNrXG5cdFx0fSBlbHNlIGlmICggYXVwID09PSBidXAgKSB7XG5cdFx0XHRyZXR1cm4gc2libGluZ0NoZWNrKCBhLCBiICk7XG5cdFx0fVxuXG5cdFx0Ly8gT3RoZXJ3aXNlIHdlIG5lZWQgZnVsbCBsaXN0cyBvZiB0aGVpciBhbmNlc3RvcnMgZm9yIGNvbXBhcmlzb25cblx0XHRjdXIgPSBhO1xuXHRcdHdoaWxlICggKGN1ciA9IGN1ci5wYXJlbnROb2RlKSApIHtcblx0XHRcdGFwLnVuc2hpZnQoIGN1ciApO1xuXHRcdH1cblx0XHRjdXIgPSBiO1xuXHRcdHdoaWxlICggKGN1ciA9IGN1ci5wYXJlbnROb2RlKSApIHtcblx0XHRcdGJwLnVuc2hpZnQoIGN1ciApO1xuXHRcdH1cblxuXHRcdC8vIFdhbGsgZG93biB0aGUgdHJlZSBsb29raW5nIGZvciBhIGRpc2NyZXBhbmN5XG5cdFx0d2hpbGUgKCBhcFtpXSA9PT0gYnBbaV0gKSB7XG5cdFx0XHRpKys7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGkgP1xuXHRcdFx0Ly8gRG8gYSBzaWJsaW5nIGNoZWNrIGlmIHRoZSBub2RlcyBoYXZlIGEgY29tbW9uIGFuY2VzdG9yXG5cdFx0XHRzaWJsaW5nQ2hlY2soIGFwW2ldLCBicFtpXSApIDpcblxuXHRcdFx0Ly8gT3RoZXJ3aXNlIG5vZGVzIGluIG91ciBkb2N1bWVudCBzb3J0IGZpcnN0XG5cdFx0XHRhcFtpXSA9PT0gcHJlZmVycmVkRG9jID8gLTEgOlxuXHRcdFx0YnBbaV0gPT09IHByZWZlcnJlZERvYyA/IDEgOlxuXHRcdFx0MDtcblx0fTtcblxuXHRyZXR1cm4gZG9jdW1lbnQ7XG59O1xuXG5TaXp6bGUubWF0Y2hlcyA9IGZ1bmN0aW9uKCBleHByLCBlbGVtZW50cyApIHtcblx0cmV0dXJuIFNpenpsZSggZXhwciwgbnVsbCwgbnVsbCwgZWxlbWVudHMgKTtcbn07XG5cblNpenpsZS5tYXRjaGVzU2VsZWN0b3IgPSBmdW5jdGlvbiggZWxlbSwgZXhwciApIHtcblx0Ly8gU2V0IGRvY3VtZW50IHZhcnMgaWYgbmVlZGVkXG5cdGlmICggKCBlbGVtLm93bmVyRG9jdW1lbnQgfHwgZWxlbSApICE9PSBkb2N1bWVudCApIHtcblx0XHRzZXREb2N1bWVudCggZWxlbSApO1xuXHR9XG5cblx0Ly8gTWFrZSBzdXJlIHRoYXQgYXR0cmlidXRlIHNlbGVjdG9ycyBhcmUgcXVvdGVkXG5cdGV4cHIgPSBleHByLnJlcGxhY2UoIHJhdHRyaWJ1dGVRdW90ZXMsIFwiPSckMSddXCIgKTtcblxuXHRpZiAoIHN1cHBvcnQubWF0Y2hlc1NlbGVjdG9yICYmIGRvY3VtZW50SXNIVE1MICYmXG5cdFx0IWNvbXBpbGVyQ2FjaGVbIGV4cHIgKyBcIiBcIiBdICYmXG5cdFx0KCAhcmJ1Z2d5TWF0Y2hlcyB8fCAhcmJ1Z2d5TWF0Y2hlcy50ZXN0KCBleHByICkgKSAmJlxuXHRcdCggIXJidWdneVFTQSAgICAgfHwgIXJidWdneVFTQS50ZXN0KCBleHByICkgKSApIHtcblxuXHRcdHRyeSB7XG5cdFx0XHR2YXIgcmV0ID0gbWF0Y2hlcy5jYWxsKCBlbGVtLCBleHByICk7XG5cblx0XHRcdC8vIElFIDkncyBtYXRjaGVzU2VsZWN0b3IgcmV0dXJucyBmYWxzZSBvbiBkaXNjb25uZWN0ZWQgbm9kZXNcblx0XHRcdGlmICggcmV0IHx8IHN1cHBvcnQuZGlzY29ubmVjdGVkTWF0Y2ggfHxcblx0XHRcdFx0XHQvLyBBcyB3ZWxsLCBkaXNjb25uZWN0ZWQgbm9kZXMgYXJlIHNhaWQgdG8gYmUgaW4gYSBkb2N1bWVudFxuXHRcdFx0XHRcdC8vIGZyYWdtZW50IGluIElFIDlcblx0XHRcdFx0XHRlbGVtLmRvY3VtZW50ICYmIGVsZW0uZG9jdW1lbnQubm9kZVR5cGUgIT09IDExICkge1xuXHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGUpIHt9XG5cdH1cblxuXHRyZXR1cm4gU2l6emxlKCBleHByLCBkb2N1bWVudCwgbnVsbCwgWyBlbGVtIF0gKS5sZW5ndGggPiAwO1xufTtcblxuU2l6emxlLmNvbnRhaW5zID0gZnVuY3Rpb24oIGNvbnRleHQsIGVsZW0gKSB7XG5cdC8vIFNldCBkb2N1bWVudCB2YXJzIGlmIG5lZWRlZFxuXHRpZiAoICggY29udGV4dC5vd25lckRvY3VtZW50IHx8IGNvbnRleHQgKSAhPT0gZG9jdW1lbnQgKSB7XG5cdFx0c2V0RG9jdW1lbnQoIGNvbnRleHQgKTtcblx0fVxuXHRyZXR1cm4gY29udGFpbnMoIGNvbnRleHQsIGVsZW0gKTtcbn07XG5cblNpenpsZS5hdHRyID0gZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7XG5cdC8vIFNldCBkb2N1bWVudCB2YXJzIGlmIG5lZWRlZFxuXHRpZiAoICggZWxlbS5vd25lckRvY3VtZW50IHx8IGVsZW0gKSAhPT0gZG9jdW1lbnQgKSB7XG5cdFx0c2V0RG9jdW1lbnQoIGVsZW0gKTtcblx0fVxuXG5cdHZhciBmbiA9IEV4cHIuYXR0ckhhbmRsZVsgbmFtZS50b0xvd2VyQ2FzZSgpIF0sXG5cdFx0Ly8gRG9uJ3QgZ2V0IGZvb2xlZCBieSBPYmplY3QucHJvdG90eXBlIHByb3BlcnRpZXMgKGpRdWVyeSAjMTM4MDcpXG5cdFx0dmFsID0gZm4gJiYgaGFzT3duLmNhbGwoIEV4cHIuYXR0ckhhbmRsZSwgbmFtZS50b0xvd2VyQ2FzZSgpICkgP1xuXHRcdFx0Zm4oIGVsZW0sIG5hbWUsICFkb2N1bWVudElzSFRNTCApIDpcblx0XHRcdHVuZGVmaW5lZDtcblxuXHRyZXR1cm4gdmFsICE9PSB1bmRlZmluZWQgP1xuXHRcdHZhbCA6XG5cdFx0c3VwcG9ydC5hdHRyaWJ1dGVzIHx8ICFkb2N1bWVudElzSFRNTCA/XG5cdFx0XHRlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSApIDpcblx0XHRcdCh2YWwgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUobmFtZSkpICYmIHZhbC5zcGVjaWZpZWQgP1xuXHRcdFx0XHR2YWwudmFsdWUgOlxuXHRcdFx0XHRudWxsO1xufTtcblxuU2l6emxlLmVycm9yID0gZnVuY3Rpb24oIG1zZyApIHtcblx0dGhyb3cgbmV3IEVycm9yKCBcIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246IFwiICsgbXNnICk7XG59O1xuXG4vKipcbiAqIERvY3VtZW50IHNvcnRpbmcgYW5kIHJlbW92aW5nIGR1cGxpY2F0ZXNcbiAqIEBwYXJhbSB7QXJyYXlMaWtlfSByZXN1bHRzXG4gKi9cblNpenpsZS51bmlxdWVTb3J0ID0gZnVuY3Rpb24oIHJlc3VsdHMgKSB7XG5cdHZhciBlbGVtLFxuXHRcdGR1cGxpY2F0ZXMgPSBbXSxcblx0XHRqID0gMCxcblx0XHRpID0gMDtcblxuXHQvLyBVbmxlc3Mgd2UgKmtub3cqIHdlIGNhbiBkZXRlY3QgZHVwbGljYXRlcywgYXNzdW1lIHRoZWlyIHByZXNlbmNlXG5cdGhhc0R1cGxpY2F0ZSA9ICFzdXBwb3J0LmRldGVjdER1cGxpY2F0ZXM7XG5cdHNvcnRJbnB1dCA9ICFzdXBwb3J0LnNvcnRTdGFibGUgJiYgcmVzdWx0cy5zbGljZSggMCApO1xuXHRyZXN1bHRzLnNvcnQoIHNvcnRPcmRlciApO1xuXG5cdGlmICggaGFzRHVwbGljYXRlICkge1xuXHRcdHdoaWxlICggKGVsZW0gPSByZXN1bHRzW2krK10pICkge1xuXHRcdFx0aWYgKCBlbGVtID09PSByZXN1bHRzWyBpIF0gKSB7XG5cdFx0XHRcdGogPSBkdXBsaWNhdGVzLnB1c2goIGkgKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0d2hpbGUgKCBqLS0gKSB7XG5cdFx0XHRyZXN1bHRzLnNwbGljZSggZHVwbGljYXRlc1sgaiBdLCAxICk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gQ2xlYXIgaW5wdXQgYWZ0ZXIgc29ydGluZyB0byByZWxlYXNlIG9iamVjdHNcblx0Ly8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvc2l6emxlL3B1bGwvMjI1XG5cdHNvcnRJbnB1dCA9IG51bGw7XG5cblx0cmV0dXJuIHJlc3VsdHM7XG59O1xuXG4vKipcbiAqIFV0aWxpdHkgZnVuY3Rpb24gZm9yIHJldHJpZXZpbmcgdGhlIHRleHQgdmFsdWUgb2YgYW4gYXJyYXkgb2YgRE9NIG5vZGVzXG4gKiBAcGFyYW0ge0FycmF5fEVsZW1lbnR9IGVsZW1cbiAqL1xuZ2V0VGV4dCA9IFNpenpsZS5nZXRUZXh0ID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdHZhciBub2RlLFxuXHRcdHJldCA9IFwiXCIsXG5cdFx0aSA9IDAsXG5cdFx0bm9kZVR5cGUgPSBlbGVtLm5vZGVUeXBlO1xuXG5cdGlmICggIW5vZGVUeXBlICkge1xuXHRcdC8vIElmIG5vIG5vZGVUeXBlLCB0aGlzIGlzIGV4cGVjdGVkIHRvIGJlIGFuIGFycmF5XG5cdFx0d2hpbGUgKCAobm9kZSA9IGVsZW1baSsrXSkgKSB7XG5cdFx0XHQvLyBEbyBub3QgdHJhdmVyc2UgY29tbWVudCBub2Rlc1xuXHRcdFx0cmV0ICs9IGdldFRleHQoIG5vZGUgKTtcblx0XHR9XG5cdH0gZWxzZSBpZiAoIG5vZGVUeXBlID09PSAxIHx8IG5vZGVUeXBlID09PSA5IHx8IG5vZGVUeXBlID09PSAxMSApIHtcblx0XHQvLyBVc2UgdGV4dENvbnRlbnQgZm9yIGVsZW1lbnRzXG5cdFx0Ly8gaW5uZXJUZXh0IHVzYWdlIHJlbW92ZWQgZm9yIGNvbnNpc3RlbmN5IG9mIG5ldyBsaW5lcyAoalF1ZXJ5ICMxMTE1Mylcblx0XHRpZiAoIHR5cGVvZiBlbGVtLnRleHRDb250ZW50ID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0cmV0dXJuIGVsZW0udGV4dENvbnRlbnQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIFRyYXZlcnNlIGl0cyBjaGlsZHJlblxuXHRcdFx0Zm9yICggZWxlbSA9IGVsZW0uZmlyc3RDaGlsZDsgZWxlbTsgZWxlbSA9IGVsZW0ubmV4dFNpYmxpbmcgKSB7XG5cdFx0XHRcdHJldCArPSBnZXRUZXh0KCBlbGVtICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9IGVsc2UgaWYgKCBub2RlVHlwZSA9PT0gMyB8fCBub2RlVHlwZSA9PT0gNCApIHtcblx0XHRyZXR1cm4gZWxlbS5ub2RlVmFsdWU7XG5cdH1cblx0Ly8gRG8gbm90IGluY2x1ZGUgY29tbWVudCBvciBwcm9jZXNzaW5nIGluc3RydWN0aW9uIG5vZGVzXG5cblx0cmV0dXJuIHJldDtcbn07XG5cbkV4cHIgPSBTaXp6bGUuc2VsZWN0b3JzID0ge1xuXG5cdC8vIENhbiBiZSBhZGp1c3RlZCBieSB0aGUgdXNlclxuXHRjYWNoZUxlbmd0aDogNTAsXG5cblx0Y3JlYXRlUHNldWRvOiBtYXJrRnVuY3Rpb24sXG5cblx0bWF0Y2g6IG1hdGNoRXhwcixcblxuXHRhdHRySGFuZGxlOiB7fSxcblxuXHRmaW5kOiB7fSxcblxuXHRyZWxhdGl2ZToge1xuXHRcdFwiPlwiOiB7IGRpcjogXCJwYXJlbnROb2RlXCIsIGZpcnN0OiB0cnVlIH0sXG5cdFx0XCIgXCI6IHsgZGlyOiBcInBhcmVudE5vZGVcIiB9LFxuXHRcdFwiK1wiOiB7IGRpcjogXCJwcmV2aW91c1NpYmxpbmdcIiwgZmlyc3Q6IHRydWUgfSxcblx0XHRcIn5cIjogeyBkaXI6IFwicHJldmlvdXNTaWJsaW5nXCIgfVxuXHR9LFxuXG5cdHByZUZpbHRlcjoge1xuXHRcdFwiQVRUUlwiOiBmdW5jdGlvbiggbWF0Y2ggKSB7XG5cdFx0XHRtYXRjaFsxXSA9IG1hdGNoWzFdLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7XG5cblx0XHRcdC8vIE1vdmUgdGhlIGdpdmVuIHZhbHVlIHRvIG1hdGNoWzNdIHdoZXRoZXIgcXVvdGVkIG9yIHVucXVvdGVkXG5cdFx0XHRtYXRjaFszXSA9ICggbWF0Y2hbM10gfHwgbWF0Y2hbNF0gfHwgbWF0Y2hbNV0gfHwgXCJcIiApLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7XG5cblx0XHRcdGlmICggbWF0Y2hbMl0gPT09IFwifj1cIiApIHtcblx0XHRcdFx0bWF0Y2hbM10gPSBcIiBcIiArIG1hdGNoWzNdICsgXCIgXCI7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBtYXRjaC5zbGljZSggMCwgNCApO1xuXHRcdH0sXG5cblx0XHRcIkNISUxEXCI6IGZ1bmN0aW9uKCBtYXRjaCApIHtcblx0XHRcdC8qIG1hdGNoZXMgZnJvbSBtYXRjaEV4cHJbXCJDSElMRFwiXVxuXHRcdFx0XHQxIHR5cGUgKG9ubHl8bnRofC4uLilcblx0XHRcdFx0MiB3aGF0IChjaGlsZHxvZi10eXBlKVxuXHRcdFx0XHQzIGFyZ3VtZW50IChldmVufG9kZHxcXGQqfFxcZCpuKFsrLV1cXGQrKT98Li4uKVxuXHRcdFx0XHQ0IHhuLWNvbXBvbmVudCBvZiB4bit5IGFyZ3VtZW50IChbKy1dP1xcZCpufClcblx0XHRcdFx0NSBzaWduIG9mIHhuLWNvbXBvbmVudFxuXHRcdFx0XHQ2IHggb2YgeG4tY29tcG9uZW50XG5cdFx0XHRcdDcgc2lnbiBvZiB5LWNvbXBvbmVudFxuXHRcdFx0XHQ4IHkgb2YgeS1jb21wb25lbnRcblx0XHRcdCovXG5cdFx0XHRtYXRjaFsxXSA9IG1hdGNoWzFdLnRvTG93ZXJDYXNlKCk7XG5cblx0XHRcdGlmICggbWF0Y2hbMV0uc2xpY2UoIDAsIDMgKSA9PT0gXCJudGhcIiApIHtcblx0XHRcdFx0Ly8gbnRoLSogcmVxdWlyZXMgYXJndW1lbnRcblx0XHRcdFx0aWYgKCAhbWF0Y2hbM10gKSB7XG5cdFx0XHRcdFx0U2l6emxlLmVycm9yKCBtYXRjaFswXSApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gbnVtZXJpYyB4IGFuZCB5IHBhcmFtZXRlcnMgZm9yIEV4cHIuZmlsdGVyLkNISUxEXG5cdFx0XHRcdC8vIHJlbWVtYmVyIHRoYXQgZmFsc2UvdHJ1ZSBjYXN0IHJlc3BlY3RpdmVseSB0byAwLzFcblx0XHRcdFx0bWF0Y2hbNF0gPSArKCBtYXRjaFs0XSA/IG1hdGNoWzVdICsgKG1hdGNoWzZdIHx8IDEpIDogMiAqICggbWF0Y2hbM10gPT09IFwiZXZlblwiIHx8IG1hdGNoWzNdID09PSBcIm9kZFwiICkgKTtcblx0XHRcdFx0bWF0Y2hbNV0gPSArKCAoIG1hdGNoWzddICsgbWF0Y2hbOF0gKSB8fCBtYXRjaFszXSA9PT0gXCJvZGRcIiApO1xuXG5cdFx0XHQvLyBvdGhlciB0eXBlcyBwcm9oaWJpdCBhcmd1bWVudHNcblx0XHRcdH0gZWxzZSBpZiAoIG1hdGNoWzNdICkge1xuXHRcdFx0XHRTaXp6bGUuZXJyb3IoIG1hdGNoWzBdICk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBtYXRjaDtcblx0XHR9LFxuXG5cdFx0XCJQU0VVRE9cIjogZnVuY3Rpb24oIG1hdGNoICkge1xuXHRcdFx0dmFyIGV4Y2Vzcyxcblx0XHRcdFx0dW5xdW90ZWQgPSAhbWF0Y2hbNl0gJiYgbWF0Y2hbMl07XG5cblx0XHRcdGlmICggbWF0Y2hFeHByW1wiQ0hJTERcIl0udGVzdCggbWF0Y2hbMF0gKSApIHtcblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEFjY2VwdCBxdW90ZWQgYXJndW1lbnRzIGFzLWlzXG5cdFx0XHRpZiAoIG1hdGNoWzNdICkge1xuXHRcdFx0XHRtYXRjaFsyXSA9IG1hdGNoWzRdIHx8IG1hdGNoWzVdIHx8IFwiXCI7XG5cblx0XHRcdC8vIFN0cmlwIGV4Y2VzcyBjaGFyYWN0ZXJzIGZyb20gdW5xdW90ZWQgYXJndW1lbnRzXG5cdFx0XHR9IGVsc2UgaWYgKCB1bnF1b3RlZCAmJiBycHNldWRvLnRlc3QoIHVucXVvdGVkICkgJiZcblx0XHRcdFx0Ly8gR2V0IGV4Y2VzcyBmcm9tIHRva2VuaXplIChyZWN1cnNpdmVseSlcblx0XHRcdFx0KGV4Y2VzcyA9IHRva2VuaXplKCB1bnF1b3RlZCwgdHJ1ZSApKSAmJlxuXHRcdFx0XHQvLyBhZHZhbmNlIHRvIHRoZSBuZXh0IGNsb3NpbmcgcGFyZW50aGVzaXNcblx0XHRcdFx0KGV4Y2VzcyA9IHVucXVvdGVkLmluZGV4T2YoIFwiKVwiLCB1bnF1b3RlZC5sZW5ndGggLSBleGNlc3MgKSAtIHVucXVvdGVkLmxlbmd0aCkgKSB7XG5cblx0XHRcdFx0Ly8gZXhjZXNzIGlzIGEgbmVnYXRpdmUgaW5kZXhcblx0XHRcdFx0bWF0Y2hbMF0gPSBtYXRjaFswXS5zbGljZSggMCwgZXhjZXNzICk7XG5cdFx0XHRcdG1hdGNoWzJdID0gdW5xdW90ZWQuc2xpY2UoIDAsIGV4Y2VzcyApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBSZXR1cm4gb25seSBjYXB0dXJlcyBuZWVkZWQgYnkgdGhlIHBzZXVkbyBmaWx0ZXIgbWV0aG9kICh0eXBlIGFuZCBhcmd1bWVudClcblx0XHRcdHJldHVybiBtYXRjaC5zbGljZSggMCwgMyApO1xuXHRcdH1cblx0fSxcblxuXHRmaWx0ZXI6IHtcblxuXHRcdFwiVEFHXCI6IGZ1bmN0aW9uKCBub2RlTmFtZVNlbGVjdG9yICkge1xuXHRcdFx0dmFyIG5vZGVOYW1lID0gbm9kZU5hbWVTZWxlY3Rvci5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRyZXR1cm4gbm9kZU5hbWVTZWxlY3RvciA9PT0gXCIqXCIgP1xuXHRcdFx0XHRmdW5jdGlvbigpIHsgcmV0dXJuIHRydWU7IH0gOlxuXHRcdFx0XHRmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0XHRyZXR1cm4gZWxlbS5ub2RlTmFtZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5vZGVOYW1lO1xuXHRcdFx0XHR9O1xuXHRcdH0sXG5cblx0XHRcIkNMQVNTXCI6IGZ1bmN0aW9uKCBjbGFzc05hbWUgKSB7XG5cdFx0XHR2YXIgcGF0dGVybiA9IGNsYXNzQ2FjaGVbIGNsYXNzTmFtZSArIFwiIFwiIF07XG5cblx0XHRcdHJldHVybiBwYXR0ZXJuIHx8XG5cdFx0XHRcdChwYXR0ZXJuID0gbmV3IFJlZ0V4cCggXCIoXnxcIiArIHdoaXRlc3BhY2UgKyBcIilcIiArIGNsYXNzTmFtZSArIFwiKFwiICsgd2hpdGVzcGFjZSArIFwifCQpXCIgKSkgJiZcblx0XHRcdFx0Y2xhc3NDYWNoZSggY2xhc3NOYW1lLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0XHRyZXR1cm4gcGF0dGVybi50ZXN0KCB0eXBlb2YgZWxlbS5jbGFzc05hbWUgPT09IFwic3RyaW5nXCIgJiYgZWxlbS5jbGFzc05hbWUgfHwgdHlwZW9mIGVsZW0uZ2V0QXR0cmlidXRlICE9PSBcInVuZGVmaW5lZFwiICYmIGVsZW0uZ2V0QXR0cmlidXRlKFwiY2xhc3NcIikgfHwgXCJcIiApO1xuXHRcdFx0XHR9KTtcblx0XHR9LFxuXG5cdFx0XCJBVFRSXCI6IGZ1bmN0aW9uKCBuYW1lLCBvcGVyYXRvciwgY2hlY2sgKSB7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHZhciByZXN1bHQgPSBTaXp6bGUuYXR0ciggZWxlbSwgbmFtZSApO1xuXG5cdFx0XHRcdGlmICggcmVzdWx0ID09IG51bGwgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9wZXJhdG9yID09PSBcIiE9XCI7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCAhb3BlcmF0b3IgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXN1bHQgKz0gXCJcIjtcblxuXHRcdFx0XHRyZXR1cm4gb3BlcmF0b3IgPT09IFwiPVwiID8gcmVzdWx0ID09PSBjaGVjayA6XG5cdFx0XHRcdFx0b3BlcmF0b3IgPT09IFwiIT1cIiA/IHJlc3VsdCAhPT0gY2hlY2sgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcIl49XCIgPyBjaGVjayAmJiByZXN1bHQuaW5kZXhPZiggY2hlY2sgKSA9PT0gMCA6XG5cdFx0XHRcdFx0b3BlcmF0b3IgPT09IFwiKj1cIiA/IGNoZWNrICYmIHJlc3VsdC5pbmRleE9mKCBjaGVjayApID4gLTEgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcIiQ9XCIgPyBjaGVjayAmJiByZXN1bHQuc2xpY2UoIC1jaGVjay5sZW5ndGggKSA9PT0gY2hlY2sgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcIn49XCIgPyAoIFwiIFwiICsgcmVzdWx0LnJlcGxhY2UoIHJ3aGl0ZXNwYWNlLCBcIiBcIiApICsgXCIgXCIgKS5pbmRleE9mKCBjaGVjayApID4gLTEgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcInw9XCIgPyByZXN1bHQgPT09IGNoZWNrIHx8IHJlc3VsdC5zbGljZSggMCwgY2hlY2subGVuZ3RoICsgMSApID09PSBjaGVjayArIFwiLVwiIDpcblx0XHRcdFx0XHRmYWxzZTtcblx0XHRcdH07XG5cdFx0fSxcblxuXHRcdFwiQ0hJTERcIjogZnVuY3Rpb24oIHR5cGUsIHdoYXQsIGFyZ3VtZW50LCBmaXJzdCwgbGFzdCApIHtcblx0XHRcdHZhciBzaW1wbGUgPSB0eXBlLnNsaWNlKCAwLCAzICkgIT09IFwibnRoXCIsXG5cdFx0XHRcdGZvcndhcmQgPSB0eXBlLnNsaWNlKCAtNCApICE9PSBcImxhc3RcIixcblx0XHRcdFx0b2ZUeXBlID0gd2hhdCA9PT0gXCJvZi10eXBlXCI7XG5cblx0XHRcdHJldHVybiBmaXJzdCA9PT0gMSAmJiBsYXN0ID09PSAwID9cblxuXHRcdFx0XHQvLyBTaG9ydGN1dCBmb3IgOm50aC0qKG4pXG5cdFx0XHRcdGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRcdHJldHVybiAhIWVsZW0ucGFyZW50Tm9kZTtcblx0XHRcdFx0fSA6XG5cblx0XHRcdFx0ZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdFx0XHR2YXIgY2FjaGUsIHVuaXF1ZUNhY2hlLCBvdXRlckNhY2hlLCBub2RlLCBub2RlSW5kZXgsIHN0YXJ0LFxuXHRcdFx0XHRcdFx0ZGlyID0gc2ltcGxlICE9PSBmb3J3YXJkID8gXCJuZXh0U2libGluZ1wiIDogXCJwcmV2aW91c1NpYmxpbmdcIixcblx0XHRcdFx0XHRcdHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZSxcblx0XHRcdFx0XHRcdG5hbWUgPSBvZlR5cGUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLFxuXHRcdFx0XHRcdFx0dXNlQ2FjaGUgPSAheG1sICYmICFvZlR5cGUsXG5cdFx0XHRcdFx0XHRkaWZmID0gZmFsc2U7XG5cblx0XHRcdFx0XHRpZiAoIHBhcmVudCApIHtcblxuXHRcdFx0XHRcdFx0Ly8gOihmaXJzdHxsYXN0fG9ubHkpLShjaGlsZHxvZi10eXBlKVxuXHRcdFx0XHRcdFx0aWYgKCBzaW1wbGUgKSB7XG5cdFx0XHRcdFx0XHRcdHdoaWxlICggZGlyICkge1xuXHRcdFx0XHRcdFx0XHRcdG5vZGUgPSBlbGVtO1xuXHRcdFx0XHRcdFx0XHRcdHdoaWxlICggKG5vZGUgPSBub2RlWyBkaXIgXSkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoIG9mVHlwZSA/XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbmFtZSA6XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG5vZGUubm9kZVR5cGUgPT09IDEgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHQvLyBSZXZlcnNlIGRpcmVjdGlvbiBmb3IgOm9ubHktKiAoaWYgd2UgaGF2ZW4ndCB5ZXQgZG9uZSBzbylcblx0XHRcdFx0XHRcdFx0XHRzdGFydCA9IGRpciA9IHR5cGUgPT09IFwib25seVwiICYmICFzdGFydCAmJiBcIm5leHRTaWJsaW5nXCI7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdHN0YXJ0ID0gWyBmb3J3YXJkID8gcGFyZW50LmZpcnN0Q2hpbGQgOiBwYXJlbnQubGFzdENoaWxkIF07XG5cblx0XHRcdFx0XHRcdC8vIG5vbi14bWwgOm50aC1jaGlsZCguLi4pIHN0b3JlcyBjYWNoZSBkYXRhIG9uIGBwYXJlbnRgXG5cdFx0XHRcdFx0XHRpZiAoIGZvcndhcmQgJiYgdXNlQ2FjaGUgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gU2VlayBgZWxlbWAgZnJvbSBhIHByZXZpb3VzbHktY2FjaGVkIGluZGV4XG5cblx0XHRcdFx0XHRcdFx0Ly8gLi4uaW4gYSBnemlwLWZyaWVuZGx5IHdheVxuXHRcdFx0XHRcdFx0XHRub2RlID0gcGFyZW50O1xuXHRcdFx0XHRcdFx0XHRvdXRlckNhY2hlID0gbm9kZVsgZXhwYW5kbyBdIHx8IChub2RlWyBleHBhbmRvIF0gPSB7fSk7XG5cblx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPDkgb25seVxuXHRcdFx0XHRcdFx0XHQvLyBEZWZlbmQgYWdhaW5zdCBjbG9uZWQgYXR0cm9wZXJ0aWVzIChqUXVlcnkgZ2gtMTcwOSlcblx0XHRcdFx0XHRcdFx0dW5pcXVlQ2FjaGUgPSBvdXRlckNhY2hlWyBub2RlLnVuaXF1ZUlEIF0gfHxcblx0XHRcdFx0XHRcdFx0XHQob3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBdID0ge30pO1xuXG5cdFx0XHRcdFx0XHRcdGNhY2hlID0gdW5pcXVlQ2FjaGVbIHR5cGUgXSB8fCBbXTtcblx0XHRcdFx0XHRcdFx0bm9kZUluZGV4ID0gY2FjaGVbIDAgXSA9PT0gZGlycnVucyAmJiBjYWNoZVsgMSBdO1xuXHRcdFx0XHRcdFx0XHRkaWZmID0gbm9kZUluZGV4ICYmIGNhY2hlWyAyIF07XG5cdFx0XHRcdFx0XHRcdG5vZGUgPSBub2RlSW5kZXggJiYgcGFyZW50LmNoaWxkTm9kZXNbIG5vZGVJbmRleCBdO1xuXG5cdFx0XHRcdFx0XHRcdHdoaWxlICggKG5vZGUgPSArK25vZGVJbmRleCAmJiBub2RlICYmIG5vZGVbIGRpciBdIHx8XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBGYWxsYmFjayB0byBzZWVraW5nIGBlbGVtYCBmcm9tIHRoZSBzdGFydFxuXHRcdFx0XHRcdFx0XHRcdChkaWZmID0gbm9kZUluZGV4ID0gMCkgfHwgc3RhcnQucG9wKCkpICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gV2hlbiBmb3VuZCwgY2FjaGUgaW5kZXhlcyBvbiBgcGFyZW50YCBhbmQgYnJlYWtcblx0XHRcdFx0XHRcdFx0XHRpZiAoIG5vZGUubm9kZVR5cGUgPT09IDEgJiYgKytkaWZmICYmIG5vZGUgPT09IGVsZW0gKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHR1bmlxdWVDYWNoZVsgdHlwZSBdID0gWyBkaXJydW5zLCBub2RlSW5kZXgsIGRpZmYgXTtcblx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHQvLyBVc2UgcHJldmlvdXNseS1jYWNoZWQgZWxlbWVudCBpbmRleCBpZiBhdmFpbGFibGVcblx0XHRcdFx0XHRcdFx0aWYgKCB1c2VDYWNoZSApIHtcblx0XHRcdFx0XHRcdFx0XHQvLyAuLi5pbiBhIGd6aXAtZnJpZW5kbHkgd2F5XG5cdFx0XHRcdFx0XHRcdFx0bm9kZSA9IGVsZW07XG5cdFx0XHRcdFx0XHRcdFx0b3V0ZXJDYWNoZSA9IG5vZGVbIGV4cGFuZG8gXSB8fCAobm9kZVsgZXhwYW5kbyBdID0ge30pO1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPDkgb25seVxuXHRcdFx0XHRcdFx0XHRcdC8vIERlZmVuZCBhZ2FpbnN0IGNsb25lZCBhdHRyb3BlcnRpZXMgKGpRdWVyeSBnaC0xNzA5KVxuXHRcdFx0XHRcdFx0XHRcdHVuaXF1ZUNhY2hlID0gb3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBdIHx8XG5cdFx0XHRcdFx0XHRcdFx0XHQob3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBdID0ge30pO1xuXG5cdFx0XHRcdFx0XHRcdFx0Y2FjaGUgPSB1bmlxdWVDYWNoZVsgdHlwZSBdIHx8IFtdO1xuXHRcdFx0XHRcdFx0XHRcdG5vZGVJbmRleCA9IGNhY2hlWyAwIF0gPT09IGRpcnJ1bnMgJiYgY2FjaGVbIDEgXTtcblx0XHRcdFx0XHRcdFx0XHRkaWZmID0gbm9kZUluZGV4O1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0Ly8geG1sIDpudGgtY2hpbGQoLi4uKVxuXHRcdFx0XHRcdFx0XHQvLyBvciA6bnRoLWxhc3QtY2hpbGQoLi4uKSBvciA6bnRoKC1sYXN0KT8tb2YtdHlwZSguLi4pXG5cdFx0XHRcdFx0XHRcdGlmICggZGlmZiA9PT0gZmFsc2UgKSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gVXNlIHRoZSBzYW1lIGxvb3AgYXMgYWJvdmUgdG8gc2VlayBgZWxlbWAgZnJvbSB0aGUgc3RhcnRcblx0XHRcdFx0XHRcdFx0XHR3aGlsZSAoIChub2RlID0gKytub2RlSW5kZXggJiYgbm9kZSAmJiBub2RlWyBkaXIgXSB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0KGRpZmYgPSBub2RlSW5kZXggPSAwKSB8fCBzdGFydC5wb3AoKSkgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdGlmICggKCBvZlR5cGUgP1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5hbWUgOlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRub2RlLm5vZGVUeXBlID09PSAxICkgJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0KytkaWZmICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIENhY2hlIHRoZSBpbmRleCBvZiBlYWNoIGVuY291bnRlcmVkIGVsZW1lbnRcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCB1c2VDYWNoZSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvdXRlckNhY2hlID0gbm9kZVsgZXhwYW5kbyBdIHx8IChub2RlWyBleHBhbmRvIF0gPSB7fSk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8OSBvbmx5XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gRGVmZW5kIGFnYWluc3QgY2xvbmVkIGF0dHJvcGVydGllcyAoalF1ZXJ5IGdoLTE3MDkpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dW5pcXVlQ2FjaGUgPSBvdXRlckNhY2hlWyBub2RlLnVuaXF1ZUlEIF0gfHxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdChvdXRlckNhY2hlWyBub2RlLnVuaXF1ZUlEIF0gPSB7fSk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR1bmlxdWVDYWNoZVsgdHlwZSBdID0gWyBkaXJydW5zLCBkaWZmIF07XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIG5vZGUgPT09IGVsZW0gKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Ly8gSW5jb3Jwb3JhdGUgdGhlIG9mZnNldCwgdGhlbiBjaGVjayBhZ2FpbnN0IGN5Y2xlIHNpemVcblx0XHRcdFx0XHRcdGRpZmYgLT0gbGFzdDtcblx0XHRcdFx0XHRcdHJldHVybiBkaWZmID09PSBmaXJzdCB8fCAoIGRpZmYgJSBmaXJzdCA9PT0gMCAmJiBkaWZmIC8gZmlyc3QgPj0gMCApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblx0XHR9LFxuXG5cdFx0XCJQU0VVRE9cIjogZnVuY3Rpb24oIHBzZXVkbywgYXJndW1lbnQgKSB7XG5cdFx0XHQvLyBwc2V1ZG8tY2xhc3MgbmFtZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmVcblx0XHRcdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9ycy8jcHNldWRvLWNsYXNzZXNcblx0XHRcdC8vIFByaW9yaXRpemUgYnkgY2FzZSBzZW5zaXRpdml0eSBpbiBjYXNlIGN1c3RvbSBwc2V1ZG9zIGFyZSBhZGRlZCB3aXRoIHVwcGVyY2FzZSBsZXR0ZXJzXG5cdFx0XHQvLyBSZW1lbWJlciB0aGF0IHNldEZpbHRlcnMgaW5oZXJpdHMgZnJvbSBwc2V1ZG9zXG5cdFx0XHR2YXIgYXJncyxcblx0XHRcdFx0Zm4gPSBFeHByLnBzZXVkb3NbIHBzZXVkbyBdIHx8IEV4cHIuc2V0RmlsdGVyc1sgcHNldWRvLnRvTG93ZXJDYXNlKCkgXSB8fFxuXHRcdFx0XHRcdFNpenpsZS5lcnJvciggXCJ1bnN1cHBvcnRlZCBwc2V1ZG86IFwiICsgcHNldWRvICk7XG5cblx0XHRcdC8vIFRoZSB1c2VyIG1heSB1c2UgY3JlYXRlUHNldWRvIHRvIGluZGljYXRlIHRoYXRcblx0XHRcdC8vIGFyZ3VtZW50cyBhcmUgbmVlZGVkIHRvIGNyZWF0ZSB0aGUgZmlsdGVyIGZ1bmN0aW9uXG5cdFx0XHQvLyBqdXN0IGFzIFNpenpsZSBkb2VzXG5cdFx0XHRpZiAoIGZuWyBleHBhbmRvIF0gKSB7XG5cdFx0XHRcdHJldHVybiBmbiggYXJndW1lbnQgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQnV0IG1haW50YWluIHN1cHBvcnQgZm9yIG9sZCBzaWduYXR1cmVzXG5cdFx0XHRpZiAoIGZuLmxlbmd0aCA+IDEgKSB7XG5cdFx0XHRcdGFyZ3MgPSBbIHBzZXVkbywgcHNldWRvLCBcIlwiLCBhcmd1bWVudCBdO1xuXHRcdFx0XHRyZXR1cm4gRXhwci5zZXRGaWx0ZXJzLmhhc093blByb3BlcnR5KCBwc2V1ZG8udG9Mb3dlckNhc2UoKSApID9cblx0XHRcdFx0XHRtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQsIG1hdGNoZXMgKSB7XG5cdFx0XHRcdFx0XHR2YXIgaWR4LFxuXHRcdFx0XHRcdFx0XHRtYXRjaGVkID0gZm4oIHNlZWQsIGFyZ3VtZW50ICksXG5cdFx0XHRcdFx0XHRcdGkgPSBtYXRjaGVkLmxlbmd0aDtcblx0XHRcdFx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRcdFx0XHRpZHggPSBpbmRleE9mKCBzZWVkLCBtYXRjaGVkW2ldICk7XG5cdFx0XHRcdFx0XHRcdHNlZWRbIGlkeCBdID0gISggbWF0Y2hlc1sgaWR4IF0gPSBtYXRjaGVkW2ldICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSkgOlxuXHRcdFx0XHRcdGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGZuKCBlbGVtLCAwLCBhcmdzICk7XG5cdFx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGZuO1xuXHRcdH1cblx0fSxcblxuXHRwc2V1ZG9zOiB7XG5cdFx0Ly8gUG90ZW50aWFsbHkgY29tcGxleCBwc2V1ZG9zXG5cdFx0XCJub3RcIjogbWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHRcdC8vIFRyaW0gdGhlIHNlbGVjdG9yIHBhc3NlZCB0byBjb21waWxlXG5cdFx0XHQvLyB0byBhdm9pZCB0cmVhdGluZyBsZWFkaW5nIGFuZCB0cmFpbGluZ1xuXHRcdFx0Ly8gc3BhY2VzIGFzIGNvbWJpbmF0b3JzXG5cdFx0XHR2YXIgaW5wdXQgPSBbXSxcblx0XHRcdFx0cmVzdWx0cyA9IFtdLFxuXHRcdFx0XHRtYXRjaGVyID0gY29tcGlsZSggc2VsZWN0b3IucmVwbGFjZSggcnRyaW0sIFwiJDFcIiApICk7XG5cblx0XHRcdHJldHVybiBtYXRjaGVyWyBleHBhbmRvIF0gP1xuXHRcdFx0XHRtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQsIG1hdGNoZXMsIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdFx0XHR2YXIgZWxlbSxcblx0XHRcdFx0XHRcdHVubWF0Y2hlZCA9IG1hdGNoZXIoIHNlZWQsIG51bGwsIHhtbCwgW10gKSxcblx0XHRcdFx0XHRcdGkgPSBzZWVkLmxlbmd0aDtcblxuXHRcdFx0XHRcdC8vIE1hdGNoIGVsZW1lbnRzIHVubWF0Y2hlZCBieSBgbWF0Y2hlcmBcblx0XHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRcdGlmICggKGVsZW0gPSB1bm1hdGNoZWRbaV0pICkge1xuXHRcdFx0XHRcdFx0XHRzZWVkW2ldID0gIShtYXRjaGVzW2ldID0gZWxlbSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KSA6XG5cdFx0XHRcdGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0XHRcdFx0aW5wdXRbMF0gPSBlbGVtO1xuXHRcdFx0XHRcdG1hdGNoZXIoIGlucHV0LCBudWxsLCB4bWwsIHJlc3VsdHMgKTtcblx0XHRcdFx0XHQvLyBEb24ndCBrZWVwIHRoZSBlbGVtZW50IChpc3N1ZSAjMjk5KVxuXHRcdFx0XHRcdGlucHV0WzBdID0gbnVsbDtcblx0XHRcdFx0XHRyZXR1cm4gIXJlc3VsdHMucG9wKCk7XG5cdFx0XHRcdH07XG5cdFx0fSksXG5cblx0XHRcImhhc1wiOiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRyZXR1cm4gU2l6emxlKCBzZWxlY3RvciwgZWxlbSApLmxlbmd0aCA+IDA7XG5cdFx0XHR9O1xuXHRcdH0pLFxuXG5cdFx0XCJjb250YWluc1wiOiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHRleHQgKSB7XG5cdFx0XHR0ZXh0ID0gdGV4dC5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApO1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRyZXR1cm4gKCBlbGVtLnRleHRDb250ZW50IHx8IGVsZW0uaW5uZXJUZXh0IHx8IGdldFRleHQoIGVsZW0gKSApLmluZGV4T2YoIHRleHQgKSA+IC0xO1xuXHRcdFx0fTtcblx0XHR9KSxcblxuXHRcdC8vIFwiV2hldGhlciBhbiBlbGVtZW50IGlzIHJlcHJlc2VudGVkIGJ5IGEgOmxhbmcoKSBzZWxlY3RvclxuXHRcdC8vIGlzIGJhc2VkIHNvbGVseSBvbiB0aGUgZWxlbWVudCdzIGxhbmd1YWdlIHZhbHVlXG5cdFx0Ly8gYmVpbmcgZXF1YWwgdG8gdGhlIGlkZW50aWZpZXIgQyxcblx0XHQvLyBvciBiZWdpbm5pbmcgd2l0aCB0aGUgaWRlbnRpZmllciBDIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IFwiLVwiLlxuXHRcdC8vIFRoZSBtYXRjaGluZyBvZiBDIGFnYWluc3QgdGhlIGVsZW1lbnQncyBsYW5ndWFnZSB2YWx1ZSBpcyBwZXJmb3JtZWQgY2FzZS1pbnNlbnNpdGl2ZWx5LlxuXHRcdC8vIFRoZSBpZGVudGlmaWVyIEMgZG9lcyBub3QgaGF2ZSB0byBiZSBhIHZhbGlkIGxhbmd1YWdlIG5hbWUuXCJcblx0XHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9zZWxlY3RvcnMvI2xhbmctcHNldWRvXG5cdFx0XCJsYW5nXCI6IG1hcmtGdW5jdGlvbiggZnVuY3Rpb24oIGxhbmcgKSB7XG5cdFx0XHQvLyBsYW5nIHZhbHVlIG11c3QgYmUgYSB2YWxpZCBpZGVudGlmaWVyXG5cdFx0XHRpZiAoICFyaWRlbnRpZmllci50ZXN0KGxhbmcgfHwgXCJcIikgKSB7XG5cdFx0XHRcdFNpenpsZS5lcnJvciggXCJ1bnN1cHBvcnRlZCBsYW5nOiBcIiArIGxhbmcgKTtcblx0XHRcdH1cblx0XHRcdGxhbmcgPSBsYW5nLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICkudG9Mb3dlckNhc2UoKTtcblx0XHRcdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0dmFyIGVsZW1MYW5nO1xuXHRcdFx0XHRkbyB7XG5cdFx0XHRcdFx0aWYgKCAoZWxlbUxhbmcgPSBkb2N1bWVudElzSFRNTCA/XG5cdFx0XHRcdFx0XHRlbGVtLmxhbmcgOlxuXHRcdFx0XHRcdFx0ZWxlbS5nZXRBdHRyaWJ1dGUoXCJ4bWw6bGFuZ1wiKSB8fCBlbGVtLmdldEF0dHJpYnV0ZShcImxhbmdcIikpICkge1xuXG5cdFx0XHRcdFx0XHRlbGVtTGFuZyA9IGVsZW1MYW5nLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZWxlbUxhbmcgPT09IGxhbmcgfHwgZWxlbUxhbmcuaW5kZXhPZiggbGFuZyArIFwiLVwiICkgPT09IDA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IHdoaWxlICggKGVsZW0gPSBlbGVtLnBhcmVudE5vZGUpICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKTtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fTtcblx0XHR9KSxcblxuXHRcdC8vIE1pc2NlbGxhbmVvdXNcblx0XHRcInRhcmdldFwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHZhciBoYXNoID0gd2luZG93LmxvY2F0aW9uICYmIHdpbmRvdy5sb2NhdGlvbi5oYXNoO1xuXHRcdFx0cmV0dXJuIGhhc2ggJiYgaGFzaC5zbGljZSggMSApID09PSBlbGVtLmlkO1xuXHRcdH0sXG5cblx0XHRcInJvb3RcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbSA9PT0gZG9jRWxlbTtcblx0XHR9LFxuXG5cdFx0XCJmb2N1c1wiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiBlbGVtID09PSBkb2N1bWVudC5hY3RpdmVFbGVtZW50ICYmICghZG9jdW1lbnQuaGFzRm9jdXMgfHwgZG9jdW1lbnQuaGFzRm9jdXMoKSkgJiYgISEoZWxlbS50eXBlIHx8IGVsZW0uaHJlZiB8fCB+ZWxlbS50YWJJbmRleCk7XG5cdFx0fSxcblxuXHRcdC8vIEJvb2xlYW4gcHJvcGVydGllc1xuXHRcdFwiZW5hYmxlZFwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiBlbGVtLmRpc2FibGVkID09PSBmYWxzZTtcblx0XHR9LFxuXG5cdFx0XCJkaXNhYmxlZFwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiBlbGVtLmRpc2FibGVkID09PSB0cnVlO1xuXHRcdH0sXG5cblx0XHRcImNoZWNrZWRcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHQvLyBJbiBDU1MzLCA6Y2hlY2tlZCBzaG91bGQgcmV0dXJuIGJvdGggY2hlY2tlZCBhbmQgc2VsZWN0ZWQgZWxlbWVudHNcblx0XHRcdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMTEvUkVDLWNzczMtc2VsZWN0b3JzLTIwMTEwOTI5LyNjaGVja2VkXG5cdFx0XHR2YXIgbm9kZU5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRyZXR1cm4gKG5vZGVOYW1lID09PSBcImlucHV0XCIgJiYgISFlbGVtLmNoZWNrZWQpIHx8IChub2RlTmFtZSA9PT0gXCJvcHRpb25cIiAmJiAhIWVsZW0uc2VsZWN0ZWQpO1xuXHRcdH0sXG5cblx0XHRcInNlbGVjdGVkXCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0Ly8gQWNjZXNzaW5nIHRoaXMgcHJvcGVydHkgbWFrZXMgc2VsZWN0ZWQtYnktZGVmYXVsdFxuXHRcdFx0Ly8gb3B0aW9ucyBpbiBTYWZhcmkgd29yayBwcm9wZXJseVxuXHRcdFx0aWYgKCBlbGVtLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdGVsZW0ucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZWxlbS5zZWxlY3RlZCA9PT0gdHJ1ZTtcblx0XHR9LFxuXG5cdFx0Ly8gQ29udGVudHNcblx0XHRcImVtcHR5XCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNlbXB0eS1wc2V1ZG9cblx0XHRcdC8vIDplbXB0eSBpcyBuZWdhdGVkIGJ5IGVsZW1lbnQgKDEpIG9yIGNvbnRlbnQgbm9kZXMgKHRleHQ6IDM7IGNkYXRhOiA0OyBlbnRpdHkgcmVmOiA1KSxcblx0XHRcdC8vICAgYnV0IG5vdCBieSBvdGhlcnMgKGNvbW1lbnQ6IDg7IHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb246IDc7IGV0Yy4pXG5cdFx0XHQvLyBub2RlVHlwZSA8IDYgd29ya3MgYmVjYXVzZSBhdHRyaWJ1dGVzICgyKSBkbyBub3QgYXBwZWFyIGFzIGNoaWxkcmVuXG5cdFx0XHRmb3IgKCBlbGVtID0gZWxlbS5maXJzdENoaWxkOyBlbGVtOyBlbGVtID0gZWxlbS5uZXh0U2libGluZyApIHtcblx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlIDwgNiApIHtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0sXG5cblx0XHRcInBhcmVudFwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiAhRXhwci5wc2V1ZG9zW1wiZW1wdHlcIl0oIGVsZW0gKTtcblx0XHR9LFxuXG5cdFx0Ly8gRWxlbWVudC9pbnB1dCB0eXBlc1xuXHRcdFwiaGVhZGVyXCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIHJoZWFkZXIudGVzdCggZWxlbS5ub2RlTmFtZSApO1xuXHRcdH0sXG5cblx0XHRcImlucHV0XCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIHJpbnB1dHMudGVzdCggZWxlbS5ub2RlTmFtZSApO1xuXHRcdH0sXG5cblx0XHRcImJ1dHRvblwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHZhciBuYW1lID0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0cmV0dXJuIG5hbWUgPT09IFwiaW5wdXRcIiAmJiBlbGVtLnR5cGUgPT09IFwiYnV0dG9uXCIgfHwgbmFtZSA9PT0gXCJidXR0b25cIjtcblx0XHR9LFxuXG5cdFx0XCJ0ZXh0XCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0dmFyIGF0dHI7XG5cdFx0XHRyZXR1cm4gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImlucHV0XCIgJiZcblx0XHRcdFx0ZWxlbS50eXBlID09PSBcInRleHRcIiAmJlxuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IElFPDhcblx0XHRcdFx0Ly8gTmV3IEhUTUw1IGF0dHJpYnV0ZSB2YWx1ZXMgKGUuZy4sIFwic2VhcmNoXCIpIGFwcGVhciB3aXRoIGVsZW0udHlwZSA9PT0gXCJ0ZXh0XCJcblx0XHRcdFx0KCAoYXR0ciA9IGVsZW0uZ2V0QXR0cmlidXRlKFwidHlwZVwiKSkgPT0gbnVsbCB8fCBhdHRyLnRvTG93ZXJDYXNlKCkgPT09IFwidGV4dFwiICk7XG5cdFx0fSxcblxuXHRcdC8vIFBvc2l0aW9uLWluLWNvbGxlY3Rpb25cblx0XHRcImZpcnN0XCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gWyAwIF07XG5cdFx0fSksXG5cblx0XHRcImxhc3RcIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGggKSB7XG5cdFx0XHRyZXR1cm4gWyBsZW5ndGggLSAxIF07XG5cdFx0fSksXG5cblx0XHRcImVxXCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoLCBhcmd1bWVudCApIHtcblx0XHRcdHJldHVybiBbIGFyZ3VtZW50IDwgMCA/IGFyZ3VtZW50ICsgbGVuZ3RoIDogYXJndW1lbnQgXTtcblx0XHR9KSxcblxuXHRcdFwiZXZlblwiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCApIHtcblx0XHRcdHZhciBpID0gMDtcblx0XHRcdGZvciAoIDsgaSA8IGxlbmd0aDsgaSArPSAyICkge1xuXHRcdFx0XHRtYXRjaEluZGV4ZXMucHVzaCggaSApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG1hdGNoSW5kZXhlcztcblx0XHR9KSxcblxuXHRcdFwib2RkXCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoICkge1xuXHRcdFx0dmFyIGkgPSAxO1xuXHRcdFx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpICs9IDIgKSB7XG5cdFx0XHRcdG1hdGNoSW5kZXhlcy5wdXNoKCBpICk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbWF0Y2hJbmRleGVzO1xuXHRcdH0pLFxuXG5cdFx0XCJsdFwiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCwgYXJndW1lbnQgKSB7XG5cdFx0XHR2YXIgaSA9IGFyZ3VtZW50IDwgMCA/IGFyZ3VtZW50ICsgbGVuZ3RoIDogYXJndW1lbnQ7XG5cdFx0XHRmb3IgKCA7IC0taSA+PSAwOyApIHtcblx0XHRcdFx0bWF0Y2hJbmRleGVzLnB1c2goIGkgKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBtYXRjaEluZGV4ZXM7XG5cdFx0fSksXG5cblx0XHRcImd0XCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoLCBhcmd1bWVudCApIHtcblx0XHRcdHZhciBpID0gYXJndW1lbnQgPCAwID8gYXJndW1lbnQgKyBsZW5ndGggOiBhcmd1bWVudDtcblx0XHRcdGZvciAoIDsgKytpIDwgbGVuZ3RoOyApIHtcblx0XHRcdFx0bWF0Y2hJbmRleGVzLnB1c2goIGkgKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBtYXRjaEluZGV4ZXM7XG5cdFx0fSlcblx0fVxufTtcblxuRXhwci5wc2V1ZG9zW1wibnRoXCJdID0gRXhwci5wc2V1ZG9zW1wiZXFcIl07XG5cbi8vIEFkZCBidXR0b24vaW5wdXQgdHlwZSBwc2V1ZG9zXG5mb3IgKCBpIGluIHsgcmFkaW86IHRydWUsIGNoZWNrYm94OiB0cnVlLCBmaWxlOiB0cnVlLCBwYXNzd29yZDogdHJ1ZSwgaW1hZ2U6IHRydWUgfSApIHtcblx0RXhwci5wc2V1ZG9zWyBpIF0gPSBjcmVhdGVJbnB1dFBzZXVkbyggaSApO1xufVxuZm9yICggaSBpbiB7IHN1Ym1pdDogdHJ1ZSwgcmVzZXQ6IHRydWUgfSApIHtcblx0RXhwci5wc2V1ZG9zWyBpIF0gPSBjcmVhdGVCdXR0b25Qc2V1ZG8oIGkgKTtcbn1cblxuLy8gRWFzeSBBUEkgZm9yIGNyZWF0aW5nIG5ldyBzZXRGaWx0ZXJzXG5mdW5jdGlvbiBzZXRGaWx0ZXJzKCkge31cbnNldEZpbHRlcnMucHJvdG90eXBlID0gRXhwci5maWx0ZXJzID0gRXhwci5wc2V1ZG9zO1xuRXhwci5zZXRGaWx0ZXJzID0gbmV3IHNldEZpbHRlcnMoKTtcblxudG9rZW5pemUgPSBTaXp6bGUudG9rZW5pemUgPSBmdW5jdGlvbiggc2VsZWN0b3IsIHBhcnNlT25seSApIHtcblx0dmFyIG1hdGNoZWQsIG1hdGNoLCB0b2tlbnMsIHR5cGUsXG5cdFx0c29GYXIsIGdyb3VwcywgcHJlRmlsdGVycyxcblx0XHRjYWNoZWQgPSB0b2tlbkNhY2hlWyBzZWxlY3RvciArIFwiIFwiIF07XG5cblx0aWYgKCBjYWNoZWQgKSB7XG5cdFx0cmV0dXJuIHBhcnNlT25seSA/IDAgOiBjYWNoZWQuc2xpY2UoIDAgKTtcblx0fVxuXG5cdHNvRmFyID0gc2VsZWN0b3I7XG5cdGdyb3VwcyA9IFtdO1xuXHRwcmVGaWx0ZXJzID0gRXhwci5wcmVGaWx0ZXI7XG5cblx0d2hpbGUgKCBzb0ZhciApIHtcblxuXHRcdC8vIENvbW1hIGFuZCBmaXJzdCBydW5cblx0XHRpZiAoICFtYXRjaGVkIHx8IChtYXRjaCA9IHJjb21tYS5leGVjKCBzb0ZhciApKSApIHtcblx0XHRcdGlmICggbWF0Y2ggKSB7XG5cdFx0XHRcdC8vIERvbid0IGNvbnN1bWUgdHJhaWxpbmcgY29tbWFzIGFzIHZhbGlkXG5cdFx0XHRcdHNvRmFyID0gc29GYXIuc2xpY2UoIG1hdGNoWzBdLmxlbmd0aCApIHx8IHNvRmFyO1xuXHRcdFx0fVxuXHRcdFx0Z3JvdXBzLnB1c2goICh0b2tlbnMgPSBbXSkgKTtcblx0XHR9XG5cblx0XHRtYXRjaGVkID0gZmFsc2U7XG5cblx0XHQvLyBDb21iaW5hdG9yc1xuXHRcdGlmICggKG1hdGNoID0gcmNvbWJpbmF0b3JzLmV4ZWMoIHNvRmFyICkpICkge1xuXHRcdFx0bWF0Y2hlZCA9IG1hdGNoLnNoaWZ0KCk7XG5cdFx0XHR0b2tlbnMucHVzaCh7XG5cdFx0XHRcdHZhbHVlOiBtYXRjaGVkLFxuXHRcdFx0XHQvLyBDYXN0IGRlc2NlbmRhbnQgY29tYmluYXRvcnMgdG8gc3BhY2Vcblx0XHRcdFx0dHlwZTogbWF0Y2hbMF0ucmVwbGFjZSggcnRyaW0sIFwiIFwiIClcblx0XHRcdH0pO1xuXHRcdFx0c29GYXIgPSBzb0Zhci5zbGljZSggbWF0Y2hlZC5sZW5ndGggKTtcblx0XHR9XG5cblx0XHQvLyBGaWx0ZXJzXG5cdFx0Zm9yICggdHlwZSBpbiBFeHByLmZpbHRlciApIHtcblx0XHRcdGlmICggKG1hdGNoID0gbWF0Y2hFeHByWyB0eXBlIF0uZXhlYyggc29GYXIgKSkgJiYgKCFwcmVGaWx0ZXJzWyB0eXBlIF0gfHxcblx0XHRcdFx0KG1hdGNoID0gcHJlRmlsdGVyc1sgdHlwZSBdKCBtYXRjaCApKSkgKSB7XG5cdFx0XHRcdG1hdGNoZWQgPSBtYXRjaC5zaGlmdCgpO1xuXHRcdFx0XHR0b2tlbnMucHVzaCh7XG5cdFx0XHRcdFx0dmFsdWU6IG1hdGNoZWQsXG5cdFx0XHRcdFx0dHlwZTogdHlwZSxcblx0XHRcdFx0XHRtYXRjaGVzOiBtYXRjaFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0c29GYXIgPSBzb0Zhci5zbGljZSggbWF0Y2hlZC5sZW5ndGggKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoICFtYXRjaGVkICkge1xuXHRcdFx0YnJlYWs7XG5cdFx0fVxuXHR9XG5cblx0Ly8gUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGludmFsaWQgZXhjZXNzXG5cdC8vIGlmIHdlJ3JlIGp1c3QgcGFyc2luZ1xuXHQvLyBPdGhlcndpc2UsIHRocm93IGFuIGVycm9yIG9yIHJldHVybiB0b2tlbnNcblx0cmV0dXJuIHBhcnNlT25seSA/XG5cdFx0c29GYXIubGVuZ3RoIDpcblx0XHRzb0ZhciA/XG5cdFx0XHRTaXp6bGUuZXJyb3IoIHNlbGVjdG9yICkgOlxuXHRcdFx0Ly8gQ2FjaGUgdGhlIHRva2Vuc1xuXHRcdFx0dG9rZW5DYWNoZSggc2VsZWN0b3IsIGdyb3VwcyApLnNsaWNlKCAwICk7XG59O1xuXG5mdW5jdGlvbiB0b1NlbGVjdG9yKCB0b2tlbnMgKSB7XG5cdHZhciBpID0gMCxcblx0XHRsZW4gPSB0b2tlbnMubGVuZ3RoLFxuXHRcdHNlbGVjdG9yID0gXCJcIjtcblx0Zm9yICggOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0c2VsZWN0b3IgKz0gdG9rZW5zW2ldLnZhbHVlO1xuXHR9XG5cdHJldHVybiBzZWxlY3Rvcjtcbn1cblxuZnVuY3Rpb24gYWRkQ29tYmluYXRvciggbWF0Y2hlciwgY29tYmluYXRvciwgYmFzZSApIHtcblx0dmFyIGRpciA9IGNvbWJpbmF0b3IuZGlyLFxuXHRcdGNoZWNrTm9uRWxlbWVudHMgPSBiYXNlICYmIGRpciA9PT0gXCJwYXJlbnROb2RlXCIsXG5cdFx0ZG9uZU5hbWUgPSBkb25lKys7XG5cblx0cmV0dXJuIGNvbWJpbmF0b3IuZmlyc3QgP1xuXHRcdC8vIENoZWNrIGFnYWluc3QgY2xvc2VzdCBhbmNlc3Rvci9wcmVjZWRpbmcgZWxlbWVudFxuXHRcdGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0XHR3aGlsZSAoIChlbGVtID0gZWxlbVsgZGlyIF0pICkge1xuXHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgfHwgY2hlY2tOb25FbGVtZW50cyApIHtcblx0XHRcdFx0XHRyZXR1cm4gbWF0Y2hlciggZWxlbSwgY29udGV4dCwgeG1sICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IDpcblxuXHRcdC8vIENoZWNrIGFnYWluc3QgYWxsIGFuY2VzdG9yL3ByZWNlZGluZyBlbGVtZW50c1xuXHRcdGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0XHR2YXIgb2xkQ2FjaGUsIHVuaXF1ZUNhY2hlLCBvdXRlckNhY2hlLFxuXHRcdFx0XHRuZXdDYWNoZSA9IFsgZGlycnVucywgZG9uZU5hbWUgXTtcblxuXHRcdFx0Ly8gV2UgY2FuJ3Qgc2V0IGFyYml0cmFyeSBkYXRhIG9uIFhNTCBub2Rlcywgc28gdGhleSBkb24ndCBiZW5lZml0IGZyb20gY29tYmluYXRvciBjYWNoaW5nXG5cdFx0XHRpZiAoIHhtbCApIHtcblx0XHRcdFx0d2hpbGUgKCAoZWxlbSA9IGVsZW1bIGRpciBdKSApIHtcblx0XHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgfHwgY2hlY2tOb25FbGVtZW50cyApIHtcblx0XHRcdFx0XHRcdGlmICggbWF0Y2hlciggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0d2hpbGUgKCAoZWxlbSA9IGVsZW1bIGRpciBdKSApIHtcblx0XHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgfHwgY2hlY2tOb25FbGVtZW50cyApIHtcblx0XHRcdFx0XHRcdG91dGVyQ2FjaGUgPSBlbGVtWyBleHBhbmRvIF0gfHwgKGVsZW1bIGV4cGFuZG8gXSA9IHt9KTtcblxuXHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPDkgb25seVxuXHRcdFx0XHRcdFx0Ly8gRGVmZW5kIGFnYWluc3QgY2xvbmVkIGF0dHJvcGVydGllcyAoalF1ZXJ5IGdoLTE3MDkpXG5cdFx0XHRcdFx0XHR1bmlxdWVDYWNoZSA9IG91dGVyQ2FjaGVbIGVsZW0udW5pcXVlSUQgXSB8fCAob3V0ZXJDYWNoZVsgZWxlbS51bmlxdWVJRCBdID0ge30pO1xuXG5cdFx0XHRcdFx0XHRpZiAoIChvbGRDYWNoZSA9IHVuaXF1ZUNhY2hlWyBkaXIgXSkgJiZcblx0XHRcdFx0XHRcdFx0b2xkQ2FjaGVbIDAgXSA9PT0gZGlycnVucyAmJiBvbGRDYWNoZVsgMSBdID09PSBkb25lTmFtZSApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBBc3NpZ24gdG8gbmV3Q2FjaGUgc28gcmVzdWx0cyBiYWNrLXByb3BhZ2F0ZSB0byBwcmV2aW91cyBlbGVtZW50c1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gKG5ld0NhY2hlWyAyIF0gPSBvbGRDYWNoZVsgMiBdKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdC8vIFJldXNlIG5ld2NhY2hlIHNvIHJlc3VsdHMgYmFjay1wcm9wYWdhdGUgdG8gcHJldmlvdXMgZWxlbWVudHNcblx0XHRcdFx0XHRcdFx0dW5pcXVlQ2FjaGVbIGRpciBdID0gbmV3Q2FjaGU7XG5cblx0XHRcdFx0XHRcdFx0Ly8gQSBtYXRjaCBtZWFucyB3ZSdyZSBkb25lOyBhIGZhaWwgbWVhbnMgd2UgaGF2ZSB0byBrZWVwIGNoZWNraW5nXG5cdFx0XHRcdFx0XHRcdGlmICggKG5ld0NhY2hlWyAyIF0gPSBtYXRjaGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKSkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xufVxuXG5mdW5jdGlvbiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKSB7XG5cdHJldHVybiBtYXRjaGVycy5sZW5ndGggPiAxID9cblx0XHRmdW5jdGlvbiggZWxlbSwgY29udGV4dCwgeG1sICkge1xuXHRcdFx0dmFyIGkgPSBtYXRjaGVycy5sZW5ndGg7XG5cdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0aWYgKCAhbWF0Y2hlcnNbaV0oIGVsZW0sIGNvbnRleHQsIHhtbCApICkge1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSA6XG5cdFx0bWF0Y2hlcnNbMF07XG59XG5cbmZ1bmN0aW9uIG11bHRpcGxlQ29udGV4dHMoIHNlbGVjdG9yLCBjb250ZXh0cywgcmVzdWx0cyApIHtcblx0dmFyIGkgPSAwLFxuXHRcdGxlbiA9IGNvbnRleHRzLmxlbmd0aDtcblx0Zm9yICggOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0U2l6emxlKCBzZWxlY3RvciwgY29udGV4dHNbaV0sIHJlc3VsdHMgKTtcblx0fVxuXHRyZXR1cm4gcmVzdWx0cztcbn1cblxuZnVuY3Rpb24gY29uZGVuc2UoIHVubWF0Y2hlZCwgbWFwLCBmaWx0ZXIsIGNvbnRleHQsIHhtbCApIHtcblx0dmFyIGVsZW0sXG5cdFx0bmV3VW5tYXRjaGVkID0gW10sXG5cdFx0aSA9IDAsXG5cdFx0bGVuID0gdW5tYXRjaGVkLmxlbmd0aCxcblx0XHRtYXBwZWQgPSBtYXAgIT0gbnVsbDtcblxuXHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRpZiAoIChlbGVtID0gdW5tYXRjaGVkW2ldKSApIHtcblx0XHRcdGlmICggIWZpbHRlciB8fCBmaWx0ZXIoIGVsZW0sIGNvbnRleHQsIHhtbCApICkge1xuXHRcdFx0XHRuZXdVbm1hdGNoZWQucHVzaCggZWxlbSApO1xuXHRcdFx0XHRpZiAoIG1hcHBlZCApIHtcblx0XHRcdFx0XHRtYXAucHVzaCggaSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIG5ld1VubWF0Y2hlZDtcbn1cblxuZnVuY3Rpb24gc2V0TWF0Y2hlciggcHJlRmlsdGVyLCBzZWxlY3RvciwgbWF0Y2hlciwgcG9zdEZpbHRlciwgcG9zdEZpbmRlciwgcG9zdFNlbGVjdG9yICkge1xuXHRpZiAoIHBvc3RGaWx0ZXIgJiYgIXBvc3RGaWx0ZXJbIGV4cGFuZG8gXSApIHtcblx0XHRwb3N0RmlsdGVyID0gc2V0TWF0Y2hlciggcG9zdEZpbHRlciApO1xuXHR9XG5cdGlmICggcG9zdEZpbmRlciAmJiAhcG9zdEZpbmRlclsgZXhwYW5kbyBdICkge1xuXHRcdHBvc3RGaW5kZXIgPSBzZXRNYXRjaGVyKCBwb3N0RmluZGVyLCBwb3N0U2VsZWN0b3IgKTtcblx0fVxuXHRyZXR1cm4gbWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCBzZWVkLCByZXN1bHRzLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0dmFyIHRlbXAsIGksIGVsZW0sXG5cdFx0XHRwcmVNYXAgPSBbXSxcblx0XHRcdHBvc3RNYXAgPSBbXSxcblx0XHRcdHByZWV4aXN0aW5nID0gcmVzdWx0cy5sZW5ndGgsXG5cblx0XHRcdC8vIEdldCBpbml0aWFsIGVsZW1lbnRzIGZyb20gc2VlZCBvciBjb250ZXh0XG5cdFx0XHRlbGVtcyA9IHNlZWQgfHwgbXVsdGlwbGVDb250ZXh0cyggc2VsZWN0b3IgfHwgXCIqXCIsIGNvbnRleHQubm9kZVR5cGUgPyBbIGNvbnRleHQgXSA6IGNvbnRleHQsIFtdICksXG5cblx0XHRcdC8vIFByZWZpbHRlciB0byBnZXQgbWF0Y2hlciBpbnB1dCwgcHJlc2VydmluZyBhIG1hcCBmb3Igc2VlZC1yZXN1bHRzIHN5bmNocm9uaXphdGlvblxuXHRcdFx0bWF0Y2hlckluID0gcHJlRmlsdGVyICYmICggc2VlZCB8fCAhc2VsZWN0b3IgKSA/XG5cdFx0XHRcdGNvbmRlbnNlKCBlbGVtcywgcHJlTWFwLCBwcmVGaWx0ZXIsIGNvbnRleHQsIHhtbCApIDpcblx0XHRcdFx0ZWxlbXMsXG5cblx0XHRcdG1hdGNoZXJPdXQgPSBtYXRjaGVyID9cblx0XHRcdFx0Ly8gSWYgd2UgaGF2ZSBhIHBvc3RGaW5kZXIsIG9yIGZpbHRlcmVkIHNlZWQsIG9yIG5vbi1zZWVkIHBvc3RGaWx0ZXIgb3IgcHJlZXhpc3RpbmcgcmVzdWx0cyxcblx0XHRcdFx0cG9zdEZpbmRlciB8fCAoIHNlZWQgPyBwcmVGaWx0ZXIgOiBwcmVleGlzdGluZyB8fCBwb3N0RmlsdGVyICkgP1xuXG5cdFx0XHRcdFx0Ly8gLi4uaW50ZXJtZWRpYXRlIHByb2Nlc3NpbmcgaXMgbmVjZXNzYXJ5XG5cdFx0XHRcdFx0W10gOlxuXG5cdFx0XHRcdFx0Ly8gLi4ub3RoZXJ3aXNlIHVzZSByZXN1bHRzIGRpcmVjdGx5XG5cdFx0XHRcdFx0cmVzdWx0cyA6XG5cdFx0XHRcdG1hdGNoZXJJbjtcblxuXHRcdC8vIEZpbmQgcHJpbWFyeSBtYXRjaGVzXG5cdFx0aWYgKCBtYXRjaGVyICkge1xuXHRcdFx0bWF0Y2hlciggbWF0Y2hlckluLCBtYXRjaGVyT3V0LCBjb250ZXh0LCB4bWwgKTtcblx0XHR9XG5cblx0XHQvLyBBcHBseSBwb3N0RmlsdGVyXG5cdFx0aWYgKCBwb3N0RmlsdGVyICkge1xuXHRcdFx0dGVtcCA9IGNvbmRlbnNlKCBtYXRjaGVyT3V0LCBwb3N0TWFwICk7XG5cdFx0XHRwb3N0RmlsdGVyKCB0ZW1wLCBbXSwgY29udGV4dCwgeG1sICk7XG5cblx0XHRcdC8vIFVuLW1hdGNoIGZhaWxpbmcgZWxlbWVudHMgYnkgbW92aW5nIHRoZW0gYmFjayB0byBtYXRjaGVySW5cblx0XHRcdGkgPSB0ZW1wLmxlbmd0aDtcblx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRpZiAoIChlbGVtID0gdGVtcFtpXSkgKSB7XG5cdFx0XHRcdFx0bWF0Y2hlck91dFsgcG9zdE1hcFtpXSBdID0gIShtYXRjaGVySW5bIHBvc3RNYXBbaV0gXSA9IGVsZW0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKCBzZWVkICkge1xuXHRcdFx0aWYgKCBwb3N0RmluZGVyIHx8IHByZUZpbHRlciApIHtcblx0XHRcdFx0aWYgKCBwb3N0RmluZGVyICkge1xuXHRcdFx0XHRcdC8vIEdldCB0aGUgZmluYWwgbWF0Y2hlck91dCBieSBjb25kZW5zaW5nIHRoaXMgaW50ZXJtZWRpYXRlIGludG8gcG9zdEZpbmRlciBjb250ZXh0c1xuXHRcdFx0XHRcdHRlbXAgPSBbXTtcblx0XHRcdFx0XHRpID0gbWF0Y2hlck91dC5sZW5ndGg7XG5cdFx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0XHRpZiAoIChlbGVtID0gbWF0Y2hlck91dFtpXSkgKSB7XG5cdFx0XHRcdFx0XHRcdC8vIFJlc3RvcmUgbWF0Y2hlckluIHNpbmNlIGVsZW0gaXMgbm90IHlldCBhIGZpbmFsIG1hdGNoXG5cdFx0XHRcdFx0XHRcdHRlbXAucHVzaCggKG1hdGNoZXJJbltpXSA9IGVsZW0pICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHBvc3RGaW5kZXIoIG51bGwsIChtYXRjaGVyT3V0ID0gW10pLCB0ZW1wLCB4bWwgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIE1vdmUgbWF0Y2hlZCBlbGVtZW50cyBmcm9tIHNlZWQgdG8gcmVzdWx0cyB0byBrZWVwIHRoZW0gc3luY2hyb25pemVkXG5cdFx0XHRcdGkgPSBtYXRjaGVyT3V0Lmxlbmd0aDtcblx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0aWYgKCAoZWxlbSA9IG1hdGNoZXJPdXRbaV0pICYmXG5cdFx0XHRcdFx0XHQodGVtcCA9IHBvc3RGaW5kZXIgPyBpbmRleE9mKCBzZWVkLCBlbGVtICkgOiBwcmVNYXBbaV0pID4gLTEgKSB7XG5cblx0XHRcdFx0XHRcdHNlZWRbdGVtcF0gPSAhKHJlc3VsdHNbdGVtcF0gPSBlbGVtKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdC8vIEFkZCBlbGVtZW50cyB0byByZXN1bHRzLCB0aHJvdWdoIHBvc3RGaW5kZXIgaWYgZGVmaW5lZFxuXHRcdH0gZWxzZSB7XG5cdFx0XHRtYXRjaGVyT3V0ID0gY29uZGVuc2UoXG5cdFx0XHRcdG1hdGNoZXJPdXQgPT09IHJlc3VsdHMgP1xuXHRcdFx0XHRcdG1hdGNoZXJPdXQuc3BsaWNlKCBwcmVleGlzdGluZywgbWF0Y2hlck91dC5sZW5ndGggKSA6XG5cdFx0XHRcdFx0bWF0Y2hlck91dFxuXHRcdFx0KTtcblx0XHRcdGlmICggcG9zdEZpbmRlciApIHtcblx0XHRcdFx0cG9zdEZpbmRlciggbnVsbCwgcmVzdWx0cywgbWF0Y2hlck91dCwgeG1sICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRwdXNoLmFwcGx5KCByZXN1bHRzLCBtYXRjaGVyT3V0ICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcbn1cblxuZnVuY3Rpb24gbWF0Y2hlckZyb21Ub2tlbnMoIHRva2VucyApIHtcblx0dmFyIGNoZWNrQ29udGV4dCwgbWF0Y2hlciwgaixcblx0XHRsZW4gPSB0b2tlbnMubGVuZ3RoLFxuXHRcdGxlYWRpbmdSZWxhdGl2ZSA9IEV4cHIucmVsYXRpdmVbIHRva2Vuc1swXS50eXBlIF0sXG5cdFx0aW1wbGljaXRSZWxhdGl2ZSA9IGxlYWRpbmdSZWxhdGl2ZSB8fCBFeHByLnJlbGF0aXZlW1wiIFwiXSxcblx0XHRpID0gbGVhZGluZ1JlbGF0aXZlID8gMSA6IDAsXG5cblx0XHQvLyBUaGUgZm91bmRhdGlvbmFsIG1hdGNoZXIgZW5zdXJlcyB0aGF0IGVsZW1lbnRzIGFyZSByZWFjaGFibGUgZnJvbSB0b3AtbGV2ZWwgY29udGV4dChzKVxuXHRcdG1hdGNoQ29udGV4dCA9IGFkZENvbWJpbmF0b3IoIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGVsZW0gPT09IGNoZWNrQ29udGV4dDtcblx0XHR9LCBpbXBsaWNpdFJlbGF0aXZlLCB0cnVlICksXG5cdFx0bWF0Y2hBbnlDb250ZXh0ID0gYWRkQ29tYmluYXRvciggZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gaW5kZXhPZiggY2hlY2tDb250ZXh0LCBlbGVtICkgPiAtMTtcblx0XHR9LCBpbXBsaWNpdFJlbGF0aXZlLCB0cnVlICksXG5cdFx0bWF0Y2hlcnMgPSBbIGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0XHR2YXIgcmV0ID0gKCAhbGVhZGluZ1JlbGF0aXZlICYmICggeG1sIHx8IGNvbnRleHQgIT09IG91dGVybW9zdENvbnRleHQgKSApIHx8IChcblx0XHRcdFx0KGNoZWNrQ29udGV4dCA9IGNvbnRleHQpLm5vZGVUeXBlID9cblx0XHRcdFx0XHRtYXRjaENvbnRleHQoIGVsZW0sIGNvbnRleHQsIHhtbCApIDpcblx0XHRcdFx0XHRtYXRjaEFueUNvbnRleHQoIGVsZW0sIGNvbnRleHQsIHhtbCApICk7XG5cdFx0XHQvLyBBdm9pZCBoYW5naW5nIG9udG8gZWxlbWVudCAoaXNzdWUgIzI5OSlcblx0XHRcdGNoZWNrQ29udGV4dCA9IG51bGw7XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH0gXTtcblxuXHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRpZiAoIChtYXRjaGVyID0gRXhwci5yZWxhdGl2ZVsgdG9rZW5zW2ldLnR5cGUgXSkgKSB7XG5cdFx0XHRtYXRjaGVycyA9IFsgYWRkQ29tYmluYXRvcihlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKSwgbWF0Y2hlcikgXTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bWF0Y2hlciA9IEV4cHIuZmlsdGVyWyB0b2tlbnNbaV0udHlwZSBdLmFwcGx5KCBudWxsLCB0b2tlbnNbaV0ubWF0Y2hlcyApO1xuXG5cdFx0XHQvLyBSZXR1cm4gc3BlY2lhbCB1cG9uIHNlZWluZyBhIHBvc2l0aW9uYWwgbWF0Y2hlclxuXHRcdFx0aWYgKCBtYXRjaGVyWyBleHBhbmRvIF0gKSB7XG5cdFx0XHRcdC8vIEZpbmQgdGhlIG5leHQgcmVsYXRpdmUgb3BlcmF0b3IgKGlmIGFueSkgZm9yIHByb3BlciBoYW5kbGluZ1xuXHRcdFx0XHRqID0gKytpO1xuXHRcdFx0XHRmb3IgKCA7IGogPCBsZW47IGorKyApIHtcblx0XHRcdFx0XHRpZiAoIEV4cHIucmVsYXRpdmVbIHRva2Vuc1tqXS50eXBlIF0gKSB7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHNldE1hdGNoZXIoXG5cdFx0XHRcdFx0aSA+IDEgJiYgZWxlbWVudE1hdGNoZXIoIG1hdGNoZXJzICksXG5cdFx0XHRcdFx0aSA+IDEgJiYgdG9TZWxlY3Rvcihcblx0XHRcdFx0XHRcdC8vIElmIHRoZSBwcmVjZWRpbmcgdG9rZW4gd2FzIGEgZGVzY2VuZGFudCBjb21iaW5hdG9yLCBpbnNlcnQgYW4gaW1wbGljaXQgYW55LWVsZW1lbnQgYCpgXG5cdFx0XHRcdFx0XHR0b2tlbnMuc2xpY2UoIDAsIGkgLSAxICkuY29uY2F0KHsgdmFsdWU6IHRva2Vuc1sgaSAtIDIgXS50eXBlID09PSBcIiBcIiA/IFwiKlwiIDogXCJcIiB9KVxuXHRcdFx0XHRcdCkucmVwbGFjZSggcnRyaW0sIFwiJDFcIiApLFxuXHRcdFx0XHRcdG1hdGNoZXIsXG5cdFx0XHRcdFx0aSA8IGogJiYgbWF0Y2hlckZyb21Ub2tlbnMoIHRva2Vucy5zbGljZSggaSwgaiApICksXG5cdFx0XHRcdFx0aiA8IGxlbiAmJiBtYXRjaGVyRnJvbVRva2VucyggKHRva2VucyA9IHRva2Vucy5zbGljZSggaiApKSApLFxuXHRcdFx0XHRcdGogPCBsZW4gJiYgdG9TZWxlY3RvciggdG9rZW5zIClcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHRcdG1hdGNoZXJzLnB1c2goIG1hdGNoZXIgKTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gZWxlbWVudE1hdGNoZXIoIG1hdGNoZXJzICk7XG59XG5cbmZ1bmN0aW9uIG1hdGNoZXJGcm9tR3JvdXBNYXRjaGVycyggZWxlbWVudE1hdGNoZXJzLCBzZXRNYXRjaGVycyApIHtcblx0dmFyIGJ5U2V0ID0gc2V0TWF0Y2hlcnMubGVuZ3RoID4gMCxcblx0XHRieUVsZW1lbnQgPSBlbGVtZW50TWF0Y2hlcnMubGVuZ3RoID4gMCxcblx0XHRzdXBlck1hdGNoZXIgPSBmdW5jdGlvbiggc2VlZCwgY29udGV4dCwgeG1sLCByZXN1bHRzLCBvdXRlcm1vc3QgKSB7XG5cdFx0XHR2YXIgZWxlbSwgaiwgbWF0Y2hlcixcblx0XHRcdFx0bWF0Y2hlZENvdW50ID0gMCxcblx0XHRcdFx0aSA9IFwiMFwiLFxuXHRcdFx0XHR1bm1hdGNoZWQgPSBzZWVkICYmIFtdLFxuXHRcdFx0XHRzZXRNYXRjaGVkID0gW10sXG5cdFx0XHRcdGNvbnRleHRCYWNrdXAgPSBvdXRlcm1vc3RDb250ZXh0LFxuXHRcdFx0XHQvLyBXZSBtdXN0IGFsd2F5cyBoYXZlIGVpdGhlciBzZWVkIGVsZW1lbnRzIG9yIG91dGVybW9zdCBjb250ZXh0XG5cdFx0XHRcdGVsZW1zID0gc2VlZCB8fCBieUVsZW1lbnQgJiYgRXhwci5maW5kW1wiVEFHXCJdKCBcIipcIiwgb3V0ZXJtb3N0ICksXG5cdFx0XHRcdC8vIFVzZSBpbnRlZ2VyIGRpcnJ1bnMgaWZmIHRoaXMgaXMgdGhlIG91dGVybW9zdCBtYXRjaGVyXG5cdFx0XHRcdGRpcnJ1bnNVbmlxdWUgPSAoZGlycnVucyArPSBjb250ZXh0QmFja3VwID09IG51bGwgPyAxIDogTWF0aC5yYW5kb20oKSB8fCAwLjEpLFxuXHRcdFx0XHRsZW4gPSBlbGVtcy5sZW5ndGg7XG5cblx0XHRcdGlmICggb3V0ZXJtb3N0ICkge1xuXHRcdFx0XHRvdXRlcm1vc3RDb250ZXh0ID0gY29udGV4dCA9PT0gZG9jdW1lbnQgfHwgY29udGV4dCB8fCBvdXRlcm1vc3Q7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEFkZCBlbGVtZW50cyBwYXNzaW5nIGVsZW1lbnRNYXRjaGVycyBkaXJlY3RseSB0byByZXN1bHRzXG5cdFx0XHQvLyBTdXBwb3J0OiBJRTw5LCBTYWZhcmlcblx0XHRcdC8vIFRvbGVyYXRlIE5vZGVMaXN0IHByb3BlcnRpZXMgKElFOiBcImxlbmd0aFwiOyBTYWZhcmk6IDxudW1iZXI+KSBtYXRjaGluZyBlbGVtZW50cyBieSBpZFxuXHRcdFx0Zm9yICggOyBpICE9PSBsZW4gJiYgKGVsZW0gPSBlbGVtc1tpXSkgIT0gbnVsbDsgaSsrICkge1xuXHRcdFx0XHRpZiAoIGJ5RWxlbWVudCAmJiBlbGVtICkge1xuXHRcdFx0XHRcdGogPSAwO1xuXHRcdFx0XHRcdGlmICggIWNvbnRleHQgJiYgZWxlbS5vd25lckRvY3VtZW50ICE9PSBkb2N1bWVudCApIHtcblx0XHRcdFx0XHRcdHNldERvY3VtZW50KCBlbGVtICk7XG5cdFx0XHRcdFx0XHR4bWwgPSAhZG9jdW1lbnRJc0hUTUw7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHdoaWxlICggKG1hdGNoZXIgPSBlbGVtZW50TWF0Y2hlcnNbaisrXSkgKSB7XG5cdFx0XHRcdFx0XHRpZiAoIG1hdGNoZXIoIGVsZW0sIGNvbnRleHQgfHwgZG9jdW1lbnQsIHhtbCkgKSB7XG5cdFx0XHRcdFx0XHRcdHJlc3VsdHMucHVzaCggZWxlbSApO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKCBvdXRlcm1vc3QgKSB7XG5cdFx0XHRcdFx0XHRkaXJydW5zID0gZGlycnVuc1VuaXF1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBUcmFjayB1bm1hdGNoZWQgZWxlbWVudHMgZm9yIHNldCBmaWx0ZXJzXG5cdFx0XHRcdGlmICggYnlTZXQgKSB7XG5cdFx0XHRcdFx0Ly8gVGhleSB3aWxsIGhhdmUgZ29uZSB0aHJvdWdoIGFsbCBwb3NzaWJsZSBtYXRjaGVyc1xuXHRcdFx0XHRcdGlmICggKGVsZW0gPSAhbWF0Y2hlciAmJiBlbGVtKSApIHtcblx0XHRcdFx0XHRcdG1hdGNoZWRDb3VudC0tO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIExlbmd0aGVuIHRoZSBhcnJheSBmb3IgZXZlcnkgZWxlbWVudCwgbWF0Y2hlZCBvciBub3Rcblx0XHRcdFx0XHRpZiAoIHNlZWQgKSB7XG5cdFx0XHRcdFx0XHR1bm1hdGNoZWQucHVzaCggZWxlbSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBgaWAgaXMgbm93IHRoZSBjb3VudCBvZiBlbGVtZW50cyB2aXNpdGVkIGFib3ZlLCBhbmQgYWRkaW5nIGl0IHRvIGBtYXRjaGVkQ291bnRgXG5cdFx0XHQvLyBtYWtlcyB0aGUgbGF0dGVyIG5vbm5lZ2F0aXZlLlxuXHRcdFx0bWF0Y2hlZENvdW50ICs9IGk7XG5cblx0XHRcdC8vIEFwcGx5IHNldCBmaWx0ZXJzIHRvIHVubWF0Y2hlZCBlbGVtZW50c1xuXHRcdFx0Ly8gTk9URTogVGhpcyBjYW4gYmUgc2tpcHBlZCBpZiB0aGVyZSBhcmUgbm8gdW5tYXRjaGVkIGVsZW1lbnRzIChpLmUuLCBgbWF0Y2hlZENvdW50YFxuXHRcdFx0Ly8gZXF1YWxzIGBpYCksIHVubGVzcyB3ZSBkaWRuJ3QgdmlzaXQgX2FueV8gZWxlbWVudHMgaW4gdGhlIGFib3ZlIGxvb3AgYmVjYXVzZSB3ZSBoYXZlXG5cdFx0XHQvLyBubyBlbGVtZW50IG1hdGNoZXJzIGFuZCBubyBzZWVkLlxuXHRcdFx0Ly8gSW5jcmVtZW50aW5nIGFuIGluaXRpYWxseS1zdHJpbmcgXCIwXCIgYGlgIGFsbG93cyBgaWAgdG8gcmVtYWluIGEgc3RyaW5nIG9ubHkgaW4gdGhhdFxuXHRcdFx0Ly8gY2FzZSwgd2hpY2ggd2lsbCByZXN1bHQgaW4gYSBcIjAwXCIgYG1hdGNoZWRDb3VudGAgdGhhdCBkaWZmZXJzIGZyb20gYGlgIGJ1dCBpcyBhbHNvXG5cdFx0XHQvLyBudW1lcmljYWxseSB6ZXJvLlxuXHRcdFx0aWYgKCBieVNldCAmJiBpICE9PSBtYXRjaGVkQ291bnQgKSB7XG5cdFx0XHRcdGogPSAwO1xuXHRcdFx0XHR3aGlsZSAoIChtYXRjaGVyID0gc2V0TWF0Y2hlcnNbaisrXSkgKSB7XG5cdFx0XHRcdFx0bWF0Y2hlciggdW5tYXRjaGVkLCBzZXRNYXRjaGVkLCBjb250ZXh0LCB4bWwgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggc2VlZCApIHtcblx0XHRcdFx0XHQvLyBSZWludGVncmF0ZSBlbGVtZW50IG1hdGNoZXMgdG8gZWxpbWluYXRlIHRoZSBuZWVkIGZvciBzb3J0aW5nXG5cdFx0XHRcdFx0aWYgKCBtYXRjaGVkQ291bnQgPiAwICkge1xuXHRcdFx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0XHRcdGlmICggISh1bm1hdGNoZWRbaV0gfHwgc2V0TWF0Y2hlZFtpXSkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0c2V0TWF0Y2hlZFtpXSA9IHBvcC5jYWxsKCByZXN1bHRzICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBEaXNjYXJkIGluZGV4IHBsYWNlaG9sZGVyIHZhbHVlcyB0byBnZXQgb25seSBhY3R1YWwgbWF0Y2hlc1xuXHRcdFx0XHRcdHNldE1hdGNoZWQgPSBjb25kZW5zZSggc2V0TWF0Y2hlZCApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gQWRkIG1hdGNoZXMgdG8gcmVzdWx0c1xuXHRcdFx0XHRwdXNoLmFwcGx5KCByZXN1bHRzLCBzZXRNYXRjaGVkICk7XG5cblx0XHRcdFx0Ly8gU2VlZGxlc3Mgc2V0IG1hdGNoZXMgc3VjY2VlZGluZyBtdWx0aXBsZSBzdWNjZXNzZnVsIG1hdGNoZXJzIHN0aXB1bGF0ZSBzb3J0aW5nXG5cdFx0XHRcdGlmICggb3V0ZXJtb3N0ICYmICFzZWVkICYmIHNldE1hdGNoZWQubGVuZ3RoID4gMCAmJlxuXHRcdFx0XHRcdCggbWF0Y2hlZENvdW50ICsgc2V0TWF0Y2hlcnMubGVuZ3RoICkgPiAxICkge1xuXG5cdFx0XHRcdFx0U2l6emxlLnVuaXF1ZVNvcnQoIHJlc3VsdHMgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBPdmVycmlkZSBtYW5pcHVsYXRpb24gb2YgZ2xvYmFscyBieSBuZXN0ZWQgbWF0Y2hlcnNcblx0XHRcdGlmICggb3V0ZXJtb3N0ICkge1xuXHRcdFx0XHRkaXJydW5zID0gZGlycnVuc1VuaXF1ZTtcblx0XHRcdFx0b3V0ZXJtb3N0Q29udGV4dCA9IGNvbnRleHRCYWNrdXA7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB1bm1hdGNoZWQ7XG5cdFx0fTtcblxuXHRyZXR1cm4gYnlTZXQgP1xuXHRcdG1hcmtGdW5jdGlvbiggc3VwZXJNYXRjaGVyICkgOlxuXHRcdHN1cGVyTWF0Y2hlcjtcbn1cblxuY29tcGlsZSA9IFNpenpsZS5jb21waWxlID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBtYXRjaCAvKiBJbnRlcm5hbCBVc2UgT25seSAqLyApIHtcblx0dmFyIGksXG5cdFx0c2V0TWF0Y2hlcnMgPSBbXSxcblx0XHRlbGVtZW50TWF0Y2hlcnMgPSBbXSxcblx0XHRjYWNoZWQgPSBjb21waWxlckNhY2hlWyBzZWxlY3RvciArIFwiIFwiIF07XG5cblx0aWYgKCAhY2FjaGVkICkge1xuXHRcdC8vIEdlbmVyYXRlIGEgZnVuY3Rpb24gb2YgcmVjdXJzaXZlIGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSB1c2VkIHRvIGNoZWNrIGVhY2ggZWxlbWVudFxuXHRcdGlmICggIW1hdGNoICkge1xuXHRcdFx0bWF0Y2ggPSB0b2tlbml6ZSggc2VsZWN0b3IgKTtcblx0XHR9XG5cdFx0aSA9IG1hdGNoLmxlbmd0aDtcblx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdGNhY2hlZCA9IG1hdGNoZXJGcm9tVG9rZW5zKCBtYXRjaFtpXSApO1xuXHRcdFx0aWYgKCBjYWNoZWRbIGV4cGFuZG8gXSApIHtcblx0XHRcdFx0c2V0TWF0Y2hlcnMucHVzaCggY2FjaGVkICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRlbGVtZW50TWF0Y2hlcnMucHVzaCggY2FjaGVkICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQ2FjaGUgdGhlIGNvbXBpbGVkIGZ1bmN0aW9uXG5cdFx0Y2FjaGVkID0gY29tcGlsZXJDYWNoZSggc2VsZWN0b3IsIG1hdGNoZXJGcm9tR3JvdXBNYXRjaGVycyggZWxlbWVudE1hdGNoZXJzLCBzZXRNYXRjaGVycyApICk7XG5cblx0XHQvLyBTYXZlIHNlbGVjdG9yIGFuZCB0b2tlbml6YXRpb25cblx0XHRjYWNoZWQuc2VsZWN0b3IgPSBzZWxlY3Rvcjtcblx0fVxuXHRyZXR1cm4gY2FjaGVkO1xufTtcblxuLyoqXG4gKiBBIGxvdy1sZXZlbCBzZWxlY3Rpb24gZnVuY3Rpb24gdGhhdCB3b3JrcyB3aXRoIFNpenpsZSdzIGNvbXBpbGVkXG4gKiAgc2VsZWN0b3IgZnVuY3Rpb25zXG4gKiBAcGFyYW0ge1N0cmluZ3xGdW5jdGlvbn0gc2VsZWN0b3IgQSBzZWxlY3RvciBvciBhIHByZS1jb21waWxlZFxuICogIHNlbGVjdG9yIGZ1bmN0aW9uIGJ1aWx0IHdpdGggU2l6emxlLmNvbXBpbGVcbiAqIEBwYXJhbSB7RWxlbWVudH0gY29udGV4dFxuICogQHBhcmFtIHtBcnJheX0gW3Jlc3VsdHNdXG4gKiBAcGFyYW0ge0FycmF5fSBbc2VlZF0gQSBzZXQgb2YgZWxlbWVudHMgdG8gbWF0Y2ggYWdhaW5zdFxuICovXG5zZWxlY3QgPSBTaXp6bGUuc2VsZWN0ID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0LCByZXN1bHRzLCBzZWVkICkge1xuXHR2YXIgaSwgdG9rZW5zLCB0b2tlbiwgdHlwZSwgZmluZCxcblx0XHRjb21waWxlZCA9IHR5cGVvZiBzZWxlY3RvciA9PT0gXCJmdW5jdGlvblwiICYmIHNlbGVjdG9yLFxuXHRcdG1hdGNoID0gIXNlZWQgJiYgdG9rZW5pemUoIChzZWxlY3RvciA9IGNvbXBpbGVkLnNlbGVjdG9yIHx8IHNlbGVjdG9yKSApO1xuXG5cdHJlc3VsdHMgPSByZXN1bHRzIHx8IFtdO1xuXG5cdC8vIFRyeSB0byBtaW5pbWl6ZSBvcGVyYXRpb25zIGlmIHRoZXJlIGlzIG9ubHkgb25lIHNlbGVjdG9yIGluIHRoZSBsaXN0IGFuZCBubyBzZWVkXG5cdC8vICh0aGUgbGF0dGVyIG9mIHdoaWNoIGd1YXJhbnRlZXMgdXMgY29udGV4dClcblx0aWYgKCBtYXRjaC5sZW5ndGggPT09IDEgKSB7XG5cblx0XHQvLyBSZWR1Y2UgY29udGV4dCBpZiB0aGUgbGVhZGluZyBjb21wb3VuZCBzZWxlY3RvciBpcyBhbiBJRFxuXHRcdHRva2VucyA9IG1hdGNoWzBdID0gbWF0Y2hbMF0uc2xpY2UoIDAgKTtcblx0XHRpZiAoIHRva2Vucy5sZW5ndGggPiAyICYmICh0b2tlbiA9IHRva2Vuc1swXSkudHlwZSA9PT0gXCJJRFwiICYmXG5cdFx0XHRcdHN1cHBvcnQuZ2V0QnlJZCAmJiBjb250ZXh0Lm5vZGVUeXBlID09PSA5ICYmIGRvY3VtZW50SXNIVE1MICYmXG5cdFx0XHRcdEV4cHIucmVsYXRpdmVbIHRva2Vuc1sxXS50eXBlIF0gKSB7XG5cblx0XHRcdGNvbnRleHQgPSAoIEV4cHIuZmluZFtcIklEXCJdKCB0b2tlbi5tYXRjaGVzWzBdLnJlcGxhY2UocnVuZXNjYXBlLCBmdW5lc2NhcGUpLCBjb250ZXh0ICkgfHwgW10gKVswXTtcblx0XHRcdGlmICggIWNvbnRleHQgKSB7XG5cdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXG5cdFx0XHQvLyBQcmVjb21waWxlZCBtYXRjaGVycyB3aWxsIHN0aWxsIHZlcmlmeSBhbmNlc3RyeSwgc28gc3RlcCB1cCBhIGxldmVsXG5cdFx0XHR9IGVsc2UgaWYgKCBjb21waWxlZCApIHtcblx0XHRcdFx0Y29udGV4dCA9IGNvbnRleHQucGFyZW50Tm9kZTtcblx0XHRcdH1cblxuXHRcdFx0c2VsZWN0b3IgPSBzZWxlY3Rvci5zbGljZSggdG9rZW5zLnNoaWZ0KCkudmFsdWUubGVuZ3RoICk7XG5cdFx0fVxuXG5cdFx0Ly8gRmV0Y2ggYSBzZWVkIHNldCBmb3IgcmlnaHQtdG8tbGVmdCBtYXRjaGluZ1xuXHRcdGkgPSBtYXRjaEV4cHJbXCJuZWVkc0NvbnRleHRcIl0udGVzdCggc2VsZWN0b3IgKSA/IDAgOiB0b2tlbnMubGVuZ3RoO1xuXHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0dG9rZW4gPSB0b2tlbnNbaV07XG5cblx0XHRcdC8vIEFib3J0IGlmIHdlIGhpdCBhIGNvbWJpbmF0b3Jcblx0XHRcdGlmICggRXhwci5yZWxhdGl2ZVsgKHR5cGUgPSB0b2tlbi50eXBlKSBdICkge1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdGlmICggKGZpbmQgPSBFeHByLmZpbmRbIHR5cGUgXSkgKSB7XG5cdFx0XHRcdC8vIFNlYXJjaCwgZXhwYW5kaW5nIGNvbnRleHQgZm9yIGxlYWRpbmcgc2libGluZyBjb21iaW5hdG9yc1xuXHRcdFx0XHRpZiAoIChzZWVkID0gZmluZChcblx0XHRcdFx0XHR0b2tlbi5tYXRjaGVzWzBdLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICksXG5cdFx0XHRcdFx0cnNpYmxpbmcudGVzdCggdG9rZW5zWzBdLnR5cGUgKSAmJiB0ZXN0Q29udGV4dCggY29udGV4dC5wYXJlbnROb2RlICkgfHwgY29udGV4dFxuXHRcdFx0XHQpKSApIHtcblxuXHRcdFx0XHRcdC8vIElmIHNlZWQgaXMgZW1wdHkgb3Igbm8gdG9rZW5zIHJlbWFpbiwgd2UgY2FuIHJldHVybiBlYXJseVxuXHRcdFx0XHRcdHRva2Vucy5zcGxpY2UoIGksIDEgKTtcblx0XHRcdFx0XHRzZWxlY3RvciA9IHNlZWQubGVuZ3RoICYmIHRvU2VsZWN0b3IoIHRva2VucyApO1xuXHRcdFx0XHRcdGlmICggIXNlbGVjdG9yICkge1xuXHRcdFx0XHRcdFx0cHVzaC5hcHBseSggcmVzdWx0cywgc2VlZCApO1xuXHRcdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBDb21waWxlIGFuZCBleGVjdXRlIGEgZmlsdGVyaW5nIGZ1bmN0aW9uIGlmIG9uZSBpcyBub3QgcHJvdmlkZWRcblx0Ly8gUHJvdmlkZSBgbWF0Y2hgIHRvIGF2b2lkIHJldG9rZW5pemF0aW9uIGlmIHdlIG1vZGlmaWVkIHRoZSBzZWxlY3RvciBhYm92ZVxuXHQoIGNvbXBpbGVkIHx8IGNvbXBpbGUoIHNlbGVjdG9yLCBtYXRjaCApICkoXG5cdFx0c2VlZCxcblx0XHRjb250ZXh0LFxuXHRcdCFkb2N1bWVudElzSFRNTCxcblx0XHRyZXN1bHRzLFxuXHRcdCFjb250ZXh0IHx8IHJzaWJsaW5nLnRlc3QoIHNlbGVjdG9yICkgJiYgdGVzdENvbnRleHQoIGNvbnRleHQucGFyZW50Tm9kZSApIHx8IGNvbnRleHRcblx0KTtcblx0cmV0dXJuIHJlc3VsdHM7XG59O1xuXG4vLyBPbmUtdGltZSBhc3NpZ25tZW50c1xuXG4vLyBTb3J0IHN0YWJpbGl0eVxuc3VwcG9ydC5zb3J0U3RhYmxlID0gZXhwYW5kby5zcGxpdChcIlwiKS5zb3J0KCBzb3J0T3JkZXIgKS5qb2luKFwiXCIpID09PSBleHBhbmRvO1xuXG4vLyBTdXBwb3J0OiBDaHJvbWUgMTQtMzUrXG4vLyBBbHdheXMgYXNzdW1lIGR1cGxpY2F0ZXMgaWYgdGhleSBhcmVuJ3QgcGFzc2VkIHRvIHRoZSBjb21wYXJpc29uIGZ1bmN0aW9uXG5zdXBwb3J0LmRldGVjdER1cGxpY2F0ZXMgPSAhIWhhc0R1cGxpY2F0ZTtcblxuLy8gSW5pdGlhbGl6ZSBhZ2FpbnN0IHRoZSBkZWZhdWx0IGRvY3VtZW50XG5zZXREb2N1bWVudCgpO1xuXG4vLyBTdXBwb3J0OiBXZWJraXQ8NTM3LjMyIC0gU2FmYXJpIDYuMC4zL0Nocm9tZSAyNSAoZml4ZWQgaW4gQ2hyb21lIDI3KVxuLy8gRGV0YWNoZWQgbm9kZXMgY29uZm91bmRpbmdseSBmb2xsb3cgKmVhY2ggb3RoZXIqXG5zdXBwb3J0LnNvcnREZXRhY2hlZCA9IGFzc2VydChmdW5jdGlvbiggZGl2MSApIHtcblx0Ly8gU2hvdWxkIHJldHVybiAxLCBidXQgcmV0dXJucyA0IChmb2xsb3dpbmcpXG5cdHJldHVybiBkaXYxLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpICkgJiAxO1xufSk7XG5cbi8vIFN1cHBvcnQ6IElFPDhcbi8vIFByZXZlbnQgYXR0cmlidXRlL3Byb3BlcnR5IFwiaW50ZXJwb2xhdGlvblwiXG4vLyBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXM1MzY0MjklMjhWUy44NSUyOS5hc3B4XG5pZiAoICFhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHtcblx0ZGl2LmlubmVySFRNTCA9IFwiPGEgaHJlZj0nIyc+PC9hPlwiO1xuXHRyZXR1cm4gZGl2LmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKFwiaHJlZlwiKSA9PT0gXCIjXCIgO1xufSkgKSB7XG5cdGFkZEhhbmRsZSggXCJ0eXBlfGhyZWZ8aGVpZ2h0fHdpZHRoXCIsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBpc1hNTCApIHtcblx0XHRpZiAoICFpc1hNTCApIHtcblx0XHRcdHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSwgbmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInR5cGVcIiA/IDEgOiAyICk7XG5cdFx0fVxuXHR9KTtcbn1cblxuLy8gU3VwcG9ydDogSUU8OVxuLy8gVXNlIGRlZmF1bHRWYWx1ZSBpbiBwbGFjZSBvZiBnZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiKVxuaWYgKCAhc3VwcG9ydC5hdHRyaWJ1dGVzIHx8ICFhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHtcblx0ZGl2LmlubmVySFRNTCA9IFwiPGlucHV0Lz5cIjtcblx0ZGl2LmZpcnN0Q2hpbGQuc2V0QXR0cmlidXRlKCBcInZhbHVlXCIsIFwiXCIgKTtcblx0cmV0dXJuIGRpdi5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSggXCJ2YWx1ZVwiICkgPT09IFwiXCI7XG59KSApIHtcblx0YWRkSGFuZGxlKCBcInZhbHVlXCIsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBpc1hNTCApIHtcblx0XHRpZiAoICFpc1hNTCAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiaW5wdXRcIiApIHtcblx0XHRcdHJldHVybiBlbGVtLmRlZmF1bHRWYWx1ZTtcblx0XHR9XG5cdH0pO1xufVxuXG4vLyBTdXBwb3J0OiBJRTw5XG4vLyBVc2UgZ2V0QXR0cmlidXRlTm9kZSB0byBmZXRjaCBib29sZWFucyB3aGVuIGdldEF0dHJpYnV0ZSBsaWVzXG5pZiAoICFhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHtcblx0cmV0dXJuIGRpdi5nZXRBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiKSA9PSBudWxsO1xufSkgKSB7XG5cdGFkZEhhbmRsZSggYm9vbGVhbnMsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBpc1hNTCApIHtcblx0XHR2YXIgdmFsO1xuXHRcdGlmICggIWlzWE1MICkge1xuXHRcdFx0cmV0dXJuIGVsZW1bIG5hbWUgXSA9PT0gdHJ1ZSA/IG5hbWUudG9Mb3dlckNhc2UoKSA6XG5cdFx0XHRcdFx0KHZhbCA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZSggbmFtZSApKSAmJiB2YWwuc3BlY2lmaWVkID9cblx0XHRcdFx0XHR2YWwudmFsdWUgOlxuXHRcdFx0XHRudWxsO1xuXHRcdH1cblx0fSk7XG59XG5cbnJldHVybiBTaXp6bGU7XG5cbn0pKCB3aW5kb3cgKTtcblxuXG5cbmpRdWVyeS5maW5kID0gU2l6emxlO1xualF1ZXJ5LmV4cHIgPSBTaXp6bGUuc2VsZWN0b3JzO1xualF1ZXJ5LmV4cHJbIFwiOlwiIF0gPSBqUXVlcnkuZXhwci5wc2V1ZG9zO1xualF1ZXJ5LnVuaXF1ZVNvcnQgPSBqUXVlcnkudW5pcXVlID0gU2l6emxlLnVuaXF1ZVNvcnQ7XG5qUXVlcnkudGV4dCA9IFNpenpsZS5nZXRUZXh0O1xualF1ZXJ5LmlzWE1MRG9jID0gU2l6emxlLmlzWE1MO1xualF1ZXJ5LmNvbnRhaW5zID0gU2l6emxlLmNvbnRhaW5zO1xuXG5cblxudmFyIGRpciA9IGZ1bmN0aW9uKCBlbGVtLCBkaXIsIHVudGlsICkge1xuXHR2YXIgbWF0Y2hlZCA9IFtdLFxuXHRcdHRydW5jYXRlID0gdW50aWwgIT09IHVuZGVmaW5lZDtcblxuXHR3aGlsZSAoICggZWxlbSA9IGVsZW1bIGRpciBdICkgJiYgZWxlbS5ub2RlVHlwZSAhPT0gOSApIHtcblx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHRpZiAoIHRydW5jYXRlICYmIGpRdWVyeSggZWxlbSApLmlzKCB1bnRpbCApICkge1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdG1hdGNoZWQucHVzaCggZWxlbSApO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gbWF0Y2hlZDtcbn07XG5cblxudmFyIHNpYmxpbmdzID0gZnVuY3Rpb24oIG4sIGVsZW0gKSB7XG5cdHZhciBtYXRjaGVkID0gW107XG5cblx0Zm9yICggOyBuOyBuID0gbi5uZXh0U2libGluZyApIHtcblx0XHRpZiAoIG4ubm9kZVR5cGUgPT09IDEgJiYgbiAhPT0gZWxlbSApIHtcblx0XHRcdG1hdGNoZWQucHVzaCggbiApO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBtYXRjaGVkO1xufTtcblxuXG52YXIgcm5lZWRzQ29udGV4dCA9IGpRdWVyeS5leHByLm1hdGNoLm5lZWRzQ29udGV4dDtcblxudmFyIHJzaW5nbGVUYWcgPSAoIC9ePChbXFx3LV0rKVxccypcXC8/Pig/OjxcXC9cXDE+fCkkLyApO1xuXG5cblxudmFyIHJpc1NpbXBsZSA9IC9eLlteOiNcXFtcXC4sXSokLztcblxuLy8gSW1wbGVtZW50IHRoZSBpZGVudGljYWwgZnVuY3Rpb25hbGl0eSBmb3IgZmlsdGVyIGFuZCBub3RcbmZ1bmN0aW9uIHdpbm5vdyggZWxlbWVudHMsIHF1YWxpZmllciwgbm90ICkge1xuXHRpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBxdWFsaWZpZXIgKSApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmdyZXAoIGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSwgaSApIHtcblx0XHRcdC8qIGpzaGludCAtVzAxOCAqL1xuXHRcdFx0cmV0dXJuICEhcXVhbGlmaWVyLmNhbGwoIGVsZW0sIGksIGVsZW0gKSAhPT0gbm90O1xuXHRcdH0gKTtcblxuXHR9XG5cblx0aWYgKCBxdWFsaWZpZXIubm9kZVR5cGUgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5ncmVwKCBlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gKCBlbGVtID09PSBxdWFsaWZpZXIgKSAhPT0gbm90O1xuXHRcdH0gKTtcblxuXHR9XG5cblx0aWYgKCB0eXBlb2YgcXVhbGlmaWVyID09PSBcInN0cmluZ1wiICkge1xuXHRcdGlmICggcmlzU2ltcGxlLnRlc3QoIHF1YWxpZmllciApICkge1xuXHRcdFx0cmV0dXJuIGpRdWVyeS5maWx0ZXIoIHF1YWxpZmllciwgZWxlbWVudHMsIG5vdCApO1xuXHRcdH1cblxuXHRcdHF1YWxpZmllciA9IGpRdWVyeS5maWx0ZXIoIHF1YWxpZmllciwgZWxlbWVudHMgKTtcblx0fVxuXG5cdHJldHVybiBqUXVlcnkuZ3JlcCggZWxlbWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiAoIGpRdWVyeS5pbkFycmF5KCBlbGVtLCBxdWFsaWZpZXIgKSA+IC0xICkgIT09IG5vdDtcblx0fSApO1xufVxuXG5qUXVlcnkuZmlsdGVyID0gZnVuY3Rpb24oIGV4cHIsIGVsZW1zLCBub3QgKSB7XG5cdHZhciBlbGVtID0gZWxlbXNbIDAgXTtcblxuXHRpZiAoIG5vdCApIHtcblx0XHRleHByID0gXCI6bm90KFwiICsgZXhwciArIFwiKVwiO1xuXHR9XG5cblx0cmV0dXJuIGVsZW1zLmxlbmd0aCA9PT0gMSAmJiBlbGVtLm5vZGVUeXBlID09PSAxID9cblx0XHRqUXVlcnkuZmluZC5tYXRjaGVzU2VsZWN0b3IoIGVsZW0sIGV4cHIgKSA/IFsgZWxlbSBdIDogW10gOlxuXHRcdGpRdWVyeS5maW5kLm1hdGNoZXMoIGV4cHIsIGpRdWVyeS5ncmVwKCBlbGVtcywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbS5ub2RlVHlwZSA9PT0gMTtcblx0XHR9ICkgKTtcbn07XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0ZmluZDogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHZhciBpLFxuXHRcdFx0cmV0ID0gW10sXG5cdFx0XHRzZWxmID0gdGhpcyxcblx0XHRcdGxlbiA9IHNlbGYubGVuZ3RoO1xuXG5cdFx0aWYgKCB0eXBlb2Ygc2VsZWN0b3IgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeSggc2VsZWN0b3IgKS5maWx0ZXIoIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRmb3IgKCBpID0gMDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0XHRcdGlmICggalF1ZXJ5LmNvbnRhaW5zKCBzZWxmWyBpIF0sIHRoaXMgKSApIHtcblx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSApICk7XG5cdFx0fVxuXG5cdFx0Zm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdGpRdWVyeS5maW5kKCBzZWxlY3Rvciwgc2VsZlsgaSBdLCByZXQgKTtcblx0XHR9XG5cblx0XHQvLyBOZWVkZWQgYmVjYXVzZSAkKCBzZWxlY3RvciwgY29udGV4dCApIGJlY29tZXMgJCggY29udGV4dCApLmZpbmQoIHNlbGVjdG9yIClcblx0XHRyZXQgPSB0aGlzLnB1c2hTdGFjayggbGVuID4gMSA/IGpRdWVyeS51bmlxdWUoIHJldCApIDogcmV0ICk7XG5cdFx0cmV0LnNlbGVjdG9yID0gdGhpcy5zZWxlY3RvciA/IHRoaXMuc2VsZWN0b3IgKyBcIiBcIiArIHNlbGVjdG9yIDogc2VsZWN0b3I7XG5cdFx0cmV0dXJuIHJldDtcblx0fSxcblx0ZmlsdGVyOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCB3aW5ub3coIHRoaXMsIHNlbGVjdG9yIHx8IFtdLCBmYWxzZSApICk7XG5cdH0sXG5cdG5vdDogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggd2lubm93KCB0aGlzLCBzZWxlY3RvciB8fCBbXSwgdHJ1ZSApICk7XG5cdH0sXG5cdGlzOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0cmV0dXJuICEhd2lubm93KFxuXHRcdFx0dGhpcyxcblxuXHRcdFx0Ly8gSWYgdGhpcyBpcyBhIHBvc2l0aW9uYWwvcmVsYXRpdmUgc2VsZWN0b3IsIGNoZWNrIG1lbWJlcnNoaXAgaW4gdGhlIHJldHVybmVkIHNldFxuXHRcdFx0Ly8gc28gJChcInA6Zmlyc3RcIikuaXMoXCJwOmxhc3RcIikgd29uJ3QgcmV0dXJuIHRydWUgZm9yIGEgZG9jIHdpdGggdHdvIFwicFwiLlxuXHRcdFx0dHlwZW9mIHNlbGVjdG9yID09PSBcInN0cmluZ1wiICYmIHJuZWVkc0NvbnRleHQudGVzdCggc2VsZWN0b3IgKSA/XG5cdFx0XHRcdGpRdWVyeSggc2VsZWN0b3IgKSA6XG5cdFx0XHRcdHNlbGVjdG9yIHx8IFtdLFxuXHRcdFx0ZmFsc2Vcblx0XHQpLmxlbmd0aDtcblx0fVxufSApO1xuXG5cbi8vIEluaXRpYWxpemUgYSBqUXVlcnkgb2JqZWN0XG5cblxuLy8gQSBjZW50cmFsIHJlZmVyZW5jZSB0byB0aGUgcm9vdCBqUXVlcnkoZG9jdW1lbnQpXG52YXIgcm9vdGpRdWVyeSxcblxuXHQvLyBBIHNpbXBsZSB3YXkgdG8gY2hlY2sgZm9yIEhUTUwgc3RyaW5nc1xuXHQvLyBQcmlvcml0aXplICNpZCBvdmVyIDx0YWc+IHRvIGF2b2lkIFhTUyB2aWEgbG9jYXRpb24uaGFzaCAoIzk1MjEpXG5cdC8vIFN0cmljdCBIVE1MIHJlY29nbml0aW9uICgjMTEyOTA6IG11c3Qgc3RhcnQgd2l0aCA8KVxuXHRycXVpY2tFeHByID0gL14oPzpcXHMqKDxbXFx3XFxXXSs+KVtePl0qfCMoW1xcdy1dKikpJC8sXG5cblx0aW5pdCA9IGpRdWVyeS5mbi5pbml0ID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0LCByb290ICkge1xuXHRcdHZhciBtYXRjaCwgZWxlbTtcblxuXHRcdC8vIEhBTkRMRTogJChcIlwiKSwgJChudWxsKSwgJCh1bmRlZmluZWQpLCAkKGZhbHNlKVxuXHRcdGlmICggIXNlbGVjdG9yICkge1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXG5cdFx0Ly8gaW5pdCBhY2NlcHRzIGFuIGFsdGVybmF0ZSByb290alF1ZXJ5XG5cdFx0Ly8gc28gbWlncmF0ZSBjYW4gc3VwcG9ydCBqUXVlcnkuc3ViIChnaC0yMTAxKVxuXHRcdHJvb3QgPSByb290IHx8IHJvb3RqUXVlcnk7XG5cblx0XHQvLyBIYW5kbGUgSFRNTCBzdHJpbmdzXG5cdFx0aWYgKCB0eXBlb2Ygc2VsZWN0b3IgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRpZiAoIHNlbGVjdG9yLmNoYXJBdCggMCApID09PSBcIjxcIiAmJlxuXHRcdFx0XHRzZWxlY3Rvci5jaGFyQXQoIHNlbGVjdG9yLmxlbmd0aCAtIDEgKSA9PT0gXCI+XCIgJiZcblx0XHRcdFx0c2VsZWN0b3IubGVuZ3RoID49IDMgKSB7XG5cblx0XHRcdFx0Ly8gQXNzdW1lIHRoYXQgc3RyaW5ncyB0aGF0IHN0YXJ0IGFuZCBlbmQgd2l0aCA8PiBhcmUgSFRNTCBhbmQgc2tpcCB0aGUgcmVnZXggY2hlY2tcblx0XHRcdFx0bWF0Y2ggPSBbIG51bGwsIHNlbGVjdG9yLCBudWxsIF07XG5cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG1hdGNoID0gcnF1aWNrRXhwci5leGVjKCBzZWxlY3RvciApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBNYXRjaCBodG1sIG9yIG1ha2Ugc3VyZSBubyBjb250ZXh0IGlzIHNwZWNpZmllZCBmb3IgI2lkXG5cdFx0XHRpZiAoIG1hdGNoICYmICggbWF0Y2hbIDEgXSB8fCAhY29udGV4dCApICkge1xuXG5cdFx0XHRcdC8vIEhBTkRMRTogJChodG1sKSAtPiAkKGFycmF5KVxuXHRcdFx0XHRpZiAoIG1hdGNoWyAxIF0gKSB7XG5cdFx0XHRcdFx0Y29udGV4dCA9IGNvbnRleHQgaW5zdGFuY2VvZiBqUXVlcnkgPyBjb250ZXh0WyAwIF0gOiBjb250ZXh0O1xuXG5cdFx0XHRcdFx0Ly8gc2NyaXB0cyBpcyB0cnVlIGZvciBiYWNrLWNvbXBhdFxuXHRcdFx0XHRcdC8vIEludGVudGlvbmFsbHkgbGV0IHRoZSBlcnJvciBiZSB0aHJvd24gaWYgcGFyc2VIVE1MIGlzIG5vdCBwcmVzZW50XG5cdFx0XHRcdFx0alF1ZXJ5Lm1lcmdlKCB0aGlzLCBqUXVlcnkucGFyc2VIVE1MKFxuXHRcdFx0XHRcdFx0bWF0Y2hbIDEgXSxcblx0XHRcdFx0XHRcdGNvbnRleHQgJiYgY29udGV4dC5ub2RlVHlwZSA/IGNvbnRleHQub3duZXJEb2N1bWVudCB8fCBjb250ZXh0IDogZG9jdW1lbnQsXG5cdFx0XHRcdFx0XHR0cnVlXG5cdFx0XHRcdFx0KSApO1xuXG5cdFx0XHRcdFx0Ly8gSEFORExFOiAkKGh0bWwsIHByb3BzKVxuXHRcdFx0XHRcdGlmICggcnNpbmdsZVRhZy50ZXN0KCBtYXRjaFsgMSBdICkgJiYgalF1ZXJ5LmlzUGxhaW5PYmplY3QoIGNvbnRleHQgKSApIHtcblx0XHRcdFx0XHRcdGZvciAoIG1hdGNoIGluIGNvbnRleHQgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gUHJvcGVydGllcyBvZiBjb250ZXh0IGFyZSBjYWxsZWQgYXMgbWV0aG9kcyBpZiBwb3NzaWJsZVxuXHRcdFx0XHRcdFx0XHRpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCB0aGlzWyBtYXRjaCBdICkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0dGhpc1sgbWF0Y2ggXSggY29udGV4dFsgbWF0Y2ggXSApO1xuXG5cdFx0XHRcdFx0XHRcdC8vIC4uLmFuZCBvdGhlcndpc2Ugc2V0IGFzIGF0dHJpYnV0ZXNcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmF0dHIoIG1hdGNoLCBjb250ZXh0WyBtYXRjaCBdICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdFx0XHQvLyBIQU5ETEU6ICQoI2lkKVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGVsZW0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggbWF0Y2hbIDIgXSApO1xuXG5cdFx0XHRcdFx0Ly8gQ2hlY2sgcGFyZW50Tm9kZSB0byBjYXRjaCB3aGVuIEJsYWNrYmVycnkgNC42IHJldHVybnNcblx0XHRcdFx0XHQvLyBub2RlcyB0aGF0IGFyZSBubyBsb25nZXIgaW4gdGhlIGRvY3VtZW50ICM2OTYzXG5cdFx0XHRcdFx0aWYgKCBlbGVtICYmIGVsZW0ucGFyZW50Tm9kZSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIElFIGFuZCBPcGVyYSByZXR1cm4gaXRlbXNcblx0XHRcdFx0XHRcdC8vIGJ5IG5hbWUgaW5zdGVhZCBvZiBJRFxuXHRcdFx0XHRcdFx0aWYgKCBlbGVtLmlkICE9PSBtYXRjaFsgMiBdICkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gcm9vdGpRdWVyeS5maW5kKCBzZWxlY3RvciApO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQvLyBPdGhlcndpc2UsIHdlIGluamVjdCB0aGUgZWxlbWVudCBkaXJlY3RseSBpbnRvIHRoZSBqUXVlcnkgb2JqZWN0XG5cdFx0XHRcdFx0XHR0aGlzLmxlbmd0aCA9IDE7XG5cdFx0XHRcdFx0XHR0aGlzWyAwIF0gPSBlbGVtO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHRoaXMuY29udGV4dCA9IGRvY3VtZW50O1xuXHRcdFx0XHRcdHRoaXMuc2VsZWN0b3IgPSBzZWxlY3Rvcjtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fVxuXG5cdFx0XHQvLyBIQU5ETEU6ICQoZXhwciwgJCguLi4pKVxuXHRcdFx0fSBlbHNlIGlmICggIWNvbnRleHQgfHwgY29udGV4dC5qcXVlcnkgKSB7XG5cdFx0XHRcdHJldHVybiAoIGNvbnRleHQgfHwgcm9vdCApLmZpbmQoIHNlbGVjdG9yICk7XG5cblx0XHRcdC8vIEhBTkRMRTogJChleHByLCBjb250ZXh0KVxuXHRcdFx0Ly8gKHdoaWNoIGlzIGp1c3QgZXF1aXZhbGVudCB0bzogJChjb250ZXh0KS5maW5kKGV4cHIpXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5jb25zdHJ1Y3RvciggY29udGV4dCApLmZpbmQoIHNlbGVjdG9yICk7XG5cdFx0XHR9XG5cblx0XHQvLyBIQU5ETEU6ICQoRE9NRWxlbWVudClcblx0XHR9IGVsc2UgaWYgKCBzZWxlY3Rvci5ub2RlVHlwZSApIHtcblx0XHRcdHRoaXMuY29udGV4dCA9IHRoaXNbIDAgXSA9IHNlbGVjdG9yO1xuXHRcdFx0dGhpcy5sZW5ndGggPSAxO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHQvLyBIQU5ETEU6ICQoZnVuY3Rpb24pXG5cdFx0Ly8gU2hvcnRjdXQgZm9yIGRvY3VtZW50IHJlYWR5XG5cdFx0fSBlbHNlIGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHNlbGVjdG9yICkgKSB7XG5cdFx0XHRyZXR1cm4gdHlwZW9mIHJvb3QucmVhZHkgIT09IFwidW5kZWZpbmVkXCIgP1xuXHRcdFx0XHRyb290LnJlYWR5KCBzZWxlY3RvciApIDpcblxuXHRcdFx0XHQvLyBFeGVjdXRlIGltbWVkaWF0ZWx5IGlmIHJlYWR5IGlzIG5vdCBwcmVzZW50XG5cdFx0XHRcdHNlbGVjdG9yKCBqUXVlcnkgKTtcblx0XHR9XG5cblx0XHRpZiAoIHNlbGVjdG9yLnNlbGVjdG9yICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHR0aGlzLnNlbGVjdG9yID0gc2VsZWN0b3Iuc2VsZWN0b3I7XG5cdFx0XHR0aGlzLmNvbnRleHQgPSBzZWxlY3Rvci5jb250ZXh0O1xuXHRcdH1cblxuXHRcdHJldHVybiBqUXVlcnkubWFrZUFycmF5KCBzZWxlY3RvciwgdGhpcyApO1xuXHR9O1xuXG4vLyBHaXZlIHRoZSBpbml0IGZ1bmN0aW9uIHRoZSBqUXVlcnkgcHJvdG90eXBlIGZvciBsYXRlciBpbnN0YW50aWF0aW9uXG5pbml0LnByb3RvdHlwZSA9IGpRdWVyeS5mbjtcblxuLy8gSW5pdGlhbGl6ZSBjZW50cmFsIHJlZmVyZW5jZVxucm9vdGpRdWVyeSA9IGpRdWVyeSggZG9jdW1lbnQgKTtcblxuXG52YXIgcnBhcmVudHNwcmV2ID0gL14oPzpwYXJlbnRzfHByZXYoPzpVbnRpbHxBbGwpKS8sXG5cblx0Ly8gbWV0aG9kcyBndWFyYW50ZWVkIHRvIHByb2R1Y2UgYSB1bmlxdWUgc2V0IHdoZW4gc3RhcnRpbmcgZnJvbSBhIHVuaXF1ZSBzZXRcblx0Z3VhcmFudGVlZFVuaXF1ZSA9IHtcblx0XHRjaGlsZHJlbjogdHJ1ZSxcblx0XHRjb250ZW50czogdHJ1ZSxcblx0XHRuZXh0OiB0cnVlLFxuXHRcdHByZXY6IHRydWVcblx0fTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRoYXM6IGZ1bmN0aW9uKCB0YXJnZXQgKSB7XG5cdFx0dmFyIGksXG5cdFx0XHR0YXJnZXRzID0galF1ZXJ5KCB0YXJnZXQsIHRoaXMgKSxcblx0XHRcdGxlbiA9IHRhcmdldHMubGVuZ3RoO1xuXG5cdFx0cmV0dXJuIHRoaXMuZmlsdGVyKCBmdW5jdGlvbigpIHtcblx0XHRcdGZvciAoIGkgPSAwOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0XHRcdGlmICggalF1ZXJ5LmNvbnRhaW5zKCB0aGlzLCB0YXJnZXRzWyBpIF0gKSApIHtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblxuXHRjbG9zZXN0OiBmdW5jdGlvbiggc2VsZWN0b3JzLCBjb250ZXh0ICkge1xuXHRcdHZhciBjdXIsXG5cdFx0XHRpID0gMCxcblx0XHRcdGwgPSB0aGlzLmxlbmd0aCxcblx0XHRcdG1hdGNoZWQgPSBbXSxcblx0XHRcdHBvcyA9IHJuZWVkc0NvbnRleHQudGVzdCggc2VsZWN0b3JzICkgfHwgdHlwZW9mIHNlbGVjdG9ycyAhPT0gXCJzdHJpbmdcIiA/XG5cdFx0XHRcdGpRdWVyeSggc2VsZWN0b3JzLCBjb250ZXh0IHx8IHRoaXMuY29udGV4dCApIDpcblx0XHRcdFx0MDtcblxuXHRcdGZvciAoIDsgaSA8IGw7IGkrKyApIHtcblx0XHRcdGZvciAoIGN1ciA9IHRoaXNbIGkgXTsgY3VyICYmIGN1ciAhPT0gY29udGV4dDsgY3VyID0gY3VyLnBhcmVudE5vZGUgKSB7XG5cblx0XHRcdFx0Ly8gQWx3YXlzIHNraXAgZG9jdW1lbnQgZnJhZ21lbnRzXG5cdFx0XHRcdGlmICggY3VyLm5vZGVUeXBlIDwgMTEgJiYgKCBwb3MgP1xuXHRcdFx0XHRcdHBvcy5pbmRleCggY3VyICkgPiAtMSA6XG5cblx0XHRcdFx0XHQvLyBEb24ndCBwYXNzIG5vbi1lbGVtZW50cyB0byBTaXp6bGVcblx0XHRcdFx0XHRjdXIubm9kZVR5cGUgPT09IDEgJiZcblx0XHRcdFx0XHRcdGpRdWVyeS5maW5kLm1hdGNoZXNTZWxlY3RvciggY3VyLCBzZWxlY3RvcnMgKSApICkge1xuXG5cdFx0XHRcdFx0bWF0Y2hlZC5wdXNoKCBjdXIgKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggbWF0Y2hlZC5sZW5ndGggPiAxID8galF1ZXJ5LnVuaXF1ZVNvcnQoIG1hdGNoZWQgKSA6IG1hdGNoZWQgKTtcblx0fSxcblxuXHQvLyBEZXRlcm1pbmUgdGhlIHBvc2l0aW9uIG9mIGFuIGVsZW1lbnQgd2l0aGluXG5cdC8vIHRoZSBtYXRjaGVkIHNldCBvZiBlbGVtZW50c1xuXHRpbmRleDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHQvLyBObyBhcmd1bWVudCwgcmV0dXJuIGluZGV4IGluIHBhcmVudFxuXHRcdGlmICggIWVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gKCB0aGlzWyAwIF0gJiYgdGhpc1sgMCBdLnBhcmVudE5vZGUgKSA/IHRoaXMuZmlyc3QoKS5wcmV2QWxsKCkubGVuZ3RoIDogLTE7XG5cdFx0fVxuXG5cdFx0Ly8gaW5kZXggaW4gc2VsZWN0b3Jcblx0XHRpZiAoIHR5cGVvZiBlbGVtID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0cmV0dXJuIGpRdWVyeS5pbkFycmF5KCB0aGlzWyAwIF0sIGpRdWVyeSggZWxlbSApICk7XG5cdFx0fVxuXG5cdFx0Ly8gTG9jYXRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgZGVzaXJlZCBlbGVtZW50XG5cdFx0cmV0dXJuIGpRdWVyeS5pbkFycmF5KFxuXG5cdFx0XHQvLyBJZiBpdCByZWNlaXZlcyBhIGpRdWVyeSBvYmplY3QsIHRoZSBmaXJzdCBlbGVtZW50IGlzIHVzZWRcblx0XHRcdGVsZW0uanF1ZXJ5ID8gZWxlbVsgMCBdIDogZWxlbSwgdGhpcyApO1xuXHR9LFxuXG5cdGFkZDogZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0ICkge1xuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayhcblx0XHRcdGpRdWVyeS51bmlxdWVTb3J0KFxuXHRcdFx0XHRqUXVlcnkubWVyZ2UoIHRoaXMuZ2V0KCksIGpRdWVyeSggc2VsZWN0b3IsIGNvbnRleHQgKSApXG5cdFx0XHQpXG5cdFx0KTtcblx0fSxcblxuXHRhZGRCYWNrOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0cmV0dXJuIHRoaXMuYWRkKCBzZWxlY3RvciA9PSBudWxsID9cblx0XHRcdHRoaXMucHJldk9iamVjdCA6IHRoaXMucHJldk9iamVjdC5maWx0ZXIoIHNlbGVjdG9yIClcblx0XHQpO1xuXHR9XG59ICk7XG5cbmZ1bmN0aW9uIHNpYmxpbmcoIGN1ciwgZGlyICkge1xuXHRkbyB7XG5cdFx0Y3VyID0gY3VyWyBkaXIgXTtcblx0fSB3aGlsZSAoIGN1ciAmJiBjdXIubm9kZVR5cGUgIT09IDEgKTtcblxuXHRyZXR1cm4gY3VyO1xufVxuXG5qUXVlcnkuZWFjaCgge1xuXHRwYXJlbnQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHZhciBwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGU7XG5cdFx0cmV0dXJuIHBhcmVudCAmJiBwYXJlbnQubm9kZVR5cGUgIT09IDExID8gcGFyZW50IDogbnVsbDtcblx0fSxcblx0cGFyZW50czogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIGRpciggZWxlbSwgXCJwYXJlbnROb2RlXCIgKTtcblx0fSxcblx0cGFyZW50c1VudGlsOiBmdW5jdGlvbiggZWxlbSwgaSwgdW50aWwgKSB7XG5cdFx0cmV0dXJuIGRpciggZWxlbSwgXCJwYXJlbnROb2RlXCIsIHVudGlsICk7XG5cdH0sXG5cdG5leHQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBzaWJsaW5nKCBlbGVtLCBcIm5leHRTaWJsaW5nXCIgKTtcblx0fSxcblx0cHJldjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIHNpYmxpbmcoIGVsZW0sIFwicHJldmlvdXNTaWJsaW5nXCIgKTtcblx0fSxcblx0bmV4dEFsbDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIGRpciggZWxlbSwgXCJuZXh0U2libGluZ1wiICk7XG5cdH0sXG5cdHByZXZBbGw6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBkaXIoIGVsZW0sIFwicHJldmlvdXNTaWJsaW5nXCIgKTtcblx0fSxcblx0bmV4dFVudGlsOiBmdW5jdGlvbiggZWxlbSwgaSwgdW50aWwgKSB7XG5cdFx0cmV0dXJuIGRpciggZWxlbSwgXCJuZXh0U2libGluZ1wiLCB1bnRpbCApO1xuXHR9LFxuXHRwcmV2VW50aWw6IGZ1bmN0aW9uKCBlbGVtLCBpLCB1bnRpbCApIHtcblx0XHRyZXR1cm4gZGlyKCBlbGVtLCBcInByZXZpb3VzU2libGluZ1wiLCB1bnRpbCApO1xuXHR9LFxuXHRzaWJsaW5nczogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIHNpYmxpbmdzKCAoIGVsZW0ucGFyZW50Tm9kZSB8fCB7fSApLmZpcnN0Q2hpbGQsIGVsZW0gKTtcblx0fSxcblx0Y2hpbGRyZW46IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBzaWJsaW5ncyggZWxlbS5maXJzdENoaWxkICk7XG5cdH0sXG5cdGNvbnRlbnRzOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4galF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCBcImlmcmFtZVwiICkgP1xuXHRcdFx0ZWxlbS5jb250ZW50RG9jdW1lbnQgfHwgZWxlbS5jb250ZW50V2luZG93LmRvY3VtZW50IDpcblx0XHRcdGpRdWVyeS5tZXJnZSggW10sIGVsZW0uY2hpbGROb2RlcyApO1xuXHR9XG59LCBmdW5jdGlvbiggbmFtZSwgZm4gKSB7XG5cdGpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHVudGlsLCBzZWxlY3RvciApIHtcblx0XHR2YXIgcmV0ID0galF1ZXJ5Lm1hcCggdGhpcywgZm4sIHVudGlsICk7XG5cblx0XHRpZiAoIG5hbWUuc2xpY2UoIC01ICkgIT09IFwiVW50aWxcIiApIHtcblx0XHRcdHNlbGVjdG9yID0gdW50aWw7XG5cdFx0fVxuXG5cdFx0aWYgKCBzZWxlY3RvciAmJiB0eXBlb2Ygc2VsZWN0b3IgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRyZXQgPSBqUXVlcnkuZmlsdGVyKCBzZWxlY3RvciwgcmV0ICk7XG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmxlbmd0aCA+IDEgKSB7XG5cblx0XHRcdC8vIFJlbW92ZSBkdXBsaWNhdGVzXG5cdFx0XHRpZiAoICFndWFyYW50ZWVkVW5pcXVlWyBuYW1lIF0gKSB7XG5cdFx0XHRcdHJldCA9IGpRdWVyeS51bmlxdWVTb3J0KCByZXQgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gUmV2ZXJzZSBvcmRlciBmb3IgcGFyZW50cyogYW5kIHByZXYtZGVyaXZhdGl2ZXNcblx0XHRcdGlmICggcnBhcmVudHNwcmV2LnRlc3QoIG5hbWUgKSApIHtcblx0XHRcdFx0cmV0ID0gcmV0LnJldmVyc2UoKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHJldCApO1xuXHR9O1xufSApO1xudmFyIHJub3R3aGl0ZSA9ICggL1xcUysvZyApO1xuXG5cblxuLy8gQ29udmVydCBTdHJpbmctZm9ybWF0dGVkIG9wdGlvbnMgaW50byBPYmplY3QtZm9ybWF0dGVkIG9uZXNcbmZ1bmN0aW9uIGNyZWF0ZU9wdGlvbnMoIG9wdGlvbnMgKSB7XG5cdHZhciBvYmplY3QgPSB7fTtcblx0alF1ZXJ5LmVhY2goIG9wdGlvbnMubWF0Y2goIHJub3R3aGl0ZSApIHx8IFtdLCBmdW5jdGlvbiggXywgZmxhZyApIHtcblx0XHRvYmplY3RbIGZsYWcgXSA9IHRydWU7XG5cdH0gKTtcblx0cmV0dXJuIG9iamVjdDtcbn1cblxuLypcbiAqIENyZWF0ZSBhIGNhbGxiYWNrIGxpc3QgdXNpbmcgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOlxuICpcbiAqXHRvcHRpb25zOiBhbiBvcHRpb25hbCBsaXN0IG9mIHNwYWNlLXNlcGFyYXRlZCBvcHRpb25zIHRoYXQgd2lsbCBjaGFuZ2UgaG93XG4gKlx0XHRcdHRoZSBjYWxsYmFjayBsaXN0IGJlaGF2ZXMgb3IgYSBtb3JlIHRyYWRpdGlvbmFsIG9wdGlvbiBvYmplY3RcbiAqXG4gKiBCeSBkZWZhdWx0IGEgY2FsbGJhY2sgbGlzdCB3aWxsIGFjdCBsaWtlIGFuIGV2ZW50IGNhbGxiYWNrIGxpc3QgYW5kIGNhbiBiZVxuICogXCJmaXJlZFwiIG11bHRpcGxlIHRpbWVzLlxuICpcbiAqIFBvc3NpYmxlIG9wdGlvbnM6XG4gKlxuICpcdG9uY2U6XHRcdFx0d2lsbCBlbnN1cmUgdGhlIGNhbGxiYWNrIGxpc3QgY2FuIG9ubHkgYmUgZmlyZWQgb25jZSAobGlrZSBhIERlZmVycmVkKVxuICpcbiAqXHRtZW1vcnk6XHRcdFx0d2lsbCBrZWVwIHRyYWNrIG9mIHByZXZpb3VzIHZhbHVlcyBhbmQgd2lsbCBjYWxsIGFueSBjYWxsYmFjayBhZGRlZFxuICpcdFx0XHRcdFx0YWZ0ZXIgdGhlIGxpc3QgaGFzIGJlZW4gZmlyZWQgcmlnaHQgYXdheSB3aXRoIHRoZSBsYXRlc3QgXCJtZW1vcml6ZWRcIlxuICpcdFx0XHRcdFx0dmFsdWVzIChsaWtlIGEgRGVmZXJyZWQpXG4gKlxuICpcdHVuaXF1ZTpcdFx0XHR3aWxsIGVuc3VyZSBhIGNhbGxiYWNrIGNhbiBvbmx5IGJlIGFkZGVkIG9uY2UgKG5vIGR1cGxpY2F0ZSBpbiB0aGUgbGlzdClcbiAqXG4gKlx0c3RvcE9uRmFsc2U6XHRpbnRlcnJ1cHQgY2FsbGluZ3Mgd2hlbiBhIGNhbGxiYWNrIHJldHVybnMgZmFsc2VcbiAqXG4gKi9cbmpRdWVyeS5DYWxsYmFja3MgPSBmdW5jdGlvbiggb3B0aW9ucyApIHtcblxuXHQvLyBDb252ZXJ0IG9wdGlvbnMgZnJvbSBTdHJpbmctZm9ybWF0dGVkIHRvIE9iamVjdC1mb3JtYXR0ZWQgaWYgbmVlZGVkXG5cdC8vICh3ZSBjaGVjayBpbiBjYWNoZSBmaXJzdClcblx0b3B0aW9ucyA9IHR5cGVvZiBvcHRpb25zID09PSBcInN0cmluZ1wiID9cblx0XHRjcmVhdGVPcHRpb25zKCBvcHRpb25zICkgOlxuXHRcdGpRdWVyeS5leHRlbmQoIHt9LCBvcHRpb25zICk7XG5cblx0dmFyIC8vIEZsYWcgdG8ga25vdyBpZiBsaXN0IGlzIGN1cnJlbnRseSBmaXJpbmdcblx0XHRmaXJpbmcsXG5cblx0XHQvLyBMYXN0IGZpcmUgdmFsdWUgZm9yIG5vbi1mb3JnZXR0YWJsZSBsaXN0c1xuXHRcdG1lbW9yeSxcblxuXHRcdC8vIEZsYWcgdG8ga25vdyBpZiBsaXN0IHdhcyBhbHJlYWR5IGZpcmVkXG5cdFx0ZmlyZWQsXG5cblx0XHQvLyBGbGFnIHRvIHByZXZlbnQgZmlyaW5nXG5cdFx0bG9ja2VkLFxuXG5cdFx0Ly8gQWN0dWFsIGNhbGxiYWNrIGxpc3Rcblx0XHRsaXN0ID0gW10sXG5cblx0XHQvLyBRdWV1ZSBvZiBleGVjdXRpb24gZGF0YSBmb3IgcmVwZWF0YWJsZSBsaXN0c1xuXHRcdHF1ZXVlID0gW10sXG5cblx0XHQvLyBJbmRleCBvZiBjdXJyZW50bHkgZmlyaW5nIGNhbGxiYWNrIChtb2RpZmllZCBieSBhZGQvcmVtb3ZlIGFzIG5lZWRlZClcblx0XHRmaXJpbmdJbmRleCA9IC0xLFxuXG5cdFx0Ly8gRmlyZSBjYWxsYmFja3Ncblx0XHRmaXJlID0gZnVuY3Rpb24oKSB7XG5cblx0XHRcdC8vIEVuZm9yY2Ugc2luZ2xlLWZpcmluZ1xuXHRcdFx0bG9ja2VkID0gb3B0aW9ucy5vbmNlO1xuXG5cdFx0XHQvLyBFeGVjdXRlIGNhbGxiYWNrcyBmb3IgYWxsIHBlbmRpbmcgZXhlY3V0aW9ucyxcblx0XHRcdC8vIHJlc3BlY3RpbmcgZmlyaW5nSW5kZXggb3ZlcnJpZGVzIGFuZCBydW50aW1lIGNoYW5nZXNcblx0XHRcdGZpcmVkID0gZmlyaW5nID0gdHJ1ZTtcblx0XHRcdGZvciAoIDsgcXVldWUubGVuZ3RoOyBmaXJpbmdJbmRleCA9IC0xICkge1xuXHRcdFx0XHRtZW1vcnkgPSBxdWV1ZS5zaGlmdCgpO1xuXHRcdFx0XHR3aGlsZSAoICsrZmlyaW5nSW5kZXggPCBsaXN0Lmxlbmd0aCApIHtcblxuXHRcdFx0XHRcdC8vIFJ1biBjYWxsYmFjayBhbmQgY2hlY2sgZm9yIGVhcmx5IHRlcm1pbmF0aW9uXG5cdFx0XHRcdFx0aWYgKCBsaXN0WyBmaXJpbmdJbmRleCBdLmFwcGx5KCBtZW1vcnlbIDAgXSwgbWVtb3J5WyAxIF0gKSA9PT0gZmFsc2UgJiZcblx0XHRcdFx0XHRcdG9wdGlvbnMuc3RvcE9uRmFsc2UgKSB7XG5cblx0XHRcdFx0XHRcdC8vIEp1bXAgdG8gZW5kIGFuZCBmb3JnZXQgdGhlIGRhdGEgc28gLmFkZCBkb2Vzbid0IHJlLWZpcmVcblx0XHRcdFx0XHRcdGZpcmluZ0luZGV4ID0gbGlzdC5sZW5ndGg7XG5cdFx0XHRcdFx0XHRtZW1vcnkgPSBmYWxzZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gRm9yZ2V0IHRoZSBkYXRhIGlmIHdlJ3JlIGRvbmUgd2l0aCBpdFxuXHRcdFx0aWYgKCAhb3B0aW9ucy5tZW1vcnkgKSB7XG5cdFx0XHRcdG1lbW9yeSA9IGZhbHNlO1xuXHRcdFx0fVxuXG5cdFx0XHRmaXJpbmcgPSBmYWxzZTtcblxuXHRcdFx0Ly8gQ2xlYW4gdXAgaWYgd2UncmUgZG9uZSBmaXJpbmcgZm9yIGdvb2Rcblx0XHRcdGlmICggbG9ja2VkICkge1xuXG5cdFx0XHRcdC8vIEtlZXAgYW4gZW1wdHkgbGlzdCBpZiB3ZSBoYXZlIGRhdGEgZm9yIGZ1dHVyZSBhZGQgY2FsbHNcblx0XHRcdFx0aWYgKCBtZW1vcnkgKSB7XG5cdFx0XHRcdFx0bGlzdCA9IFtdO1xuXG5cdFx0XHRcdC8vIE90aGVyd2lzZSwgdGhpcyBvYmplY3QgaXMgc3BlbnRcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRsaXN0ID0gXCJcIjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQvLyBBY3R1YWwgQ2FsbGJhY2tzIG9iamVjdFxuXHRcdHNlbGYgPSB7XG5cblx0XHRcdC8vIEFkZCBhIGNhbGxiYWNrIG9yIGEgY29sbGVjdGlvbiBvZiBjYWxsYmFja3MgdG8gdGhlIGxpc3Rcblx0XHRcdGFkZDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggbGlzdCApIHtcblxuXHRcdFx0XHRcdC8vIElmIHdlIGhhdmUgbWVtb3J5IGZyb20gYSBwYXN0IHJ1biwgd2Ugc2hvdWxkIGZpcmUgYWZ0ZXIgYWRkaW5nXG5cdFx0XHRcdFx0aWYgKCBtZW1vcnkgJiYgIWZpcmluZyApIHtcblx0XHRcdFx0XHRcdGZpcmluZ0luZGV4ID0gbGlzdC5sZW5ndGggLSAxO1xuXHRcdFx0XHRcdFx0cXVldWUucHVzaCggbWVtb3J5ICk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0KCBmdW5jdGlvbiBhZGQoIGFyZ3MgKSB7XG5cdFx0XHRcdFx0XHRqUXVlcnkuZWFjaCggYXJncywgZnVuY3Rpb24oIF8sIGFyZyApIHtcblx0XHRcdFx0XHRcdFx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggYXJnICkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKCAhb3B0aW9ucy51bmlxdWUgfHwgIXNlbGYuaGFzKCBhcmcgKSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdGxpc3QucHVzaCggYXJnICk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCBhcmcgJiYgYXJnLmxlbmd0aCAmJiBqUXVlcnkudHlwZSggYXJnICkgIT09IFwic3RyaW5nXCIgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBJbnNwZWN0IHJlY3Vyc2l2ZWx5XG5cdFx0XHRcdFx0XHRcdFx0YWRkKCBhcmcgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSApO1xuXHRcdFx0XHRcdH0gKSggYXJndW1lbnRzICk7XG5cblx0XHRcdFx0XHRpZiAoIG1lbW9yeSAmJiAhZmlyaW5nICkge1xuXHRcdFx0XHRcdFx0ZmlyZSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cblx0XHRcdC8vIFJlbW92ZSBhIGNhbGxiYWNrIGZyb20gdGhlIGxpc3Rcblx0XHRcdHJlbW92ZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGpRdWVyeS5lYWNoKCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBfLCBhcmcgKSB7XG5cdFx0XHRcdFx0dmFyIGluZGV4O1xuXHRcdFx0XHRcdHdoaWxlICggKCBpbmRleCA9IGpRdWVyeS5pbkFycmF5KCBhcmcsIGxpc3QsIGluZGV4ICkgKSA+IC0xICkge1xuXHRcdFx0XHRcdFx0bGlzdC5zcGxpY2UoIGluZGV4LCAxICk7XG5cblx0XHRcdFx0XHRcdC8vIEhhbmRsZSBmaXJpbmcgaW5kZXhlc1xuXHRcdFx0XHRcdFx0aWYgKCBpbmRleCA8PSBmaXJpbmdJbmRleCApIHtcblx0XHRcdFx0XHRcdFx0ZmlyaW5nSW5kZXgtLTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gKTtcblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBDaGVjayBpZiBhIGdpdmVuIGNhbGxiYWNrIGlzIGluIHRoZSBsaXN0LlxuXHRcdFx0Ly8gSWYgbm8gYXJndW1lbnQgaXMgZ2l2ZW4sIHJldHVybiB3aGV0aGVyIG9yIG5vdCBsaXN0IGhhcyBjYWxsYmFja3MgYXR0YWNoZWQuXG5cdFx0XHRoYXM6IGZ1bmN0aW9uKCBmbiApIHtcblx0XHRcdFx0cmV0dXJuIGZuID9cblx0XHRcdFx0XHRqUXVlcnkuaW5BcnJheSggZm4sIGxpc3QgKSA+IC0xIDpcblx0XHRcdFx0XHRsaXN0Lmxlbmd0aCA+IDA7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBSZW1vdmUgYWxsIGNhbGxiYWNrcyBmcm9tIHRoZSBsaXN0XG5cdFx0XHRlbXB0eTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggbGlzdCApIHtcblx0XHRcdFx0XHRsaXN0ID0gW107XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBEaXNhYmxlIC5maXJlIGFuZCAuYWRkXG5cdFx0XHQvLyBBYm9ydCBhbnkgY3VycmVudC9wZW5kaW5nIGV4ZWN1dGlvbnNcblx0XHRcdC8vIENsZWFyIGFsbCBjYWxsYmFja3MgYW5kIHZhbHVlc1xuXHRcdFx0ZGlzYWJsZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGxvY2tlZCA9IHF1ZXVlID0gW107XG5cdFx0XHRcdGxpc3QgPSBtZW1vcnkgPSBcIlwiO1xuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cdFx0XHRkaXNhYmxlZDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiAhbGlzdDtcblx0XHRcdH0sXG5cblx0XHRcdC8vIERpc2FibGUgLmZpcmVcblx0XHRcdC8vIEFsc28gZGlzYWJsZSAuYWRkIHVubGVzcyB3ZSBoYXZlIG1lbW9yeSAoc2luY2UgaXQgd291bGQgaGF2ZSBubyBlZmZlY3QpXG5cdFx0XHQvLyBBYm9ydCBhbnkgcGVuZGluZyBleGVjdXRpb25zXG5cdFx0XHRsb2NrOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0bG9ja2VkID0gdHJ1ZTtcblx0XHRcdFx0aWYgKCAhbWVtb3J5ICkge1xuXHRcdFx0XHRcdHNlbGYuZGlzYWJsZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblx0XHRcdGxvY2tlZDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiAhIWxvY2tlZDtcblx0XHRcdH0sXG5cblx0XHRcdC8vIENhbGwgYWxsIGNhbGxiYWNrcyB3aXRoIHRoZSBnaXZlbiBjb250ZXh0IGFuZCBhcmd1bWVudHNcblx0XHRcdGZpcmVXaXRoOiBmdW5jdGlvbiggY29udGV4dCwgYXJncyApIHtcblx0XHRcdFx0aWYgKCAhbG9ja2VkICkge1xuXHRcdFx0XHRcdGFyZ3MgPSBhcmdzIHx8IFtdO1xuXHRcdFx0XHRcdGFyZ3MgPSBbIGNvbnRleHQsIGFyZ3Muc2xpY2UgPyBhcmdzLnNsaWNlKCkgOiBhcmdzIF07XG5cdFx0XHRcdFx0cXVldWUucHVzaCggYXJncyApO1xuXHRcdFx0XHRcdGlmICggIWZpcmluZyApIHtcblx0XHRcdFx0XHRcdGZpcmUoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBDYWxsIGFsbCB0aGUgY2FsbGJhY2tzIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50c1xuXHRcdFx0ZmlyZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHNlbGYuZmlyZVdpdGgoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cblx0XHRcdC8vIFRvIGtub3cgaWYgdGhlIGNhbGxiYWNrcyBoYXZlIGFscmVhZHkgYmVlbiBjYWxsZWQgYXQgbGVhc3Qgb25jZVxuXHRcdFx0ZmlyZWQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gISFmaXJlZDtcblx0XHRcdH1cblx0XHR9O1xuXG5cdHJldHVybiBzZWxmO1xufTtcblxuXG5qUXVlcnkuZXh0ZW5kKCB7XG5cblx0RGVmZXJyZWQ6IGZ1bmN0aW9uKCBmdW5jICkge1xuXHRcdHZhciB0dXBsZXMgPSBbXG5cblx0XHRcdFx0Ly8gYWN0aW9uLCBhZGQgbGlzdGVuZXIsIGxpc3RlbmVyIGxpc3QsIGZpbmFsIHN0YXRlXG5cdFx0XHRcdFsgXCJyZXNvbHZlXCIsIFwiZG9uZVwiLCBqUXVlcnkuQ2FsbGJhY2tzKCBcIm9uY2UgbWVtb3J5XCIgKSwgXCJyZXNvbHZlZFwiIF0sXG5cdFx0XHRcdFsgXCJyZWplY3RcIiwgXCJmYWlsXCIsIGpRdWVyeS5DYWxsYmFja3MoIFwib25jZSBtZW1vcnlcIiApLCBcInJlamVjdGVkXCIgXSxcblx0XHRcdFx0WyBcIm5vdGlmeVwiLCBcInByb2dyZXNzXCIsIGpRdWVyeS5DYWxsYmFja3MoIFwibWVtb3J5XCIgKSBdXG5cdFx0XHRdLFxuXHRcdFx0c3RhdGUgPSBcInBlbmRpbmdcIixcblx0XHRcdHByb21pc2UgPSB7XG5cdFx0XHRcdHN0YXRlOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRyZXR1cm4gc3RhdGU7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdGFsd2F5czogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0ZGVmZXJyZWQuZG9uZSggYXJndW1lbnRzICkuZmFpbCggYXJndW1lbnRzICk7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoZW46IGZ1bmN0aW9uKCAvKiBmbkRvbmUsIGZuRmFpbCwgZm5Qcm9ncmVzcyAqLyApIHtcblx0XHRcdFx0XHR2YXIgZm5zID0gYXJndW1lbnRzO1xuXHRcdFx0XHRcdHJldHVybiBqUXVlcnkuRGVmZXJyZWQoIGZ1bmN0aW9uKCBuZXdEZWZlciApIHtcblx0XHRcdFx0XHRcdGpRdWVyeS5lYWNoKCB0dXBsZXMsIGZ1bmN0aW9uKCBpLCB0dXBsZSApIHtcblx0XHRcdFx0XHRcdFx0dmFyIGZuID0galF1ZXJ5LmlzRnVuY3Rpb24oIGZuc1sgaSBdICkgJiYgZm5zWyBpIF07XG5cblx0XHRcdFx0XHRcdFx0Ly8gZGVmZXJyZWRbIGRvbmUgfCBmYWlsIHwgcHJvZ3Jlc3MgXSBmb3IgZm9yd2FyZGluZyBhY3Rpb25zIHRvIG5ld0RlZmVyXG5cdFx0XHRcdFx0XHRcdGRlZmVycmVkWyB0dXBsZVsgMSBdIF0oIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdHZhciByZXR1cm5lZCA9IGZuICYmIGZuLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHRcdFx0XHRcdFx0XHRpZiAoIHJldHVybmVkICYmIGpRdWVyeS5pc0Z1bmN0aW9uKCByZXR1cm5lZC5wcm9taXNlICkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm5lZC5wcm9taXNlKClcblx0XHRcdFx0XHRcdFx0XHRcdFx0LnByb2dyZXNzKCBuZXdEZWZlci5ub3RpZnkgKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQuZG9uZSggbmV3RGVmZXIucmVzb2x2ZSApXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC5mYWlsKCBuZXdEZWZlci5yZWplY3QgKTtcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0bmV3RGVmZXJbIHR1cGxlWyAwIF0gKyBcIldpdGhcIiBdKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aGlzID09PSBwcm9taXNlID8gbmV3RGVmZXIucHJvbWlzZSgpIDogdGhpcyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0Zm4gPyBbIHJldHVybmVkIF0gOiBhcmd1bWVudHNcblx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9ICk7XG5cdFx0XHRcdFx0XHR9ICk7XG5cdFx0XHRcdFx0XHRmbnMgPSBudWxsO1xuXHRcdFx0XHRcdH0gKS5wcm9taXNlKCk7XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0Ly8gR2V0IGEgcHJvbWlzZSBmb3IgdGhpcyBkZWZlcnJlZFxuXHRcdFx0XHQvLyBJZiBvYmogaXMgcHJvdmlkZWQsIHRoZSBwcm9taXNlIGFzcGVjdCBpcyBhZGRlZCB0byB0aGUgb2JqZWN0XG5cdFx0XHRcdHByb21pc2U6IGZ1bmN0aW9uKCBvYmogKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9iaiAhPSBudWxsID8galF1ZXJ5LmV4dGVuZCggb2JqLCBwcm9taXNlICkgOiBwcm9taXNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0ZGVmZXJyZWQgPSB7fTtcblxuXHRcdC8vIEtlZXAgcGlwZSBmb3IgYmFjay1jb21wYXRcblx0XHRwcm9taXNlLnBpcGUgPSBwcm9taXNlLnRoZW47XG5cblx0XHQvLyBBZGQgbGlzdC1zcGVjaWZpYyBtZXRob2RzXG5cdFx0alF1ZXJ5LmVhY2goIHR1cGxlcywgZnVuY3Rpb24oIGksIHR1cGxlICkge1xuXHRcdFx0dmFyIGxpc3QgPSB0dXBsZVsgMiBdLFxuXHRcdFx0XHRzdGF0ZVN0cmluZyA9IHR1cGxlWyAzIF07XG5cblx0XHRcdC8vIHByb21pc2VbIGRvbmUgfCBmYWlsIHwgcHJvZ3Jlc3MgXSA9IGxpc3QuYWRkXG5cdFx0XHRwcm9taXNlWyB0dXBsZVsgMSBdIF0gPSBsaXN0LmFkZDtcblxuXHRcdFx0Ly8gSGFuZGxlIHN0YXRlXG5cdFx0XHRpZiAoIHN0YXRlU3RyaW5nICkge1xuXHRcdFx0XHRsaXN0LmFkZCggZnVuY3Rpb24oKSB7XG5cblx0XHRcdFx0XHQvLyBzdGF0ZSA9IFsgcmVzb2x2ZWQgfCByZWplY3RlZCBdXG5cdFx0XHRcdFx0c3RhdGUgPSBzdGF0ZVN0cmluZztcblxuXHRcdFx0XHQvLyBbIHJlamVjdF9saXN0IHwgcmVzb2x2ZV9saXN0IF0uZGlzYWJsZTsgcHJvZ3Jlc3NfbGlzdC5sb2NrXG5cdFx0XHRcdH0sIHR1cGxlc1sgaSBeIDEgXVsgMiBdLmRpc2FibGUsIHR1cGxlc1sgMiBdWyAyIF0ubG9jayApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBkZWZlcnJlZFsgcmVzb2x2ZSB8IHJlamVjdCB8IG5vdGlmeSBdXG5cdFx0XHRkZWZlcnJlZFsgdHVwbGVbIDAgXSBdID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGRlZmVycmVkWyB0dXBsZVsgMCBdICsgXCJXaXRoXCIgXSggdGhpcyA9PT0gZGVmZXJyZWQgPyBwcm9taXNlIDogdGhpcywgYXJndW1lbnRzICk7XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fTtcblx0XHRcdGRlZmVycmVkWyB0dXBsZVsgMCBdICsgXCJXaXRoXCIgXSA9IGxpc3QuZmlyZVdpdGg7XG5cdFx0fSApO1xuXG5cdFx0Ly8gTWFrZSB0aGUgZGVmZXJyZWQgYSBwcm9taXNlXG5cdFx0cHJvbWlzZS5wcm9taXNlKCBkZWZlcnJlZCApO1xuXG5cdFx0Ly8gQ2FsbCBnaXZlbiBmdW5jIGlmIGFueVxuXHRcdGlmICggZnVuYyApIHtcblx0XHRcdGZ1bmMuY2FsbCggZGVmZXJyZWQsIGRlZmVycmVkICk7XG5cdFx0fVxuXG5cdFx0Ly8gQWxsIGRvbmUhXG5cdFx0cmV0dXJuIGRlZmVycmVkO1xuXHR9LFxuXG5cdC8vIERlZmVycmVkIGhlbHBlclxuXHR3aGVuOiBmdW5jdGlvbiggc3Vib3JkaW5hdGUgLyogLCAuLi4sIHN1Ym9yZGluYXRlTiAqLyApIHtcblx0XHR2YXIgaSA9IDAsXG5cdFx0XHRyZXNvbHZlVmFsdWVzID0gc2xpY2UuY2FsbCggYXJndW1lbnRzICksXG5cdFx0XHRsZW5ndGggPSByZXNvbHZlVmFsdWVzLmxlbmd0aCxcblxuXHRcdFx0Ly8gdGhlIGNvdW50IG9mIHVuY29tcGxldGVkIHN1Ym9yZGluYXRlc1xuXHRcdFx0cmVtYWluaW5nID0gbGVuZ3RoICE9PSAxIHx8XG5cdFx0XHRcdCggc3Vib3JkaW5hdGUgJiYgalF1ZXJ5LmlzRnVuY3Rpb24oIHN1Ym9yZGluYXRlLnByb21pc2UgKSApID8gbGVuZ3RoIDogMCxcblxuXHRcdFx0Ly8gdGhlIG1hc3RlciBEZWZlcnJlZC5cblx0XHRcdC8vIElmIHJlc29sdmVWYWx1ZXMgY29uc2lzdCBvZiBvbmx5IGEgc2luZ2xlIERlZmVycmVkLCBqdXN0IHVzZSB0aGF0LlxuXHRcdFx0ZGVmZXJyZWQgPSByZW1haW5pbmcgPT09IDEgPyBzdWJvcmRpbmF0ZSA6IGpRdWVyeS5EZWZlcnJlZCgpLFxuXG5cdFx0XHQvLyBVcGRhdGUgZnVuY3Rpb24gZm9yIGJvdGggcmVzb2x2ZSBhbmQgcHJvZ3Jlc3MgdmFsdWVzXG5cdFx0XHR1cGRhdGVGdW5jID0gZnVuY3Rpb24oIGksIGNvbnRleHRzLCB2YWx1ZXMgKSB7XG5cdFx0XHRcdHJldHVybiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0XHRcdFx0Y29udGV4dHNbIGkgXSA9IHRoaXM7XG5cdFx0XHRcdFx0dmFsdWVzWyBpIF0gPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/IHNsaWNlLmNhbGwoIGFyZ3VtZW50cyApIDogdmFsdWU7XG5cdFx0XHRcdFx0aWYgKCB2YWx1ZXMgPT09IHByb2dyZXNzVmFsdWVzICkge1xuXHRcdFx0XHRcdFx0ZGVmZXJyZWQubm90aWZ5V2l0aCggY29udGV4dHMsIHZhbHVlcyApO1xuXG5cdFx0XHRcdFx0fSBlbHNlIGlmICggISggLS1yZW1haW5pbmcgKSApIHtcblx0XHRcdFx0XHRcdGRlZmVycmVkLnJlc29sdmVXaXRoKCBjb250ZXh0cywgdmFsdWVzICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXHRcdFx0fSxcblxuXHRcdFx0cHJvZ3Jlc3NWYWx1ZXMsIHByb2dyZXNzQ29udGV4dHMsIHJlc29sdmVDb250ZXh0cztcblxuXHRcdC8vIGFkZCBsaXN0ZW5lcnMgdG8gRGVmZXJyZWQgc3Vib3JkaW5hdGVzOyB0cmVhdCBvdGhlcnMgYXMgcmVzb2x2ZWRcblx0XHRpZiAoIGxlbmd0aCA+IDEgKSB7XG5cdFx0XHRwcm9ncmVzc1ZhbHVlcyA9IG5ldyBBcnJheSggbGVuZ3RoICk7XG5cdFx0XHRwcm9ncmVzc0NvbnRleHRzID0gbmV3IEFycmF5KCBsZW5ndGggKTtcblx0XHRcdHJlc29sdmVDb250ZXh0cyA9IG5ldyBBcnJheSggbGVuZ3RoICk7XG5cdFx0XHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHtcblx0XHRcdFx0aWYgKCByZXNvbHZlVmFsdWVzWyBpIF0gJiYgalF1ZXJ5LmlzRnVuY3Rpb24oIHJlc29sdmVWYWx1ZXNbIGkgXS5wcm9taXNlICkgKSB7XG5cdFx0XHRcdFx0cmVzb2x2ZVZhbHVlc1sgaSBdLnByb21pc2UoKVxuXHRcdFx0XHRcdFx0LnByb2dyZXNzKCB1cGRhdGVGdW5jKCBpLCBwcm9ncmVzc0NvbnRleHRzLCBwcm9ncmVzc1ZhbHVlcyApIClcblx0XHRcdFx0XHRcdC5kb25lKCB1cGRhdGVGdW5jKCBpLCByZXNvbHZlQ29udGV4dHMsIHJlc29sdmVWYWx1ZXMgKSApXG5cdFx0XHRcdFx0XHQuZmFpbCggZGVmZXJyZWQucmVqZWN0ICk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0LS1yZW1haW5pbmc7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBpZiB3ZSdyZSBub3Qgd2FpdGluZyBvbiBhbnl0aGluZywgcmVzb2x2ZSB0aGUgbWFzdGVyXG5cdFx0aWYgKCAhcmVtYWluaW5nICkge1xuXHRcdFx0ZGVmZXJyZWQucmVzb2x2ZVdpdGgoIHJlc29sdmVDb250ZXh0cywgcmVzb2x2ZVZhbHVlcyApO1xuXHRcdH1cblxuXHRcdHJldHVybiBkZWZlcnJlZC5wcm9taXNlKCk7XG5cdH1cbn0gKTtcblxuXG4vLyBUaGUgZGVmZXJyZWQgdXNlZCBvbiBET00gcmVhZHlcbnZhciByZWFkeUxpc3Q7XG5cbmpRdWVyeS5mbi5yZWFkeSA9IGZ1bmN0aW9uKCBmbiApIHtcblxuXHQvLyBBZGQgdGhlIGNhbGxiYWNrXG5cdGpRdWVyeS5yZWFkeS5wcm9taXNlKCkuZG9uZSggZm4gKTtcblxuXHRyZXR1cm4gdGhpcztcbn07XG5cbmpRdWVyeS5leHRlbmQoIHtcblxuXHQvLyBJcyB0aGUgRE9NIHJlYWR5IHRvIGJlIHVzZWQ/IFNldCB0byB0cnVlIG9uY2UgaXQgb2NjdXJzLlxuXHRpc1JlYWR5OiBmYWxzZSxcblxuXHQvLyBBIGNvdW50ZXIgdG8gdHJhY2sgaG93IG1hbnkgaXRlbXMgdG8gd2FpdCBmb3IgYmVmb3JlXG5cdC8vIHRoZSByZWFkeSBldmVudCBmaXJlcy4gU2VlICM2NzgxXG5cdHJlYWR5V2FpdDogMSxcblxuXHQvLyBIb2xkIChvciByZWxlYXNlKSB0aGUgcmVhZHkgZXZlbnRcblx0aG9sZFJlYWR5OiBmdW5jdGlvbiggaG9sZCApIHtcblx0XHRpZiAoIGhvbGQgKSB7XG5cdFx0XHRqUXVlcnkucmVhZHlXYWl0Kys7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGpRdWVyeS5yZWFkeSggdHJ1ZSApO1xuXHRcdH1cblx0fSxcblxuXHQvLyBIYW5kbGUgd2hlbiB0aGUgRE9NIGlzIHJlYWR5XG5cdHJlYWR5OiBmdW5jdGlvbiggd2FpdCApIHtcblxuXHRcdC8vIEFib3J0IGlmIHRoZXJlIGFyZSBwZW5kaW5nIGhvbGRzIG9yIHdlJ3JlIGFscmVhZHkgcmVhZHlcblx0XHRpZiAoIHdhaXQgPT09IHRydWUgPyAtLWpRdWVyeS5yZWFkeVdhaXQgOiBqUXVlcnkuaXNSZWFkeSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBSZW1lbWJlciB0aGF0IHRoZSBET00gaXMgcmVhZHlcblx0XHRqUXVlcnkuaXNSZWFkeSA9IHRydWU7XG5cblx0XHQvLyBJZiBhIG5vcm1hbCBET00gUmVhZHkgZXZlbnQgZmlyZWQsIGRlY3JlbWVudCwgYW5kIHdhaXQgaWYgbmVlZCBiZVxuXHRcdGlmICggd2FpdCAhPT0gdHJ1ZSAmJiAtLWpRdWVyeS5yZWFkeVdhaXQgPiAwICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIElmIHRoZXJlIGFyZSBmdW5jdGlvbnMgYm91bmQsIHRvIGV4ZWN1dGVcblx0XHRyZWFkeUxpc3QucmVzb2x2ZVdpdGgoIGRvY3VtZW50LCBbIGpRdWVyeSBdICk7XG5cblx0XHQvLyBUcmlnZ2VyIGFueSBib3VuZCByZWFkeSBldmVudHNcblx0XHRpZiAoIGpRdWVyeS5mbi50cmlnZ2VySGFuZGxlciApIHtcblx0XHRcdGpRdWVyeSggZG9jdW1lbnQgKS50cmlnZ2VySGFuZGxlciggXCJyZWFkeVwiICk7XG5cdFx0XHRqUXVlcnkoIGRvY3VtZW50ICkub2ZmKCBcInJlYWR5XCIgKTtcblx0XHR9XG5cdH1cbn0gKTtcblxuLyoqXG4gKiBDbGVhbi11cCBtZXRob2QgZm9yIGRvbSByZWFkeSBldmVudHNcbiAqL1xuZnVuY3Rpb24gZGV0YWNoKCkge1xuXHRpZiAoIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIgKSB7XG5cdFx0ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciggXCJET01Db250ZW50TG9hZGVkXCIsIGNvbXBsZXRlZCApO1xuXHRcdHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCBcImxvYWRcIiwgY29tcGxldGVkICk7XG5cblx0fSBlbHNlIHtcblx0XHRkb2N1bWVudC5kZXRhY2hFdmVudCggXCJvbnJlYWR5c3RhdGVjaGFuZ2VcIiwgY29tcGxldGVkICk7XG5cdFx0d2luZG93LmRldGFjaEV2ZW50KCBcIm9ubG9hZFwiLCBjb21wbGV0ZWQgKTtcblx0fVxufVxuXG4vKipcbiAqIFRoZSByZWFkeSBldmVudCBoYW5kbGVyIGFuZCBzZWxmIGNsZWFudXAgbWV0aG9kXG4gKi9cbmZ1bmN0aW9uIGNvbXBsZXRlZCgpIHtcblxuXHQvLyByZWFkeVN0YXRlID09PSBcImNvbXBsZXRlXCIgaXMgZ29vZCBlbm91Z2ggZm9yIHVzIHRvIGNhbGwgdGhlIGRvbSByZWFkeSBpbiBvbGRJRVxuXHRpZiAoIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIgfHxcblx0XHR3aW5kb3cuZXZlbnQudHlwZSA9PT0gXCJsb2FkXCIgfHxcblx0XHRkb2N1bWVudC5yZWFkeVN0YXRlID09PSBcImNvbXBsZXRlXCIgKSB7XG5cblx0XHRkZXRhY2goKTtcblx0XHRqUXVlcnkucmVhZHkoKTtcblx0fVxufVxuXG5qUXVlcnkucmVhZHkucHJvbWlzZSA9IGZ1bmN0aW9uKCBvYmogKSB7XG5cdGlmICggIXJlYWR5TGlzdCApIHtcblxuXHRcdHJlYWR5TGlzdCA9IGpRdWVyeS5EZWZlcnJlZCgpO1xuXG5cdFx0Ly8gQ2F0Y2ggY2FzZXMgd2hlcmUgJChkb2N1bWVudCkucmVhZHkoKSBpcyBjYWxsZWRcblx0XHQvLyBhZnRlciB0aGUgYnJvd3NlciBldmVudCBoYXMgYWxyZWFkeSBvY2N1cnJlZC5cblx0XHQvLyBTdXBwb3J0OiBJRTYtMTBcblx0XHQvLyBPbGRlciBJRSBzb21ldGltZXMgc2lnbmFscyBcImludGVyYWN0aXZlXCIgdG9vIHNvb25cblx0XHRpZiAoIGRvY3VtZW50LnJlYWR5U3RhdGUgPT09IFwiY29tcGxldGVcIiB8fFxuXHRcdFx0KCBkb2N1bWVudC5yZWFkeVN0YXRlICE9PSBcImxvYWRpbmdcIiAmJiAhZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsICkgKSB7XG5cblx0XHRcdC8vIEhhbmRsZSBpdCBhc3luY2hyb25vdXNseSB0byBhbGxvdyBzY3JpcHRzIHRoZSBvcHBvcnR1bml0eSB0byBkZWxheSByZWFkeVxuXHRcdFx0d2luZG93LnNldFRpbWVvdXQoIGpRdWVyeS5yZWFkeSApO1xuXG5cdFx0Ly8gU3RhbmRhcmRzLWJhc2VkIGJyb3dzZXJzIHN1cHBvcnQgRE9NQ29udGVudExvYWRlZFxuXHRcdH0gZWxzZSBpZiAoIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIgKSB7XG5cblx0XHRcdC8vIFVzZSB0aGUgaGFuZHkgZXZlbnQgY2FsbGJhY2tcblx0XHRcdGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIFwiRE9NQ29udGVudExvYWRlZFwiLCBjb21wbGV0ZWQgKTtcblxuXHRcdFx0Ly8gQSBmYWxsYmFjayB0byB3aW5kb3cub25sb2FkLCB0aGF0IHdpbGwgYWx3YXlzIHdvcmtcblx0XHRcdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCBcImxvYWRcIiwgY29tcGxldGVkICk7XG5cblx0XHQvLyBJZiBJRSBldmVudCBtb2RlbCBpcyB1c2VkXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gRW5zdXJlIGZpcmluZyBiZWZvcmUgb25sb2FkLCBtYXliZSBsYXRlIGJ1dCBzYWZlIGFsc28gZm9yIGlmcmFtZXNcblx0XHRcdGRvY3VtZW50LmF0dGFjaEV2ZW50KCBcIm9ucmVhZHlzdGF0ZWNoYW5nZVwiLCBjb21wbGV0ZWQgKTtcblxuXHRcdFx0Ly8gQSBmYWxsYmFjayB0byB3aW5kb3cub25sb2FkLCB0aGF0IHdpbGwgYWx3YXlzIHdvcmtcblx0XHRcdHdpbmRvdy5hdHRhY2hFdmVudCggXCJvbmxvYWRcIiwgY29tcGxldGVkICk7XG5cblx0XHRcdC8vIElmIElFIGFuZCBub3QgYSBmcmFtZVxuXHRcdFx0Ly8gY29udGludWFsbHkgY2hlY2sgdG8gc2VlIGlmIHRoZSBkb2N1bWVudCBpcyByZWFkeVxuXHRcdFx0dmFyIHRvcCA9IGZhbHNlO1xuXG5cdFx0XHR0cnkge1xuXHRcdFx0XHR0b3AgPSB3aW5kb3cuZnJhbWVFbGVtZW50ID09IG51bGwgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuXHRcdFx0fSBjYXRjaCAoIGUgKSB7fVxuXG5cdFx0XHRpZiAoIHRvcCAmJiB0b3AuZG9TY3JvbGwgKSB7XG5cdFx0XHRcdCggZnVuY3Rpb24gZG9TY3JvbGxDaGVjaygpIHtcblx0XHRcdFx0XHRpZiAoICFqUXVlcnkuaXNSZWFkeSApIHtcblxuXHRcdFx0XHRcdFx0dHJ5IHtcblxuXHRcdFx0XHRcdFx0XHQvLyBVc2UgdGhlIHRyaWNrIGJ5IERpZWdvIFBlcmluaVxuXHRcdFx0XHRcdFx0XHQvLyBodHRwOi8vamF2YXNjcmlwdC5ud2JveC5jb20vSUVDb250ZW50TG9hZGVkL1xuXHRcdFx0XHRcdFx0XHR0b3AuZG9TY3JvbGwoIFwibGVmdFwiICk7XG5cdFx0XHRcdFx0XHR9IGNhdGNoICggZSApIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KCBkb1Njcm9sbENoZWNrLCA1MCApO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQvLyBkZXRhY2ggYWxsIGRvbSByZWFkeSBldmVudHNcblx0XHRcdFx0XHRcdGRldGFjaCgpO1xuXG5cdFx0XHRcdFx0XHQvLyBhbmQgZXhlY3V0ZSBhbnkgd2FpdGluZyBmdW5jdGlvbnNcblx0XHRcdFx0XHRcdGpRdWVyeS5yZWFkeSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSApKCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHJldHVybiByZWFkeUxpc3QucHJvbWlzZSggb2JqICk7XG59O1xuXG4vLyBLaWNrIG9mZiB0aGUgRE9NIHJlYWR5IGNoZWNrIGV2ZW4gaWYgdGhlIHVzZXIgZG9lcyBub3RcbmpRdWVyeS5yZWFkeS5wcm9taXNlKCk7XG5cblxuXG5cbi8vIFN1cHBvcnQ6IElFPDlcbi8vIEl0ZXJhdGlvbiBvdmVyIG9iamVjdCdzIGluaGVyaXRlZCBwcm9wZXJ0aWVzIGJlZm9yZSBpdHMgb3duXG52YXIgaTtcbmZvciAoIGkgaW4galF1ZXJ5KCBzdXBwb3J0ICkgKSB7XG5cdGJyZWFrO1xufVxuc3VwcG9ydC5vd25GaXJzdCA9IGkgPT09IFwiMFwiO1xuXG4vLyBOb3RlOiBtb3N0IHN1cHBvcnQgdGVzdHMgYXJlIGRlZmluZWQgaW4gdGhlaXIgcmVzcGVjdGl2ZSBtb2R1bGVzLlxuLy8gZmFsc2UgdW50aWwgdGhlIHRlc3QgaXMgcnVuXG5zdXBwb3J0LmlubGluZUJsb2NrTmVlZHNMYXlvdXQgPSBmYWxzZTtcblxuLy8gRXhlY3V0ZSBBU0FQIGluIGNhc2Ugd2UgbmVlZCB0byBzZXQgYm9keS5zdHlsZS56b29tXG5qUXVlcnkoIGZ1bmN0aW9uKCkge1xuXG5cdC8vIE1pbmlmaWVkOiB2YXIgYSxiLGMsZFxuXHR2YXIgdmFsLCBkaXYsIGJvZHksIGNvbnRhaW5lcjtcblxuXHRib2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIFwiYm9keVwiIClbIDAgXTtcblx0aWYgKCAhYm9keSB8fCAhYm9keS5zdHlsZSApIHtcblxuXHRcdC8vIFJldHVybiBmb3IgZnJhbWVzZXQgZG9jcyB0aGF0IGRvbid0IGhhdmUgYSBib2R5XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Ly8gU2V0dXBcblx0ZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJkaXZcIiApO1xuXHRjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImRpdlwiICk7XG5cdGNvbnRhaW5lci5zdHlsZS5jc3NUZXh0ID0gXCJwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXI6MDt3aWR0aDowO2hlaWdodDowO3RvcDowO2xlZnQ6LTk5OTlweFwiO1xuXHRib2R5LmFwcGVuZENoaWxkKCBjb250YWluZXIgKS5hcHBlbmRDaGlsZCggZGl2ICk7XG5cblx0aWYgKCB0eXBlb2YgZGl2LnN0eWxlLnpvb20gIT09IFwidW5kZWZpbmVkXCIgKSB7XG5cblx0XHQvLyBTdXBwb3J0OiBJRTw4XG5cdFx0Ly8gQ2hlY2sgaWYgbmF0aXZlbHkgYmxvY2stbGV2ZWwgZWxlbWVudHMgYWN0IGxpa2UgaW5saW5lLWJsb2NrXG5cdFx0Ly8gZWxlbWVudHMgd2hlbiBzZXR0aW5nIHRoZWlyIGRpc3BsYXkgdG8gJ2lubGluZScgYW5kIGdpdmluZ1xuXHRcdC8vIHRoZW0gbGF5b3V0XG5cdFx0ZGl2LnN0eWxlLmNzc1RleHQgPSBcImRpc3BsYXk6aW5saW5lO21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MXB4O3dpZHRoOjFweDt6b29tOjFcIjtcblxuXHRcdHN1cHBvcnQuaW5saW5lQmxvY2tOZWVkc0xheW91dCA9IHZhbCA9IGRpdi5vZmZzZXRXaWR0aCA9PT0gMztcblx0XHRpZiAoIHZhbCApIHtcblxuXHRcdFx0Ly8gUHJldmVudCBJRSA2IGZyb20gYWZmZWN0aW5nIGxheW91dCBmb3IgcG9zaXRpb25lZCBlbGVtZW50cyAjMTEwNDhcblx0XHRcdC8vIFByZXZlbnQgSUUgZnJvbSBzaHJpbmtpbmcgdGhlIGJvZHkgaW4gSUUgNyBtb2RlICMxMjg2OVxuXHRcdFx0Ly8gU3VwcG9ydDogSUU8OFxuXHRcdFx0Ym9keS5zdHlsZS56b29tID0gMTtcblx0XHR9XG5cdH1cblxuXHRib2R5LnJlbW92ZUNoaWxkKCBjb250YWluZXIgKTtcbn0gKTtcblxuXG4oIGZ1bmN0aW9uKCkge1xuXHR2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJkaXZcIiApO1xuXG5cdC8vIFN1cHBvcnQ6IElFPDlcblx0c3VwcG9ydC5kZWxldGVFeHBhbmRvID0gdHJ1ZTtcblx0dHJ5IHtcblx0XHRkZWxldGUgZGl2LnRlc3Q7XG5cdH0gY2F0Y2ggKCBlICkge1xuXHRcdHN1cHBvcnQuZGVsZXRlRXhwYW5kbyA9IGZhbHNlO1xuXHR9XG5cblx0Ly8gTnVsbCBlbGVtZW50cyB0byBhdm9pZCBsZWFrcyBpbiBJRS5cblx0ZGl2ID0gbnVsbDtcbn0gKSgpO1xudmFyIGFjY2VwdERhdGEgPSBmdW5jdGlvbiggZWxlbSApIHtcblx0dmFyIG5vRGF0YSA9IGpRdWVyeS5ub0RhdGFbICggZWxlbS5ub2RlTmFtZSArIFwiIFwiICkudG9Mb3dlckNhc2UoKSBdLFxuXHRcdG5vZGVUeXBlID0gK2VsZW0ubm9kZVR5cGUgfHwgMTtcblxuXHQvLyBEbyBub3Qgc2V0IGRhdGEgb24gbm9uLWVsZW1lbnQgRE9NIG5vZGVzIGJlY2F1c2UgaXQgd2lsbCBub3QgYmUgY2xlYXJlZCAoIzgzMzUpLlxuXHRyZXR1cm4gbm9kZVR5cGUgIT09IDEgJiYgbm9kZVR5cGUgIT09IDkgP1xuXHRcdGZhbHNlIDpcblxuXHRcdC8vIE5vZGVzIGFjY2VwdCBkYXRhIHVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkOyByZWplY3Rpb24gY2FuIGJlIGNvbmRpdGlvbmFsXG5cdFx0IW5vRGF0YSB8fCBub0RhdGEgIT09IHRydWUgJiYgZWxlbS5nZXRBdHRyaWJ1dGUoIFwiY2xhc3NpZFwiICkgPT09IG5vRGF0YTtcbn07XG5cblxuXG5cbnZhciByYnJhY2UgPSAvXig/Olxce1tcXHdcXFddKlxcfXxcXFtbXFx3XFxXXSpcXF0pJC8sXG5cdHJtdWx0aURhc2ggPSAvKFtBLVpdKS9nO1xuXG5mdW5jdGlvbiBkYXRhQXR0ciggZWxlbSwga2V5LCBkYXRhICkge1xuXG5cdC8vIElmIG5vdGhpbmcgd2FzIGZvdW5kIGludGVybmFsbHksIHRyeSB0byBmZXRjaCBhbnlcblx0Ly8gZGF0YSBmcm9tIHRoZSBIVE1MNSBkYXRhLSogYXR0cmlidXRlXG5cdGlmICggZGF0YSA9PT0gdW5kZWZpbmVkICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cblx0XHR2YXIgbmFtZSA9IFwiZGF0YS1cIiArIGtleS5yZXBsYWNlKCBybXVsdGlEYXNoLCBcIi0kMVwiICkudG9Mb3dlckNhc2UoKTtcblxuXHRcdGRhdGEgPSBlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSApO1xuXG5cdFx0aWYgKCB0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGRhdGEgPSBkYXRhID09PSBcInRydWVcIiA/IHRydWUgOlxuXHRcdFx0XHRcdGRhdGEgPT09IFwiZmFsc2VcIiA/IGZhbHNlIDpcblx0XHRcdFx0XHRkYXRhID09PSBcIm51bGxcIiA/IG51bGwgOlxuXG5cdFx0XHRcdFx0Ly8gT25seSBjb252ZXJ0IHRvIGEgbnVtYmVyIGlmIGl0IGRvZXNuJ3QgY2hhbmdlIHRoZSBzdHJpbmdcblx0XHRcdFx0XHQrZGF0YSArIFwiXCIgPT09IGRhdGEgPyArZGF0YSA6XG5cdFx0XHRcdFx0cmJyYWNlLnRlc3QoIGRhdGEgKSA/IGpRdWVyeS5wYXJzZUpTT04oIGRhdGEgKSA6XG5cdFx0XHRcdFx0ZGF0YTtcblx0XHRcdH0gY2F0Y2ggKCBlICkge31cblxuXHRcdFx0Ly8gTWFrZSBzdXJlIHdlIHNldCB0aGUgZGF0YSBzbyBpdCBpc24ndCBjaGFuZ2VkIGxhdGVyXG5cdFx0XHRqUXVlcnkuZGF0YSggZWxlbSwga2V5LCBkYXRhICk7XG5cblx0XHR9IGVsc2Uge1xuXHRcdFx0ZGF0YSA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gZGF0YTtcbn1cblxuLy8gY2hlY2tzIGEgY2FjaGUgb2JqZWN0IGZvciBlbXB0aW5lc3NcbmZ1bmN0aW9uIGlzRW1wdHlEYXRhT2JqZWN0KCBvYmogKSB7XG5cdHZhciBuYW1lO1xuXHRmb3IgKCBuYW1lIGluIG9iaiApIHtcblxuXHRcdC8vIGlmIHRoZSBwdWJsaWMgZGF0YSBvYmplY3QgaXMgZW1wdHksIHRoZSBwcml2YXRlIGlzIHN0aWxsIGVtcHR5XG5cdFx0aWYgKCBuYW1lID09PSBcImRhdGFcIiAmJiBqUXVlcnkuaXNFbXB0eU9iamVjdCggb2JqWyBuYW1lIF0gKSApIHtcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblx0XHRpZiAoIG5hbWUgIT09IFwidG9KU09OXCIgKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGludGVybmFsRGF0YSggZWxlbSwgbmFtZSwgZGF0YSwgcHZ0IC8qIEludGVybmFsIFVzZSBPbmx5ICovICkge1xuXHRpZiAoICFhY2NlcHREYXRhKCBlbGVtICkgKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0dmFyIHJldCwgdGhpc0NhY2hlLFxuXHRcdGludGVybmFsS2V5ID0galF1ZXJ5LmV4cGFuZG8sXG5cblx0XHQvLyBXZSBoYXZlIHRvIGhhbmRsZSBET00gbm9kZXMgYW5kIEpTIG9iamVjdHMgZGlmZmVyZW50bHkgYmVjYXVzZSBJRTYtN1xuXHRcdC8vIGNhbid0IEdDIG9iamVjdCByZWZlcmVuY2VzIHByb3Blcmx5IGFjcm9zcyB0aGUgRE9NLUpTIGJvdW5kYXJ5XG5cdFx0aXNOb2RlID0gZWxlbS5ub2RlVHlwZSxcblxuXHRcdC8vIE9ubHkgRE9NIG5vZGVzIG5lZWQgdGhlIGdsb2JhbCBqUXVlcnkgY2FjaGU7IEpTIG9iamVjdCBkYXRhIGlzXG5cdFx0Ly8gYXR0YWNoZWQgZGlyZWN0bHkgdG8gdGhlIG9iamVjdCBzbyBHQyBjYW4gb2NjdXIgYXV0b21hdGljYWxseVxuXHRcdGNhY2hlID0gaXNOb2RlID8galF1ZXJ5LmNhY2hlIDogZWxlbSxcblxuXHRcdC8vIE9ubHkgZGVmaW5pbmcgYW4gSUQgZm9yIEpTIG9iamVjdHMgaWYgaXRzIGNhY2hlIGFscmVhZHkgZXhpc3RzIGFsbG93c1xuXHRcdC8vIHRoZSBjb2RlIHRvIHNob3J0Y3V0IG9uIHRoZSBzYW1lIHBhdGggYXMgYSBET00gbm9kZSB3aXRoIG5vIGNhY2hlXG5cdFx0aWQgPSBpc05vZGUgPyBlbGVtWyBpbnRlcm5hbEtleSBdIDogZWxlbVsgaW50ZXJuYWxLZXkgXSAmJiBpbnRlcm5hbEtleTtcblxuXHQvLyBBdm9pZCBkb2luZyBhbnkgbW9yZSB3b3JrIHRoYW4gd2UgbmVlZCB0byB3aGVuIHRyeWluZyB0byBnZXQgZGF0YSBvbiBhblxuXHQvLyBvYmplY3QgdGhhdCBoYXMgbm8gZGF0YSBhdCBhbGxcblx0aWYgKCAoICFpZCB8fCAhY2FjaGVbIGlkIF0gfHwgKCAhcHZ0ICYmICFjYWNoZVsgaWQgXS5kYXRhICkgKSAmJlxuXHRcdGRhdGEgPT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgbmFtZSA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRpZiAoICFpZCApIHtcblxuXHRcdC8vIE9ubHkgRE9NIG5vZGVzIG5lZWQgYSBuZXcgdW5pcXVlIElEIGZvciBlYWNoIGVsZW1lbnQgc2luY2UgdGhlaXIgZGF0YVxuXHRcdC8vIGVuZHMgdXAgaW4gdGhlIGdsb2JhbCBjYWNoZVxuXHRcdGlmICggaXNOb2RlICkge1xuXHRcdFx0aWQgPSBlbGVtWyBpbnRlcm5hbEtleSBdID0gZGVsZXRlZElkcy5wb3AoKSB8fCBqUXVlcnkuZ3VpZCsrO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZCA9IGludGVybmFsS2V5O1xuXHRcdH1cblx0fVxuXG5cdGlmICggIWNhY2hlWyBpZCBdICkge1xuXG5cdFx0Ly8gQXZvaWQgZXhwb3NpbmcgalF1ZXJ5IG1ldGFkYXRhIG9uIHBsYWluIEpTIG9iamVjdHMgd2hlbiB0aGUgb2JqZWN0XG5cdFx0Ly8gaXMgc2VyaWFsaXplZCB1c2luZyBKU09OLnN0cmluZ2lmeVxuXHRcdGNhY2hlWyBpZCBdID0gaXNOb2RlID8ge30gOiB7IHRvSlNPTjogalF1ZXJ5Lm5vb3AgfTtcblx0fVxuXG5cdC8vIEFuIG9iamVjdCBjYW4gYmUgcGFzc2VkIHRvIGpRdWVyeS5kYXRhIGluc3RlYWQgb2YgYSBrZXkvdmFsdWUgcGFpcjsgdGhpcyBnZXRzXG5cdC8vIHNoYWxsb3cgY29waWVkIG92ZXIgb250byB0aGUgZXhpc3RpbmcgY2FjaGVcblx0aWYgKCB0eXBlb2YgbmFtZSA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgbmFtZSA9PT0gXCJmdW5jdGlvblwiICkge1xuXHRcdGlmICggcHZ0ICkge1xuXHRcdFx0Y2FjaGVbIGlkIF0gPSBqUXVlcnkuZXh0ZW5kKCBjYWNoZVsgaWQgXSwgbmFtZSApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjYWNoZVsgaWQgXS5kYXRhID0galF1ZXJ5LmV4dGVuZCggY2FjaGVbIGlkIF0uZGF0YSwgbmFtZSApO1xuXHRcdH1cblx0fVxuXG5cdHRoaXNDYWNoZSA9IGNhY2hlWyBpZCBdO1xuXG5cdC8vIGpRdWVyeSBkYXRhKCkgaXMgc3RvcmVkIGluIGEgc2VwYXJhdGUgb2JqZWN0IGluc2lkZSB0aGUgb2JqZWN0J3MgaW50ZXJuYWwgZGF0YVxuXHQvLyBjYWNoZSBpbiBvcmRlciB0byBhdm9pZCBrZXkgY29sbGlzaW9ucyBiZXR3ZWVuIGludGVybmFsIGRhdGEgYW5kIHVzZXItZGVmaW5lZFxuXHQvLyBkYXRhLlxuXHRpZiAoICFwdnQgKSB7XG5cdFx0aWYgKCAhdGhpc0NhY2hlLmRhdGEgKSB7XG5cdFx0XHR0aGlzQ2FjaGUuZGF0YSA9IHt9O1xuXHRcdH1cblxuXHRcdHRoaXNDYWNoZSA9IHRoaXNDYWNoZS5kYXRhO1xuXHR9XG5cblx0aWYgKCBkYXRhICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0dGhpc0NhY2hlWyBqUXVlcnkuY2FtZWxDYXNlKCBuYW1lICkgXSA9IGRhdGE7XG5cdH1cblxuXHQvLyBDaGVjayBmb3IgYm90aCBjb252ZXJ0ZWQtdG8tY2FtZWwgYW5kIG5vbi1jb252ZXJ0ZWQgZGF0YSBwcm9wZXJ0eSBuYW1lc1xuXHQvLyBJZiBhIGRhdGEgcHJvcGVydHkgd2FzIHNwZWNpZmllZFxuXHRpZiAoIHR5cGVvZiBuYW1lID09PSBcInN0cmluZ1wiICkge1xuXG5cdFx0Ly8gRmlyc3QgVHJ5IHRvIGZpbmQgYXMtaXMgcHJvcGVydHkgZGF0YVxuXHRcdHJldCA9IHRoaXNDYWNoZVsgbmFtZSBdO1xuXG5cdFx0Ly8gVGVzdCBmb3IgbnVsbHx1bmRlZmluZWQgcHJvcGVydHkgZGF0YVxuXHRcdGlmICggcmV0ID09IG51bGwgKSB7XG5cblx0XHRcdC8vIFRyeSB0byBmaW5kIHRoZSBjYW1lbENhc2VkIHByb3BlcnR5XG5cdFx0XHRyZXQgPSB0aGlzQ2FjaGVbIGpRdWVyeS5jYW1lbENhc2UoIG5hbWUgKSBdO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRyZXQgPSB0aGlzQ2FjaGU7XG5cdH1cblxuXHRyZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBpbnRlcm5hbFJlbW92ZURhdGEoIGVsZW0sIG5hbWUsIHB2dCApIHtcblx0aWYgKCAhYWNjZXB0RGF0YSggZWxlbSApICkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdHZhciB0aGlzQ2FjaGUsIGksXG5cdFx0aXNOb2RlID0gZWxlbS5ub2RlVHlwZSxcblxuXHRcdC8vIFNlZSBqUXVlcnkuZGF0YSBmb3IgbW9yZSBpbmZvcm1hdGlvblxuXHRcdGNhY2hlID0gaXNOb2RlID8galF1ZXJ5LmNhY2hlIDogZWxlbSxcblx0XHRpZCA9IGlzTm9kZSA/IGVsZW1bIGpRdWVyeS5leHBhbmRvIF0gOiBqUXVlcnkuZXhwYW5kbztcblxuXHQvLyBJZiB0aGVyZSBpcyBhbHJlYWR5IG5vIGNhY2hlIGVudHJ5IGZvciB0aGlzIG9iamVjdCwgdGhlcmUgaXMgbm9cblx0Ly8gcHVycG9zZSBpbiBjb250aW51aW5nXG5cdGlmICggIWNhY2hlWyBpZCBdICkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdGlmICggbmFtZSApIHtcblxuXHRcdHRoaXNDYWNoZSA9IHB2dCA/IGNhY2hlWyBpZCBdIDogY2FjaGVbIGlkIF0uZGF0YTtcblxuXHRcdGlmICggdGhpc0NhY2hlICkge1xuXG5cdFx0XHQvLyBTdXBwb3J0IGFycmF5IG9yIHNwYWNlIHNlcGFyYXRlZCBzdHJpbmcgbmFtZXMgZm9yIGRhdGEga2V5c1xuXHRcdFx0aWYgKCAhalF1ZXJ5LmlzQXJyYXkoIG5hbWUgKSApIHtcblxuXHRcdFx0XHQvLyB0cnkgdGhlIHN0cmluZyBhcyBhIGtleSBiZWZvcmUgYW55IG1hbmlwdWxhdGlvblxuXHRcdFx0XHRpZiAoIG5hbWUgaW4gdGhpc0NhY2hlICkge1xuXHRcdFx0XHRcdG5hbWUgPSBbIG5hbWUgXTtcblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdC8vIHNwbGl0IHRoZSBjYW1lbCBjYXNlZCB2ZXJzaW9uIGJ5IHNwYWNlcyB1bmxlc3MgYSBrZXkgd2l0aCB0aGUgc3BhY2VzIGV4aXN0c1xuXHRcdFx0XHRcdG5hbWUgPSBqUXVlcnkuY2FtZWxDYXNlKCBuYW1lICk7XG5cdFx0XHRcdFx0aWYgKCBuYW1lIGluIHRoaXNDYWNoZSApIHtcblx0XHRcdFx0XHRcdG5hbWUgPSBbIG5hbWUgXTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0bmFtZSA9IG5hbWUuc3BsaXQoIFwiIFwiICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdC8vIElmIFwibmFtZVwiIGlzIGFuIGFycmF5IG9mIGtleXMuLi5cblx0XHRcdFx0Ly8gV2hlbiBkYXRhIGlzIGluaXRpYWxseSBjcmVhdGVkLCB2aWEgKFwia2V5XCIsIFwidmFsXCIpIHNpZ25hdHVyZSxcblx0XHRcdFx0Ly8ga2V5cyB3aWxsIGJlIGNvbnZlcnRlZCB0byBjYW1lbENhc2UuXG5cdFx0XHRcdC8vIFNpbmNlIHRoZXJlIGlzIG5vIHdheSB0byB0ZWxsIF9ob3dfIGEga2V5IHdhcyBhZGRlZCwgcmVtb3ZlXG5cdFx0XHRcdC8vIGJvdGggcGxhaW4ga2V5IGFuZCBjYW1lbENhc2Uga2V5LiAjMTI3ODZcblx0XHRcdFx0Ly8gVGhpcyB3aWxsIG9ubHkgcGVuYWxpemUgdGhlIGFycmF5IGFyZ3VtZW50IHBhdGguXG5cdFx0XHRcdG5hbWUgPSBuYW1lLmNvbmNhdCggalF1ZXJ5Lm1hcCggbmFtZSwgalF1ZXJ5LmNhbWVsQ2FzZSApICk7XG5cdFx0XHR9XG5cblx0XHRcdGkgPSBuYW1lLmxlbmd0aDtcblx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRkZWxldGUgdGhpc0NhY2hlWyBuYW1lWyBpIF0gXTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gSWYgdGhlcmUgaXMgbm8gZGF0YSBsZWZ0IGluIHRoZSBjYWNoZSwgd2Ugd2FudCB0byBjb250aW51ZVxuXHRcdFx0Ly8gYW5kIGxldCB0aGUgY2FjaGUgb2JqZWN0IGl0c2VsZiBnZXQgZGVzdHJveWVkXG5cdFx0XHRpZiAoIHB2dCA/ICFpc0VtcHR5RGF0YU9iamVjdCggdGhpc0NhY2hlICkgOiAhalF1ZXJ5LmlzRW1wdHlPYmplY3QoIHRoaXNDYWNoZSApICkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gU2VlIGpRdWVyeS5kYXRhIGZvciBtb3JlIGluZm9ybWF0aW9uXG5cdGlmICggIXB2dCApIHtcblx0XHRkZWxldGUgY2FjaGVbIGlkIF0uZGF0YTtcblxuXHRcdC8vIERvbid0IGRlc3Ryb3kgdGhlIHBhcmVudCBjYWNoZSB1bmxlc3MgdGhlIGludGVybmFsIGRhdGEgb2JqZWN0XG5cdFx0Ly8gaGFkIGJlZW4gdGhlIG9ubHkgdGhpbmcgbGVmdCBpbiBpdFxuXHRcdGlmICggIWlzRW1wdHlEYXRhT2JqZWN0KCBjYWNoZVsgaWQgXSApICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0fVxuXG5cdC8vIERlc3Ryb3kgdGhlIGNhY2hlXG5cdGlmICggaXNOb2RlICkge1xuXHRcdGpRdWVyeS5jbGVhbkRhdGEoIFsgZWxlbSBdLCB0cnVlICk7XG5cblx0Ly8gVXNlIGRlbGV0ZSB3aGVuIHN1cHBvcnRlZCBmb3IgZXhwYW5kb3Mgb3IgYGNhY2hlYCBpcyBub3QgYSB3aW5kb3cgcGVyIGlzV2luZG93ICgjMTAwODApXG5cdC8qIGpzaGludCBlcWVxZXE6IGZhbHNlICovXG5cdH0gZWxzZSBpZiAoIHN1cHBvcnQuZGVsZXRlRXhwYW5kbyB8fCBjYWNoZSAhPSBjYWNoZS53aW5kb3cgKSB7XG5cdFx0LyoganNoaW50IGVxZXFlcTogdHJ1ZSAqL1xuXHRcdGRlbGV0ZSBjYWNoZVsgaWQgXTtcblxuXHQvLyBXaGVuIGFsbCBlbHNlIGZhaWxzLCB1bmRlZmluZWRcblx0fSBlbHNlIHtcblx0XHRjYWNoZVsgaWQgXSA9IHVuZGVmaW5lZDtcblx0fVxufVxuXG5qUXVlcnkuZXh0ZW5kKCB7XG5cdGNhY2hlOiB7fSxcblxuXHQvLyBUaGUgZm9sbG93aW5nIGVsZW1lbnRzIChzcGFjZS1zdWZmaXhlZCB0byBhdm9pZCBPYmplY3QucHJvdG90eXBlIGNvbGxpc2lvbnMpXG5cdC8vIHRocm93IHVuY2F0Y2hhYmxlIGV4Y2VwdGlvbnMgaWYgeW91IGF0dGVtcHQgdG8gc2V0IGV4cGFuZG8gcHJvcGVydGllc1xuXHRub0RhdGE6IHtcblx0XHRcImFwcGxldCBcIjogdHJ1ZSxcblx0XHRcImVtYmVkIFwiOiB0cnVlLFxuXG5cdFx0Ly8gLi4uYnV0IEZsYXNoIG9iamVjdHMgKHdoaWNoIGhhdmUgdGhpcyBjbGFzc2lkKSAqY2FuKiBoYW5kbGUgZXhwYW5kb3Ncblx0XHRcIm9iamVjdCBcIjogXCJjbHNpZDpEMjdDREI2RS1BRTZELTExY2YtOTZCOC00NDQ1NTM1NDAwMDBcIlxuXHR9LFxuXG5cdGhhc0RhdGE6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdGVsZW0gPSBlbGVtLm5vZGVUeXBlID8galF1ZXJ5LmNhY2hlWyBlbGVtWyBqUXVlcnkuZXhwYW5kbyBdIF0gOiBlbGVtWyBqUXVlcnkuZXhwYW5kbyBdO1xuXHRcdHJldHVybiAhIWVsZW0gJiYgIWlzRW1wdHlEYXRhT2JqZWN0KCBlbGVtICk7XG5cdH0sXG5cblx0ZGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGRhdGEgKSB7XG5cdFx0cmV0dXJuIGludGVybmFsRGF0YSggZWxlbSwgbmFtZSwgZGF0YSApO1xuXHR9LFxuXG5cdHJlbW92ZURhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkge1xuXHRcdHJldHVybiBpbnRlcm5hbFJlbW92ZURhdGEoIGVsZW0sIG5hbWUgKTtcblx0fSxcblxuXHQvLyBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuXG5cdF9kYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgZGF0YSApIHtcblx0XHRyZXR1cm4gaW50ZXJuYWxEYXRhKCBlbGVtLCBuYW1lLCBkYXRhLCB0cnVlICk7XG5cdH0sXG5cblx0X3JlbW92ZURhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkge1xuXHRcdHJldHVybiBpbnRlcm5hbFJlbW92ZURhdGEoIGVsZW0sIG5hbWUsIHRydWUgKTtcblx0fVxufSApO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdGRhdGE6IGZ1bmN0aW9uKCBrZXksIHZhbHVlICkge1xuXHRcdHZhciBpLCBuYW1lLCBkYXRhLFxuXHRcdFx0ZWxlbSA9IHRoaXNbIDAgXSxcblx0XHRcdGF0dHJzID0gZWxlbSAmJiBlbGVtLmF0dHJpYnV0ZXM7XG5cblx0XHQvLyBTcGVjaWFsIGV4cGVjdGlvbnMgb2YgLmRhdGEgYmFzaWNhbGx5IHRod2FydCBqUXVlcnkuYWNjZXNzLFxuXHRcdC8vIHNvIGltcGxlbWVudCB0aGUgcmVsZXZhbnQgYmVoYXZpb3Igb3Vyc2VsdmVzXG5cblx0XHQvLyBHZXRzIGFsbCB2YWx1ZXNcblx0XHRpZiAoIGtleSA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0aWYgKCB0aGlzLmxlbmd0aCApIHtcblx0XHRcdFx0ZGF0YSA9IGpRdWVyeS5kYXRhKCBlbGVtICk7XG5cblx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICYmICFqUXVlcnkuX2RhdGEoIGVsZW0sIFwicGFyc2VkQXR0cnNcIiApICkge1xuXHRcdFx0XHRcdGkgPSBhdHRycy5sZW5ndGg7XG5cdFx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cblx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFMTErXG5cdFx0XHRcdFx0XHQvLyBUaGUgYXR0cnMgZWxlbWVudHMgY2FuIGJlIG51bGwgKCMxNDg5NClcblx0XHRcdFx0XHRcdGlmICggYXR0cnNbIGkgXSApIHtcblx0XHRcdFx0XHRcdFx0bmFtZSA9IGF0dHJzWyBpIF0ubmFtZTtcblx0XHRcdFx0XHRcdFx0aWYgKCBuYW1lLmluZGV4T2YoIFwiZGF0YS1cIiApID09PSAwICkge1xuXHRcdFx0XHRcdFx0XHRcdG5hbWUgPSBqUXVlcnkuY2FtZWxDYXNlKCBuYW1lLnNsaWNlKCA1ICkgKTtcblx0XHRcdFx0XHRcdFx0XHRkYXRhQXR0ciggZWxlbSwgbmFtZSwgZGF0YVsgbmFtZSBdICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0alF1ZXJ5Ll9kYXRhKCBlbGVtLCBcInBhcnNlZEF0dHJzXCIsIHRydWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZGF0YTtcblx0XHR9XG5cblx0XHQvLyBTZXRzIG11bHRpcGxlIHZhbHVlc1xuXHRcdGlmICggdHlwZW9mIGtleSA9PT0gXCJvYmplY3RcIiApIHtcblx0XHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRqUXVlcnkuZGF0YSggdGhpcywga2V5ICk7XG5cdFx0XHR9ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPiAxID9cblxuXHRcdFx0Ly8gU2V0cyBvbmUgdmFsdWVcblx0XHRcdHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGpRdWVyeS5kYXRhKCB0aGlzLCBrZXksIHZhbHVlICk7XG5cdFx0XHR9ICkgOlxuXG5cdFx0XHQvLyBHZXRzIG9uZSB2YWx1ZVxuXHRcdFx0Ly8gVHJ5IHRvIGZldGNoIGFueSBpbnRlcm5hbGx5IHN0b3JlZCBkYXRhIGZpcnN0XG5cdFx0XHRlbGVtID8gZGF0YUF0dHIoIGVsZW0sIGtleSwgalF1ZXJ5LmRhdGEoIGVsZW0sIGtleSApICkgOiB1bmRlZmluZWQ7XG5cdH0sXG5cblx0cmVtb3ZlRGF0YTogZnVuY3Rpb24oIGtleSApIHtcblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGpRdWVyeS5yZW1vdmVEYXRhKCB0aGlzLCBrZXkgKTtcblx0XHR9ICk7XG5cdH1cbn0gKTtcblxuXG5qUXVlcnkuZXh0ZW5kKCB7XG5cdHF1ZXVlOiBmdW5jdGlvbiggZWxlbSwgdHlwZSwgZGF0YSApIHtcblx0XHR2YXIgcXVldWU7XG5cblx0XHRpZiAoIGVsZW0gKSB7XG5cdFx0XHR0eXBlID0gKCB0eXBlIHx8IFwiZnhcIiApICsgXCJxdWV1ZVwiO1xuXHRcdFx0cXVldWUgPSBqUXVlcnkuX2RhdGEoIGVsZW0sIHR5cGUgKTtcblxuXHRcdFx0Ly8gU3BlZWQgdXAgZGVxdWV1ZSBieSBnZXR0aW5nIG91dCBxdWlja2x5IGlmIHRoaXMgaXMganVzdCBhIGxvb2t1cFxuXHRcdFx0aWYgKCBkYXRhICkge1xuXHRcdFx0XHRpZiAoICFxdWV1ZSB8fCBqUXVlcnkuaXNBcnJheSggZGF0YSApICkge1xuXHRcdFx0XHRcdHF1ZXVlID0galF1ZXJ5Ll9kYXRhKCBlbGVtLCB0eXBlLCBqUXVlcnkubWFrZUFycmF5KCBkYXRhICkgKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRxdWV1ZS5wdXNoKCBkYXRhICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBxdWV1ZSB8fCBbXTtcblx0XHR9XG5cdH0sXG5cblx0ZGVxdWV1ZTogZnVuY3Rpb24oIGVsZW0sIHR5cGUgKSB7XG5cdFx0dHlwZSA9IHR5cGUgfHwgXCJmeFwiO1xuXG5cdFx0dmFyIHF1ZXVlID0galF1ZXJ5LnF1ZXVlKCBlbGVtLCB0eXBlICksXG5cdFx0XHRzdGFydExlbmd0aCA9IHF1ZXVlLmxlbmd0aCxcblx0XHRcdGZuID0gcXVldWUuc2hpZnQoKSxcblx0XHRcdGhvb2tzID0galF1ZXJ5Ll9xdWV1ZUhvb2tzKCBlbGVtLCB0eXBlICksXG5cdFx0XHRuZXh0ID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGpRdWVyeS5kZXF1ZXVlKCBlbGVtLCB0eXBlICk7XG5cdFx0XHR9O1xuXG5cdFx0Ly8gSWYgdGhlIGZ4IHF1ZXVlIGlzIGRlcXVldWVkLCBhbHdheXMgcmVtb3ZlIHRoZSBwcm9ncmVzcyBzZW50aW5lbFxuXHRcdGlmICggZm4gPT09IFwiaW5wcm9ncmVzc1wiICkge1xuXHRcdFx0Zm4gPSBxdWV1ZS5zaGlmdCgpO1xuXHRcdFx0c3RhcnRMZW5ndGgtLTtcblx0XHR9XG5cblx0XHRpZiAoIGZuICkge1xuXG5cdFx0XHQvLyBBZGQgYSBwcm9ncmVzcyBzZW50aW5lbCB0byBwcmV2ZW50IHRoZSBmeCBxdWV1ZSBmcm9tIGJlaW5nXG5cdFx0XHQvLyBhdXRvbWF0aWNhbGx5IGRlcXVldWVkXG5cdFx0XHRpZiAoIHR5cGUgPT09IFwiZnhcIiApIHtcblx0XHRcdFx0cXVldWUudW5zaGlmdCggXCJpbnByb2dyZXNzXCIgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gY2xlYXIgdXAgdGhlIGxhc3QgcXVldWUgc3RvcCBmdW5jdGlvblxuXHRcdFx0ZGVsZXRlIGhvb2tzLnN0b3A7XG5cdFx0XHRmbi5jYWxsKCBlbGVtLCBuZXh0LCBob29rcyApO1xuXHRcdH1cblxuXHRcdGlmICggIXN0YXJ0TGVuZ3RoICYmIGhvb2tzICkge1xuXHRcdFx0aG9va3MuZW1wdHkuZmlyZSgpO1xuXHRcdH1cblx0fSxcblxuXHQvLyBub3QgaW50ZW5kZWQgZm9yIHB1YmxpYyBjb25zdW1wdGlvbiAtIGdlbmVyYXRlcyBhIHF1ZXVlSG9va3Mgb2JqZWN0LFxuXHQvLyBvciByZXR1cm5zIHRoZSBjdXJyZW50IG9uZVxuXHRfcXVldWVIb29rczogZnVuY3Rpb24oIGVsZW0sIHR5cGUgKSB7XG5cdFx0dmFyIGtleSA9IHR5cGUgKyBcInF1ZXVlSG9va3NcIjtcblx0XHRyZXR1cm4galF1ZXJ5Ll9kYXRhKCBlbGVtLCBrZXkgKSB8fCBqUXVlcnkuX2RhdGEoIGVsZW0sIGtleSwge1xuXHRcdFx0ZW1wdHk6IGpRdWVyeS5DYWxsYmFja3MoIFwib25jZSBtZW1vcnlcIiApLmFkZCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGpRdWVyeS5fcmVtb3ZlRGF0YSggZWxlbSwgdHlwZSArIFwicXVldWVcIiApO1xuXHRcdFx0XHRqUXVlcnkuX3JlbW92ZURhdGEoIGVsZW0sIGtleSApO1xuXHRcdFx0fSApXG5cdFx0fSApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0cXVldWU6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhICkge1xuXHRcdHZhciBzZXR0ZXIgPSAyO1xuXG5cdFx0aWYgKCB0eXBlb2YgdHlwZSAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdGRhdGEgPSB0eXBlO1xuXHRcdFx0dHlwZSA9IFwiZnhcIjtcblx0XHRcdHNldHRlci0tO1xuXHRcdH1cblxuXHRcdGlmICggYXJndW1lbnRzLmxlbmd0aCA8IHNldHRlciApIHtcblx0XHRcdHJldHVybiBqUXVlcnkucXVldWUoIHRoaXNbIDAgXSwgdHlwZSApO1xuXHRcdH1cblxuXHRcdHJldHVybiBkYXRhID09PSB1bmRlZmluZWQgP1xuXHRcdFx0dGhpcyA6XG5cdFx0XHR0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgcXVldWUgPSBqUXVlcnkucXVldWUoIHRoaXMsIHR5cGUsIGRhdGEgKTtcblxuXHRcdFx0XHQvLyBlbnN1cmUgYSBob29rcyBmb3IgdGhpcyBxdWV1ZVxuXHRcdFx0XHRqUXVlcnkuX3F1ZXVlSG9va3MoIHRoaXMsIHR5cGUgKTtcblxuXHRcdFx0XHRpZiAoIHR5cGUgPT09IFwiZnhcIiAmJiBxdWV1ZVsgMCBdICE9PSBcImlucHJvZ3Jlc3NcIiApIHtcblx0XHRcdFx0XHRqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9ICk7XG5cdH0sXG5cdGRlcXVldWU6IGZ1bmN0aW9uKCB0eXBlICkge1xuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0alF1ZXJ5LmRlcXVldWUoIHRoaXMsIHR5cGUgKTtcblx0XHR9ICk7XG5cdH0sXG5cdGNsZWFyUXVldWU6IGZ1bmN0aW9uKCB0eXBlICkge1xuXHRcdHJldHVybiB0aGlzLnF1ZXVlKCB0eXBlIHx8IFwiZnhcIiwgW10gKTtcblx0fSxcblxuXHQvLyBHZXQgYSBwcm9taXNlIHJlc29sdmVkIHdoZW4gcXVldWVzIG9mIGEgY2VydGFpbiB0eXBlXG5cdC8vIGFyZSBlbXB0aWVkIChmeCBpcyB0aGUgdHlwZSBieSBkZWZhdWx0KVxuXHRwcm9taXNlOiBmdW5jdGlvbiggdHlwZSwgb2JqICkge1xuXHRcdHZhciB0bXAsXG5cdFx0XHRjb3VudCA9IDEsXG5cdFx0XHRkZWZlciA9IGpRdWVyeS5EZWZlcnJlZCgpLFxuXHRcdFx0ZWxlbWVudHMgPSB0aGlzLFxuXHRcdFx0aSA9IHRoaXMubGVuZ3RoLFxuXHRcdFx0cmVzb2x2ZSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoICEoIC0tY291bnQgKSApIHtcblx0XHRcdFx0XHRkZWZlci5yZXNvbHZlV2l0aCggZWxlbWVudHMsIFsgZWxlbWVudHMgXSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXG5cdFx0aWYgKCB0eXBlb2YgdHlwZSAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdG9iaiA9IHR5cGU7XG5cdFx0XHR0eXBlID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHR0eXBlID0gdHlwZSB8fCBcImZ4XCI7XG5cblx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdHRtcCA9IGpRdWVyeS5fZGF0YSggZWxlbWVudHNbIGkgXSwgdHlwZSArIFwicXVldWVIb29rc1wiICk7XG5cdFx0XHRpZiAoIHRtcCAmJiB0bXAuZW1wdHkgKSB7XG5cdFx0XHRcdGNvdW50Kys7XG5cdFx0XHRcdHRtcC5lbXB0eS5hZGQoIHJlc29sdmUgKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmVzb2x2ZSgpO1xuXHRcdHJldHVybiBkZWZlci5wcm9taXNlKCBvYmogKTtcblx0fVxufSApO1xuXG5cbiggZnVuY3Rpb24oKSB7XG5cdHZhciBzaHJpbmtXcmFwQmxvY2tzVmFsO1xuXG5cdHN1cHBvcnQuc2hyaW5rV3JhcEJsb2NrcyA9IGZ1bmN0aW9uKCkge1xuXHRcdGlmICggc2hyaW5rV3JhcEJsb2Nrc1ZhbCAhPSBudWxsICkge1xuXHRcdFx0cmV0dXJuIHNocmlua1dyYXBCbG9ja3NWYWw7XG5cdFx0fVxuXG5cdFx0Ly8gV2lsbCBiZSBjaGFuZ2VkIGxhdGVyIGlmIG5lZWRlZC5cblx0XHRzaHJpbmtXcmFwQmxvY2tzVmFsID0gZmFsc2U7XG5cblx0XHQvLyBNaW5pZmllZDogdmFyIGIsYyxkXG5cdFx0dmFyIGRpdiwgYm9keSwgY29udGFpbmVyO1xuXG5cdFx0Ym9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCBcImJvZHlcIiApWyAwIF07XG5cdFx0aWYgKCAhYm9keSB8fCAhYm9keS5zdHlsZSApIHtcblxuXHRcdFx0Ly8gVGVzdCBmaXJlZCB0b28gZWFybHkgb3IgaW4gYW4gdW5zdXBwb3J0ZWQgZW52aXJvbm1lbnQsIGV4aXQuXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gU2V0dXBcblx0XHRkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImRpdlwiICk7XG5cdFx0Y29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJkaXZcIiApO1xuXHRcdGNvbnRhaW5lci5zdHlsZS5jc3NUZXh0ID0gXCJwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXI6MDt3aWR0aDowO2hlaWdodDowO3RvcDowO2xlZnQ6LTk5OTlweFwiO1xuXHRcdGJvZHkuYXBwZW5kQ2hpbGQoIGNvbnRhaW5lciApLmFwcGVuZENoaWxkKCBkaXYgKTtcblxuXHRcdC8vIFN1cHBvcnQ6IElFNlxuXHRcdC8vIENoZWNrIGlmIGVsZW1lbnRzIHdpdGggbGF5b3V0IHNocmluay13cmFwIHRoZWlyIGNoaWxkcmVuXG5cdFx0aWYgKCB0eXBlb2YgZGl2LnN0eWxlLnpvb20gIT09IFwidW5kZWZpbmVkXCIgKSB7XG5cblx0XHRcdC8vIFJlc2V0IENTUzogYm94LXNpemluZzsgZGlzcGxheTsgbWFyZ2luOyBib3JkZXJcblx0XHRcdGRpdi5zdHlsZS5jc3NUZXh0ID1cblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBGaXJlZm94PDI5LCBBbmRyb2lkIDIuM1xuXHRcdFx0XHQvLyBWZW5kb3ItcHJlZml4IGJveC1zaXppbmdcblx0XHRcdFx0XCItd2Via2l0LWJveC1zaXppbmc6Y29udGVudC1ib3g7LW1vei1ib3gtc2l6aW5nOmNvbnRlbnQtYm94O1wiICtcblx0XHRcdFx0XCJib3gtc2l6aW5nOmNvbnRlbnQtYm94O2Rpc3BsYXk6YmxvY2s7bWFyZ2luOjA7Ym9yZGVyOjA7XCIgK1xuXHRcdFx0XHRcInBhZGRpbmc6MXB4O3dpZHRoOjFweDt6b29tOjFcIjtcblx0XHRcdGRpdi5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJkaXZcIiApICkuc3R5bGUud2lkdGggPSBcIjVweFwiO1xuXHRcdFx0c2hyaW5rV3JhcEJsb2Nrc1ZhbCA9IGRpdi5vZmZzZXRXaWR0aCAhPT0gMztcblx0XHR9XG5cblx0XHRib2R5LnJlbW92ZUNoaWxkKCBjb250YWluZXIgKTtcblxuXHRcdHJldHVybiBzaHJpbmtXcmFwQmxvY2tzVmFsO1xuXHR9O1xuXG59ICkoKTtcbnZhciBwbnVtID0gKCAvWystXT8oPzpcXGQqXFwufClcXGQrKD86W2VFXVsrLV0/XFxkK3wpLyApLnNvdXJjZTtcblxudmFyIHJjc3NOdW0gPSBuZXcgUmVnRXhwKCBcIl4oPzooWystXSk9fCkoXCIgKyBwbnVtICsgXCIpKFthLXolXSopJFwiLCBcImlcIiApO1xuXG5cbnZhciBjc3NFeHBhbmQgPSBbIFwiVG9wXCIsIFwiUmlnaHRcIiwgXCJCb3R0b21cIiwgXCJMZWZ0XCIgXTtcblxudmFyIGlzSGlkZGVuID0gZnVuY3Rpb24oIGVsZW0sIGVsICkge1xuXG5cdFx0Ly8gaXNIaWRkZW4gbWlnaHQgYmUgY2FsbGVkIGZyb20galF1ZXJ5I2ZpbHRlciBmdW5jdGlvbjtcblx0XHQvLyBpbiB0aGF0IGNhc2UsIGVsZW1lbnQgd2lsbCBiZSBzZWNvbmQgYXJndW1lbnRcblx0XHRlbGVtID0gZWwgfHwgZWxlbTtcblx0XHRyZXR1cm4galF1ZXJ5LmNzcyggZWxlbSwgXCJkaXNwbGF5XCIgKSA9PT0gXCJub25lXCIgfHxcblx0XHRcdCFqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1bWVudCwgZWxlbSApO1xuXHR9O1xuXG5cblxuZnVuY3Rpb24gYWRqdXN0Q1NTKCBlbGVtLCBwcm9wLCB2YWx1ZVBhcnRzLCB0d2VlbiApIHtcblx0dmFyIGFkanVzdGVkLFxuXHRcdHNjYWxlID0gMSxcblx0XHRtYXhJdGVyYXRpb25zID0gMjAsXG5cdFx0Y3VycmVudFZhbHVlID0gdHdlZW4gP1xuXHRcdFx0ZnVuY3Rpb24oKSB7IHJldHVybiB0d2Vlbi5jdXIoKTsgfSA6XG5cdFx0XHRmdW5jdGlvbigpIHsgcmV0dXJuIGpRdWVyeS5jc3MoIGVsZW0sIHByb3AsIFwiXCIgKTsgfSxcblx0XHRpbml0aWFsID0gY3VycmVudFZhbHVlKCksXG5cdFx0dW5pdCA9IHZhbHVlUGFydHMgJiYgdmFsdWVQYXJ0c1sgMyBdIHx8ICggalF1ZXJ5LmNzc051bWJlclsgcHJvcCBdID8gXCJcIiA6IFwicHhcIiApLFxuXG5cdFx0Ly8gU3RhcnRpbmcgdmFsdWUgY29tcHV0YXRpb24gaXMgcmVxdWlyZWQgZm9yIHBvdGVudGlhbCB1bml0IG1pc21hdGNoZXNcblx0XHRpbml0aWFsSW5Vbml0ID0gKCBqUXVlcnkuY3NzTnVtYmVyWyBwcm9wIF0gfHwgdW5pdCAhPT0gXCJweFwiICYmICtpbml0aWFsICkgJiZcblx0XHRcdHJjc3NOdW0uZXhlYyggalF1ZXJ5LmNzcyggZWxlbSwgcHJvcCApICk7XG5cblx0aWYgKCBpbml0aWFsSW5Vbml0ICYmIGluaXRpYWxJblVuaXRbIDMgXSAhPT0gdW5pdCApIHtcblxuXHRcdC8vIFRydXN0IHVuaXRzIHJlcG9ydGVkIGJ5IGpRdWVyeS5jc3Ncblx0XHR1bml0ID0gdW5pdCB8fCBpbml0aWFsSW5Vbml0WyAzIF07XG5cblx0XHQvLyBNYWtlIHN1cmUgd2UgdXBkYXRlIHRoZSB0d2VlbiBwcm9wZXJ0aWVzIGxhdGVyIG9uXG5cdFx0dmFsdWVQYXJ0cyA9IHZhbHVlUGFydHMgfHwgW107XG5cblx0XHQvLyBJdGVyYXRpdmVseSBhcHByb3hpbWF0ZSBmcm9tIGEgbm9uemVybyBzdGFydGluZyBwb2ludFxuXHRcdGluaXRpYWxJblVuaXQgPSAraW5pdGlhbCB8fCAxO1xuXG5cdFx0ZG8ge1xuXG5cdFx0XHQvLyBJZiBwcmV2aW91cyBpdGVyYXRpb24gemVyb2VkIG91dCwgZG91YmxlIHVudGlsIHdlIGdldCAqc29tZXRoaW5nKi5cblx0XHRcdC8vIFVzZSBzdHJpbmcgZm9yIGRvdWJsaW5nIHNvIHdlIGRvbid0IGFjY2lkZW50YWxseSBzZWUgc2NhbGUgYXMgdW5jaGFuZ2VkIGJlbG93XG5cdFx0XHRzY2FsZSA9IHNjYWxlIHx8IFwiLjVcIjtcblxuXHRcdFx0Ly8gQWRqdXN0IGFuZCBhcHBseVxuXHRcdFx0aW5pdGlhbEluVW5pdCA9IGluaXRpYWxJblVuaXQgLyBzY2FsZTtcblx0XHRcdGpRdWVyeS5zdHlsZSggZWxlbSwgcHJvcCwgaW5pdGlhbEluVW5pdCArIHVuaXQgKTtcblxuXHRcdC8vIFVwZGF0ZSBzY2FsZSwgdG9sZXJhdGluZyB6ZXJvIG9yIE5hTiBmcm9tIHR3ZWVuLmN1cigpXG5cdFx0Ly8gQnJlYWsgdGhlIGxvb3AgaWYgc2NhbGUgaXMgdW5jaGFuZ2VkIG9yIHBlcmZlY3QsIG9yIGlmIHdlJ3ZlIGp1c3QgaGFkIGVub3VnaC5cblx0XHR9IHdoaWxlIChcblx0XHRcdHNjYWxlICE9PSAoIHNjYWxlID0gY3VycmVudFZhbHVlKCkgLyBpbml0aWFsICkgJiYgc2NhbGUgIT09IDEgJiYgLS1tYXhJdGVyYXRpb25zXG5cdFx0KTtcblx0fVxuXG5cdGlmICggdmFsdWVQYXJ0cyApIHtcblx0XHRpbml0aWFsSW5Vbml0ID0gK2luaXRpYWxJblVuaXQgfHwgK2luaXRpYWwgfHwgMDtcblxuXHRcdC8vIEFwcGx5IHJlbGF0aXZlIG9mZnNldCAoKz0vLT0pIGlmIHNwZWNpZmllZFxuXHRcdGFkanVzdGVkID0gdmFsdWVQYXJ0c1sgMSBdID9cblx0XHRcdGluaXRpYWxJblVuaXQgKyAoIHZhbHVlUGFydHNbIDEgXSArIDEgKSAqIHZhbHVlUGFydHNbIDIgXSA6XG5cdFx0XHQrdmFsdWVQYXJ0c1sgMiBdO1xuXHRcdGlmICggdHdlZW4gKSB7XG5cdFx0XHR0d2Vlbi51bml0ID0gdW5pdDtcblx0XHRcdHR3ZWVuLnN0YXJ0ID0gaW5pdGlhbEluVW5pdDtcblx0XHRcdHR3ZWVuLmVuZCA9IGFkanVzdGVkO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gYWRqdXN0ZWQ7XG59XG5cblxuLy8gTXVsdGlmdW5jdGlvbmFsIG1ldGhvZCB0byBnZXQgYW5kIHNldCB2YWx1ZXMgb2YgYSBjb2xsZWN0aW9uXG4vLyBUaGUgdmFsdWUvcyBjYW4gb3B0aW9uYWxseSBiZSBleGVjdXRlZCBpZiBpdCdzIGEgZnVuY3Rpb25cbnZhciBhY2Nlc3MgPSBmdW5jdGlvbiggZWxlbXMsIGZuLCBrZXksIHZhbHVlLCBjaGFpbmFibGUsIGVtcHR5R2V0LCByYXcgKSB7XG5cdHZhciBpID0gMCxcblx0XHRsZW5ndGggPSBlbGVtcy5sZW5ndGgsXG5cdFx0YnVsayA9IGtleSA9PSBudWxsO1xuXG5cdC8vIFNldHMgbWFueSB2YWx1ZXNcblx0aWYgKCBqUXVlcnkudHlwZSgga2V5ICkgPT09IFwib2JqZWN0XCIgKSB7XG5cdFx0Y2hhaW5hYmxlID0gdHJ1ZTtcblx0XHRmb3IgKCBpIGluIGtleSApIHtcblx0XHRcdGFjY2VzcyggZWxlbXMsIGZuLCBpLCBrZXlbIGkgXSwgdHJ1ZSwgZW1wdHlHZXQsIHJhdyApO1xuXHRcdH1cblxuXHQvLyBTZXRzIG9uZSB2YWx1ZVxuXHR9IGVsc2UgaWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdGNoYWluYWJsZSA9IHRydWU7XG5cblx0XHRpZiAoICFqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKSApIHtcblx0XHRcdHJhdyA9IHRydWU7XG5cdFx0fVxuXG5cdFx0aWYgKCBidWxrICkge1xuXG5cdFx0XHQvLyBCdWxrIG9wZXJhdGlvbnMgcnVuIGFnYWluc3QgdGhlIGVudGlyZSBzZXRcblx0XHRcdGlmICggcmF3ICkge1xuXHRcdFx0XHRmbi5jYWxsKCBlbGVtcywgdmFsdWUgKTtcblx0XHRcdFx0Zm4gPSBudWxsO1xuXG5cdFx0XHQvLyAuLi5leGNlcHQgd2hlbiBleGVjdXRpbmcgZnVuY3Rpb24gdmFsdWVzXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRidWxrID0gZm47XG5cdFx0XHRcdGZuID0gZnVuY3Rpb24oIGVsZW0sIGtleSwgdmFsdWUgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGJ1bGsuY2FsbCggalF1ZXJ5KCBlbGVtICksIHZhbHVlICk7XG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKCBmbiApIHtcblx0XHRcdGZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkge1xuXHRcdFx0XHRmbihcblx0XHRcdFx0XHRlbGVtc1sgaSBdLFxuXHRcdFx0XHRcdGtleSxcblx0XHRcdFx0XHRyYXcgPyB2YWx1ZSA6IHZhbHVlLmNhbGwoIGVsZW1zWyBpIF0sIGksIGZuKCBlbGVtc1sgaSBdLCBrZXkgKSApXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGNoYWluYWJsZSA/XG5cdFx0ZWxlbXMgOlxuXG5cdFx0Ly8gR2V0c1xuXHRcdGJ1bGsgP1xuXHRcdFx0Zm4uY2FsbCggZWxlbXMgKSA6XG5cdFx0XHRsZW5ndGggPyBmbiggZWxlbXNbIDAgXSwga2V5ICkgOiBlbXB0eUdldDtcbn07XG52YXIgcmNoZWNrYWJsZVR5cGUgPSAoIC9eKD86Y2hlY2tib3h8cmFkaW8pJC9pICk7XG5cbnZhciBydGFnTmFtZSA9ICggLzwoW1xcdzotXSspLyApO1xuXG52YXIgcnNjcmlwdFR5cGUgPSAoIC9eJHxcXC8oPzpqYXZhfGVjbWEpc2NyaXB0L2kgKTtcblxudmFyIHJsZWFkaW5nV2hpdGVzcGFjZSA9ICggL15cXHMrLyApO1xuXG52YXIgbm9kZU5hbWVzID0gXCJhYmJyfGFydGljbGV8YXNpZGV8YXVkaW98YmRpfGNhbnZhc3xkYXRhfGRhdGFsaXN0fFwiICtcblx0XHRcImRldGFpbHN8ZGlhbG9nfGZpZ2NhcHRpb258ZmlndXJlfGZvb3RlcnxoZWFkZXJ8aGdyb3VwfG1haW58XCIgK1xuXHRcdFwibWFya3xtZXRlcnxuYXZ8b3V0cHV0fHBpY3R1cmV8cHJvZ3Jlc3N8c2VjdGlvbnxzdW1tYXJ5fHRlbXBsYXRlfHRpbWV8dmlkZW9cIjtcblxuXG5cbmZ1bmN0aW9uIGNyZWF0ZVNhZmVGcmFnbWVudCggZG9jdW1lbnQgKSB7XG5cdHZhciBsaXN0ID0gbm9kZU5hbWVzLnNwbGl0KCBcInxcIiApLFxuXHRcdHNhZmVGcmFnID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xuXG5cdGlmICggc2FmZUZyYWcuY3JlYXRlRWxlbWVudCApIHtcblx0XHR3aGlsZSAoIGxpc3QubGVuZ3RoICkge1xuXHRcdFx0c2FmZUZyYWcuY3JlYXRlRWxlbWVudChcblx0XHRcdFx0bGlzdC5wb3AoKVxuXHRcdFx0KTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHNhZmVGcmFnO1xufVxuXG5cbiggZnVuY3Rpb24oKSB7XG5cdHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImRpdlwiICksXG5cdFx0ZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksXG5cdFx0aW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImlucHV0XCIgKTtcblxuXHQvLyBTZXR1cFxuXHRkaXYuaW5uZXJIVE1MID0gXCIgIDxsaW5rLz48dGFibGU+PC90YWJsZT48YSBocmVmPScvYSc+YTwvYT48aW5wdXQgdHlwZT0nY2hlY2tib3gnLz5cIjtcblxuXHQvLyBJRSBzdHJpcHMgbGVhZGluZyB3aGl0ZXNwYWNlIHdoZW4gLmlubmVySFRNTCBpcyB1c2VkXG5cdHN1cHBvcnQubGVhZGluZ1doaXRlc3BhY2UgPSBkaXYuZmlyc3RDaGlsZC5ub2RlVHlwZSA9PT0gMztcblxuXHQvLyBNYWtlIHN1cmUgdGhhdCB0Ym9keSBlbGVtZW50cyBhcmVuJ3QgYXV0b21hdGljYWxseSBpbnNlcnRlZFxuXHQvLyBJRSB3aWxsIGluc2VydCB0aGVtIGludG8gZW1wdHkgdGFibGVzXG5cdHN1cHBvcnQudGJvZHkgPSAhZGl2LmdldEVsZW1lbnRzQnlUYWdOYW1lKCBcInRib2R5XCIgKS5sZW5ndGg7XG5cblx0Ly8gTWFrZSBzdXJlIHRoYXQgbGluayBlbGVtZW50cyBnZXQgc2VyaWFsaXplZCBjb3JyZWN0bHkgYnkgaW5uZXJIVE1MXG5cdC8vIFRoaXMgcmVxdWlyZXMgYSB3cmFwcGVyIGVsZW1lbnQgaW4gSUVcblx0c3VwcG9ydC5odG1sU2VyaWFsaXplID0gISFkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIFwibGlua1wiICkubGVuZ3RoO1xuXG5cdC8vIE1ha2VzIHN1cmUgY2xvbmluZyBhbiBodG1sNSBlbGVtZW50IGRvZXMgbm90IGNhdXNlIHByb2JsZW1zXG5cdC8vIFdoZXJlIG91dGVySFRNTCBpcyB1bmRlZmluZWQsIHRoaXMgc3RpbGwgd29ya3Ncblx0c3VwcG9ydC5odG1sNUNsb25lID1cblx0XHRkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcIm5hdlwiICkuY2xvbmVOb2RlKCB0cnVlICkub3V0ZXJIVE1MICE9PSBcIjw6bmF2PjwvOm5hdj5cIjtcblxuXHQvLyBDaGVjayBpZiBhIGRpc2Nvbm5lY3RlZCBjaGVja2JveCB3aWxsIHJldGFpbiBpdHMgY2hlY2tlZFxuXHQvLyB2YWx1ZSBvZiB0cnVlIGFmdGVyIGFwcGVuZGVkIHRvIHRoZSBET00gKElFNi83KVxuXHRpbnB1dC50eXBlID0gXCJjaGVja2JveFwiO1xuXHRpbnB1dC5jaGVja2VkID0gdHJ1ZTtcblx0ZnJhZ21lbnQuYXBwZW5kQ2hpbGQoIGlucHV0ICk7XG5cdHN1cHBvcnQuYXBwZW5kQ2hlY2tlZCA9IGlucHV0LmNoZWNrZWQ7XG5cblx0Ly8gTWFrZSBzdXJlIHRleHRhcmVhIChhbmQgY2hlY2tib3gpIGRlZmF1bHRWYWx1ZSBpcyBwcm9wZXJseSBjbG9uZWRcblx0Ly8gU3VwcG9ydDogSUU2LUlFMTErXG5cdGRpdi5pbm5lckhUTUwgPSBcIjx0ZXh0YXJlYT54PC90ZXh0YXJlYT5cIjtcblx0c3VwcG9ydC5ub0Nsb25lQ2hlY2tlZCA9ICEhZGl2LmNsb25lTm9kZSggdHJ1ZSApLmxhc3RDaGlsZC5kZWZhdWx0VmFsdWU7XG5cblx0Ly8gIzExMjE3IC0gV2ViS2l0IGxvc2VzIGNoZWNrIHdoZW4gdGhlIG5hbWUgaXMgYWZ0ZXIgdGhlIGNoZWNrZWQgYXR0cmlidXRlXG5cdGZyYWdtZW50LmFwcGVuZENoaWxkKCBkaXYgKTtcblxuXHQvLyBTdXBwb3J0OiBXaW5kb3dzIFdlYiBBcHBzIChXV0EpXG5cdC8vIGBuYW1lYCBhbmQgYHR5cGVgIG11c3QgdXNlIC5zZXRBdHRyaWJ1dGUgZm9yIFdXQSAoIzE0OTAxKVxuXHRpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiaW5wdXRcIiApO1xuXHRpbnB1dC5zZXRBdHRyaWJ1dGUoIFwidHlwZVwiLCBcInJhZGlvXCIgKTtcblx0aW5wdXQuc2V0QXR0cmlidXRlKCBcImNoZWNrZWRcIiwgXCJjaGVja2VkXCIgKTtcblx0aW5wdXQuc2V0QXR0cmlidXRlKCBcIm5hbWVcIiwgXCJ0XCIgKTtcblxuXHRkaXYuYXBwZW5kQ2hpbGQoIGlucHV0ICk7XG5cblx0Ly8gU3VwcG9ydDogU2FmYXJpIDUuMSwgaU9TIDUuMSwgQW5kcm9pZCA0LngsIEFuZHJvaWQgMi4zXG5cdC8vIG9sZCBXZWJLaXQgZG9lc24ndCBjbG9uZSBjaGVja2VkIHN0YXRlIGNvcnJlY3RseSBpbiBmcmFnbWVudHNcblx0c3VwcG9ydC5jaGVja0Nsb25lID0gZGl2LmNsb25lTm9kZSggdHJ1ZSApLmNsb25lTm9kZSggdHJ1ZSApLmxhc3RDaGlsZC5jaGVja2VkO1xuXG5cdC8vIFN1cHBvcnQ6IElFPDlcblx0Ly8gQ2xvbmVkIGVsZW1lbnRzIGtlZXAgYXR0YWNoRXZlbnQgaGFuZGxlcnMsIHdlIHVzZSBhZGRFdmVudExpc3RlbmVyIG9uIElFOStcblx0c3VwcG9ydC5ub0Nsb25lRXZlbnQgPSAhIWRpdi5hZGRFdmVudExpc3RlbmVyO1xuXG5cdC8vIFN1cHBvcnQ6IElFPDlcblx0Ly8gU2luY2UgYXR0cmlidXRlcyBhbmQgcHJvcGVydGllcyBhcmUgdGhlIHNhbWUgaW4gSUUsXG5cdC8vIGNsZWFuRGF0YSBtdXN0IHNldCBwcm9wZXJ0aWVzIHRvIHVuZGVmaW5lZCByYXRoZXIgdGhhbiB1c2UgcmVtb3ZlQXR0cmlidXRlXG5cdGRpdlsgalF1ZXJ5LmV4cGFuZG8gXSA9IDE7XG5cdHN1cHBvcnQuYXR0cmlidXRlcyA9ICFkaXYuZ2V0QXR0cmlidXRlKCBqUXVlcnkuZXhwYW5kbyApO1xufSApKCk7XG5cblxuLy8gV2UgaGF2ZSB0byBjbG9zZSB0aGVzZSB0YWdzIHRvIHN1cHBvcnQgWEhUTUwgKCMxMzIwMClcbnZhciB3cmFwTWFwID0ge1xuXHRvcHRpb246IFsgMSwgXCI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+XCIsIFwiPC9zZWxlY3Q+XCIgXSxcblx0bGVnZW5kOiBbIDEsIFwiPGZpZWxkc2V0PlwiLCBcIjwvZmllbGRzZXQ+XCIgXSxcblx0YXJlYTogWyAxLCBcIjxtYXA+XCIsIFwiPC9tYXA+XCIgXSxcblxuXHQvLyBTdXBwb3J0OiBJRThcblx0cGFyYW06IFsgMSwgXCI8b2JqZWN0PlwiLCBcIjwvb2JqZWN0PlwiIF0sXG5cdHRoZWFkOiBbIDEsIFwiPHRhYmxlPlwiLCBcIjwvdGFibGU+XCIgXSxcblx0dHI6IFsgMiwgXCI8dGFibGU+PHRib2R5PlwiLCBcIjwvdGJvZHk+PC90YWJsZT5cIiBdLFxuXHRjb2w6IFsgMiwgXCI8dGFibGU+PHRib2R5PjwvdGJvZHk+PGNvbGdyb3VwPlwiLCBcIjwvY29sZ3JvdXA+PC90YWJsZT5cIiBdLFxuXHR0ZDogWyAzLCBcIjx0YWJsZT48dGJvZHk+PHRyPlwiLCBcIjwvdHI+PC90Ym9keT48L3RhYmxlPlwiIF0sXG5cblx0Ly8gSUU2LTggY2FuJ3Qgc2VyaWFsaXplIGxpbmssIHNjcmlwdCwgc3R5bGUsIG9yIGFueSBodG1sNSAoTm9TY29wZSkgdGFncyxcblx0Ly8gdW5sZXNzIHdyYXBwZWQgaW4gYSBkaXYgd2l0aCBub24tYnJlYWtpbmcgY2hhcmFjdGVycyBpbiBmcm9udCBvZiBpdC5cblx0X2RlZmF1bHQ6IHN1cHBvcnQuaHRtbFNlcmlhbGl6ZSA/IFsgMCwgXCJcIiwgXCJcIiBdIDogWyAxLCBcIlg8ZGl2PlwiLCBcIjwvZGl2PlwiIF1cbn07XG5cbi8vIFN1cHBvcnQ6IElFOC1JRTlcbndyYXBNYXAub3B0Z3JvdXAgPSB3cmFwTWFwLm9wdGlvbjtcblxud3JhcE1hcC50Ym9keSA9IHdyYXBNYXAudGZvb3QgPSB3cmFwTWFwLmNvbGdyb3VwID0gd3JhcE1hcC5jYXB0aW9uID0gd3JhcE1hcC50aGVhZDtcbndyYXBNYXAudGggPSB3cmFwTWFwLnRkO1xuXG5cbmZ1bmN0aW9uIGdldEFsbCggY29udGV4dCwgdGFnICkge1xuXHR2YXIgZWxlbXMsIGVsZW0sXG5cdFx0aSA9IDAsXG5cdFx0Zm91bmQgPSB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSAhPT0gXCJ1bmRlZmluZWRcIiA/XG5cdFx0XHRjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCB0YWcgfHwgXCIqXCIgKSA6XG5cdFx0XHR0eXBlb2YgY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsICE9PSBcInVuZGVmaW5lZFwiID9cblx0XHRcdFx0Y29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKCB0YWcgfHwgXCIqXCIgKSA6XG5cdFx0XHRcdHVuZGVmaW5lZDtcblxuXHRpZiAoICFmb3VuZCApIHtcblx0XHRmb3IgKCBmb3VuZCA9IFtdLCBlbGVtcyA9IGNvbnRleHQuY2hpbGROb2RlcyB8fCBjb250ZXh0O1xuXHRcdFx0KCBlbGVtID0gZWxlbXNbIGkgXSApICE9IG51bGw7XG5cdFx0XHRpKytcblx0XHQpIHtcblx0XHRcdGlmICggIXRhZyB8fCBqUXVlcnkubm9kZU5hbWUoIGVsZW0sIHRhZyApICkge1xuXHRcdFx0XHRmb3VuZC5wdXNoKCBlbGVtICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRqUXVlcnkubWVyZ2UoIGZvdW5kLCBnZXRBbGwoIGVsZW0sIHRhZyApICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHRhZyA9PT0gdW5kZWZpbmVkIHx8IHRhZyAmJiBqUXVlcnkubm9kZU5hbWUoIGNvbnRleHQsIHRhZyApID9cblx0XHRqUXVlcnkubWVyZ2UoIFsgY29udGV4dCBdLCBmb3VuZCApIDpcblx0XHRmb3VuZDtcbn1cblxuXG4vLyBNYXJrIHNjcmlwdHMgYXMgaGF2aW5nIGFscmVhZHkgYmVlbiBldmFsdWF0ZWRcbmZ1bmN0aW9uIHNldEdsb2JhbEV2YWwoIGVsZW1zLCByZWZFbGVtZW50cyApIHtcblx0dmFyIGVsZW0sXG5cdFx0aSA9IDA7XG5cdGZvciAoIDsgKCBlbGVtID0gZWxlbXNbIGkgXSApICE9IG51bGw7IGkrKyApIHtcblx0XHRqUXVlcnkuX2RhdGEoXG5cdFx0XHRlbGVtLFxuXHRcdFx0XCJnbG9iYWxFdmFsXCIsXG5cdFx0XHQhcmVmRWxlbWVudHMgfHwgalF1ZXJ5Ll9kYXRhKCByZWZFbGVtZW50c1sgaSBdLCBcImdsb2JhbEV2YWxcIiApXG5cdFx0KTtcblx0fVxufVxuXG5cbnZhciByaHRtbCA9IC88fCYjP1xcdys7Lyxcblx0cnRib2R5ID0gLzx0Ym9keS9pO1xuXG5mdW5jdGlvbiBmaXhEZWZhdWx0Q2hlY2tlZCggZWxlbSApIHtcblx0aWYgKCByY2hlY2thYmxlVHlwZS50ZXN0KCBlbGVtLnR5cGUgKSApIHtcblx0XHRlbGVtLmRlZmF1bHRDaGVja2VkID0gZWxlbS5jaGVja2VkO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkRnJhZ21lbnQoIGVsZW1zLCBjb250ZXh0LCBzY3JpcHRzLCBzZWxlY3Rpb24sIGlnbm9yZWQgKSB7XG5cdHZhciBqLCBlbGVtLCBjb250YWlucyxcblx0XHR0bXAsIHRhZywgdGJvZHksIHdyYXAsXG5cdFx0bCA9IGVsZW1zLmxlbmd0aCxcblxuXHRcdC8vIEVuc3VyZSBhIHNhZmUgZnJhZ21lbnRcblx0XHRzYWZlID0gY3JlYXRlU2FmZUZyYWdtZW50KCBjb250ZXh0ICksXG5cblx0XHRub2RlcyA9IFtdLFxuXHRcdGkgPSAwO1xuXG5cdGZvciAoIDsgaSA8IGw7IGkrKyApIHtcblx0XHRlbGVtID0gZWxlbXNbIGkgXTtcblxuXHRcdGlmICggZWxlbSB8fCBlbGVtID09PSAwICkge1xuXG5cdFx0XHQvLyBBZGQgbm9kZXMgZGlyZWN0bHlcblx0XHRcdGlmICggalF1ZXJ5LnR5cGUoIGVsZW0gKSA9PT0gXCJvYmplY3RcIiApIHtcblx0XHRcdFx0alF1ZXJ5Lm1lcmdlKCBub2RlcywgZWxlbS5ub2RlVHlwZSA/IFsgZWxlbSBdIDogZWxlbSApO1xuXG5cdFx0XHQvLyBDb252ZXJ0IG5vbi1odG1sIGludG8gYSB0ZXh0IG5vZGVcblx0XHRcdH0gZWxzZSBpZiAoICFyaHRtbC50ZXN0KCBlbGVtICkgKSB7XG5cdFx0XHRcdG5vZGVzLnB1c2goIGNvbnRleHQuY3JlYXRlVGV4dE5vZGUoIGVsZW0gKSApO1xuXG5cdFx0XHQvLyBDb252ZXJ0IGh0bWwgaW50byBET00gbm9kZXNcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRtcCA9IHRtcCB8fCBzYWZlLmFwcGVuZENoaWxkKCBjb250ZXh0LmNyZWF0ZUVsZW1lbnQoIFwiZGl2XCIgKSApO1xuXG5cdFx0XHRcdC8vIERlc2VyaWFsaXplIGEgc3RhbmRhcmQgcmVwcmVzZW50YXRpb25cblx0XHRcdFx0dGFnID0gKCBydGFnTmFtZS5leGVjKCBlbGVtICkgfHwgWyBcIlwiLCBcIlwiIF0gKVsgMSBdLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRcdHdyYXAgPSB3cmFwTWFwWyB0YWcgXSB8fCB3cmFwTWFwLl9kZWZhdWx0O1xuXG5cdFx0XHRcdHRtcC5pbm5lckhUTUwgPSB3cmFwWyAxIF0gKyBqUXVlcnkuaHRtbFByZWZpbHRlciggZWxlbSApICsgd3JhcFsgMiBdO1xuXG5cdFx0XHRcdC8vIERlc2NlbmQgdGhyb3VnaCB3cmFwcGVycyB0byB0aGUgcmlnaHQgY29udGVudFxuXHRcdFx0XHRqID0gd3JhcFsgMCBdO1xuXHRcdFx0XHR3aGlsZSAoIGotLSApIHtcblx0XHRcdFx0XHR0bXAgPSB0bXAubGFzdENoaWxkO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gTWFudWFsbHkgYWRkIGxlYWRpbmcgd2hpdGVzcGFjZSByZW1vdmVkIGJ5IElFXG5cdFx0XHRcdGlmICggIXN1cHBvcnQubGVhZGluZ1doaXRlc3BhY2UgJiYgcmxlYWRpbmdXaGl0ZXNwYWNlLnRlc3QoIGVsZW0gKSApIHtcblx0XHRcdFx0XHRub2Rlcy5wdXNoKCBjb250ZXh0LmNyZWF0ZVRleHROb2RlKCBybGVhZGluZ1doaXRlc3BhY2UuZXhlYyggZWxlbSApWyAwIF0gKSApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gUmVtb3ZlIElFJ3MgYXV0b2luc2VydGVkIDx0Ym9keT4gZnJvbSB0YWJsZSBmcmFnbWVudHNcblx0XHRcdFx0aWYgKCAhc3VwcG9ydC50Ym9keSApIHtcblxuXHRcdFx0XHRcdC8vIFN0cmluZyB3YXMgYSA8dGFibGU+LCAqbWF5KiBoYXZlIHNwdXJpb3VzIDx0Ym9keT5cblx0XHRcdFx0XHRlbGVtID0gdGFnID09PSBcInRhYmxlXCIgJiYgIXJ0Ym9keS50ZXN0KCBlbGVtICkgP1xuXHRcdFx0XHRcdFx0dG1wLmZpcnN0Q2hpbGQgOlxuXG5cdFx0XHRcdFx0XHQvLyBTdHJpbmcgd2FzIGEgYmFyZSA8dGhlYWQ+IG9yIDx0Zm9vdD5cblx0XHRcdFx0XHRcdHdyYXBbIDEgXSA9PT0gXCI8dGFibGU+XCIgJiYgIXJ0Ym9keS50ZXN0KCBlbGVtICkgP1xuXHRcdFx0XHRcdFx0XHR0bXAgOlxuXHRcdFx0XHRcdFx0XHQwO1xuXG5cdFx0XHRcdFx0aiA9IGVsZW0gJiYgZWxlbS5jaGlsZE5vZGVzLmxlbmd0aDtcblx0XHRcdFx0XHR3aGlsZSAoIGotLSApIHtcblx0XHRcdFx0XHRcdGlmICggalF1ZXJ5Lm5vZGVOYW1lKCAoIHRib2R5ID0gZWxlbS5jaGlsZE5vZGVzWyBqIF0gKSwgXCJ0Ym9keVwiICkgJiZcblx0XHRcdFx0XHRcdFx0IXRib2R5LmNoaWxkTm9kZXMubGVuZ3RoICkge1xuXG5cdFx0XHRcdFx0XHRcdGVsZW0ucmVtb3ZlQ2hpbGQoIHRib2R5ICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0alF1ZXJ5Lm1lcmdlKCBub2RlcywgdG1wLmNoaWxkTm9kZXMgKTtcblxuXHRcdFx0XHQvLyBGaXggIzEyMzkyIGZvciBXZWJLaXQgYW5kIElFID4gOVxuXHRcdFx0XHR0bXAudGV4dENvbnRlbnQgPSBcIlwiO1xuXG5cdFx0XHRcdC8vIEZpeCAjMTIzOTIgZm9yIG9sZElFXG5cdFx0XHRcdHdoaWxlICggdG1wLmZpcnN0Q2hpbGQgKSB7XG5cdFx0XHRcdFx0dG1wLnJlbW92ZUNoaWxkKCB0bXAuZmlyc3RDaGlsZCApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gUmVtZW1iZXIgdGhlIHRvcC1sZXZlbCBjb250YWluZXIgZm9yIHByb3BlciBjbGVhbnVwXG5cdFx0XHRcdHRtcCA9IHNhZmUubGFzdENoaWxkO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIEZpeCAjMTEzNTY6IENsZWFyIGVsZW1lbnRzIGZyb20gZnJhZ21lbnRcblx0aWYgKCB0bXAgKSB7XG5cdFx0c2FmZS5yZW1vdmVDaGlsZCggdG1wICk7XG5cdH1cblxuXHQvLyBSZXNldCBkZWZhdWx0Q2hlY2tlZCBmb3IgYW55IHJhZGlvcyBhbmQgY2hlY2tib3hlc1xuXHQvLyBhYm91dCB0byBiZSBhcHBlbmRlZCB0byB0aGUgRE9NIGluIElFIDYvNyAoIzgwNjApXG5cdGlmICggIXN1cHBvcnQuYXBwZW5kQ2hlY2tlZCApIHtcblx0XHRqUXVlcnkuZ3JlcCggZ2V0QWxsKCBub2RlcywgXCJpbnB1dFwiICksIGZpeERlZmF1bHRDaGVja2VkICk7XG5cdH1cblxuXHRpID0gMDtcblx0d2hpbGUgKCAoIGVsZW0gPSBub2Rlc1sgaSsrIF0gKSApIHtcblxuXHRcdC8vIFNraXAgZWxlbWVudHMgYWxyZWFkeSBpbiB0aGUgY29udGV4dCBjb2xsZWN0aW9uICh0cmFjLTQwODcpXG5cdFx0aWYgKCBzZWxlY3Rpb24gJiYgalF1ZXJ5LmluQXJyYXkoIGVsZW0sIHNlbGVjdGlvbiApID4gLTEgKSB7XG5cdFx0XHRpZiAoIGlnbm9yZWQgKSB7XG5cdFx0XHRcdGlnbm9yZWQucHVzaCggZWxlbSApO1xuXHRcdFx0fVxuXG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cblx0XHRjb250YWlucyA9IGpRdWVyeS5jb250YWlucyggZWxlbS5vd25lckRvY3VtZW50LCBlbGVtICk7XG5cblx0XHQvLyBBcHBlbmQgdG8gZnJhZ21lbnRcblx0XHR0bXAgPSBnZXRBbGwoIHNhZmUuYXBwZW5kQ2hpbGQoIGVsZW0gKSwgXCJzY3JpcHRcIiApO1xuXG5cdFx0Ly8gUHJlc2VydmUgc2NyaXB0IGV2YWx1YXRpb24gaGlzdG9yeVxuXHRcdGlmICggY29udGFpbnMgKSB7XG5cdFx0XHRzZXRHbG9iYWxFdmFsKCB0bXAgKTtcblx0XHR9XG5cblx0XHQvLyBDYXB0dXJlIGV4ZWN1dGFibGVzXG5cdFx0aWYgKCBzY3JpcHRzICkge1xuXHRcdFx0aiA9IDA7XG5cdFx0XHR3aGlsZSAoICggZWxlbSA9IHRtcFsgaisrIF0gKSApIHtcblx0XHRcdFx0aWYgKCByc2NyaXB0VHlwZS50ZXN0KCBlbGVtLnR5cGUgfHwgXCJcIiApICkge1xuXHRcdFx0XHRcdHNjcmlwdHMucHVzaCggZWxlbSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0dG1wID0gbnVsbDtcblxuXHRyZXR1cm4gc2FmZTtcbn1cblxuXG4oIGZ1bmN0aW9uKCkge1xuXHR2YXIgaSwgZXZlbnROYW1lLFxuXHRcdGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiZGl2XCIgKTtcblxuXHQvLyBTdXBwb3J0OiBJRTw5IChsYWNrIHN1Ym1pdC9jaGFuZ2UgYnViYmxlKSwgRmlyZWZveCAobGFjayBmb2N1cyhpbiB8IG91dCkgZXZlbnRzKVxuXHRmb3IgKCBpIGluIHsgc3VibWl0OiB0cnVlLCBjaGFuZ2U6IHRydWUsIGZvY3VzaW46IHRydWUgfSApIHtcblx0XHRldmVudE5hbWUgPSBcIm9uXCIgKyBpO1xuXG5cdFx0aWYgKCAhKCBzdXBwb3J0WyBpIF0gPSBldmVudE5hbWUgaW4gd2luZG93ICkgKSB7XG5cblx0XHRcdC8vIEJld2FyZSBvZiBDU1AgcmVzdHJpY3Rpb25zIChodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9TZWN1cml0eS9DU1ApXG5cdFx0XHRkaXYuc2V0QXR0cmlidXRlKCBldmVudE5hbWUsIFwidFwiICk7XG5cdFx0XHRzdXBwb3J0WyBpIF0gPSBkaXYuYXR0cmlidXRlc1sgZXZlbnROYW1lIF0uZXhwYW5kbyA9PT0gZmFsc2U7XG5cdFx0fVxuXHR9XG5cblx0Ly8gTnVsbCBlbGVtZW50cyB0byBhdm9pZCBsZWFrcyBpbiBJRS5cblx0ZGl2ID0gbnVsbDtcbn0gKSgpO1xuXG5cbnZhciByZm9ybUVsZW1zID0gL14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWEpJC9pLFxuXHRya2V5RXZlbnQgPSAvXmtleS8sXG5cdHJtb3VzZUV2ZW50ID0gL14oPzptb3VzZXxwb2ludGVyfGNvbnRleHRtZW51fGRyYWd8ZHJvcCl8Y2xpY2svLFxuXHRyZm9jdXNNb3JwaCA9IC9eKD86Zm9jdXNpbmZvY3VzfGZvY3Vzb3V0Ymx1cikkLyxcblx0cnR5cGVuYW1lc3BhY2UgPSAvXihbXi5dKikoPzpcXC4oLispfCkvO1xuXG5mdW5jdGlvbiByZXR1cm5UcnVlKCkge1xuXHRyZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gcmV0dXJuRmFsc2UoKSB7XG5cdHJldHVybiBmYWxzZTtcbn1cblxuLy8gU3VwcG9ydDogSUU5XG4vLyBTZWUgIzEzMzkzIGZvciBtb3JlIGluZm9cbmZ1bmN0aW9uIHNhZmVBY3RpdmVFbGVtZW50KCkge1xuXHR0cnkge1xuXHRcdHJldHVybiBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuXHR9IGNhdGNoICggZXJyICkgeyB9XG59XG5cbmZ1bmN0aW9uIG9uKCBlbGVtLCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuLCBvbmUgKSB7XG5cdHZhciBvcmlnRm4sIHR5cGU7XG5cblx0Ly8gVHlwZXMgY2FuIGJlIGEgbWFwIG9mIHR5cGVzL2hhbmRsZXJzXG5cdGlmICggdHlwZW9mIHR5cGVzID09PSBcIm9iamVjdFwiICkge1xuXG5cdFx0Ly8gKCB0eXBlcy1PYmplY3QsIHNlbGVjdG9yLCBkYXRhIClcblx0XHRpZiAoIHR5cGVvZiBzZWxlY3RvciAhPT0gXCJzdHJpbmdcIiApIHtcblxuXHRcdFx0Ly8gKCB0eXBlcy1PYmplY3QsIGRhdGEgKVxuXHRcdFx0ZGF0YSA9IGRhdGEgfHwgc2VsZWN0b3I7XG5cdFx0XHRzZWxlY3RvciA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0Zm9yICggdHlwZSBpbiB0eXBlcyApIHtcblx0XHRcdG9uKCBlbGVtLCB0eXBlLCBzZWxlY3RvciwgZGF0YSwgdHlwZXNbIHR5cGUgXSwgb25lICk7XG5cdFx0fVxuXHRcdHJldHVybiBlbGVtO1xuXHR9XG5cblx0aWYgKCBkYXRhID09IG51bGwgJiYgZm4gPT0gbnVsbCApIHtcblxuXHRcdC8vICggdHlwZXMsIGZuIClcblx0XHRmbiA9IHNlbGVjdG9yO1xuXHRcdGRhdGEgPSBzZWxlY3RvciA9IHVuZGVmaW5lZDtcblx0fSBlbHNlIGlmICggZm4gPT0gbnVsbCApIHtcblx0XHRpZiAoIHR5cGVvZiBzZWxlY3RvciA9PT0gXCJzdHJpbmdcIiApIHtcblxuXHRcdFx0Ly8gKCB0eXBlcywgc2VsZWN0b3IsIGZuIClcblx0XHRcdGZuID0gZGF0YTtcblx0XHRcdGRhdGEgPSB1bmRlZmluZWQ7XG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gKCB0eXBlcywgZGF0YSwgZm4gKVxuXHRcdFx0Zm4gPSBkYXRhO1xuXHRcdFx0ZGF0YSA9IHNlbGVjdG9yO1xuXHRcdFx0c2VsZWN0b3IgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHR9XG5cdGlmICggZm4gPT09IGZhbHNlICkge1xuXHRcdGZuID0gcmV0dXJuRmFsc2U7XG5cdH0gZWxzZSBpZiAoICFmbiApIHtcblx0XHRyZXR1cm4gZWxlbTtcblx0fVxuXG5cdGlmICggb25lID09PSAxICkge1xuXHRcdG9yaWdGbiA9IGZuO1xuXHRcdGZuID0gZnVuY3Rpb24oIGV2ZW50ICkge1xuXG5cdFx0XHQvLyBDYW4gdXNlIGFuIGVtcHR5IHNldCwgc2luY2UgZXZlbnQgY29udGFpbnMgdGhlIGluZm9cblx0XHRcdGpRdWVyeSgpLm9mZiggZXZlbnQgKTtcblx0XHRcdHJldHVybiBvcmlnRm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdH07XG5cblx0XHQvLyBVc2Ugc2FtZSBndWlkIHNvIGNhbGxlciBjYW4gcmVtb3ZlIHVzaW5nIG9yaWdGblxuXHRcdGZuLmd1aWQgPSBvcmlnRm4uZ3VpZCB8fCAoIG9yaWdGbi5ndWlkID0galF1ZXJ5Lmd1aWQrKyApO1xuXHR9XG5cdHJldHVybiBlbGVtLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdGpRdWVyeS5ldmVudC5hZGQoIHRoaXMsIHR5cGVzLCBmbiwgZGF0YSwgc2VsZWN0b3IgKTtcblx0fSApO1xufVxuXG4vKlxuICogSGVscGVyIGZ1bmN0aW9ucyBmb3IgbWFuYWdpbmcgZXZlbnRzIC0tIG5vdCBwYXJ0IG9mIHRoZSBwdWJsaWMgaW50ZXJmYWNlLlxuICogUHJvcHMgdG8gRGVhbiBFZHdhcmRzJyBhZGRFdmVudCBsaWJyYXJ5IGZvciBtYW55IG9mIHRoZSBpZGVhcy5cbiAqL1xualF1ZXJ5LmV2ZW50ID0ge1xuXG5cdGdsb2JhbDoge30sXG5cblx0YWRkOiBmdW5jdGlvbiggZWxlbSwgdHlwZXMsIGhhbmRsZXIsIGRhdGEsIHNlbGVjdG9yICkge1xuXHRcdHZhciB0bXAsIGV2ZW50cywgdCwgaGFuZGxlT2JqSW4sXG5cdFx0XHRzcGVjaWFsLCBldmVudEhhbmRsZSwgaGFuZGxlT2JqLFxuXHRcdFx0aGFuZGxlcnMsIHR5cGUsIG5hbWVzcGFjZXMsIG9yaWdUeXBlLFxuXHRcdFx0ZWxlbURhdGEgPSBqUXVlcnkuX2RhdGEoIGVsZW0gKTtcblxuXHRcdC8vIERvbid0IGF0dGFjaCBldmVudHMgdG8gbm9EYXRhIG9yIHRleHQvY29tbWVudCBub2RlcyAoYnV0IGFsbG93IHBsYWluIG9iamVjdHMpXG5cdFx0aWYgKCAhZWxlbURhdGEgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gQ2FsbGVyIGNhbiBwYXNzIGluIGFuIG9iamVjdCBvZiBjdXN0b20gZGF0YSBpbiBsaWV1IG9mIHRoZSBoYW5kbGVyXG5cdFx0aWYgKCBoYW5kbGVyLmhhbmRsZXIgKSB7XG5cdFx0XHRoYW5kbGVPYmpJbiA9IGhhbmRsZXI7XG5cdFx0XHRoYW5kbGVyID0gaGFuZGxlT2JqSW4uaGFuZGxlcjtcblx0XHRcdHNlbGVjdG9yID0gaGFuZGxlT2JqSW4uc2VsZWN0b3I7XG5cdFx0fVxuXG5cdFx0Ly8gTWFrZSBzdXJlIHRoYXQgdGhlIGhhbmRsZXIgaGFzIGEgdW5pcXVlIElELCB1c2VkIHRvIGZpbmQvcmVtb3ZlIGl0IGxhdGVyXG5cdFx0aWYgKCAhaGFuZGxlci5ndWlkICkge1xuXHRcdFx0aGFuZGxlci5ndWlkID0galF1ZXJ5Lmd1aWQrKztcblx0XHR9XG5cblx0XHQvLyBJbml0IHRoZSBlbGVtZW50J3MgZXZlbnQgc3RydWN0dXJlIGFuZCBtYWluIGhhbmRsZXIsIGlmIHRoaXMgaXMgdGhlIGZpcnN0XG5cdFx0aWYgKCAhKCBldmVudHMgPSBlbGVtRGF0YS5ldmVudHMgKSApIHtcblx0XHRcdGV2ZW50cyA9IGVsZW1EYXRhLmV2ZW50cyA9IHt9O1xuXHRcdH1cblx0XHRpZiAoICEoIGV2ZW50SGFuZGxlID0gZWxlbURhdGEuaGFuZGxlICkgKSB7XG5cdFx0XHRldmVudEhhbmRsZSA9IGVsZW1EYXRhLmhhbmRsZSA9IGZ1bmN0aW9uKCBlICkge1xuXG5cdFx0XHRcdC8vIERpc2NhcmQgdGhlIHNlY29uZCBldmVudCBvZiBhIGpRdWVyeS5ldmVudC50cmlnZ2VyKCkgYW5kXG5cdFx0XHRcdC8vIHdoZW4gYW4gZXZlbnQgaXMgY2FsbGVkIGFmdGVyIGEgcGFnZSBoYXMgdW5sb2FkZWRcblx0XHRcdFx0cmV0dXJuIHR5cGVvZiBqUXVlcnkgIT09IFwidW5kZWZpbmVkXCIgJiZcblx0XHRcdFx0XHQoICFlIHx8IGpRdWVyeS5ldmVudC50cmlnZ2VyZWQgIT09IGUudHlwZSApID9cblx0XHRcdFx0XHRqUXVlcnkuZXZlbnQuZGlzcGF0Y2guYXBwbHkoIGV2ZW50SGFuZGxlLmVsZW0sIGFyZ3VtZW50cyApIDpcblx0XHRcdFx0XHR1bmRlZmluZWQ7XG5cdFx0XHR9O1xuXG5cdFx0XHQvLyBBZGQgZWxlbSBhcyBhIHByb3BlcnR5IG9mIHRoZSBoYW5kbGUgZm4gdG8gcHJldmVudCBhIG1lbW9yeSBsZWFrXG5cdFx0XHQvLyB3aXRoIElFIG5vbi1uYXRpdmUgZXZlbnRzXG5cdFx0XHRldmVudEhhbmRsZS5lbGVtID0gZWxlbTtcblx0XHR9XG5cblx0XHQvLyBIYW5kbGUgbXVsdGlwbGUgZXZlbnRzIHNlcGFyYXRlZCBieSBhIHNwYWNlXG5cdFx0dHlwZXMgPSAoIHR5cGVzIHx8IFwiXCIgKS5tYXRjaCggcm5vdHdoaXRlICkgfHwgWyBcIlwiIF07XG5cdFx0dCA9IHR5cGVzLmxlbmd0aDtcblx0XHR3aGlsZSAoIHQtLSApIHtcblx0XHRcdHRtcCA9IHJ0eXBlbmFtZXNwYWNlLmV4ZWMoIHR5cGVzWyB0IF0gKSB8fCBbXTtcblx0XHRcdHR5cGUgPSBvcmlnVHlwZSA9IHRtcFsgMSBdO1xuXHRcdFx0bmFtZXNwYWNlcyA9ICggdG1wWyAyIF0gfHwgXCJcIiApLnNwbGl0KCBcIi5cIiApLnNvcnQoKTtcblxuXHRcdFx0Ly8gVGhlcmUgKm11c3QqIGJlIGEgdHlwZSwgbm8gYXR0YWNoaW5nIG5hbWVzcGFjZS1vbmx5IGhhbmRsZXJzXG5cdFx0XHRpZiAoICF0eXBlICkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gSWYgZXZlbnQgY2hhbmdlcyBpdHMgdHlwZSwgdXNlIHRoZSBzcGVjaWFsIGV2ZW50IGhhbmRsZXJzIGZvciB0aGUgY2hhbmdlZCB0eXBlXG5cdFx0XHRzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTtcblxuXHRcdFx0Ly8gSWYgc2VsZWN0b3IgZGVmaW5lZCwgZGV0ZXJtaW5lIHNwZWNpYWwgZXZlbnQgYXBpIHR5cGUsIG90aGVyd2lzZSBnaXZlbiB0eXBlXG5cdFx0XHR0eXBlID0gKCBzZWxlY3RvciA/IHNwZWNpYWwuZGVsZWdhdGVUeXBlIDogc3BlY2lhbC5iaW5kVHlwZSApIHx8IHR5cGU7XG5cblx0XHRcdC8vIFVwZGF0ZSBzcGVjaWFsIGJhc2VkIG9uIG5ld2x5IHJlc2V0IHR5cGVcblx0XHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9O1xuXG5cdFx0XHQvLyBoYW5kbGVPYmogaXMgcGFzc2VkIHRvIGFsbCBldmVudCBoYW5kbGVyc1xuXHRcdFx0aGFuZGxlT2JqID0galF1ZXJ5LmV4dGVuZCgge1xuXHRcdFx0XHR0eXBlOiB0eXBlLFxuXHRcdFx0XHRvcmlnVHlwZTogb3JpZ1R5cGUsXG5cdFx0XHRcdGRhdGE6IGRhdGEsXG5cdFx0XHRcdGhhbmRsZXI6IGhhbmRsZXIsXG5cdFx0XHRcdGd1aWQ6IGhhbmRsZXIuZ3VpZCxcblx0XHRcdFx0c2VsZWN0b3I6IHNlbGVjdG9yLFxuXHRcdFx0XHRuZWVkc0NvbnRleHQ6IHNlbGVjdG9yICYmIGpRdWVyeS5leHByLm1hdGNoLm5lZWRzQ29udGV4dC50ZXN0KCBzZWxlY3RvciApLFxuXHRcdFx0XHRuYW1lc3BhY2U6IG5hbWVzcGFjZXMuam9pbiggXCIuXCIgKVxuXHRcdFx0fSwgaGFuZGxlT2JqSW4gKTtcblxuXHRcdFx0Ly8gSW5pdCB0aGUgZXZlbnQgaGFuZGxlciBxdWV1ZSBpZiB3ZSdyZSB0aGUgZmlyc3Rcblx0XHRcdGlmICggISggaGFuZGxlcnMgPSBldmVudHNbIHR5cGUgXSApICkge1xuXHRcdFx0XHRoYW5kbGVycyA9IGV2ZW50c1sgdHlwZSBdID0gW107XG5cdFx0XHRcdGhhbmRsZXJzLmRlbGVnYXRlQ291bnQgPSAwO1xuXG5cdFx0XHRcdC8vIE9ubHkgdXNlIGFkZEV2ZW50TGlzdGVuZXIvYXR0YWNoRXZlbnQgaWYgdGhlIHNwZWNpYWwgZXZlbnRzIGhhbmRsZXIgcmV0dXJucyBmYWxzZVxuXHRcdFx0XHRpZiAoICFzcGVjaWFsLnNldHVwIHx8XG5cdFx0XHRcdFx0c3BlY2lhbC5zZXR1cC5jYWxsKCBlbGVtLCBkYXRhLCBuYW1lc3BhY2VzLCBldmVudEhhbmRsZSApID09PSBmYWxzZSApIHtcblxuXHRcdFx0XHRcdC8vIEJpbmQgdGhlIGdsb2JhbCBldmVudCBoYW5kbGVyIHRvIHRoZSBlbGVtZW50XG5cdFx0XHRcdFx0aWYgKCBlbGVtLmFkZEV2ZW50TGlzdGVuZXIgKSB7XG5cdFx0XHRcdFx0XHRlbGVtLmFkZEV2ZW50TGlzdGVuZXIoIHR5cGUsIGV2ZW50SGFuZGxlLCBmYWxzZSApO1xuXG5cdFx0XHRcdFx0fSBlbHNlIGlmICggZWxlbS5hdHRhY2hFdmVudCApIHtcblx0XHRcdFx0XHRcdGVsZW0uYXR0YWNoRXZlbnQoIFwib25cIiArIHR5cGUsIGV2ZW50SGFuZGxlICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmICggc3BlY2lhbC5hZGQgKSB7XG5cdFx0XHRcdHNwZWNpYWwuYWRkLmNhbGwoIGVsZW0sIGhhbmRsZU9iaiApO1xuXG5cdFx0XHRcdGlmICggIWhhbmRsZU9iai5oYW5kbGVyLmd1aWQgKSB7XG5cdFx0XHRcdFx0aGFuZGxlT2JqLmhhbmRsZXIuZ3VpZCA9IGhhbmRsZXIuZ3VpZDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBBZGQgdG8gdGhlIGVsZW1lbnQncyBoYW5kbGVyIGxpc3QsIGRlbGVnYXRlcyBpbiBmcm9udFxuXHRcdFx0aWYgKCBzZWxlY3RvciApIHtcblx0XHRcdFx0aGFuZGxlcnMuc3BsaWNlKCBoYW5kbGVycy5kZWxlZ2F0ZUNvdW50KyssIDAsIGhhbmRsZU9iaiApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aGFuZGxlcnMucHVzaCggaGFuZGxlT2JqICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEtlZXAgdHJhY2sgb2Ygd2hpY2ggZXZlbnRzIGhhdmUgZXZlciBiZWVuIHVzZWQsIGZvciBldmVudCBvcHRpbWl6YXRpb25cblx0XHRcdGpRdWVyeS5ldmVudC5nbG9iYWxbIHR5cGUgXSA9IHRydWU7XG5cdFx0fVxuXG5cdFx0Ly8gTnVsbGlmeSBlbGVtIHRvIHByZXZlbnQgbWVtb3J5IGxlYWtzIGluIElFXG5cdFx0ZWxlbSA9IG51bGw7XG5cdH0sXG5cblx0Ly8gRGV0YWNoIGFuIGV2ZW50IG9yIHNldCBvZiBldmVudHMgZnJvbSBhbiBlbGVtZW50XG5cdHJlbW92ZTogZnVuY3Rpb24oIGVsZW0sIHR5cGVzLCBoYW5kbGVyLCBzZWxlY3RvciwgbWFwcGVkVHlwZXMgKSB7XG5cdFx0dmFyIGosIGhhbmRsZU9iaiwgdG1wLFxuXHRcdFx0b3JpZ0NvdW50LCB0LCBldmVudHMsXG5cdFx0XHRzcGVjaWFsLCBoYW5kbGVycywgdHlwZSxcblx0XHRcdG5hbWVzcGFjZXMsIG9yaWdUeXBlLFxuXHRcdFx0ZWxlbURhdGEgPSBqUXVlcnkuaGFzRGF0YSggZWxlbSApICYmIGpRdWVyeS5fZGF0YSggZWxlbSApO1xuXG5cdFx0aWYgKCAhZWxlbURhdGEgfHwgISggZXZlbnRzID0gZWxlbURhdGEuZXZlbnRzICkgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gT25jZSBmb3IgZWFjaCB0eXBlLm5hbWVzcGFjZSBpbiB0eXBlczsgdHlwZSBtYXkgYmUgb21pdHRlZFxuXHRcdHR5cGVzID0gKCB0eXBlcyB8fCBcIlwiICkubWF0Y2goIHJub3R3aGl0ZSApIHx8IFsgXCJcIiBdO1xuXHRcdHQgPSB0eXBlcy5sZW5ndGg7XG5cdFx0d2hpbGUgKCB0LS0gKSB7XG5cdFx0XHR0bXAgPSBydHlwZW5hbWVzcGFjZS5leGVjKCB0eXBlc1sgdCBdICkgfHwgW107XG5cdFx0XHR0eXBlID0gb3JpZ1R5cGUgPSB0bXBbIDEgXTtcblx0XHRcdG5hbWVzcGFjZXMgPSAoIHRtcFsgMiBdIHx8IFwiXCIgKS5zcGxpdCggXCIuXCIgKS5zb3J0KCk7XG5cblx0XHRcdC8vIFVuYmluZCBhbGwgZXZlbnRzIChvbiB0aGlzIG5hbWVzcGFjZSwgaWYgcHJvdmlkZWQpIGZvciB0aGUgZWxlbWVudFxuXHRcdFx0aWYgKCAhdHlwZSApIHtcblx0XHRcdFx0Zm9yICggdHlwZSBpbiBldmVudHMgKSB7XG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LnJlbW92ZSggZWxlbSwgdHlwZSArIHR5cGVzWyB0IF0sIGhhbmRsZXIsIHNlbGVjdG9yLCB0cnVlICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9O1xuXHRcdFx0dHlwZSA9ICggc2VsZWN0b3IgPyBzcGVjaWFsLmRlbGVnYXRlVHlwZSA6IHNwZWNpYWwuYmluZFR5cGUgKSB8fCB0eXBlO1xuXHRcdFx0aGFuZGxlcnMgPSBldmVudHNbIHR5cGUgXSB8fCBbXTtcblx0XHRcdHRtcCA9IHRtcFsgMiBdICYmXG5cdFx0XHRcdG5ldyBSZWdFeHAoIFwiKF58XFxcXC4pXCIgKyBuYW1lc3BhY2VzLmpvaW4oIFwiXFxcXC4oPzouKlxcXFwufClcIiApICsgXCIoXFxcXC58JClcIiApO1xuXG5cdFx0XHQvLyBSZW1vdmUgbWF0Y2hpbmcgZXZlbnRzXG5cdFx0XHRvcmlnQ291bnQgPSBqID0gaGFuZGxlcnMubGVuZ3RoO1xuXHRcdFx0d2hpbGUgKCBqLS0gKSB7XG5cdFx0XHRcdGhhbmRsZU9iaiA9IGhhbmRsZXJzWyBqIF07XG5cblx0XHRcdFx0aWYgKCAoIG1hcHBlZFR5cGVzIHx8IG9yaWdUeXBlID09PSBoYW5kbGVPYmoub3JpZ1R5cGUgKSAmJlxuXHRcdFx0XHRcdCggIWhhbmRsZXIgfHwgaGFuZGxlci5ndWlkID09PSBoYW5kbGVPYmouZ3VpZCApICYmXG5cdFx0XHRcdFx0KCAhdG1wIHx8IHRtcC50ZXN0KCBoYW5kbGVPYmoubmFtZXNwYWNlICkgKSAmJlxuXHRcdFx0XHRcdCggIXNlbGVjdG9yIHx8IHNlbGVjdG9yID09PSBoYW5kbGVPYmouc2VsZWN0b3IgfHxcblx0XHRcdFx0XHRcdHNlbGVjdG9yID09PSBcIioqXCIgJiYgaGFuZGxlT2JqLnNlbGVjdG9yICkgKSB7XG5cdFx0XHRcdFx0aGFuZGxlcnMuc3BsaWNlKCBqLCAxICk7XG5cblx0XHRcdFx0XHRpZiAoIGhhbmRsZU9iai5zZWxlY3RvciApIHtcblx0XHRcdFx0XHRcdGhhbmRsZXJzLmRlbGVnYXRlQ291bnQtLTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKCBzcGVjaWFsLnJlbW92ZSApIHtcblx0XHRcdFx0XHRcdHNwZWNpYWwucmVtb3ZlLmNhbGwoIGVsZW0sIGhhbmRsZU9iaiApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBSZW1vdmUgZ2VuZXJpYyBldmVudCBoYW5kbGVyIGlmIHdlIHJlbW92ZWQgc29tZXRoaW5nIGFuZCBubyBtb3JlIGhhbmRsZXJzIGV4aXN0XG5cdFx0XHQvLyAoYXZvaWRzIHBvdGVudGlhbCBmb3IgZW5kbGVzcyByZWN1cnNpb24gZHVyaW5nIHJlbW92YWwgb2Ygc3BlY2lhbCBldmVudCBoYW5kbGVycylcblx0XHRcdGlmICggb3JpZ0NvdW50ICYmICFoYW5kbGVycy5sZW5ndGggKSB7XG5cdFx0XHRcdGlmICggIXNwZWNpYWwudGVhcmRvd24gfHxcblx0XHRcdFx0XHRzcGVjaWFsLnRlYXJkb3duLmNhbGwoIGVsZW0sIG5hbWVzcGFjZXMsIGVsZW1EYXRhLmhhbmRsZSApID09PSBmYWxzZSApIHtcblxuXHRcdFx0XHRcdGpRdWVyeS5yZW1vdmVFdmVudCggZWxlbSwgdHlwZSwgZWxlbURhdGEuaGFuZGxlICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRkZWxldGUgZXZlbnRzWyB0eXBlIF07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gUmVtb3ZlIHRoZSBleHBhbmRvIGlmIGl0J3Mgbm8gbG9uZ2VyIHVzZWRcblx0XHRpZiAoIGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBldmVudHMgKSApIHtcblx0XHRcdGRlbGV0ZSBlbGVtRGF0YS5oYW5kbGU7XG5cblx0XHRcdC8vIHJlbW92ZURhdGEgYWxzbyBjaGVja3MgZm9yIGVtcHRpbmVzcyBhbmQgY2xlYXJzIHRoZSBleHBhbmRvIGlmIGVtcHR5XG5cdFx0XHQvLyBzbyB1c2UgaXQgaW5zdGVhZCBvZiBkZWxldGVcblx0XHRcdGpRdWVyeS5fcmVtb3ZlRGF0YSggZWxlbSwgXCJldmVudHNcIiApO1xuXHRcdH1cblx0fSxcblxuXHR0cmlnZ2VyOiBmdW5jdGlvbiggZXZlbnQsIGRhdGEsIGVsZW0sIG9ubHlIYW5kbGVycyApIHtcblx0XHR2YXIgaGFuZGxlLCBvbnR5cGUsIGN1cixcblx0XHRcdGJ1YmJsZVR5cGUsIHNwZWNpYWwsIHRtcCwgaSxcblx0XHRcdGV2ZW50UGF0aCA9IFsgZWxlbSB8fCBkb2N1bWVudCBdLFxuXHRcdFx0dHlwZSA9IGhhc093bi5jYWxsKCBldmVudCwgXCJ0eXBlXCIgKSA/IGV2ZW50LnR5cGUgOiBldmVudCxcblx0XHRcdG5hbWVzcGFjZXMgPSBoYXNPd24uY2FsbCggZXZlbnQsIFwibmFtZXNwYWNlXCIgKSA/IGV2ZW50Lm5hbWVzcGFjZS5zcGxpdCggXCIuXCIgKSA6IFtdO1xuXG5cdFx0Y3VyID0gdG1wID0gZWxlbSA9IGVsZW0gfHwgZG9jdW1lbnQ7XG5cblx0XHQvLyBEb24ndCBkbyBldmVudHMgb24gdGV4dCBhbmQgY29tbWVudCBub2Rlc1xuXHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMyB8fCBlbGVtLm5vZGVUeXBlID09PSA4ICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIGZvY3VzL2JsdXIgbW9ycGhzIHRvIGZvY3VzaW4vb3V0OyBlbnN1cmUgd2UncmUgbm90IGZpcmluZyB0aGVtIHJpZ2h0IG5vd1xuXHRcdGlmICggcmZvY3VzTW9ycGgudGVzdCggdHlwZSArIGpRdWVyeS5ldmVudC50cmlnZ2VyZWQgKSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoIHR5cGUuaW5kZXhPZiggXCIuXCIgKSA+IC0xICkge1xuXG5cdFx0XHQvLyBOYW1lc3BhY2VkIHRyaWdnZXI7IGNyZWF0ZSBhIHJlZ2V4cCB0byBtYXRjaCBldmVudCB0eXBlIGluIGhhbmRsZSgpXG5cdFx0XHRuYW1lc3BhY2VzID0gdHlwZS5zcGxpdCggXCIuXCIgKTtcblx0XHRcdHR5cGUgPSBuYW1lc3BhY2VzLnNoaWZ0KCk7XG5cdFx0XHRuYW1lc3BhY2VzLnNvcnQoKTtcblx0XHR9XG5cdFx0b250eXBlID0gdHlwZS5pbmRleE9mKCBcIjpcIiApIDwgMCAmJiBcIm9uXCIgKyB0eXBlO1xuXG5cdFx0Ly8gQ2FsbGVyIGNhbiBwYXNzIGluIGEgalF1ZXJ5LkV2ZW50IG9iamVjdCwgT2JqZWN0LCBvciBqdXN0IGFuIGV2ZW50IHR5cGUgc3RyaW5nXG5cdFx0ZXZlbnQgPSBldmVudFsgalF1ZXJ5LmV4cGFuZG8gXSA/XG5cdFx0XHRldmVudCA6XG5cdFx0XHRuZXcgalF1ZXJ5LkV2ZW50KCB0eXBlLCB0eXBlb2YgZXZlbnQgPT09IFwib2JqZWN0XCIgJiYgZXZlbnQgKTtcblxuXHRcdC8vIFRyaWdnZXIgYml0bWFzazogJiAxIGZvciBuYXRpdmUgaGFuZGxlcnM7ICYgMiBmb3IgalF1ZXJ5IChhbHdheXMgdHJ1ZSlcblx0XHRldmVudC5pc1RyaWdnZXIgPSBvbmx5SGFuZGxlcnMgPyAyIDogMztcblx0XHRldmVudC5uYW1lc3BhY2UgPSBuYW1lc3BhY2VzLmpvaW4oIFwiLlwiICk7XG5cdFx0ZXZlbnQucm5hbWVzcGFjZSA9IGV2ZW50Lm5hbWVzcGFjZSA/XG5cdFx0XHRuZXcgUmVnRXhwKCBcIihefFxcXFwuKVwiICsgbmFtZXNwYWNlcy5qb2luKCBcIlxcXFwuKD86LipcXFxcLnwpXCIgKSArIFwiKFxcXFwufCQpXCIgKSA6XG5cdFx0XHRudWxsO1xuXG5cdFx0Ly8gQ2xlYW4gdXAgdGhlIGV2ZW50IGluIGNhc2UgaXQgaXMgYmVpbmcgcmV1c2VkXG5cdFx0ZXZlbnQucmVzdWx0ID0gdW5kZWZpbmVkO1xuXHRcdGlmICggIWV2ZW50LnRhcmdldCApIHtcblx0XHRcdGV2ZW50LnRhcmdldCA9IGVsZW07XG5cdFx0fVxuXG5cdFx0Ly8gQ2xvbmUgYW55IGluY29taW5nIGRhdGEgYW5kIHByZXBlbmQgdGhlIGV2ZW50LCBjcmVhdGluZyB0aGUgaGFuZGxlciBhcmcgbGlzdFxuXHRcdGRhdGEgPSBkYXRhID09IG51bGwgP1xuXHRcdFx0WyBldmVudCBdIDpcblx0XHRcdGpRdWVyeS5tYWtlQXJyYXkoIGRhdGEsIFsgZXZlbnQgXSApO1xuXG5cdFx0Ly8gQWxsb3cgc3BlY2lhbCBldmVudHMgdG8gZHJhdyBvdXRzaWRlIHRoZSBsaW5lc1xuXHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9O1xuXHRcdGlmICggIW9ubHlIYW5kbGVycyAmJiBzcGVjaWFsLnRyaWdnZXIgJiYgc3BlY2lhbC50cmlnZ2VyLmFwcGx5KCBlbGVtLCBkYXRhICkgPT09IGZhbHNlICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIERldGVybWluZSBldmVudCBwcm9wYWdhdGlvbiBwYXRoIGluIGFkdmFuY2UsIHBlciBXM0MgZXZlbnRzIHNwZWMgKCM5OTUxKVxuXHRcdC8vIEJ1YmJsZSB1cCB0byBkb2N1bWVudCwgdGhlbiB0byB3aW5kb3c7IHdhdGNoIGZvciBhIGdsb2JhbCBvd25lckRvY3VtZW50IHZhciAoIzk3MjQpXG5cdFx0aWYgKCAhb25seUhhbmRsZXJzICYmICFzcGVjaWFsLm5vQnViYmxlICYmICFqUXVlcnkuaXNXaW5kb3coIGVsZW0gKSApIHtcblxuXHRcdFx0YnViYmxlVHlwZSA9IHNwZWNpYWwuZGVsZWdhdGVUeXBlIHx8IHR5cGU7XG5cdFx0XHRpZiAoICFyZm9jdXNNb3JwaC50ZXN0KCBidWJibGVUeXBlICsgdHlwZSApICkge1xuXHRcdFx0XHRjdXIgPSBjdXIucGFyZW50Tm9kZTtcblx0XHRcdH1cblx0XHRcdGZvciAoIDsgY3VyOyBjdXIgPSBjdXIucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0ZXZlbnRQYXRoLnB1c2goIGN1ciApO1xuXHRcdFx0XHR0bXAgPSBjdXI7XG5cdFx0XHR9XG5cblx0XHRcdC8vIE9ubHkgYWRkIHdpbmRvdyBpZiB3ZSBnb3QgdG8gZG9jdW1lbnQgKGUuZy4sIG5vdCBwbGFpbiBvYmogb3IgZGV0YWNoZWQgRE9NKVxuXHRcdFx0aWYgKCB0bXAgPT09ICggZWxlbS5vd25lckRvY3VtZW50IHx8IGRvY3VtZW50ICkgKSB7XG5cdFx0XHRcdGV2ZW50UGF0aC5wdXNoKCB0bXAuZGVmYXVsdFZpZXcgfHwgdG1wLnBhcmVudFdpbmRvdyB8fCB3aW5kb3cgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBGaXJlIGhhbmRsZXJzIG9uIHRoZSBldmVudCBwYXRoXG5cdFx0aSA9IDA7XG5cdFx0d2hpbGUgKCAoIGN1ciA9IGV2ZW50UGF0aFsgaSsrIF0gKSAmJiAhZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSApIHtcblxuXHRcdFx0ZXZlbnQudHlwZSA9IGkgPiAxID9cblx0XHRcdFx0YnViYmxlVHlwZSA6XG5cdFx0XHRcdHNwZWNpYWwuYmluZFR5cGUgfHwgdHlwZTtcblxuXHRcdFx0Ly8galF1ZXJ5IGhhbmRsZXJcblx0XHRcdGhhbmRsZSA9ICggalF1ZXJ5Ll9kYXRhKCBjdXIsIFwiZXZlbnRzXCIgKSB8fCB7fSApWyBldmVudC50eXBlIF0gJiZcblx0XHRcdFx0alF1ZXJ5Ll9kYXRhKCBjdXIsIFwiaGFuZGxlXCIgKTtcblxuXHRcdFx0aWYgKCBoYW5kbGUgKSB7XG5cdFx0XHRcdGhhbmRsZS5hcHBseSggY3VyLCBkYXRhICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIE5hdGl2ZSBoYW5kbGVyXG5cdFx0XHRoYW5kbGUgPSBvbnR5cGUgJiYgY3VyWyBvbnR5cGUgXTtcblx0XHRcdGlmICggaGFuZGxlICYmIGhhbmRsZS5hcHBseSAmJiBhY2NlcHREYXRhKCBjdXIgKSApIHtcblx0XHRcdFx0ZXZlbnQucmVzdWx0ID0gaGFuZGxlLmFwcGx5KCBjdXIsIGRhdGEgKTtcblx0XHRcdFx0aWYgKCBldmVudC5yZXN1bHQgPT09IGZhbHNlICkge1xuXHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0ZXZlbnQudHlwZSA9IHR5cGU7XG5cblx0XHQvLyBJZiBub2JvZHkgcHJldmVudGVkIHRoZSBkZWZhdWx0IGFjdGlvbiwgZG8gaXQgbm93XG5cdFx0aWYgKCAhb25seUhhbmRsZXJzICYmICFldmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSApIHtcblxuXHRcdFx0aWYgKFxuXHRcdFx0XHQoICFzcGVjaWFsLl9kZWZhdWx0IHx8XG5cdFx0XHRcdCBzcGVjaWFsLl9kZWZhdWx0LmFwcGx5KCBldmVudFBhdGgucG9wKCksIGRhdGEgKSA9PT0gZmFsc2Vcblx0XHRcdFx0KSAmJiBhY2NlcHREYXRhKCBlbGVtIClcblx0XHRcdCkge1xuXG5cdFx0XHRcdC8vIENhbGwgYSBuYXRpdmUgRE9NIG1ldGhvZCBvbiB0aGUgdGFyZ2V0IHdpdGggdGhlIHNhbWUgbmFtZSBuYW1lIGFzIHRoZSBldmVudC5cblx0XHRcdFx0Ly8gQ2FuJ3QgdXNlIGFuIC5pc0Z1bmN0aW9uKCkgY2hlY2sgaGVyZSBiZWNhdXNlIElFNi83IGZhaWxzIHRoYXQgdGVzdC5cblx0XHRcdFx0Ly8gRG9uJ3QgZG8gZGVmYXVsdCBhY3Rpb25zIG9uIHdpbmRvdywgdGhhdCdzIHdoZXJlIGdsb2JhbCB2YXJpYWJsZXMgYmUgKCM2MTcwKVxuXHRcdFx0XHRpZiAoIG9udHlwZSAmJiBlbGVtWyB0eXBlIF0gJiYgIWpRdWVyeS5pc1dpbmRvdyggZWxlbSApICkge1xuXG5cdFx0XHRcdFx0Ly8gRG9uJ3QgcmUtdHJpZ2dlciBhbiBvbkZPTyBldmVudCB3aGVuIHdlIGNhbGwgaXRzIEZPTygpIG1ldGhvZFxuXHRcdFx0XHRcdHRtcCA9IGVsZW1bIG9udHlwZSBdO1xuXG5cdFx0XHRcdFx0aWYgKCB0bXAgKSB7XG5cdFx0XHRcdFx0XHRlbGVtWyBvbnR5cGUgXSA9IG51bGw7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gUHJldmVudCByZS10cmlnZ2VyaW5nIG9mIHRoZSBzYW1lIGV2ZW50LCBzaW5jZSB3ZSBhbHJlYWR5IGJ1YmJsZWQgaXQgYWJvdmVcblx0XHRcdFx0XHRqUXVlcnkuZXZlbnQudHJpZ2dlcmVkID0gdHlwZTtcblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0ZWxlbVsgdHlwZSBdKCk7XG5cdFx0XHRcdFx0fSBjYXRjaCAoIGUgKSB7XG5cblx0XHRcdFx0XHRcdC8vIElFPDkgZGllcyBvbiBmb2N1cy9ibHVyIHRvIGhpZGRlbiBlbGVtZW50ICgjMTQ4NiwjMTI1MTgpXG5cdFx0XHRcdFx0XHQvLyBvbmx5IHJlcHJvZHVjaWJsZSBvbiB3aW5YUCBJRTggbmF0aXZlLCBub3QgSUU5IGluIElFOCBtb2RlXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyZWQgPSB1bmRlZmluZWQ7XG5cblx0XHRcdFx0XHRpZiAoIHRtcCApIHtcblx0XHRcdFx0XHRcdGVsZW1bIG9udHlwZSBdID0gdG1wO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBldmVudC5yZXN1bHQ7XG5cdH0sXG5cblx0ZGlzcGF0Y2g6IGZ1bmN0aW9uKCBldmVudCApIHtcblxuXHRcdC8vIE1ha2UgYSB3cml0YWJsZSBqUXVlcnkuRXZlbnQgZnJvbSB0aGUgbmF0aXZlIGV2ZW50IG9iamVjdFxuXHRcdGV2ZW50ID0galF1ZXJ5LmV2ZW50LmZpeCggZXZlbnQgKTtcblxuXHRcdHZhciBpLCBqLCByZXQsIG1hdGNoZWQsIGhhbmRsZU9iaixcblx0XHRcdGhhbmRsZXJRdWV1ZSA9IFtdLFxuXHRcdFx0YXJncyA9IHNsaWNlLmNhbGwoIGFyZ3VtZW50cyApLFxuXHRcdFx0aGFuZGxlcnMgPSAoIGpRdWVyeS5fZGF0YSggdGhpcywgXCJldmVudHNcIiApIHx8IHt9IClbIGV2ZW50LnR5cGUgXSB8fCBbXSxcblx0XHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgZXZlbnQudHlwZSBdIHx8IHt9O1xuXG5cdFx0Ly8gVXNlIHRoZSBmaXgtZWQgalF1ZXJ5LkV2ZW50IHJhdGhlciB0aGFuIHRoZSAocmVhZC1vbmx5KSBuYXRpdmUgZXZlbnRcblx0XHRhcmdzWyAwIF0gPSBldmVudDtcblx0XHRldmVudC5kZWxlZ2F0ZVRhcmdldCA9IHRoaXM7XG5cblx0XHQvLyBDYWxsIHRoZSBwcmVEaXNwYXRjaCBob29rIGZvciB0aGUgbWFwcGVkIHR5cGUsIGFuZCBsZXQgaXQgYmFpbCBpZiBkZXNpcmVkXG5cdFx0aWYgKCBzcGVjaWFsLnByZURpc3BhdGNoICYmIHNwZWNpYWwucHJlRGlzcGF0Y2guY2FsbCggdGhpcywgZXZlbnQgKSA9PT0gZmFsc2UgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gRGV0ZXJtaW5lIGhhbmRsZXJzXG5cdFx0aGFuZGxlclF1ZXVlID0galF1ZXJ5LmV2ZW50LmhhbmRsZXJzLmNhbGwoIHRoaXMsIGV2ZW50LCBoYW5kbGVycyApO1xuXG5cdFx0Ly8gUnVuIGRlbGVnYXRlcyBmaXJzdDsgdGhleSBtYXkgd2FudCB0byBzdG9wIHByb3BhZ2F0aW9uIGJlbmVhdGggdXNcblx0XHRpID0gMDtcblx0XHR3aGlsZSAoICggbWF0Y2hlZCA9IGhhbmRsZXJRdWV1ZVsgaSsrIF0gKSAmJiAhZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSApIHtcblx0XHRcdGV2ZW50LmN1cnJlbnRUYXJnZXQgPSBtYXRjaGVkLmVsZW07XG5cblx0XHRcdGogPSAwO1xuXHRcdFx0d2hpbGUgKCAoIGhhbmRsZU9iaiA9IG1hdGNoZWQuaGFuZGxlcnNbIGorKyBdICkgJiZcblx0XHRcdFx0IWV2ZW50LmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7XG5cblx0XHRcdFx0Ly8gVHJpZ2dlcmVkIGV2ZW50IG11c3QgZWl0aGVyIDEpIGhhdmUgbm8gbmFtZXNwYWNlLCBvciAyKSBoYXZlIG5hbWVzcGFjZShzKVxuXHRcdFx0XHQvLyBhIHN1YnNldCBvciBlcXVhbCB0byB0aG9zZSBpbiB0aGUgYm91bmQgZXZlbnQgKGJvdGggY2FuIGhhdmUgbm8gbmFtZXNwYWNlKS5cblx0XHRcdFx0aWYgKCAhZXZlbnQucm5hbWVzcGFjZSB8fCBldmVudC5ybmFtZXNwYWNlLnRlc3QoIGhhbmRsZU9iai5uYW1lc3BhY2UgKSApIHtcblxuXHRcdFx0XHRcdGV2ZW50LmhhbmRsZU9iaiA9IGhhbmRsZU9iajtcblx0XHRcdFx0XHRldmVudC5kYXRhID0gaGFuZGxlT2JqLmRhdGE7XG5cblx0XHRcdFx0XHRyZXQgPSAoICggalF1ZXJ5LmV2ZW50LnNwZWNpYWxbIGhhbmRsZU9iai5vcmlnVHlwZSBdIHx8IHt9ICkuaGFuZGxlIHx8XG5cdFx0XHRcdFx0XHRoYW5kbGVPYmouaGFuZGxlciApLmFwcGx5KCBtYXRjaGVkLmVsZW0sIGFyZ3MgKTtcblxuXHRcdFx0XHRcdGlmICggcmV0ICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0XHRpZiAoICggZXZlbnQucmVzdWx0ID0gcmV0ICkgPT09IGZhbHNlICkge1xuXHRcdFx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHRcdFx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBDYWxsIHRoZSBwb3N0RGlzcGF0Y2ggaG9vayBmb3IgdGhlIG1hcHBlZCB0eXBlXG5cdFx0aWYgKCBzcGVjaWFsLnBvc3REaXNwYXRjaCApIHtcblx0XHRcdHNwZWNpYWwucG9zdERpc3BhdGNoLmNhbGwoIHRoaXMsIGV2ZW50ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGV2ZW50LnJlc3VsdDtcblx0fSxcblxuXHRoYW5kbGVyczogZnVuY3Rpb24oIGV2ZW50LCBoYW5kbGVycyApIHtcblx0XHR2YXIgaSwgbWF0Y2hlcywgc2VsLCBoYW5kbGVPYmosXG5cdFx0XHRoYW5kbGVyUXVldWUgPSBbXSxcblx0XHRcdGRlbGVnYXRlQ291bnQgPSBoYW5kbGVycy5kZWxlZ2F0ZUNvdW50LFxuXHRcdFx0Y3VyID0gZXZlbnQudGFyZ2V0O1xuXG5cdFx0Ly8gU3VwcG9ydCAoYXQgbGVhc3QpOiBDaHJvbWUsIElFOVxuXHRcdC8vIEZpbmQgZGVsZWdhdGUgaGFuZGxlcnNcblx0XHQvLyBCbGFjay1ob2xlIFNWRyA8dXNlPiBpbnN0YW5jZSB0cmVlcyAoIzEzMTgwKVxuXHRcdC8vXG5cdFx0Ly8gU3VwcG9ydDogRmlyZWZveDw9NDIrXG5cdFx0Ly8gQXZvaWQgbm9uLWxlZnQtY2xpY2sgaW4gRkYgYnV0IGRvbid0IGJsb2NrIElFIHJhZGlvIGV2ZW50cyAoIzM4NjEsIGdoLTIzNDMpXG5cdFx0aWYgKCBkZWxlZ2F0ZUNvdW50ICYmIGN1ci5ub2RlVHlwZSAmJlxuXHRcdFx0KCBldmVudC50eXBlICE9PSBcImNsaWNrXCIgfHwgaXNOYU4oIGV2ZW50LmJ1dHRvbiApIHx8IGV2ZW50LmJ1dHRvbiA8IDEgKSApIHtcblxuXHRcdFx0LyoganNoaW50IGVxZXFlcTogZmFsc2UgKi9cblx0XHRcdGZvciAoIDsgY3VyICE9IHRoaXM7IGN1ciA9IGN1ci5wYXJlbnROb2RlIHx8IHRoaXMgKSB7XG5cdFx0XHRcdC8qIGpzaGludCBlcWVxZXE6IHRydWUgKi9cblxuXHRcdFx0XHQvLyBEb24ndCBjaGVjayBub24tZWxlbWVudHMgKCMxMzIwOClcblx0XHRcdFx0Ly8gRG9uJ3QgcHJvY2VzcyBjbGlja3Mgb24gZGlzYWJsZWQgZWxlbWVudHMgKCM2OTExLCAjODE2NSwgIzExMzgyLCAjMTE3NjQpXG5cdFx0XHRcdGlmICggY3VyLm5vZGVUeXBlID09PSAxICYmICggY3VyLmRpc2FibGVkICE9PSB0cnVlIHx8IGV2ZW50LnR5cGUgIT09IFwiY2xpY2tcIiApICkge1xuXHRcdFx0XHRcdG1hdGNoZXMgPSBbXTtcblx0XHRcdFx0XHRmb3IgKCBpID0gMDsgaSA8IGRlbGVnYXRlQ291bnQ7IGkrKyApIHtcblx0XHRcdFx0XHRcdGhhbmRsZU9iaiA9IGhhbmRsZXJzWyBpIF07XG5cblx0XHRcdFx0XHRcdC8vIERvbid0IGNvbmZsaWN0IHdpdGggT2JqZWN0LnByb3RvdHlwZSBwcm9wZXJ0aWVzICgjMTMyMDMpXG5cdFx0XHRcdFx0XHRzZWwgPSBoYW5kbGVPYmouc2VsZWN0b3IgKyBcIiBcIjtcblxuXHRcdFx0XHRcdFx0aWYgKCBtYXRjaGVzWyBzZWwgXSA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdFx0XHRtYXRjaGVzWyBzZWwgXSA9IGhhbmRsZU9iai5uZWVkc0NvbnRleHQgP1xuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeSggc2VsLCB0aGlzICkuaW5kZXgoIGN1ciApID4gLTEgOlxuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeS5maW5kKCBzZWwsIHRoaXMsIG51bGwsIFsgY3VyIF0gKS5sZW5ndGg7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAoIG1hdGNoZXNbIHNlbCBdICkge1xuXHRcdFx0XHRcdFx0XHRtYXRjaGVzLnB1c2goIGhhbmRsZU9iaiApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIG1hdGNoZXMubGVuZ3RoICkge1xuXHRcdFx0XHRcdFx0aGFuZGxlclF1ZXVlLnB1c2goIHsgZWxlbTogY3VyLCBoYW5kbGVyczogbWF0Y2hlcyB9ICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQWRkIHRoZSByZW1haW5pbmcgKGRpcmVjdGx5LWJvdW5kKSBoYW5kbGVyc1xuXHRcdGlmICggZGVsZWdhdGVDb3VudCA8IGhhbmRsZXJzLmxlbmd0aCApIHtcblx0XHRcdGhhbmRsZXJRdWV1ZS5wdXNoKCB7IGVsZW06IHRoaXMsIGhhbmRsZXJzOiBoYW5kbGVycy5zbGljZSggZGVsZWdhdGVDb3VudCApIH0gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gaGFuZGxlclF1ZXVlO1xuXHR9LFxuXG5cdGZpeDogZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdGlmICggZXZlbnRbIGpRdWVyeS5leHBhbmRvIF0gKSB7XG5cdFx0XHRyZXR1cm4gZXZlbnQ7XG5cdFx0fVxuXG5cdFx0Ly8gQ3JlYXRlIGEgd3JpdGFibGUgY29weSBvZiB0aGUgZXZlbnQgb2JqZWN0IGFuZCBub3JtYWxpemUgc29tZSBwcm9wZXJ0aWVzXG5cdFx0dmFyIGksIHByb3AsIGNvcHksXG5cdFx0XHR0eXBlID0gZXZlbnQudHlwZSxcblx0XHRcdG9yaWdpbmFsRXZlbnQgPSBldmVudCxcblx0XHRcdGZpeEhvb2sgPSB0aGlzLmZpeEhvb2tzWyB0eXBlIF07XG5cblx0XHRpZiAoICFmaXhIb29rICkge1xuXHRcdFx0dGhpcy5maXhIb29rc1sgdHlwZSBdID0gZml4SG9vayA9XG5cdFx0XHRcdHJtb3VzZUV2ZW50LnRlc3QoIHR5cGUgKSA/IHRoaXMubW91c2VIb29rcyA6XG5cdFx0XHRcdHJrZXlFdmVudC50ZXN0KCB0eXBlICkgPyB0aGlzLmtleUhvb2tzIDpcblx0XHRcdFx0e307XG5cdFx0fVxuXHRcdGNvcHkgPSBmaXhIb29rLnByb3BzID8gdGhpcy5wcm9wcy5jb25jYXQoIGZpeEhvb2sucHJvcHMgKSA6IHRoaXMucHJvcHM7XG5cblx0XHRldmVudCA9IG5ldyBqUXVlcnkuRXZlbnQoIG9yaWdpbmFsRXZlbnQgKTtcblxuXHRcdGkgPSBjb3B5Lmxlbmd0aDtcblx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdHByb3AgPSBjb3B5WyBpIF07XG5cdFx0XHRldmVudFsgcHJvcCBdID0gb3JpZ2luYWxFdmVudFsgcHJvcCBdO1xuXHRcdH1cblxuXHRcdC8vIFN1cHBvcnQ6IElFPDlcblx0XHQvLyBGaXggdGFyZ2V0IHByb3BlcnR5ICgjMTkyNSlcblx0XHRpZiAoICFldmVudC50YXJnZXQgKSB7XG5cdFx0XHRldmVudC50YXJnZXQgPSBvcmlnaW5hbEV2ZW50LnNyY0VsZW1lbnQgfHwgZG9jdW1lbnQ7XG5cdFx0fVxuXG5cdFx0Ly8gU3VwcG9ydDogU2FmYXJpIDYtOCtcblx0XHQvLyBUYXJnZXQgc2hvdWxkIG5vdCBiZSBhIHRleHQgbm9kZSAoIzUwNCwgIzEzMTQzKVxuXHRcdGlmICggZXZlbnQudGFyZ2V0Lm5vZGVUeXBlID09PSAzICkge1xuXHRcdFx0ZXZlbnQudGFyZ2V0ID0gZXZlbnQudGFyZ2V0LnBhcmVudE5vZGU7XG5cdFx0fVxuXG5cdFx0Ly8gU3VwcG9ydDogSUU8OVxuXHRcdC8vIEZvciBtb3VzZS9rZXkgZXZlbnRzLCBtZXRhS2V5PT1mYWxzZSBpZiBpdCdzIHVuZGVmaW5lZCAoIzMzNjgsICMxMTMyOClcblx0XHRldmVudC5tZXRhS2V5ID0gISFldmVudC5tZXRhS2V5O1xuXG5cdFx0cmV0dXJuIGZpeEhvb2suZmlsdGVyID8gZml4SG9vay5maWx0ZXIoIGV2ZW50LCBvcmlnaW5hbEV2ZW50ICkgOiBldmVudDtcblx0fSxcblxuXHQvLyBJbmNsdWRlcyBzb21lIGV2ZW50IHByb3BzIHNoYXJlZCBieSBLZXlFdmVudCBhbmQgTW91c2VFdmVudFxuXHRwcm9wczogKCBcImFsdEtleSBidWJibGVzIGNhbmNlbGFibGUgY3RybEtleSBjdXJyZW50VGFyZ2V0IGRldGFpbCBldmVudFBoYXNlIFwiICtcblx0XHRcIm1ldGFLZXkgcmVsYXRlZFRhcmdldCBzaGlmdEtleSB0YXJnZXQgdGltZVN0YW1wIHZpZXcgd2hpY2hcIiApLnNwbGl0KCBcIiBcIiApLFxuXG5cdGZpeEhvb2tzOiB7fSxcblxuXHRrZXlIb29rczoge1xuXHRcdHByb3BzOiBcImNoYXIgY2hhckNvZGUga2V5IGtleUNvZGVcIi5zcGxpdCggXCIgXCIgKSxcblx0XHRmaWx0ZXI6IGZ1bmN0aW9uKCBldmVudCwgb3JpZ2luYWwgKSB7XG5cblx0XHRcdC8vIEFkZCB3aGljaCBmb3Iga2V5IGV2ZW50c1xuXHRcdFx0aWYgKCBldmVudC53aGljaCA9PSBudWxsICkge1xuXHRcdFx0XHRldmVudC53aGljaCA9IG9yaWdpbmFsLmNoYXJDb2RlICE9IG51bGwgPyBvcmlnaW5hbC5jaGFyQ29kZSA6IG9yaWdpbmFsLmtleUNvZGU7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBldmVudDtcblx0XHR9XG5cdH0sXG5cblx0bW91c2VIb29rczoge1xuXHRcdHByb3BzOiAoIFwiYnV0dG9uIGJ1dHRvbnMgY2xpZW50WCBjbGllbnRZIGZyb21FbGVtZW50IG9mZnNldFggb2Zmc2V0WSBcIiArXG5cdFx0XHRcInBhZ2VYIHBhZ2VZIHNjcmVlblggc2NyZWVuWSB0b0VsZW1lbnRcIiApLnNwbGl0KCBcIiBcIiApLFxuXHRcdGZpbHRlcjogZnVuY3Rpb24oIGV2ZW50LCBvcmlnaW5hbCApIHtcblx0XHRcdHZhciBib2R5LCBldmVudERvYywgZG9jLFxuXHRcdFx0XHRidXR0b24gPSBvcmlnaW5hbC5idXR0b24sXG5cdFx0XHRcdGZyb21FbGVtZW50ID0gb3JpZ2luYWwuZnJvbUVsZW1lbnQ7XG5cblx0XHRcdC8vIENhbGN1bGF0ZSBwYWdlWC9ZIGlmIG1pc3NpbmcgYW5kIGNsaWVudFgvWSBhdmFpbGFibGVcblx0XHRcdGlmICggZXZlbnQucGFnZVggPT0gbnVsbCAmJiBvcmlnaW5hbC5jbGllbnRYICE9IG51bGwgKSB7XG5cdFx0XHRcdGV2ZW50RG9jID0gZXZlbnQudGFyZ2V0Lm93bmVyRG9jdW1lbnQgfHwgZG9jdW1lbnQ7XG5cdFx0XHRcdGRvYyA9IGV2ZW50RG9jLmRvY3VtZW50RWxlbWVudDtcblx0XHRcdFx0Ym9keSA9IGV2ZW50RG9jLmJvZHk7XG5cblx0XHRcdFx0ZXZlbnQucGFnZVggPSBvcmlnaW5hbC5jbGllbnRYICtcblx0XHRcdFx0XHQoIGRvYyAmJiBkb2Muc2Nyb2xsTGVmdCB8fCBib2R5ICYmIGJvZHkuc2Nyb2xsTGVmdCB8fCAwICkgLVxuXHRcdFx0XHRcdCggZG9jICYmIGRvYy5jbGllbnRMZWZ0IHx8IGJvZHkgJiYgYm9keS5jbGllbnRMZWZ0IHx8IDAgKTtcblx0XHRcdFx0ZXZlbnQucGFnZVkgPSBvcmlnaW5hbC5jbGllbnRZICtcblx0XHRcdFx0XHQoIGRvYyAmJiBkb2Muc2Nyb2xsVG9wICB8fCBib2R5ICYmIGJvZHkuc2Nyb2xsVG9wICB8fCAwICkgLVxuXHRcdFx0XHRcdCggZG9jICYmIGRvYy5jbGllbnRUb3AgIHx8IGJvZHkgJiYgYm9keS5jbGllbnRUb3AgIHx8IDAgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQWRkIHJlbGF0ZWRUYXJnZXQsIGlmIG5lY2Vzc2FyeVxuXHRcdFx0aWYgKCAhZXZlbnQucmVsYXRlZFRhcmdldCAmJiBmcm9tRWxlbWVudCApIHtcblx0XHRcdFx0ZXZlbnQucmVsYXRlZFRhcmdldCA9IGZyb21FbGVtZW50ID09PSBldmVudC50YXJnZXQgP1xuXHRcdFx0XHRcdG9yaWdpbmFsLnRvRWxlbWVudCA6XG5cdFx0XHRcdFx0ZnJvbUVsZW1lbnQ7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEFkZCB3aGljaCBmb3IgY2xpY2s6IDEgPT09IGxlZnQ7IDIgPT09IG1pZGRsZTsgMyA9PT0gcmlnaHRcblx0XHRcdC8vIE5vdGU6IGJ1dHRvbiBpcyBub3Qgbm9ybWFsaXplZCwgc28gZG9uJ3QgdXNlIGl0XG5cdFx0XHRpZiAoICFldmVudC53aGljaCAmJiBidXR0b24gIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0ZXZlbnQud2hpY2ggPSAoIGJ1dHRvbiAmIDEgPyAxIDogKCBidXR0b24gJiAyID8gMyA6ICggYnV0dG9uICYgNCA/IDIgOiAwICkgKSApO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZXZlbnQ7XG5cdFx0fVxuXHR9LFxuXG5cdHNwZWNpYWw6IHtcblx0XHRsb2FkOiB7XG5cblx0XHRcdC8vIFByZXZlbnQgdHJpZ2dlcmVkIGltYWdlLmxvYWQgZXZlbnRzIGZyb20gYnViYmxpbmcgdG8gd2luZG93LmxvYWRcblx0XHRcdG5vQnViYmxlOiB0cnVlXG5cdFx0fSxcblx0XHRmb2N1czoge1xuXG5cdFx0XHQvLyBGaXJlIG5hdGl2ZSBldmVudCBpZiBwb3NzaWJsZSBzbyBibHVyL2ZvY3VzIHNlcXVlbmNlIGlzIGNvcnJlY3Rcblx0XHRcdHRyaWdnZXI6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIHRoaXMgIT09IHNhZmVBY3RpdmVFbGVtZW50KCkgJiYgdGhpcy5mb2N1cyApIHtcblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0dGhpcy5mb2N1cygpO1xuXHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRcdH0gY2F0Y2ggKCBlICkge1xuXG5cdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRTw5XG5cdFx0XHRcdFx0XHQvLyBJZiB3ZSBlcnJvciBvbiBmb2N1cyB0byBoaWRkZW4gZWxlbWVudCAoIzE0ODYsICMxMjUxOCksXG5cdFx0XHRcdFx0XHQvLyBsZXQgLnRyaWdnZXIoKSBydW4gdGhlIGhhbmRsZXJzXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0ZGVsZWdhdGVUeXBlOiBcImZvY3VzaW5cIlxuXHRcdH0sXG5cdFx0Ymx1cjoge1xuXHRcdFx0dHJpZ2dlcjogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggdGhpcyA9PT0gc2FmZUFjdGl2ZUVsZW1lbnQoKSAmJiB0aGlzLmJsdXIgKSB7XG5cdFx0XHRcdFx0dGhpcy5ibHVyKCk7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0ZGVsZWdhdGVUeXBlOiBcImZvY3Vzb3V0XCJcblx0XHR9LFxuXHRcdGNsaWNrOiB7XG5cblx0XHRcdC8vIEZvciBjaGVja2JveCwgZmlyZSBuYXRpdmUgZXZlbnQgc28gY2hlY2tlZCBzdGF0ZSB3aWxsIGJlIHJpZ2h0XG5cdFx0XHR0cmlnZ2VyOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCBqUXVlcnkubm9kZU5hbWUoIHRoaXMsIFwiaW5wdXRcIiApICYmIHRoaXMudHlwZSA9PT0gXCJjaGVja2JveFwiICYmIHRoaXMuY2xpY2sgKSB7XG5cdFx0XHRcdFx0dGhpcy5jbGljaygpO1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fSxcblxuXHRcdFx0Ly8gRm9yIGNyb3NzLWJyb3dzZXIgY29uc2lzdGVuY3ksIGRvbid0IGZpcmUgbmF0aXZlIC5jbGljaygpIG9uIGxpbmtzXG5cdFx0XHRfZGVmYXVsdDogZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdFx0XHRyZXR1cm4galF1ZXJ5Lm5vZGVOYW1lKCBldmVudC50YXJnZXQsIFwiYVwiICk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdGJlZm9yZXVubG9hZDoge1xuXHRcdFx0cG9zdERpc3BhdGNoOiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogRmlyZWZveCAyMCtcblx0XHRcdFx0Ly8gRmlyZWZveCBkb2Vzbid0IGFsZXJ0IGlmIHRoZSByZXR1cm5WYWx1ZSBmaWVsZCBpcyBub3Qgc2V0LlxuXHRcdFx0XHRpZiAoIGV2ZW50LnJlc3VsdCAhPT0gdW5kZWZpbmVkICYmIGV2ZW50Lm9yaWdpbmFsRXZlbnQgKSB7XG5cdFx0XHRcdFx0ZXZlbnQub3JpZ2luYWxFdmVudC5yZXR1cm5WYWx1ZSA9IGV2ZW50LnJlc3VsdDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHQvLyBQaWdneWJhY2sgb24gYSBkb25vciBldmVudCB0byBzaW11bGF0ZSBhIGRpZmZlcmVudCBvbmVcblx0c2ltdWxhdGU6IGZ1bmN0aW9uKCB0eXBlLCBlbGVtLCBldmVudCApIHtcblx0XHR2YXIgZSA9IGpRdWVyeS5leHRlbmQoXG5cdFx0XHRuZXcgalF1ZXJ5LkV2ZW50KCksXG5cdFx0XHRldmVudCxcblx0XHRcdHtcblx0XHRcdFx0dHlwZTogdHlwZSxcblx0XHRcdFx0aXNTaW11bGF0ZWQ6IHRydWVcblxuXHRcdFx0XHQvLyBQcmV2aW91c2x5LCBgb3JpZ2luYWxFdmVudDoge31gIHdhcyBzZXQgaGVyZSwgc28gc3RvcFByb3BhZ2F0aW9uIGNhbGxcblx0XHRcdFx0Ly8gd291bGQgbm90IGJlIHRyaWdnZXJlZCBvbiBkb25vciBldmVudCwgc2luY2UgaW4gb3VyIG93blxuXHRcdFx0XHQvLyBqUXVlcnkuZXZlbnQuc3RvcFByb3BhZ2F0aW9uIGZ1bmN0aW9uIHdlIGhhZCBhIGNoZWNrIGZvciBleGlzdGVuY2Ugb2Zcblx0XHRcdFx0Ly8gb3JpZ2luYWxFdmVudC5zdG9wUHJvcGFnYXRpb24gbWV0aG9kLCBzbywgY29uc2VxdWVudGx5IGl0IHdvdWxkIGJlIGEgbm9vcC5cblx0XHRcdFx0Ly9cblx0XHRcdFx0Ly8gR3VhcmQgZm9yIHNpbXVsYXRlZCBldmVudHMgd2FzIG1vdmVkIHRvIGpRdWVyeS5ldmVudC5zdG9wUHJvcGFnYXRpb24gZnVuY3Rpb25cblx0XHRcdFx0Ly8gc2luY2UgYG9yaWdpbmFsRXZlbnRgIHNob3VsZCBwb2ludCB0byB0aGUgb3JpZ2luYWwgZXZlbnQgZm9yIHRoZVxuXHRcdFx0XHQvLyBjb25zdGFuY3kgd2l0aCBvdGhlciBldmVudHMgYW5kIGZvciBtb3JlIGZvY3VzZWQgbG9naWNcblx0XHRcdH1cblx0XHQpO1xuXG5cdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXIoIGUsIG51bGwsIGVsZW0gKTtcblxuXHRcdGlmICggZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSApIHtcblx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0fVxuXHR9XG59O1xuXG5qUXVlcnkucmVtb3ZlRXZlbnQgPSBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyID9cblx0ZnVuY3Rpb24oIGVsZW0sIHR5cGUsIGhhbmRsZSApIHtcblxuXHRcdC8vIFRoaXMgXCJpZlwiIGlzIG5lZWRlZCBmb3IgcGxhaW4gb2JqZWN0c1xuXHRcdGlmICggZWxlbS5yZW1vdmVFdmVudExpc3RlbmVyICkge1xuXHRcdFx0ZWxlbS5yZW1vdmVFdmVudExpc3RlbmVyKCB0eXBlLCBoYW5kbGUgKTtcblx0XHR9XG5cdH0gOlxuXHRmdW5jdGlvbiggZWxlbSwgdHlwZSwgaGFuZGxlICkge1xuXHRcdHZhciBuYW1lID0gXCJvblwiICsgdHlwZTtcblxuXHRcdGlmICggZWxlbS5kZXRhY2hFdmVudCApIHtcblxuXHRcdFx0Ly8gIzg1NDUsICM3MDU0LCBwcmV2ZW50aW5nIG1lbW9yeSBsZWFrcyBmb3IgY3VzdG9tIGV2ZW50cyBpbiBJRTYtOFxuXHRcdFx0Ly8gZGV0YWNoRXZlbnQgbmVlZGVkIHByb3BlcnR5IG9uIGVsZW1lbnQsIGJ5IG5hbWUgb2YgdGhhdCBldmVudCxcblx0XHRcdC8vIHRvIHByb3Blcmx5IGV4cG9zZSBpdCB0byBHQ1xuXHRcdFx0aWYgKCB0eXBlb2YgZWxlbVsgbmFtZSBdID09PSBcInVuZGVmaW5lZFwiICkge1xuXHRcdFx0XHRlbGVtWyBuYW1lIF0gPSBudWxsO1xuXHRcdFx0fVxuXG5cdFx0XHRlbGVtLmRldGFjaEV2ZW50KCBuYW1lLCBoYW5kbGUgKTtcblx0XHR9XG5cdH07XG5cbmpRdWVyeS5FdmVudCA9IGZ1bmN0aW9uKCBzcmMsIHByb3BzICkge1xuXG5cdC8vIEFsbG93IGluc3RhbnRpYXRpb24gd2l0aG91dCB0aGUgJ25ldycga2V5d29yZFxuXHRpZiAoICEoIHRoaXMgaW5zdGFuY2VvZiBqUXVlcnkuRXZlbnQgKSApIHtcblx0XHRyZXR1cm4gbmV3IGpRdWVyeS5FdmVudCggc3JjLCBwcm9wcyApO1xuXHR9XG5cblx0Ly8gRXZlbnQgb2JqZWN0XG5cdGlmICggc3JjICYmIHNyYy50eXBlICkge1xuXHRcdHRoaXMub3JpZ2luYWxFdmVudCA9IHNyYztcblx0XHR0aGlzLnR5cGUgPSBzcmMudHlwZTtcblxuXHRcdC8vIEV2ZW50cyBidWJibGluZyB1cCB0aGUgZG9jdW1lbnQgbWF5IGhhdmUgYmVlbiBtYXJrZWQgYXMgcHJldmVudGVkXG5cdFx0Ly8gYnkgYSBoYW5kbGVyIGxvd2VyIGRvd24gdGhlIHRyZWU7IHJlZmxlY3QgdGhlIGNvcnJlY3QgdmFsdWUuXG5cdFx0dGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQgPSBzcmMuZGVmYXVsdFByZXZlbnRlZCB8fFxuXHRcdFx0XHRzcmMuZGVmYXVsdFByZXZlbnRlZCA9PT0gdW5kZWZpbmVkICYmXG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPCA5LCBBbmRyb2lkIDwgNC4wXG5cdFx0XHRcdHNyYy5yZXR1cm5WYWx1ZSA9PT0gZmFsc2UgP1xuXHRcdFx0cmV0dXJuVHJ1ZSA6XG5cdFx0XHRyZXR1cm5GYWxzZTtcblxuXHQvLyBFdmVudCB0eXBlXG5cdH0gZWxzZSB7XG5cdFx0dGhpcy50eXBlID0gc3JjO1xuXHR9XG5cblx0Ly8gUHV0IGV4cGxpY2l0bHkgcHJvdmlkZWQgcHJvcGVydGllcyBvbnRvIHRoZSBldmVudCBvYmplY3Rcblx0aWYgKCBwcm9wcyApIHtcblx0XHRqUXVlcnkuZXh0ZW5kKCB0aGlzLCBwcm9wcyApO1xuXHR9XG5cblx0Ly8gQ3JlYXRlIGEgdGltZXN0YW1wIGlmIGluY29taW5nIGV2ZW50IGRvZXNuJ3QgaGF2ZSBvbmVcblx0dGhpcy50aW1lU3RhbXAgPSBzcmMgJiYgc3JjLnRpbWVTdGFtcCB8fCBqUXVlcnkubm93KCk7XG5cblx0Ly8gTWFyayBpdCBhcyBmaXhlZFxuXHR0aGlzWyBqUXVlcnkuZXhwYW5kbyBdID0gdHJ1ZTtcbn07XG5cbi8vIGpRdWVyeS5FdmVudCBpcyBiYXNlZCBvbiBET00zIEV2ZW50cyBhcyBzcGVjaWZpZWQgYnkgdGhlIEVDTUFTY3JpcHQgTGFuZ3VhZ2UgQmluZGluZ1xuLy8gaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMy9XRC1ET00tTGV2ZWwtMy1FdmVudHMtMjAwMzAzMzEvZWNtYS1zY3JpcHQtYmluZGluZy5odG1sXG5qUXVlcnkuRXZlbnQucHJvdG90eXBlID0ge1xuXHRjb25zdHJ1Y3RvcjogalF1ZXJ5LkV2ZW50LFxuXHRpc0RlZmF1bHRQcmV2ZW50ZWQ6IHJldHVybkZhbHNlLFxuXHRpc1Byb3BhZ2F0aW9uU3RvcHBlZDogcmV0dXJuRmFsc2UsXG5cdGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOiByZXR1cm5GYWxzZSxcblxuXHRwcmV2ZW50RGVmYXVsdDogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7XG5cblx0XHR0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IHJldHVyblRydWU7XG5cdFx0aWYgKCAhZSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBJZiBwcmV2ZW50RGVmYXVsdCBleGlzdHMsIHJ1biBpdCBvbiB0aGUgb3JpZ2luYWwgZXZlbnRcblx0XHRpZiAoIGUucHJldmVudERlZmF1bHQgKSB7XG5cdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XG5cblx0XHQvLyBTdXBwb3J0OiBJRVxuXHRcdC8vIE90aGVyd2lzZSBzZXQgdGhlIHJldHVyblZhbHVlIHByb3BlcnR5IG9mIHRoZSBvcmlnaW5hbCBldmVudCB0byBmYWxzZVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRlLnJldHVyblZhbHVlID0gZmFsc2U7XG5cdFx0fVxuXHR9LFxuXHRzdG9wUHJvcGFnYXRpb246IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBlID0gdGhpcy5vcmlnaW5hbEV2ZW50O1xuXG5cdFx0dGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZCA9IHJldHVyblRydWU7XG5cblx0XHRpZiAoICFlIHx8IHRoaXMuaXNTaW11bGF0ZWQgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gSWYgc3RvcFByb3BhZ2F0aW9uIGV4aXN0cywgcnVuIGl0IG9uIHRoZSBvcmlnaW5hbCBldmVudFxuXHRcdGlmICggZS5zdG9wUHJvcGFnYXRpb24gKSB7XG5cdFx0XHRlLnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdH1cblxuXHRcdC8vIFN1cHBvcnQ6IElFXG5cdFx0Ly8gU2V0IHRoZSBjYW5jZWxCdWJibGUgcHJvcGVydHkgb2YgdGhlIG9yaWdpbmFsIGV2ZW50IHRvIHRydWVcblx0XHRlLmNhbmNlbEJ1YmJsZSA9IHRydWU7XG5cdH0sXG5cdHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7XG5cblx0XHR0aGlzLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkID0gcmV0dXJuVHJ1ZTtcblxuXHRcdGlmICggZSAmJiBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiApIHtcblx0XHRcdGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG5cdFx0fVxuXG5cdFx0dGhpcy5zdG9wUHJvcGFnYXRpb24oKTtcblx0fVxufTtcblxuLy8gQ3JlYXRlIG1vdXNlZW50ZXIvbGVhdmUgZXZlbnRzIHVzaW5nIG1vdXNlb3Zlci9vdXQgYW5kIGV2ZW50LXRpbWUgY2hlY2tzXG4vLyBzbyB0aGF0IGV2ZW50IGRlbGVnYXRpb24gd29ya3MgaW4galF1ZXJ5LlxuLy8gRG8gdGhlIHNhbWUgZm9yIHBvaW50ZXJlbnRlci9wb2ludGVybGVhdmUgYW5kIHBvaW50ZXJvdmVyL3BvaW50ZXJvdXRcbi8vXG4vLyBTdXBwb3J0OiBTYWZhcmkgNyBvbmx5XG4vLyBTYWZhcmkgc2VuZHMgbW91c2VlbnRlciB0b28gb2Z0ZW47IHNlZTpcbi8vIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD00NzAyNThcbi8vIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIGJ1ZyAoaXQgZXhpc3RlZCBpbiBvbGRlciBDaHJvbWUgdmVyc2lvbnMgYXMgd2VsbCkuXG5qUXVlcnkuZWFjaCgge1xuXHRtb3VzZWVudGVyOiBcIm1vdXNlb3ZlclwiLFxuXHRtb3VzZWxlYXZlOiBcIm1vdXNlb3V0XCIsXG5cdHBvaW50ZXJlbnRlcjogXCJwb2ludGVyb3ZlclwiLFxuXHRwb2ludGVybGVhdmU6IFwicG9pbnRlcm91dFwiXG59LCBmdW5jdGlvbiggb3JpZywgZml4ICkge1xuXHRqUXVlcnkuZXZlbnQuc3BlY2lhbFsgb3JpZyBdID0ge1xuXHRcdGRlbGVnYXRlVHlwZTogZml4LFxuXHRcdGJpbmRUeXBlOiBmaXgsXG5cblx0XHRoYW5kbGU6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRcdHZhciByZXQsXG5cdFx0XHRcdHRhcmdldCA9IHRoaXMsXG5cdFx0XHRcdHJlbGF0ZWQgPSBldmVudC5yZWxhdGVkVGFyZ2V0LFxuXHRcdFx0XHRoYW5kbGVPYmogPSBldmVudC5oYW5kbGVPYmo7XG5cblx0XHRcdC8vIEZvciBtb3VzZWVudGVyL2xlYXZlIGNhbGwgdGhlIGhhbmRsZXIgaWYgcmVsYXRlZCBpcyBvdXRzaWRlIHRoZSB0YXJnZXQuXG5cdFx0XHQvLyBOQjogTm8gcmVsYXRlZFRhcmdldCBpZiB0aGUgbW91c2UgbGVmdC9lbnRlcmVkIHRoZSBicm93c2VyIHdpbmRvd1xuXHRcdFx0aWYgKCAhcmVsYXRlZCB8fCAoIHJlbGF0ZWQgIT09IHRhcmdldCAmJiAhalF1ZXJ5LmNvbnRhaW5zKCB0YXJnZXQsIHJlbGF0ZWQgKSApICkge1xuXHRcdFx0XHRldmVudC50eXBlID0gaGFuZGxlT2JqLm9yaWdUeXBlO1xuXHRcdFx0XHRyZXQgPSBoYW5kbGVPYmouaGFuZGxlci5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0XHRcdGV2ZW50LnR5cGUgPSBmaXg7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH1cblx0fTtcbn0gKTtcblxuLy8gSUUgc3VibWl0IGRlbGVnYXRpb25cbmlmICggIXN1cHBvcnQuc3VibWl0ICkge1xuXG5cdGpRdWVyeS5ldmVudC5zcGVjaWFsLnN1Ym1pdCA9IHtcblx0XHRzZXR1cDogZnVuY3Rpb24oKSB7XG5cblx0XHRcdC8vIE9ubHkgbmVlZCB0aGlzIGZvciBkZWxlZ2F0ZWQgZm9ybSBzdWJtaXQgZXZlbnRzXG5cdFx0XHRpZiAoIGpRdWVyeS5ub2RlTmFtZSggdGhpcywgXCJmb3JtXCIgKSApIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBMYXp5LWFkZCBhIHN1Ym1pdCBoYW5kbGVyIHdoZW4gYSBkZXNjZW5kYW50IGZvcm0gbWF5IHBvdGVudGlhbGx5IGJlIHN1Ym1pdHRlZFxuXHRcdFx0alF1ZXJ5LmV2ZW50LmFkZCggdGhpcywgXCJjbGljay5fc3VibWl0IGtleXByZXNzLl9zdWJtaXRcIiwgZnVuY3Rpb24oIGUgKSB7XG5cblx0XHRcdFx0Ly8gTm9kZSBuYW1lIGNoZWNrIGF2b2lkcyBhIFZNTC1yZWxhdGVkIGNyYXNoIGluIElFICgjOTgwNylcblx0XHRcdFx0dmFyIGVsZW0gPSBlLnRhcmdldCxcblx0XHRcdFx0XHRmb3JtID0galF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCBcImlucHV0XCIgKSB8fCBqUXVlcnkubm9kZU5hbWUoIGVsZW0sIFwiYnV0dG9uXCIgKSA/XG5cblx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw9OFxuXHRcdFx0XHRcdFx0Ly8gV2UgdXNlIGpRdWVyeS5wcm9wIGluc3RlYWQgb2YgZWxlbS5mb3JtXG5cdFx0XHRcdFx0XHQvLyB0byBhbGxvdyBmaXhpbmcgdGhlIElFOCBkZWxlZ2F0ZWQgc3VibWl0IGlzc3VlIChnaC0yMzMyKVxuXHRcdFx0XHRcdFx0Ly8gYnkgM3JkIHBhcnR5IHBvbHlmaWxscy93b3JrYXJvdW5kcy5cblx0XHRcdFx0XHRcdGpRdWVyeS5wcm9wKCBlbGVtLCBcImZvcm1cIiApIDpcblx0XHRcdFx0XHRcdHVuZGVmaW5lZDtcblxuXHRcdFx0XHRpZiAoIGZvcm0gJiYgIWpRdWVyeS5fZGF0YSggZm9ybSwgXCJzdWJtaXRcIiApICkge1xuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC5hZGQoIGZvcm0sIFwic3VibWl0Ll9zdWJtaXRcIiwgZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdFx0XHRcdFx0ZXZlbnQuX3N1Ym1pdEJ1YmJsZSA9IHRydWU7XG5cdFx0XHRcdFx0fSApO1xuXHRcdFx0XHRcdGpRdWVyeS5fZGF0YSggZm9ybSwgXCJzdWJtaXRcIiwgdHJ1ZSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9ICk7XG5cblx0XHRcdC8vIHJldHVybiB1bmRlZmluZWQgc2luY2Ugd2UgZG9uJ3QgbmVlZCBhbiBldmVudCBsaXN0ZW5lclxuXHRcdH0sXG5cblx0XHRwb3N0RGlzcGF0Y2g6IGZ1bmN0aW9uKCBldmVudCApIHtcblxuXHRcdFx0Ly8gSWYgZm9ybSB3YXMgc3VibWl0dGVkIGJ5IHRoZSB1c2VyLCBidWJibGUgdGhlIGV2ZW50IHVwIHRoZSB0cmVlXG5cdFx0XHRpZiAoIGV2ZW50Ll9zdWJtaXRCdWJibGUgKSB7XG5cdFx0XHRcdGRlbGV0ZSBldmVudC5fc3VibWl0QnViYmxlO1xuXHRcdFx0XHRpZiAoIHRoaXMucGFyZW50Tm9kZSAmJiAhZXZlbnQuaXNUcmlnZ2VyICkge1xuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC5zaW11bGF0ZSggXCJzdWJtaXRcIiwgdGhpcy5wYXJlbnROb2RlLCBldmVudCApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdHRlYXJkb3duOiBmdW5jdGlvbigpIHtcblxuXHRcdFx0Ly8gT25seSBuZWVkIHRoaXMgZm9yIGRlbGVnYXRlZCBmb3JtIHN1Ym1pdCBldmVudHNcblx0XHRcdGlmICggalF1ZXJ5Lm5vZGVOYW1lKCB0aGlzLCBcImZvcm1cIiApICkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFJlbW92ZSBkZWxlZ2F0ZWQgaGFuZGxlcnM7IGNsZWFuRGF0YSBldmVudHVhbGx5IHJlYXBzIHN1Ym1pdCBoYW5kbGVycyBhdHRhY2hlZCBhYm92ZVxuXHRcdFx0alF1ZXJ5LmV2ZW50LnJlbW92ZSggdGhpcywgXCIuX3N1Ym1pdFwiICk7XG5cdFx0fVxuXHR9O1xufVxuXG4vLyBJRSBjaGFuZ2UgZGVsZWdhdGlvbiBhbmQgY2hlY2tib3gvcmFkaW8gZml4XG5pZiAoICFzdXBwb3J0LmNoYW5nZSApIHtcblxuXHRqUXVlcnkuZXZlbnQuc3BlY2lhbC5jaGFuZ2UgPSB7XG5cblx0XHRzZXR1cDogZnVuY3Rpb24oKSB7XG5cblx0XHRcdGlmICggcmZvcm1FbGVtcy50ZXN0KCB0aGlzLm5vZGVOYW1lICkgKSB7XG5cblx0XHRcdFx0Ly8gSUUgZG9lc24ndCBmaXJlIGNoYW5nZSBvbiBhIGNoZWNrL3JhZGlvIHVudGlsIGJsdXI7IHRyaWdnZXIgaXQgb24gY2xpY2tcblx0XHRcdFx0Ly8gYWZ0ZXIgYSBwcm9wZXJ0eWNoYW5nZS4gRWF0IHRoZSBibHVyLWNoYW5nZSBpbiBzcGVjaWFsLmNoYW5nZS5oYW5kbGUuXG5cdFx0XHRcdC8vIFRoaXMgc3RpbGwgZmlyZXMgb25jaGFuZ2UgYSBzZWNvbmQgdGltZSBmb3IgY2hlY2svcmFkaW8gYWZ0ZXIgYmx1ci5cblx0XHRcdFx0aWYgKCB0aGlzLnR5cGUgPT09IFwiY2hlY2tib3hcIiB8fCB0aGlzLnR5cGUgPT09IFwicmFkaW9cIiApIHtcblx0XHRcdFx0XHRqUXVlcnkuZXZlbnQuYWRkKCB0aGlzLCBcInByb3BlcnR5Y2hhbmdlLl9jaGFuZ2VcIiwgZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdFx0XHRcdFx0aWYgKCBldmVudC5vcmlnaW5hbEV2ZW50LnByb3BlcnR5TmFtZSA9PT0gXCJjaGVja2VkXCIgKSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMuX2p1c3RDaGFuZ2VkID0gdHJ1ZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9ICk7XG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LmFkZCggdGhpcywgXCJjbGljay5fY2hhbmdlXCIsIGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRcdFx0XHRcdGlmICggdGhpcy5fanVzdENoYW5nZWQgJiYgIWV2ZW50LmlzVHJpZ2dlciApIHtcblx0XHRcdFx0XHRcdFx0dGhpcy5fanVzdENoYW5nZWQgPSBmYWxzZTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Ly8gQWxsb3cgdHJpZ2dlcmVkLCBzaW11bGF0ZWQgY2hhbmdlIGV2ZW50cyAoIzExNTAwKVxuXHRcdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LnNpbXVsYXRlKCBcImNoYW5nZVwiLCB0aGlzLCBldmVudCApO1xuXHRcdFx0XHRcdH0gKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cblx0XHRcdC8vIERlbGVnYXRlZCBldmVudDsgbGF6eS1hZGQgYSBjaGFuZ2UgaGFuZGxlciBvbiBkZXNjZW5kYW50IGlucHV0c1xuXHRcdFx0alF1ZXJ5LmV2ZW50LmFkZCggdGhpcywgXCJiZWZvcmVhY3RpdmF0ZS5fY2hhbmdlXCIsIGZ1bmN0aW9uKCBlICkge1xuXHRcdFx0XHR2YXIgZWxlbSA9IGUudGFyZ2V0O1xuXG5cdFx0XHRcdGlmICggcmZvcm1FbGVtcy50ZXN0KCBlbGVtLm5vZGVOYW1lICkgJiYgIWpRdWVyeS5fZGF0YSggZWxlbSwgXCJjaGFuZ2VcIiApICkge1xuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC5hZGQoIGVsZW0sIFwiY2hhbmdlLl9jaGFuZ2VcIiwgZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdFx0XHRcdFx0aWYgKCB0aGlzLnBhcmVudE5vZGUgJiYgIWV2ZW50LmlzU2ltdWxhdGVkICYmICFldmVudC5pc1RyaWdnZXIgKSB7XG5cdFx0XHRcdFx0XHRcdGpRdWVyeS5ldmVudC5zaW11bGF0ZSggXCJjaGFuZ2VcIiwgdGhpcy5wYXJlbnROb2RlLCBldmVudCApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gKTtcblx0XHRcdFx0XHRqUXVlcnkuX2RhdGEoIGVsZW0sIFwiY2hhbmdlXCIsIHRydWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0fSApO1xuXHRcdH0sXG5cblx0XHRoYW5kbGU6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRcdHZhciBlbGVtID0gZXZlbnQudGFyZ2V0O1xuXG5cdFx0XHQvLyBTd2FsbG93IG5hdGl2ZSBjaGFuZ2UgZXZlbnRzIGZyb20gY2hlY2tib3gvcmFkaW8sIHdlIGFscmVhZHkgdHJpZ2dlcmVkIHRoZW0gYWJvdmVcblx0XHRcdGlmICggdGhpcyAhPT0gZWxlbSB8fCBldmVudC5pc1NpbXVsYXRlZCB8fCBldmVudC5pc1RyaWdnZXIgfHxcblx0XHRcdFx0KCBlbGVtLnR5cGUgIT09IFwicmFkaW9cIiAmJiBlbGVtLnR5cGUgIT09IFwiY2hlY2tib3hcIiApICkge1xuXG5cdFx0XHRcdHJldHVybiBldmVudC5oYW5kbGVPYmouaGFuZGxlci5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdHRlYXJkb3duOiBmdW5jdGlvbigpIHtcblx0XHRcdGpRdWVyeS5ldmVudC5yZW1vdmUoIHRoaXMsIFwiLl9jaGFuZ2VcIiApO1xuXG5cdFx0XHRyZXR1cm4gIXJmb3JtRWxlbXMudGVzdCggdGhpcy5ub2RlTmFtZSApO1xuXHRcdH1cblx0fTtcbn1cblxuLy8gU3VwcG9ydDogRmlyZWZveFxuLy8gRmlyZWZveCBkb2Vzbid0IGhhdmUgZm9jdXMoaW4gfCBvdXQpIGV2ZW50c1xuLy8gUmVsYXRlZCB0aWNrZXQgLSBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD02ODc3ODdcbi8vXG4vLyBTdXBwb3J0OiBDaHJvbWUsIFNhZmFyaVxuLy8gZm9jdXMoaW4gfCBvdXQpIGV2ZW50cyBmaXJlIGFmdGVyIGZvY3VzICYgYmx1ciBldmVudHMsXG4vLyB3aGljaCBpcyBzcGVjIHZpb2xhdGlvbiAtIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy8jZXZlbnRzLWZvY3VzZXZlbnQtZXZlbnQtb3JkZXJcbi8vIFJlbGF0ZWQgdGlja2V0IC0gaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTQ0OTg1N1xuaWYgKCAhc3VwcG9ydC5mb2N1c2luICkge1xuXHRqUXVlcnkuZWFjaCggeyBmb2N1czogXCJmb2N1c2luXCIsIGJsdXI6IFwiZm9jdXNvdXRcIiB9LCBmdW5jdGlvbiggb3JpZywgZml4ICkge1xuXG5cdFx0Ly8gQXR0YWNoIGEgc2luZ2xlIGNhcHR1cmluZyBoYW5kbGVyIG9uIHRoZSBkb2N1bWVudCB3aGlsZSBzb21lb25lIHdhbnRzIGZvY3VzaW4vZm9jdXNvdXRcblx0XHR2YXIgaGFuZGxlciA9IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRcdGpRdWVyeS5ldmVudC5zaW11bGF0ZSggZml4LCBldmVudC50YXJnZXQsIGpRdWVyeS5ldmVudC5maXgoIGV2ZW50ICkgKTtcblx0XHR9O1xuXG5cdFx0alF1ZXJ5LmV2ZW50LnNwZWNpYWxbIGZpeCBdID0ge1xuXHRcdFx0c2V0dXA6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgZG9jID0gdGhpcy5vd25lckRvY3VtZW50IHx8IHRoaXMsXG5cdFx0XHRcdFx0YXR0YWNoZXMgPSBqUXVlcnkuX2RhdGEoIGRvYywgZml4ICk7XG5cblx0XHRcdFx0aWYgKCAhYXR0YWNoZXMgKSB7XG5cdFx0XHRcdFx0ZG9jLmFkZEV2ZW50TGlzdGVuZXIoIG9yaWcsIGhhbmRsZXIsIHRydWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRqUXVlcnkuX2RhdGEoIGRvYywgZml4LCAoIGF0dGFjaGVzIHx8IDAgKSArIDEgKTtcblx0XHRcdH0sXG5cdFx0XHR0ZWFyZG93bjogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBkb2MgPSB0aGlzLm93bmVyRG9jdW1lbnQgfHwgdGhpcyxcblx0XHRcdFx0XHRhdHRhY2hlcyA9IGpRdWVyeS5fZGF0YSggZG9jLCBmaXggKSAtIDE7XG5cblx0XHRcdFx0aWYgKCAhYXR0YWNoZXMgKSB7XG5cdFx0XHRcdFx0ZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoIG9yaWcsIGhhbmRsZXIsIHRydWUgKTtcblx0XHRcdFx0XHRqUXVlcnkuX3JlbW92ZURhdGEoIGRvYywgZml4ICk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0alF1ZXJ5Ll9kYXRhKCBkb2MsIGZpeCwgYXR0YWNoZXMgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cdH0gKTtcbn1cblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXG5cdG9uOiBmdW5jdGlvbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApIHtcblx0XHRyZXR1cm4gb24oIHRoaXMsIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4gKTtcblx0fSxcblx0b25lOiBmdW5jdGlvbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApIHtcblx0XHRyZXR1cm4gb24oIHRoaXMsIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4sIDEgKTtcblx0fSxcblx0b2ZmOiBmdW5jdGlvbiggdHlwZXMsIHNlbGVjdG9yLCBmbiApIHtcblx0XHR2YXIgaGFuZGxlT2JqLCB0eXBlO1xuXHRcdGlmICggdHlwZXMgJiYgdHlwZXMucHJldmVudERlZmF1bHQgJiYgdHlwZXMuaGFuZGxlT2JqICkge1xuXG5cdFx0XHQvLyAoIGV2ZW50ICkgIGRpc3BhdGNoZWQgalF1ZXJ5LkV2ZW50XG5cdFx0XHRoYW5kbGVPYmogPSB0eXBlcy5oYW5kbGVPYmo7XG5cdFx0XHRqUXVlcnkoIHR5cGVzLmRlbGVnYXRlVGFyZ2V0ICkub2ZmKFxuXHRcdFx0XHRoYW5kbGVPYmoubmFtZXNwYWNlID9cblx0XHRcdFx0XHRoYW5kbGVPYmoub3JpZ1R5cGUgKyBcIi5cIiArIGhhbmRsZU9iai5uYW1lc3BhY2UgOlxuXHRcdFx0XHRcdGhhbmRsZU9iai5vcmlnVHlwZSxcblx0XHRcdFx0aGFuZGxlT2JqLnNlbGVjdG9yLFxuXHRcdFx0XHRoYW5kbGVPYmouaGFuZGxlclxuXHRcdFx0KTtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblx0XHRpZiAoIHR5cGVvZiB0eXBlcyA9PT0gXCJvYmplY3RcIiApIHtcblxuXHRcdFx0Ly8gKCB0eXBlcy1vYmplY3QgWywgc2VsZWN0b3JdIClcblx0XHRcdGZvciAoIHR5cGUgaW4gdHlwZXMgKSB7XG5cdFx0XHRcdHRoaXMub2ZmKCB0eXBlLCBzZWxlY3RvciwgdHlwZXNbIHR5cGUgXSApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXHRcdGlmICggc2VsZWN0b3IgPT09IGZhbHNlIHx8IHR5cGVvZiBzZWxlY3RvciA9PT0gXCJmdW5jdGlvblwiICkge1xuXG5cdFx0XHQvLyAoIHR5cGVzIFssIGZuXSApXG5cdFx0XHRmbiA9IHNlbGVjdG9yO1xuXHRcdFx0c2VsZWN0b3IgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdGlmICggZm4gPT09IGZhbHNlICkge1xuXHRcdFx0Zm4gPSByZXR1cm5GYWxzZTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRqUXVlcnkuZXZlbnQucmVtb3ZlKCB0aGlzLCB0eXBlcywgZm4sIHNlbGVjdG9yICk7XG5cdFx0fSApO1xuXHR9LFxuXG5cdHRyaWdnZXI6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhICkge1xuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXIoIHR5cGUsIGRhdGEsIHRoaXMgKTtcblx0XHR9ICk7XG5cdH0sXG5cdHRyaWdnZXJIYW5kbGVyOiBmdW5jdGlvbiggdHlwZSwgZGF0YSApIHtcblx0XHR2YXIgZWxlbSA9IHRoaXNbIDAgXTtcblx0XHRpZiAoIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4galF1ZXJ5LmV2ZW50LnRyaWdnZXIoIHR5cGUsIGRhdGEsIGVsZW0sIHRydWUgKTtcblx0XHR9XG5cdH1cbn0gKTtcblxuXG52YXIgcmlubGluZWpRdWVyeSA9IC8galF1ZXJ5XFxkKz1cIig/Om51bGx8XFxkKylcIi9nLFxuXHRybm9zaGltY2FjaGUgPSBuZXcgUmVnRXhwKCBcIjwoPzpcIiArIG5vZGVOYW1lcyArIFwiKVtcXFxccy8+XVwiLCBcImlcIiApLFxuXHRyeGh0bWxUYWcgPSAvPCg/IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbXFx3Oi1dKylbXj5dKilcXC8+L2dpLFxuXG5cdC8vIFN1cHBvcnQ6IElFIDEwLTExLCBFZGdlIDEwMjQwK1xuXHQvLyBJbiBJRS9FZGdlIHVzaW5nIHJlZ2V4IGdyb3VwcyBoZXJlIGNhdXNlcyBzZXZlcmUgc2xvd2Rvd25zLlxuXHQvLyBTZWUgaHR0cHM6Ly9jb25uZWN0Lm1pY3Jvc29mdC5jb20vSUUvZmVlZGJhY2svZGV0YWlscy8xNzM2NTEyL1xuXHRybm9Jbm5lcmh0bWwgPSAvPHNjcmlwdHw8c3R5bGV8PGxpbmsvaSxcblxuXHQvLyBjaGVja2VkPVwiY2hlY2tlZFwiIG9yIGNoZWNrZWRcblx0cmNoZWNrZWQgPSAvY2hlY2tlZFxccyooPzpbXj1dfD1cXHMqLmNoZWNrZWQuKS9pLFxuXHRyc2NyaXB0VHlwZU1hc2tlZCA9IC9edHJ1ZVxcLyguKikvLFxuXHRyY2xlYW5TY3JpcHQgPSAvXlxccyo8ISg/OlxcW0NEQVRBXFxbfC0tKXwoPzpcXF1cXF18LS0pPlxccyokL2csXG5cdHNhZmVGcmFnbWVudCA9IGNyZWF0ZVNhZmVGcmFnbWVudCggZG9jdW1lbnQgKSxcblx0ZnJhZ21lbnREaXYgPSBzYWZlRnJhZ21lbnQuYXBwZW5kQ2hpbGQoIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiZGl2XCIgKSApO1xuXG4vLyBTdXBwb3J0OiBJRTw4XG4vLyBNYW5pcHVsYXRpbmcgdGFibGVzIHJlcXVpcmVzIGEgdGJvZHlcbmZ1bmN0aW9uIG1hbmlwdWxhdGlvblRhcmdldCggZWxlbSwgY29udGVudCApIHtcblx0cmV0dXJuIGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgXCJ0YWJsZVwiICkgJiZcblx0XHRqUXVlcnkubm9kZU5hbWUoIGNvbnRlbnQubm9kZVR5cGUgIT09IDExID8gY29udGVudCA6IGNvbnRlbnQuZmlyc3RDaGlsZCwgXCJ0clwiICkgP1xuXG5cdFx0ZWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZSggXCJ0Ym9keVwiIClbIDAgXSB8fFxuXHRcdFx0ZWxlbS5hcHBlbmRDaGlsZCggZWxlbS5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwidGJvZHlcIiApICkgOlxuXHRcdGVsZW07XG59XG5cbi8vIFJlcGxhY2UvcmVzdG9yZSB0aGUgdHlwZSBhdHRyaWJ1dGUgb2Ygc2NyaXB0IGVsZW1lbnRzIGZvciBzYWZlIERPTSBtYW5pcHVsYXRpb25cbmZ1bmN0aW9uIGRpc2FibGVTY3JpcHQoIGVsZW0gKSB7XG5cdGVsZW0udHlwZSA9ICggalF1ZXJ5LmZpbmQuYXR0ciggZWxlbSwgXCJ0eXBlXCIgKSAhPT0gbnVsbCApICsgXCIvXCIgKyBlbGVtLnR5cGU7XG5cdHJldHVybiBlbGVtO1xufVxuZnVuY3Rpb24gcmVzdG9yZVNjcmlwdCggZWxlbSApIHtcblx0dmFyIG1hdGNoID0gcnNjcmlwdFR5cGVNYXNrZWQuZXhlYyggZWxlbS50eXBlICk7XG5cdGlmICggbWF0Y2ggKSB7XG5cdFx0ZWxlbS50eXBlID0gbWF0Y2hbIDEgXTtcblx0fSBlbHNlIHtcblx0XHRlbGVtLnJlbW92ZUF0dHJpYnV0ZSggXCJ0eXBlXCIgKTtcblx0fVxuXHRyZXR1cm4gZWxlbTtcbn1cblxuZnVuY3Rpb24gY2xvbmVDb3B5RXZlbnQoIHNyYywgZGVzdCApIHtcblx0aWYgKCBkZXN0Lm5vZGVUeXBlICE9PSAxIHx8ICFqUXVlcnkuaGFzRGF0YSggc3JjICkgKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0dmFyIHR5cGUsIGksIGwsXG5cdFx0b2xkRGF0YSA9IGpRdWVyeS5fZGF0YSggc3JjICksXG5cdFx0Y3VyRGF0YSA9IGpRdWVyeS5fZGF0YSggZGVzdCwgb2xkRGF0YSApLFxuXHRcdGV2ZW50cyA9IG9sZERhdGEuZXZlbnRzO1xuXG5cdGlmICggZXZlbnRzICkge1xuXHRcdGRlbGV0ZSBjdXJEYXRhLmhhbmRsZTtcblx0XHRjdXJEYXRhLmV2ZW50cyA9IHt9O1xuXG5cdFx0Zm9yICggdHlwZSBpbiBldmVudHMgKSB7XG5cdFx0XHRmb3IgKCBpID0gMCwgbCA9IGV2ZW50c1sgdHlwZSBdLmxlbmd0aDsgaSA8IGw7IGkrKyApIHtcblx0XHRcdFx0alF1ZXJ5LmV2ZW50LmFkZCggZGVzdCwgdHlwZSwgZXZlbnRzWyB0eXBlIF1bIGkgXSApO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIG1ha2UgdGhlIGNsb25lZCBwdWJsaWMgZGF0YSBvYmplY3QgYSBjb3B5IGZyb20gdGhlIG9yaWdpbmFsXG5cdGlmICggY3VyRGF0YS5kYXRhICkge1xuXHRcdGN1ckRhdGEuZGF0YSA9IGpRdWVyeS5leHRlbmQoIHt9LCBjdXJEYXRhLmRhdGEgKTtcblx0fVxufVxuXG5mdW5jdGlvbiBmaXhDbG9uZU5vZGVJc3N1ZXMoIHNyYywgZGVzdCApIHtcblx0dmFyIG5vZGVOYW1lLCBlLCBkYXRhO1xuXG5cdC8vIFdlIGRvIG5vdCBuZWVkIHRvIGRvIGFueXRoaW5nIGZvciBub24tRWxlbWVudHNcblx0aWYgKCBkZXN0Lm5vZGVUeXBlICE9PSAxICkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdG5vZGVOYW1lID0gZGVzdC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG5cdC8vIElFNi04IGNvcGllcyBldmVudHMgYm91bmQgdmlhIGF0dGFjaEV2ZW50IHdoZW4gdXNpbmcgY2xvbmVOb2RlLlxuXHRpZiAoICFzdXBwb3J0Lm5vQ2xvbmVFdmVudCAmJiBkZXN0WyBqUXVlcnkuZXhwYW5kbyBdICkge1xuXHRcdGRhdGEgPSBqUXVlcnkuX2RhdGEoIGRlc3QgKTtcblxuXHRcdGZvciAoIGUgaW4gZGF0YS5ldmVudHMgKSB7XG5cdFx0XHRqUXVlcnkucmVtb3ZlRXZlbnQoIGRlc3QsIGUsIGRhdGEuaGFuZGxlICk7XG5cdFx0fVxuXG5cdFx0Ly8gRXZlbnQgZGF0YSBnZXRzIHJlZmVyZW5jZWQgaW5zdGVhZCBvZiBjb3BpZWQgaWYgdGhlIGV4cGFuZG8gZ2V0cyBjb3BpZWQgdG9vXG5cdFx0ZGVzdC5yZW1vdmVBdHRyaWJ1dGUoIGpRdWVyeS5leHBhbmRvICk7XG5cdH1cblxuXHQvLyBJRSBibGFua3MgY29udGVudHMgd2hlbiBjbG9uaW5nIHNjcmlwdHMsIGFuZCB0cmllcyB0byBldmFsdWF0ZSBuZXdseS1zZXQgdGV4dFxuXHRpZiAoIG5vZGVOYW1lID09PSBcInNjcmlwdFwiICYmIGRlc3QudGV4dCAhPT0gc3JjLnRleHQgKSB7XG5cdFx0ZGlzYWJsZVNjcmlwdCggZGVzdCApLnRleHQgPSBzcmMudGV4dDtcblx0XHRyZXN0b3JlU2NyaXB0KCBkZXN0ICk7XG5cblx0Ly8gSUU2LTEwIGltcHJvcGVybHkgY2xvbmVzIGNoaWxkcmVuIG9mIG9iamVjdCBlbGVtZW50cyB1c2luZyBjbGFzc2lkLlxuXHQvLyBJRTEwIHRocm93cyBOb01vZGlmaWNhdGlvbkFsbG93ZWRFcnJvciBpZiBwYXJlbnQgaXMgbnVsbCwgIzEyMTMyLlxuXHR9IGVsc2UgaWYgKCBub2RlTmFtZSA9PT0gXCJvYmplY3RcIiApIHtcblx0XHRpZiAoIGRlc3QucGFyZW50Tm9kZSApIHtcblx0XHRcdGRlc3Qub3V0ZXJIVE1MID0gc3JjLm91dGVySFRNTDtcblx0XHR9XG5cblx0XHQvLyBUaGlzIHBhdGggYXBwZWFycyB1bmF2b2lkYWJsZSBmb3IgSUU5LiBXaGVuIGNsb25pbmcgYW4gb2JqZWN0XG5cdFx0Ly8gZWxlbWVudCBpbiBJRTksIHRoZSBvdXRlckhUTUwgc3RyYXRlZ3kgYWJvdmUgaXMgbm90IHN1ZmZpY2llbnQuXG5cdFx0Ly8gSWYgdGhlIHNyYyBoYXMgaW5uZXJIVE1MIGFuZCB0aGUgZGVzdGluYXRpb24gZG9lcyBub3QsXG5cdFx0Ly8gY29weSB0aGUgc3JjLmlubmVySFRNTCBpbnRvIHRoZSBkZXN0LmlubmVySFRNTC4gIzEwMzI0XG5cdFx0aWYgKCBzdXBwb3J0Lmh0bWw1Q2xvbmUgJiYgKCBzcmMuaW5uZXJIVE1MICYmICFqUXVlcnkudHJpbSggZGVzdC5pbm5lckhUTUwgKSApICkge1xuXHRcdFx0ZGVzdC5pbm5lckhUTUwgPSBzcmMuaW5uZXJIVE1MO1xuXHRcdH1cblxuXHR9IGVsc2UgaWYgKCBub2RlTmFtZSA9PT0gXCJpbnB1dFwiICYmIHJjaGVja2FibGVUeXBlLnRlc3QoIHNyYy50eXBlICkgKSB7XG5cblx0XHQvLyBJRTYtOCBmYWlscyB0byBwZXJzaXN0IHRoZSBjaGVja2VkIHN0YXRlIG9mIGEgY2xvbmVkIGNoZWNrYm94XG5cdFx0Ly8gb3IgcmFkaW8gYnV0dG9uLiBXb3JzZSwgSUU2LTcgZmFpbCB0byBnaXZlIHRoZSBjbG9uZWQgZWxlbWVudFxuXHRcdC8vIGEgY2hlY2tlZCBhcHBlYXJhbmNlIGlmIHRoZSBkZWZhdWx0Q2hlY2tlZCB2YWx1ZSBpc24ndCBhbHNvIHNldFxuXG5cdFx0ZGVzdC5kZWZhdWx0Q2hlY2tlZCA9IGRlc3QuY2hlY2tlZCA9IHNyYy5jaGVja2VkO1xuXG5cdFx0Ly8gSUU2LTcgZ2V0IGNvbmZ1c2VkIGFuZCBlbmQgdXAgc2V0dGluZyB0aGUgdmFsdWUgb2YgYSBjbG9uZWRcblx0XHQvLyBjaGVja2JveC9yYWRpbyBidXR0b24gdG8gYW4gZW1wdHkgc3RyaW5nIGluc3RlYWQgb2YgXCJvblwiXG5cdFx0aWYgKCBkZXN0LnZhbHVlICE9PSBzcmMudmFsdWUgKSB7XG5cdFx0XHRkZXN0LnZhbHVlID0gc3JjLnZhbHVlO1xuXHRcdH1cblxuXHQvLyBJRTYtOCBmYWlscyB0byByZXR1cm4gdGhlIHNlbGVjdGVkIG9wdGlvbiB0byB0aGUgZGVmYXVsdCBzZWxlY3RlZFxuXHQvLyBzdGF0ZSB3aGVuIGNsb25pbmcgb3B0aW9uc1xuXHR9IGVsc2UgaWYgKCBub2RlTmFtZSA9PT0gXCJvcHRpb25cIiApIHtcblx0XHRkZXN0LmRlZmF1bHRTZWxlY3RlZCA9IGRlc3Quc2VsZWN0ZWQgPSBzcmMuZGVmYXVsdFNlbGVjdGVkO1xuXG5cdC8vIElFNi04IGZhaWxzIHRvIHNldCB0aGUgZGVmYXVsdFZhbHVlIHRvIHRoZSBjb3JyZWN0IHZhbHVlIHdoZW5cblx0Ly8gY2xvbmluZyBvdGhlciB0eXBlcyBvZiBpbnB1dCBmaWVsZHNcblx0fSBlbHNlIGlmICggbm9kZU5hbWUgPT09IFwiaW5wdXRcIiB8fCBub2RlTmFtZSA9PT0gXCJ0ZXh0YXJlYVwiICkge1xuXHRcdGRlc3QuZGVmYXVsdFZhbHVlID0gc3JjLmRlZmF1bHRWYWx1ZTtcblx0fVxufVxuXG5mdW5jdGlvbiBkb21NYW5pcCggY29sbGVjdGlvbiwgYXJncywgY2FsbGJhY2ssIGlnbm9yZWQgKSB7XG5cblx0Ly8gRmxhdHRlbiBhbnkgbmVzdGVkIGFycmF5c1xuXHRhcmdzID0gY29uY2F0LmFwcGx5KCBbXSwgYXJncyApO1xuXG5cdHZhciBmaXJzdCwgbm9kZSwgaGFzU2NyaXB0cyxcblx0XHRzY3JpcHRzLCBkb2MsIGZyYWdtZW50LFxuXHRcdGkgPSAwLFxuXHRcdGwgPSBjb2xsZWN0aW9uLmxlbmd0aCxcblx0XHRpTm9DbG9uZSA9IGwgLSAxLFxuXHRcdHZhbHVlID0gYXJnc1sgMCBdLFxuXHRcdGlzRnVuY3Rpb24gPSBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKTtcblxuXHQvLyBXZSBjYW4ndCBjbG9uZU5vZGUgZnJhZ21lbnRzIHRoYXQgY29udGFpbiBjaGVja2VkLCBpbiBXZWJLaXRcblx0aWYgKCBpc0Z1bmN0aW9uIHx8XG5cdFx0XHQoIGwgPiAxICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJlxuXHRcdFx0XHQhc3VwcG9ydC5jaGVja0Nsb25lICYmIHJjaGVja2VkLnRlc3QoIHZhbHVlICkgKSApIHtcblx0XHRyZXR1cm4gY29sbGVjdGlvbi5lYWNoKCBmdW5jdGlvbiggaW5kZXggKSB7XG5cdFx0XHR2YXIgc2VsZiA9IGNvbGxlY3Rpb24uZXEoIGluZGV4ICk7XG5cdFx0XHRpZiAoIGlzRnVuY3Rpb24gKSB7XG5cdFx0XHRcdGFyZ3NbIDAgXSA9IHZhbHVlLmNhbGwoIHRoaXMsIGluZGV4LCBzZWxmLmh0bWwoKSApO1xuXHRcdFx0fVxuXHRcdFx0ZG9tTWFuaXAoIHNlbGYsIGFyZ3MsIGNhbGxiYWNrLCBpZ25vcmVkICk7XG5cdFx0fSApO1xuXHR9XG5cblx0aWYgKCBsICkge1xuXHRcdGZyYWdtZW50ID0gYnVpbGRGcmFnbWVudCggYXJncywgY29sbGVjdGlvblsgMCBdLm93bmVyRG9jdW1lbnQsIGZhbHNlLCBjb2xsZWN0aW9uLCBpZ25vcmVkICk7XG5cdFx0Zmlyc3QgPSBmcmFnbWVudC5maXJzdENoaWxkO1xuXG5cdFx0aWYgKCBmcmFnbWVudC5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMSApIHtcblx0XHRcdGZyYWdtZW50ID0gZmlyc3Q7XG5cdFx0fVxuXG5cdFx0Ly8gUmVxdWlyZSBlaXRoZXIgbmV3IGNvbnRlbnQgb3IgYW4gaW50ZXJlc3QgaW4gaWdub3JlZCBlbGVtZW50cyB0byBpbnZva2UgdGhlIGNhbGxiYWNrXG5cdFx0aWYgKCBmaXJzdCB8fCBpZ25vcmVkICkge1xuXHRcdFx0c2NyaXB0cyA9IGpRdWVyeS5tYXAoIGdldEFsbCggZnJhZ21lbnQsIFwic2NyaXB0XCIgKSwgZGlzYWJsZVNjcmlwdCApO1xuXHRcdFx0aGFzU2NyaXB0cyA9IHNjcmlwdHMubGVuZ3RoO1xuXG5cdFx0XHQvLyBVc2UgdGhlIG9yaWdpbmFsIGZyYWdtZW50IGZvciB0aGUgbGFzdCBpdGVtXG5cdFx0XHQvLyBpbnN0ZWFkIG9mIHRoZSBmaXJzdCBiZWNhdXNlIGl0IGNhbiBlbmQgdXBcblx0XHRcdC8vIGJlaW5nIGVtcHRpZWQgaW5jb3JyZWN0bHkgaW4gY2VydGFpbiBzaXR1YXRpb25zICgjODA3MCkuXG5cdFx0XHRmb3IgKCA7IGkgPCBsOyBpKysgKSB7XG5cdFx0XHRcdG5vZGUgPSBmcmFnbWVudDtcblxuXHRcdFx0XHRpZiAoIGkgIT09IGlOb0Nsb25lICkge1xuXHRcdFx0XHRcdG5vZGUgPSBqUXVlcnkuY2xvbmUoIG5vZGUsIHRydWUsIHRydWUgKTtcblxuXHRcdFx0XHRcdC8vIEtlZXAgcmVmZXJlbmNlcyB0byBjbG9uZWQgc2NyaXB0cyBmb3IgbGF0ZXIgcmVzdG9yYXRpb25cblx0XHRcdFx0XHRpZiAoIGhhc1NjcmlwdHMgKSB7XG5cblx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQ8NC4xLCBQaGFudG9tSlM8MlxuXHRcdFx0XHRcdFx0Ly8gcHVzaC5hcHBseShfLCBhcnJheWxpa2UpIHRocm93cyBvbiBhbmNpZW50IFdlYktpdFxuXHRcdFx0XHRcdFx0alF1ZXJ5Lm1lcmdlKCBzY3JpcHRzLCBnZXRBbGwoIG5vZGUsIFwic2NyaXB0XCIgKSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNhbGxiYWNrLmNhbGwoIGNvbGxlY3Rpb25bIGkgXSwgbm9kZSwgaSApO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGhhc1NjcmlwdHMgKSB7XG5cdFx0XHRcdGRvYyA9IHNjcmlwdHNbIHNjcmlwdHMubGVuZ3RoIC0gMSBdLm93bmVyRG9jdW1lbnQ7XG5cblx0XHRcdFx0Ly8gUmVlbmFibGUgc2NyaXB0c1xuXHRcdFx0XHRqUXVlcnkubWFwKCBzY3JpcHRzLCByZXN0b3JlU2NyaXB0ICk7XG5cblx0XHRcdFx0Ly8gRXZhbHVhdGUgZXhlY3V0YWJsZSBzY3JpcHRzIG9uIGZpcnN0IGRvY3VtZW50IGluc2VydGlvblxuXHRcdFx0XHRmb3IgKCBpID0gMDsgaSA8IGhhc1NjcmlwdHM7IGkrKyApIHtcblx0XHRcdFx0XHRub2RlID0gc2NyaXB0c1sgaSBdO1xuXHRcdFx0XHRcdGlmICggcnNjcmlwdFR5cGUudGVzdCggbm9kZS50eXBlIHx8IFwiXCIgKSAmJlxuXHRcdFx0XHRcdFx0IWpRdWVyeS5fZGF0YSggbm9kZSwgXCJnbG9iYWxFdmFsXCIgKSAmJlxuXHRcdFx0XHRcdFx0alF1ZXJ5LmNvbnRhaW5zKCBkb2MsIG5vZGUgKSApIHtcblxuXHRcdFx0XHRcdFx0aWYgKCBub2RlLnNyYyApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBPcHRpb25hbCBBSkFYIGRlcGVuZGVuY3ksIGJ1dCB3b24ndCBydW4gc2NyaXB0cyBpZiBub3QgcHJlc2VudFxuXHRcdFx0XHRcdFx0XHRpZiAoIGpRdWVyeS5fZXZhbFVybCApIHtcblx0XHRcdFx0XHRcdFx0XHRqUXVlcnkuX2V2YWxVcmwoIG5vZGUuc3JjICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGpRdWVyeS5nbG9iYWxFdmFsKFxuXHRcdFx0XHRcdFx0XHRcdCggbm9kZS50ZXh0IHx8IG5vZGUudGV4dENvbnRlbnQgfHwgbm9kZS5pbm5lckhUTUwgfHwgXCJcIiApXG5cdFx0XHRcdFx0XHRcdFx0XHQucmVwbGFjZSggcmNsZWFuU2NyaXB0LCBcIlwiIClcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gRml4ICMxMTgwOTogQXZvaWQgbGVha2luZyBtZW1vcnlcblx0XHRcdGZyYWdtZW50ID0gZmlyc3QgPSBudWxsO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBjb2xsZWN0aW9uO1xufVxuXG5mdW5jdGlvbiByZW1vdmUoIGVsZW0sIHNlbGVjdG9yLCBrZWVwRGF0YSApIHtcblx0dmFyIG5vZGUsXG5cdFx0ZWxlbXMgPSBzZWxlY3RvciA/IGpRdWVyeS5maWx0ZXIoIHNlbGVjdG9yLCBlbGVtICkgOiBlbGVtLFxuXHRcdGkgPSAwO1xuXG5cdGZvciAoIDsgKCBub2RlID0gZWxlbXNbIGkgXSApICE9IG51bGw7IGkrKyApIHtcblxuXHRcdGlmICggIWtlZXBEYXRhICYmIG5vZGUubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHRqUXVlcnkuY2xlYW5EYXRhKCBnZXRBbGwoIG5vZGUgKSApO1xuXHRcdH1cblxuXHRcdGlmICggbm9kZS5wYXJlbnROb2RlICkge1xuXHRcdFx0aWYgKCBrZWVwRGF0YSAmJiBqUXVlcnkuY29udGFpbnMoIG5vZGUub3duZXJEb2N1bWVudCwgbm9kZSApICkge1xuXHRcdFx0XHRzZXRHbG9iYWxFdmFsKCBnZXRBbGwoIG5vZGUsIFwic2NyaXB0XCIgKSApO1xuXHRcdFx0fVxuXHRcdFx0bm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCBub2RlICk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGVsZW07XG59XG5cbmpRdWVyeS5leHRlbmQoIHtcblx0aHRtbFByZWZpbHRlcjogZnVuY3Rpb24oIGh0bWwgKSB7XG5cdFx0cmV0dXJuIGh0bWwucmVwbGFjZSggcnhodG1sVGFnLCBcIjwkMT48LyQyPlwiICk7XG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uKCBlbGVtLCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApIHtcblx0XHR2YXIgZGVzdEVsZW1lbnRzLCBub2RlLCBjbG9uZSwgaSwgc3JjRWxlbWVudHMsXG5cdFx0XHRpblBhZ2UgPSBqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1bWVudCwgZWxlbSApO1xuXG5cdFx0aWYgKCBzdXBwb3J0Lmh0bWw1Q2xvbmUgfHwgalF1ZXJ5LmlzWE1MRG9jKCBlbGVtICkgfHxcblx0XHRcdCFybm9zaGltY2FjaGUudGVzdCggXCI8XCIgKyBlbGVtLm5vZGVOYW1lICsgXCI+XCIgKSApIHtcblxuXHRcdFx0Y2xvbmUgPSBlbGVtLmNsb25lTm9kZSggdHJ1ZSApO1xuXG5cdFx0Ly8gSUU8PTggZG9lcyBub3QgcHJvcGVybHkgY2xvbmUgZGV0YWNoZWQsIHVua25vd24gZWxlbWVudCBub2Rlc1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRmcmFnbWVudERpdi5pbm5lckhUTUwgPSBlbGVtLm91dGVySFRNTDtcblx0XHRcdGZyYWdtZW50RGl2LnJlbW92ZUNoaWxkKCBjbG9uZSA9IGZyYWdtZW50RGl2LmZpcnN0Q2hpbGQgKTtcblx0XHR9XG5cblx0XHRpZiAoICggIXN1cHBvcnQubm9DbG9uZUV2ZW50IHx8ICFzdXBwb3J0Lm5vQ2xvbmVDaGVja2VkICkgJiZcblx0XHRcdFx0KCBlbGVtLm5vZGVUeXBlID09PSAxIHx8IGVsZW0ubm9kZVR5cGUgPT09IDExICkgJiYgIWpRdWVyeS5pc1hNTERvYyggZWxlbSApICkge1xuXG5cdFx0XHQvLyBXZSBlc2NoZXcgU2l6emxlIGhlcmUgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnM6IGh0dHA6Ly9qc3BlcmYuY29tL2dldGFsbC12cy1zaXp6bGUvMlxuXHRcdFx0ZGVzdEVsZW1lbnRzID0gZ2V0QWxsKCBjbG9uZSApO1xuXHRcdFx0c3JjRWxlbWVudHMgPSBnZXRBbGwoIGVsZW0gKTtcblxuXHRcdFx0Ly8gRml4IGFsbCBJRSBjbG9uaW5nIGlzc3Vlc1xuXHRcdFx0Zm9yICggaSA9IDA7ICggbm9kZSA9IHNyY0VsZW1lbnRzWyBpIF0gKSAhPSBudWxsOyArK2kgKSB7XG5cblx0XHRcdFx0Ly8gRW5zdXJlIHRoYXQgdGhlIGRlc3RpbmF0aW9uIG5vZGUgaXMgbm90IG51bGw7IEZpeGVzICM5NTg3XG5cdFx0XHRcdGlmICggZGVzdEVsZW1lbnRzWyBpIF0gKSB7XG5cdFx0XHRcdFx0Zml4Q2xvbmVOb2RlSXNzdWVzKCBub2RlLCBkZXN0RWxlbWVudHNbIGkgXSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQ29weSB0aGUgZXZlbnRzIGZyb20gdGhlIG9yaWdpbmFsIHRvIHRoZSBjbG9uZVxuXHRcdGlmICggZGF0YUFuZEV2ZW50cyApIHtcblx0XHRcdGlmICggZGVlcERhdGFBbmRFdmVudHMgKSB7XG5cdFx0XHRcdHNyY0VsZW1lbnRzID0gc3JjRWxlbWVudHMgfHwgZ2V0QWxsKCBlbGVtICk7XG5cdFx0XHRcdGRlc3RFbGVtZW50cyA9IGRlc3RFbGVtZW50cyB8fCBnZXRBbGwoIGNsb25lICk7XG5cblx0XHRcdFx0Zm9yICggaSA9IDA7ICggbm9kZSA9IHNyY0VsZW1lbnRzWyBpIF0gKSAhPSBudWxsOyBpKysgKSB7XG5cdFx0XHRcdFx0Y2xvbmVDb3B5RXZlbnQoIG5vZGUsIGRlc3RFbGVtZW50c1sgaSBdICk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNsb25lQ29weUV2ZW50KCBlbGVtLCBjbG9uZSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFByZXNlcnZlIHNjcmlwdCBldmFsdWF0aW9uIGhpc3Rvcnlcblx0XHRkZXN0RWxlbWVudHMgPSBnZXRBbGwoIGNsb25lLCBcInNjcmlwdFwiICk7XG5cdFx0aWYgKCBkZXN0RWxlbWVudHMubGVuZ3RoID4gMCApIHtcblx0XHRcdHNldEdsb2JhbEV2YWwoIGRlc3RFbGVtZW50cywgIWluUGFnZSAmJiBnZXRBbGwoIGVsZW0sIFwic2NyaXB0XCIgKSApO1xuXHRcdH1cblxuXHRcdGRlc3RFbGVtZW50cyA9IHNyY0VsZW1lbnRzID0gbm9kZSA9IG51bGw7XG5cblx0XHQvLyBSZXR1cm4gdGhlIGNsb25lZCBzZXRcblx0XHRyZXR1cm4gY2xvbmU7XG5cdH0sXG5cblx0Y2xlYW5EYXRhOiBmdW5jdGlvbiggZWxlbXMsIC8qIGludGVybmFsICovIGZvcmNlQWNjZXB0RGF0YSApIHtcblx0XHR2YXIgZWxlbSwgdHlwZSwgaWQsIGRhdGEsXG5cdFx0XHRpID0gMCxcblx0XHRcdGludGVybmFsS2V5ID0galF1ZXJ5LmV4cGFuZG8sXG5cdFx0XHRjYWNoZSA9IGpRdWVyeS5jYWNoZSxcblx0XHRcdGF0dHJpYnV0ZXMgPSBzdXBwb3J0LmF0dHJpYnV0ZXMsXG5cdFx0XHRzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWw7XG5cblx0XHRmb3IgKCA7ICggZWxlbSA9IGVsZW1zWyBpIF0gKSAhPSBudWxsOyBpKysgKSB7XG5cdFx0XHRpZiAoIGZvcmNlQWNjZXB0RGF0YSB8fCBhY2NlcHREYXRhKCBlbGVtICkgKSB7XG5cblx0XHRcdFx0aWQgPSBlbGVtWyBpbnRlcm5hbEtleSBdO1xuXHRcdFx0XHRkYXRhID0gaWQgJiYgY2FjaGVbIGlkIF07XG5cblx0XHRcdFx0aWYgKCBkYXRhICkge1xuXHRcdFx0XHRcdGlmICggZGF0YS5ldmVudHMgKSB7XG5cdFx0XHRcdFx0XHRmb3IgKCB0eXBlIGluIGRhdGEuZXZlbnRzICkge1xuXHRcdFx0XHRcdFx0XHRpZiAoIHNwZWNpYWxbIHR5cGUgXSApIHtcblx0XHRcdFx0XHRcdFx0XHRqUXVlcnkuZXZlbnQucmVtb3ZlKCBlbGVtLCB0eXBlICk7XG5cblx0XHRcdFx0XHRcdFx0Ly8gVGhpcyBpcyBhIHNob3J0Y3V0IHRvIGF2b2lkIGpRdWVyeS5ldmVudC5yZW1vdmUncyBvdmVyaGVhZFxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeS5yZW1vdmVFdmVudCggZWxlbSwgdHlwZSwgZGF0YS5oYW5kbGUgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIFJlbW92ZSBjYWNoZSBvbmx5IGlmIGl0IHdhcyBub3QgYWxyZWFkeSByZW1vdmVkIGJ5IGpRdWVyeS5ldmVudC5yZW1vdmVcblx0XHRcdFx0XHRpZiAoIGNhY2hlWyBpZCBdICkge1xuXG5cdFx0XHRcdFx0XHRkZWxldGUgY2FjaGVbIGlkIF07XG5cblx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFPDlcblx0XHRcdFx0XHRcdC8vIElFIGRvZXMgbm90IGFsbG93IHVzIHRvIGRlbGV0ZSBleHBhbmRvIHByb3BlcnRpZXMgZnJvbSBub2Rlc1xuXHRcdFx0XHRcdFx0Ly8gSUUgY3JlYXRlcyBleHBhbmRvIGF0dHJpYnV0ZXMgYWxvbmcgd2l0aCB0aGUgcHJvcGVydHlcblx0XHRcdFx0XHRcdC8vIElFIGRvZXMgbm90IGhhdmUgYSByZW1vdmVBdHRyaWJ1dGUgZnVuY3Rpb24gb24gRG9jdW1lbnQgbm9kZXNcblx0XHRcdFx0XHRcdGlmICggIWF0dHJpYnV0ZXMgJiYgdHlwZW9mIGVsZW0ucmVtb3ZlQXR0cmlidXRlICE9PSBcInVuZGVmaW5lZFwiICkge1xuXHRcdFx0XHRcdFx0XHRlbGVtLnJlbW92ZUF0dHJpYnV0ZSggaW50ZXJuYWxLZXkgKTtcblxuXHRcdFx0XHRcdFx0Ly8gV2Via2l0ICYgQmxpbmsgcGVyZm9ybWFuY2Ugc3VmZmVycyB3aGVuIGRlbGV0aW5nIHByb3BlcnRpZXNcblx0XHRcdFx0XHRcdC8vIGZyb20gRE9NIG5vZGVzLCBzbyBzZXQgdG8gdW5kZWZpbmVkIGluc3RlYWRcblx0XHRcdFx0XHRcdC8vIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD0zNzg2MDdcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGVsZW1bIGludGVybmFsS2V5IF0gPSB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGRlbGV0ZWRJZHMucHVzaCggaWQgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cbn0gKTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXG5cdC8vIEtlZXAgZG9tTWFuaXAgZXhwb3NlZCB1bnRpbCAzLjAgKGdoLTIyMjUpXG5cdGRvbU1hbmlwOiBkb21NYW5pcCxcblxuXHRkZXRhY2g6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHRyZXR1cm4gcmVtb3ZlKCB0aGlzLCBzZWxlY3RvciwgdHJ1ZSApO1xuXHR9LFxuXG5cdHJlbW92ZTogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHJldHVybiByZW1vdmUoIHRoaXMsIHNlbGVjdG9yICk7XG5cdH0sXG5cblx0dGV4dDogZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRcdHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID9cblx0XHRcdFx0alF1ZXJ5LnRleHQoIHRoaXMgKSA6XG5cdFx0XHRcdHRoaXMuZW1wdHkoKS5hcHBlbmQoXG5cdFx0XHRcdFx0KCB0aGlzWyAwIF0gJiYgdGhpc1sgMCBdLm93bmVyRG9jdW1lbnQgfHwgZG9jdW1lbnQgKS5jcmVhdGVUZXh0Tm9kZSggdmFsdWUgKVxuXHRcdFx0XHQpO1xuXHRcdH0sIG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoICk7XG5cdH0sXG5cblx0YXBwZW5kOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gZG9tTWFuaXAoIHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRpZiAoIHRoaXMubm9kZVR5cGUgPT09IDEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gMTEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gOSApIHtcblx0XHRcdFx0dmFyIHRhcmdldCA9IG1hbmlwdWxhdGlvblRhcmdldCggdGhpcywgZWxlbSApO1xuXHRcdFx0XHR0YXJnZXQuYXBwZW5kQ2hpbGQoIGVsZW0gKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0cHJlcGVuZDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0aWYgKCB0aGlzLm5vZGVUeXBlID09PSAxIHx8IHRoaXMubm9kZVR5cGUgPT09IDExIHx8IHRoaXMubm9kZVR5cGUgPT09IDkgKSB7XG5cdFx0XHRcdHZhciB0YXJnZXQgPSBtYW5pcHVsYXRpb25UYXJnZXQoIHRoaXMsIGVsZW0gKTtcblx0XHRcdFx0dGFyZ2V0Lmluc2VydEJlZm9yZSggZWxlbSwgdGFyZ2V0LmZpcnN0Q2hpbGQgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0YmVmb3JlOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gZG9tTWFuaXAoIHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRpZiAoIHRoaXMucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0dGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSggZWxlbSwgdGhpcyApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblxuXHRhZnRlcjogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0aWYgKCB0aGlzLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdHRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoIGVsZW0sIHRoaXMubmV4dFNpYmxpbmcgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0ZW1wdHk6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBlbGVtLFxuXHRcdFx0aSA9IDA7XG5cblx0XHRmb3IgKCA7ICggZWxlbSA9IHRoaXNbIGkgXSApICE9IG51bGw7IGkrKyApIHtcblxuXHRcdFx0Ly8gUmVtb3ZlIGVsZW1lbnQgbm9kZXMgYW5kIHByZXZlbnQgbWVtb3J5IGxlYWtzXG5cdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHRcdGpRdWVyeS5jbGVhbkRhdGEoIGdldEFsbCggZWxlbSwgZmFsc2UgKSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBSZW1vdmUgYW55IHJlbWFpbmluZyBub2Rlc1xuXHRcdFx0d2hpbGUgKCBlbGVtLmZpcnN0Q2hpbGQgKSB7XG5cdFx0XHRcdGVsZW0ucmVtb3ZlQ2hpbGQoIGVsZW0uZmlyc3RDaGlsZCApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBJZiB0aGlzIGlzIGEgc2VsZWN0LCBlbnN1cmUgdGhhdCBpdCBkaXNwbGF5cyBlbXB0eSAoIzEyMzM2KVxuXHRcdFx0Ly8gU3VwcG9ydDogSUU8OVxuXHRcdFx0aWYgKCBlbGVtLm9wdGlvbnMgJiYgalF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCBcInNlbGVjdFwiICkgKSB7XG5cdFx0XHRcdGVsZW0ub3B0aW9ucy5sZW5ndGggPSAwO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiggZGF0YUFuZEV2ZW50cywgZGVlcERhdGFBbmRFdmVudHMgKSB7XG5cdFx0ZGF0YUFuZEV2ZW50cyA9IGRhdGFBbmRFdmVudHMgPT0gbnVsbCA/IGZhbHNlIDogZGF0YUFuZEV2ZW50cztcblx0XHRkZWVwRGF0YUFuZEV2ZW50cyA9IGRlZXBEYXRhQW5kRXZlbnRzID09IG51bGwgPyBkYXRhQW5kRXZlbnRzIDogZGVlcERhdGFBbmRFdmVudHM7XG5cblx0XHRyZXR1cm4gdGhpcy5tYXAoIGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIGpRdWVyeS5jbG9uZSggdGhpcywgZGF0YUFuZEV2ZW50cywgZGVlcERhdGFBbmRFdmVudHMgKTtcblx0XHR9ICk7XG5cdH0sXG5cblx0aHRtbDogZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRcdHZhciBlbGVtID0gdGhpc1sgMCBdIHx8IHt9LFxuXHRcdFx0XHRpID0gMCxcblx0XHRcdFx0bCA9IHRoaXMubGVuZ3RoO1xuXG5cdFx0XHRpZiAoIHZhbHVlID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdHJldHVybiBlbGVtLm5vZGVUeXBlID09PSAxID9cblx0XHRcdFx0XHRlbGVtLmlubmVySFRNTC5yZXBsYWNlKCByaW5saW5lalF1ZXJ5LCBcIlwiICkgOlxuXHRcdFx0XHRcdHVuZGVmaW5lZDtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2VlIGlmIHdlIGNhbiB0YWtlIGEgc2hvcnRjdXQgYW5kIGp1c3QgdXNlIGlubmVySFRNTFxuXHRcdFx0aWYgKCB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgIXJub0lubmVyaHRtbC50ZXN0KCB2YWx1ZSApICYmXG5cdFx0XHRcdCggc3VwcG9ydC5odG1sU2VyaWFsaXplIHx8ICFybm9zaGltY2FjaGUudGVzdCggdmFsdWUgKSAgKSAmJlxuXHRcdFx0XHQoIHN1cHBvcnQubGVhZGluZ1doaXRlc3BhY2UgfHwgIXJsZWFkaW5nV2hpdGVzcGFjZS50ZXN0KCB2YWx1ZSApICkgJiZcblx0XHRcdFx0IXdyYXBNYXBbICggcnRhZ05hbWUuZXhlYyggdmFsdWUgKSB8fCBbIFwiXCIsIFwiXCIgXSApWyAxIF0udG9Mb3dlckNhc2UoKSBdICkge1xuXG5cdFx0XHRcdHZhbHVlID0galF1ZXJ5Lmh0bWxQcmVmaWx0ZXIoIHZhbHVlICk7XG5cblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRmb3IgKCA7IGkgPCBsOyBpKysgKSB7XG5cblx0XHRcdFx0XHRcdC8vIFJlbW92ZSBlbGVtZW50IG5vZGVzIGFuZCBwcmV2ZW50IG1lbW9yeSBsZWFrc1xuXHRcdFx0XHRcdFx0ZWxlbSA9IHRoaXNbIGkgXSB8fCB7fTtcblx0XHRcdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRcdFx0XHRcdFx0alF1ZXJ5LmNsZWFuRGF0YSggZ2V0QWxsKCBlbGVtLCBmYWxzZSApICk7XG5cdFx0XHRcdFx0XHRcdGVsZW0uaW5uZXJIVE1MID0gdmFsdWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0ZWxlbSA9IDA7XG5cblx0XHRcdFx0Ly8gSWYgdXNpbmcgaW5uZXJIVE1MIHRocm93cyBhbiBleGNlcHRpb24sIHVzZSB0aGUgZmFsbGJhY2sgbWV0aG9kXG5cdFx0XHRcdH0gY2F0Y2ggKCBlICkge31cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBlbGVtICkge1xuXHRcdFx0XHR0aGlzLmVtcHR5KCkuYXBwZW5kKCB2YWx1ZSApO1xuXHRcdFx0fVxuXHRcdH0sIG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoICk7XG5cdH0sXG5cblx0cmVwbGFjZVdpdGg6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBpZ25vcmVkID0gW107XG5cblx0XHQvLyBNYWtlIHRoZSBjaGFuZ2VzLCByZXBsYWNpbmcgZWFjaCBub24taWdub3JlZCBjb250ZXh0IGVsZW1lbnQgd2l0aCB0aGUgbmV3IGNvbnRlbnRcblx0XHRyZXR1cm4gZG9tTWFuaXAoIHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHR2YXIgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlO1xuXG5cdFx0XHRpZiAoIGpRdWVyeS5pbkFycmF5KCB0aGlzLCBpZ25vcmVkICkgPCAwICkge1xuXHRcdFx0XHRqUXVlcnkuY2xlYW5EYXRhKCBnZXRBbGwoIHRoaXMgKSApO1xuXHRcdFx0XHRpZiAoIHBhcmVudCApIHtcblx0XHRcdFx0XHRwYXJlbnQucmVwbGFjZUNoaWxkKCBlbGVtLCB0aGlzICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdC8vIEZvcmNlIGNhbGxiYWNrIGludm9jYXRpb25cblx0XHR9LCBpZ25vcmVkICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmVhY2goIHtcblx0YXBwZW5kVG86IFwiYXBwZW5kXCIsXG5cdHByZXBlbmRUbzogXCJwcmVwZW5kXCIsXG5cdGluc2VydEJlZm9yZTogXCJiZWZvcmVcIixcblx0aW5zZXJ0QWZ0ZXI6IFwiYWZ0ZXJcIixcblx0cmVwbGFjZUFsbDogXCJyZXBsYWNlV2l0aFwiXG59LCBmdW5jdGlvbiggbmFtZSwgb3JpZ2luYWwgKSB7XG5cdGpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHZhciBlbGVtcyxcblx0XHRcdGkgPSAwLFxuXHRcdFx0cmV0ID0gW10sXG5cdFx0XHRpbnNlcnQgPSBqUXVlcnkoIHNlbGVjdG9yICksXG5cdFx0XHRsYXN0ID0gaW5zZXJ0Lmxlbmd0aCAtIDE7XG5cblx0XHRmb3IgKCA7IGkgPD0gbGFzdDsgaSsrICkge1xuXHRcdFx0ZWxlbXMgPSBpID09PSBsYXN0ID8gdGhpcyA6IHRoaXMuY2xvbmUoIHRydWUgKTtcblx0XHRcdGpRdWVyeSggaW5zZXJ0WyBpIF0gKVsgb3JpZ2luYWwgXSggZWxlbXMgKTtcblxuXHRcdFx0Ly8gTW9kZXJuIGJyb3dzZXJzIGNhbiBhcHBseSBqUXVlcnkgY29sbGVjdGlvbnMgYXMgYXJyYXlzLCBidXQgb2xkSUUgbmVlZHMgYSAuZ2V0KClcblx0XHRcdHB1c2guYXBwbHkoIHJldCwgZWxlbXMuZ2V0KCkgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHJldCApO1xuXHR9O1xufSApO1xuXG5cbnZhciBpZnJhbWUsXG5cdGVsZW1kaXNwbGF5ID0ge1xuXG5cdFx0Ly8gU3VwcG9ydDogRmlyZWZveFxuXHRcdC8vIFdlIGhhdmUgdG8gcHJlLWRlZmluZSB0aGVzZSB2YWx1ZXMgZm9yIEZGICgjMTAyMjcpXG5cdFx0SFRNTDogXCJibG9ja1wiLFxuXHRcdEJPRFk6IFwiYmxvY2tcIlxuXHR9O1xuXG4vKipcbiAqIFJldHJpZXZlIHRoZSBhY3R1YWwgZGlzcGxheSBvZiBhIGVsZW1lbnRcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIG5vZGVOYW1lIG9mIHRoZSBlbGVtZW50XG4gKiBAcGFyYW0ge09iamVjdH0gZG9jIERvY3VtZW50IG9iamVjdFxuICovXG5cbi8vIENhbGxlZCBvbmx5IGZyb20gd2l0aGluIGRlZmF1bHREaXNwbGF5XG5mdW5jdGlvbiBhY3R1YWxEaXNwbGF5KCBuYW1lLCBkb2MgKSB7XG5cdHZhciBlbGVtID0galF1ZXJ5KCBkb2MuY3JlYXRlRWxlbWVudCggbmFtZSApICkuYXBwZW5kVG8oIGRvYy5ib2R5ICksXG5cblx0XHRkaXNwbGF5ID0galF1ZXJ5LmNzcyggZWxlbVsgMCBdLCBcImRpc3BsYXlcIiApO1xuXG5cdC8vIFdlIGRvbid0IGhhdmUgYW55IGRhdGEgc3RvcmVkIG9uIHRoZSBlbGVtZW50LFxuXHQvLyBzbyB1c2UgXCJkZXRhY2hcIiBtZXRob2QgYXMgZmFzdCB3YXkgdG8gZ2V0IHJpZCBvZiB0aGUgZWxlbWVudFxuXHRlbGVtLmRldGFjaCgpO1xuXG5cdHJldHVybiBkaXNwbGF5O1xufVxuXG4vKipcbiAqIFRyeSB0byBkZXRlcm1pbmUgdGhlIGRlZmF1bHQgZGlzcGxheSB2YWx1ZSBvZiBhbiBlbGVtZW50XG4gKiBAcGFyYW0ge1N0cmluZ30gbm9kZU5hbWVcbiAqL1xuZnVuY3Rpb24gZGVmYXVsdERpc3BsYXkoIG5vZGVOYW1lICkge1xuXHR2YXIgZG9jID0gZG9jdW1lbnQsXG5cdFx0ZGlzcGxheSA9IGVsZW1kaXNwbGF5WyBub2RlTmFtZSBdO1xuXG5cdGlmICggIWRpc3BsYXkgKSB7XG5cdFx0ZGlzcGxheSA9IGFjdHVhbERpc3BsYXkoIG5vZGVOYW1lLCBkb2MgKTtcblxuXHRcdC8vIElmIHRoZSBzaW1wbGUgd2F5IGZhaWxzLCByZWFkIGZyb20gaW5zaWRlIGFuIGlmcmFtZVxuXHRcdGlmICggZGlzcGxheSA9PT0gXCJub25lXCIgfHwgIWRpc3BsYXkgKSB7XG5cblx0XHRcdC8vIFVzZSB0aGUgYWxyZWFkeS1jcmVhdGVkIGlmcmFtZSBpZiBwb3NzaWJsZVxuXHRcdFx0aWZyYW1lID0gKCBpZnJhbWUgfHwgalF1ZXJ5KCBcIjxpZnJhbWUgZnJhbWVib3JkZXI9JzAnIHdpZHRoPScwJyBoZWlnaHQ9JzAnLz5cIiApIClcblx0XHRcdFx0LmFwcGVuZFRvKCBkb2MuZG9jdW1lbnRFbGVtZW50ICk7XG5cblx0XHRcdC8vIEFsd2F5cyB3cml0ZSBhIG5ldyBIVE1MIHNrZWxldG9uIHNvIFdlYmtpdCBhbmQgRmlyZWZveCBkb24ndCBjaG9rZSBvbiByZXVzZVxuXHRcdFx0ZG9jID0gKCBpZnJhbWVbIDAgXS5jb250ZW50V2luZG93IHx8IGlmcmFtZVsgMCBdLmNvbnRlbnREb2N1bWVudCApLmRvY3VtZW50O1xuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRVxuXHRcdFx0ZG9jLndyaXRlKCk7XG5cdFx0XHRkb2MuY2xvc2UoKTtcblxuXHRcdFx0ZGlzcGxheSA9IGFjdHVhbERpc3BsYXkoIG5vZGVOYW1lLCBkb2MgKTtcblx0XHRcdGlmcmFtZS5kZXRhY2goKTtcblx0XHR9XG5cblx0XHQvLyBTdG9yZSB0aGUgY29ycmVjdCBkZWZhdWx0IGRpc3BsYXlcblx0XHRlbGVtZGlzcGxheVsgbm9kZU5hbWUgXSA9IGRpc3BsYXk7XG5cdH1cblxuXHRyZXR1cm4gZGlzcGxheTtcbn1cbnZhciBybWFyZ2luID0gKCAvXm1hcmdpbi8gKTtcblxudmFyIHJudW1ub25weCA9IG5ldyBSZWdFeHAoIFwiXihcIiArIHBudW0gKyBcIikoPyFweClbYS16JV0rJFwiLCBcImlcIiApO1xuXG52YXIgc3dhcCA9IGZ1bmN0aW9uKCBlbGVtLCBvcHRpb25zLCBjYWxsYmFjaywgYXJncyApIHtcblx0dmFyIHJldCwgbmFtZSxcblx0XHRvbGQgPSB7fTtcblxuXHQvLyBSZW1lbWJlciB0aGUgb2xkIHZhbHVlcywgYW5kIGluc2VydCB0aGUgbmV3IG9uZXNcblx0Zm9yICggbmFtZSBpbiBvcHRpb25zICkge1xuXHRcdG9sZFsgbmFtZSBdID0gZWxlbS5zdHlsZVsgbmFtZSBdO1xuXHRcdGVsZW0uc3R5bGVbIG5hbWUgXSA9IG9wdGlvbnNbIG5hbWUgXTtcblx0fVxuXG5cdHJldCA9IGNhbGxiYWNrLmFwcGx5KCBlbGVtLCBhcmdzIHx8IFtdICk7XG5cblx0Ly8gUmV2ZXJ0IHRoZSBvbGQgdmFsdWVzXG5cdGZvciAoIG5hbWUgaW4gb3B0aW9ucyApIHtcblx0XHRlbGVtLnN0eWxlWyBuYW1lIF0gPSBvbGRbIG5hbWUgXTtcblx0fVxuXG5cdHJldHVybiByZXQ7XG59O1xuXG5cbnZhciBkb2N1bWVudEVsZW1lbnQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG5cblxuXG4oIGZ1bmN0aW9uKCkge1xuXHR2YXIgcGl4ZWxQb3NpdGlvblZhbCwgcGl4ZWxNYXJnaW5SaWdodFZhbCwgYm94U2l6aW5nUmVsaWFibGVWYWwsXG5cdFx0cmVsaWFibGVIaWRkZW5PZmZzZXRzVmFsLCByZWxpYWJsZU1hcmdpblJpZ2h0VmFsLCByZWxpYWJsZU1hcmdpbkxlZnRWYWwsXG5cdFx0Y29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJkaXZcIiApLFxuXHRcdGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiZGl2XCIgKTtcblxuXHQvLyBGaW5pc2ggZWFybHkgaW4gbGltaXRlZCAobm9uLWJyb3dzZXIpIGVudmlyb25tZW50c1xuXHRpZiAoICFkaXYuc3R5bGUgKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0ZGl2LnN0eWxlLmNzc1RleHQgPSBcImZsb2F0OmxlZnQ7b3BhY2l0eTouNVwiO1xuXG5cdC8vIFN1cHBvcnQ6IElFPDlcblx0Ly8gTWFrZSBzdXJlIHRoYXQgZWxlbWVudCBvcGFjaXR5IGV4aXN0cyAoYXMgb3Bwb3NlZCB0byBmaWx0ZXIpXG5cdHN1cHBvcnQub3BhY2l0eSA9IGRpdi5zdHlsZS5vcGFjaXR5ID09PSBcIjAuNVwiO1xuXG5cdC8vIFZlcmlmeSBzdHlsZSBmbG9hdCBleGlzdGVuY2Vcblx0Ly8gKElFIHVzZXMgc3R5bGVGbG9hdCBpbnN0ZWFkIG9mIGNzc0Zsb2F0KVxuXHRzdXBwb3J0LmNzc0Zsb2F0ID0gISFkaXYuc3R5bGUuY3NzRmxvYXQ7XG5cblx0ZGl2LnN0eWxlLmJhY2tncm91bmRDbGlwID0gXCJjb250ZW50LWJveFwiO1xuXHRkaXYuY2xvbmVOb2RlKCB0cnVlICkuc3R5bGUuYmFja2dyb3VuZENsaXAgPSBcIlwiO1xuXHRzdXBwb3J0LmNsZWFyQ2xvbmVTdHlsZSA9IGRpdi5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCA9PT0gXCJjb250ZW50LWJveFwiO1xuXG5cdGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiZGl2XCIgKTtcblx0Y29udGFpbmVyLnN0eWxlLmNzc1RleHQgPSBcImJvcmRlcjowO3dpZHRoOjhweDtoZWlnaHQ6MDt0b3A6MDtsZWZ0Oi05OTk5cHg7XCIgK1xuXHRcdFwicGFkZGluZzowO21hcmdpbi10b3A6MXB4O3Bvc2l0aW9uOmFic29sdXRlXCI7XG5cdGRpdi5pbm5lckhUTUwgPSBcIlwiO1xuXHRjb250YWluZXIuYXBwZW5kQ2hpbGQoIGRpdiApO1xuXG5cdC8vIFN1cHBvcnQ6IEZpcmVmb3g8MjksIEFuZHJvaWQgMi4zXG5cdC8vIFZlbmRvci1wcmVmaXggYm94LXNpemluZ1xuXHRzdXBwb3J0LmJveFNpemluZyA9IGRpdi5zdHlsZS5ib3hTaXppbmcgPT09IFwiXCIgfHwgZGl2LnN0eWxlLk1vekJveFNpemluZyA9PT0gXCJcIiB8fFxuXHRcdGRpdi5zdHlsZS5XZWJraXRCb3hTaXppbmcgPT09IFwiXCI7XG5cblx0alF1ZXJ5LmV4dGVuZCggc3VwcG9ydCwge1xuXHRcdHJlbGlhYmxlSGlkZGVuT2Zmc2V0czogZnVuY3Rpb24oKSB7XG5cdFx0XHRpZiAoIHBpeGVsUG9zaXRpb25WYWwgPT0gbnVsbCApIHtcblx0XHRcdFx0Y29tcHV0ZVN0eWxlVGVzdHMoKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiByZWxpYWJsZUhpZGRlbk9mZnNldHNWYWw7XG5cdFx0fSxcblxuXHRcdGJveFNpemluZ1JlbGlhYmxlOiBmdW5jdGlvbigpIHtcblxuXHRcdFx0Ly8gV2UncmUgY2hlY2tpbmcgZm9yIHBpeGVsUG9zaXRpb25WYWwgaGVyZSBpbnN0ZWFkIG9mIGJveFNpemluZ1JlbGlhYmxlVmFsXG5cdFx0XHQvLyBzaW5jZSB0aGF0IGNvbXByZXNzZXMgYmV0dGVyIGFuZCB0aGV5J3JlIGNvbXB1dGVkIHRvZ2V0aGVyIGFueXdheS5cblx0XHRcdGlmICggcGl4ZWxQb3NpdGlvblZhbCA9PSBudWxsICkge1xuXHRcdFx0XHRjb21wdXRlU3R5bGVUZXN0cygpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGJveFNpemluZ1JlbGlhYmxlVmFsO1xuXHRcdH0sXG5cblx0XHRwaXhlbE1hcmdpblJpZ2h0OiBmdW5jdGlvbigpIHtcblxuXHRcdFx0Ly8gU3VwcG9ydDogQW5kcm9pZCA0LjAtNC4zXG5cdFx0XHRpZiAoIHBpeGVsUG9zaXRpb25WYWwgPT0gbnVsbCApIHtcblx0XHRcdFx0Y29tcHV0ZVN0eWxlVGVzdHMoKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBwaXhlbE1hcmdpblJpZ2h0VmFsO1xuXHRcdH0sXG5cblx0XHRwaXhlbFBvc2l0aW9uOiBmdW5jdGlvbigpIHtcblx0XHRcdGlmICggcGl4ZWxQb3NpdGlvblZhbCA9PSBudWxsICkge1xuXHRcdFx0XHRjb21wdXRlU3R5bGVUZXN0cygpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHBpeGVsUG9zaXRpb25WYWw7XG5cdFx0fSxcblxuXHRcdHJlbGlhYmxlTWFyZ2luUmlnaHQ6IGZ1bmN0aW9uKCkge1xuXG5cdFx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDIuM1xuXHRcdFx0aWYgKCBwaXhlbFBvc2l0aW9uVmFsID09IG51bGwgKSB7XG5cdFx0XHRcdGNvbXB1dGVTdHlsZVRlc3RzKCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcmVsaWFibGVNYXJnaW5SaWdodFZhbDtcblx0XHR9LFxuXG5cdFx0cmVsaWFibGVNYXJnaW5MZWZ0OiBmdW5jdGlvbigpIHtcblxuXHRcdFx0Ly8gU3VwcG9ydDogSUUgPD04IG9ubHksIEFuZHJvaWQgNC4wIC0gNC4zIG9ubHksIEZpcmVmb3ggPD0zIC0gMzdcblx0XHRcdGlmICggcGl4ZWxQb3NpdGlvblZhbCA9PSBudWxsICkge1xuXHRcdFx0XHRjb21wdXRlU3R5bGVUZXN0cygpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHJlbGlhYmxlTWFyZ2luTGVmdFZhbDtcblx0XHR9XG5cdH0gKTtcblxuXHRmdW5jdGlvbiBjb21wdXRlU3R5bGVUZXN0cygpIHtcblx0XHR2YXIgY29udGVudHMsIGRpdlN0eWxlLFxuXHRcdFx0ZG9jdW1lbnRFbGVtZW50ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuXG5cdFx0Ly8gU2V0dXBcblx0XHRkb2N1bWVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoIGNvbnRhaW5lciApO1xuXG5cdFx0ZGl2LnN0eWxlLmNzc1RleHQgPVxuXG5cdFx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDIuM1xuXHRcdFx0Ly8gVmVuZG9yLXByZWZpeCBib3gtc2l6aW5nXG5cdFx0XHRcIi13ZWJraXQtYm94LXNpemluZzpib3JkZXItYm94O2JveC1zaXppbmc6Ym9yZGVyLWJveDtcIiArXG5cdFx0XHRcInBvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6YmxvY2s7XCIgK1xuXHRcdFx0XCJtYXJnaW46YXV0bztib3JkZXI6MXB4O3BhZGRpbmc6MXB4O1wiICtcblx0XHRcdFwidG9wOjElO3dpZHRoOjUwJVwiO1xuXG5cdFx0Ly8gU3VwcG9ydDogSUU8OVxuXHRcdC8vIEFzc3VtZSByZWFzb25hYmxlIHZhbHVlcyBpbiB0aGUgYWJzZW5jZSBvZiBnZXRDb21wdXRlZFN0eWxlXG5cdFx0cGl4ZWxQb3NpdGlvblZhbCA9IGJveFNpemluZ1JlbGlhYmxlVmFsID0gcmVsaWFibGVNYXJnaW5MZWZ0VmFsID0gZmFsc2U7XG5cdFx0cGl4ZWxNYXJnaW5SaWdodFZhbCA9IHJlbGlhYmxlTWFyZ2luUmlnaHRWYWwgPSB0cnVlO1xuXG5cdFx0Ly8gQ2hlY2sgZm9yIGdldENvbXB1dGVkU3R5bGUgc28gdGhhdCB0aGlzIGNvZGUgaXMgbm90IHJ1biBpbiBJRTw5LlxuXHRcdGlmICggd2luZG93LmdldENvbXB1dGVkU3R5bGUgKSB7XG5cdFx0XHRkaXZTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKCBkaXYgKTtcblx0XHRcdHBpeGVsUG9zaXRpb25WYWwgPSAoIGRpdlN0eWxlIHx8IHt9ICkudG9wICE9PSBcIjElXCI7XG5cdFx0XHRyZWxpYWJsZU1hcmdpbkxlZnRWYWwgPSAoIGRpdlN0eWxlIHx8IHt9ICkubWFyZ2luTGVmdCA9PT0gXCIycHhcIjtcblx0XHRcdGJveFNpemluZ1JlbGlhYmxlVmFsID0gKCBkaXZTdHlsZSB8fCB7IHdpZHRoOiBcIjRweFwiIH0gKS53aWR0aCA9PT0gXCI0cHhcIjtcblxuXHRcdFx0Ly8gU3VwcG9ydDogQW5kcm9pZCA0LjAgLSA0LjMgb25seVxuXHRcdFx0Ly8gU29tZSBzdHlsZXMgY29tZSBiYWNrIHdpdGggcGVyY2VudGFnZSB2YWx1ZXMsIGV2ZW4gdGhvdWdoIHRoZXkgc2hvdWxkbid0XG5cdFx0XHRkaXYuc3R5bGUubWFyZ2luUmlnaHQgPSBcIjUwJVwiO1xuXHRcdFx0cGl4ZWxNYXJnaW5SaWdodFZhbCA9ICggZGl2U3R5bGUgfHwgeyBtYXJnaW5SaWdodDogXCI0cHhcIiB9ICkubWFyZ2luUmlnaHQgPT09IFwiNHB4XCI7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgMi4zIG9ubHlcblx0XHRcdC8vIERpdiB3aXRoIGV4cGxpY2l0IHdpZHRoIGFuZCBubyBtYXJnaW4tcmlnaHQgaW5jb3JyZWN0bHlcblx0XHRcdC8vIGdldHMgY29tcHV0ZWQgbWFyZ2luLXJpZ2h0IGJhc2VkIG9uIHdpZHRoIG9mIGNvbnRhaW5lciAoIzMzMzMpXG5cdFx0XHQvLyBXZWJLaXQgQnVnIDEzMzQzIC0gZ2V0Q29tcHV0ZWRTdHlsZSByZXR1cm5zIHdyb25nIHZhbHVlIGZvciBtYXJnaW4tcmlnaHRcblx0XHRcdGNvbnRlbnRzID0gZGl2LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImRpdlwiICkgKTtcblxuXHRcdFx0Ly8gUmVzZXQgQ1NTOiBib3gtc2l6aW5nOyBkaXNwbGF5OyBtYXJnaW47IGJvcmRlcjsgcGFkZGluZ1xuXHRcdFx0Y29udGVudHMuc3R5bGUuY3NzVGV4dCA9IGRpdi5zdHlsZS5jc3NUZXh0ID1cblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDIuM1xuXHRcdFx0XHQvLyBWZW5kb3ItcHJlZml4IGJveC1zaXppbmdcblx0XHRcdFx0XCItd2Via2l0LWJveC1zaXppbmc6Y29udGVudC1ib3g7LW1vei1ib3gtc2l6aW5nOmNvbnRlbnQtYm94O1wiICtcblx0XHRcdFx0XCJib3gtc2l6aW5nOmNvbnRlbnQtYm94O2Rpc3BsYXk6YmxvY2s7bWFyZ2luOjA7Ym9yZGVyOjA7cGFkZGluZzowXCI7XG5cdFx0XHRjb250ZW50cy5zdHlsZS5tYXJnaW5SaWdodCA9IGNvbnRlbnRzLnN0eWxlLndpZHRoID0gXCIwXCI7XG5cdFx0XHRkaXYuc3R5bGUud2lkdGggPSBcIjFweFwiO1xuXG5cdFx0XHRyZWxpYWJsZU1hcmdpblJpZ2h0VmFsID1cblx0XHRcdFx0IXBhcnNlRmxvYXQoICggd2luZG93LmdldENvbXB1dGVkU3R5bGUoIGNvbnRlbnRzICkgfHwge30gKS5tYXJnaW5SaWdodCApO1xuXG5cdFx0XHRkaXYucmVtb3ZlQ2hpbGQoIGNvbnRlbnRzICk7XG5cdFx0fVxuXG5cdFx0Ly8gU3VwcG9ydDogSUU2LThcblx0XHQvLyBGaXJzdCBjaGVjayB0aGF0IGdldENsaWVudFJlY3RzIHdvcmtzIGFzIGV4cGVjdGVkXG5cdFx0Ly8gQ2hlY2sgaWYgdGFibGUgY2VsbHMgc3RpbGwgaGF2ZSBvZmZzZXRXaWR0aC9IZWlnaHQgd2hlbiB0aGV5IGFyZSBzZXRcblx0XHQvLyB0byBkaXNwbGF5Om5vbmUgYW5kIHRoZXJlIGFyZSBzdGlsbCBvdGhlciB2aXNpYmxlIHRhYmxlIGNlbGxzIGluIGFcblx0XHQvLyB0YWJsZSByb3c7IGlmIHNvLCBvZmZzZXRXaWR0aC9IZWlnaHQgYXJlIG5vdCByZWxpYWJsZSBmb3IgdXNlIHdoZW5cblx0XHQvLyBkZXRlcm1pbmluZyBpZiBhbiBlbGVtZW50IGhhcyBiZWVuIGhpZGRlbiBkaXJlY3RseSB1c2luZ1xuXHRcdC8vIGRpc3BsYXk6bm9uZSAoaXQgaXMgc3RpbGwgc2FmZSB0byB1c2Ugb2Zmc2V0cyBpZiBhIHBhcmVudCBlbGVtZW50IGlzXG5cdFx0Ly8gaGlkZGVuOyBkb24gc2FmZXR5IGdvZ2dsZXMgYW5kIHNlZSBidWcgIzQ1MTIgZm9yIG1vcmUgaW5mb3JtYXRpb24pLlxuXHRcdGRpdi5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG5cdFx0cmVsaWFibGVIaWRkZW5PZmZzZXRzVmFsID0gZGl2LmdldENsaWVudFJlY3RzKCkubGVuZ3RoID09PSAwO1xuXHRcdGlmICggcmVsaWFibGVIaWRkZW5PZmZzZXRzVmFsICkge1xuXHRcdFx0ZGl2LnN0eWxlLmRpc3BsYXkgPSBcIlwiO1xuXHRcdFx0ZGl2LmlubmVySFRNTCA9IFwiPHRhYmxlPjx0cj48dGQ+PC90ZD48dGQ+dDwvdGQ+PC90cj48L3RhYmxlPlwiO1xuXHRcdFx0ZGl2LmNoaWxkTm9kZXNbIDAgXS5zdHlsZS5ib3JkZXJDb2xsYXBzZSA9IFwic2VwYXJhdGVcIjtcblx0XHRcdGNvbnRlbnRzID0gZGl2LmdldEVsZW1lbnRzQnlUYWdOYW1lKCBcInRkXCIgKTtcblx0XHRcdGNvbnRlbnRzWyAwIF0uc3R5bGUuY3NzVGV4dCA9IFwibWFyZ2luOjA7Ym9yZGVyOjA7cGFkZGluZzowO2Rpc3BsYXk6bm9uZVwiO1xuXHRcdFx0cmVsaWFibGVIaWRkZW5PZmZzZXRzVmFsID0gY29udGVudHNbIDAgXS5vZmZzZXRIZWlnaHQgPT09IDA7XG5cdFx0XHRpZiAoIHJlbGlhYmxlSGlkZGVuT2Zmc2V0c1ZhbCApIHtcblx0XHRcdFx0Y29udGVudHNbIDAgXS5zdHlsZS5kaXNwbGF5ID0gXCJcIjtcblx0XHRcdFx0Y29udGVudHNbIDEgXS5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG5cdFx0XHRcdHJlbGlhYmxlSGlkZGVuT2Zmc2V0c1ZhbCA9IGNvbnRlbnRzWyAwIF0ub2Zmc2V0SGVpZ2h0ID09PSAwO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFRlYXJkb3duXG5cdFx0ZG9jdW1lbnRFbGVtZW50LnJlbW92ZUNoaWxkKCBjb250YWluZXIgKTtcblx0fVxuXG59ICkoKTtcblxuXG52YXIgZ2V0U3R5bGVzLCBjdXJDU1MsXG5cdHJwb3NpdGlvbiA9IC9eKHRvcHxyaWdodHxib3R0b218bGVmdCkkLztcblxuaWYgKCB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSApIHtcblx0Z2V0U3R5bGVzID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHQvLyBTdXBwb3J0OiBJRTw9MTErLCBGaXJlZm94PD0zMCsgKCMxNTA5OCwgIzE0MTUwKVxuXHRcdC8vIElFIHRocm93cyBvbiBlbGVtZW50cyBjcmVhdGVkIGluIHBvcHVwc1xuXHRcdC8vIEZGIG1lYW53aGlsZSB0aHJvd3Mgb24gZnJhbWUgZWxlbWVudHMgdGhyb3VnaCBcImRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGVcIlxuXHRcdHZhciB2aWV3ID0gZWxlbS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3O1xuXG5cdFx0aWYgKCAhdmlldyB8fCAhdmlldy5vcGVuZXIgKSB7XG5cdFx0XHR2aWV3ID0gd2luZG93O1xuXHRcdH1cblxuXHRcdHJldHVybiB2aWV3LmdldENvbXB1dGVkU3R5bGUoIGVsZW0gKTtcblx0fTtcblxuXHRjdXJDU1MgPSBmdW5jdGlvbiggZWxlbSwgbmFtZSwgY29tcHV0ZWQgKSB7XG5cdFx0dmFyIHdpZHRoLCBtaW5XaWR0aCwgbWF4V2lkdGgsIHJldCxcblx0XHRcdHN0eWxlID0gZWxlbS5zdHlsZTtcblxuXHRcdGNvbXB1dGVkID0gY29tcHV0ZWQgfHwgZ2V0U3R5bGVzKCBlbGVtICk7XG5cblx0XHQvLyBnZXRQcm9wZXJ0eVZhbHVlIGlzIG9ubHkgbmVlZGVkIGZvciAuY3NzKCdmaWx0ZXInKSBpbiBJRTksIHNlZSAjMTI1Mzdcblx0XHRyZXQgPSBjb21wdXRlZCA/IGNvbXB1dGVkLmdldFByb3BlcnR5VmFsdWUoIG5hbWUgKSB8fCBjb21wdXRlZFsgbmFtZSBdIDogdW5kZWZpbmVkO1xuXG5cdFx0Ly8gU3VwcG9ydDogT3BlcmEgMTIuMXggb25seVxuXHRcdC8vIEZhbGwgYmFjayB0byBzdHlsZSBldmVuIHdpdGhvdXQgY29tcHV0ZWRcblx0XHQvLyBjb21wdXRlZCBpcyB1bmRlZmluZWQgZm9yIGVsZW1zIG9uIGRvY3VtZW50IGZyYWdtZW50c1xuXHRcdGlmICggKCByZXQgPT09IFwiXCIgfHwgcmV0ID09PSB1bmRlZmluZWQgKSAmJiAhalF1ZXJ5LmNvbnRhaW5zKCBlbGVtLm93bmVyRG9jdW1lbnQsIGVsZW0gKSApIHtcblx0XHRcdHJldCA9IGpRdWVyeS5zdHlsZSggZWxlbSwgbmFtZSApO1xuXHRcdH1cblxuXHRcdGlmICggY29tcHV0ZWQgKSB7XG5cblx0XHRcdC8vIEEgdHJpYnV0ZSB0byB0aGUgXCJhd2Vzb21lIGhhY2sgYnkgRGVhbiBFZHdhcmRzXCJcblx0XHRcdC8vIENocm9tZSA8IDE3IGFuZCBTYWZhcmkgNS4wIHVzZXMgXCJjb21wdXRlZCB2YWx1ZVwiXG5cdFx0XHQvLyBpbnN0ZWFkIG9mIFwidXNlZCB2YWx1ZVwiIGZvciBtYXJnaW4tcmlnaHRcblx0XHRcdC8vIFNhZmFyaSA1LjEuNyAoYXQgbGVhc3QpIHJldHVybnMgcGVyY2VudGFnZSBmb3IgYSBsYXJnZXIgc2V0IG9mIHZhbHVlcyxcblx0XHRcdC8vIGJ1dCB3aWR0aCBzZWVtcyB0byBiZSByZWxpYWJseSBwaXhlbHNcblx0XHRcdC8vIHRoaXMgaXMgYWdhaW5zdCB0aGUgQ1NTT00gZHJhZnQgc3BlYzpcblx0XHRcdC8vIGh0dHA6Ly9kZXYudzMub3JnL2Nzc3dnL2Nzc29tLyNyZXNvbHZlZC12YWx1ZXNcblx0XHRcdGlmICggIXN1cHBvcnQucGl4ZWxNYXJnaW5SaWdodCgpICYmIHJudW1ub25weC50ZXN0KCByZXQgKSAmJiBybWFyZ2luLnRlc3QoIG5hbWUgKSApIHtcblxuXHRcdFx0XHQvLyBSZW1lbWJlciB0aGUgb3JpZ2luYWwgdmFsdWVzXG5cdFx0XHRcdHdpZHRoID0gc3R5bGUud2lkdGg7XG5cdFx0XHRcdG1pbldpZHRoID0gc3R5bGUubWluV2lkdGg7XG5cdFx0XHRcdG1heFdpZHRoID0gc3R5bGUubWF4V2lkdGg7XG5cblx0XHRcdFx0Ly8gUHV0IGluIHRoZSBuZXcgdmFsdWVzIHRvIGdldCBhIGNvbXB1dGVkIHZhbHVlIG91dFxuXHRcdFx0XHRzdHlsZS5taW5XaWR0aCA9IHN0eWxlLm1heFdpZHRoID0gc3R5bGUud2lkdGggPSByZXQ7XG5cdFx0XHRcdHJldCA9IGNvbXB1dGVkLndpZHRoO1xuXG5cdFx0XHRcdC8vIFJldmVydCB0aGUgY2hhbmdlZCB2YWx1ZXNcblx0XHRcdFx0c3R5bGUud2lkdGggPSB3aWR0aDtcblx0XHRcdFx0c3R5bGUubWluV2lkdGggPSBtaW5XaWR0aDtcblx0XHRcdFx0c3R5bGUubWF4V2lkdGggPSBtYXhXaWR0aDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBTdXBwb3J0OiBJRVxuXHRcdC8vIElFIHJldHVybnMgekluZGV4IHZhbHVlIGFzIGFuIGludGVnZXIuXG5cdFx0cmV0dXJuIHJldCA9PT0gdW5kZWZpbmVkID9cblx0XHRcdHJldCA6XG5cdFx0XHRyZXQgKyBcIlwiO1xuXHR9O1xufSBlbHNlIGlmICggZG9jdW1lbnRFbGVtZW50LmN1cnJlbnRTdHlsZSApIHtcblx0Z2V0U3R5bGVzID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIGVsZW0uY3VycmVudFN0eWxlO1xuXHR9O1xuXG5cdGN1ckNTUyA9IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBjb21wdXRlZCApIHtcblx0XHR2YXIgbGVmdCwgcnMsIHJzTGVmdCwgcmV0LFxuXHRcdFx0c3R5bGUgPSBlbGVtLnN0eWxlO1xuXG5cdFx0Y29tcHV0ZWQgPSBjb21wdXRlZCB8fCBnZXRTdHlsZXMoIGVsZW0gKTtcblx0XHRyZXQgPSBjb21wdXRlZCA/IGNvbXB1dGVkWyBuYW1lIF0gOiB1bmRlZmluZWQ7XG5cblx0XHQvLyBBdm9pZCBzZXR0aW5nIHJldCB0byBlbXB0eSBzdHJpbmcgaGVyZVxuXHRcdC8vIHNvIHdlIGRvbid0IGRlZmF1bHQgdG8gYXV0b1xuXHRcdGlmICggcmV0ID09IG51bGwgJiYgc3R5bGUgJiYgc3R5bGVbIG5hbWUgXSApIHtcblx0XHRcdHJldCA9IHN0eWxlWyBuYW1lIF07XG5cdFx0fVxuXG5cdFx0Ly8gRnJvbSB0aGUgYXdlc29tZSBoYWNrIGJ5IERlYW4gRWR3YXJkc1xuXHRcdC8vIGh0dHA6Ly9lcmlrLmVhZS5uZXQvYXJjaGl2ZXMvMjAwNy8wNy8yNy8xOC41NC4xNS8jY29tbWVudC0xMDIyOTFcblxuXHRcdC8vIElmIHdlJ3JlIG5vdCBkZWFsaW5nIHdpdGggYSByZWd1bGFyIHBpeGVsIG51bWJlclxuXHRcdC8vIGJ1dCBhIG51bWJlciB0aGF0IGhhcyBhIHdlaXJkIGVuZGluZywgd2UgbmVlZCB0byBjb252ZXJ0IGl0IHRvIHBpeGVsc1xuXHRcdC8vIGJ1dCBub3QgcG9zaXRpb24gY3NzIGF0dHJpYnV0ZXMsIGFzIHRob3NlIGFyZVxuXHRcdC8vIHByb3BvcnRpb25hbCB0byB0aGUgcGFyZW50IGVsZW1lbnQgaW5zdGVhZFxuXHRcdC8vIGFuZCB3ZSBjYW4ndCBtZWFzdXJlIHRoZSBwYXJlbnQgaW5zdGVhZCBiZWNhdXNlIGl0XG5cdFx0Ly8gbWlnaHQgdHJpZ2dlciBhIFwic3RhY2tpbmcgZG9sbHNcIiBwcm9ibGVtXG5cdFx0aWYgKCBybnVtbm9ucHgudGVzdCggcmV0ICkgJiYgIXJwb3NpdGlvbi50ZXN0KCBuYW1lICkgKSB7XG5cblx0XHRcdC8vIFJlbWVtYmVyIHRoZSBvcmlnaW5hbCB2YWx1ZXNcblx0XHRcdGxlZnQgPSBzdHlsZS5sZWZ0O1xuXHRcdFx0cnMgPSBlbGVtLnJ1bnRpbWVTdHlsZTtcblx0XHRcdHJzTGVmdCA9IHJzICYmIHJzLmxlZnQ7XG5cblx0XHRcdC8vIFB1dCBpbiB0aGUgbmV3IHZhbHVlcyB0byBnZXQgYSBjb21wdXRlZCB2YWx1ZSBvdXRcblx0XHRcdGlmICggcnNMZWZ0ICkge1xuXHRcdFx0XHRycy5sZWZ0ID0gZWxlbS5jdXJyZW50U3R5bGUubGVmdDtcblx0XHRcdH1cblx0XHRcdHN0eWxlLmxlZnQgPSBuYW1lID09PSBcImZvbnRTaXplXCIgPyBcIjFlbVwiIDogcmV0O1xuXHRcdFx0cmV0ID0gc3R5bGUucGl4ZWxMZWZ0ICsgXCJweFwiO1xuXG5cdFx0XHQvLyBSZXZlcnQgdGhlIGNoYW5nZWQgdmFsdWVzXG5cdFx0XHRzdHlsZS5sZWZ0ID0gbGVmdDtcblx0XHRcdGlmICggcnNMZWZ0ICkge1xuXHRcdFx0XHRycy5sZWZ0ID0gcnNMZWZ0O1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFN1cHBvcnQ6IElFXG5cdFx0Ly8gSUUgcmV0dXJucyB6SW5kZXggdmFsdWUgYXMgYW4gaW50ZWdlci5cblx0XHRyZXR1cm4gcmV0ID09PSB1bmRlZmluZWQgP1xuXHRcdFx0cmV0IDpcblx0XHRcdHJldCArIFwiXCIgfHwgXCJhdXRvXCI7XG5cdH07XG59XG5cblxuXG5cbmZ1bmN0aW9uIGFkZEdldEhvb2tJZiggY29uZGl0aW9uRm4sIGhvb2tGbiApIHtcblxuXHQvLyBEZWZpbmUgdGhlIGhvb2ssIHdlJ2xsIGNoZWNrIG9uIHRoZSBmaXJzdCBydW4gaWYgaXQncyByZWFsbHkgbmVlZGVkLlxuXHRyZXR1cm4ge1xuXHRcdGdldDogZnVuY3Rpb24oKSB7XG5cdFx0XHRpZiAoIGNvbmRpdGlvbkZuKCkgKSB7XG5cblx0XHRcdFx0Ly8gSG9vayBub3QgbmVlZGVkIChvciBpdCdzIG5vdCBwb3NzaWJsZSB0byB1c2UgaXQgZHVlXG5cdFx0XHRcdC8vIHRvIG1pc3NpbmcgZGVwZW5kZW5jeSksIHJlbW92ZSBpdC5cblx0XHRcdFx0ZGVsZXRlIHRoaXMuZ2V0O1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdC8vIEhvb2sgbmVlZGVkOyByZWRlZmluZSBpdCBzbyB0aGF0IHRoZSBzdXBwb3J0IHRlc3QgaXMgbm90IGV4ZWN1dGVkIGFnYWluLlxuXHRcdFx0cmV0dXJuICggdGhpcy5nZXQgPSBob29rRm4gKS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0fVxuXHR9O1xufVxuXG5cbnZhclxuXG5cdFx0cmFscGhhID0gL2FscGhhXFwoW14pXSpcXCkvaSxcblx0cm9wYWNpdHkgPSAvb3BhY2l0eVxccyo9XFxzKihbXildKikvaSxcblxuXHQvLyBzd2FwcGFibGUgaWYgZGlzcGxheSBpcyBub25lIG9yIHN0YXJ0cyB3aXRoIHRhYmxlIGV4Y2VwdFxuXHQvLyBcInRhYmxlXCIsIFwidGFibGUtY2VsbFwiLCBvciBcInRhYmxlLWNhcHRpb25cIlxuXHQvLyBzZWUgaGVyZSBmb3IgZGlzcGxheSB2YWx1ZXM6XG5cdC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvQ1NTL2Rpc3BsYXlcblx0cmRpc3BsYXlzd2FwID0gL14obm9uZXx0YWJsZSg/IS1jW2VhXSkuKykvLFxuXHRybnVtc3BsaXQgPSBuZXcgUmVnRXhwKCBcIl4oXCIgKyBwbnVtICsgXCIpKC4qKSRcIiwgXCJpXCIgKSxcblxuXHRjc3NTaG93ID0geyBwb3NpdGlvbjogXCJhYnNvbHV0ZVwiLCB2aXNpYmlsaXR5OiBcImhpZGRlblwiLCBkaXNwbGF5OiBcImJsb2NrXCIgfSxcblx0Y3NzTm9ybWFsVHJhbnNmb3JtID0ge1xuXHRcdGxldHRlclNwYWNpbmc6IFwiMFwiLFxuXHRcdGZvbnRXZWlnaHQ6IFwiNDAwXCJcblx0fSxcblxuXHRjc3NQcmVmaXhlcyA9IFsgXCJXZWJraXRcIiwgXCJPXCIsIFwiTW96XCIsIFwibXNcIiBdLFxuXHRlbXB0eVN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJkaXZcIiApLnN0eWxlO1xuXG5cbi8vIHJldHVybiBhIGNzcyBwcm9wZXJ0eSBtYXBwZWQgdG8gYSBwb3RlbnRpYWxseSB2ZW5kb3IgcHJlZml4ZWQgcHJvcGVydHlcbmZ1bmN0aW9uIHZlbmRvclByb3BOYW1lKCBuYW1lICkge1xuXG5cdC8vIHNob3J0Y3V0IGZvciBuYW1lcyB0aGF0IGFyZSBub3QgdmVuZG9yIHByZWZpeGVkXG5cdGlmICggbmFtZSBpbiBlbXB0eVN0eWxlICkge1xuXHRcdHJldHVybiBuYW1lO1xuXHR9XG5cblx0Ly8gY2hlY2sgZm9yIHZlbmRvciBwcmVmaXhlZCBuYW1lc1xuXHR2YXIgY2FwTmFtZSA9IG5hbWUuY2hhckF0KCAwICkudG9VcHBlckNhc2UoKSArIG5hbWUuc2xpY2UoIDEgKSxcblx0XHRpID0gY3NzUHJlZml4ZXMubGVuZ3RoO1xuXG5cdHdoaWxlICggaS0tICkge1xuXHRcdG5hbWUgPSBjc3NQcmVmaXhlc1sgaSBdICsgY2FwTmFtZTtcblx0XHRpZiAoIG5hbWUgaW4gZW1wdHlTdHlsZSApIHtcblx0XHRcdHJldHVybiBuYW1lO1xuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiBzaG93SGlkZSggZWxlbWVudHMsIHNob3cgKSB7XG5cdHZhciBkaXNwbGF5LCBlbGVtLCBoaWRkZW4sXG5cdFx0dmFsdWVzID0gW10sXG5cdFx0aW5kZXggPSAwLFxuXHRcdGxlbmd0aCA9IGVsZW1lbnRzLmxlbmd0aDtcblxuXHRmb3IgKCA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkge1xuXHRcdGVsZW0gPSBlbGVtZW50c1sgaW5kZXggXTtcblx0XHRpZiAoICFlbGVtLnN0eWxlICkge1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXG5cdFx0dmFsdWVzWyBpbmRleCBdID0galF1ZXJ5Ll9kYXRhKCBlbGVtLCBcIm9sZGRpc3BsYXlcIiApO1xuXHRcdGRpc3BsYXkgPSBlbGVtLnN0eWxlLmRpc3BsYXk7XG5cdFx0aWYgKCBzaG93ICkge1xuXG5cdFx0XHQvLyBSZXNldCB0aGUgaW5saW5lIGRpc3BsYXkgb2YgdGhpcyBlbGVtZW50IHRvIGxlYXJuIGlmIGl0IGlzXG5cdFx0XHQvLyBiZWluZyBoaWRkZW4gYnkgY2FzY2FkZWQgcnVsZXMgb3Igbm90XG5cdFx0XHRpZiAoICF2YWx1ZXNbIGluZGV4IF0gJiYgZGlzcGxheSA9PT0gXCJub25lXCIgKSB7XG5cdFx0XHRcdGVsZW0uc3R5bGUuZGlzcGxheSA9IFwiXCI7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFNldCBlbGVtZW50cyB3aGljaCBoYXZlIGJlZW4gb3ZlcnJpZGRlbiB3aXRoIGRpc3BsYXk6IG5vbmVcblx0XHRcdC8vIGluIGEgc3R5bGVzaGVldCB0byB3aGF0ZXZlciB0aGUgZGVmYXVsdCBicm93c2VyIHN0eWxlIGlzXG5cdFx0XHQvLyBmb3Igc3VjaCBhbiBlbGVtZW50XG5cdFx0XHRpZiAoIGVsZW0uc3R5bGUuZGlzcGxheSA9PT0gXCJcIiAmJiBpc0hpZGRlbiggZWxlbSApICkge1xuXHRcdFx0XHR2YWx1ZXNbIGluZGV4IF0gPVxuXHRcdFx0XHRcdGpRdWVyeS5fZGF0YSggZWxlbSwgXCJvbGRkaXNwbGF5XCIsIGRlZmF1bHREaXNwbGF5KCBlbGVtLm5vZGVOYW1lICkgKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0aGlkZGVuID0gaXNIaWRkZW4oIGVsZW0gKTtcblxuXHRcdFx0aWYgKCBkaXNwbGF5ICYmIGRpc3BsYXkgIT09IFwibm9uZVwiIHx8ICFoaWRkZW4gKSB7XG5cdFx0XHRcdGpRdWVyeS5fZGF0YShcblx0XHRcdFx0XHRlbGVtLFxuXHRcdFx0XHRcdFwib2xkZGlzcGxheVwiLFxuXHRcdFx0XHRcdGhpZGRlbiA/IGRpc3BsYXkgOiBqUXVlcnkuY3NzKCBlbGVtLCBcImRpc3BsYXlcIiApXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gU2V0IHRoZSBkaXNwbGF5IG9mIG1vc3Qgb2YgdGhlIGVsZW1lbnRzIGluIGEgc2Vjb25kIGxvb3Bcblx0Ly8gdG8gYXZvaWQgdGhlIGNvbnN0YW50IHJlZmxvd1xuXHRmb3IgKCBpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkge1xuXHRcdGVsZW0gPSBlbGVtZW50c1sgaW5kZXggXTtcblx0XHRpZiAoICFlbGVtLnN0eWxlICkge1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXHRcdGlmICggIXNob3cgfHwgZWxlbS5zdHlsZS5kaXNwbGF5ID09PSBcIm5vbmVcIiB8fCBlbGVtLnN0eWxlLmRpc3BsYXkgPT09IFwiXCIgKSB7XG5cdFx0XHRlbGVtLnN0eWxlLmRpc3BsYXkgPSBzaG93ID8gdmFsdWVzWyBpbmRleCBdIHx8IFwiXCIgOiBcIm5vbmVcIjtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gZWxlbWVudHM7XG59XG5cbmZ1bmN0aW9uIHNldFBvc2l0aXZlTnVtYmVyKCBlbGVtLCB2YWx1ZSwgc3VidHJhY3QgKSB7XG5cdHZhciBtYXRjaGVzID0gcm51bXNwbGl0LmV4ZWMoIHZhbHVlICk7XG5cdHJldHVybiBtYXRjaGVzID9cblxuXHRcdC8vIEd1YXJkIGFnYWluc3QgdW5kZWZpbmVkIFwic3VidHJhY3RcIiwgZS5nLiwgd2hlbiB1c2VkIGFzIGluIGNzc0hvb2tzXG5cdFx0TWF0aC5tYXgoIDAsIG1hdGNoZXNbIDEgXSAtICggc3VidHJhY3QgfHwgMCApICkgKyAoIG1hdGNoZXNbIDIgXSB8fCBcInB4XCIgKSA6XG5cdFx0dmFsdWU7XG59XG5cbmZ1bmN0aW9uIGF1Z21lbnRXaWR0aE9ySGVpZ2h0KCBlbGVtLCBuYW1lLCBleHRyYSwgaXNCb3JkZXJCb3gsIHN0eWxlcyApIHtcblx0dmFyIGkgPSBleHRyYSA9PT0gKCBpc0JvcmRlckJveCA/IFwiYm9yZGVyXCIgOiBcImNvbnRlbnRcIiApID9cblxuXHRcdC8vIElmIHdlIGFscmVhZHkgaGF2ZSB0aGUgcmlnaHQgbWVhc3VyZW1lbnQsIGF2b2lkIGF1Z21lbnRhdGlvblxuXHRcdDQgOlxuXG5cdFx0Ly8gT3RoZXJ3aXNlIGluaXRpYWxpemUgZm9yIGhvcml6b250YWwgb3IgdmVydGljYWwgcHJvcGVydGllc1xuXHRcdG5hbWUgPT09IFwid2lkdGhcIiA/IDEgOiAwLFxuXG5cdFx0dmFsID0gMDtcblxuXHRmb3IgKCA7IGkgPCA0OyBpICs9IDIgKSB7XG5cblx0XHQvLyBib3RoIGJveCBtb2RlbHMgZXhjbHVkZSBtYXJnaW4sIHNvIGFkZCBpdCBpZiB3ZSB3YW50IGl0XG5cdFx0aWYgKCBleHRyYSA9PT0gXCJtYXJnaW5cIiApIHtcblx0XHRcdHZhbCArPSBqUXVlcnkuY3NzKCBlbGVtLCBleHRyYSArIGNzc0V4cGFuZFsgaSBdLCB0cnVlLCBzdHlsZXMgKTtcblx0XHR9XG5cblx0XHRpZiAoIGlzQm9yZGVyQm94ICkge1xuXG5cdFx0XHQvLyBib3JkZXItYm94IGluY2x1ZGVzIHBhZGRpbmcsIHNvIHJlbW92ZSBpdCBpZiB3ZSB3YW50IGNvbnRlbnRcblx0XHRcdGlmICggZXh0cmEgPT09IFwiY29udGVudFwiICkge1xuXHRcdFx0XHR2YWwgLT0galF1ZXJ5LmNzcyggZWxlbSwgXCJwYWRkaW5nXCIgKyBjc3NFeHBhbmRbIGkgXSwgdHJ1ZSwgc3R5bGVzICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIGF0IHRoaXMgcG9pbnQsIGV4dHJhIGlzbid0IGJvcmRlciBub3IgbWFyZ2luLCBzbyByZW1vdmUgYm9yZGVyXG5cdFx0XHRpZiAoIGV4dHJhICE9PSBcIm1hcmdpblwiICkge1xuXHRcdFx0XHR2YWwgLT0galF1ZXJ5LmNzcyggZWxlbSwgXCJib3JkZXJcIiArIGNzc0V4cGFuZFsgaSBdICsgXCJXaWR0aFwiLCB0cnVlLCBzdHlsZXMgKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBhdCB0aGlzIHBvaW50LCBleHRyYSBpc24ndCBjb250ZW50LCBzbyBhZGQgcGFkZGluZ1xuXHRcdFx0dmFsICs9IGpRdWVyeS5jc3MoIGVsZW0sIFwicGFkZGluZ1wiICsgY3NzRXhwYW5kWyBpIF0sIHRydWUsIHN0eWxlcyApO1xuXG5cdFx0XHQvLyBhdCB0aGlzIHBvaW50LCBleHRyYSBpc24ndCBjb250ZW50IG5vciBwYWRkaW5nLCBzbyBhZGQgYm9yZGVyXG5cdFx0XHRpZiAoIGV4dHJhICE9PSBcInBhZGRpbmdcIiApIHtcblx0XHRcdFx0dmFsICs9IGpRdWVyeS5jc3MoIGVsZW0sIFwiYm9yZGVyXCIgKyBjc3NFeHBhbmRbIGkgXSArIFwiV2lkdGhcIiwgdHJ1ZSwgc3R5bGVzICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHZhbDtcbn1cblxuZnVuY3Rpb24gZ2V0V2lkdGhPckhlaWdodCggZWxlbSwgbmFtZSwgZXh0cmEgKSB7XG5cblx0Ly8gU3RhcnQgd2l0aCBvZmZzZXQgcHJvcGVydHksIHdoaWNoIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGJvcmRlci1ib3ggdmFsdWVcblx0dmFyIHZhbHVlSXNCb3JkZXJCb3ggPSB0cnVlLFxuXHRcdHZhbCA9IG5hbWUgPT09IFwid2lkdGhcIiA/IGVsZW0ub2Zmc2V0V2lkdGggOiBlbGVtLm9mZnNldEhlaWdodCxcblx0XHRzdHlsZXMgPSBnZXRTdHlsZXMoIGVsZW0gKSxcblx0XHRpc0JvcmRlckJveCA9IHN1cHBvcnQuYm94U2l6aW5nICYmXG5cdFx0XHRqUXVlcnkuY3NzKCBlbGVtLCBcImJveFNpemluZ1wiLCBmYWxzZSwgc3R5bGVzICkgPT09IFwiYm9yZGVyLWJveFwiO1xuXG5cdC8vIHNvbWUgbm9uLWh0bWwgZWxlbWVudHMgcmV0dXJuIHVuZGVmaW5lZCBmb3Igb2Zmc2V0V2lkdGgsIHNvIGNoZWNrIGZvciBudWxsL3VuZGVmaW5lZFxuXHQvLyBzdmcgLSBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD02NDkyODVcblx0Ly8gTWF0aE1MIC0gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDkxNjY4XG5cdGlmICggdmFsIDw9IDAgfHwgdmFsID09IG51bGwgKSB7XG5cblx0XHQvLyBGYWxsIGJhY2sgdG8gY29tcHV0ZWQgdGhlbiB1bmNvbXB1dGVkIGNzcyBpZiBuZWNlc3Nhcnlcblx0XHR2YWwgPSBjdXJDU1MoIGVsZW0sIG5hbWUsIHN0eWxlcyApO1xuXHRcdGlmICggdmFsIDwgMCB8fCB2YWwgPT0gbnVsbCApIHtcblx0XHRcdHZhbCA9IGVsZW0uc3R5bGVbIG5hbWUgXTtcblx0XHR9XG5cblx0XHQvLyBDb21wdXRlZCB1bml0IGlzIG5vdCBwaXhlbHMuIFN0b3AgaGVyZSBhbmQgcmV0dXJuLlxuXHRcdGlmICggcm51bW5vbnB4LnRlc3QoIHZhbCApICkge1xuXHRcdFx0cmV0dXJuIHZhbDtcblx0XHR9XG5cblx0XHQvLyB3ZSBuZWVkIHRoZSBjaGVjayBmb3Igc3R5bGUgaW4gY2FzZSBhIGJyb3dzZXIgd2hpY2ggcmV0dXJucyB1bnJlbGlhYmxlIHZhbHVlc1xuXHRcdC8vIGZvciBnZXRDb21wdXRlZFN0eWxlIHNpbGVudGx5IGZhbGxzIGJhY2sgdG8gdGhlIHJlbGlhYmxlIGVsZW0uc3R5bGVcblx0XHR2YWx1ZUlzQm9yZGVyQm94ID0gaXNCb3JkZXJCb3ggJiZcblx0XHRcdCggc3VwcG9ydC5ib3hTaXppbmdSZWxpYWJsZSgpIHx8IHZhbCA9PT0gZWxlbS5zdHlsZVsgbmFtZSBdICk7XG5cblx0XHQvLyBOb3JtYWxpemUgXCJcIiwgYXV0bywgYW5kIHByZXBhcmUgZm9yIGV4dHJhXG5cdFx0dmFsID0gcGFyc2VGbG9hdCggdmFsICkgfHwgMDtcblx0fVxuXG5cdC8vIHVzZSB0aGUgYWN0aXZlIGJveC1zaXppbmcgbW9kZWwgdG8gYWRkL3N1YnRyYWN0IGlycmVsZXZhbnQgc3R5bGVzXG5cdHJldHVybiAoIHZhbCArXG5cdFx0YXVnbWVudFdpZHRoT3JIZWlnaHQoXG5cdFx0XHRlbGVtLFxuXHRcdFx0bmFtZSxcblx0XHRcdGV4dHJhIHx8ICggaXNCb3JkZXJCb3ggPyBcImJvcmRlclwiIDogXCJjb250ZW50XCIgKSxcblx0XHRcdHZhbHVlSXNCb3JkZXJCb3gsXG5cdFx0XHRzdHlsZXNcblx0XHQpXG5cdCkgKyBcInB4XCI7XG59XG5cbmpRdWVyeS5leHRlbmQoIHtcblxuXHQvLyBBZGQgaW4gc3R5bGUgcHJvcGVydHkgaG9va3MgZm9yIG92ZXJyaWRpbmcgdGhlIGRlZmF1bHRcblx0Ly8gYmVoYXZpb3Igb2YgZ2V0dGluZyBhbmQgc2V0dGluZyBhIHN0eWxlIHByb3BlcnR5XG5cdGNzc0hvb2tzOiB7XG5cdFx0b3BhY2l0eToge1xuXHRcdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7XG5cdFx0XHRcdGlmICggY29tcHV0ZWQgKSB7XG5cblx0XHRcdFx0XHQvLyBXZSBzaG91bGQgYWx3YXlzIGdldCBhIG51bWJlciBiYWNrIGZyb20gb3BhY2l0eVxuXHRcdFx0XHRcdHZhciByZXQgPSBjdXJDU1MoIGVsZW0sIFwib3BhY2l0eVwiICk7XG5cdFx0XHRcdFx0cmV0dXJuIHJldCA9PT0gXCJcIiA/IFwiMVwiIDogcmV0O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdC8vIERvbid0IGF1dG9tYXRpY2FsbHkgYWRkIFwicHhcIiB0byB0aGVzZSBwb3NzaWJseS11bml0bGVzcyBwcm9wZXJ0aWVzXG5cdGNzc051bWJlcjoge1xuXHRcdFwiYW5pbWF0aW9uSXRlcmF0aW9uQ291bnRcIjogdHJ1ZSxcblx0XHRcImNvbHVtbkNvdW50XCI6IHRydWUsXG5cdFx0XCJmaWxsT3BhY2l0eVwiOiB0cnVlLFxuXHRcdFwiZmxleEdyb3dcIjogdHJ1ZSxcblx0XHRcImZsZXhTaHJpbmtcIjogdHJ1ZSxcblx0XHRcImZvbnRXZWlnaHRcIjogdHJ1ZSxcblx0XHRcImxpbmVIZWlnaHRcIjogdHJ1ZSxcblx0XHRcIm9wYWNpdHlcIjogdHJ1ZSxcblx0XHRcIm9yZGVyXCI6IHRydWUsXG5cdFx0XCJvcnBoYW5zXCI6IHRydWUsXG5cdFx0XCJ3aWRvd3NcIjogdHJ1ZSxcblx0XHRcInpJbmRleFwiOiB0cnVlLFxuXHRcdFwiem9vbVwiOiB0cnVlXG5cdH0sXG5cblx0Ly8gQWRkIGluIHByb3BlcnRpZXMgd2hvc2UgbmFtZXMgeW91IHdpc2ggdG8gZml4IGJlZm9yZVxuXHQvLyBzZXR0aW5nIG9yIGdldHRpbmcgdGhlIHZhbHVlXG5cdGNzc1Byb3BzOiB7XG5cblx0XHQvLyBub3JtYWxpemUgZmxvYXQgY3NzIHByb3BlcnR5XG5cdFx0XCJmbG9hdFwiOiBzdXBwb3J0LmNzc0Zsb2F0ID8gXCJjc3NGbG9hdFwiIDogXCJzdHlsZUZsb2F0XCJcblx0fSxcblxuXHQvLyBHZXQgYW5kIHNldCB0aGUgc3R5bGUgcHJvcGVydHkgb24gYSBET00gTm9kZVxuXHRzdHlsZTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlLCBleHRyYSApIHtcblxuXHRcdC8vIERvbid0IHNldCBzdHlsZXMgb24gdGV4dCBhbmQgY29tbWVudCBub2Rlc1xuXHRcdGlmICggIWVsZW0gfHwgZWxlbS5ub2RlVHlwZSA9PT0gMyB8fCBlbGVtLm5vZGVUeXBlID09PSA4IHx8ICFlbGVtLnN0eWxlICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIE1ha2Ugc3VyZSB0aGF0IHdlJ3JlIHdvcmtpbmcgd2l0aCB0aGUgcmlnaHQgbmFtZVxuXHRcdHZhciByZXQsIHR5cGUsIGhvb2tzLFxuXHRcdFx0b3JpZ05hbWUgPSBqUXVlcnkuY2FtZWxDYXNlKCBuYW1lICksXG5cdFx0XHRzdHlsZSA9IGVsZW0uc3R5bGU7XG5cblx0XHRuYW1lID0galF1ZXJ5LmNzc1Byb3BzWyBvcmlnTmFtZSBdIHx8XG5cdFx0XHQoIGpRdWVyeS5jc3NQcm9wc1sgb3JpZ05hbWUgXSA9IHZlbmRvclByb3BOYW1lKCBvcmlnTmFtZSApIHx8IG9yaWdOYW1lICk7XG5cblx0XHQvLyBnZXRzIGhvb2sgZm9yIHRoZSBwcmVmaXhlZCB2ZXJzaW9uXG5cdFx0Ly8gZm9sbG93ZWQgYnkgdGhlIHVucHJlZml4ZWQgdmVyc2lvblxuXHRcdGhvb2tzID0galF1ZXJ5LmNzc0hvb2tzWyBuYW1lIF0gfHwgalF1ZXJ5LmNzc0hvb2tzWyBvcmlnTmFtZSBdO1xuXG5cdFx0Ly8gQ2hlY2sgaWYgd2UncmUgc2V0dGluZyBhIHZhbHVlXG5cdFx0aWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0dHlwZSA9IHR5cGVvZiB2YWx1ZTtcblxuXHRcdFx0Ly8gQ29udmVydCBcIis9XCIgb3IgXCItPVwiIHRvIHJlbGF0aXZlIG51bWJlcnMgKCM3MzQ1KVxuXHRcdFx0aWYgKCB0eXBlID09PSBcInN0cmluZ1wiICYmICggcmV0ID0gcmNzc051bS5leGVjKCB2YWx1ZSApICkgJiYgcmV0WyAxIF0gKSB7XG5cdFx0XHRcdHZhbHVlID0gYWRqdXN0Q1NTKCBlbGVtLCBuYW1lLCByZXQgKTtcblxuXHRcdFx0XHQvLyBGaXhlcyBidWcgIzkyMzdcblx0XHRcdFx0dHlwZSA9IFwibnVtYmVyXCI7XG5cdFx0XHR9XG5cblx0XHRcdC8vIE1ha2Ugc3VyZSB0aGF0IG51bGwgYW5kIE5hTiB2YWx1ZXMgYXJlbid0IHNldC4gU2VlOiAjNzExNlxuXHRcdFx0aWYgKCB2YWx1ZSA9PSBudWxsIHx8IHZhbHVlICE9PSB2YWx1ZSApIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBJZiBhIG51bWJlciB3YXMgcGFzc2VkIGluLCBhZGQgdGhlIHVuaXQgKGV4Y2VwdCBmb3IgY2VydGFpbiBDU1MgcHJvcGVydGllcylcblx0XHRcdGlmICggdHlwZSA9PT0gXCJudW1iZXJcIiApIHtcblx0XHRcdFx0dmFsdWUgKz0gcmV0ICYmIHJldFsgMyBdIHx8ICggalF1ZXJ5LmNzc051bWJlclsgb3JpZ05hbWUgXSA/IFwiXCIgOiBcInB4XCIgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gRml4ZXMgIzg5MDgsIGl0IGNhbiBiZSBkb25lIG1vcmUgY29ycmVjdGx5IGJ5IHNwZWNpZmluZyBzZXR0ZXJzIGluIGNzc0hvb2tzLFxuXHRcdFx0Ly8gYnV0IGl0IHdvdWxkIG1lYW4gdG8gZGVmaW5lIGVpZ2h0XG5cdFx0XHQvLyAoZm9yIGV2ZXJ5IHByb2JsZW1hdGljIHByb3BlcnR5KSBpZGVudGljYWwgZnVuY3Rpb25zXG5cdFx0XHRpZiAoICFzdXBwb3J0LmNsZWFyQ2xvbmVTdHlsZSAmJiB2YWx1ZSA9PT0gXCJcIiAmJiBuYW1lLmluZGV4T2YoIFwiYmFja2dyb3VuZFwiICkgPT09IDAgKSB7XG5cdFx0XHRcdHN0eWxlWyBuYW1lIF0gPSBcImluaGVyaXRcIjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gSWYgYSBob29rIHdhcyBwcm92aWRlZCwgdXNlIHRoYXQgdmFsdWUsIG90aGVyd2lzZSBqdXN0IHNldCB0aGUgc3BlY2lmaWVkIHZhbHVlXG5cdFx0XHRpZiAoICFob29rcyB8fCAhKCBcInNldFwiIGluIGhvb2tzICkgfHxcblx0XHRcdFx0KCB2YWx1ZSA9IGhvb2tzLnNldCggZWxlbSwgdmFsdWUsIGV4dHJhICkgKSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IElFXG5cdFx0XHRcdC8vIFN3YWxsb3cgZXJyb3JzIGZyb20gJ2ludmFsaWQnIENTUyB2YWx1ZXMgKCM1NTA5KVxuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdHN0eWxlWyBuYW1lIF0gPSB2YWx1ZTtcblx0XHRcdFx0fSBjYXRjaCAoIGUgKSB7fVxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gSWYgYSBob29rIHdhcyBwcm92aWRlZCBnZXQgdGhlIG5vbi1jb21wdXRlZCB2YWx1ZSBmcm9tIHRoZXJlXG5cdFx0XHRpZiAoIGhvb2tzICYmIFwiZ2V0XCIgaW4gaG9va3MgJiZcblx0XHRcdFx0KCByZXQgPSBob29rcy5nZXQoIGVsZW0sIGZhbHNlLCBleHRyYSApICkgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBPdGhlcndpc2UganVzdCBnZXQgdGhlIHZhbHVlIGZyb20gdGhlIHN0eWxlIG9iamVjdFxuXHRcdFx0cmV0dXJuIHN0eWxlWyBuYW1lIF07XG5cdFx0fVxuXHR9LFxuXG5cdGNzczogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGV4dHJhLCBzdHlsZXMgKSB7XG5cdFx0dmFyIG51bSwgdmFsLCBob29rcyxcblx0XHRcdG9yaWdOYW1lID0galF1ZXJ5LmNhbWVsQ2FzZSggbmFtZSApO1xuXG5cdFx0Ly8gTWFrZSBzdXJlIHRoYXQgd2UncmUgd29ya2luZyB3aXRoIHRoZSByaWdodCBuYW1lXG5cdFx0bmFtZSA9IGpRdWVyeS5jc3NQcm9wc1sgb3JpZ05hbWUgXSB8fFxuXHRcdFx0KCBqUXVlcnkuY3NzUHJvcHNbIG9yaWdOYW1lIF0gPSB2ZW5kb3JQcm9wTmFtZSggb3JpZ05hbWUgKSB8fCBvcmlnTmFtZSApO1xuXG5cdFx0Ly8gZ2V0cyBob29rIGZvciB0aGUgcHJlZml4ZWQgdmVyc2lvblxuXHRcdC8vIGZvbGxvd2VkIGJ5IHRoZSB1bnByZWZpeGVkIHZlcnNpb25cblx0XHRob29rcyA9IGpRdWVyeS5jc3NIb29rc1sgbmFtZSBdIHx8IGpRdWVyeS5jc3NIb29rc1sgb3JpZ05hbWUgXTtcblxuXHRcdC8vIElmIGEgaG9vayB3YXMgcHJvdmlkZWQgZ2V0IHRoZSBjb21wdXRlZCB2YWx1ZSBmcm9tIHRoZXJlXG5cdFx0aWYgKCBob29rcyAmJiBcImdldFwiIGluIGhvb2tzICkge1xuXHRcdFx0dmFsID0gaG9va3MuZ2V0KCBlbGVtLCB0cnVlLCBleHRyYSApO1xuXHRcdH1cblxuXHRcdC8vIE90aGVyd2lzZSwgaWYgYSB3YXkgdG8gZ2V0IHRoZSBjb21wdXRlZCB2YWx1ZSBleGlzdHMsIHVzZSB0aGF0XG5cdFx0aWYgKCB2YWwgPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdHZhbCA9IGN1ckNTUyggZWxlbSwgbmFtZSwgc3R5bGVzICk7XG5cdFx0fVxuXG5cdFx0Ly9jb252ZXJ0IFwibm9ybWFsXCIgdG8gY29tcHV0ZWQgdmFsdWVcblx0XHRpZiAoIHZhbCA9PT0gXCJub3JtYWxcIiAmJiBuYW1lIGluIGNzc05vcm1hbFRyYW5zZm9ybSApIHtcblx0XHRcdHZhbCA9IGNzc05vcm1hbFRyYW5zZm9ybVsgbmFtZSBdO1xuXHRcdH1cblxuXHRcdC8vIFJldHVybiwgY29udmVydGluZyB0byBudW1iZXIgaWYgZm9yY2VkIG9yIGEgcXVhbGlmaWVyIHdhcyBwcm92aWRlZCBhbmQgdmFsIGxvb2tzIG51bWVyaWNcblx0XHRpZiAoIGV4dHJhID09PSBcIlwiIHx8IGV4dHJhICkge1xuXHRcdFx0bnVtID0gcGFyc2VGbG9hdCggdmFsICk7XG5cdFx0XHRyZXR1cm4gZXh0cmEgPT09IHRydWUgfHwgaXNGaW5pdGUoIG51bSApID8gbnVtIHx8IDAgOiB2YWw7XG5cdFx0fVxuXHRcdHJldHVybiB2YWw7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmVhY2goIFsgXCJoZWlnaHRcIiwgXCJ3aWR0aFwiIF0sIGZ1bmN0aW9uKCBpLCBuYW1lICkge1xuXHRqUXVlcnkuY3NzSG9va3NbIG5hbWUgXSA9IHtcblx0XHRnZXQ6IGZ1bmN0aW9uKCBlbGVtLCBjb21wdXRlZCwgZXh0cmEgKSB7XG5cdFx0XHRpZiAoIGNvbXB1dGVkICkge1xuXG5cdFx0XHRcdC8vIGNlcnRhaW4gZWxlbWVudHMgY2FuIGhhdmUgZGltZW5zaW9uIGluZm8gaWYgd2UgaW52aXNpYmx5IHNob3cgdGhlbVxuXHRcdFx0XHQvLyBob3dldmVyLCBpdCBtdXN0IGhhdmUgYSBjdXJyZW50IGRpc3BsYXkgc3R5bGUgdGhhdCB3b3VsZCBiZW5lZml0IGZyb20gdGhpc1xuXHRcdFx0XHRyZXR1cm4gcmRpc3BsYXlzd2FwLnRlc3QoIGpRdWVyeS5jc3MoIGVsZW0sIFwiZGlzcGxheVwiICkgKSAmJlxuXHRcdFx0XHRcdGVsZW0ub2Zmc2V0V2lkdGggPT09IDAgP1xuXHRcdFx0XHRcdFx0c3dhcCggZWxlbSwgY3NzU2hvdywgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBnZXRXaWR0aE9ySGVpZ2h0KCBlbGVtLCBuYW1lLCBleHRyYSApO1xuXHRcdFx0XHRcdFx0fSApIDpcblx0XHRcdFx0XHRcdGdldFdpZHRoT3JIZWlnaHQoIGVsZW0sIG5hbWUsIGV4dHJhICk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlLCBleHRyYSApIHtcblx0XHRcdHZhciBzdHlsZXMgPSBleHRyYSAmJiBnZXRTdHlsZXMoIGVsZW0gKTtcblx0XHRcdHJldHVybiBzZXRQb3NpdGl2ZU51bWJlciggZWxlbSwgdmFsdWUsIGV4dHJhID9cblx0XHRcdFx0YXVnbWVudFdpZHRoT3JIZWlnaHQoXG5cdFx0XHRcdFx0ZWxlbSxcblx0XHRcdFx0XHRuYW1lLFxuXHRcdFx0XHRcdGV4dHJhLFxuXHRcdFx0XHRcdHN1cHBvcnQuYm94U2l6aW5nICYmXG5cdFx0XHRcdFx0XHRqUXVlcnkuY3NzKCBlbGVtLCBcImJveFNpemluZ1wiLCBmYWxzZSwgc3R5bGVzICkgPT09IFwiYm9yZGVyLWJveFwiLFxuXHRcdFx0XHRcdHN0eWxlc1xuXHRcdFx0XHQpIDogMFxuXHRcdFx0KTtcblx0XHR9XG5cdH07XG59ICk7XG5cbmlmICggIXN1cHBvcnQub3BhY2l0eSApIHtcblx0alF1ZXJ5LmNzc0hvb2tzLm9wYWNpdHkgPSB7XG5cdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7XG5cblx0XHRcdC8vIElFIHVzZXMgZmlsdGVycyBmb3Igb3BhY2l0eVxuXHRcdFx0cmV0dXJuIHJvcGFjaXR5LnRlc3QoICggY29tcHV0ZWQgJiYgZWxlbS5jdXJyZW50U3R5bGUgP1xuXHRcdFx0XHRlbGVtLmN1cnJlbnRTdHlsZS5maWx0ZXIgOlxuXHRcdFx0XHRlbGVtLnN0eWxlLmZpbHRlciApIHx8IFwiXCIgKSA/XG5cdFx0XHRcdFx0KCAwLjAxICogcGFyc2VGbG9hdCggUmVnRXhwLiQxICkgKSArIFwiXCIgOlxuXHRcdFx0XHRcdGNvbXB1dGVkID8gXCIxXCIgOiBcIlwiO1xuXHRcdH0sXG5cblx0XHRzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHtcblx0XHRcdHZhciBzdHlsZSA9IGVsZW0uc3R5bGUsXG5cdFx0XHRcdGN1cnJlbnRTdHlsZSA9IGVsZW0uY3VycmVudFN0eWxlLFxuXHRcdFx0XHRvcGFjaXR5ID0galF1ZXJ5LmlzTnVtZXJpYyggdmFsdWUgKSA/IFwiYWxwaGEob3BhY2l0eT1cIiArIHZhbHVlICogMTAwICsgXCIpXCIgOiBcIlwiLFxuXHRcdFx0XHRmaWx0ZXIgPSBjdXJyZW50U3R5bGUgJiYgY3VycmVudFN0eWxlLmZpbHRlciB8fCBzdHlsZS5maWx0ZXIgfHwgXCJcIjtcblxuXHRcdFx0Ly8gSUUgaGFzIHRyb3VibGUgd2l0aCBvcGFjaXR5IGlmIGl0IGRvZXMgbm90IGhhdmUgbGF5b3V0XG5cdFx0XHQvLyBGb3JjZSBpdCBieSBzZXR0aW5nIHRoZSB6b29tIGxldmVsXG5cdFx0XHRzdHlsZS56b29tID0gMTtcblxuXHRcdFx0Ly8gaWYgc2V0dGluZyBvcGFjaXR5IHRvIDEsIGFuZCBubyBvdGhlciBmaWx0ZXJzIGV4aXN0IC1cblx0XHRcdC8vIGF0dGVtcHQgdG8gcmVtb3ZlIGZpbHRlciBhdHRyaWJ1dGUgIzY2NTJcblx0XHRcdC8vIGlmIHZhbHVlID09PSBcIlwiLCB0aGVuIHJlbW92ZSBpbmxpbmUgb3BhY2l0eSAjMTI2ODVcblx0XHRcdGlmICggKCB2YWx1ZSA+PSAxIHx8IHZhbHVlID09PSBcIlwiICkgJiZcblx0XHRcdFx0XHRqUXVlcnkudHJpbSggZmlsdGVyLnJlcGxhY2UoIHJhbHBoYSwgXCJcIiApICkgPT09IFwiXCIgJiZcblx0XHRcdFx0XHRzdHlsZS5yZW1vdmVBdHRyaWJ1dGUgKSB7XG5cblx0XHRcdFx0Ly8gU2V0dGluZyBzdHlsZS5maWx0ZXIgdG8gbnVsbCwgXCJcIiAmIFwiIFwiIHN0aWxsIGxlYXZlIFwiZmlsdGVyOlwiIGluIHRoZSBjc3NUZXh0XG5cdFx0XHRcdC8vIGlmIFwiZmlsdGVyOlwiIGlzIHByZXNlbnQgYXQgYWxsLCBjbGVhclR5cGUgaXMgZGlzYWJsZWQsIHdlIHdhbnQgdG8gYXZvaWQgdGhpc1xuXHRcdFx0XHQvLyBzdHlsZS5yZW1vdmVBdHRyaWJ1dGUgaXMgSUUgT25seSwgYnV0IHNvIGFwcGFyZW50bHkgaXMgdGhpcyBjb2RlIHBhdGguLi5cblx0XHRcdFx0c3R5bGUucmVtb3ZlQXR0cmlidXRlKCBcImZpbHRlclwiICk7XG5cblx0XHRcdFx0Ly8gaWYgdGhlcmUgaXMgbm8gZmlsdGVyIHN0eWxlIGFwcGxpZWQgaW4gYSBjc3MgcnVsZVxuXHRcdFx0XHQvLyBvciB1bnNldCBpbmxpbmUgb3BhY2l0eSwgd2UgYXJlIGRvbmVcblx0XHRcdFx0aWYgKCB2YWx1ZSA9PT0gXCJcIiB8fCBjdXJyZW50U3R5bGUgJiYgIWN1cnJlbnRTdHlsZS5maWx0ZXIgKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIG90aGVyd2lzZSwgc2V0IG5ldyBmaWx0ZXIgdmFsdWVzXG5cdFx0XHRzdHlsZS5maWx0ZXIgPSByYWxwaGEudGVzdCggZmlsdGVyICkgP1xuXHRcdFx0XHRmaWx0ZXIucmVwbGFjZSggcmFscGhhLCBvcGFjaXR5ICkgOlxuXHRcdFx0XHRmaWx0ZXIgKyBcIiBcIiArIG9wYWNpdHk7XG5cdFx0fVxuXHR9O1xufVxuXG5qUXVlcnkuY3NzSG9va3MubWFyZ2luUmlnaHQgPSBhZGRHZXRIb29rSWYoIHN1cHBvcnQucmVsaWFibGVNYXJnaW5SaWdodCxcblx0ZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkge1xuXHRcdGlmICggY29tcHV0ZWQgKSB7XG5cdFx0XHRyZXR1cm4gc3dhcCggZWxlbSwgeyBcImRpc3BsYXlcIjogXCJpbmxpbmUtYmxvY2tcIiB9LFxuXHRcdFx0XHRjdXJDU1MsIFsgZWxlbSwgXCJtYXJnaW5SaWdodFwiIF0gKTtcblx0XHR9XG5cdH1cbik7XG5cbmpRdWVyeS5jc3NIb29rcy5tYXJnaW5MZWZ0ID0gYWRkR2V0SG9va0lmKCBzdXBwb3J0LnJlbGlhYmxlTWFyZ2luTGVmdCxcblx0ZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkge1xuXHRcdGlmICggY29tcHV0ZWQgKSB7XG5cdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRwYXJzZUZsb2F0KCBjdXJDU1MoIGVsZW0sIFwibWFyZ2luTGVmdFwiICkgKSB8fFxuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IElFPD0xMStcblx0XHRcdFx0Ly8gUnVubmluZyBnZXRCb3VuZGluZ0NsaWVudFJlY3Qgb24gYSBkaXNjb25uZWN0ZWQgbm9kZSBpbiBJRSB0aHJvd3MgYW4gZXJyb3Jcblx0XHRcdFx0Ly8gU3VwcG9ydDogSUU4IG9ubHlcblx0XHRcdFx0Ly8gZ2V0Q2xpZW50UmVjdHMoKSBlcnJvcnMgb24gZGlzY29ubmVjdGVkIGVsZW1zXG5cdFx0XHRcdCggalF1ZXJ5LmNvbnRhaW5zKCBlbGVtLm93bmVyRG9jdW1lbnQsIGVsZW0gKSA/XG5cdFx0XHRcdFx0ZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0IC1cblx0XHRcdFx0XHRcdHN3YXAoIGVsZW0sIHsgbWFyZ2luTGVmdDogMCB9LCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdDtcblx0XHRcdFx0XHRcdH0gKSA6XG5cdFx0XHRcdFx0MFxuXHRcdFx0XHQpXG5cdFx0XHQpICsgXCJweFwiO1xuXHRcdH1cblx0fVxuKTtcblxuLy8gVGhlc2UgaG9va3MgYXJlIHVzZWQgYnkgYW5pbWF0ZSB0byBleHBhbmQgcHJvcGVydGllc1xualF1ZXJ5LmVhY2goIHtcblx0bWFyZ2luOiBcIlwiLFxuXHRwYWRkaW5nOiBcIlwiLFxuXHRib3JkZXI6IFwiV2lkdGhcIlxufSwgZnVuY3Rpb24oIHByZWZpeCwgc3VmZml4ICkge1xuXHRqUXVlcnkuY3NzSG9va3NbIHByZWZpeCArIHN1ZmZpeCBdID0ge1xuXHRcdGV4cGFuZDogZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdFx0dmFyIGkgPSAwLFxuXHRcdFx0XHRleHBhbmRlZCA9IHt9LFxuXG5cdFx0XHRcdC8vIGFzc3VtZXMgYSBzaW5nbGUgbnVtYmVyIGlmIG5vdCBhIHN0cmluZ1xuXHRcdFx0XHRwYXJ0cyA9IHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiA/IHZhbHVlLnNwbGl0KCBcIiBcIiApIDogWyB2YWx1ZSBdO1xuXG5cdFx0XHRmb3IgKCA7IGkgPCA0OyBpKysgKSB7XG5cdFx0XHRcdGV4cGFuZGVkWyBwcmVmaXggKyBjc3NFeHBhbmRbIGkgXSArIHN1ZmZpeCBdID1cblx0XHRcdFx0XHRwYXJ0c1sgaSBdIHx8IHBhcnRzWyBpIC0gMiBdIHx8IHBhcnRzWyAwIF07XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBleHBhbmRlZDtcblx0XHR9XG5cdH07XG5cblx0aWYgKCAhcm1hcmdpbi50ZXN0KCBwcmVmaXggKSApIHtcblx0XHRqUXVlcnkuY3NzSG9va3NbIHByZWZpeCArIHN1ZmZpeCBdLnNldCA9IHNldFBvc2l0aXZlTnVtYmVyO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0Y3NzOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7XG5cdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlICkge1xuXHRcdFx0dmFyIHN0eWxlcywgbGVuLFxuXHRcdFx0XHRtYXAgPSB7fSxcblx0XHRcdFx0aSA9IDA7XG5cblx0XHRcdGlmICggalF1ZXJ5LmlzQXJyYXkoIG5hbWUgKSApIHtcblx0XHRcdFx0c3R5bGVzID0gZ2V0U3R5bGVzKCBlbGVtICk7XG5cdFx0XHRcdGxlbiA9IG5hbWUubGVuZ3RoO1xuXG5cdFx0XHRcdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0XHRcdG1hcFsgbmFtZVsgaSBdIF0gPSBqUXVlcnkuY3NzKCBlbGVtLCBuYW1lWyBpIF0sIGZhbHNlLCBzdHlsZXMgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBtYXA7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkID9cblx0XHRcdFx0alF1ZXJ5LnN0eWxlKCBlbGVtLCBuYW1lLCB2YWx1ZSApIDpcblx0XHRcdFx0alF1ZXJ5LmNzcyggZWxlbSwgbmFtZSApO1xuXHRcdH0sIG5hbWUsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSApO1xuXHR9LFxuXHRzaG93OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2hvd0hpZGUoIHRoaXMsIHRydWUgKTtcblx0fSxcblx0aGlkZTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHNob3dIaWRlKCB0aGlzICk7XG5cdH0sXG5cdHRvZ2dsZTogZnVuY3Rpb24oIHN0YXRlICkge1xuXHRcdGlmICggdHlwZW9mIHN0YXRlID09PSBcImJvb2xlYW5cIiApIHtcblx0XHRcdHJldHVybiBzdGF0ZSA/IHRoaXMuc2hvdygpIDogdGhpcy5oaWRlKCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRpZiAoIGlzSGlkZGVuKCB0aGlzICkgKSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLnNob3coKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLmhpZGUoKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH1cbn0gKTtcblxuXG5mdW5jdGlvbiBUd2VlbiggZWxlbSwgb3B0aW9ucywgcHJvcCwgZW5kLCBlYXNpbmcgKSB7XG5cdHJldHVybiBuZXcgVHdlZW4ucHJvdG90eXBlLmluaXQoIGVsZW0sIG9wdGlvbnMsIHByb3AsIGVuZCwgZWFzaW5nICk7XG59XG5qUXVlcnkuVHdlZW4gPSBUd2VlbjtcblxuVHdlZW4ucHJvdG90eXBlID0ge1xuXHRjb25zdHJ1Y3RvcjogVHdlZW4sXG5cdGluaXQ6IGZ1bmN0aW9uKCBlbGVtLCBvcHRpb25zLCBwcm9wLCBlbmQsIGVhc2luZywgdW5pdCApIHtcblx0XHR0aGlzLmVsZW0gPSBlbGVtO1xuXHRcdHRoaXMucHJvcCA9IHByb3A7XG5cdFx0dGhpcy5lYXNpbmcgPSBlYXNpbmcgfHwgalF1ZXJ5LmVhc2luZy5fZGVmYXVsdDtcblx0XHR0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuXHRcdHRoaXMuc3RhcnQgPSB0aGlzLm5vdyA9IHRoaXMuY3VyKCk7XG5cdFx0dGhpcy5lbmQgPSBlbmQ7XG5cdFx0dGhpcy51bml0ID0gdW5pdCB8fCAoIGpRdWVyeS5jc3NOdW1iZXJbIHByb3AgXSA/IFwiXCIgOiBcInB4XCIgKTtcblx0fSxcblx0Y3VyOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgaG9va3MgPSBUd2Vlbi5wcm9wSG9va3NbIHRoaXMucHJvcCBdO1xuXG5cdFx0cmV0dXJuIGhvb2tzICYmIGhvb2tzLmdldCA/XG5cdFx0XHRob29rcy5nZXQoIHRoaXMgKSA6XG5cdFx0XHRUd2Vlbi5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KCB0aGlzICk7XG5cdH0sXG5cdHJ1bjogZnVuY3Rpb24oIHBlcmNlbnQgKSB7XG5cdFx0dmFyIGVhc2VkLFxuXHRcdFx0aG9va3MgPSBUd2Vlbi5wcm9wSG9va3NbIHRoaXMucHJvcCBdO1xuXG5cdFx0aWYgKCB0aGlzLm9wdGlvbnMuZHVyYXRpb24gKSB7XG5cdFx0XHR0aGlzLnBvcyA9IGVhc2VkID0galF1ZXJ5LmVhc2luZ1sgdGhpcy5lYXNpbmcgXShcblx0XHRcdFx0cGVyY2VudCwgdGhpcy5vcHRpb25zLmR1cmF0aW9uICogcGVyY2VudCwgMCwgMSwgdGhpcy5vcHRpb25zLmR1cmF0aW9uXG5cdFx0XHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLnBvcyA9IGVhc2VkID0gcGVyY2VudDtcblx0XHR9XG5cdFx0dGhpcy5ub3cgPSAoIHRoaXMuZW5kIC0gdGhpcy5zdGFydCApICogZWFzZWQgKyB0aGlzLnN0YXJ0O1xuXG5cdFx0aWYgKCB0aGlzLm9wdGlvbnMuc3RlcCApIHtcblx0XHRcdHRoaXMub3B0aW9ucy5zdGVwLmNhbGwoIHRoaXMuZWxlbSwgdGhpcy5ub3csIHRoaXMgKTtcblx0XHR9XG5cblx0XHRpZiAoIGhvb2tzICYmIGhvb2tzLnNldCApIHtcblx0XHRcdGhvb2tzLnNldCggdGhpcyApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRUd2Vlbi5wcm9wSG9va3MuX2RlZmF1bHQuc2V0KCB0aGlzICk7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzO1xuXHR9XG59O1xuXG5Ud2Vlbi5wcm90b3R5cGUuaW5pdC5wcm90b3R5cGUgPSBUd2Vlbi5wcm90b3R5cGU7XG5cblR3ZWVuLnByb3BIb29rcyA9IHtcblx0X2RlZmF1bHQ6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uKCB0d2VlbiApIHtcblx0XHRcdHZhciByZXN1bHQ7XG5cblx0XHRcdC8vIFVzZSBhIHByb3BlcnR5IG9uIHRoZSBlbGVtZW50IGRpcmVjdGx5IHdoZW4gaXQgaXMgbm90IGEgRE9NIGVsZW1lbnQsXG5cdFx0XHQvLyBvciB3aGVuIHRoZXJlIGlzIG5vIG1hdGNoaW5nIHN0eWxlIHByb3BlcnR5IHRoYXQgZXhpc3RzLlxuXHRcdFx0aWYgKCB0d2Vlbi5lbGVtLm5vZGVUeXBlICE9PSAxIHx8XG5cdFx0XHRcdHR3ZWVuLmVsZW1bIHR3ZWVuLnByb3AgXSAhPSBudWxsICYmIHR3ZWVuLmVsZW0uc3R5bGVbIHR3ZWVuLnByb3AgXSA9PSBudWxsICkge1xuXHRcdFx0XHRyZXR1cm4gdHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBwYXNzaW5nIGFuIGVtcHR5IHN0cmluZyBhcyBhIDNyZCBwYXJhbWV0ZXIgdG8gLmNzcyB3aWxsIGF1dG9tYXRpY2FsbHlcblx0XHRcdC8vIGF0dGVtcHQgYSBwYXJzZUZsb2F0IGFuZCBmYWxsYmFjayB0byBhIHN0cmluZyBpZiB0aGUgcGFyc2UgZmFpbHNcblx0XHRcdC8vIHNvLCBzaW1wbGUgdmFsdWVzIHN1Y2ggYXMgXCIxMHB4XCIgYXJlIHBhcnNlZCB0byBGbG9hdC5cblx0XHRcdC8vIGNvbXBsZXggdmFsdWVzIHN1Y2ggYXMgXCJyb3RhdGUoMXJhZClcIiBhcmUgcmV0dXJuZWQgYXMgaXMuXG5cdFx0XHRyZXN1bHQgPSBqUXVlcnkuY3NzKCB0d2Vlbi5lbGVtLCB0d2Vlbi5wcm9wLCBcIlwiICk7XG5cblx0XHRcdC8vIEVtcHR5IHN0cmluZ3MsIG51bGwsIHVuZGVmaW5lZCBhbmQgXCJhdXRvXCIgYXJlIGNvbnZlcnRlZCB0byAwLlxuXHRcdFx0cmV0dXJuICFyZXN1bHQgfHwgcmVzdWx0ID09PSBcImF1dG9cIiA/IDAgOiByZXN1bHQ7XG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uKCB0d2VlbiApIHtcblxuXHRcdFx0Ly8gdXNlIHN0ZXAgaG9vayBmb3IgYmFjayBjb21wYXQgLSB1c2UgY3NzSG9vayBpZiBpdHMgdGhlcmUgLSB1c2UgLnN0eWxlIGlmIGl0c1xuXHRcdFx0Ly8gYXZhaWxhYmxlIGFuZCB1c2UgcGxhaW4gcHJvcGVydGllcyB3aGVyZSBhdmFpbGFibGVcblx0XHRcdGlmICggalF1ZXJ5LmZ4LnN0ZXBbIHR3ZWVuLnByb3AgXSApIHtcblx0XHRcdFx0alF1ZXJ5LmZ4LnN0ZXBbIHR3ZWVuLnByb3AgXSggdHdlZW4gKTtcblx0XHRcdH0gZWxzZSBpZiAoIHR3ZWVuLmVsZW0ubm9kZVR5cGUgPT09IDEgJiZcblx0XHRcdFx0KCB0d2Vlbi5lbGVtLnN0eWxlWyBqUXVlcnkuY3NzUHJvcHNbIHR3ZWVuLnByb3AgXSBdICE9IG51bGwgfHxcblx0XHRcdFx0XHRqUXVlcnkuY3NzSG9va3NbIHR3ZWVuLnByb3AgXSApICkge1xuXHRcdFx0XHRqUXVlcnkuc3R5bGUoIHR3ZWVuLmVsZW0sIHR3ZWVuLnByb3AsIHR3ZWVuLm5vdyArIHR3ZWVuLnVuaXQgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHR3ZWVuLmVsZW1bIHR3ZWVuLnByb3AgXSA9IHR3ZWVuLm5vdztcblx0XHRcdH1cblx0XHR9XG5cdH1cbn07XG5cbi8vIFN1cHBvcnQ6IElFIDw9OVxuLy8gUGFuaWMgYmFzZWQgYXBwcm9hY2ggdG8gc2V0dGluZyB0aGluZ3Mgb24gZGlzY29ubmVjdGVkIG5vZGVzXG5cblR3ZWVuLnByb3BIb29rcy5zY3JvbGxUb3AgPSBUd2Vlbi5wcm9wSG9va3Muc2Nyb2xsTGVmdCA9IHtcblx0c2V0OiBmdW5jdGlvbiggdHdlZW4gKSB7XG5cdFx0aWYgKCB0d2Vlbi5lbGVtLm5vZGVUeXBlICYmIHR3ZWVuLmVsZW0ucGFyZW50Tm9kZSApIHtcblx0XHRcdHR3ZWVuLmVsZW1bIHR3ZWVuLnByb3AgXSA9IHR3ZWVuLm5vdztcblx0XHR9XG5cdH1cbn07XG5cbmpRdWVyeS5lYXNpbmcgPSB7XG5cdGxpbmVhcjogZnVuY3Rpb24oIHAgKSB7XG5cdFx0cmV0dXJuIHA7XG5cdH0sXG5cdHN3aW5nOiBmdW5jdGlvbiggcCApIHtcblx0XHRyZXR1cm4gMC41IC0gTWF0aC5jb3MoIHAgKiBNYXRoLlBJICkgLyAyO1xuXHR9LFxuXHRfZGVmYXVsdDogXCJzd2luZ1wiXG59O1xuXG5qUXVlcnkuZnggPSBUd2Vlbi5wcm90b3R5cGUuaW5pdDtcblxuLy8gQmFjayBDb21wYXQgPDEuOCBleHRlbnNpb24gcG9pbnRcbmpRdWVyeS5meC5zdGVwID0ge307XG5cblxuXG5cbnZhclxuXHRmeE5vdywgdGltZXJJZCxcblx0cmZ4dHlwZXMgPSAvXig/OnRvZ2dsZXxzaG93fGhpZGUpJC8sXG5cdHJydW4gPSAvcXVldWVIb29rcyQvO1xuXG4vLyBBbmltYXRpb25zIGNyZWF0ZWQgc3luY2hyb25vdXNseSB3aWxsIHJ1biBzeW5jaHJvbm91c2x5XG5mdW5jdGlvbiBjcmVhdGVGeE5vdygpIHtcblx0d2luZG93LnNldFRpbWVvdXQoIGZ1bmN0aW9uKCkge1xuXHRcdGZ4Tm93ID0gdW5kZWZpbmVkO1xuXHR9ICk7XG5cdHJldHVybiAoIGZ4Tm93ID0galF1ZXJ5Lm5vdygpICk7XG59XG5cbi8vIEdlbmVyYXRlIHBhcmFtZXRlcnMgdG8gY3JlYXRlIGEgc3RhbmRhcmQgYW5pbWF0aW9uXG5mdW5jdGlvbiBnZW5GeCggdHlwZSwgaW5jbHVkZVdpZHRoICkge1xuXHR2YXIgd2hpY2gsXG5cdFx0YXR0cnMgPSB7IGhlaWdodDogdHlwZSB9LFxuXHRcdGkgPSAwO1xuXG5cdC8vIGlmIHdlIGluY2x1ZGUgd2lkdGgsIHN0ZXAgdmFsdWUgaXMgMSB0byBkbyBhbGwgY3NzRXhwYW5kIHZhbHVlcyxcblx0Ly8gaWYgd2UgZG9uJ3QgaW5jbHVkZSB3aWR0aCwgc3RlcCB2YWx1ZSBpcyAyIHRvIHNraXAgb3ZlciBMZWZ0IGFuZCBSaWdodFxuXHRpbmNsdWRlV2lkdGggPSBpbmNsdWRlV2lkdGggPyAxIDogMDtcblx0Zm9yICggOyBpIDwgNCA7IGkgKz0gMiAtIGluY2x1ZGVXaWR0aCApIHtcblx0XHR3aGljaCA9IGNzc0V4cGFuZFsgaSBdO1xuXHRcdGF0dHJzWyBcIm1hcmdpblwiICsgd2hpY2ggXSA9IGF0dHJzWyBcInBhZGRpbmdcIiArIHdoaWNoIF0gPSB0eXBlO1xuXHR9XG5cblx0aWYgKCBpbmNsdWRlV2lkdGggKSB7XG5cdFx0YXR0cnMub3BhY2l0eSA9IGF0dHJzLndpZHRoID0gdHlwZTtcblx0fVxuXG5cdHJldHVybiBhdHRycztcbn1cblxuZnVuY3Rpb24gY3JlYXRlVHdlZW4oIHZhbHVlLCBwcm9wLCBhbmltYXRpb24gKSB7XG5cdHZhciB0d2Vlbixcblx0XHRjb2xsZWN0aW9uID0gKCBBbmltYXRpb24udHdlZW5lcnNbIHByb3AgXSB8fCBbXSApLmNvbmNhdCggQW5pbWF0aW9uLnR3ZWVuZXJzWyBcIipcIiBdICksXG5cdFx0aW5kZXggPSAwLFxuXHRcdGxlbmd0aCA9IGNvbGxlY3Rpb24ubGVuZ3RoO1xuXHRmb3IgKCA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkge1xuXHRcdGlmICggKCB0d2VlbiA9IGNvbGxlY3Rpb25bIGluZGV4IF0uY2FsbCggYW5pbWF0aW9uLCBwcm9wLCB2YWx1ZSApICkgKSB7XG5cblx0XHRcdC8vIHdlJ3JlIGRvbmUgd2l0aCB0aGlzIHByb3BlcnR5XG5cdFx0XHRyZXR1cm4gdHdlZW47XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRQcmVmaWx0ZXIoIGVsZW0sIHByb3BzLCBvcHRzICkge1xuXHQvKiBqc2hpbnQgdmFsaWR0aGlzOiB0cnVlICovXG5cdHZhciBwcm9wLCB2YWx1ZSwgdG9nZ2xlLCB0d2VlbiwgaG9va3MsIG9sZGZpcmUsIGRpc3BsYXksIGNoZWNrRGlzcGxheSxcblx0XHRhbmltID0gdGhpcyxcblx0XHRvcmlnID0ge30sXG5cdFx0c3R5bGUgPSBlbGVtLnN0eWxlLFxuXHRcdGhpZGRlbiA9IGVsZW0ubm9kZVR5cGUgJiYgaXNIaWRkZW4oIGVsZW0gKSxcblx0XHRkYXRhU2hvdyA9IGpRdWVyeS5fZGF0YSggZWxlbSwgXCJmeHNob3dcIiApO1xuXG5cdC8vIGhhbmRsZSBxdWV1ZTogZmFsc2UgcHJvbWlzZXNcblx0aWYgKCAhb3B0cy5xdWV1ZSApIHtcblx0XHRob29rcyA9IGpRdWVyeS5fcXVldWVIb29rcyggZWxlbSwgXCJmeFwiICk7XG5cdFx0aWYgKCBob29rcy51bnF1ZXVlZCA9PSBudWxsICkge1xuXHRcdFx0aG9va3MudW5xdWV1ZWQgPSAwO1xuXHRcdFx0b2xkZmlyZSA9IGhvb2tzLmVtcHR5LmZpcmU7XG5cdFx0XHRob29rcy5lbXB0eS5maXJlID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggIWhvb2tzLnVucXVldWVkICkge1xuXHRcdFx0XHRcdG9sZGZpcmUoKTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHR9XG5cdFx0aG9va3MudW5xdWV1ZWQrKztcblxuXHRcdGFuaW0uYWx3YXlzKCBmdW5jdGlvbigpIHtcblxuXHRcdFx0Ly8gZG9pbmcgdGhpcyBtYWtlcyBzdXJlIHRoYXQgdGhlIGNvbXBsZXRlIGhhbmRsZXIgd2lsbCBiZSBjYWxsZWRcblx0XHRcdC8vIGJlZm9yZSB0aGlzIGNvbXBsZXRlc1xuXHRcdFx0YW5pbS5hbHdheXMoIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRob29rcy51bnF1ZXVlZC0tO1xuXHRcdFx0XHRpZiAoICFqUXVlcnkucXVldWUoIGVsZW0sIFwiZnhcIiApLmxlbmd0aCApIHtcblx0XHRcdFx0XHRob29rcy5lbXB0eS5maXJlKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gKTtcblx0XHR9ICk7XG5cdH1cblxuXHQvLyBoZWlnaHQvd2lkdGggb3ZlcmZsb3cgcGFzc1xuXHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgKCBcImhlaWdodFwiIGluIHByb3BzIHx8IFwid2lkdGhcIiBpbiBwcm9wcyApICkge1xuXG5cdFx0Ly8gTWFrZSBzdXJlIHRoYXQgbm90aGluZyBzbmVha3Mgb3V0XG5cdFx0Ly8gUmVjb3JkIGFsbCAzIG92ZXJmbG93IGF0dHJpYnV0ZXMgYmVjYXVzZSBJRSBkb2VzIG5vdFxuXHRcdC8vIGNoYW5nZSB0aGUgb3ZlcmZsb3cgYXR0cmlidXRlIHdoZW4gb3ZlcmZsb3dYIGFuZFxuXHRcdC8vIG92ZXJmbG93WSBhcmUgc2V0IHRvIHRoZSBzYW1lIHZhbHVlXG5cdFx0b3B0cy5vdmVyZmxvdyA9IFsgc3R5bGUub3ZlcmZsb3csIHN0eWxlLm92ZXJmbG93WCwgc3R5bGUub3ZlcmZsb3dZIF07XG5cblx0XHQvLyBTZXQgZGlzcGxheSBwcm9wZXJ0eSB0byBpbmxpbmUtYmxvY2sgZm9yIGhlaWdodC93aWR0aFxuXHRcdC8vIGFuaW1hdGlvbnMgb24gaW5saW5lIGVsZW1lbnRzIHRoYXQgYXJlIGhhdmluZyB3aWR0aC9oZWlnaHQgYW5pbWF0ZWRcblx0XHRkaXNwbGF5ID0galF1ZXJ5LmNzcyggZWxlbSwgXCJkaXNwbGF5XCIgKTtcblxuXHRcdC8vIFRlc3QgZGVmYXVsdCBkaXNwbGF5IGlmIGRpc3BsYXkgaXMgY3VycmVudGx5IFwibm9uZVwiXG5cdFx0Y2hlY2tEaXNwbGF5ID0gZGlzcGxheSA9PT0gXCJub25lXCIgP1xuXHRcdFx0alF1ZXJ5Ll9kYXRhKCBlbGVtLCBcIm9sZGRpc3BsYXlcIiApIHx8IGRlZmF1bHREaXNwbGF5KCBlbGVtLm5vZGVOYW1lICkgOiBkaXNwbGF5O1xuXG5cdFx0aWYgKCBjaGVja0Rpc3BsYXkgPT09IFwiaW5saW5lXCIgJiYgalF1ZXJ5LmNzcyggZWxlbSwgXCJmbG9hdFwiICkgPT09IFwibm9uZVwiICkge1xuXG5cdFx0XHQvLyBpbmxpbmUtbGV2ZWwgZWxlbWVudHMgYWNjZXB0IGlubGluZS1ibG9jaztcblx0XHRcdC8vIGJsb2NrLWxldmVsIGVsZW1lbnRzIG5lZWQgdG8gYmUgaW5saW5lIHdpdGggbGF5b3V0XG5cdFx0XHRpZiAoICFzdXBwb3J0LmlubGluZUJsb2NrTmVlZHNMYXlvdXQgfHwgZGVmYXVsdERpc3BsYXkoIGVsZW0ubm9kZU5hbWUgKSA9PT0gXCJpbmxpbmVcIiApIHtcblx0XHRcdFx0c3R5bGUuZGlzcGxheSA9IFwiaW5saW5lLWJsb2NrXCI7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzdHlsZS56b29tID0gMTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRpZiAoIG9wdHMub3ZlcmZsb3cgKSB7XG5cdFx0c3R5bGUub3ZlcmZsb3cgPSBcImhpZGRlblwiO1xuXHRcdGlmICggIXN1cHBvcnQuc2hyaW5rV3JhcEJsb2NrcygpICkge1xuXHRcdFx0YW5pbS5hbHdheXMoIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRzdHlsZS5vdmVyZmxvdyA9IG9wdHMub3ZlcmZsb3dbIDAgXTtcblx0XHRcdFx0c3R5bGUub3ZlcmZsb3dYID0gb3B0cy5vdmVyZmxvd1sgMSBdO1xuXHRcdFx0XHRzdHlsZS5vdmVyZmxvd1kgPSBvcHRzLm92ZXJmbG93WyAyIF07XG5cdFx0XHR9ICk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gc2hvdy9oaWRlIHBhc3Ncblx0Zm9yICggcHJvcCBpbiBwcm9wcyApIHtcblx0XHR2YWx1ZSA9IHByb3BzWyBwcm9wIF07XG5cdFx0aWYgKCByZnh0eXBlcy5leGVjKCB2YWx1ZSApICkge1xuXHRcdFx0ZGVsZXRlIHByb3BzWyBwcm9wIF07XG5cdFx0XHR0b2dnbGUgPSB0b2dnbGUgfHwgdmFsdWUgPT09IFwidG9nZ2xlXCI7XG5cdFx0XHRpZiAoIHZhbHVlID09PSAoIGhpZGRlbiA/IFwiaGlkZVwiIDogXCJzaG93XCIgKSApIHtcblxuXHRcdFx0XHQvLyBJZiB0aGVyZSBpcyBkYXRhU2hvdyBsZWZ0IG92ZXIgZnJvbSBhIHN0b3BwZWQgaGlkZSBvciBzaG93XG5cdFx0XHRcdC8vIGFuZCB3ZSBhcmUgZ29pbmcgdG8gcHJvY2VlZCB3aXRoIHNob3csIHdlIHNob3VsZCBwcmV0ZW5kIHRvIGJlIGhpZGRlblxuXHRcdFx0XHRpZiAoIHZhbHVlID09PSBcInNob3dcIiAmJiBkYXRhU2hvdyAmJiBkYXRhU2hvd1sgcHJvcCBdICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0aGlkZGVuID0gdHJ1ZTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0b3JpZ1sgcHJvcCBdID0gZGF0YVNob3cgJiYgZGF0YVNob3dbIHByb3AgXSB8fCBqUXVlcnkuc3R5bGUoIGVsZW0sIHByb3AgKTtcblxuXHRcdC8vIEFueSBub24tZnggdmFsdWUgc3RvcHMgdXMgZnJvbSByZXN0b3JpbmcgdGhlIG9yaWdpbmFsIGRpc3BsYXkgdmFsdWVcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZGlzcGxheSA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdH1cblxuXHRpZiAoICFqUXVlcnkuaXNFbXB0eU9iamVjdCggb3JpZyApICkge1xuXHRcdGlmICggZGF0YVNob3cgKSB7XG5cdFx0XHRpZiAoIFwiaGlkZGVuXCIgaW4gZGF0YVNob3cgKSB7XG5cdFx0XHRcdGhpZGRlbiA9IGRhdGFTaG93LmhpZGRlbjtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0ZGF0YVNob3cgPSBqUXVlcnkuX2RhdGEoIGVsZW0sIFwiZnhzaG93XCIsIHt9ICk7XG5cdFx0fVxuXG5cdFx0Ly8gc3RvcmUgc3RhdGUgaWYgaXRzIHRvZ2dsZSAtIGVuYWJsZXMgLnN0b3AoKS50b2dnbGUoKSB0byBcInJldmVyc2VcIlxuXHRcdGlmICggdG9nZ2xlICkge1xuXHRcdFx0ZGF0YVNob3cuaGlkZGVuID0gIWhpZGRlbjtcblx0XHR9XG5cdFx0aWYgKCBoaWRkZW4gKSB7XG5cdFx0XHRqUXVlcnkoIGVsZW0gKS5zaG93KCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGFuaW0uZG9uZSggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGpRdWVyeSggZWxlbSApLmhpZGUoKTtcblx0XHRcdH0gKTtcblx0XHR9XG5cdFx0YW5pbS5kb25lKCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBwcm9wO1xuXHRcdFx0alF1ZXJ5Ll9yZW1vdmVEYXRhKCBlbGVtLCBcImZ4c2hvd1wiICk7XG5cdFx0XHRmb3IgKCBwcm9wIGluIG9yaWcgKSB7XG5cdFx0XHRcdGpRdWVyeS5zdHlsZSggZWxlbSwgcHJvcCwgb3JpZ1sgcHJvcCBdICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHRcdGZvciAoIHByb3AgaW4gb3JpZyApIHtcblx0XHRcdHR3ZWVuID0gY3JlYXRlVHdlZW4oIGhpZGRlbiA/IGRhdGFTaG93WyBwcm9wIF0gOiAwLCBwcm9wLCBhbmltICk7XG5cblx0XHRcdGlmICggISggcHJvcCBpbiBkYXRhU2hvdyApICkge1xuXHRcdFx0XHRkYXRhU2hvd1sgcHJvcCBdID0gdHdlZW4uc3RhcnQ7XG5cdFx0XHRcdGlmICggaGlkZGVuICkge1xuXHRcdFx0XHRcdHR3ZWVuLmVuZCA9IHR3ZWVuLnN0YXJ0O1xuXHRcdFx0XHRcdHR3ZWVuLnN0YXJ0ID0gcHJvcCA9PT0gXCJ3aWR0aFwiIHx8IHByb3AgPT09IFwiaGVpZ2h0XCIgPyAxIDogMDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHQvLyBJZiB0aGlzIGlzIGEgbm9vcCBsaWtlIC5oaWRlKCkuaGlkZSgpLCByZXN0b3JlIGFuIG92ZXJ3cml0dGVuIGRpc3BsYXkgdmFsdWVcblx0fSBlbHNlIGlmICggKCBkaXNwbGF5ID09PSBcIm5vbmVcIiA/IGRlZmF1bHREaXNwbGF5KCBlbGVtLm5vZGVOYW1lICkgOiBkaXNwbGF5ICkgPT09IFwiaW5saW5lXCIgKSB7XG5cdFx0c3R5bGUuZGlzcGxheSA9IGRpc3BsYXk7XG5cdH1cbn1cblxuZnVuY3Rpb24gcHJvcEZpbHRlciggcHJvcHMsIHNwZWNpYWxFYXNpbmcgKSB7XG5cdHZhciBpbmRleCwgbmFtZSwgZWFzaW5nLCB2YWx1ZSwgaG9va3M7XG5cblx0Ly8gY2FtZWxDYXNlLCBzcGVjaWFsRWFzaW5nIGFuZCBleHBhbmQgY3NzSG9vayBwYXNzXG5cdGZvciAoIGluZGV4IGluIHByb3BzICkge1xuXHRcdG5hbWUgPSBqUXVlcnkuY2FtZWxDYXNlKCBpbmRleCApO1xuXHRcdGVhc2luZyA9IHNwZWNpYWxFYXNpbmdbIG5hbWUgXTtcblx0XHR2YWx1ZSA9IHByb3BzWyBpbmRleCBdO1xuXHRcdGlmICggalF1ZXJ5LmlzQXJyYXkoIHZhbHVlICkgKSB7XG5cdFx0XHRlYXNpbmcgPSB2YWx1ZVsgMSBdO1xuXHRcdFx0dmFsdWUgPSBwcm9wc1sgaW5kZXggXSA9IHZhbHVlWyAwIF07XG5cdFx0fVxuXG5cdFx0aWYgKCBpbmRleCAhPT0gbmFtZSApIHtcblx0XHRcdHByb3BzWyBuYW1lIF0gPSB2YWx1ZTtcblx0XHRcdGRlbGV0ZSBwcm9wc1sgaW5kZXggXTtcblx0XHR9XG5cblx0XHRob29rcyA9IGpRdWVyeS5jc3NIb29rc1sgbmFtZSBdO1xuXHRcdGlmICggaG9va3MgJiYgXCJleHBhbmRcIiBpbiBob29rcyApIHtcblx0XHRcdHZhbHVlID0gaG9va3MuZXhwYW5kKCB2YWx1ZSApO1xuXHRcdFx0ZGVsZXRlIHByb3BzWyBuYW1lIF07XG5cblx0XHRcdC8vIG5vdCBxdWl0ZSAkLmV4dGVuZCwgdGhpcyB3b250IG92ZXJ3cml0ZSBrZXlzIGFscmVhZHkgcHJlc2VudC5cblx0XHRcdC8vIGFsc28gLSByZXVzaW5nICdpbmRleCcgZnJvbSBhYm92ZSBiZWNhdXNlIHdlIGhhdmUgdGhlIGNvcnJlY3QgXCJuYW1lXCJcblx0XHRcdGZvciAoIGluZGV4IGluIHZhbHVlICkge1xuXHRcdFx0XHRpZiAoICEoIGluZGV4IGluIHByb3BzICkgKSB7XG5cdFx0XHRcdFx0cHJvcHNbIGluZGV4IF0gPSB2YWx1ZVsgaW5kZXggXTtcblx0XHRcdFx0XHRzcGVjaWFsRWFzaW5nWyBpbmRleCBdID0gZWFzaW5nO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHNwZWNpYWxFYXNpbmdbIG5hbWUgXSA9IGVhc2luZztcblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gQW5pbWF0aW9uKCBlbGVtLCBwcm9wZXJ0aWVzLCBvcHRpb25zICkge1xuXHR2YXIgcmVzdWx0LFxuXHRcdHN0b3BwZWQsXG5cdFx0aW5kZXggPSAwLFxuXHRcdGxlbmd0aCA9IEFuaW1hdGlvbi5wcmVmaWx0ZXJzLmxlbmd0aCxcblx0XHRkZWZlcnJlZCA9IGpRdWVyeS5EZWZlcnJlZCgpLmFsd2F5cyggZnVuY3Rpb24oKSB7XG5cblx0XHRcdC8vIGRvbid0IG1hdGNoIGVsZW0gaW4gdGhlIDphbmltYXRlZCBzZWxlY3RvclxuXHRcdFx0ZGVsZXRlIHRpY2suZWxlbTtcblx0XHR9ICksXG5cdFx0dGljayA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYgKCBzdG9wcGVkICkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHR2YXIgY3VycmVudFRpbWUgPSBmeE5vdyB8fCBjcmVhdGVGeE5vdygpLFxuXHRcdFx0XHRyZW1haW5pbmcgPSBNYXRoLm1heCggMCwgYW5pbWF0aW9uLnN0YXJ0VGltZSArIGFuaW1hdGlvbi5kdXJhdGlvbiAtIGN1cnJlbnRUaW1lICksXG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogQW5kcm9pZCAyLjNcblx0XHRcdFx0Ly8gQXJjaGFpYyBjcmFzaCBidWcgd29uJ3QgYWxsb3cgdXMgdG8gdXNlIGAxIC0gKCAwLjUgfHwgMCApYCAoIzEyNDk3KVxuXHRcdFx0XHR0ZW1wID0gcmVtYWluaW5nIC8gYW5pbWF0aW9uLmR1cmF0aW9uIHx8IDAsXG5cdFx0XHRcdHBlcmNlbnQgPSAxIC0gdGVtcCxcblx0XHRcdFx0aW5kZXggPSAwLFxuXHRcdFx0XHRsZW5ndGggPSBhbmltYXRpb24udHdlZW5zLmxlbmd0aDtcblxuXHRcdFx0Zm9yICggOyBpbmRleCA8IGxlbmd0aCA7IGluZGV4KysgKSB7XG5cdFx0XHRcdGFuaW1hdGlvbi50d2VlbnNbIGluZGV4IF0ucnVuKCBwZXJjZW50ICk7XG5cdFx0XHR9XG5cblx0XHRcdGRlZmVycmVkLm5vdGlmeVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uLCBwZXJjZW50LCByZW1haW5pbmcgXSApO1xuXG5cdFx0XHRpZiAoIHBlcmNlbnQgPCAxICYmIGxlbmd0aCApIHtcblx0XHRcdFx0cmV0dXJuIHJlbWFpbmluZztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGRlZmVycmVkLnJlc29sdmVXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiBdICk7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdGFuaW1hdGlvbiA9IGRlZmVycmVkLnByb21pc2UoIHtcblx0XHRcdGVsZW06IGVsZW0sXG5cdFx0XHRwcm9wczogalF1ZXJ5LmV4dGVuZCgge30sIHByb3BlcnRpZXMgKSxcblx0XHRcdG9wdHM6IGpRdWVyeS5leHRlbmQoIHRydWUsIHtcblx0XHRcdFx0c3BlY2lhbEVhc2luZzoge30sXG5cdFx0XHRcdGVhc2luZzogalF1ZXJ5LmVhc2luZy5fZGVmYXVsdFxuXHRcdFx0fSwgb3B0aW9ucyApLFxuXHRcdFx0b3JpZ2luYWxQcm9wZXJ0aWVzOiBwcm9wZXJ0aWVzLFxuXHRcdFx0b3JpZ2luYWxPcHRpb25zOiBvcHRpb25zLFxuXHRcdFx0c3RhcnRUaW1lOiBmeE5vdyB8fCBjcmVhdGVGeE5vdygpLFxuXHRcdFx0ZHVyYXRpb246IG9wdGlvbnMuZHVyYXRpb24sXG5cdFx0XHR0d2VlbnM6IFtdLFxuXHRcdFx0Y3JlYXRlVHdlZW46IGZ1bmN0aW9uKCBwcm9wLCBlbmQgKSB7XG5cdFx0XHRcdHZhciB0d2VlbiA9IGpRdWVyeS5Ud2VlbiggZWxlbSwgYW5pbWF0aW9uLm9wdHMsIHByb3AsIGVuZCxcblx0XHRcdFx0XHRcdGFuaW1hdGlvbi5vcHRzLnNwZWNpYWxFYXNpbmdbIHByb3AgXSB8fCBhbmltYXRpb24ub3B0cy5lYXNpbmcgKTtcblx0XHRcdFx0YW5pbWF0aW9uLnR3ZWVucy5wdXNoKCB0d2VlbiApO1xuXHRcdFx0XHRyZXR1cm4gdHdlZW47XG5cdFx0XHR9LFxuXHRcdFx0c3RvcDogZnVuY3Rpb24oIGdvdG9FbmQgKSB7XG5cdFx0XHRcdHZhciBpbmRleCA9IDAsXG5cblx0XHRcdFx0XHQvLyBpZiB3ZSBhcmUgZ29pbmcgdG8gdGhlIGVuZCwgd2Ugd2FudCB0byBydW4gYWxsIHRoZSB0d2VlbnNcblx0XHRcdFx0XHQvLyBvdGhlcndpc2Ugd2Ugc2tpcCB0aGlzIHBhcnRcblx0XHRcdFx0XHRsZW5ndGggPSBnb3RvRW5kID8gYW5pbWF0aW9uLnR3ZWVucy5sZW5ndGggOiAwO1xuXHRcdFx0XHRpZiAoIHN0b3BwZWQgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHRcdH1cblx0XHRcdFx0c3RvcHBlZCA9IHRydWU7XG5cdFx0XHRcdGZvciAoIDsgaW5kZXggPCBsZW5ndGggOyBpbmRleCsrICkge1xuXHRcdFx0XHRcdGFuaW1hdGlvbi50d2VlbnNbIGluZGV4IF0ucnVuKCAxICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyByZXNvbHZlIHdoZW4gd2UgcGxheWVkIHRoZSBsYXN0IGZyYW1lXG5cdFx0XHRcdC8vIG90aGVyd2lzZSwgcmVqZWN0XG5cdFx0XHRcdGlmICggZ290b0VuZCApIHtcblx0XHRcdFx0XHRkZWZlcnJlZC5ub3RpZnlXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgMSwgMCBdICk7XG5cdFx0XHRcdFx0ZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uLCBnb3RvRW5kIF0gKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRkZWZlcnJlZC5yZWplY3RXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgZ290b0VuZCBdICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9XG5cdFx0fSApLFxuXHRcdHByb3BzID0gYW5pbWF0aW9uLnByb3BzO1xuXG5cdHByb3BGaWx0ZXIoIHByb3BzLCBhbmltYXRpb24ub3B0cy5zcGVjaWFsRWFzaW5nICk7XG5cblx0Zm9yICggOyBpbmRleCA8IGxlbmd0aCA7IGluZGV4KysgKSB7XG5cdFx0cmVzdWx0ID0gQW5pbWF0aW9uLnByZWZpbHRlcnNbIGluZGV4IF0uY2FsbCggYW5pbWF0aW9uLCBlbGVtLCBwcm9wcywgYW5pbWF0aW9uLm9wdHMgKTtcblx0XHRpZiAoIHJlc3VsdCApIHtcblx0XHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHJlc3VsdC5zdG9wICkgKSB7XG5cdFx0XHRcdGpRdWVyeS5fcXVldWVIb29rcyggYW5pbWF0aW9uLmVsZW0sIGFuaW1hdGlvbi5vcHRzLnF1ZXVlICkuc3RvcCA9XG5cdFx0XHRcdFx0alF1ZXJ5LnByb3h5KCByZXN1bHQuc3RvcCwgcmVzdWx0ICk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdH1cblx0fVxuXG5cdGpRdWVyeS5tYXAoIHByb3BzLCBjcmVhdGVUd2VlbiwgYW5pbWF0aW9uICk7XG5cblx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggYW5pbWF0aW9uLm9wdHMuc3RhcnQgKSApIHtcblx0XHRhbmltYXRpb24ub3B0cy5zdGFydC5jYWxsKCBlbGVtLCBhbmltYXRpb24gKTtcblx0fVxuXG5cdGpRdWVyeS5meC50aW1lcihcblx0XHRqUXVlcnkuZXh0ZW5kKCB0aWNrLCB7XG5cdFx0XHRlbGVtOiBlbGVtLFxuXHRcdFx0YW5pbTogYW5pbWF0aW9uLFxuXHRcdFx0cXVldWU6IGFuaW1hdGlvbi5vcHRzLnF1ZXVlXG5cdFx0fSApXG5cdCk7XG5cblx0Ly8gYXR0YWNoIGNhbGxiYWNrcyBmcm9tIG9wdGlvbnNcblx0cmV0dXJuIGFuaW1hdGlvbi5wcm9ncmVzcyggYW5pbWF0aW9uLm9wdHMucHJvZ3Jlc3MgKVxuXHRcdC5kb25lKCBhbmltYXRpb24ub3B0cy5kb25lLCBhbmltYXRpb24ub3B0cy5jb21wbGV0ZSApXG5cdFx0LmZhaWwoIGFuaW1hdGlvbi5vcHRzLmZhaWwgKVxuXHRcdC5hbHdheXMoIGFuaW1hdGlvbi5vcHRzLmFsd2F5cyApO1xufVxuXG5qUXVlcnkuQW5pbWF0aW9uID0galF1ZXJ5LmV4dGVuZCggQW5pbWF0aW9uLCB7XG5cblx0dHdlZW5lcnM6IHtcblx0XHRcIipcIjogWyBmdW5jdGlvbiggcHJvcCwgdmFsdWUgKSB7XG5cdFx0XHR2YXIgdHdlZW4gPSB0aGlzLmNyZWF0ZVR3ZWVuKCBwcm9wLCB2YWx1ZSApO1xuXHRcdFx0YWRqdXN0Q1NTKCB0d2Vlbi5lbGVtLCBwcm9wLCByY3NzTnVtLmV4ZWMoIHZhbHVlICksIHR3ZWVuICk7XG5cdFx0XHRyZXR1cm4gdHdlZW47XG5cdFx0fSBdXG5cdH0sXG5cblx0dHdlZW5lcjogZnVuY3Rpb24oIHByb3BzLCBjYWxsYmFjayApIHtcblx0XHRpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBwcm9wcyApICkge1xuXHRcdFx0Y2FsbGJhY2sgPSBwcm9wcztcblx0XHRcdHByb3BzID0gWyBcIipcIiBdO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRwcm9wcyA9IHByb3BzLm1hdGNoKCBybm90d2hpdGUgKTtcblx0XHR9XG5cblx0XHR2YXIgcHJvcCxcblx0XHRcdGluZGV4ID0gMCxcblx0XHRcdGxlbmd0aCA9IHByb3BzLmxlbmd0aDtcblxuXHRcdGZvciAoIDsgaW5kZXggPCBsZW5ndGggOyBpbmRleCsrICkge1xuXHRcdFx0cHJvcCA9IHByb3BzWyBpbmRleCBdO1xuXHRcdFx0QW5pbWF0aW9uLnR3ZWVuZXJzWyBwcm9wIF0gPSBBbmltYXRpb24udHdlZW5lcnNbIHByb3AgXSB8fCBbXTtcblx0XHRcdEFuaW1hdGlvbi50d2VlbmVyc1sgcHJvcCBdLnVuc2hpZnQoIGNhbGxiYWNrICk7XG5cdFx0fVxuXHR9LFxuXG5cdHByZWZpbHRlcnM6IFsgZGVmYXVsdFByZWZpbHRlciBdLFxuXG5cdHByZWZpbHRlcjogZnVuY3Rpb24oIGNhbGxiYWNrLCBwcmVwZW5kICkge1xuXHRcdGlmICggcHJlcGVuZCApIHtcblx0XHRcdEFuaW1hdGlvbi5wcmVmaWx0ZXJzLnVuc2hpZnQoIGNhbGxiYWNrICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdEFuaW1hdGlvbi5wcmVmaWx0ZXJzLnB1c2goIGNhbGxiYWNrICk7XG5cdFx0fVxuXHR9XG59ICk7XG5cbmpRdWVyeS5zcGVlZCA9IGZ1bmN0aW9uKCBzcGVlZCwgZWFzaW5nLCBmbiApIHtcblx0dmFyIG9wdCA9IHNwZWVkICYmIHR5cGVvZiBzcGVlZCA9PT0gXCJvYmplY3RcIiA/IGpRdWVyeS5leHRlbmQoIHt9LCBzcGVlZCApIDoge1xuXHRcdGNvbXBsZXRlOiBmbiB8fCAhZm4gJiYgZWFzaW5nIHx8XG5cdFx0XHRqUXVlcnkuaXNGdW5jdGlvbiggc3BlZWQgKSAmJiBzcGVlZCxcblx0XHRkdXJhdGlvbjogc3BlZWQsXG5cdFx0ZWFzaW5nOiBmbiAmJiBlYXNpbmcgfHwgZWFzaW5nICYmICFqUXVlcnkuaXNGdW5jdGlvbiggZWFzaW5nICkgJiYgZWFzaW5nXG5cdH07XG5cblx0b3B0LmR1cmF0aW9uID0galF1ZXJ5LmZ4Lm9mZiA/IDAgOiB0eXBlb2Ygb3B0LmR1cmF0aW9uID09PSBcIm51bWJlclwiID8gb3B0LmR1cmF0aW9uIDpcblx0XHRvcHQuZHVyYXRpb24gaW4galF1ZXJ5LmZ4LnNwZWVkcyA/XG5cdFx0XHRqUXVlcnkuZnguc3BlZWRzWyBvcHQuZHVyYXRpb24gXSA6IGpRdWVyeS5meC5zcGVlZHMuX2RlZmF1bHQ7XG5cblx0Ly8gbm9ybWFsaXplIG9wdC5xdWV1ZSAtIHRydWUvdW5kZWZpbmVkL251bGwgLT4gXCJmeFwiXG5cdGlmICggb3B0LnF1ZXVlID09IG51bGwgfHwgb3B0LnF1ZXVlID09PSB0cnVlICkge1xuXHRcdG9wdC5xdWV1ZSA9IFwiZnhcIjtcblx0fVxuXG5cdC8vIFF1ZXVlaW5nXG5cdG9wdC5vbGQgPSBvcHQuY29tcGxldGU7XG5cblx0b3B0LmNvbXBsZXRlID0gZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggb3B0Lm9sZCApICkge1xuXHRcdFx0b3B0Lm9sZC5jYWxsKCB0aGlzICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBvcHQucXVldWUgKSB7XG5cdFx0XHRqUXVlcnkuZGVxdWV1ZSggdGhpcywgb3B0LnF1ZXVlICk7XG5cdFx0fVxuXHR9O1xuXG5cdHJldHVybiBvcHQ7XG59O1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdGZhZGVUbzogZnVuY3Rpb24oIHNwZWVkLCB0bywgZWFzaW5nLCBjYWxsYmFjayApIHtcblxuXHRcdC8vIHNob3cgYW55IGhpZGRlbiBlbGVtZW50cyBhZnRlciBzZXR0aW5nIG9wYWNpdHkgdG8gMFxuXHRcdHJldHVybiB0aGlzLmZpbHRlciggaXNIaWRkZW4gKS5jc3MoIFwib3BhY2l0eVwiLCAwICkuc2hvdygpXG5cblx0XHRcdC8vIGFuaW1hdGUgdG8gdGhlIHZhbHVlIHNwZWNpZmllZFxuXHRcdFx0LmVuZCgpLmFuaW1hdGUoIHsgb3BhY2l0eTogdG8gfSwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKTtcblx0fSxcblx0YW5pbWF0ZTogZnVuY3Rpb24oIHByb3AsIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkge1xuXHRcdHZhciBlbXB0eSA9IGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBwcm9wICksXG5cdFx0XHRvcHRhbGwgPSBqUXVlcnkuc3BlZWQoIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICksXG5cdFx0XHRkb0FuaW1hdGlvbiA9IGZ1bmN0aW9uKCkge1xuXG5cdFx0XHRcdC8vIE9wZXJhdGUgb24gYSBjb3B5IG9mIHByb3Agc28gcGVyLXByb3BlcnR5IGVhc2luZyB3b24ndCBiZSBsb3N0XG5cdFx0XHRcdHZhciBhbmltID0gQW5pbWF0aW9uKCB0aGlzLCBqUXVlcnkuZXh0ZW5kKCB7fSwgcHJvcCApLCBvcHRhbGwgKTtcblxuXHRcdFx0XHQvLyBFbXB0eSBhbmltYXRpb25zLCBvciBmaW5pc2hpbmcgcmVzb2x2ZXMgaW1tZWRpYXRlbHlcblx0XHRcdFx0aWYgKCBlbXB0eSB8fCBqUXVlcnkuX2RhdGEoIHRoaXMsIFwiZmluaXNoXCIgKSApIHtcblx0XHRcdFx0XHRhbmltLnN0b3AoIHRydWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHRcdGRvQW5pbWF0aW9uLmZpbmlzaCA9IGRvQW5pbWF0aW9uO1xuXG5cdFx0cmV0dXJuIGVtcHR5IHx8IG9wdGFsbC5xdWV1ZSA9PT0gZmFsc2UgP1xuXHRcdFx0dGhpcy5lYWNoKCBkb0FuaW1hdGlvbiApIDpcblx0XHRcdHRoaXMucXVldWUoIG9wdGFsbC5xdWV1ZSwgZG9BbmltYXRpb24gKTtcblx0fSxcblx0c3RvcDogZnVuY3Rpb24oIHR5cGUsIGNsZWFyUXVldWUsIGdvdG9FbmQgKSB7XG5cdFx0dmFyIHN0b3BRdWV1ZSA9IGZ1bmN0aW9uKCBob29rcyApIHtcblx0XHRcdHZhciBzdG9wID0gaG9va3Muc3RvcDtcblx0XHRcdGRlbGV0ZSBob29rcy5zdG9wO1xuXHRcdFx0c3RvcCggZ290b0VuZCApO1xuXHRcdH07XG5cblx0XHRpZiAoIHR5cGVvZiB0eXBlICE9PSBcInN0cmluZ1wiICkge1xuXHRcdFx0Z290b0VuZCA9IGNsZWFyUXVldWU7XG5cdFx0XHRjbGVhclF1ZXVlID0gdHlwZTtcblx0XHRcdHR5cGUgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdGlmICggY2xlYXJRdWV1ZSAmJiB0eXBlICE9PSBmYWxzZSApIHtcblx0XHRcdHRoaXMucXVldWUoIHR5cGUgfHwgXCJmeFwiLCBbXSApO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIGRlcXVldWUgPSB0cnVlLFxuXHRcdFx0XHRpbmRleCA9IHR5cGUgIT0gbnVsbCAmJiB0eXBlICsgXCJxdWV1ZUhvb2tzXCIsXG5cdFx0XHRcdHRpbWVycyA9IGpRdWVyeS50aW1lcnMsXG5cdFx0XHRcdGRhdGEgPSBqUXVlcnkuX2RhdGEoIHRoaXMgKTtcblxuXHRcdFx0aWYgKCBpbmRleCApIHtcblx0XHRcdFx0aWYgKCBkYXRhWyBpbmRleCBdICYmIGRhdGFbIGluZGV4IF0uc3RvcCApIHtcblx0XHRcdFx0XHRzdG9wUXVldWUoIGRhdGFbIGluZGV4IF0gKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Zm9yICggaW5kZXggaW4gZGF0YSApIHtcblx0XHRcdFx0XHRpZiAoIGRhdGFbIGluZGV4IF0gJiYgZGF0YVsgaW5kZXggXS5zdG9wICYmIHJydW4udGVzdCggaW5kZXggKSApIHtcblx0XHRcdFx0XHRcdHN0b3BRdWV1ZSggZGF0YVsgaW5kZXggXSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKCBpbmRleCA9IHRpbWVycy5sZW5ndGg7IGluZGV4LS07ICkge1xuXHRcdFx0XHRpZiAoIHRpbWVyc1sgaW5kZXggXS5lbGVtID09PSB0aGlzICYmXG5cdFx0XHRcdFx0KCB0eXBlID09IG51bGwgfHwgdGltZXJzWyBpbmRleCBdLnF1ZXVlID09PSB0eXBlICkgKSB7XG5cblx0XHRcdFx0XHR0aW1lcnNbIGluZGV4IF0uYW5pbS5zdG9wKCBnb3RvRW5kICk7XG5cdFx0XHRcdFx0ZGVxdWV1ZSA9IGZhbHNlO1xuXHRcdFx0XHRcdHRpbWVycy5zcGxpY2UoIGluZGV4LCAxICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gc3RhcnQgdGhlIG5leHQgaW4gdGhlIHF1ZXVlIGlmIHRoZSBsYXN0IHN0ZXAgd2Fzbid0IGZvcmNlZFxuXHRcdFx0Ly8gdGltZXJzIGN1cnJlbnRseSB3aWxsIGNhbGwgdGhlaXIgY29tcGxldGUgY2FsbGJhY2tzLCB3aGljaCB3aWxsIGRlcXVldWVcblx0XHRcdC8vIGJ1dCBvbmx5IGlmIHRoZXkgd2VyZSBnb3RvRW5kXG5cdFx0XHRpZiAoIGRlcXVldWUgfHwgIWdvdG9FbmQgKSB7XG5cdFx0XHRcdGpRdWVyeS5kZXF1ZXVlKCB0aGlzLCB0eXBlICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXHRmaW5pc2g6IGZ1bmN0aW9uKCB0eXBlICkge1xuXHRcdGlmICggdHlwZSAhPT0gZmFsc2UgKSB7XG5cdFx0XHR0eXBlID0gdHlwZSB8fCBcImZ4XCI7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIGluZGV4LFxuXHRcdFx0XHRkYXRhID0galF1ZXJ5Ll9kYXRhKCB0aGlzICksXG5cdFx0XHRcdHF1ZXVlID0gZGF0YVsgdHlwZSArIFwicXVldWVcIiBdLFxuXHRcdFx0XHRob29rcyA9IGRhdGFbIHR5cGUgKyBcInF1ZXVlSG9va3NcIiBdLFxuXHRcdFx0XHR0aW1lcnMgPSBqUXVlcnkudGltZXJzLFxuXHRcdFx0XHRsZW5ndGggPSBxdWV1ZSA/IHF1ZXVlLmxlbmd0aCA6IDA7XG5cblx0XHRcdC8vIGVuYWJsZSBmaW5pc2hpbmcgZmxhZyBvbiBwcml2YXRlIGRhdGFcblx0XHRcdGRhdGEuZmluaXNoID0gdHJ1ZTtcblxuXHRcdFx0Ly8gZW1wdHkgdGhlIHF1ZXVlIGZpcnN0XG5cdFx0XHRqUXVlcnkucXVldWUoIHRoaXMsIHR5cGUsIFtdICk7XG5cblx0XHRcdGlmICggaG9va3MgJiYgaG9va3Muc3RvcCApIHtcblx0XHRcdFx0aG9va3Muc3RvcC5jYWxsKCB0aGlzLCB0cnVlICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIGxvb2sgZm9yIGFueSBhY3RpdmUgYW5pbWF0aW9ucywgYW5kIGZpbmlzaCB0aGVtXG5cdFx0XHRmb3IgKCBpbmRleCA9IHRpbWVycy5sZW5ndGg7IGluZGV4LS07ICkge1xuXHRcdFx0XHRpZiAoIHRpbWVyc1sgaW5kZXggXS5lbGVtID09PSB0aGlzICYmIHRpbWVyc1sgaW5kZXggXS5xdWV1ZSA9PT0gdHlwZSApIHtcblx0XHRcdFx0XHR0aW1lcnNbIGluZGV4IF0uYW5pbS5zdG9wKCB0cnVlICk7XG5cdFx0XHRcdFx0dGltZXJzLnNwbGljZSggaW5kZXgsIDEgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBsb29rIGZvciBhbnkgYW5pbWF0aW9ucyBpbiB0aGUgb2xkIHF1ZXVlIGFuZCBmaW5pc2ggdGhlbVxuXHRcdFx0Zm9yICggaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRcdFx0aWYgKCBxdWV1ZVsgaW5kZXggXSAmJiBxdWV1ZVsgaW5kZXggXS5maW5pc2ggKSB7XG5cdFx0XHRcdFx0cXVldWVbIGluZGV4IF0uZmluaXNoLmNhbGwoIHRoaXMgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyB0dXJuIG9mZiBmaW5pc2hpbmcgZmxhZ1xuXHRcdFx0ZGVsZXRlIGRhdGEuZmluaXNoO1xuXHRcdH0gKTtcblx0fVxufSApO1xuXG5qUXVlcnkuZWFjaCggWyBcInRvZ2dsZVwiLCBcInNob3dcIiwgXCJoaWRlXCIgXSwgZnVuY3Rpb24oIGksIG5hbWUgKSB7XG5cdHZhciBjc3NGbiA9IGpRdWVyeS5mblsgbmFtZSBdO1xuXHRqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApIHtcblx0XHRyZXR1cm4gc3BlZWQgPT0gbnVsbCB8fCB0eXBlb2Ygc3BlZWQgPT09IFwiYm9vbGVhblwiID9cblx0XHRcdGNzc0ZuLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKSA6XG5cdFx0XHR0aGlzLmFuaW1hdGUoIGdlbkZ4KCBuYW1lLCB0cnVlICksIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICk7XG5cdH07XG59ICk7XG5cbi8vIEdlbmVyYXRlIHNob3J0Y3V0cyBmb3IgY3VzdG9tIGFuaW1hdGlvbnNcbmpRdWVyeS5lYWNoKCB7XG5cdHNsaWRlRG93bjogZ2VuRngoIFwic2hvd1wiICksXG5cdHNsaWRlVXA6IGdlbkZ4KCBcImhpZGVcIiApLFxuXHRzbGlkZVRvZ2dsZTogZ2VuRngoIFwidG9nZ2xlXCIgKSxcblx0ZmFkZUluOiB7IG9wYWNpdHk6IFwic2hvd1wiIH0sXG5cdGZhZGVPdXQ6IHsgb3BhY2l0eTogXCJoaWRlXCIgfSxcblx0ZmFkZVRvZ2dsZTogeyBvcGFjaXR5OiBcInRvZ2dsZVwiIH1cbn0sIGZ1bmN0aW9uKCBuYW1lLCBwcm9wcyApIHtcblx0alF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSB7XG5cdFx0cmV0dXJuIHRoaXMuYW5pbWF0ZSggcHJvcHMsIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICk7XG5cdH07XG59ICk7XG5cbmpRdWVyeS50aW1lcnMgPSBbXTtcbmpRdWVyeS5meC50aWNrID0gZnVuY3Rpb24oKSB7XG5cdHZhciB0aW1lcixcblx0XHR0aW1lcnMgPSBqUXVlcnkudGltZXJzLFxuXHRcdGkgPSAwO1xuXG5cdGZ4Tm93ID0galF1ZXJ5Lm5vdygpO1xuXG5cdGZvciAoIDsgaSA8IHRpbWVycy5sZW5ndGg7IGkrKyApIHtcblx0XHR0aW1lciA9IHRpbWVyc1sgaSBdO1xuXG5cdFx0Ly8gQ2hlY2tzIHRoZSB0aW1lciBoYXMgbm90IGFscmVhZHkgYmVlbiByZW1vdmVkXG5cdFx0aWYgKCAhdGltZXIoKSAmJiB0aW1lcnNbIGkgXSA9PT0gdGltZXIgKSB7XG5cdFx0XHR0aW1lcnMuc3BsaWNlKCBpLS0sIDEgKTtcblx0XHR9XG5cdH1cblxuXHRpZiAoICF0aW1lcnMubGVuZ3RoICkge1xuXHRcdGpRdWVyeS5meC5zdG9wKCk7XG5cdH1cblx0ZnhOb3cgPSB1bmRlZmluZWQ7XG59O1xuXG5qUXVlcnkuZngudGltZXIgPSBmdW5jdGlvbiggdGltZXIgKSB7XG5cdGpRdWVyeS50aW1lcnMucHVzaCggdGltZXIgKTtcblx0aWYgKCB0aW1lcigpICkge1xuXHRcdGpRdWVyeS5meC5zdGFydCgpO1xuXHR9IGVsc2Uge1xuXHRcdGpRdWVyeS50aW1lcnMucG9wKCk7XG5cdH1cbn07XG5cbmpRdWVyeS5meC5pbnRlcnZhbCA9IDEzO1xuXG5qUXVlcnkuZnguc3RhcnQgPSBmdW5jdGlvbigpIHtcblx0aWYgKCAhdGltZXJJZCApIHtcblx0XHR0aW1lcklkID0gd2luZG93LnNldEludGVydmFsKCBqUXVlcnkuZngudGljaywgalF1ZXJ5LmZ4LmludGVydmFsICk7XG5cdH1cbn07XG5cbmpRdWVyeS5meC5zdG9wID0gZnVuY3Rpb24oKSB7XG5cdHdpbmRvdy5jbGVhckludGVydmFsKCB0aW1lcklkICk7XG5cdHRpbWVySWQgPSBudWxsO1xufTtcblxualF1ZXJ5LmZ4LnNwZWVkcyA9IHtcblx0c2xvdzogNjAwLFxuXHRmYXN0OiAyMDAsXG5cblx0Ly8gRGVmYXVsdCBzcGVlZFxuXHRfZGVmYXVsdDogNDAwXG59O1xuXG5cbi8vIEJhc2VkIG9mZiBvZiB0aGUgcGx1Z2luIGJ5IENsaW50IEhlbGZlcnMsIHdpdGggcGVybWlzc2lvbi5cbi8vIGh0dHA6Ly93ZWIuYXJjaGl2ZS5vcmcvd2ViLzIwMTAwMzI0MDE0NzQ3L2h0dHA6Ly9ibGluZHNpZ25hbHMuY29tL2luZGV4LnBocC8yMDA5LzA3L2pxdWVyeS1kZWxheS9cbmpRdWVyeS5mbi5kZWxheSA9IGZ1bmN0aW9uKCB0aW1lLCB0eXBlICkge1xuXHR0aW1lID0galF1ZXJ5LmZ4ID8galF1ZXJ5LmZ4LnNwZWVkc1sgdGltZSBdIHx8IHRpbWUgOiB0aW1lO1xuXHR0eXBlID0gdHlwZSB8fCBcImZ4XCI7XG5cblx0cmV0dXJuIHRoaXMucXVldWUoIHR5cGUsIGZ1bmN0aW9uKCBuZXh0LCBob29rcyApIHtcblx0XHR2YXIgdGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KCBuZXh0LCB0aW1lICk7XG5cdFx0aG9va3Muc3RvcCA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0d2luZG93LmNsZWFyVGltZW91dCggdGltZW91dCApO1xuXHRcdH07XG5cdH0gKTtcbn07XG5cblxuKCBmdW5jdGlvbigpIHtcblx0dmFyIGEsXG5cdFx0aW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImlucHV0XCIgKSxcblx0XHRkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImRpdlwiICksXG5cdFx0c2VsZWN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJzZWxlY3RcIiApLFxuXHRcdG9wdCA9IHNlbGVjdC5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJvcHRpb25cIiApICk7XG5cblx0Ly8gU2V0dXBcblx0ZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJkaXZcIiApO1xuXHRkaXYuc2V0QXR0cmlidXRlKCBcImNsYXNzTmFtZVwiLCBcInRcIiApO1xuXHRkaXYuaW5uZXJIVE1MID0gXCIgIDxsaW5rLz48dGFibGU+PC90YWJsZT48YSBocmVmPScvYSc+YTwvYT48aW5wdXQgdHlwZT0nY2hlY2tib3gnLz5cIjtcblx0YSA9IGRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSggXCJhXCIgKVsgMCBdO1xuXG5cdC8vIFN1cHBvcnQ6IFdpbmRvd3MgV2ViIEFwcHMgKFdXQSlcblx0Ly8gYHR5cGVgIG11c3QgdXNlIC5zZXRBdHRyaWJ1dGUgZm9yIFdXQSAoIzE0OTAxKVxuXHRpbnB1dC5zZXRBdHRyaWJ1dGUoIFwidHlwZVwiLCBcImNoZWNrYm94XCIgKTtcblx0ZGl2LmFwcGVuZENoaWxkKCBpbnB1dCApO1xuXG5cdGEgPSBkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIFwiYVwiIClbIDAgXTtcblxuXHQvLyBGaXJzdCBiYXRjaCBvZiB0ZXN0cy5cblx0YS5zdHlsZS5jc3NUZXh0ID0gXCJ0b3A6MXB4XCI7XG5cblx0Ly8gVGVzdCBzZXRBdHRyaWJ1dGUgb24gY2FtZWxDYXNlIGNsYXNzLlxuXHQvLyBJZiBpdCB3b3Jrcywgd2UgbmVlZCBhdHRyRml4ZXMgd2hlbiBkb2luZyBnZXQvc2V0QXR0cmlidXRlIChpZTYvNylcblx0c3VwcG9ydC5nZXRTZXRBdHRyaWJ1dGUgPSBkaXYuY2xhc3NOYW1lICE9PSBcInRcIjtcblxuXHQvLyBHZXQgdGhlIHN0eWxlIGluZm9ybWF0aW9uIGZyb20gZ2V0QXR0cmlidXRlXG5cdC8vIChJRSB1c2VzIC5jc3NUZXh0IGluc3RlYWQpXG5cdHN1cHBvcnQuc3R5bGUgPSAvdG9wLy50ZXN0KCBhLmdldEF0dHJpYnV0ZSggXCJzdHlsZVwiICkgKTtcblxuXHQvLyBNYWtlIHN1cmUgdGhhdCBVUkxzIGFyZW4ndCBtYW5pcHVsYXRlZFxuXHQvLyAoSUUgbm9ybWFsaXplcyBpdCBieSBkZWZhdWx0KVxuXHRzdXBwb3J0LmhyZWZOb3JtYWxpemVkID0gYS5nZXRBdHRyaWJ1dGUoIFwiaHJlZlwiICkgPT09IFwiL2FcIjtcblxuXHQvLyBDaGVjayB0aGUgZGVmYXVsdCBjaGVja2JveC9yYWRpbyB2YWx1ZSAoXCJcIiBvbiBXZWJLaXQ7IFwib25cIiBlbHNld2hlcmUpXG5cdHN1cHBvcnQuY2hlY2tPbiA9ICEhaW5wdXQudmFsdWU7XG5cblx0Ly8gTWFrZSBzdXJlIHRoYXQgYSBzZWxlY3RlZC1ieS1kZWZhdWx0IG9wdGlvbiBoYXMgYSB3b3JraW5nIHNlbGVjdGVkIHByb3BlcnR5LlxuXHQvLyAoV2ViS2l0IGRlZmF1bHRzIHRvIGZhbHNlIGluc3RlYWQgb2YgdHJ1ZSwgSUUgdG9vLCBpZiBpdCdzIGluIGFuIG9wdGdyb3VwKVxuXHRzdXBwb3J0Lm9wdFNlbGVjdGVkID0gb3B0LnNlbGVjdGVkO1xuXG5cdC8vIFRlc3RzIGZvciBlbmN0eXBlIHN1cHBvcnQgb24gYSBmb3JtICgjNjc0Mylcblx0c3VwcG9ydC5lbmN0eXBlID0gISFkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImZvcm1cIiApLmVuY3R5cGU7XG5cblx0Ly8gTWFrZSBzdXJlIHRoYXQgdGhlIG9wdGlvbnMgaW5zaWRlIGRpc2FibGVkIHNlbGVjdHMgYXJlbid0IG1hcmtlZCBhcyBkaXNhYmxlZFxuXHQvLyAoV2ViS2l0IG1hcmtzIHRoZW0gYXMgZGlzYWJsZWQpXG5cdHNlbGVjdC5kaXNhYmxlZCA9IHRydWU7XG5cdHN1cHBvcnQub3B0RGlzYWJsZWQgPSAhb3B0LmRpc2FibGVkO1xuXG5cdC8vIFN1cHBvcnQ6IElFOCBvbmx5XG5cdC8vIENoZWNrIGlmIHdlIGNhbiB0cnVzdCBnZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiKVxuXHRpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiaW5wdXRcIiApO1xuXHRpbnB1dC5zZXRBdHRyaWJ1dGUoIFwidmFsdWVcIiwgXCJcIiApO1xuXHRzdXBwb3J0LmlucHV0ID0gaW5wdXQuZ2V0QXR0cmlidXRlKCBcInZhbHVlXCIgKSA9PT0gXCJcIjtcblxuXHQvLyBDaGVjayBpZiBhbiBpbnB1dCBtYWludGFpbnMgaXRzIHZhbHVlIGFmdGVyIGJlY29taW5nIGEgcmFkaW9cblx0aW5wdXQudmFsdWUgPSBcInRcIjtcblx0aW5wdXQuc2V0QXR0cmlidXRlKCBcInR5cGVcIiwgXCJyYWRpb1wiICk7XG5cdHN1cHBvcnQucmFkaW9WYWx1ZSA9IGlucHV0LnZhbHVlID09PSBcInRcIjtcbn0gKSgpO1xuXG5cbnZhciBycmV0dXJuID0gL1xcci9nLFxuXHRyc3BhY2VzID0gL1tcXHgyMFxcdFxcclxcblxcZl0rL2c7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0dmFsOiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0dmFyIGhvb2tzLCByZXQsIGlzRnVuY3Rpb24sXG5cdFx0XHRlbGVtID0gdGhpc1sgMCBdO1xuXG5cdFx0aWYgKCAhYXJndW1lbnRzLmxlbmd0aCApIHtcblx0XHRcdGlmICggZWxlbSApIHtcblx0XHRcdFx0aG9va3MgPSBqUXVlcnkudmFsSG9va3NbIGVsZW0udHlwZSBdIHx8XG5cdFx0XHRcdFx0alF1ZXJ5LnZhbEhvb2tzWyBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgXTtcblxuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0aG9va3MgJiZcblx0XHRcdFx0XHRcImdldFwiIGluIGhvb2tzICYmXG5cdFx0XHRcdFx0KCByZXQgPSBob29rcy5nZXQoIGVsZW0sIFwidmFsdWVcIiApICkgIT09IHVuZGVmaW5lZFxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0ID0gZWxlbS52YWx1ZTtcblxuXHRcdFx0XHRyZXR1cm4gdHlwZW9mIHJldCA9PT0gXCJzdHJpbmdcIiA/XG5cblx0XHRcdFx0XHQvLyBoYW5kbGUgbW9zdCBjb21tb24gc3RyaW5nIGNhc2VzXG5cdFx0XHRcdFx0cmV0LnJlcGxhY2UoIHJyZXR1cm4sIFwiXCIgKSA6XG5cblx0XHRcdFx0XHQvLyBoYW5kbGUgY2FzZXMgd2hlcmUgdmFsdWUgaXMgbnVsbC91bmRlZiBvciBudW1iZXJcblx0XHRcdFx0XHRyZXQgPT0gbnVsbCA/IFwiXCIgOiByZXQ7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpc0Z1bmN0aW9uID0galF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICk7XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaSApIHtcblx0XHRcdHZhciB2YWw7XG5cblx0XHRcdGlmICggdGhpcy5ub2RlVHlwZSAhPT0gMSApIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGlzRnVuY3Rpb24gKSB7XG5cdFx0XHRcdHZhbCA9IHZhbHVlLmNhbGwoIHRoaXMsIGksIGpRdWVyeSggdGhpcyApLnZhbCgpICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR2YWwgPSB2YWx1ZTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gVHJlYXQgbnVsbC91bmRlZmluZWQgYXMgXCJcIjsgY29udmVydCBudW1iZXJzIHRvIHN0cmluZ1xuXHRcdFx0aWYgKCB2YWwgPT0gbnVsbCApIHtcblx0XHRcdFx0dmFsID0gXCJcIjtcblx0XHRcdH0gZWxzZSBpZiAoIHR5cGVvZiB2YWwgPT09IFwibnVtYmVyXCIgKSB7XG5cdFx0XHRcdHZhbCArPSBcIlwiO1xuXHRcdFx0fSBlbHNlIGlmICggalF1ZXJ5LmlzQXJyYXkoIHZhbCApICkge1xuXHRcdFx0XHR2YWwgPSBqUXVlcnkubWFwKCB2YWwsIGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRcdFx0XHRyZXR1cm4gdmFsdWUgPT0gbnVsbCA/IFwiXCIgOiB2YWx1ZSArIFwiXCI7XG5cdFx0XHRcdH0gKTtcblx0XHRcdH1cblxuXHRcdFx0aG9va3MgPSBqUXVlcnkudmFsSG9va3NbIHRoaXMudHlwZSBdIHx8IGpRdWVyeS52YWxIb29rc1sgdGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIF07XG5cblx0XHRcdC8vIElmIHNldCByZXR1cm5zIHVuZGVmaW5lZCwgZmFsbCBiYWNrIHRvIG5vcm1hbCBzZXR0aW5nXG5cdFx0XHRpZiAoICFob29rcyB8fCAhKCBcInNldFwiIGluIGhvb2tzICkgfHwgaG9va3Muc2V0KCB0aGlzLCB2YWwsIFwidmFsdWVcIiApID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdHRoaXMudmFsdWUgPSB2YWw7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5leHRlbmQoIHtcblx0dmFsSG9va3M6IHtcblx0XHRvcHRpb246IHtcblx0XHRcdGdldDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHZhciB2YWwgPSBqUXVlcnkuZmluZC5hdHRyKCBlbGVtLCBcInZhbHVlXCIgKTtcblx0XHRcdFx0cmV0dXJuIHZhbCAhPSBudWxsID9cblx0XHRcdFx0XHR2YWwgOlxuXG5cdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUxMC0xMStcblx0XHRcdFx0XHQvLyBvcHRpb24udGV4dCB0aHJvd3MgZXhjZXB0aW9ucyAoIzE0Njg2LCAjMTQ4NTgpXG5cdFx0XHRcdFx0Ly8gU3RyaXAgYW5kIGNvbGxhcHNlIHdoaXRlc3BhY2Vcblx0XHRcdFx0XHQvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnLyNzdHJpcC1hbmQtY29sbGFwc2Utd2hpdGVzcGFjZVxuXHRcdFx0XHRcdGpRdWVyeS50cmltKCBqUXVlcnkudGV4dCggZWxlbSApICkucmVwbGFjZSggcnNwYWNlcywgXCIgXCIgKTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdHNlbGVjdDoge1xuXHRcdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0dmFyIHZhbHVlLCBvcHRpb24sXG5cdFx0XHRcdFx0b3B0aW9ucyA9IGVsZW0ub3B0aW9ucyxcblx0XHRcdFx0XHRpbmRleCA9IGVsZW0uc2VsZWN0ZWRJbmRleCxcblx0XHRcdFx0XHRvbmUgPSBlbGVtLnR5cGUgPT09IFwic2VsZWN0LW9uZVwiIHx8IGluZGV4IDwgMCxcblx0XHRcdFx0XHR2YWx1ZXMgPSBvbmUgPyBudWxsIDogW10sXG5cdFx0XHRcdFx0bWF4ID0gb25lID8gaW5kZXggKyAxIDogb3B0aW9ucy5sZW5ndGgsXG5cdFx0XHRcdFx0aSA9IGluZGV4IDwgMCA/XG5cdFx0XHRcdFx0XHRtYXggOlxuXHRcdFx0XHRcdFx0b25lID8gaW5kZXggOiAwO1xuXG5cdFx0XHRcdC8vIExvb3AgdGhyb3VnaCBhbGwgdGhlIHNlbGVjdGVkIG9wdGlvbnNcblx0XHRcdFx0Zm9yICggOyBpIDwgbWF4OyBpKysgKSB7XG5cdFx0XHRcdFx0b3B0aW9uID0gb3B0aW9uc1sgaSBdO1xuXG5cdFx0XHRcdFx0Ly8gb2xkSUUgZG9lc24ndCB1cGRhdGUgc2VsZWN0ZWQgYWZ0ZXIgZm9ybSByZXNldCAoIzI1NTEpXG5cdFx0XHRcdFx0aWYgKCAoIG9wdGlvbi5zZWxlY3RlZCB8fCBpID09PSBpbmRleCApICYmXG5cblx0XHRcdFx0XHRcdFx0Ly8gRG9uJ3QgcmV0dXJuIG9wdGlvbnMgdGhhdCBhcmUgZGlzYWJsZWQgb3IgaW4gYSBkaXNhYmxlZCBvcHRncm91cFxuXHRcdFx0XHRcdFx0XHQoIHN1cHBvcnQub3B0RGlzYWJsZWQgP1xuXHRcdFx0XHRcdFx0XHRcdCFvcHRpb24uZGlzYWJsZWQgOlxuXHRcdFx0XHRcdFx0XHRcdG9wdGlvbi5nZXRBdHRyaWJ1dGUoIFwiZGlzYWJsZWRcIiApID09PSBudWxsICkgJiZcblx0XHRcdFx0XHRcdFx0KCAhb3B0aW9uLnBhcmVudE5vZGUuZGlzYWJsZWQgfHxcblx0XHRcdFx0XHRcdFx0XHQhalF1ZXJ5Lm5vZGVOYW1lKCBvcHRpb24ucGFyZW50Tm9kZSwgXCJvcHRncm91cFwiICkgKSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gR2V0IHRoZSBzcGVjaWZpYyB2YWx1ZSBmb3IgdGhlIG9wdGlvblxuXHRcdFx0XHRcdFx0dmFsdWUgPSBqUXVlcnkoIG9wdGlvbiApLnZhbCgpO1xuXG5cdFx0XHRcdFx0XHQvLyBXZSBkb24ndCBuZWVkIGFuIGFycmF5IGZvciBvbmUgc2VsZWN0c1xuXHRcdFx0XHRcdFx0aWYgKCBvbmUgKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Ly8gTXVsdGktU2VsZWN0cyByZXR1cm4gYW4gYXJyYXlcblx0XHRcdFx0XHRcdHZhbHVlcy5wdXNoKCB2YWx1ZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiB2YWx1ZXM7XG5cdFx0XHR9LFxuXG5cdFx0XHRzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHtcblx0XHRcdFx0dmFyIG9wdGlvblNldCwgb3B0aW9uLFxuXHRcdFx0XHRcdG9wdGlvbnMgPSBlbGVtLm9wdGlvbnMsXG5cdFx0XHRcdFx0dmFsdWVzID0galF1ZXJ5Lm1ha2VBcnJheSggdmFsdWUgKSxcblx0XHRcdFx0XHRpID0gb3B0aW9ucy5sZW5ndGg7XG5cblx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0b3B0aW9uID0gb3B0aW9uc1sgaSBdO1xuXG5cdFx0XHRcdFx0aWYgKCBqUXVlcnkuaW5BcnJheSggalF1ZXJ5LnZhbEhvb2tzLm9wdGlvbi5nZXQoIG9wdGlvbiApLCB2YWx1ZXMgKSA+IC0xICkge1xuXG5cdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRTZcblx0XHRcdFx0XHRcdC8vIFdoZW4gbmV3IG9wdGlvbiBlbGVtZW50IGlzIGFkZGVkIHRvIHNlbGVjdCBib3ggd2UgbmVlZCB0b1xuXHRcdFx0XHRcdFx0Ly8gZm9yY2UgcmVmbG93IG9mIG5ld2x5IGFkZGVkIG5vZGUgaW4gb3JkZXIgdG8gd29ya2Fyb3VuZCBkZWxheVxuXHRcdFx0XHRcdFx0Ly8gb2YgaW5pdGlhbGl6YXRpb24gcHJvcGVydGllc1xuXHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0b3B0aW9uLnNlbGVjdGVkID0gb3B0aW9uU2V0ID0gdHJ1ZTtcblxuXHRcdFx0XHRcdFx0fSBjYXRjaCAoIF8gKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gV2lsbCBiZSBleGVjdXRlZCBvbmx5IGluIElFNlxuXHRcdFx0XHRcdFx0XHRvcHRpb24uc2Nyb2xsSGVpZ2h0O1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdG9wdGlvbi5zZWxlY3RlZCA9IGZhbHNlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEZvcmNlIGJyb3dzZXJzIHRvIGJlaGF2ZSBjb25zaXN0ZW50bHkgd2hlbiBub24tbWF0Y2hpbmcgdmFsdWUgaXMgc2V0XG5cdFx0XHRcdGlmICggIW9wdGlvblNldCApIHtcblx0XHRcdFx0XHRlbGVtLnNlbGVjdGVkSW5kZXggPSAtMTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBvcHRpb25zO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufSApO1xuXG4vLyBSYWRpb3MgYW5kIGNoZWNrYm94ZXMgZ2V0dGVyL3NldHRlclxualF1ZXJ5LmVhY2goIFsgXCJyYWRpb1wiLCBcImNoZWNrYm94XCIgXSwgZnVuY3Rpb24oKSB7XG5cdGpRdWVyeS52YWxIb29rc1sgdGhpcyBdID0ge1xuXHRcdHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkge1xuXHRcdFx0aWYgKCBqUXVlcnkuaXNBcnJheSggdmFsdWUgKSApIHtcblx0XHRcdFx0cmV0dXJuICggZWxlbS5jaGVja2VkID0galF1ZXJ5LmluQXJyYXkoIGpRdWVyeSggZWxlbSApLnZhbCgpLCB2YWx1ZSApID4gLTEgKTtcblx0XHRcdH1cblx0XHR9XG5cdH07XG5cdGlmICggIXN1cHBvcnQuY2hlY2tPbiApIHtcblx0XHRqUXVlcnkudmFsSG9va3NbIHRoaXMgXS5nZXQgPSBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZSggXCJ2YWx1ZVwiICkgPT09IG51bGwgPyBcIm9uXCIgOiBlbGVtLnZhbHVlO1xuXHRcdH07XG5cdH1cbn0gKTtcblxuXG5cblxudmFyIG5vZGVIb29rLCBib29sSG9vayxcblx0YXR0ckhhbmRsZSA9IGpRdWVyeS5leHByLmF0dHJIYW5kbGUsXG5cdHJ1c2VEZWZhdWx0ID0gL14oPzpjaGVja2VkfHNlbGVjdGVkKSQvaSxcblx0Z2V0U2V0QXR0cmlidXRlID0gc3VwcG9ydC5nZXRTZXRBdHRyaWJ1dGUsXG5cdGdldFNldElucHV0ID0gc3VwcG9ydC5pbnB1dDtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRhdHRyOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7XG5cdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgalF1ZXJ5LmF0dHIsIG5hbWUsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSApO1xuXHR9LFxuXG5cdHJlbW92ZUF0dHI6IGZ1bmN0aW9uKCBuYW1lICkge1xuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0alF1ZXJ5LnJlbW92ZUF0dHIoIHRoaXMsIG5hbWUgKTtcblx0XHR9ICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmV4dGVuZCgge1xuXHRhdHRyOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUgKSB7XG5cdFx0dmFyIHJldCwgaG9va3MsXG5cdFx0XHRuVHlwZSA9IGVsZW0ubm9kZVR5cGU7XG5cblx0XHQvLyBEb24ndCBnZXQvc2V0IGF0dHJpYnV0ZXMgb24gdGV4dCwgY29tbWVudCBhbmQgYXR0cmlidXRlIG5vZGVzXG5cdFx0aWYgKCBuVHlwZSA9PT0gMyB8fCBuVHlwZSA9PT0gOCB8fCBuVHlwZSA9PT0gMiApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBGYWxsYmFjayB0byBwcm9wIHdoZW4gYXR0cmlidXRlcyBhcmUgbm90IHN1cHBvcnRlZFxuXHRcdGlmICggdHlwZW9mIGVsZW0uZ2V0QXR0cmlidXRlID09PSBcInVuZGVmaW5lZFwiICkge1xuXHRcdFx0cmV0dXJuIGpRdWVyeS5wcm9wKCBlbGVtLCBuYW1lLCB2YWx1ZSApO1xuXHRcdH1cblxuXHRcdC8vIEFsbCBhdHRyaWJ1dGVzIGFyZSBsb3dlcmNhc2Vcblx0XHQvLyBHcmFiIG5lY2Vzc2FyeSBob29rIGlmIG9uZSBpcyBkZWZpbmVkXG5cdFx0aWYgKCBuVHlwZSAhPT0gMSB8fCAhalF1ZXJ5LmlzWE1MRG9jKCBlbGVtICkgKSB7XG5cdFx0XHRuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0aG9va3MgPSBqUXVlcnkuYXR0ckhvb2tzWyBuYW1lIF0gfHxcblx0XHRcdFx0KCBqUXVlcnkuZXhwci5tYXRjaC5ib29sLnRlc3QoIG5hbWUgKSA/IGJvb2xIb29rIDogbm9kZUhvb2sgKTtcblx0XHR9XG5cblx0XHRpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRpZiAoIHZhbHVlID09PSBudWxsICkge1xuXHRcdFx0XHRqUXVlcnkucmVtb3ZlQXR0ciggZWxlbSwgbmFtZSApO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGlmICggaG9va3MgJiYgXCJzZXRcIiBpbiBob29rcyAmJlxuXHRcdFx0XHQoIHJldCA9IGhvb2tzLnNldCggZWxlbSwgdmFsdWUsIG5hbWUgKSApICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdHJldHVybiByZXQ7XG5cdFx0XHR9XG5cblx0XHRcdGVsZW0uc2V0QXR0cmlidXRlKCBuYW1lLCB2YWx1ZSArIFwiXCIgKTtcblx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHR9XG5cblx0XHRpZiAoIGhvb2tzICYmIFwiZ2V0XCIgaW4gaG9va3MgJiYgKCByZXQgPSBob29rcy5nZXQoIGVsZW0sIG5hbWUgKSApICE9PSBudWxsICkge1xuXHRcdFx0cmV0dXJuIHJldDtcblx0XHR9XG5cblx0XHRyZXQgPSBqUXVlcnkuZmluZC5hdHRyKCBlbGVtLCBuYW1lICk7XG5cblx0XHQvLyBOb24tZXhpc3RlbnQgYXR0cmlidXRlcyByZXR1cm4gbnVsbCwgd2Ugbm9ybWFsaXplIHRvIHVuZGVmaW5lZFxuXHRcdHJldHVybiByZXQgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IHJldDtcblx0fSxcblxuXHRhdHRySG9va3M6IHtcblx0XHR0eXBlOiB7XG5cdFx0XHRzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHtcblx0XHRcdFx0aWYgKCAhc3VwcG9ydC5yYWRpb1ZhbHVlICYmIHZhbHVlID09PSBcInJhZGlvXCIgJiZcblx0XHRcdFx0XHRqUXVlcnkubm9kZU5hbWUoIGVsZW0sIFwiaW5wdXRcIiApICkge1xuXG5cdFx0XHRcdFx0Ly8gU2V0dGluZyB0aGUgdHlwZSBvbiBhIHJhZGlvIGJ1dHRvbiBhZnRlciB0aGUgdmFsdWUgcmVzZXRzIHRoZSB2YWx1ZSBpbiBJRTgtOVxuXHRcdFx0XHRcdC8vIFJlc2V0IHZhbHVlIHRvIGRlZmF1bHQgaW4gY2FzZSB0eXBlIGlzIHNldCBhZnRlciB2YWx1ZSBkdXJpbmcgY3JlYXRpb25cblx0XHRcdFx0XHR2YXIgdmFsID0gZWxlbS52YWx1ZTtcblx0XHRcdFx0XHRlbGVtLnNldEF0dHJpYnV0ZSggXCJ0eXBlXCIsIHZhbHVlICk7XG5cdFx0XHRcdFx0aWYgKCB2YWwgKSB7XG5cdFx0XHRcdFx0XHRlbGVtLnZhbHVlID0gdmFsO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0cmVtb3ZlQXR0cjogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkge1xuXHRcdHZhciBuYW1lLCBwcm9wTmFtZSxcblx0XHRcdGkgPSAwLFxuXHRcdFx0YXR0ck5hbWVzID0gdmFsdWUgJiYgdmFsdWUubWF0Y2goIHJub3R3aGl0ZSApO1xuXG5cdFx0aWYgKCBhdHRyTmFtZXMgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRcdHdoaWxlICggKCBuYW1lID0gYXR0ck5hbWVzWyBpKysgXSApICkge1xuXHRcdFx0XHRwcm9wTmFtZSA9IGpRdWVyeS5wcm9wRml4WyBuYW1lIF0gfHwgbmFtZTtcblxuXHRcdFx0XHQvLyBCb29sZWFuIGF0dHJpYnV0ZXMgZ2V0IHNwZWNpYWwgdHJlYXRtZW50ICgjMTA4NzApXG5cdFx0XHRcdGlmICggalF1ZXJ5LmV4cHIubWF0Y2guYm9vbC50ZXN0KCBuYW1lICkgKSB7XG5cblx0XHRcdFx0XHQvLyBTZXQgY29ycmVzcG9uZGluZyBwcm9wZXJ0eSB0byBmYWxzZVxuXHRcdFx0XHRcdGlmICggZ2V0U2V0SW5wdXQgJiYgZ2V0U2V0QXR0cmlidXRlIHx8ICFydXNlRGVmYXVsdC50ZXN0KCBuYW1lICkgKSB7XG5cdFx0XHRcdFx0XHRlbGVtWyBwcm9wTmFtZSBdID0gZmFsc2U7XG5cblx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRTw5XG5cdFx0XHRcdFx0Ly8gQWxzbyBjbGVhciBkZWZhdWx0Q2hlY2tlZC9kZWZhdWx0U2VsZWN0ZWQgKGlmIGFwcHJvcHJpYXRlKVxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRlbGVtWyBqUXVlcnkuY2FtZWxDYXNlKCBcImRlZmF1bHQtXCIgKyBuYW1lICkgXSA9XG5cdFx0XHRcdFx0XHRcdGVsZW1bIHByb3BOYW1lIF0gPSBmYWxzZTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gU2VlICM5Njk5IGZvciBleHBsYW5hdGlvbiBvZiB0aGlzIGFwcHJvYWNoIChzZXR0aW5nIGZpcnN0LCB0aGVuIHJlbW92YWwpXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0alF1ZXJ5LmF0dHIoIGVsZW0sIG5hbWUsIFwiXCIgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGVsZW0ucmVtb3ZlQXR0cmlidXRlKCBnZXRTZXRBdHRyaWJ1dGUgPyBuYW1lIDogcHJvcE5hbWUgKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn0gKTtcblxuLy8gSG9va3MgZm9yIGJvb2xlYW4gYXR0cmlidXRlc1xuYm9vbEhvb2sgPSB7XG5cdHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlLCBuYW1lICkge1xuXHRcdGlmICggdmFsdWUgPT09IGZhbHNlICkge1xuXG5cdFx0XHQvLyBSZW1vdmUgYm9vbGVhbiBhdHRyaWJ1dGVzIHdoZW4gc2V0IHRvIGZhbHNlXG5cdFx0XHRqUXVlcnkucmVtb3ZlQXR0ciggZWxlbSwgbmFtZSApO1xuXHRcdH0gZWxzZSBpZiAoIGdldFNldElucHV0ICYmIGdldFNldEF0dHJpYnV0ZSB8fCAhcnVzZURlZmF1bHQudGVzdCggbmFtZSApICkge1xuXG5cdFx0XHQvLyBJRTw4IG5lZWRzIHRoZSAqcHJvcGVydHkqIG5hbWVcblx0XHRcdGVsZW0uc2V0QXR0cmlidXRlKCAhZ2V0U2V0QXR0cmlidXRlICYmIGpRdWVyeS5wcm9wRml4WyBuYW1lIF0gfHwgbmFtZSwgbmFtZSApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gU3VwcG9ydDogSUU8OVxuXHRcdFx0Ly8gVXNlIGRlZmF1bHRDaGVja2VkIGFuZCBkZWZhdWx0U2VsZWN0ZWQgZm9yIG9sZElFXG5cdFx0XHRlbGVtWyBqUXVlcnkuY2FtZWxDYXNlKCBcImRlZmF1bHQtXCIgKyBuYW1lICkgXSA9IGVsZW1bIG5hbWUgXSA9IHRydWU7XG5cdFx0fVxuXHRcdHJldHVybiBuYW1lO1xuXHR9XG59O1xuXG5qUXVlcnkuZWFjaCggalF1ZXJ5LmV4cHIubWF0Y2guYm9vbC5zb3VyY2UubWF0Y2goIC9cXHcrL2cgKSwgZnVuY3Rpb24oIGksIG5hbWUgKSB7XG5cdHZhciBnZXR0ZXIgPSBhdHRySGFuZGxlWyBuYW1lIF0gfHwgalF1ZXJ5LmZpbmQuYXR0cjtcblxuXHRpZiAoIGdldFNldElucHV0ICYmIGdldFNldEF0dHJpYnV0ZSB8fCAhcnVzZURlZmF1bHQudGVzdCggbmFtZSApICkge1xuXHRcdGF0dHJIYW5kbGVbIG5hbWUgXSA9IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBpc1hNTCApIHtcblx0XHRcdHZhciByZXQsIGhhbmRsZTtcblx0XHRcdGlmICggIWlzWE1MICkge1xuXG5cdFx0XHRcdC8vIEF2b2lkIGFuIGluZmluaXRlIGxvb3AgYnkgdGVtcG9yYXJpbHkgcmVtb3ZpbmcgdGhpcyBmdW5jdGlvbiBmcm9tIHRoZSBnZXR0ZXJcblx0XHRcdFx0aGFuZGxlID0gYXR0ckhhbmRsZVsgbmFtZSBdO1xuXHRcdFx0XHRhdHRySGFuZGxlWyBuYW1lIF0gPSByZXQ7XG5cdFx0XHRcdHJldCA9IGdldHRlciggZWxlbSwgbmFtZSwgaXNYTUwgKSAhPSBudWxsID9cblx0XHRcdFx0XHRuYW1lLnRvTG93ZXJDYXNlKCkgOlxuXHRcdFx0XHRcdG51bGw7XG5cdFx0XHRcdGF0dHJIYW5kbGVbIG5hbWUgXSA9IGhhbmRsZTtcblx0XHRcdH1cblx0XHRcdHJldHVybiByZXQ7XG5cdFx0fTtcblx0fSBlbHNlIHtcblx0XHRhdHRySGFuZGxlWyBuYW1lIF0gPSBmdW5jdGlvbiggZWxlbSwgbmFtZSwgaXNYTUwgKSB7XG5cdFx0XHRpZiAoICFpc1hNTCApIHtcblx0XHRcdFx0cmV0dXJuIGVsZW1bIGpRdWVyeS5jYW1lbENhc2UoIFwiZGVmYXVsdC1cIiArIG5hbWUgKSBdID9cblx0XHRcdFx0XHRuYW1lLnRvTG93ZXJDYXNlKCkgOlxuXHRcdFx0XHRcdG51bGw7XG5cdFx0XHR9XG5cdFx0fTtcblx0fVxufSApO1xuXG4vLyBmaXggb2xkSUUgYXR0cm9wZXJ0aWVzXG5pZiAoICFnZXRTZXRJbnB1dCB8fCAhZ2V0U2V0QXR0cmlidXRlICkge1xuXHRqUXVlcnkuYXR0ckhvb2tzLnZhbHVlID0ge1xuXHRcdHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlLCBuYW1lICkge1xuXHRcdFx0aWYgKCBqUXVlcnkubm9kZU5hbWUoIGVsZW0sIFwiaW5wdXRcIiApICkge1xuXG5cdFx0XHRcdC8vIERvZXMgbm90IHJldHVybiBzbyB0aGF0IHNldEF0dHJpYnV0ZSBpcyBhbHNvIHVzZWRcblx0XHRcdFx0ZWxlbS5kZWZhdWx0VmFsdWUgPSB2YWx1ZTtcblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ly8gVXNlIG5vZGVIb29rIGlmIGRlZmluZWQgKCMxOTU0KTsgb3RoZXJ3aXNlIHNldEF0dHJpYnV0ZSBpcyBmaW5lXG5cdFx0XHRcdHJldHVybiBub2RlSG9vayAmJiBub2RlSG9vay5zZXQoIGVsZW0sIHZhbHVlLCBuYW1lICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xufVxuXG4vLyBJRTYvNyBkbyBub3Qgc3VwcG9ydCBnZXR0aW5nL3NldHRpbmcgc29tZSBhdHRyaWJ1dGVzIHdpdGggZ2V0L3NldEF0dHJpYnV0ZVxuaWYgKCAhZ2V0U2V0QXR0cmlidXRlICkge1xuXG5cdC8vIFVzZSB0aGlzIGZvciBhbnkgYXR0cmlidXRlIGluIElFNi83XG5cdC8vIFRoaXMgZml4ZXMgYWxtb3N0IGV2ZXJ5IElFNi83IGlzc3VlXG5cdG5vZGVIb29rID0ge1xuXHRcdHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlLCBuYW1lICkge1xuXG5cdFx0XHQvLyBTZXQgdGhlIGV4aXN0aW5nIG9yIGNyZWF0ZSBhIG5ldyBhdHRyaWJ1dGUgbm9kZVxuXHRcdFx0dmFyIHJldCA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZSggbmFtZSApO1xuXHRcdFx0aWYgKCAhcmV0ICkge1xuXHRcdFx0XHRlbGVtLnNldEF0dHJpYnV0ZU5vZGUoXG5cdFx0XHRcdFx0KCByZXQgPSBlbGVtLm93bmVyRG9jdW1lbnQuY3JlYXRlQXR0cmlidXRlKCBuYW1lICkgKVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXQudmFsdWUgPSB2YWx1ZSArPSBcIlwiO1xuXG5cdFx0XHQvLyBCcmVhayBhc3NvY2lhdGlvbiB3aXRoIGNsb25lZCBlbGVtZW50cyBieSBhbHNvIHVzaW5nIHNldEF0dHJpYnV0ZSAoIzk2NDYpXG5cdFx0XHRpZiAoIG5hbWUgPT09IFwidmFsdWVcIiB8fCB2YWx1ZSA9PT0gZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUgKSApIHtcblx0XHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcblxuXHQvLyBTb21lIGF0dHJpYnV0ZXMgYXJlIGNvbnN0cnVjdGVkIHdpdGggZW1wdHktc3RyaW5nIHZhbHVlcyB3aGVuIG5vdCBkZWZpbmVkXG5cdGF0dHJIYW5kbGUuaWQgPSBhdHRySGFuZGxlLm5hbWUgPSBhdHRySGFuZGxlLmNvb3JkcyA9XG5cdFx0ZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1MICkge1xuXHRcdFx0dmFyIHJldDtcblx0XHRcdGlmICggIWlzWE1MICkge1xuXHRcdFx0XHRyZXR1cm4gKCByZXQgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoIG5hbWUgKSApICYmIHJldC52YWx1ZSAhPT0gXCJcIiA/XG5cdFx0XHRcdFx0cmV0LnZhbHVlIDpcblx0XHRcdFx0XHRudWxsO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0Ly8gRml4aW5nIHZhbHVlIHJldHJpZXZhbCBvbiBhIGJ1dHRvbiByZXF1aXJlcyB0aGlzIG1vZHVsZVxuXHRqUXVlcnkudmFsSG9va3MuYnV0dG9uID0ge1xuXHRcdGdldDogZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7XG5cdFx0XHR2YXIgcmV0ID0gZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCBuYW1lICk7XG5cdFx0XHRpZiAoIHJldCAmJiByZXQuc3BlY2lmaWVkICkge1xuXHRcdFx0XHRyZXR1cm4gcmV0LnZhbHVlO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0c2V0OiBub2RlSG9vay5zZXRcblx0fTtcblxuXHQvLyBTZXQgY29udGVudGVkaXRhYmxlIHRvIGZhbHNlIG9uIHJlbW92YWxzKCMxMDQyOSlcblx0Ly8gU2V0dGluZyB0byBlbXB0eSBzdHJpbmcgdGhyb3dzIGFuIGVycm9yIGFzIGFuIGludmFsaWQgdmFsdWVcblx0alF1ZXJ5LmF0dHJIb29rcy5jb250ZW50ZWRpdGFibGUgPSB7XG5cdFx0c2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUsIG5hbWUgKSB7XG5cdFx0XHRub2RlSG9vay5zZXQoIGVsZW0sIHZhbHVlID09PSBcIlwiID8gZmFsc2UgOiB2YWx1ZSwgbmFtZSApO1xuXHRcdH1cblx0fTtcblxuXHQvLyBTZXQgd2lkdGggYW5kIGhlaWdodCB0byBhdXRvIGluc3RlYWQgb2YgMCBvbiBlbXB0eSBzdHJpbmcoIEJ1ZyAjODE1MCApXG5cdC8vIFRoaXMgaXMgZm9yIHJlbW92YWxzXG5cdGpRdWVyeS5lYWNoKCBbIFwid2lkdGhcIiwgXCJoZWlnaHRcIiBdLCBmdW5jdGlvbiggaSwgbmFtZSApIHtcblx0XHRqUXVlcnkuYXR0ckhvb2tzWyBuYW1lIF0gPSB7XG5cdFx0XHRzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHtcblx0XHRcdFx0aWYgKCB2YWx1ZSA9PT0gXCJcIiApIHtcblx0XHRcdFx0XHRlbGVtLnNldEF0dHJpYnV0ZSggbmFtZSwgXCJhdXRvXCIgKTtcblx0XHRcdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXHR9ICk7XG59XG5cbmlmICggIXN1cHBvcnQuc3R5bGUgKSB7XG5cdGpRdWVyeS5hdHRySG9va3Muc3R5bGUgPSB7XG5cdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSApIHtcblxuXHRcdFx0Ly8gUmV0dXJuIHVuZGVmaW5lZCBpbiB0aGUgY2FzZSBvZiBlbXB0eSBzdHJpbmdcblx0XHRcdC8vIE5vdGU6IElFIHVwcGVyY2FzZXMgY3NzIHByb3BlcnR5IG5hbWVzLCBidXQgaWYgd2Ugd2VyZSB0byAudG9Mb3dlckNhc2UoKVxuXHRcdFx0Ly8gLmNzc1RleHQsIHRoYXQgd291bGQgZGVzdHJveSBjYXNlIHNlbnNpdGl2aXR5IGluIFVSTCdzLCBsaWtlIGluIFwiYmFja2dyb3VuZFwiXG5cdFx0XHRyZXR1cm4gZWxlbS5zdHlsZS5jc3NUZXh0IHx8IHVuZGVmaW5lZDtcblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkge1xuXHRcdFx0cmV0dXJuICggZWxlbS5zdHlsZS5jc3NUZXh0ID0gdmFsdWUgKyBcIlwiICk7XG5cdFx0fVxuXHR9O1xufVxuXG5cblxuXG52YXIgcmZvY3VzYWJsZSA9IC9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbnxvYmplY3QpJC9pLFxuXHRyY2xpY2thYmxlID0gL14oPzphfGFyZWEpJC9pO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdHByb3A6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBqUXVlcnkucHJvcCwgbmFtZSwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxICk7XG5cdH0sXG5cblx0cmVtb3ZlUHJvcDogZnVuY3Rpb24oIG5hbWUgKSB7XG5cdFx0bmFtZSA9IGpRdWVyeS5wcm9wRml4WyBuYW1lIF0gfHwgbmFtZTtcblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblxuXHRcdFx0Ly8gdHJ5L2NhdGNoIGhhbmRsZXMgY2FzZXMgd2hlcmUgSUUgYmFsa3MgKHN1Y2ggYXMgcmVtb3ZpbmcgYSBwcm9wZXJ0eSBvbiB3aW5kb3cpXG5cdFx0XHR0cnkge1xuXHRcdFx0XHR0aGlzWyBuYW1lIF0gPSB1bmRlZmluZWQ7XG5cdFx0XHRcdGRlbGV0ZSB0aGlzWyBuYW1lIF07XG5cdFx0XHR9IGNhdGNoICggZSApIHt9XG5cdFx0fSApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5leHRlbmQoIHtcblx0cHJvcDogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlICkge1xuXHRcdHZhciByZXQsIGhvb2tzLFxuXHRcdFx0blR5cGUgPSBlbGVtLm5vZGVUeXBlO1xuXG5cdFx0Ly8gRG9uJ3QgZ2V0L3NldCBwcm9wZXJ0aWVzIG9uIHRleHQsIGNvbW1lbnQgYW5kIGF0dHJpYnV0ZSBub2Rlc1xuXHRcdGlmICggblR5cGUgPT09IDMgfHwgblR5cGUgPT09IDggfHwgblR5cGUgPT09IDIgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKCBuVHlwZSAhPT0gMSB8fCAhalF1ZXJ5LmlzWE1MRG9jKCBlbGVtICkgKSB7XG5cblx0XHRcdC8vIEZpeCBuYW1lIGFuZCBhdHRhY2ggaG9va3Ncblx0XHRcdG5hbWUgPSBqUXVlcnkucHJvcEZpeFsgbmFtZSBdIHx8IG5hbWU7XG5cdFx0XHRob29rcyA9IGpRdWVyeS5wcm9wSG9va3NbIG5hbWUgXTtcblx0XHR9XG5cblx0XHRpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRpZiAoIGhvb2tzICYmIFwic2V0XCIgaW4gaG9va3MgJiZcblx0XHRcdFx0KCByZXQgPSBob29rcy5zZXQoIGVsZW0sIHZhbHVlLCBuYW1lICkgKSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gKCBlbGVtWyBuYW1lIF0gPSB2YWx1ZSApO1xuXHRcdH1cblxuXHRcdGlmICggaG9va3MgJiYgXCJnZXRcIiBpbiBob29rcyAmJiAoIHJldCA9IGhvb2tzLmdldCggZWxlbSwgbmFtZSApICkgIT09IG51bGwgKSB7XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH1cblxuXHRcdHJldHVybiBlbGVtWyBuYW1lIF07XG5cdH0sXG5cblx0cHJvcEhvb2tzOiB7XG5cdFx0dGFiSW5kZXg6IHtcblx0XHRcdGdldDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHRcdFx0Ly8gZWxlbS50YWJJbmRleCBkb2Vzbid0IGFsd2F5cyByZXR1cm4gdGhlXG5cdFx0XHRcdC8vIGNvcnJlY3QgdmFsdWUgd2hlbiBpdCBoYXNuJ3QgYmVlbiBleHBsaWNpdGx5IHNldFxuXHRcdFx0XHQvLyBodHRwOi8vZmx1aWRwcm9qZWN0Lm9yZy9ibG9nLzIwMDgvMDEvMDkvZ2V0dGluZy1zZXR0aW5nLWFuZC1yZW1vdmluZy10YWJpbmRleC12YWx1ZXMtd2l0aC1qYXZhc2NyaXB0L1xuXHRcdFx0XHQvLyBVc2UgcHJvcGVyIGF0dHJpYnV0ZSByZXRyaWV2YWwoIzEyMDcyKVxuXHRcdFx0XHR2YXIgdGFiaW5kZXggPSBqUXVlcnkuZmluZC5hdHRyKCBlbGVtLCBcInRhYmluZGV4XCIgKTtcblxuXHRcdFx0XHRyZXR1cm4gdGFiaW5kZXggP1xuXHRcdFx0XHRcdHBhcnNlSW50KCB0YWJpbmRleCwgMTAgKSA6XG5cdFx0XHRcdFx0cmZvY3VzYWJsZS50ZXN0KCBlbGVtLm5vZGVOYW1lICkgfHxcblx0XHRcdFx0XHRcdHJjbGlja2FibGUudGVzdCggZWxlbS5ub2RlTmFtZSApICYmIGVsZW0uaHJlZiA/XG5cdFx0XHRcdFx0XHRcdDAgOlxuXHRcdFx0XHRcdFx0XHQtMTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0cHJvcEZpeDoge1xuXHRcdFwiZm9yXCI6IFwiaHRtbEZvclwiLFxuXHRcdFwiY2xhc3NcIjogXCJjbGFzc05hbWVcIlxuXHR9XG59ICk7XG5cbi8vIFNvbWUgYXR0cmlidXRlcyByZXF1aXJlIGEgc3BlY2lhbCBjYWxsIG9uIElFXG4vLyBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXM1MzY0MjklMjhWUy44NSUyOS5hc3B4XG5pZiAoICFzdXBwb3J0LmhyZWZOb3JtYWxpemVkICkge1xuXG5cdC8vIGhyZWYvc3JjIHByb3BlcnR5IHNob3VsZCBnZXQgdGhlIGZ1bGwgbm9ybWFsaXplZCBVUkwgKCMxMDI5OS8jMTI5MTUpXG5cdGpRdWVyeS5lYWNoKCBbIFwiaHJlZlwiLCBcInNyY1wiIF0sIGZ1bmN0aW9uKCBpLCBuYW1lICkge1xuXHRcdGpRdWVyeS5wcm9wSG9va3NbIG5hbWUgXSA9IHtcblx0XHRcdGdldDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSwgNCApO1xuXHRcdFx0fVxuXHRcdH07XG5cdH0gKTtcbn1cblxuLy8gU3VwcG9ydDogU2FmYXJpLCBJRTkrXG4vLyBBY2Nlc3NpbmcgdGhlIHNlbGVjdGVkSW5kZXggcHJvcGVydHlcbi8vIGZvcmNlcyB0aGUgYnJvd3NlciB0byByZXNwZWN0IHNldHRpbmcgc2VsZWN0ZWRcbi8vIG9uIHRoZSBvcHRpb25cbi8vIFRoZSBnZXR0ZXIgZW5zdXJlcyBhIGRlZmF1bHQgb3B0aW9uIGlzIHNlbGVjdGVkXG4vLyB3aGVuIGluIGFuIG9wdGdyb3VwXG5pZiAoICFzdXBwb3J0Lm9wdFNlbGVjdGVkICkge1xuXHRqUXVlcnkucHJvcEhvb2tzLnNlbGVjdGVkID0ge1xuXHRcdGdldDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHR2YXIgcGFyZW50ID0gZWxlbS5wYXJlbnROb2RlO1xuXG5cdFx0XHRpZiAoIHBhcmVudCApIHtcblx0XHRcdFx0cGFyZW50LnNlbGVjdGVkSW5kZXg7XG5cblx0XHRcdFx0Ly8gTWFrZSBzdXJlIHRoYXQgaXQgYWxzbyB3b3JrcyB3aXRoIG9wdGdyb3Vwcywgc2VlICM1NzAxXG5cdFx0XHRcdGlmICggcGFyZW50LnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdFx0cGFyZW50LnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0dmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTtcblx0XHRcdGlmICggcGFyZW50ICkge1xuXHRcdFx0XHRwYXJlbnQuc2VsZWN0ZWRJbmRleDtcblxuXHRcdFx0XHRpZiAoIHBhcmVudC5wYXJlbnROb2RlICkge1xuXHRcdFx0XHRcdHBhcmVudC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH07XG59XG5cbmpRdWVyeS5lYWNoKCBbXG5cdFwidGFiSW5kZXhcIixcblx0XCJyZWFkT25seVwiLFxuXHRcIm1heExlbmd0aFwiLFxuXHRcImNlbGxTcGFjaW5nXCIsXG5cdFwiY2VsbFBhZGRpbmdcIixcblx0XCJyb3dTcGFuXCIsXG5cdFwiY29sU3BhblwiLFxuXHRcInVzZU1hcFwiLFxuXHRcImZyYW1lQm9yZGVyXCIsXG5cdFwiY29udGVudEVkaXRhYmxlXCJcbl0sIGZ1bmN0aW9uKCkge1xuXHRqUXVlcnkucHJvcEZpeFsgdGhpcy50b0xvd2VyQ2FzZSgpIF0gPSB0aGlzO1xufSApO1xuXG4vLyBJRTYvNyBjYWxsIGVuY3R5cGUgZW5jb2RpbmdcbmlmICggIXN1cHBvcnQuZW5jdHlwZSApIHtcblx0alF1ZXJ5LnByb3BGaXguZW5jdHlwZSA9IFwiZW5jb2RpbmdcIjtcbn1cblxuXG5cblxudmFyIHJjbGFzcyA9IC9bXFx0XFxyXFxuXFxmXS9nO1xuXG5mdW5jdGlvbiBnZXRDbGFzcyggZWxlbSApIHtcblx0cmV0dXJuIGpRdWVyeS5hdHRyKCBlbGVtLCBcImNsYXNzXCIgKSB8fCBcIlwiO1xufVxuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdGFkZENsYXNzOiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0dmFyIGNsYXNzZXMsIGVsZW0sIGN1ciwgY3VyVmFsdWUsIGNsYXp6LCBqLCBmaW5hbFZhbHVlLFxuXHRcdFx0aSA9IDA7XG5cblx0XHRpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApICkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oIGogKSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLmFkZENsYXNzKCB2YWx1ZS5jYWxsKCB0aGlzLCBqLCBnZXRDbGFzcyggdGhpcyApICkgKTtcblx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHRpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiB2YWx1ZSApIHtcblx0XHRcdGNsYXNzZXMgPSB2YWx1ZS5tYXRjaCggcm5vdHdoaXRlICkgfHwgW107XG5cblx0XHRcdHdoaWxlICggKCBlbGVtID0gdGhpc1sgaSsrIF0gKSApIHtcblx0XHRcdFx0Y3VyVmFsdWUgPSBnZXRDbGFzcyggZWxlbSApO1xuXHRcdFx0XHRjdXIgPSBlbGVtLm5vZGVUeXBlID09PSAxICYmXG5cdFx0XHRcdFx0KCBcIiBcIiArIGN1clZhbHVlICsgXCIgXCIgKS5yZXBsYWNlKCByY2xhc3MsIFwiIFwiICk7XG5cblx0XHRcdFx0aWYgKCBjdXIgKSB7XG5cdFx0XHRcdFx0aiA9IDA7XG5cdFx0XHRcdFx0d2hpbGUgKCAoIGNsYXp6ID0gY2xhc3Nlc1sgaisrIF0gKSApIHtcblx0XHRcdFx0XHRcdGlmICggY3VyLmluZGV4T2YoIFwiIFwiICsgY2xhenogKyBcIiBcIiApIDwgMCApIHtcblx0XHRcdFx0XHRcdFx0Y3VyICs9IGNsYXp6ICsgXCIgXCI7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gb25seSBhc3NpZ24gaWYgZGlmZmVyZW50IHRvIGF2b2lkIHVubmVlZGVkIHJlbmRlcmluZy5cblx0XHRcdFx0XHRmaW5hbFZhbHVlID0galF1ZXJ5LnRyaW0oIGN1ciApO1xuXHRcdFx0XHRcdGlmICggY3VyVmFsdWUgIT09IGZpbmFsVmFsdWUgKSB7XG5cdFx0XHRcdFx0XHRqUXVlcnkuYXR0ciggZWxlbSwgXCJjbGFzc1wiLCBmaW5hbFZhbHVlICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0cmVtb3ZlQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHR2YXIgY2xhc3NlcywgZWxlbSwgY3VyLCBjdXJWYWx1ZSwgY2xhenosIGosIGZpbmFsVmFsdWUsXG5cdFx0XHRpID0gMDtcblxuXHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaiApIHtcblx0XHRcdFx0alF1ZXJ5KCB0aGlzICkucmVtb3ZlQ2xhc3MoIHZhbHVlLmNhbGwoIHRoaXMsIGosIGdldENsYXNzKCB0aGlzICkgKSApO1xuXHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdGlmICggIWFyZ3VtZW50cy5sZW5ndGggKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5hdHRyKCBcImNsYXNzXCIsIFwiXCIgKTtcblx0XHR9XG5cblx0XHRpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiB2YWx1ZSApIHtcblx0XHRcdGNsYXNzZXMgPSB2YWx1ZS5tYXRjaCggcm5vdHdoaXRlICkgfHwgW107XG5cblx0XHRcdHdoaWxlICggKCBlbGVtID0gdGhpc1sgaSsrIF0gKSApIHtcblx0XHRcdFx0Y3VyVmFsdWUgPSBnZXRDbGFzcyggZWxlbSApO1xuXG5cdFx0XHRcdC8vIFRoaXMgZXhwcmVzc2lvbiBpcyBoZXJlIGZvciBiZXR0ZXIgY29tcHJlc3NpYmlsaXR5IChzZWUgYWRkQ2xhc3MpXG5cdFx0XHRcdGN1ciA9IGVsZW0ubm9kZVR5cGUgPT09IDEgJiZcblx0XHRcdFx0XHQoIFwiIFwiICsgY3VyVmFsdWUgKyBcIiBcIiApLnJlcGxhY2UoIHJjbGFzcywgXCIgXCIgKTtcblxuXHRcdFx0XHRpZiAoIGN1ciApIHtcblx0XHRcdFx0XHRqID0gMDtcblx0XHRcdFx0XHR3aGlsZSAoICggY2xhenogPSBjbGFzc2VzWyBqKysgXSApICkge1xuXG5cdFx0XHRcdFx0XHQvLyBSZW1vdmUgKmFsbCogaW5zdGFuY2VzXG5cdFx0XHRcdFx0XHR3aGlsZSAoIGN1ci5pbmRleE9mKCBcIiBcIiArIGNsYXp6ICsgXCIgXCIgKSA+IC0xICkge1xuXHRcdFx0XHRcdFx0XHRjdXIgPSBjdXIucmVwbGFjZSggXCIgXCIgKyBjbGF6eiArIFwiIFwiLCBcIiBcIiApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIE9ubHkgYXNzaWduIGlmIGRpZmZlcmVudCB0byBhdm9pZCB1bm5lZWRlZCByZW5kZXJpbmcuXG5cdFx0XHRcdFx0ZmluYWxWYWx1ZSA9IGpRdWVyeS50cmltKCBjdXIgKTtcblx0XHRcdFx0XHRpZiAoIGN1clZhbHVlICE9PSBmaW5hbFZhbHVlICkge1xuXHRcdFx0XHRcdFx0alF1ZXJ5LmF0dHIoIGVsZW0sIFwiY2xhc3NcIiwgZmluYWxWYWx1ZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdHRvZ2dsZUNsYXNzOiBmdW5jdGlvbiggdmFsdWUsIHN0YXRlVmFsICkge1xuXHRcdHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuXG5cdFx0aWYgKCB0eXBlb2Ygc3RhdGVWYWwgPT09IFwiYm9vbGVhblwiICYmIHR5cGUgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRyZXR1cm4gc3RhdGVWYWwgPyB0aGlzLmFkZENsYXNzKCB2YWx1ZSApIDogdGhpcy5yZW1vdmVDbGFzcyggdmFsdWUgKTtcblx0XHR9XG5cblx0XHRpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApICkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oIGkgKSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLnRvZ2dsZUNsYXNzKFxuXHRcdFx0XHRcdHZhbHVlLmNhbGwoIHRoaXMsIGksIGdldENsYXNzKCB0aGlzICksIHN0YXRlVmFsICksXG5cdFx0XHRcdFx0c3RhdGVWYWxcblx0XHRcdFx0KTtcblx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBjbGFzc05hbWUsIGksIHNlbGYsIGNsYXNzTmFtZXM7XG5cblx0XHRcdGlmICggdHlwZSA9PT0gXCJzdHJpbmdcIiApIHtcblxuXHRcdFx0XHQvLyBUb2dnbGUgaW5kaXZpZHVhbCBjbGFzcyBuYW1lc1xuXHRcdFx0XHRpID0gMDtcblx0XHRcdFx0c2VsZiA9IGpRdWVyeSggdGhpcyApO1xuXHRcdFx0XHRjbGFzc05hbWVzID0gdmFsdWUubWF0Y2goIHJub3R3aGl0ZSApIHx8IFtdO1xuXG5cdFx0XHRcdHdoaWxlICggKCBjbGFzc05hbWUgPSBjbGFzc05hbWVzWyBpKysgXSApICkge1xuXG5cdFx0XHRcdFx0Ly8gQ2hlY2sgZWFjaCBjbGFzc05hbWUgZ2l2ZW4sIHNwYWNlIHNlcGFyYXRlZCBsaXN0XG5cdFx0XHRcdFx0aWYgKCBzZWxmLmhhc0NsYXNzKCBjbGFzc05hbWUgKSApIHtcblx0XHRcdFx0XHRcdHNlbGYucmVtb3ZlQ2xhc3MoIGNsYXNzTmFtZSApO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRzZWxmLmFkZENsYXNzKCBjbGFzc05hbWUgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0Ly8gVG9nZ2xlIHdob2xlIGNsYXNzIG5hbWVcblx0XHRcdH0gZWxzZSBpZiAoIHZhbHVlID09PSB1bmRlZmluZWQgfHwgdHlwZSA9PT0gXCJib29sZWFuXCIgKSB7XG5cdFx0XHRcdGNsYXNzTmFtZSA9IGdldENsYXNzKCB0aGlzICk7XG5cdFx0XHRcdGlmICggY2xhc3NOYW1lICkge1xuXG5cdFx0XHRcdFx0Ly8gc3RvcmUgY2xhc3NOYW1lIGlmIHNldFxuXHRcdFx0XHRcdGpRdWVyeS5fZGF0YSggdGhpcywgXCJfX2NsYXNzTmFtZV9fXCIsIGNsYXNzTmFtZSApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gSWYgdGhlIGVsZW1lbnQgaGFzIGEgY2xhc3MgbmFtZSBvciBpZiB3ZSdyZSBwYXNzZWQgXCJmYWxzZVwiLFxuXHRcdFx0XHQvLyB0aGVuIHJlbW92ZSB0aGUgd2hvbGUgY2xhc3NuYW1lIChpZiB0aGVyZSB3YXMgb25lLCB0aGUgYWJvdmUgc2F2ZWQgaXQpLlxuXHRcdFx0XHQvLyBPdGhlcndpc2UgYnJpbmcgYmFjayB3aGF0ZXZlciB3YXMgcHJldmlvdXNseSBzYXZlZCAoaWYgYW55dGhpbmcpLFxuXHRcdFx0XHQvLyBmYWxsaW5nIGJhY2sgdG8gdGhlIGVtcHR5IHN0cmluZyBpZiBub3RoaW5nIHdhcyBzdG9yZWQuXG5cdFx0XHRcdGpRdWVyeS5hdHRyKCB0aGlzLCBcImNsYXNzXCIsXG5cdFx0XHRcdFx0Y2xhc3NOYW1lIHx8IHZhbHVlID09PSBmYWxzZSA/XG5cdFx0XHRcdFx0XCJcIiA6XG5cdFx0XHRcdFx0alF1ZXJ5Ll9kYXRhKCB0aGlzLCBcIl9fY2xhc3NOYW1lX19cIiApIHx8IFwiXCJcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0aGFzQ2xhc3M6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHR2YXIgY2xhc3NOYW1lLCBlbGVtLFxuXHRcdFx0aSA9IDA7XG5cblx0XHRjbGFzc05hbWUgPSBcIiBcIiArIHNlbGVjdG9yICsgXCIgXCI7XG5cdFx0d2hpbGUgKCAoIGVsZW0gPSB0aGlzWyBpKysgXSApICkge1xuXHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICYmXG5cdFx0XHRcdCggXCIgXCIgKyBnZXRDbGFzcyggZWxlbSApICsgXCIgXCIgKS5yZXBsYWNlKCByY2xhc3MsIFwiIFwiIClcblx0XHRcdFx0XHQuaW5kZXhPZiggY2xhc3NOYW1lICkgPiAtMVxuXHRcdFx0KSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufSApO1xuXG5cblxuXG4vLyBSZXR1cm4galF1ZXJ5IGZvciBhdHRyaWJ1dGVzLW9ubHkgaW5jbHVzaW9uXG5cblxualF1ZXJ5LmVhY2goICggXCJibHVyIGZvY3VzIGZvY3VzaW4gZm9jdXNvdXQgbG9hZCByZXNpemUgc2Nyb2xsIHVubG9hZCBjbGljayBkYmxjbGljayBcIiArXG5cdFwibW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgXCIgK1xuXHRcImNoYW5nZSBzZWxlY3Qgc3VibWl0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgZXJyb3IgY29udGV4dG1lbnVcIiApLnNwbGl0KCBcIiBcIiApLFxuXHRmdW5jdGlvbiggaSwgbmFtZSApIHtcblxuXHQvLyBIYW5kbGUgZXZlbnQgYmluZGluZ1xuXHRqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBkYXRhLCBmbiApIHtcblx0XHRyZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA+IDAgP1xuXHRcdFx0dGhpcy5vbiggbmFtZSwgbnVsbCwgZGF0YSwgZm4gKSA6XG5cdFx0XHR0aGlzLnRyaWdnZXIoIG5hbWUgKTtcblx0fTtcbn0gKTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRob3ZlcjogZnVuY3Rpb24oIGZuT3ZlciwgZm5PdXQgKSB7XG5cdFx0cmV0dXJuIHRoaXMubW91c2VlbnRlciggZm5PdmVyICkubW91c2VsZWF2ZSggZm5PdXQgfHwgZm5PdmVyICk7XG5cdH1cbn0gKTtcblxuXG52YXIgbG9jYXRpb24gPSB3aW5kb3cubG9jYXRpb247XG5cbnZhciBub25jZSA9IGpRdWVyeS5ub3coKTtcblxudmFyIHJxdWVyeSA9ICggL1xcPy8gKTtcblxuXG5cbnZhciBydmFsaWR0b2tlbnMgPSAvKCwpfChcXFt8eyl8KH18XSl8XCIoPzpbXlwiXFxcXFxcclxcbl18XFxcXFtcIlxcXFxcXC9iZm5ydF18XFxcXHVbXFxkYS1mQS1GXXs0fSkqXCJcXHMqOj98dHJ1ZXxmYWxzZXxudWxsfC0/KD8hMFxcZClcXGQrKD86XFwuXFxkK3wpKD86W2VFXVsrLV0/XFxkK3wpL2c7XG5cbmpRdWVyeS5wYXJzZUpTT04gPSBmdW5jdGlvbiggZGF0YSApIHtcblxuXHQvLyBBdHRlbXB0IHRvIHBhcnNlIHVzaW5nIHRoZSBuYXRpdmUgSlNPTiBwYXJzZXIgZmlyc3Rcblx0aWYgKCB3aW5kb3cuSlNPTiAmJiB3aW5kb3cuSlNPTi5wYXJzZSApIHtcblxuXHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgMi4zXG5cdFx0Ly8gV29ya2Fyb3VuZCBmYWlsdXJlIHRvIHN0cmluZy1jYXN0IG51bGwgaW5wdXRcblx0XHRyZXR1cm4gd2luZG93LkpTT04ucGFyc2UoIGRhdGEgKyBcIlwiICk7XG5cdH1cblxuXHR2YXIgcmVxdWlyZU5vbkNvbW1hLFxuXHRcdGRlcHRoID0gbnVsbCxcblx0XHRzdHIgPSBqUXVlcnkudHJpbSggZGF0YSArIFwiXCIgKTtcblxuXHQvLyBHdWFyZCBhZ2FpbnN0IGludmFsaWQgKGFuZCBwb3NzaWJseSBkYW5nZXJvdXMpIGlucHV0IGJ5IGVuc3VyaW5nIHRoYXQgbm90aGluZyByZW1haW5zXG5cdC8vIGFmdGVyIHJlbW92aW5nIHZhbGlkIHRva2Vuc1xuXHRyZXR1cm4gc3RyICYmICFqUXVlcnkudHJpbSggc3RyLnJlcGxhY2UoIHJ2YWxpZHRva2VucywgZnVuY3Rpb24oIHRva2VuLCBjb21tYSwgb3BlbiwgY2xvc2UgKSB7XG5cblx0XHQvLyBGb3JjZSB0ZXJtaW5hdGlvbiBpZiB3ZSBzZWUgYSBtaXNwbGFjZWQgY29tbWFcblx0XHRpZiAoIHJlcXVpcmVOb25Db21tYSAmJiBjb21tYSApIHtcblx0XHRcdGRlcHRoID0gMDtcblx0XHR9XG5cblx0XHQvLyBQZXJmb3JtIG5vIG1vcmUgcmVwbGFjZW1lbnRzIGFmdGVyIHJldHVybmluZyB0byBvdXRlcm1vc3QgZGVwdGhcblx0XHRpZiAoIGRlcHRoID09PSAwICkge1xuXHRcdFx0cmV0dXJuIHRva2VuO1xuXHRcdH1cblxuXHRcdC8vIENvbW1hcyBtdXN0IG5vdCBmb2xsb3cgXCJbXCIsIFwie1wiLCBvciBcIixcIlxuXHRcdHJlcXVpcmVOb25Db21tYSA9IG9wZW4gfHwgY29tbWE7XG5cblx0XHQvLyBEZXRlcm1pbmUgbmV3IGRlcHRoXG5cdFx0Ly8gYXJyYXkvb2JqZWN0IG9wZW4gKFwiW1wiIG9yIFwie1wiKTogZGVwdGggKz0gdHJ1ZSAtIGZhbHNlIChpbmNyZW1lbnQpXG5cdFx0Ly8gYXJyYXkvb2JqZWN0IGNsb3NlIChcIl1cIiBvciBcIn1cIik6IGRlcHRoICs9IGZhbHNlIC0gdHJ1ZSAoZGVjcmVtZW50KVxuXHRcdC8vIG90aGVyIGNhc2VzIChcIixcIiBvciBwcmltaXRpdmUpOiBkZXB0aCArPSB0cnVlIC0gdHJ1ZSAobnVtZXJpYyBjYXN0KVxuXHRcdGRlcHRoICs9ICFjbG9zZSAtICFvcGVuO1xuXG5cdFx0Ly8gUmVtb3ZlIHRoaXMgdG9rZW5cblx0XHRyZXR1cm4gXCJcIjtcblx0fSApICkgP1xuXHRcdCggRnVuY3Rpb24oIFwicmV0dXJuIFwiICsgc3RyICkgKSgpIDpcblx0XHRqUXVlcnkuZXJyb3IoIFwiSW52YWxpZCBKU09OOiBcIiArIGRhdGEgKTtcbn07XG5cblxuLy8gQ3Jvc3MtYnJvd3NlciB4bWwgcGFyc2luZ1xualF1ZXJ5LnBhcnNlWE1MID0gZnVuY3Rpb24oIGRhdGEgKSB7XG5cdHZhciB4bWwsIHRtcDtcblx0aWYgKCAhZGF0YSB8fCB0eXBlb2YgZGF0YSAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXHR0cnkge1xuXHRcdGlmICggd2luZG93LkRPTVBhcnNlciApIHsgLy8gU3RhbmRhcmRcblx0XHRcdHRtcCA9IG5ldyB3aW5kb3cuRE9NUGFyc2VyKCk7XG5cdFx0XHR4bWwgPSB0bXAucGFyc2VGcm9tU3RyaW5nKCBkYXRhLCBcInRleHQveG1sXCIgKTtcblx0XHR9IGVsc2UgeyAvLyBJRVxuXHRcdFx0eG1sID0gbmV3IHdpbmRvdy5BY3RpdmVYT2JqZWN0KCBcIk1pY3Jvc29mdC5YTUxET01cIiApO1xuXHRcdFx0eG1sLmFzeW5jID0gXCJmYWxzZVwiO1xuXHRcdFx0eG1sLmxvYWRYTUwoIGRhdGEgKTtcblx0XHR9XG5cdH0gY2F0Y2ggKCBlICkge1xuXHRcdHhtbCA9IHVuZGVmaW5lZDtcblx0fVxuXHRpZiAoICF4bWwgfHwgIXhtbC5kb2N1bWVudEVsZW1lbnQgfHwgeG1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCBcInBhcnNlcmVycm9yXCIgKS5sZW5ndGggKSB7XG5cdFx0alF1ZXJ5LmVycm9yKCBcIkludmFsaWQgWE1MOiBcIiArIGRhdGEgKTtcblx0fVxuXHRyZXR1cm4geG1sO1xufTtcblxuXG52YXJcblx0cmhhc2ggPSAvIy4qJC8sXG5cdHJ0cyA9IC8oWz8mXSlfPVteJl0qLyxcblxuXHQvLyBJRSBsZWF2ZXMgYW4gXFxyIGNoYXJhY3RlciBhdCBFT0xcblx0cmhlYWRlcnMgPSAvXiguKj8pOlsgXFx0XSooW15cXHJcXG5dKilcXHI/JC9tZyxcblxuXHQvLyAjNzY1MywgIzgxMjUsICM4MTUyOiBsb2NhbCBwcm90b2NvbCBkZXRlY3Rpb25cblx0cmxvY2FsUHJvdG9jb2wgPSAvXig/OmFib3V0fGFwcHxhcHAtc3RvcmFnZXwuKy1leHRlbnNpb258ZmlsZXxyZXN8d2lkZ2V0KTokLyxcblx0cm5vQ29udGVudCA9IC9eKD86R0VUfEhFQUQpJC8sXG5cdHJwcm90b2NvbCA9IC9eXFwvXFwvLyxcblx0cnVybCA9IC9eKFtcXHcuKy1dKzopKD86XFwvXFwvKD86W15cXC8/I10qQHwpKFteXFwvPyM6XSopKD86OihcXGQrKXwpfCkvLFxuXG5cdC8qIFByZWZpbHRlcnNcblx0ICogMSkgVGhleSBhcmUgdXNlZnVsIHRvIGludHJvZHVjZSBjdXN0b20gZGF0YVR5cGVzIChzZWUgYWpheC9qc29ucC5qcyBmb3IgYW4gZXhhbXBsZSlcblx0ICogMikgVGhlc2UgYXJlIGNhbGxlZDpcblx0ICogICAgLSBCRUZPUkUgYXNraW5nIGZvciBhIHRyYW5zcG9ydFxuXHQgKiAgICAtIEFGVEVSIHBhcmFtIHNlcmlhbGl6YXRpb24gKHMuZGF0YSBpcyBhIHN0cmluZyBpZiBzLnByb2Nlc3NEYXRhIGlzIHRydWUpXG5cdCAqIDMpIGtleSBpcyB0aGUgZGF0YVR5cGVcblx0ICogNCkgdGhlIGNhdGNoYWxsIHN5bWJvbCBcIipcIiBjYW4gYmUgdXNlZFxuXHQgKiA1KSBleGVjdXRpb24gd2lsbCBzdGFydCB3aXRoIHRyYW5zcG9ydCBkYXRhVHlwZSBhbmQgVEhFTiBjb250aW51ZSBkb3duIHRvIFwiKlwiIGlmIG5lZWRlZFxuXHQgKi9cblx0cHJlZmlsdGVycyA9IHt9LFxuXG5cdC8qIFRyYW5zcG9ydHMgYmluZGluZ3Ncblx0ICogMSkga2V5IGlzIHRoZSBkYXRhVHlwZVxuXHQgKiAyKSB0aGUgY2F0Y2hhbGwgc3ltYm9sIFwiKlwiIGNhbiBiZSB1c2VkXG5cdCAqIDMpIHNlbGVjdGlvbiB3aWxsIHN0YXJ0IHdpdGggdHJhbnNwb3J0IGRhdGFUeXBlIGFuZCBUSEVOIGdvIHRvIFwiKlwiIGlmIG5lZWRlZFxuXHQgKi9cblx0dHJhbnNwb3J0cyA9IHt9LFxuXG5cdC8vIEF2b2lkIGNvbW1lbnQtcHJvbG9nIGNoYXIgc2VxdWVuY2UgKCMxMDA5OCk7IG11c3QgYXBwZWFzZSBsaW50IGFuZCBldmFkZSBjb21wcmVzc2lvblxuXHRhbGxUeXBlcyA9IFwiKi9cIi5jb25jYXQoIFwiKlwiICksXG5cblx0Ly8gRG9jdW1lbnQgbG9jYXRpb25cblx0YWpheExvY2F0aW9uID0gbG9jYXRpb24uaHJlZixcblxuXHQvLyBTZWdtZW50IGxvY2F0aW9uIGludG8gcGFydHNcblx0YWpheExvY1BhcnRzID0gcnVybC5leGVjKCBhamF4TG9jYXRpb24udG9Mb3dlckNhc2UoKSApIHx8IFtdO1xuXG4vLyBCYXNlIFwiY29uc3RydWN0b3JcIiBmb3IgalF1ZXJ5LmFqYXhQcmVmaWx0ZXIgYW5kIGpRdWVyeS5hamF4VHJhbnNwb3J0XG5mdW5jdGlvbiBhZGRUb1ByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHN0cnVjdHVyZSApIHtcblxuXHQvLyBkYXRhVHlwZUV4cHJlc3Npb24gaXMgb3B0aW9uYWwgYW5kIGRlZmF1bHRzIHRvIFwiKlwiXG5cdHJldHVybiBmdW5jdGlvbiggZGF0YVR5cGVFeHByZXNzaW9uLCBmdW5jICkge1xuXG5cdFx0aWYgKCB0eXBlb2YgZGF0YVR5cGVFeHByZXNzaW9uICE9PSBcInN0cmluZ1wiICkge1xuXHRcdFx0ZnVuYyA9IGRhdGFUeXBlRXhwcmVzc2lvbjtcblx0XHRcdGRhdGFUeXBlRXhwcmVzc2lvbiA9IFwiKlwiO1xuXHRcdH1cblxuXHRcdHZhciBkYXRhVHlwZSxcblx0XHRcdGkgPSAwLFxuXHRcdFx0ZGF0YVR5cGVzID0gZGF0YVR5cGVFeHByZXNzaW9uLnRvTG93ZXJDYXNlKCkubWF0Y2goIHJub3R3aGl0ZSApIHx8IFtdO1xuXG5cdFx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggZnVuYyApICkge1xuXG5cdFx0XHQvLyBGb3IgZWFjaCBkYXRhVHlwZSBpbiB0aGUgZGF0YVR5cGVFeHByZXNzaW9uXG5cdFx0XHR3aGlsZSAoICggZGF0YVR5cGUgPSBkYXRhVHlwZXNbIGkrKyBdICkgKSB7XG5cblx0XHRcdFx0Ly8gUHJlcGVuZCBpZiByZXF1ZXN0ZWRcblx0XHRcdFx0aWYgKCBkYXRhVHlwZS5jaGFyQXQoIDAgKSA9PT0gXCIrXCIgKSB7XG5cdFx0XHRcdFx0ZGF0YVR5cGUgPSBkYXRhVHlwZS5zbGljZSggMSApIHx8IFwiKlwiO1xuXHRcdFx0XHRcdCggc3RydWN0dXJlWyBkYXRhVHlwZSBdID0gc3RydWN0dXJlWyBkYXRhVHlwZSBdIHx8IFtdICkudW5zaGlmdCggZnVuYyApO1xuXG5cdFx0XHRcdC8vIE90aGVyd2lzZSBhcHBlbmRcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQoIHN0cnVjdHVyZVsgZGF0YVR5cGUgXSA9IHN0cnVjdHVyZVsgZGF0YVR5cGUgXSB8fCBbXSApLnB1c2goIGZ1bmMgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fTtcbn1cblxuLy8gQmFzZSBpbnNwZWN0aW9uIGZ1bmN0aW9uIGZvciBwcmVmaWx0ZXJzIGFuZCB0cmFuc3BvcnRzXG5mdW5jdGlvbiBpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyggc3RydWN0dXJlLCBvcHRpb25zLCBvcmlnaW5hbE9wdGlvbnMsIGpxWEhSICkge1xuXG5cdHZhciBpbnNwZWN0ZWQgPSB7fSxcblx0XHRzZWVraW5nVHJhbnNwb3J0ID0gKCBzdHJ1Y3R1cmUgPT09IHRyYW5zcG9ydHMgKTtcblxuXHRmdW5jdGlvbiBpbnNwZWN0KCBkYXRhVHlwZSApIHtcblx0XHR2YXIgc2VsZWN0ZWQ7XG5cdFx0aW5zcGVjdGVkWyBkYXRhVHlwZSBdID0gdHJ1ZTtcblx0XHRqUXVlcnkuZWFjaCggc3RydWN0dXJlWyBkYXRhVHlwZSBdIHx8IFtdLCBmdW5jdGlvbiggXywgcHJlZmlsdGVyT3JGYWN0b3J5ICkge1xuXHRcdFx0dmFyIGRhdGFUeXBlT3JUcmFuc3BvcnQgPSBwcmVmaWx0ZXJPckZhY3RvcnkoIG9wdGlvbnMsIG9yaWdpbmFsT3B0aW9ucywganFYSFIgKTtcblx0XHRcdGlmICggdHlwZW9mIGRhdGFUeXBlT3JUcmFuc3BvcnQgPT09IFwic3RyaW5nXCIgJiZcblx0XHRcdFx0IXNlZWtpbmdUcmFuc3BvcnQgJiYgIWluc3BlY3RlZFsgZGF0YVR5cGVPclRyYW5zcG9ydCBdICkge1xuXG5cdFx0XHRcdG9wdGlvbnMuZGF0YVR5cGVzLnVuc2hpZnQoIGRhdGFUeXBlT3JUcmFuc3BvcnQgKTtcblx0XHRcdFx0aW5zcGVjdCggZGF0YVR5cGVPclRyYW5zcG9ydCApO1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9IGVsc2UgaWYgKCBzZWVraW5nVHJhbnNwb3J0ICkge1xuXHRcdFx0XHRyZXR1cm4gISggc2VsZWN0ZWQgPSBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHRcdHJldHVybiBzZWxlY3RlZDtcblx0fVxuXG5cdHJldHVybiBpbnNwZWN0KCBvcHRpb25zLmRhdGFUeXBlc1sgMCBdICkgfHwgIWluc3BlY3RlZFsgXCIqXCIgXSAmJiBpbnNwZWN0KCBcIipcIiApO1xufVxuXG4vLyBBIHNwZWNpYWwgZXh0ZW5kIGZvciBhamF4IG9wdGlvbnNcbi8vIHRoYXQgdGFrZXMgXCJmbGF0XCIgb3B0aW9ucyAobm90IHRvIGJlIGRlZXAgZXh0ZW5kZWQpXG4vLyBGaXhlcyAjOTg4N1xuZnVuY3Rpb24gYWpheEV4dGVuZCggdGFyZ2V0LCBzcmMgKSB7XG5cdHZhciBkZWVwLCBrZXksXG5cdFx0ZmxhdE9wdGlvbnMgPSBqUXVlcnkuYWpheFNldHRpbmdzLmZsYXRPcHRpb25zIHx8IHt9O1xuXG5cdGZvciAoIGtleSBpbiBzcmMgKSB7XG5cdFx0aWYgKCBzcmNbIGtleSBdICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHQoIGZsYXRPcHRpb25zWyBrZXkgXSA/IHRhcmdldCA6ICggZGVlcCB8fCAoIGRlZXAgPSB7fSApICkgKVsga2V5IF0gPSBzcmNbIGtleSBdO1xuXHRcdH1cblx0fVxuXHRpZiAoIGRlZXAgKSB7XG5cdFx0alF1ZXJ5LmV4dGVuZCggdHJ1ZSwgdGFyZ2V0LCBkZWVwICk7XG5cdH1cblxuXHRyZXR1cm4gdGFyZ2V0O1xufVxuXG4vKiBIYW5kbGVzIHJlc3BvbnNlcyB0byBhbiBhamF4IHJlcXVlc3Q6XG4gKiAtIGZpbmRzIHRoZSByaWdodCBkYXRhVHlwZSAobWVkaWF0ZXMgYmV0d2VlbiBjb250ZW50LXR5cGUgYW5kIGV4cGVjdGVkIGRhdGFUeXBlKVxuICogLSByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIHJlc3BvbnNlXG4gKi9cbmZ1bmN0aW9uIGFqYXhIYW5kbGVSZXNwb25zZXMoIHMsIGpxWEhSLCByZXNwb25zZXMgKSB7XG5cdHZhciBmaXJzdERhdGFUeXBlLCBjdCwgZmluYWxEYXRhVHlwZSwgdHlwZSxcblx0XHRjb250ZW50cyA9IHMuY29udGVudHMsXG5cdFx0ZGF0YVR5cGVzID0gcy5kYXRhVHlwZXM7XG5cblx0Ly8gUmVtb3ZlIGF1dG8gZGF0YVR5cGUgYW5kIGdldCBjb250ZW50LXR5cGUgaW4gdGhlIHByb2Nlc3Ncblx0d2hpbGUgKCBkYXRhVHlwZXNbIDAgXSA9PT0gXCIqXCIgKSB7XG5cdFx0ZGF0YVR5cGVzLnNoaWZ0KCk7XG5cdFx0aWYgKCBjdCA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0Y3QgPSBzLm1pbWVUeXBlIHx8IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVyKCBcIkNvbnRlbnQtVHlwZVwiICk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gQ2hlY2sgaWYgd2UncmUgZGVhbGluZyB3aXRoIGEga25vd24gY29udGVudC10eXBlXG5cdGlmICggY3QgKSB7XG5cdFx0Zm9yICggdHlwZSBpbiBjb250ZW50cyApIHtcblx0XHRcdGlmICggY29udGVudHNbIHR5cGUgXSAmJiBjb250ZW50c1sgdHlwZSBdLnRlc3QoIGN0ICkgKSB7XG5cdFx0XHRcdGRhdGFUeXBlcy51bnNoaWZ0KCB0eXBlICk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIENoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGEgcmVzcG9uc2UgZm9yIHRoZSBleHBlY3RlZCBkYXRhVHlwZVxuXHRpZiAoIGRhdGFUeXBlc1sgMCBdIGluIHJlc3BvbnNlcyApIHtcblx0XHRmaW5hbERhdGFUeXBlID0gZGF0YVR5cGVzWyAwIF07XG5cdH0gZWxzZSB7XG5cblx0XHQvLyBUcnkgY29udmVydGlibGUgZGF0YVR5cGVzXG5cdFx0Zm9yICggdHlwZSBpbiByZXNwb25zZXMgKSB7XG5cdFx0XHRpZiAoICFkYXRhVHlwZXNbIDAgXSB8fCBzLmNvbnZlcnRlcnNbIHR5cGUgKyBcIiBcIiArIGRhdGFUeXBlc1sgMCBdIF0gKSB7XG5cdFx0XHRcdGZpbmFsRGF0YVR5cGUgPSB0eXBlO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdGlmICggIWZpcnN0RGF0YVR5cGUgKSB7XG5cdFx0XHRcdGZpcnN0RGF0YVR5cGUgPSB0eXBlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIE9yIGp1c3QgdXNlIGZpcnN0IG9uZVxuXHRcdGZpbmFsRGF0YVR5cGUgPSBmaW5hbERhdGFUeXBlIHx8IGZpcnN0RGF0YVR5cGU7XG5cdH1cblxuXHQvLyBJZiB3ZSBmb3VuZCBhIGRhdGFUeXBlXG5cdC8vIFdlIGFkZCB0aGUgZGF0YVR5cGUgdG8gdGhlIGxpc3QgaWYgbmVlZGVkXG5cdC8vIGFuZCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgcmVzcG9uc2Vcblx0aWYgKCBmaW5hbERhdGFUeXBlICkge1xuXHRcdGlmICggZmluYWxEYXRhVHlwZSAhPT0gZGF0YVR5cGVzWyAwIF0gKSB7XG5cdFx0XHRkYXRhVHlwZXMudW5zaGlmdCggZmluYWxEYXRhVHlwZSApO1xuXHRcdH1cblx0XHRyZXR1cm4gcmVzcG9uc2VzWyBmaW5hbERhdGFUeXBlIF07XG5cdH1cbn1cblxuLyogQ2hhaW4gY29udmVyc2lvbnMgZ2l2ZW4gdGhlIHJlcXVlc3QgYW5kIHRoZSBvcmlnaW5hbCByZXNwb25zZVxuICogQWxzbyBzZXRzIHRoZSByZXNwb25zZVhYWCBmaWVsZHMgb24gdGhlIGpxWEhSIGluc3RhbmNlXG4gKi9cbmZ1bmN0aW9uIGFqYXhDb252ZXJ0KCBzLCByZXNwb25zZSwganFYSFIsIGlzU3VjY2VzcyApIHtcblx0dmFyIGNvbnYyLCBjdXJyZW50LCBjb252LCB0bXAsIHByZXYsXG5cdFx0Y29udmVydGVycyA9IHt9LFxuXG5cdFx0Ly8gV29yayB3aXRoIGEgY29weSBvZiBkYXRhVHlwZXMgaW4gY2FzZSB3ZSBuZWVkIHRvIG1vZGlmeSBpdCBmb3IgY29udmVyc2lvblxuXHRcdGRhdGFUeXBlcyA9IHMuZGF0YVR5cGVzLnNsaWNlKCk7XG5cblx0Ly8gQ3JlYXRlIGNvbnZlcnRlcnMgbWFwIHdpdGggbG93ZXJjYXNlZCBrZXlzXG5cdGlmICggZGF0YVR5cGVzWyAxIF0gKSB7XG5cdFx0Zm9yICggY29udiBpbiBzLmNvbnZlcnRlcnMgKSB7XG5cdFx0XHRjb252ZXJ0ZXJzWyBjb252LnRvTG93ZXJDYXNlKCkgXSA9IHMuY29udmVydGVyc1sgY29udiBdO1xuXHRcdH1cblx0fVxuXG5cdGN1cnJlbnQgPSBkYXRhVHlwZXMuc2hpZnQoKTtcblxuXHQvLyBDb252ZXJ0IHRvIGVhY2ggc2VxdWVudGlhbCBkYXRhVHlwZVxuXHR3aGlsZSAoIGN1cnJlbnQgKSB7XG5cblx0XHRpZiAoIHMucmVzcG9uc2VGaWVsZHNbIGN1cnJlbnQgXSApIHtcblx0XHRcdGpxWEhSWyBzLnJlc3BvbnNlRmllbGRzWyBjdXJyZW50IF0gXSA9IHJlc3BvbnNlO1xuXHRcdH1cblxuXHRcdC8vIEFwcGx5IHRoZSBkYXRhRmlsdGVyIGlmIHByb3ZpZGVkXG5cdFx0aWYgKCAhcHJldiAmJiBpc1N1Y2Nlc3MgJiYgcy5kYXRhRmlsdGVyICkge1xuXHRcdFx0cmVzcG9uc2UgPSBzLmRhdGFGaWx0ZXIoIHJlc3BvbnNlLCBzLmRhdGFUeXBlICk7XG5cdFx0fVxuXG5cdFx0cHJldiA9IGN1cnJlbnQ7XG5cdFx0Y3VycmVudCA9IGRhdGFUeXBlcy5zaGlmdCgpO1xuXG5cdFx0aWYgKCBjdXJyZW50ICkge1xuXG5cdFx0XHQvLyBUaGVyZSdzIG9ubHkgd29yayB0byBkbyBpZiBjdXJyZW50IGRhdGFUeXBlIGlzIG5vbi1hdXRvXG5cdFx0XHRpZiAoIGN1cnJlbnQgPT09IFwiKlwiICkge1xuXG5cdFx0XHRcdGN1cnJlbnQgPSBwcmV2O1xuXG5cdFx0XHQvLyBDb252ZXJ0IHJlc3BvbnNlIGlmIHByZXYgZGF0YVR5cGUgaXMgbm9uLWF1dG8gYW5kIGRpZmZlcnMgZnJvbSBjdXJyZW50XG5cdFx0XHR9IGVsc2UgaWYgKCBwcmV2ICE9PSBcIipcIiAmJiBwcmV2ICE9PSBjdXJyZW50ICkge1xuXG5cdFx0XHRcdC8vIFNlZWsgYSBkaXJlY3QgY29udmVydGVyXG5cdFx0XHRcdGNvbnYgPSBjb252ZXJ0ZXJzWyBwcmV2ICsgXCIgXCIgKyBjdXJyZW50IF0gfHwgY29udmVydGVyc1sgXCIqIFwiICsgY3VycmVudCBdO1xuXG5cdFx0XHRcdC8vIElmIG5vbmUgZm91bmQsIHNlZWsgYSBwYWlyXG5cdFx0XHRcdGlmICggIWNvbnYgKSB7XG5cdFx0XHRcdFx0Zm9yICggY29udjIgaW4gY29udmVydGVycyApIHtcblxuXHRcdFx0XHRcdFx0Ly8gSWYgY29udjIgb3V0cHV0cyBjdXJyZW50XG5cdFx0XHRcdFx0XHR0bXAgPSBjb252Mi5zcGxpdCggXCIgXCIgKTtcblx0XHRcdFx0XHRcdGlmICggdG1wWyAxIF0gPT09IGN1cnJlbnQgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gSWYgcHJldiBjYW4gYmUgY29udmVydGVkIHRvIGFjY2VwdGVkIGlucHV0XG5cdFx0XHRcdFx0XHRcdGNvbnYgPSBjb252ZXJ0ZXJzWyBwcmV2ICsgXCIgXCIgKyB0bXBbIDAgXSBdIHx8XG5cdFx0XHRcdFx0XHRcdFx0Y29udmVydGVyc1sgXCIqIFwiICsgdG1wWyAwIF0gXTtcblx0XHRcdFx0XHRcdFx0aWYgKCBjb252ICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gQ29uZGVuc2UgZXF1aXZhbGVuY2UgY29udmVydGVyc1xuXHRcdFx0XHRcdFx0XHRcdGlmICggY29udiA9PT0gdHJ1ZSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnYgPSBjb252ZXJ0ZXJzWyBjb252MiBdO1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gT3RoZXJ3aXNlLCBpbnNlcnQgdGhlIGludGVybWVkaWF0ZSBkYXRhVHlwZVxuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoIGNvbnZlcnRlcnNbIGNvbnYyIF0gIT09IHRydWUgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjdXJyZW50ID0gdG1wWyAwIF07XG5cdFx0XHRcdFx0XHRcdFx0XHRkYXRhVHlwZXMudW5zaGlmdCggdG1wWyAxIF0gKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBBcHBseSBjb252ZXJ0ZXIgKGlmIG5vdCBhbiBlcXVpdmFsZW5jZSlcblx0XHRcdFx0aWYgKCBjb252ICE9PSB0cnVlICkge1xuXG5cdFx0XHRcdFx0Ly8gVW5sZXNzIGVycm9ycyBhcmUgYWxsb3dlZCB0byBidWJibGUsIGNhdGNoIGFuZCByZXR1cm4gdGhlbVxuXHRcdFx0XHRcdGlmICggY29udiAmJiBzWyBcInRocm93c1wiIF0gKSB7IC8vIGpzY3M6aWdub3JlIHJlcXVpcmVEb3ROb3RhdGlvblxuXHRcdFx0XHRcdFx0cmVzcG9uc2UgPSBjb252KCByZXNwb25zZSApO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHRyZXNwb25zZSA9IGNvbnYoIHJlc3BvbnNlICk7XG5cdFx0XHRcdFx0XHR9IGNhdGNoICggZSApIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdFx0XHRzdGF0ZTogXCJwYXJzZXJlcnJvclwiLFxuXHRcdFx0XHRcdFx0XHRcdGVycm9yOiBjb252ID8gZSA6IFwiTm8gY29udmVyc2lvbiBmcm9tIFwiICsgcHJldiArIFwiIHRvIFwiICsgY3VycmVudFxuXHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiB7IHN0YXRlOiBcInN1Y2Nlc3NcIiwgZGF0YTogcmVzcG9uc2UgfTtcbn1cblxualF1ZXJ5LmV4dGVuZCgge1xuXG5cdC8vIENvdW50ZXIgZm9yIGhvbGRpbmcgdGhlIG51bWJlciBvZiBhY3RpdmUgcXVlcmllc1xuXHRhY3RpdmU6IDAsXG5cblx0Ly8gTGFzdC1Nb2RpZmllZCBoZWFkZXIgY2FjaGUgZm9yIG5leHQgcmVxdWVzdFxuXHRsYXN0TW9kaWZpZWQ6IHt9LFxuXHRldGFnOiB7fSxcblxuXHRhamF4U2V0dGluZ3M6IHtcblx0XHR1cmw6IGFqYXhMb2NhdGlvbixcblx0XHR0eXBlOiBcIkdFVFwiLFxuXHRcdGlzTG9jYWw6IHJsb2NhbFByb3RvY29sLnRlc3QoIGFqYXhMb2NQYXJ0c1sgMSBdICksXG5cdFx0Z2xvYmFsOiB0cnVlLFxuXHRcdHByb2Nlc3NEYXRhOiB0cnVlLFxuXHRcdGFzeW5jOiB0cnVlLFxuXHRcdGNvbnRlbnRUeXBlOiBcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD1VVEYtOFwiLFxuXHRcdC8qXG5cdFx0dGltZW91dDogMCxcblx0XHRkYXRhOiBudWxsLFxuXHRcdGRhdGFUeXBlOiBudWxsLFxuXHRcdHVzZXJuYW1lOiBudWxsLFxuXHRcdHBhc3N3b3JkOiBudWxsLFxuXHRcdGNhY2hlOiBudWxsLFxuXHRcdHRocm93czogZmFsc2UsXG5cdFx0dHJhZGl0aW9uYWw6IGZhbHNlLFxuXHRcdGhlYWRlcnM6IHt9LFxuXHRcdCovXG5cblx0XHRhY2NlcHRzOiB7XG5cdFx0XHRcIipcIjogYWxsVHlwZXMsXG5cdFx0XHR0ZXh0OiBcInRleHQvcGxhaW5cIixcblx0XHRcdGh0bWw6IFwidGV4dC9odG1sXCIsXG5cdFx0XHR4bWw6IFwiYXBwbGljYXRpb24veG1sLCB0ZXh0L3htbFwiLFxuXHRcdFx0anNvbjogXCJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFzY3JpcHRcIlxuXHRcdH0sXG5cblx0XHRjb250ZW50czoge1xuXHRcdFx0eG1sOiAvXFxieG1sXFxiLyxcblx0XHRcdGh0bWw6IC9cXGJodG1sLyxcblx0XHRcdGpzb246IC9cXGJqc29uXFxiL1xuXHRcdH0sXG5cblx0XHRyZXNwb25zZUZpZWxkczoge1xuXHRcdFx0eG1sOiBcInJlc3BvbnNlWE1MXCIsXG5cdFx0XHR0ZXh0OiBcInJlc3BvbnNlVGV4dFwiLFxuXHRcdFx0anNvbjogXCJyZXNwb25zZUpTT05cIlxuXHRcdH0sXG5cblx0XHQvLyBEYXRhIGNvbnZlcnRlcnNcblx0XHQvLyBLZXlzIHNlcGFyYXRlIHNvdXJjZSAob3IgY2F0Y2hhbGwgXCIqXCIpIGFuZCBkZXN0aW5hdGlvbiB0eXBlcyB3aXRoIGEgc2luZ2xlIHNwYWNlXG5cdFx0Y29udmVydGVyczoge1xuXG5cdFx0XHQvLyBDb252ZXJ0IGFueXRoaW5nIHRvIHRleHRcblx0XHRcdFwiKiB0ZXh0XCI6IFN0cmluZyxcblxuXHRcdFx0Ly8gVGV4dCB0byBodG1sICh0cnVlID0gbm8gdHJhbnNmb3JtYXRpb24pXG5cdFx0XHRcInRleHQgaHRtbFwiOiB0cnVlLFxuXG5cdFx0XHQvLyBFdmFsdWF0ZSB0ZXh0IGFzIGEganNvbiBleHByZXNzaW9uXG5cdFx0XHRcInRleHQganNvblwiOiBqUXVlcnkucGFyc2VKU09OLFxuXG5cdFx0XHQvLyBQYXJzZSB0ZXh0IGFzIHhtbFxuXHRcdFx0XCJ0ZXh0IHhtbFwiOiBqUXVlcnkucGFyc2VYTUxcblx0XHR9LFxuXG5cdFx0Ly8gRm9yIG9wdGlvbnMgdGhhdCBzaG91bGRuJ3QgYmUgZGVlcCBleHRlbmRlZDpcblx0XHQvLyB5b3UgY2FuIGFkZCB5b3VyIG93biBjdXN0b20gb3B0aW9ucyBoZXJlIGlmXG5cdFx0Ly8gYW5kIHdoZW4geW91IGNyZWF0ZSBvbmUgdGhhdCBzaG91bGRuJ3QgYmVcblx0XHQvLyBkZWVwIGV4dGVuZGVkIChzZWUgYWpheEV4dGVuZClcblx0XHRmbGF0T3B0aW9uczoge1xuXHRcdFx0dXJsOiB0cnVlLFxuXHRcdFx0Y29udGV4dDogdHJ1ZVxuXHRcdH1cblx0fSxcblxuXHQvLyBDcmVhdGVzIGEgZnVsbCBmbGVkZ2VkIHNldHRpbmdzIG9iamVjdCBpbnRvIHRhcmdldFxuXHQvLyB3aXRoIGJvdGggYWpheFNldHRpbmdzIGFuZCBzZXR0aW5ncyBmaWVsZHMuXG5cdC8vIElmIHRhcmdldCBpcyBvbWl0dGVkLCB3cml0ZXMgaW50byBhamF4U2V0dGluZ3MuXG5cdGFqYXhTZXR1cDogZnVuY3Rpb24oIHRhcmdldCwgc2V0dGluZ3MgKSB7XG5cdFx0cmV0dXJuIHNldHRpbmdzID9cblxuXHRcdFx0Ly8gQnVpbGRpbmcgYSBzZXR0aW5ncyBvYmplY3Rcblx0XHRcdGFqYXhFeHRlbmQoIGFqYXhFeHRlbmQoIHRhcmdldCwgalF1ZXJ5LmFqYXhTZXR0aW5ncyApLCBzZXR0aW5ncyApIDpcblxuXHRcdFx0Ly8gRXh0ZW5kaW5nIGFqYXhTZXR0aW5nc1xuXHRcdFx0YWpheEV4dGVuZCggalF1ZXJ5LmFqYXhTZXR0aW5ncywgdGFyZ2V0ICk7XG5cdH0sXG5cblx0YWpheFByZWZpbHRlcjogYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBwcmVmaWx0ZXJzICksXG5cdGFqYXhUcmFuc3BvcnQ6IGFkZFRvUHJlZmlsdGVyc09yVHJhbnNwb3J0cyggdHJhbnNwb3J0cyApLFxuXG5cdC8vIE1haW4gbWV0aG9kXG5cdGFqYXg6IGZ1bmN0aW9uKCB1cmwsIG9wdGlvbnMgKSB7XG5cblx0XHQvLyBJZiB1cmwgaXMgYW4gb2JqZWN0LCBzaW11bGF0ZSBwcmUtMS41IHNpZ25hdHVyZVxuXHRcdGlmICggdHlwZW9mIHVybCA9PT0gXCJvYmplY3RcIiApIHtcblx0XHRcdG9wdGlvbnMgPSB1cmw7XG5cdFx0XHR1cmwgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0Ly8gRm9yY2Ugb3B0aW9ucyB0byBiZSBhbiBvYmplY3Rcblx0XHRvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuXHRcdHZhclxuXG5cdFx0XHQvLyBDcm9zcy1kb21haW4gZGV0ZWN0aW9uIHZhcnNcblx0XHRcdHBhcnRzLFxuXG5cdFx0XHQvLyBMb29wIHZhcmlhYmxlXG5cdFx0XHRpLFxuXG5cdFx0XHQvLyBVUkwgd2l0aG91dCBhbnRpLWNhY2hlIHBhcmFtXG5cdFx0XHRjYWNoZVVSTCxcblxuXHRcdFx0Ly8gUmVzcG9uc2UgaGVhZGVycyBhcyBzdHJpbmdcblx0XHRcdHJlc3BvbnNlSGVhZGVyc1N0cmluZyxcblxuXHRcdFx0Ly8gdGltZW91dCBoYW5kbGVcblx0XHRcdHRpbWVvdXRUaW1lcixcblxuXHRcdFx0Ly8gVG8ga25vdyBpZiBnbG9iYWwgZXZlbnRzIGFyZSB0byBiZSBkaXNwYXRjaGVkXG5cdFx0XHRmaXJlR2xvYmFscyxcblxuXHRcdFx0dHJhbnNwb3J0LFxuXG5cdFx0XHQvLyBSZXNwb25zZSBoZWFkZXJzXG5cdFx0XHRyZXNwb25zZUhlYWRlcnMsXG5cblx0XHRcdC8vIENyZWF0ZSB0aGUgZmluYWwgb3B0aW9ucyBvYmplY3Rcblx0XHRcdHMgPSBqUXVlcnkuYWpheFNldHVwKCB7fSwgb3B0aW9ucyApLFxuXG5cdFx0XHQvLyBDYWxsYmFja3MgY29udGV4dFxuXHRcdFx0Y2FsbGJhY2tDb250ZXh0ID0gcy5jb250ZXh0IHx8IHMsXG5cblx0XHRcdC8vIENvbnRleHQgZm9yIGdsb2JhbCBldmVudHMgaXMgY2FsbGJhY2tDb250ZXh0IGlmIGl0IGlzIGEgRE9NIG5vZGUgb3IgalF1ZXJ5IGNvbGxlY3Rpb25cblx0XHRcdGdsb2JhbEV2ZW50Q29udGV4dCA9IHMuY29udGV4dCAmJlxuXHRcdFx0XHQoIGNhbGxiYWNrQ29udGV4dC5ub2RlVHlwZSB8fCBjYWxsYmFja0NvbnRleHQuanF1ZXJ5ICkgP1xuXHRcdFx0XHRcdGpRdWVyeSggY2FsbGJhY2tDb250ZXh0ICkgOlxuXHRcdFx0XHRcdGpRdWVyeS5ldmVudCxcblxuXHRcdFx0Ly8gRGVmZXJyZWRzXG5cdFx0XHRkZWZlcnJlZCA9IGpRdWVyeS5EZWZlcnJlZCgpLFxuXHRcdFx0Y29tcGxldGVEZWZlcnJlZCA9IGpRdWVyeS5DYWxsYmFja3MoIFwib25jZSBtZW1vcnlcIiApLFxuXG5cdFx0XHQvLyBTdGF0dXMtZGVwZW5kZW50IGNhbGxiYWNrc1xuXHRcdFx0c3RhdHVzQ29kZSA9IHMuc3RhdHVzQ29kZSB8fCB7fSxcblxuXHRcdFx0Ly8gSGVhZGVycyAodGhleSBhcmUgc2VudCBhbGwgYXQgb25jZSlcblx0XHRcdHJlcXVlc3RIZWFkZXJzID0ge30sXG5cdFx0XHRyZXF1ZXN0SGVhZGVyc05hbWVzID0ge30sXG5cblx0XHRcdC8vIFRoZSBqcVhIUiBzdGF0ZVxuXHRcdFx0c3RhdGUgPSAwLFxuXG5cdFx0XHQvLyBEZWZhdWx0IGFib3J0IG1lc3NhZ2Vcblx0XHRcdHN0ckFib3J0ID0gXCJjYW5jZWxlZFwiLFxuXG5cdFx0XHQvLyBGYWtlIHhoclxuXHRcdFx0anFYSFIgPSB7XG5cdFx0XHRcdHJlYWR5U3RhdGU6IDAsXG5cblx0XHRcdFx0Ly8gQnVpbGRzIGhlYWRlcnMgaGFzaHRhYmxlIGlmIG5lZWRlZFxuXHRcdFx0XHRnZXRSZXNwb25zZUhlYWRlcjogZnVuY3Rpb24oIGtleSApIHtcblx0XHRcdFx0XHR2YXIgbWF0Y2g7XG5cdFx0XHRcdFx0aWYgKCBzdGF0ZSA9PT0gMiApIHtcblx0XHRcdFx0XHRcdGlmICggIXJlc3BvbnNlSGVhZGVycyApIHtcblx0XHRcdFx0XHRcdFx0cmVzcG9uc2VIZWFkZXJzID0ge307XG5cdFx0XHRcdFx0XHRcdHdoaWxlICggKCBtYXRjaCA9IHJoZWFkZXJzLmV4ZWMoIHJlc3BvbnNlSGVhZGVyc1N0cmluZyApICkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmVzcG9uc2VIZWFkZXJzWyBtYXRjaFsgMSBdLnRvTG93ZXJDYXNlKCkgXSA9IG1hdGNoWyAyIF07XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdG1hdGNoID0gcmVzcG9uc2VIZWFkZXJzWyBrZXkudG9Mb3dlckNhc2UoKSBdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gbWF0Y2ggPT0gbnVsbCA/IG51bGwgOiBtYXRjaDtcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBSYXcgc3RyaW5nXG5cdFx0XHRcdGdldEFsbFJlc3BvbnNlSGVhZGVyczogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHN0YXRlID09PSAyID8gcmVzcG9uc2VIZWFkZXJzU3RyaW5nIDogbnVsbDtcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBDYWNoZXMgdGhlIGhlYWRlclxuXHRcdFx0XHRzZXRSZXF1ZXN0SGVhZGVyOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7XG5cdFx0XHRcdFx0dmFyIGxuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0XHRcdGlmICggIXN0YXRlICkge1xuXHRcdFx0XHRcdFx0bmFtZSA9IHJlcXVlc3RIZWFkZXJzTmFtZXNbIGxuYW1lIF0gPSByZXF1ZXN0SGVhZGVyc05hbWVzWyBsbmFtZSBdIHx8IG5hbWU7XG5cdFx0XHRcdFx0XHRyZXF1ZXN0SGVhZGVyc1sgbmFtZSBdID0gdmFsdWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIE92ZXJyaWRlcyByZXNwb25zZSBjb250ZW50LXR5cGUgaGVhZGVyXG5cdFx0XHRcdG92ZXJyaWRlTWltZVR5cGU6IGZ1bmN0aW9uKCB0eXBlICkge1xuXHRcdFx0XHRcdGlmICggIXN0YXRlICkge1xuXHRcdFx0XHRcdFx0cy5taW1lVHlwZSA9IHR5cGU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIFN0YXR1cy1kZXBlbmRlbnQgY2FsbGJhY2tzXG5cdFx0XHRcdHN0YXR1c0NvZGU6IGZ1bmN0aW9uKCBtYXAgKSB7XG5cdFx0XHRcdFx0dmFyIGNvZGU7XG5cdFx0XHRcdFx0aWYgKCBtYXAgKSB7XG5cdFx0XHRcdFx0XHRpZiAoIHN0YXRlIDwgMiApIHtcblx0XHRcdFx0XHRcdFx0Zm9yICggY29kZSBpbiBtYXAgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBMYXp5LWFkZCB0aGUgbmV3IGNhbGxiYWNrIGluIGEgd2F5IHRoYXQgcHJlc2VydmVzIG9sZCBvbmVzXG5cdFx0XHRcdFx0XHRcdFx0c3RhdHVzQ29kZVsgY29kZSBdID0gWyBzdGF0dXNDb2RlWyBjb2RlIF0sIG1hcFsgY29kZSBdIF07XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gRXhlY3V0ZSB0aGUgYXBwcm9wcmlhdGUgY2FsbGJhY2tzXG5cdFx0XHRcdFx0XHRcdGpxWEhSLmFsd2F5cyggbWFwWyBqcVhIUi5zdGF0dXMgXSApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBDYW5jZWwgdGhlIHJlcXVlc3Rcblx0XHRcdFx0YWJvcnQ6IGZ1bmN0aW9uKCBzdGF0dXNUZXh0ICkge1xuXHRcdFx0XHRcdHZhciBmaW5hbFRleHQgPSBzdGF0dXNUZXh0IHx8IHN0ckFib3J0O1xuXHRcdFx0XHRcdGlmICggdHJhbnNwb3J0ICkge1xuXHRcdFx0XHRcdFx0dHJhbnNwb3J0LmFib3J0KCBmaW5hbFRleHQgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZG9uZSggMCwgZmluYWxUZXh0ICk7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cblx0XHQvLyBBdHRhY2ggZGVmZXJyZWRzXG5cdFx0ZGVmZXJyZWQucHJvbWlzZSgganFYSFIgKS5jb21wbGV0ZSA9IGNvbXBsZXRlRGVmZXJyZWQuYWRkO1xuXHRcdGpxWEhSLnN1Y2Nlc3MgPSBqcVhIUi5kb25lO1xuXHRcdGpxWEhSLmVycm9yID0ganFYSFIuZmFpbDtcblxuXHRcdC8vIFJlbW92ZSBoYXNoIGNoYXJhY3RlciAoIzc1MzE6IGFuZCBzdHJpbmcgcHJvbW90aW9uKVxuXHRcdC8vIEFkZCBwcm90b2NvbCBpZiBub3QgcHJvdmlkZWQgKCM1ODY2OiBJRTcgaXNzdWUgd2l0aCBwcm90b2NvbC1sZXNzIHVybHMpXG5cdFx0Ly8gSGFuZGxlIGZhbHN5IHVybCBpbiB0aGUgc2V0dGluZ3Mgb2JqZWN0ICgjMTAwOTM6IGNvbnNpc3RlbmN5IHdpdGggb2xkIHNpZ25hdHVyZSlcblx0XHQvLyBXZSBhbHNvIHVzZSB0aGUgdXJsIHBhcmFtZXRlciBpZiBhdmFpbGFibGVcblx0XHRzLnVybCA9ICggKCB1cmwgfHwgcy51cmwgfHwgYWpheExvY2F0aW9uICkgKyBcIlwiIClcblx0XHRcdC5yZXBsYWNlKCByaGFzaCwgXCJcIiApXG5cdFx0XHQucmVwbGFjZSggcnByb3RvY29sLCBhamF4TG9jUGFydHNbIDEgXSArIFwiLy9cIiApO1xuXG5cdFx0Ly8gQWxpYXMgbWV0aG9kIG9wdGlvbiB0byB0eXBlIGFzIHBlciB0aWNrZXQgIzEyMDA0XG5cdFx0cy50eXBlID0gb3B0aW9ucy5tZXRob2QgfHwgb3B0aW9ucy50eXBlIHx8IHMubWV0aG9kIHx8IHMudHlwZTtcblxuXHRcdC8vIEV4dHJhY3QgZGF0YVR5cGVzIGxpc3Rcblx0XHRzLmRhdGFUeXBlcyA9IGpRdWVyeS50cmltKCBzLmRhdGFUeXBlIHx8IFwiKlwiICkudG9Mb3dlckNhc2UoKS5tYXRjaCggcm5vdHdoaXRlICkgfHwgWyBcIlwiIF07XG5cblx0XHQvLyBBIGNyb3NzLWRvbWFpbiByZXF1ZXN0IGlzIGluIG9yZGVyIHdoZW4gd2UgaGF2ZSBhIHByb3RvY29sOmhvc3Q6cG9ydCBtaXNtYXRjaFxuXHRcdGlmICggcy5jcm9zc0RvbWFpbiA9PSBudWxsICkge1xuXHRcdFx0cGFydHMgPSBydXJsLmV4ZWMoIHMudXJsLnRvTG93ZXJDYXNlKCkgKTtcblx0XHRcdHMuY3Jvc3NEb21haW4gPSAhISggcGFydHMgJiZcblx0XHRcdFx0KCBwYXJ0c1sgMSBdICE9PSBhamF4TG9jUGFydHNbIDEgXSB8fCBwYXJ0c1sgMiBdICE9PSBhamF4TG9jUGFydHNbIDIgXSB8fFxuXHRcdFx0XHRcdCggcGFydHNbIDMgXSB8fCAoIHBhcnRzWyAxIF0gPT09IFwiaHR0cDpcIiA/IFwiODBcIiA6IFwiNDQzXCIgKSApICE9PVxuXHRcdFx0XHRcdFx0KCBhamF4TG9jUGFydHNbIDMgXSB8fCAoIGFqYXhMb2NQYXJ0c1sgMSBdID09PSBcImh0dHA6XCIgPyBcIjgwXCIgOiBcIjQ0M1wiICkgKSApXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdC8vIENvbnZlcnQgZGF0YSBpZiBub3QgYWxyZWFkeSBhIHN0cmluZ1xuXHRcdGlmICggcy5kYXRhICYmIHMucHJvY2Vzc0RhdGEgJiYgdHlwZW9mIHMuZGF0YSAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdHMuZGF0YSA9IGpRdWVyeS5wYXJhbSggcy5kYXRhLCBzLnRyYWRpdGlvbmFsICk7XG5cdFx0fVxuXG5cdFx0Ly8gQXBwbHkgcHJlZmlsdGVyc1xuXHRcdGluc3BlY3RQcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBwcmVmaWx0ZXJzLCBzLCBvcHRpb25zLCBqcVhIUiApO1xuXG5cdFx0Ly8gSWYgcmVxdWVzdCB3YXMgYWJvcnRlZCBpbnNpZGUgYSBwcmVmaWx0ZXIsIHN0b3AgdGhlcmVcblx0XHRpZiAoIHN0YXRlID09PSAyICkge1xuXHRcdFx0cmV0dXJuIGpxWEhSO1xuXHRcdH1cblxuXHRcdC8vIFdlIGNhbiBmaXJlIGdsb2JhbCBldmVudHMgYXMgb2Ygbm93IGlmIGFza2VkIHRvXG5cdFx0Ly8gRG9uJ3QgZmlyZSBldmVudHMgaWYgalF1ZXJ5LmV2ZW50IGlzIHVuZGVmaW5lZCBpbiBhbiBBTUQtdXNhZ2Ugc2NlbmFyaW8gKCMxNTExOClcblx0XHRmaXJlR2xvYmFscyA9IGpRdWVyeS5ldmVudCAmJiBzLmdsb2JhbDtcblxuXHRcdC8vIFdhdGNoIGZvciBhIG5ldyBzZXQgb2YgcmVxdWVzdHNcblx0XHRpZiAoIGZpcmVHbG9iYWxzICYmIGpRdWVyeS5hY3RpdmUrKyA9PT0gMCApIHtcblx0XHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyKCBcImFqYXhTdGFydFwiICk7XG5cdFx0fVxuXG5cdFx0Ly8gVXBwZXJjYXNlIHRoZSB0eXBlXG5cdFx0cy50eXBlID0gcy50eXBlLnRvVXBwZXJDYXNlKCk7XG5cblx0XHQvLyBEZXRlcm1pbmUgaWYgcmVxdWVzdCBoYXMgY29udGVudFxuXHRcdHMuaGFzQ29udGVudCA9ICFybm9Db250ZW50LnRlc3QoIHMudHlwZSApO1xuXG5cdFx0Ly8gU2F2ZSB0aGUgVVJMIGluIGNhc2Ugd2UncmUgdG95aW5nIHdpdGggdGhlIElmLU1vZGlmaWVkLVNpbmNlXG5cdFx0Ly8gYW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyIGxhdGVyIG9uXG5cdFx0Y2FjaGVVUkwgPSBzLnVybDtcblxuXHRcdC8vIE1vcmUgb3B0aW9ucyBoYW5kbGluZyBmb3IgcmVxdWVzdHMgd2l0aCBubyBjb250ZW50XG5cdFx0aWYgKCAhcy5oYXNDb250ZW50ICkge1xuXG5cdFx0XHQvLyBJZiBkYXRhIGlzIGF2YWlsYWJsZSwgYXBwZW5kIGRhdGEgdG8gdXJsXG5cdFx0XHRpZiAoIHMuZGF0YSApIHtcblx0XHRcdFx0Y2FjaGVVUkwgPSAoIHMudXJsICs9ICggcnF1ZXJ5LnRlc3QoIGNhY2hlVVJMICkgPyBcIiZcIiA6IFwiP1wiICkgKyBzLmRhdGEgKTtcblxuXHRcdFx0XHQvLyAjOTY4MjogcmVtb3ZlIGRhdGEgc28gdGhhdCBpdCdzIG5vdCB1c2VkIGluIGFuIGV2ZW50dWFsIHJldHJ5XG5cdFx0XHRcdGRlbGV0ZSBzLmRhdGE7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEFkZCBhbnRpLWNhY2hlIGluIHVybCBpZiBuZWVkZWRcblx0XHRcdGlmICggcy5jYWNoZSA9PT0gZmFsc2UgKSB7XG5cdFx0XHRcdHMudXJsID0gcnRzLnRlc3QoIGNhY2hlVVJMICkgP1xuXG5cdFx0XHRcdFx0Ly8gSWYgdGhlcmUgaXMgYWxyZWFkeSBhICdfJyBwYXJhbWV0ZXIsIHNldCBpdHMgdmFsdWVcblx0XHRcdFx0XHRjYWNoZVVSTC5yZXBsYWNlKCBydHMsIFwiJDFfPVwiICsgbm9uY2UrKyApIDpcblxuXHRcdFx0XHRcdC8vIE90aGVyd2lzZSBhZGQgb25lIHRvIHRoZSBlbmRcblx0XHRcdFx0XHRjYWNoZVVSTCArICggcnF1ZXJ5LnRlc3QoIGNhY2hlVVJMICkgPyBcIiZcIiA6IFwiP1wiICkgKyBcIl89XCIgKyBub25jZSsrO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFNldCB0aGUgSWYtTW9kaWZpZWQtU2luY2UgYW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyLCBpZiBpbiBpZk1vZGlmaWVkIG1vZGUuXG5cdFx0aWYgKCBzLmlmTW9kaWZpZWQgKSB7XG5cdFx0XHRpZiAoIGpRdWVyeS5sYXN0TW9kaWZpZWRbIGNhY2hlVVJMIF0gKSB7XG5cdFx0XHRcdGpxWEhSLnNldFJlcXVlc3RIZWFkZXIoIFwiSWYtTW9kaWZpZWQtU2luY2VcIiwgalF1ZXJ5Lmxhc3RNb2RpZmllZFsgY2FjaGVVUkwgXSApO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCBqUXVlcnkuZXRhZ1sgY2FjaGVVUkwgXSApIHtcblx0XHRcdFx0anFYSFIuc2V0UmVxdWVzdEhlYWRlciggXCJJZi1Ob25lLU1hdGNoXCIsIGpRdWVyeS5ldGFnWyBjYWNoZVVSTCBdICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gU2V0IHRoZSBjb3JyZWN0IGhlYWRlciwgaWYgZGF0YSBpcyBiZWluZyBzZW50XG5cdFx0aWYgKCBzLmRhdGEgJiYgcy5oYXNDb250ZW50ICYmIHMuY29udGVudFR5cGUgIT09IGZhbHNlIHx8IG9wdGlvbnMuY29udGVudFR5cGUgKSB7XG5cdFx0XHRqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKCBcIkNvbnRlbnQtVHlwZVwiLCBzLmNvbnRlbnRUeXBlICk7XG5cdFx0fVxuXG5cdFx0Ly8gU2V0IHRoZSBBY2NlcHRzIGhlYWRlciBmb3IgdGhlIHNlcnZlciwgZGVwZW5kaW5nIG9uIHRoZSBkYXRhVHlwZVxuXHRcdGpxWEhSLnNldFJlcXVlc3RIZWFkZXIoXG5cdFx0XHRcIkFjY2VwdFwiLFxuXHRcdFx0cy5kYXRhVHlwZXNbIDAgXSAmJiBzLmFjY2VwdHNbIHMuZGF0YVR5cGVzWyAwIF0gXSA/XG5cdFx0XHRcdHMuYWNjZXB0c1sgcy5kYXRhVHlwZXNbIDAgXSBdICtcblx0XHRcdFx0XHQoIHMuZGF0YVR5cGVzWyAwIF0gIT09IFwiKlwiID8gXCIsIFwiICsgYWxsVHlwZXMgKyBcIjsgcT0wLjAxXCIgOiBcIlwiICkgOlxuXHRcdFx0XHRzLmFjY2VwdHNbIFwiKlwiIF1cblx0XHQpO1xuXG5cdFx0Ly8gQ2hlY2sgZm9yIGhlYWRlcnMgb3B0aW9uXG5cdFx0Zm9yICggaSBpbiBzLmhlYWRlcnMgKSB7XG5cdFx0XHRqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKCBpLCBzLmhlYWRlcnNbIGkgXSApO1xuXHRcdH1cblxuXHRcdC8vIEFsbG93IGN1c3RvbSBoZWFkZXJzL21pbWV0eXBlcyBhbmQgZWFybHkgYWJvcnRcblx0XHRpZiAoIHMuYmVmb3JlU2VuZCAmJlxuXHRcdFx0KCBzLmJlZm9yZVNlbmQuY2FsbCggY2FsbGJhY2tDb250ZXh0LCBqcVhIUiwgcyApID09PSBmYWxzZSB8fCBzdGF0ZSA9PT0gMiApICkge1xuXG5cdFx0XHQvLyBBYm9ydCBpZiBub3QgZG9uZSBhbHJlYWR5IGFuZCByZXR1cm5cblx0XHRcdHJldHVybiBqcVhIUi5hYm9ydCgpO1xuXHRcdH1cblxuXHRcdC8vIGFib3J0aW5nIGlzIG5vIGxvbmdlciBhIGNhbmNlbGxhdGlvblxuXHRcdHN0ckFib3J0ID0gXCJhYm9ydFwiO1xuXG5cdFx0Ly8gSW5zdGFsbCBjYWxsYmFja3Mgb24gZGVmZXJyZWRzXG5cdFx0Zm9yICggaSBpbiB7IHN1Y2Nlc3M6IDEsIGVycm9yOiAxLCBjb21wbGV0ZTogMSB9ICkge1xuXHRcdFx0anFYSFJbIGkgXSggc1sgaSBdICk7XG5cdFx0fVxuXG5cdFx0Ly8gR2V0IHRyYW5zcG9ydFxuXHRcdHRyYW5zcG9ydCA9IGluc3BlY3RQcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCB0cmFuc3BvcnRzLCBzLCBvcHRpb25zLCBqcVhIUiApO1xuXG5cdFx0Ly8gSWYgbm8gdHJhbnNwb3J0LCB3ZSBhdXRvLWFib3J0XG5cdFx0aWYgKCAhdHJhbnNwb3J0ICkge1xuXHRcdFx0ZG9uZSggLTEsIFwiTm8gVHJhbnNwb3J0XCIgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0anFYSFIucmVhZHlTdGF0ZSA9IDE7XG5cblx0XHRcdC8vIFNlbmQgZ2xvYmFsIGV2ZW50XG5cdFx0XHRpZiAoIGZpcmVHbG9iYWxzICkge1xuXHRcdFx0XHRnbG9iYWxFdmVudENvbnRleHQudHJpZ2dlciggXCJhamF4U2VuZFwiLCBbIGpxWEhSLCBzIF0gKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gSWYgcmVxdWVzdCB3YXMgYWJvcnRlZCBpbnNpZGUgYWpheFNlbmQsIHN0b3AgdGhlcmVcblx0XHRcdGlmICggc3RhdGUgPT09IDIgKSB7XG5cdFx0XHRcdHJldHVybiBqcVhIUjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gVGltZW91dFxuXHRcdFx0aWYgKCBzLmFzeW5jICYmIHMudGltZW91dCA+IDAgKSB7XG5cdFx0XHRcdHRpbWVvdXRUaW1lciA9IHdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRqcVhIUi5hYm9ydCggXCJ0aW1lb3V0XCIgKTtcblx0XHRcdFx0fSwgcy50aW1lb3V0ICk7XG5cdFx0XHR9XG5cblx0XHRcdHRyeSB7XG5cdFx0XHRcdHN0YXRlID0gMTtcblx0XHRcdFx0dHJhbnNwb3J0LnNlbmQoIHJlcXVlc3RIZWFkZXJzLCBkb25lICk7XG5cdFx0XHR9IGNhdGNoICggZSApIHtcblxuXHRcdFx0XHQvLyBQcm9wYWdhdGUgZXhjZXB0aW9uIGFzIGVycm9yIGlmIG5vdCBkb25lXG5cdFx0XHRcdGlmICggc3RhdGUgPCAyICkge1xuXHRcdFx0XHRcdGRvbmUoIC0xLCBlICk7XG5cblx0XHRcdFx0Ly8gU2ltcGx5IHJldGhyb3cgb3RoZXJ3aXNlXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGhyb3cgZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIENhbGxiYWNrIGZvciB3aGVuIGV2ZXJ5dGhpbmcgaXMgZG9uZVxuXHRcdGZ1bmN0aW9uIGRvbmUoIHN0YXR1cywgbmF0aXZlU3RhdHVzVGV4dCwgcmVzcG9uc2VzLCBoZWFkZXJzICkge1xuXHRcdFx0dmFyIGlzU3VjY2Vzcywgc3VjY2VzcywgZXJyb3IsIHJlc3BvbnNlLCBtb2RpZmllZCxcblx0XHRcdFx0c3RhdHVzVGV4dCA9IG5hdGl2ZVN0YXR1c1RleHQ7XG5cblx0XHRcdC8vIENhbGxlZCBvbmNlXG5cdFx0XHRpZiAoIHN0YXRlID09PSAyICkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN0YXRlIGlzIFwiZG9uZVwiIG5vd1xuXHRcdFx0c3RhdGUgPSAyO1xuXG5cdFx0XHQvLyBDbGVhciB0aW1lb3V0IGlmIGl0IGV4aXN0c1xuXHRcdFx0aWYgKCB0aW1lb3V0VGltZXIgKSB7XG5cdFx0XHRcdHdpbmRvdy5jbGVhclRpbWVvdXQoIHRpbWVvdXRUaW1lciApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBEZXJlZmVyZW5jZSB0cmFuc3BvcnQgZm9yIGVhcmx5IGdhcmJhZ2UgY29sbGVjdGlvblxuXHRcdFx0Ly8gKG5vIG1hdHRlciBob3cgbG9uZyB0aGUganFYSFIgb2JqZWN0IHdpbGwgYmUgdXNlZClcblx0XHRcdHRyYW5zcG9ydCA9IHVuZGVmaW5lZDtcblxuXHRcdFx0Ly8gQ2FjaGUgcmVzcG9uc2UgaGVhZGVyc1xuXHRcdFx0cmVzcG9uc2VIZWFkZXJzU3RyaW5nID0gaGVhZGVycyB8fCBcIlwiO1xuXG5cdFx0XHQvLyBTZXQgcmVhZHlTdGF0ZVxuXHRcdFx0anFYSFIucmVhZHlTdGF0ZSA9IHN0YXR1cyA+IDAgPyA0IDogMDtcblxuXHRcdFx0Ly8gRGV0ZXJtaW5lIGlmIHN1Y2Nlc3NmdWxcblx0XHRcdGlzU3VjY2VzcyA9IHN0YXR1cyA+PSAyMDAgJiYgc3RhdHVzIDwgMzAwIHx8IHN0YXR1cyA9PT0gMzA0O1xuXG5cdFx0XHQvLyBHZXQgcmVzcG9uc2UgZGF0YVxuXHRcdFx0aWYgKCByZXNwb25zZXMgKSB7XG5cdFx0XHRcdHJlc3BvbnNlID0gYWpheEhhbmRsZVJlc3BvbnNlcyggcywganFYSFIsIHJlc3BvbnNlcyApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDb252ZXJ0IG5vIG1hdHRlciB3aGF0ICh0aGF0IHdheSByZXNwb25zZVhYWCBmaWVsZHMgYXJlIGFsd2F5cyBzZXQpXG5cdFx0XHRyZXNwb25zZSA9IGFqYXhDb252ZXJ0KCBzLCByZXNwb25zZSwganFYSFIsIGlzU3VjY2VzcyApO1xuXG5cdFx0XHQvLyBJZiBzdWNjZXNzZnVsLCBoYW5kbGUgdHlwZSBjaGFpbmluZ1xuXHRcdFx0aWYgKCBpc1N1Y2Nlc3MgKSB7XG5cblx0XHRcdFx0Ly8gU2V0IHRoZSBJZi1Nb2RpZmllZC1TaW5jZSBhbmQvb3IgSWYtTm9uZS1NYXRjaCBoZWFkZXIsIGlmIGluIGlmTW9kaWZpZWQgbW9kZS5cblx0XHRcdFx0aWYgKCBzLmlmTW9kaWZpZWQgKSB7XG5cdFx0XHRcdFx0bW9kaWZpZWQgPSBqcVhIUi5nZXRSZXNwb25zZUhlYWRlciggXCJMYXN0LU1vZGlmaWVkXCIgKTtcblx0XHRcdFx0XHRpZiAoIG1vZGlmaWVkICkge1xuXHRcdFx0XHRcdFx0alF1ZXJ5Lmxhc3RNb2RpZmllZFsgY2FjaGVVUkwgXSA9IG1vZGlmaWVkO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRtb2RpZmllZCA9IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVyKCBcImV0YWdcIiApO1xuXHRcdFx0XHRcdGlmICggbW9kaWZpZWQgKSB7XG5cdFx0XHRcdFx0XHRqUXVlcnkuZXRhZ1sgY2FjaGVVUkwgXSA9IG1vZGlmaWVkO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIGlmIG5vIGNvbnRlbnRcblx0XHRcdFx0aWYgKCBzdGF0dXMgPT09IDIwNCB8fCBzLnR5cGUgPT09IFwiSEVBRFwiICkge1xuXHRcdFx0XHRcdHN0YXR1c1RleHQgPSBcIm5vY29udGVudFwiO1xuXG5cdFx0XHRcdC8vIGlmIG5vdCBtb2RpZmllZFxuXHRcdFx0XHR9IGVsc2UgaWYgKCBzdGF0dXMgPT09IDMwNCApIHtcblx0XHRcdFx0XHRzdGF0dXNUZXh0ID0gXCJub3Rtb2RpZmllZFwiO1xuXG5cdFx0XHRcdC8vIElmIHdlIGhhdmUgZGF0YSwgbGV0J3MgY29udmVydCBpdFxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHN0YXR1c1RleHQgPSByZXNwb25zZS5zdGF0ZTtcblx0XHRcdFx0XHRzdWNjZXNzID0gcmVzcG9uc2UuZGF0YTtcblx0XHRcdFx0XHRlcnJvciA9IHJlc3BvbnNlLmVycm9yO1xuXHRcdFx0XHRcdGlzU3VjY2VzcyA9ICFlcnJvcjtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBXZSBleHRyYWN0IGVycm9yIGZyb20gc3RhdHVzVGV4dFxuXHRcdFx0XHQvLyB0aGVuIG5vcm1hbGl6ZSBzdGF0dXNUZXh0IGFuZCBzdGF0dXMgZm9yIG5vbi1hYm9ydHNcblx0XHRcdFx0ZXJyb3IgPSBzdGF0dXNUZXh0O1xuXHRcdFx0XHRpZiAoIHN0YXR1cyB8fCAhc3RhdHVzVGV4dCApIHtcblx0XHRcdFx0XHRzdGF0dXNUZXh0ID0gXCJlcnJvclwiO1xuXHRcdFx0XHRcdGlmICggc3RhdHVzIDwgMCApIHtcblx0XHRcdFx0XHRcdHN0YXR1cyA9IDA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFNldCBkYXRhIGZvciB0aGUgZmFrZSB4aHIgb2JqZWN0XG5cdFx0XHRqcVhIUi5zdGF0dXMgPSBzdGF0dXM7XG5cdFx0XHRqcVhIUi5zdGF0dXNUZXh0ID0gKCBuYXRpdmVTdGF0dXNUZXh0IHx8IHN0YXR1c1RleHQgKSArIFwiXCI7XG5cblx0XHRcdC8vIFN1Y2Nlc3MvRXJyb3Jcblx0XHRcdGlmICggaXNTdWNjZXNzICkge1xuXHRcdFx0XHRkZWZlcnJlZC5yZXNvbHZlV2l0aCggY2FsbGJhY2tDb250ZXh0LCBbIHN1Y2Nlc3MsIHN0YXR1c1RleHQsIGpxWEhSIF0gKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGRlZmVycmVkLnJlamVjdFdpdGgoIGNhbGxiYWNrQ29udGV4dCwgWyBqcVhIUiwgc3RhdHVzVGV4dCwgZXJyb3IgXSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdGF0dXMtZGVwZW5kZW50IGNhbGxiYWNrc1xuXHRcdFx0anFYSFIuc3RhdHVzQ29kZSggc3RhdHVzQ29kZSApO1xuXHRcdFx0c3RhdHVzQ29kZSA9IHVuZGVmaW5lZDtcblxuXHRcdFx0aWYgKCBmaXJlR2xvYmFscyApIHtcblx0XHRcdFx0Z2xvYmFsRXZlbnRDb250ZXh0LnRyaWdnZXIoIGlzU3VjY2VzcyA/IFwiYWpheFN1Y2Nlc3NcIiA6IFwiYWpheEVycm9yXCIsXG5cdFx0XHRcdFx0WyBqcVhIUiwgcywgaXNTdWNjZXNzID8gc3VjY2VzcyA6IGVycm9yIF0gKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ29tcGxldGVcblx0XHRcdGNvbXBsZXRlRGVmZXJyZWQuZmlyZVdpdGgoIGNhbGxiYWNrQ29udGV4dCwgWyBqcVhIUiwgc3RhdHVzVGV4dCBdICk7XG5cblx0XHRcdGlmICggZmlyZUdsb2JhbHMgKSB7XG5cdFx0XHRcdGdsb2JhbEV2ZW50Q29udGV4dC50cmlnZ2VyKCBcImFqYXhDb21wbGV0ZVwiLCBbIGpxWEhSLCBzIF0gKTtcblxuXHRcdFx0XHQvLyBIYW5kbGUgdGhlIGdsb2JhbCBBSkFYIGNvdW50ZXJcblx0XHRcdFx0aWYgKCAhKCAtLWpRdWVyeS5hY3RpdmUgKSApIHtcblx0XHRcdFx0XHRqUXVlcnkuZXZlbnQudHJpZ2dlciggXCJhamF4U3RvcFwiICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4ganFYSFI7XG5cdH0sXG5cblx0Z2V0SlNPTjogZnVuY3Rpb24oIHVybCwgZGF0YSwgY2FsbGJhY2sgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5nZXQoIHVybCwgZGF0YSwgY2FsbGJhY2ssIFwianNvblwiICk7XG5cdH0sXG5cblx0Z2V0U2NyaXB0OiBmdW5jdGlvbiggdXJsLCBjYWxsYmFjayApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmdldCggdXJsLCB1bmRlZmluZWQsIGNhbGxiYWNrLCBcInNjcmlwdFwiICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmVhY2goIFsgXCJnZXRcIiwgXCJwb3N0XCIgXSwgZnVuY3Rpb24oIGksIG1ldGhvZCApIHtcblx0alF1ZXJ5WyBtZXRob2QgXSA9IGZ1bmN0aW9uKCB1cmwsIGRhdGEsIGNhbGxiYWNrLCB0eXBlICkge1xuXG5cdFx0Ly8gc2hpZnQgYXJndW1lbnRzIGlmIGRhdGEgYXJndW1lbnQgd2FzIG9taXR0ZWRcblx0XHRpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBkYXRhICkgKSB7XG5cdFx0XHR0eXBlID0gdHlwZSB8fCBjYWxsYmFjaztcblx0XHRcdGNhbGxiYWNrID0gZGF0YTtcblx0XHRcdGRhdGEgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0Ly8gVGhlIHVybCBjYW4gYmUgYW4gb3B0aW9ucyBvYmplY3QgKHdoaWNoIHRoZW4gbXVzdCBoYXZlIC51cmwpXG5cdFx0cmV0dXJuIGpRdWVyeS5hamF4KCBqUXVlcnkuZXh0ZW5kKCB7XG5cdFx0XHR1cmw6IHVybCxcblx0XHRcdHR5cGU6IG1ldGhvZCxcblx0XHRcdGRhdGFUeXBlOiB0eXBlLFxuXHRcdFx0ZGF0YTogZGF0YSxcblx0XHRcdHN1Y2Nlc3M6IGNhbGxiYWNrXG5cdFx0fSwgalF1ZXJ5LmlzUGxhaW5PYmplY3QoIHVybCApICYmIHVybCApICk7XG5cdH07XG59ICk7XG5cblxualF1ZXJ5Ll9ldmFsVXJsID0gZnVuY3Rpb24oIHVybCApIHtcblx0cmV0dXJuIGpRdWVyeS5hamF4KCB7XG5cdFx0dXJsOiB1cmwsXG5cblx0XHQvLyBNYWtlIHRoaXMgZXhwbGljaXQsIHNpbmNlIHVzZXIgY2FuIG92ZXJyaWRlIHRoaXMgdGhyb3VnaCBhamF4U2V0dXAgKCMxMTI2NClcblx0XHR0eXBlOiBcIkdFVFwiLFxuXHRcdGRhdGFUeXBlOiBcInNjcmlwdFwiLFxuXHRcdGNhY2hlOiB0cnVlLFxuXHRcdGFzeW5jOiBmYWxzZSxcblx0XHRnbG9iYWw6IGZhbHNlLFxuXHRcdFwidGhyb3dzXCI6IHRydWVcblx0fSApO1xufTtcblxuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdHdyYXBBbGw6IGZ1bmN0aW9uKCBodG1sICkge1xuXHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGh0bWwgKSApIHtcblx0XHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCBpICkge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS53cmFwQWxsKCBodG1sLmNhbGwoIHRoaXMsIGkgKSApO1xuXHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdGlmICggdGhpc1sgMCBdICkge1xuXG5cdFx0XHQvLyBUaGUgZWxlbWVudHMgdG8gd3JhcCB0aGUgdGFyZ2V0IGFyb3VuZFxuXHRcdFx0dmFyIHdyYXAgPSBqUXVlcnkoIGh0bWwsIHRoaXNbIDAgXS5vd25lckRvY3VtZW50ICkuZXEoIDAgKS5jbG9uZSggdHJ1ZSApO1xuXG5cdFx0XHRpZiAoIHRoaXNbIDAgXS5wYXJlbnROb2RlICkge1xuXHRcdFx0XHR3cmFwLmluc2VydEJlZm9yZSggdGhpc1sgMCBdICk7XG5cdFx0XHR9XG5cblx0XHRcdHdyYXAubWFwKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIGVsZW0gPSB0aGlzO1xuXG5cdFx0XHRcdHdoaWxlICggZWxlbS5maXJzdENoaWxkICYmIGVsZW0uZmlyc3RDaGlsZC5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRcdFx0XHRlbGVtID0gZWxlbS5maXJzdENoaWxkO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIGVsZW07XG5cdFx0XHR9ICkuYXBwZW5kKCB0aGlzICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0d3JhcElubmVyOiBmdW5jdGlvbiggaHRtbCApIHtcblx0XHRpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBodG1sICkgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaSApIHtcblx0XHRcdFx0alF1ZXJ5KCB0aGlzICkud3JhcElubmVyKCBodG1sLmNhbGwoIHRoaXMsIGkgKSApO1xuXHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIHNlbGYgPSBqUXVlcnkoIHRoaXMgKSxcblx0XHRcdFx0Y29udGVudHMgPSBzZWxmLmNvbnRlbnRzKCk7XG5cblx0XHRcdGlmICggY29udGVudHMubGVuZ3RoICkge1xuXHRcdFx0XHRjb250ZW50cy53cmFwQWxsKCBodG1sICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHNlbGYuYXBwZW5kKCBodG1sICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXG5cdHdyYXA6IGZ1bmN0aW9uKCBodG1sICkge1xuXHRcdHZhciBpc0Z1bmN0aW9uID0galF1ZXJ5LmlzRnVuY3Rpb24oIGh0bWwgKTtcblxuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCBpICkge1xuXHRcdFx0alF1ZXJ5KCB0aGlzICkud3JhcEFsbCggaXNGdW5jdGlvbiA/IGh0bWwuY2FsbCggdGhpcywgaSApIDogaHRtbCApO1xuXHRcdH0gKTtcblx0fSxcblxuXHR1bndyYXA6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLnBhcmVudCgpLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYgKCAhalF1ZXJ5Lm5vZGVOYW1lKCB0aGlzLCBcImJvZHlcIiApICkge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS5yZXBsYWNlV2l0aCggdGhpcy5jaGlsZE5vZGVzICk7XG5cdFx0XHR9XG5cdFx0fSApLmVuZCgpO1xuXHR9XG59ICk7XG5cblxuZnVuY3Rpb24gZ2V0RGlzcGxheSggZWxlbSApIHtcblx0cmV0dXJuIGVsZW0uc3R5bGUgJiYgZWxlbS5zdHlsZS5kaXNwbGF5IHx8IGpRdWVyeS5jc3MoIGVsZW0sIFwiZGlzcGxheVwiICk7XG59XG5cbmZ1bmN0aW9uIGZpbHRlckhpZGRlbiggZWxlbSApIHtcblxuXHQvLyBEaXNjb25uZWN0ZWQgZWxlbWVudHMgYXJlIGNvbnNpZGVyZWQgaGlkZGVuXG5cdGlmICggIWpRdWVyeS5jb250YWlucyggZWxlbS5vd25lckRvY3VtZW50IHx8IGRvY3VtZW50LCBlbGVtICkgKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblx0d2hpbGUgKCBlbGVtICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0aWYgKCBnZXREaXNwbGF5KCBlbGVtICkgPT09IFwibm9uZVwiIHx8IGVsZW0udHlwZSA9PT0gXCJoaWRkZW5cIiApIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0XHRlbGVtID0gZWxlbS5wYXJlbnROb2RlO1xuXHR9XG5cdHJldHVybiBmYWxzZTtcbn1cblxualF1ZXJ5LmV4cHIuZmlsdGVycy5oaWRkZW4gPSBmdW5jdGlvbiggZWxlbSApIHtcblxuXHQvLyBTdXBwb3J0OiBPcGVyYSA8PSAxMi4xMlxuXHQvLyBPcGVyYSByZXBvcnRzIG9mZnNldFdpZHRocyBhbmQgb2Zmc2V0SGVpZ2h0cyBsZXNzIHRoYW4gemVybyBvbiBzb21lIGVsZW1lbnRzXG5cdHJldHVybiBzdXBwb3J0LnJlbGlhYmxlSGlkZGVuT2Zmc2V0cygpID9cblx0XHQoIGVsZW0ub2Zmc2V0V2lkdGggPD0gMCAmJiBlbGVtLm9mZnNldEhlaWdodCA8PSAwICYmXG5cdFx0XHQhZWxlbS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCApIDpcblx0XHRcdGZpbHRlckhpZGRlbiggZWxlbSApO1xufTtcblxualF1ZXJ5LmV4cHIuZmlsdGVycy52aXNpYmxlID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdHJldHVybiAhalF1ZXJ5LmV4cHIuZmlsdGVycy5oaWRkZW4oIGVsZW0gKTtcbn07XG5cblxuXG5cbnZhciByMjAgPSAvJTIwL2csXG5cdHJicmFja2V0ID0gL1xcW1xcXSQvLFxuXHRyQ1JMRiA9IC9cXHI/XFxuL2csXG5cdHJzdWJtaXR0ZXJUeXBlcyA9IC9eKD86c3VibWl0fGJ1dHRvbnxpbWFnZXxyZXNldHxmaWxlKSQvaSxcblx0cnN1Ym1pdHRhYmxlID0gL14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8a2V5Z2VuKS9pO1xuXG5mdW5jdGlvbiBidWlsZFBhcmFtcyggcHJlZml4LCBvYmosIHRyYWRpdGlvbmFsLCBhZGQgKSB7XG5cdHZhciBuYW1lO1xuXG5cdGlmICggalF1ZXJ5LmlzQXJyYXkoIG9iaiApICkge1xuXG5cdFx0Ly8gU2VyaWFsaXplIGFycmF5IGl0ZW0uXG5cdFx0alF1ZXJ5LmVhY2goIG9iaiwgZnVuY3Rpb24oIGksIHYgKSB7XG5cdFx0XHRpZiAoIHRyYWRpdGlvbmFsIHx8IHJicmFja2V0LnRlc3QoIHByZWZpeCApICkge1xuXG5cdFx0XHRcdC8vIFRyZWF0IGVhY2ggYXJyYXkgaXRlbSBhcyBhIHNjYWxhci5cblx0XHRcdFx0YWRkKCBwcmVmaXgsIHYgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBJdGVtIGlzIG5vbi1zY2FsYXIgKGFycmF5IG9yIG9iamVjdCksIGVuY29kZSBpdHMgbnVtZXJpYyBpbmRleC5cblx0XHRcdFx0YnVpbGRQYXJhbXMoXG5cdFx0XHRcdFx0cHJlZml4ICsgXCJbXCIgKyAoIHR5cGVvZiB2ID09PSBcIm9iamVjdFwiICYmIHYgIT0gbnVsbCA/IGkgOiBcIlwiICkgKyBcIl1cIixcblx0XHRcdFx0XHR2LFxuXHRcdFx0XHRcdHRyYWRpdGlvbmFsLFxuXHRcdFx0XHRcdGFkZFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH0gKTtcblxuXHR9IGVsc2UgaWYgKCAhdHJhZGl0aW9uYWwgJiYgalF1ZXJ5LnR5cGUoIG9iaiApID09PSBcIm9iamVjdFwiICkge1xuXG5cdFx0Ly8gU2VyaWFsaXplIG9iamVjdCBpdGVtLlxuXHRcdGZvciAoIG5hbWUgaW4gb2JqICkge1xuXHRcdFx0YnVpbGRQYXJhbXMoIHByZWZpeCArIFwiW1wiICsgbmFtZSArIFwiXVwiLCBvYmpbIG5hbWUgXSwgdHJhZGl0aW9uYWwsIGFkZCApO1xuXHRcdH1cblxuXHR9IGVsc2Uge1xuXG5cdFx0Ly8gU2VyaWFsaXplIHNjYWxhciBpdGVtLlxuXHRcdGFkZCggcHJlZml4LCBvYmogKTtcblx0fVxufVxuXG4vLyBTZXJpYWxpemUgYW4gYXJyYXkgb2YgZm9ybSBlbGVtZW50cyBvciBhIHNldCBvZlxuLy8ga2V5L3ZhbHVlcyBpbnRvIGEgcXVlcnkgc3RyaW5nXG5qUXVlcnkucGFyYW0gPSBmdW5jdGlvbiggYSwgdHJhZGl0aW9uYWwgKSB7XG5cdHZhciBwcmVmaXgsXG5cdFx0cyA9IFtdLFxuXHRcdGFkZCA9IGZ1bmN0aW9uKCBrZXksIHZhbHVlICkge1xuXG5cdFx0XHQvLyBJZiB2YWx1ZSBpcyBhIGZ1bmN0aW9uLCBpbnZva2UgaXQgYW5kIHJldHVybiBpdHMgdmFsdWVcblx0XHRcdHZhbHVlID0galF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgPyB2YWx1ZSgpIDogKCB2YWx1ZSA9PSBudWxsID8gXCJcIiA6IHZhbHVlICk7XG5cdFx0XHRzWyBzLmxlbmd0aCBdID0gZW5jb2RlVVJJQ29tcG9uZW50KCBrZXkgKSArIFwiPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KCB2YWx1ZSApO1xuXHRcdH07XG5cblx0Ly8gU2V0IHRyYWRpdGlvbmFsIHRvIHRydWUgZm9yIGpRdWVyeSA8PSAxLjMuMiBiZWhhdmlvci5cblx0aWYgKCB0cmFkaXRpb25hbCA9PT0gdW5kZWZpbmVkICkge1xuXHRcdHRyYWRpdGlvbmFsID0galF1ZXJ5LmFqYXhTZXR0aW5ncyAmJiBqUXVlcnkuYWpheFNldHRpbmdzLnRyYWRpdGlvbmFsO1xuXHR9XG5cblx0Ly8gSWYgYW4gYXJyYXkgd2FzIHBhc3NlZCBpbiwgYXNzdW1lIHRoYXQgaXQgaXMgYW4gYXJyYXkgb2YgZm9ybSBlbGVtZW50cy5cblx0aWYgKCBqUXVlcnkuaXNBcnJheSggYSApIHx8ICggYS5qcXVlcnkgJiYgIWpRdWVyeS5pc1BsYWluT2JqZWN0KCBhICkgKSApIHtcblxuXHRcdC8vIFNlcmlhbGl6ZSB0aGUgZm9ybSBlbGVtZW50c1xuXHRcdGpRdWVyeS5lYWNoKCBhLCBmdW5jdGlvbigpIHtcblx0XHRcdGFkZCggdGhpcy5uYW1lLCB0aGlzLnZhbHVlICk7XG5cdFx0fSApO1xuXG5cdH0gZWxzZSB7XG5cblx0XHQvLyBJZiB0cmFkaXRpb25hbCwgZW5jb2RlIHRoZSBcIm9sZFwiIHdheSAodGhlIHdheSAxLjMuMiBvciBvbGRlclxuXHRcdC8vIGRpZCBpdCksIG90aGVyd2lzZSBlbmNvZGUgcGFyYW1zIHJlY3Vyc2l2ZWx5LlxuXHRcdGZvciAoIHByZWZpeCBpbiBhICkge1xuXHRcdFx0YnVpbGRQYXJhbXMoIHByZWZpeCwgYVsgcHJlZml4IF0sIHRyYWRpdGlvbmFsLCBhZGQgKTtcblx0XHR9XG5cdH1cblxuXHQvLyBSZXR1cm4gdGhlIHJlc3VsdGluZyBzZXJpYWxpemF0aW9uXG5cdHJldHVybiBzLmpvaW4oIFwiJlwiICkucmVwbGFjZSggcjIwLCBcIitcIiApO1xufTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRzZXJpYWxpemU6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBqUXVlcnkucGFyYW0oIHRoaXMuc2VyaWFsaXplQXJyYXkoKSApO1xuXHR9LFxuXHRzZXJpYWxpemVBcnJheTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMubWFwKCBmdW5jdGlvbigpIHtcblxuXHRcdFx0Ly8gQ2FuIGFkZCBwcm9wSG9vayBmb3IgXCJlbGVtZW50c1wiIHRvIGZpbHRlciBvciBhZGQgZm9ybSBlbGVtZW50c1xuXHRcdFx0dmFyIGVsZW1lbnRzID0galF1ZXJ5LnByb3AoIHRoaXMsIFwiZWxlbWVudHNcIiApO1xuXHRcdFx0cmV0dXJuIGVsZW1lbnRzID8galF1ZXJ5Lm1ha2VBcnJheSggZWxlbWVudHMgKSA6IHRoaXM7XG5cdFx0fSApXG5cdFx0LmZpbHRlciggZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgdHlwZSA9IHRoaXMudHlwZTtcblxuXHRcdFx0Ly8gVXNlIC5pcyhcIjpkaXNhYmxlZFwiKSBzbyB0aGF0IGZpZWxkc2V0W2Rpc2FibGVkXSB3b3Jrc1xuXHRcdFx0cmV0dXJuIHRoaXMubmFtZSAmJiAhalF1ZXJ5KCB0aGlzICkuaXMoIFwiOmRpc2FibGVkXCIgKSAmJlxuXHRcdFx0XHRyc3VibWl0dGFibGUudGVzdCggdGhpcy5ub2RlTmFtZSApICYmICFyc3VibWl0dGVyVHlwZXMudGVzdCggdHlwZSApICYmXG5cdFx0XHRcdCggdGhpcy5jaGVja2VkIHx8ICFyY2hlY2thYmxlVHlwZS50ZXN0KCB0eXBlICkgKTtcblx0XHR9IClcblx0XHQubWFwKCBmdW5jdGlvbiggaSwgZWxlbSApIHtcblx0XHRcdHZhciB2YWwgPSBqUXVlcnkoIHRoaXMgKS52YWwoKTtcblxuXHRcdFx0cmV0dXJuIHZhbCA9PSBudWxsID9cblx0XHRcdFx0bnVsbCA6XG5cdFx0XHRcdGpRdWVyeS5pc0FycmF5KCB2YWwgKSA/XG5cdFx0XHRcdFx0alF1ZXJ5Lm1hcCggdmFsLCBmdW5jdGlvbiggdmFsICkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHsgbmFtZTogZWxlbS5uYW1lLCB2YWx1ZTogdmFsLnJlcGxhY2UoIHJDUkxGLCBcIlxcclxcblwiICkgfTtcblx0XHRcdFx0XHR9ICkgOlxuXHRcdFx0XHRcdHsgbmFtZTogZWxlbS5uYW1lLCB2YWx1ZTogdmFsLnJlcGxhY2UoIHJDUkxGLCBcIlxcclxcblwiICkgfTtcblx0XHR9ICkuZ2V0KCk7XG5cdH1cbn0gKTtcblxuXG4vLyBDcmVhdGUgdGhlIHJlcXVlc3Qgb2JqZWN0XG4vLyAoVGhpcyBpcyBzdGlsbCBhdHRhY2hlZCB0byBhamF4U2V0dGluZ3MgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkpXG5qUXVlcnkuYWpheFNldHRpbmdzLnhociA9IHdpbmRvdy5BY3RpdmVYT2JqZWN0ICE9PSB1bmRlZmluZWQgP1xuXG5cdC8vIFN1cHBvcnQ6IElFNi1JRThcblx0ZnVuY3Rpb24oKSB7XG5cblx0XHQvLyBYSFIgY2Fubm90IGFjY2VzcyBsb2NhbCBmaWxlcywgYWx3YXlzIHVzZSBBY3RpdmVYIGZvciB0aGF0IGNhc2Vcblx0XHRpZiAoIHRoaXMuaXNMb2NhbCApIHtcblx0XHRcdHJldHVybiBjcmVhdGVBY3RpdmVYSFIoKTtcblx0XHR9XG5cblx0XHQvLyBTdXBwb3J0OiBJRSA5LTExXG5cdFx0Ly8gSUUgc2VlbXMgdG8gZXJyb3Igb24gY3Jvc3MtZG9tYWluIFBBVENIIHJlcXVlc3RzIHdoZW4gQWN0aXZlWCBYSFJcblx0XHQvLyBpcyB1c2VkLiBJbiBJRSA5KyBhbHdheXMgdXNlIHRoZSBuYXRpdmUgWEhSLlxuXHRcdC8vIE5vdGU6IHRoaXMgY29uZGl0aW9uIHdvbid0IGNhdGNoIEVkZ2UgYXMgaXQgZG9lc24ndCBkZWZpbmVcblx0XHQvLyBkb2N1bWVudC5kb2N1bWVudE1vZGUgYnV0IGl0IGFsc28gZG9lc24ndCBzdXBwb3J0IEFjdGl2ZVggc28gaXQgd29uJ3Rcblx0XHQvLyByZWFjaCB0aGlzIGNvZGUuXG5cdFx0aWYgKCBkb2N1bWVudC5kb2N1bWVudE1vZGUgPiA4ICkge1xuXHRcdFx0cmV0dXJuIGNyZWF0ZVN0YW5kYXJkWEhSKCk7XG5cdFx0fVxuXG5cdFx0Ly8gU3VwcG9ydDogSUU8OVxuXHRcdC8vIG9sZElFIFhIUiBkb2VzIG5vdCBzdXBwb3J0IG5vbi1SRkMyNjE2IG1ldGhvZHMgKCMxMzI0MClcblx0XHQvLyBTZWUgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2llL21zNTM2NjQ4KHY9dnMuODUpLmFzcHhcblx0XHQvLyBhbmQgaHR0cDovL3d3dy53My5vcmcvUHJvdG9jb2xzL3JmYzI2MTYvcmZjMjYxNi1zZWM5Lmh0bWwjc2VjOVxuXHRcdC8vIEFsdGhvdWdoIHRoaXMgY2hlY2sgZm9yIHNpeCBtZXRob2RzIGluc3RlYWQgb2YgZWlnaHRcblx0XHQvLyBzaW5jZSBJRSBhbHNvIGRvZXMgbm90IHN1cHBvcnQgXCJ0cmFjZVwiIGFuZCBcImNvbm5lY3RcIlxuXHRcdHJldHVybiAvXihnZXR8cG9zdHxoZWFkfHB1dHxkZWxldGV8b3B0aW9ucykkL2kudGVzdCggdGhpcy50eXBlICkgJiZcblx0XHRcdGNyZWF0ZVN0YW5kYXJkWEhSKCkgfHwgY3JlYXRlQWN0aXZlWEhSKCk7XG5cdH0gOlxuXG5cdC8vIEZvciBhbGwgb3RoZXIgYnJvd3NlcnMsIHVzZSB0aGUgc3RhbmRhcmQgWE1MSHR0cFJlcXVlc3Qgb2JqZWN0XG5cdGNyZWF0ZVN0YW5kYXJkWEhSO1xuXG52YXIgeGhySWQgPSAwLFxuXHR4aHJDYWxsYmFja3MgPSB7fSxcblx0eGhyU3VwcG9ydGVkID0galF1ZXJ5LmFqYXhTZXR0aW5ncy54aHIoKTtcblxuLy8gU3VwcG9ydDogSUU8MTBcbi8vIE9wZW4gcmVxdWVzdHMgbXVzdCBiZSBtYW51YWxseSBhYm9ydGVkIG9uIHVubG9hZCAoIzUyODApXG4vLyBTZWUgaHR0cHM6Ly9zdXBwb3J0Lm1pY3Jvc29mdC5jb20va2IvMjg1Njc0NiBmb3IgbW9yZSBpbmZvXG5pZiAoIHdpbmRvdy5hdHRhY2hFdmVudCApIHtcblx0d2luZG93LmF0dGFjaEV2ZW50KCBcIm9udW5sb2FkXCIsIGZ1bmN0aW9uKCkge1xuXHRcdGZvciAoIHZhciBrZXkgaW4geGhyQ2FsbGJhY2tzICkge1xuXHRcdFx0eGhyQ2FsbGJhY2tzWyBrZXkgXSggdW5kZWZpbmVkLCB0cnVlICk7XG5cdFx0fVxuXHR9ICk7XG59XG5cbi8vIERldGVybWluZSBzdXBwb3J0IHByb3BlcnRpZXNcbnN1cHBvcnQuY29ycyA9ICEheGhyU3VwcG9ydGVkICYmICggXCJ3aXRoQ3JlZGVudGlhbHNcIiBpbiB4aHJTdXBwb3J0ZWQgKTtcbnhoclN1cHBvcnRlZCA9IHN1cHBvcnQuYWpheCA9ICEheGhyU3VwcG9ydGVkO1xuXG4vLyBDcmVhdGUgdHJhbnNwb3J0IGlmIHRoZSBicm93c2VyIGNhbiBwcm92aWRlIGFuIHhoclxuaWYgKCB4aHJTdXBwb3J0ZWQgKSB7XG5cblx0alF1ZXJ5LmFqYXhUcmFuc3BvcnQoIGZ1bmN0aW9uKCBvcHRpb25zICkge1xuXG5cdFx0Ly8gQ3Jvc3MgZG9tYWluIG9ubHkgYWxsb3dlZCBpZiBzdXBwb3J0ZWQgdGhyb3VnaCBYTUxIdHRwUmVxdWVzdFxuXHRcdGlmICggIW9wdGlvbnMuY3Jvc3NEb21haW4gfHwgc3VwcG9ydC5jb3JzICkge1xuXG5cdFx0XHR2YXIgY2FsbGJhY2s7XG5cblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHNlbmQ6IGZ1bmN0aW9uKCBoZWFkZXJzLCBjb21wbGV0ZSApIHtcblx0XHRcdFx0XHR2YXIgaSxcblx0XHRcdFx0XHRcdHhociA9IG9wdGlvbnMueGhyKCksXG5cdFx0XHRcdFx0XHRpZCA9ICsreGhySWQ7XG5cblx0XHRcdFx0XHQvLyBPcGVuIHRoZSBzb2NrZXRcblx0XHRcdFx0XHR4aHIub3Blbihcblx0XHRcdFx0XHRcdG9wdGlvbnMudHlwZSxcblx0XHRcdFx0XHRcdG9wdGlvbnMudXJsLFxuXHRcdFx0XHRcdFx0b3B0aW9ucy5hc3luYyxcblx0XHRcdFx0XHRcdG9wdGlvbnMudXNlcm5hbWUsXG5cdFx0XHRcdFx0XHRvcHRpb25zLnBhc3N3b3JkXG5cdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdC8vIEFwcGx5IGN1c3RvbSBmaWVsZHMgaWYgcHJvdmlkZWRcblx0XHRcdFx0XHRpZiAoIG9wdGlvbnMueGhyRmllbGRzICkge1xuXHRcdFx0XHRcdFx0Zm9yICggaSBpbiBvcHRpb25zLnhockZpZWxkcyApIHtcblx0XHRcdFx0XHRcdFx0eGhyWyBpIF0gPSBvcHRpb25zLnhockZpZWxkc1sgaSBdO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIE92ZXJyaWRlIG1pbWUgdHlwZSBpZiBuZWVkZWRcblx0XHRcdFx0XHRpZiAoIG9wdGlvbnMubWltZVR5cGUgJiYgeGhyLm92ZXJyaWRlTWltZVR5cGUgKSB7XG5cdFx0XHRcdFx0XHR4aHIub3ZlcnJpZGVNaW1lVHlwZSggb3B0aW9ucy5taW1lVHlwZSApO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIFgtUmVxdWVzdGVkLVdpdGggaGVhZGVyXG5cdFx0XHRcdFx0Ly8gRm9yIGNyb3NzLWRvbWFpbiByZXF1ZXN0cywgc2VlaW5nIGFzIGNvbmRpdGlvbnMgZm9yIGEgcHJlZmxpZ2h0IGFyZVxuXHRcdFx0XHRcdC8vIGFraW4gdG8gYSBqaWdzYXcgcHV6emxlLCB3ZSBzaW1wbHkgbmV2ZXIgc2V0IGl0IHRvIGJlIHN1cmUuXG5cdFx0XHRcdFx0Ly8gKGl0IGNhbiBhbHdheXMgYmUgc2V0IG9uIGEgcGVyLXJlcXVlc3QgYmFzaXMgb3IgZXZlbiB1c2luZyBhamF4U2V0dXApXG5cdFx0XHRcdFx0Ly8gRm9yIHNhbWUtZG9tYWluIHJlcXVlc3RzLCB3b24ndCBjaGFuZ2UgaGVhZGVyIGlmIGFscmVhZHkgcHJvdmlkZWQuXG5cdFx0XHRcdFx0aWYgKCAhb3B0aW9ucy5jcm9zc0RvbWFpbiAmJiAhaGVhZGVyc1sgXCJYLVJlcXVlc3RlZC1XaXRoXCIgXSApIHtcblx0XHRcdFx0XHRcdGhlYWRlcnNbIFwiWC1SZXF1ZXN0ZWQtV2l0aFwiIF0gPSBcIlhNTEh0dHBSZXF1ZXN0XCI7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gU2V0IGhlYWRlcnNcblx0XHRcdFx0XHRmb3IgKCBpIGluIGhlYWRlcnMgKSB7XG5cblx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFPDlcblx0XHRcdFx0XHRcdC8vIElFJ3MgQWN0aXZlWE9iamVjdCB0aHJvd3MgYSAnVHlwZSBNaXNtYXRjaCcgZXhjZXB0aW9uIHdoZW4gc2V0dGluZ1xuXHRcdFx0XHRcdFx0Ly8gcmVxdWVzdCBoZWFkZXIgdG8gYSBudWxsLXZhbHVlLlxuXHRcdFx0XHRcdFx0Ly9cblx0XHRcdFx0XHRcdC8vIFRvIGtlZXAgY29uc2lzdGVudCB3aXRoIG90aGVyIFhIUiBpbXBsZW1lbnRhdGlvbnMsIGNhc3QgdGhlIHZhbHVlXG5cdFx0XHRcdFx0XHQvLyB0byBzdHJpbmcgYW5kIGlnbm9yZSBgdW5kZWZpbmVkYC5cblx0XHRcdFx0XHRcdGlmICggaGVhZGVyc1sgaSBdICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0XHRcdHhoci5zZXRSZXF1ZXN0SGVhZGVyKCBpLCBoZWFkZXJzWyBpIF0gKyBcIlwiICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gRG8gc2VuZCB0aGUgcmVxdWVzdFxuXHRcdFx0XHRcdC8vIFRoaXMgbWF5IHJhaXNlIGFuIGV4Y2VwdGlvbiB3aGljaCBpcyBhY3R1YWxseVxuXHRcdFx0XHRcdC8vIGhhbmRsZWQgaW4galF1ZXJ5LmFqYXggKHNvIG5vIHRyeS9jYXRjaCBoZXJlKVxuXHRcdFx0XHRcdHhoci5zZW5kKCAoIG9wdGlvbnMuaGFzQ29udGVudCAmJiBvcHRpb25zLmRhdGEgKSB8fCBudWxsICk7XG5cblx0XHRcdFx0XHQvLyBMaXN0ZW5lclxuXHRcdFx0XHRcdGNhbGxiYWNrID0gZnVuY3Rpb24oIF8sIGlzQWJvcnQgKSB7XG5cdFx0XHRcdFx0XHR2YXIgc3RhdHVzLCBzdGF0dXNUZXh0LCByZXNwb25zZXM7XG5cblx0XHRcdFx0XHRcdC8vIFdhcyBuZXZlciBjYWxsZWQgYW5kIGlzIGFib3J0ZWQgb3IgY29tcGxldGVcblx0XHRcdFx0XHRcdGlmICggY2FsbGJhY2sgJiYgKCBpc0Fib3J0IHx8IHhoci5yZWFkeVN0YXRlID09PSA0ICkgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gQ2xlYW4gdXBcblx0XHRcdFx0XHRcdFx0ZGVsZXRlIHhockNhbGxiYWNrc1sgaWQgXTtcblx0XHRcdFx0XHRcdFx0Y2FsbGJhY2sgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHRcdHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBqUXVlcnkubm9vcDtcblxuXHRcdFx0XHRcdFx0XHQvLyBBYm9ydCBtYW51YWxseSBpZiBuZWVkZWRcblx0XHRcdFx0XHRcdFx0aWYgKCBpc0Fib3J0ICkge1xuXHRcdFx0XHRcdFx0XHRcdGlmICggeGhyLnJlYWR5U3RhdGUgIT09IDQgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHR4aHIuYWJvcnQoKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0cmVzcG9uc2VzID0ge307XG5cdFx0XHRcdFx0XHRcdFx0c3RhdHVzID0geGhyLnN0YXR1cztcblxuXHRcdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFPDEwXG5cdFx0XHRcdFx0XHRcdFx0Ly8gQWNjZXNzaW5nIGJpbmFyeS1kYXRhIHJlc3BvbnNlVGV4dCB0aHJvd3MgYW4gZXhjZXB0aW9uXG5cdFx0XHRcdFx0XHRcdFx0Ly8gKCMxMTQyNilcblx0XHRcdFx0XHRcdFx0XHRpZiAoIHR5cGVvZiB4aHIucmVzcG9uc2VUZXh0ID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0cmVzcG9uc2VzLnRleHQgPSB4aHIucmVzcG9uc2VUZXh0O1xuXHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdC8vIEZpcmVmb3ggdGhyb3dzIGFuIGV4Y2VwdGlvbiB3aGVuIGFjY2Vzc2luZ1xuXHRcdFx0XHRcdFx0XHRcdC8vIHN0YXR1c1RleHQgZm9yIGZhdWx0eSBjcm9zcy1kb21haW4gcmVxdWVzdHNcblx0XHRcdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHRcdFx0c3RhdHVzVGV4dCA9IHhoci5zdGF0dXNUZXh0O1xuXHRcdFx0XHRcdFx0XHRcdH0gY2F0Y2ggKCBlICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBXZSBub3JtYWxpemUgd2l0aCBXZWJraXQgZ2l2aW5nIGFuIGVtcHR5IHN0YXR1c1RleHRcblx0XHRcdFx0XHRcdFx0XHRcdHN0YXR1c1RleHQgPSBcIlwiO1xuXHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdC8vIEZpbHRlciBzdGF0dXMgZm9yIG5vbiBzdGFuZGFyZCBiZWhhdmlvcnNcblxuXHRcdFx0XHRcdFx0XHRcdC8vIElmIHRoZSByZXF1ZXN0IGlzIGxvY2FsIGFuZCB3ZSBoYXZlIGRhdGE6IGFzc3VtZSBhIHN1Y2Nlc3Ncblx0XHRcdFx0XHRcdFx0XHQvLyAoc3VjY2VzcyB3aXRoIG5vIGRhdGEgd29uJ3QgZ2V0IG5vdGlmaWVkLCB0aGF0J3MgdGhlIGJlc3Qgd2Vcblx0XHRcdFx0XHRcdFx0XHQvLyBjYW4gZG8gZ2l2ZW4gY3VycmVudCBpbXBsZW1lbnRhdGlvbnMpXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCAhc3RhdHVzICYmIG9wdGlvbnMuaXNMb2NhbCAmJiAhb3B0aW9ucy5jcm9zc0RvbWFpbiApIHtcblx0XHRcdFx0XHRcdFx0XHRcdHN0YXR1cyA9IHJlc3BvbnNlcy50ZXh0ID8gMjAwIDogNDA0O1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gSUUgLSAjMTQ1MDogc29tZXRpbWVzIHJldHVybnMgMTIyMyB3aGVuIGl0IHNob3VsZCBiZSAyMDRcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCBzdGF0dXMgPT09IDEyMjMgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRzdGF0dXMgPSAyMDQ7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdC8vIENhbGwgY29tcGxldGUgaWYgbmVlZGVkXG5cdFx0XHRcdFx0XHRpZiAoIHJlc3BvbnNlcyApIHtcblx0XHRcdFx0XHRcdFx0Y29tcGxldGUoIHN0YXR1cywgc3RhdHVzVGV4dCwgcmVzcG9uc2VzLCB4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0Ly8gRG8gc2VuZCB0aGUgcmVxdWVzdFxuXHRcdFx0XHRcdC8vIGB4aHIuc2VuZGAgbWF5IHJhaXNlIGFuIGV4Y2VwdGlvbiwgYnV0IGl0IHdpbGwgYmVcblx0XHRcdFx0XHQvLyBoYW5kbGVkIGluIGpRdWVyeS5hamF4IChzbyBubyB0cnkvY2F0Y2ggaGVyZSlcblx0XHRcdFx0XHRpZiAoICFvcHRpb25zLmFzeW5jICkge1xuXG5cdFx0XHRcdFx0XHQvLyBJZiB3ZSdyZSBpbiBzeW5jIG1vZGUgd2UgZmlyZSB0aGUgY2FsbGJhY2tcblx0XHRcdFx0XHRcdGNhbGxiYWNrKCk7XG5cdFx0XHRcdFx0fSBlbHNlIGlmICggeGhyLnJlYWR5U3RhdGUgPT09IDQgKSB7XG5cblx0XHRcdFx0XHRcdC8vIChJRTYgJiBJRTcpIGlmIGl0J3MgaW4gY2FjaGUgYW5kIGhhcyBiZWVuXG5cdFx0XHRcdFx0XHQvLyByZXRyaWV2ZWQgZGlyZWN0bHkgd2UgbmVlZCB0byBmaXJlIHRoZSBjYWxsYmFja1xuXHRcdFx0XHRcdFx0d2luZG93LnNldFRpbWVvdXQoIGNhbGxiYWNrICk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0Ly8gUmVnaXN0ZXIgdGhlIGNhbGxiYWNrLCBidXQgZGVsYXkgaXQgaW4gY2FzZSBgeGhyLnNlbmRgIHRocm93c1xuXHRcdFx0XHRcdFx0Ly8gQWRkIHRvIHRoZSBsaXN0IG9mIGFjdGl2ZSB4aHIgY2FsbGJhY2tzXG5cdFx0XHRcdFx0XHR4aHIub25yZWFkeXN0YXRlY2hhbmdlID0geGhyQ2FsbGJhY2tzWyBpZCBdID0gY2FsbGJhY2s7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdGFib3J0OiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRpZiAoIGNhbGxiYWNrICkge1xuXHRcdFx0XHRcdFx0Y2FsbGJhY2soIHVuZGVmaW5lZCwgdHJ1ZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHR9XG5cdH0gKTtcbn1cblxuLy8gRnVuY3Rpb25zIHRvIGNyZWF0ZSB4aHJzXG5mdW5jdGlvbiBjcmVhdGVTdGFuZGFyZFhIUigpIHtcblx0dHJ5IHtcblx0XHRyZXR1cm4gbmV3IHdpbmRvdy5YTUxIdHRwUmVxdWVzdCgpO1xuXHR9IGNhdGNoICggZSApIHt9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUFjdGl2ZVhIUigpIHtcblx0dHJ5IHtcblx0XHRyZXR1cm4gbmV3IHdpbmRvdy5BY3RpdmVYT2JqZWN0KCBcIk1pY3Jvc29mdC5YTUxIVFRQXCIgKTtcblx0fSBjYXRjaCAoIGUgKSB7fVxufVxuXG5cblxuXG4vLyBJbnN0YWxsIHNjcmlwdCBkYXRhVHlwZVxualF1ZXJ5LmFqYXhTZXR1cCgge1xuXHRhY2NlcHRzOiB7XG5cdFx0c2NyaXB0OiBcInRleHQvamF2YXNjcmlwdCwgYXBwbGljYXRpb24vamF2YXNjcmlwdCwgXCIgK1xuXHRcdFx0XCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0LCBhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHRcIlxuXHR9LFxuXHRjb250ZW50czoge1xuXHRcdHNjcmlwdDogL1xcYig/OmphdmF8ZWNtYSlzY3JpcHRcXGIvXG5cdH0sXG5cdGNvbnZlcnRlcnM6IHtcblx0XHRcInRleHQgc2NyaXB0XCI6IGZ1bmN0aW9uKCB0ZXh0ICkge1xuXHRcdFx0alF1ZXJ5Lmdsb2JhbEV2YWwoIHRleHQgKTtcblx0XHRcdHJldHVybiB0ZXh0O1xuXHRcdH1cblx0fVxufSApO1xuXG4vLyBIYW5kbGUgY2FjaGUncyBzcGVjaWFsIGNhc2UgYW5kIGdsb2JhbFxualF1ZXJ5LmFqYXhQcmVmaWx0ZXIoIFwic2NyaXB0XCIsIGZ1bmN0aW9uKCBzICkge1xuXHRpZiAoIHMuY2FjaGUgPT09IHVuZGVmaW5lZCApIHtcblx0XHRzLmNhY2hlID0gZmFsc2U7XG5cdH1cblx0aWYgKCBzLmNyb3NzRG9tYWluICkge1xuXHRcdHMudHlwZSA9IFwiR0VUXCI7XG5cdFx0cy5nbG9iYWwgPSBmYWxzZTtcblx0fVxufSApO1xuXG4vLyBCaW5kIHNjcmlwdCB0YWcgaGFjayB0cmFuc3BvcnRcbmpRdWVyeS5hamF4VHJhbnNwb3J0KCBcInNjcmlwdFwiLCBmdW5jdGlvbiggcyApIHtcblxuXHQvLyBUaGlzIHRyYW5zcG9ydCBvbmx5IGRlYWxzIHdpdGggY3Jvc3MgZG9tYWluIHJlcXVlc3RzXG5cdGlmICggcy5jcm9zc0RvbWFpbiApIHtcblxuXHRcdHZhciBzY3JpcHQsXG5cdFx0XHRoZWFkID0gZG9jdW1lbnQuaGVhZCB8fCBqUXVlcnkoIFwiaGVhZFwiIClbIDAgXSB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG5cblx0XHRyZXR1cm4ge1xuXG5cdFx0XHRzZW5kOiBmdW5jdGlvbiggXywgY2FsbGJhY2sgKSB7XG5cblx0XHRcdFx0c2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJzY3JpcHRcIiApO1xuXG5cdFx0XHRcdHNjcmlwdC5hc3luYyA9IHRydWU7XG5cblx0XHRcdFx0aWYgKCBzLnNjcmlwdENoYXJzZXQgKSB7XG5cdFx0XHRcdFx0c2NyaXB0LmNoYXJzZXQgPSBzLnNjcmlwdENoYXJzZXQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRzY3JpcHQuc3JjID0gcy51cmw7XG5cblx0XHRcdFx0Ly8gQXR0YWNoIGhhbmRsZXJzIGZvciBhbGwgYnJvd3NlcnNcblx0XHRcdFx0c2NyaXB0Lm9ubG9hZCA9IHNjcmlwdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiggXywgaXNBYm9ydCApIHtcblxuXHRcdFx0XHRcdGlmICggaXNBYm9ydCB8fCAhc2NyaXB0LnJlYWR5U3RhdGUgfHwgL2xvYWRlZHxjb21wbGV0ZS8udGVzdCggc2NyaXB0LnJlYWR5U3RhdGUgKSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gSGFuZGxlIG1lbW9yeSBsZWFrIGluIElFXG5cdFx0XHRcdFx0XHRzY3JpcHQub25sb2FkID0gc2NyaXB0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG51bGw7XG5cblx0XHRcdFx0XHRcdC8vIFJlbW92ZSB0aGUgc2NyaXB0XG5cdFx0XHRcdFx0XHRpZiAoIHNjcmlwdC5wYXJlbnROb2RlICkge1xuXHRcdFx0XHRcdFx0XHRzY3JpcHQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggc2NyaXB0ICk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdC8vIERlcmVmZXJlbmNlIHRoZSBzY3JpcHRcblx0XHRcdFx0XHRcdHNjcmlwdCA9IG51bGw7XG5cblx0XHRcdFx0XHRcdC8vIENhbGxiYWNrIGlmIG5vdCBhYm9ydFxuXHRcdFx0XHRcdFx0aWYgKCAhaXNBYm9ydCApIHtcblx0XHRcdFx0XHRcdFx0Y2FsbGJhY2soIDIwMCwgXCJzdWNjZXNzXCIgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH07XG5cblx0XHRcdFx0Ly8gQ2lyY3VtdmVudCBJRTYgYnVncyB3aXRoIGJhc2UgZWxlbWVudHMgKCMyNzA5IGFuZCAjNDM3OCkgYnkgcHJlcGVuZGluZ1xuXHRcdFx0XHQvLyBVc2UgbmF0aXZlIERPTSBtYW5pcHVsYXRpb24gdG8gYXZvaWQgb3VyIGRvbU1hbmlwIEFKQVggdHJpY2tlcnlcblx0XHRcdFx0aGVhZC5pbnNlcnRCZWZvcmUoIHNjcmlwdCwgaGVhZC5maXJzdENoaWxkICk7XG5cdFx0XHR9LFxuXG5cdFx0XHRhYm9ydDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggc2NyaXB0ICkge1xuXHRcdFx0XHRcdHNjcmlwdC5vbmxvYWQoIHVuZGVmaW5lZCwgdHJ1ZSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblx0fVxufSApO1xuXG5cblxuXG52YXIgb2xkQ2FsbGJhY2tzID0gW10sXG5cdHJqc29ucCA9IC8oPSlcXD8oPz0mfCQpfFxcP1xcPy87XG5cbi8vIERlZmF1bHQganNvbnAgc2V0dGluZ3NcbmpRdWVyeS5hamF4U2V0dXAoIHtcblx0anNvbnA6IFwiY2FsbGJhY2tcIixcblx0anNvbnBDYWxsYmFjazogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGNhbGxiYWNrID0gb2xkQ2FsbGJhY2tzLnBvcCgpIHx8ICggalF1ZXJ5LmV4cGFuZG8gKyBcIl9cIiArICggbm9uY2UrKyApICk7XG5cdFx0dGhpc1sgY2FsbGJhY2sgXSA9IHRydWU7XG5cdFx0cmV0dXJuIGNhbGxiYWNrO1xuXHR9XG59ICk7XG5cbi8vIERldGVjdCwgbm9ybWFsaXplIG9wdGlvbnMgYW5kIGluc3RhbGwgY2FsbGJhY2tzIGZvciBqc29ucCByZXF1ZXN0c1xualF1ZXJ5LmFqYXhQcmVmaWx0ZXIoIFwianNvbiBqc29ucFwiLCBmdW5jdGlvbiggcywgb3JpZ2luYWxTZXR0aW5ncywganFYSFIgKSB7XG5cblx0dmFyIGNhbGxiYWNrTmFtZSwgb3ZlcndyaXR0ZW4sIHJlc3BvbnNlQ29udGFpbmVyLFxuXHRcdGpzb25Qcm9wID0gcy5qc29ucCAhPT0gZmFsc2UgJiYgKCByanNvbnAudGVzdCggcy51cmwgKSA/XG5cdFx0XHRcInVybFwiIDpcblx0XHRcdHR5cGVvZiBzLmRhdGEgPT09IFwic3RyaW5nXCIgJiZcblx0XHRcdFx0KCBzLmNvbnRlbnRUeXBlIHx8IFwiXCIgKVxuXHRcdFx0XHRcdC5pbmRleE9mKCBcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFwiICkgPT09IDAgJiZcblx0XHRcdFx0cmpzb25wLnRlc3QoIHMuZGF0YSApICYmIFwiZGF0YVwiXG5cdFx0KTtcblxuXHQvLyBIYW5kbGUgaWZmIHRoZSBleHBlY3RlZCBkYXRhIHR5cGUgaXMgXCJqc29ucFwiIG9yIHdlIGhhdmUgYSBwYXJhbWV0ZXIgdG8gc2V0XG5cdGlmICgganNvblByb3AgfHwgcy5kYXRhVHlwZXNbIDAgXSA9PT0gXCJqc29ucFwiICkge1xuXG5cdFx0Ly8gR2V0IGNhbGxiYWNrIG5hbWUsIHJlbWVtYmVyaW5nIHByZWV4aXN0aW5nIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBpdFxuXHRcdGNhbGxiYWNrTmFtZSA9IHMuanNvbnBDYWxsYmFjayA9IGpRdWVyeS5pc0Z1bmN0aW9uKCBzLmpzb25wQ2FsbGJhY2sgKSA/XG5cdFx0XHRzLmpzb25wQ2FsbGJhY2soKSA6XG5cdFx0XHRzLmpzb25wQ2FsbGJhY2s7XG5cblx0XHQvLyBJbnNlcnQgY2FsbGJhY2sgaW50byB1cmwgb3IgZm9ybSBkYXRhXG5cdFx0aWYgKCBqc29uUHJvcCApIHtcblx0XHRcdHNbIGpzb25Qcm9wIF0gPSBzWyBqc29uUHJvcCBdLnJlcGxhY2UoIHJqc29ucCwgXCIkMVwiICsgY2FsbGJhY2tOYW1lICk7XG5cdFx0fSBlbHNlIGlmICggcy5qc29ucCAhPT0gZmFsc2UgKSB7XG5cdFx0XHRzLnVybCArPSAoIHJxdWVyeS50ZXN0KCBzLnVybCApID8gXCImXCIgOiBcIj9cIiApICsgcy5qc29ucCArIFwiPVwiICsgY2FsbGJhY2tOYW1lO1xuXHRcdH1cblxuXHRcdC8vIFVzZSBkYXRhIGNvbnZlcnRlciB0byByZXRyaWV2ZSBqc29uIGFmdGVyIHNjcmlwdCBleGVjdXRpb25cblx0XHRzLmNvbnZlcnRlcnNbIFwic2NyaXB0IGpzb25cIiBdID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRpZiAoICFyZXNwb25zZUNvbnRhaW5lciApIHtcblx0XHRcdFx0alF1ZXJ5LmVycm9yKCBjYWxsYmFja05hbWUgKyBcIiB3YXMgbm90IGNhbGxlZFwiICk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcmVzcG9uc2VDb250YWluZXJbIDAgXTtcblx0XHR9O1xuXG5cdFx0Ly8gZm9yY2UganNvbiBkYXRhVHlwZVxuXHRcdHMuZGF0YVR5cGVzWyAwIF0gPSBcImpzb25cIjtcblxuXHRcdC8vIEluc3RhbGwgY2FsbGJhY2tcblx0XHRvdmVyd3JpdHRlbiA9IHdpbmRvd1sgY2FsbGJhY2tOYW1lIF07XG5cdFx0d2luZG93WyBjYWxsYmFja05hbWUgXSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmVzcG9uc2VDb250YWluZXIgPSBhcmd1bWVudHM7XG5cdFx0fTtcblxuXHRcdC8vIENsZWFuLXVwIGZ1bmN0aW9uIChmaXJlcyBhZnRlciBjb252ZXJ0ZXJzKVxuXHRcdGpxWEhSLmFsd2F5cyggZnVuY3Rpb24oKSB7XG5cblx0XHRcdC8vIElmIHByZXZpb3VzIHZhbHVlIGRpZG4ndCBleGlzdCAtIHJlbW92ZSBpdFxuXHRcdFx0aWYgKCBvdmVyd3JpdHRlbiA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRqUXVlcnkoIHdpbmRvdyApLnJlbW92ZVByb3AoIGNhbGxiYWNrTmFtZSApO1xuXG5cdFx0XHQvLyBPdGhlcndpc2UgcmVzdG9yZSBwcmVleGlzdGluZyB2YWx1ZVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0d2luZG93WyBjYWxsYmFja05hbWUgXSA9IG92ZXJ3cml0dGVuO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTYXZlIGJhY2sgYXMgZnJlZVxuXHRcdFx0aWYgKCBzWyBjYWxsYmFja05hbWUgXSApIHtcblxuXHRcdFx0XHQvLyBtYWtlIHN1cmUgdGhhdCByZS11c2luZyB0aGUgb3B0aW9ucyBkb2Vzbid0IHNjcmV3IHRoaW5ncyBhcm91bmRcblx0XHRcdFx0cy5qc29ucENhbGxiYWNrID0gb3JpZ2luYWxTZXR0aW5ncy5qc29ucENhbGxiYWNrO1xuXG5cdFx0XHRcdC8vIHNhdmUgdGhlIGNhbGxiYWNrIG5hbWUgZm9yIGZ1dHVyZSB1c2Vcblx0XHRcdFx0b2xkQ2FsbGJhY2tzLnB1c2goIGNhbGxiYWNrTmFtZSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDYWxsIGlmIGl0IHdhcyBhIGZ1bmN0aW9uIGFuZCB3ZSBoYXZlIGEgcmVzcG9uc2Vcblx0XHRcdGlmICggcmVzcG9uc2VDb250YWluZXIgJiYgalF1ZXJ5LmlzRnVuY3Rpb24oIG92ZXJ3cml0dGVuICkgKSB7XG5cdFx0XHRcdG92ZXJ3cml0dGVuKCByZXNwb25zZUNvbnRhaW5lclsgMCBdICk7XG5cdFx0XHR9XG5cblx0XHRcdHJlc3BvbnNlQ29udGFpbmVyID0gb3ZlcndyaXR0ZW4gPSB1bmRlZmluZWQ7XG5cdFx0fSApO1xuXG5cdFx0Ly8gRGVsZWdhdGUgdG8gc2NyaXB0XG5cdFx0cmV0dXJuIFwic2NyaXB0XCI7XG5cdH1cbn0gKTtcblxuXG5cblxuLy8gZGF0YTogc3RyaW5nIG9mIGh0bWxcbi8vIGNvbnRleHQgKG9wdGlvbmFsKTogSWYgc3BlY2lmaWVkLCB0aGUgZnJhZ21lbnQgd2lsbCBiZSBjcmVhdGVkIGluIHRoaXMgY29udGV4dCxcbi8vIGRlZmF1bHRzIHRvIGRvY3VtZW50XG4vLyBrZWVwU2NyaXB0cyAob3B0aW9uYWwpOiBJZiB0cnVlLCB3aWxsIGluY2x1ZGUgc2NyaXB0cyBwYXNzZWQgaW4gdGhlIGh0bWwgc3RyaW5nXG5qUXVlcnkucGFyc2VIVE1MID0gZnVuY3Rpb24oIGRhdGEsIGNvbnRleHQsIGtlZXBTY3JpcHRzICkge1xuXHRpZiAoICFkYXRhIHx8IHR5cGVvZiBkYXRhICE9PSBcInN0cmluZ1wiICkge1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cdGlmICggdHlwZW9mIGNvbnRleHQgPT09IFwiYm9vbGVhblwiICkge1xuXHRcdGtlZXBTY3JpcHRzID0gY29udGV4dDtcblx0XHRjb250ZXh0ID0gZmFsc2U7XG5cdH1cblx0Y29udGV4dCA9IGNvbnRleHQgfHwgZG9jdW1lbnQ7XG5cblx0dmFyIHBhcnNlZCA9IHJzaW5nbGVUYWcuZXhlYyggZGF0YSApLFxuXHRcdHNjcmlwdHMgPSAha2VlcFNjcmlwdHMgJiYgW107XG5cblx0Ly8gU2luZ2xlIHRhZ1xuXHRpZiAoIHBhcnNlZCApIHtcblx0XHRyZXR1cm4gWyBjb250ZXh0LmNyZWF0ZUVsZW1lbnQoIHBhcnNlZFsgMSBdICkgXTtcblx0fVxuXG5cdHBhcnNlZCA9IGJ1aWxkRnJhZ21lbnQoIFsgZGF0YSBdLCBjb250ZXh0LCBzY3JpcHRzICk7XG5cblx0aWYgKCBzY3JpcHRzICYmIHNjcmlwdHMubGVuZ3RoICkge1xuXHRcdGpRdWVyeSggc2NyaXB0cyApLnJlbW92ZSgpO1xuXHR9XG5cblx0cmV0dXJuIGpRdWVyeS5tZXJnZSggW10sIHBhcnNlZC5jaGlsZE5vZGVzICk7XG59O1xuXG5cbi8vIEtlZXAgYSBjb3B5IG9mIHRoZSBvbGQgbG9hZCBtZXRob2RcbnZhciBfbG9hZCA9IGpRdWVyeS5mbi5sb2FkO1xuXG4vKipcbiAqIExvYWQgYSB1cmwgaW50byBhIHBhZ2VcbiAqL1xualF1ZXJ5LmZuLmxvYWQgPSBmdW5jdGlvbiggdXJsLCBwYXJhbXMsIGNhbGxiYWNrICkge1xuXHRpZiAoIHR5cGVvZiB1cmwgIT09IFwic3RyaW5nXCIgJiYgX2xvYWQgKSB7XG5cdFx0cmV0dXJuIF9sb2FkLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0fVxuXG5cdHZhciBzZWxlY3RvciwgdHlwZSwgcmVzcG9uc2UsXG5cdFx0c2VsZiA9IHRoaXMsXG5cdFx0b2ZmID0gdXJsLmluZGV4T2YoIFwiIFwiICk7XG5cblx0aWYgKCBvZmYgPiAtMSApIHtcblx0XHRzZWxlY3RvciA9IGpRdWVyeS50cmltKCB1cmwuc2xpY2UoIG9mZiwgdXJsLmxlbmd0aCApICk7XG5cdFx0dXJsID0gdXJsLnNsaWNlKCAwLCBvZmYgKTtcblx0fVxuXG5cdC8vIElmIGl0J3MgYSBmdW5jdGlvblxuXHRpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBwYXJhbXMgKSApIHtcblxuXHRcdC8vIFdlIGFzc3VtZSB0aGF0IGl0J3MgdGhlIGNhbGxiYWNrXG5cdFx0Y2FsbGJhY2sgPSBwYXJhbXM7XG5cdFx0cGFyYW1zID0gdW5kZWZpbmVkO1xuXG5cdC8vIE90aGVyd2lzZSwgYnVpbGQgYSBwYXJhbSBzdHJpbmdcblx0fSBlbHNlIGlmICggcGFyYW1zICYmIHR5cGVvZiBwYXJhbXMgPT09IFwib2JqZWN0XCIgKSB7XG5cdFx0dHlwZSA9IFwiUE9TVFwiO1xuXHR9XG5cblx0Ly8gSWYgd2UgaGF2ZSBlbGVtZW50cyB0byBtb2RpZnksIG1ha2UgdGhlIHJlcXVlc3Rcblx0aWYgKCBzZWxmLmxlbmd0aCA+IDAgKSB7XG5cdFx0alF1ZXJ5LmFqYXgoIHtcblx0XHRcdHVybDogdXJsLFxuXG5cdFx0XHQvLyBJZiBcInR5cGVcIiB2YXJpYWJsZSBpcyB1bmRlZmluZWQsIHRoZW4gXCJHRVRcIiBtZXRob2Qgd2lsbCBiZSB1c2VkLlxuXHRcdFx0Ly8gTWFrZSB2YWx1ZSBvZiB0aGlzIGZpZWxkIGV4cGxpY2l0IHNpbmNlXG5cdFx0XHQvLyB1c2VyIGNhbiBvdmVycmlkZSBpdCB0aHJvdWdoIGFqYXhTZXR1cCBtZXRob2Rcblx0XHRcdHR5cGU6IHR5cGUgfHwgXCJHRVRcIixcblx0XHRcdGRhdGFUeXBlOiBcImh0bWxcIixcblx0XHRcdGRhdGE6IHBhcmFtc1xuXHRcdH0gKS5kb25lKCBmdW5jdGlvbiggcmVzcG9uc2VUZXh0ICkge1xuXG5cdFx0XHQvLyBTYXZlIHJlc3BvbnNlIGZvciB1c2UgaW4gY29tcGxldGUgY2FsbGJhY2tcblx0XHRcdHJlc3BvbnNlID0gYXJndW1lbnRzO1xuXG5cdFx0XHRzZWxmLmh0bWwoIHNlbGVjdG9yID9cblxuXHRcdFx0XHQvLyBJZiBhIHNlbGVjdG9yIHdhcyBzcGVjaWZpZWQsIGxvY2F0ZSB0aGUgcmlnaHQgZWxlbWVudHMgaW4gYSBkdW1teSBkaXZcblx0XHRcdFx0Ly8gRXhjbHVkZSBzY3JpcHRzIHRvIGF2b2lkIElFICdQZXJtaXNzaW9uIERlbmllZCcgZXJyb3JzXG5cdFx0XHRcdGpRdWVyeSggXCI8ZGl2PlwiICkuYXBwZW5kKCBqUXVlcnkucGFyc2VIVE1MKCByZXNwb25zZVRleHQgKSApLmZpbmQoIHNlbGVjdG9yICkgOlxuXG5cdFx0XHRcdC8vIE90aGVyd2lzZSB1c2UgdGhlIGZ1bGwgcmVzdWx0XG5cdFx0XHRcdHJlc3BvbnNlVGV4dCApO1xuXG5cdFx0Ly8gSWYgdGhlIHJlcXVlc3Qgc3VjY2VlZHMsIHRoaXMgZnVuY3Rpb24gZ2V0cyBcImRhdGFcIiwgXCJzdGF0dXNcIiwgXCJqcVhIUlwiXG5cdFx0Ly8gYnV0IHRoZXkgYXJlIGlnbm9yZWQgYmVjYXVzZSByZXNwb25zZSB3YXMgc2V0IGFib3ZlLlxuXHRcdC8vIElmIGl0IGZhaWxzLCB0aGlzIGZ1bmN0aW9uIGdldHMgXCJqcVhIUlwiLCBcInN0YXR1c1wiLCBcImVycm9yXCJcblx0XHR9ICkuYWx3YXlzKCBjYWxsYmFjayAmJiBmdW5jdGlvbigganFYSFIsIHN0YXR1cyApIHtcblx0XHRcdHNlbGYuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGNhbGxiYWNrLmFwcGx5KCB0aGlzLCByZXNwb25zZSB8fCBbIGpxWEhSLnJlc3BvbnNlVGV4dCwgc3RhdHVzLCBqcVhIUiBdICk7XG5cdFx0XHR9ICk7XG5cdFx0fSApO1xuXHR9XG5cblx0cmV0dXJuIHRoaXM7XG59O1xuXG5cblxuXG4vLyBBdHRhY2ggYSBidW5jaCBvZiBmdW5jdGlvbnMgZm9yIGhhbmRsaW5nIGNvbW1vbiBBSkFYIGV2ZW50c1xualF1ZXJ5LmVhY2goIFtcblx0XCJhamF4U3RhcnRcIixcblx0XCJhamF4U3RvcFwiLFxuXHRcImFqYXhDb21wbGV0ZVwiLFxuXHRcImFqYXhFcnJvclwiLFxuXHRcImFqYXhTdWNjZXNzXCIsXG5cdFwiYWpheFNlbmRcIlxuXSwgZnVuY3Rpb24oIGksIHR5cGUgKSB7XG5cdGpRdWVyeS5mblsgdHlwZSBdID0gZnVuY3Rpb24oIGZuICkge1xuXHRcdHJldHVybiB0aGlzLm9uKCB0eXBlLCBmbiApO1xuXHR9O1xufSApO1xuXG5cblxuXG5qUXVlcnkuZXhwci5maWx0ZXJzLmFuaW1hdGVkID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdHJldHVybiBqUXVlcnkuZ3JlcCggalF1ZXJ5LnRpbWVycywgZnVuY3Rpb24oIGZuICkge1xuXHRcdHJldHVybiBlbGVtID09PSBmbi5lbGVtO1xuXHR9ICkubGVuZ3RoO1xufTtcblxuXG5cblxuXG4vKipcbiAqIEdldHMgYSB3aW5kb3cgZnJvbSBhbiBlbGVtZW50XG4gKi9cbmZ1bmN0aW9uIGdldFdpbmRvdyggZWxlbSApIHtcblx0cmV0dXJuIGpRdWVyeS5pc1dpbmRvdyggZWxlbSApID9cblx0XHRlbGVtIDpcblx0XHRlbGVtLm5vZGVUeXBlID09PSA5ID9cblx0XHRcdGVsZW0uZGVmYXVsdFZpZXcgfHwgZWxlbS5wYXJlbnRXaW5kb3cgOlxuXHRcdFx0ZmFsc2U7XG59XG5cbmpRdWVyeS5vZmZzZXQgPSB7XG5cdHNldE9mZnNldDogZnVuY3Rpb24oIGVsZW0sIG9wdGlvbnMsIGkgKSB7XG5cdFx0dmFyIGN1clBvc2l0aW9uLCBjdXJMZWZ0LCBjdXJDU1NUb3AsIGN1clRvcCwgY3VyT2Zmc2V0LCBjdXJDU1NMZWZ0LCBjYWxjdWxhdGVQb3NpdGlvbixcblx0XHRcdHBvc2l0aW9uID0galF1ZXJ5LmNzcyggZWxlbSwgXCJwb3NpdGlvblwiICksXG5cdFx0XHRjdXJFbGVtID0galF1ZXJ5KCBlbGVtICksXG5cdFx0XHRwcm9wcyA9IHt9O1xuXG5cdFx0Ly8gc2V0IHBvc2l0aW9uIGZpcnN0LCBpbi1jYXNlIHRvcC9sZWZ0IGFyZSBzZXQgZXZlbiBvbiBzdGF0aWMgZWxlbVxuXHRcdGlmICggcG9zaXRpb24gPT09IFwic3RhdGljXCIgKSB7XG5cdFx0XHRlbGVtLnN0eWxlLnBvc2l0aW9uID0gXCJyZWxhdGl2ZVwiO1xuXHRcdH1cblxuXHRcdGN1ck9mZnNldCA9IGN1ckVsZW0ub2Zmc2V0KCk7XG5cdFx0Y3VyQ1NTVG9wID0galF1ZXJ5LmNzcyggZWxlbSwgXCJ0b3BcIiApO1xuXHRcdGN1ckNTU0xlZnQgPSBqUXVlcnkuY3NzKCBlbGVtLCBcImxlZnRcIiApO1xuXHRcdGNhbGN1bGF0ZVBvc2l0aW9uID0gKCBwb3NpdGlvbiA9PT0gXCJhYnNvbHV0ZVwiIHx8IHBvc2l0aW9uID09PSBcImZpeGVkXCIgKSAmJlxuXHRcdFx0alF1ZXJ5LmluQXJyYXkoIFwiYXV0b1wiLCBbIGN1ckNTU1RvcCwgY3VyQ1NTTGVmdCBdICkgPiAtMTtcblxuXHRcdC8vIG5lZWQgdG8gYmUgYWJsZSB0byBjYWxjdWxhdGUgcG9zaXRpb24gaWYgZWl0aGVyIHRvcCBvciBsZWZ0XG5cdFx0Ly8gaXMgYXV0byBhbmQgcG9zaXRpb24gaXMgZWl0aGVyIGFic29sdXRlIG9yIGZpeGVkXG5cdFx0aWYgKCBjYWxjdWxhdGVQb3NpdGlvbiApIHtcblx0XHRcdGN1clBvc2l0aW9uID0gY3VyRWxlbS5wb3NpdGlvbigpO1xuXHRcdFx0Y3VyVG9wID0gY3VyUG9zaXRpb24udG9wO1xuXHRcdFx0Y3VyTGVmdCA9IGN1clBvc2l0aW9uLmxlZnQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGN1clRvcCA9IHBhcnNlRmxvYXQoIGN1ckNTU1RvcCApIHx8IDA7XG5cdFx0XHRjdXJMZWZ0ID0gcGFyc2VGbG9hdCggY3VyQ1NTTGVmdCApIHx8IDA7XG5cdFx0fVxuXG5cdFx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggb3B0aW9ucyApICkge1xuXG5cdFx0XHQvLyBVc2UgalF1ZXJ5LmV4dGVuZCBoZXJlIHRvIGFsbG93IG1vZGlmaWNhdGlvbiBvZiBjb29yZGluYXRlcyBhcmd1bWVudCAoZ2gtMTg0OClcblx0XHRcdG9wdGlvbnMgPSBvcHRpb25zLmNhbGwoIGVsZW0sIGksIGpRdWVyeS5leHRlbmQoIHt9LCBjdXJPZmZzZXQgKSApO1xuXHRcdH1cblxuXHRcdGlmICggb3B0aW9ucy50b3AgIT0gbnVsbCApIHtcblx0XHRcdHByb3BzLnRvcCA9ICggb3B0aW9ucy50b3AgLSBjdXJPZmZzZXQudG9wICkgKyBjdXJUb3A7XG5cdFx0fVxuXHRcdGlmICggb3B0aW9ucy5sZWZ0ICE9IG51bGwgKSB7XG5cdFx0XHRwcm9wcy5sZWZ0ID0gKCBvcHRpb25zLmxlZnQgLSBjdXJPZmZzZXQubGVmdCApICsgY3VyTGVmdDtcblx0XHR9XG5cblx0XHRpZiAoIFwidXNpbmdcIiBpbiBvcHRpb25zICkge1xuXHRcdFx0b3B0aW9ucy51c2luZy5jYWxsKCBlbGVtLCBwcm9wcyApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjdXJFbGVtLmNzcyggcHJvcHMgKTtcblx0XHR9XG5cdH1cbn07XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0b2Zmc2V0OiBmdW5jdGlvbiggb3B0aW9ucyApIHtcblx0XHRpZiAoIGFyZ3VtZW50cy5sZW5ndGggKSB7XG5cdFx0XHRyZXR1cm4gb3B0aW9ucyA9PT0gdW5kZWZpbmVkID9cblx0XHRcdFx0dGhpcyA6XG5cdFx0XHRcdHRoaXMuZWFjaCggZnVuY3Rpb24oIGkgKSB7XG5cdFx0XHRcdFx0alF1ZXJ5Lm9mZnNldC5zZXRPZmZzZXQoIHRoaXMsIG9wdGlvbnMsIGkgKTtcblx0XHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdHZhciBkb2NFbGVtLCB3aW4sXG5cdFx0XHRib3ggPSB7IHRvcDogMCwgbGVmdDogMCB9LFxuXHRcdFx0ZWxlbSA9IHRoaXNbIDAgXSxcblx0XHRcdGRvYyA9IGVsZW0gJiYgZWxlbS5vd25lckRvY3VtZW50O1xuXG5cdFx0aWYgKCAhZG9jICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGRvY0VsZW0gPSBkb2MuZG9jdW1lbnRFbGVtZW50O1xuXG5cdFx0Ly8gTWFrZSBzdXJlIGl0J3Mgbm90IGEgZGlzY29ubmVjdGVkIERPTSBub2RlXG5cdFx0aWYgKCAhalF1ZXJ5LmNvbnRhaW5zKCBkb2NFbGVtLCBlbGVtICkgKSB7XG5cdFx0XHRyZXR1cm4gYm94O1xuXHRcdH1cblxuXHRcdC8vIElmIHdlIGRvbid0IGhhdmUgZ0JDUiwganVzdCB1c2UgMCwwIHJhdGhlciB0aGFuIGVycm9yXG5cdFx0Ly8gQmxhY2tCZXJyeSA1LCBpT1MgMyAob3JpZ2luYWwgaVBob25lKVxuXHRcdGlmICggdHlwZW9mIGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0ICE9PSBcInVuZGVmaW5lZFwiICkge1xuXHRcdFx0Ym94ID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblx0XHR9XG5cdFx0d2luID0gZ2V0V2luZG93KCBkb2MgKTtcblx0XHRyZXR1cm4ge1xuXHRcdFx0dG9wOiBib3gudG9wICArICggd2luLnBhZ2VZT2Zmc2V0IHx8IGRvY0VsZW0uc2Nyb2xsVG9wICkgIC0gKCBkb2NFbGVtLmNsaWVudFRvcCAgfHwgMCApLFxuXHRcdFx0bGVmdDogYm94LmxlZnQgKyAoIHdpbi5wYWdlWE9mZnNldCB8fCBkb2NFbGVtLnNjcm9sbExlZnQgKSAtICggZG9jRWxlbS5jbGllbnRMZWZ0IHx8IDAgKVxuXHRcdH07XG5cdH0sXG5cblx0cG9zaXRpb246IGZ1bmN0aW9uKCkge1xuXHRcdGlmICggIXRoaXNbIDAgXSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR2YXIgb2Zmc2V0UGFyZW50LCBvZmZzZXQsXG5cdFx0XHRwYXJlbnRPZmZzZXQgPSB7IHRvcDogMCwgbGVmdDogMCB9LFxuXHRcdFx0ZWxlbSA9IHRoaXNbIDAgXTtcblxuXHRcdC8vIEZpeGVkIGVsZW1lbnRzIGFyZSBvZmZzZXQgZnJvbSB3aW5kb3cgKHBhcmVudE9mZnNldCA9IHt0b3A6MCwgbGVmdDogMH0sXG5cdFx0Ly8gYmVjYXVzZSBpdCBpcyBpdHMgb25seSBvZmZzZXQgcGFyZW50XG5cdFx0aWYgKCBqUXVlcnkuY3NzKCBlbGVtLCBcInBvc2l0aW9uXCIgKSA9PT0gXCJmaXhlZFwiICkge1xuXG5cdFx0XHQvLyB3ZSBhc3N1bWUgdGhhdCBnZXRCb3VuZGluZ0NsaWVudFJlY3QgaXMgYXZhaWxhYmxlIHdoZW4gY29tcHV0ZWQgcG9zaXRpb24gaXMgZml4ZWRcblx0XHRcdG9mZnNldCA9IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gR2V0ICpyZWFsKiBvZmZzZXRQYXJlbnRcblx0XHRcdG9mZnNldFBhcmVudCA9IHRoaXMub2Zmc2V0UGFyZW50KCk7XG5cblx0XHRcdC8vIEdldCBjb3JyZWN0IG9mZnNldHNcblx0XHRcdG9mZnNldCA9IHRoaXMub2Zmc2V0KCk7XG5cdFx0XHRpZiAoICFqUXVlcnkubm9kZU5hbWUoIG9mZnNldFBhcmVudFsgMCBdLCBcImh0bWxcIiApICkge1xuXHRcdFx0XHRwYXJlbnRPZmZzZXQgPSBvZmZzZXRQYXJlbnQub2Zmc2V0KCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEFkZCBvZmZzZXRQYXJlbnQgYm9yZGVyc1xuXHRcdFx0cGFyZW50T2Zmc2V0LnRvcCAgKz0galF1ZXJ5LmNzcyggb2Zmc2V0UGFyZW50WyAwIF0sIFwiYm9yZGVyVG9wV2lkdGhcIiwgdHJ1ZSApO1xuXHRcdFx0cGFyZW50T2Zmc2V0LmxlZnQgKz0galF1ZXJ5LmNzcyggb2Zmc2V0UGFyZW50WyAwIF0sIFwiYm9yZGVyTGVmdFdpZHRoXCIsIHRydWUgKTtcblx0XHR9XG5cblx0XHQvLyBTdWJ0cmFjdCBwYXJlbnQgb2Zmc2V0cyBhbmQgZWxlbWVudCBtYXJnaW5zXG5cdFx0Ly8gbm90ZTogd2hlbiBhbiBlbGVtZW50IGhhcyBtYXJnaW46IGF1dG8gdGhlIG9mZnNldExlZnQgYW5kIG1hcmdpbkxlZnRcblx0XHQvLyBhcmUgdGhlIHNhbWUgaW4gU2FmYXJpIGNhdXNpbmcgb2Zmc2V0LmxlZnQgdG8gaW5jb3JyZWN0bHkgYmUgMFxuXHRcdHJldHVybiB7XG5cdFx0XHR0b3A6ICBvZmZzZXQudG9wICAtIHBhcmVudE9mZnNldC50b3AgLSBqUXVlcnkuY3NzKCBlbGVtLCBcIm1hcmdpblRvcFwiLCB0cnVlICksXG5cdFx0XHRsZWZ0OiBvZmZzZXQubGVmdCAtIHBhcmVudE9mZnNldC5sZWZ0IC0galF1ZXJ5LmNzcyggZWxlbSwgXCJtYXJnaW5MZWZ0XCIsIHRydWUgKVxuXHRcdH07XG5cdH0sXG5cblx0b2Zmc2V0UGFyZW50OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5tYXAoIGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIG9mZnNldFBhcmVudCA9IHRoaXMub2Zmc2V0UGFyZW50O1xuXG5cdFx0XHR3aGlsZSAoIG9mZnNldFBhcmVudCAmJiAoICFqUXVlcnkubm9kZU5hbWUoIG9mZnNldFBhcmVudCwgXCJodG1sXCIgKSAmJlxuXHRcdFx0XHRqUXVlcnkuY3NzKCBvZmZzZXRQYXJlbnQsIFwicG9zaXRpb25cIiApID09PSBcInN0YXRpY1wiICkgKSB7XG5cdFx0XHRcdG9mZnNldFBhcmVudCA9IG9mZnNldFBhcmVudC5vZmZzZXRQYXJlbnQ7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gb2Zmc2V0UGFyZW50IHx8IGRvY3VtZW50RWxlbWVudDtcblx0XHR9ICk7XG5cdH1cbn0gKTtcblxuLy8gQ3JlYXRlIHNjcm9sbExlZnQgYW5kIHNjcm9sbFRvcCBtZXRob2RzXG5qUXVlcnkuZWFjaCggeyBzY3JvbGxMZWZ0OiBcInBhZ2VYT2Zmc2V0XCIsIHNjcm9sbFRvcDogXCJwYWdlWU9mZnNldFwiIH0sIGZ1bmN0aW9uKCBtZXRob2QsIHByb3AgKSB7XG5cdHZhciB0b3AgPSAvWS8udGVzdCggcHJvcCApO1xuXG5cdGpRdWVyeS5mblsgbWV0aG9kIF0gPSBmdW5jdGlvbiggdmFsICkge1xuXHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCBtZXRob2QsIHZhbCApIHtcblx0XHRcdHZhciB3aW4gPSBnZXRXaW5kb3coIGVsZW0gKTtcblxuXHRcdFx0aWYgKCB2YWwgPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0cmV0dXJuIHdpbiA/ICggcHJvcCBpbiB3aW4gKSA/IHdpblsgcHJvcCBdIDpcblx0XHRcdFx0XHR3aW4uZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50WyBtZXRob2QgXSA6XG5cdFx0XHRcdFx0ZWxlbVsgbWV0aG9kIF07XG5cdFx0XHR9XG5cblx0XHRcdGlmICggd2luICkge1xuXHRcdFx0XHR3aW4uc2Nyb2xsVG8oXG5cdFx0XHRcdFx0IXRvcCA/IHZhbCA6IGpRdWVyeSggd2luICkuc2Nyb2xsTGVmdCgpLFxuXHRcdFx0XHRcdHRvcCA/IHZhbCA6IGpRdWVyeSggd2luICkuc2Nyb2xsVG9wKClcblx0XHRcdFx0KTtcblxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZWxlbVsgbWV0aG9kIF0gPSB2YWw7XG5cdFx0XHR9XG5cdFx0fSwgbWV0aG9kLCB2YWwsIGFyZ3VtZW50cy5sZW5ndGgsIG51bGwgKTtcblx0fTtcbn0gKTtcblxuLy8gU3VwcG9ydDogU2FmYXJpPDctOCssIENocm9tZTwzNy00NCtcbi8vIEFkZCB0aGUgdG9wL2xlZnQgY3NzSG9va3MgdXNpbmcgalF1ZXJ5LmZuLnBvc2l0aW9uXG4vLyBXZWJraXQgYnVnOiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjkwODRcbi8vIGdldENvbXB1dGVkU3R5bGUgcmV0dXJucyBwZXJjZW50IHdoZW4gc3BlY2lmaWVkIGZvciB0b3AvbGVmdC9ib3R0b20vcmlnaHRcbi8vIHJhdGhlciB0aGFuIG1ha2UgdGhlIGNzcyBtb2R1bGUgZGVwZW5kIG9uIHRoZSBvZmZzZXQgbW9kdWxlLCB3ZSBqdXN0IGNoZWNrIGZvciBpdCBoZXJlXG5qUXVlcnkuZWFjaCggWyBcInRvcFwiLCBcImxlZnRcIiBdLCBmdW5jdGlvbiggaSwgcHJvcCApIHtcblx0alF1ZXJ5LmNzc0hvb2tzWyBwcm9wIF0gPSBhZGRHZXRIb29rSWYoIHN1cHBvcnQucGl4ZWxQb3NpdGlvbixcblx0XHRmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7XG5cdFx0XHRpZiAoIGNvbXB1dGVkICkge1xuXHRcdFx0XHRjb21wdXRlZCA9IGN1ckNTUyggZWxlbSwgcHJvcCApO1xuXG5cdFx0XHRcdC8vIGlmIGN1ckNTUyByZXR1cm5zIHBlcmNlbnRhZ2UsIGZhbGxiYWNrIHRvIG9mZnNldFxuXHRcdFx0XHRyZXR1cm4gcm51bW5vbnB4LnRlc3QoIGNvbXB1dGVkICkgP1xuXHRcdFx0XHRcdGpRdWVyeSggZWxlbSApLnBvc2l0aW9uKClbIHByb3AgXSArIFwicHhcIiA6XG5cdFx0XHRcdFx0Y29tcHV0ZWQ7XG5cdFx0XHR9XG5cdFx0fVxuXHQpO1xufSApO1xuXG5cbi8vIENyZWF0ZSBpbm5lckhlaWdodCwgaW5uZXJXaWR0aCwgaGVpZ2h0LCB3aWR0aCwgb3V0ZXJIZWlnaHQgYW5kIG91dGVyV2lkdGggbWV0aG9kc1xualF1ZXJ5LmVhY2goIHsgSGVpZ2h0OiBcImhlaWdodFwiLCBXaWR0aDogXCJ3aWR0aFwiIH0sIGZ1bmN0aW9uKCBuYW1lLCB0eXBlICkge1xuXHRqUXVlcnkuZWFjaCggeyBwYWRkaW5nOiBcImlubmVyXCIgKyBuYW1lLCBjb250ZW50OiB0eXBlLCBcIlwiOiBcIm91dGVyXCIgKyBuYW1lIH0sXG5cdGZ1bmN0aW9uKCBkZWZhdWx0RXh0cmEsIGZ1bmNOYW1lICkge1xuXG5cdFx0Ly8gbWFyZ2luIGlzIG9ubHkgZm9yIG91dGVySGVpZ2h0LCBvdXRlcldpZHRoXG5cdFx0alF1ZXJ5LmZuWyBmdW5jTmFtZSBdID0gZnVuY3Rpb24oIG1hcmdpbiwgdmFsdWUgKSB7XG5cdFx0XHR2YXIgY2hhaW5hYmxlID0gYXJndW1lbnRzLmxlbmd0aCAmJiAoIGRlZmF1bHRFeHRyYSB8fCB0eXBlb2YgbWFyZ2luICE9PSBcImJvb2xlYW5cIiApLFxuXHRcdFx0XHRleHRyYSA9IGRlZmF1bHRFeHRyYSB8fCAoIG1hcmdpbiA9PT0gdHJ1ZSB8fCB2YWx1ZSA9PT0gdHJ1ZSA/IFwibWFyZ2luXCIgOiBcImJvcmRlclwiICk7XG5cblx0XHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCB2YWx1ZSApIHtcblx0XHRcdFx0dmFyIGRvYztcblxuXHRcdFx0XHRpZiAoIGpRdWVyeS5pc1dpbmRvdyggZWxlbSApICkge1xuXG5cdFx0XHRcdFx0Ly8gQXMgb2YgNS84LzIwMTIgdGhpcyB3aWxsIHlpZWxkIGluY29ycmVjdCByZXN1bHRzIGZvciBNb2JpbGUgU2FmYXJpLCBidXQgdGhlcmVcblx0XHRcdFx0XHQvLyBpc24ndCBhIHdob2xlIGxvdCB3ZSBjYW4gZG8uIFNlZSBwdWxsIHJlcXVlc3QgYXQgdGhpcyBVUkwgZm9yIGRpc2N1c3Npb246XG5cdFx0XHRcdFx0Ly8gaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnkvcHVsbC83NjRcblx0XHRcdFx0XHRyZXR1cm4gZWxlbS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbIFwiY2xpZW50XCIgKyBuYW1lIF07XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBHZXQgZG9jdW1lbnQgd2lkdGggb3IgaGVpZ2h0XG5cdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gOSApIHtcblx0XHRcdFx0XHRkb2MgPSBlbGVtLmRvY3VtZW50RWxlbWVudDtcblxuXHRcdFx0XHRcdC8vIEVpdGhlciBzY3JvbGxbV2lkdGgvSGVpZ2h0XSBvciBvZmZzZXRbV2lkdGgvSGVpZ2h0XSBvciBjbGllbnRbV2lkdGgvSGVpZ2h0XSxcblx0XHRcdFx0XHQvLyB3aGljaGV2ZXIgaXMgZ3JlYXRlc3Rcblx0XHRcdFx0XHQvLyB1bmZvcnR1bmF0ZWx5LCB0aGlzIGNhdXNlcyBidWcgIzM4MzggaW4gSUU2Lzggb25seSxcblx0XHRcdFx0XHQvLyBidXQgdGhlcmUgaXMgY3VycmVudGx5IG5vIGdvb2QsIHNtYWxsIHdheSB0byBmaXggaXQuXG5cdFx0XHRcdFx0cmV0dXJuIE1hdGgubWF4KFxuXHRcdFx0XHRcdFx0ZWxlbS5ib2R5WyBcInNjcm9sbFwiICsgbmFtZSBdLCBkb2NbIFwic2Nyb2xsXCIgKyBuYW1lIF0sXG5cdFx0XHRcdFx0XHRlbGVtLmJvZHlbIFwib2Zmc2V0XCIgKyBuYW1lIF0sIGRvY1sgXCJvZmZzZXRcIiArIG5hbWUgXSxcblx0XHRcdFx0XHRcdGRvY1sgXCJjbGllbnRcIiArIG5hbWUgXVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/XG5cblx0XHRcdFx0XHQvLyBHZXQgd2lkdGggb3IgaGVpZ2h0IG9uIHRoZSBlbGVtZW50LCByZXF1ZXN0aW5nIGJ1dCBub3QgZm9yY2luZyBwYXJzZUZsb2F0XG5cdFx0XHRcdFx0alF1ZXJ5LmNzcyggZWxlbSwgdHlwZSwgZXh0cmEgKSA6XG5cblx0XHRcdFx0XHQvLyBTZXQgd2lkdGggb3IgaGVpZ2h0IG9uIHRoZSBlbGVtZW50XG5cdFx0XHRcdFx0alF1ZXJ5LnN0eWxlKCBlbGVtLCB0eXBlLCB2YWx1ZSwgZXh0cmEgKTtcblx0XHRcdH0sIHR5cGUsIGNoYWluYWJsZSA/IG1hcmdpbiA6IHVuZGVmaW5lZCwgY2hhaW5hYmxlLCBudWxsICk7XG5cdFx0fTtcblx0fSApO1xufSApO1xuXG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblxuXHRiaW5kOiBmdW5jdGlvbiggdHlwZXMsIGRhdGEsIGZuICkge1xuXHRcdHJldHVybiB0aGlzLm9uKCB0eXBlcywgbnVsbCwgZGF0YSwgZm4gKTtcblx0fSxcblx0dW5iaW5kOiBmdW5jdGlvbiggdHlwZXMsIGZuICkge1xuXHRcdHJldHVybiB0aGlzLm9mZiggdHlwZXMsIG51bGwsIGZuICk7XG5cdH0sXG5cblx0ZGVsZWdhdGU6IGZ1bmN0aW9uKCBzZWxlY3RvciwgdHlwZXMsIGRhdGEsIGZuICkge1xuXHRcdHJldHVybiB0aGlzLm9uKCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuICk7XG5cdH0sXG5cdHVuZGVsZWdhdGU6IGZ1bmN0aW9uKCBzZWxlY3RvciwgdHlwZXMsIGZuICkge1xuXG5cdFx0Ly8gKCBuYW1lc3BhY2UgKSBvciAoIHNlbGVjdG9yLCB0eXBlcyBbLCBmbl0gKVxuXHRcdHJldHVybiBhcmd1bWVudHMubGVuZ3RoID09PSAxID9cblx0XHRcdHRoaXMub2ZmKCBzZWxlY3RvciwgXCIqKlwiICkgOlxuXHRcdFx0dGhpcy5vZmYoIHR5cGVzLCBzZWxlY3RvciB8fCBcIioqXCIsIGZuICk7XG5cdH1cbn0gKTtcblxuLy8gVGhlIG51bWJlciBvZiBlbGVtZW50cyBjb250YWluZWQgaW4gdGhlIG1hdGNoZWQgZWxlbWVudCBzZXRcbmpRdWVyeS5mbi5zaXplID0gZnVuY3Rpb24oKSB7XG5cdHJldHVybiB0aGlzLmxlbmd0aDtcbn07XG5cbmpRdWVyeS5mbi5hbmRTZWxmID0galF1ZXJ5LmZuLmFkZEJhY2s7XG5cblxuXG5cbi8vIFJlZ2lzdGVyIGFzIGEgbmFtZWQgQU1EIG1vZHVsZSwgc2luY2UgalF1ZXJ5IGNhbiBiZSBjb25jYXRlbmF0ZWQgd2l0aCBvdGhlclxuLy8gZmlsZXMgdGhhdCBtYXkgdXNlIGRlZmluZSwgYnV0IG5vdCB2aWEgYSBwcm9wZXIgY29uY2F0ZW5hdGlvbiBzY3JpcHQgdGhhdFxuLy8gdW5kZXJzdGFuZHMgYW5vbnltb3VzIEFNRCBtb2R1bGVzLiBBIG5hbWVkIEFNRCBpcyBzYWZlc3QgYW5kIG1vc3Qgcm9idXN0XG4vLyB3YXkgdG8gcmVnaXN0ZXIuIExvd2VyY2FzZSBqcXVlcnkgaXMgdXNlZCBiZWNhdXNlIEFNRCBtb2R1bGUgbmFtZXMgYXJlXG4vLyBkZXJpdmVkIGZyb20gZmlsZSBuYW1lcywgYW5kIGpRdWVyeSBpcyBub3JtYWxseSBkZWxpdmVyZWQgaW4gYSBsb3dlcmNhc2Vcbi8vIGZpbGUgbmFtZS4gRG8gdGhpcyBhZnRlciBjcmVhdGluZyB0aGUgZ2xvYmFsIHNvIHRoYXQgaWYgYW4gQU1EIG1vZHVsZSB3YW50c1xuLy8gdG8gY2FsbCBub0NvbmZsaWN0IHRvIGhpZGUgdGhpcyB2ZXJzaW9uIG9mIGpRdWVyeSwgaXQgd2lsbCB3b3JrLlxuXG4vLyBOb3RlIHRoYXQgZm9yIG1heGltdW0gcG9ydGFiaWxpdHksIGxpYnJhcmllcyB0aGF0IGFyZSBub3QgalF1ZXJ5IHNob3VsZFxuLy8gZGVjbGFyZSB0aGVtc2VsdmVzIGFzIGFub255bW91cyBtb2R1bGVzLCBhbmQgYXZvaWQgc2V0dGluZyBhIGdsb2JhbCBpZiBhblxuLy8gQU1EIGxvYWRlciBpcyBwcmVzZW50LiBqUXVlcnkgaXMgYSBzcGVjaWFsIGNhc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWVcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9qcmJ1cmtlL3JlcXVpcmVqcy93aWtpL1VwZGF0aW5nLWV4aXN0aW5nLWxpYnJhcmllcyN3aWtpLWFub25cblxuaWYgKCB0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCApIHtcblx0ZGVmaW5lKCBcImpxdWVyeVwiLCBbXSwgZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGpRdWVyeTtcblx0fSApO1xufVxuXG5cblxudmFyXG5cblx0Ly8gTWFwIG92ZXIgalF1ZXJ5IGluIGNhc2Ugb2Ygb3ZlcndyaXRlXG5cdF9qUXVlcnkgPSB3aW5kb3cualF1ZXJ5LFxuXG5cdC8vIE1hcCBvdmVyIHRoZSAkIGluIGNhc2Ugb2Ygb3ZlcndyaXRlXG5cdF8kID0gd2luZG93LiQ7XG5cbmpRdWVyeS5ub0NvbmZsaWN0ID0gZnVuY3Rpb24oIGRlZXAgKSB7XG5cdGlmICggd2luZG93LiQgPT09IGpRdWVyeSApIHtcblx0XHR3aW5kb3cuJCA9IF8kO1xuXHR9XG5cblx0aWYgKCBkZWVwICYmIHdpbmRvdy5qUXVlcnkgPT09IGpRdWVyeSApIHtcblx0XHR3aW5kb3cualF1ZXJ5ID0gX2pRdWVyeTtcblx0fVxuXG5cdHJldHVybiBqUXVlcnk7XG59O1xuXG4vLyBFeHBvc2UgalF1ZXJ5IGFuZCAkIGlkZW50aWZpZXJzLCBldmVuIGluXG4vLyBBTUQgKCM3MTAyI2NvbW1lbnQ6MTAsIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvanF1ZXJ5L3B1bGwvNTU3KVxuLy8gYW5kIENvbW1vbkpTIGZvciBicm93c2VyIGVtdWxhdG9ycyAoIzEzNTY2KVxuaWYgKCAhbm9HbG9iYWwgKSB7XG5cdHdpbmRvdy5qUXVlcnkgPSB3aW5kb3cuJCA9IGpRdWVyeTtcbn1cblxucmV0dXJuIGpRdWVyeTtcbn0pKTtcbiIsIihmdW5jdGlvbiAoZmFjdG9yeSkge1xyXG4gICAgLy8gTW9kdWxlIHN5c3RlbXMgbWFnaWMgZGFuY2UuXHJcblxyXG4gICAgaWYgKHR5cGVvZiByZXF1aXJlID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIGV4cG9ydHMgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIG1vZHVsZSA9PT0gXCJvYmplY3RcIikge1xyXG4gICAgICAgIC8vIENvbW1vbkpTIG9yIE5vZGU6IGhhcmQtY29kZWQgZGVwZW5kZW5jeSBvbiBcImtub2Nrb3V0XCJcclxuICAgICAgICBmYWN0b3J5KHJlcXVpcmUoXCJrbm9ja291dFwiKSwgZXhwb3J0cyk7XHJcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmVbXCJhbWRcIl0pIHtcclxuICAgICAgICAvLyBBTUQgYW5vbnltb3VzIG1vZHVsZSB3aXRoIGhhcmQtY29kZWQgZGVwZW5kZW5jeSBvbiBcImtub2Nrb3V0XCJcclxuICAgICAgICBkZWZpbmUoW1wia25vY2tvdXRcIiwgXCJleHBvcnRzXCJdLCBmYWN0b3J5KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gPHNjcmlwdD4gdGFnOiB1c2UgdGhlIGdsb2JhbCBga29gIG9iamVjdCwgYXR0YWNoaW5nIGEgYG1hcHBpbmdgIHByb3BlcnR5XHJcbiAgICAgICAgZmFjdG9yeShrbywga28ubWFwcGluZyA9IHt9KTtcclxuICAgIH1cclxufShmdW5jdGlvbiAoa28sIGV4cG9ydHMpIHtcclxuICAgIHZhciBERUJVRyA9IHRydWU7XHJcbiAgICB2YXIgbWFwcGluZ1Byb3BlcnR5ID0gXCJfX2tvX21hcHBpbmdfX1wiO1xyXG4gICAgdmFyIHJlYWxLb0RlcGVuZGVudE9ic2VydmFibGUgPSBrby5kZXBlbmRlbnRPYnNlcnZhYmxlO1xyXG4gICAgdmFyIG1hcHBpbmdOZXN0aW5nID0gMDtcclxuICAgIHZhciBkZXBlbmRlbnRPYnNlcnZhYmxlcztcclxuICAgIHZhciB2aXNpdGVkT2JqZWN0cztcclxuICAgIHZhciByZWNvZ25pemVkUm9vdFByb3BlcnRpZXMgPSBbXCJjcmVhdGVcIiwgXCJ1cGRhdGVcIiwgXCJrZXlcIiwgXCJhcnJheUNoYW5nZWRcIl07XHJcbiAgICB2YXIgZW1wdHlSZXR1cm4gPSB7fTtcclxuXHJcbiAgICB2YXIgX2RlZmF1bHRPcHRpb25zID0ge1xyXG4gICAgICAgIGluY2x1ZGU6IFtcIl9kZXN0cm95XCJdLFxyXG4gICAgICAgIGlnbm9yZTogW10sXHJcbiAgICAgICAgY29weTogW10sXHJcbiAgICAgICAgb2JzZXJ2ZTogW11cclxuICAgIH07XHJcbiAgICB2YXIgZGVmYXVsdE9wdGlvbnMgPSBfZGVmYXVsdE9wdGlvbnM7XHJcblxyXG4gICAgZnVuY3Rpb24gdW5pb25BcnJheXMoKSB7XHJcbiAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsXHJcbiAgICAgICAgbCA9IGFyZ3MubGVuZ3RoLFxyXG4gICAgICAgIG9iaiA9IHt9LFxyXG4gICAgICAgIHJlcyA9IFtdLFxyXG4gICAgICAgIGksIGosIGs7XHJcblxyXG4gICAgICAgIHdoaWxlIChsLS0pIHtcclxuICAgICAgICAgICAgayA9IGFyZ3NbbF07XHJcbiAgICAgICAgICAgIGkgPSBrLmxlbmd0aDtcclxuXHJcbiAgICAgICAgICAgIHdoaWxlIChpLS0pIHtcclxuICAgICAgICAgICAgICAgIGogPSBrW2ldO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFvYmpbal0pIHtcclxuICAgICAgICAgICAgICAgICAgICBvYmpbal0gPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgIHJlcy5wdXNoKGopO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGV4dGVuZE9iamVjdChkZXN0aW5hdGlvbiwgc291cmNlKSB7XHJcbiAgICAgICAgdmFyIGRlc3RUeXBlO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XHJcbiAgICAgICAgICAgIGlmIChzb3VyY2UuaGFzT3duUHJvcGVydHkoa2V5KSAmJiBzb3VyY2Vba2V5XSkge1xyXG4gICAgICAgICAgICAgICAgZGVzdFR5cGUgPSBleHBvcnRzLmdldFR5cGUoZGVzdGluYXRpb25ba2V5XSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoa2V5ICYmIGRlc3RpbmF0aW9uW2tleV0gJiYgZGVzdFR5cGUgIT09IFwiYXJyYXlcIiAmJiBkZXN0VHlwZSAhPT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIGV4dGVuZE9iamVjdChkZXN0aW5hdGlvbltrZXldLCBzb3VyY2Vba2V5XSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBib3RoQXJyYXlzID0gZXhwb3J0cy5nZXRUeXBlKGRlc3RpbmF0aW9uW2tleV0pID09PSBcImFycmF5XCIgJiYgZXhwb3J0cy5nZXRUeXBlKHNvdXJjZVtrZXldKSA9PT0gXCJhcnJheVwiO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChib3RoQXJyYXlzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uW2tleV0gPSB1bmlvbkFycmF5cyhkZXN0aW5hdGlvbltrZXldLCBzb3VyY2Vba2V5XSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb25ba2V5XSA9IHNvdXJjZVtrZXldO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBtZXJnZShvYmoxLCBvYmoyKSB7XHJcbiAgICAgICAgdmFyIG1lcmdlZCA9IHt9O1xyXG4gICAgICAgIGV4dGVuZE9iamVjdChtZXJnZWQsIG9iajEpO1xyXG4gICAgICAgIGV4dGVuZE9iamVjdChtZXJnZWQsIG9iajIpO1xyXG5cclxuICAgICAgICByZXR1cm4gbWVyZ2VkO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydHMuaXNNYXBwZWQgPSBmdW5jdGlvbiAodmlld01vZGVsKSB7XHJcbiAgICAgICAgdmFyIHVud3JhcHBlZCA9IGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUodmlld01vZGVsKTtcclxuICAgICAgICByZXR1cm4gdW53cmFwcGVkICYmIHVud3JhcHBlZFttYXBwaW5nUHJvcGVydHldO1xyXG4gICAgfTtcclxuXHJcbiAgICBleHBvcnRzLmZyb21KUyA9IGZ1bmN0aW9uIChqc09iamVjdCAvKiwgaW5wdXRPcHRpb25zLCB0YXJnZXQqLyApIHtcclxuICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHRocm93IG5ldyBFcnJvcihcIldoZW4gY2FsbGluZyBrby5tYXBwaW5nLmZyb21KUywgcGFzcyB0aGUgb2JqZWN0IHlvdSB3YW50IHRvIGNvbnZlcnQuXCIpO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAoIW1hcHBpbmdOZXN0aW5nKyspIHtcclxuICAgICAgICAgICAgICAgIGRlcGVuZGVudE9ic2VydmFibGVzID0gW107XHJcbiAgICAgICAgICAgICAgICB2aXNpdGVkT2JqZWN0cyA9IG5ldyBvYmplY3RMb29rdXAoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdmFyIG9wdGlvbnM7XHJcbiAgICAgICAgICAgIHZhciB0YXJnZXQ7XHJcblxyXG4gICAgICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAyKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoYXJndW1lbnRzWzFdW21hcHBpbmdQcm9wZXJ0eV0pIHtcclxuICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBhcmd1bWVudHNbMV07XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgPSBhcmd1bWVudHNbMV07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMykge1xyXG4gICAgICAgICAgICAgICAgb3B0aW9ucyA9IGFyZ3VtZW50c1sxXTtcclxuICAgICAgICAgICAgICAgIHRhcmdldCA9IGFyZ3VtZW50c1syXTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRhcmdldCkge1xyXG4gICAgICAgICAgICAgICAgb3B0aW9ucyA9IG1lcmdlKG9wdGlvbnMsIHRhcmdldFttYXBwaW5nUHJvcGVydHldKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvcHRpb25zID0gZmlsbE9wdGlvbnMob3B0aW9ucyk7XHJcblxyXG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gdXBkYXRlVmlld01vZGVsKHRhcmdldCwganNPYmplY3QsIG9wdGlvbnMpO1xyXG4gICAgICAgICAgICBpZiAodGFyZ2V0KSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB0YXJnZXQ7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIEV2YWx1YXRlIGFueSBkZXBlbmRlbnQgb2JzZXJ2YWJsZXMgdGhhdCB3ZXJlIHByb3hpZWQuXHJcbiAgICAgICAgICAgIC8vIERvIHRoaXMgYWZ0ZXIgdGhlIG1vZGVsJ3Mgb2JzZXJ2YWJsZXMgaGF2ZSBiZWVuIGNyZWF0ZWRcclxuICAgICAgICAgICAgaWYgKCEtLW1hcHBpbmdOZXN0aW5nKSB7XHJcbiAgICAgICAgICAgICAgICB3aGlsZSAoZGVwZW5kZW50T2JzZXJ2YWJsZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIERPID0gZGVwZW5kZW50T2JzZXJ2YWJsZXMucG9wKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKERPKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIERPKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBNb3ZlIHRoaXMgbWFnaWMgcHJvcGVydHkgdG8gdGhlIHVuZGVybHlpbmcgZGVwZW5kZW50IG9ic2VydmFibGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgRE8uX19ET1tcInRocm90dGxlRXZhbHVhdGlvblwiXSA9IERPW1widGhyb3R0bGVFdmFsdWF0aW9uXCJdO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gU2F2ZSBhbnkgbmV3IG1hcHBpbmcgb3B0aW9ucyBpbiB0aGUgdmlldyBtb2RlbCwgc28gdGhhdCB1cGRhdGVGcm9tSlMgY2FuIHVzZSB0aGVtIGxhdGVyLlxyXG4gICAgICAgICAgICByZXN1bHRbbWFwcGluZ1Byb3BlcnR5XSA9IG1lcmdlKHJlc3VsdFttYXBwaW5nUHJvcGVydHldLCBvcHRpb25zKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgfSBjYXRjaChlKSB7XHJcbiAgICAgICAgICAgIG1hcHBpbmdOZXN0aW5nID0gMDtcclxuICAgICAgICAgICAgdGhyb3cgZTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIGV4cG9ydHMuZnJvbUpTT04gPSBmdW5jdGlvbiAoanNvblN0cmluZyAvKiwgb3B0aW9ucywgdGFyZ2V0Ki8gKSB7XHJcbiAgICAgICAgdmFyIHBhcnNlZCA9IGtvLnV0aWxzLnBhcnNlSnNvbihqc29uU3RyaW5nKTtcclxuICAgICAgICB2YXIgYXJnQXJyYXkgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xyXG4gICAgICAgIGFyZ0FycmF5WzBdID0gcGFyc2VkO1xyXG4gICAgICAgIHJldHVybiBleHBvcnRzLmZyb21KUy5hcHBseSh0aGlzLCBhcmdBcnJheSk7XHJcbiAgICB9O1xyXG5cclxuICAgIGV4cG9ydHMudXBkYXRlRnJvbUpTID0gZnVuY3Rpb24gKHZpZXdNb2RlbCkge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcImtvLm1hcHBpbmcudXBkYXRlRnJvbUpTLCB1c2Uga28ubWFwcGluZy5mcm9tSlMgaW5zdGVhZC4gUGxlYXNlIG5vdGUgdGhhdCB0aGUgb3JkZXIgb2YgcGFyYW1ldGVycyBpcyBkaWZmZXJlbnQhXCIpO1xyXG4gICAgfTtcclxuXHJcbiAgICBleHBvcnRzLnVwZGF0ZUZyb21KU09OID0gZnVuY3Rpb24gKHZpZXdNb2RlbCkge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcImtvLm1hcHBpbmcudXBkYXRlRnJvbUpTT04sIHVzZSBrby5tYXBwaW5nLmZyb21KU09OIGluc3RlYWQuIFBsZWFzZSBub3RlIHRoYXQgdGhlIG9yZGVyIG9mIHBhcmFtZXRlcnMgaXMgZGlmZmVyZW50IVwiKTtcclxuICAgIH07XHJcblxyXG4gICAgZXhwb3J0cy50b0pTID0gZnVuY3Rpb24gKHJvb3RPYmplY3QsIG9wdGlvbnMpIHtcclxuICAgICAgICBpZiAoIWRlZmF1bHRPcHRpb25zKSBleHBvcnRzLnJlc2V0RGVmYXVsdE9wdGlvbnMoKTtcclxuXHJcbiAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB0aHJvdyBuZXcgRXJyb3IoXCJXaGVuIGNhbGxpbmcga28ubWFwcGluZy50b0pTLCBwYXNzIHRoZSBvYmplY3QgeW91IHdhbnQgdG8gY29udmVydC5cIik7XHJcbiAgICAgICAgaWYgKGV4cG9ydHMuZ2V0VHlwZShkZWZhdWx0T3B0aW9ucy5pZ25vcmUpICE9PSBcImFycmF5XCIpIHRocm93IG5ldyBFcnJvcihcImtvLm1hcHBpbmcuZGVmYXVsdE9wdGlvbnMoKS5pZ25vcmUgc2hvdWxkIGJlIGFuIGFycmF5LlwiKTtcclxuICAgICAgICBpZiAoZXhwb3J0cy5nZXRUeXBlKGRlZmF1bHRPcHRpb25zLmluY2x1ZGUpICE9PSBcImFycmF5XCIpIHRocm93IG5ldyBFcnJvcihcImtvLm1hcHBpbmcuZGVmYXVsdE9wdGlvbnMoKS5pbmNsdWRlIHNob3VsZCBiZSBhbiBhcnJheS5cIik7XHJcbiAgICAgICAgaWYgKGV4cG9ydHMuZ2V0VHlwZShkZWZhdWx0T3B0aW9ucy5jb3B5KSAhPT0gXCJhcnJheVwiKSB0aHJvdyBuZXcgRXJyb3IoXCJrby5tYXBwaW5nLmRlZmF1bHRPcHRpb25zKCkuY29weSBzaG91bGQgYmUgYW4gYXJyYXkuXCIpO1xyXG5cclxuICAgICAgICAvLyBNZXJnZSBpbiB0aGUgb3B0aW9ucyB1c2VkIGluIGZyb21KU1xyXG4gICAgICAgIG9wdGlvbnMgPSBmaWxsT3B0aW9ucyhvcHRpb25zLCByb290T2JqZWN0W21hcHBpbmdQcm9wZXJ0eV0pO1xyXG5cclxuICAgICAgICAvLyBXZSBqdXN0IHVud3JhcCBldmVyeXRoaW5nIGF0IGV2ZXJ5IGxldmVsIGluIHRoZSBvYmplY3QgZ3JhcGhcclxuICAgICAgICByZXR1cm4gZXhwb3J0cy52aXNpdE1vZGVsKHJvb3RPYmplY3QsIGZ1bmN0aW9uICh4KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKHgpO1xyXG4gICAgICAgIH0sIG9wdGlvbnMpO1xyXG4gICAgfTtcclxuXHJcbiAgICBleHBvcnRzLnRvSlNPTiA9IGZ1bmN0aW9uIChyb290T2JqZWN0LCBvcHRpb25zKSB7XHJcbiAgICAgICAgdmFyIHBsYWluSmF2YVNjcmlwdE9iamVjdCA9IGV4cG9ydHMudG9KUyhyb290T2JqZWN0LCBvcHRpb25zKTtcclxuICAgICAgICByZXR1cm4ga28udXRpbHMuc3RyaW5naWZ5SnNvbihwbGFpbkphdmFTY3JpcHRPYmplY3QpO1xyXG4gICAgfTtcclxuXHJcbiAgICBleHBvcnRzLmRlZmF1bHRPcHRpb25zID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBkZWZhdWx0T3B0aW9ucyA9IGFyZ3VtZW50c1swXTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gZGVmYXVsdE9wdGlvbnM7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBleHBvcnRzLnJlc2V0RGVmYXVsdE9wdGlvbnMgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgZGVmYXVsdE9wdGlvbnMgPSB7XHJcbiAgICAgICAgICAgIGluY2x1ZGU6IF9kZWZhdWx0T3B0aW9ucy5pbmNsdWRlLnNsaWNlKDApLFxyXG4gICAgICAgICAgICBpZ25vcmU6IF9kZWZhdWx0T3B0aW9ucy5pZ25vcmUuc2xpY2UoMCksXHJcbiAgICAgICAgICAgIGNvcHk6IF9kZWZhdWx0T3B0aW9ucy5jb3B5LnNsaWNlKDApLFxyXG4gICAgICAgICAgICBvYnNlcnZlOiBfZGVmYXVsdE9wdGlvbnMub2JzZXJ2ZS5zbGljZSgwKVxyXG4gICAgICAgIH07XHJcbiAgICB9O1xyXG5cclxuICAgIGV4cG9ydHMuZ2V0VHlwZSA9IGZ1bmN0aW9uKHgpIHtcclxuICAgICAgICBpZiAoKHgpICYmICh0eXBlb2YgKHgpID09PSBcIm9iamVjdFwiKSkge1xyXG4gICAgICAgICAgICBpZiAoeC5jb25zdHJ1Y3RvciA9PT0gRGF0ZSkgcmV0dXJuIFwiZGF0ZVwiO1xyXG4gICAgICAgICAgICBpZiAoeC5jb25zdHJ1Y3RvciA9PT0gQXJyYXkpIHJldHVybiBcImFycmF5XCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0eXBlb2YgeDtcclxuICAgIH07XHJcblxyXG4gICAgZnVuY3Rpb24gZmlsbE9wdGlvbnMocmF3T3B0aW9ucywgb3RoZXJPcHRpb25zKSB7XHJcbiAgICAgICAgdmFyIG9wdGlvbnMgPSBtZXJnZSh7fSwgcmF3T3B0aW9ucyk7XHJcblxyXG4gICAgICAgIC8vIE1vdmUgcmVjb2duaXplZCByb290LWxldmVsIHByb3BlcnRpZXMgaW50byBhIHJvb3QgbmFtZXNwYWNlXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IHJlY29nbml6ZWRSb290UHJvcGVydGllcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgICAgICB2YXIgcHJvcGVydHkgPSByZWNvZ25pemVkUm9vdFByb3BlcnRpZXNbaV07XHJcblxyXG4gICAgICAgICAgICAvLyBDYXJyeSBvbiwgdW5sZXNzIHRoaXMgcHJvcGVydHkgaXMgcHJlc2VudFxyXG4gICAgICAgICAgICBpZiAoIW9wdGlvbnNbcHJvcGVydHldKSBjb250aW51ZTtcclxuXHJcbiAgICAgICAgICAgIC8vIE1vdmUgdGhlIHByb3BlcnR5IGludG8gdGhlIHJvb3QgbmFtZXNwYWNlXHJcbiAgICAgICAgICAgIGlmICghKG9wdGlvbnNbXCJcIl0gaW5zdGFuY2VvZiBPYmplY3QpKSBvcHRpb25zW1wiXCJdID0ge307XHJcbiAgICAgICAgICAgIG9wdGlvbnNbXCJcIl1bcHJvcGVydHldID0gb3B0aW9uc1twcm9wZXJ0eV07XHJcbiAgICAgICAgICAgIGRlbGV0ZSBvcHRpb25zW3Byb3BlcnR5XTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChvdGhlck9wdGlvbnMpIHtcclxuICAgICAgICAgICAgb3B0aW9ucy5pZ25vcmUgPSBtZXJnZUFycmF5cyhvdGhlck9wdGlvbnMuaWdub3JlLCBvcHRpb25zLmlnbm9yZSk7XHJcbiAgICAgICAgICAgIG9wdGlvbnMuaW5jbHVkZSA9IG1lcmdlQXJyYXlzKG90aGVyT3B0aW9ucy5pbmNsdWRlLCBvcHRpb25zLmluY2x1ZGUpO1xyXG4gICAgICAgICAgICBvcHRpb25zLmNvcHkgPSBtZXJnZUFycmF5cyhvdGhlck9wdGlvbnMuY29weSwgb3B0aW9ucy5jb3B5KTtcclxuICAgICAgICAgICAgb3B0aW9ucy5vYnNlcnZlID0gbWVyZ2VBcnJheXMob3RoZXJPcHRpb25zLm9ic2VydmUsIG9wdGlvbnMub2JzZXJ2ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG9wdGlvbnMuaWdub3JlID0gbWVyZ2VBcnJheXMob3B0aW9ucy5pZ25vcmUsIGRlZmF1bHRPcHRpb25zLmlnbm9yZSk7XHJcbiAgICAgICAgb3B0aW9ucy5pbmNsdWRlID0gbWVyZ2VBcnJheXMob3B0aW9ucy5pbmNsdWRlLCBkZWZhdWx0T3B0aW9ucy5pbmNsdWRlKTtcclxuICAgICAgICBvcHRpb25zLmNvcHkgPSBtZXJnZUFycmF5cyhvcHRpb25zLmNvcHksIGRlZmF1bHRPcHRpb25zLmNvcHkpO1xyXG4gICAgICAgIG9wdGlvbnMub2JzZXJ2ZSA9IG1lcmdlQXJyYXlzKG9wdGlvbnMub2JzZXJ2ZSwgZGVmYXVsdE9wdGlvbnMub2JzZXJ2ZSk7XHJcblxyXG4gICAgICAgIG9wdGlvbnMubWFwcGVkUHJvcGVydGllcyA9IG9wdGlvbnMubWFwcGVkUHJvcGVydGllcyB8fCB7fTtcclxuICAgICAgICBvcHRpb25zLmNvcGllZFByb3BlcnRpZXMgPSBvcHRpb25zLmNvcGllZFByb3BlcnRpZXMgfHwge307XHJcbiAgICAgICAgcmV0dXJuIG9wdGlvbnM7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gbWVyZ2VBcnJheXMoYSwgYikge1xyXG4gICAgICAgIGlmIChleHBvcnRzLmdldFR5cGUoYSkgIT09IFwiYXJyYXlcIikge1xyXG4gICAgICAgICAgICBpZiAoZXhwb3J0cy5nZXRUeXBlKGEpID09PSBcInVuZGVmaW5lZFwiKSBhID0gW107XHJcbiAgICAgICAgICAgIGVsc2UgYSA9IFthXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGV4cG9ydHMuZ2V0VHlwZShiKSAhPT0gXCJhcnJheVwiKSB7XHJcbiAgICAgICAgICAgIGlmIChleHBvcnRzLmdldFR5cGUoYikgPT09IFwidW5kZWZpbmVkXCIpIGIgPSBbXTtcclxuICAgICAgICAgICAgZWxzZSBiID0gW2JdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGtvLnV0aWxzLmFycmF5R2V0RGlzdGluY3RWYWx1ZXMoYS5jb25jYXQoYikpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFdoZW4gdXNpbmcgYSAnY3JlYXRlJyBjYWxsYmFjaywgd2UgcHJveHkgdGhlIGRlcGVuZGVudCBvYnNlcnZhYmxlIHNvIHRoYXQgaXQgZG9lc24ndCBpbW1lZGlhdGVseSBldmFsdWF0ZSBvbiBjcmVhdGlvbi5cclxuICAgIC8vIFRoZSByZWFzb24gaXMgdGhhdCB0aGUgZGVwZW5kZW50IG9ic2VydmFibGVzIGluIHRoZSB1c2VyLXNwZWNpZmllZCBjYWxsYmFjayBtYXkgY29udGFpbiByZWZlcmVuY2VzIHRvIHByb3BlcnRpZXMgdGhhdCBoYXZlIG5vdCBiZWVuIG1hcHBlZCB5ZXQuXHJcbiAgICBmdW5jdGlvbiB3aXRoUHJveHlEZXBlbmRlbnRPYnNlcnZhYmxlKGRlcGVuZGVudE9ic2VydmFibGVzLCBjYWxsYmFjaykge1xyXG4gICAgICAgIHZhciBsb2NhbERPID0ga28uZGVwZW5kZW50T2JzZXJ2YWJsZTtcclxuICAgICAgICBrby5kZXBlbmRlbnRPYnNlcnZhYmxlID0gZnVuY3Rpb24gKHJlYWQsIG93bmVyLCBvcHRpb25zKSB7XHJcbiAgICAgICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xyXG5cclxuICAgICAgICAgICAgaWYgKHJlYWQgJiYgdHlwZW9mIHJlYWQgPT0gXCJvYmplY3RcIikgeyAvLyBtaXJyb3JzIGNvbmRpdGlvbiBpbiBrbm9ja291dCBpbXBsZW1lbnRhdGlvbiBvZiBETydzXHJcbiAgICAgICAgICAgICAgICBvcHRpb25zID0gcmVhZDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdmFyIHJlYWxEZWZlckV2YWx1YXRpb24gPSBvcHRpb25zLmRlZmVyRXZhbHVhdGlvbjtcclxuXHJcbiAgICAgICAgICAgIHZhciBpc1JlbW92ZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIC8vIFdlIHdyYXAgdGhlIG9yaWdpbmFsIGRlcGVuZGVudCBvYnNlcnZhYmxlIHNvIHRoYXQgd2UgY2FuIHJlbW92ZSBpdCBmcm9tIHRoZSAnZGVwZW5kZW50T2JzZXJ2YWJsZXMnIGxpc3Qgd2UgbmVlZCB0byBldmFsdWF0ZSBhZnRlciBtYXBwaW5nIGhhc1xyXG4gICAgICAgICAgICAvLyBjb21wbGV0ZWQgaWYgdGhlIHVzZXIgYWxyZWFkeSBldmFsdWF0ZWQgdGhlIERPIHRoZW1zZWx2ZXMgaW4gdGhlIG1lYW50aW1lLlxyXG4gICAgICAgICAgICB2YXIgd3JhcCA9IGZ1bmN0aW9uIChETykge1xyXG4gICAgICAgICAgICAgICAgLy8gVGVtcG9yYXJpbHkgcmV2ZXJ0IGtvLmRlcGVuZGVudE9ic2VydmFibGUsIHNpbmNlIGl0IGlzIHVzZWQgaW4ga28uaXNXcml0ZWFibGVPYnNlcnZhYmxlXHJcbiAgICAgICAgICAgICAgICB2YXIgdG1wID0ga28uZGVwZW5kZW50T2JzZXJ2YWJsZTtcclxuICAgICAgICAgICAgICAgIGtvLmRlcGVuZGVudE9ic2VydmFibGUgPSByZWFsS29EZXBlbmRlbnRPYnNlcnZhYmxlO1xyXG4gICAgICAgICAgICAgICAgdmFyIGlzV3JpdGVhYmxlID0ga28uaXNXcml0ZWFibGVPYnNlcnZhYmxlKERPKTtcclxuICAgICAgICAgICAgICAgIGtvLmRlcGVuZGVudE9ic2VydmFibGUgPSB0bXA7XHJcblxyXG4gICAgICAgICAgICAgICAgdmFyIHdyYXBwZWQgPSByZWFsS29EZXBlbmRlbnRPYnNlcnZhYmxlKHtcclxuICAgICAgICAgICAgICAgICAgICByZWFkOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNSZW1vdmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrby51dGlscy5hcnJheVJlbW92ZUl0ZW0oZGVwZW5kZW50T2JzZXJ2YWJsZXMsIERPKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUmVtb3ZlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERPLmFwcGx5KERPLCBhcmd1bWVudHMpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgd3JpdGU6IGlzV3JpdGVhYmxlICYmIGZ1bmN0aW9uICh2YWwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERPKHZhbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBkZWZlckV2YWx1YXRpb246IHRydWVcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB3cmFwcGVkLl93cmFwcGVyID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHdyYXBwZWQuX19ETyA9IERPO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWQ7XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBvcHRpb25zLmRlZmVyRXZhbHVhdGlvbiA9IHRydWU7IC8vIHdpbGwgZWl0aGVyIHNldCBmb3IganVzdCBvcHRpb25zLCBvciBib3RoIHJlYWQvb3B0aW9ucy5cclxuICAgICAgICAgICAgdmFyIHJlYWxEZXBlbmRlbnRPYnNlcnZhYmxlID0gbmV3IHJlYWxLb0RlcGVuZGVudE9ic2VydmFibGUocmVhZCwgb3duZXIsIG9wdGlvbnMpO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFyZWFsRGVmZXJFdmFsdWF0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICByZWFsRGVwZW5kZW50T2JzZXJ2YWJsZSA9IHdyYXAocmVhbERlcGVuZGVudE9ic2VydmFibGUpO1xyXG4gICAgICAgICAgICAgICAgZGVwZW5kZW50T2JzZXJ2YWJsZXMucHVzaChyZWFsRGVwZW5kZW50T2JzZXJ2YWJsZSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiByZWFsRGVwZW5kZW50T2JzZXJ2YWJsZTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIGtvLmRlcGVuZGVudE9ic2VydmFibGUuZm4gPSByZWFsS29EZXBlbmRlbnRPYnNlcnZhYmxlLmZuO1xyXG4gICAgICAgIGtvLmNvbXB1dGVkID0ga28uZGVwZW5kZW50T2JzZXJ2YWJsZTtcclxuICAgICAgICB2YXIgcmVzdWx0ID0gY2FsbGJhY2soKTtcclxuICAgICAgICBrby5kZXBlbmRlbnRPYnNlcnZhYmxlID0gbG9jYWxETztcclxuICAgICAgICBrby5jb21wdXRlZCA9IGtvLmRlcGVuZGVudE9ic2VydmFibGU7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiB1cGRhdGVWaWV3TW9kZWwobWFwcGVkUm9vdE9iamVjdCwgcm9vdE9iamVjdCwgb3B0aW9ucywgcGFyZW50TmFtZSwgcGFyZW50LCBwYXJlbnRQcm9wZXJ0eU5hbWUsIG1hcHBlZFBhcmVudCkge1xyXG4gICAgICAgIHZhciBpc0FycmF5ID0gZXhwb3J0cy5nZXRUeXBlKGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUocm9vdE9iamVjdCkpID09PSBcImFycmF5XCI7XHJcblxyXG4gICAgICAgIHBhcmVudFByb3BlcnR5TmFtZSA9IHBhcmVudFByb3BlcnR5TmFtZSB8fCBcIlwiO1xyXG5cclxuICAgICAgICAvLyBJZiB0aGlzIG9iamVjdCB3YXMgYWxyZWFkeSBtYXBwZWQgcHJldmlvdXNseSwgdGFrZSB0aGUgb3B0aW9ucyBmcm9tIHRoZXJlIGFuZCBtZXJnZSB0aGVtIHdpdGggb3VyIGV4aXN0aW5nIG9uZXMuXHJcbiAgICAgICAgaWYgKGV4cG9ydHMuaXNNYXBwZWQobWFwcGVkUm9vdE9iamVjdCkpIHtcclxuICAgICAgICAgICAgdmFyIHByZXZpb3VzTWFwcGluZyA9IGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUobWFwcGVkUm9vdE9iamVjdClbbWFwcGluZ1Byb3BlcnR5XTtcclxuICAgICAgICAgICAgb3B0aW9ucyA9IG1lcmdlKHByZXZpb3VzTWFwcGluZywgb3B0aW9ucyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgY2FsbGJhY2tQYXJhbXMgPSB7XHJcbiAgICAgICAgICAgIGRhdGE6IHJvb3RPYmplY3QsXHJcbiAgICAgICAgICAgIHBhcmVudDogbWFwcGVkUGFyZW50IHx8IHBhcmVudFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHZhciBoYXNDcmVhdGVDYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnNbcGFyZW50TmFtZV0gJiYgb3B0aW9uc1twYXJlbnROYW1lXS5jcmVhdGUgaW5zdGFuY2VvZiBGdW5jdGlvbjtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB2YXIgY3JlYXRlQ2FsbGJhY2sgPSBmdW5jdGlvbiAoZGF0YSkge1xyXG4gICAgICAgICAgICByZXR1cm4gd2l0aFByb3h5RGVwZW5kZW50T2JzZXJ2YWJsZShkZXBlbmRlbnRPYnNlcnZhYmxlcywgZnVuY3Rpb24gKCkge1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChrby51dGlscy51bndyYXBPYnNlcnZhYmxlKHBhcmVudCkgaW5zdGFuY2VvZiBBcnJheSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvcHRpb25zW3BhcmVudE5hbWVdLmNyZWF0ZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IGRhdGEgfHwgY2FsbGJhY2tQYXJhbXMuZGF0YSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBjYWxsYmFja1BhcmFtcy5wYXJlbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNraXA6IGVtcHR5UmV0dXJuXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvcHRpb25zW3BhcmVudE5hbWVdLmNyZWF0ZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IGRhdGEgfHwgY2FsbGJhY2tQYXJhbXMuZGF0YSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBjYWxsYmFja1BhcmFtcy5wYXJlbnRcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdmFyIGhhc1VwZGF0ZUNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gb3B0aW9uc1twYXJlbnROYW1lXSAmJiBvcHRpb25zW3BhcmVudE5hbWVdLnVwZGF0ZSBpbnN0YW5jZW9mIEZ1bmN0aW9uO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHZhciB1cGRhdGVDYWxsYmFjayA9IGZ1bmN0aW9uIChvYmosIGRhdGEpIHtcclxuICAgICAgICAgICAgdmFyIHBhcmFtcyA9IHtcclxuICAgICAgICAgICAgICAgIGRhdGE6IGRhdGEgfHwgY2FsbGJhY2tQYXJhbXMuZGF0YSxcclxuICAgICAgICAgICAgICAgIHBhcmVudDogY2FsbGJhY2tQYXJhbXMucGFyZW50LFxyXG4gICAgICAgICAgICAgICAgdGFyZ2V0OiBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKG9iailcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIGlmIChrby5pc1dyaXRlYWJsZU9ic2VydmFibGUob2JqKSkge1xyXG4gICAgICAgICAgICAgICAgcGFyYW1zLm9ic2VydmFibGUgPSBvYmo7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiBvcHRpb25zW3BhcmVudE5hbWVdLnVwZGF0ZShwYXJhbXMpO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHZhciBhbHJlYWR5TWFwcGVkID0gdmlzaXRlZE9iamVjdHMuZ2V0KHJvb3RPYmplY3QpO1xyXG4gICAgICAgIGlmIChhbHJlYWR5TWFwcGVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBhbHJlYWR5TWFwcGVkO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcGFyZW50TmFtZSA9IHBhcmVudE5hbWUgfHwgXCJcIjtcclxuXHJcbiAgICAgICAgaWYgKCFpc0FycmF5KSB7XHJcbiAgICAgICAgICAgIC8vIEZvciBhdG9taWMgdHlwZXMsIGRvIGEgZGlyZWN0IHVwZGF0ZSBvbiB0aGUgb2JzZXJ2YWJsZVxyXG4gICAgICAgICAgICBpZiAoIWNhbkhhdmVQcm9wZXJ0aWVzKHJvb3RPYmplY3QpKSB7XHJcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGV4cG9ydHMuZ2V0VHlwZShyb290T2JqZWN0KSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcImZ1bmN0aW9uXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGhhc1VwZGF0ZUNhbGxiYWNrKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtvLmlzV3JpdGVhYmxlT2JzZXJ2YWJsZShyb290T2JqZWN0KSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdE9iamVjdCh1cGRhdGVDYWxsYmFjayhyb290T2JqZWN0KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwZWRSb290T2JqZWN0ID0gcm9vdE9iamVjdDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBlZFJvb3RPYmplY3QgPSB1cGRhdGVDYWxsYmFjayhyb290T2JqZWN0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBlZFJvb3RPYmplY3QgPSByb290T2JqZWN0O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlVG9Xcml0ZTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoa28uaXNXcml0ZWFibGVPYnNlcnZhYmxlKG1hcHBlZFJvb3RPYmplY3QpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNVcGRhdGVDYWxsYmFjaygpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVRvV3JpdGUgPSB1cGRhdGVDYWxsYmFjayhtYXBwZWRSb290T2JqZWN0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBlZFJvb3RPYmplY3QodmFsdWVUb1dyaXRlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZVRvV3JpdGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVRvV3JpdGUgPSBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKHJvb3RPYmplY3QpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGVkUm9vdE9iamVjdCh2YWx1ZVRvV3JpdGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlVG9Xcml0ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBoYXNDcmVhdGVPclVwZGF0ZUNhbGxiYWNrID0gaGFzQ3JlYXRlQ2FsbGJhY2soKSB8fCBoYXNVcGRhdGVDYWxsYmFjaygpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc0NyZWF0ZUNhbGxiYWNrKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBlZFJvb3RPYmplY3QgPSBjcmVhdGVDYWxsYmFjaygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGVkUm9vdE9iamVjdCA9IGtvLm9ic2VydmFibGUoa28udXRpbHMudW53cmFwT2JzZXJ2YWJsZShyb290T2JqZWN0KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNVcGRhdGVDYWxsYmFjaygpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwZWRSb290T2JqZWN0KHVwZGF0ZUNhbGxiYWNrKG1hcHBlZFJvb3RPYmplY3QpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc0NyZWF0ZU9yVXBkYXRlQ2FsbGJhY2spIHJldHVybiBtYXBwZWRSb290T2JqZWN0O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBtYXBwZWRSb290T2JqZWN0ID0ga28udXRpbHMudW53cmFwT2JzZXJ2YWJsZShtYXBwZWRSb290T2JqZWN0KTtcclxuICAgICAgICAgICAgICAgIGlmICghbWFwcGVkUm9vdE9iamVjdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChoYXNDcmVhdGVDYWxsYmFjaygpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBjcmVhdGVDYWxsYmFjaygpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc1VwZGF0ZUNhbGxiYWNrKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHVwZGF0ZUNhbGxiYWNrKHJlc3VsdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc1VwZGF0ZUNhbGxiYWNrKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1cGRhdGVDYWxsYmFjayhyZXN1bHQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXBwZWRSb290T2JqZWN0ID0ge307XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChoYXNVcGRhdGVDYWxsYmFjaygpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWFwcGVkUm9vdE9iamVjdCA9IHVwZGF0ZUNhbGxiYWNrKG1hcHBlZFJvb3RPYmplY3QpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHZpc2l0ZWRPYmplY3RzLnNhdmUocm9vdE9iamVjdCwgbWFwcGVkUm9vdE9iamVjdCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoaGFzVXBkYXRlQ2FsbGJhY2soKSkgcmV0dXJuIG1hcHBlZFJvb3RPYmplY3Q7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gRm9yIG5vbi1hdG9taWMgdHlwZXMsIHZpc2l0IGFsbCBwcm9wZXJ0aWVzIGFuZCB1cGRhdGUgcmVjdXJzaXZlbHlcclxuICAgICAgICAgICAgICAgIHZpc2l0UHJvcGVydGllc09yQXJyYXlFbnRyaWVzKHJvb3RPYmplY3QsIGZ1bmN0aW9uIChpbmRleGVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGZ1bGxQcm9wZXJ0eU5hbWUgPSBwYXJlbnRQcm9wZXJ0eU5hbWUubGVuZ3RoID8gcGFyZW50UHJvcGVydHlOYW1lICsgXCIuXCIgKyBpbmRleGVyIDogaW5kZXhlcjtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGtvLnV0aWxzLmFycmF5SW5kZXhPZihvcHRpb25zLmlnbm9yZSwgZnVsbFByb3BlcnR5TmFtZSkgIT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGtvLnV0aWxzLmFycmF5SW5kZXhPZihvcHRpb25zLmNvcHksIGZ1bGxQcm9wZXJ0eU5hbWUpICE9IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBlZFJvb3RPYmplY3RbaW5kZXhlcl0gPSByb290T2JqZWN0W2luZGV4ZXJdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZih0eXBlb2Ygcm9vdE9iamVjdFtpbmRleGVyXSAhPSBcIm9iamVjdFwiICYmIHR5cGVvZiByb290T2JqZWN0W2luZGV4ZXJdICE9IFwiYXJyYXlcIiAmJiBvcHRpb25zLm9ic2VydmUubGVuZ3RoID4gMCAmJiBrby51dGlscy5hcnJheUluZGV4T2Yob3B0aW9ucy5vYnNlcnZlLCBmdWxsUHJvcGVydHlOYW1lKSA9PSAtMSlcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBlZFJvb3RPYmplY3RbaW5kZXhlcl0gPSByb290T2JqZWN0W2luZGV4ZXJdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmNvcGllZFByb3BlcnRpZXNbZnVsbFByb3BlcnR5TmFtZV0gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBJbiBjYXNlIHdlIGFyZSBhZGRpbmcgYW4gYWxyZWFkeSBtYXBwZWQgcHJvcGVydHksIGZpbGwgaXQgd2l0aCB0aGUgcHJldmlvdXNseSBtYXBwZWQgcHJvcGVydHkgdmFsdWUgdG8gcHJldmVudCByZWN1cnNpb24uXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyBhIHByb3BlcnR5IHRoYXQgd2FzIGdlbmVyYXRlZCBieSBmcm9tSlMsIHdlIHNob3VsZCB1c2UgdGhlIG9wdGlvbnMgc3BlY2lmaWVkIHRoZXJlXHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHByZXZNYXBwZWRQcm9wZXJ0eSA9IHZpc2l0ZWRPYmplY3RzLmdldChyb290T2JqZWN0W2luZGV4ZXJdKTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgcmV0dmFsID0gdXBkYXRlVmlld01vZGVsKG1hcHBlZFJvb3RPYmplY3RbaW5kZXhlcl0sIHJvb3RPYmplY3RbaW5kZXhlcl0sIG9wdGlvbnMsIGluZGV4ZXIsIG1hcHBlZFJvb3RPYmplY3QsIGZ1bGxQcm9wZXJ0eU5hbWUsIG1hcHBlZFJvb3RPYmplY3QpO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHByZXZNYXBwZWRQcm9wZXJ0eSB8fCByZXR2YWw7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmKG9wdGlvbnMub2JzZXJ2ZS5sZW5ndGggPiAwICYmIGtvLnV0aWxzLmFycmF5SW5kZXhPZihvcHRpb25zLm9ic2VydmUsIGZ1bGxQcm9wZXJ0eU5hbWUpID09IC0xKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGVkUm9vdE9iamVjdFtpbmRleGVyXSA9IGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUodmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmNvcGllZFByb3BlcnRpZXNbZnVsbFByb3BlcnR5TmFtZV0gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoa28uaXNXcml0ZWFibGVPYnNlcnZhYmxlKG1hcHBlZFJvb3RPYmplY3RbaW5kZXhlcl0pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0ga28udXRpbHMudW53cmFwT2JzZXJ2YWJsZSh2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXBwZWRSb290T2JqZWN0W2luZGV4ZXJdKCkgIT09IHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwZWRSb290T2JqZWN0W2luZGV4ZXJdKHZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gbWFwcGVkUm9vdE9iamVjdFtpbmRleGVyXSA9PT0gdW5kZWZpbmVkID8gdmFsdWUgOiBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKHZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGVkUm9vdE9iamVjdFtpbmRleGVyXSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5tYXBwZWRQcm9wZXJ0aWVzW2Z1bGxQcm9wZXJ0eU5hbWVdID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHsgLy9tYXBwZWRSb290T2JqZWN0IGlzIGFuIGFycmF5XHJcbiAgICAgICAgICAgIHZhciBjaGFuZ2VzID0gW107XHJcblxyXG4gICAgICAgICAgICB2YXIgaGFzS2V5Q2FsbGJhY2sgPSBmYWxzZTtcclxuICAgICAgICAgICAgdmFyIGtleUNhbGxiYWNrID0gZnVuY3Rpb24gKHgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB4O1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBpZiAob3B0aW9uc1twYXJlbnROYW1lXSAmJiBvcHRpb25zW3BhcmVudE5hbWVdLmtleSkge1xyXG4gICAgICAgICAgICAgICAga2V5Q2FsbGJhY2sgPSBvcHRpb25zW3BhcmVudE5hbWVdLmtleTtcclxuICAgICAgICAgICAgICAgIGhhc0tleUNhbGxiYWNrID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCFrby5pc09ic2VydmFibGUobWFwcGVkUm9vdE9iamVjdCkpIHtcclxuICAgICAgICAgICAgICAgIC8vIFdoZW4gY3JlYXRpbmcgdGhlIG5ldyBvYnNlcnZhYmxlIGFycmF5LCBhbHNvIGFkZCBhIGJ1bmNoIG9mIHV0aWxpdHkgZnVuY3Rpb25zIHRoYXQgdGFrZSB0aGUgJ2tleScgb2YgdGhlIGFycmF5IGl0ZW1zIGludG8gYWNjb3VudC5cclxuICAgICAgICAgICAgICAgIG1hcHBlZFJvb3RPYmplY3QgPSBrby5vYnNlcnZhYmxlQXJyYXkoW10pO1xyXG5cclxuICAgICAgICAgICAgICAgIG1hcHBlZFJvb3RPYmplY3QubWFwcGVkUmVtb3ZlID0gZnVuY3Rpb24gKHZhbHVlT3JQcmVkaWNhdGUpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgcHJlZGljYXRlID0gdHlwZW9mIHZhbHVlT3JQcmVkaWNhdGUgPT0gXCJmdW5jdGlvblwiID8gdmFsdWVPclByZWRpY2F0ZSA6IGZ1bmN0aW9uICh2YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlID09PSBrZXlDYWxsYmFjayh2YWx1ZU9yUHJlZGljYXRlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWFwcGVkUm9vdE9iamVjdC5yZW1vdmUoZnVuY3Rpb24gKGl0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByZWRpY2F0ZShrZXlDYWxsYmFjayhpdGVtKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgIG1hcHBlZFJvb3RPYmplY3QubWFwcGVkUmVtb3ZlQWxsID0gZnVuY3Rpb24gKGFycmF5T2ZWYWx1ZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgYXJyYXlPZktleXMgPSBmaWx0ZXJBcnJheUJ5S2V5KGFycmF5T2ZWYWx1ZXMsIGtleUNhbGxiYWNrKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWFwcGVkUm9vdE9iamVjdC5yZW1vdmUoZnVuY3Rpb24gKGl0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGtvLnV0aWxzLmFycmF5SW5kZXhPZihhcnJheU9mS2V5cywga2V5Q2FsbGJhY2soaXRlbSkpICE9IC0xO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgICBtYXBwZWRSb290T2JqZWN0Lm1hcHBlZERlc3Ryb3kgPSBmdW5jdGlvbiAodmFsdWVPclByZWRpY2F0ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBwcmVkaWNhdGUgPSB0eXBlb2YgdmFsdWVPclByZWRpY2F0ZSA9PSBcImZ1bmN0aW9uXCIgPyB2YWx1ZU9yUHJlZGljYXRlIDogZnVuY3Rpb24gKHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUgPT09IGtleUNhbGxiYWNrKHZhbHVlT3JQcmVkaWNhdGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXBwZWRSb290T2JqZWN0LmRlc3Ryb3koZnVuY3Rpb24gKGl0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByZWRpY2F0ZShrZXlDYWxsYmFjayhpdGVtKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgIG1hcHBlZFJvb3RPYmplY3QubWFwcGVkRGVzdHJveUFsbCA9IGZ1bmN0aW9uIChhcnJheU9mVmFsdWVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFycmF5T2ZLZXlzID0gZmlsdGVyQXJyYXlCeUtleShhcnJheU9mVmFsdWVzLCBrZXlDYWxsYmFjayk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1hcHBlZFJvb3RPYmplY3QuZGVzdHJveShmdW5jdGlvbiAoaXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ga28udXRpbHMuYXJyYXlJbmRleE9mKGFycmF5T2ZLZXlzLCBrZXlDYWxsYmFjayhpdGVtKSkgIT0gLTE7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgIG1hcHBlZFJvb3RPYmplY3QubWFwcGVkSW5kZXhPZiA9IGZ1bmN0aW9uIChpdGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGtleXMgPSBmaWx0ZXJBcnJheUJ5S2V5KG1hcHBlZFJvb3RPYmplY3QoKSwga2V5Q2FsbGJhY2spO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBrZXkgPSBrZXlDYWxsYmFjayhpdGVtKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ga28udXRpbHMuYXJyYXlJbmRleE9mKGtleXMsIGtleSk7XHJcbiAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgIG1hcHBlZFJvb3RPYmplY3QubWFwcGVkR2V0ID0gZnVuY3Rpb24gKGl0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWFwcGVkUm9vdE9iamVjdCgpW21hcHBlZFJvb3RPYmplY3QubWFwcGVkSW5kZXhPZihpdGVtKV07XHJcbiAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgIG1hcHBlZFJvb3RPYmplY3QubWFwcGVkQ3JlYXRlID0gZnVuY3Rpb24gKHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1hcHBlZFJvb3RPYmplY3QubWFwcGVkSW5kZXhPZih2YWx1ZSkgIT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZXJlIGFscmVhZHkgaXMgYW4gb2JqZWN0IHdpdGggdGhlIGtleSB0aGF0IHlvdSBzcGVjaWZpZWQuXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSBoYXNDcmVhdGVDYWxsYmFjaygpID8gY3JlYXRlQ2FsbGJhY2sodmFsdWUpIDogdmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGhhc1VwZGF0ZUNhbGxiYWNrKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1ZhbHVlID0gdXBkYXRlQ2FsbGJhY2soaXRlbSwgdmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoa28uaXNXcml0ZWFibGVPYnNlcnZhYmxlKGl0ZW0pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtKG5ld1ZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0gPSBuZXdWYWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBtYXBwZWRSb290T2JqZWN0LnB1c2goaXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW07XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB2YXIgY3VycmVudEFycmF5S2V5cyA9IGZpbHRlckFycmF5QnlLZXkoa28udXRpbHMudW53cmFwT2JzZXJ2YWJsZShtYXBwZWRSb290T2JqZWN0KSwga2V5Q2FsbGJhY2spLnNvcnQoKTtcclxuICAgICAgICAgICAgdmFyIG5ld0FycmF5S2V5cyA9IGZpbHRlckFycmF5QnlLZXkocm9vdE9iamVjdCwga2V5Q2FsbGJhY2spO1xyXG4gICAgICAgICAgICBpZiAoaGFzS2V5Q2FsbGJhY2spIG5ld0FycmF5S2V5cy5zb3J0KCk7XHJcbiAgICAgICAgICAgIHZhciBlZGl0U2NyaXB0ID0ga28udXRpbHMuY29tcGFyZUFycmF5cyhjdXJyZW50QXJyYXlLZXlzLCBuZXdBcnJheUtleXMpO1xyXG5cclxuICAgICAgICAgICAgdmFyIGlnbm9yZUluZGV4T2YgPSB7fTtcclxuXHJcbiAgICAgICAgICAgIHZhciBpO1xyXG4gICAgICAgICAgICB2YXIgajtcclxuXHJcbiAgICAgICAgICAgIHZhciBrZXk7XHJcbiAgICAgICAgICAgIHZhciB1bndyYXBwZWRSb290T2JqZWN0ID0ga28udXRpbHMudW53cmFwT2JzZXJ2YWJsZShyb290T2JqZWN0KTtcclxuICAgICAgICAgICAgdmFyIGl0ZW1zQnlLZXkgPSB7fTtcclxuICAgICAgICAgICAgdmFyIG9wdGltaXplZEtleXMgPSB0cnVlO1xyXG4gICAgICAgICAgICBmb3IgKGkgPSAwLCBqID0gdW53cmFwcGVkUm9vdE9iamVjdC5sZW5ndGg7IGkgPCBqOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGtleSA9IGtleUNhbGxiYWNrKHVud3JhcHBlZFJvb3RPYmplY3RbaV0pO1xyXG4gICAgICAgICAgICAgICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkIHx8IGtleSBpbnN0YW5jZW9mIE9iamVjdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG9wdGltaXplZEtleXMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGl0ZW1zQnlLZXlba2V5XSA9IHVud3JhcHBlZFJvb3RPYmplY3RbaV07XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHZhciBuZXdDb250ZW50cyA9IFtdO1xyXG4gICAgICAgICAgICB2YXIgcGFzc2VkT3ZlciA9IDA7XHJcbiAgICAgICAgICAgIGZvciAoaSA9IDAsIGogPSBlZGl0U2NyaXB0Lmxlbmd0aDsgaSA8IGo7IGkrKykge1xyXG4gICAgICAgICAgICAgICAga2V5ID0gZWRpdFNjcmlwdFtpXTtcclxuICAgICAgICAgICAgICAgIHZhciBtYXBwZWRJdGVtO1xyXG4gICAgICAgICAgICAgICAgdmFyIGZ1bGxQcm9wZXJ0eU5hbWUgPSBwYXJlbnRQcm9wZXJ0eU5hbWUgKyBcIltcIiArIGkgKyBcIl1cIjtcclxuICAgICAgICAgICAgICAgIHZhciBpdGVtO1xyXG4gICAgICAgICAgICAgICAgdmFyIGluZGV4O1xyXG4gICAgICAgICAgICAgICAgc3dpdGNoIChrZXkuc3RhdHVzKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiYWRkZWRcIjpcclxuICAgICAgICAgICAgICAgICAgICBpdGVtID0gb3B0aW1pemVkS2V5cyA/IGl0ZW1zQnlLZXlba2V5LnZhbHVlXSA6IGdldEl0ZW1CeUtleShrby51dGlscy51bndyYXBPYnNlcnZhYmxlKHJvb3RPYmplY3QpLCBrZXkudmFsdWUsIGtleUNhbGxiYWNrKTtcclxuICAgICAgICAgICAgICAgICAgICBtYXBwZWRJdGVtID0gdXBkYXRlVmlld01vZGVsKHVuZGVmaW5lZCwgaXRlbSwgb3B0aW9ucywgcGFyZW50TmFtZSwgbWFwcGVkUm9vdE9iamVjdCwgZnVsbFByb3BlcnR5TmFtZSwgcGFyZW50KTtcclxuICAgICAgICAgICAgICAgICAgICBpZighaGFzQ3JlYXRlQ2FsbGJhY2soKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXBwZWRJdGVtID0ga28udXRpbHMudW53cmFwT2JzZXJ2YWJsZShtYXBwZWRJdGVtKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGluZGV4ID0gaWdub3JhYmxlSW5kZXhPZihrby51dGlscy51bndyYXBPYnNlcnZhYmxlKHJvb3RPYmplY3QpLCBpdGVtLCBpZ25vcmVJbmRleE9mKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1hcHBlZEl0ZW0gPT09IGVtcHR5UmV0dXJuKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZE92ZXIrKztcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdDb250ZW50c1tpbmRleCAtIHBhc3NlZE92ZXJdID0gbWFwcGVkSXRlbTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlnbm9yZUluZGV4T2ZbaW5kZXhdID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJyZXRhaW5lZFwiOlxyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW0gPSBvcHRpbWl6ZWRLZXlzID8gaXRlbXNCeUtleVtrZXkudmFsdWVdIDogZ2V0SXRlbUJ5S2V5KGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUocm9vdE9iamVjdCksIGtleS52YWx1ZSwga2V5Q2FsbGJhY2spO1xyXG4gICAgICAgICAgICAgICAgICAgIG1hcHBlZEl0ZW0gPSBnZXRJdGVtQnlLZXkobWFwcGVkUm9vdE9iamVjdCwga2V5LnZhbHVlLCBrZXlDYWxsYmFjayk7XHJcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlVmlld01vZGVsKG1hcHBlZEl0ZW0sIGl0ZW0sIG9wdGlvbnMsIHBhcmVudE5hbWUsIG1hcHBlZFJvb3RPYmplY3QsIGZ1bGxQcm9wZXJ0eU5hbWUsIHBhcmVudCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGluZGV4ID0gaWdub3JhYmxlSW5kZXhPZihrby51dGlscy51bndyYXBPYnNlcnZhYmxlKHJvb3RPYmplY3QpLCBpdGVtLCBpZ25vcmVJbmRleE9mKTtcclxuICAgICAgICAgICAgICAgICAgICBuZXdDb250ZW50c1tpbmRleF0gPSBtYXBwZWRJdGVtO1xyXG4gICAgICAgICAgICAgICAgICAgIGlnbm9yZUluZGV4T2ZbaW5kZXhdID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJkZWxldGVkXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgbWFwcGVkSXRlbSA9IGdldEl0ZW1CeUtleShtYXBwZWRSb290T2JqZWN0LCBrZXkudmFsdWUsIGtleUNhbGxiYWNrKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBjaGFuZ2VzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50OiBrZXkuc3RhdHVzLFxyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW06IG1hcHBlZEl0ZW1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBtYXBwZWRSb290T2JqZWN0KG5ld0NvbnRlbnRzKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChvcHRpb25zW3BhcmVudE5hbWVdICYmIG9wdGlvbnNbcGFyZW50TmFtZV0uYXJyYXlDaGFuZ2VkKSB7XHJcbiAgICAgICAgICAgICAgICBrby51dGlscy5hcnJheUZvckVhY2goY2hhbmdlcywgZnVuY3Rpb24gKGNoYW5nZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnNbcGFyZW50TmFtZV0uYXJyYXlDaGFuZ2VkKGNoYW5nZS5ldmVudCwgY2hhbmdlLml0ZW0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBtYXBwZWRSb290T2JqZWN0O1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGlnbm9yYWJsZUluZGV4T2YoYXJyYXksIGl0ZW0sIGlnbm9yZUluZGljZXMpIHtcclxuICAgICAgICBmb3IgKHZhciBpID0gMCwgaiA9IGFycmF5Lmxlbmd0aDsgaSA8IGo7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoaWdub3JlSW5kaWNlc1tpXSA9PT0gdHJ1ZSkgY29udGludWU7XHJcbiAgICAgICAgICAgIGlmIChhcnJheVtpXSA9PT0gaXRlbSkgcmV0dXJuIGk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIG1hcEtleShpdGVtLCBjYWxsYmFjaykge1xyXG4gICAgICAgIHZhciBtYXBwZWRJdGVtO1xyXG4gICAgICAgIGlmIChjYWxsYmFjaykgbWFwcGVkSXRlbSA9IGNhbGxiYWNrKGl0ZW0pO1xyXG4gICAgICAgIGlmIChleHBvcnRzLmdldFR5cGUobWFwcGVkSXRlbSkgPT09IFwidW5kZWZpbmVkXCIpIG1hcHBlZEl0ZW0gPSBpdGVtO1xyXG5cclxuICAgICAgICByZXR1cm4ga28udXRpbHMudW53cmFwT2JzZXJ2YWJsZShtYXBwZWRJdGVtKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBnZXRJdGVtQnlLZXkoYXJyYXksIGtleSwgY2FsbGJhY2spIHtcclxuICAgICAgICBhcnJheSA9IGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUoYXJyYXkpO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBqID0gYXJyYXkubGVuZ3RoOyBpIDwgajsgaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciBpdGVtID0gYXJyYXlbaV07XHJcbiAgICAgICAgICAgIGlmIChtYXBLZXkoaXRlbSwgY2FsbGJhY2spID09PSBrZXkpIHJldHVybiBpdGVtO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiV2hlbiBjYWxsaW5nIGtvLnVwZGF0ZSosIHRoZSBrZXkgJ1wiICsga2V5ICsgXCInIHdhcyBub3QgZm91bmQhXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGZpbHRlckFycmF5QnlLZXkoYXJyYXksIGNhbGxiYWNrKSB7XHJcbiAgICAgICAgcmV0dXJuIGtvLnV0aWxzLmFycmF5TWFwKGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUoYXJyYXkpLCBmdW5jdGlvbiAoaXRlbSkge1xyXG4gICAgICAgICAgICBpZiAoY2FsbGJhY2spIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBtYXBLZXkoaXRlbSwgY2FsbGJhY2spO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiB2aXNpdFByb3BlcnRpZXNPckFycmF5RW50cmllcyhyb290T2JqZWN0LCB2aXNpdG9yQ2FsbGJhY2spIHtcclxuICAgICAgICBpZiAoZXhwb3J0cy5nZXRUeXBlKHJvb3RPYmplY3QpID09PSBcImFycmF5XCIpIHtcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByb290T2JqZWN0Lmxlbmd0aDsgaSsrKVxyXG4gICAgICAgICAgICB2aXNpdG9yQ2FsbGJhY2soaSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZm9yICh2YXIgcHJvcGVydHlOYW1lIGluIHJvb3RPYmplY3QpXHJcbiAgICAgICAgICAgIHZpc2l0b3JDYWxsYmFjayhwcm9wZXJ0eU5hbWUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBjYW5IYXZlUHJvcGVydGllcyhvYmplY3QpIHtcclxuICAgICAgICB2YXIgdHlwZSA9IGV4cG9ydHMuZ2V0VHlwZShvYmplY3QpO1xyXG4gICAgICAgIHJldHVybiAoKHR5cGUgPT09IFwib2JqZWN0XCIpIHx8ICh0eXBlID09PSBcImFycmF5XCIpKSAmJiAob2JqZWN0ICE9PSBudWxsKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBCYXNlZCBvbiB0aGUgcGFyZW50TmFtZSwgdGhpcyBjcmVhdGVzIGEgZnVsbHkgY2xhc3NpZmllZCBuYW1lIG9mIGEgcHJvcGVydHlcclxuXHJcbiAgICBmdW5jdGlvbiBnZXRQcm9wZXJ0eU5hbWUocGFyZW50TmFtZSwgcGFyZW50LCBpbmRleGVyKSB7XHJcbiAgICAgICAgdmFyIHByb3BlcnR5TmFtZSA9IHBhcmVudE5hbWUgfHwgXCJcIjtcclxuICAgICAgICBpZiAoZXhwb3J0cy5nZXRUeXBlKHBhcmVudCkgPT09IFwiYXJyYXlcIikge1xyXG4gICAgICAgICAgICBpZiAocGFyZW50TmFtZSkge1xyXG4gICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lICs9IFwiW1wiICsgaW5kZXhlciArIFwiXVwiO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHBhcmVudE5hbWUpIHtcclxuICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZSArPSBcIi5cIjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBwcm9wZXJ0eU5hbWUgKz0gaW5kZXhlcjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHByb3BlcnR5TmFtZTtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnRzLnZpc2l0TW9kZWwgPSBmdW5jdGlvbiAocm9vdE9iamVjdCwgY2FsbGJhY2ssIG9wdGlvbnMpIHtcclxuICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcclxuICAgICAgICBvcHRpb25zLnZpc2l0ZWRPYmplY3RzID0gb3B0aW9ucy52aXNpdGVkT2JqZWN0cyB8fCBuZXcgb2JqZWN0TG9va3VwKCk7XHJcblxyXG4gICAgICAgIHZhciBtYXBwZWRSb290T2JqZWN0O1xyXG4gICAgICAgIHZhciB1bndyYXBwZWRSb290T2JqZWN0ID0ga28udXRpbHMudW53cmFwT2JzZXJ2YWJsZShyb290T2JqZWN0KTtcclxuXHJcbiAgICAgICAgaWYgKCFjYW5IYXZlUHJvcGVydGllcyh1bndyYXBwZWRSb290T2JqZWN0KSkge1xyXG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2socm9vdE9iamVjdCwgb3B0aW9ucy5wYXJlbnROYW1lKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBvcHRpb25zID0gZmlsbE9wdGlvbnMob3B0aW9ucywgdW53cmFwcGVkUm9vdE9iamVjdFttYXBwaW5nUHJvcGVydHldKTtcclxuXHJcbiAgICAgICAgICAgIC8vIE9ubHkgZG8gYSBjYWxsYmFjaywgYnV0IGlnbm9yZSB0aGUgcmVzdWx0c1xyXG4gICAgICAgICAgICBjYWxsYmFjayhyb290T2JqZWN0LCBvcHRpb25zLnBhcmVudE5hbWUpO1xyXG4gICAgICAgICAgICBtYXBwZWRSb290T2JqZWN0ID0gZXhwb3J0cy5nZXRUeXBlKHVud3JhcHBlZFJvb3RPYmplY3QpID09PSBcImFycmF5XCIgPyBbXSA6IHt9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgb3B0aW9ucy52aXNpdGVkT2JqZWN0cy5zYXZlKHJvb3RPYmplY3QsIG1hcHBlZFJvb3RPYmplY3QpO1xyXG5cclxuICAgICAgICB2YXIgcGFyZW50TmFtZSA9IG9wdGlvbnMucGFyZW50TmFtZTtcclxuICAgICAgICB2aXNpdFByb3BlcnRpZXNPckFycmF5RW50cmllcyh1bndyYXBwZWRSb290T2JqZWN0LCBmdW5jdGlvbiAoaW5kZXhlcikge1xyXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5pZ25vcmUgJiYga28udXRpbHMuYXJyYXlJbmRleE9mKG9wdGlvbnMuaWdub3JlLCBpbmRleGVyKSAhPSAtMSkgcmV0dXJuO1xyXG5cclxuICAgICAgICAgICAgdmFyIHByb3BlcnR5VmFsdWUgPSB1bndyYXBwZWRSb290T2JqZWN0W2luZGV4ZXJdO1xyXG4gICAgICAgICAgICBvcHRpb25zLnBhcmVudE5hbWUgPSBnZXRQcm9wZXJ0eU5hbWUocGFyZW50TmFtZSwgdW53cmFwcGVkUm9vdE9iamVjdCwgaW5kZXhlcik7XHJcblxyXG4gICAgICAgICAgICAvLyBJZiB3ZSBkb24ndCB3YW50IHRvIGV4cGxpY2l0bHkgY29weSB0aGUgdW5tYXBwZWQgcHJvcGVydHkuLi5cclxuICAgICAgICAgICAgaWYgKGtvLnV0aWxzLmFycmF5SW5kZXhPZihvcHRpb25zLmNvcHksIGluZGV4ZXIpID09PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgLy8gLi4uZmluZCBvdXQgaWYgaXQncyBhIHByb3BlcnR5IHdlIHdhbnQgdG8gZXhwbGljaXRseSBpbmNsdWRlXHJcbiAgICAgICAgICAgICAgICBpZiAoa28udXRpbHMuYXJyYXlJbmRleE9mKG9wdGlvbnMuaW5jbHVkZSwgaW5kZXhlcikgPT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIG1hcHBlZCBwcm9wZXJ0aWVzIG9iamVjdCBjb250YWlucyBhbGwgdGhlIHByb3BlcnRpZXMgdGhhdCB3ZXJlIHBhcnQgb2YgdGhlIG9yaWdpbmFsIG9iamVjdC5cclxuICAgICAgICAgICAgICAgICAgICAvLyBJZiBhIHByb3BlcnR5IGRvZXMgbm90IGV4aXN0LCBhbmQgaXQgaXMgbm90IGJlY2F1c2UgaXQgaXMgcGFydCBvZiBhbiBhcnJheSAoZS5nLiBcIm15UHJvcFszXVwiKSwgdGhlbiBpdCBzaG91bGQgbm90IGJlIHVubWFwcGVkLlxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh1bndyYXBwZWRSb290T2JqZWN0W21hcHBpbmdQcm9wZXJ0eV0gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgdW53cmFwcGVkUm9vdE9iamVjdFttYXBwaW5nUHJvcGVydHldLm1hcHBlZFByb3BlcnRpZXMgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgIXVud3JhcHBlZFJvb3RPYmplY3RbbWFwcGluZ1Byb3BlcnR5XS5tYXBwZWRQcm9wZXJ0aWVzW2luZGV4ZXJdICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVud3JhcHBlZFJvb3RPYmplY3RbbWFwcGluZ1Byb3BlcnR5XS5jb3BpZWRQcm9wZXJ0aWVzICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICF1bndyYXBwZWRSb290T2JqZWN0W21hcHBpbmdQcm9wZXJ0eV0uY29waWVkUHJvcGVydGllc1tpbmRleGVyXSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBleHBvcnRzLmdldFR5cGUodW53cmFwcGVkUm9vdE9iamVjdCkgIT09IFwiYXJyYXlcIilcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHZhciBvdXRwdXRQcm9wZXJ0eTtcclxuICAgICAgICAgICAgc3dpdGNoIChleHBvcnRzLmdldFR5cGUoa28udXRpbHMudW53cmFwT2JzZXJ2YWJsZShwcm9wZXJ0eVZhbHVlKSkpIHtcclxuICAgICAgICAgICAgY2FzZSBcIm9iamVjdFwiOlxyXG4gICAgICAgICAgICBjYXNlIFwiYXJyYXlcIjpcclxuICAgICAgICAgICAgY2FzZSBcInVuZGVmaW5lZFwiOlxyXG4gICAgICAgICAgICAgICAgdmFyIHByZXZpb3VzbHlNYXBwZWRWYWx1ZSA9IG9wdGlvbnMudmlzaXRlZE9iamVjdHMuZ2V0KHByb3BlcnR5VmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgbWFwcGVkUm9vdE9iamVjdFtpbmRleGVyXSA9IChleHBvcnRzLmdldFR5cGUocHJldmlvdXNseU1hcHBlZFZhbHVlKSAhPT0gXCJ1bmRlZmluZWRcIikgPyBwcmV2aW91c2x5TWFwcGVkVmFsdWUgOiBleHBvcnRzLnZpc2l0TW9kZWwocHJvcGVydHlWYWx1ZSwgY2FsbGJhY2ssIG9wdGlvbnMpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICBtYXBwZWRSb290T2JqZWN0W2luZGV4ZXJdID0gY2FsbGJhY2socHJvcGVydHlWYWx1ZSwgb3B0aW9ucy5wYXJlbnROYW1lKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gbWFwcGVkUm9vdE9iamVjdDtcclxuICAgIH07XHJcblxyXG4gICAgZnVuY3Rpb24gc2ltcGxlT2JqZWN0TG9va3VwKCkge1xyXG4gICAgICAgIHZhciBrZXlzID0gW107XHJcbiAgICAgICAgdmFyIHZhbHVlcyA9IFtdO1xyXG4gICAgICAgIHRoaXMuc2F2ZSA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XHJcbiAgICAgICAgICAgIHZhciBleGlzdGluZ0luZGV4ID0ga28udXRpbHMuYXJyYXlJbmRleE9mKGtleXMsIGtleSk7XHJcbiAgICAgICAgICAgIGlmIChleGlzdGluZ0luZGV4ID49IDApIHZhbHVlc1tleGlzdGluZ0luZGV4XSA9IHZhbHVlO1xyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGtleXMucHVzaChrZXkpO1xyXG4gICAgICAgICAgICAgICAgdmFsdWVzLnB1c2godmFsdWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLmdldCA9IGZ1bmN0aW9uIChrZXkpIHtcclxuICAgICAgICAgICAgdmFyIGV4aXN0aW5nSW5kZXggPSBrby51dGlscy5hcnJheUluZGV4T2Yoa2V5cywga2V5KTtcclxuICAgICAgICAgICAgdmFyIHZhbHVlID0gKGV4aXN0aW5nSW5kZXggPj0gMCkgPyB2YWx1ZXNbZXhpc3RpbmdJbmRleF0gOiB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIG9iamVjdExvb2t1cCgpIHtcclxuICAgICAgICB2YXIgYnVja2V0cyA9IHt9O1xyXG5cclxuICAgICAgICB2YXIgZmluZEJ1Y2tldCA9IGZ1bmN0aW9uKGtleSkge1xyXG4gICAgICAgICAgICB2YXIgYnVja2V0S2V5O1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgYnVja2V0S2V5ID0ga2V5Oy8vSlNPTi5zdHJpbmdpZnkoa2V5KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgYnVja2V0S2V5ID0gXCIkJCRcIjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdmFyIGJ1Y2tldCA9IGJ1Y2tldHNbYnVja2V0S2V5XTtcclxuICAgICAgICAgICAgaWYgKGJ1Y2tldCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBidWNrZXQgPSBuZXcgc2ltcGxlT2JqZWN0TG9va3VwKCk7XHJcbiAgICAgICAgICAgICAgICBidWNrZXRzW2J1Y2tldEtleV0gPSBidWNrZXQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGJ1Y2tldDtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB0aGlzLnNhdmUgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xyXG4gICAgICAgICAgICBmaW5kQnVja2V0KGtleSkuc2F2ZShrZXksIHZhbHVlKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuZ2V0ID0gZnVuY3Rpb24gKGtleSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmluZEJ1Y2tldChrZXkpLmdldChrZXkpO1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbn0pKTtcclxuIiwiLyohXG4gKiBLbm9ja291dCBKYXZhU2NyaXB0IGxpYnJhcnkgdjMuNC4yXG4gKiAoYykgVGhlIEtub2Nrb3V0LmpzIHRlYW0gLSBodHRwOi8va25vY2tvdXRqcy5jb20vXG4gKiBMaWNlbnNlOiBNSVQgKGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwKVxuICovXG5cbihmdW5jdGlvbigpe1xudmFyIERFQlVHPXRydWU7XG4oZnVuY3Rpb24odW5kZWZpbmVkKXtcbiAgICAvLyAoMCwgZXZhbCkoJ3RoaXMnKSBpcyBhIHJvYnVzdCB3YXkgb2YgZ2V0dGluZyBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9iamVjdFxuICAgIC8vIEZvciBkZXRhaWxzLCBzZWUgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xNDExOTk4OC9yZXR1cm4tdGhpcy0wLWV2YWx0aGlzLzE0MTIwMDIzIzE0MTIwMDIzXG4gICAgdmFyIHdpbmRvdyA9IHRoaXMgfHwgKDAsIGV2YWwpKCd0aGlzJyksXG4gICAgICAgIGRvY3VtZW50ID0gd2luZG93Wydkb2N1bWVudCddLFxuICAgICAgICBuYXZpZ2F0b3IgPSB3aW5kb3dbJ25hdmlnYXRvciddLFxuICAgICAgICBqUXVlcnlJbnN0YW5jZSA9IHdpbmRvd1tcImpRdWVyeVwiXSxcbiAgICAgICAgSlNPTiA9IHdpbmRvd1tcIkpTT05cIl07XG4oZnVuY3Rpb24oZmFjdG9yeSkge1xuICAgIC8vIFN1cHBvcnQgdGhyZWUgbW9kdWxlIGxvYWRpbmcgc2NlbmFyaW9zXG4gICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lWydhbWQnXSkge1xuICAgICAgICAvLyBbMV0gQU1EIGFub255bW91cyBtb2R1bGVcbiAgICAgICAgZGVmaW5lKFsnZXhwb3J0cycsICdyZXF1aXJlJ10sIGZhY3RvcnkpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIC8vIFsyXSBDb21tb25KUy9Ob2RlLmpzXG4gICAgICAgIGZhY3RvcnkobW9kdWxlWydleHBvcnRzJ10gfHwgZXhwb3J0cyk7ICAvLyBtb2R1bGUuZXhwb3J0cyBpcyBmb3IgTm9kZS5qc1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFszXSBObyBtb2R1bGUgbG9hZGVyIChwbGFpbiA8c2NyaXB0PiB0YWcpIC0gcHV0IGRpcmVjdGx5IGluIGdsb2JhbCBuYW1lc3BhY2VcbiAgICAgICAgZmFjdG9yeSh3aW5kb3dbJ2tvJ10gPSB7fSk7XG4gICAgfVxufShmdW5jdGlvbihrb0V4cG9ydHMsIGFtZFJlcXVpcmUpe1xuLy8gSW50ZXJuYWxseSwgYWxsIEtPIG9iamVjdHMgYXJlIGF0dGFjaGVkIHRvIGtvRXhwb3J0cyAoZXZlbiB0aGUgbm9uLWV4cG9ydGVkIG9uZXMgd2hvc2UgbmFtZXMgd2lsbCBiZSBtaW5pZmllZCBieSB0aGUgY2xvc3VyZSBjb21waWxlcikuXG4vLyBJbiB0aGUgZnV0dXJlLCB0aGUgZm9sbG93aW5nIFwia29cIiB2YXJpYWJsZSBtYXkgYmUgbWFkZSBkaXN0aW5jdCBmcm9tIFwia29FeHBvcnRzXCIgc28gdGhhdCBwcml2YXRlIG9iamVjdHMgYXJlIG5vdCBleHRlcm5hbGx5IHJlYWNoYWJsZS5cbnZhciBrbyA9IHR5cGVvZiBrb0V4cG9ydHMgIT09ICd1bmRlZmluZWQnID8ga29FeHBvcnRzIDoge307XG4vLyBHb29nbGUgQ2xvc3VyZSBDb21waWxlciBoZWxwZXJzICh1c2VkIG9ubHkgdG8gbWFrZSB0aGUgbWluaWZpZWQgZmlsZSBzbWFsbGVyKVxua28uZXhwb3J0U3ltYm9sID0gZnVuY3Rpb24oa29QYXRoLCBvYmplY3QpIHtcbiAgICB2YXIgdG9rZW5zID0ga29QYXRoLnNwbGl0KFwiLlwiKTtcblxuICAgIC8vIEluIHRoZSBmdXR1cmUsIFwia29cIiBtYXkgYmVjb21lIGRpc3RpbmN0IGZyb20gXCJrb0V4cG9ydHNcIiAoc28gdGhhdCBub24tZXhwb3J0ZWQgb2JqZWN0cyBhcmUgbm90IHJlYWNoYWJsZSlcbiAgICAvLyBBdCB0aGF0IHBvaW50LCBcInRhcmdldFwiIHdvdWxkIGJlIHNldCB0bzogKHR5cGVvZiBrb0V4cG9ydHMgIT09IFwidW5kZWZpbmVkXCIgPyBrb0V4cG9ydHMgOiBrbylcbiAgICB2YXIgdGFyZ2V0ID0ga287XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGggLSAxOyBpKyspXG4gICAgICAgIHRhcmdldCA9IHRhcmdldFt0b2tlbnNbaV1dO1xuICAgIHRhcmdldFt0b2tlbnNbdG9rZW5zLmxlbmd0aCAtIDFdXSA9IG9iamVjdDtcbn07XG5rby5leHBvcnRQcm9wZXJ0eSA9IGZ1bmN0aW9uKG93bmVyLCBwdWJsaWNOYW1lLCBvYmplY3QpIHtcbiAgICBvd25lcltwdWJsaWNOYW1lXSA9IG9iamVjdDtcbn07XG5rby52ZXJzaW9uID0gXCIzLjQuMlwiO1xuXG5rby5leHBvcnRTeW1ib2woJ3ZlcnNpb24nLCBrby52ZXJzaW9uKTtcbi8vIEZvciBhbnkgb3B0aW9ucyB0aGF0IG1heSBhZmZlY3QgdmFyaW91cyBhcmVhcyBvZiBLbm9ja291dCBhbmQgYXJlbid0IGRpcmVjdGx5IGFzc29jaWF0ZWQgd2l0aCBkYXRhIGJpbmRpbmcuXG5rby5vcHRpb25zID0ge1xuICAgICdkZWZlclVwZGF0ZXMnOiBmYWxzZSxcbiAgICAndXNlT25seU5hdGl2ZUV2ZW50cyc6IGZhbHNlXG59O1xuXG4vL2tvLmV4cG9ydFN5bWJvbCgnb3B0aW9ucycsIGtvLm9wdGlvbnMpOyAgIC8vICdvcHRpb25zJyBpc24ndCBtaW5pZmllZFxua28udXRpbHMgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIG9iamVjdEZvckVhY2gob2JqLCBhY3Rpb24pIHtcbiAgICAgICAgZm9yICh2YXIgcHJvcCBpbiBvYmopIHtcbiAgICAgICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkocHJvcCkpIHtcbiAgICAgICAgICAgICAgICBhY3Rpb24ocHJvcCwgb2JqW3Byb3BdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGV4dGVuZCh0YXJnZXQsIHNvdXJjZSkge1xuICAgICAgICBpZiAoc291cmNlKSB7XG4gICAgICAgICAgICBmb3IodmFyIHByb3AgaW4gc291cmNlKSB7XG4gICAgICAgICAgICAgICAgaWYoc291cmNlLmhhc093blByb3BlcnR5KHByb3ApKSB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldFtwcm9wXSA9IHNvdXJjZVtwcm9wXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZXRQcm90b3R5cGVPZihvYmosIHByb3RvKSB7XG4gICAgICAgIG9iai5fX3Byb3RvX18gPSBwcm90bztcbiAgICAgICAgcmV0dXJuIG9iajtcbiAgICB9XG5cbiAgICB2YXIgY2FuU2V0UHJvdG90eXBlID0gKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkpO1xuICAgIHZhciBjYW5Vc2VTeW1ib2xzID0gIURFQlVHICYmIHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbic7XG5cbiAgICAvLyBSZXByZXNlbnQgdGhlIGtub3duIGV2ZW50IHR5cGVzIGluIGEgY29tcGFjdCB3YXksIHRoZW4gYXQgcnVudGltZSB0cmFuc2Zvcm0gaXQgaW50byBhIGhhc2ggd2l0aCBldmVudCBuYW1lIGFzIGtleSAoZm9yIGZhc3QgbG9va3VwKVxuICAgIHZhciBrbm93bkV2ZW50cyA9IHt9LCBrbm93bkV2ZW50VHlwZXNCeUV2ZW50TmFtZSA9IHt9O1xuICAgIHZhciBrZXlFdmVudFR5cGVOYW1lID0gKG5hdmlnYXRvciAmJiAvRmlyZWZveFxcLzIvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpKSA/ICdLZXlib2FyZEV2ZW50JyA6ICdVSUV2ZW50cyc7XG4gICAga25vd25FdmVudHNba2V5RXZlbnRUeXBlTmFtZV0gPSBbJ2tleXVwJywgJ2tleWRvd24nLCAna2V5cHJlc3MnXTtcbiAgICBrbm93bkV2ZW50c1snTW91c2VFdmVudHMnXSA9IFsnY2xpY2snLCAnZGJsY2xpY2snLCAnbW91c2Vkb3duJywgJ21vdXNldXAnLCAnbW91c2Vtb3ZlJywgJ21vdXNlb3ZlcicsICdtb3VzZW91dCcsICdtb3VzZWVudGVyJywgJ21vdXNlbGVhdmUnXTtcbiAgICBvYmplY3RGb3JFYWNoKGtub3duRXZlbnRzLCBmdW5jdGlvbihldmVudFR5cGUsIGtub3duRXZlbnRzRm9yVHlwZSkge1xuICAgICAgICBpZiAoa25vd25FdmVudHNGb3JUeXBlLmxlbmd0aCkge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGogPSBrbm93bkV2ZW50c0ZvclR5cGUubGVuZ3RoOyBpIDwgajsgaSsrKVxuICAgICAgICAgICAgICAgIGtub3duRXZlbnRUeXBlc0J5RXZlbnROYW1lW2tub3duRXZlbnRzRm9yVHlwZVtpXV0gPSBldmVudFR5cGU7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICB2YXIgZXZlbnRzVGhhdE11c3RCZVJlZ2lzdGVyZWRVc2luZ0F0dGFjaEV2ZW50ID0geyAncHJvcGVydHljaGFuZ2UnOiB0cnVlIH07IC8vIFdvcmthcm91bmQgZm9yIGFuIElFOSBpc3N1ZSAtIGh0dHBzOi8vZ2l0aHViLmNvbS9TdGV2ZVNhbmRlcnNvbi9rbm9ja291dC9pc3N1ZXMvNDA2XG5cbiAgICAvLyBEZXRlY3QgSUUgdmVyc2lvbnMgZm9yIGJ1ZyB3b3JrYXJvdW5kcyAodXNlcyBJRSBjb25kaXRpb25hbHMsIG5vdCBVQSBzdHJpbmcsIGZvciByb2J1c3RuZXNzKVxuICAgIC8vIE5vdGUgdGhhdCwgc2luY2UgSUUgMTAgZG9lcyBub3Qgc3VwcG9ydCBjb25kaXRpb25hbCBjb21tZW50cywgdGhlIGZvbGxvd2luZyBsb2dpYyBvbmx5IGRldGVjdHMgSUUgPCAxMC5cbiAgICAvLyBDdXJyZW50bHkgdGhpcyBpcyBieSBkZXNpZ24sIHNpbmNlIElFIDEwKyBiZWhhdmVzIGNvcnJlY3RseSB3aGVuIHRyZWF0ZWQgYXMgYSBzdGFuZGFyZCBicm93c2VyLlxuICAgIC8vIElmIHRoZXJlIGlzIGEgZnV0dXJlIG5lZWQgdG8gZGV0ZWN0IHNwZWNpZmljIHZlcnNpb25zIG9mIElFMTArLCB3ZSB3aWxsIGFtZW5kIHRoaXMuXG4gICAgdmFyIGllVmVyc2lvbiA9IGRvY3VtZW50ICYmIChmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHZlcnNpb24gPSAzLCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSwgaUVsZW1zID0gZGl2LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpJyk7XG5cbiAgICAgICAgLy8gS2VlcCBjb25zdHJ1Y3RpbmcgY29uZGl0aW9uYWwgSFRNTCBibG9ja3MgdW50aWwgd2UgaGl0IG9uZSB0aGF0IHJlc29sdmVzIHRvIGFuIGVtcHR5IGZyYWdtZW50XG4gICAgICAgIHdoaWxlIChcbiAgICAgICAgICAgIGRpdi5pbm5lckhUTUwgPSAnPCEtLVtpZiBndCBJRSAnICsgKCsrdmVyc2lvbikgKyAnXT48aT48L2k+PCFbZW5kaWZdLS0+JyxcbiAgICAgICAgICAgIGlFbGVtc1swXVxuICAgICAgICApIHt9XG4gICAgICAgIHJldHVybiB2ZXJzaW9uID4gNCA/IHZlcnNpb24gOiB1bmRlZmluZWQ7XG4gICAgfSgpKTtcbiAgICB2YXIgaXNJZTYgPSBpZVZlcnNpb24gPT09IDYsXG4gICAgICAgIGlzSWU3ID0gaWVWZXJzaW9uID09PSA3O1xuXG4gICAgZnVuY3Rpb24gaXNDbGlja09uQ2hlY2thYmxlRWxlbWVudChlbGVtZW50LCBldmVudFR5cGUpIHtcbiAgICAgICAgaWYgKChrby51dGlscy50YWdOYW1lTG93ZXIoZWxlbWVudCkgIT09IFwiaW5wdXRcIikgfHwgIWVsZW1lbnQudHlwZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoZXZlbnRUeXBlLnRvTG93ZXJDYXNlKCkgIT0gXCJjbGlja1wiKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHZhciBpbnB1dFR5cGUgPSBlbGVtZW50LnR5cGU7XG4gICAgICAgIHJldHVybiAoaW5wdXRUeXBlID09IFwiY2hlY2tib3hcIikgfHwgKGlucHV0VHlwZSA9PSBcInJhZGlvXCIpO1xuICAgIH1cblxuICAgIC8vIEZvciBkZXRhaWxzIG9uIHRoZSBwYXR0ZXJuIGZvciBjaGFuZ2luZyBub2RlIGNsYXNzZXNcbiAgICAvLyBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9rbm9ja291dC9rbm9ja291dC9pc3N1ZXMvMTU5N1xuICAgIHZhciBjc3NDbGFzc05hbWVSZWdleCA9IC9cXFMrL2c7XG5cbiAgICBmdW5jdGlvbiB0b2dnbGVEb21Ob2RlQ3NzQ2xhc3Mobm9kZSwgY2xhc3NOYW1lcywgc2hvdWxkSGF2ZUNsYXNzKSB7XG4gICAgICAgIHZhciBhZGRPclJlbW92ZUZuO1xuICAgICAgICBpZiAoY2xhc3NOYW1lcykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBub2RlLmNsYXNzTGlzdCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICBhZGRPclJlbW92ZUZuID0gbm9kZS5jbGFzc0xpc3Rbc2hvdWxkSGF2ZUNsYXNzID8gJ2FkZCcgOiAncmVtb3ZlJ107XG4gICAgICAgICAgICAgICAga28udXRpbHMuYXJyYXlGb3JFYWNoKGNsYXNzTmFtZXMubWF0Y2goY3NzQ2xhc3NOYW1lUmVnZXgpLCBmdW5jdGlvbihjbGFzc05hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkT3JSZW1vdmVGbi5jYWxsKG5vZGUuY2xhc3NMaXN0LCBjbGFzc05hbWUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygbm9kZS5jbGFzc05hbWVbJ2Jhc2VWYWwnXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAvLyBTVkcgdGFnIC5jbGFzc05hbWVzIGlzIGFuIFNWR0FuaW1hdGVkU3RyaW5nIGluc3RhbmNlXG4gICAgICAgICAgICAgICAgdG9nZ2xlT2JqZWN0Q2xhc3NQcm9wZXJ0eVN0cmluZyhub2RlLmNsYXNzTmFtZSwgJ2Jhc2VWYWwnLCBjbGFzc05hbWVzLCBzaG91bGRIYXZlQ2xhc3MpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBub2RlLmNsYXNzTmFtZSBvdWdodCB0byBiZSBhIHN0cmluZy5cbiAgICAgICAgICAgICAgICB0b2dnbGVPYmplY3RDbGFzc1Byb3BlcnR5U3RyaW5nKG5vZGUsICdjbGFzc05hbWUnLCBjbGFzc05hbWVzLCBzaG91bGRIYXZlQ2xhc3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG9nZ2xlT2JqZWN0Q2xhc3NQcm9wZXJ0eVN0cmluZyhvYmosIHByb3AsIGNsYXNzTmFtZXMsIHNob3VsZEhhdmVDbGFzcykge1xuICAgICAgICAvLyBvYmovcHJvcCBpcyBlaXRoZXIgYSBub2RlLydjbGFzc05hbWUnIG9yIGEgU1ZHQW5pbWF0ZWRTdHJpbmcvJ2Jhc2VWYWwnLlxuICAgICAgICB2YXIgY3VycmVudENsYXNzTmFtZXMgPSBvYmpbcHJvcF0ubWF0Y2goY3NzQ2xhc3NOYW1lUmVnZXgpIHx8IFtdO1xuICAgICAgICBrby51dGlscy5hcnJheUZvckVhY2goY2xhc3NOYW1lcy5tYXRjaChjc3NDbGFzc05hbWVSZWdleCksIGZ1bmN0aW9uKGNsYXNzTmFtZSkge1xuICAgICAgICAgICAga28udXRpbHMuYWRkT3JSZW1vdmVJdGVtKGN1cnJlbnRDbGFzc05hbWVzLCBjbGFzc05hbWUsIHNob3VsZEhhdmVDbGFzcyk7XG4gICAgICAgIH0pO1xuICAgICAgICBvYmpbcHJvcF0gPSBjdXJyZW50Q2xhc3NOYW1lcy5qb2luKFwiIFwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBmaWVsZHNJbmNsdWRlZFdpdGhKc29uUG9zdDogWydhdXRoZW50aWNpdHlfdG9rZW4nLCAvXl9fUmVxdWVzdFZlcmlmaWNhdGlvblRva2VuKF8uKik/JC9dLFxuXG4gICAgICAgIGFycmF5Rm9yRWFjaDogZnVuY3Rpb24gKGFycmF5LCBhY3Rpb24pIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBqID0gYXJyYXkubGVuZ3RoOyBpIDwgajsgaSsrKVxuICAgICAgICAgICAgICAgIGFjdGlvbihhcnJheVtpXSwgaSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgYXJyYXlJbmRleE9mOiBmdW5jdGlvbiAoYXJyYXksIGl0ZW0pIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgQXJyYXkucHJvdG90eXBlLmluZGV4T2YgPT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgICAgICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGFycmF5LCBpdGVtKTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBqID0gYXJyYXkubGVuZ3RoOyBpIDwgajsgaSsrKVxuICAgICAgICAgICAgICAgIGlmIChhcnJheVtpXSA9PT0gaXRlbSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH0sXG5cbiAgICAgICAgYXJyYXlGaXJzdDogZnVuY3Rpb24gKGFycmF5LCBwcmVkaWNhdGUsIHByZWRpY2F0ZU93bmVyKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgaiA9IGFycmF5Lmxlbmd0aDsgaSA8IGo7IGkrKylcbiAgICAgICAgICAgICAgICBpZiAocHJlZGljYXRlLmNhbGwocHJlZGljYXRlT3duZXIsIGFycmF5W2ldLCBpKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFycmF5W2ldO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0sXG5cbiAgICAgICAgYXJyYXlSZW1vdmVJdGVtOiBmdW5jdGlvbiAoYXJyYXksIGl0ZW1Ub1JlbW92ZSkge1xuICAgICAgICAgICAgdmFyIGluZGV4ID0ga28udXRpbHMuYXJyYXlJbmRleE9mKGFycmF5LCBpdGVtVG9SZW1vdmUpO1xuICAgICAgICAgICAgaWYgKGluZGV4ID4gMCkge1xuICAgICAgICAgICAgICAgIGFycmF5LnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGFycmF5LnNoaWZ0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgYXJyYXlHZXREaXN0aW5jdFZhbHVlczogZnVuY3Rpb24gKGFycmF5KSB7XG4gICAgICAgICAgICBhcnJheSA9IGFycmF5IHx8IFtdO1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGogPSBhcnJheS5sZW5ndGg7IGkgPCBqOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoa28udXRpbHMuYXJyYXlJbmRleE9mKHJlc3VsdCwgYXJyYXlbaV0pIDwgMClcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goYXJyYXlbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcblxuICAgICAgICBhcnJheU1hcDogZnVuY3Rpb24gKGFycmF5LCBtYXBwaW5nKSB7XG4gICAgICAgICAgICBhcnJheSA9IGFycmF5IHx8IFtdO1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGogPSBhcnJheS5sZW5ndGg7IGkgPCBqOyBpKyspXG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobWFwcGluZyhhcnJheVtpXSwgaSkpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcblxuICAgICAgICBhcnJheUZpbHRlcjogZnVuY3Rpb24gKGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgICAgICAgICAgIGFycmF5ID0gYXJyYXkgfHwgW107XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgaiA9IGFycmF5Lmxlbmd0aDsgaSA8IGo7IGkrKylcbiAgICAgICAgICAgICAgICBpZiAocHJlZGljYXRlKGFycmF5W2ldLCBpKSlcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goYXJyYXlbaV0pO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcblxuICAgICAgICBhcnJheVB1c2hBbGw6IGZ1bmN0aW9uIChhcnJheSwgdmFsdWVzVG9QdXNoKSB7XG4gICAgICAgICAgICBpZiAodmFsdWVzVG9QdXNoIGluc3RhbmNlb2YgQXJyYXkpXG4gICAgICAgICAgICAgICAgYXJyYXkucHVzaC5hcHBseShhcnJheSwgdmFsdWVzVG9QdXNoKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgaiA9IHZhbHVlc1RvUHVzaC5sZW5ndGg7IGkgPCBqOyBpKyspXG4gICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2godmFsdWVzVG9QdXNoW2ldKTtcbiAgICAgICAgICAgIHJldHVybiBhcnJheTtcbiAgICAgICAgfSxcblxuICAgICAgICBhZGRPclJlbW92ZUl0ZW06IGZ1bmN0aW9uKGFycmF5LCB2YWx1ZSwgaW5jbHVkZWQpIHtcbiAgICAgICAgICAgIHZhciBleGlzdGluZ0VudHJ5SW5kZXggPSBrby51dGlscy5hcnJheUluZGV4T2Yoa28udXRpbHMucGVla09ic2VydmFibGUoYXJyYXkpLCB2YWx1ZSk7XG4gICAgICAgICAgICBpZiAoZXhpc3RpbmdFbnRyeUluZGV4IDwgMCkge1xuICAgICAgICAgICAgICAgIGlmIChpbmNsdWRlZClcbiAgICAgICAgICAgICAgICAgICAgYXJyYXkucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICghaW5jbHVkZWQpXG4gICAgICAgICAgICAgICAgICAgIGFycmF5LnNwbGljZShleGlzdGluZ0VudHJ5SW5kZXgsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIGNhblNldFByb3RvdHlwZTogY2FuU2V0UHJvdG90eXBlLFxuXG4gICAgICAgIGV4dGVuZDogZXh0ZW5kLFxuXG4gICAgICAgIHNldFByb3RvdHlwZU9mOiBzZXRQcm90b3R5cGVPZixcblxuICAgICAgICBzZXRQcm90b3R5cGVPZk9yRXh0ZW5kOiBjYW5TZXRQcm90b3R5cGUgPyBzZXRQcm90b3R5cGVPZiA6IGV4dGVuZCxcblxuICAgICAgICBvYmplY3RGb3JFYWNoOiBvYmplY3RGb3JFYWNoLFxuXG4gICAgICAgIG9iamVjdE1hcDogZnVuY3Rpb24oc291cmNlLCBtYXBwaW5nKSB7XG4gICAgICAgICAgICBpZiAoIXNvdXJjZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gc291cmNlO1xuICAgICAgICAgICAgdmFyIHRhcmdldCA9IHt9O1xuICAgICAgICAgICAgZm9yICh2YXIgcHJvcCBpbiBzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBpZiAoc291cmNlLmhhc093blByb3BlcnR5KHByb3ApKSB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldFtwcm9wXSA9IG1hcHBpbmcoc291cmNlW3Byb3BdLCBwcm9wLCBzb3VyY2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZW1wdHlEb21Ob2RlOiBmdW5jdGlvbiAoZG9tTm9kZSkge1xuICAgICAgICAgICAgd2hpbGUgKGRvbU5vZGUuZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgICAgIGtvLnJlbW92ZU5vZGUoZG9tTm9kZS5maXJzdENoaWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBtb3ZlQ2xlYW5lZE5vZGVzVG9Db250YWluZXJFbGVtZW50OiBmdW5jdGlvbihub2Rlcykge1xuICAgICAgICAgICAgLy8gRW5zdXJlIGl0J3MgYSByZWFsIGFycmF5LCBhcyB3ZSdyZSBhYm91dCB0byByZXBhcmVudCB0aGUgbm9kZXMgYW5kXG4gICAgICAgICAgICAvLyB3ZSBkb24ndCB3YW50IHRoZSB1bmRlcmx5aW5nIGNvbGxlY3Rpb24gdG8gY2hhbmdlIHdoaWxlIHdlJ3JlIGRvaW5nIHRoYXQuXG4gICAgICAgICAgICB2YXIgbm9kZXNBcnJheSA9IGtvLnV0aWxzLm1ha2VBcnJheShub2Rlcyk7XG4gICAgICAgICAgICB2YXIgdGVtcGxhdGVEb2N1bWVudCA9IChub2Rlc0FycmF5WzBdICYmIG5vZGVzQXJyYXlbMF0ub3duZXJEb2N1bWVudCkgfHwgZG9jdW1lbnQ7XG5cbiAgICAgICAgICAgIHZhciBjb250YWluZXIgPSB0ZW1wbGF0ZURvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGogPSBub2Rlc0FycmF5Lmxlbmd0aDsgaSA8IGo7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChrby5jbGVhbk5vZGUobm9kZXNBcnJheVtpXSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lcjtcbiAgICAgICAgfSxcblxuICAgICAgICBjbG9uZU5vZGVzOiBmdW5jdGlvbiAobm9kZXNBcnJheSwgc2hvdWxkQ2xlYW5Ob2Rlcykge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGogPSBub2Rlc0FycmF5Lmxlbmd0aCwgbmV3Tm9kZXNBcnJheSA9IFtdOyBpIDwgajsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNsb25lZE5vZGUgPSBub2Rlc0FycmF5W2ldLmNsb25lTm9kZSh0cnVlKTtcbiAgICAgICAgICAgICAgICBuZXdOb2Rlc0FycmF5LnB1c2goc2hvdWxkQ2xlYW5Ob2RlcyA/IGtvLmNsZWFuTm9kZShjbG9uZWROb2RlKSA6IGNsb25lZE5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5ld05vZGVzQXJyYXk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgc2V0RG9tTm9kZUNoaWxkcmVuOiBmdW5jdGlvbiAoZG9tTm9kZSwgY2hpbGROb2Rlcykge1xuICAgICAgICAgICAga28udXRpbHMuZW1wdHlEb21Ob2RlKGRvbU5vZGUpO1xuICAgICAgICAgICAgaWYgKGNoaWxkTm9kZXMpIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgaiA9IGNoaWxkTm9kZXMubGVuZ3RoOyBpIDwgajsgaSsrKVxuICAgICAgICAgICAgICAgICAgICBkb21Ob2RlLmFwcGVuZENoaWxkKGNoaWxkTm9kZXNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIHJlcGxhY2VEb21Ob2RlczogZnVuY3Rpb24gKG5vZGVUb1JlcGxhY2VPck5vZGVBcnJheSwgbmV3Tm9kZXNBcnJheSkge1xuICAgICAgICAgICAgdmFyIG5vZGVzVG9SZXBsYWNlQXJyYXkgPSBub2RlVG9SZXBsYWNlT3JOb2RlQXJyYXkubm9kZVR5cGUgPyBbbm9kZVRvUmVwbGFjZU9yTm9kZUFycmF5XSA6IG5vZGVUb1JlcGxhY2VPck5vZGVBcnJheTtcbiAgICAgICAgICAgIGlmIChub2Rlc1RvUmVwbGFjZUFycmF5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB2YXIgaW5zZXJ0aW9uUG9pbnQgPSBub2Rlc1RvUmVwbGFjZUFycmF5WzBdO1xuICAgICAgICAgICAgICAgIHZhciBwYXJlbnQgPSBpbnNlcnRpb25Qb2ludC5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBqID0gbmV3Tm9kZXNBcnJheS5sZW5ndGg7IGkgPCBqOyBpKyspXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUobmV3Tm9kZXNBcnJheVtpXSwgaW5zZXJ0aW9uUG9pbnQpO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBqID0gbm9kZXNUb1JlcGxhY2VBcnJheS5sZW5ndGg7IGkgPCBqOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAga28ucmVtb3ZlTm9kZShub2Rlc1RvUmVwbGFjZUFycmF5W2ldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgZml4VXBDb250aW51b3VzTm9kZUFycmF5OiBmdW5jdGlvbihjb250aW51b3VzTm9kZUFycmF5LCBwYXJlbnROb2RlKSB7XG4gICAgICAgICAgICAvLyBCZWZvcmUgYWN0aW5nIG9uIGEgc2V0IG9mIG5vZGVzIHRoYXQgd2VyZSBwcmV2aW91c2x5IG91dHB1dHRlZCBieSBhIHRlbXBsYXRlIGZ1bmN0aW9uLCB3ZSBoYXZlIHRvIHJlY29uY2lsZVxuICAgICAgICAgICAgLy8gdGhlbSBhZ2FpbnN0IHdoYXQgaXMgaW4gdGhlIERPTSByaWdodCBub3cuIEl0IG1heSBiZSB0aGF0IHNvbWUgb2YgdGhlIG5vZGVzIGhhdmUgYWxyZWFkeSBiZWVuIHJlbW92ZWQsIG9yIHRoYXRcbiAgICAgICAgICAgIC8vIG5ldyBub2RlcyBtaWdodCBoYXZlIGJlZW4gaW5zZXJ0ZWQgaW4gdGhlIG1pZGRsZSwgZm9yIGV4YW1wbGUgYnkgYSBiaW5kaW5nLiBBbHNvLCB0aGVyZSBtYXkgcHJldmlvdXNseSBoYXZlIGJlZW5cbiAgICAgICAgICAgIC8vIGxlYWRpbmcgY29tbWVudCBub2RlcyAoY3JlYXRlZCBieSByZXdyaXR0ZW4gc3RyaW5nLWJhc2VkIHRlbXBsYXRlcykgdGhhdCBoYXZlIHNpbmNlIGJlZW4gcmVtb3ZlZCBkdXJpbmcgYmluZGluZy5cbiAgICAgICAgICAgIC8vIFNvLCB0aGlzIGZ1bmN0aW9uIHRyYW5zbGF0ZXMgdGhlIG9sZCBcIm1hcFwiIG91dHB1dCBhcnJheSBpbnRvIGl0cyBiZXN0IGd1ZXNzIG9mIHRoZSBzZXQgb2YgY3VycmVudCBET00gbm9kZXMuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gUnVsZXM6XG4gICAgICAgICAgICAvLyAgIFtBXSBBbnkgbGVhZGluZyBub2RlcyB0aGF0IGhhdmUgYmVlbiByZW1vdmVkIHNob3VsZCBiZSBpZ25vcmVkXG4gICAgICAgICAgICAvLyAgICAgICBUaGVzZSBtb3N0IGxpa2VseSBjb3JyZXNwb25kIHRvIG1lbW9pemF0aW9uIG5vZGVzIHRoYXQgd2VyZSBhbHJlYWR5IHJlbW92ZWQgZHVyaW5nIGJpbmRpbmdcbiAgICAgICAgICAgIC8vICAgICAgIFNlZSBodHRwczovL2dpdGh1Yi5jb20va25vY2tvdXQva25vY2tvdXQvcHVsbC80NDBcbiAgICAgICAgICAgIC8vICAgW0JdIEFueSB0cmFpbGluZyBub2RlcyB0aGF0IGhhdmUgYmVlbiByZW1vdmUgc2hvdWxkIGJlIGlnbm9yZWRcbiAgICAgICAgICAgIC8vICAgICAgIFRoaXMgcHJldmVudHMgdGhlIGNvZGUgaGVyZSBmcm9tIGFkZGluZyB1bnJlbGF0ZWQgbm9kZXMgdG8gdGhlIGFycmF5IHdoaWxlIHByb2Nlc3NpbmcgcnVsZSBbQ11cbiAgICAgICAgICAgIC8vICAgICAgIFNlZSBodHRwczovL2dpdGh1Yi5jb20va25vY2tvdXQva25vY2tvdXQvcHVsbC8xOTAzXG4gICAgICAgICAgICAvLyAgIFtDXSBXZSB3YW50IHRvIG91dHB1dCBhIGNvbnRpbnVvdXMgc2VyaWVzIG9mIG5vZGVzLiBTbywgaWdub3JlIGFueSBub2RlcyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIHJlbW92ZWQsXG4gICAgICAgICAgICAvLyAgICAgICBhbmQgaW5jbHVkZSBhbnkgbm9kZXMgdGhhdCBoYXZlIGJlZW4gaW5zZXJ0ZWQgYW1vbmcgdGhlIHByZXZpb3VzIGNvbGxlY3Rpb25cblxuICAgICAgICAgICAgaWYgKGNvbnRpbnVvdXNOb2RlQXJyYXkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhlIHBhcmVudCBub2RlIGNhbiBiZSBhIHZpcnR1YWwgZWxlbWVudDsgc28gZ2V0IHRoZSByZWFsIHBhcmVudCBub2RlXG4gICAgICAgICAgICAgICAgcGFyZW50Tm9kZSA9IChwYXJlbnROb2RlLm5vZGVUeXBlID09PSA4ICYmIHBhcmVudE5vZGUucGFyZW50Tm9kZSkgfHwgcGFyZW50Tm9kZTtcblxuICAgICAgICAgICAgICAgIC8vIFJ1bGUgW0FdXG4gICAgICAgICAgICAgICAgd2hpbGUgKGNvbnRpbnVvdXNOb2RlQXJyYXkubGVuZ3RoICYmIGNvbnRpbnVvdXNOb2RlQXJyYXlbMF0ucGFyZW50Tm9kZSAhPT0gcGFyZW50Tm9kZSlcbiAgICAgICAgICAgICAgICAgICAgY29udGludW91c05vZGVBcnJheS5zcGxpY2UoMCwgMSk7XG5cbiAgICAgICAgICAgICAgICAvLyBSdWxlIFtCXVxuICAgICAgICAgICAgICAgIHdoaWxlIChjb250aW51b3VzTm9kZUFycmF5Lmxlbmd0aCA+IDEgJiYgY29udGludW91c05vZGVBcnJheVtjb250aW51b3VzTm9kZUFycmF5Lmxlbmd0aCAtIDFdLnBhcmVudE5vZGUgIT09IHBhcmVudE5vZGUpXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVvdXNOb2RlQXJyYXkubGVuZ3RoLS07XG5cbiAgICAgICAgICAgICAgICAvLyBSdWxlIFtDXVxuICAgICAgICAgICAgICAgIGlmIChjb250aW51b3VzTm9kZUFycmF5Lmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGN1cnJlbnQgPSBjb250aW51b3VzTm9kZUFycmF5WzBdLCBsYXN0ID0gY29udGludW91c05vZGVBcnJheVtjb250aW51b3VzTm9kZUFycmF5Lmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgICAgICAgICAvLyBSZXBsYWNlIHdpdGggdGhlIGFjdHVhbCBuZXcgY29udGludW91cyBub2RlIHNldFxuICAgICAgICAgICAgICAgICAgICBjb250aW51b3VzTm9kZUFycmF5Lmxlbmd0aCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChjdXJyZW50ICE9PSBsYXN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51b3VzTm9kZUFycmF5LnB1c2goY3VycmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb250aW51b3VzTm9kZUFycmF5LnB1c2gobGFzdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNvbnRpbnVvdXNOb2RlQXJyYXk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgc2V0T3B0aW9uTm9kZVNlbGVjdGlvblN0YXRlOiBmdW5jdGlvbiAob3B0aW9uTm9kZSwgaXNTZWxlY3RlZCkge1xuICAgICAgICAgICAgLy8gSUU2IHNvbWV0aW1lcyB0aHJvd3MgXCJ1bmtub3duIGVycm9yXCIgaWYgeW91IHRyeSB0byB3cml0ZSB0byAuc2VsZWN0ZWQgZGlyZWN0bHksIHdoZXJlYXMgRmlyZWZveCBzdHJ1Z2dsZXMgd2l0aCBzZXRBdHRyaWJ1dGUuIFBpY2sgb25lIGJhc2VkIG9uIGJyb3dzZXIuXG4gICAgICAgICAgICBpZiAoaWVWZXJzaW9uIDwgNylcbiAgICAgICAgICAgICAgICBvcHRpb25Ob2RlLnNldEF0dHJpYnV0ZShcInNlbGVjdGVkXCIsIGlzU2VsZWN0ZWQpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIG9wdGlvbk5vZGUuc2VsZWN0ZWQgPSBpc1NlbGVjdGVkO1xuICAgICAgICB9LFxuXG4gICAgICAgIHN0cmluZ1RyaW06IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcgPT09IG51bGwgfHwgc3RyaW5nID09PSB1bmRlZmluZWQgPyAnJyA6XG4gICAgICAgICAgICAgICAgc3RyaW5nLnRyaW0gP1xuICAgICAgICAgICAgICAgICAgICBzdHJpbmcudHJpbSgpIDpcbiAgICAgICAgICAgICAgICAgICAgc3RyaW5nLnRvU3RyaW5nKCkucmVwbGFjZSgvXltcXHNcXHhhMF0rfFtcXHNcXHhhMF0rJC9nLCAnJyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgc3RyaW5nU3RhcnRzV2l0aDogZnVuY3Rpb24gKHN0cmluZywgc3RhcnRzV2l0aCkge1xuICAgICAgICAgICAgc3RyaW5nID0gc3RyaW5nIHx8IFwiXCI7XG4gICAgICAgICAgICBpZiAoc3RhcnRzV2l0aC5sZW5ndGggPiBzdHJpbmcubGVuZ3RoKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcuc3Vic3RyaW5nKDAsIHN0YXJ0c1dpdGgubGVuZ3RoKSA9PT0gc3RhcnRzV2l0aDtcbiAgICAgICAgfSxcblxuICAgICAgICBkb21Ob2RlSXNDb250YWluZWRCeTogZnVuY3Rpb24gKG5vZGUsIGNvbnRhaW5lZEJ5Tm9kZSkge1xuICAgICAgICAgICAgaWYgKG5vZGUgPT09IGNvbnRhaW5lZEJ5Tm9kZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSAxMSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIEZpeGVzIGlzc3VlICMxMTYyIC0gY2FuJ3QgdXNlIG5vZGUuY29udGFpbnMgZm9yIGRvY3VtZW50IGZyYWdtZW50cyBvbiBJRThcbiAgICAgICAgICAgIGlmIChjb250YWluZWRCeU5vZGUuY29udGFpbnMpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lZEJ5Tm9kZS5jb250YWlucyhub2RlLm5vZGVUeXBlID09PSAzID8gbm9kZS5wYXJlbnROb2RlIDogbm9kZSk7XG4gICAgICAgICAgICBpZiAoY29udGFpbmVkQnlOb2RlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKVxuICAgICAgICAgICAgICAgIHJldHVybiAoY29udGFpbmVkQnlOb2RlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKG5vZGUpICYgMTYpID09IDE2O1xuICAgICAgICAgICAgd2hpbGUgKG5vZGUgJiYgbm9kZSAhPSBjb250YWluZWRCeU5vZGUpIHtcbiAgICAgICAgICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuICEhbm9kZTtcbiAgICAgICAgfSxcblxuICAgICAgICBkb21Ob2RlSXNBdHRhY2hlZFRvRG9jdW1lbnQ6IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgICByZXR1cm4ga28udXRpbHMuZG9tTm9kZUlzQ29udGFpbmVkQnkobm9kZSwgbm9kZS5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgYW55RG9tTm9kZUlzQXR0YWNoZWRUb0RvY3VtZW50OiBmdW5jdGlvbihub2Rlcykge1xuICAgICAgICAgICAgcmV0dXJuICEha28udXRpbHMuYXJyYXlGaXJzdChub2Rlcywga28udXRpbHMuZG9tTm9kZUlzQXR0YWNoZWRUb0RvY3VtZW50KTtcbiAgICAgICAgfSxcblxuICAgICAgICB0YWdOYW1lTG93ZXI6IGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgICAgICAgICAgIC8vIEZvciBIVE1MIGVsZW1lbnRzLCB0YWdOYW1lIHdpbGwgYWx3YXlzIGJlIHVwcGVyIGNhc2U7IGZvciBYSFRNTCBlbGVtZW50cywgaXQnbGwgYmUgbG93ZXIgY2FzZS5cbiAgICAgICAgICAgIC8vIFBvc3NpYmxlIGZ1dHVyZSBvcHRpbWl6YXRpb246IElmIHdlIGtub3cgaXQncyBhbiBlbGVtZW50IGZyb20gYW4gWEhUTUwgZG9jdW1lbnQgKG5vdCBIVE1MKSxcbiAgICAgICAgICAgIC8vIHdlIGRvbid0IG5lZWQgdG8gZG8gdGhlIC50b0xvd2VyQ2FzZSgpIGFzIGl0IHdpbGwgYWx3YXlzIGJlIGxvd2VyIGNhc2UgYW55d2F5LlxuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQgJiYgZWxlbWVudC50YWdOYW1lICYmIGVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGNhdGNoRnVuY3Rpb25FcnJvcnM6IGZ1bmN0aW9uIChkZWxlZ2F0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGtvWydvbkVycm9yJ10gPyBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBrb1snb25FcnJvciddICYmIGtvWydvbkVycm9yJ10oZSk7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSA6IGRlbGVnYXRlO1xuICAgICAgICB9LFxuXG4gICAgICAgIHNldFRpbWVvdXQ6IGZ1bmN0aW9uIChoYW5kbGVyLCB0aW1lb3V0KSB7XG4gICAgICAgICAgICByZXR1cm4gc2V0VGltZW91dChrby51dGlscy5jYXRjaEZ1bmN0aW9uRXJyb3JzKGhhbmRsZXIpLCB0aW1lb3V0KTtcbiAgICAgICAgfSxcblxuICAgICAgICBkZWZlckVycm9yOiBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGtvWydvbkVycm9yJ10gJiYga29bJ29uRXJyb3InXShlcnJvcik7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9LCAwKTtcbiAgICAgICAgfSxcblxuICAgICAgICByZWdpc3RlckV2ZW50SGFuZGxlcjogZnVuY3Rpb24gKGVsZW1lbnQsIGV2ZW50VHlwZSwgaGFuZGxlcikge1xuICAgICAgICAgICAgdmFyIHdyYXBwZWRIYW5kbGVyID0ga28udXRpbHMuY2F0Y2hGdW5jdGlvbkVycm9ycyhoYW5kbGVyKTtcblxuICAgICAgICAgICAgdmFyIG11c3RVc2VBdHRhY2hFdmVudCA9IGllVmVyc2lvbiAmJiBldmVudHNUaGF0TXVzdEJlUmVnaXN0ZXJlZFVzaW5nQXR0YWNoRXZlbnRbZXZlbnRUeXBlXTtcbiAgICAgICAgICAgIGlmICgha28ub3B0aW9uc1sndXNlT25seU5hdGl2ZUV2ZW50cyddICYmICFtdXN0VXNlQXR0YWNoRXZlbnQgJiYgalF1ZXJ5SW5zdGFuY2UpIHtcbiAgICAgICAgICAgICAgICBqUXVlcnlJbnN0YW5jZShlbGVtZW50KVsnYmluZCddKGV2ZW50VHlwZSwgd3JhcHBlZEhhbmRsZXIpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghbXVzdFVzZUF0dGFjaEV2ZW50ICYmIHR5cGVvZiBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIgPT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIHdyYXBwZWRIYW5kbGVyLCBmYWxzZSk7XG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgZWxlbWVudC5hdHRhY2hFdmVudCAhPSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAgICAgdmFyIGF0dGFjaEV2ZW50SGFuZGxlciA9IGZ1bmN0aW9uIChldmVudCkgeyB3cmFwcGVkSGFuZGxlci5jYWxsKGVsZW1lbnQsIGV2ZW50KTsgfSxcbiAgICAgICAgICAgICAgICAgICAgYXR0YWNoRXZlbnROYW1lID0gXCJvblwiICsgZXZlbnRUeXBlO1xuICAgICAgICAgICAgICAgIGVsZW1lbnQuYXR0YWNoRXZlbnQoYXR0YWNoRXZlbnROYW1lLCBhdHRhY2hFdmVudEhhbmRsZXIpO1xuXG4gICAgICAgICAgICAgICAgLy8gSUUgZG9lcyBub3QgZGlzcG9zZSBhdHRhY2hFdmVudCBoYW5kbGVycyBhdXRvbWF0aWNhbGx5ICh1bmxpa2Ugd2l0aCBhZGRFdmVudExpc3RlbmVyKVxuICAgICAgICAgICAgICAgIC8vIHNvIHRvIGF2b2lkIGxlYWtzLCB3ZSBoYXZlIHRvIHJlbW92ZSB0aGVtIG1hbnVhbGx5LiBTZWUgYnVnICM4NTZcbiAgICAgICAgICAgICAgICBrby51dGlscy5kb21Ob2RlRGlzcG9zYWwuYWRkRGlzcG9zZUNhbGxiYWNrKGVsZW1lbnQsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmRldGFjaEV2ZW50KGF0dGFjaEV2ZW50TmFtZSwgYXR0YWNoRXZlbnRIYW5kbGVyKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkJyb3dzZXIgZG9lc24ndCBzdXBwb3J0IGFkZEV2ZW50TGlzdGVuZXIgb3IgYXR0YWNoRXZlbnRcIik7XG4gICAgICAgIH0sXG5cbiAgICAgICAgdHJpZ2dlckV2ZW50OiBmdW5jdGlvbiAoZWxlbWVudCwgZXZlbnRUeXBlKSB7XG4gICAgICAgICAgICBpZiAoIShlbGVtZW50ICYmIGVsZW1lbnQubm9kZVR5cGUpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImVsZW1lbnQgbXVzdCBiZSBhIERPTSBub2RlIHdoZW4gY2FsbGluZyB0cmlnZ2VyRXZlbnRcIik7XG5cbiAgICAgICAgICAgIC8vIEZvciBjbGljayBldmVudHMgb24gY2hlY2tib3hlcyBhbmQgcmFkaW8gYnV0dG9ucywgalF1ZXJ5IHRvZ2dsZXMgdGhlIGVsZW1lbnQgY2hlY2tlZCBzdGF0ZSAqYWZ0ZXIqIHRoZVxuICAgICAgICAgICAgLy8gZXZlbnQgaGFuZGxlciBydW5zIGluc3RlYWQgb2YgKmJlZm9yZSouIChUaGlzIHdhcyBmaXhlZCBpbiAxLjkgZm9yIGNoZWNrYm94ZXMgYnV0IG5vdCBmb3IgcmFkaW8gYnV0dG9ucy4pXG4gICAgICAgICAgICAvLyBJRSBkb2Vzbid0IGNoYW5nZSB0aGUgY2hlY2tlZCBzdGF0ZSB3aGVuIHlvdSB0cmlnZ2VyIHRoZSBjbGljayBldmVudCB1c2luZyBcImZpcmVFdmVudFwiLlxuICAgICAgICAgICAgLy8gSW4gYm90aCBjYXNlcywgd2UnbGwgdXNlIHRoZSBjbGljayBtZXRob2QgaW5zdGVhZC5cbiAgICAgICAgICAgIHZhciB1c2VDbGlja1dvcmthcm91bmQgPSBpc0NsaWNrT25DaGVja2FibGVFbGVtZW50KGVsZW1lbnQsIGV2ZW50VHlwZSk7XG5cbiAgICAgICAgICAgIGlmICgha28ub3B0aW9uc1sndXNlT25seU5hdGl2ZUV2ZW50cyddICYmIGpRdWVyeUluc3RhbmNlICYmICF1c2VDbGlja1dvcmthcm91bmQpIHtcbiAgICAgICAgICAgICAgICBqUXVlcnlJbnN0YW5jZShlbGVtZW50KVsndHJpZ2dlciddKGV2ZW50VHlwZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFdmVudCA9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGVsZW1lbnQuZGlzcGF0Y2hFdmVudCA9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGV2ZW50Q2F0ZWdvcnkgPSBrbm93bkV2ZW50VHlwZXNCeUV2ZW50TmFtZVtldmVudFR5cGVdIHx8IFwiSFRNTEV2ZW50c1wiO1xuICAgICAgICAgICAgICAgICAgICB2YXIgZXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudChldmVudENhdGVnb3J5KTtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQuaW5pdEV2ZW50KGV2ZW50VHlwZSwgdHJ1ZSwgdHJ1ZSwgd2luZG93LCAwLCAwLCAwLCAwLCAwLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgMCwgZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHN1cHBsaWVkIGVsZW1lbnQgZG9lc24ndCBzdXBwb3J0IGRpc3BhdGNoRXZlbnRcIik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHVzZUNsaWNrV29ya2Fyb3VuZCAmJiBlbGVtZW50LmNsaWNrKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5jbGljaygpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZWxlbWVudC5maXJlRXZlbnQgIT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQuZmlyZUV2ZW50KFwib25cIiArIGV2ZW50VHlwZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkJyb3dzZXIgZG9lc24ndCBzdXBwb3J0IHRyaWdnZXJpbmcgZXZlbnRzXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIHVud3JhcE9ic2VydmFibGU6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGtvLmlzT2JzZXJ2YWJsZSh2YWx1ZSkgPyB2YWx1ZSgpIDogdmFsdWU7XG4gICAgICAgIH0sXG5cbiAgICAgICAgcGVla09ic2VydmFibGU6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGtvLmlzT2JzZXJ2YWJsZSh2YWx1ZSkgPyB2YWx1ZS5wZWVrKCkgOiB2YWx1ZTtcbiAgICAgICAgfSxcblxuICAgICAgICB0b2dnbGVEb21Ob2RlQ3NzQ2xhc3M6IHRvZ2dsZURvbU5vZGVDc3NDbGFzcyxcblxuICAgICAgICBzZXRUZXh0Q29udGVudDogZnVuY3Rpb24oZWxlbWVudCwgdGV4dENvbnRlbnQpIHtcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUodGV4dENvbnRlbnQpO1xuICAgICAgICAgICAgaWYgKCh2YWx1ZSA9PT0gbnVsbCkgfHwgKHZhbHVlID09PSB1bmRlZmluZWQpKVxuICAgICAgICAgICAgICAgIHZhbHVlID0gXCJcIjtcblxuICAgICAgICAgICAgLy8gV2UgbmVlZCB0aGVyZSB0byBiZSBleGFjdGx5IG9uZSBjaGlsZDogYSB0ZXh0IG5vZGUuXG4gICAgICAgICAgICAvLyBJZiB0aGVyZSBhcmUgbm8gY2hpbGRyZW4sIG1vcmUgdGhhbiBvbmUsIG9yIGlmIGl0J3Mgbm90IGEgdGV4dCBub2RlLFxuICAgICAgICAgICAgLy8gd2UnbGwgY2xlYXIgZXZlcnl0aGluZyBhbmQgY3JlYXRlIGEgc2luZ2xlIHRleHQgbm9kZS5cbiAgICAgICAgICAgIHZhciBpbm5lclRleHROb2RlID0ga28udmlydHVhbEVsZW1lbnRzLmZpcnN0Q2hpbGQoZWxlbWVudCk7XG4gICAgICAgICAgICBpZiAoIWlubmVyVGV4dE5vZGUgfHwgaW5uZXJUZXh0Tm9kZS5ub2RlVHlwZSAhPSAzIHx8IGtvLnZpcnR1YWxFbGVtZW50cy5uZXh0U2libGluZyhpbm5lclRleHROb2RlKSkge1xuICAgICAgICAgICAgICAgIGtvLnZpcnR1YWxFbGVtZW50cy5zZXREb21Ob2RlQ2hpbGRyZW4oZWxlbWVudCwgW2VsZW1lbnQub3duZXJEb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh2YWx1ZSldKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaW5uZXJUZXh0Tm9kZS5kYXRhID0gdmFsdWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGtvLnV0aWxzLmZvcmNlUmVmcmVzaChlbGVtZW50KTtcbiAgICAgICAgfSxcblxuICAgICAgICBzZXRFbGVtZW50TmFtZTogZnVuY3Rpb24oZWxlbWVudCwgbmFtZSkge1xuICAgICAgICAgICAgZWxlbWVudC5uYW1lID0gbmFtZTtcblxuICAgICAgICAgICAgLy8gV29ya2Fyb3VuZCBJRSA2LzcgaXNzdWVcbiAgICAgICAgICAgIC8vIC0gaHR0cHM6Ly9naXRodWIuY29tL1N0ZXZlU2FuZGVyc29uL2tub2Nrb3V0L2lzc3Vlcy8xOTdcbiAgICAgICAgICAgIC8vIC0gaHR0cDovL3d3dy5tYXR0czQxMS5jb20vcG9zdC9zZXR0aW5nX3RoZV9uYW1lX2F0dHJpYnV0ZV9pbl9pZV9kb20vXG4gICAgICAgICAgICBpZiAoaWVWZXJzaW9uIDw9IDcpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50Lm1lcmdlQXR0cmlidXRlcyhkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiPGlucHV0IG5hbWU9J1wiICsgZWxlbWVudC5uYW1lICsgXCInLz5cIiksIGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2goZSkge30gLy8gRm9yIElFOSB3aXRoIGRvYyBtb2RlIFwiSUU5IFN0YW5kYXJkc1wiIGFuZCBicm93c2VyIG1vZGUgXCJJRTkgQ29tcGF0aWJpbGl0eSBWaWV3XCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBmb3JjZVJlZnJlc2g6IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgICAgIC8vIFdvcmthcm91bmQgZm9yIGFuIElFOSByZW5kZXJpbmcgYnVnIC0gaHR0cHM6Ly9naXRodWIuY29tL1N0ZXZlU2FuZGVyc29uL2tub2Nrb3V0L2lzc3Vlcy8yMDlcbiAgICAgICAgICAgIGlmIChpZVZlcnNpb24gPj0gOSkge1xuICAgICAgICAgICAgICAgIC8vIEZvciB0ZXh0IG5vZGVzIGFuZCBjb21tZW50IG5vZGVzIChtb3N0IGxpa2VseSB2aXJ0dWFsIGVsZW1lbnRzKSwgd2Ugd2lsbCBoYXZlIHRvIHJlZnJlc2ggdGhlIGNvbnRhaW5lclxuICAgICAgICAgICAgICAgIHZhciBlbGVtID0gbm9kZS5ub2RlVHlwZSA9PSAxID8gbm9kZSA6IG5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbS5zdHlsZSlcbiAgICAgICAgICAgICAgICAgICAgZWxlbS5zdHlsZS56b29tID0gZWxlbS5zdHlsZS56b29tO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIGVuc3VyZVNlbGVjdEVsZW1lbnRJc1JlbmRlcmVkQ29ycmVjdGx5OiBmdW5jdGlvbihzZWxlY3RFbGVtZW50KSB7XG4gICAgICAgICAgICAvLyBXb3JrYXJvdW5kIGZvciBJRTkgcmVuZGVyaW5nIGJ1ZyAtIGl0IGRvZXNuJ3QgcmVsaWFibHkgZGlzcGxheSBhbGwgdGhlIHRleHQgaW4gZHluYW1pY2FsbHktYWRkZWQgc2VsZWN0IGJveGVzIHVubGVzcyB5b3UgZm9yY2UgaXQgdG8gcmUtcmVuZGVyIGJ5IHVwZGF0aW5nIHRoZSB3aWR0aC5cbiAgICAgICAgICAgIC8vIChTZWUgaHR0cHM6Ly9naXRodWIuY29tL1N0ZXZlU2FuZGVyc29uL2tub2Nrb3V0L2lzc3Vlcy8zMTIsIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNTkwODQ5NC9zZWxlY3Qtb25seS1zaG93cy1maXJzdC1jaGFyLW9mLXNlbGVjdGVkLW9wdGlvbilcbiAgICAgICAgICAgIC8vIEFsc28gZml4ZXMgSUU3IGFuZCBJRTggYnVnIHRoYXQgY2F1c2VzIHNlbGVjdHMgdG8gYmUgemVybyB3aWR0aCBpZiBlbmNsb3NlZCBieSAnaWYnIG9yICd3aXRoJy4gKFNlZSBpc3N1ZSAjODM5KVxuICAgICAgICAgICAgaWYgKGllVmVyc2lvbikge1xuICAgICAgICAgICAgICAgIHZhciBvcmlnaW5hbFdpZHRoID0gc2VsZWN0RWxlbWVudC5zdHlsZS53aWR0aDtcbiAgICAgICAgICAgICAgICBzZWxlY3RFbGVtZW50LnN0eWxlLndpZHRoID0gMDtcbiAgICAgICAgICAgICAgICBzZWxlY3RFbGVtZW50LnN0eWxlLndpZHRoID0gb3JpZ2luYWxXaWR0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICByYW5nZTogZnVuY3Rpb24gKG1pbiwgbWF4KSB7XG4gICAgICAgICAgICBtaW4gPSBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKG1pbik7XG4gICAgICAgICAgICBtYXggPSBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKG1heCk7XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gbWluOyBpIDw9IG1heDsgaSsrKVxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGkpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcblxuICAgICAgICBtYWtlQXJyYXk6IGZ1bmN0aW9uKGFycmF5TGlrZU9iamVjdCkge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGogPSBhcnJheUxpa2VPYmplY3QubGVuZ3RoOyBpIDwgajsgaSsrKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goYXJyYXlMaWtlT2JqZWN0W2ldKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuXG4gICAgICAgIGNyZWF0ZVN5bWJvbE9yU3RyaW5nOiBmdW5jdGlvbihpZGVudGlmaWVyKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FuVXNlU3ltYm9scyA/IFN5bWJvbChpZGVudGlmaWVyKSA6IGlkZW50aWZpZXI7XG4gICAgICAgIH0sXG5cbiAgICAgICAgaXNJZTYgOiBpc0llNixcbiAgICAgICAgaXNJZTcgOiBpc0llNyxcbiAgICAgICAgaWVWZXJzaW9uIDogaWVWZXJzaW9uLFxuXG4gICAgICAgIGdldEZvcm1GaWVsZHM6IGZ1bmN0aW9uKGZvcm0sIGZpZWxkTmFtZSkge1xuICAgICAgICAgICAgdmFyIGZpZWxkcyA9IGtvLnV0aWxzLm1ha2VBcnJheShmb3JtLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiaW5wdXRcIikpLmNvbmNhdChrby51dGlscy5tYWtlQXJyYXkoZm9ybS5nZXRFbGVtZW50c0J5VGFnTmFtZShcInRleHRhcmVhXCIpKSk7XG4gICAgICAgICAgICB2YXIgaXNNYXRjaGluZ0ZpZWxkID0gKHR5cGVvZiBmaWVsZE5hbWUgPT0gJ3N0cmluZycpXG4gICAgICAgICAgICAgICAgPyBmdW5jdGlvbihmaWVsZCkgeyByZXR1cm4gZmllbGQubmFtZSA9PT0gZmllbGROYW1lIH1cbiAgICAgICAgICAgICAgICA6IGZ1bmN0aW9uKGZpZWxkKSB7IHJldHVybiBmaWVsZE5hbWUudGVzdChmaWVsZC5uYW1lKSB9OyAvLyBUcmVhdCBmaWVsZE5hbWUgYXMgcmVnZXggb3Igb2JqZWN0IGNvbnRhaW5pbmcgcHJlZGljYXRlXG4gICAgICAgICAgICB2YXIgbWF0Y2hlcyA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IGZpZWxkcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgICAgIGlmIChpc01hdGNoaW5nRmllbGQoZmllbGRzW2ldKSlcbiAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcy5wdXNoKGZpZWxkc1tpXSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIG1hdGNoZXM7XG4gICAgICAgIH0sXG5cbiAgICAgICAgcGFyc2VKc29uOiBmdW5jdGlvbiAoanNvblN0cmluZykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBqc29uU3RyaW5nID09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICBqc29uU3RyaW5nID0ga28udXRpbHMuc3RyaW5nVHJpbShqc29uU3RyaW5nKTtcbiAgICAgICAgICAgICAgICBpZiAoanNvblN0cmluZykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoSlNPTiAmJiBKU09OLnBhcnNlKSAvLyBVc2UgbmF0aXZlIHBhcnNpbmcgd2hlcmUgYXZhaWxhYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShqc29uU3RyaW5nKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChuZXcgRnVuY3Rpb24oXCJyZXR1cm4gXCIgKyBqc29uU3RyaW5nKSkoKTsgLy8gRmFsbGJhY2sgb24gbGVzcyBzYWZlIHBhcnNpbmcgZm9yIG9sZGVyIGJyb3dzZXJzXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0sXG5cbiAgICAgICAgc3RyaW5naWZ5SnNvbjogZnVuY3Rpb24gKGRhdGEsIHJlcGxhY2VyLCBzcGFjZSkgeyAgIC8vIHJlcGxhY2VyIGFuZCBzcGFjZSBhcmUgb3B0aW9uYWxcbiAgICAgICAgICAgIGlmICghSlNPTiB8fCAhSlNPTi5zdHJpbmdpZnkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgSlNPTi5zdHJpbmdpZnkoKS4gU29tZSBicm93c2VycyAoZS5nLiwgSUUgPCA4KSBkb24ndCBzdXBwb3J0IGl0IG5hdGl2ZWx5LCBidXQgeW91IGNhbiBvdmVyY29tZSB0aGlzIGJ5IGFkZGluZyBhIHNjcmlwdCByZWZlcmVuY2UgdG8ganNvbjIuanMsIGRvd25sb2FkYWJsZSBmcm9tIGh0dHA6Ly93d3cuanNvbi5vcmcvanNvbjIuanNcIik7XG4gICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoa28udXRpbHMudW53cmFwT2JzZXJ2YWJsZShkYXRhKSwgcmVwbGFjZXIsIHNwYWNlKTtcbiAgICAgICAgfSxcblxuICAgICAgICBwb3N0SnNvbjogZnVuY3Rpb24gKHVybE9yRm9ybSwgZGF0YSwgb3B0aW9ucykge1xuICAgICAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICAgICAgICB2YXIgcGFyYW1zID0gb3B0aW9uc1sncGFyYW1zJ10gfHwge307XG4gICAgICAgICAgICB2YXIgaW5jbHVkZUZpZWxkcyA9IG9wdGlvbnNbJ2luY2x1ZGVGaWVsZHMnXSB8fCB0aGlzLmZpZWxkc0luY2x1ZGVkV2l0aEpzb25Qb3N0O1xuICAgICAgICAgICAgdmFyIHVybCA9IHVybE9yRm9ybTtcblxuICAgICAgICAgICAgLy8gSWYgd2Ugd2VyZSBnaXZlbiBhIGZvcm0sIHVzZSBpdHMgJ2FjdGlvbicgVVJMIGFuZCBwaWNrIG91dCBhbnkgcmVxdWVzdGVkIGZpZWxkIHZhbHVlc1xuICAgICAgICAgICAgaWYoKHR5cGVvZiB1cmxPckZvcm0gPT0gJ29iamVjdCcpICYmIChrby51dGlscy50YWdOYW1lTG93ZXIodXJsT3JGb3JtKSA9PT0gXCJmb3JtXCIpKSB7XG4gICAgICAgICAgICAgICAgdmFyIG9yaWdpbmFsRm9ybSA9IHVybE9yRm9ybTtcbiAgICAgICAgICAgICAgICB1cmwgPSBvcmlnaW5hbEZvcm0uYWN0aW9uO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSBpbmNsdWRlRmllbGRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBmaWVsZHMgPSBrby51dGlscy5nZXRGb3JtRmllbGRzKG9yaWdpbmFsRm9ybSwgaW5jbHVkZUZpZWxkc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSBmaWVsZHMubGVuZ3RoIC0gMTsgaiA+PSAwOyBqLS0pXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXNbZmllbGRzW2pdLm5hbWVdID0gZmllbGRzW2pdLnZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZGF0YSA9IGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUoZGF0YSk7XG4gICAgICAgICAgICB2YXIgZm9ybSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJmb3JtXCIpO1xuICAgICAgICAgICAgZm9ybS5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgICAgICAgICBmb3JtLmFjdGlvbiA9IHVybDtcbiAgICAgICAgICAgIGZvcm0ubWV0aG9kID0gXCJwb3N0XCI7XG4gICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gZGF0YSkge1xuICAgICAgICAgICAgICAgIC8vIFNpbmNlICdkYXRhJyB0aGlzIGlzIGEgbW9kZWwgb2JqZWN0LCB3ZSBpbmNsdWRlIGFsbCBwcm9wZXJ0aWVzIGluY2x1ZGluZyB0aG9zZSBpbmhlcml0ZWQgZnJvbSBpdHMgcHJvdG90eXBlXG4gICAgICAgICAgICAgICAgdmFyIGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xuICAgICAgICAgICAgICAgIGlucHV0LnR5cGUgPSBcImhpZGRlblwiO1xuICAgICAgICAgICAgICAgIGlucHV0Lm5hbWUgPSBrZXk7XG4gICAgICAgICAgICAgICAgaW5wdXQudmFsdWUgPSBrby51dGlscy5zdHJpbmdpZnlKc29uKGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUoZGF0YVtrZXldKSk7XG4gICAgICAgICAgICAgICAgZm9ybS5hcHBlbmRDaGlsZChpbnB1dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvYmplY3RGb3JFYWNoKHBhcmFtcywgZnVuY3Rpb24oa2V5LCB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHZhciBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTtcbiAgICAgICAgICAgICAgICBpbnB1dC50eXBlID0gXCJoaWRkZW5cIjtcbiAgICAgICAgICAgICAgICBpbnB1dC5uYW1lID0ga2V5O1xuICAgICAgICAgICAgICAgIGlucHV0LnZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgZm9ybS5hcHBlbmRDaGlsZChpbnB1dCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZm9ybSk7XG4gICAgICAgICAgICBvcHRpb25zWydzdWJtaXR0ZXInXSA/IG9wdGlvbnNbJ3N1Ym1pdHRlciddKGZvcm0pIDogZm9ybS5zdWJtaXQoKTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyBmb3JtLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZm9ybSk7IH0sIDApO1xuICAgICAgICB9XG4gICAgfVxufSgpKTtcblxua28uZXhwb3J0U3ltYm9sKCd1dGlscycsIGtvLnV0aWxzKTtcbmtvLmV4cG9ydFN5bWJvbCgndXRpbHMuYXJyYXlGb3JFYWNoJywga28udXRpbHMuYXJyYXlGb3JFYWNoKTtcbmtvLmV4cG9ydFN5bWJvbCgndXRpbHMuYXJyYXlGaXJzdCcsIGtvLnV0aWxzLmFycmF5Rmlyc3QpO1xua28uZXhwb3J0U3ltYm9sKCd1dGlscy5hcnJheUZpbHRlcicsIGtvLnV0aWxzLmFycmF5RmlsdGVyKTtcbmtvLmV4cG9ydFN5bWJvbCgndXRpbHMuYXJyYXlHZXREaXN0aW5jdFZhbHVlcycsIGtvLnV0aWxzLmFycmF5R2V0RGlzdGluY3RWYWx1ZXMpO1xua28uZXhwb3J0U3ltYm9sKCd1dGlscy5hcnJheUluZGV4T2YnLCBrby51dGlscy5hcnJheUluZGV4T2YpO1xua28uZXhwb3J0U3ltYm9sKCd1dGlscy5hcnJheU1hcCcsIGtvLnV0aWxzLmFycmF5TWFwKTtcbmtvLmV4cG9ydFN5bWJvbCgndXRpbHMuYXJyYXlQdXNoQWxsJywga28udXRpbHMuYXJyYXlQdXNoQWxsKTtcbmtvLmV4cG9ydFN5bWJvbCgndXRpbHMuYXJyYXlSZW1vdmVJdGVtJywga28udXRpbHMuYXJyYXlSZW1vdmVJdGVtKTtcbmtvLmV4cG9ydFN5bWJvbCgndXRpbHMuZXh0ZW5kJywga28udXRpbHMuZXh0ZW5kKTtcbmtvLmV4cG9ydFN5bWJvbCgndXRpbHMuZmllbGRzSW5jbHVkZWRXaXRoSnNvblBvc3QnLCBrby51dGlscy5maWVsZHNJbmNsdWRlZFdpdGhKc29uUG9zdCk7XG5rby5leHBvcnRTeW1ib2woJ3V0aWxzLmdldEZvcm1GaWVsZHMnLCBrby51dGlscy5nZXRGb3JtRmllbGRzKTtcbmtvLmV4cG9ydFN5bWJvbCgndXRpbHMucGVla09ic2VydmFibGUnLCBrby51dGlscy5wZWVrT2JzZXJ2YWJsZSk7XG5rby5leHBvcnRTeW1ib2woJ3V0aWxzLnBvc3RKc29uJywga28udXRpbHMucG9zdEpzb24pO1xua28uZXhwb3J0U3ltYm9sKCd1dGlscy5wYXJzZUpzb24nLCBrby51dGlscy5wYXJzZUpzb24pO1xua28uZXhwb3J0U3ltYm9sKCd1dGlscy5yZWdpc3RlckV2ZW50SGFuZGxlcicsIGtvLnV0aWxzLnJlZ2lzdGVyRXZlbnRIYW5kbGVyKTtcbmtvLmV4cG9ydFN5bWJvbCgndXRpbHMuc3RyaW5naWZ5SnNvbicsIGtvLnV0aWxzLnN0cmluZ2lmeUpzb24pO1xua28uZXhwb3J0U3ltYm9sKCd1dGlscy5yYW5nZScsIGtvLnV0aWxzLnJhbmdlKTtcbmtvLmV4cG9ydFN5bWJvbCgndXRpbHMudG9nZ2xlRG9tTm9kZUNzc0NsYXNzJywga28udXRpbHMudG9nZ2xlRG9tTm9kZUNzc0NsYXNzKTtcbmtvLmV4cG9ydFN5bWJvbCgndXRpbHMudHJpZ2dlckV2ZW50Jywga28udXRpbHMudHJpZ2dlckV2ZW50KTtcbmtvLmV4cG9ydFN5bWJvbCgndXRpbHMudW53cmFwT2JzZXJ2YWJsZScsIGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUpO1xua28uZXhwb3J0U3ltYm9sKCd1dGlscy5vYmplY3RGb3JFYWNoJywga28udXRpbHMub2JqZWN0Rm9yRWFjaCk7XG5rby5leHBvcnRTeW1ib2woJ3V0aWxzLmFkZE9yUmVtb3ZlSXRlbScsIGtvLnV0aWxzLmFkZE9yUmVtb3ZlSXRlbSk7XG5rby5leHBvcnRTeW1ib2woJ3V0aWxzLnNldFRleHRDb250ZW50Jywga28udXRpbHMuc2V0VGV4dENvbnRlbnQpO1xua28uZXhwb3J0U3ltYm9sKCd1bndyYXAnLCBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKTsgLy8gQ29udmVuaWVudCBzaG9ydGhhbmQsIGJlY2F1c2UgdGhpcyBpcyB1c2VkIHNvIGNvbW1vbmx5XG5cbmlmICghRnVuY3Rpb24ucHJvdG90eXBlWydiaW5kJ10pIHtcbiAgICAvLyBGdW5jdGlvbi5wcm90b3R5cGUuYmluZCBpcyBhIHN0YW5kYXJkIHBhcnQgb2YgRUNNQVNjcmlwdCA1dGggRWRpdGlvbiAoRGVjZW1iZXIgMjAwOSwgaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL3B1YmxpY2F0aW9ucy9maWxlcy9FQ01BLVNUL0VDTUEtMjYyLnBkZilcbiAgICAvLyBJbiBjYXNlIHRoZSBicm93c2VyIGRvZXNuJ3QgaW1wbGVtZW50IGl0IG5hdGl2ZWx5LCBwcm92aWRlIGEgSmF2YVNjcmlwdCBpbXBsZW1lbnRhdGlvbi4gVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiB0aGUgb25lIGluIHByb3RvdHlwZS5qc1xuICAgIEZ1bmN0aW9uLnByb3RvdHlwZVsnYmluZCddID0gZnVuY3Rpb24gKG9iamVjdCkge1xuICAgICAgICB2YXIgb3JpZ2luYWxGdW5jdGlvbiA9IHRoaXM7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbEZ1bmN0aW9uLmFwcGx5KG9iamVjdCwgYXJndW1lbnRzKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgcGFydGlhbEFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgYXJncyA9IHBhcnRpYWxBcmdzLnNsaWNlKDApO1xuICAgICAgICAgICAgICAgIGFyZ3MucHVzaC5hcHBseShhcmdzLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbEZ1bmN0aW9uLmFwcGx5KG9iamVjdCwgYXJncyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfTtcbn1cblxua28udXRpbHMuZG9tRGF0YSA9IG5ldyAoZnVuY3Rpb24gKCkge1xuICAgIHZhciB1bmlxdWVJZCA9IDA7XG4gICAgdmFyIGRhdGFTdG9yZUtleUV4cGFuZG9Qcm9wZXJ0eU5hbWUgPSBcIl9fa29fX1wiICsgKG5ldyBEYXRlKS5nZXRUaW1lKCk7XG4gICAgdmFyIGRhdGFTdG9yZSA9IHt9O1xuXG4gICAgZnVuY3Rpb24gZ2V0QWxsKG5vZGUsIGNyZWF0ZUlmTm90Rm91bmQpIHtcbiAgICAgICAgdmFyIGRhdGFTdG9yZUtleSA9IG5vZGVbZGF0YVN0b3JlS2V5RXhwYW5kb1Byb3BlcnR5TmFtZV07XG4gICAgICAgIHZhciBoYXNFeGlzdGluZ0RhdGFTdG9yZSA9IGRhdGFTdG9yZUtleSAmJiAoZGF0YVN0b3JlS2V5ICE9PSBcIm51bGxcIikgJiYgZGF0YVN0b3JlW2RhdGFTdG9yZUtleV07XG4gICAgICAgIGlmICghaGFzRXhpc3RpbmdEYXRhU3RvcmUpIHtcbiAgICAgICAgICAgIGlmICghY3JlYXRlSWZOb3RGb3VuZClcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgZGF0YVN0b3JlS2V5ID0gbm9kZVtkYXRhU3RvcmVLZXlFeHBhbmRvUHJvcGVydHlOYW1lXSA9IFwia29cIiArIHVuaXF1ZUlkKys7XG4gICAgICAgICAgICBkYXRhU3RvcmVbZGF0YVN0b3JlS2V5XSA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRhU3RvcmVbZGF0YVN0b3JlS2V5XTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uIChub2RlLCBrZXkpIHtcbiAgICAgICAgICAgIHZhciBhbGxEYXRhRm9yTm9kZSA9IGdldEFsbChub2RlLCBmYWxzZSk7XG4gICAgICAgICAgICByZXR1cm4gYWxsRGF0YUZvck5vZGUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IGFsbERhdGFGb3JOb2RlW2tleV07XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKG5vZGUsIGtleSwgdmFsdWUpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGRvbid0IGFjdHVhbGx5IGNyZWF0ZSBhIG5ldyBkb21EYXRhIGtleSBpZiB3ZSBhcmUgYWN0dWFsbHkgZGVsZXRpbmcgYSB2YWx1ZVxuICAgICAgICAgICAgICAgIGlmIChnZXRBbGwobm9kZSwgZmFsc2UpID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBhbGxEYXRhRm9yTm9kZSA9IGdldEFsbChub2RlLCB0cnVlKTtcbiAgICAgICAgICAgIGFsbERhdGFGb3JOb2RlW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgfSxcbiAgICAgICAgY2xlYXI6IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgICB2YXIgZGF0YVN0b3JlS2V5ID0gbm9kZVtkYXRhU3RvcmVLZXlFeHBhbmRvUHJvcGVydHlOYW1lXTtcbiAgICAgICAgICAgIGlmIChkYXRhU3RvcmVLZXkpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgZGF0YVN0b3JlW2RhdGFTdG9yZUtleV07XG4gICAgICAgICAgICAgICAgbm9kZVtkYXRhU3RvcmVLZXlFeHBhbmRvUHJvcGVydHlOYW1lXSA9IG51bGw7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vIEV4cG9zaW5nIFwiZGlkIGNsZWFuXCIgZmxhZyBwdXJlbHkgc28gc3BlY3MgY2FuIGluZmVyIHdoZXRoZXIgdGhpbmdzIGhhdmUgYmVlbiBjbGVhbmVkIHVwIGFzIGludGVuZGVkXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0sXG5cbiAgICAgICAgbmV4dEtleTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuICh1bmlxdWVJZCsrKSArIGRhdGFTdG9yZUtleUV4cGFuZG9Qcm9wZXJ0eU5hbWU7XG4gICAgICAgIH1cbiAgICB9O1xufSkoKTtcblxua28uZXhwb3J0U3ltYm9sKCd1dGlscy5kb21EYXRhJywga28udXRpbHMuZG9tRGF0YSk7XG5rby5leHBvcnRTeW1ib2woJ3V0aWxzLmRvbURhdGEuY2xlYXInLCBrby51dGlscy5kb21EYXRhLmNsZWFyKTsgLy8gRXhwb3J0aW5nIG9ubHkgc28gc3BlY3MgY2FuIGNsZWFyIHVwIGFmdGVyIHRoZW1zZWx2ZXMgZnVsbHlcblxua28udXRpbHMuZG9tTm9kZURpc3Bvc2FsID0gbmV3IChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGRvbURhdGFLZXkgPSBrby51dGlscy5kb21EYXRhLm5leHRLZXkoKTtcbiAgICB2YXIgY2xlYW5hYmxlTm9kZVR5cGVzID0geyAxOiB0cnVlLCA4OiB0cnVlLCA5OiB0cnVlIH07ICAgICAgIC8vIEVsZW1lbnQsIENvbW1lbnQsIERvY3VtZW50XG4gICAgdmFyIGNsZWFuYWJsZU5vZGVUeXBlc1dpdGhEZXNjZW5kYW50cyA9IHsgMTogdHJ1ZSwgOTogdHJ1ZSB9OyAvLyBFbGVtZW50LCBEb2N1bWVudFxuXG4gICAgZnVuY3Rpb24gZ2V0RGlzcG9zZUNhbGxiYWNrc0NvbGxlY3Rpb24obm9kZSwgY3JlYXRlSWZOb3RGb3VuZCkge1xuICAgICAgICB2YXIgYWxsRGlzcG9zZUNhbGxiYWNrcyA9IGtvLnV0aWxzLmRvbURhdGEuZ2V0KG5vZGUsIGRvbURhdGFLZXkpO1xuICAgICAgICBpZiAoKGFsbERpc3Bvc2VDYWxsYmFja3MgPT09IHVuZGVmaW5lZCkgJiYgY3JlYXRlSWZOb3RGb3VuZCkge1xuICAgICAgICAgICAgYWxsRGlzcG9zZUNhbGxiYWNrcyA9IFtdO1xuICAgICAgICAgICAga28udXRpbHMuZG9tRGF0YS5zZXQobm9kZSwgZG9tRGF0YUtleSwgYWxsRGlzcG9zZUNhbGxiYWNrcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFsbERpc3Bvc2VDYWxsYmFja3M7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGRlc3Ryb3lDYWxsYmFja3NDb2xsZWN0aW9uKG5vZGUpIHtcbiAgICAgICAga28udXRpbHMuZG9tRGF0YS5zZXQobm9kZSwgZG9tRGF0YUtleSwgdW5kZWZpbmVkKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjbGVhblNpbmdsZU5vZGUobm9kZSkge1xuICAgICAgICAvLyBSdW4gYWxsIHRoZSBkaXNwb3NlIGNhbGxiYWNrc1xuICAgICAgICB2YXIgY2FsbGJhY2tzID0gZ2V0RGlzcG9zZUNhbGxiYWNrc0NvbGxlY3Rpb24obm9kZSwgZmFsc2UpO1xuICAgICAgICBpZiAoY2FsbGJhY2tzKSB7XG4gICAgICAgICAgICBjYWxsYmFja3MgPSBjYWxsYmFja3Muc2xpY2UoMCk7IC8vIENsb25lLCBhcyB0aGUgYXJyYXkgbWF5IGJlIG1vZGlmaWVkIGR1cmluZyBpdGVyYXRpb24gKHR5cGljYWxseSwgY2FsbGJhY2tzIHdpbGwgcmVtb3ZlIHRoZW1zZWx2ZXMpXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNhbGxiYWNrcy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICBjYWxsYmFja3NbaV0obm9kZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFcmFzZSB0aGUgRE9NIGRhdGFcbiAgICAgICAga28udXRpbHMuZG9tRGF0YS5jbGVhcihub2RlKTtcblxuICAgICAgICAvLyBQZXJmb3JtIGNsZWFudXAgbmVlZGVkIGJ5IGV4dGVybmFsIGxpYnJhcmllcyAoY3VycmVudGx5IG9ubHkgalF1ZXJ5LCBidXQgY2FuIGJlIGV4dGVuZGVkKVxuICAgICAgICBrby51dGlscy5kb21Ob2RlRGlzcG9zYWxbXCJjbGVhbkV4dGVybmFsRGF0YVwiXShub2RlKTtcblxuICAgICAgICAvLyBDbGVhciBhbnkgaW1tZWRpYXRlLWNoaWxkIGNvbW1lbnQgbm9kZXMsIGFzIHRoZXNlIHdvdWxkbid0IGhhdmUgYmVlbiBmb3VuZCBieVxuICAgICAgICAvLyBub2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiKlwiKSBpbiBjbGVhbk5vZGUoKSAoY29tbWVudCBub2RlcyBhcmVuJ3QgZWxlbWVudHMpXG4gICAgICAgIGlmIChjbGVhbmFibGVOb2RlVHlwZXNXaXRoRGVzY2VuZGFudHNbbm9kZS5ub2RlVHlwZV0pXG4gICAgICAgICAgICBjbGVhbkltbWVkaWF0ZUNvbW1lbnRUeXBlQ2hpbGRyZW4obm9kZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2xlYW5JbW1lZGlhdGVDb21tZW50VHlwZUNoaWxkcmVuKG5vZGVXaXRoQ2hpbGRyZW4pIHtcbiAgICAgICAgdmFyIGNoaWxkLCBuZXh0Q2hpbGQgPSBub2RlV2l0aENoaWxkcmVuLmZpcnN0Q2hpbGQ7XG4gICAgICAgIHdoaWxlIChjaGlsZCA9IG5leHRDaGlsZCkge1xuICAgICAgICAgICAgbmV4dENoaWxkID0gY2hpbGQubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICBpZiAoY2hpbGQubm9kZVR5cGUgPT09IDgpXG4gICAgICAgICAgICAgICAgY2xlYW5TaW5nbGVOb2RlKGNoaWxkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIGFkZERpc3Bvc2VDYWxsYmFjayA6IGZ1bmN0aW9uKG5vZGUsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9IFwiZnVuY3Rpb25cIilcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYWxsYmFjayBtdXN0IGJlIGEgZnVuY3Rpb25cIik7XG4gICAgICAgICAgICBnZXREaXNwb3NlQ2FsbGJhY2tzQ29sbGVjdGlvbihub2RlLCB0cnVlKS5wdXNoKGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICByZW1vdmVEaXNwb3NlQ2FsbGJhY2sgOiBmdW5jdGlvbihub2RlLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgdmFyIGNhbGxiYWNrc0NvbGxlY3Rpb24gPSBnZXREaXNwb3NlQ2FsbGJhY2tzQ29sbGVjdGlvbihub2RlLCBmYWxzZSk7XG4gICAgICAgICAgICBpZiAoY2FsbGJhY2tzQ29sbGVjdGlvbikge1xuICAgICAgICAgICAgICAgIGtvLnV0aWxzLmFycmF5UmVtb3ZlSXRlbShjYWxsYmFja3NDb2xsZWN0aW9uLCBjYWxsYmFjayk7XG4gICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrc0NvbGxlY3Rpb24ubGVuZ3RoID09IDApXG4gICAgICAgICAgICAgICAgICAgIGRlc3Ryb3lDYWxsYmFja3NDb2xsZWN0aW9uKG5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIGNsZWFuTm9kZSA6IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgICAgIC8vIEZpcnN0IGNsZWFuIHRoaXMgbm9kZSwgd2hlcmUgYXBwbGljYWJsZVxuICAgICAgICAgICAgaWYgKGNsZWFuYWJsZU5vZGVUeXBlc1tub2RlLm5vZGVUeXBlXSkge1xuICAgICAgICAgICAgICAgIGNsZWFuU2luZ2xlTm9kZShub2RlKTtcblxuICAgICAgICAgICAgICAgIC8vIC4uLiB0aGVuIGl0cyBkZXNjZW5kYW50cywgd2hlcmUgYXBwbGljYWJsZVxuICAgICAgICAgICAgICAgIGlmIChjbGVhbmFibGVOb2RlVHlwZXNXaXRoRGVzY2VuZGFudHNbbm9kZS5ub2RlVHlwZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2xvbmUgdGhlIGRlc2NlbmRhbnRzIGxpc3QgaW4gY2FzZSBpdCBjaGFuZ2VzIGR1cmluZyBpdGVyYXRpb25cbiAgICAgICAgICAgICAgICAgICAgdmFyIGRlc2NlbmRhbnRzID0gW107XG4gICAgICAgICAgICAgICAgICAgIGtvLnV0aWxzLmFycmF5UHVzaEFsbChkZXNjZW5kYW50cywgbm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZShcIipcIikpO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgaiA9IGRlc2NlbmRhbnRzLmxlbmd0aDsgaSA8IGo7IGkrKylcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFuU2luZ2xlTm9kZShkZXNjZW5kYW50c1tpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH0sXG5cbiAgICAgICAgcmVtb3ZlTm9kZSA6IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgICAgIGtvLmNsZWFuTm9kZShub2RlKTtcbiAgICAgICAgICAgIGlmIChub2RlLnBhcmVudE5vZGUpXG4gICAgICAgICAgICAgICAgbm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5vZGUpO1xuICAgICAgICB9LFxuXG4gICAgICAgIFwiY2xlYW5FeHRlcm5hbERhdGFcIiA6IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgICAvLyBTcGVjaWFsIHN1cHBvcnQgZm9yIGpRdWVyeSBoZXJlIGJlY2F1c2UgaXQncyBzbyBjb21tb25seSB1c2VkLlxuICAgICAgICAgICAgLy8gTWFueSBqUXVlcnkgcGx1Z2lucyAoaW5jbHVkaW5nIGpxdWVyeS50bXBsKSBzdG9yZSBkYXRhIHVzaW5nIGpRdWVyeSdzIGVxdWl2YWxlbnQgb2YgZG9tRGF0YVxuICAgICAgICAgICAgLy8gc28gbm90aWZ5IGl0IHRvIHRlYXIgZG93biBhbnkgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgbm9kZSAmIGRlc2NlbmRhbnRzIGhlcmUuXG4gICAgICAgICAgICBpZiAoalF1ZXJ5SW5zdGFuY2UgJiYgKHR5cGVvZiBqUXVlcnlJbnN0YW5jZVsnY2xlYW5EYXRhJ10gPT0gXCJmdW5jdGlvblwiKSlcbiAgICAgICAgICAgICAgICBqUXVlcnlJbnN0YW5jZVsnY2xlYW5EYXRhJ10oW25vZGVdKTtcbiAgICAgICAgfVxuICAgIH07XG59KSgpO1xua28uY2xlYW5Ob2RlID0ga28udXRpbHMuZG9tTm9kZURpc3Bvc2FsLmNsZWFuTm9kZTsgLy8gU2hvcnRoYW5kIG5hbWUgZm9yIGNvbnZlbmllbmNlXG5rby5yZW1vdmVOb2RlID0ga28udXRpbHMuZG9tTm9kZURpc3Bvc2FsLnJlbW92ZU5vZGU7IC8vIFNob3J0aGFuZCBuYW1lIGZvciBjb252ZW5pZW5jZVxua28uZXhwb3J0U3ltYm9sKCdjbGVhbk5vZGUnLCBrby5jbGVhbk5vZGUpO1xua28uZXhwb3J0U3ltYm9sKCdyZW1vdmVOb2RlJywga28ucmVtb3ZlTm9kZSk7XG5rby5leHBvcnRTeW1ib2woJ3V0aWxzLmRvbU5vZGVEaXNwb3NhbCcsIGtvLnV0aWxzLmRvbU5vZGVEaXNwb3NhbCk7XG5rby5leHBvcnRTeW1ib2woJ3V0aWxzLmRvbU5vZGVEaXNwb3NhbC5hZGREaXNwb3NlQ2FsbGJhY2snLCBrby51dGlscy5kb21Ob2RlRGlzcG9zYWwuYWRkRGlzcG9zZUNhbGxiYWNrKTtcbmtvLmV4cG9ydFN5bWJvbCgndXRpbHMuZG9tTm9kZURpc3Bvc2FsLnJlbW92ZURpc3Bvc2VDYWxsYmFjaycsIGtvLnV0aWxzLmRvbU5vZGVEaXNwb3NhbC5yZW1vdmVEaXNwb3NlQ2FsbGJhY2spO1xuKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbm9uZSA9IFswLCBcIlwiLCBcIlwiXSxcbiAgICAgICAgdGFibGUgPSBbMSwgXCI8dGFibGU+XCIsIFwiPC90YWJsZT5cIl0sXG4gICAgICAgIHRib2R5ID0gWzIsIFwiPHRhYmxlPjx0Ym9keT5cIiwgXCI8L3Rib2R5PjwvdGFibGU+XCJdLFxuICAgICAgICB0ciA9IFszLCBcIjx0YWJsZT48dGJvZHk+PHRyPlwiLCBcIjwvdHI+PC90Ym9keT48L3RhYmxlPlwiXSxcbiAgICAgICAgc2VsZWN0ID0gWzEsIFwiPHNlbGVjdCBtdWx0aXBsZT0nbXVsdGlwbGUnPlwiLCBcIjwvc2VsZWN0PlwiXSxcbiAgICAgICAgbG9va3VwID0ge1xuICAgICAgICAgICAgJ3RoZWFkJzogdGFibGUsXG4gICAgICAgICAgICAndGJvZHknOiB0YWJsZSxcbiAgICAgICAgICAgICd0Zm9vdCc6IHRhYmxlLFxuICAgICAgICAgICAgJ3RyJzogdGJvZHksXG4gICAgICAgICAgICAndGQnOiB0cixcbiAgICAgICAgICAgICd0aCc6IHRyLFxuICAgICAgICAgICAgJ29wdGlvbic6IHNlbGVjdCxcbiAgICAgICAgICAgICdvcHRncm91cCc6IHNlbGVjdFxuICAgICAgICB9LFxuXG4gICAgICAgIC8vIFRoaXMgaXMgbmVlZGVkIGZvciBvbGQgSUUgaWYgeW91J3JlICpub3QqIHVzaW5nIGVpdGhlciBqUXVlcnkgb3IgaW5uZXJTaGl2LiBEb2Vzbid0IGFmZmVjdCBvdGhlciBjYXNlcy5cbiAgICAgICAgbWF5UmVxdWlyZUNyZWF0ZUVsZW1lbnRIYWNrID0ga28udXRpbHMuaWVWZXJzaW9uIDw9IDg7XG5cbiAgICBmdW5jdGlvbiBnZXRXcmFwKHRhZ3MpIHtcbiAgICAgICAgdmFyIG0gPSB0YWdzLm1hdGNoKC9ePChbYS16XSspWyA+XS8pO1xuICAgICAgICByZXR1cm4gKG0gJiYgbG9va3VwW21bMV1dKSB8fCBub25lO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNpbXBsZUh0bWxQYXJzZShodG1sLCBkb2N1bWVudENvbnRleHQpIHtcbiAgICAgICAgZG9jdW1lbnRDb250ZXh0IHx8IChkb2N1bWVudENvbnRleHQgPSBkb2N1bWVudCk7XG4gICAgICAgIHZhciB3aW5kb3dDb250ZXh0ID0gZG9jdW1lbnRDb250ZXh0WydwYXJlbnRXaW5kb3cnXSB8fCBkb2N1bWVudENvbnRleHRbJ2RlZmF1bHRWaWV3J10gfHwgd2luZG93O1xuXG4gICAgICAgIC8vIEJhc2VkIG9uIGpRdWVyeSdzIFwiY2xlYW5cIiBmdW5jdGlvbiwgYnV0IG9ubHkgYWNjb3VudGluZyBmb3IgdGFibGUtcmVsYXRlZCBlbGVtZW50cy5cbiAgICAgICAgLy8gSWYgeW91IGhhdmUgcmVmZXJlbmNlZCBqUXVlcnksIHRoaXMgd29uJ3QgYmUgdXNlZCBhbnl3YXkgLSBLTyB3aWxsIHVzZSBqUXVlcnkncyBcImNsZWFuXCIgZnVuY3Rpb24gZGlyZWN0bHlcblxuICAgICAgICAvLyBOb3RlIHRoYXQgdGhlcmUncyBzdGlsbCBhbiBpc3N1ZSBpbiBJRSA8IDkgd2hlcmVieSBpdCB3aWxsIGRpc2NhcmQgY29tbWVudCBub2RlcyB0aGF0IGFyZSB0aGUgZmlyc3QgY2hpbGQgb2ZcbiAgICAgICAgLy8gYSBkZXNjZW5kYW50IG5vZGUuIEZvciBleGFtcGxlOiBcIjxkaXY+PCEtLSBteWNvbW1lbnQgLS0+YWJjPC9kaXY+XCIgd2lsbCBnZXQgcGFyc2VkIGFzIFwiPGRpdj5hYmM8L2Rpdj5cIlxuICAgICAgICAvLyBUaGlzIHdvbid0IGFmZmVjdCBhbnlvbmUgd2hvIGhhcyByZWZlcmVuY2VkIGpRdWVyeSwgYW5kIHRoZXJlJ3MgYWx3YXlzIHRoZSB3b3JrYXJvdW5kIG9mIGluc2VydGluZyBhIGR1bW15IG5vZGVcbiAgICAgICAgLy8gKHBvc3NpYmx5IGEgdGV4dCBub2RlKSBpbiBmcm9udCBvZiB0aGUgY29tbWVudC4gU28sIEtPIGRvZXMgbm90IGF0dGVtcHQgdG8gd29ya2Fyb3VuZCB0aGlzIElFIGlzc3VlIGF1dG9tYXRpY2FsbHkgYXQgcHJlc2VudC5cblxuICAgICAgICAvLyBUcmltIHdoaXRlc3BhY2UsIG90aGVyd2lzZSBpbmRleE9mIHdvbid0IHdvcmsgYXMgZXhwZWN0ZWRcbiAgICAgICAgdmFyIHRhZ3MgPSBrby51dGlscy5zdHJpbmdUcmltKGh0bWwpLnRvTG93ZXJDYXNlKCksIGRpdiA9IGRvY3VtZW50Q29udGV4dC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLFxuICAgICAgICAgICAgd3JhcCA9IGdldFdyYXAodGFncyksXG4gICAgICAgICAgICBkZXB0aCA9IHdyYXBbMF07XG5cbiAgICAgICAgLy8gR28gdG8gaHRtbCBhbmQgYmFjaywgdGhlbiBwZWVsIG9mZiBleHRyYSB3cmFwcGVyc1xuICAgICAgICAvLyBOb3RlIHRoYXQgd2UgYWx3YXlzIHByZWZpeCB3aXRoIHNvbWUgZHVtbXkgdGV4dCwgYmVjYXVzZSBvdGhlcndpc2UsIElFPDkgd2lsbCBzdHJpcCBvdXQgbGVhZGluZyBjb21tZW50IG5vZGVzIGluIGRlc2NlbmRhbnRzLiBUb3RhbCBtYWRuZXNzLlxuICAgICAgICB2YXIgbWFya3VwID0gXCJpZ25vcmVkPGRpdj5cIiArIHdyYXBbMV0gKyBodG1sICsgd3JhcFsyXSArIFwiPC9kaXY+XCI7XG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93Q29udGV4dFsnaW5uZXJTaGl2J10gPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAvLyBOb3RlIHRoYXQgaW5uZXJTaGl2IGlzIGRlcHJlY2F0ZWQgaW4gZmF2b3VyIG9mIGh0bWw1c2hpdi4gV2Ugc2hvdWxkIGNvbnNpZGVyIGFkZGluZ1xuICAgICAgICAgICAgLy8gc3VwcG9ydCBmb3IgaHRtbDVzaGl2IChleGNlcHQgaWYgbm8gZXhwbGljaXQgc3VwcG9ydCBpcyBuZWVkZWQsIGUuZy4sIGlmIGh0bWw1c2hpdlxuICAgICAgICAgICAgLy8gc29tZWhvdyBzaGltcyB0aGUgbmF0aXZlIEFQSXMgc28gaXQganVzdCB3b3JrcyBhbnl3YXkpXG4gICAgICAgICAgICBkaXYuYXBwZW5kQ2hpbGQod2luZG93Q29udGV4dFsnaW5uZXJTaGl2J10obWFya3VwKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAobWF5UmVxdWlyZUNyZWF0ZUVsZW1lbnRIYWNrKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhlIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ215LWVsZW1lbnQnKSB0cmljayB0byBlbmFibGUgY3VzdG9tIGVsZW1lbnRzIGluIElFNi04XG4gICAgICAgICAgICAgICAgLy8gb25seSB3b3JrcyBpZiB3ZSBhc3NpZ24gaW5uZXJIVE1MIG9uIGFuIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoYXQgZG9jdW1lbnQuXG4gICAgICAgICAgICAgICAgZG9jdW1lbnRDb250ZXh0LmFwcGVuZENoaWxkKGRpdik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRpdi5pbm5lckhUTUwgPSBtYXJrdXA7XG5cbiAgICAgICAgICAgIGlmIChtYXlSZXF1aXJlQ3JlYXRlRWxlbWVudEhhY2spIHtcbiAgICAgICAgICAgICAgICBkaXYucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChkaXYpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gTW92ZSB0byB0aGUgcmlnaHQgZGVwdGhcbiAgICAgICAgd2hpbGUgKGRlcHRoLS0pXG4gICAgICAgICAgICBkaXYgPSBkaXYubGFzdENoaWxkO1xuXG4gICAgICAgIHJldHVybiBrby51dGlscy5tYWtlQXJyYXkoZGl2Lmxhc3RDaGlsZC5jaGlsZE5vZGVzKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBqUXVlcnlIdG1sUGFyc2UoaHRtbCwgZG9jdW1lbnRDb250ZXh0KSB7XG4gICAgICAgIC8vIGpRdWVyeSdzIFwicGFyc2VIVE1MXCIgZnVuY3Rpb24gd2FzIGludHJvZHVjZWQgaW4galF1ZXJ5IDEuOC4wIGFuZCBpcyBhIGRvY3VtZW50ZWQgcHVibGljIEFQSS5cbiAgICAgICAgaWYgKGpRdWVyeUluc3RhbmNlWydwYXJzZUhUTUwnXSkge1xuICAgICAgICAgICAgcmV0dXJuIGpRdWVyeUluc3RhbmNlWydwYXJzZUhUTUwnXShodG1sLCBkb2N1bWVudENvbnRleHQpIHx8IFtdOyAvLyBFbnN1cmUgd2UgYWx3YXlzIHJldHVybiBhbiBhcnJheSBhbmQgbmV2ZXIgbnVsbFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gRm9yIGpRdWVyeSA8IDEuOC4wLCB3ZSBmYWxsIGJhY2sgb24gdGhlIHVuZG9jdW1lbnRlZCBpbnRlcm5hbCBcImNsZWFuXCIgZnVuY3Rpb24uXG4gICAgICAgICAgICB2YXIgZWxlbXMgPSBqUXVlcnlJbnN0YW5jZVsnY2xlYW4nXShbaHRtbF0sIGRvY3VtZW50Q29udGV4dCk7XG5cbiAgICAgICAgICAgIC8vIEFzIG9mIGpRdWVyeSAxLjcuMSwgalF1ZXJ5IHBhcnNlcyB0aGUgSFRNTCBieSBhcHBlbmRpbmcgaXQgdG8gc29tZSBkdW1teSBwYXJlbnQgbm9kZXMgaGVsZCBpbiBhbiBpbi1tZW1vcnkgZG9jdW1lbnQgZnJhZ21lbnQuXG4gICAgICAgICAgICAvLyBVbmZvcnR1bmF0ZWx5LCBpdCBuZXZlciBjbGVhcnMgdGhlIGR1bW15IHBhcmVudCBub2RlcyBmcm9tIHRoZSBkb2N1bWVudCBmcmFnbWVudCwgc28gaXQgbGVha3MgbWVtb3J5IG92ZXIgdGltZS5cbiAgICAgICAgICAgIC8vIEZpeCB0aGlzIGJ5IGZpbmRpbmcgdGhlIHRvcC1tb3N0IGR1bW15IHBhcmVudCBlbGVtZW50LCBhbmQgZGV0YWNoaW5nIGl0IGZyb20gaXRzIG93bmVyIGZyYWdtZW50LlxuICAgICAgICAgICAgaWYgKGVsZW1zICYmIGVsZW1zWzBdKSB7XG4gICAgICAgICAgICAgICAgLy8gRmluZCB0aGUgdG9wLW1vc3QgcGFyZW50IGVsZW1lbnQgdGhhdCdzIGEgZGlyZWN0IGNoaWxkIG9mIGEgZG9jdW1lbnQgZnJhZ21lbnRcbiAgICAgICAgICAgICAgICB2YXIgZWxlbSA9IGVsZW1zWzBdO1xuICAgICAgICAgICAgICAgIHdoaWxlIChlbGVtLnBhcmVudE5vZGUgJiYgZWxlbS5wYXJlbnROb2RlLm5vZGVUeXBlICE9PSAxMSAvKiBpLmUuLCBEb2N1bWVudEZyYWdtZW50ICovKVxuICAgICAgICAgICAgICAgICAgICBlbGVtID0gZWxlbS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgIC8vIC4uLiB0aGVuIGRldGFjaCBpdFxuICAgICAgICAgICAgICAgIGlmIChlbGVtLnBhcmVudE5vZGUpXG4gICAgICAgICAgICAgICAgICAgIGVsZW0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbGVtKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGVsZW1zO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAga28udXRpbHMucGFyc2VIdG1sRnJhZ21lbnQgPSBmdW5jdGlvbihodG1sLCBkb2N1bWVudENvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIGpRdWVyeUluc3RhbmNlID9cbiAgICAgICAgICAgIGpRdWVyeUh0bWxQYXJzZShodG1sLCBkb2N1bWVudENvbnRleHQpIDogICAvLyBBcyBiZWxvdywgYmVuZWZpdCBmcm9tIGpRdWVyeSdzIG9wdGltaXNhdGlvbnMgd2hlcmUgcG9zc2libGVcbiAgICAgICAgICAgIHNpbXBsZUh0bWxQYXJzZShodG1sLCBkb2N1bWVudENvbnRleHQpOyAgLy8gLi4uIG90aGVyd2lzZSwgdGhpcyBzaW1wbGUgbG9naWMgd2lsbCBkbyBpbiBtb3N0IGNvbW1vbiBjYXNlcy5cbiAgICB9O1xuXG4gICAga28udXRpbHMuc2V0SHRtbCA9IGZ1bmN0aW9uKG5vZGUsIGh0bWwpIHtcbiAgICAgICAga28udXRpbHMuZW1wdHlEb21Ob2RlKG5vZGUpO1xuXG4gICAgICAgIC8vIFRoZXJlJ3Mgbm8gbGVnaXRpbWF0ZSByZWFzb24gdG8gZGlzcGxheSBhIHN0cmluZ2lmaWVkIG9ic2VydmFibGUgd2l0aG91dCB1bndyYXBwaW5nIGl0LCBzbyB3ZSdsbCB1bndyYXAgaXRcbiAgICAgICAgaHRtbCA9IGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUoaHRtbCk7XG5cbiAgICAgICAgaWYgKChodG1sICE9PSBudWxsKSAmJiAoaHRtbCAhPT0gdW5kZWZpbmVkKSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBodG1sICE9ICdzdHJpbmcnKVxuICAgICAgICAgICAgICAgIGh0bWwgPSBodG1sLnRvU3RyaW5nKCk7XG5cbiAgICAgICAgICAgIC8vIGpRdWVyeSBjb250YWlucyBhIGxvdCBvZiBzb3BoaXN0aWNhdGVkIGNvZGUgdG8gcGFyc2UgYXJiaXRyYXJ5IEhUTUwgZnJhZ21lbnRzLFxuICAgICAgICAgICAgLy8gZm9yIGV4YW1wbGUgPHRyPiBlbGVtZW50cyB3aGljaCBhcmUgbm90IG5vcm1hbGx5IGFsbG93ZWQgdG8gZXhpc3Qgb24gdGhlaXIgb3duLlxuICAgICAgICAgICAgLy8gSWYgeW91J3ZlIHJlZmVyZW5jZWQgalF1ZXJ5IHdlJ2xsIHVzZSB0aGF0IHJhdGhlciB0aGFuIGR1cGxpY2F0aW5nIGl0cyBjb2RlLlxuICAgICAgICAgICAgaWYgKGpRdWVyeUluc3RhbmNlKSB7XG4gICAgICAgICAgICAgICAgalF1ZXJ5SW5zdGFuY2Uobm9kZSlbJ2h0bWwnXShodG1sKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gLi4uIG90aGVyd2lzZSwgdXNlIEtPJ3Mgb3duIHBhcnNpbmcgbG9naWMuXG4gICAgICAgICAgICAgICAgdmFyIHBhcnNlZE5vZGVzID0ga28udXRpbHMucGFyc2VIdG1sRnJhZ21lbnQoaHRtbCwgbm9kZS5vd25lckRvY3VtZW50KTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcnNlZE5vZGVzLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgICAgICAgICBub2RlLmFwcGVuZENoaWxkKHBhcnNlZE5vZGVzW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG59KSgpO1xuXG5rby5leHBvcnRTeW1ib2woJ3V0aWxzLnBhcnNlSHRtbEZyYWdtZW50Jywga28udXRpbHMucGFyc2VIdG1sRnJhZ21lbnQpO1xua28uZXhwb3J0U3ltYm9sKCd1dGlscy5zZXRIdG1sJywga28udXRpbHMuc2V0SHRtbCk7XG5cbmtvLm1lbW9pemF0aW9uID0gKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbWVtb3MgPSB7fTtcblxuICAgIGZ1bmN0aW9uIHJhbmRvbU1heDhIZXhDaGFycygpIHtcbiAgICAgICAgcmV0dXJuICgoKDEgKyBNYXRoLnJhbmRvbSgpKSAqIDB4MTAwMDAwMDAwKSB8IDApLnRvU3RyaW5nKDE2KS5zdWJzdHJpbmcoMSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdlbmVyYXRlUmFuZG9tSWQoKSB7XG4gICAgICAgIHJldHVybiByYW5kb21NYXg4SGV4Q2hhcnMoKSArIHJhbmRvbU1heDhIZXhDaGFycygpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBmaW5kTWVtb05vZGVzKHJvb3ROb2RlLCBhcHBlbmRUb0FycmF5KSB7XG4gICAgICAgIGlmICghcm9vdE5vZGUpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGlmIChyb290Tm9kZS5ub2RlVHlwZSA9PSA4KSB7XG4gICAgICAgICAgICB2YXIgbWVtb0lkID0ga28ubWVtb2l6YXRpb24ucGFyc2VNZW1vVGV4dChyb290Tm9kZS5ub2RlVmFsdWUpO1xuICAgICAgICAgICAgaWYgKG1lbW9JZCAhPSBudWxsKVxuICAgICAgICAgICAgICAgIGFwcGVuZFRvQXJyYXkucHVzaCh7IGRvbU5vZGU6IHJvb3ROb2RlLCBtZW1vSWQ6IG1lbW9JZCB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChyb290Tm9kZS5ub2RlVHlwZSA9PSAxKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgY2hpbGROb2RlcyA9IHJvb3ROb2RlLmNoaWxkTm9kZXMsIGogPSBjaGlsZE5vZGVzLmxlbmd0aDsgaSA8IGo7IGkrKylcbiAgICAgICAgICAgICAgICBmaW5kTWVtb05vZGVzKGNoaWxkTm9kZXNbaV0sIGFwcGVuZFRvQXJyYXkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgbWVtb2l6ZTogZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9IFwiZnVuY3Rpb25cIilcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJZb3UgY2FuIG9ubHkgcGFzcyBhIGZ1bmN0aW9uIHRvIGtvLm1lbW9pemF0aW9uLm1lbW9pemUoKVwiKTtcbiAgICAgICAgICAgIHZhciBtZW1vSWQgPSBnZW5lcmF0ZVJhbmRvbUlkKCk7XG4gICAgICAgICAgICBtZW1vc1ttZW1vSWRdID0gY2FsbGJhY2s7XG4gICAgICAgICAgICByZXR1cm4gXCI8IS0tW2tvX21lbW86XCIgKyBtZW1vSWQgKyBcIl0tLT5cIjtcbiAgICAgICAgfSxcblxuICAgICAgICB1bm1lbW9pemU6IGZ1bmN0aW9uIChtZW1vSWQsIGNhbGxiYWNrUGFyYW1zKSB7XG4gICAgICAgICAgICB2YXIgY2FsbGJhY2sgPSBtZW1vc1ttZW1vSWRdO1xuICAgICAgICAgICAgaWYgKGNhbGxiYWNrID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ291bGRuJ3QgZmluZCBhbnkgbWVtbyB3aXRoIElEIFwiICsgbWVtb0lkICsgXCIuIFBlcmhhcHMgaXQncyBhbHJlYWR5IGJlZW4gdW5tZW1vaXplZC5cIik7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrLmFwcGx5KG51bGwsIGNhbGxiYWNrUGFyYW1zIHx8IFtdKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkgeyBkZWxldGUgbWVtb3NbbWVtb0lkXTsgfVxuICAgICAgICB9LFxuXG4gICAgICAgIHVubWVtb2l6ZURvbU5vZGVBbmREZXNjZW5kYW50czogZnVuY3Rpb24gKGRvbU5vZGUsIGV4dHJhQ2FsbGJhY2tQYXJhbXNBcnJheSkge1xuICAgICAgICAgICAgdmFyIG1lbW9zID0gW107XG4gICAgICAgICAgICBmaW5kTWVtb05vZGVzKGRvbU5vZGUsIG1lbW9zKTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBqID0gbWVtb3MubGVuZ3RoOyBpIDwgajsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIG5vZGUgPSBtZW1vc1tpXS5kb21Ob2RlO1xuICAgICAgICAgICAgICAgIHZhciBjb21iaW5lZFBhcmFtcyA9IFtub2RlXTtcbiAgICAgICAgICAgICAgICBpZiAoZXh0cmFDYWxsYmFja1BhcmFtc0FycmF5KVxuICAgICAgICAgICAgICAgICAgICBrby51dGlscy5hcnJheVB1c2hBbGwoY29tYmluZWRQYXJhbXMsIGV4dHJhQ2FsbGJhY2tQYXJhbXNBcnJheSk7XG4gICAgICAgICAgICAgICAga28ubWVtb2l6YXRpb24udW5tZW1vaXplKG1lbW9zW2ldLm1lbW9JZCwgY29tYmluZWRQYXJhbXMpO1xuICAgICAgICAgICAgICAgIG5vZGUubm9kZVZhbHVlID0gXCJcIjsgLy8gTmV1dGVyIHRoaXMgbm9kZSBzbyB3ZSBkb24ndCB0cnkgdG8gdW5tZW1vaXplIGl0IGFnYWluXG4gICAgICAgICAgICAgICAgaWYgKG5vZGUucGFyZW50Tm9kZSlcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5vZGUpOyAvLyBJZiBwb3NzaWJsZSwgZXJhc2UgaXQgdG90YWxseSAobm90IGFsd2F5cyBwb3NzaWJsZSAtIHNvbWVvbmUgZWxzZSBtaWdodCBqdXN0IGhvbGQgYSByZWZlcmVuY2UgdG8gaXQgdGhlbiBjYWxsIHVubWVtb2l6ZURvbU5vZGVBbmREZXNjZW5kYW50cyBhZ2FpbilcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBwYXJzZU1lbW9UZXh0OiBmdW5jdGlvbiAobWVtb1RleHQpIHtcbiAgICAgICAgICAgIHZhciBtYXRjaCA9IG1lbW9UZXh0Lm1hdGNoKC9eXFxba29fbWVtb1xcOiguKj8pXFxdJC8pO1xuICAgICAgICAgICAgcmV0dXJuIG1hdGNoID8gbWF0Y2hbMV0gOiBudWxsO1xuICAgICAgICB9XG4gICAgfTtcbn0pKCk7XG5cbmtvLmV4cG9ydFN5bWJvbCgnbWVtb2l6YXRpb24nLCBrby5tZW1vaXphdGlvbik7XG5rby5leHBvcnRTeW1ib2woJ21lbW9pemF0aW9uLm1lbW9pemUnLCBrby5tZW1vaXphdGlvbi5tZW1vaXplKTtcbmtvLmV4cG9ydFN5bWJvbCgnbWVtb2l6YXRpb24udW5tZW1vaXplJywga28ubWVtb2l6YXRpb24udW5tZW1vaXplKTtcbmtvLmV4cG9ydFN5bWJvbCgnbWVtb2l6YXRpb24ucGFyc2VNZW1vVGV4dCcsIGtvLm1lbW9pemF0aW9uLnBhcnNlTWVtb1RleHQpO1xua28uZXhwb3J0U3ltYm9sKCdtZW1vaXphdGlvbi51bm1lbW9pemVEb21Ob2RlQW5kRGVzY2VuZGFudHMnLCBrby5tZW1vaXphdGlvbi51bm1lbW9pemVEb21Ob2RlQW5kRGVzY2VuZGFudHMpO1xua28udGFza3MgPSAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBzY2hlZHVsZXIsXG4gICAgICAgIHRhc2tRdWV1ZSA9IFtdLFxuICAgICAgICB0YXNrUXVldWVMZW5ndGggPSAwLFxuICAgICAgICBuZXh0SGFuZGxlID0gMSxcbiAgICAgICAgbmV4dEluZGV4VG9Qcm9jZXNzID0gMDtcblxuICAgIGlmICh3aW5kb3dbJ011dGF0aW9uT2JzZXJ2ZXInXSkge1xuICAgICAgICAvLyBDaHJvbWUgMjcrLCBGaXJlZm94IDE0KywgSUUgMTErLCBPcGVyYSAxNSssIFNhZmFyaSA2LjErXG4gICAgICAgIC8vIEZyb20gaHR0cHM6Ly9naXRodWIuY29tL3BldGthYW50b25vdi9ibHVlYmlyZCAqIENvcHlyaWdodCAoYykgMjAxNCBQZXRrYSBBbnRvbm92ICogTGljZW5zZTogTUlUXG4gICAgICAgIHNjaGVkdWxlciA9IChmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgICAgbmV3IE11dGF0aW9uT2JzZXJ2ZXIoY2FsbGJhY2spLm9ic2VydmUoZGl2LCB7YXR0cmlidXRlczogdHJ1ZX0pO1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsgZGl2LmNsYXNzTGlzdC50b2dnbGUoXCJmb29cIik7IH07XG4gICAgICAgIH0pKHNjaGVkdWxlZFByb2Nlc3MpO1xuICAgIH0gZWxzZSBpZiAoZG9jdW1lbnQgJiYgXCJvbnJlYWR5c3RhdGVjaGFuZ2VcIiBpbiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic2NyaXB0XCIpKSB7XG4gICAgICAgIC8vIElFIDYtMTBcbiAgICAgICAgLy8gRnJvbSBodHRwczovL2dpdGh1Yi5jb20vWXV6dUpTL3NldEltbWVkaWF0ZSAqIENvcHlyaWdodCAoYykgMjAxMiBCYXJuZXNhbmRub2JsZS5jb20sIGxsYywgRG9uYXZvbiBXZXN0LCBhbmQgRG9tZW5pYyBEZW5pY29sYSAqIExpY2Vuc2U6IE1JVFxuICAgICAgICBzY2hlZHVsZXIgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHZhciBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic2NyaXB0XCIpO1xuICAgICAgICAgICAgc2NyaXB0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzY3JpcHQub25yZWFkeXN0YXRlY2hhbmdlID0gbnVsbDtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoc2NyaXB0KTtcbiAgICAgICAgICAgICAgICBzY3JpcHQgPSBudWxsO1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmFwcGVuZENoaWxkKHNjcmlwdCk7XG4gICAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgICAgc2NoZWR1bGVyID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KGNhbGxiYWNrLCAwKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwcm9jZXNzVGFza3MoKSB7XG4gICAgICAgIGlmICh0YXNrUXVldWVMZW5ndGgpIHtcbiAgICAgICAgICAgIC8vIEVhY2ggbWFyayByZXByZXNlbnRzIHRoZSBlbmQgb2YgYSBsb2dpY2FsIGdyb3VwIG9mIHRhc2tzIGFuZCB0aGUgbnVtYmVyIG9mIHRoZXNlIGdyb3VwcyBpc1xuICAgICAgICAgICAgLy8gbGltaXRlZCB0byBwcmV2ZW50IHVuY2hlY2tlZCByZWN1cnNpb24uXG4gICAgICAgICAgICB2YXIgbWFyayA9IHRhc2tRdWV1ZUxlbmd0aCwgY291bnRNYXJrcyA9IDA7XG5cbiAgICAgICAgICAgIC8vIG5leHRJbmRleFRvUHJvY2VzcyBrZWVwcyB0cmFjayBvZiB3aGVyZSB3ZSBhcmUgaW4gdGhlIHF1ZXVlOyBwcm9jZXNzVGFza3MgY2FuIGJlIGNhbGxlZCByZWN1cnNpdmVseSB3aXRob3V0IGlzc3VlXG4gICAgICAgICAgICBmb3IgKHZhciB0YXNrOyBuZXh0SW5kZXhUb1Byb2Nlc3MgPCB0YXNrUXVldWVMZW5ndGg7ICkge1xuICAgICAgICAgICAgICAgIGlmICh0YXNrID0gdGFza1F1ZXVlW25leHRJbmRleFRvUHJvY2VzcysrXSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobmV4dEluZGV4VG9Qcm9jZXNzID4gbWFyaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCsrY291bnRNYXJrcyA+PSA1MDAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEluZGV4VG9Qcm9jZXNzID0gdGFza1F1ZXVlTGVuZ3RoOyAgIC8vIHNraXAgYWxsIHRhc2tzIHJlbWFpbmluZyBpbiB0aGUgcXVldWUgc2luY2UgYW55IG9mIHRoZW0gY291bGQgYmUgY2F1c2luZyB0aGUgcmVjdXJzaW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAga28udXRpbHMuZGVmZXJFcnJvcihFcnJvcihcIidUb28gbXVjaCByZWN1cnNpb24nIGFmdGVyIHByb2Nlc3NpbmcgXCIgKyBjb3VudE1hcmtzICsgXCIgdGFzayBncm91cHMuXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcmsgPSB0YXNrUXVldWVMZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhc2soKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtvLnV0aWxzLmRlZmVyRXJyb3IoZXgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2NoZWR1bGVkUHJvY2VzcygpIHtcbiAgICAgICAgcHJvY2Vzc1Rhc2tzKCk7XG5cbiAgICAgICAgLy8gUmVzZXQgdGhlIHF1ZXVlXG4gICAgICAgIG5leHRJbmRleFRvUHJvY2VzcyA9IHRhc2tRdWV1ZUxlbmd0aCA9IHRhc2tRdWV1ZS5sZW5ndGggPSAwO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNjaGVkdWxlVGFza1Byb2Nlc3NpbmcoKSB7XG4gICAgICAgIGtvLnRhc2tzWydzY2hlZHVsZXInXShzY2hlZHVsZWRQcm9jZXNzKTtcbiAgICB9XG5cbiAgICB2YXIgdGFza3MgPSB7XG4gICAgICAgICdzY2hlZHVsZXInOiBzY2hlZHVsZXIsICAgICAvLyBBbGxvdyBvdmVycmlkaW5nIHRoZSBzY2hlZHVsZXJcblxuICAgICAgICBzY2hlZHVsZTogZnVuY3Rpb24gKGZ1bmMpIHtcbiAgICAgICAgICAgIGlmICghdGFza1F1ZXVlTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgc2NoZWR1bGVUYXNrUHJvY2Vzc2luZygpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0YXNrUXVldWVbdGFza1F1ZXVlTGVuZ3RoKytdID0gZnVuYztcbiAgICAgICAgICAgIHJldHVybiBuZXh0SGFuZGxlKys7XG4gICAgICAgIH0sXG5cbiAgICAgICAgY2FuY2VsOiBmdW5jdGlvbiAoaGFuZGxlKSB7XG4gICAgICAgICAgICB2YXIgaW5kZXggPSBoYW5kbGUgLSAobmV4dEhhbmRsZSAtIHRhc2tRdWV1ZUxlbmd0aCk7XG4gICAgICAgICAgICBpZiAoaW5kZXggPj0gbmV4dEluZGV4VG9Qcm9jZXNzICYmIGluZGV4IDwgdGFza1F1ZXVlTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGFza1F1ZXVlW2luZGV4XSA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgLy8gRm9yIHRlc3Rpbmcgb25seTogcmVzZXQgdGhlIHF1ZXVlIGFuZCByZXR1cm4gdGhlIHByZXZpb3VzIHF1ZXVlIGxlbmd0aFxuICAgICAgICAncmVzZXRGb3JUZXN0aW5nJzogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGxlbmd0aCA9IHRhc2tRdWV1ZUxlbmd0aCAtIG5leHRJbmRleFRvUHJvY2VzcztcbiAgICAgICAgICAgIG5leHRJbmRleFRvUHJvY2VzcyA9IHRhc2tRdWV1ZUxlbmd0aCA9IHRhc2tRdWV1ZS5sZW5ndGggPSAwO1xuICAgICAgICAgICAgcmV0dXJuIGxlbmd0aDtcbiAgICAgICAgfSxcblxuICAgICAgICBydW5FYXJseTogcHJvY2Vzc1Rhc2tzXG4gICAgfTtcblxuICAgIHJldHVybiB0YXNrcztcbn0pKCk7XG5cbmtvLmV4cG9ydFN5bWJvbCgndGFza3MnLCBrby50YXNrcyk7XG5rby5leHBvcnRTeW1ib2woJ3Rhc2tzLnNjaGVkdWxlJywga28udGFza3Muc2NoZWR1bGUpO1xuLy9rby5leHBvcnRTeW1ib2woJ3Rhc2tzLmNhbmNlbCcsIGtvLnRhc2tzLmNhbmNlbCk7ICBcImNhbmNlbFwiIGlzbid0IG1pbmlmaWVkXG5rby5leHBvcnRTeW1ib2woJ3Rhc2tzLnJ1bkVhcmx5Jywga28udGFza3MucnVuRWFybHkpO1xua28uZXh0ZW5kZXJzID0ge1xuICAgICd0aHJvdHRsZSc6IGZ1bmN0aW9uKHRhcmdldCwgdGltZW91dCkge1xuICAgICAgICAvLyBUaHJvdHRsaW5nIG1lYW5zIHR3byB0aGluZ3M6XG5cbiAgICAgICAgLy8gKDEpIEZvciBkZXBlbmRlbnQgb2JzZXJ2YWJsZXMsIHdlIHRocm90dGxlICpldmFsdWF0aW9ucyogc28gdGhhdCwgbm8gbWF0dGVyIGhvdyBmYXN0IGl0cyBkZXBlbmRlbmNpZXNcbiAgICAgICAgLy8gICAgIG5vdGlmeSB1cGRhdGVzLCB0aGUgdGFyZ2V0IGRvZXNuJ3QgcmUtZXZhbHVhdGUgKGFuZCBoZW5jZSBkb2Vzbid0IG5vdGlmeSkgZmFzdGVyIHRoYW4gYSBjZXJ0YWluIHJhdGVcbiAgICAgICAgdGFyZ2V0Wyd0aHJvdHRsZUV2YWx1YXRpb24nXSA9IHRpbWVvdXQ7XG5cbiAgICAgICAgLy8gKDIpIEZvciB3cml0YWJsZSB0YXJnZXRzIChvYnNlcnZhYmxlcywgb3Igd3JpdGFibGUgZGVwZW5kZW50IG9ic2VydmFibGVzKSwgd2UgdGhyb3R0bGUgKndyaXRlcypcbiAgICAgICAgLy8gICAgIHNvIHRoZSB0YXJnZXQgY2Fubm90IGNoYW5nZSB2YWx1ZSBzeW5jaHJvbm91c2x5IG9yIGZhc3RlciB0aGFuIGEgY2VydGFpbiByYXRlXG4gICAgICAgIHZhciB3cml0ZVRpbWVvdXRJbnN0YW5jZSA9IG51bGw7XG4gICAgICAgIHJldHVybiBrby5kZXBlbmRlbnRPYnNlcnZhYmxlKHtcbiAgICAgICAgICAgICdyZWFkJzogdGFyZ2V0LFxuICAgICAgICAgICAgJ3dyaXRlJzogZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQod3JpdGVUaW1lb3V0SW5zdGFuY2UpO1xuICAgICAgICAgICAgICAgIHdyaXRlVGltZW91dEluc3RhbmNlID0ga28udXRpbHMuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0KHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9LCB0aW1lb3V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSxcblxuICAgICdyYXRlTGltaXQnOiBmdW5jdGlvbih0YXJnZXQsIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIHRpbWVvdXQsIG1ldGhvZCwgbGltaXRGdW5jdGlvbjtcblxuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHRpbWVvdXQgPSBvcHRpb25zO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGltZW91dCA9IG9wdGlvbnNbJ3RpbWVvdXQnXTtcbiAgICAgICAgICAgIG1ldGhvZCA9IG9wdGlvbnNbJ21ldGhvZCddO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcmF0ZUxpbWl0IHN1cGVyc2VkZXMgZGVmZXJyZWQgdXBkYXRlc1xuICAgICAgICB0YXJnZXQuX2RlZmVyVXBkYXRlcyA9IGZhbHNlO1xuXG4gICAgICAgIGxpbWl0RnVuY3Rpb24gPSBtZXRob2QgPT0gJ25vdGlmeVdoZW5DaGFuZ2VzU3RvcCcgPyAgZGVib3VuY2UgOiB0aHJvdHRsZTtcbiAgICAgICAgdGFyZ2V0LmxpbWl0KGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gbGltaXRGdW5jdGlvbihjYWxsYmFjaywgdGltZW91dCk7XG4gICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICAnZGVmZXJyZWQnOiBmdW5jdGlvbih0YXJnZXQsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMgIT09IHRydWUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIFxcJ2RlZmVycmVkXFwnIGV4dGVuZGVyIG9ubHkgYWNjZXB0cyB0aGUgdmFsdWUgXFwndHJ1ZVxcJywgYmVjYXVzZSBpdCBpcyBub3Qgc3VwcG9ydGVkIHRvIHR1cm4gZGVmZXJyYWwgb2ZmIG9uY2UgZW5hYmxlZC4nKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0YXJnZXQuX2RlZmVyVXBkYXRlcykge1xuICAgICAgICAgICAgdGFyZ2V0Ll9kZWZlclVwZGF0ZXMgPSB0cnVlO1xuICAgICAgICAgICAgdGFyZ2V0LmxpbWl0KGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIHZhciBoYW5kbGUsXG4gICAgICAgICAgICAgICAgICAgIGlnbm9yZVVwZGF0ZXMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWlnbm9yZVVwZGF0ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtvLnRhc2tzLmNhbmNlbChoYW5kbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlID0ga28udGFza3Muc2NoZWR1bGUoY2FsbGJhY2spO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZVVwZGF0ZXMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFsnbm90aWZ5U3Vic2NyaWJlcnMnXSh1bmRlZmluZWQsICdkaXJ0eScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmVVcGRhdGVzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgJ25vdGlmeSc6IGZ1bmN0aW9uKHRhcmdldCwgbm90aWZ5V2hlbikge1xuICAgICAgICB0YXJnZXRbXCJlcXVhbGl0eUNvbXBhcmVyXCJdID0gbm90aWZ5V2hlbiA9PSBcImFsd2F5c1wiID9cbiAgICAgICAgICAgIG51bGwgOiAgLy8gbnVsbCBlcXVhbGl0eUNvbXBhcmVyIG1lYW5zIHRvIGFsd2F5cyBub3RpZnlcbiAgICAgICAgICAgIHZhbHVlc0FyZVByaW1pdGl2ZUFuZEVxdWFsO1xuICAgIH1cbn07XG5cbnZhciBwcmltaXRpdmVUeXBlcyA9IHsgJ3VuZGVmaW5lZCc6MSwgJ2Jvb2xlYW4nOjEsICdudW1iZXInOjEsICdzdHJpbmcnOjEgfTtcbmZ1bmN0aW9uIHZhbHVlc0FyZVByaW1pdGl2ZUFuZEVxdWFsKGEsIGIpIHtcbiAgICB2YXIgb2xkVmFsdWVJc1ByaW1pdGl2ZSA9IChhID09PSBudWxsKSB8fCAodHlwZW9mKGEpIGluIHByaW1pdGl2ZVR5cGVzKTtcbiAgICByZXR1cm4gb2xkVmFsdWVJc1ByaW1pdGl2ZSA/IChhID09PSBiKSA6IGZhbHNlO1xufVxuXG5mdW5jdGlvbiB0aHJvdHRsZShjYWxsYmFjaywgdGltZW91dCkge1xuICAgIHZhciB0aW1lb3V0SW5zdGFuY2U7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCF0aW1lb3V0SW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHRpbWVvdXRJbnN0YW5jZSA9IGtvLnV0aWxzLnNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHRpbWVvdXRJbnN0YW5jZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgfSwgdGltZW91dCk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuXG5mdW5jdGlvbiBkZWJvdW5jZShjYWxsYmFjaywgdGltZW91dCkge1xuICAgIHZhciB0aW1lb3V0SW5zdGFuY2U7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJbnN0YW5jZSk7XG4gICAgICAgIHRpbWVvdXRJbnN0YW5jZSA9IGtvLnV0aWxzLnNldFRpbWVvdXQoY2FsbGJhY2ssIHRpbWVvdXQpO1xuICAgIH07XG59XG5cbmZ1bmN0aW9uIGFwcGx5RXh0ZW5kZXJzKHJlcXVlc3RlZEV4dGVuZGVycykge1xuICAgIHZhciB0YXJnZXQgPSB0aGlzO1xuICAgIGlmIChyZXF1ZXN0ZWRFeHRlbmRlcnMpIHtcbiAgICAgICAga28udXRpbHMub2JqZWN0Rm9yRWFjaChyZXF1ZXN0ZWRFeHRlbmRlcnMsIGZ1bmN0aW9uKGtleSwgdmFsdWUpIHtcbiAgICAgICAgICAgIHZhciBleHRlbmRlckhhbmRsZXIgPSBrby5leHRlbmRlcnNba2V5XTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZXh0ZW5kZXJIYW5kbGVyID09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXQgPSBleHRlbmRlckhhbmRsZXIodGFyZ2V0LCB2YWx1ZSkgfHwgdGFyZ2V0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldDtcbn1cblxua28uZXhwb3J0U3ltYm9sKCdleHRlbmRlcnMnLCBrby5leHRlbmRlcnMpO1xuXG5rby5zdWJzY3JpcHRpb24gPSBmdW5jdGlvbiAodGFyZ2V0LCBjYWxsYmFjaywgZGlzcG9zZUNhbGxiYWNrKSB7XG4gICAgdGhpcy5fdGFyZ2V0ID0gdGFyZ2V0O1xuICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICB0aGlzLmRpc3Bvc2VDYWxsYmFjayA9IGRpc3Bvc2VDYWxsYmFjaztcbiAgICB0aGlzLmlzRGlzcG9zZWQgPSBmYWxzZTtcbiAgICBrby5leHBvcnRQcm9wZXJ0eSh0aGlzLCAnZGlzcG9zZScsIHRoaXMuZGlzcG9zZSk7XG59O1xua28uc3Vic2NyaXB0aW9uLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuaXNEaXNwb3NlZCA9IHRydWU7XG4gICAgdGhpcy5kaXNwb3NlQ2FsbGJhY2soKTtcbn07XG5cbmtvLnN1YnNjcmliYWJsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBrby51dGlscy5zZXRQcm90b3R5cGVPZk9yRXh0ZW5kKHRoaXMsIGtvX3N1YnNjcmliYWJsZV9mbik7XG4gICAga29fc3Vic2NyaWJhYmxlX2ZuLmluaXQodGhpcyk7XG59XG5cbnZhciBkZWZhdWx0RXZlbnQgPSBcImNoYW5nZVwiO1xuXG4vLyBNb3ZlZCBvdXQgb2YgXCJsaW1pdFwiIHRvIGF2b2lkIHRoZSBleHRyYSBjbG9zdXJlXG5mdW5jdGlvbiBsaW1pdE5vdGlmeVN1YnNjcmliZXJzKHZhbHVlLCBldmVudCkge1xuICAgIGlmICghZXZlbnQgfHwgZXZlbnQgPT09IGRlZmF1bHRFdmVudCkge1xuICAgICAgICB0aGlzLl9saW1pdENoYW5nZSh2YWx1ZSk7XG4gICAgfSBlbHNlIGlmIChldmVudCA9PT0gJ2JlZm9yZUNoYW5nZScpIHtcbiAgICAgICAgdGhpcy5fbGltaXRCZWZvcmVDaGFuZ2UodmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX29yaWdOb3RpZnlTdWJzY3JpYmVycyh2YWx1ZSwgZXZlbnQpO1xuICAgIH1cbn1cblxudmFyIGtvX3N1YnNjcmliYWJsZV9mbiA9IHtcbiAgICBpbml0OiBmdW5jdGlvbihpbnN0YW5jZSkge1xuICAgICAgICBpbnN0YW5jZS5fc3Vic2NyaXB0aW9ucyA9IHsgXCJjaGFuZ2VcIjogW10gfTtcbiAgICAgICAgaW5zdGFuY2UuX3ZlcnNpb25OdW1iZXIgPSAxO1xuICAgIH0sXG5cbiAgICBzdWJzY3JpYmU6IGZ1bmN0aW9uIChjYWxsYmFjaywgY2FsbGJhY2tUYXJnZXQsIGV2ZW50KSB7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgICAgICBldmVudCA9IGV2ZW50IHx8IGRlZmF1bHRFdmVudDtcbiAgICAgICAgdmFyIGJvdW5kQ2FsbGJhY2sgPSBjYWxsYmFja1RhcmdldCA/IGNhbGxiYWNrLmJpbmQoY2FsbGJhY2tUYXJnZXQpIDogY2FsbGJhY2s7XG5cbiAgICAgICAgdmFyIHN1YnNjcmlwdGlvbiA9IG5ldyBrby5zdWJzY3JpcHRpb24oc2VsZiwgYm91bmRDYWxsYmFjaywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAga28udXRpbHMuYXJyYXlSZW1vdmVJdGVtKHNlbGYuX3N1YnNjcmlwdGlvbnNbZXZlbnRdLCBzdWJzY3JpcHRpb24pO1xuICAgICAgICAgICAgaWYgKHNlbGYuYWZ0ZXJTdWJzY3JpcHRpb25SZW1vdmUpXG4gICAgICAgICAgICAgICAgc2VsZi5hZnRlclN1YnNjcmlwdGlvblJlbW92ZShldmVudCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChzZWxmLmJlZm9yZVN1YnNjcmlwdGlvbkFkZClcbiAgICAgICAgICAgIHNlbGYuYmVmb3JlU3Vic2NyaXB0aW9uQWRkKGV2ZW50KTtcblxuICAgICAgICBpZiAoIXNlbGYuX3N1YnNjcmlwdGlvbnNbZXZlbnRdKVxuICAgICAgICAgICAgc2VsZi5fc3Vic2NyaXB0aW9uc1tldmVudF0gPSBbXTtcbiAgICAgICAgc2VsZi5fc3Vic2NyaXB0aW9uc1tldmVudF0ucHVzaChzdWJzY3JpcHRpb24pO1xuXG4gICAgICAgIHJldHVybiBzdWJzY3JpcHRpb247XG4gICAgfSxcblxuICAgIFwibm90aWZ5U3Vic2NyaWJlcnNcIjogZnVuY3Rpb24gKHZhbHVlVG9Ob3RpZnksIGV2ZW50KSB7XG4gICAgICAgIGV2ZW50ID0gZXZlbnQgfHwgZGVmYXVsdEV2ZW50O1xuICAgICAgICBpZiAoZXZlbnQgPT09IGRlZmF1bHRFdmVudCkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVWZXJzaW9uKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaGFzU3Vic2NyaXB0aW9uc0ZvckV2ZW50KGV2ZW50KSkge1xuICAgICAgICAgICAgdmFyIHN1YnMgPSBldmVudCA9PT0gZGVmYXVsdEV2ZW50ICYmIHRoaXMuX2NoYW5nZVN1YnNjcmlwdGlvbnMgfHwgdGhpcy5fc3Vic2NyaXB0aW9uc1tldmVudF0uc2xpY2UoMCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGtvLmRlcGVuZGVuY3lEZXRlY3Rpb24uYmVnaW4oKTsgLy8gQmVnaW4gc3VwcHJlc3NpbmcgZGVwZW5kZW5jeSBkZXRlY3Rpb24gKGJ5IHNldHRpbmcgdGhlIHRvcCBmcmFtZSB0byB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIHN1YnNjcmlwdGlvbjsgc3Vic2NyaXB0aW9uID0gc3Vic1tpXTsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEluIGNhc2UgYSBzdWJzY3JpcHRpb24gd2FzIGRpc3Bvc2VkIGR1cmluZyB0aGUgYXJyYXlGb3JFYWNoIGN5Y2xlLCBjaGVja1xuICAgICAgICAgICAgICAgICAgICAvLyBmb3IgaXNEaXNwb3NlZCBvbiBlYWNoIHN1YnNjcmlwdGlvbiBiZWZvcmUgaW52b2tpbmcgaXRzIGNhbGxiYWNrXG4gICAgICAgICAgICAgICAgICAgIGlmICghc3Vic2NyaXB0aW9uLmlzRGlzcG9zZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb24uY2FsbGJhY2sodmFsdWVUb05vdGlmeSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICBrby5kZXBlbmRlbmN5RGV0ZWN0aW9uLmVuZCgpOyAvLyBFbmQgc3VwcHJlc3NpbmcgZGVwZW5kZW5jeSBkZXRlY3Rpb25cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBnZXRWZXJzaW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl92ZXJzaW9uTnVtYmVyO1xuICAgIH0sXG5cbiAgICBoYXNDaGFuZ2VkOiBmdW5jdGlvbiAodmVyc2lvblRvQ2hlY2spIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VmVyc2lvbigpICE9PSB2ZXJzaW9uVG9DaGVjaztcbiAgICB9LFxuXG4gICAgdXBkYXRlVmVyc2lvbjogZnVuY3Rpb24gKCkge1xuICAgICAgICArK3RoaXMuX3ZlcnNpb25OdW1iZXI7XG4gICAgfSxcblxuICAgIGxpbWl0OiBmdW5jdGlvbihsaW1pdEZ1bmN0aW9uKSB7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcywgc2VsZklzT2JzZXJ2YWJsZSA9IGtvLmlzT2JzZXJ2YWJsZShzZWxmKSxcbiAgICAgICAgICAgIGlnbm9yZUJlZm9yZUNoYW5nZSwgbm90aWZ5TmV4dENoYW5nZSwgcHJldmlvdXNWYWx1ZSwgcGVuZGluZ1ZhbHVlLCBiZWZvcmVDaGFuZ2UgPSAnYmVmb3JlQ2hhbmdlJztcblxuICAgICAgICBpZiAoIXNlbGYuX29yaWdOb3RpZnlTdWJzY3JpYmVycykge1xuICAgICAgICAgICAgc2VsZi5fb3JpZ05vdGlmeVN1YnNjcmliZXJzID0gc2VsZltcIm5vdGlmeVN1YnNjcmliZXJzXCJdO1xuICAgICAgICAgICAgc2VsZltcIm5vdGlmeVN1YnNjcmliZXJzXCJdID0gbGltaXROb3RpZnlTdWJzY3JpYmVycztcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBmaW5pc2ggPSBsaW1pdEZ1bmN0aW9uKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgc2VsZi5fbm90aWZpY2F0aW9uSXNQZW5kaW5nID0gZmFsc2U7XG5cbiAgICAgICAgICAgIC8vIElmIGFuIG9ic2VydmFibGUgcHJvdmlkZWQgYSByZWZlcmVuY2UgdG8gaXRzZWxmLCBhY2Nlc3MgaXQgdG8gZ2V0IHRoZSBsYXRlc3QgdmFsdWUuXG4gICAgICAgICAgICAvLyBUaGlzIGFsbG93cyBjb21wdXRlZCBvYnNlcnZhYmxlcyB0byBkZWxheSBjYWxjdWxhdGluZyB0aGVpciB2YWx1ZSB1bnRpbCBuZWVkZWQuXG4gICAgICAgICAgICBpZiAoc2VsZklzT2JzZXJ2YWJsZSAmJiBwZW5kaW5nVmFsdWUgPT09IHNlbGYpIHtcbiAgICAgICAgICAgICAgICBwZW5kaW5nVmFsdWUgPSBzZWxmLl9ldmFsSWZDaGFuZ2VkID8gc2VsZi5fZXZhbElmQ2hhbmdlZCgpIDogc2VsZigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHNob3VsZE5vdGlmeSA9IG5vdGlmeU5leHRDaGFuZ2UgfHwgc2VsZi5pc0RpZmZlcmVudChwcmV2aW91c1ZhbHVlLCBwZW5kaW5nVmFsdWUpO1xuXG4gICAgICAgICAgICBub3RpZnlOZXh0Q2hhbmdlID0gaWdub3JlQmVmb3JlQ2hhbmdlID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGlmIChzaG91bGROb3RpZnkpIHtcbiAgICAgICAgICAgICAgICBzZWxmLl9vcmlnTm90aWZ5U3Vic2NyaWJlcnMocHJldmlvdXNWYWx1ZSA9IHBlbmRpbmdWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHNlbGYuX2xpbWl0Q2hhbmdlID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICAgIHNlbGYuX2NoYW5nZVN1YnNjcmlwdGlvbnMgPSBzZWxmLl9zdWJzY3JpcHRpb25zW2RlZmF1bHRFdmVudF0uc2xpY2UoMCk7XG4gICAgICAgICAgICBzZWxmLl9ub3RpZmljYXRpb25Jc1BlbmRpbmcgPSBpZ25vcmVCZWZvcmVDaGFuZ2UgPSB0cnVlO1xuICAgICAgICAgICAgcGVuZGluZ1ZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgICBmaW5pc2goKTtcbiAgICAgICAgfTtcbiAgICAgICAgc2VsZi5fbGltaXRCZWZvcmVDaGFuZ2UgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKCFpZ25vcmVCZWZvcmVDaGFuZ2UpIHtcbiAgICAgICAgICAgICAgICBwcmV2aW91c1ZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgc2VsZi5fb3JpZ05vdGlmeVN1YnNjcmliZXJzKHZhbHVlLCBiZWZvcmVDaGFuZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBzZWxmLl9ub3RpZnlOZXh0Q2hhbmdlSWZWYWx1ZUlzRGlmZmVyZW50ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpZiAoc2VsZi5pc0RpZmZlcmVudChwcmV2aW91c1ZhbHVlLCBzZWxmLnBlZWsodHJ1ZSAvKmV2YWx1YXRlKi8pKSkge1xuICAgICAgICAgICAgICAgIG5vdGlmeU5leHRDaGFuZ2UgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH0sXG5cbiAgICBoYXNTdWJzY3JpcHRpb25zRm9yRXZlbnQ6IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdWJzY3JpcHRpb25zW2V2ZW50XSAmJiB0aGlzLl9zdWJzY3JpcHRpb25zW2V2ZW50XS5sZW5ndGg7XG4gICAgfSxcblxuICAgIGdldFN1YnNjcmlwdGlvbnNDb3VudDogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIGlmIChldmVudCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3N1YnNjcmlwdGlvbnNbZXZlbnRdICYmIHRoaXMuX3N1YnNjcmlwdGlvbnNbZXZlbnRdLmxlbmd0aCB8fCAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIHRvdGFsID0gMDtcbiAgICAgICAgICAgIGtvLnV0aWxzLm9iamVjdEZvckVhY2godGhpcy5fc3Vic2NyaXB0aW9ucywgZnVuY3Rpb24oZXZlbnROYW1lLCBzdWJzY3JpcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50TmFtZSAhPT0gJ2RpcnR5JylcbiAgICAgICAgICAgICAgICAgICAgdG90YWwgKz0gc3Vic2NyaXB0aW9ucy5sZW5ndGg7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiB0b3RhbDtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBpc0RpZmZlcmVudDogZnVuY3Rpb24ob2xkVmFsdWUsIG5ld1ZhbHVlKSB7XG4gICAgICAgIHJldHVybiAhdGhpc1snZXF1YWxpdHlDb21wYXJlciddIHx8ICF0aGlzWydlcXVhbGl0eUNvbXBhcmVyJ10ob2xkVmFsdWUsIG5ld1ZhbHVlKTtcbiAgICB9LFxuXG4gICAgZXh0ZW5kOiBhcHBseUV4dGVuZGVyc1xufTtcblxua28uZXhwb3J0UHJvcGVydHkoa29fc3Vic2NyaWJhYmxlX2ZuLCAnc3Vic2NyaWJlJywga29fc3Vic2NyaWJhYmxlX2ZuLnN1YnNjcmliZSk7XG5rby5leHBvcnRQcm9wZXJ0eShrb19zdWJzY3JpYmFibGVfZm4sICdleHRlbmQnLCBrb19zdWJzY3JpYmFibGVfZm4uZXh0ZW5kKTtcbmtvLmV4cG9ydFByb3BlcnR5KGtvX3N1YnNjcmliYWJsZV9mbiwgJ2dldFN1YnNjcmlwdGlvbnNDb3VudCcsIGtvX3N1YnNjcmliYWJsZV9mbi5nZXRTdWJzY3JpcHRpb25zQ291bnQpO1xuXG4vLyBGb3IgYnJvd3NlcnMgdGhhdCBzdXBwb3J0IHByb3RvIGFzc2lnbm1lbnQsIHdlIG92ZXJ3cml0ZSB0aGUgcHJvdG90eXBlIG9mIGVhY2hcbi8vIG9ic2VydmFibGUgaW5zdGFuY2UuIFNpbmNlIG9ic2VydmFibGVzIGFyZSBmdW5jdGlvbnMsIHdlIG5lZWQgRnVuY3Rpb24ucHJvdG90eXBlXG4vLyB0byBzdGlsbCBiZSBpbiB0aGUgcHJvdG90eXBlIGNoYWluLlxuaWYgKGtvLnV0aWxzLmNhblNldFByb3RvdHlwZSkge1xuICAgIGtvLnV0aWxzLnNldFByb3RvdHlwZU9mKGtvX3N1YnNjcmliYWJsZV9mbiwgRnVuY3Rpb24ucHJvdG90eXBlKTtcbn1cblxua28uc3Vic2NyaWJhYmxlWydmbiddID0ga29fc3Vic2NyaWJhYmxlX2ZuO1xuXG5cbmtvLmlzU3Vic2NyaWJhYmxlID0gZnVuY3Rpb24gKGluc3RhbmNlKSB7XG4gICAgcmV0dXJuIGluc3RhbmNlICE9IG51bGwgJiYgdHlwZW9mIGluc3RhbmNlLnN1YnNjcmliZSA9PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIGluc3RhbmNlW1wibm90aWZ5U3Vic2NyaWJlcnNcIl0gPT0gXCJmdW5jdGlvblwiO1xufTtcblxua28uZXhwb3J0U3ltYm9sKCdzdWJzY3JpYmFibGUnLCBrby5zdWJzY3JpYmFibGUpO1xua28uZXhwb3J0U3ltYm9sKCdpc1N1YnNjcmliYWJsZScsIGtvLmlzU3Vic2NyaWJhYmxlKTtcblxua28uY29tcHV0ZWRDb250ZXh0ID0ga28uZGVwZW5kZW5jeURldGVjdGlvbiA9IChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIG91dGVyRnJhbWVzID0gW10sXG4gICAgICAgIGN1cnJlbnRGcmFtZSxcbiAgICAgICAgbGFzdElkID0gMDtcblxuICAgIC8vIFJldHVybiBhIHVuaXF1ZSBJRCB0aGF0IGNhbiBiZSBhc3NpZ25lZCB0byBhbiBvYnNlcnZhYmxlIGZvciBkZXBlbmRlbmN5IHRyYWNraW5nLlxuICAgIC8vIFRoZW9yZXRpY2FsbHksIHlvdSBjb3VsZCBldmVudHVhbGx5IG92ZXJmbG93IHRoZSBudW1iZXIgc3RvcmFnZSBzaXplLCByZXN1bHRpbmdcbiAgICAvLyBpbiBkdXBsaWNhdGUgSURzLiBCdXQgaW4gSmF2YVNjcmlwdCwgdGhlIGxhcmdlc3QgZXhhY3QgaW50ZWdyYWwgdmFsdWUgaXMgMl41M1xuICAgIC8vIG9yIDksMDA3LDE5OSwyNTQsNzQwLDk5Mi4gSWYgeW91IGNyZWF0ZWQgMSwwMDAsMDAwIElEcyBwZXIgc2Vjb25kLCBpdCB3b3VsZFxuICAgIC8vIHRha2Ugb3ZlciAyODUgeWVhcnMgdG8gcmVhY2ggdGhhdCBudW1iZXIuXG4gICAgLy8gUmVmZXJlbmNlIGh0dHA6Ly9ibG9nLnZqZXV4LmNvbS8yMDEwL2phdmFzY3JpcHQvamF2YXNjcmlwdC1tYXhfaW50LW51bWJlci1saW1pdHMuaHRtbFxuICAgIGZ1bmN0aW9uIGdldElkKCkge1xuICAgICAgICByZXR1cm4gKytsYXN0SWQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYmVnaW4ob3B0aW9ucykge1xuICAgICAgICBvdXRlckZyYW1lcy5wdXNoKGN1cnJlbnRGcmFtZSk7XG4gICAgICAgIGN1cnJlbnRGcmFtZSA9IG9wdGlvbnM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZW5kKCkge1xuICAgICAgICBjdXJyZW50RnJhbWUgPSBvdXRlckZyYW1lcy5wb3AoKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBiZWdpbjogYmVnaW4sXG5cbiAgICAgICAgZW5kOiBlbmQsXG5cbiAgICAgICAgcmVnaXN0ZXJEZXBlbmRlbmN5OiBmdW5jdGlvbiAoc3Vic2NyaWJhYmxlKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudEZyYW1lKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFrby5pc1N1YnNjcmliYWJsZShzdWJzY3JpYmFibGUpKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJPbmx5IHN1YnNjcmliYWJsZSB0aGluZ3MgY2FuIGFjdCBhcyBkZXBlbmRlbmNpZXNcIik7XG4gICAgICAgICAgICAgICAgY3VycmVudEZyYW1lLmNhbGxiYWNrLmNhbGwoY3VycmVudEZyYW1lLmNhbGxiYWNrVGFyZ2V0LCBzdWJzY3JpYmFibGUsIHN1YnNjcmliYWJsZS5faWQgfHwgKHN1YnNjcmliYWJsZS5faWQgPSBnZXRJZCgpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgaWdub3JlOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGNhbGxiYWNrVGFyZ2V0LCBjYWxsYmFja0FyZ3MpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYmVnaW4oKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2suYXBwbHkoY2FsbGJhY2tUYXJnZXQsIGNhbGxiYWNrQXJncyB8fCBbXSk7XG4gICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIGVuZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIGdldERlcGVuZGVuY2llc0NvdW50OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudEZyYW1lKVxuICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50RnJhbWUuY29tcHV0ZWQuZ2V0RGVwZW5kZW5jaWVzQ291bnQoKTtcbiAgICAgICAgfSxcblxuICAgICAgICBpc0luaXRpYWw6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRGcmFtZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudEZyYW1lLmlzSW5pdGlhbDtcbiAgICAgICAgfVxuICAgIH07XG59KSgpO1xuXG5rby5leHBvcnRTeW1ib2woJ2NvbXB1dGVkQ29udGV4dCcsIGtvLmNvbXB1dGVkQ29udGV4dCk7XG5rby5leHBvcnRTeW1ib2woJ2NvbXB1dGVkQ29udGV4dC5nZXREZXBlbmRlbmNpZXNDb3VudCcsIGtvLmNvbXB1dGVkQ29udGV4dC5nZXREZXBlbmRlbmNpZXNDb3VudCk7XG5rby5leHBvcnRTeW1ib2woJ2NvbXB1dGVkQ29udGV4dC5pc0luaXRpYWwnLCBrby5jb21wdXRlZENvbnRleHQuaXNJbml0aWFsKTtcblxua28uZXhwb3J0U3ltYm9sKCdpZ25vcmVEZXBlbmRlbmNpZXMnLCBrby5pZ25vcmVEZXBlbmRlbmNpZXMgPSBrby5kZXBlbmRlbmN5RGV0ZWN0aW9uLmlnbm9yZSk7XG52YXIgb2JzZXJ2YWJsZUxhdGVzdFZhbHVlID0ga28udXRpbHMuY3JlYXRlU3ltYm9sT3JTdHJpbmcoJ19sYXRlc3RWYWx1ZScpO1xuXG5rby5vYnNlcnZhYmxlID0gZnVuY3Rpb24gKGluaXRpYWxWYWx1ZSkge1xuICAgIGZ1bmN0aW9uIG9ic2VydmFibGUoKSB7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy8gV3JpdGVcblxuICAgICAgICAgICAgLy8gSWdub3JlIHdyaXRlcyBpZiB0aGUgdmFsdWUgaGFzbid0IGNoYW5nZWRcbiAgICAgICAgICAgIGlmIChvYnNlcnZhYmxlLmlzRGlmZmVyZW50KG9ic2VydmFibGVbb2JzZXJ2YWJsZUxhdGVzdFZhbHVlXSwgYXJndW1lbnRzWzBdKSkge1xuICAgICAgICAgICAgICAgIG9ic2VydmFibGUudmFsdWVXaWxsTXV0YXRlKCk7XG4gICAgICAgICAgICAgICAgb2JzZXJ2YWJsZVtvYnNlcnZhYmxlTGF0ZXN0VmFsdWVdID0gYXJndW1lbnRzWzBdO1xuICAgICAgICAgICAgICAgIG9ic2VydmFibGUudmFsdWVIYXNNdXRhdGVkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpczsgLy8gUGVybWl0cyBjaGFpbmVkIGFzc2lnbm1lbnRzXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBSZWFkXG4gICAgICAgICAgICBrby5kZXBlbmRlbmN5RGV0ZWN0aW9uLnJlZ2lzdGVyRGVwZW5kZW5jeShvYnNlcnZhYmxlKTsgLy8gVGhlIGNhbGxlciBvbmx5IG5lZWRzIHRvIGJlIG5vdGlmaWVkIG9mIGNoYW5nZXMgaWYgdGhleSBkaWQgYSBcInJlYWRcIiBvcGVyYXRpb25cbiAgICAgICAgICAgIHJldHVybiBvYnNlcnZhYmxlW29ic2VydmFibGVMYXRlc3RWYWx1ZV07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvYnNlcnZhYmxlW29ic2VydmFibGVMYXRlc3RWYWx1ZV0gPSBpbml0aWFsVmFsdWU7XG5cbiAgICAvLyBJbmhlcml0IGZyb20gJ3N1YnNjcmliYWJsZSdcbiAgICBpZiAoIWtvLnV0aWxzLmNhblNldFByb3RvdHlwZSkge1xuICAgICAgICAvLyAnc3Vic2NyaWJhYmxlJyB3b24ndCBiZSBvbiB0aGUgcHJvdG90eXBlIGNoYWluIHVubGVzcyB3ZSBwdXQgaXQgdGhlcmUgZGlyZWN0bHlcbiAgICAgICAga28udXRpbHMuZXh0ZW5kKG9ic2VydmFibGUsIGtvLnN1YnNjcmliYWJsZVsnZm4nXSk7XG4gICAgfVxuICAgIGtvLnN1YnNjcmliYWJsZVsnZm4nXS5pbml0KG9ic2VydmFibGUpO1xuXG4gICAgLy8gSW5oZXJpdCBmcm9tICdvYnNlcnZhYmxlJ1xuICAgIGtvLnV0aWxzLnNldFByb3RvdHlwZU9mT3JFeHRlbmQob2JzZXJ2YWJsZSwgb2JzZXJ2YWJsZUZuKTtcblxuICAgIGlmIChrby5vcHRpb25zWydkZWZlclVwZGF0ZXMnXSkge1xuICAgICAgICBrby5leHRlbmRlcnNbJ2RlZmVycmVkJ10ob2JzZXJ2YWJsZSwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9ic2VydmFibGU7XG59XG5cbi8vIERlZmluZSBwcm90b3R5cGUgZm9yIG9ic2VydmFibGVzXG52YXIgb2JzZXJ2YWJsZUZuID0ge1xuICAgICdlcXVhbGl0eUNvbXBhcmVyJzogdmFsdWVzQXJlUHJpbWl0aXZlQW5kRXF1YWwsXG4gICAgcGVlazogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzW29ic2VydmFibGVMYXRlc3RWYWx1ZV07IH0sXG4gICAgdmFsdWVIYXNNdXRhdGVkOiBmdW5jdGlvbiAoKSB7IHRoaXNbJ25vdGlmeVN1YnNjcmliZXJzJ10odGhpc1tvYnNlcnZhYmxlTGF0ZXN0VmFsdWVdKTsgfSxcbiAgICB2YWx1ZVdpbGxNdXRhdGU6IGZ1bmN0aW9uICgpIHsgdGhpc1snbm90aWZ5U3Vic2NyaWJlcnMnXSh0aGlzW29ic2VydmFibGVMYXRlc3RWYWx1ZV0sICdiZWZvcmVDaGFuZ2UnKTsgfVxufTtcblxuLy8gTm90ZSB0aGF0IGZvciBicm93c2VycyB0aGF0IGRvbid0IHN1cHBvcnQgcHJvdG8gYXNzaWdubWVudCwgdGhlXG4vLyBpbmhlcml0YW5jZSBjaGFpbiBpcyBjcmVhdGVkIG1hbnVhbGx5IGluIHRoZSBrby5vYnNlcnZhYmxlIGNvbnN0cnVjdG9yXG5pZiAoa28udXRpbHMuY2FuU2V0UHJvdG90eXBlKSB7XG4gICAga28udXRpbHMuc2V0UHJvdG90eXBlT2Yob2JzZXJ2YWJsZUZuLCBrby5zdWJzY3JpYmFibGVbJ2ZuJ10pO1xufVxuXG52YXIgcHJvdG9Qcm9wZXJ0eSA9IGtvLm9ic2VydmFibGUucHJvdG9Qcm9wZXJ0eSA9ICdfX2tvX3Byb3RvX18nO1xub2JzZXJ2YWJsZUZuW3Byb3RvUHJvcGVydHldID0ga28ub2JzZXJ2YWJsZTtcblxua28uaGFzUHJvdG90eXBlID0gZnVuY3Rpb24oaW5zdGFuY2UsIHByb3RvdHlwZSkge1xuICAgIGlmICgoaW5zdGFuY2UgPT09IG51bGwpIHx8IChpbnN0YW5jZSA9PT0gdW5kZWZpbmVkKSB8fCAoaW5zdGFuY2VbcHJvdG9Qcm9wZXJ0eV0gPT09IHVuZGVmaW5lZCkpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoaW5zdGFuY2VbcHJvdG9Qcm9wZXJ0eV0gPT09IHByb3RvdHlwZSkgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIGtvLmhhc1Byb3RvdHlwZShpbnN0YW5jZVtwcm90b1Byb3BlcnR5XSwgcHJvdG90eXBlKTsgLy8gV2FsayB0aGUgcHJvdG90eXBlIGNoYWluXG59O1xuXG5rby5pc09ic2VydmFibGUgPSBmdW5jdGlvbiAoaW5zdGFuY2UpIHtcbiAgICByZXR1cm4ga28uaGFzUHJvdG90eXBlKGluc3RhbmNlLCBrby5vYnNlcnZhYmxlKTtcbn1cbmtvLmlzV3JpdGVhYmxlT2JzZXJ2YWJsZSA9IGZ1bmN0aW9uIChpbnN0YW5jZSkge1xuICAgIC8vIE9ic2VydmFibGVcbiAgICBpZiAoKHR5cGVvZiBpbnN0YW5jZSA9PSAnZnVuY3Rpb24nKSAmJiBpbnN0YW5jZVtwcm90b1Byb3BlcnR5XSA9PT0ga28ub2JzZXJ2YWJsZSlcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgLy8gV3JpdGVhYmxlIGRlcGVuZGVudCBvYnNlcnZhYmxlXG4gICAgaWYgKCh0eXBlb2YgaW5zdGFuY2UgPT0gJ2Z1bmN0aW9uJykgJiYgKGluc3RhbmNlW3Byb3RvUHJvcGVydHldID09PSBrby5kZXBlbmRlbnRPYnNlcnZhYmxlKSAmJiAoaW5zdGFuY2UuaGFzV3JpdGVGdW5jdGlvbikpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIC8vIEFueXRoaW5nIGVsc2VcbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmtvLmV4cG9ydFN5bWJvbCgnb2JzZXJ2YWJsZScsIGtvLm9ic2VydmFibGUpO1xua28uZXhwb3J0U3ltYm9sKCdpc09ic2VydmFibGUnLCBrby5pc09ic2VydmFibGUpO1xua28uZXhwb3J0U3ltYm9sKCdpc1dyaXRlYWJsZU9ic2VydmFibGUnLCBrby5pc1dyaXRlYWJsZU9ic2VydmFibGUpO1xua28uZXhwb3J0U3ltYm9sKCdpc1dyaXRhYmxlT2JzZXJ2YWJsZScsIGtvLmlzV3JpdGVhYmxlT2JzZXJ2YWJsZSk7XG5rby5leHBvcnRTeW1ib2woJ29ic2VydmFibGUuZm4nLCBvYnNlcnZhYmxlRm4pO1xua28uZXhwb3J0UHJvcGVydHkob2JzZXJ2YWJsZUZuLCAncGVlaycsIG9ic2VydmFibGVGbi5wZWVrKTtcbmtvLmV4cG9ydFByb3BlcnR5KG9ic2VydmFibGVGbiwgJ3ZhbHVlSGFzTXV0YXRlZCcsIG9ic2VydmFibGVGbi52YWx1ZUhhc011dGF0ZWQpO1xua28uZXhwb3J0UHJvcGVydHkob2JzZXJ2YWJsZUZuLCAndmFsdWVXaWxsTXV0YXRlJywgb2JzZXJ2YWJsZUZuLnZhbHVlV2lsbE11dGF0ZSk7XG5rby5vYnNlcnZhYmxlQXJyYXkgPSBmdW5jdGlvbiAoaW5pdGlhbFZhbHVlcykge1xuICAgIGluaXRpYWxWYWx1ZXMgPSBpbml0aWFsVmFsdWVzIHx8IFtdO1xuXG4gICAgaWYgKHR5cGVvZiBpbml0aWFsVmFsdWVzICE9ICdvYmplY3QnIHx8ICEoJ2xlbmd0aCcgaW4gaW5pdGlhbFZhbHVlcykpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBhcmd1bWVudCBwYXNzZWQgd2hlbiBpbml0aWFsaXppbmcgYW4gb2JzZXJ2YWJsZSBhcnJheSBtdXN0IGJlIGFuIGFycmF5LCBvciBudWxsLCBvciB1bmRlZmluZWQuXCIpO1xuXG4gICAgdmFyIHJlc3VsdCA9IGtvLm9ic2VydmFibGUoaW5pdGlhbFZhbHVlcyk7XG4gICAga28udXRpbHMuc2V0UHJvdG90eXBlT2ZPckV4dGVuZChyZXN1bHQsIGtvLm9ic2VydmFibGVBcnJheVsnZm4nXSk7XG4gICAgcmV0dXJuIHJlc3VsdC5leHRlbmQoeyd0cmFja0FycmF5Q2hhbmdlcyc6dHJ1ZX0pO1xufTtcblxua28ub2JzZXJ2YWJsZUFycmF5WydmbiddID0ge1xuICAgICdyZW1vdmUnOiBmdW5jdGlvbiAodmFsdWVPclByZWRpY2F0ZSkge1xuICAgICAgICB2YXIgdW5kZXJseWluZ0FycmF5ID0gdGhpcy5wZWVrKCk7XG4gICAgICAgIHZhciByZW1vdmVkVmFsdWVzID0gW107XG4gICAgICAgIHZhciBwcmVkaWNhdGUgPSB0eXBlb2YgdmFsdWVPclByZWRpY2F0ZSA9PSBcImZ1bmN0aW9uXCIgJiYgIWtvLmlzT2JzZXJ2YWJsZSh2YWx1ZU9yUHJlZGljYXRlKSA/IHZhbHVlT3JQcmVkaWNhdGUgOiBmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlID09PSB2YWx1ZU9yUHJlZGljYXRlOyB9O1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHVuZGVybHlpbmdBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIHZhbHVlID0gdW5kZXJseWluZ0FycmF5W2ldO1xuICAgICAgICAgICAgaWYgKHByZWRpY2F0ZSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAocmVtb3ZlZFZhbHVlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZVdpbGxNdXRhdGUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVtb3ZlZFZhbHVlcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgICAgICAgICB1bmRlcmx5aW5nQXJyYXkuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgIGktLTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocmVtb3ZlZFZhbHVlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWVIYXNNdXRhdGVkKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlbW92ZWRWYWx1ZXM7XG4gICAgfSxcblxuICAgICdyZW1vdmVBbGwnOiBmdW5jdGlvbiAoYXJyYXlPZlZhbHVlcykge1xuICAgICAgICAvLyBJZiB5b3UgcGFzc2VkIHplcm8gYXJncywgd2UgcmVtb3ZlIGV2ZXJ5dGhpbmdcbiAgICAgICAgaWYgKGFycmF5T2ZWYWx1ZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdmFyIHVuZGVybHlpbmdBcnJheSA9IHRoaXMucGVlaygpO1xuICAgICAgICAgICAgdmFyIGFsbFZhbHVlcyA9IHVuZGVybHlpbmdBcnJheS5zbGljZSgwKTtcbiAgICAgICAgICAgIHRoaXMudmFsdWVXaWxsTXV0YXRlKCk7XG4gICAgICAgICAgICB1bmRlcmx5aW5nQXJyYXkuc3BsaWNlKDAsIHVuZGVybHlpbmdBcnJheS5sZW5ndGgpO1xuICAgICAgICAgICAgdGhpcy52YWx1ZUhhc011dGF0ZWQoKTtcbiAgICAgICAgICAgIHJldHVybiBhbGxWYWx1ZXM7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgeW91IHBhc3NlZCBhbiBhcmcsIHdlIGludGVycHJldCBpdCBhcyBhbiBhcnJheSBvZiBlbnRyaWVzIHRvIHJlbW92ZVxuICAgICAgICBpZiAoIWFycmF5T2ZWYWx1ZXMpXG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIHJldHVybiB0aGlzWydyZW1vdmUnXShmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBrby51dGlscy5hcnJheUluZGV4T2YoYXJyYXlPZlZhbHVlcywgdmFsdWUpID49IDA7XG4gICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICAnZGVzdHJveSc6IGZ1bmN0aW9uICh2YWx1ZU9yUHJlZGljYXRlKSB7XG4gICAgICAgIHZhciB1bmRlcmx5aW5nQXJyYXkgPSB0aGlzLnBlZWsoKTtcbiAgICAgICAgdmFyIHByZWRpY2F0ZSA9IHR5cGVvZiB2YWx1ZU9yUHJlZGljYXRlID09IFwiZnVuY3Rpb25cIiAmJiAha28uaXNPYnNlcnZhYmxlKHZhbHVlT3JQcmVkaWNhdGUpID8gdmFsdWVPclByZWRpY2F0ZSA6IGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgPT09IHZhbHVlT3JQcmVkaWNhdGU7IH07XG4gICAgICAgIHRoaXMudmFsdWVXaWxsTXV0YXRlKCk7XG4gICAgICAgIGZvciAodmFyIGkgPSB1bmRlcmx5aW5nQXJyYXkubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IHVuZGVybHlpbmdBcnJheVtpXTtcbiAgICAgICAgICAgIGlmIChwcmVkaWNhdGUodmFsdWUpKVxuICAgICAgICAgICAgICAgIHVuZGVybHlpbmdBcnJheVtpXVtcIl9kZXN0cm95XCJdID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZhbHVlSGFzTXV0YXRlZCgpO1xuICAgIH0sXG5cbiAgICAnZGVzdHJveUFsbCc6IGZ1bmN0aW9uIChhcnJheU9mVmFsdWVzKSB7XG4gICAgICAgIC8vIElmIHlvdSBwYXNzZWQgemVybyBhcmdzLCB3ZSBkZXN0cm95IGV2ZXJ5dGhpbmdcbiAgICAgICAgaWYgKGFycmF5T2ZWYWx1ZXMgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJldHVybiB0aGlzWydkZXN0cm95J10oZnVuY3Rpb24oKSB7IHJldHVybiB0cnVlIH0pO1xuXG4gICAgICAgIC8vIElmIHlvdSBwYXNzZWQgYW4gYXJnLCB3ZSBpbnRlcnByZXQgaXQgYXMgYW4gYXJyYXkgb2YgZW50cmllcyB0byBkZXN0cm95XG4gICAgICAgIGlmICghYXJyYXlPZlZhbHVlcylcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgcmV0dXJuIHRoaXNbJ2Rlc3Ryb3knXShmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBrby51dGlscy5hcnJheUluZGV4T2YoYXJyYXlPZlZhbHVlcywgdmFsdWUpID49IDA7XG4gICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICAnaW5kZXhPZic6IGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgIHZhciB1bmRlcmx5aW5nQXJyYXkgPSB0aGlzKCk7XG4gICAgICAgIHJldHVybiBrby51dGlscy5hcnJheUluZGV4T2YodW5kZXJseWluZ0FycmF5LCBpdGVtKTtcbiAgICB9LFxuXG4gICAgJ3JlcGxhY2UnOiBmdW5jdGlvbihvbGRJdGVtLCBuZXdJdGVtKSB7XG4gICAgICAgIHZhciBpbmRleCA9IHRoaXNbJ2luZGV4T2YnXShvbGRJdGVtKTtcbiAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWVXaWxsTXV0YXRlKCk7XG4gICAgICAgICAgICB0aGlzLnBlZWsoKVtpbmRleF0gPSBuZXdJdGVtO1xuICAgICAgICAgICAgdGhpcy52YWx1ZUhhc011dGF0ZWQoKTtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbi8vIE5vdGUgdGhhdCBmb3IgYnJvd3NlcnMgdGhhdCBkb24ndCBzdXBwb3J0IHByb3RvIGFzc2lnbm1lbnQsIHRoZVxuLy8gaW5oZXJpdGFuY2UgY2hhaW4gaXMgY3JlYXRlZCBtYW51YWxseSBpbiB0aGUga28ub2JzZXJ2YWJsZUFycmF5IGNvbnN0cnVjdG9yXG5pZiAoa28udXRpbHMuY2FuU2V0UHJvdG90eXBlKSB7XG4gICAga28udXRpbHMuc2V0UHJvdG90eXBlT2Yoa28ub2JzZXJ2YWJsZUFycmF5WydmbiddLCBrby5vYnNlcnZhYmxlWydmbiddKTtcbn1cblxuLy8gUG9wdWxhdGUga28ub2JzZXJ2YWJsZUFycmF5LmZuIHdpdGggcmVhZC93cml0ZSBmdW5jdGlvbnMgZnJvbSBuYXRpdmUgYXJyYXlzXG4vLyBJbXBvcnRhbnQ6IERvIG5vdCBhZGQgYW55IGFkZGl0aW9uYWwgZnVuY3Rpb25zIGhlcmUgdGhhdCBtYXkgcmVhc29uYWJseSBiZSB1c2VkIHRvICpyZWFkKiBkYXRhIGZyb20gdGhlIGFycmF5XG4vLyBiZWNhdXNlIHdlJ2xsIGV2YWwgdGhlbSB3aXRob3V0IGNhdXNpbmcgc3Vic2NyaXB0aW9ucywgc28ga28uY29tcHV0ZWQgb3V0cHV0IGNvdWxkIGVuZCB1cCBnZXR0aW5nIHN0YWxlXG5rby51dGlscy5hcnJheUZvckVhY2goW1wicG9wXCIsIFwicHVzaFwiLCBcInJldmVyc2VcIiwgXCJzaGlmdFwiLCBcInNvcnRcIiwgXCJzcGxpY2VcIiwgXCJ1bnNoaWZ0XCJdLCBmdW5jdGlvbiAobWV0aG9kTmFtZSkge1xuICAgIGtvLm9ic2VydmFibGVBcnJheVsnZm4nXVttZXRob2ROYW1lXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gVXNlIFwicGVla1wiIHRvIGF2b2lkIGNyZWF0aW5nIGEgc3Vic2NyaXB0aW9uIGluIGFueSBjb21wdXRlZCB0aGF0IHdlJ3JlIGV4ZWN1dGluZyBpbiB0aGUgY29udGV4dCBvZlxuICAgICAgICAvLyAoZm9yIGNvbnNpc3RlbmN5IHdpdGggbXV0YXRpbmcgcmVndWxhciBvYnNlcnZhYmxlcylcbiAgICAgICAgdmFyIHVuZGVybHlpbmdBcnJheSA9IHRoaXMucGVlaygpO1xuICAgICAgICB0aGlzLnZhbHVlV2lsbE11dGF0ZSgpO1xuICAgICAgICB0aGlzLmNhY2hlRGlmZkZvcktub3duT3BlcmF0aW9uKHVuZGVybHlpbmdBcnJheSwgbWV0aG9kTmFtZSwgYXJndW1lbnRzKTtcbiAgICAgICAgdmFyIG1ldGhvZENhbGxSZXN1bHQgPSB1bmRlcmx5aW5nQXJyYXlbbWV0aG9kTmFtZV0uYXBwbHkodW5kZXJseWluZ0FycmF5LCBhcmd1bWVudHMpO1xuICAgICAgICB0aGlzLnZhbHVlSGFzTXV0YXRlZCgpO1xuICAgICAgICAvLyBUaGUgbmF0aXZlIHNvcnQgYW5kIHJldmVyc2UgbWV0aG9kcyByZXR1cm4gYSByZWZlcmVuY2UgdG8gdGhlIGFycmF5LCBidXQgaXQgbWFrZXMgbW9yZSBzZW5zZSB0byByZXR1cm4gdGhlIG9ic2VydmFibGUgYXJyYXkgaW5zdGVhZC5cbiAgICAgICAgcmV0dXJuIG1ldGhvZENhbGxSZXN1bHQgPT09IHVuZGVybHlpbmdBcnJheSA/IHRoaXMgOiBtZXRob2RDYWxsUmVzdWx0O1xuICAgIH07XG59KTtcblxuLy8gUG9wdWxhdGUga28ub2JzZXJ2YWJsZUFycmF5LmZuIHdpdGggcmVhZC1vbmx5IGZ1bmN0aW9ucyBmcm9tIG5hdGl2ZSBhcnJheXNcbmtvLnV0aWxzLmFycmF5Rm9yRWFjaChbXCJzbGljZVwiXSwgZnVuY3Rpb24gKG1ldGhvZE5hbWUpIHtcbiAgICBrby5vYnNlcnZhYmxlQXJyYXlbJ2ZuJ11bbWV0aG9kTmFtZV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB1bmRlcmx5aW5nQXJyYXkgPSB0aGlzKCk7XG4gICAgICAgIHJldHVybiB1bmRlcmx5aW5nQXJyYXlbbWV0aG9kTmFtZV0uYXBwbHkodW5kZXJseWluZ0FycmF5LCBhcmd1bWVudHMpO1xuICAgIH07XG59KTtcblxua28uZXhwb3J0U3ltYm9sKCdvYnNlcnZhYmxlQXJyYXknLCBrby5vYnNlcnZhYmxlQXJyYXkpO1xudmFyIGFycmF5Q2hhbmdlRXZlbnROYW1lID0gJ2FycmF5Q2hhbmdlJztcbmtvLmV4dGVuZGVyc1sndHJhY2tBcnJheUNoYW5nZXMnXSA9IGZ1bmN0aW9uKHRhcmdldCwgb3B0aW9ucykge1xuICAgIC8vIFVzZSB0aGUgcHJvdmlkZWQgb3B0aW9ucy0tZWFjaCBjYWxsIHRvIHRyYWNrQXJyYXlDaGFuZ2VzIG92ZXJ3cml0ZXMgdGhlIHByZXZpb3VzbHkgc2V0IG9wdGlvbnNcbiAgICB0YXJnZXQuY29tcGFyZUFycmF5T3B0aW9ucyA9IHt9O1xuICAgIGlmIChvcHRpb25zICYmIHR5cGVvZiBvcHRpb25zID09IFwib2JqZWN0XCIpIHtcbiAgICAgICAga28udXRpbHMuZXh0ZW5kKHRhcmdldC5jb21wYXJlQXJyYXlPcHRpb25zLCBvcHRpb25zKTtcbiAgICB9XG4gICAgdGFyZ2V0LmNvbXBhcmVBcnJheU9wdGlvbnNbJ3NwYXJzZSddID0gdHJ1ZTtcblxuICAgIC8vIE9ubHkgbW9kaWZ5IHRoZSB0YXJnZXQgb2JzZXJ2YWJsZSBvbmNlXG4gICAgaWYgKHRhcmdldC5jYWNoZURpZmZGb3JLbm93bk9wZXJhdGlvbikge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciB0cmFja2luZ0NoYW5nZXMgPSBmYWxzZSxcbiAgICAgICAgY2FjaGVkRGlmZiA9IG51bGwsXG4gICAgICAgIGFycmF5Q2hhbmdlU3Vic2NyaXB0aW9uLFxuICAgICAgICBwZW5kaW5nTm90aWZpY2F0aW9ucyA9IDAsXG4gICAgICAgIHVuZGVybHlpbmdOb3RpZnlTdWJzY3JpYmVyc0Z1bmN0aW9uLFxuICAgICAgICB1bmRlcmx5aW5nQmVmb3JlU3Vic2NyaXB0aW9uQWRkRnVuY3Rpb24gPSB0YXJnZXQuYmVmb3JlU3Vic2NyaXB0aW9uQWRkLFxuICAgICAgICB1bmRlcmx5aW5nQWZ0ZXJTdWJzY3JpcHRpb25SZW1vdmVGdW5jdGlvbiA9IHRhcmdldC5hZnRlclN1YnNjcmlwdGlvblJlbW92ZTtcblxuICAgIC8vIFdhdGNoIFwic3Vic2NyaWJlXCIgY2FsbHMsIGFuZCBmb3IgYXJyYXkgY2hhbmdlIGV2ZW50cywgZW5zdXJlIGNoYW5nZSB0cmFja2luZyBpcyBlbmFibGVkXG4gICAgdGFyZ2V0LmJlZm9yZVN1YnNjcmlwdGlvbkFkZCA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICBpZiAodW5kZXJseWluZ0JlZm9yZVN1YnNjcmlwdGlvbkFkZEZ1bmN0aW9uKVxuICAgICAgICAgICAgdW5kZXJseWluZ0JlZm9yZVN1YnNjcmlwdGlvbkFkZEZ1bmN0aW9uLmNhbGwodGFyZ2V0LCBldmVudCk7XG4gICAgICAgIGlmIChldmVudCA9PT0gYXJyYXlDaGFuZ2VFdmVudE5hbWUpIHtcbiAgICAgICAgICAgIHRyYWNrQ2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvLyBXYXRjaCBcImRpc3Bvc2VcIiBjYWxscywgYW5kIGZvciBhcnJheSBjaGFuZ2UgZXZlbnRzLCBlbnN1cmUgY2hhbmdlIHRyYWNraW5nIGlzIGRpc2FibGVkIHdoZW4gYWxsIGFyZSBkaXNwb3NlZFxuICAgIHRhcmdldC5hZnRlclN1YnNjcmlwdGlvblJlbW92ZSA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICBpZiAodW5kZXJseWluZ0FmdGVyU3Vic2NyaXB0aW9uUmVtb3ZlRnVuY3Rpb24pXG4gICAgICAgICAgICB1bmRlcmx5aW5nQWZ0ZXJTdWJzY3JpcHRpb25SZW1vdmVGdW5jdGlvbi5jYWxsKHRhcmdldCwgZXZlbnQpO1xuICAgICAgICBpZiAoZXZlbnQgPT09IGFycmF5Q2hhbmdlRXZlbnROYW1lICYmICF0YXJnZXQuaGFzU3Vic2NyaXB0aW9uc0ZvckV2ZW50KGFycmF5Q2hhbmdlRXZlbnROYW1lKSkge1xuICAgICAgICAgICAgaWYgKHVuZGVybHlpbmdOb3RpZnlTdWJzY3JpYmVyc0Z1bmN0aW9uKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0Wydub3RpZnlTdWJzY3JpYmVycyddID0gdW5kZXJseWluZ05vdGlmeVN1YnNjcmliZXJzRnVuY3Rpb247XG4gICAgICAgICAgICAgICAgdW5kZXJseWluZ05vdGlmeVN1YnNjcmliZXJzRnVuY3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhcnJheUNoYW5nZVN1YnNjcmlwdGlvbi5kaXNwb3NlKCk7XG4gICAgICAgICAgICB0cmFja2luZ0NoYW5nZXMgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBmdW5jdGlvbiB0cmFja0NoYW5nZXMoKSB7XG4gICAgICAgIC8vIENhbGxpbmcgJ3RyYWNrQ2hhbmdlcycgbXVsdGlwbGUgdGltZXMgaXMgdGhlIHNhbWUgYXMgY2FsbGluZyBpdCBvbmNlXG4gICAgICAgIGlmICh0cmFja2luZ0NoYW5nZXMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyYWNraW5nQ2hhbmdlcyA9IHRydWU7XG5cbiAgICAgICAgLy8gSW50ZXJjZXB0IFwibm90aWZ5U3Vic2NyaWJlcnNcIiB0byB0cmFjayBob3cgbWFueSB0aW1lcyBpdCB3YXMgY2FsbGVkLlxuICAgICAgICB1bmRlcmx5aW5nTm90aWZ5U3Vic2NyaWJlcnNGdW5jdGlvbiA9IHRhcmdldFsnbm90aWZ5U3Vic2NyaWJlcnMnXTtcbiAgICAgICAgdGFyZ2V0Wydub3RpZnlTdWJzY3JpYmVycyddID0gZnVuY3Rpb24odmFsdWVUb05vdGlmeSwgZXZlbnQpIHtcbiAgICAgICAgICAgIGlmICghZXZlbnQgfHwgZXZlbnQgPT09IGRlZmF1bHRFdmVudCkge1xuICAgICAgICAgICAgICAgICsrcGVuZGluZ05vdGlmaWNhdGlvbnM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdW5kZXJseWluZ05vdGlmeVN1YnNjcmliZXJzRnVuY3Rpb24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBFYWNoIHRpbWUgdGhlIGFycmF5IGNoYW5nZXMgdmFsdWUsIGNhcHR1cmUgYSBjbG9uZSBzbyB0aGF0IG9uIHRoZSBuZXh0XG4gICAgICAgIC8vIGNoYW5nZSBpdCdzIHBvc3NpYmxlIHRvIHByb2R1Y2UgYSBkaWZmXG4gICAgICAgIHZhciBwcmV2aW91c0NvbnRlbnRzID0gW10uY29uY2F0KHRhcmdldC5wZWVrKCkgfHwgW10pO1xuICAgICAgICBjYWNoZWREaWZmID0gbnVsbDtcbiAgICAgICAgYXJyYXlDaGFuZ2VTdWJzY3JpcHRpb24gPSB0YXJnZXQuc3Vic2NyaWJlKGZ1bmN0aW9uKGN1cnJlbnRDb250ZW50cykge1xuICAgICAgICAgICAgLy8gTWFrZSBhIGNvcHkgb2YgdGhlIGN1cnJlbnQgY29udGVudHMgYW5kIGVuc3VyZSBpdCdzIGFuIGFycmF5XG4gICAgICAgICAgICBjdXJyZW50Q29udGVudHMgPSBbXS5jb25jYXQoY3VycmVudENvbnRlbnRzIHx8IFtdKTtcblxuICAgICAgICAgICAgLy8gQ29tcHV0ZSB0aGUgZGlmZiBhbmQgaXNzdWUgbm90aWZpY2F0aW9ucywgYnV0IG9ubHkgaWYgc29tZW9uZSBpcyBsaXN0ZW5pbmdcbiAgICAgICAgICAgIGlmICh0YXJnZXQuaGFzU3Vic2NyaXB0aW9uc0ZvckV2ZW50KGFycmF5Q2hhbmdlRXZlbnROYW1lKSkge1xuICAgICAgICAgICAgICAgIHZhciBjaGFuZ2VzID0gZ2V0Q2hhbmdlcyhwcmV2aW91c0NvbnRlbnRzLCBjdXJyZW50Q29udGVudHMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBFbGltaW5hdGUgcmVmZXJlbmNlcyB0byB0aGUgb2xkLCByZW1vdmVkIGl0ZW1zLCBzbyB0aGV5IGNhbiBiZSBHQ2VkXG4gICAgICAgICAgICBwcmV2aW91c0NvbnRlbnRzID0gY3VycmVudENvbnRlbnRzO1xuICAgICAgICAgICAgY2FjaGVkRGlmZiA9IG51bGw7XG4gICAgICAgICAgICBwZW5kaW5nTm90aWZpY2F0aW9ucyA9IDA7XG5cbiAgICAgICAgICAgIGlmIChjaGFuZ2VzICYmIGNoYW5nZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0Wydub3RpZnlTdWJzY3JpYmVycyddKGNoYW5nZXMsIGFycmF5Q2hhbmdlRXZlbnROYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0Q2hhbmdlcyhwcmV2aW91c0NvbnRlbnRzLCBjdXJyZW50Q29udGVudHMpIHtcbiAgICAgICAgLy8gV2UgdHJ5IHRvIHJlLXVzZSBjYWNoZWQgZGlmZnMuXG4gICAgICAgIC8vIFRoZSBzY2VuYXJpb3Mgd2hlcmUgcGVuZGluZ05vdGlmaWNhdGlvbnMgPiAxIGFyZSB3aGVuIHVzaW5nIHJhdGUtbGltaXRpbmcgb3IgdGhlIERlZmVycmVkIFVwZGF0ZXNcbiAgICAgICAgLy8gcGx1Z2luLCB3aGljaCB3aXRob3V0IHRoaXMgY2hlY2sgd291bGQgbm90IGJlIGNvbXBhdGlibGUgd2l0aCBhcnJheUNoYW5nZSBub3RpZmljYXRpb25zLiBOb3JtYWxseSxcbiAgICAgICAgLy8gbm90aWZpY2F0aW9ucyBhcmUgaXNzdWVkIGltbWVkaWF0ZWx5IHNvIHdlIHdvdWxkbid0IGJlIHF1ZXVlaW5nIHVwIG1vcmUgdGhhbiBvbmUuXG4gICAgICAgIGlmICghY2FjaGVkRGlmZiB8fCBwZW5kaW5nTm90aWZpY2F0aW9ucyA+IDEpIHtcbiAgICAgICAgICAgIGNhY2hlZERpZmYgPSBrby51dGlscy5jb21wYXJlQXJyYXlzKHByZXZpb3VzQ29udGVudHMsIGN1cnJlbnRDb250ZW50cywgdGFyZ2V0LmNvbXBhcmVBcnJheU9wdGlvbnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNhY2hlZERpZmY7XG4gICAgfVxuXG4gICAgdGFyZ2V0LmNhY2hlRGlmZkZvcktub3duT3BlcmF0aW9uID0gZnVuY3Rpb24ocmF3QXJyYXksIG9wZXJhdGlvbk5hbWUsIGFyZ3MpIHtcbiAgICAgICAgLy8gT25seSBydW4gaWYgd2UncmUgY3VycmVudGx5IHRyYWNraW5nIGNoYW5nZXMgZm9yIHRoaXMgb2JzZXJ2YWJsZSBhcnJheVxuICAgICAgICAvLyBhbmQgdGhlcmUgYXJlbid0IGFueSBwZW5kaW5nIGRlZmVycmVkIG5vdGlmaWNhdGlvbnMuXG4gICAgICAgIGlmICghdHJhY2tpbmdDaGFuZ2VzIHx8IHBlbmRpbmdOb3RpZmljYXRpb25zKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGRpZmYgPSBbXSxcbiAgICAgICAgICAgIGFycmF5TGVuZ3RoID0gcmF3QXJyYXkubGVuZ3RoLFxuICAgICAgICAgICAgYXJnc0xlbmd0aCA9IGFyZ3MubGVuZ3RoLFxuICAgICAgICAgICAgb2Zmc2V0ID0gMDtcblxuICAgICAgICBmdW5jdGlvbiBwdXNoRGlmZihzdGF0dXMsIHZhbHVlLCBpbmRleCkge1xuICAgICAgICAgICAgcmV0dXJuIGRpZmZbZGlmZi5sZW5ndGhdID0geyAnc3RhdHVzJzogc3RhdHVzLCAndmFsdWUnOiB2YWx1ZSwgJ2luZGV4JzogaW5kZXggfTtcbiAgICAgICAgfVxuICAgICAgICBzd2l0Y2ggKG9wZXJhdGlvbk5hbWUpIHtcbiAgICAgICAgICAgIGNhc2UgJ3B1c2gnOlxuICAgICAgICAgICAgICAgIG9mZnNldCA9IGFycmF5TGVuZ3RoO1xuICAgICAgICAgICAgY2FzZSAndW5zaGlmdCc6XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IGFyZ3NMZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgcHVzaERpZmYoJ2FkZGVkJywgYXJnc1tpbmRleF0sIG9mZnNldCArIGluZGV4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgJ3BvcCc6XG4gICAgICAgICAgICAgICAgb2Zmc2V0ID0gYXJyYXlMZW5ndGggLSAxO1xuICAgICAgICAgICAgY2FzZSAnc2hpZnQnOlxuICAgICAgICAgICAgICAgIGlmIChhcnJheUxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBwdXNoRGlmZignZGVsZXRlZCcsIHJhd0FycmF5W29mZnNldF0sIG9mZnNldCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlICdzcGxpY2UnOlxuICAgICAgICAgICAgICAgIC8vIE5lZ2F0aXZlIHN0YXJ0IGluZGV4IG1lYW5zICdmcm9tIGVuZCBvZiBhcnJheScuIEFmdGVyIHRoYXQgd2UgY2xhbXAgdG8gWzAuLi5hcnJheUxlbmd0aF0uXG4gICAgICAgICAgICAgICAgLy8gU2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L3NwbGljZVxuICAgICAgICAgICAgICAgIHZhciBzdGFydEluZGV4ID0gTWF0aC5taW4oTWF0aC5tYXgoMCwgYXJnc1swXSA8IDAgPyBhcnJheUxlbmd0aCArIGFyZ3NbMF0gOiBhcmdzWzBdKSwgYXJyYXlMZW5ndGgpLFxuICAgICAgICAgICAgICAgICAgICBlbmREZWxldGVJbmRleCA9IGFyZ3NMZW5ndGggPT09IDEgPyBhcnJheUxlbmd0aCA6IE1hdGgubWluKHN0YXJ0SW5kZXggKyAoYXJnc1sxXSB8fCAwKSwgYXJyYXlMZW5ndGgpLFxuICAgICAgICAgICAgICAgICAgICBlbmRBZGRJbmRleCA9IHN0YXJ0SW5kZXggKyBhcmdzTGVuZ3RoIC0gMixcbiAgICAgICAgICAgICAgICAgICAgZW5kSW5kZXggPSBNYXRoLm1heChlbmREZWxldGVJbmRleCwgZW5kQWRkSW5kZXgpLFxuICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbnMgPSBbXSwgZGVsZXRpb25zID0gW107XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaW5kZXggPSBzdGFydEluZGV4LCBhcmdzSW5kZXggPSAyOyBpbmRleCA8IGVuZEluZGV4OyArK2luZGV4LCArK2FyZ3NJbmRleCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCBlbmREZWxldGVJbmRleClcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0aW9ucy5wdXNoKHB1c2hEaWZmKCdkZWxldGVkJywgcmF3QXJyYXlbaW5kZXhdLCBpbmRleCkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCBlbmRBZGRJbmRleClcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZGl0aW9ucy5wdXNoKHB1c2hEaWZmKCdhZGRlZCcsIGFyZ3NbYXJnc0luZGV4XSwgaW5kZXgpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAga28udXRpbHMuZmluZE1vdmVzSW5BcnJheUNvbXBhcmlzb24oZGVsZXRpb25zLCBhZGRpdGlvbnMpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjYWNoZWREaWZmID0gZGlmZjtcbiAgICB9O1xufTtcbnZhciBjb21wdXRlZFN0YXRlID0ga28udXRpbHMuY3JlYXRlU3ltYm9sT3JTdHJpbmcoJ19zdGF0ZScpO1xuXG5rby5jb21wdXRlZCA9IGtvLmRlcGVuZGVudE9ic2VydmFibGUgPSBmdW5jdGlvbiAoZXZhbHVhdG9yRnVuY3Rpb25Pck9wdGlvbnMsIGV2YWx1YXRvckZ1bmN0aW9uVGFyZ2V0LCBvcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiBldmFsdWF0b3JGdW5jdGlvbk9yT3B0aW9ucyA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAvLyBTaW5nbGUtcGFyYW1ldGVyIHN5bnRheCAtIGV2ZXJ5dGhpbmcgaXMgb24gdGhpcyBcIm9wdGlvbnNcIiBwYXJhbVxuICAgICAgICBvcHRpb25zID0gZXZhbHVhdG9yRnVuY3Rpb25Pck9wdGlvbnM7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gTXVsdGktcGFyYW1ldGVyIHN5bnRheCAtIGNvbnN0cnVjdCB0aGUgb3B0aW9ucyBhY2NvcmRpbmcgdG8gdGhlIHBhcmFtcyBwYXNzZWRcbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICAgIGlmIChldmFsdWF0b3JGdW5jdGlvbk9yT3B0aW9ucykge1xuICAgICAgICAgICAgb3B0aW9uc1tcInJlYWRcIl0gPSBldmFsdWF0b3JGdW5jdGlvbk9yT3B0aW9ucztcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAodHlwZW9mIG9wdGlvbnNbXCJyZWFkXCJdICE9IFwiZnVuY3Rpb25cIilcbiAgICAgICAgdGhyb3cgRXJyb3IoXCJQYXNzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUga28uY29tcHV0ZWRcIik7XG5cbiAgICB2YXIgd3JpdGVGdW5jdGlvbiA9IG9wdGlvbnNbXCJ3cml0ZVwiXTtcbiAgICB2YXIgc3RhdGUgPSB7XG4gICAgICAgIGxhdGVzdFZhbHVlOiB1bmRlZmluZWQsXG4gICAgICAgIGlzU3RhbGU6IHRydWUsXG4gICAgICAgIGlzRGlydHk6IHRydWUsXG4gICAgICAgIGlzQmVpbmdFdmFsdWF0ZWQ6IGZhbHNlLFxuICAgICAgICBzdXBwcmVzc0Rpc3Bvc2FsVW50aWxEaXNwb3NlV2hlblJldHVybnNGYWxzZTogZmFsc2UsXG4gICAgICAgIGlzRGlzcG9zZWQ6IGZhbHNlLFxuICAgICAgICBwdXJlOiBmYWxzZSxcbiAgICAgICAgaXNTbGVlcGluZzogZmFsc2UsXG4gICAgICAgIHJlYWRGdW5jdGlvbjogb3B0aW9uc1tcInJlYWRcIl0sXG4gICAgICAgIGV2YWx1YXRvckZ1bmN0aW9uVGFyZ2V0OiBldmFsdWF0b3JGdW5jdGlvblRhcmdldCB8fCBvcHRpb25zW1wib3duZXJcIl0sXG4gICAgICAgIGRpc3Bvc2VXaGVuTm9kZUlzUmVtb3ZlZDogb3B0aW9uc1tcImRpc3Bvc2VXaGVuTm9kZUlzUmVtb3ZlZFwiXSB8fCBvcHRpb25zLmRpc3Bvc2VXaGVuTm9kZUlzUmVtb3ZlZCB8fCBudWxsLFxuICAgICAgICBkaXNwb3NlV2hlbjogb3B0aW9uc1tcImRpc3Bvc2VXaGVuXCJdIHx8IG9wdGlvbnMuZGlzcG9zZVdoZW4sXG4gICAgICAgIGRvbU5vZGVEaXNwb3NhbENhbGxiYWNrOiBudWxsLFxuICAgICAgICBkZXBlbmRlbmN5VHJhY2tpbmc6IHt9LFxuICAgICAgICBkZXBlbmRlbmNpZXNDb3VudDogMCxcbiAgICAgICAgZXZhbHVhdGlvblRpbWVvdXRJbnN0YW5jZTogbnVsbFxuICAgIH07XG5cbiAgICBmdW5jdGlvbiBjb21wdXRlZE9ic2VydmFibGUoKSB7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB3cml0ZUZ1bmN0aW9uID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICAvLyBXcml0aW5nIGEgdmFsdWVcbiAgICAgICAgICAgICAgICB3cml0ZUZ1bmN0aW9uLmFwcGx5KHN0YXRlLmV2YWx1YXRvckZ1bmN0aW9uVGFyZ2V0LCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3Qgd3JpdGUgYSB2YWx1ZSB0byBhIGtvLmNvbXB1dGVkIHVubGVzcyB5b3Ugc3BlY2lmeSBhICd3cml0ZScgb3B0aW9uLiBJZiB5b3Ugd2lzaCB0byByZWFkIHRoZSBjdXJyZW50IHZhbHVlLCBkb24ndCBwYXNzIGFueSBwYXJhbWV0ZXJzLlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzOyAvLyBQZXJtaXRzIGNoYWluZWQgYXNzaWdubWVudHNcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFJlYWRpbmcgdGhlIHZhbHVlXG4gICAgICAgICAgICBrby5kZXBlbmRlbmN5RGV0ZWN0aW9uLnJlZ2lzdGVyRGVwZW5kZW5jeShjb21wdXRlZE9ic2VydmFibGUpO1xuICAgICAgICAgICAgaWYgKHN0YXRlLmlzRGlydHkgfHwgKHN0YXRlLmlzU2xlZXBpbmcgJiYgY29tcHV0ZWRPYnNlcnZhYmxlLmhhdmVEZXBlbmRlbmNpZXNDaGFuZ2VkKCkpKSB7XG4gICAgICAgICAgICAgICAgY29tcHV0ZWRPYnNlcnZhYmxlLmV2YWx1YXRlSW1tZWRpYXRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gc3RhdGUubGF0ZXN0VmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb21wdXRlZE9ic2VydmFibGVbY29tcHV0ZWRTdGF0ZV0gPSBzdGF0ZTtcbiAgICBjb21wdXRlZE9ic2VydmFibGUuaGFzV3JpdGVGdW5jdGlvbiA9IHR5cGVvZiB3cml0ZUZ1bmN0aW9uID09PSBcImZ1bmN0aW9uXCI7XG5cbiAgICAvLyBJbmhlcml0IGZyb20gJ3N1YnNjcmliYWJsZSdcbiAgICBpZiAoIWtvLnV0aWxzLmNhblNldFByb3RvdHlwZSkge1xuICAgICAgICAvLyAnc3Vic2NyaWJhYmxlJyB3b24ndCBiZSBvbiB0aGUgcHJvdG90eXBlIGNoYWluIHVubGVzcyB3ZSBwdXQgaXQgdGhlcmUgZGlyZWN0bHlcbiAgICAgICAga28udXRpbHMuZXh0ZW5kKGNvbXB1dGVkT2JzZXJ2YWJsZSwga28uc3Vic2NyaWJhYmxlWydmbiddKTtcbiAgICB9XG4gICAga28uc3Vic2NyaWJhYmxlWydmbiddLmluaXQoY29tcHV0ZWRPYnNlcnZhYmxlKTtcblxuICAgIC8vIEluaGVyaXQgZnJvbSAnY29tcHV0ZWQnXG4gICAga28udXRpbHMuc2V0UHJvdG90eXBlT2ZPckV4dGVuZChjb21wdXRlZE9ic2VydmFibGUsIGNvbXB1dGVkRm4pO1xuXG4gICAgaWYgKG9wdGlvbnNbJ3B1cmUnXSkge1xuICAgICAgICBzdGF0ZS5wdXJlID0gdHJ1ZTtcbiAgICAgICAgc3RhdGUuaXNTbGVlcGluZyA9IHRydWU7ICAgICAvLyBTdGFydHMgb2ZmIHNsZWVwaW5nOyB3aWxsIGF3YWtlIG9uIHRoZSBmaXJzdCBzdWJzY3JpcHRpb25cbiAgICAgICAga28udXRpbHMuZXh0ZW5kKGNvbXB1dGVkT2JzZXJ2YWJsZSwgcHVyZUNvbXB1dGVkT3ZlcnJpZGVzKTtcbiAgICB9IGVsc2UgaWYgKG9wdGlvbnNbJ2RlZmVyRXZhbHVhdGlvbiddKSB7XG4gICAgICAgIGtvLnV0aWxzLmV4dGVuZChjb21wdXRlZE9ic2VydmFibGUsIGRlZmVyRXZhbHVhdGlvbk92ZXJyaWRlcyk7XG4gICAgfVxuXG4gICAgaWYgKGtvLm9wdGlvbnNbJ2RlZmVyVXBkYXRlcyddKSB7XG4gICAgICAgIGtvLmV4dGVuZGVyc1snZGVmZXJyZWQnXShjb21wdXRlZE9ic2VydmFibGUsIHRydWUpO1xuICAgIH1cblxuICAgIGlmIChERUJVRykge1xuICAgICAgICAvLyAjMTczMSAtIEFpZCBkZWJ1Z2dpbmcgYnkgZXhwb3NpbmcgdGhlIGNvbXB1dGVkJ3Mgb3B0aW9uc1xuICAgICAgICBjb21wdXRlZE9ic2VydmFibGVbXCJfb3B0aW9uc1wiXSA9IG9wdGlvbnM7XG4gICAgfVxuXG4gICAgaWYgKHN0YXRlLmRpc3Bvc2VXaGVuTm9kZUlzUmVtb3ZlZCkge1xuICAgICAgICAvLyBTaW5jZSB0aGlzIGNvbXB1dGVkIGlzIGFzc29jaWF0ZWQgd2l0aCBhIERPTSBub2RlLCBhbmQgd2UgZG9uJ3Qgd2FudCB0byBkaXNwb3NlIHRoZSBjb21wdXRlZFxuICAgICAgICAvLyB1bnRpbCB0aGUgRE9NIG5vZGUgaXMgKnJlbW92ZWQqIGZyb20gdGhlIGRvY3VtZW50IChhcyBvcHBvc2VkIHRvIG5ldmVyIGhhdmluZyBiZWVuIGluIHRoZSBkb2N1bWVudCksXG4gICAgICAgIC8vIHdlJ2xsIHByZXZlbnQgZGlzcG9zYWwgdW50aWwgXCJkaXNwb3NlV2hlblwiIGZpcnN0IHJldHVybnMgZmFsc2UuXG4gICAgICAgIHN0YXRlLnN1cHByZXNzRGlzcG9zYWxVbnRpbERpc3Bvc2VXaGVuUmV0dXJuc0ZhbHNlID0gdHJ1ZTtcblxuICAgICAgICAvLyBkaXNwb3NlV2hlbk5vZGVJc1JlbW92ZWQ6IHRydWUgY2FuIGJlIHVzZWQgdG8gb3B0IGludG8gdGhlIFwib25seSBkaXNwb3NlIGFmdGVyIGZpcnN0IGZhbHNlIHJlc3VsdFwiXG4gICAgICAgIC8vIGJlaGF2aW91ciBldmVuIGlmIHRoZXJlJ3Mgbm8gc3BlY2lmaWMgbm9kZSB0byB3YXRjaC4gSW4gdGhhdCBjYXNlLCBjbGVhciB0aGUgb3B0aW9uIHNvIHdlIGRvbid0IHRyeVxuICAgICAgICAvLyB0byB3YXRjaCBmb3IgYSBub24tbm9kZSdzIGRpc3Bvc2FsLiBUaGlzIHRlY2huaXF1ZSBpcyBpbnRlbmRlZCBmb3IgS08ncyBpbnRlcm5hbCB1c2Ugb25seSBhbmQgc2hvdWxkbid0XG4gICAgICAgIC8vIGJlIGRvY3VtZW50ZWQgb3IgdXNlZCBieSBhcHBsaWNhdGlvbiBjb2RlLCBhcyBpdCdzIGxpa2VseSB0byBjaGFuZ2UgaW4gYSBmdXR1cmUgdmVyc2lvbiBvZiBLTy5cbiAgICAgICAgaWYgKCFzdGF0ZS5kaXNwb3NlV2hlbk5vZGVJc1JlbW92ZWQubm9kZVR5cGUpIHtcbiAgICAgICAgICAgIHN0YXRlLmRpc3Bvc2VXaGVuTm9kZUlzUmVtb3ZlZCA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBFdmFsdWF0ZSwgdW5sZXNzIHNsZWVwaW5nIG9yIGRlZmVyRXZhbHVhdGlvbiBpcyB0cnVlXG4gICAgaWYgKCFzdGF0ZS5pc1NsZWVwaW5nICYmICFvcHRpb25zWydkZWZlckV2YWx1YXRpb24nXSkge1xuICAgICAgICBjb21wdXRlZE9ic2VydmFibGUuZXZhbHVhdGVJbW1lZGlhdGUoKTtcbiAgICB9XG5cbiAgICAvLyBBdHRhY2ggYSBET00gbm9kZSBkaXNwb3NhbCBjYWxsYmFjayBzbyB0aGF0IHRoZSBjb21wdXRlZCB3aWxsIGJlIHByb2FjdGl2ZWx5IGRpc3Bvc2VkIGFzIHNvb24gYXMgdGhlIG5vZGUgaXNcbiAgICAvLyByZW1vdmVkIHVzaW5nIGtvLnJlbW92ZU5vZGUuIEJ1dCBza2lwIGlmIGlzQWN0aXZlIGlzIGZhbHNlICh0aGVyZSB3aWxsIG5ldmVyIGJlIGFueSBkZXBlbmRlbmNpZXMgdG8gZGlzcG9zZSkuXG4gICAgaWYgKHN0YXRlLmRpc3Bvc2VXaGVuTm9kZUlzUmVtb3ZlZCAmJiBjb21wdXRlZE9ic2VydmFibGUuaXNBY3RpdmUoKSkge1xuICAgICAgICBrby51dGlscy5kb21Ob2RlRGlzcG9zYWwuYWRkRGlzcG9zZUNhbGxiYWNrKHN0YXRlLmRpc3Bvc2VXaGVuTm9kZUlzUmVtb3ZlZCwgc3RhdGUuZG9tTm9kZURpc3Bvc2FsQ2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjb21wdXRlZE9ic2VydmFibGUuZGlzcG9zZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29tcHV0ZWRPYnNlcnZhYmxlO1xufTtcblxuLy8gVXRpbGl0eSBmdW5jdGlvbiB0aGF0IGRpc3Bvc2VzIGEgZ2l2ZW4gZGVwZW5kZW5jeVRyYWNraW5nIGVudHJ5XG5mdW5jdGlvbiBjb21wdXRlZERpc3Bvc2VEZXBlbmRlbmN5Q2FsbGJhY2soaWQsIGVudHJ5VG9EaXNwb3NlKSB7XG4gICAgaWYgKGVudHJ5VG9EaXNwb3NlICE9PSBudWxsICYmIGVudHJ5VG9EaXNwb3NlLmRpc3Bvc2UpIHtcbiAgICAgICAgZW50cnlUb0Rpc3Bvc2UuZGlzcG9zZSgpO1xuICAgIH1cbn1cblxuLy8gVGhpcyBmdW5jdGlvbiBnZXRzIGNhbGxlZCBlYWNoIHRpbWUgYSBkZXBlbmRlbmN5IGlzIGRldGVjdGVkIHdoaWxlIGV2YWx1YXRpbmcgYSBjb21wdXRlZC5cbi8vIEl0J3MgZmFjdG9yZWQgb3V0IGFzIGEgc2hhcmVkIGZ1bmN0aW9uIHRvIGF2b2lkIGNyZWF0aW5nIHVubmVjZXNzYXJ5IGZ1bmN0aW9uIGluc3RhbmNlcyBkdXJpbmcgZXZhbHVhdGlvbi5cbmZ1bmN0aW9uIGNvbXB1dGVkQmVnaW5EZXBlbmRlbmN5RGV0ZWN0aW9uQ2FsbGJhY2soc3Vic2NyaWJhYmxlLCBpZCkge1xuICAgIHZhciBjb21wdXRlZE9ic2VydmFibGUgPSB0aGlzLmNvbXB1dGVkT2JzZXJ2YWJsZSxcbiAgICAgICAgc3RhdGUgPSBjb21wdXRlZE9ic2VydmFibGVbY29tcHV0ZWRTdGF0ZV07XG4gICAgaWYgKCFzdGF0ZS5pc0Rpc3Bvc2VkKSB7XG4gICAgICAgIGlmICh0aGlzLmRpc3Bvc2FsQ291bnQgJiYgdGhpcy5kaXNwb3NhbENhbmRpZGF0ZXNbaWRdKSB7XG4gICAgICAgICAgICAvLyBEb24ndCB3YW50IHRvIGRpc3Bvc2UgdGhpcyBzdWJzY3JpcHRpb24sIGFzIGl0J3Mgc3RpbGwgYmVpbmcgdXNlZFxuICAgICAgICAgICAgY29tcHV0ZWRPYnNlcnZhYmxlLmFkZERlcGVuZGVuY3lUcmFja2luZyhpZCwgc3Vic2NyaWJhYmxlLCB0aGlzLmRpc3Bvc2FsQ2FuZGlkYXRlc1tpZF0pO1xuICAgICAgICAgICAgdGhpcy5kaXNwb3NhbENhbmRpZGF0ZXNbaWRdID0gbnVsbDsgLy8gTm8gbmVlZCB0byBhY3R1YWxseSBkZWxldGUgdGhlIHByb3BlcnR5IC0gZGlzcG9zYWxDYW5kaWRhdGVzIGlzIGEgdHJhbnNpZW50IG9iamVjdCBhbnl3YXlcbiAgICAgICAgICAgIC0tdGhpcy5kaXNwb3NhbENvdW50O1xuICAgICAgICB9IGVsc2UgaWYgKCFzdGF0ZS5kZXBlbmRlbmN5VHJhY2tpbmdbaWRdKSB7XG4gICAgICAgICAgICAvLyBCcmFuZCBuZXcgc3Vic2NyaXB0aW9uIC0gYWRkIGl0XG4gICAgICAgICAgICBjb21wdXRlZE9ic2VydmFibGUuYWRkRGVwZW5kZW5jeVRyYWNraW5nKGlkLCBzdWJzY3JpYmFibGUsIHN0YXRlLmlzU2xlZXBpbmcgPyB7IF90YXJnZXQ6IHN1YnNjcmliYWJsZSB9IDogY29tcHV0ZWRPYnNlcnZhYmxlLnN1YnNjcmliZVRvRGVwZW5kZW5jeShzdWJzY3JpYmFibGUpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiB0aGUgb2JzZXJ2YWJsZSB3ZSd2ZSBhY2Nlc3NlZCBoYXMgYSBwZW5kaW5nIG5vdGlmaWNhdGlvbiwgZW5zdXJlIHdlIGdldCBub3RpZmllZCBvZiB0aGUgYWN0dWFsIGZpbmFsIHZhbHVlIChieXBhc3MgZXF1YWxpdHkgY2hlY2tzKVxuICAgICAgICBpZiAoc3Vic2NyaWJhYmxlLl9ub3RpZmljYXRpb25Jc1BlbmRpbmcpIHtcbiAgICAgICAgICAgIHN1YnNjcmliYWJsZS5fbm90aWZ5TmV4dENoYW5nZUlmVmFsdWVJc0RpZmZlcmVudCgpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG52YXIgY29tcHV0ZWRGbiA9IHtcbiAgICBcImVxdWFsaXR5Q29tcGFyZXJcIjogdmFsdWVzQXJlUHJpbWl0aXZlQW5kRXF1YWwsXG4gICAgZ2V0RGVwZW5kZW5jaWVzQ291bnQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY29tcHV0ZWRTdGF0ZV0uZGVwZW5kZW5jaWVzQ291bnQ7XG4gICAgfSxcbiAgICBhZGREZXBlbmRlbmN5VHJhY2tpbmc6IGZ1bmN0aW9uIChpZCwgdGFyZ2V0LCB0cmFja2luZ09iaikge1xuICAgICAgICBpZiAodGhpc1tjb21wdXRlZFN0YXRlXS5wdXJlICYmIHRhcmdldCA9PT0gdGhpcykge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoXCJBICdwdXJlJyBjb21wdXRlZCBtdXN0IG5vdCBiZSBjYWxsZWQgcmVjdXJzaXZlbHlcIik7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzW2NvbXB1dGVkU3RhdGVdLmRlcGVuZGVuY3lUcmFja2luZ1tpZF0gPSB0cmFja2luZ09iajtcbiAgICAgICAgdHJhY2tpbmdPYmouX29yZGVyID0gdGhpc1tjb21wdXRlZFN0YXRlXS5kZXBlbmRlbmNpZXNDb3VudCsrO1xuICAgICAgICB0cmFja2luZ09iai5fdmVyc2lvbiA9IHRhcmdldC5nZXRWZXJzaW9uKCk7XG4gICAgfSxcbiAgICBoYXZlRGVwZW5kZW5jaWVzQ2hhbmdlZDogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgaWQsIGRlcGVuZGVuY3ksIGRlcGVuZGVuY3lUcmFja2luZyA9IHRoaXNbY29tcHV0ZWRTdGF0ZV0uZGVwZW5kZW5jeVRyYWNraW5nO1xuICAgICAgICBmb3IgKGlkIGluIGRlcGVuZGVuY3lUcmFja2luZykge1xuICAgICAgICAgICAgaWYgKGRlcGVuZGVuY3lUcmFja2luZy5oYXNPd25Qcm9wZXJ0eShpZCkpIHtcbiAgICAgICAgICAgICAgICBkZXBlbmRlbmN5ID0gZGVwZW5kZW5jeVRyYWNraW5nW2lkXTtcbiAgICAgICAgICAgICAgICBpZiAoKHRoaXMuX2V2YWxEZWxheWVkICYmIGRlcGVuZGVuY3kuX3RhcmdldC5fbm90aWZpY2F0aW9uSXNQZW5kaW5nKSB8fCBkZXBlbmRlbmN5Ll90YXJnZXQuaGFzQ2hhbmdlZChkZXBlbmRlbmN5Ll92ZXJzaW9uKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1hcmtEaXJ0eTogZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBQcm9jZXNzIFwiZGlydHlcIiBldmVudHMgaWYgd2UgY2FuIGhhbmRsZSBkZWxheWVkIG5vdGlmaWNhdGlvbnNcbiAgICAgICAgaWYgKHRoaXMuX2V2YWxEZWxheWVkICYmICF0aGlzW2NvbXB1dGVkU3RhdGVdLmlzQmVpbmdFdmFsdWF0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2V2YWxEZWxheWVkKGZhbHNlIC8qaXNDaGFuZ2UqLyk7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIGlzQWN0aXZlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBzdGF0ZSA9IHRoaXNbY29tcHV0ZWRTdGF0ZV07XG4gICAgICAgIHJldHVybiBzdGF0ZS5pc0RpcnR5IHx8IHN0YXRlLmRlcGVuZGVuY2llc0NvdW50ID4gMDtcbiAgICB9LFxuICAgIHJlc3BvbmRUb0NoYW5nZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBJZ25vcmUgXCJjaGFuZ2VcIiBldmVudHMgaWYgd2UndmUgYWxyZWFkeSBzY2hlZHVsZWQgYSBkZWxheWVkIG5vdGlmaWNhdGlvblxuICAgICAgICBpZiAoIXRoaXMuX25vdGlmaWNhdGlvbklzUGVuZGluZykge1xuICAgICAgICAgICAgdGhpcy5ldmFsdWF0ZVBvc3NpYmx5QXN5bmMoKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzW2NvbXB1dGVkU3RhdGVdLmlzRGlydHkpIHtcbiAgICAgICAgICAgIHRoaXNbY29tcHV0ZWRTdGF0ZV0uaXNTdGFsZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIHN1YnNjcmliZVRvRGVwZW5kZW5jeTogZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgICBpZiAodGFyZ2V0Ll9kZWZlclVwZGF0ZXMgJiYgIXRoaXNbY29tcHV0ZWRTdGF0ZV0uZGlzcG9zZVdoZW5Ob2RlSXNSZW1vdmVkKSB7XG4gICAgICAgICAgICB2YXIgZGlydHlTdWIgPSB0YXJnZXQuc3Vic2NyaWJlKHRoaXMubWFya0RpcnR5LCB0aGlzLCAnZGlydHknKSxcbiAgICAgICAgICAgICAgICBjaGFuZ2VTdWIgPSB0YXJnZXQuc3Vic2NyaWJlKHRoaXMucmVzcG9uZFRvQ2hhbmdlLCB0aGlzKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgX3RhcmdldDogdGFyZ2V0LFxuICAgICAgICAgICAgICAgIGRpc3Bvc2U6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgZGlydHlTdWIuZGlzcG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICBjaGFuZ2VTdWIuZGlzcG9zZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0LnN1YnNjcmliZSh0aGlzLmV2YWx1YXRlUG9zc2libHlBc3luYywgdGhpcyk7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIGV2YWx1YXRlUG9zc2libHlBc3luYzogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgY29tcHV0ZWRPYnNlcnZhYmxlID0gdGhpcyxcbiAgICAgICAgICAgIHRocm90dGxlRXZhbHVhdGlvblRpbWVvdXQgPSBjb21wdXRlZE9ic2VydmFibGVbJ3Rocm90dGxlRXZhbHVhdGlvbiddO1xuICAgICAgICBpZiAodGhyb3R0bGVFdmFsdWF0aW9uVGltZW91dCAmJiB0aHJvdHRsZUV2YWx1YXRpb25UaW1lb3V0ID49IDApIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzW2NvbXB1dGVkU3RhdGVdLmV2YWx1YXRpb25UaW1lb3V0SW5zdGFuY2UpO1xuICAgICAgICAgICAgdGhpc1tjb21wdXRlZFN0YXRlXS5ldmFsdWF0aW9uVGltZW91dEluc3RhbmNlID0ga28udXRpbHMuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgY29tcHV0ZWRPYnNlcnZhYmxlLmV2YWx1YXRlSW1tZWRpYXRlKHRydWUgLypub3RpZnlDaGFuZ2UqLyk7XG4gICAgICAgICAgICB9LCB0aHJvdHRsZUV2YWx1YXRpb25UaW1lb3V0KTtcbiAgICAgICAgfSBlbHNlIGlmIChjb21wdXRlZE9ic2VydmFibGUuX2V2YWxEZWxheWVkKSB7XG4gICAgICAgICAgICBjb21wdXRlZE9ic2VydmFibGUuX2V2YWxEZWxheWVkKHRydWUgLyppc0NoYW5nZSovKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbXB1dGVkT2JzZXJ2YWJsZS5ldmFsdWF0ZUltbWVkaWF0ZSh0cnVlIC8qbm90aWZ5Q2hhbmdlKi8pO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBldmFsdWF0ZUltbWVkaWF0ZTogZnVuY3Rpb24gKG5vdGlmeUNoYW5nZSkge1xuICAgICAgICB2YXIgY29tcHV0ZWRPYnNlcnZhYmxlID0gdGhpcyxcbiAgICAgICAgICAgIHN0YXRlID0gY29tcHV0ZWRPYnNlcnZhYmxlW2NvbXB1dGVkU3RhdGVdLFxuICAgICAgICAgICAgZGlzcG9zZVdoZW4gPSBzdGF0ZS5kaXNwb3NlV2hlbixcbiAgICAgICAgICAgIGNoYW5nZWQgPSBmYWxzZTtcblxuICAgICAgICBpZiAoc3RhdGUuaXNCZWluZ0V2YWx1YXRlZCkge1xuICAgICAgICAgICAgLy8gSWYgdGhlIGV2YWx1YXRpb24gb2YgYSBrby5jb21wdXRlZCBjYXVzZXMgc2lkZSBlZmZlY3RzLCBpdCdzIHBvc3NpYmxlIHRoYXQgaXQgd2lsbCB0cmlnZ2VyIGl0cyBvd24gcmUtZXZhbHVhdGlvbi5cbiAgICAgICAgICAgIC8vIFRoaXMgaXMgbm90IGRlc2lyYWJsZSAoaXQncyBoYXJkIGZvciBhIGRldmVsb3BlciB0byByZWFsaXNlIGEgY2hhaW4gb2YgZGVwZW5kZW5jaWVzIG1pZ2h0IGNhdXNlIHRoaXMsIGFuZCB0aGV5IGFsbW9zdFxuICAgICAgICAgICAgLy8gY2VydGFpbmx5IGRpZG4ndCBpbnRlbmQgaW5maW5pdGUgcmUtZXZhbHVhdGlvbnMpLiBTbywgZm9yIHByZWRpY3RhYmlsaXR5LCB3ZSBzaW1wbHkgcHJldmVudCBrby5jb21wdXRlZHMgZnJvbSBjYXVzaW5nXG4gICAgICAgICAgICAvLyB0aGVpciBvd24gcmUtZXZhbHVhdGlvbi4gRnVydGhlciBkaXNjdXNzaW9uIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9TdGV2ZVNhbmRlcnNvbi9rbm9ja291dC9wdWxsLzM4N1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRG8gbm90IGV2YWx1YXRlIChhbmQgcG9zc2libHkgY2FwdHVyZSBuZXcgZGVwZW5kZW5jaWVzKSBpZiBkaXNwb3NlZFxuICAgICAgICBpZiAoc3RhdGUuaXNEaXNwb3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0YXRlLmRpc3Bvc2VXaGVuTm9kZUlzUmVtb3ZlZCAmJiAha28udXRpbHMuZG9tTm9kZUlzQXR0YWNoZWRUb0RvY3VtZW50KHN0YXRlLmRpc3Bvc2VXaGVuTm9kZUlzUmVtb3ZlZCkgfHwgZGlzcG9zZVdoZW4gJiYgZGlzcG9zZVdoZW4oKSkge1xuICAgICAgICAgICAgLy8gU2VlIGNvbW1lbnQgYWJvdmUgYWJvdXQgc3VwcHJlc3NEaXNwb3NhbFVudGlsRGlzcG9zZVdoZW5SZXR1cm5zRmFsc2VcbiAgICAgICAgICAgIGlmICghc3RhdGUuc3VwcHJlc3NEaXNwb3NhbFVudGlsRGlzcG9zZVdoZW5SZXR1cm5zRmFsc2UpIHtcbiAgICAgICAgICAgICAgICBjb21wdXRlZE9ic2VydmFibGUuZGlzcG9zZSgpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEl0IGp1c3QgZGlkIHJldHVybiBmYWxzZSwgc28gd2UgY2FuIHN0b3Agc3VwcHJlc3Npbmcgbm93XG4gICAgICAgICAgICBzdGF0ZS5zdXBwcmVzc0Rpc3Bvc2FsVW50aWxEaXNwb3NlV2hlblJldHVybnNGYWxzZSA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RhdGUuaXNCZWluZ0V2YWx1YXRlZCA9IHRydWU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjaGFuZ2VkID0gdGhpcy5ldmFsdWF0ZUltbWVkaWF0ZV9DYWxsUmVhZFdpdGhEZXBlbmRlbmN5RGV0ZWN0aW9uKG5vdGlmeUNoYW5nZSk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBzdGF0ZS5pc0JlaW5nRXZhbHVhdGVkID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXN0YXRlLmRlcGVuZGVuY2llc0NvdW50KSB7XG4gICAgICAgICAgICBjb21wdXRlZE9ic2VydmFibGUuZGlzcG9zZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNoYW5nZWQ7XG4gICAgfSxcbiAgICBldmFsdWF0ZUltbWVkaWF0ZV9DYWxsUmVhZFdpdGhEZXBlbmRlbmN5RGV0ZWN0aW9uOiBmdW5jdGlvbiAobm90aWZ5Q2hhbmdlKSB7XG4gICAgICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgcmVhbGx5IGp1c3QgcGFydCBvZiB0aGUgZXZhbHVhdGVJbW1lZGlhdGUgbG9naWMuIFlvdSB3b3VsZCBuZXZlciBjYWxsIGl0IGZyb20gYW55d2hlcmUgZWxzZS5cbiAgICAgICAgLy8gRmFjdG9yaW5nIGl0IG91dCBpbnRvIGEgc2VwYXJhdGUgZnVuY3Rpb24gbWVhbnMgaXQgY2FuIGJlIGluZGVwZW5kZW50IG9mIHRoZSB0cnkvY2F0Y2ggYmxvY2sgaW4gZXZhbHVhdGVJbW1lZGlhdGUsXG4gICAgICAgIC8vIHdoaWNoIGNvbnRyaWJ1dGVzIHRvIHNhdmluZyBhYm91dCA0MCUgb2ZmIHRoZSBDUFUgb3ZlcmhlYWQgb2YgY29tcHV0ZWQgZXZhbHVhdGlvbiAob24gVjggYXQgbGVhc3QpLlxuXG4gICAgICAgIHZhciBjb21wdXRlZE9ic2VydmFibGUgPSB0aGlzLFxuICAgICAgICAgICAgc3RhdGUgPSBjb21wdXRlZE9ic2VydmFibGVbY29tcHV0ZWRTdGF0ZV0sXG4gICAgICAgICAgICBjaGFuZ2VkID0gZmFsc2U7XG5cbiAgICAgICAgLy8gSW5pdGlhbGx5LCB3ZSBhc3N1bWUgdGhhdCBub25lIG9mIHRoZSBzdWJzY3JpcHRpb25zIGFyZSBzdGlsbCBiZWluZyB1c2VkIChpLmUuLCBhbGwgYXJlIGNhbmRpZGF0ZXMgZm9yIGRpc3Bvc2FsKS5cbiAgICAgICAgLy8gVGhlbiwgZHVyaW5nIGV2YWx1YXRpb24sIHdlIGNyb3NzIG9mZiBhbnkgdGhhdCBhcmUgaW4gZmFjdCBzdGlsbCBiZWluZyB1c2VkLlxuICAgICAgICB2YXIgaXNJbml0aWFsID0gc3RhdGUucHVyZSA/IHVuZGVmaW5lZCA6ICFzdGF0ZS5kZXBlbmRlbmNpZXNDb3VudCwgICAvLyBJZiB3ZSdyZSBldmFsdWF0aW5nIHdoZW4gdGhlcmUgYXJlIG5vIHByZXZpb3VzIGRlcGVuZGVuY2llcywgaXQgbXVzdCBiZSB0aGUgZmlyc3QgdGltZVxuICAgICAgICAgICAgZGVwZW5kZW5jeURldGVjdGlvbkNvbnRleHQgPSB7XG4gICAgICAgICAgICAgICAgY29tcHV0ZWRPYnNlcnZhYmxlOiBjb21wdXRlZE9ic2VydmFibGUsXG4gICAgICAgICAgICAgICAgZGlzcG9zYWxDYW5kaWRhdGVzOiBzdGF0ZS5kZXBlbmRlbmN5VHJhY2tpbmcsXG4gICAgICAgICAgICAgICAgZGlzcG9zYWxDb3VudDogc3RhdGUuZGVwZW5kZW5jaWVzQ291bnRcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAga28uZGVwZW5kZW5jeURldGVjdGlvbi5iZWdpbih7XG4gICAgICAgICAgICBjYWxsYmFja1RhcmdldDogZGVwZW5kZW5jeURldGVjdGlvbkNvbnRleHQsXG4gICAgICAgICAgICBjYWxsYmFjazogY29tcHV0ZWRCZWdpbkRlcGVuZGVuY3lEZXRlY3Rpb25DYWxsYmFjayxcbiAgICAgICAgICAgIGNvbXB1dGVkOiBjb21wdXRlZE9ic2VydmFibGUsXG4gICAgICAgICAgICBpc0luaXRpYWw6IGlzSW5pdGlhbFxuICAgICAgICB9KTtcblxuICAgICAgICBzdGF0ZS5kZXBlbmRlbmN5VHJhY2tpbmcgPSB7fTtcbiAgICAgICAgc3RhdGUuZGVwZW5kZW5jaWVzQ291bnQgPSAwO1xuXG4gICAgICAgIHZhciBuZXdWYWx1ZSA9IHRoaXMuZXZhbHVhdGVJbW1lZGlhdGVfQ2FsbFJlYWRUaGVuRW5kRGVwZW5kZW5jeURldGVjdGlvbihzdGF0ZSwgZGVwZW5kZW5jeURldGVjdGlvbkNvbnRleHQpO1xuXG4gICAgICAgIGlmIChjb21wdXRlZE9ic2VydmFibGUuaXNEaWZmZXJlbnQoc3RhdGUubGF0ZXN0VmFsdWUsIG5ld1ZhbHVlKSkge1xuICAgICAgICAgICAgaWYgKCFzdGF0ZS5pc1NsZWVwaW5nKSB7XG4gICAgICAgICAgICAgICAgY29tcHV0ZWRPYnNlcnZhYmxlW1wibm90aWZ5U3Vic2NyaWJlcnNcIl0oc3RhdGUubGF0ZXN0VmFsdWUsIFwiYmVmb3JlQ2hhbmdlXCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzdGF0ZS5sYXRlc3RWYWx1ZSA9IG5ld1ZhbHVlO1xuICAgICAgICAgICAgaWYgKERFQlVHKSBjb21wdXRlZE9ic2VydmFibGUuX2xhdGVzdFZhbHVlID0gbmV3VmFsdWU7XG5cbiAgICAgICAgICAgIGlmIChzdGF0ZS5pc1NsZWVwaW5nKSB7XG4gICAgICAgICAgICAgICAgY29tcHV0ZWRPYnNlcnZhYmxlLnVwZGF0ZVZlcnNpb24oKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobm90aWZ5Q2hhbmdlKSB7XG4gICAgICAgICAgICAgICAgY29tcHV0ZWRPYnNlcnZhYmxlW1wibm90aWZ5U3Vic2NyaWJlcnNcIl0oc3RhdGUubGF0ZXN0VmFsdWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc0luaXRpYWwpIHtcbiAgICAgICAgICAgIGNvbXB1dGVkT2JzZXJ2YWJsZVtcIm5vdGlmeVN1YnNjcmliZXJzXCJdKHN0YXRlLmxhdGVzdFZhbHVlLCBcImF3YWtlXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNoYW5nZWQ7XG4gICAgfSxcbiAgICBldmFsdWF0ZUltbWVkaWF0ZV9DYWxsUmVhZFRoZW5FbmREZXBlbmRlbmN5RGV0ZWN0aW9uOiBmdW5jdGlvbiAoc3RhdGUsIGRlcGVuZGVuY3lEZXRlY3Rpb25Db250ZXh0KSB7XG4gICAgICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgcmVhbGx5IHBhcnQgb2YgdGhlIGV2YWx1YXRlSW1tZWRpYXRlX0NhbGxSZWFkV2l0aERlcGVuZGVuY3lEZXRlY3Rpb24gbG9naWMuXG4gICAgICAgIC8vIFlvdSdkIG5ldmVyIGNhbGwgaXQgZnJvbSBhbnl3aGVyZSBlbHNlLiBGYWN0b3JpbmcgaXQgb3V0IG1lYW5zIHRoYXQgZXZhbHVhdGVJbW1lZGlhdGVfQ2FsbFJlYWRXaXRoRGVwZW5kZW5jeURldGVjdGlvblxuICAgICAgICAvLyBjYW4gYmUgaW5kZXBlbmRlbnQgb2YgdHJ5L2ZpbmFsbHkgYmxvY2tzLCB3aGljaCBjb250cmlidXRlcyB0byBzYXZpbmcgYWJvdXQgNDAlIG9mZiB0aGUgQ1BVXG4gICAgICAgIC8vIG92ZXJoZWFkIG9mIGNvbXB1dGVkIGV2YWx1YXRpb24gKG9uIFY4IGF0IGxlYXN0KS5cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIHJlYWRGdW5jdGlvbiA9IHN0YXRlLnJlYWRGdW5jdGlvbjtcbiAgICAgICAgICAgIHJldHVybiBzdGF0ZS5ldmFsdWF0b3JGdW5jdGlvblRhcmdldCA/IHJlYWRGdW5jdGlvbi5jYWxsKHN0YXRlLmV2YWx1YXRvckZ1bmN0aW9uVGFyZ2V0KSA6IHJlYWRGdW5jdGlvbigpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAga28uZGVwZW5kZW5jeURldGVjdGlvbi5lbmQoKTtcblxuICAgICAgICAgICAgLy8gRm9yIGVhY2ggc3Vic2NyaXB0aW9uIG5vIGxvbmdlciBiZWluZyB1c2VkLCByZW1vdmUgaXQgZnJvbSB0aGUgYWN0aXZlIHN1YnNjcmlwdGlvbnMgbGlzdCBhbmQgZGlzcG9zZSBpdFxuICAgICAgICAgICAgaWYgKGRlcGVuZGVuY3lEZXRlY3Rpb25Db250ZXh0LmRpc3Bvc2FsQ291bnQgJiYgIXN0YXRlLmlzU2xlZXBpbmcpIHtcbiAgICAgICAgICAgICAgICBrby51dGlscy5vYmplY3RGb3JFYWNoKGRlcGVuZGVuY3lEZXRlY3Rpb25Db250ZXh0LmRpc3Bvc2FsQ2FuZGlkYXRlcywgY29tcHV0ZWREaXNwb3NlRGVwZW5kZW5jeUNhbGxiYWNrKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc3RhdGUuaXNTdGFsZSA9IHN0YXRlLmlzRGlydHkgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcGVlazogZnVuY3Rpb24gKGV2YWx1YXRlKSB7XG4gICAgICAgIC8vIEJ5IGRlZmF1bHQsIHBlZWsgd29uJ3QgcmUtZXZhbHVhdGUsIGV4Y2VwdCB3aGlsZSB0aGUgY29tcHV0ZWQgaXMgc2xlZXBpbmcgb3IgdG8gZ2V0IHRoZSBpbml0aWFsIHZhbHVlIHdoZW4gXCJkZWZlckV2YWx1YXRpb25cIiBpcyBzZXQuXG4gICAgICAgIC8vIFBhc3MgaW4gdHJ1ZSB0byBldmFsdWF0ZSBpZiBuZWVkZWQuXG4gICAgICAgIHZhciBzdGF0ZSA9IHRoaXNbY29tcHV0ZWRTdGF0ZV07XG4gICAgICAgIGlmICgoc3RhdGUuaXNEaXJ0eSAmJiAoZXZhbHVhdGUgfHwgIXN0YXRlLmRlcGVuZGVuY2llc0NvdW50KSkgfHwgKHN0YXRlLmlzU2xlZXBpbmcgJiYgdGhpcy5oYXZlRGVwZW5kZW5jaWVzQ2hhbmdlZCgpKSkge1xuICAgICAgICAgICAgdGhpcy5ldmFsdWF0ZUltbWVkaWF0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdGF0ZS5sYXRlc3RWYWx1ZTtcbiAgICB9LFxuICAgIGxpbWl0OiBmdW5jdGlvbiAobGltaXRGdW5jdGlvbikge1xuICAgICAgICAvLyBPdmVycmlkZSB0aGUgbGltaXQgZnVuY3Rpb24gd2l0aCBvbmUgdGhhdCBkZWxheXMgZXZhbHVhdGlvbiBhcyB3ZWxsXG4gICAgICAgIGtvLnN1YnNjcmliYWJsZVsnZm4nXS5saW1pdC5jYWxsKHRoaXMsIGxpbWl0RnVuY3Rpb24pO1xuICAgICAgICB0aGlzLl9ldmFsSWZDaGFuZ2VkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKHRoaXNbY29tcHV0ZWRTdGF0ZV0uaXNTdGFsZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZXZhbHVhdGVJbW1lZGlhdGUoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpc1tjb21wdXRlZFN0YXRlXS5pc0RpcnR5ID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpc1tjb21wdXRlZFN0YXRlXS5sYXRlc3RWYWx1ZTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5fZXZhbERlbGF5ZWQgPSBmdW5jdGlvbiAoaXNDaGFuZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuX2xpbWl0QmVmb3JlQ2hhbmdlKHRoaXNbY29tcHV0ZWRTdGF0ZV0ubGF0ZXN0VmFsdWUpO1xuXG4gICAgICAgICAgICAvLyBNYXJrIGFzIGRpcnR5XG4gICAgICAgICAgICB0aGlzW2NvbXB1dGVkU3RhdGVdLmlzRGlydHkgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKGlzQ2hhbmdlKSB7XG4gICAgICAgICAgICAgICAgdGhpc1tjb21wdXRlZFN0YXRlXS5pc1N0YWxlID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gUGFzcyB0aGUgb2JzZXJ2YWJsZSB0byB0aGUgXCJsaW1pdFwiIGNvZGUsIHdoaWNoIHdpbGwgZXZhbHVhdGUgaXQgd2hlblxuICAgICAgICAgICAgLy8gaXQncyB0aW1lIHRvIGRvIHRoZSBub3RpZmljYXRpb24uXG4gICAgICAgICAgICB0aGlzLl9saW1pdENoYW5nZSh0aGlzKTtcbiAgICAgICAgfTtcbiAgICB9LFxuICAgIGRpc3Bvc2U6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHN0YXRlID0gdGhpc1tjb21wdXRlZFN0YXRlXTtcbiAgICAgICAgaWYgKCFzdGF0ZS5pc1NsZWVwaW5nICYmIHN0YXRlLmRlcGVuZGVuY3lUcmFja2luZykge1xuICAgICAgICAgICAga28udXRpbHMub2JqZWN0Rm9yRWFjaChzdGF0ZS5kZXBlbmRlbmN5VHJhY2tpbmcsIGZ1bmN0aW9uIChpZCwgZGVwZW5kZW5jeSkge1xuICAgICAgICAgICAgICAgIGlmIChkZXBlbmRlbmN5LmRpc3Bvc2UpXG4gICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY3kuZGlzcG9zZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXRlLmRpc3Bvc2VXaGVuTm9kZUlzUmVtb3ZlZCAmJiBzdGF0ZS5kb21Ob2RlRGlzcG9zYWxDYWxsYmFjaykge1xuICAgICAgICAgICAga28udXRpbHMuZG9tTm9kZURpc3Bvc2FsLnJlbW92ZURpc3Bvc2VDYWxsYmFjayhzdGF0ZS5kaXNwb3NlV2hlbk5vZGVJc1JlbW92ZWQsIHN0YXRlLmRvbU5vZGVEaXNwb3NhbENhbGxiYWNrKTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5kZXBlbmRlbmN5VHJhY2tpbmcgPSBudWxsO1xuICAgICAgICBzdGF0ZS5kZXBlbmRlbmNpZXNDb3VudCA9IDA7XG4gICAgICAgIHN0YXRlLmlzRGlzcG9zZWQgPSB0cnVlO1xuICAgICAgICBzdGF0ZS5pc1N0YWxlID0gZmFsc2U7XG4gICAgICAgIHN0YXRlLmlzRGlydHkgPSBmYWxzZTtcbiAgICAgICAgc3RhdGUuaXNTbGVlcGluZyA9IGZhbHNlO1xuICAgICAgICBzdGF0ZS5kaXNwb3NlV2hlbk5vZGVJc1JlbW92ZWQgPSBudWxsO1xuICAgIH1cbn07XG5cbnZhciBwdXJlQ29tcHV0ZWRPdmVycmlkZXMgPSB7XG4gICAgYmVmb3JlU3Vic2NyaXB0aW9uQWRkOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgLy8gSWYgYXNsZWVwLCB3YWtlIHVwIHRoZSBjb21wdXRlZCBieSBzdWJzY3JpYmluZyB0byBhbnkgZGVwZW5kZW5jaWVzLlxuICAgICAgICB2YXIgY29tcHV0ZWRPYnNlcnZhYmxlID0gdGhpcyxcbiAgICAgICAgICAgIHN0YXRlID0gY29tcHV0ZWRPYnNlcnZhYmxlW2NvbXB1dGVkU3RhdGVdO1xuICAgICAgICBpZiAoIXN0YXRlLmlzRGlzcG9zZWQgJiYgc3RhdGUuaXNTbGVlcGluZyAmJiBldmVudCA9PSAnY2hhbmdlJykge1xuICAgICAgICAgICAgc3RhdGUuaXNTbGVlcGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKHN0YXRlLmlzU3RhbGUgfHwgY29tcHV0ZWRPYnNlcnZhYmxlLmhhdmVEZXBlbmRlbmNpZXNDaGFuZ2VkKCkpIHtcbiAgICAgICAgICAgICAgICBzdGF0ZS5kZXBlbmRlbmN5VHJhY2tpbmcgPSBudWxsO1xuICAgICAgICAgICAgICAgIHN0YXRlLmRlcGVuZGVuY2llc0NvdW50ID0gMDtcbiAgICAgICAgICAgICAgICBpZiAoY29tcHV0ZWRPYnNlcnZhYmxlLmV2YWx1YXRlSW1tZWRpYXRlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tcHV0ZWRPYnNlcnZhYmxlLnVwZGF0ZVZlcnNpb24oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEZpcnN0IHB1dCB0aGUgZGVwZW5kZW5jaWVzIGluIG9yZGVyXG4gICAgICAgICAgICAgICAgdmFyIGRlcGVuZGVjaWVzT3JkZXIgPSBbXTtcbiAgICAgICAgICAgICAgICBrby51dGlscy5vYmplY3RGb3JFYWNoKHN0YXRlLmRlcGVuZGVuY3lUcmFja2luZywgZnVuY3Rpb24gKGlkLCBkZXBlbmRlbmN5KSB7XG4gICAgICAgICAgICAgICAgICAgIGRlcGVuZGVjaWVzT3JkZXJbZGVwZW5kZW5jeS5fb3JkZXJdID0gaWQ7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgLy8gTmV4dCwgc3Vic2NyaWJlIHRvIGVhY2ggb25lXG4gICAgICAgICAgICAgICAga28udXRpbHMuYXJyYXlGb3JFYWNoKGRlcGVuZGVjaWVzT3JkZXIsIGZ1bmN0aW9uIChpZCwgb3JkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRlcGVuZGVuY3kgPSBzdGF0ZS5kZXBlbmRlbmN5VHJhY2tpbmdbaWRdLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uID0gY29tcHV0ZWRPYnNlcnZhYmxlLnN1YnNjcmliZVRvRGVwZW5kZW5jeShkZXBlbmRlbmN5Ll90YXJnZXQpO1xuICAgICAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb24uX29yZGVyID0gb3JkZXI7XG4gICAgICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbi5fdmVyc2lvbiA9IGRlcGVuZGVuY3kuX3ZlcnNpb247XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLmRlcGVuZGVuY3lUcmFja2luZ1tpZF0gPSBzdWJzY3JpcHRpb247XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXN0YXRlLmlzRGlzcG9zZWQpIHsgICAgIC8vIHRlc3Qgc2luY2UgZXZhbHVhdGluZyBjb3VsZCB0cmlnZ2VyIGRpc3Bvc2FsXG4gICAgICAgICAgICAgICAgY29tcHV0ZWRPYnNlcnZhYmxlW1wibm90aWZ5U3Vic2NyaWJlcnNcIl0oc3RhdGUubGF0ZXN0VmFsdWUsIFwiYXdha2VcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuICAgIGFmdGVyU3Vic2NyaXB0aW9uUmVtb3ZlOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgdmFyIHN0YXRlID0gdGhpc1tjb21wdXRlZFN0YXRlXTtcbiAgICAgICAgaWYgKCFzdGF0ZS5pc0Rpc3Bvc2VkICYmIGV2ZW50ID09ICdjaGFuZ2UnICYmICF0aGlzLmhhc1N1YnNjcmlwdGlvbnNGb3JFdmVudCgnY2hhbmdlJykpIHtcbiAgICAgICAgICAgIGtvLnV0aWxzLm9iamVjdEZvckVhY2goc3RhdGUuZGVwZW5kZW5jeVRyYWNraW5nLCBmdW5jdGlvbiAoaWQsIGRlcGVuZGVuY3kpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVwZW5kZW5jeS5kaXNwb3NlKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLmRlcGVuZGVuY3lUcmFja2luZ1tpZF0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfdGFyZ2V0OiBkZXBlbmRlbmN5Ll90YXJnZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICBfb3JkZXI6IGRlcGVuZGVuY3kuX29yZGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgX3ZlcnNpb246IGRlcGVuZGVuY3kuX3ZlcnNpb25cbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jeS5kaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBzdGF0ZS5pc1NsZWVwaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXNbXCJub3RpZnlTdWJzY3JpYmVyc1wiXSh1bmRlZmluZWQsIFwiYXNsZWVwXCIpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBnZXRWZXJzaW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIEJlY2F1c2UgYSBwdXJlIGNvbXB1dGVkIGlzIG5vdCBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgd2hpbGUgaXQgaXMgc2xlZXBpbmcsIHdlIGNhbid0XG4gICAgICAgIC8vIHNpbXBseSByZXR1cm4gdGhlIHZlcnNpb24gbnVtYmVyLiBJbnN0ZWFkLCB3ZSBjaGVjayBpZiBhbnkgb2YgdGhlIGRlcGVuZGVuY2llcyBoYXZlXG4gICAgICAgIC8vIGNoYW5nZWQgYW5kIGNvbmRpdGlvbmFsbHkgcmUtZXZhbHVhdGUgdGhlIGNvbXB1dGVkIG9ic2VydmFibGUuXG4gICAgICAgIHZhciBzdGF0ZSA9IHRoaXNbY29tcHV0ZWRTdGF0ZV07XG4gICAgICAgIGlmIChzdGF0ZS5pc1NsZWVwaW5nICYmIChzdGF0ZS5pc1N0YWxlIHx8IHRoaXMuaGF2ZURlcGVuZGVuY2llc0NoYW5nZWQoKSkpIHtcbiAgICAgICAgICAgIHRoaXMuZXZhbHVhdGVJbW1lZGlhdGUoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ga28uc3Vic2NyaWJhYmxlWydmbiddLmdldFZlcnNpb24uY2FsbCh0aGlzKTtcbiAgICB9XG59O1xuXG52YXIgZGVmZXJFdmFsdWF0aW9uT3ZlcnJpZGVzID0ge1xuICAgIGJlZm9yZVN1YnNjcmlwdGlvbkFkZDogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIC8vIFRoaXMgd2lsbCBmb3JjZSBhIGNvbXB1dGVkIHdpdGggZGVmZXJFdmFsdWF0aW9uIHRvIGV2YWx1YXRlIHdoZW4gdGhlIGZpcnN0IHN1YnNjcmlwdGlvbiBpcyByZWdpc3RlcmVkLlxuICAgICAgICBpZiAoZXZlbnQgPT0gJ2NoYW5nZScgfHwgZXZlbnQgPT0gJ2JlZm9yZUNoYW5nZScpIHtcbiAgICAgICAgICAgIHRoaXMucGVlaygpO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuLy8gTm90ZSB0aGF0IGZvciBicm93c2VycyB0aGF0IGRvbid0IHN1cHBvcnQgcHJvdG8gYXNzaWdubWVudCwgdGhlXG4vLyBpbmhlcml0YW5jZSBjaGFpbiBpcyBjcmVhdGVkIG1hbnVhbGx5IGluIHRoZSBrby5jb21wdXRlZCBjb25zdHJ1Y3RvclxuaWYgKGtvLnV0aWxzLmNhblNldFByb3RvdHlwZSkge1xuICAgIGtvLnV0aWxzLnNldFByb3RvdHlwZU9mKGNvbXB1dGVkRm4sIGtvLnN1YnNjcmliYWJsZVsnZm4nXSk7XG59XG5cbi8vIFNldCB0aGUgcHJvdG8gY2hhaW4gdmFsdWVzIGZvciBrby5oYXNQcm90b3R5cGVcbnZhciBwcm90b1Byb3AgPSBrby5vYnNlcnZhYmxlLnByb3RvUHJvcGVydHk7IC8vID09IFwiX19rb19wcm90b19fXCJcbmtvLmNvbXB1dGVkW3Byb3RvUHJvcF0gPSBrby5vYnNlcnZhYmxlO1xuY29tcHV0ZWRGbltwcm90b1Byb3BdID0ga28uY29tcHV0ZWQ7XG5cbmtvLmlzQ29tcHV0ZWQgPSBmdW5jdGlvbiAoaW5zdGFuY2UpIHtcbiAgICByZXR1cm4ga28uaGFzUHJvdG90eXBlKGluc3RhbmNlLCBrby5jb21wdXRlZCk7XG59O1xuXG5rby5pc1B1cmVDb21wdXRlZCA9IGZ1bmN0aW9uIChpbnN0YW5jZSkge1xuICAgIHJldHVybiBrby5oYXNQcm90b3R5cGUoaW5zdGFuY2UsIGtvLmNvbXB1dGVkKVxuICAgICAgICAmJiBpbnN0YW5jZVtjb21wdXRlZFN0YXRlXSAmJiBpbnN0YW5jZVtjb21wdXRlZFN0YXRlXS5wdXJlO1xufTtcblxua28uZXhwb3J0U3ltYm9sKCdjb21wdXRlZCcsIGtvLmNvbXB1dGVkKTtcbmtvLmV4cG9ydFN5bWJvbCgnZGVwZW5kZW50T2JzZXJ2YWJsZScsIGtvLmNvbXB1dGVkKTsgICAgLy8gZXhwb3J0IGtvLmRlcGVuZGVudE9ic2VydmFibGUgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5ICgxLngpXG5rby5leHBvcnRTeW1ib2woJ2lzQ29tcHV0ZWQnLCBrby5pc0NvbXB1dGVkKTtcbmtvLmV4cG9ydFN5bWJvbCgnaXNQdXJlQ29tcHV0ZWQnLCBrby5pc1B1cmVDb21wdXRlZCk7XG5rby5leHBvcnRTeW1ib2woJ2NvbXB1dGVkLmZuJywgY29tcHV0ZWRGbik7XG5rby5leHBvcnRQcm9wZXJ0eShjb21wdXRlZEZuLCAncGVlaycsIGNvbXB1dGVkRm4ucGVlayk7XG5rby5leHBvcnRQcm9wZXJ0eShjb21wdXRlZEZuLCAnZGlzcG9zZScsIGNvbXB1dGVkRm4uZGlzcG9zZSk7XG5rby5leHBvcnRQcm9wZXJ0eShjb21wdXRlZEZuLCAnaXNBY3RpdmUnLCBjb21wdXRlZEZuLmlzQWN0aXZlKTtcbmtvLmV4cG9ydFByb3BlcnR5KGNvbXB1dGVkRm4sICdnZXREZXBlbmRlbmNpZXNDb3VudCcsIGNvbXB1dGVkRm4uZ2V0RGVwZW5kZW5jaWVzQ291bnQpO1xuXG5rby5wdXJlQ29tcHV0ZWQgPSBmdW5jdGlvbiAoZXZhbHVhdG9yRnVuY3Rpb25Pck9wdGlvbnMsIGV2YWx1YXRvckZ1bmN0aW9uVGFyZ2V0KSB7XG4gICAgaWYgKHR5cGVvZiBldmFsdWF0b3JGdW5jdGlvbk9yT3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4ga28uY29tcHV0ZWQoZXZhbHVhdG9yRnVuY3Rpb25Pck9wdGlvbnMsIGV2YWx1YXRvckZ1bmN0aW9uVGFyZ2V0LCB7J3B1cmUnOnRydWV9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBldmFsdWF0b3JGdW5jdGlvbk9yT3B0aW9ucyA9IGtvLnV0aWxzLmV4dGVuZCh7fSwgZXZhbHVhdG9yRnVuY3Rpb25Pck9wdGlvbnMpOyAgIC8vIG1ha2UgYSBjb3B5IG9mIHRoZSBwYXJhbWV0ZXIgb2JqZWN0XG4gICAgICAgIGV2YWx1YXRvckZ1bmN0aW9uT3JPcHRpb25zWydwdXJlJ10gPSB0cnVlO1xuICAgICAgICByZXR1cm4ga28uY29tcHV0ZWQoZXZhbHVhdG9yRnVuY3Rpb25Pck9wdGlvbnMsIGV2YWx1YXRvckZ1bmN0aW9uVGFyZ2V0KTtcbiAgICB9XG59XG5rby5leHBvcnRTeW1ib2woJ3B1cmVDb21wdXRlZCcsIGtvLnB1cmVDb21wdXRlZCk7XG5cbihmdW5jdGlvbigpIHtcbiAgICB2YXIgbWF4TmVzdGVkT2JzZXJ2YWJsZURlcHRoID0gMTA7IC8vIEVzY2FwZSB0aGUgKHVubGlrZWx5KSBwYXRoYWxvZ2ljYWwgY2FzZSB3aGVyZSBhbiBvYnNlcnZhYmxlJ3MgY3VycmVudCB2YWx1ZSBpcyBpdHNlbGYgKG9yIHNpbWlsYXIgcmVmZXJlbmNlIGN5Y2xlKVxuXG4gICAga28udG9KUyA9IGZ1bmN0aW9uKHJvb3RPYmplY3QpIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIldoZW4gY2FsbGluZyBrby50b0pTLCBwYXNzIHRoZSBvYmplY3QgeW91IHdhbnQgdG8gY29udmVydC5cIik7XG5cbiAgICAgICAgLy8gV2UganVzdCB1bndyYXAgZXZlcnl0aGluZyBhdCBldmVyeSBsZXZlbCBpbiB0aGUgb2JqZWN0IGdyYXBoXG4gICAgICAgIHJldHVybiBtYXBKc09iamVjdEdyYXBoKHJvb3RPYmplY3QsIGZ1bmN0aW9uKHZhbHVlVG9NYXApIHtcbiAgICAgICAgICAgIC8vIExvb3AgYmVjYXVzZSBhbiBvYnNlcnZhYmxlJ3MgdmFsdWUgbWlnaHQgaW4gdHVybiBiZSBhbm90aGVyIG9ic2VydmFibGUgd3JhcHBlclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGtvLmlzT2JzZXJ2YWJsZSh2YWx1ZVRvTWFwKSAmJiAoaSA8IG1heE5lc3RlZE9ic2VydmFibGVEZXB0aCk7IGkrKylcbiAgICAgICAgICAgICAgICB2YWx1ZVRvTWFwID0gdmFsdWVUb01hcCgpO1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlVG9NYXA7XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBrby50b0pTT04gPSBmdW5jdGlvbihyb290T2JqZWN0LCByZXBsYWNlciwgc3BhY2UpIHsgICAgIC8vIHJlcGxhY2VyIGFuZCBzcGFjZSBhcmUgb3B0aW9uYWxcbiAgICAgICAgdmFyIHBsYWluSmF2YVNjcmlwdE9iamVjdCA9IGtvLnRvSlMocm9vdE9iamVjdCk7XG4gICAgICAgIHJldHVybiBrby51dGlscy5zdHJpbmdpZnlKc29uKHBsYWluSmF2YVNjcmlwdE9iamVjdCwgcmVwbGFjZXIsIHNwYWNlKTtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gbWFwSnNPYmplY3RHcmFwaChyb290T2JqZWN0LCBtYXBJbnB1dENhbGxiYWNrLCB2aXNpdGVkT2JqZWN0cykge1xuICAgICAgICB2aXNpdGVkT2JqZWN0cyA9IHZpc2l0ZWRPYmplY3RzIHx8IG5ldyBvYmplY3RMb29rdXAoKTtcblxuICAgICAgICByb290T2JqZWN0ID0gbWFwSW5wdXRDYWxsYmFjayhyb290T2JqZWN0KTtcbiAgICAgICAgdmFyIGNhbkhhdmVQcm9wZXJ0aWVzID0gKHR5cGVvZiByb290T2JqZWN0ID09IFwib2JqZWN0XCIpICYmIChyb290T2JqZWN0ICE9PSBudWxsKSAmJiAocm9vdE9iamVjdCAhPT0gdW5kZWZpbmVkKSAmJiAoIShyb290T2JqZWN0IGluc3RhbmNlb2YgUmVnRXhwKSkgJiYgKCEocm9vdE9iamVjdCBpbnN0YW5jZW9mIERhdGUpKSAmJiAoIShyb290T2JqZWN0IGluc3RhbmNlb2YgU3RyaW5nKSkgJiYgKCEocm9vdE9iamVjdCBpbnN0YW5jZW9mIE51bWJlcikpICYmICghKHJvb3RPYmplY3QgaW5zdGFuY2VvZiBCb29sZWFuKSk7XG4gICAgICAgIGlmICghY2FuSGF2ZVByb3BlcnRpZXMpXG4gICAgICAgICAgICByZXR1cm4gcm9vdE9iamVjdDtcblxuICAgICAgICB2YXIgb3V0cHV0UHJvcGVydGllcyA9IHJvb3RPYmplY3QgaW5zdGFuY2VvZiBBcnJheSA/IFtdIDoge307XG4gICAgICAgIHZpc2l0ZWRPYmplY3RzLnNhdmUocm9vdE9iamVjdCwgb3V0cHV0UHJvcGVydGllcyk7XG5cbiAgICAgICAgdmlzaXRQcm9wZXJ0aWVzT3JBcnJheUVudHJpZXMocm9vdE9iamVjdCwgZnVuY3Rpb24oaW5kZXhlcikge1xuICAgICAgICAgICAgdmFyIHByb3BlcnR5VmFsdWUgPSBtYXBJbnB1dENhbGxiYWNrKHJvb3RPYmplY3RbaW5kZXhlcl0pO1xuXG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGVvZiBwcm9wZXJ0eVZhbHVlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgICAgICAgICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICAgICAgICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICAgICAgICAgIGNhc2UgXCJmdW5jdGlvblwiOlxuICAgICAgICAgICAgICAgICAgICBvdXRwdXRQcm9wZXJ0aWVzW2luZGV4ZXJdID0gcHJvcGVydHlWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIm9iamVjdFwiOlxuICAgICAgICAgICAgICAgIGNhc2UgXCJ1bmRlZmluZWRcIjpcbiAgICAgICAgICAgICAgICAgICAgdmFyIHByZXZpb3VzbHlNYXBwZWRWYWx1ZSA9IHZpc2l0ZWRPYmplY3RzLmdldChwcm9wZXJ0eVZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0UHJvcGVydGllc1tpbmRleGVyXSA9IChwcmV2aW91c2x5TWFwcGVkVmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgICAgID8gcHJldmlvdXNseU1hcHBlZFZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICA6IG1hcEpzT2JqZWN0R3JhcGgocHJvcGVydHlWYWx1ZSwgbWFwSW5wdXRDYWxsYmFjaywgdmlzaXRlZE9iamVjdHMpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIG91dHB1dFByb3BlcnRpZXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdmlzaXRQcm9wZXJ0aWVzT3JBcnJheUVudHJpZXMocm9vdE9iamVjdCwgdmlzaXRvckNhbGxiYWNrKSB7XG4gICAgICAgIGlmIChyb290T2JqZWN0IGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcm9vdE9iamVjdC5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICB2aXNpdG9yQ2FsbGJhY2soaSk7XG5cbiAgICAgICAgICAgIC8vIEZvciBhcnJheXMsIGFsc28gcmVzcGVjdCB0b0pTT04gcHJvcGVydHkgZm9yIGN1c3RvbSBtYXBwaW5ncyAoZml4ZXMgIzI3OClcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygcm9vdE9iamVjdFsndG9KU09OJ10gPT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgICAgICB2aXNpdG9yQ2FsbGJhY2soJ3RvSlNPTicpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yICh2YXIgcHJvcGVydHlOYW1lIGluIHJvb3RPYmplY3QpIHtcbiAgICAgICAgICAgICAgICB2aXNpdG9yQ2FsbGJhY2socHJvcGVydHlOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBmdW5jdGlvbiBvYmplY3RMb29rdXAoKSB7XG4gICAgICAgIHRoaXMua2V5cyA9IFtdO1xuICAgICAgICB0aGlzLnZhbHVlcyA9IFtdO1xuICAgIH07XG5cbiAgICBvYmplY3RMb29rdXAucHJvdG90eXBlID0ge1xuICAgICAgICBjb25zdHJ1Y3Rvcjogb2JqZWN0TG9va3VwLFxuICAgICAgICBzYXZlOiBmdW5jdGlvbihrZXksIHZhbHVlKSB7XG4gICAgICAgICAgICB2YXIgZXhpc3RpbmdJbmRleCA9IGtvLnV0aWxzLmFycmF5SW5kZXhPZih0aGlzLmtleXMsIGtleSk7XG4gICAgICAgICAgICBpZiAoZXhpc3RpbmdJbmRleCA+PSAwKVxuICAgICAgICAgICAgICAgIHRoaXMudmFsdWVzW2V4aXN0aW5nSW5kZXhdID0gdmFsdWU7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmtleXMucHVzaChrZXkpO1xuICAgICAgICAgICAgICAgIHRoaXMudmFsdWVzLnB1c2godmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uKGtleSkge1xuICAgICAgICAgICAgdmFyIGV4aXN0aW5nSW5kZXggPSBrby51dGlscy5hcnJheUluZGV4T2YodGhpcy5rZXlzLCBrZXkpO1xuICAgICAgICAgICAgcmV0dXJuIChleGlzdGluZ0luZGV4ID49IDApID8gdGhpcy52YWx1ZXNbZXhpc3RpbmdJbmRleF0gOiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9O1xufSkoKTtcblxua28uZXhwb3J0U3ltYm9sKCd0b0pTJywga28udG9KUyk7XG5rby5leHBvcnRTeW1ib2woJ3RvSlNPTicsIGtvLnRvSlNPTik7XG4oZnVuY3Rpb24gKCkge1xuICAgIHZhciBoYXNEb21EYXRhRXhwYW5kb1Byb3BlcnR5ID0gJ19fa29fX2hhc0RvbURhdGFPcHRpb25WYWx1ZV9fJztcblxuICAgIC8vIE5vcm1hbGx5LCBTRUxFQ1QgZWxlbWVudHMgYW5kIHRoZWlyIE9QVElPTnMgY2FuIG9ubHkgdGFrZSB2YWx1ZSBvZiB0eXBlICdzdHJpbmcnIChiZWNhdXNlIHRoZSB2YWx1ZXNcbiAgICAvLyBhcmUgc3RvcmVkIG9uIERPTSBhdHRyaWJ1dGVzKS4ga28uc2VsZWN0RXh0ZW5zaW9ucyBwcm92aWRlcyBhIHdheSBmb3IgU0VMRUNUcy9PUFRJT05zIHRvIGhhdmUgdmFsdWVzXG4gICAgLy8gdGhhdCBhcmUgYXJiaXRyYXJ5IG9iamVjdHMuIFRoaXMgaXMgdmVyeSBjb252ZW5pZW50IHdoZW4gaW1wbGVtZW50aW5nIHRoaW5ncyBsaWtlIGNhc2NhZGluZyBkcm9wZG93bnMuXG4gICAga28uc2VsZWN0RXh0ZW5zaW9ucyA9IHtcbiAgICAgICAgcmVhZFZhbHVlIDogZnVuY3Rpb24oZWxlbWVudCkge1xuICAgICAgICAgICAgc3dpdGNoIChrby51dGlscy50YWdOYW1lTG93ZXIoZWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdvcHRpb24nOlxuICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudFtoYXNEb21EYXRhRXhwYW5kb1Byb3BlcnR5XSA9PT0gdHJ1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBrby51dGlscy5kb21EYXRhLmdldChlbGVtZW50LCBrby5iaW5kaW5nSGFuZGxlcnMub3B0aW9ucy5vcHRpb25WYWx1ZURvbURhdGFLZXkpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ga28udXRpbHMuaWVWZXJzaW9uIDw9IDdcbiAgICAgICAgICAgICAgICAgICAgICAgID8gKGVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZSgndmFsdWUnKSAmJiBlbGVtZW50LmdldEF0dHJpYnV0ZU5vZGUoJ3ZhbHVlJykuc3BlY2lmaWVkID8gZWxlbWVudC52YWx1ZSA6IGVsZW1lbnQudGV4dClcbiAgICAgICAgICAgICAgICAgICAgICAgIDogZWxlbWVudC52YWx1ZTtcbiAgICAgICAgICAgICAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudC5zZWxlY3RlZEluZGV4ID49IDAgPyBrby5zZWxlY3RFeHRlbnNpb25zLnJlYWRWYWx1ZShlbGVtZW50Lm9wdGlvbnNbZWxlbWVudC5zZWxlY3RlZEluZGV4XSkgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgd3JpdGVWYWx1ZTogZnVuY3Rpb24oZWxlbWVudCwgdmFsdWUsIGFsbG93VW5zZXQpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoa28udXRpbHMudGFnTmFtZUxvd2VyKGVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnb3B0aW9uJzpcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoKHR5cGVvZiB2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtvLnV0aWxzLmRvbURhdGEuc2V0KGVsZW1lbnQsIGtvLmJpbmRpbmdIYW5kbGVycy5vcHRpb25zLm9wdGlvblZhbHVlRG9tRGF0YUtleSwgdW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzRG9tRGF0YUV4cGFuZG9Qcm9wZXJ0eSBpbiBlbGVtZW50KSB7IC8vIElFIDw9IDggdGhyb3dzIGVycm9ycyBpZiB5b3UgZGVsZXRlIG5vbi1leGlzdGVudCBwcm9wZXJ0aWVzIGZyb20gYSBET00gbm9kZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgZWxlbWVudFtoYXNEb21EYXRhRXhwYW5kb1Byb3BlcnR5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC52YWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdG9yZSBhcmJpdHJhcnkgb2JqZWN0IHVzaW5nIERvbURhdGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrby51dGlscy5kb21EYXRhLnNldChlbGVtZW50LCBrby5iaW5kaW5nSGFuZGxlcnMub3B0aW9ucy5vcHRpb25WYWx1ZURvbURhdGFLZXksIHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50W2hhc0RvbURhdGFFeHBhbmRvUHJvcGVydHldID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNwZWNpYWwgdHJlYXRtZW50IG9mIG51bWJlcnMgaXMganVzdCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4gS08gMS4yLjEgd3JvdGUgbnVtZXJpY2FsIHZhbHVlcyB0byBlbGVtZW50LnZhbHVlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQudmFsdWUgPSB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgPyB2YWx1ZSA6IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSBcIlwiIHx8IHZhbHVlID09PSBudWxsKSAgICAgICAvLyBBIGJsYW5rIHN0cmluZyBvciBudWxsIHZhbHVlIHdpbGwgc2VsZWN0IHRoZSBjYXB0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNlbGVjdGlvbiA9IC0xO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbiA9IGVsZW1lbnQub3B0aW9ucy5sZW5ndGgsIG9wdGlvblZhbHVlOyBpIDwgbjsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25WYWx1ZSA9IGtvLnNlbGVjdEV4dGVuc2lvbnMucmVhZFZhbHVlKGVsZW1lbnQub3B0aW9uc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJbmNsdWRlIHNwZWNpYWwgY2hlY2sgdG8gaGFuZGxlIHNlbGVjdGluZyBhIGNhcHRpb24gd2l0aCBhIGJsYW5rIHN0cmluZyB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvblZhbHVlID09IHZhbHVlIHx8IChvcHRpb25WYWx1ZSA9PSBcIlwiICYmIHZhbHVlID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uID0gaTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoYWxsb3dVbnNldCB8fCBzZWxlY3Rpb24gPj0gMCB8fCAodmFsdWUgPT09IHVuZGVmaW5lZCAmJiBlbGVtZW50LnNpemUgPiAxKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5zZWxlY3RlZEluZGV4ID0gc2VsZWN0aW9uO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGlmICgodmFsdWUgPT09IG51bGwpIHx8ICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC52YWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG59KSgpO1xuXG5rby5leHBvcnRTeW1ib2woJ3NlbGVjdEV4dGVuc2lvbnMnLCBrby5zZWxlY3RFeHRlbnNpb25zKTtcbmtvLmV4cG9ydFN5bWJvbCgnc2VsZWN0RXh0ZW5zaW9ucy5yZWFkVmFsdWUnLCBrby5zZWxlY3RFeHRlbnNpb25zLnJlYWRWYWx1ZSk7XG5rby5leHBvcnRTeW1ib2woJ3NlbGVjdEV4dGVuc2lvbnMud3JpdGVWYWx1ZScsIGtvLnNlbGVjdEV4dGVuc2lvbnMud3JpdGVWYWx1ZSk7XG5rby5leHByZXNzaW9uUmV3cml0aW5nID0gKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgamF2YVNjcmlwdFJlc2VydmVkV29yZHMgPSBbXCJ0cnVlXCIsIFwiZmFsc2VcIiwgXCJudWxsXCIsIFwidW5kZWZpbmVkXCJdO1xuXG4gICAgLy8gTWF0Y2hlcyBzb21ldGhpbmcgdGhhdCBjYW4gYmUgYXNzaWduZWQgdG8tLWVpdGhlciBhbiBpc29sYXRlZCBpZGVudGlmaWVyIG9yIHNvbWV0aGluZyBlbmRpbmcgd2l0aCBhIHByb3BlcnR5IGFjY2Vzc29yXG4gICAgLy8gVGhpcyBpcyBkZXNpZ25lZCB0byBiZSBzaW1wbGUgYW5kIGF2b2lkIGZhbHNlIG5lZ2F0aXZlcywgYnV0IGNvdWxkIHByb2R1Y2UgZmFsc2UgcG9zaXRpdmVzIChlLmcuLCBhK2IuYykuXG4gICAgLy8gVGhpcyBhbHNvIHdpbGwgbm90IHByb3Blcmx5IGhhbmRsZSBuZXN0ZWQgYnJhY2tldHMgKGUuZy4sIG9iajFbb2JqMlsncHJvcCddXTsgc2VlICM5MTEpLlxuICAgIHZhciBqYXZhU2NyaXB0QXNzaWdubWVudFRhcmdldCA9IC9eKD86WyRfYS16XVskXFx3XSp8KC4rKShcXC5cXHMqWyRfYS16XVskXFx3XSp8XFxbLitcXF0pKSQvaTtcblxuICAgIGZ1bmN0aW9uIGdldFdyaXRlYWJsZVZhbHVlKGV4cHJlc3Npb24pIHtcbiAgICAgICAgaWYgKGtvLnV0aWxzLmFycmF5SW5kZXhPZihqYXZhU2NyaXB0UmVzZXJ2ZWRXb3JkcywgZXhwcmVzc2lvbikgPj0gMClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgdmFyIG1hdGNoID0gZXhwcmVzc2lvbi5tYXRjaChqYXZhU2NyaXB0QXNzaWdubWVudFRhcmdldCk7XG4gICAgICAgIHJldHVybiBtYXRjaCA9PT0gbnVsbCA/IGZhbHNlIDogbWF0Y2hbMV0gPyAoJ09iamVjdCgnICsgbWF0Y2hbMV0gKyAnKScgKyBtYXRjaFsyXSkgOiBleHByZXNzaW9uO1xuICAgIH1cblxuICAgIC8vIFRoZSBmb2xsb3dpbmcgcmVndWxhciBleHByZXNzaW9ucyB3aWxsIGJlIHVzZWQgdG8gc3BsaXQgYW4gb2JqZWN0LWxpdGVyYWwgc3RyaW5nIGludG8gdG9rZW5zXG5cbiAgICAgICAgLy8gVGhlc2UgdHdvIG1hdGNoIHN0cmluZ3MsIGVpdGhlciB3aXRoIGRvdWJsZSBxdW90ZXMgb3Igc2luZ2xlIHF1b3Rlc1xuICAgIHZhciBzdHJpbmdEb3VibGUgPSAnXCIoPzpbXlwiXFxcXFxcXFxdfFxcXFxcXFxcLikqXCInLFxuICAgICAgICBzdHJpbmdTaW5nbGUgPSBcIicoPzpbXidcXFxcXFxcXF18XFxcXFxcXFwuKSonXCIsXG4gICAgICAgIC8vIE1hdGNoZXMgYSByZWd1bGFyIGV4cHJlc3Npb24gKHRleHQgZW5jbG9zZWQgYnkgc2xhc2hlcyksIGJ1dCB3aWxsIGFsc28gbWF0Y2ggc2V0cyBvZiBkaXZpc2lvbnNcbiAgICAgICAgLy8gYXMgYSByZWd1bGFyIGV4cHJlc3Npb24gKHRoaXMgaXMgaGFuZGxlZCBieSB0aGUgcGFyc2luZyBsb29wIGJlbG93KS5cbiAgICAgICAgc3RyaW5nUmVnZXhwID0gJy8oPzpbXi9cXFxcXFxcXF18XFxcXFxcXFwuKSovXFx3KicsXG4gICAgICAgIC8vIFRoZXNlIGNoYXJhY3RlcnMgaGF2ZSBzcGVjaWFsIG1lYW5pbmcgdG8gdGhlIHBhcnNlciBhbmQgbXVzdCBub3QgYXBwZWFyIGluIHRoZSBtaWRkbGUgb2YgYVxuICAgICAgICAvLyB0b2tlbiwgZXhjZXB0IGFzIHBhcnQgb2YgYSBzdHJpbmcuXG4gICAgICAgIHNwZWNpYWxzID0gJyxcIlxcJ3t9KCkvOltcXFxcXScsXG4gICAgICAgIC8vIE1hdGNoIHRleHQgKGF0IGxlYXN0IHR3byBjaGFyYWN0ZXJzKSB0aGF0IGRvZXMgbm90IGNvbnRhaW4gYW55IG9mIHRoZSBhYm92ZSBzcGVjaWFsIGNoYXJhY3RlcnMsXG4gICAgICAgIC8vIGFsdGhvdWdoIHNvbWUgb2YgdGhlIHNwZWNpYWwgY2hhcmFjdGVycyBhcmUgYWxsb3dlZCB0byBzdGFydCBpdCAoYWxsIGJ1dCB0aGUgY29sb24gYW5kIGNvbW1hKS5cbiAgICAgICAgLy8gVGhlIHRleHQgY2FuIGNvbnRhaW4gc3BhY2VzLCBidXQgbGVhZGluZyBvciB0cmFpbGluZyBzcGFjZXMgYXJlIHNraXBwZWQuXG4gICAgICAgIGV2ZXJ5VGhpbmdFbHNlID0gJ1teXFxcXHM6LC9dW14nICsgc3BlY2lhbHMgKyAnXSpbXlxcXFxzJyArIHNwZWNpYWxzICsgJ10nLFxuICAgICAgICAvLyBNYXRjaCBhbnkgbm9uLXNwYWNlIGNoYXJhY3RlciBub3QgbWF0Y2hlZCBhbHJlYWR5LiBUaGlzIHdpbGwgbWF0Y2ggY29sb25zIGFuZCBjb21tYXMsIHNpbmNlIHRoZXkncmVcbiAgICAgICAgLy8gbm90IG1hdGNoZWQgYnkgXCJldmVyeVRoaW5nRWxzZVwiLCBidXQgd2lsbCBhbHNvIG1hdGNoIGFueSBvdGhlciBzaW5nbGUgY2hhcmFjdGVyIHRoYXQgd2Fzbid0IGFscmVhZHlcbiAgICAgICAgLy8gbWF0Y2hlZCAoZm9yIGV4YW1wbGU6IGluIFwiYTogMSwgYjogMlwiLCBlYWNoIG9mIHRoZSBub24tc3BhY2UgY2hhcmFjdGVycyB3aWxsIGJlIG1hdGNoZWQgYnkgb25lTm90U3BhY2UpLlxuICAgICAgICBvbmVOb3RTcGFjZSA9ICdbXlxcXFxzXScsXG5cbiAgICAgICAgLy8gQ3JlYXRlIHRoZSBhY3R1YWwgcmVndWxhciBleHByZXNzaW9uIGJ5IG9yLWluZyB0aGUgYWJvdmUgc3RyaW5ncy4gVGhlIG9yZGVyIGlzIGltcG9ydGFudC5cbiAgICAgICAgYmluZGluZ1Rva2VuID0gUmVnRXhwKHN0cmluZ0RvdWJsZSArICd8JyArIHN0cmluZ1NpbmdsZSArICd8JyArIHN0cmluZ1JlZ2V4cCArICd8JyArIGV2ZXJ5VGhpbmdFbHNlICsgJ3wnICsgb25lTm90U3BhY2UsICdnJyksXG5cbiAgICAgICAgLy8gTWF0Y2ggZW5kIG9mIHByZXZpb3VzIHRva2VuIHRvIGRldGVybWluZSB3aGV0aGVyIGEgc2xhc2ggaXMgYSBkaXZpc2lvbiBvciByZWdleC5cbiAgICAgICAgZGl2aXNpb25Mb29rQmVoaW5kID0gL1tcXF0pXCInQS1aYS16MC05XyRdKyQvLFxuICAgICAgICBrZXl3b3JkUmVnZXhMb29rQmVoaW5kID0geydpbic6MSwncmV0dXJuJzoxLCd0eXBlb2YnOjF9O1xuXG4gICAgZnVuY3Rpb24gcGFyc2VPYmplY3RMaXRlcmFsKG9iamVjdExpdGVyYWxTdHJpbmcpIHtcbiAgICAgICAgLy8gVHJpbSBsZWFkaW5nIGFuZCB0cmFpbGluZyBzcGFjZXMgZnJvbSB0aGUgc3RyaW5nXG4gICAgICAgIHZhciBzdHIgPSBrby51dGlscy5zdHJpbmdUcmltKG9iamVjdExpdGVyYWxTdHJpbmcpO1xuXG4gICAgICAgIC8vIFRyaW0gYnJhY2VzICd7JyBzdXJyb3VuZGluZyB0aGUgd2hvbGUgb2JqZWN0IGxpdGVyYWxcbiAgICAgICAgaWYgKHN0ci5jaGFyQ29kZUF0KDApID09PSAxMjMpIHN0ciA9IHN0ci5zbGljZSgxLCAtMSk7XG5cbiAgICAgICAgLy8gU3BsaXQgaW50byB0b2tlbnNcbiAgICAgICAgdmFyIHJlc3VsdCA9IFtdLCB0b2tzID0gc3RyLm1hdGNoKGJpbmRpbmdUb2tlbiksIGtleSwgdmFsdWVzID0gW10sIGRlcHRoID0gMDtcblxuICAgICAgICBpZiAodG9rcykge1xuICAgICAgICAgICAgLy8gQXBwZW5kIGEgY29tbWEgc28gdGhhdCB3ZSBkb24ndCBuZWVkIGEgc2VwYXJhdGUgY29kZSBibG9jayB0byBkZWFsIHdpdGggdGhlIGxhc3QgaXRlbVxuICAgICAgICAgICAgdG9rcy5wdXNoKCcsJyk7XG5cbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCB0b2s7IHRvayA9IHRva3NbaV07ICsraSkge1xuICAgICAgICAgICAgICAgIHZhciBjID0gdG9rLmNoYXJDb2RlQXQoMCk7XG4gICAgICAgICAgICAgICAgLy8gQSBjb21tYSBzaWduYWxzIHRoZSBlbmQgb2YgYSBrZXkvdmFsdWUgcGFpciBpZiBkZXB0aCBpcyB6ZXJvXG4gICAgICAgICAgICAgICAgaWYgKGMgPT09IDQ0KSB7IC8vIFwiLFwiXG4gICAgICAgICAgICAgICAgICAgIGlmIChkZXB0aCA8PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgoa2V5ICYmIHZhbHVlcy5sZW5ndGgpID8ge2tleToga2V5LCB2YWx1ZTogdmFsdWVzLmpvaW4oJycpfSA6IHsndW5rbm93bic6IGtleSB8fCB2YWx1ZXMuam9pbignJyl9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IGRlcHRoID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBTaW1wbHkgc2tpcCB0aGUgY29sb24gdGhhdCBzZXBhcmF0ZXMgdGhlIG5hbWUgYW5kIHZhbHVlXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjID09PSA1OCkgeyAvLyBcIjpcIlxuICAgICAgICAgICAgICAgICAgICBpZiAoIWRlcHRoICYmICFrZXkgJiYgdmFsdWVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gdmFsdWVzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBBIHNldCBvZiBzbGFzaGVzIGlzIGluaXRpYWxseSBtYXRjaGVkIGFzIGEgcmVndWxhciBleHByZXNzaW9uLCBidXQgY291bGQgYmUgZGl2aXNpb25cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPT09IDQ3ICYmIGkgJiYgdG9rLmxlbmd0aCA+IDEpIHsgIC8vIFwiL1wiXG4gICAgICAgICAgICAgICAgICAgIC8vIExvb2sgYXQgdGhlIGVuZCBvZiB0aGUgcHJldmlvdXMgdG9rZW4gdG8gZGV0ZXJtaW5lIGlmIHRoZSBzbGFzaCBpcyBhY3R1YWxseSBkaXZpc2lvblxuICAgICAgICAgICAgICAgICAgICB2YXIgbWF0Y2ggPSB0b2tzW2ktMV0ubWF0Y2goZGl2aXNpb25Mb29rQmVoaW5kKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoICYmICFrZXl3b3JkUmVnZXhMb29rQmVoaW5kW21hdGNoWzBdXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHNsYXNoIGlzIGFjdHVhbGx5IGEgZGl2aXNpb24gcHVuY3R1YXRvcjsgcmUtcGFyc2UgdGhlIHJlbWFpbmRlciBvZiB0aGUgc3RyaW5nIChub3QgaW5jbHVkaW5nIHRoZSBzbGFzaClcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ciA9IHN0ci5zdWJzdHIoc3RyLmluZGV4T2YodG9rKSArIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9rcyA9IHN0ci5tYXRjaChiaW5kaW5nVG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9rcy5wdXNoKCcsJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpID0gLTE7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDb250aW51ZSB3aXRoIGp1c3QgdGhlIHNsYXNoXG4gICAgICAgICAgICAgICAgICAgICAgICB0b2sgPSAnLyc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBJbmNyZW1lbnQgZGVwdGggZm9yIHBhcmVudGhlc2VzLCBicmFjZXMsIGFuZCBicmFja2V0cyBzbyB0aGF0IGludGVyaW9yIGNvbW1hcyBhcmUgaWdub3JlZFxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PT0gNDAgfHwgYyA9PT0gMTIzIHx8IGMgPT09IDkxKSB7IC8vICcoJywgJ3snLCAnWydcbiAgICAgICAgICAgICAgICAgICAgKytkZXB0aDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPT09IDQxIHx8IGMgPT09IDEyNSB8fCBjID09PSA5MykgeyAvLyAnKScsICd9JywgJ10nXG4gICAgICAgICAgICAgICAgICAgIC0tZGVwdGg7XG4gICAgICAgICAgICAgICAgLy8gVGhlIGtleSB3aWxsIGJlIHRoZSBmaXJzdCB0b2tlbjsgaWYgaXQncyBhIHN0cmluZywgdHJpbSB0aGUgcXVvdGVzXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgha2V5ICYmICF2YWx1ZXMubGVuZ3RoICYmIChjID09PSAzNCB8fCBjID09PSAzOSkpIHsgLy8gJ1wiJywgXCInXCJcbiAgICAgICAgICAgICAgICAgICAgdG9rID0gdG9rLnNsaWNlKDEsIC0xKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFsdWVzLnB1c2godG9rKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8vIFR3by13YXkgYmluZGluZ3MgaW5jbHVkZSBhIHdyaXRlIGZ1bmN0aW9uIHRoYXQgYWxsb3cgdGhlIGhhbmRsZXIgdG8gdXBkYXRlIHRoZSB2YWx1ZSBldmVuIGlmIGl0J3Mgbm90IGFuIG9ic2VydmFibGUuXG4gICAgdmFyIHR3b1dheUJpbmRpbmdzID0ge307XG5cbiAgICBmdW5jdGlvbiBwcmVQcm9jZXNzQmluZGluZ3MoYmluZGluZ3NTdHJpbmdPcktleVZhbHVlQXJyYXksIGJpbmRpbmdPcHRpb25zKSB7XG4gICAgICAgIGJpbmRpbmdPcHRpb25zID0gYmluZGluZ09wdGlvbnMgfHwge307XG5cbiAgICAgICAgZnVuY3Rpb24gcHJvY2Vzc0tleVZhbHVlKGtleSwgdmFsKSB7XG4gICAgICAgICAgICB2YXIgd3JpdGFibGVWYWw7XG4gICAgICAgICAgICBmdW5jdGlvbiBjYWxsUHJlcHJvY2Vzc0hvb2sob2JqKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChvYmogJiYgb2JqWydwcmVwcm9jZXNzJ10pID8gKHZhbCA9IG9ialsncHJlcHJvY2VzcyddKHZhbCwga2V5LCBwcm9jZXNzS2V5VmFsdWUpKSA6IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWJpbmRpbmdQYXJhbXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWNhbGxQcmVwcm9jZXNzSG9vayhrb1snZ2V0QmluZGluZ0hhbmRsZXInXShrZXkpKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgICAgICAgICAgaWYgKHR3b1dheUJpbmRpbmdzW2tleV0gJiYgKHdyaXRhYmxlVmFsID0gZ2V0V3JpdGVhYmxlVmFsdWUodmFsKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRm9yIHR3by13YXkgYmluZGluZ3MsIHByb3ZpZGUgYSB3cml0ZSBtZXRob2QgaW4gY2FzZSB0aGUgdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgLy8gaXNuJ3QgYSB3cml0YWJsZSBvYnNlcnZhYmxlLlxuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eUFjY2Vzc29yUmVzdWx0U3RyaW5ncy5wdXNoKFwiJ1wiICsga2V5ICsgXCInOmZ1bmN0aW9uKF96KXtcIiArIHdyaXRhYmxlVmFsICsgXCI9X3p9XCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFZhbHVlcyBhcmUgd3JhcHBlZCBpbiBhIGZ1bmN0aW9uIHNvIHRoYXQgZWFjaCB2YWx1ZSBjYW4gYmUgYWNjZXNzZWQgaW5kZXBlbmRlbnRseVxuICAgICAgICAgICAgaWYgKG1ha2VWYWx1ZUFjY2Vzc29ycykge1xuICAgICAgICAgICAgICAgIHZhbCA9ICdmdW5jdGlvbigpe3JldHVybiAnICsgdmFsICsgJyB9JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdFN0cmluZ3MucHVzaChcIidcIiArIGtleSArIFwiJzpcIiArIHZhbCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgcmVzdWx0U3RyaW5ncyA9IFtdLFxuICAgICAgICAgICAgcHJvcGVydHlBY2Nlc3NvclJlc3VsdFN0cmluZ3MgPSBbXSxcbiAgICAgICAgICAgIG1ha2VWYWx1ZUFjY2Vzc29ycyA9IGJpbmRpbmdPcHRpb25zWyd2YWx1ZUFjY2Vzc29ycyddLFxuICAgICAgICAgICAgYmluZGluZ1BhcmFtcyA9IGJpbmRpbmdPcHRpb25zWydiaW5kaW5nUGFyYW1zJ10sXG4gICAgICAgICAgICBrZXlWYWx1ZUFycmF5ID0gdHlwZW9mIGJpbmRpbmdzU3RyaW5nT3JLZXlWYWx1ZUFycmF5ID09PSBcInN0cmluZ1wiID9cbiAgICAgICAgICAgICAgICBwYXJzZU9iamVjdExpdGVyYWwoYmluZGluZ3NTdHJpbmdPcktleVZhbHVlQXJyYXkpIDogYmluZGluZ3NTdHJpbmdPcktleVZhbHVlQXJyYXk7XG5cbiAgICAgICAga28udXRpbHMuYXJyYXlGb3JFYWNoKGtleVZhbHVlQXJyYXksIGZ1bmN0aW9uKGtleVZhbHVlKSB7XG4gICAgICAgICAgICBwcm9jZXNzS2V5VmFsdWUoa2V5VmFsdWUua2V5IHx8IGtleVZhbHVlWyd1bmtub3duJ10sIGtleVZhbHVlLnZhbHVlKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHByb3BlcnR5QWNjZXNzb3JSZXN1bHRTdHJpbmdzLmxlbmd0aClcbiAgICAgICAgICAgIHByb2Nlc3NLZXlWYWx1ZSgnX2tvX3Byb3BlcnR5X3dyaXRlcnMnLCBcIntcIiArIHByb3BlcnR5QWNjZXNzb3JSZXN1bHRTdHJpbmdzLmpvaW4oXCIsXCIpICsgXCIgfVwiKTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0U3RyaW5ncy5qb2luKFwiLFwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBiaW5kaW5nUmV3cml0ZVZhbGlkYXRvcnM6IFtdLFxuXG4gICAgICAgIHR3b1dheUJpbmRpbmdzOiB0d29XYXlCaW5kaW5ncyxcblxuICAgICAgICBwYXJzZU9iamVjdExpdGVyYWw6IHBhcnNlT2JqZWN0TGl0ZXJhbCxcblxuICAgICAgICBwcmVQcm9jZXNzQmluZGluZ3M6IHByZVByb2Nlc3NCaW5kaW5ncyxcblxuICAgICAgICBrZXlWYWx1ZUFycmF5Q29udGFpbnNLZXk6IGZ1bmN0aW9uKGtleVZhbHVlQXJyYXksIGtleSkge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlWYWx1ZUFycmF5Lmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgICAgIGlmIChrZXlWYWx1ZUFycmF5W2ldWydrZXknXSA9PSBrZXkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8vIEludGVybmFsLCBwcml2YXRlIEtPIHV0aWxpdHkgZm9yIHVwZGF0aW5nIG1vZGVsIHByb3BlcnRpZXMgZnJvbSB3aXRoaW4gYmluZGluZ3NcbiAgICAgICAgLy8gcHJvcGVydHk6ICAgICAgICAgICAgSWYgdGhlIHByb3BlcnR5IGJlaW5nIHVwZGF0ZWQgaXMgKG9yIG1pZ2h0IGJlKSBhbiBvYnNlcnZhYmxlLCBwYXNzIGl0IGhlcmVcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgSWYgaXQgdHVybnMgb3V0IHRvIGJlIGEgd3JpdGFibGUgb2JzZXJ2YWJsZSwgaXQgd2lsbCBiZSB3cml0dGVuIHRvIGRpcmVjdGx5XG4gICAgICAgIC8vIGFsbEJpbmRpbmdzOiAgICAgICAgIEFuIG9iamVjdCB3aXRoIGEgZ2V0IG1ldGhvZCB0byByZXRyaWV2ZSBiaW5kaW5ncyBpbiB0aGUgY3VycmVudCBleGVjdXRpb24gY29udGV4dC5cbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgVGhpcyB3aWxsIGJlIHNlYXJjaGVkIGZvciBhICdfa29fcHJvcGVydHlfd3JpdGVycycgcHJvcGVydHkgaW4gY2FzZSB5b3UncmUgd3JpdGluZyB0byBhIG5vbi1vYnNlcnZhYmxlXG4gICAgICAgIC8vIGtleTogICAgICAgICAgICAgICAgIFRoZSBrZXkgaWRlbnRpZnlpbmcgdGhlIHByb3BlcnR5IHRvIGJlIHdyaXR0ZW4uIEV4YW1wbGU6IGZvciB7IGhhc0ZvY3VzOiBteVZhbHVlIH0sIHdyaXRlIHRvICdteVZhbHVlJyBieSBzcGVjaWZ5aW5nIHRoZSBrZXkgJ2hhc0ZvY3VzJ1xuICAgICAgICAvLyB2YWx1ZTogICAgICAgICAgICAgICBUaGUgdmFsdWUgdG8gYmUgd3JpdHRlblxuICAgICAgICAvLyBjaGVja0lmRGlmZmVyZW50OiAgICBJZiB0cnVlLCBhbmQgaWYgdGhlIHByb3BlcnR5IGJlaW5nIHdyaXR0ZW4gaXMgYSB3cml0YWJsZSBvYnNlcnZhYmxlLCB0aGUgdmFsdWUgd2lsbCBvbmx5IGJlIHdyaXR0ZW4gaWZcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgaXQgaXMgIT09IGV4aXN0aW5nIHZhbHVlIG9uIHRoYXQgd3JpdGFibGUgb2JzZXJ2YWJsZVxuICAgICAgICB3cml0ZVZhbHVlVG9Qcm9wZXJ0eTogZnVuY3Rpb24ocHJvcGVydHksIGFsbEJpbmRpbmdzLCBrZXksIHZhbHVlLCBjaGVja0lmRGlmZmVyZW50KSB7XG4gICAgICAgICAgICBpZiAoIXByb3BlcnR5IHx8ICFrby5pc09ic2VydmFibGUocHJvcGVydHkpKSB7XG4gICAgICAgICAgICAgICAgdmFyIHByb3BXcml0ZXJzID0gYWxsQmluZGluZ3MuZ2V0KCdfa29fcHJvcGVydHlfd3JpdGVycycpO1xuICAgICAgICAgICAgICAgIGlmIChwcm9wV3JpdGVycyAmJiBwcm9wV3JpdGVyc1trZXldKVxuICAgICAgICAgICAgICAgICAgICBwcm9wV3JpdGVyc1trZXldKHZhbHVlKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoa28uaXNXcml0ZWFibGVPYnNlcnZhYmxlKHByb3BlcnR5KSAmJiAoIWNoZWNrSWZEaWZmZXJlbnQgfHwgcHJvcGVydHkucGVlaygpICE9PSB2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eSh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xufSkoKTtcblxua28uZXhwb3J0U3ltYm9sKCdleHByZXNzaW9uUmV3cml0aW5nJywga28uZXhwcmVzc2lvblJld3JpdGluZyk7XG5rby5leHBvcnRTeW1ib2woJ2V4cHJlc3Npb25SZXdyaXRpbmcuYmluZGluZ1Jld3JpdGVWYWxpZGF0b3JzJywga28uZXhwcmVzc2lvblJld3JpdGluZy5iaW5kaW5nUmV3cml0ZVZhbGlkYXRvcnMpO1xua28uZXhwb3J0U3ltYm9sKCdleHByZXNzaW9uUmV3cml0aW5nLnBhcnNlT2JqZWN0TGl0ZXJhbCcsIGtvLmV4cHJlc3Npb25SZXdyaXRpbmcucGFyc2VPYmplY3RMaXRlcmFsKTtcbmtvLmV4cG9ydFN5bWJvbCgnZXhwcmVzc2lvblJld3JpdGluZy5wcmVQcm9jZXNzQmluZGluZ3MnLCBrby5leHByZXNzaW9uUmV3cml0aW5nLnByZVByb2Nlc3NCaW5kaW5ncyk7XG5cbi8vIE1ha2luZyBiaW5kaW5ncyBleHBsaWNpdGx5IGRlY2xhcmUgdGhlbXNlbHZlcyBhcyBcInR3byB3YXlcIiBpc24ndCBpZGVhbCBpbiB0aGUgbG9uZyB0ZXJtIChpdCB3b3VsZCBiZSBiZXR0ZXIgaWZcbi8vIGFsbCBiaW5kaW5ncyBjb3VsZCB1c2UgYW4gb2ZmaWNpYWwgJ3Byb3BlcnR5IHdyaXRlcicgQVBJIHdpdGhvdXQgbmVlZGluZyB0byBkZWNsYXJlIHRoYXQgdGhleSBtaWdodCkuIEhvd2V2ZXIsXG4vLyBzaW5jZSB0aGlzIGlzIG5vdCwgYW5kIGhhcyBuZXZlciBiZWVuLCBhIHB1YmxpYyBBUEkgKF9rb19wcm9wZXJ0eV93cml0ZXJzIHdhcyBuZXZlciBkb2N1bWVudGVkKSwgaXQncyBhY2NlcHRhYmxlXG4vLyBhcyBhbiBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBkZXRhaWwgaW4gdGhlIHNob3J0IHRlcm0uXG4vLyBGb3IgdGhvc2UgZGV2ZWxvcGVycyB3aG8gcmVseSBvbiBfa29fcHJvcGVydHlfd3JpdGVycyBpbiB0aGVpciBjdXN0b20gYmluZGluZ3MsIHdlIGV4cG9zZSBfdHdvV2F5QmluZGluZ3MgYXMgYW5cbi8vIHVuZG9jdW1lbnRlZCBmZWF0dXJlIHRoYXQgbWFrZXMgaXQgcmVsYXRpdmVseSBlYXN5IHRvIHVwZ3JhZGUgdG8gS08gMy4wLiBIb3dldmVyLCB0aGlzIGlzIHN0aWxsIG5vdCBhbiBvZmZpY2lhbFxuLy8gcHVibGljIEFQSSwgYW5kIHdlIHJlc2VydmUgdGhlIHJpZ2h0IHRvIHJlbW92ZSBpdCBhdCBhbnkgdGltZSBpZiB3ZSBjcmVhdGUgYSByZWFsIHB1YmxpYyBwcm9wZXJ0eSB3cml0ZXJzIEFQSS5cbmtvLmV4cG9ydFN5bWJvbCgnZXhwcmVzc2lvblJld3JpdGluZy5fdHdvV2F5QmluZGluZ3MnLCBrby5leHByZXNzaW9uUmV3cml0aW5nLnR3b1dheUJpbmRpbmdzKTtcblxuLy8gRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIGRlZmluZSB0aGUgZm9sbG93aW5nIGFsaWFzZXMuIChQcmV2aW91c2x5LCB0aGVzZSBmdW5jdGlvbiBuYW1lcyB3ZXJlIG1pc2xlYWRpbmcgYmVjYXVzZVxuLy8gdGhleSByZWZlcnJlZCB0byBKU09OIHNwZWNpZmljYWxseSwgZXZlbiB0aG91Z2ggdGhleSBhY3R1YWxseSB3b3JrIHdpdGggYXJiaXRyYXJ5IEphdmFTY3JpcHQgb2JqZWN0IGxpdGVyYWwgZXhwcmVzc2lvbnMuKVxua28uZXhwb3J0U3ltYm9sKCdqc29uRXhwcmVzc2lvblJld3JpdGluZycsIGtvLmV4cHJlc3Npb25SZXdyaXRpbmcpO1xua28uZXhwb3J0U3ltYm9sKCdqc29uRXhwcmVzc2lvblJld3JpdGluZy5pbnNlcnRQcm9wZXJ0eUFjY2Vzc29yc0ludG9Kc29uJywga28uZXhwcmVzc2lvblJld3JpdGluZy5wcmVQcm9jZXNzQmluZGluZ3MpO1xuKGZ1bmN0aW9uKCkge1xuICAgIC8vIFwiVmlydHVhbCBlbGVtZW50c1wiIGlzIGFuIGFic3RyYWN0aW9uIG9uIHRvcCBvZiB0aGUgdXN1YWwgRE9NIEFQSSB3aGljaCB1bmRlcnN0YW5kcyB0aGUgbm90aW9uIHRoYXQgY29tbWVudCBub2Rlc1xuICAgIC8vIG1heSBiZSB1c2VkIHRvIHJlcHJlc2VudCBoaWVyYXJjaHkgKGluIGFkZGl0aW9uIHRvIHRoZSBET00ncyBuYXR1cmFsIGhpZXJhcmNoeSkuXG4gICAgLy8gSWYgeW91IGNhbGwgdGhlIERPTS1tYW5pcHVsYXRpbmcgZnVuY3Rpb25zIG9uIGtvLnZpcnR1YWxFbGVtZW50cywgeW91IHdpbGwgYmUgYWJsZSB0byByZWFkIGFuZCB3cml0ZSB0aGUgc3RhdGVcbiAgICAvLyBvZiB0aGF0IHZpcnR1YWwgaGllcmFyY2h5XG4gICAgLy9cbiAgICAvLyBUaGUgcG9pbnQgb2YgYWxsIHRoaXMgaXMgdG8gc3VwcG9ydCBjb250YWluZXJsZXNzIHRlbXBsYXRlcyAoZS5nLiwgPCEtLSBrbyBmb3JlYWNoOnNvbWVDb2xsZWN0aW9uIC0tPmJsYWg8IS0tIC9rbyAtLT4pXG4gICAgLy8gd2l0aG91dCBoYXZpbmcgdG8gc2NhdHRlciBzcGVjaWFsIGNhc2VzIGFsbCBvdmVyIHRoZSBiaW5kaW5nIGFuZCB0ZW1wbGF0aW5nIGNvZGUuXG5cbiAgICAvLyBJRSA5IGNhbm5vdCByZWxpYWJseSByZWFkIHRoZSBcIm5vZGVWYWx1ZVwiIHByb3BlcnR5IG9mIGEgY29tbWVudCBub2RlIChzZWUgaHR0cHM6Ly9naXRodWIuY29tL1N0ZXZlU2FuZGVyc29uL2tub2Nrb3V0L2lzc3Vlcy8xODYpXG4gICAgLy8gYnV0IGl0IGRvZXMgZ2l2ZSB0aGVtIGEgbm9uc3RhbmRhcmQgYWx0ZXJuYXRpdmUgcHJvcGVydHkgY2FsbGVkIFwidGV4dFwiIHRoYXQgaXQgY2FuIHJlYWQgcmVsaWFibHkuIE90aGVyIGJyb3dzZXJzIGRvbid0IGhhdmUgdGhhdCBwcm9wZXJ0eS5cbiAgICAvLyBTbywgdXNlIG5vZGUudGV4dCB3aGVyZSBhdmFpbGFibGUsIGFuZCBub2RlLm5vZGVWYWx1ZSBlbHNld2hlcmVcbiAgICB2YXIgY29tbWVudE5vZGVzSGF2ZVRleHRQcm9wZXJ0eSA9IGRvY3VtZW50ICYmIGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoXCJ0ZXN0XCIpLnRleHQgPT09IFwiPCEtLXRlc3QtLT5cIjtcblxuICAgIHZhciBzdGFydENvbW1lbnRSZWdleCA9IGNvbW1lbnROb2Rlc0hhdmVUZXh0UHJvcGVydHkgPyAvXjwhLS1cXHMqa28oPzpcXHMrKFtcXHNcXFNdKykpP1xccyotLT4kLyA6IC9eXFxzKmtvKD86XFxzKyhbXFxzXFxTXSspKT9cXHMqJC87XG4gICAgdmFyIGVuZENvbW1lbnRSZWdleCA9ICAgY29tbWVudE5vZGVzSGF2ZVRleHRQcm9wZXJ0eSA/IC9ePCEtLVxccypcXC9rb1xccyotLT4kLyA6IC9eXFxzKlxcL2tvXFxzKiQvO1xuICAgIHZhciBodG1sVGFnc1dpdGhPcHRpb25hbGx5Q2xvc2luZ0NoaWxkcmVuID0geyAndWwnOiB0cnVlLCAnb2wnOiB0cnVlIH07XG5cbiAgICBmdW5jdGlvbiBpc1N0YXJ0Q29tbWVudChub2RlKSB7XG4gICAgICAgIHJldHVybiAobm9kZS5ub2RlVHlwZSA9PSA4KSAmJiBzdGFydENvbW1lbnRSZWdleC50ZXN0KGNvbW1lbnROb2Rlc0hhdmVUZXh0UHJvcGVydHkgPyBub2RlLnRleHQgOiBub2RlLm5vZGVWYWx1ZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNFbmRDb21tZW50KG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIChub2RlLm5vZGVUeXBlID09IDgpICYmIGVuZENvbW1lbnRSZWdleC50ZXN0KGNvbW1lbnROb2Rlc0hhdmVUZXh0UHJvcGVydHkgPyBub2RlLnRleHQgOiBub2RlLm5vZGVWYWx1ZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0VmlydHVhbENoaWxkcmVuKHN0YXJ0Q29tbWVudCwgYWxsb3dVbmJhbGFuY2VkKSB7XG4gICAgICAgIHZhciBjdXJyZW50Tm9kZSA9IHN0YXJ0Q29tbWVudDtcbiAgICAgICAgdmFyIGRlcHRoID0gMTtcbiAgICAgICAgdmFyIGNoaWxkcmVuID0gW107XG4gICAgICAgIHdoaWxlIChjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLm5leHRTaWJsaW5nKSB7XG4gICAgICAgICAgICBpZiAoaXNFbmRDb21tZW50KGN1cnJlbnROb2RlKSkge1xuICAgICAgICAgICAgICAgIGRlcHRoLS07XG4gICAgICAgICAgICAgICAgaWYgKGRlcHRoID09PSAwKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGRyZW47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goY3VycmVudE5vZGUpO1xuXG4gICAgICAgICAgICBpZiAoaXNTdGFydENvbW1lbnQoY3VycmVudE5vZGUpKVxuICAgICAgICAgICAgICAgIGRlcHRoKys7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFhbGxvd1VuYmFsYW5jZWQpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBjbG9zaW5nIGNvbW1lbnQgdGFnIHRvIG1hdGNoOiBcIiArIHN0YXJ0Q29tbWVudC5ub2RlVmFsdWUpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRNYXRjaGluZ0VuZENvbW1lbnQoc3RhcnRDb21tZW50LCBhbGxvd1VuYmFsYW5jZWQpIHtcbiAgICAgICAgdmFyIGFsbFZpcnR1YWxDaGlsZHJlbiA9IGdldFZpcnR1YWxDaGlsZHJlbihzdGFydENvbW1lbnQsIGFsbG93VW5iYWxhbmNlZCk7XG4gICAgICAgIGlmIChhbGxWaXJ0dWFsQ2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGlmIChhbGxWaXJ0dWFsQ2hpbGRyZW4ubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gYWxsVmlydHVhbENoaWxkcmVuW2FsbFZpcnR1YWxDaGlsZHJlbi5sZW5ndGggLSAxXS5uZXh0U2libGluZztcbiAgICAgICAgICAgIHJldHVybiBzdGFydENvbW1lbnQubmV4dFNpYmxpbmc7XG4gICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7IC8vIE11c3QgaGF2ZSBubyBtYXRjaGluZyBlbmQgY29tbWVudCwgYW5kIGFsbG93VW5iYWxhbmNlZCBpcyB0cnVlXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0VW5iYWxhbmNlZENoaWxkVGFncyhub2RlKSB7XG4gICAgICAgIC8vIGUuZy4sIGZyb20gPGRpdj5PSzwvZGl2PjwhLS0ga28gYmxhaCAtLT48c3Bhbj5Bbm90aGVyPC9zcGFuPiwgcmV0dXJuczogPCEtLSBrbyBibGFoIC0tPjxzcGFuPkFub3RoZXI8L3NwYW4+XG4gICAgICAgIC8vICAgICAgIGZyb20gPGRpdj5PSzwvZGl2PjwhLS0gL2tvIC0tPjwhLS0gL2tvIC0tPiwgICAgICAgICAgICAgcmV0dXJuczogPCEtLSAva28gLS0+PCEtLSAva28gLS0+XG4gICAgICAgIHZhciBjaGlsZE5vZGUgPSBub2RlLmZpcnN0Q2hpbGQsIGNhcHR1cmVSZW1haW5pbmcgPSBudWxsO1xuICAgICAgICBpZiAoY2hpbGROb2RlKSB7XG4gICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgaWYgKGNhcHR1cmVSZW1haW5pbmcpICAgICAgICAgICAgICAgICAgIC8vIFdlIGFscmVhZHkgaGl0IGFuIHVuYmFsYW5jZWQgbm9kZSBhbmQgYXJlIG5vdyBqdXN0IHNjb29waW5nIHVwIGFsbCBzdWJzZXF1ZW50IG5vZGVzXG4gICAgICAgICAgICAgICAgICAgIGNhcHR1cmVSZW1haW5pbmcucHVzaChjaGlsZE5vZGUpO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlzU3RhcnRDb21tZW50KGNoaWxkTm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1hdGNoaW5nRW5kQ29tbWVudCA9IGdldE1hdGNoaW5nRW5kQ29tbWVudChjaGlsZE5vZGUsIC8qIGFsbG93VW5iYWxhbmNlZDogKi8gdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaGluZ0VuZENvbW1lbnQpICAgICAgICAgICAgIC8vIEl0J3MgYSBiYWxhbmNlZCB0YWcsIHNvIHNraXAgaW1tZWRpYXRlbHkgdG8gdGhlIGVuZCBvZiB0aGlzIHZpcnR1YWwgc2V0XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZE5vZGUgPSBtYXRjaGluZ0VuZENvbW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhcHR1cmVSZW1haW5pbmcgPSBbY2hpbGROb2RlXTsgLy8gSXQncyB1bmJhbGFuY2VkLCBzbyBzdGFydCBjYXB0dXJpbmcgZnJvbSB0aGlzIHBvaW50XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc0VuZENvbW1lbnQoY2hpbGROb2RlKSkge1xuICAgICAgICAgICAgICAgICAgICBjYXB0dXJlUmVtYWluaW5nID0gW2NoaWxkTm9kZV07ICAgICAvLyBJdCdzIHVuYmFsYW5jZWQgKGlmIGl0IHdhc24ndCwgd2UnZCBoYXZlIHNraXBwZWQgb3ZlciBpdCBhbHJlYWR5KSwgc28gc3RhcnQgY2FwdHVyaW5nXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSB3aGlsZSAoY2hpbGROb2RlID0gY2hpbGROb2RlLm5leHRTaWJsaW5nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2FwdHVyZVJlbWFpbmluZztcbiAgICB9XG5cbiAgICBrby52aXJ0dWFsRWxlbWVudHMgPSB7XG4gICAgICAgIGFsbG93ZWRCaW5kaW5nczoge30sXG5cbiAgICAgICAgY2hpbGROb2RlczogZnVuY3Rpb24obm9kZSkge1xuICAgICAgICAgICAgcmV0dXJuIGlzU3RhcnRDb21tZW50KG5vZGUpID8gZ2V0VmlydHVhbENoaWxkcmVuKG5vZGUpIDogbm9kZS5jaGlsZE5vZGVzO1xuICAgICAgICB9LFxuXG4gICAgICAgIGVtcHR5Tm9kZTogZnVuY3Rpb24obm9kZSkge1xuICAgICAgICAgICAgaWYgKCFpc1N0YXJ0Q29tbWVudChub2RlKSlcbiAgICAgICAgICAgICAgICBrby51dGlscy5lbXB0eURvbU5vZGUobm9kZSk7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgdmlydHVhbENoaWxkcmVuID0ga28udmlydHVhbEVsZW1lbnRzLmNoaWxkTm9kZXMobm9kZSk7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGogPSB2aXJ0dWFsQ2hpbGRyZW4ubGVuZ3RoOyBpIDwgajsgaSsrKVxuICAgICAgICAgICAgICAgICAgICBrby5yZW1vdmVOb2RlKHZpcnR1YWxDaGlsZHJlbltpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgc2V0RG9tTm9kZUNoaWxkcmVuOiBmdW5jdGlvbihub2RlLCBjaGlsZE5vZGVzKSB7XG4gICAgICAgICAgICBpZiAoIWlzU3RhcnRDb21tZW50KG5vZGUpKVxuICAgICAgICAgICAgICAgIGtvLnV0aWxzLnNldERvbU5vZGVDaGlsZHJlbihub2RlLCBjaGlsZE5vZGVzKTtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGtvLnZpcnR1YWxFbGVtZW50cy5lbXB0eU5vZGUobm9kZSk7XG4gICAgICAgICAgICAgICAgdmFyIGVuZENvbW1lbnROb2RlID0gbm9kZS5uZXh0U2libGluZzsgLy8gTXVzdCBiZSB0aGUgbmV4dCBzaWJsaW5nLCBhcyB3ZSBqdXN0IGVtcHRpZWQgdGhlIGNoaWxkcmVuXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGogPSBjaGlsZE5vZGVzLmxlbmd0aDsgaSA8IGo7IGkrKylcbiAgICAgICAgICAgICAgICAgICAgZW5kQ29tbWVudE5vZGUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoY2hpbGROb2Rlc1tpXSwgZW5kQ29tbWVudE5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIHByZXBlbmQ6IGZ1bmN0aW9uKGNvbnRhaW5lck5vZGUsIG5vZGVUb1ByZXBlbmQpIHtcbiAgICAgICAgICAgIGlmICghaXNTdGFydENvbW1lbnQoY29udGFpbmVyTm9kZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoY29udGFpbmVyTm9kZS5maXJzdENoaWxkKVxuICAgICAgICAgICAgICAgICAgICBjb250YWluZXJOb2RlLmluc2VydEJlZm9yZShub2RlVG9QcmVwZW5kLCBjb250YWluZXJOb2RlLmZpcnN0Q2hpbGQpO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyTm9kZS5hcHBlbmRDaGlsZChub2RlVG9QcmVwZW5kKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gU3RhcnQgY29tbWVudHMgbXVzdCBhbHdheXMgaGF2ZSBhIHBhcmVudCBhbmQgYXQgbGVhc3Qgb25lIGZvbGxvd2luZyBzaWJsaW5nICh0aGUgZW5kIGNvbW1lbnQpXG4gICAgICAgICAgICAgICAgY29udGFpbmVyTm9kZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShub2RlVG9QcmVwZW5kLCBjb250YWluZXJOb2RlLm5leHRTaWJsaW5nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBpbnNlcnRBZnRlcjogZnVuY3Rpb24oY29udGFpbmVyTm9kZSwgbm9kZVRvSW5zZXJ0LCBpbnNlcnRBZnRlck5vZGUpIHtcbiAgICAgICAgICAgIGlmICghaW5zZXJ0QWZ0ZXJOb2RlKSB7XG4gICAgICAgICAgICAgICAga28udmlydHVhbEVsZW1lbnRzLnByZXBlbmQoY29udGFpbmVyTm9kZSwgbm9kZVRvSW5zZXJ0KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzU3RhcnRDb21tZW50KGNvbnRhaW5lck5vZGUpKSB7XG4gICAgICAgICAgICAgICAgLy8gSW5zZXJ0IGFmdGVyIGluc2VydGlvbiBwb2ludFxuICAgICAgICAgICAgICAgIGlmIChpbnNlcnRBZnRlck5vZGUubmV4dFNpYmxpbmcpXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lck5vZGUuaW5zZXJ0QmVmb3JlKG5vZGVUb0luc2VydCwgaW5zZXJ0QWZ0ZXJOb2RlLm5leHRTaWJsaW5nKTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lck5vZGUuYXBwZW5kQ2hpbGQobm9kZVRvSW5zZXJ0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gQ2hpbGRyZW4gb2Ygc3RhcnQgY29tbWVudHMgbXVzdCBhbHdheXMgaGF2ZSBhIHBhcmVudCBhbmQgYXQgbGVhc3Qgb25lIGZvbGxvd2luZyBzaWJsaW5nICh0aGUgZW5kIGNvbW1lbnQpXG4gICAgICAgICAgICAgICAgY29udGFpbmVyTm9kZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShub2RlVG9JbnNlcnQsIGluc2VydEFmdGVyTm9kZS5uZXh0U2libGluZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgZmlyc3RDaGlsZDogZnVuY3Rpb24obm9kZSkge1xuICAgICAgICAgICAgaWYgKCFpc1N0YXJ0Q29tbWVudChub2RlKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gbm9kZS5maXJzdENoaWxkO1xuICAgICAgICAgICAgaWYgKCFub2RlLm5leHRTaWJsaW5nIHx8IGlzRW5kQ29tbWVudChub2RlLm5leHRTaWJsaW5nKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiBub2RlLm5leHRTaWJsaW5nO1xuICAgICAgICB9LFxuXG4gICAgICAgIG5leHRTaWJsaW5nOiBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgICAgICBpZiAoaXNTdGFydENvbW1lbnQobm9kZSkpXG4gICAgICAgICAgICAgICAgbm9kZSA9IGdldE1hdGNoaW5nRW5kQ29tbWVudChub2RlKTtcbiAgICAgICAgICAgIGlmIChub2RlLm5leHRTaWJsaW5nICYmIGlzRW5kQ29tbWVudChub2RlLm5leHRTaWJsaW5nKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiBub2RlLm5leHRTaWJsaW5nO1xuICAgICAgICB9LFxuXG4gICAgICAgIGhhc0JpbmRpbmdWYWx1ZTogaXNTdGFydENvbW1lbnQsXG5cbiAgICAgICAgdmlydHVhbE5vZGVCaW5kaW5nVmFsdWU6IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgICAgIHZhciByZWdleE1hdGNoID0gKGNvbW1lbnROb2Rlc0hhdmVUZXh0UHJvcGVydHkgPyBub2RlLnRleHQgOiBub2RlLm5vZGVWYWx1ZSkubWF0Y2goc3RhcnRDb21tZW50UmVnZXgpO1xuICAgICAgICAgICAgcmV0dXJuIHJlZ2V4TWF0Y2ggPyByZWdleE1hdGNoWzFdIDogbnVsbDtcbiAgICAgICAgfSxcblxuICAgICAgICBub3JtYWxpc2VWaXJ0dWFsRWxlbWVudERvbVN0cnVjdHVyZTogZnVuY3Rpb24oZWxlbWVudFZlcmlmaWVkKSB7XG4gICAgICAgICAgICAvLyBXb3JrYXJvdW5kIGZvciBodHRwczovL2dpdGh1Yi5jb20vU3RldmVTYW5kZXJzb24va25vY2tvdXQvaXNzdWVzLzE1NVxuICAgICAgICAgICAgLy8gKElFIDw9IDggb3IgSUUgOSBxdWlya3MgbW9kZSBwYXJzZXMgeW91ciBIVE1MIHdlaXJkbHksIHRyZWF0aW5nIGNsb3NpbmcgPC9saT4gdGFncyBhcyBpZiB0aGV5IGRvbid0IGV4aXN0LCB0aGVyZWJ5IG1vdmluZyBjb21tZW50IG5vZGVzXG4gICAgICAgICAgICAvLyB0aGF0IGFyZSBkaXJlY3QgZGVzY2VuZGFudHMgb2YgPHVsPiBpbnRvIHRoZSBwcmVjZWRpbmcgPGxpPilcbiAgICAgICAgICAgIGlmICghaHRtbFRhZ3NXaXRoT3B0aW9uYWxseUNsb3NpbmdDaGlsZHJlbltrby51dGlscy50YWdOYW1lTG93ZXIoZWxlbWVudFZlcmlmaWVkKV0pXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgICAgICAvLyBTY2FuIGltbWVkaWF0ZSBjaGlsZHJlbiB0byBzZWUgaWYgdGhleSBjb250YWluIHVuYmFsYW5jZWQgY29tbWVudCB0YWdzLiBJZiB0aGV5IGRvLCB0aG9zZSBjb21tZW50IHRhZ3NcbiAgICAgICAgICAgIC8vIG11c3QgYmUgaW50ZW5kZWQgdG8gYXBwZWFyICphZnRlciogdGhhdCBjaGlsZCwgc28gbW92ZSB0aGVtIHRoZXJlLlxuICAgICAgICAgICAgdmFyIGNoaWxkTm9kZSA9IGVsZW1lbnRWZXJpZmllZC5maXJzdENoaWxkO1xuICAgICAgICAgICAgaWYgKGNoaWxkTm9kZSkge1xuICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkTm9kZS5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHVuYmFsYW5jZWRUYWdzID0gZ2V0VW5iYWxhbmNlZENoaWxkVGFncyhjaGlsZE5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVuYmFsYW5jZWRUYWdzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRml4IHVwIHRoZSBET00gYnkgbW92aW5nIHRoZSB1bmJhbGFuY2VkIHRhZ3MgdG8gd2hlcmUgdGhleSBtb3N0IGxpa2VseSB3ZXJlIGludGVuZGVkIHRvIGJlIHBsYWNlZCAtICphZnRlciogdGhlIGNoaWxkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5vZGVUb0luc2VydEJlZm9yZSA9IGNoaWxkTm9kZS5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHVuYmFsYW5jZWRUYWdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlVG9JbnNlcnRCZWZvcmUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50VmVyaWZpZWQuaW5zZXJ0QmVmb3JlKHVuYmFsYW5jZWRUYWdzW2ldLCBub2RlVG9JbnNlcnRCZWZvcmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50VmVyaWZpZWQuYXBwZW5kQ2hpbGQodW5iYWxhbmNlZFRhZ3NbaV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gd2hpbGUgKGNoaWxkTm9kZSA9IGNoaWxkTm9kZS5uZXh0U2libGluZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xufSkoKTtcbmtvLmV4cG9ydFN5bWJvbCgndmlydHVhbEVsZW1lbnRzJywga28udmlydHVhbEVsZW1lbnRzKTtcbmtvLmV4cG9ydFN5bWJvbCgndmlydHVhbEVsZW1lbnRzLmFsbG93ZWRCaW5kaW5ncycsIGtvLnZpcnR1YWxFbGVtZW50cy5hbGxvd2VkQmluZGluZ3MpO1xua28uZXhwb3J0U3ltYm9sKCd2aXJ0dWFsRWxlbWVudHMuZW1wdHlOb2RlJywga28udmlydHVhbEVsZW1lbnRzLmVtcHR5Tm9kZSk7XG4vL2tvLmV4cG9ydFN5bWJvbCgndmlydHVhbEVsZW1lbnRzLmZpcnN0Q2hpbGQnLCBrby52aXJ0dWFsRWxlbWVudHMuZmlyc3RDaGlsZCk7ICAgICAvLyBmaXJzdENoaWxkIGlzIG5vdCBtaW5pZmllZFxua28uZXhwb3J0U3ltYm9sKCd2aXJ0dWFsRWxlbWVudHMuaW5zZXJ0QWZ0ZXInLCBrby52aXJ0dWFsRWxlbWVudHMuaW5zZXJ0QWZ0ZXIpO1xuLy9rby5leHBvcnRTeW1ib2woJ3ZpcnR1YWxFbGVtZW50cy5uZXh0U2libGluZycsIGtvLnZpcnR1YWxFbGVtZW50cy5uZXh0U2libGluZyk7ICAgLy8gbmV4dFNpYmxpbmcgaXMgbm90IG1pbmlmaWVkXG5rby5leHBvcnRTeW1ib2woJ3ZpcnR1YWxFbGVtZW50cy5wcmVwZW5kJywga28udmlydHVhbEVsZW1lbnRzLnByZXBlbmQpO1xua28uZXhwb3J0U3ltYm9sKCd2aXJ0dWFsRWxlbWVudHMuc2V0RG9tTm9kZUNoaWxkcmVuJywga28udmlydHVhbEVsZW1lbnRzLnNldERvbU5vZGVDaGlsZHJlbik7XG4oZnVuY3Rpb24oKSB7XG4gICAgdmFyIGRlZmF1bHRCaW5kaW5nQXR0cmlidXRlTmFtZSA9IFwiZGF0YS1iaW5kXCI7XG5cbiAgICBrby5iaW5kaW5nUHJvdmlkZXIgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5iaW5kaW5nQ2FjaGUgPSB7fTtcbiAgICB9O1xuXG4gICAga28udXRpbHMuZXh0ZW5kKGtvLmJpbmRpbmdQcm92aWRlci5wcm90b3R5cGUsIHtcbiAgICAgICAgJ25vZGVIYXNCaW5kaW5ncyc6IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgICAgIHN3aXRjaCAobm9kZS5ub2RlVHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgMTogLy8gRWxlbWVudFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbm9kZS5nZXRBdHRyaWJ1dGUoZGVmYXVsdEJpbmRpbmdBdHRyaWJ1dGVOYW1lKSAhPSBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICB8fCBrby5jb21wb25lbnRzWydnZXRDb21wb25lbnROYW1lRm9yTm9kZSddKG5vZGUpO1xuICAgICAgICAgICAgICAgIGNhc2UgODogLy8gQ29tbWVudCBub2RlXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBrby52aXJ0dWFsRWxlbWVudHMuaGFzQmluZGluZ1ZhbHVlKG5vZGUpO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICAnZ2V0QmluZGluZ3MnOiBmdW5jdGlvbihub2RlLCBiaW5kaW5nQ29udGV4dCkge1xuICAgICAgICAgICAgdmFyIGJpbmRpbmdzU3RyaW5nID0gdGhpc1snZ2V0QmluZGluZ3NTdHJpbmcnXShub2RlLCBiaW5kaW5nQ29udGV4dCksXG4gICAgICAgICAgICAgICAgcGFyc2VkQmluZGluZ3MgPSBiaW5kaW5nc1N0cmluZyA/IHRoaXNbJ3BhcnNlQmluZGluZ3NTdHJpbmcnXShiaW5kaW5nc1N0cmluZywgYmluZGluZ0NvbnRleHQsIG5vZGUpIDogbnVsbDtcbiAgICAgICAgICAgIHJldHVybiBrby5jb21wb25lbnRzLmFkZEJpbmRpbmdzRm9yQ3VzdG9tRWxlbWVudChwYXJzZWRCaW5kaW5ncywgbm9kZSwgYmluZGluZ0NvbnRleHQsIC8qIHZhbHVlQWNjZXNzb3JzICovIGZhbHNlKTtcbiAgICAgICAgfSxcblxuICAgICAgICAnZ2V0QmluZGluZ0FjY2Vzc29ycyc6IGZ1bmN0aW9uKG5vZGUsIGJpbmRpbmdDb250ZXh0KSB7XG4gICAgICAgICAgICB2YXIgYmluZGluZ3NTdHJpbmcgPSB0aGlzWydnZXRCaW5kaW5nc1N0cmluZyddKG5vZGUsIGJpbmRpbmdDb250ZXh0KSxcbiAgICAgICAgICAgICAgICBwYXJzZWRCaW5kaW5ncyA9IGJpbmRpbmdzU3RyaW5nID8gdGhpc1sncGFyc2VCaW5kaW5nc1N0cmluZyddKGJpbmRpbmdzU3RyaW5nLCBiaW5kaW5nQ29udGV4dCwgbm9kZSwgeyAndmFsdWVBY2Nlc3NvcnMnOiB0cnVlIH0pIDogbnVsbDtcbiAgICAgICAgICAgIHJldHVybiBrby5jb21wb25lbnRzLmFkZEJpbmRpbmdzRm9yQ3VzdG9tRWxlbWVudChwYXJzZWRCaW5kaW5ncywgbm9kZSwgYmluZGluZ0NvbnRleHQsIC8qIHZhbHVlQWNjZXNzb3JzICovIHRydWUpO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gaXMgb25seSB1c2VkIGludGVybmFsbHkgYnkgdGhpcyBkZWZhdWx0IHByb3ZpZGVyLlxuICAgICAgICAvLyBJdCdzIG5vdCBwYXJ0IG9mIHRoZSBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmb3IgYSBnZW5lcmFsIGJpbmRpbmcgcHJvdmlkZXIuXG4gICAgICAgICdnZXRCaW5kaW5nc1N0cmluZyc6IGZ1bmN0aW9uKG5vZGUsIGJpbmRpbmdDb250ZXh0KSB7XG4gICAgICAgICAgICBzd2l0Y2ggKG5vZGUubm9kZVR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6IHJldHVybiBub2RlLmdldEF0dHJpYnV0ZShkZWZhdWx0QmluZGluZ0F0dHJpYnV0ZU5hbWUpOyAgIC8vIEVsZW1lbnRcbiAgICAgICAgICAgICAgICBjYXNlIDg6IHJldHVybiBrby52aXJ0dWFsRWxlbWVudHMudmlydHVhbE5vZGVCaW5kaW5nVmFsdWUobm9kZSk7IC8vIENvbW1lbnQgbm9kZVxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gaXMgb25seSB1c2VkIGludGVybmFsbHkgYnkgdGhpcyBkZWZhdWx0IHByb3ZpZGVyLlxuICAgICAgICAvLyBJdCdzIG5vdCBwYXJ0IG9mIHRoZSBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmb3IgYSBnZW5lcmFsIGJpbmRpbmcgcHJvdmlkZXIuXG4gICAgICAgICdwYXJzZUJpbmRpbmdzU3RyaW5nJzogZnVuY3Rpb24oYmluZGluZ3NTdHJpbmcsIGJpbmRpbmdDb250ZXh0LCBub2RlLCBvcHRpb25zKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHZhciBiaW5kaW5nRnVuY3Rpb24gPSBjcmVhdGVCaW5kaW5nc1N0cmluZ0V2YWx1YXRvclZpYUNhY2hlKGJpbmRpbmdzU3RyaW5nLCB0aGlzLmJpbmRpbmdDYWNoZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGJpbmRpbmdGdW5jdGlvbihiaW5kaW5nQ29udGV4dCwgbm9kZSk7XG4gICAgICAgICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICAgICAgICAgIGV4Lm1lc3NhZ2UgPSBcIlVuYWJsZSB0byBwYXJzZSBiaW5kaW5ncy5cXG5CaW5kaW5ncyB2YWx1ZTogXCIgKyBiaW5kaW5nc1N0cmluZyArIFwiXFxuTWVzc2FnZTogXCIgKyBleC5tZXNzYWdlO1xuICAgICAgICAgICAgICAgIHRocm93IGV4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBrby5iaW5kaW5nUHJvdmlkZXJbJ2luc3RhbmNlJ10gPSBuZXcga28uYmluZGluZ1Byb3ZpZGVyKCk7XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVCaW5kaW5nc1N0cmluZ0V2YWx1YXRvclZpYUNhY2hlKGJpbmRpbmdzU3RyaW5nLCBjYWNoZSwgb3B0aW9ucykge1xuICAgICAgICB2YXIgY2FjaGVLZXkgPSBiaW5kaW5nc1N0cmluZyArIChvcHRpb25zICYmIG9wdGlvbnNbJ3ZhbHVlQWNjZXNzb3JzJ10gfHwgJycpO1xuICAgICAgICByZXR1cm4gY2FjaGVbY2FjaGVLZXldXG4gICAgICAgICAgICB8fCAoY2FjaGVbY2FjaGVLZXldID0gY3JlYXRlQmluZGluZ3NTdHJpbmdFdmFsdWF0b3IoYmluZGluZ3NTdHJpbmcsIG9wdGlvbnMpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVCaW5kaW5nc1N0cmluZ0V2YWx1YXRvcihiaW5kaW5nc1N0cmluZywgb3B0aW9ucykge1xuICAgICAgICAvLyBCdWlsZCB0aGUgc291cmNlIGZvciBhIGZ1bmN0aW9uIHRoYXQgZXZhbHVhdGVzIFwiZXhwcmVzc2lvblwiXG4gICAgICAgIC8vIEZvciBlYWNoIHNjb3BlIHZhcmlhYmxlLCBhZGQgYW4gZXh0cmEgbGV2ZWwgb2YgXCJ3aXRoXCIgbmVzdGluZ1xuICAgICAgICAvLyBFeGFtcGxlIHJlc3VsdDogd2l0aChzYzEpIHsgd2l0aChzYzApIHsgcmV0dXJuIChleHByZXNzaW9uKSB9IH1cbiAgICAgICAgdmFyIHJld3JpdHRlbkJpbmRpbmdzID0ga28uZXhwcmVzc2lvblJld3JpdGluZy5wcmVQcm9jZXNzQmluZGluZ3MoYmluZGluZ3NTdHJpbmcsIG9wdGlvbnMpLFxuICAgICAgICAgICAgZnVuY3Rpb25Cb2R5ID0gXCJ3aXRoKCRjb250ZXh0KXt3aXRoKCRkYXRhfHx7fSl7cmV0dXJue1wiICsgcmV3cml0dGVuQmluZGluZ3MgKyBcIn19fVwiO1xuICAgICAgICByZXR1cm4gbmV3IEZ1bmN0aW9uKFwiJGNvbnRleHRcIiwgXCIkZWxlbWVudFwiLCBmdW5jdGlvbkJvZHkpO1xuICAgIH1cbn0pKCk7XG5cbmtvLmV4cG9ydFN5bWJvbCgnYmluZGluZ1Byb3ZpZGVyJywga28uYmluZGluZ1Byb3ZpZGVyKTtcbihmdW5jdGlvbiAoKSB7XG4gICAga28uYmluZGluZ0hhbmRsZXJzID0ge307XG5cbiAgICAvLyBUaGUgZm9sbG93aW5nIGVsZW1lbnQgdHlwZXMgd2lsbCBub3QgYmUgcmVjdXJzZWQgaW50byBkdXJpbmcgYmluZGluZy5cbiAgICB2YXIgYmluZGluZ0RvZXNOb3RSZWN1cnNlSW50b0VsZW1lbnRUeXBlcyA9IHtcbiAgICAgICAgLy8gRG9uJ3Qgd2FudCBiaW5kaW5ncyB0aGF0IG9wZXJhdGUgb24gdGV4dCBub2RlcyB0byBtdXRhdGUgPHNjcmlwdD4gYW5kIDx0ZXh0YXJlYT4gY29udGVudHMsXG4gICAgICAgIC8vIGJlY2F1c2UgaXQncyB1bmV4cGVjdGVkIGFuZCBhIHBvdGVudGlhbCBYU1MgaXNzdWUuXG4gICAgICAgIC8vIEFsc28gYmluZGluZ3Mgc2hvdWxkIG5vdCBvcGVyYXRlIG9uIDx0ZW1wbGF0ZT4gZWxlbWVudHMgc2luY2UgdGhpcyBicmVha3MgaW4gSW50ZXJuZXQgRXhwbG9yZXJcbiAgICAgICAgLy8gYW5kIGJlY2F1c2Ugc3VjaCBlbGVtZW50cycgY29udGVudHMgYXJlIGFsd2F5cyBpbnRlbmRlZCB0byBiZSBib3VuZCBpbiBhIGRpZmZlcmVudCBjb250ZXh0XG4gICAgICAgIC8vIGZyb20gd2hlcmUgdGhleSBhcHBlYXIgaW4gdGhlIGRvY3VtZW50LlxuICAgICAgICAnc2NyaXB0JzogdHJ1ZSxcbiAgICAgICAgJ3RleHRhcmVhJzogdHJ1ZSxcbiAgICAgICAgJ3RlbXBsYXRlJzogdHJ1ZVxuICAgIH07XG5cbiAgICAvLyBVc2UgYW4gb3ZlcnJpZGFibGUgbWV0aG9kIGZvciByZXRyaWV2aW5nIGJpbmRpbmcgaGFuZGxlcnMgc28gdGhhdCBhIHBsdWdpbnMgbWF5IHN1cHBvcnQgZHluYW1pY2FsbHkgY3JlYXRlZCBoYW5kbGVyc1xuICAgIGtvWydnZXRCaW5kaW5nSGFuZGxlciddID0gZnVuY3Rpb24oYmluZGluZ0tleSkge1xuICAgICAgICByZXR1cm4ga28uYmluZGluZ0hhbmRsZXJzW2JpbmRpbmdLZXldO1xuICAgIH07XG5cbiAgICAvLyBUaGUga28uYmluZGluZ0NvbnRleHQgY29uc3RydWN0b3IgaXMgb25seSBjYWxsZWQgZGlyZWN0bHkgdG8gY3JlYXRlIHRoZSByb290IGNvbnRleHQuIEZvciBjaGlsZFxuICAgIC8vIGNvbnRleHRzLCB1c2UgYmluZGluZ0NvbnRleHQuY3JlYXRlQ2hpbGRDb250ZXh0IG9yIGJpbmRpbmdDb250ZXh0LmV4dGVuZC5cbiAgICBrby5iaW5kaW5nQ29udGV4dCA9IGZ1bmN0aW9uKGRhdGFJdGVtT3JBY2Nlc3NvciwgcGFyZW50Q29udGV4dCwgZGF0YUl0ZW1BbGlhcywgZXh0ZW5kQ2FsbGJhY2ssIG9wdGlvbnMpIHtcblxuICAgICAgICAvLyBUaGUgYmluZGluZyBjb250ZXh0IG9iamVjdCBpbmNsdWRlcyBzdGF0aWMgcHJvcGVydGllcyBmb3IgdGhlIGN1cnJlbnQsIHBhcmVudCwgYW5kIHJvb3QgdmlldyBtb2RlbHMuXG4gICAgICAgIC8vIElmIGEgdmlldyBtb2RlbCBpcyBhY3R1YWxseSBzdG9yZWQgaW4gYW4gb2JzZXJ2YWJsZSwgdGhlIGNvcnJlc3BvbmRpbmcgYmluZGluZyBjb250ZXh0IG9iamVjdCwgYW5kXG4gICAgICAgIC8vIGFueSBjaGlsZCBjb250ZXh0cywgbXVzdCBiZSB1cGRhdGVkIHdoZW4gdGhlIHZpZXcgbW9kZWwgaXMgY2hhbmdlZC5cbiAgICAgICAgZnVuY3Rpb24gdXBkYXRlQ29udGV4dCgpIHtcbiAgICAgICAgICAgIC8vIE1vc3Qgb2YgdGhlIHRpbWUsIHRoZSBjb250ZXh0IHdpbGwgZGlyZWN0bHkgZ2V0IGEgdmlldyBtb2RlbCBvYmplY3QsIGJ1dCBpZiBhIGZ1bmN0aW9uIGlzIGdpdmVuLFxuICAgICAgICAgICAgLy8gd2UgY2FsbCB0aGUgZnVuY3Rpb24gdG8gcmV0cmlldmUgdGhlIHZpZXcgbW9kZWwuIElmIHRoZSBmdW5jdGlvbiBhY2Nlc3NlcyBhbnkgb2JzZXJ2YWJsZXMgb3IgcmV0dXJuc1xuICAgICAgICAgICAgLy8gYW4gb2JzZXJ2YWJsZSwgdGhlIGRlcGVuZGVuY3kgaXMgdHJhY2tlZCwgYW5kIHRob3NlIG9ic2VydmFibGVzIGNhbiBsYXRlciBjYXVzZSB0aGUgYmluZGluZ1xuICAgICAgICAgICAgLy8gY29udGV4dCB0byBiZSB1cGRhdGVkLlxuICAgICAgICAgICAgdmFyIGRhdGFJdGVtT3JPYnNlcnZhYmxlID0gaXNGdW5jID8gZGF0YUl0ZW1PckFjY2Vzc29yKCkgOiBkYXRhSXRlbU9yQWNjZXNzb3IsXG4gICAgICAgICAgICAgICAgZGF0YUl0ZW0gPSBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKGRhdGFJdGVtT3JPYnNlcnZhYmxlKTtcblxuICAgICAgICAgICAgaWYgKHBhcmVudENvbnRleHQpIHtcbiAgICAgICAgICAgICAgICAvLyBXaGVuIGEgXCJwYXJlbnRcIiBjb250ZXh0IGlzIGdpdmVuLCByZWdpc3RlciBhIGRlcGVuZGVuY3kgb24gdGhlIHBhcmVudCBjb250ZXh0LiBUaHVzIHdoZW5ldmVyIHRoZVxuICAgICAgICAgICAgICAgIC8vIHBhcmVudCBjb250ZXh0IGlzIHVwZGF0ZWQsIHRoaXMgY29udGV4dCB3aWxsIGFsc28gYmUgdXBkYXRlZC5cbiAgICAgICAgICAgICAgICBpZiAocGFyZW50Q29udGV4dC5fc3Vic2NyaWJhYmxlKVxuICAgICAgICAgICAgICAgICAgICBwYXJlbnRDb250ZXh0Ll9zdWJzY3JpYmFibGUoKTtcblxuICAgICAgICAgICAgICAgIC8vIENvcHkgJHJvb3QgYW5kIGFueSBjdXN0b20gcHJvcGVydGllcyBmcm9tIHRoZSBwYXJlbnQgY29udGV4dFxuICAgICAgICAgICAgICAgIGtvLnV0aWxzLmV4dGVuZChzZWxmLCBwYXJlbnRDb250ZXh0KTtcblxuICAgICAgICAgICAgICAgIC8vIEJlY2F1c2UgdGhlIGFib3ZlIGNvcHkgb3ZlcndyaXRlcyBvdXIgb3duIHByb3BlcnRpZXMsIHdlIG5lZWQgdG8gcmVzZXQgdGhlbS5cbiAgICAgICAgICAgICAgICBzZWxmLl9zdWJzY3JpYmFibGUgPSBzdWJzY3JpYmFibGU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHNlbGZbJyRwYXJlbnRzJ10gPSBbXTtcbiAgICAgICAgICAgICAgICBzZWxmWyckcm9vdCddID0gZGF0YUl0ZW07XG5cbiAgICAgICAgICAgICAgICAvLyBFeHBvcnQgJ2tvJyBpbiB0aGUgYmluZGluZyBjb250ZXh0IHNvIGl0IHdpbGwgYmUgYXZhaWxhYmxlIGluIGJpbmRpbmdzIGFuZCB0ZW1wbGF0ZXNcbiAgICAgICAgICAgICAgICAvLyBldmVuIGlmICdrbycgaXNuJ3QgZXhwb3J0ZWQgYXMgYSBnbG9iYWwsIHN1Y2ggYXMgd2hlbiB1c2luZyBhbiBBTUQgbG9hZGVyLlxuICAgICAgICAgICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vU3RldmVTYW5kZXJzb24va25vY2tvdXQvaXNzdWVzLzQ5MFxuICAgICAgICAgICAgICAgIHNlbGZbJ2tvJ10gPSBrbztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNlbGZbJyRyYXdEYXRhJ10gPSBkYXRhSXRlbU9yT2JzZXJ2YWJsZTtcbiAgICAgICAgICAgIHNlbGZbJyRkYXRhJ10gPSBkYXRhSXRlbTtcbiAgICAgICAgICAgIGlmIChkYXRhSXRlbUFsaWFzKVxuICAgICAgICAgICAgICAgIHNlbGZbZGF0YUl0ZW1BbGlhc10gPSBkYXRhSXRlbTtcblxuICAgICAgICAgICAgLy8gVGhlIGV4dGVuZENhbGxiYWNrIGZ1bmN0aW9uIGlzIHByb3ZpZGVkIHdoZW4gY3JlYXRpbmcgYSBjaGlsZCBjb250ZXh0IG9yIGV4dGVuZGluZyBhIGNvbnRleHQuXG4gICAgICAgICAgICAvLyBJdCBoYW5kbGVzIHRoZSBzcGVjaWZpYyBhY3Rpb25zIG5lZWRlZCB0byBmaW5pc2ggc2V0dGluZyB1cCB0aGUgYmluZGluZyBjb250ZXh0LiBBY3Rpb25zIGluIHRoaXNcbiAgICAgICAgICAgIC8vIGZ1bmN0aW9uIGNvdWxkIGFsc28gYWRkIGRlcGVuZGVuY2llcyB0byB0aGlzIGJpbmRpbmcgY29udGV4dC5cbiAgICAgICAgICAgIGlmIChleHRlbmRDYWxsYmFjaylcbiAgICAgICAgICAgICAgICBleHRlbmRDYWxsYmFjayhzZWxmLCBwYXJlbnRDb250ZXh0LCBkYXRhSXRlbSk7XG5cbiAgICAgICAgICAgIHJldHVybiBzZWxmWyckZGF0YSddO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGRpc3Bvc2VXaGVuKCkge1xuICAgICAgICAgICAgcmV0dXJuIG5vZGVzICYmICFrby51dGlscy5hbnlEb21Ob2RlSXNBdHRhY2hlZFRvRG9jdW1lbnQobm9kZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzLFxuICAgICAgICAgICAgaXNGdW5jID0gdHlwZW9mKGRhdGFJdGVtT3JBY2Nlc3NvcikgPT0gXCJmdW5jdGlvblwiICYmICFrby5pc09ic2VydmFibGUoZGF0YUl0ZW1PckFjY2Vzc29yKSxcbiAgICAgICAgICAgIG5vZGVzLFxuICAgICAgICAgICAgc3Vic2NyaWJhYmxlO1xuXG4gICAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnNbJ2V4cG9ydERlcGVuZGVuY2llcyddKSB7XG4gICAgICAgICAgICAvLyBUaGUgXCJleHBvcnREZXBlbmRlbmNpZXNcIiBvcHRpb24gbWVhbnMgdGhhdCB0aGUgY2FsbGluZyBjb2RlIHdpbGwgdHJhY2sgYW55IGRlcGVuZGVuY2llcyBhbmQgcmUtY3JlYXRlXG4gICAgICAgICAgICAvLyB0aGUgYmluZGluZyBjb250ZXh0IHdoZW4gdGhleSBjaGFuZ2UuXG4gICAgICAgICAgICB1cGRhdGVDb250ZXh0KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdWJzY3JpYmFibGUgPSBrby5kZXBlbmRlbnRPYnNlcnZhYmxlKHVwZGF0ZUNvbnRleHQsIG51bGwsIHsgZGlzcG9zZVdoZW46IGRpc3Bvc2VXaGVuLCBkaXNwb3NlV2hlbk5vZGVJc1JlbW92ZWQ6IHRydWUgfSk7XG5cbiAgICAgICAgICAgIC8vIEF0IHRoaXMgcG9pbnQsIHRoZSBiaW5kaW5nIGNvbnRleHQgaGFzIGJlZW4gaW5pdGlhbGl6ZWQsIGFuZCB0aGUgXCJzdWJzY3JpYmFibGVcIiBjb21wdXRlZCBvYnNlcnZhYmxlIGlzXG4gICAgICAgICAgICAvLyBzdWJzY3JpYmVkIHRvIGFueSBvYnNlcnZhYmxlcyB0aGF0IHdlcmUgYWNjZXNzZWQgaW4gdGhlIHByb2Nlc3MuIElmIHRoZXJlIGlzIG5vdGhpbmcgdG8gdHJhY2ssIHRoZVxuICAgICAgICAgICAgLy8gY29tcHV0ZWQgd2lsbCBiZSBpbmFjdGl2ZSwgYW5kIHdlIGNhbiBzYWZlbHkgdGhyb3cgaXQgYXdheS4gSWYgaXQncyBhY3RpdmUsIHRoZSBjb21wdXRlZCBpcyBzdG9yZWQgaW5cbiAgICAgICAgICAgIC8vIHRoZSBjb250ZXh0IG9iamVjdC5cbiAgICAgICAgICAgIGlmIChzdWJzY3JpYmFibGUuaXNBY3RpdmUoKSkge1xuICAgICAgICAgICAgICAgIHNlbGYuX3N1YnNjcmliYWJsZSA9IHN1YnNjcmliYWJsZTtcblxuICAgICAgICAgICAgICAgIC8vIEFsd2F5cyBub3RpZnkgYmVjYXVzZSBldmVuIGlmIHRoZSBtb2RlbCAoJGRhdGEpIGhhc24ndCBjaGFuZ2VkLCBvdGhlciBjb250ZXh0IHByb3BlcnRpZXMgbWlnaHQgaGF2ZSBjaGFuZ2VkXG4gICAgICAgICAgICAgICAgc3Vic2NyaWJhYmxlWydlcXVhbGl0eUNvbXBhcmVyJ10gPSBudWxsO1xuXG4gICAgICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBiZSBhYmxlIHRvIGRpc3Bvc2Ugb2YgdGhpcyBjb21wdXRlZCBvYnNlcnZhYmxlIHdoZW4gaXQncyBubyBsb25nZXIgbmVlZGVkLiBUaGlzIHdvdWxkIGJlXG4gICAgICAgICAgICAgICAgLy8gZWFzeSBpZiB3ZSBoYWQgYSBzaW5nbGUgbm9kZSB0byB3YXRjaCwgYnV0IGJpbmRpbmcgY29udGV4dHMgY2FuIGJlIHVzZWQgYnkgbWFueSBkaWZmZXJlbnQgbm9kZXMsIGFuZFxuICAgICAgICAgICAgICAgIC8vIHdlIGNhbm5vdCBhc3N1bWUgdGhhdCB0aG9zZSBub2RlcyBoYXZlIGFueSByZWxhdGlvbiB0byBlYWNoIG90aGVyLiBTbyBpbnN0ZWFkIHdlIHRyYWNrIGFueSBub2RlIHRoYXRcbiAgICAgICAgICAgICAgICAvLyB0aGUgY29udGV4dCBpcyBhdHRhY2hlZCB0bywgYW5kIGRpc3Bvc2UgdGhlIGNvbXB1dGVkIHdoZW4gYWxsIG9mIHRob3NlIG5vZGVzIGhhdmUgYmVlbiBjbGVhbmVkLlxuXG4gICAgICAgICAgICAgICAgLy8gQWRkIHByb3BlcnRpZXMgdG8gKnN1YnNjcmliYWJsZSogaW5zdGVhZCBvZiAqc2VsZiogYmVjYXVzZSBhbnkgcHJvcGVydGllcyBhZGRlZCB0byAqc2VsZiogbWF5IGJlIG92ZXJ3cml0dGVuIG9uIHVwZGF0ZXNcbiAgICAgICAgICAgICAgICBub2RlcyA9IFtdO1xuICAgICAgICAgICAgICAgIHN1YnNjcmliYWJsZS5fYWRkTm9kZSA9IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZXMucHVzaChub2RlKTtcbiAgICAgICAgICAgICAgICAgICAga28udXRpbHMuZG9tTm9kZURpc3Bvc2FsLmFkZERpc3Bvc2VDYWxsYmFjayhub2RlLCBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBrby51dGlscy5hcnJheVJlbW92ZUl0ZW0obm9kZXMsIG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFub2Rlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmFibGUuZGlzcG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3N1YnNjcmliYWJsZSA9IHN1YnNjcmliYWJsZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEV4dGVuZCB0aGUgYmluZGluZyBjb250ZXh0IGhpZXJhcmNoeSB3aXRoIGEgbmV3IHZpZXcgbW9kZWwgb2JqZWN0LiBJZiB0aGUgcGFyZW50IGNvbnRleHQgaXMgd2F0Y2hpbmdcbiAgICAvLyBhbnkgb2JzZXJ2YWJsZXMsIHRoZSBuZXcgY2hpbGQgY29udGV4dCB3aWxsIGF1dG9tYXRpY2FsbHkgZ2V0IGEgZGVwZW5kZW5jeSBvbiB0aGUgcGFyZW50IGNvbnRleHQuXG4gICAgLy8gQnV0IHRoaXMgZG9lcyBub3QgbWVhbiB0aGF0IHRoZSAkZGF0YSB2YWx1ZSBvZiB0aGUgY2hpbGQgY29udGV4dCB3aWxsIGFsc28gZ2V0IHVwZGF0ZWQuIElmIHRoZSBjaGlsZFxuICAgIC8vIHZpZXcgbW9kZWwgYWxzbyBkZXBlbmRzIG9uIHRoZSBwYXJlbnQgdmlldyBtb2RlbCwgeW91IG11c3QgcHJvdmlkZSBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgY29ycmVjdFxuICAgIC8vIHZpZXcgbW9kZWwgb24gZWFjaCB1cGRhdGUuXG4gICAga28uYmluZGluZ0NvbnRleHQucHJvdG90eXBlWydjcmVhdGVDaGlsZENvbnRleHQnXSA9IGZ1bmN0aW9uIChkYXRhSXRlbU9yQWNjZXNzb3IsIGRhdGFJdGVtQWxpYXMsIGV4dGVuZENhbGxiYWNrLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBuZXcga28uYmluZGluZ0NvbnRleHQoZGF0YUl0ZW1PckFjY2Vzc29yLCB0aGlzLCBkYXRhSXRlbUFsaWFzLCBmdW5jdGlvbihzZWxmLCBwYXJlbnRDb250ZXh0KSB7XG4gICAgICAgICAgICAvLyBFeHRlbmQgdGhlIGNvbnRleHQgaGllcmFyY2h5IGJ5IHNldHRpbmcgdGhlIGFwcHJvcHJpYXRlIHBvaW50ZXJzXG4gICAgICAgICAgICBzZWxmWyckcGFyZW50Q29udGV4dCddID0gcGFyZW50Q29udGV4dDtcbiAgICAgICAgICAgIHNlbGZbJyRwYXJlbnQnXSA9IHBhcmVudENvbnRleHRbJyRkYXRhJ107XG4gICAgICAgICAgICBzZWxmWyckcGFyZW50cyddID0gKHBhcmVudENvbnRleHRbJyRwYXJlbnRzJ10gfHwgW10pLnNsaWNlKDApO1xuICAgICAgICAgICAgc2VsZlsnJHBhcmVudHMnXS51bnNoaWZ0KHNlbGZbJyRwYXJlbnQnXSk7XG4gICAgICAgICAgICBpZiAoZXh0ZW5kQ2FsbGJhY2spXG4gICAgICAgICAgICAgICAgZXh0ZW5kQ2FsbGJhY2soc2VsZik7XG4gICAgICAgIH0sIG9wdGlvbnMpO1xuICAgIH07XG5cbiAgICAvLyBFeHRlbmQgdGhlIGJpbmRpbmcgY29udGV4dCB3aXRoIG5ldyBjdXN0b20gcHJvcGVydGllcy4gVGhpcyBkb2Vzbid0IGNoYW5nZSB0aGUgY29udGV4dCBoaWVyYXJjaHkuXG4gICAgLy8gU2ltaWxhcmx5IHRvIFwiY2hpbGRcIiBjb250ZXh0cywgcHJvdmlkZSBhIGZ1bmN0aW9uIGhlcmUgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGNvcnJlY3QgdmFsdWVzIGFyZSBzZXRcbiAgICAvLyB3aGVuIGFuIG9ic2VydmFibGUgdmlldyBtb2RlbCBpcyB1cGRhdGVkLlxuICAgIGtvLmJpbmRpbmdDb250ZXh0LnByb3RvdHlwZVsnZXh0ZW5kJ10gPSBmdW5jdGlvbihwcm9wZXJ0aWVzKSB7XG4gICAgICAgIC8vIElmIHRoZSBwYXJlbnQgY29udGV4dCByZWZlcmVuY2VzIGFuIG9ic2VydmFibGUgdmlldyBtb2RlbCwgXCJfc3Vic2NyaWJhYmxlXCIgd2lsbCBhbHdheXMgYmUgdGhlXG4gICAgICAgIC8vIGxhdGVzdCB2aWV3IG1vZGVsIG9iamVjdC4gSWYgbm90LCBcIl9zdWJzY3JpYmFibGVcIiBpc24ndCBzZXQsIGFuZCB3ZSBjYW4gdXNlIHRoZSBzdGF0aWMgXCIkZGF0YVwiIHZhbHVlLlxuICAgICAgICByZXR1cm4gbmV3IGtvLmJpbmRpbmdDb250ZXh0KHRoaXMuX3N1YnNjcmliYWJsZSB8fCB0aGlzWyckZGF0YSddLCB0aGlzLCBudWxsLCBmdW5jdGlvbihzZWxmLCBwYXJlbnRDb250ZXh0KSB7XG4gICAgICAgICAgICAvLyBUaGlzIFwiY2hpbGRcIiBjb250ZXh0IGRvZXNuJ3QgZGlyZWN0bHkgdHJhY2sgYSBwYXJlbnQgb2JzZXJ2YWJsZSB2aWV3IG1vZGVsLFxuICAgICAgICAgICAgLy8gc28gd2UgbmVlZCB0byBtYW51YWxseSBzZXQgdGhlICRyYXdEYXRhIHZhbHVlIHRvIG1hdGNoIHRoZSBwYXJlbnQuXG4gICAgICAgICAgICBzZWxmWyckcmF3RGF0YSddID0gcGFyZW50Q29udGV4dFsnJHJhd0RhdGEnXTtcbiAgICAgICAgICAgIGtvLnV0aWxzLmV4dGVuZChzZWxmLCB0eXBlb2YocHJvcGVydGllcykgPT0gXCJmdW5jdGlvblwiID8gcHJvcGVydGllcygpIDogcHJvcGVydGllcyk7XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBrby5iaW5kaW5nQ29udGV4dC5wcm90b3R5cGUuY3JlYXRlU3RhdGljQ2hpbGRDb250ZXh0ID0gZnVuY3Rpb24gKGRhdGFJdGVtT3JBY2Nlc3NvciwgZGF0YUl0ZW1BbGlhcykge1xuICAgICAgICByZXR1cm4gdGhpc1snY3JlYXRlQ2hpbGRDb250ZXh0J10oZGF0YUl0ZW1PckFjY2Vzc29yLCBkYXRhSXRlbUFsaWFzLCBudWxsLCB7IFwiZXhwb3J0RGVwZW5kZW5jaWVzXCI6IHRydWUgfSk7XG4gICAgfTtcblxuICAgIC8vIFJldHVybnMgdGhlIHZhbHVlQWNjZXNvciBmdW5jdGlvbiBmb3IgYSBiaW5kaW5nIHZhbHVlXG4gICAgZnVuY3Rpb24gbWFrZVZhbHVlQWNjZXNzb3IodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vIFJldHVybnMgdGhlIHZhbHVlIG9mIGEgdmFsdWVBY2Nlc3NvciBmdW5jdGlvblxuICAgIGZ1bmN0aW9uIGV2YWx1YXRlVmFsdWVBY2Nlc3Nvcih2YWx1ZUFjY2Vzc29yKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZUFjY2Vzc29yKCk7XG4gICAgfVxuXG4gICAgLy8gR2l2ZW4gYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYmluZGluZ3MsIGNyZWF0ZSBhbmQgcmV0dXJuIGEgbmV3IG9iamVjdCB0aGF0IGNvbnRhaW5zXG4gICAgLy8gYmluZGluZyB2YWx1ZS1hY2Nlc3NvcnMgZnVuY3Rpb25zLiBFYWNoIGFjY2Vzc29yIGZ1bmN0aW9uIGNhbGxzIHRoZSBvcmlnaW5hbCBmdW5jdGlvblxuICAgIC8vIHNvIHRoYXQgaXQgYWx3YXlzIGdldHMgdGhlIGxhdGVzdCB2YWx1ZSBhbmQgYWxsIGRlcGVuZGVuY2llcyBhcmUgY2FwdHVyZWQuIFRoaXMgaXMgdXNlZFxuICAgIC8vIGJ5IGtvLmFwcGx5QmluZGluZ3NUb05vZGUgYW5kIGdldEJpbmRpbmdzQW5kTWFrZUFjY2Vzc29ycy5cbiAgICBmdW5jdGlvbiBtYWtlQWNjZXNzb3JzRnJvbUZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgICAgIHJldHVybiBrby51dGlscy5vYmplY3RNYXAoa28uZGVwZW5kZW5jeURldGVjdGlvbi5pZ25vcmUoY2FsbGJhY2spLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKClba2V5XTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEdpdmVuIGEgYmluZGluZ3MgZnVuY3Rpb24gb3Igb2JqZWN0LCBjcmVhdGUgYW5kIHJldHVybiBhIG5ldyBvYmplY3QgdGhhdCBjb250YWluc1xuICAgIC8vIGJpbmRpbmcgdmFsdWUtYWNjZXNzb3JzIGZ1bmN0aW9ucy4gVGhpcyBpcyB1c2VkIGJ5IGtvLmFwcGx5QmluZGluZ3NUb05vZGUuXG4gICAgZnVuY3Rpb24gbWFrZUJpbmRpbmdBY2Nlc3NvcnMoYmluZGluZ3MsIGNvbnRleHQsIG5vZGUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBiaW5kaW5ncyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIG1ha2VBY2Nlc3NvcnNGcm9tRnVuY3Rpb24oYmluZGluZ3MuYmluZChudWxsLCBjb250ZXh0LCBub2RlKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4ga28udXRpbHMub2JqZWN0TWFwKGJpbmRpbmdzLCBtYWtlVmFsdWVBY2Nlc3Nvcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgaWYgdGhlIGJpbmRpbmcgcHJvdmlkZXIgZG9lc24ndCBpbmNsdWRlIGEgZ2V0QmluZGluZ0FjY2Vzc29ycyBmdW5jdGlvbi5cbiAgICAvLyBJdCBtdXN0IGJlIGNhbGxlZCB3aXRoICd0aGlzJyBzZXQgdG8gdGhlIHByb3ZpZGVyIGluc3RhbmNlLlxuICAgIGZ1bmN0aW9uIGdldEJpbmRpbmdzQW5kTWFrZUFjY2Vzc29ycyhub2RlLCBjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiBtYWtlQWNjZXNzb3JzRnJvbUZ1bmN0aW9uKHRoaXNbJ2dldEJpbmRpbmdzJ10uYmluZCh0aGlzLCBub2RlLCBjb250ZXh0KSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdmFsaWRhdGVUaGF0QmluZGluZ0lzQWxsb3dlZEZvclZpcnR1YWxFbGVtZW50cyhiaW5kaW5nTmFtZSkge1xuICAgICAgICB2YXIgdmFsaWRhdG9yID0ga28udmlydHVhbEVsZW1lbnRzLmFsbG93ZWRCaW5kaW5nc1tiaW5kaW5nTmFtZV07XG4gICAgICAgIGlmICghdmFsaWRhdG9yKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIGJpbmRpbmcgJ1wiICsgYmluZGluZ05hbWUgKyBcIicgY2Fubm90IGJlIHVzZWQgd2l0aCB2aXJ0dWFsIGVsZW1lbnRzXCIpXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYXBwbHlCaW5kaW5nc1RvRGVzY2VuZGFudHNJbnRlcm5hbCAoYmluZGluZ0NvbnRleHQsIGVsZW1lbnRPclZpcnR1YWxFbGVtZW50LCBiaW5kaW5nQ29udGV4dHNNYXlEaWZmZXJGcm9tRG9tUGFyZW50RWxlbWVudCkge1xuICAgICAgICB2YXIgY3VycmVudENoaWxkLFxuICAgICAgICAgICAgbmV4dEluUXVldWUgPSBrby52aXJ0dWFsRWxlbWVudHMuZmlyc3RDaGlsZChlbGVtZW50T3JWaXJ0dWFsRWxlbWVudCksXG4gICAgICAgICAgICBwcm92aWRlciA9IGtvLmJpbmRpbmdQcm92aWRlclsnaW5zdGFuY2UnXSxcbiAgICAgICAgICAgIHByZXByb2Nlc3NOb2RlID0gcHJvdmlkZXJbJ3ByZXByb2Nlc3NOb2RlJ107XG5cbiAgICAgICAgLy8gUHJlcHJvY2Vzc2luZyBhbGxvd3MgYSBiaW5kaW5nIHByb3ZpZGVyIHRvIG11dGF0ZSBhIG5vZGUgYmVmb3JlIGJpbmRpbmdzIGFyZSBhcHBsaWVkIHRvIGl0LiBGb3IgZXhhbXBsZSBpdCdzXG4gICAgICAgIC8vIHBvc3NpYmxlIHRvIGluc2VydCBuZXcgc2libGluZ3MgYWZ0ZXIgaXQsIGFuZC9vciByZXBsYWNlIHRoZSBub2RlIHdpdGggYSBkaWZmZXJlbnQgb25lLiBUaGlzIGNhbiBiZSB1c2VkIHRvXG4gICAgICAgIC8vIGltcGxlbWVudCBjdXN0b20gYmluZGluZyBzeW50YXhlcywgc3VjaCBhcyB7eyB2YWx1ZSB9fSBmb3Igc3RyaW5nIGludGVycG9sYXRpb24sIG9yIGN1c3RvbSBlbGVtZW50IHR5cGVzIHRoYXRcbiAgICAgICAgLy8gdHJpZ2dlciBpbnNlcnRpb24gb2YgPHRlbXBsYXRlPiBjb250ZW50cyBhdCB0aGF0IHBvaW50IGluIHRoZSBkb2N1bWVudC5cbiAgICAgICAgaWYgKHByZXByb2Nlc3NOb2RlKSB7XG4gICAgICAgICAgICB3aGlsZSAoY3VycmVudENoaWxkID0gbmV4dEluUXVldWUpIHtcbiAgICAgICAgICAgICAgICBuZXh0SW5RdWV1ZSA9IGtvLnZpcnR1YWxFbGVtZW50cy5uZXh0U2libGluZyhjdXJyZW50Q2hpbGQpO1xuICAgICAgICAgICAgICAgIHByZXByb2Nlc3NOb2RlLmNhbGwocHJvdmlkZXIsIGN1cnJlbnRDaGlsZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBSZXNldCBuZXh0SW5RdWV1ZSBmb3IgdGhlIG5leHQgbG9vcFxuICAgICAgICAgICAgbmV4dEluUXVldWUgPSBrby52aXJ0dWFsRWxlbWVudHMuZmlyc3RDaGlsZChlbGVtZW50T3JWaXJ0dWFsRWxlbWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICB3aGlsZSAoY3VycmVudENoaWxkID0gbmV4dEluUXVldWUpIHtcbiAgICAgICAgICAgIC8vIEtlZXAgYSByZWNvcmQgb2YgdGhlIG5leHQgY2hpbGQgKmJlZm9yZSogYXBwbHlpbmcgYmluZGluZ3MsIGluIGNhc2UgdGhlIGJpbmRpbmcgcmVtb3ZlcyB0aGUgY3VycmVudCBjaGlsZCBmcm9tIGl0cyBwb3NpdGlvblxuICAgICAgICAgICAgbmV4dEluUXVldWUgPSBrby52aXJ0dWFsRWxlbWVudHMubmV4dFNpYmxpbmcoY3VycmVudENoaWxkKTtcbiAgICAgICAgICAgIGFwcGx5QmluZGluZ3NUb05vZGVBbmREZXNjZW5kYW50c0ludGVybmFsKGJpbmRpbmdDb250ZXh0LCBjdXJyZW50Q2hpbGQsIGJpbmRpbmdDb250ZXh0c01heURpZmZlckZyb21Eb21QYXJlbnRFbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFwcGx5QmluZGluZ3NUb05vZGVBbmREZXNjZW5kYW50c0ludGVybmFsIChiaW5kaW5nQ29udGV4dCwgbm9kZVZlcmlmaWVkLCBiaW5kaW5nQ29udGV4dE1heURpZmZlckZyb21Eb21QYXJlbnRFbGVtZW50KSB7XG4gICAgICAgIHZhciBzaG91bGRCaW5kRGVzY2VuZGFudHMgPSB0cnVlO1xuXG4gICAgICAgIC8vIFBlcmYgb3B0aW1pc2F0aW9uOiBBcHBseSBiaW5kaW5ncyBvbmx5IGlmLi4uXG4gICAgICAgIC8vICgxKSBXZSBuZWVkIHRvIHN0b3JlIHRoZSBiaW5kaW5nIGNvbnRleHQgb24gdGhpcyBub2RlIChiZWNhdXNlIGl0IG1heSBkaWZmZXIgZnJvbSB0aGUgRE9NIHBhcmVudCBub2RlJ3MgYmluZGluZyBjb250ZXh0KVxuICAgICAgICAvLyAgICAgTm90ZSB0aGF0IHdlIGNhbid0IHN0b3JlIGJpbmRpbmcgY29udGV4dHMgb24gbm9uLWVsZW1lbnRzIChlLmcuLCB0ZXh0IG5vZGVzKSwgYXMgSUUgZG9lc24ndCBhbGxvdyBleHBhbmRvIHByb3BlcnRpZXMgZm9yIHRob3NlXG4gICAgICAgIC8vICgyKSBJdCBtaWdodCBoYXZlIGJpbmRpbmdzIChlLmcuLCBpdCBoYXMgYSBkYXRhLWJpbmQgYXR0cmlidXRlLCBvciBpdCdzIGEgbWFya2VyIGZvciBhIGNvbnRhaW5lcmxlc3MgdGVtcGxhdGUpXG4gICAgICAgIHZhciBpc0VsZW1lbnQgPSAobm9kZVZlcmlmaWVkLm5vZGVUeXBlID09PSAxKTtcbiAgICAgICAgaWYgKGlzRWxlbWVudCkgLy8gV29ya2Fyb3VuZCBJRSA8PSA4IEhUTUwgcGFyc2luZyB3ZWlyZG5lc3NcbiAgICAgICAgICAgIGtvLnZpcnR1YWxFbGVtZW50cy5ub3JtYWxpc2VWaXJ0dWFsRWxlbWVudERvbVN0cnVjdHVyZShub2RlVmVyaWZpZWQpO1xuXG4gICAgICAgIHZhciBzaG91bGRBcHBseUJpbmRpbmdzID0gKGlzRWxlbWVudCAmJiBiaW5kaW5nQ29udGV4dE1heURpZmZlckZyb21Eb21QYXJlbnRFbGVtZW50KSAgICAgICAgICAgICAvLyBDYXNlICgxKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGtvLmJpbmRpbmdQcm92aWRlclsnaW5zdGFuY2UnXVsnbm9kZUhhc0JpbmRpbmdzJ10obm9kZVZlcmlmaWVkKTsgICAgICAgLy8gQ2FzZSAoMilcbiAgICAgICAgaWYgKHNob3VsZEFwcGx5QmluZGluZ3MpXG4gICAgICAgICAgICBzaG91bGRCaW5kRGVzY2VuZGFudHMgPSBhcHBseUJpbmRpbmdzVG9Ob2RlSW50ZXJuYWwobm9kZVZlcmlmaWVkLCBudWxsLCBiaW5kaW5nQ29udGV4dCwgYmluZGluZ0NvbnRleHRNYXlEaWZmZXJGcm9tRG9tUGFyZW50RWxlbWVudClbJ3Nob3VsZEJpbmREZXNjZW5kYW50cyddO1xuXG4gICAgICAgIGlmIChzaG91bGRCaW5kRGVzY2VuZGFudHMgJiYgIWJpbmRpbmdEb2VzTm90UmVjdXJzZUludG9FbGVtZW50VHlwZXNba28udXRpbHMudGFnTmFtZUxvd2VyKG5vZGVWZXJpZmllZCldKSB7XG4gICAgICAgICAgICAvLyBXZSdyZSByZWN1cnNpbmcgYXV0b21hdGljYWxseSBpbnRvIChyZWFsIG9yIHZpcnR1YWwpIGNoaWxkIG5vZGVzIHdpdGhvdXQgY2hhbmdpbmcgYmluZGluZyBjb250ZXh0cy4gU28sXG4gICAgICAgICAgICAvLyAgKiBGb3IgY2hpbGRyZW4gb2YgYSAqcmVhbCogZWxlbWVudCwgdGhlIGJpbmRpbmcgY29udGV4dCBpcyBjZXJ0YWlubHkgdGhlIHNhbWUgYXMgb24gdGhlaXIgRE9NIC5wYXJlbnROb2RlLFxuICAgICAgICAgICAgLy8gICAgaGVuY2UgYmluZGluZ0NvbnRleHRzTWF5RGlmZmVyRnJvbURvbVBhcmVudEVsZW1lbnQgaXMgZmFsc2VcbiAgICAgICAgICAgIC8vICAqIEZvciBjaGlsZHJlbiBvZiBhICp2aXJ0dWFsKiBlbGVtZW50LCB3ZSBjYW4ndCBiZSBzdXJlLiBFdmFsdWF0aW5nIC5wYXJlbnROb2RlIG9uIHRob3NlIGNoaWxkcmVuIG1heVxuICAgICAgICAgICAgLy8gICAgc2tpcCBvdmVyIGFueSBudW1iZXIgb2YgaW50ZXJtZWRpYXRlIHZpcnR1YWwgZWxlbWVudHMsIGFueSBvZiB3aGljaCBtaWdodCBkZWZpbmUgYSBjdXN0b20gYmluZGluZyBjb250ZXh0LFxuICAgICAgICAgICAgLy8gICAgaGVuY2UgYmluZGluZ0NvbnRleHRzTWF5RGlmZmVyRnJvbURvbVBhcmVudEVsZW1lbnQgaXMgdHJ1ZVxuICAgICAgICAgICAgYXBwbHlCaW5kaW5nc1RvRGVzY2VuZGFudHNJbnRlcm5hbChiaW5kaW5nQ29udGV4dCwgbm9kZVZlcmlmaWVkLCAvKiBiaW5kaW5nQ29udGV4dHNNYXlEaWZmZXJGcm9tRG9tUGFyZW50RWxlbWVudDogKi8gIWlzRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgYm91bmRFbGVtZW50RG9tRGF0YUtleSA9IGtvLnV0aWxzLmRvbURhdGEubmV4dEtleSgpO1xuXG5cbiAgICBmdW5jdGlvbiB0b3BvbG9naWNhbFNvcnRCaW5kaW5ncyhiaW5kaW5ncykge1xuICAgICAgICAvLyBEZXB0aC1maXJzdCBzb3J0XG4gICAgICAgIHZhciByZXN1bHQgPSBbXSwgICAgICAgICAgICAgICAgLy8gVGhlIGxpc3Qgb2Yga2V5L2hhbmRsZXIgcGFpcnMgdGhhdCB3ZSB3aWxsIHJldHVyblxuICAgICAgICAgICAgYmluZGluZ3NDb25zaWRlcmVkID0ge30sICAgIC8vIEEgdGVtcG9yYXJ5IHJlY29yZCBvZiB3aGljaCBiaW5kaW5ncyBhcmUgYWxyZWFkeSBpbiAncmVzdWx0J1xuICAgICAgICAgICAgY3ljbGljRGVwZW5kZW5jeVN0YWNrID0gW107IC8vIEtlZXBzIHRyYWNrIG9mIGEgZGVwdGgtc2VhcmNoIHNvIHRoYXQsIGlmIHRoZXJlJ3MgYSBjeWNsZSwgd2Uga25vdyB3aGljaCBiaW5kaW5ncyBjYXVzZWQgaXRcbiAgICAgICAga28udXRpbHMub2JqZWN0Rm9yRWFjaChiaW5kaW5ncywgZnVuY3Rpb24gcHVzaEJpbmRpbmcoYmluZGluZ0tleSkge1xuICAgICAgICAgICAgaWYgKCFiaW5kaW5nc0NvbnNpZGVyZWRbYmluZGluZ0tleV0pIHtcbiAgICAgICAgICAgICAgICB2YXIgYmluZGluZyA9IGtvWydnZXRCaW5kaW5nSGFuZGxlciddKGJpbmRpbmdLZXkpO1xuICAgICAgICAgICAgICAgIGlmIChiaW5kaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEZpcnN0IGFkZCBkZXBlbmRlbmNpZXMgKGlmIGFueSkgb2YgdGhlIGN1cnJlbnQgYmluZGluZ1xuICAgICAgICAgICAgICAgICAgICBpZiAoYmluZGluZ1snYWZ0ZXInXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3ljbGljRGVwZW5kZW5jeVN0YWNrLnB1c2goYmluZGluZ0tleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBrby51dGlscy5hcnJheUZvckVhY2goYmluZGluZ1snYWZ0ZXInXSwgZnVuY3Rpb24oYmluZGluZ0RlcGVuZGVuY3lLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmluZGluZ3NbYmluZGluZ0RlcGVuZGVuY3lLZXldKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrby51dGlscy5hcnJheUluZGV4T2YoY3ljbGljRGVwZW5kZW5jeVN0YWNrLCBiaW5kaW5nRGVwZW5kZW5jeUtleSkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihcIkNhbm5vdCBjb21iaW5lIHRoZSBmb2xsb3dpbmcgYmluZGluZ3MsIGJlY2F1c2UgdGhleSBoYXZlIGEgY3ljbGljIGRlcGVuZGVuY3k6IFwiICsgY3ljbGljRGVwZW5kZW5jeVN0YWNrLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoQmluZGluZyhiaW5kaW5nRGVwZW5kZW5jeUtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN5Y2xpY0RlcGVuZGVuY3lTdGFjay5sZW5ndGgtLTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBOZXh0IGFkZCB0aGUgY3VycmVudCBiaW5kaW5nXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHsga2V5OiBiaW5kaW5nS2V5LCBoYW5kbGVyOiBiaW5kaW5nIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBiaW5kaW5nc0NvbnNpZGVyZWRbYmluZGluZ0tleV0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFwcGx5QmluZGluZ3NUb05vZGVJbnRlcm5hbChub2RlLCBzb3VyY2VCaW5kaW5ncywgYmluZGluZ0NvbnRleHQsIGJpbmRpbmdDb250ZXh0TWF5RGlmZmVyRnJvbURvbVBhcmVudEVsZW1lbnQpIHtcbiAgICAgICAgLy8gUHJldmVudCBtdWx0aXBsZSBhcHBseUJpbmRpbmdzIGNhbGxzIGZvciB0aGUgc2FtZSBub2RlLCBleGNlcHQgd2hlbiBhIGJpbmRpbmcgdmFsdWUgaXMgc3BlY2lmaWVkXG4gICAgICAgIHZhciBhbHJlYWR5Qm91bmQgPSBrby51dGlscy5kb21EYXRhLmdldChub2RlLCBib3VuZEVsZW1lbnREb21EYXRhS2V5KTtcbiAgICAgICAgaWYgKCFzb3VyY2VCaW5kaW5ncykge1xuICAgICAgICAgICAgaWYgKGFscmVhZHlCb3VuZCkge1xuICAgICAgICAgICAgICAgIHRocm93IEVycm9yKFwiWW91IGNhbm5vdCBhcHBseSBiaW5kaW5ncyBtdWx0aXBsZSB0aW1lcyB0byB0aGUgc2FtZSBlbGVtZW50LlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGtvLnV0aWxzLmRvbURhdGEuc2V0KG5vZGUsIGJvdW5kRWxlbWVudERvbURhdGFLZXksIHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT3B0aW1pemF0aW9uOiBEb24ndCBzdG9yZSB0aGUgYmluZGluZyBjb250ZXh0IG9uIHRoaXMgbm9kZSBpZiBpdCdzIGRlZmluaXRlbHkgdGhlIHNhbWUgYXMgb24gbm9kZS5wYXJlbnROb2RlLCBiZWNhdXNlXG4gICAgICAgIC8vIHdlIGNhbiBlYXNpbHkgcmVjb3ZlciBpdCBqdXN0IGJ5IHNjYW5uaW5nIHVwIHRoZSBub2RlJ3MgYW5jZXN0b3JzIGluIHRoZSBET01cbiAgICAgICAgLy8gKG5vdGU6IGhlcmUsIHBhcmVudCBub2RlIG1lYW5zIFwicmVhbCBET00gcGFyZW50XCIgbm90IFwidmlydHVhbCBwYXJlbnRcIiwgYXMgdGhlcmUncyBubyBPKDEpIHdheSB0byBmaW5kIHRoZSB2aXJ0dWFsIHBhcmVudClcbiAgICAgICAgaWYgKCFhbHJlYWR5Qm91bmQgJiYgYmluZGluZ0NvbnRleHRNYXlEaWZmZXJGcm9tRG9tUGFyZW50RWxlbWVudClcbiAgICAgICAgICAgIGtvLnN0b3JlZEJpbmRpbmdDb250ZXh0Rm9yTm9kZShub2RlLCBiaW5kaW5nQ29udGV4dCk7XG5cbiAgICAgICAgLy8gVXNlIGJpbmRpbmdzIGlmIGdpdmVuLCBvdGhlcndpc2UgZmFsbCBiYWNrIG9uIGFza2luZyB0aGUgYmluZGluZ3MgcHJvdmlkZXIgdG8gZ2l2ZSB1cyBzb21lIGJpbmRpbmdzXG4gICAgICAgIHZhciBiaW5kaW5ncztcbiAgICAgICAgaWYgKHNvdXJjZUJpbmRpbmdzICYmIHR5cGVvZiBzb3VyY2VCaW5kaW5ncyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgYmluZGluZ3MgPSBzb3VyY2VCaW5kaW5ncztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBwcm92aWRlciA9IGtvLmJpbmRpbmdQcm92aWRlclsnaW5zdGFuY2UnXSxcbiAgICAgICAgICAgICAgICBnZXRCaW5kaW5ncyA9IHByb3ZpZGVyWydnZXRCaW5kaW5nQWNjZXNzb3JzJ10gfHwgZ2V0QmluZGluZ3NBbmRNYWtlQWNjZXNzb3JzO1xuXG4gICAgICAgICAgICAvLyBHZXQgdGhlIGJpbmRpbmcgZnJvbSB0aGUgcHJvdmlkZXIgd2l0aGluIGEgY29tcHV0ZWQgb2JzZXJ2YWJsZSBzbyB0aGF0IHdlIGNhbiB1cGRhdGUgdGhlIGJpbmRpbmdzIHdoZW5ldmVyXG4gICAgICAgICAgICAvLyB0aGUgYmluZGluZyBjb250ZXh0IGlzIHVwZGF0ZWQgb3IgaWYgdGhlIGJpbmRpbmcgcHJvdmlkZXIgYWNjZXNzZXMgb2JzZXJ2YWJsZXMuXG4gICAgICAgICAgICB2YXIgYmluZGluZ3NVcGRhdGVyID0ga28uZGVwZW5kZW50T2JzZXJ2YWJsZShcbiAgICAgICAgICAgICAgICBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgYmluZGluZ3MgPSBzb3VyY2VCaW5kaW5ncyA/IHNvdXJjZUJpbmRpbmdzKGJpbmRpbmdDb250ZXh0LCBub2RlKSA6IGdldEJpbmRpbmdzLmNhbGwocHJvdmlkZXIsIG5vZGUsIGJpbmRpbmdDb250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgLy8gUmVnaXN0ZXIgYSBkZXBlbmRlbmN5IG9uIHRoZSBiaW5kaW5nIGNvbnRleHQgdG8gc3VwcG9ydCBvYnNlcnZhYmxlIHZpZXcgbW9kZWxzLlxuICAgICAgICAgICAgICAgICAgICBpZiAoYmluZGluZ3MgJiYgYmluZGluZ0NvbnRleHQuX3N1YnNjcmliYWJsZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRpbmdDb250ZXh0Ll9zdWJzY3JpYmFibGUoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJpbmRpbmdzO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgbnVsbCwgeyBkaXNwb3NlV2hlbk5vZGVJc1JlbW92ZWQ6IG5vZGUgfVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgaWYgKCFiaW5kaW5ncyB8fCAhYmluZGluZ3NVcGRhdGVyLmlzQWN0aXZlKCkpXG4gICAgICAgICAgICAgICAgYmluZGluZ3NVcGRhdGVyID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBiaW5kaW5nSGFuZGxlclRoYXRDb250cm9sc0Rlc2NlbmRhbnRCaW5kaW5ncztcbiAgICAgICAgaWYgKGJpbmRpbmdzKSB7XG4gICAgICAgICAgICAvLyBSZXR1cm4gdGhlIHZhbHVlIGFjY2Vzc29yIGZvciBhIGdpdmVuIGJpbmRpbmcuIFdoZW4gYmluZGluZ3MgYXJlIHN0YXRpYyAod29uJ3QgYmUgdXBkYXRlZCBiZWNhdXNlIG9mIGEgYmluZGluZ1xuICAgICAgICAgICAgLy8gY29udGV4dCB1cGRhdGUpLCBqdXN0IHJldHVybiB0aGUgdmFsdWUgYWNjZXNzb3IgZnJvbSB0aGUgYmluZGluZy4gT3RoZXJ3aXNlLCByZXR1cm4gYSBmdW5jdGlvbiB0aGF0IGFsd2F5cyBnZXRzXG4gICAgICAgICAgICAvLyB0aGUgbGF0ZXN0IGJpbmRpbmcgdmFsdWUgYW5kIHJlZ2lzdGVycyBhIGRlcGVuZGVuY3kgb24gdGhlIGJpbmRpbmcgdXBkYXRlci5cbiAgICAgICAgICAgIHZhciBnZXRWYWx1ZUFjY2Vzc29yID0gYmluZGluZ3NVcGRhdGVyXG4gICAgICAgICAgICAgICAgPyBmdW5jdGlvbihiaW5kaW5nS2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBldmFsdWF0ZVZhbHVlQWNjZXNzb3IoYmluZGluZ3NVcGRhdGVyKClbYmluZGluZ0tleV0pO1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH0gOiBmdW5jdGlvbihiaW5kaW5nS2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBiaW5kaW5nc1tiaW5kaW5nS2V5XTtcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAvLyBVc2Ugb2YgYWxsQmluZGluZ3MgYXMgYSBmdW5jdGlvbiBpcyBtYWludGFpbmVkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgYnV0IGl0cyB1c2UgaXMgZGVwcmVjYXRlZFxuICAgICAgICAgICAgZnVuY3Rpb24gYWxsQmluZGluZ3MoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGtvLnV0aWxzLm9iamVjdE1hcChiaW5kaW5nc1VwZGF0ZXIgPyBiaW5kaW5nc1VwZGF0ZXIoKSA6IGJpbmRpbmdzLCBldmFsdWF0ZVZhbHVlQWNjZXNzb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBpcyB0aGUgMy54IGFsbEJpbmRpbmdzIEFQSVxuICAgICAgICAgICAgYWxsQmluZGluZ3NbJ2dldCddID0gZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGJpbmRpbmdzW2tleV0gJiYgZXZhbHVhdGVWYWx1ZUFjY2Vzc29yKGdldFZhbHVlQWNjZXNzb3Ioa2V5KSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYWxsQmluZGluZ3NbJ2hhcyddID0gZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGtleSBpbiBiaW5kaW5ncztcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIC8vIEZpcnN0IHB1dCB0aGUgYmluZGluZ3MgaW50byB0aGUgcmlnaHQgb3JkZXJcbiAgICAgICAgICAgIHZhciBvcmRlcmVkQmluZGluZ3MgPSB0b3BvbG9naWNhbFNvcnRCaW5kaW5ncyhiaW5kaW5ncyk7XG5cbiAgICAgICAgICAgIC8vIEdvIHRocm91Z2ggdGhlIHNvcnRlZCBiaW5kaW5ncywgY2FsbGluZyBpbml0IGFuZCB1cGRhdGUgZm9yIGVhY2hcbiAgICAgICAgICAgIGtvLnV0aWxzLmFycmF5Rm9yRWFjaChvcmRlcmVkQmluZGluZ3MsIGZ1bmN0aW9uKGJpbmRpbmdLZXlBbmRIYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHRvcG9sb2dpY2FsU29ydEJpbmRpbmdzIGhhcyBhbHJlYWR5IGZpbHRlcmVkIG91dCBhbnkgbm9uZXhpc3RlbnQgYmluZGluZyBoYW5kbGVycyxcbiAgICAgICAgICAgICAgICAvLyBzbyBiaW5kaW5nS2V5QW5kSGFuZGxlci5oYW5kbGVyIHdpbGwgYWx3YXlzIGJlIG5vbm51bGwuXG4gICAgICAgICAgICAgICAgdmFyIGhhbmRsZXJJbml0Rm4gPSBiaW5kaW5nS2V5QW5kSGFuZGxlci5oYW5kbGVyW1wiaW5pdFwiXSxcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlclVwZGF0ZUZuID0gYmluZGluZ0tleUFuZEhhbmRsZXIuaGFuZGxlcltcInVwZGF0ZVwiXSxcbiAgICAgICAgICAgICAgICAgICAgYmluZGluZ0tleSA9IGJpbmRpbmdLZXlBbmRIYW5kbGVyLmtleTtcblxuICAgICAgICAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSA4KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlVGhhdEJpbmRpbmdJc0FsbG93ZWRGb3JWaXJ0dWFsRWxlbWVudHMoYmluZGluZ0tleSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gUnVuIGluaXQsIGlnbm9yaW5nIGFueSBkZXBlbmRlbmNpZXNcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBoYW5kbGVySW5pdEZuID09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgICAgICAgICAga28uZGVwZW5kZW5jeURldGVjdGlvbi5pZ25vcmUoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGluaXRSZXN1bHQgPSBoYW5kbGVySW5pdEZuKG5vZGUsIGdldFZhbHVlQWNjZXNzb3IoYmluZGluZ0tleSksIGFsbEJpbmRpbmdzLCBiaW5kaW5nQ29udGV4dFsnJGRhdGEnXSwgYmluZGluZ0NvbnRleHQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBiaW5kaW5nIGhhbmRsZXIgY2xhaW1zIHRvIGNvbnRyb2wgZGVzY2VuZGFudCBiaW5kaW5ncywgbWFrZSBhIG5vdGUgb2YgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbml0UmVzdWx0ICYmIGluaXRSZXN1bHRbJ2NvbnRyb2xzRGVzY2VuZGFudEJpbmRpbmdzJ10pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJpbmRpbmdIYW5kbGVyVGhhdENvbnRyb2xzRGVzY2VuZGFudEJpbmRpbmdzICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNdWx0aXBsZSBiaW5kaW5ncyAoXCIgKyBiaW5kaW5nSGFuZGxlclRoYXRDb250cm9sc0Rlc2NlbmRhbnRCaW5kaW5ncyArIFwiIGFuZCBcIiArIGJpbmRpbmdLZXkgKyBcIikgYXJlIHRyeWluZyB0byBjb250cm9sIGRlc2NlbmRhbnQgYmluZGluZ3Mgb2YgdGhlIHNhbWUgZWxlbWVudC4gWW91IGNhbm5vdCB1c2UgdGhlc2UgYmluZGluZ3MgdG9nZXRoZXIgb24gdGhlIHNhbWUgZWxlbWVudC5cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRpbmdIYW5kbGVyVGhhdENvbnRyb2xzRGVzY2VuZGFudEJpbmRpbmdzID0gYmluZGluZ0tleTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIFJ1biB1cGRhdGUgaW4gaXRzIG93biBjb21wdXRlZCB3cmFwcGVyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaGFuZGxlclVwZGF0ZUZuID09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgICAgICAgICAga28uZGVwZW5kZW50T2JzZXJ2YWJsZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlclVwZGF0ZUZuKG5vZGUsIGdldFZhbHVlQWNjZXNzb3IoYmluZGluZ0tleSksIGFsbEJpbmRpbmdzLCBiaW5kaW5nQ29udGV4dFsnJGRhdGEnXSwgYmluZGluZ0NvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGRpc3Bvc2VXaGVuTm9kZUlzUmVtb3ZlZDogbm9kZSB9XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgZXgubWVzc2FnZSA9IFwiVW5hYmxlIHRvIHByb2Nlc3MgYmluZGluZyBcXFwiXCIgKyBiaW5kaW5nS2V5ICsgXCI6IFwiICsgYmluZGluZ3NbYmluZGluZ0tleV0gKyBcIlxcXCJcXG5NZXNzYWdlOiBcIiArIGV4Lm1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGV4O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICdzaG91bGRCaW5kRGVzY2VuZGFudHMnOiBiaW5kaW5nSGFuZGxlclRoYXRDb250cm9sc0Rlc2NlbmRhbnRCaW5kaW5ncyA9PT0gdW5kZWZpbmVkXG4gICAgICAgIH07XG4gICAgfTtcblxuICAgIHZhciBzdG9yZWRCaW5kaW5nQ29udGV4dERvbURhdGFLZXkgPSBrby51dGlscy5kb21EYXRhLm5leHRLZXkoKTtcbiAgICBrby5zdG9yZWRCaW5kaW5nQ29udGV4dEZvck5vZGUgPSBmdW5jdGlvbiAobm9kZSwgYmluZGluZ0NvbnRleHQpIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMikge1xuICAgICAgICAgICAga28udXRpbHMuZG9tRGF0YS5zZXQobm9kZSwgc3RvcmVkQmluZGluZ0NvbnRleHREb21EYXRhS2V5LCBiaW5kaW5nQ29udGV4dCk7XG4gICAgICAgICAgICBpZiAoYmluZGluZ0NvbnRleHQuX3N1YnNjcmliYWJsZSlcbiAgICAgICAgICAgICAgICBiaW5kaW5nQ29udGV4dC5fc3Vic2NyaWJhYmxlLl9hZGROb2RlKG5vZGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGtvLnV0aWxzLmRvbURhdGEuZ2V0KG5vZGUsIHN0b3JlZEJpbmRpbmdDb250ZXh0RG9tRGF0YUtleSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRCaW5kaW5nQ29udGV4dCh2aWV3TW9kZWxPckJpbmRpbmdDb250ZXh0KSB7XG4gICAgICAgIHJldHVybiB2aWV3TW9kZWxPckJpbmRpbmdDb250ZXh0ICYmICh2aWV3TW9kZWxPckJpbmRpbmdDb250ZXh0IGluc3RhbmNlb2Yga28uYmluZGluZ0NvbnRleHQpXG4gICAgICAgICAgICA/IHZpZXdNb2RlbE9yQmluZGluZ0NvbnRleHRcbiAgICAgICAgICAgIDogbmV3IGtvLmJpbmRpbmdDb250ZXh0KHZpZXdNb2RlbE9yQmluZGluZ0NvbnRleHQpO1xuICAgIH1cblxuICAgIGtvLmFwcGx5QmluZGluZ0FjY2Vzc29yc1RvTm9kZSA9IGZ1bmN0aW9uIChub2RlLCBiaW5kaW5ncywgdmlld01vZGVsT3JCaW5kaW5nQ29udGV4dCkge1xuICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMSkgLy8gSWYgaXQncyBhbiBlbGVtZW50LCB3b3JrYXJvdW5kIElFIDw9IDggSFRNTCBwYXJzaW5nIHdlaXJkbmVzc1xuICAgICAgICAgICAga28udmlydHVhbEVsZW1lbnRzLm5vcm1hbGlzZVZpcnR1YWxFbGVtZW50RG9tU3RydWN0dXJlKG5vZGUpO1xuICAgICAgICByZXR1cm4gYXBwbHlCaW5kaW5nc1RvTm9kZUludGVybmFsKG5vZGUsIGJpbmRpbmdzLCBnZXRCaW5kaW5nQ29udGV4dCh2aWV3TW9kZWxPckJpbmRpbmdDb250ZXh0KSwgdHJ1ZSk7XG4gICAgfTtcblxuICAgIGtvLmFwcGx5QmluZGluZ3NUb05vZGUgPSBmdW5jdGlvbiAobm9kZSwgYmluZGluZ3MsIHZpZXdNb2RlbE9yQmluZGluZ0NvbnRleHQpIHtcbiAgICAgICAgdmFyIGNvbnRleHQgPSBnZXRCaW5kaW5nQ29udGV4dCh2aWV3TW9kZWxPckJpbmRpbmdDb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIGtvLmFwcGx5QmluZGluZ0FjY2Vzc29yc1RvTm9kZShub2RlLCBtYWtlQmluZGluZ0FjY2Vzc29ycyhiaW5kaW5ncywgY29udGV4dCwgbm9kZSksIGNvbnRleHQpO1xuICAgIH07XG5cbiAgICBrby5hcHBseUJpbmRpbmdzVG9EZXNjZW5kYW50cyA9IGZ1bmN0aW9uKHZpZXdNb2RlbE9yQmluZGluZ0NvbnRleHQsIHJvb3ROb2RlKSB7XG4gICAgICAgIGlmIChyb290Tm9kZS5ub2RlVHlwZSA9PT0gMSB8fCByb290Tm9kZS5ub2RlVHlwZSA9PT0gOClcbiAgICAgICAgICAgIGFwcGx5QmluZGluZ3NUb0Rlc2NlbmRhbnRzSW50ZXJuYWwoZ2V0QmluZGluZ0NvbnRleHQodmlld01vZGVsT3JCaW5kaW5nQ29udGV4dCksIHJvb3ROb2RlLCB0cnVlKTtcbiAgICB9O1xuXG4gICAga28uYXBwbHlCaW5kaW5ncyA9IGZ1bmN0aW9uICh2aWV3TW9kZWxPckJpbmRpbmdDb250ZXh0LCByb290Tm9kZSkge1xuICAgICAgICAvLyBJZiBqUXVlcnkgaXMgbG9hZGVkIGFmdGVyIEtub2Nrb3V0LCB3ZSB3b24ndCBpbml0aWFsbHkgaGF2ZSBhY2Nlc3MgdG8gaXQuIFNvIHNhdmUgaXQgaGVyZS5cbiAgICAgICAgaWYgKCFqUXVlcnlJbnN0YW5jZSAmJiB3aW5kb3dbJ2pRdWVyeSddKSB7XG4gICAgICAgICAgICBqUXVlcnlJbnN0YW5jZSA9IHdpbmRvd1snalF1ZXJ5J107XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocm9vdE5vZGUgJiYgKHJvb3ROb2RlLm5vZGVUeXBlICE9PSAxKSAmJiAocm9vdE5vZGUubm9kZVR5cGUgIT09IDgpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwia28uYXBwbHlCaW5kaW5nczogZmlyc3QgcGFyYW1ldGVyIHNob3VsZCBiZSB5b3VyIHZpZXcgbW9kZWw7IHNlY29uZCBwYXJhbWV0ZXIgc2hvdWxkIGJlIGEgRE9NIG5vZGVcIik7XG4gICAgICAgIHJvb3ROb2RlID0gcm9vdE5vZGUgfHwgd2luZG93LmRvY3VtZW50LmJvZHk7IC8vIE1ha2UgXCJyb290Tm9kZVwiIHBhcmFtZXRlciBvcHRpb25hbFxuXG4gICAgICAgIGFwcGx5QmluZGluZ3NUb05vZGVBbmREZXNjZW5kYW50c0ludGVybmFsKGdldEJpbmRpbmdDb250ZXh0KHZpZXdNb2RlbE9yQmluZGluZ0NvbnRleHQpLCByb290Tm9kZSwgdHJ1ZSk7XG4gICAgfTtcblxuICAgIC8vIFJldHJpZXZpbmcgYmluZGluZyBjb250ZXh0IGZyb20gYXJiaXRyYXJ5IG5vZGVzXG4gICAga28uY29udGV4dEZvciA9IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgLy8gV2UgY2FuIG9ubHkgZG8gc29tZXRoaW5nIG1lYW5pbmdmdWwgZm9yIGVsZW1lbnRzIGFuZCBjb21tZW50IG5vZGVzIChpbiBwYXJ0aWN1bGFyLCBub3QgdGV4dCBub2RlcywgYXMgSUUgY2FuJ3Qgc3RvcmUgZG9tZGF0YSBmb3IgdGhlbSlcbiAgICAgICAgc3dpdGNoIChub2RlLm5vZGVUeXBlKSB7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgICAgdmFyIGNvbnRleHQgPSBrby5zdG9yZWRCaW5kaW5nQ29udGV4dEZvck5vZGUobm9kZSk7XG4gICAgICAgICAgICAgICAgaWYgKGNvbnRleHQpIHJldHVybiBjb250ZXh0O1xuICAgICAgICAgICAgICAgIGlmIChub2RlLnBhcmVudE5vZGUpIHJldHVybiBrby5jb250ZXh0Rm9yKG5vZGUucGFyZW50Tm9kZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIGtvLmRhdGFGb3IgPSBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgIHZhciBjb250ZXh0ID0ga28uY29udGV4dEZvcihub2RlKTtcbiAgICAgICAgcmV0dXJuIGNvbnRleHQgPyBjb250ZXh0WyckZGF0YSddIDogdW5kZWZpbmVkO1xuICAgIH07XG5cbiAgICBrby5leHBvcnRTeW1ib2woJ2JpbmRpbmdIYW5kbGVycycsIGtvLmJpbmRpbmdIYW5kbGVycyk7XG4gICAga28uZXhwb3J0U3ltYm9sKCdhcHBseUJpbmRpbmdzJywga28uYXBwbHlCaW5kaW5ncyk7XG4gICAga28uZXhwb3J0U3ltYm9sKCdhcHBseUJpbmRpbmdzVG9EZXNjZW5kYW50cycsIGtvLmFwcGx5QmluZGluZ3NUb0Rlc2NlbmRhbnRzKTtcbiAgICBrby5leHBvcnRTeW1ib2woJ2FwcGx5QmluZGluZ0FjY2Vzc29yc1RvTm9kZScsIGtvLmFwcGx5QmluZGluZ0FjY2Vzc29yc1RvTm9kZSk7XG4gICAga28uZXhwb3J0U3ltYm9sKCdhcHBseUJpbmRpbmdzVG9Ob2RlJywga28uYXBwbHlCaW5kaW5nc1RvTm9kZSk7XG4gICAga28uZXhwb3J0U3ltYm9sKCdjb250ZXh0Rm9yJywga28uY29udGV4dEZvcik7XG4gICAga28uZXhwb3J0U3ltYm9sKCdkYXRhRm9yJywga28uZGF0YUZvcik7XG59KSgpO1xuKGZ1bmN0aW9uKHVuZGVmaW5lZCkge1xuICAgIHZhciBsb2FkaW5nU3Vic2NyaWJhYmxlc0NhY2hlID0ge30sIC8vIFRyYWNrcyBjb21wb25lbnQgbG9hZHMgdGhhdCBhcmUgY3VycmVudGx5IGluIGZsaWdodFxuICAgICAgICBsb2FkZWREZWZpbml0aW9uc0NhY2hlID0ge307ICAgIC8vIFRyYWNrcyBjb21wb25lbnQgbG9hZHMgdGhhdCBoYXZlIGFscmVhZHkgY29tcGxldGVkXG5cbiAgICBrby5jb21wb25lbnRzID0ge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uKGNvbXBvbmVudE5hbWUsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICB2YXIgY2FjaGVkRGVmaW5pdGlvbiA9IGdldE9iamVjdE93blByb3BlcnR5KGxvYWRlZERlZmluaXRpb25zQ2FjaGUsIGNvbXBvbmVudE5hbWUpO1xuICAgICAgICAgICAgaWYgKGNhY2hlZERlZmluaXRpb24pIHtcbiAgICAgICAgICAgICAgICAvLyBJdCdzIGFscmVhZHkgbG9hZGVkIGFuZCBjYWNoZWQuIFJldXNlIHRoZSBzYW1lIGRlZmluaXRpb24gb2JqZWN0LlxuICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCBmb3IgQVBJIGNvbnNpc3RlbmN5LCBldmVuIGNhY2hlIGhpdHMgY29tcGxldGUgYXN5bmNocm9ub3VzbHkgYnkgZGVmYXVsdC5cbiAgICAgICAgICAgICAgICAvLyBZb3UgY2FuIGJ5cGFzcyB0aGlzIGJ5IHB1dHRpbmcgc3luY2hyb25vdXM6dHJ1ZSBvbiB5b3VyIGNvbXBvbmVudCBjb25maWcuXG4gICAgICAgICAgICAgICAgaWYgKGNhY2hlZERlZmluaXRpb24uaXNTeW5jaHJvbm91c0NvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICBrby5kZXBlbmRlbmN5RGV0ZWN0aW9uLmlnbm9yZShmdW5jdGlvbigpIHsgLy8gU2VlIGNvbW1lbnQgaW4gbG9hZGVyUmVnaXN0cnlCZWhhdmlvcnMuanMgZm9yIHJlYXNvbmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soY2FjaGVkRGVmaW5pdGlvbi5kZWZpbml0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAga28udGFza3Muc2NoZWR1bGUoZnVuY3Rpb24oKSB7IGNhbGxiYWNrKGNhY2hlZERlZmluaXRpb24uZGVmaW5pdGlvbik7IH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gSm9pbiB0aGUgbG9hZGluZyBwcm9jZXNzIHRoYXQgaXMgYWxyZWFkeSB1bmRlcndheSwgb3Igc3RhcnQgYSBuZXcgb25lLlxuICAgICAgICAgICAgICAgIGxvYWRDb21wb25lbnRBbmROb3RpZnkoY29tcG9uZW50TmFtZSwgY2FsbGJhY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIGNsZWFyQ2FjaGVkRGVmaW5pdGlvbjogZnVuY3Rpb24oY29tcG9uZW50TmFtZSkge1xuICAgICAgICAgICAgZGVsZXRlIGxvYWRlZERlZmluaXRpb25zQ2FjaGVbY29tcG9uZW50TmFtZV07XG4gICAgICAgIH0sXG5cbiAgICAgICAgX2dldEZpcnN0UmVzdWx0RnJvbUxvYWRlcnM6IGdldEZpcnN0UmVzdWx0RnJvbUxvYWRlcnNcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gZ2V0T2JqZWN0T3duUHJvcGVydHkob2JqLCBwcm9wTmFtZSkge1xuICAgICAgICByZXR1cm4gb2JqLmhhc093blByb3BlcnR5KHByb3BOYW1lKSA/IG9ialtwcm9wTmFtZV0gOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbG9hZENvbXBvbmVudEFuZE5vdGlmeShjb21wb25lbnROYW1lLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgc3Vic2NyaWJhYmxlID0gZ2V0T2JqZWN0T3duUHJvcGVydHkobG9hZGluZ1N1YnNjcmliYWJsZXNDYWNoZSwgY29tcG9uZW50TmFtZSksXG4gICAgICAgICAgICBjb21wbGV0ZWRBc3luYztcbiAgICAgICAgaWYgKCFzdWJzY3JpYmFibGUpIHtcbiAgICAgICAgICAgIC8vIEl0J3Mgbm90IHN0YXJ0ZWQgbG9hZGluZyB5ZXQuIFN0YXJ0IGxvYWRpbmcsIGFuZCB3aGVuIGl0J3MgZG9uZSwgbW92ZSBpdCB0byBsb2FkZWREZWZpbml0aW9uc0NhY2hlLlxuICAgICAgICAgICAgc3Vic2NyaWJhYmxlID0gbG9hZGluZ1N1YnNjcmliYWJsZXNDYWNoZVtjb21wb25lbnROYW1lXSA9IG5ldyBrby5zdWJzY3JpYmFibGUoKTtcbiAgICAgICAgICAgIHN1YnNjcmliYWJsZS5zdWJzY3JpYmUoY2FsbGJhY2spO1xuXG4gICAgICAgICAgICBiZWdpbkxvYWRpbmdDb21wb25lbnQoY29tcG9uZW50TmFtZSwgZnVuY3Rpb24oZGVmaW5pdGlvbiwgY29uZmlnKSB7XG4gICAgICAgICAgICAgICAgdmFyIGlzU3luY2hyb25vdXNDb21wb25lbnQgPSAhIShjb25maWcgJiYgY29uZmlnWydzeW5jaHJvbm91cyddKTtcbiAgICAgICAgICAgICAgICBsb2FkZWREZWZpbml0aW9uc0NhY2hlW2NvbXBvbmVudE5hbWVdID0geyBkZWZpbml0aW9uOiBkZWZpbml0aW9uLCBpc1N5bmNocm9ub3VzQ29tcG9uZW50OiBpc1N5bmNocm9ub3VzQ29tcG9uZW50IH07XG4gICAgICAgICAgICAgICAgZGVsZXRlIGxvYWRpbmdTdWJzY3JpYmFibGVzQ2FjaGVbY29tcG9uZW50TmFtZV07XG5cbiAgICAgICAgICAgICAgICAvLyBGb3IgQVBJIGNvbnNpc3RlbmN5LCBhbGwgbG9hZHMgY29tcGxldGUgYXN5bmNocm9ub3VzbHkuIEhvd2V2ZXIgd2Ugd2FudCB0byBhdm9pZFxuICAgICAgICAgICAgICAgIC8vIGFkZGluZyBhbiBleHRyYSB0YXNrIHNjaGVkdWxlIGlmIGl0J3MgdW5uZWNlc3NhcnkgKGkuZS4sIHRoZSBjb21wbGV0aW9uIGlzIGFscmVhZHlcbiAgICAgICAgICAgICAgICAvLyBhc3luYykuXG4gICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAvLyBZb3UgY2FuIGJ5cGFzcyB0aGUgJ2Fsd2F5cyBhc3luY2hyb25vdXMnIGZlYXR1cmUgYnkgcHV0dGluZyB0aGUgc3luY2hyb25vdXM6dHJ1ZVxuICAgICAgICAgICAgICAgIC8vIGZsYWcgb24geW91ciBjb21wb25lbnQgY29uZmlndXJhdGlvbiB3aGVuIHlvdSByZWdpc3RlciBpdC5cbiAgICAgICAgICAgICAgICBpZiAoY29tcGxldGVkQXN5bmMgfHwgaXNTeW5jaHJvbm91c0NvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgbm90aWZ5U3Vic2NyaWJlcnMgaWdub3JlcyBhbnkgZGVwZW5kZW5jaWVzIHJlYWQgd2l0aGluIHRoZSBjYWxsYmFjay5cbiAgICAgICAgICAgICAgICAgICAgLy8gU2VlIGNvbW1lbnQgaW4gbG9hZGVyUmVnaXN0cnlCZWhhdmlvcnMuanMgZm9yIHJlYXNvbmluZ1xuICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmFibGVbJ25vdGlmeVN1YnNjcmliZXJzJ10oZGVmaW5pdGlvbik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAga28udGFza3Muc2NoZWR1bGUoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmFibGVbJ25vdGlmeVN1YnNjcmliZXJzJ10oZGVmaW5pdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29tcGxldGVkQXN5bmMgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3Vic2NyaWJhYmxlLnN1YnNjcmliZShjYWxsYmFjayk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBiZWdpbkxvYWRpbmdDb21wb25lbnQoY29tcG9uZW50TmFtZSwgY2FsbGJhY2spIHtcbiAgICAgICAgZ2V0Rmlyc3RSZXN1bHRGcm9tTG9hZGVycygnZ2V0Q29uZmlnJywgW2NvbXBvbmVudE5hbWVdLCBmdW5jdGlvbihjb25maWcpIHtcbiAgICAgICAgICAgIGlmIChjb25maWcpIHtcbiAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIGEgY29uZmlnLCBzbyBub3cgbG9hZCBpdHMgZGVmaW5pdGlvblxuICAgICAgICAgICAgICAgIGdldEZpcnN0UmVzdWx0RnJvbUxvYWRlcnMoJ2xvYWRDb21wb25lbnQnLCBbY29tcG9uZW50TmFtZSwgY29uZmlnXSwgZnVuY3Rpb24oZGVmaW5pdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhkZWZpbml0aW9uLCBjb25maWcpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgY29tcG9uZW50IGhhcyBubyBjb25maWcgLSBpdCdzIHVua25vd24gdG8gYWxsIHRoZSBsb2FkZXJzLlxuICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCBhbiBlcnJvciAoZS5nLiwgYSBtb2R1bGUgbG9hZGluZyBlcnJvcikgLSB0aGF0IHdvdWxkIGFib3J0IHRoZVxuICAgICAgICAgICAgICAgIC8vIHByb2Nlc3MgYW5kIHRoaXMgY2FsbGJhY2sgd291bGQgbm90IHJ1bi4gRm9yIHRoaXMgY2FsbGJhY2sgdG8gcnVuLCBhbGwgbG9hZGVycyBtdXN0XG4gICAgICAgICAgICAgICAgLy8gaGF2ZSBjb25maXJtZWQgdGhleSBkb24ndCBrbm93IGFib3V0IHRoaXMgY29tcG9uZW50LlxuICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRGaXJzdFJlc3VsdEZyb21Mb2FkZXJzKG1ldGhvZE5hbWUsIGFyZ3NFeGNlcHRDYWxsYmFjaywgY2FsbGJhY2ssIGNhbmRpZGF0ZUxvYWRlcnMpIHtcbiAgICAgICAgLy8gT24gdGhlIGZpcnN0IGNhbGwgaW4gdGhlIHN0YWNrLCBzdGFydCB3aXRoIHRoZSBmdWxsIHNldCBvZiBsb2FkZXJzXG4gICAgICAgIGlmICghY2FuZGlkYXRlTG9hZGVycykge1xuICAgICAgICAgICAgY2FuZGlkYXRlTG9hZGVycyA9IGtvLmNvbXBvbmVudHNbJ2xvYWRlcnMnXS5zbGljZSgwKTsgLy8gVXNlIGEgY29weSwgYmVjYXVzZSB3ZSdsbCBiZSBtdXRhdGluZyB0aGlzIGFycmF5XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUcnkgdGhlIG5leHQgY2FuZGlkYXRlXG4gICAgICAgIHZhciBjdXJyZW50Q2FuZGlkYXRlTG9hZGVyID0gY2FuZGlkYXRlTG9hZGVycy5zaGlmdCgpO1xuICAgICAgICBpZiAoY3VycmVudENhbmRpZGF0ZUxvYWRlcikge1xuICAgICAgICAgICAgdmFyIG1ldGhvZEluc3RhbmNlID0gY3VycmVudENhbmRpZGF0ZUxvYWRlclttZXRob2ROYW1lXTtcbiAgICAgICAgICAgIGlmIChtZXRob2RJbnN0YW5jZSkge1xuICAgICAgICAgICAgICAgIHZhciB3YXNBYm9ydGVkID0gZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIHN5bmNocm9ub3VzUmV0dXJuVmFsdWUgPSBtZXRob2RJbnN0YW5jZS5hcHBseShjdXJyZW50Q2FuZGlkYXRlTG9hZGVyLCBhcmdzRXhjZXB0Q2FsbGJhY2suY29uY2F0KGZ1bmN0aW9uKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdhc0Fib3J0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzdWx0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBjYW5kaWRhdGUgcmV0dXJuZWQgYSB2YWx1ZS4gVXNlIGl0LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRyeSB0aGUgbmV4dCBjYW5kaWRhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGaXJzdFJlc3VsdEZyb21Mb2FkZXJzKG1ldGhvZE5hbWUsIGFyZ3NFeGNlcHRDYWxsYmFjaywgY2FsbGJhY2ssIGNhbmRpZGF0ZUxvYWRlcnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICAgICAgICAvLyBDdXJyZW50bHksIGxvYWRlcnMgbWF5IG5vdCByZXR1cm4gYW55dGhpbmcgc3luY2hyb25vdXNseS4gVGhpcyBsZWF2ZXMgb3BlbiB0aGUgcG9zc2liaWxpdHlcbiAgICAgICAgICAgICAgICAvLyB0aGF0IHdlJ2xsIGV4dGVuZCB0aGUgQVBJIHRvIHN1cHBvcnQgc3luY2hyb25vdXMgcmV0dXJuIHZhbHVlcyBpbiB0aGUgZnV0dXJlLiBJdCB3b24ndCBiZVxuICAgICAgICAgICAgICAgIC8vIGEgYnJlYWtpbmcgY2hhbmdlLCBiZWNhdXNlIGN1cnJlbnRseSBubyBsb2FkZXIgaXMgYWxsb3dlZCB0byByZXR1cm4gYW55dGhpbmcgZXhjZXB0IHVuZGVmaW5lZC5cbiAgICAgICAgICAgICAgICBpZiAoc3luY2hyb25vdXNSZXR1cm5WYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHdhc0Fib3J0ZWQgPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIE1ldGhvZCB0byBzdXBwcmVzcyBleGNlcHRpb25zIHdpbGwgcmVtYWluIHVuZG9jdW1lbnRlZC4gVGhpcyBpcyBvbmx5IHRvIGtlZXBcbiAgICAgICAgICAgICAgICAgICAgLy8gS08ncyBzcGVjcyBydW5uaW5nIHRpZGlseSwgc2luY2Ugd2UgY2FuIG9ic2VydmUgdGhlIGxvYWRpbmcgZ290IGFib3J0ZWQgd2l0aG91dFxuICAgICAgICAgICAgICAgICAgICAvLyBoYXZpbmcgZXhjZXB0aW9ucyBjbHV0dGVyaW5nIHVwIHRoZSBjb25zb2xlIHRvby5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjdXJyZW50Q2FuZGlkYXRlTG9hZGVyWydzdXBwcmVzc0xvYWRlckV4Y2VwdGlvbnMnXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb21wb25lbnQgbG9hZGVycyBtdXN0IHN1cHBseSB2YWx1ZXMgYnkgaW52b2tpbmcgdGhlIGNhbGxiYWNrLCBub3QgYnkgcmV0dXJuaW5nIHZhbHVlcyBzeW5jaHJvbm91c2x5LicpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBUaGlzIGNhbmRpZGF0ZSBkb2Vzbid0IGhhdmUgdGhlIHJlbGV2YW50IGhhbmRsZXIuIFN5bmNocm9ub3VzbHkgbW92ZSBvbiB0byB0aGUgbmV4dCBvbmUuXG4gICAgICAgICAgICAgICAgZ2V0Rmlyc3RSZXN1bHRGcm9tTG9hZGVycyhtZXRob2ROYW1lLCBhcmdzRXhjZXB0Q2FsbGJhY2ssIGNhbGxiYWNrLCBjYW5kaWRhdGVMb2FkZXJzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIE5vIGNhbmRpZGF0ZXMgcmV0dXJuZWQgYSB2YWx1ZVxuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZWZlcmVuY2UgdGhlIGxvYWRlcnMgdmlhIHN0cmluZyBuYW1lIHNvIGl0J3MgcG9zc2libGUgZm9yIGRldmVsb3BlcnNcbiAgICAvLyB0byByZXBsYWNlIHRoZSB3aG9sZSBhcnJheSBieSBhc3NpZ25pbmcgdG8ga28uY29tcG9uZW50cy5sb2FkZXJzXG4gICAga28uY29tcG9uZW50c1snbG9hZGVycyddID0gW107XG5cbiAgICBrby5leHBvcnRTeW1ib2woJ2NvbXBvbmVudHMnLCBrby5jb21wb25lbnRzKTtcbiAgICBrby5leHBvcnRTeW1ib2woJ2NvbXBvbmVudHMuZ2V0Jywga28uY29tcG9uZW50cy5nZXQpO1xuICAgIGtvLmV4cG9ydFN5bWJvbCgnY29tcG9uZW50cy5jbGVhckNhY2hlZERlZmluaXRpb24nLCBrby5jb21wb25lbnRzLmNsZWFyQ2FjaGVkRGVmaW5pdGlvbik7XG59KSgpO1xuKGZ1bmN0aW9uKHVuZGVmaW5lZCkge1xuXG4gICAgLy8gVGhlIGRlZmF1bHQgbG9hZGVyIGlzIHJlc3BvbnNpYmxlIGZvciB0d28gdGhpbmdzOlxuICAgIC8vIDEuIE1haW50YWluaW5nIHRoZSBkZWZhdWx0IGluLW1lbW9yeSByZWdpc3RyeSBvZiBjb21wb25lbnQgY29uZmlndXJhdGlvbiBvYmplY3RzXG4gICAgLy8gICAgKGkuZS4sIHRoZSB0aGluZyB5b3UncmUgd3JpdGluZyB0byB3aGVuIHlvdSBjYWxsIGtvLmNvbXBvbmVudHMucmVnaXN0ZXIoc29tZU5hbWUsIC4uLikpXG4gICAgLy8gMi4gQW5zd2VyaW5nIHJlcXVlc3RzIGZvciBjb21wb25lbnRzIGJ5IGZldGNoaW5nIGNvbmZpZ3VyYXRpb24gb2JqZWN0c1xuICAgIC8vICAgIGZyb20gdGhhdCBkZWZhdWx0IGluLW1lbW9yeSByZWdpc3RyeSBhbmQgcmVzb2x2aW5nIHRoZW0gaW50byBzdGFuZGFyZFxuICAgIC8vICAgIGNvbXBvbmVudCBkZWZpbml0aW9uIG9iamVjdHMgKG9mIHRoZSBmb3JtIHsgY3JlYXRlVmlld01vZGVsOiAuLi4sIHRlbXBsYXRlOiAuLi4gfSlcbiAgICAvLyBDdXN0b20gbG9hZGVycyBtYXkgb3ZlcnJpZGUgZWl0aGVyIG9mIHRoZXNlIGZhY2lsaXRpZXMsIGkuZS4sXG4gICAgLy8gMS4gVG8gc3VwcGx5IGNvbmZpZ3VyYXRpb24gb2JqZWN0cyBmcm9tIHNvbWUgb3RoZXIgc291cmNlIChlLmcuLCBjb252ZW50aW9ucylcbiAgICAvLyAyLiBPciwgdG8gcmVzb2x2ZSBjb25maWd1cmF0aW9uIG9iamVjdHMgYnkgbG9hZGluZyB2aWV3bW9kZWxzL3RlbXBsYXRlcyB2aWEgYXJiaXRyYXJ5IGxvZ2ljLlxuXG4gICAgdmFyIGRlZmF1bHRDb25maWdSZWdpc3RyeSA9IHt9O1xuXG4gICAga28uY29tcG9uZW50cy5yZWdpc3RlciA9IGZ1bmN0aW9uKGNvbXBvbmVudE5hbWUsIGNvbmZpZykge1xuICAgICAgICBpZiAoIWNvbmZpZykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNvbmZpZ3VyYXRpb24gZm9yICcgKyBjb21wb25lbnROYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChrby5jb21wb25lbnRzLmlzUmVnaXN0ZXJlZChjb21wb25lbnROYW1lKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb21wb25lbnQgJyArIGNvbXBvbmVudE5hbWUgKyAnIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVmYXVsdENvbmZpZ1JlZ2lzdHJ5W2NvbXBvbmVudE5hbWVdID0gY29uZmlnO1xuICAgIH07XG5cbiAgICBrby5jb21wb25lbnRzLmlzUmVnaXN0ZXJlZCA9IGZ1bmN0aW9uKGNvbXBvbmVudE5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGRlZmF1bHRDb25maWdSZWdpc3RyeS5oYXNPd25Qcm9wZXJ0eShjb21wb25lbnROYW1lKTtcbiAgICB9O1xuXG4gICAga28uY29tcG9uZW50cy51bnJlZ2lzdGVyID0gZnVuY3Rpb24oY29tcG9uZW50TmFtZSkge1xuICAgICAgICBkZWxldGUgZGVmYXVsdENvbmZpZ1JlZ2lzdHJ5W2NvbXBvbmVudE5hbWVdO1xuICAgICAgICBrby5jb21wb25lbnRzLmNsZWFyQ2FjaGVkRGVmaW5pdGlvbihjb21wb25lbnROYW1lKTtcbiAgICB9O1xuXG4gICAga28uY29tcG9uZW50cy5kZWZhdWx0TG9hZGVyID0ge1xuICAgICAgICAnZ2V0Q29uZmlnJzogZnVuY3Rpb24oY29tcG9uZW50TmFtZSwgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBkZWZhdWx0Q29uZmlnUmVnaXN0cnkuaGFzT3duUHJvcGVydHkoY29tcG9uZW50TmFtZSlcbiAgICAgICAgICAgICAgICA/IGRlZmF1bHRDb25maWdSZWdpc3RyeVtjb21wb25lbnROYW1lXVxuICAgICAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgICAgIGNhbGxiYWNrKHJlc3VsdCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgJ2xvYWRDb21wb25lbnQnOiBmdW5jdGlvbihjb21wb25lbnROYW1lLCBjb25maWcsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICB2YXIgZXJyb3JDYWxsYmFjayA9IG1ha2VFcnJvckNhbGxiYWNrKGNvbXBvbmVudE5hbWUpO1xuICAgICAgICAgICAgcG9zc2libHlHZXRDb25maWdGcm9tQW1kKGVycm9yQ2FsbGJhY2ssIGNvbmZpZywgZnVuY3Rpb24obG9hZGVkQ29uZmlnKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZUNvbmZpZyhjb21wb25lbnROYW1lLCBlcnJvckNhbGxiYWNrLCBsb2FkZWRDb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuXG4gICAgICAgICdsb2FkVGVtcGxhdGUnOiBmdW5jdGlvbihjb21wb25lbnROYW1lLCB0ZW1wbGF0ZUNvbmZpZywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHJlc29sdmVUZW1wbGF0ZShtYWtlRXJyb3JDYWxsYmFjayhjb21wb25lbnROYW1lKSwgdGVtcGxhdGVDb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICAnbG9hZFZpZXdNb2RlbCc6IGZ1bmN0aW9uKGNvbXBvbmVudE5hbWUsIHZpZXdNb2RlbENvbmZpZywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHJlc29sdmVWaWV3TW9kZWwobWFrZUVycm9yQ2FsbGJhY2soY29tcG9uZW50TmFtZSksIHZpZXdNb2RlbENvbmZpZywgY2FsbGJhY2spO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHZhciBjcmVhdGVWaWV3TW9kZWxLZXkgPSAnY3JlYXRlVmlld01vZGVsJztcblxuICAgIC8vIFRha2VzIGEgY29uZmlnIG9iamVjdCBvZiB0aGUgZm9ybSB7IHRlbXBsYXRlOiAuLi4sIHZpZXdNb2RlbDogLi4uIH0sIGFuZCBhc3luY2hyb25vdXNseSBjb252ZXJ0IGl0XG4gICAgLy8gaW50byB0aGUgc3RhbmRhcmQgY29tcG9uZW50IGRlZmluaXRpb24gZm9ybWF0OlxuICAgIC8vICAgIHsgdGVtcGxhdGU6IDxBcnJheU9mRG9tTm9kZXM+LCBjcmVhdGVWaWV3TW9kZWw6IGZ1bmN0aW9uKHBhcmFtcywgY29tcG9uZW50SW5mbykgeyAuLi4gfSB9LlxuICAgIC8vIFNpbmNlIGJvdGggdGVtcGxhdGUgYW5kIHZpZXdNb2RlbCBtYXkgbmVlZCB0byBiZSByZXNvbHZlZCBhc3luY2hyb25vdXNseSwgYm90aCB0YXNrcyBhcmUgcGVyZm9ybWVkXG4gICAgLy8gaW4gcGFyYWxsZWwsIGFuZCB0aGUgcmVzdWx0cyBqb2luZWQgd2hlbiBib3RoIGFyZSByZWFkeS4gV2UgZG9uJ3QgZGVwZW5kIG9uIGFueSBwcm9taXNlcyBpbmZyYXN0cnVjdHVyZSxcbiAgICAvLyBzbyB0aGlzIGlzIGltcGxlbWVudGVkIG1hbnVhbGx5IGJlbG93LlxuICAgIGZ1bmN0aW9uIHJlc29sdmVDb25maWcoY29tcG9uZW50TmFtZSwgZXJyb3JDYWxsYmFjaywgY29uZmlnLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgcmVzdWx0ID0ge30sXG4gICAgICAgICAgICBtYWtlQ2FsbEJhY2tXaGVuWmVybyA9IDIsXG4gICAgICAgICAgICB0cnlJc3N1ZUNhbGxiYWNrID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgaWYgKC0tbWFrZUNhbGxCYWNrV2hlblplcm8gPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2socmVzdWx0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGVtcGxhdGVDb25maWcgPSBjb25maWdbJ3RlbXBsYXRlJ10sXG4gICAgICAgICAgICB2aWV3TW9kZWxDb25maWcgPSBjb25maWdbJ3ZpZXdNb2RlbCddO1xuXG4gICAgICAgIGlmICh0ZW1wbGF0ZUNvbmZpZykge1xuICAgICAgICAgICAgcG9zc2libHlHZXRDb25maWdGcm9tQW1kKGVycm9yQ2FsbGJhY2ssIHRlbXBsYXRlQ29uZmlnLCBmdW5jdGlvbihsb2FkZWRDb25maWcpIHtcbiAgICAgICAgICAgICAgICBrby5jb21wb25lbnRzLl9nZXRGaXJzdFJlc3VsdEZyb21Mb2FkZXJzKCdsb2FkVGVtcGxhdGUnLCBbY29tcG9uZW50TmFtZSwgbG9hZGVkQ29uZmlnXSwgZnVuY3Rpb24ocmVzb2x2ZWRUZW1wbGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHRbJ3RlbXBsYXRlJ10gPSByZXNvbHZlZFRlbXBsYXRlO1xuICAgICAgICAgICAgICAgICAgICB0cnlJc3N1ZUNhbGxiYWNrKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRyeUlzc3VlQ2FsbGJhY2soKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2aWV3TW9kZWxDb25maWcpIHtcbiAgICAgICAgICAgIHBvc3NpYmx5R2V0Q29uZmlnRnJvbUFtZChlcnJvckNhbGxiYWNrLCB2aWV3TW9kZWxDb25maWcsIGZ1bmN0aW9uKGxvYWRlZENvbmZpZykge1xuICAgICAgICAgICAgICAgIGtvLmNvbXBvbmVudHMuX2dldEZpcnN0UmVzdWx0RnJvbUxvYWRlcnMoJ2xvYWRWaWV3TW9kZWwnLCBbY29tcG9uZW50TmFtZSwgbG9hZGVkQ29uZmlnXSwgZnVuY3Rpb24ocmVzb2x2ZWRWaWV3TW9kZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2NyZWF0ZVZpZXdNb2RlbEtleV0gPSByZXNvbHZlZFZpZXdNb2RlbDtcbiAgICAgICAgICAgICAgICAgICAgdHJ5SXNzdWVDYWxsYmFjaygpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0cnlJc3N1ZUNhbGxiYWNrKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZXNvbHZlVGVtcGxhdGUoZXJyb3JDYWxsYmFjaywgdGVtcGxhdGVDb25maWcsIGNhbGxiYWNrKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGVtcGxhdGVDb25maWcgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAvLyBNYXJrdXAgLSBwYXJzZSBpdFxuICAgICAgICAgICAgY2FsbGJhY2soa28udXRpbHMucGFyc2VIdG1sRnJhZ21lbnQodGVtcGxhdGVDb25maWcpKTtcbiAgICAgICAgfSBlbHNlIGlmICh0ZW1wbGF0ZUNvbmZpZyBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgICAgICAvLyBBc3N1bWUgYWxyZWFkeSBhbiBhcnJheSBvZiBET00gbm9kZXMgLSBwYXNzIHRocm91Z2ggdW5jaGFuZ2VkXG4gICAgICAgICAgICBjYWxsYmFjayh0ZW1wbGF0ZUNvbmZpZyk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNEb2N1bWVudEZyYWdtZW50KHRlbXBsYXRlQ29uZmlnKSkge1xuICAgICAgICAgICAgLy8gRG9jdW1lbnQgZnJhZ21lbnQgLSB1c2UgaXRzIGNoaWxkIG5vZGVzXG4gICAgICAgICAgICBjYWxsYmFjayhrby51dGlscy5tYWtlQXJyYXkodGVtcGxhdGVDb25maWcuY2hpbGROb2RlcykpO1xuICAgICAgICB9IGVsc2UgaWYgKHRlbXBsYXRlQ29uZmlnWydlbGVtZW50J10pIHtcbiAgICAgICAgICAgIHZhciBlbGVtZW50ID0gdGVtcGxhdGVDb25maWdbJ2VsZW1lbnQnXTtcbiAgICAgICAgICAgIGlmIChpc0RvbUVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICAvLyBFbGVtZW50IGluc3RhbmNlIC0gY29weSBpdHMgY2hpbGQgbm9kZXNcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhjbG9uZU5vZGVzRnJvbVRlbXBsYXRlU291cmNlRWxlbWVudChlbGVtZW50KSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBlbGVtZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIC8vIEVsZW1lbnQgSUQgLSBmaW5kIGl0LCB0aGVuIGNvcHkgaXRzIGNoaWxkIG5vZGVzXG4gICAgICAgICAgICAgICAgdmFyIGVsZW1JbnN0YW5jZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGlmIChlbGVtSW5zdGFuY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soY2xvbmVOb2Rlc0Zyb21UZW1wbGF0ZVNvdXJjZUVsZW1lbnQoZWxlbUluc3RhbmNlKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JDYWxsYmFjaygnQ2Fubm90IGZpbmQgZWxlbWVudCB3aXRoIElEICcgKyBlbGVtZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGVycm9yQ2FsbGJhY2soJ1Vua25vd24gZWxlbWVudCB0eXBlOiAnICsgZWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlcnJvckNhbGxiYWNrKCdVbmtub3duIHRlbXBsYXRlIHZhbHVlOiAnICsgdGVtcGxhdGVDb25maWcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVzb2x2ZVZpZXdNb2RlbChlcnJvckNhbGxiYWNrLCB2aWV3TW9kZWxDb25maWcsIGNhbGxiYWNrKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygdmlld01vZGVsQ29uZmlnID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAvLyBDb25zdHJ1Y3RvciAtIGNvbnZlcnQgdG8gc3RhbmRhcmQgZmFjdG9yeSBmdW5jdGlvbiBmb3JtYXRcbiAgICAgICAgICAgIC8vIEJ5IGRlc2lnbiwgdGhpcyBkb2VzICpub3QqIHN1cHBseSBjb21wb25lbnRJbmZvIHRvIHRoZSBjb25zdHJ1Y3RvciwgYXMgdGhlIGludGVudCBpcyB0aGF0XG4gICAgICAgICAgICAvLyBjb21wb25lbnRJbmZvIGNvbnRhaW5zIG5vbi12aWV3bW9kZWwgZGF0YSAoZS5nLiwgdGhlIGNvbXBvbmVudCdzIGVsZW1lbnQpIHRoYXQgc2hvdWxkIG9ubHlcbiAgICAgICAgICAgIC8vIGJlIHVzZWQgaW4gZmFjdG9yeSBmdW5jdGlvbnMsIG5vdCB2aWV3bW9kZWwgY29uc3RydWN0b3JzLlxuICAgICAgICAgICAgY2FsbGJhY2soZnVuY3Rpb24gKHBhcmFtcyAvKiwgY29tcG9uZW50SW5mbyAqLykge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgdmlld01vZGVsQ29uZmlnKHBhcmFtcyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygdmlld01vZGVsQ29uZmlnW2NyZWF0ZVZpZXdNb2RlbEtleV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIC8vIEFscmVhZHkgYSBmYWN0b3J5IGZ1bmN0aW9uIC0gdXNlIGl0IGFzLWlzXG4gICAgICAgICAgICBjYWxsYmFjayh2aWV3TW9kZWxDb25maWdbY3JlYXRlVmlld01vZGVsS2V5XSk7XG4gICAgICAgIH0gZWxzZSBpZiAoJ2luc3RhbmNlJyBpbiB2aWV3TW9kZWxDb25maWcpIHtcbiAgICAgICAgICAgIC8vIEZpeGVkIG9iamVjdCBpbnN0YW5jZSAtIHByb21vdGUgdG8gY3JlYXRlVmlld01vZGVsIGZvcm1hdCBmb3IgQVBJIGNvbnNpc3RlbmN5XG4gICAgICAgICAgICB2YXIgZml4ZWRJbnN0YW5jZSA9IHZpZXdNb2RlbENvbmZpZ1snaW5zdGFuY2UnXTtcbiAgICAgICAgICAgIGNhbGxiYWNrKGZ1bmN0aW9uIChwYXJhbXMsIGNvbXBvbmVudEluZm8pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZml4ZWRJbnN0YW5jZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKCd2aWV3TW9kZWwnIGluIHZpZXdNb2RlbENvbmZpZykge1xuICAgICAgICAgICAgLy8gUmVzb2x2ZWQgQU1EIG1vZHVsZSB3aG9zZSB2YWx1ZSBpcyBvZiB0aGUgZm9ybSB7IHZpZXdNb2RlbDogLi4uIH1cbiAgICAgICAgICAgIHJlc29sdmVWaWV3TW9kZWwoZXJyb3JDYWxsYmFjaywgdmlld01vZGVsQ29uZmlnWyd2aWV3TW9kZWwnXSwgY2FsbGJhY2spO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZXJyb3JDYWxsYmFjaygnVW5rbm93biB2aWV3TW9kZWwgdmFsdWU6ICcgKyB2aWV3TW9kZWxDb25maWcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2xvbmVOb2Rlc0Zyb21UZW1wbGF0ZVNvdXJjZUVsZW1lbnQoZWxlbUluc3RhbmNlKSB7XG4gICAgICAgIHN3aXRjaCAoa28udXRpbHMudGFnTmFtZUxvd2VyKGVsZW1JbnN0YW5jZSkpIHtcbiAgICAgICAgICAgIGNhc2UgJ3NjcmlwdCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGtvLnV0aWxzLnBhcnNlSHRtbEZyYWdtZW50KGVsZW1JbnN0YW5jZS50ZXh0KTtcbiAgICAgICAgICAgIGNhc2UgJ3RleHRhcmVhJzpcbiAgICAgICAgICAgICAgICByZXR1cm4ga28udXRpbHMucGFyc2VIdG1sRnJhZ21lbnQoZWxlbUluc3RhbmNlLnZhbHVlKTtcbiAgICAgICAgICAgIGNhc2UgJ3RlbXBsYXRlJzpcbiAgICAgICAgICAgICAgICAvLyBGb3IgYnJvd3NlcnMgd2l0aCBwcm9wZXIgPHRlbXBsYXRlPiBlbGVtZW50IHN1cHBvcnQgKGkuZS4sIHdoZXJlIHRoZSAuY29udGVudCBwcm9wZXJ0eVxuICAgICAgICAgICAgICAgIC8vIGdpdmVzIGEgZG9jdW1lbnQgZnJhZ21lbnQpLCB1c2UgdGhhdCBkb2N1bWVudCBmcmFnbWVudC5cbiAgICAgICAgICAgICAgICBpZiAoaXNEb2N1bWVudEZyYWdtZW50KGVsZW1JbnN0YW5jZS5jb250ZW50KSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ga28udXRpbHMuY2xvbmVOb2RlcyhlbGVtSW5zdGFuY2UuY29udGVudC5jaGlsZE5vZGVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZWd1bGFyIGVsZW1lbnRzIHN1Y2ggYXMgPGRpdj4sIGFuZCA8dGVtcGxhdGU+IGVsZW1lbnRzIG9uIG9sZCBicm93c2VycyB0aGF0IGRvbid0IHJlYWxseVxuICAgICAgICAvLyB1bmRlcnN0YW5kIDx0ZW1wbGF0ZT4gYW5kIGp1c3QgdHJlYXQgaXQgYXMgYSByZWd1bGFyIGNvbnRhaW5lclxuICAgICAgICByZXR1cm4ga28udXRpbHMuY2xvbmVOb2RlcyhlbGVtSW5zdGFuY2UuY2hpbGROb2Rlcyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNEb21FbGVtZW50KG9iaikge1xuICAgICAgICBpZiAod2luZG93WydIVE1MRWxlbWVudCddKSB7XG4gICAgICAgICAgICByZXR1cm4gb2JqIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gb2JqICYmIG9iai50YWdOYW1lICYmIG9iai5ub2RlVHlwZSA9PT0gMTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzRG9jdW1lbnRGcmFnbWVudChvYmopIHtcbiAgICAgICAgaWYgKHdpbmRvd1snRG9jdW1lbnRGcmFnbWVudCddKSB7XG4gICAgICAgICAgICByZXR1cm4gb2JqIGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBvYmogJiYgb2JqLm5vZGVUeXBlID09PSAxMTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBvc3NpYmx5R2V0Q29uZmlnRnJvbUFtZChlcnJvckNhbGxiYWNrLCBjb25maWcsIGNhbGxiYWNrKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnWydyZXF1aXJlJ10gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAvLyBUaGUgY29uZmlnIGlzIHRoZSB2YWx1ZSBvZiBhbiBBTUQgbW9kdWxlXG4gICAgICAgICAgICBpZiAoYW1kUmVxdWlyZSB8fCB3aW5kb3dbJ3JlcXVpcmUnXSkge1xuICAgICAgICAgICAgICAgIChhbWRSZXF1aXJlIHx8IHdpbmRvd1sncmVxdWlyZSddKShbY29uZmlnWydyZXF1aXJlJ11dLCBjYWxsYmFjayk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGVycm9yQ2FsbGJhY2soJ1VzZXMgcmVxdWlyZSwgYnV0IG5vIEFNRCBsb2FkZXIgaXMgcHJlc2VudCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FsbGJhY2soY29uZmlnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1ha2VFcnJvckNhbGxiYWNrKGNvbXBvbmVudE5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChtZXNzYWdlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbXBvbmVudCBcXCcnICsgY29tcG9uZW50TmFtZSArICdcXCc6ICcgKyBtZXNzYWdlKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBrby5leHBvcnRTeW1ib2woJ2NvbXBvbmVudHMucmVnaXN0ZXInLCBrby5jb21wb25lbnRzLnJlZ2lzdGVyKTtcbiAgICBrby5leHBvcnRTeW1ib2woJ2NvbXBvbmVudHMuaXNSZWdpc3RlcmVkJywga28uY29tcG9uZW50cy5pc1JlZ2lzdGVyZWQpO1xuICAgIGtvLmV4cG9ydFN5bWJvbCgnY29tcG9uZW50cy51bnJlZ2lzdGVyJywga28uY29tcG9uZW50cy51bnJlZ2lzdGVyKTtcblxuICAgIC8vIEV4cG9zZSB0aGUgZGVmYXVsdCBsb2FkZXIgc28gdGhhdCBkZXZlbG9wZXJzIGNhbiBkaXJlY3RseSBhc2sgaXQgZm9yIGNvbmZpZ3VyYXRpb25cbiAgICAvLyBvciB0byByZXNvbHZlIGNvbmZpZ3VyYXRpb25cbiAgICBrby5leHBvcnRTeW1ib2woJ2NvbXBvbmVudHMuZGVmYXVsdExvYWRlcicsIGtvLmNvbXBvbmVudHMuZGVmYXVsdExvYWRlcik7XG5cbiAgICAvLyBCeSBkZWZhdWx0LCB0aGUgZGVmYXVsdCBsb2FkZXIgaXMgdGhlIG9ubHkgcmVnaXN0ZXJlZCBjb21wb25lbnQgbG9hZGVyXG4gICAga28uY29tcG9uZW50c1snbG9hZGVycyddLnB1c2goa28uY29tcG9uZW50cy5kZWZhdWx0TG9hZGVyKTtcblxuICAgIC8vIFByaXZhdGVseSBleHBvc2UgdGhlIHVuZGVybHlpbmcgY29uZmlnIHJlZ2lzdHJ5IGZvciB1c2UgaW4gb2xkLUlFIHNoaW1cbiAgICBrby5jb21wb25lbnRzLl9hbGxSZWdpc3RlcmVkQ29tcG9uZW50cyA9IGRlZmF1bHRDb25maWdSZWdpc3RyeTtcbn0pKCk7XG4oZnVuY3Rpb24gKHVuZGVmaW5lZCkge1xuICAgIC8vIE92ZXJyaWRhYmxlIEFQSSBmb3IgZGV0ZXJtaW5pbmcgd2hpY2ggY29tcG9uZW50IG5hbWUgYXBwbGllcyB0byBhIGdpdmVuIG5vZGUuIEJ5IG92ZXJyaWRpbmcgdGhpcyxcbiAgICAvLyB5b3UgY2FuIGZvciBleGFtcGxlIG1hcCBzcGVjaWZpYyB0YWdOYW1lcyB0byBjb21wb25lbnRzIHRoYXQgYXJlIG5vdCBwcmVyZWdpc3RlcmVkLlxuICAgIGtvLmNvbXBvbmVudHNbJ2dldENvbXBvbmVudE5hbWVGb3JOb2RlJ10gPSBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgIHZhciB0YWdOYW1lTG93ZXIgPSBrby51dGlscy50YWdOYW1lTG93ZXIobm9kZSk7XG4gICAgICAgIGlmIChrby5jb21wb25lbnRzLmlzUmVnaXN0ZXJlZCh0YWdOYW1lTG93ZXIpKSB7XG4gICAgICAgICAgICAvLyBUcnkgdG8gZGV0ZXJtaW5lIHRoYXQgdGhpcyBub2RlIGNhbiBiZSBjb25zaWRlcmVkIGEgKmN1c3RvbSogZWxlbWVudDsgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9rbm9ja291dC9rbm9ja291dC9pc3N1ZXMvMTYwM1xuICAgICAgICAgICAgaWYgKHRhZ05hbWVMb3dlci5pbmRleE9mKCctJykgIT0gLTEgfHwgKCcnICsgbm9kZSkgPT0gXCJbb2JqZWN0IEhUTUxVbmtub3duRWxlbWVudF1cIiB8fCAoa28udXRpbHMuaWVWZXJzaW9uIDw9IDggJiYgbm9kZS50YWdOYW1lID09PSB0YWdOYW1lTG93ZXIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRhZ05hbWVMb3dlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBrby5jb21wb25lbnRzLmFkZEJpbmRpbmdzRm9yQ3VzdG9tRWxlbWVudCA9IGZ1bmN0aW9uKGFsbEJpbmRpbmdzLCBub2RlLCBiaW5kaW5nQ29udGV4dCwgdmFsdWVBY2Nlc3NvcnMpIHtcbiAgICAgICAgLy8gRGV0ZXJtaW5lIGlmIGl0J3MgcmVhbGx5IGEgY3VzdG9tIGVsZW1lbnQgbWF0Y2hpbmcgYSBjb21wb25lbnRcbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDEpIHtcbiAgICAgICAgICAgIHZhciBjb21wb25lbnROYW1lID0ga28uY29tcG9uZW50c1snZ2V0Q29tcG9uZW50TmFtZUZvck5vZGUnXShub2RlKTtcbiAgICAgICAgICAgIGlmIChjb21wb25lbnROYW1lKSB7XG4gICAgICAgICAgICAgICAgLy8gSXQgZG9lcyByZXByZXNlbnQgYSBjb21wb25lbnQsIHNvIGFkZCBhIGNvbXBvbmVudCBiaW5kaW5nIGZvciBpdFxuICAgICAgICAgICAgICAgIGFsbEJpbmRpbmdzID0gYWxsQmluZGluZ3MgfHwge307XG5cbiAgICAgICAgICAgICAgICBpZiAoYWxsQmluZGluZ3NbJ2NvbXBvbmVudCddKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEF2b2lkIHNpbGVudGx5IG92ZXJ3cml0aW5nIHNvbWUgb3RoZXIgJ2NvbXBvbmVudCcgYmluZGluZyB0aGF0IG1heSBhbHJlYWR5IGJlIG9uIHRoZSBlbGVtZW50XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHVzZSB0aGUgXCJjb21wb25lbnRcIiBiaW5kaW5nIG9uIGEgY3VzdG9tIGVsZW1lbnQgbWF0Y2hpbmcgYSBjb21wb25lbnQnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2YXIgY29tcG9uZW50QmluZGluZ1ZhbHVlID0geyAnbmFtZSc6IGNvbXBvbmVudE5hbWUsICdwYXJhbXMnOiBnZXRDb21wb25lbnRQYXJhbXNGcm9tQ3VzdG9tRWxlbWVudChub2RlLCBiaW5kaW5nQ29udGV4dCkgfTtcblxuICAgICAgICAgICAgICAgIGFsbEJpbmRpbmdzWydjb21wb25lbnQnXSA9IHZhbHVlQWNjZXNzb3JzXG4gICAgICAgICAgICAgICAgICAgID8gZnVuY3Rpb24oKSB7IHJldHVybiBjb21wb25lbnRCaW5kaW5nVmFsdWU7IH1cbiAgICAgICAgICAgICAgICAgICAgOiBjb21wb25lbnRCaW5kaW5nVmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYWxsQmluZGluZ3M7XG4gICAgfVxuXG4gICAgdmFyIG5hdGl2ZUJpbmRpbmdQcm92aWRlckluc3RhbmNlID0gbmV3IGtvLmJpbmRpbmdQcm92aWRlcigpO1xuXG4gICAgZnVuY3Rpb24gZ2V0Q29tcG9uZW50UGFyYW1zRnJvbUN1c3RvbUVsZW1lbnQoZWxlbSwgYmluZGluZ0NvbnRleHQpIHtcbiAgICAgICAgdmFyIHBhcmFtc0F0dHJpYnV0ZSA9IGVsZW0uZ2V0QXR0cmlidXRlKCdwYXJhbXMnKTtcblxuICAgICAgICBpZiAocGFyYW1zQXR0cmlidXRlKSB7XG4gICAgICAgICAgICB2YXIgcGFyYW1zID0gbmF0aXZlQmluZGluZ1Byb3ZpZGVySW5zdGFuY2VbJ3BhcnNlQmluZGluZ3NTdHJpbmcnXShwYXJhbXNBdHRyaWJ1dGUsIGJpbmRpbmdDb250ZXh0LCBlbGVtLCB7ICd2YWx1ZUFjY2Vzc29ycyc6IHRydWUsICdiaW5kaW5nUGFyYW1zJzogdHJ1ZSB9KSxcbiAgICAgICAgICAgICAgICByYXdQYXJhbUNvbXB1dGVkVmFsdWVzID0ga28udXRpbHMub2JqZWN0TWFwKHBhcmFtcywgZnVuY3Rpb24ocGFyYW1WYWx1ZSwgcGFyYW1OYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBrby5jb21wdXRlZChwYXJhbVZhbHVlLCBudWxsLCB7IGRpc3Bvc2VXaGVuTm9kZUlzUmVtb3ZlZDogZWxlbSB9KTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBrby51dGlscy5vYmplY3RNYXAocmF3UGFyYW1Db21wdXRlZFZhbHVlcywgZnVuY3Rpb24ocGFyYW1WYWx1ZUNvbXB1dGVkLCBwYXJhbU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmFtVmFsdWUgPSBwYXJhbVZhbHVlQ29tcHV0ZWQucGVlaygpO1xuICAgICAgICAgICAgICAgICAgICAvLyBEb2VzIHRoZSBldmFsdWF0aW9uIG9mIHRoZSBwYXJhbWV0ZXIgdmFsdWUgdW53cmFwIGFueSBvYnNlcnZhYmxlcz9cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJhbVZhbHVlQ29tcHV0ZWQuaXNBY3RpdmUoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm8gaXQgZG9lc24ndCwgc28gdGhlcmUncyBubyBuZWVkIGZvciBhbnkgY29tcHV0ZWQgd3JhcHBlci4gSnVzdCBwYXNzIHRocm91Z2ggdGhlIHN1cHBsaWVkIHZhbHVlIGRpcmVjdGx5LlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXhhbXBsZTogXCJzb21lVmFsOiBmaXJzdE5hbWUsIGFnZTogMTIzXCIgKHdoZXRoZXIgb3Igbm90IGZpcnN0TmFtZSBpcyBhbiBvYnNlcnZhYmxlL2NvbXB1dGVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtVmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBZZXMgaXQgZG9lcy4gU3VwcGx5IGEgY29tcHV0ZWQgcHJvcGVydHkgdGhhdCB1bndyYXBzIGJvdGggdGhlIG91dGVyIChiaW5kaW5nIGV4cHJlc3Npb24pXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBsZXZlbCBvZiBvYnNlcnZhYmlsaXR5LCBhbmQgYW55IGlubmVyIChyZXN1bHRpbmcgbW9kZWwgdmFsdWUpIGxldmVsIG9mIG9ic2VydmFiaWxpdHkuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIG1lYW5zIHRoZSBjb21wb25lbnQgZG9lc24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IG11bHRpcGxlIHVud3JhcHBpbmcuIElmIHRoZSB2YWx1ZSBpcyBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0YWJsZSBvYnNlcnZhYmxlLCB0aGUgY29tcHV0ZWQgd2lsbCBhbHNvIGJlIHdyaXRhYmxlIGFuZCBwYXNzIHRoZSB2YWx1ZSBvbiB0byB0aGUgb2JzZXJ2YWJsZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBrby5jb21wdXRlZCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JlYWQnOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUocGFyYW1WYWx1ZUNvbXB1dGVkKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3dyaXRlJzoga28uaXNXcml0ZWFibGVPYnNlcnZhYmxlKHBhcmFtVmFsdWUpICYmIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtVmFsdWVDb21wdXRlZCgpKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3Bvc2VXaGVuTm9kZUlzUmVtb3ZlZDogZWxlbVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gR2l2ZSBhY2Nlc3MgdG8gdGhlIHJhdyBjb21wdXRlZHMsIGFzIGxvbmcgYXMgdGhhdCB3b3VsZG4ndCBvdmVyd3JpdGUgYW55IGN1c3RvbSBwYXJhbSBhbHNvIGNhbGxlZCAnJHJhdydcbiAgICAgICAgICAgIC8vIFRoaXMgaXMgaW4gY2FzZSB0aGUgZGV2ZWxvcGVyIHdhbnRzIHRvIHJlYWN0IHRvIG91dGVyIChiaW5kaW5nKSBvYnNlcnZhYmlsaXR5IHNlcGFyYXRlbHkgZnJvbSBpbm5lclxuICAgICAgICAgICAgLy8gKG1vZGVsIHZhbHVlKSBvYnNlcnZhYmlsaXR5LCBvciBpbiBjYXNlIHRoZSBtb2RlbCB2YWx1ZSBvYnNlcnZhYmxlIGhhcyBzdWJvYnNlcnZhYmxlcy5cbiAgICAgICAgICAgIGlmICghcmVzdWx0Lmhhc093blByb3BlcnR5KCckcmF3JykpIHtcbiAgICAgICAgICAgICAgICByZXN1bHRbJyRyYXcnXSA9IHJhd1BhcmFtQ29tcHV0ZWRWYWx1ZXM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBGb3IgY29uc2lzdGVuY3ksIGFic2VuY2Ugb2YgYSBcInBhcmFtc1wiIGF0dHJpYnV0ZSBpcyB0cmVhdGVkIHRoZSBzYW1lIGFzIHRoZSBwcmVzZW5jZSBvZlxuICAgICAgICAgICAgLy8gYW55IGVtcHR5IG9uZS4gT3RoZXJ3aXNlIGNvbXBvbmVudCB2aWV3bW9kZWxzIG5lZWQgc3BlY2lhbCBjb2RlIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90XG4gICAgICAgICAgICAvLyAncGFyYW1zJyBvciAncGFyYW1zLiRyYXcnIGlzIG51bGwvdW5kZWZpbmVkIGJlZm9yZSByZWFkaW5nIHN1YnByb3BlcnRpZXMsIHdoaWNoIGlzIGFubm95aW5nLlxuICAgICAgICAgICAgcmV0dXJuIHsgJyRyYXcnOiB7fSB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBDb21wYXRpYmlsaXR5IGNvZGUgZm9yIG9sZGVyIChwcmUtSFRNTDUpIElFIGJyb3dzZXJzXG5cbiAgICBpZiAoa28udXRpbHMuaWVWZXJzaW9uIDwgOSkge1xuICAgICAgICAvLyBXaGVuZXZlciB5b3UgcHJlcmVnaXN0ZXIgYSBjb21wb25lbnQsIGVuYWJsZSBpdCBhcyBhIGN1c3RvbSBlbGVtZW50IGluIHRoZSBjdXJyZW50IGRvY3VtZW50XG4gICAgICAgIGtvLmNvbXBvbmVudHNbJ3JlZ2lzdGVyJ10gPSAoZnVuY3Rpb24ob3JpZ2luYWxGdW5jdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGNvbXBvbmVudE5hbWUpIHtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGNvbXBvbmVudE5hbWUpOyAvLyBBbGxvd3MgSUU8OSB0byBwYXJzZSBtYXJrdXAgY29udGFpbmluZyB0aGUgY3VzdG9tIGVsZW1lbnRcbiAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxGdW5jdGlvbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KShrby5jb21wb25lbnRzWydyZWdpc3RlciddKTtcblxuICAgICAgICAvLyBXaGVuZXZlciB5b3UgY3JlYXRlIGEgZG9jdW1lbnQgZnJhZ21lbnQsIGVuYWJsZSBhbGwgcHJlcmVnaXN0ZXJlZCBjb21wb25lbnQgbmFtZXMgYXMgY3VzdG9tIGVsZW1lbnRzXG4gICAgICAgIC8vIFRoaXMgaXMgbmVlZGVkIHRvIG1ha2UgaW5uZXJTaGl2L2pRdWVyeSBIVE1MIHBhcnNpbmcgY29ycmVjdGx5IGhhbmRsZSB0aGUgY3VzdG9tIGVsZW1lbnRzXG4gICAgICAgIGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQgPSAoZnVuY3Rpb24ob3JpZ2luYWxGdW5jdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHZhciBuZXdEb2NGcmFnID0gb3JpZ2luYWxGdW5jdGlvbigpLFxuICAgICAgICAgICAgICAgICAgICBhbGxDb21wb25lbnRzID0ga28uY29tcG9uZW50cy5fYWxsUmVnaXN0ZXJlZENvbXBvbmVudHM7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgY29tcG9uZW50TmFtZSBpbiBhbGxDb21wb25lbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhbGxDb21wb25lbnRzLmhhc093blByb3BlcnR5KGNvbXBvbmVudE5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdEb2NGcmFnLmNyZWF0ZUVsZW1lbnQoY29tcG9uZW50TmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ld0RvY0ZyYWc7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KShkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KTtcbiAgICB9XG59KSgpOyhmdW5jdGlvbih1bmRlZmluZWQpIHtcblxuICAgIHZhciBjb21wb25lbnRMb2FkaW5nT3BlcmF0aW9uVW5pcXVlSWQgPSAwO1xuXG4gICAga28uYmluZGluZ0hhbmRsZXJzWydjb21wb25lbnQnXSA9IHtcbiAgICAgICAgJ2luaXQnOiBmdW5jdGlvbihlbGVtZW50LCB2YWx1ZUFjY2Vzc29yLCBpZ25vcmVkMSwgaWdub3JlZDIsIGJpbmRpbmdDb250ZXh0KSB7XG4gICAgICAgICAgICB2YXIgY3VycmVudFZpZXdNb2RlbCxcbiAgICAgICAgICAgICAgICBjdXJyZW50TG9hZGluZ09wZXJhdGlvbklkLFxuICAgICAgICAgICAgICAgIGRpc3Bvc2VBc3NvY2lhdGVkQ29tcG9uZW50Vmlld01vZGVsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgY3VycmVudFZpZXdNb2RlbERpc3Bvc2UgPSBjdXJyZW50Vmlld01vZGVsICYmIGN1cnJlbnRWaWV3TW9kZWxbJ2Rpc3Bvc2UnXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjdXJyZW50Vmlld01vZGVsRGlzcG9zZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFZpZXdNb2RlbERpc3Bvc2UuY2FsbChjdXJyZW50Vmlld01vZGVsKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Vmlld01vZGVsID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgLy8gQW55IGluLWZsaWdodCBsb2FkaW5nIG9wZXJhdGlvbiBpcyBubyBsb25nZXIgcmVsZXZhbnQsIHNvIG1ha2Ugc3VyZSB3ZSBpZ25vcmUgaXRzIGNvbXBsZXRpb25cbiAgICAgICAgICAgICAgICAgICAgY3VycmVudExvYWRpbmdPcGVyYXRpb25JZCA9IG51bGw7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBvcmlnaW5hbENoaWxkTm9kZXMgPSBrby51dGlscy5tYWtlQXJyYXkoa28udmlydHVhbEVsZW1lbnRzLmNoaWxkTm9kZXMoZWxlbWVudCkpO1xuXG4gICAgICAgICAgICBrby51dGlscy5kb21Ob2RlRGlzcG9zYWwuYWRkRGlzcG9zZUNhbGxiYWNrKGVsZW1lbnQsIGRpc3Bvc2VBc3NvY2lhdGVkQ29tcG9uZW50Vmlld01vZGVsKTtcblxuICAgICAgICAgICAga28uY29tcHV0ZWQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUodmFsdWVBY2Nlc3NvcigpKSxcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50TmFtZSwgY29tcG9uZW50UGFyYW1zO1xuXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50TmFtZSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudE5hbWUgPSBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKHZhbHVlWyduYW1lJ10pO1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRQYXJhbXMgPSBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKHZhbHVlWydwYXJhbXMnXSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKCFjb21wb25lbnROYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gY29tcG9uZW50IG5hbWUgc3BlY2lmaWVkJyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmFyIGxvYWRpbmdPcGVyYXRpb25JZCA9IGN1cnJlbnRMb2FkaW5nT3BlcmF0aW9uSWQgPSArK2NvbXBvbmVudExvYWRpbmdPcGVyYXRpb25VbmlxdWVJZDtcbiAgICAgICAgICAgICAgICBrby5jb21wb25lbnRzLmdldChjb21wb25lbnROYW1lLCBmdW5jdGlvbihjb21wb25lbnREZWZpbml0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgbm90IHRoZSBjdXJyZW50IGxvYWQgb3BlcmF0aW9uIGZvciB0aGlzIGVsZW1lbnQsIGlnbm9yZSBpdC5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRMb2FkaW5nT3BlcmF0aW9uSWQgIT09IGxvYWRpbmdPcGVyYXRpb25JZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gQ2xlYW4gdXAgcHJldmlvdXMgc3RhdGVcbiAgICAgICAgICAgICAgICAgICAgZGlzcG9zZUFzc29jaWF0ZWRDb21wb25lbnRWaWV3TW9kZWwoKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBJbnN0YW50aWF0ZSBhbmQgYmluZCBuZXcgY29tcG9uZW50LiBJbXBsaWNpdGx5IHRoaXMgY2xlYW5zIGFueSBvbGQgRE9NIG5vZGVzLlxuICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbXBvbmVudERlZmluaXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBjb21wb25lbnQgXFwnJyArIGNvbXBvbmVudE5hbWUgKyAnXFwnJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2xvbmVUZW1wbGF0ZUludG9FbGVtZW50KGNvbXBvbmVudE5hbWUsIGNvbXBvbmVudERlZmluaXRpb24sIGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgY29tcG9uZW50Vmlld01vZGVsID0gY3JlYXRlVmlld01vZGVsKGNvbXBvbmVudERlZmluaXRpb24sIGVsZW1lbnQsIG9yaWdpbmFsQ2hpbGROb2RlcywgY29tcG9uZW50UGFyYW1zKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkQmluZGluZ0NvbnRleHQgPSBiaW5kaW5nQ29udGV4dFsnY3JlYXRlQ2hpbGRDb250ZXh0J10oY29tcG9uZW50Vmlld01vZGVsLCAvKiBkYXRhSXRlbUFsaWFzICovIHVuZGVmaW5lZCwgZnVuY3Rpb24oY3R4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4WyckY29tcG9uZW50J10gPSBjb21wb25lbnRWaWV3TW9kZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4WyckY29tcG9uZW50VGVtcGxhdGVOb2RlcyddID0gb3JpZ2luYWxDaGlsZE5vZGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRWaWV3TW9kZWwgPSBjb21wb25lbnRWaWV3TW9kZWw7XG4gICAgICAgICAgICAgICAgICAgIGtvLmFwcGx5QmluZGluZ3NUb0Rlc2NlbmRhbnRzKGNoaWxkQmluZGluZ0NvbnRleHQsIGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSwgbnVsbCwgeyBkaXNwb3NlV2hlbk5vZGVJc1JlbW92ZWQ6IGVsZW1lbnQgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiB7ICdjb250cm9sc0Rlc2NlbmRhbnRCaW5kaW5ncyc6IHRydWUgfTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBrby52aXJ0dWFsRWxlbWVudHMuYWxsb3dlZEJpbmRpbmdzWydjb21wb25lbnQnXSA9IHRydWU7XG5cbiAgICBmdW5jdGlvbiBjbG9uZVRlbXBsYXRlSW50b0VsZW1lbnQoY29tcG9uZW50TmFtZSwgY29tcG9uZW50RGVmaW5pdGlvbiwgZWxlbWVudCkge1xuICAgICAgICB2YXIgdGVtcGxhdGUgPSBjb21wb25lbnREZWZpbml0aW9uWyd0ZW1wbGF0ZSddO1xuICAgICAgICBpZiAoIXRlbXBsYXRlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbXBvbmVudCBcXCcnICsgY29tcG9uZW50TmFtZSArICdcXCcgaGFzIG5vIHRlbXBsYXRlJyk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgY2xvbmVkTm9kZXNBcnJheSA9IGtvLnV0aWxzLmNsb25lTm9kZXModGVtcGxhdGUpO1xuICAgICAgICBrby52aXJ0dWFsRWxlbWVudHMuc2V0RG9tTm9kZUNoaWxkcmVuKGVsZW1lbnQsIGNsb25lZE5vZGVzQXJyYXkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZVZpZXdNb2RlbChjb21wb25lbnREZWZpbml0aW9uLCBlbGVtZW50LCBvcmlnaW5hbENoaWxkTm9kZXMsIGNvbXBvbmVudFBhcmFtcykge1xuICAgICAgICB2YXIgY29tcG9uZW50Vmlld01vZGVsRmFjdG9yeSA9IGNvbXBvbmVudERlZmluaXRpb25bJ2NyZWF0ZVZpZXdNb2RlbCddO1xuICAgICAgICByZXR1cm4gY29tcG9uZW50Vmlld01vZGVsRmFjdG9yeVxuICAgICAgICAgICAgPyBjb21wb25lbnRWaWV3TW9kZWxGYWN0b3J5LmNhbGwoY29tcG9uZW50RGVmaW5pdGlvbiwgY29tcG9uZW50UGFyYW1zLCB7ICdlbGVtZW50JzogZWxlbWVudCwgJ3RlbXBsYXRlTm9kZXMnOiBvcmlnaW5hbENoaWxkTm9kZXMgfSlcbiAgICAgICAgICAgIDogY29tcG9uZW50UGFyYW1zOyAvLyBUZW1wbGF0ZS1vbmx5IGNvbXBvbmVudFxuICAgIH1cblxufSkoKTtcbnZhciBhdHRySHRtbFRvSmF2YXNjcmlwdE1hcCA9IHsgJ2NsYXNzJzogJ2NsYXNzTmFtZScsICdmb3InOiAnaHRtbEZvcicgfTtcbmtvLmJpbmRpbmdIYW5kbGVyc1snYXR0ciddID0ge1xuICAgICd1cGRhdGUnOiBmdW5jdGlvbihlbGVtZW50LCB2YWx1ZUFjY2Vzc29yLCBhbGxCaW5kaW5ncykge1xuICAgICAgICB2YXIgdmFsdWUgPSBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKHZhbHVlQWNjZXNzb3IoKSkgfHwge307XG4gICAgICAgIGtvLnV0aWxzLm9iamVjdEZvckVhY2godmFsdWUsIGZ1bmN0aW9uKGF0dHJOYW1lLCBhdHRyVmFsdWUpIHtcbiAgICAgICAgICAgIGF0dHJWYWx1ZSA9IGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUoYXR0clZhbHVlKTtcblxuICAgICAgICAgICAgLy8gVG8gY292ZXIgY2FzZXMgbGlrZSBcImF0dHI6IHsgY2hlY2tlZDpzb21lUHJvcCB9XCIsIHdlIHdhbnQgdG8gcmVtb3ZlIHRoZSBhdHRyaWJ1dGUgZW50aXJlbHlcbiAgICAgICAgICAgIC8vIHdoZW4gc29tZVByb3AgaXMgYSBcIm5vIHZhbHVlXCItbGlrZSB2YWx1ZSAoc3RyaWN0bHkgbnVsbCwgZmFsc2UsIG9yIHVuZGVmaW5lZClcbiAgICAgICAgICAgIC8vIChiZWNhdXNlIHRoZSBhYnNlbmNlIG9mIHRoZSBcImNoZWNrZWRcIiBhdHRyIGlzIGhvdyB0byBtYXJrIGFuIGVsZW1lbnQgYXMgbm90IGNoZWNrZWQsIGV0Yy4pXG4gICAgICAgICAgICB2YXIgdG9SZW1vdmUgPSAoYXR0clZhbHVlID09PSBmYWxzZSkgfHwgKGF0dHJWYWx1ZSA9PT0gbnVsbCkgfHwgKGF0dHJWYWx1ZSA9PT0gdW5kZWZpbmVkKTtcbiAgICAgICAgICAgIGlmICh0b1JlbW92ZSlcbiAgICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShhdHRyTmFtZSk7XG5cbiAgICAgICAgICAgIC8vIEluIElFIDw9IDcgYW5kIElFOCBRdWlya3MgTW9kZSwgeW91IGhhdmUgdG8gdXNlIHRoZSBKYXZhc2NyaXB0IHByb3BlcnR5IG5hbWUgaW5zdGVhZCBvZiB0aGVcbiAgICAgICAgICAgIC8vIEhUTUwgYXR0cmlidXRlIG5hbWUgZm9yIGNlcnRhaW4gYXR0cmlidXRlcy4gSUU4IFN0YW5kYXJkcyBNb2RlIHN1cHBvcnRzIHRoZSBjb3JyZWN0IGJlaGF2aW9yLFxuICAgICAgICAgICAgLy8gYnV0IGluc3RlYWQgb2YgZmlndXJpbmcgb3V0IHRoZSBtb2RlLCB3ZSdsbCBqdXN0IHNldCB0aGUgYXR0cmlidXRlIHRocm91Z2ggdGhlIEphdmFzY3JpcHRcbiAgICAgICAgICAgIC8vIHByb3BlcnR5IGZvciBJRSA8PSA4LlxuICAgICAgICAgICAgaWYgKGtvLnV0aWxzLmllVmVyc2lvbiA8PSA4ICYmIGF0dHJOYW1lIGluIGF0dHJIdG1sVG9KYXZhc2NyaXB0TWFwKSB7XG4gICAgICAgICAgICAgICAgYXR0ck5hbWUgPSBhdHRySHRtbFRvSmF2YXNjcmlwdE1hcFthdHRyTmFtZV07XG4gICAgICAgICAgICAgICAgaWYgKHRvUmVtb3ZlKVxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShhdHRyTmFtZSk7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50W2F0dHJOYW1lXSA9IGF0dHJWYWx1ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRvUmVtb3ZlKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoYXR0ck5hbWUsIGF0dHJWYWx1ZS50b1N0cmluZygpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gVHJlYXQgXCJuYW1lXCIgc3BlY2lhbGx5IC0gYWx0aG91Z2ggeW91IGNhbiB0aGluayBvZiBpdCBhcyBhbiBhdHRyaWJ1dGUsIGl0IGFsc28gbmVlZHNcbiAgICAgICAgICAgIC8vIHNwZWNpYWwgaGFuZGxpbmcgb24gb2xkZXIgdmVyc2lvbnMgb2YgSUUgKGh0dHBzOi8vZ2l0aHViLmNvbS9TdGV2ZVNhbmRlcnNvbi9rbm9ja291dC9wdWxsLzMzMylcbiAgICAgICAgICAgIC8vIERlbGliZXJhdGVseSBiZWluZyBjYXNlLXNlbnNpdGl2ZSBoZXJlIGJlY2F1c2UgWEhUTUwgd291bGQgcmVnYXJkIFwiTmFtZVwiIGFzIGEgZGlmZmVyZW50IHRoaW5nXG4gICAgICAgICAgICAvLyBlbnRpcmVseSwgYW5kIHRoZXJlJ3Mgbm8gc3Ryb25nIHJlYXNvbiB0byBhbGxvdyBmb3Igc3VjaCBjYXNpbmcgaW4gSFRNTC5cbiAgICAgICAgICAgIGlmIChhdHRyTmFtZSA9PT0gXCJuYW1lXCIpIHtcbiAgICAgICAgICAgICAgICBrby51dGlscy5zZXRFbGVtZW50TmFtZShlbGVtZW50LCB0b1JlbW92ZSA/IFwiXCIgOiBhdHRyVmFsdWUudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn07XG4oZnVuY3Rpb24oKSB7XG5cbmtvLmJpbmRpbmdIYW5kbGVyc1snY2hlY2tlZCddID0ge1xuICAgICdhZnRlcic6IFsndmFsdWUnLCAnYXR0ciddLFxuICAgICdpbml0JzogZnVuY3Rpb24gKGVsZW1lbnQsIHZhbHVlQWNjZXNzb3IsIGFsbEJpbmRpbmdzKSB7XG4gICAgICAgIHZhciBjaGVja2VkVmFsdWUgPSBrby5wdXJlQ29tcHV0ZWQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAvLyBUcmVhdCBcInZhbHVlXCIgbGlrZSBcImNoZWNrZWRWYWx1ZVwiIHdoZW4gaXQgaXMgaW5jbHVkZWQgd2l0aCBcImNoZWNrZWRcIiBiaW5kaW5nXG4gICAgICAgICAgICBpZiAoYWxsQmluZGluZ3NbJ2hhcyddKCdjaGVja2VkVmFsdWUnKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKGFsbEJpbmRpbmdzLmdldCgnY2hlY2tlZFZhbHVlJykpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChhbGxCaW5kaW5nc1snaGFzJ10oJ3ZhbHVlJykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ga28udXRpbHMudW53cmFwT2JzZXJ2YWJsZShhbGxCaW5kaW5ncy5nZXQoJ3ZhbHVlJykpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudC52YWx1ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZnVuY3Rpb24gdXBkYXRlTW9kZWwoKSB7XG4gICAgICAgICAgICAvLyBUaGlzIHVwZGF0ZXMgdGhlIG1vZGVsIHZhbHVlIGZyb20gdGhlIHZpZXcgdmFsdWUuXG4gICAgICAgICAgICAvLyBJdCBydW5zIGluIHJlc3BvbnNlIHRvIERPTSBldmVudHMgKGNsaWNrKSBhbmQgY2hhbmdlcyBpbiBjaGVja2VkVmFsdWUuXG4gICAgICAgICAgICB2YXIgaXNDaGVja2VkID0gZWxlbWVudC5jaGVja2VkLFxuICAgICAgICAgICAgICAgIGVsZW1WYWx1ZSA9IHVzZUNoZWNrZWRWYWx1ZSA/IGNoZWNrZWRWYWx1ZSgpIDogaXNDaGVja2VkO1xuXG4gICAgICAgICAgICAvLyBXaGVuIHdlJ3JlIGZpcnN0IHNldHRpbmcgdXAgdGhpcyBjb21wdXRlZCwgZG9uJ3QgY2hhbmdlIGFueSBtb2RlbCBzdGF0ZS5cbiAgICAgICAgICAgIGlmIChrby5jb21wdXRlZENvbnRleHQuaXNJbml0aWFsKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFdlIGNhbiBpZ25vcmUgdW5jaGVja2VkIHJhZGlvIGJ1dHRvbnMsIGJlY2F1c2Ugc29tZSBvdGhlciByYWRpb1xuICAgICAgICAgICAgLy8gYnV0dG9uIHdpbGwgYmUgZ2V0dGluZyBjaGVja2VkLCBhbmQgdGhhdCBvbmUgY2FuIHRha2UgY2FyZSBvZiB1cGRhdGluZyBzdGF0ZS5cbiAgICAgICAgICAgIGlmIChpc1JhZGlvICYmICFpc0NoZWNrZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBtb2RlbFZhbHVlID0ga28uZGVwZW5kZW5jeURldGVjdGlvbi5pZ25vcmUodmFsdWVBY2Nlc3Nvcik7XG4gICAgICAgICAgICBpZiAodmFsdWVJc0FycmF5KSB7XG4gICAgICAgICAgICAgICAgdmFyIHdyaXRhYmxlVmFsdWUgPSByYXdWYWx1ZUlzTm9uQXJyYXlPYnNlcnZhYmxlID8gbW9kZWxWYWx1ZS5wZWVrKCkgOiBtb2RlbFZhbHVlO1xuICAgICAgICAgICAgICAgIGlmIChvbGRFbGVtVmFsdWUgIT09IGVsZW1WYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIHdlJ3JlIHJlc3BvbmRpbmcgdG8gdGhlIGNoZWNrZWRWYWx1ZSBjaGFuZ2luZywgYW5kIHRoZSBlbGVtZW50IGlzXG4gICAgICAgICAgICAgICAgICAgIC8vIGN1cnJlbnRseSBjaGVja2VkLCByZXBsYWNlIHRoZSBvbGQgZWxlbSB2YWx1ZSB3aXRoIHRoZSBuZXcgZWxlbSB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAvLyBpbiB0aGUgbW9kZWwgYXJyYXkuXG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0NoZWNrZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtvLnV0aWxzLmFkZE9yUmVtb3ZlSXRlbSh3cml0YWJsZVZhbHVlLCBlbGVtVmFsdWUsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAga28udXRpbHMuYWRkT3JSZW1vdmVJdGVtKHdyaXRhYmxlVmFsdWUsIG9sZEVsZW1WYWx1ZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgb2xkRWxlbVZhbHVlID0gZWxlbVZhbHVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFdoZW4gd2UncmUgcmVzcG9uZGluZyB0byB0aGUgdXNlciBoYXZpbmcgY2hlY2tlZC91bmNoZWNrZWQgYSBjaGVja2JveCxcbiAgICAgICAgICAgICAgICAgICAgLy8gYWRkL3JlbW92ZSB0aGUgZWxlbWVudCB2YWx1ZSB0byB0aGUgbW9kZWwgYXJyYXkuXG4gICAgICAgICAgICAgICAgICAgIGtvLnV0aWxzLmFkZE9yUmVtb3ZlSXRlbSh3cml0YWJsZVZhbHVlLCBlbGVtVmFsdWUsIGlzQ2hlY2tlZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChyYXdWYWx1ZUlzTm9uQXJyYXlPYnNlcnZhYmxlICYmIGtvLmlzV3JpdGVhYmxlT2JzZXJ2YWJsZShtb2RlbFZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICBtb2RlbFZhbHVlKHdyaXRhYmxlVmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAga28uZXhwcmVzc2lvblJld3JpdGluZy53cml0ZVZhbHVlVG9Qcm9wZXJ0eShtb2RlbFZhbHVlLCBhbGxCaW5kaW5ncywgJ2NoZWNrZWQnLCBlbGVtVmFsdWUsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGZ1bmN0aW9uIHVwZGF0ZVZpZXcoKSB7XG4gICAgICAgICAgICAvLyBUaGlzIHVwZGF0ZXMgdGhlIHZpZXcgdmFsdWUgZnJvbSB0aGUgbW9kZWwgdmFsdWUuXG4gICAgICAgICAgICAvLyBJdCBydW5zIGluIHJlc3BvbnNlIHRvIGNoYW5nZXMgaW4gdGhlIGJvdW5kIChjaGVja2VkKSB2YWx1ZS5cbiAgICAgICAgICAgIHZhciBtb2RlbFZhbHVlID0ga28udXRpbHMudW53cmFwT2JzZXJ2YWJsZSh2YWx1ZUFjY2Vzc29yKCkpO1xuXG4gICAgICAgICAgICBpZiAodmFsdWVJc0FycmF5KSB7XG4gICAgICAgICAgICAgICAgLy8gV2hlbiBhIGNoZWNrYm94IGlzIGJvdW5kIHRvIGFuIGFycmF5LCBiZWluZyBjaGVja2VkIHJlcHJlc2VudHMgaXRzIHZhbHVlIGJlaW5nIHByZXNlbnQgaW4gdGhhdCBhcnJheVxuICAgICAgICAgICAgICAgIGVsZW1lbnQuY2hlY2tlZCA9IGtvLnV0aWxzLmFycmF5SW5kZXhPZihtb2RlbFZhbHVlLCBjaGVja2VkVmFsdWUoKSkgPj0gMDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNDaGVja2JveCkge1xuICAgICAgICAgICAgICAgIC8vIFdoZW4gYSBjaGVja2JveCBpcyBib3VuZCB0byBhbnkgb3RoZXIgdmFsdWUgKG5vdCBhbiBhcnJheSksIGJlaW5nIGNoZWNrZWQgcmVwcmVzZW50cyB0aGUgdmFsdWUgYmVpbmcgdHJ1ZWlzaFxuICAgICAgICAgICAgICAgIGVsZW1lbnQuY2hlY2tlZCA9IG1vZGVsVmFsdWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEZvciByYWRpbyBidXR0b25zLCBiZWluZyBjaGVja2VkIG1lYW5zIHRoYXQgdGhlIHJhZGlvIGJ1dHRvbidzIHZhbHVlIGNvcnJlc3BvbmRzIHRvIHRoZSBtb2RlbCB2YWx1ZVxuICAgICAgICAgICAgICAgIGVsZW1lbnQuY2hlY2tlZCA9IChjaGVja2VkVmFsdWUoKSA9PT0gbW9kZWxWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgdmFyIGlzQ2hlY2tib3ggPSBlbGVtZW50LnR5cGUgPT0gXCJjaGVja2JveFwiLFxuICAgICAgICAgICAgaXNSYWRpbyA9IGVsZW1lbnQudHlwZSA9PSBcInJhZGlvXCI7XG5cbiAgICAgICAgLy8gT25seSBiaW5kIHRvIGNoZWNrIGJveGVzIGFuZCByYWRpbyBidXR0b25zXG4gICAgICAgIGlmICghaXNDaGVja2JveCAmJiAhaXNSYWRpbykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHJhd1ZhbHVlID0gdmFsdWVBY2Nlc3NvcigpLFxuICAgICAgICAgICAgdmFsdWVJc0FycmF5ID0gaXNDaGVja2JveCAmJiAoa28udXRpbHMudW53cmFwT2JzZXJ2YWJsZShyYXdWYWx1ZSkgaW5zdGFuY2VvZiBBcnJheSksXG4gICAgICAgICAgICByYXdWYWx1ZUlzTm9uQXJyYXlPYnNlcnZhYmxlID0gISh2YWx1ZUlzQXJyYXkgJiYgcmF3VmFsdWUucHVzaCAmJiByYXdWYWx1ZS5zcGxpY2UpLFxuICAgICAgICAgICAgb2xkRWxlbVZhbHVlID0gdmFsdWVJc0FycmF5ID8gY2hlY2tlZFZhbHVlKCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB1c2VDaGVja2VkVmFsdWUgPSBpc1JhZGlvIHx8IHZhbHVlSXNBcnJheTtcblxuICAgICAgICAvLyBJRSA2IHdvbid0IGFsbG93IHJhZGlvIGJ1dHRvbnMgdG8gYmUgc2VsZWN0ZWQgdW5sZXNzIHRoZXkgaGF2ZSBhIG5hbWVcbiAgICAgICAgaWYgKGlzUmFkaW8gJiYgIWVsZW1lbnQubmFtZSlcbiAgICAgICAgICAgIGtvLmJpbmRpbmdIYW5kbGVyc1sndW5pcXVlTmFtZSddWydpbml0J10oZWxlbWVudCwgZnVuY3Rpb24oKSB7IHJldHVybiB0cnVlIH0pO1xuXG4gICAgICAgIC8vIFNldCB1cCB0d28gY29tcHV0ZWRzIHRvIHVwZGF0ZSB0aGUgYmluZGluZzpcblxuICAgICAgICAvLyBUaGUgZmlyc3QgcmVzcG9uZHMgdG8gY2hhbmdlcyBpbiB0aGUgY2hlY2tlZFZhbHVlIHZhbHVlIGFuZCB0byBlbGVtZW50IGNsaWNrc1xuICAgICAgICBrby5jb21wdXRlZCh1cGRhdGVNb2RlbCwgbnVsbCwgeyBkaXNwb3NlV2hlbk5vZGVJc1JlbW92ZWQ6IGVsZW1lbnQgfSk7XG4gICAgICAgIGtvLnV0aWxzLnJlZ2lzdGVyRXZlbnRIYW5kbGVyKGVsZW1lbnQsIFwiY2xpY2tcIiwgdXBkYXRlTW9kZWwpO1xuXG4gICAgICAgIC8vIFRoZSBzZWNvbmQgcmVzcG9uZHMgdG8gY2hhbmdlcyBpbiB0aGUgbW9kZWwgdmFsdWUgKHRoZSBvbmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBjaGVja2VkIGJpbmRpbmcpXG4gICAgICAgIGtvLmNvbXB1dGVkKHVwZGF0ZVZpZXcsIG51bGwsIHsgZGlzcG9zZVdoZW5Ob2RlSXNSZW1vdmVkOiBlbGVtZW50IH0pO1xuXG4gICAgICAgIHJhd1ZhbHVlID0gdW5kZWZpbmVkO1xuICAgIH1cbn07XG5rby5leHByZXNzaW9uUmV3cml0aW5nLnR3b1dheUJpbmRpbmdzWydjaGVja2VkJ10gPSB0cnVlO1xuXG5rby5iaW5kaW5nSGFuZGxlcnNbJ2NoZWNrZWRWYWx1ZSddID0ge1xuICAgICd1cGRhdGUnOiBmdW5jdGlvbiAoZWxlbWVudCwgdmFsdWVBY2Nlc3Nvcikge1xuICAgICAgICBlbGVtZW50LnZhbHVlID0ga28udXRpbHMudW53cmFwT2JzZXJ2YWJsZSh2YWx1ZUFjY2Vzc29yKCkpO1xuICAgIH1cbn07XG5cbn0pKCk7dmFyIGNsYXNzZXNXcml0dGVuQnlCaW5kaW5nS2V5ID0gJ19fa29fX2Nzc1ZhbHVlJztcbmtvLmJpbmRpbmdIYW5kbGVyc1snY3NzJ10gPSB7XG4gICAgJ3VwZGF0ZSc6IGZ1bmN0aW9uIChlbGVtZW50LCB2YWx1ZUFjY2Vzc29yKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUodmFsdWVBY2Nlc3NvcigpKTtcbiAgICAgICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICBrby51dGlscy5vYmplY3RGb3JFYWNoKHZhbHVlLCBmdW5jdGlvbihjbGFzc05hbWUsIHNob3VsZEhhdmVDbGFzcykge1xuICAgICAgICAgICAgICAgIHNob3VsZEhhdmVDbGFzcyA9IGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUoc2hvdWxkSGF2ZUNsYXNzKTtcbiAgICAgICAgICAgICAgICBrby51dGlscy50b2dnbGVEb21Ob2RlQ3NzQ2xhc3MoZWxlbWVudCwgY2xhc3NOYW1lLCBzaG91bGRIYXZlQ2xhc3MpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YWx1ZSA9IGtvLnV0aWxzLnN0cmluZ1RyaW0oU3RyaW5nKHZhbHVlIHx8ICcnKSk7IC8vIE1ha2Ugc3VyZSB3ZSBkb24ndCB0cnkgdG8gc3RvcmUgb3Igc2V0IGEgbm9uLXN0cmluZyB2YWx1ZVxuICAgICAgICAgICAga28udXRpbHMudG9nZ2xlRG9tTm9kZUNzc0NsYXNzKGVsZW1lbnQsIGVsZW1lbnRbY2xhc3Nlc1dyaXR0ZW5CeUJpbmRpbmdLZXldLCBmYWxzZSk7XG4gICAgICAgICAgICBlbGVtZW50W2NsYXNzZXNXcml0dGVuQnlCaW5kaW5nS2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAga28udXRpbHMudG9nZ2xlRG9tTm9kZUNzc0NsYXNzKGVsZW1lbnQsIHZhbHVlLCB0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cbn07XG5rby5iaW5kaW5nSGFuZGxlcnNbJ2VuYWJsZSddID0ge1xuICAgICd1cGRhdGUnOiBmdW5jdGlvbiAoZWxlbWVudCwgdmFsdWVBY2Nlc3Nvcikge1xuICAgICAgICB2YXIgdmFsdWUgPSBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKHZhbHVlQWNjZXNzb3IoKSk7XG4gICAgICAgIGlmICh2YWx1ZSAmJiBlbGVtZW50LmRpc2FibGVkKVxuICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgZWxzZSBpZiAoKCF2YWx1ZSkgJiYgKCFlbGVtZW50LmRpc2FibGVkKSlcbiAgICAgICAgICAgIGVsZW1lbnQuZGlzYWJsZWQgPSB0cnVlO1xuICAgIH1cbn07XG5cbmtvLmJpbmRpbmdIYW5kbGVyc1snZGlzYWJsZSddID0ge1xuICAgICd1cGRhdGUnOiBmdW5jdGlvbiAoZWxlbWVudCwgdmFsdWVBY2Nlc3Nvcikge1xuICAgICAgICBrby5iaW5kaW5nSGFuZGxlcnNbJ2VuYWJsZSddWyd1cGRhdGUnXShlbGVtZW50LCBmdW5jdGlvbigpIHsgcmV0dXJuICFrby51dGlscy51bndyYXBPYnNlcnZhYmxlKHZhbHVlQWNjZXNzb3IoKSkgfSk7XG4gICAgfVxufTtcbi8vIEZvciBjZXJ0YWluIGNvbW1vbiBldmVudHMgKGN1cnJlbnRseSBqdXN0ICdjbGljaycpLCBhbGxvdyBhIHNpbXBsaWZpZWQgZGF0YS1iaW5kaW5nIHN5bnRheFxuLy8gZS5nLiBjbGljazpoYW5kbGVyIGluc3RlYWQgb2YgdGhlIHVzdWFsIGZ1bGwtbGVuZ3RoIGV2ZW50OntjbGljazpoYW5kbGVyfVxuZnVuY3Rpb24gbWFrZUV2ZW50SGFuZGxlclNob3J0Y3V0KGV2ZW50TmFtZSkge1xuICAgIGtvLmJpbmRpbmdIYW5kbGVyc1tldmVudE5hbWVdID0ge1xuICAgICAgICAnaW5pdCc6IGZ1bmN0aW9uKGVsZW1lbnQsIHZhbHVlQWNjZXNzb3IsIGFsbEJpbmRpbmdzLCB2aWV3TW9kZWwsIGJpbmRpbmdDb250ZXh0KSB7XG4gICAgICAgICAgICB2YXIgbmV3VmFsdWVBY2Nlc3NvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgICAgICAgICAgICAgcmVzdWx0W2V2ZW50TmFtZV0gPSB2YWx1ZUFjY2Vzc29yKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4ga28uYmluZGluZ0hhbmRsZXJzWydldmVudCddWydpbml0J10uY2FsbCh0aGlzLCBlbGVtZW50LCBuZXdWYWx1ZUFjY2Vzc29yLCBhbGxCaW5kaW5ncywgdmlld01vZGVsLCBiaW5kaW5nQ29udGV4dCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmtvLmJpbmRpbmdIYW5kbGVyc1snZXZlbnQnXSA9IHtcbiAgICAnaW5pdCcgOiBmdW5jdGlvbiAoZWxlbWVudCwgdmFsdWVBY2Nlc3NvciwgYWxsQmluZGluZ3MsIHZpZXdNb2RlbCwgYmluZGluZ0NvbnRleHQpIHtcbiAgICAgICAgdmFyIGV2ZW50c1RvSGFuZGxlID0gdmFsdWVBY2Nlc3NvcigpIHx8IHt9O1xuICAgICAgICBrby51dGlscy5vYmplY3RGb3JFYWNoKGV2ZW50c1RvSGFuZGxlLCBmdW5jdGlvbihldmVudE5hbWUpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZXZlbnROYW1lID09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICBrby51dGlscy5yZWdpc3RlckV2ZW50SGFuZGxlcihlbGVtZW50LCBldmVudE5hbWUsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaGFuZGxlclJldHVyblZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB2YXIgaGFuZGxlckZ1bmN0aW9uID0gdmFsdWVBY2Nlc3NvcigpW2V2ZW50TmFtZV07XG4gICAgICAgICAgICAgICAgICAgIGlmICghaGFuZGxlckZ1bmN0aW9uKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUYWtlIGFsbCB0aGUgZXZlbnQgYXJncywgYW5kIHByZWZpeCB3aXRoIHRoZSB2aWV3bW9kZWxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhcmdzRm9ySGFuZGxlciA9IGtvLnV0aWxzLm1ha2VBcnJheShhcmd1bWVudHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmlld01vZGVsID0gYmluZGluZ0NvbnRleHRbJyRkYXRhJ107XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmdzRm9ySGFuZGxlci51bnNoaWZ0KHZpZXdNb2RlbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyUmV0dXJuVmFsdWUgPSBoYW5kbGVyRnVuY3Rpb24uYXBwbHkodmlld01vZGVsLCBhcmdzRm9ySGFuZGxlcik7XG4gICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZGxlclJldHVyblZhbHVlICE9PSB0cnVlKSB7IC8vIE5vcm1hbGx5IHdlIHdhbnQgdG8gcHJldmVudCBkZWZhdWx0IGFjdGlvbi4gRGV2ZWxvcGVyIGNhbiBvdmVycmlkZSB0aGlzIGJlIGV4cGxpY2l0bHkgcmV0dXJuaW5nIHRydWUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50LnByZXZlbnREZWZhdWx0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQucmV0dXJuVmFsdWUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHZhciBidWJibGUgPSBhbGxCaW5kaW5ncy5nZXQoZXZlbnROYW1lICsgJ0J1YmJsZScpICE9PSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFidWJibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmNhbmNlbEJ1YmJsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQuc3RvcFByb3BhZ2F0aW9uKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn07XG4vLyBcImZvcmVhY2g6IHNvbWVFeHByZXNzaW9uXCIgaXMgZXF1aXZhbGVudCB0byBcInRlbXBsYXRlOiB7IGZvcmVhY2g6IHNvbWVFeHByZXNzaW9uIH1cIlxuLy8gXCJmb3JlYWNoOiB7IGRhdGE6IHNvbWVFeHByZXNzaW9uLCBhZnRlckFkZDogbXlmbiB9XCIgaXMgZXF1aXZhbGVudCB0byBcInRlbXBsYXRlOiB7IGZvcmVhY2g6IHNvbWVFeHByZXNzaW9uLCBhZnRlckFkZDogbXlmbiB9XCJcbmtvLmJpbmRpbmdIYW5kbGVyc1snZm9yZWFjaCddID0ge1xuICAgIG1ha2VUZW1wbGF0ZVZhbHVlQWNjZXNzb3I6IGZ1bmN0aW9uKHZhbHVlQWNjZXNzb3IpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyIG1vZGVsVmFsdWUgPSB2YWx1ZUFjY2Vzc29yKCksXG4gICAgICAgICAgICAgICAgdW53cmFwcGVkVmFsdWUgPSBrby51dGlscy5wZWVrT2JzZXJ2YWJsZShtb2RlbFZhbHVlKTsgICAgLy8gVW53cmFwIHdpdGhvdXQgc2V0dGluZyBhIGRlcGVuZGVuY3kgaGVyZVxuXG4gICAgICAgICAgICAvLyBJZiB1bndyYXBwZWRWYWx1ZSBpcyB0aGUgYXJyYXksIHBhc3MgaW4gdGhlIHdyYXBwZWQgdmFsdWUgb24gaXRzIG93blxuICAgICAgICAgICAgLy8gVGhlIHZhbHVlIHdpbGwgYmUgdW53cmFwcGVkIGFuZCB0cmFja2VkIHdpdGhpbiB0aGUgdGVtcGxhdGUgYmluZGluZ1xuICAgICAgICAgICAgLy8gKFNlZSBodHRwczovL2dpdGh1Yi5jb20vU3RldmVTYW5kZXJzb24va25vY2tvdXQvaXNzdWVzLzUyMylcbiAgICAgICAgICAgIGlmICgoIXVud3JhcHBlZFZhbHVlKSB8fCB0eXBlb2YgdW53cmFwcGVkVmFsdWUubGVuZ3RoID09IFwibnVtYmVyXCIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgJ2ZvcmVhY2gnOiBtb2RlbFZhbHVlLCAndGVtcGxhdGVFbmdpbmUnOiBrby5uYXRpdmVUZW1wbGF0ZUVuZ2luZS5pbnN0YW5jZSB9O1xuXG4gICAgICAgICAgICAvLyBJZiB1bndyYXBwZWRWYWx1ZS5kYXRhIGlzIHRoZSBhcnJheSwgcHJlc2VydmUgYWxsIHJlbGV2YW50IG9wdGlvbnMgYW5kIHVud3JhcCBhZ2FpbiB2YWx1ZSBzbyB3ZSBnZXQgdXBkYXRlc1xuICAgICAgICAgICAga28udXRpbHMudW53cmFwT2JzZXJ2YWJsZShtb2RlbFZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgJ2ZvcmVhY2gnOiB1bndyYXBwZWRWYWx1ZVsnZGF0YSddLFxuICAgICAgICAgICAgICAgICdhcyc6IHVud3JhcHBlZFZhbHVlWydhcyddLFxuICAgICAgICAgICAgICAgICdpbmNsdWRlRGVzdHJveWVkJzogdW53cmFwcGVkVmFsdWVbJ2luY2x1ZGVEZXN0cm95ZWQnXSxcbiAgICAgICAgICAgICAgICAnYWZ0ZXJBZGQnOiB1bndyYXBwZWRWYWx1ZVsnYWZ0ZXJBZGQnXSxcbiAgICAgICAgICAgICAgICAnYmVmb3JlUmVtb3ZlJzogdW53cmFwcGVkVmFsdWVbJ2JlZm9yZVJlbW92ZSddLFxuICAgICAgICAgICAgICAgICdhZnRlclJlbmRlcic6IHVud3JhcHBlZFZhbHVlWydhZnRlclJlbmRlciddLFxuICAgICAgICAgICAgICAgICdiZWZvcmVNb3ZlJzogdW53cmFwcGVkVmFsdWVbJ2JlZm9yZU1vdmUnXSxcbiAgICAgICAgICAgICAgICAnYWZ0ZXJNb3ZlJzogdW53cmFwcGVkVmFsdWVbJ2FmdGVyTW92ZSddLFxuICAgICAgICAgICAgICAgICd0ZW1wbGF0ZUVuZ2luZSc6IGtvLm5hdGl2ZVRlbXBsYXRlRW5naW5lLmluc3RhbmNlXG4gICAgICAgICAgICB9O1xuICAgICAgICB9O1xuICAgIH0sXG4gICAgJ2luaXQnOiBmdW5jdGlvbihlbGVtZW50LCB2YWx1ZUFjY2Vzc29yLCBhbGxCaW5kaW5ncywgdmlld01vZGVsLCBiaW5kaW5nQ29udGV4dCkge1xuICAgICAgICByZXR1cm4ga28uYmluZGluZ0hhbmRsZXJzWyd0ZW1wbGF0ZSddWydpbml0J10oZWxlbWVudCwga28uYmluZGluZ0hhbmRsZXJzWydmb3JlYWNoJ10ubWFrZVRlbXBsYXRlVmFsdWVBY2Nlc3Nvcih2YWx1ZUFjY2Vzc29yKSk7XG4gICAgfSxcbiAgICAndXBkYXRlJzogZnVuY3Rpb24oZWxlbWVudCwgdmFsdWVBY2Nlc3NvciwgYWxsQmluZGluZ3MsIHZpZXdNb2RlbCwgYmluZGluZ0NvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIGtvLmJpbmRpbmdIYW5kbGVyc1sndGVtcGxhdGUnXVsndXBkYXRlJ10oZWxlbWVudCwga28uYmluZGluZ0hhbmRsZXJzWydmb3JlYWNoJ10ubWFrZVRlbXBsYXRlVmFsdWVBY2Nlc3Nvcih2YWx1ZUFjY2Vzc29yKSwgYWxsQmluZGluZ3MsIHZpZXdNb2RlbCwgYmluZGluZ0NvbnRleHQpO1xuICAgIH1cbn07XG5rby5leHByZXNzaW9uUmV3cml0aW5nLmJpbmRpbmdSZXdyaXRlVmFsaWRhdG9yc1snZm9yZWFjaCddID0gZmFsc2U7IC8vIENhbid0IHJld3JpdGUgY29udHJvbCBmbG93IGJpbmRpbmdzXG5rby52aXJ0dWFsRWxlbWVudHMuYWxsb3dlZEJpbmRpbmdzWydmb3JlYWNoJ10gPSB0cnVlO1xudmFyIGhhc2ZvY3VzVXBkYXRpbmdQcm9wZXJ0eSA9ICdfX2tvX2hhc2ZvY3VzVXBkYXRpbmcnO1xudmFyIGhhc2ZvY3VzTGFzdFZhbHVlID0gJ19fa29faGFzZm9jdXNMYXN0VmFsdWUnO1xua28uYmluZGluZ0hhbmRsZXJzWydoYXNmb2N1cyddID0ge1xuICAgICdpbml0JzogZnVuY3Rpb24oZWxlbWVudCwgdmFsdWVBY2Nlc3NvciwgYWxsQmluZGluZ3MpIHtcbiAgICAgICAgdmFyIGhhbmRsZUVsZW1lbnRGb2N1c0NoYW5nZSA9IGZ1bmN0aW9uKGlzRm9jdXNlZCkge1xuICAgICAgICAgICAgLy8gV2hlcmUgcG9zc2libGUsIGlnbm9yZSB3aGljaCBldmVudCB3YXMgcmFpc2VkIGFuZCBkZXRlcm1pbmUgZm9jdXMgc3RhdGUgdXNpbmcgYWN0aXZlRWxlbWVudCxcbiAgICAgICAgICAgIC8vIGFzIHRoaXMgYXZvaWRzIHBoYW50b20gZm9jdXMvYmx1ciBldmVudHMgcmFpc2VkIHdoZW4gY2hhbmdpbmcgdGFicyBpbiBtb2Rlcm4gYnJvd3NlcnMuXG4gICAgICAgICAgICAvLyBIb3dldmVyLCBub3QgYWxsIEtPLXRhcmdldGVkIGJyb3dzZXJzIChGaXJlZm94IDIpIHN1cHBvcnQgYWN0aXZlRWxlbWVudC4gRm9yIHRob3NlIGJyb3dzZXJzLFxuICAgICAgICAgICAgLy8gcHJldmVudCBhIGxvc3Mgb2YgZm9jdXMgd2hlbiBjaGFuZ2luZyB0YWJzL3dpbmRvd3MgYnkgc2V0dGluZyBhIGZsYWcgdGhhdCBwcmV2ZW50cyBoYXNmb2N1c1xuICAgICAgICAgICAgLy8gZnJvbSBjYWxsaW5nICdibHVyKCknIG9uIHRoZSBlbGVtZW50IHdoZW4gaXQgbG9zZXMgZm9jdXMuXG4gICAgICAgICAgICAvLyBEaXNjdXNzaW9uIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9TdGV2ZVNhbmRlcnNvbi9rbm9ja291dC9wdWxsLzM1MlxuICAgICAgICAgICAgZWxlbWVudFtoYXNmb2N1c1VwZGF0aW5nUHJvcGVydHldID0gdHJ1ZTtcbiAgICAgICAgICAgIHZhciBvd25lckRvYyA9IGVsZW1lbnQub3duZXJEb2N1bWVudDtcbiAgICAgICAgICAgIGlmIChcImFjdGl2ZUVsZW1lbnRcIiBpbiBvd25lckRvYykge1xuICAgICAgICAgICAgICAgIHZhciBhY3RpdmU7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgYWN0aXZlID0gb3duZXJEb2MuYWN0aXZlRWxlbWVudDtcbiAgICAgICAgICAgICAgICB9IGNhdGNoKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSUU5IHRocm93cyBpZiB5b3UgYWNjZXNzIGFjdGl2ZUVsZW1lbnQgZHVyaW5nIHBhZ2UgbG9hZCAoc2VlIGlzc3VlICM3MDMpXG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZSA9IG93bmVyRG9jLmJvZHk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlzRm9jdXNlZCA9IChhY3RpdmUgPT09IGVsZW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIG1vZGVsVmFsdWUgPSB2YWx1ZUFjY2Vzc29yKCk7XG4gICAgICAgICAgICBrby5leHByZXNzaW9uUmV3cml0aW5nLndyaXRlVmFsdWVUb1Byb3BlcnR5KG1vZGVsVmFsdWUsIGFsbEJpbmRpbmdzLCAnaGFzZm9jdXMnLCBpc0ZvY3VzZWQsIHRydWUpO1xuXG4gICAgICAgICAgICAvL2NhY2hlIHRoZSBsYXRlc3QgdmFsdWUsIHNvIHdlIGNhbiBhdm9pZCB1bm5lY2Vzc2FyaWx5IGNhbGxpbmcgZm9jdXMvYmx1ciBpbiB0aGUgdXBkYXRlIGZ1bmN0aW9uXG4gICAgICAgICAgICBlbGVtZW50W2hhc2ZvY3VzTGFzdFZhbHVlXSA9IGlzRm9jdXNlZDtcbiAgICAgICAgICAgIGVsZW1lbnRbaGFzZm9jdXNVcGRhdGluZ1Byb3BlcnR5XSA9IGZhbHNlO1xuICAgICAgICB9O1xuICAgICAgICB2YXIgaGFuZGxlRWxlbWVudEZvY3VzSW4gPSBoYW5kbGVFbGVtZW50Rm9jdXNDaGFuZ2UuYmluZChudWxsLCB0cnVlKTtcbiAgICAgICAgdmFyIGhhbmRsZUVsZW1lbnRGb2N1c091dCA9IGhhbmRsZUVsZW1lbnRGb2N1c0NoYW5nZS5iaW5kKG51bGwsIGZhbHNlKTtcblxuICAgICAgICBrby51dGlscy5yZWdpc3RlckV2ZW50SGFuZGxlcihlbGVtZW50LCBcImZvY3VzXCIsIGhhbmRsZUVsZW1lbnRGb2N1c0luKTtcbiAgICAgICAga28udXRpbHMucmVnaXN0ZXJFdmVudEhhbmRsZXIoZWxlbWVudCwgXCJmb2N1c2luXCIsIGhhbmRsZUVsZW1lbnRGb2N1c0luKTsgLy8gRm9yIElFXG4gICAgICAgIGtvLnV0aWxzLnJlZ2lzdGVyRXZlbnRIYW5kbGVyKGVsZW1lbnQsIFwiYmx1clwiLCAgaGFuZGxlRWxlbWVudEZvY3VzT3V0KTtcbiAgICAgICAga28udXRpbHMucmVnaXN0ZXJFdmVudEhhbmRsZXIoZWxlbWVudCwgXCJmb2N1c291dFwiLCAgaGFuZGxlRWxlbWVudEZvY3VzT3V0KTsgLy8gRm9yIElFXG4gICAgfSxcbiAgICAndXBkYXRlJzogZnVuY3Rpb24oZWxlbWVudCwgdmFsdWVBY2Nlc3Nvcikge1xuICAgICAgICB2YXIgdmFsdWUgPSAhIWtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUodmFsdWVBY2Nlc3NvcigpKTtcblxuICAgICAgICBpZiAoIWVsZW1lbnRbaGFzZm9jdXNVcGRhdGluZ1Byb3BlcnR5XSAmJiBlbGVtZW50W2hhc2ZvY3VzTGFzdFZhbHVlXSAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgIHZhbHVlID8gZWxlbWVudC5mb2N1cygpIDogZWxlbWVudC5ibHVyKCk7XG5cbiAgICAgICAgICAgIC8vIEluIElFLCB0aGUgYmx1ciBtZXRob2QgZG9lc24ndCBhbHdheXMgY2F1c2UgdGhlIGVsZW1lbnQgdG8gbG9zZSBmb2N1cyAoZm9yIGV4YW1wbGUsIGlmIHRoZSB3aW5kb3cgaXMgbm90IGluIGZvY3VzKS5cbiAgICAgICAgICAgIC8vIFNldHRpbmcgZm9jdXMgdG8gdGhlIGJvZHkgZWxlbWVudCBkb2VzIHNlZW0gdG8gYmUgcmVsaWFibGUgaW4gSUUsIGJ1dCBzaG91bGQgb25seSBiZSB1c2VkIGlmIHdlIGtub3cgdGhhdCB0aGUgY3VycmVudFxuICAgICAgICAgICAgLy8gZWxlbWVudCB3YXMgZm9jdXNlZCBhbHJlYWR5LlxuICAgICAgICAgICAgaWYgKCF2YWx1ZSAmJiBlbGVtZW50W2hhc2ZvY3VzTGFzdFZhbHVlXSkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQub3duZXJEb2N1bWVudC5ib2R5LmZvY3VzKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEZvciBJRSwgd2hpY2ggZG9lc24ndCByZWxpYWJseSBmaXJlIFwiZm9jdXNcIiBvciBcImJsdXJcIiBldmVudHMgc3luY2hyb25vdXNseVxuICAgICAgICAgICAga28uZGVwZW5kZW5jeURldGVjdGlvbi5pZ25vcmUoa28udXRpbHMudHJpZ2dlckV2ZW50LCBudWxsLCBbZWxlbWVudCwgdmFsdWUgPyBcImZvY3VzaW5cIiA6IFwiZm9jdXNvdXRcIl0pO1xuICAgICAgICB9XG4gICAgfVxufTtcbmtvLmV4cHJlc3Npb25SZXdyaXRpbmcudHdvV2F5QmluZGluZ3NbJ2hhc2ZvY3VzJ10gPSB0cnVlO1xuXG5rby5iaW5kaW5nSGFuZGxlcnNbJ2hhc0ZvY3VzJ10gPSBrby5iaW5kaW5nSGFuZGxlcnNbJ2hhc2ZvY3VzJ107IC8vIE1ha2UgXCJoYXNGb2N1c1wiIGFuIGFsaWFzXG5rby5leHByZXNzaW9uUmV3cml0aW5nLnR3b1dheUJpbmRpbmdzWydoYXNGb2N1cyddID0gdHJ1ZTtcbmtvLmJpbmRpbmdIYW5kbGVyc1snaHRtbCddID0ge1xuICAgICdpbml0JzogZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIFByZXZlbnQgYmluZGluZyBvbiB0aGUgZHluYW1pY2FsbHktaW5qZWN0ZWQgSFRNTCAoYXMgZGV2ZWxvcGVycyBhcmUgdW5saWtlbHkgdG8gZXhwZWN0IHRoYXQsIGFuZCBpdCBoYXMgc2VjdXJpdHkgaW1wbGljYXRpb25zKVxuICAgICAgICByZXR1cm4geyAnY29udHJvbHNEZXNjZW5kYW50QmluZGluZ3MnOiB0cnVlIH07XG4gICAgfSxcbiAgICAndXBkYXRlJzogZnVuY3Rpb24gKGVsZW1lbnQsIHZhbHVlQWNjZXNzb3IpIHtcbiAgICAgICAgLy8gc2V0SHRtbCB3aWxsIHVud3JhcCB0aGUgdmFsdWUgaWYgbmVlZGVkXG4gICAgICAgIGtvLnV0aWxzLnNldEh0bWwoZWxlbWVudCwgdmFsdWVBY2Nlc3NvcigpKTtcbiAgICB9XG59O1xuLy8gTWFrZXMgYSBiaW5kaW5nIGxpa2Ugd2l0aCBvciBpZlxuZnVuY3Rpb24gbWFrZVdpdGhJZkJpbmRpbmcoYmluZGluZ0tleSwgaXNXaXRoLCBpc05vdCwgbWFrZUNvbnRleHRDYWxsYmFjaykge1xuICAgIGtvLmJpbmRpbmdIYW5kbGVyc1tiaW5kaW5nS2V5XSA9IHtcbiAgICAgICAgJ2luaXQnOiBmdW5jdGlvbihlbGVtZW50LCB2YWx1ZUFjY2Vzc29yLCBhbGxCaW5kaW5ncywgdmlld01vZGVsLCBiaW5kaW5nQ29udGV4dCkge1xuICAgICAgICAgICAgdmFyIGRpZERpc3BsYXlPbkxhc3RVcGRhdGUsXG4gICAgICAgICAgICAgICAgc2F2ZWROb2RlcztcbiAgICAgICAgICAgIGtvLmNvbXB1dGVkKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHZhciByYXdWYWx1ZSA9IHZhbHVlQWNjZXNzb3IoKSxcbiAgICAgICAgICAgICAgICAgICAgZGF0YVZhbHVlID0ga28udXRpbHMudW53cmFwT2JzZXJ2YWJsZShyYXdWYWx1ZSksXG4gICAgICAgICAgICAgICAgICAgIHNob3VsZERpc3BsYXkgPSAhaXNOb3QgIT09ICFkYXRhVmFsdWUsIC8vIGVxdWl2YWxlbnQgdG8gaXNOb3QgPyAhZGF0YVZhbHVlIDogISFkYXRhVmFsdWVcbiAgICAgICAgICAgICAgICAgICAgaXNGaXJzdFJlbmRlciA9ICFzYXZlZE5vZGVzLFxuICAgICAgICAgICAgICAgICAgICBuZWVkc1JlZnJlc2ggPSBpc0ZpcnN0UmVuZGVyIHx8IGlzV2l0aCB8fCAoc2hvdWxkRGlzcGxheSAhPT0gZGlkRGlzcGxheU9uTGFzdFVwZGF0ZSk7XG5cbiAgICAgICAgICAgICAgICBpZiAobmVlZHNSZWZyZXNoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNhdmUgYSBjb3B5IG9mIHRoZSBpbm5lciBub2RlcyBvbiB0aGUgaW5pdGlhbCB1cGRhdGUsIGJ1dCBvbmx5IGlmIHdlIGhhdmUgZGVwZW5kZW5jaWVzLlxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNGaXJzdFJlbmRlciAmJiBrby5jb21wdXRlZENvbnRleHQuZ2V0RGVwZW5kZW5jaWVzQ291bnQoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZWROb2RlcyA9IGtvLnV0aWxzLmNsb25lTm9kZXMoa28udmlydHVhbEVsZW1lbnRzLmNoaWxkTm9kZXMoZWxlbWVudCksIHRydWUgLyogc2hvdWxkQ2xlYW5Ob2RlcyAqLyk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkRGlzcGxheSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0ZpcnN0UmVuZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAga28udmlydHVhbEVsZW1lbnRzLnNldERvbU5vZGVDaGlsZHJlbihlbGVtZW50LCBrby51dGlscy5jbG9uZU5vZGVzKHNhdmVkTm9kZXMpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGtvLmFwcGx5QmluZGluZ3NUb0Rlc2NlbmRhbnRzKG1ha2VDb250ZXh0Q2FsbGJhY2sgPyBtYWtlQ29udGV4dENhbGxiYWNrKGJpbmRpbmdDb250ZXh0LCByYXdWYWx1ZSkgOiBiaW5kaW5nQ29udGV4dCwgZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBrby52aXJ0dWFsRWxlbWVudHMuZW1wdHlOb2RlKGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgZGlkRGlzcGxheU9uTGFzdFVwZGF0ZSA9IHNob3VsZERpc3BsYXk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgbnVsbCwgeyBkaXNwb3NlV2hlbk5vZGVJc1JlbW92ZWQ6IGVsZW1lbnQgfSk7XG4gICAgICAgICAgICByZXR1cm4geyAnY29udHJvbHNEZXNjZW5kYW50QmluZGluZ3MnOiB0cnVlIH07XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGtvLmV4cHJlc3Npb25SZXdyaXRpbmcuYmluZGluZ1Jld3JpdGVWYWxpZGF0b3JzW2JpbmRpbmdLZXldID0gZmFsc2U7IC8vIENhbid0IHJld3JpdGUgY29udHJvbCBmbG93IGJpbmRpbmdzXG4gICAga28udmlydHVhbEVsZW1lbnRzLmFsbG93ZWRCaW5kaW5nc1tiaW5kaW5nS2V5XSA9IHRydWU7XG59XG5cbi8vIENvbnN0cnVjdCB0aGUgYWN0dWFsIGJpbmRpbmcgaGFuZGxlcnNcbm1ha2VXaXRoSWZCaW5kaW5nKCdpZicpO1xubWFrZVdpdGhJZkJpbmRpbmcoJ2lmbm90JywgZmFsc2UgLyogaXNXaXRoICovLCB0cnVlIC8qIGlzTm90ICovKTtcbm1ha2VXaXRoSWZCaW5kaW5nKCd3aXRoJywgdHJ1ZSAvKiBpc1dpdGggKi8sIGZhbHNlIC8qIGlzTm90ICovLFxuICAgIGZ1bmN0aW9uKGJpbmRpbmdDb250ZXh0LCBkYXRhVmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGJpbmRpbmdDb250ZXh0LmNyZWF0ZVN0YXRpY0NoaWxkQ29udGV4dChkYXRhVmFsdWUpO1xuICAgIH1cbik7XG52YXIgY2FwdGlvblBsYWNlaG9sZGVyID0ge307XG5rby5iaW5kaW5nSGFuZGxlcnNbJ29wdGlvbnMnXSA9IHtcbiAgICAnaW5pdCc6IGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgICAgICAgaWYgKGtvLnV0aWxzLnRhZ05hbWVMb3dlcihlbGVtZW50KSAhPT0gXCJzZWxlY3RcIilcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIm9wdGlvbnMgYmluZGluZyBhcHBsaWVzIG9ubHkgdG8gU0VMRUNUIGVsZW1lbnRzXCIpO1xuXG4gICAgICAgIC8vIFJlbW92ZSBhbGwgZXhpc3RpbmcgPG9wdGlvbj5zLlxuICAgICAgICB3aGlsZSAoZWxlbWVudC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBlbGVtZW50LnJlbW92ZSgwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVuc3VyZXMgdGhhdCB0aGUgYmluZGluZyBwcm9jZXNzb3IgZG9lc24ndCB0cnkgdG8gYmluZCB0aGUgb3B0aW9uc1xuICAgICAgICByZXR1cm4geyAnY29udHJvbHNEZXNjZW5kYW50QmluZGluZ3MnOiB0cnVlIH07XG4gICAgfSxcbiAgICAndXBkYXRlJzogZnVuY3Rpb24gKGVsZW1lbnQsIHZhbHVlQWNjZXNzb3IsIGFsbEJpbmRpbmdzKSB7XG4gICAgICAgIGZ1bmN0aW9uIHNlbGVjdGVkT3B0aW9ucygpIHtcbiAgICAgICAgICAgIHJldHVybiBrby51dGlscy5hcnJheUZpbHRlcihlbGVtZW50Lm9wdGlvbnMsIGZ1bmN0aW9uIChub2RlKSB7IHJldHVybiBub2RlLnNlbGVjdGVkOyB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBzZWxlY3RXYXNQcmV2aW91c2x5RW1wdHkgPSBlbGVtZW50Lmxlbmd0aCA9PSAwLFxuICAgICAgICAgICAgbXVsdGlwbGUgPSBlbGVtZW50Lm11bHRpcGxlLFxuICAgICAgICAgICAgcHJldmlvdXNTY3JvbGxUb3AgPSAoIXNlbGVjdFdhc1ByZXZpb3VzbHlFbXB0eSAmJiBtdWx0aXBsZSkgPyBlbGVtZW50LnNjcm9sbFRvcCA6IG51bGwsXG4gICAgICAgICAgICB1bndyYXBwZWRBcnJheSA9IGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUodmFsdWVBY2Nlc3NvcigpKSxcbiAgICAgICAgICAgIHZhbHVlQWxsb3dVbnNldCA9IGFsbEJpbmRpbmdzLmdldCgndmFsdWVBbGxvd1Vuc2V0JykgJiYgYWxsQmluZGluZ3NbJ2hhcyddKCd2YWx1ZScpLFxuICAgICAgICAgICAgaW5jbHVkZURlc3Ryb3llZCA9IGFsbEJpbmRpbmdzLmdldCgnb3B0aW9uc0luY2x1ZGVEZXN0cm95ZWQnKSxcbiAgICAgICAgICAgIGFycmF5VG9Eb21Ob2RlQ2hpbGRyZW5PcHRpb25zID0ge30sXG4gICAgICAgICAgICBjYXB0aW9uVmFsdWUsXG4gICAgICAgICAgICBmaWx0ZXJlZEFycmF5LFxuICAgICAgICAgICAgcHJldmlvdXNTZWxlY3RlZFZhbHVlcyA9IFtdO1xuXG4gICAgICAgIGlmICghdmFsdWVBbGxvd1Vuc2V0KSB7XG4gICAgICAgICAgICBpZiAobXVsdGlwbGUpIHtcbiAgICAgICAgICAgICAgICBwcmV2aW91c1NlbGVjdGVkVmFsdWVzID0ga28udXRpbHMuYXJyYXlNYXAoc2VsZWN0ZWRPcHRpb25zKCksIGtvLnNlbGVjdEV4dGVuc2lvbnMucmVhZFZhbHVlKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC5zZWxlY3RlZEluZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgICBwcmV2aW91c1NlbGVjdGVkVmFsdWVzLnB1c2goa28uc2VsZWN0RXh0ZW5zaW9ucy5yZWFkVmFsdWUoZWxlbWVudC5vcHRpb25zW2VsZW1lbnQuc2VsZWN0ZWRJbmRleF0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh1bndyYXBwZWRBcnJheSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB1bndyYXBwZWRBcnJheS5sZW5ndGggPT0gXCJ1bmRlZmluZWRcIikgLy8gQ29lcmNlIHNpbmdsZSB2YWx1ZSBpbnRvIGFycmF5XG4gICAgICAgICAgICAgICAgdW53cmFwcGVkQXJyYXkgPSBbdW53cmFwcGVkQXJyYXldO1xuXG4gICAgICAgICAgICAvLyBGaWx0ZXIgb3V0IGFueSBlbnRyaWVzIG1hcmtlZCBhcyBkZXN0cm95ZWRcbiAgICAgICAgICAgIGZpbHRlcmVkQXJyYXkgPSBrby51dGlscy5hcnJheUZpbHRlcih1bndyYXBwZWRBcnJheSwgZnVuY3Rpb24oaXRlbSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpbmNsdWRlRGVzdHJveWVkIHx8IGl0ZW0gPT09IHVuZGVmaW5lZCB8fCBpdGVtID09PSBudWxsIHx8ICFrby51dGlscy51bndyYXBPYnNlcnZhYmxlKGl0ZW1bJ19kZXN0cm95J10pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIElmIGNhcHRpb24gaXMgaW5jbHVkZWQsIGFkZCBpdCB0byB0aGUgYXJyYXlcbiAgICAgICAgICAgIGlmIChhbGxCaW5kaW5nc1snaGFzJ10oJ29wdGlvbnNDYXB0aW9uJykpIHtcbiAgICAgICAgICAgICAgICBjYXB0aW9uVmFsdWUgPSBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKGFsbEJpbmRpbmdzLmdldCgnb3B0aW9uc0NhcHRpb24nKSk7XG4gICAgICAgICAgICAgICAgLy8gSWYgY2FwdGlvbiB2YWx1ZSBpcyBudWxsIG9yIHVuZGVmaW5lZCwgZG9uJ3Qgc2hvdyBhIGNhcHRpb25cbiAgICAgICAgICAgICAgICBpZiAoY2FwdGlvblZhbHVlICE9PSBudWxsICYmIGNhcHRpb25WYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkQXJyYXkudW5zaGlmdChjYXB0aW9uUGxhY2Vob2xkZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIElmIGEgZmFsc3kgdmFsdWUgaXMgcHJvdmlkZWQgKGUuZy4gbnVsbCksIHdlJ2xsIHNpbXBseSBlbXB0eSB0aGUgc2VsZWN0IGVsZW1lbnRcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGFwcGx5VG9PYmplY3Qob2JqZWN0LCBwcmVkaWNhdGUsIGRlZmF1bHRWYWx1ZSkge1xuICAgICAgICAgICAgdmFyIHByZWRpY2F0ZVR5cGUgPSB0eXBlb2YgcHJlZGljYXRlO1xuICAgICAgICAgICAgaWYgKHByZWRpY2F0ZVR5cGUgPT0gXCJmdW5jdGlvblwiKSAgICAvLyBHaXZlbiBhIGZ1bmN0aW9uOyBydW4gaXQgYWdhaW5zdCB0aGUgZGF0YSB2YWx1ZVxuICAgICAgICAgICAgICAgIHJldHVybiBwcmVkaWNhdGUob2JqZWN0KTtcbiAgICAgICAgICAgIGVsc2UgaWYgKHByZWRpY2F0ZVR5cGUgPT0gXCJzdHJpbmdcIikgLy8gR2l2ZW4gYSBzdHJpbmc7IHRyZWF0IGl0IGFzIGEgcHJvcGVydHkgbmFtZSBvbiB0aGUgZGF0YSB2YWx1ZVxuICAgICAgICAgICAgICAgIHJldHVybiBvYmplY3RbcHJlZGljYXRlXTtcbiAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdpdmVuIG5vIG9wdGlvbnNUZXh0IGFyZzsgdXNlIHRoZSBkYXRhIHZhbHVlIGl0c2VsZlxuICAgICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBjYW4gcnVuIGF0IHR3byBkaWZmZXJlbnQgdGltZXM6XG4gICAgICAgIC8vIFRoZSBmaXJzdCBpcyB3aGVuIHRoZSB3aG9sZSBhcnJheSBpcyBiZWluZyB1cGRhdGVkIGRpcmVjdGx5IGZyb20gdGhpcyBiaW5kaW5nIGhhbmRsZXIuXG4gICAgICAgIC8vIFRoZSBzZWNvbmQgaXMgd2hlbiBhbiBvYnNlcnZhYmxlIHZhbHVlIGZvciBhIHNwZWNpZmljIGFycmF5IGVudHJ5IGlzIHVwZGF0ZWQuXG4gICAgICAgIC8vIG9sZE9wdGlvbnMgd2lsbCBiZSBlbXB0eSBpbiB0aGUgZmlyc3QgY2FzZSwgYnV0IHdpbGwgYmUgZmlsbGVkIHdpdGggdGhlIHByZXZpb3VzbHkgZ2VuZXJhdGVkIG9wdGlvbiBpbiB0aGUgc2Vjb25kLlxuICAgICAgICB2YXIgaXRlbVVwZGF0ZSA9IGZhbHNlO1xuICAgICAgICBmdW5jdGlvbiBvcHRpb25Gb3JBcnJheUl0ZW0oYXJyYXlFbnRyeSwgaW5kZXgsIG9sZE9wdGlvbnMpIHtcbiAgICAgICAgICAgIGlmIChvbGRPcHRpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHByZXZpb3VzU2VsZWN0ZWRWYWx1ZXMgPSAhdmFsdWVBbGxvd1Vuc2V0ICYmIG9sZE9wdGlvbnNbMF0uc2VsZWN0ZWQgPyBbIGtvLnNlbGVjdEV4dGVuc2lvbnMucmVhZFZhbHVlKG9sZE9wdGlvbnNbMF0pIF0gOiBbXTtcbiAgICAgICAgICAgICAgICBpdGVtVXBkYXRlID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBvcHRpb24gPSBlbGVtZW50Lm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudChcIm9wdGlvblwiKTtcbiAgICAgICAgICAgIGlmIChhcnJheUVudHJ5ID09PSBjYXB0aW9uUGxhY2Vob2xkZXIpIHtcbiAgICAgICAgICAgICAgICBrby51dGlscy5zZXRUZXh0Q29udGVudChvcHRpb24sIGFsbEJpbmRpbmdzLmdldCgnb3B0aW9uc0NhcHRpb24nKSk7XG4gICAgICAgICAgICAgICAga28uc2VsZWN0RXh0ZW5zaW9ucy53cml0ZVZhbHVlKG9wdGlvbiwgdW5kZWZpbmVkKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gQXBwbHkgYSB2YWx1ZSB0byB0aGUgb3B0aW9uIGVsZW1lbnRcbiAgICAgICAgICAgICAgICB2YXIgb3B0aW9uVmFsdWUgPSBhcHBseVRvT2JqZWN0KGFycmF5RW50cnksIGFsbEJpbmRpbmdzLmdldCgnb3B0aW9uc1ZhbHVlJyksIGFycmF5RW50cnkpO1xuICAgICAgICAgICAgICAgIGtvLnNlbGVjdEV4dGVuc2lvbnMud3JpdGVWYWx1ZShvcHRpb24sIGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUob3B0aW9uVmFsdWUpKTtcblxuICAgICAgICAgICAgICAgIC8vIEFwcGx5IHNvbWUgdGV4dCB0byB0aGUgb3B0aW9uIGVsZW1lbnRcbiAgICAgICAgICAgICAgICB2YXIgb3B0aW9uVGV4dCA9IGFwcGx5VG9PYmplY3QoYXJyYXlFbnRyeSwgYWxsQmluZGluZ3MuZ2V0KCdvcHRpb25zVGV4dCcpLCBvcHRpb25WYWx1ZSk7XG4gICAgICAgICAgICAgICAga28udXRpbHMuc2V0VGV4dENvbnRlbnQob3B0aW9uLCBvcHRpb25UZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBbb3B0aW9uXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEJ5IHVzaW5nIGEgYmVmb3JlUmVtb3ZlIGNhbGxiYWNrLCB3ZSBkZWxheSB0aGUgcmVtb3ZhbCB1bnRpbCBhZnRlciBuZXcgaXRlbXMgYXJlIGFkZGVkLiBUaGlzIGZpeGVzIGEgc2VsZWN0aW9uXG4gICAgICAgIC8vIHByb2JsZW0gaW4gSUU8PTggYW5kIEZpcmVmb3guIFNlZSBodHRwczovL2dpdGh1Yi5jb20va25vY2tvdXQva25vY2tvdXQvaXNzdWVzLzEyMDhcbiAgICAgICAgYXJyYXlUb0RvbU5vZGVDaGlsZHJlbk9wdGlvbnNbJ2JlZm9yZVJlbW92ZSddID1cbiAgICAgICAgICAgIGZ1bmN0aW9uIChvcHRpb24pIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZUNoaWxkKG9wdGlvbik7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgIGZ1bmN0aW9uIHNldFNlbGVjdGlvbkNhbGxiYWNrKGFycmF5RW50cnksIG5ld09wdGlvbnMpIHtcbiAgICAgICAgICAgIGlmIChpdGVtVXBkYXRlICYmIHZhbHVlQWxsb3dVbnNldCkge1xuICAgICAgICAgICAgICAgIC8vIFRoZSBtb2RlbCB2YWx1ZSBpcyBhdXRob3JpdGF0aXZlLCBzbyBtYWtlIHN1cmUgaXRzIHZhbHVlIGlzIHRoZSBvbmUgc2VsZWN0ZWRcbiAgICAgICAgICAgICAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHVzZSBkZXBlbmRlbmN5RGV0ZWN0aW9uLmlnbm9yZSBzaW5jZSBzZXREb21Ob2RlQ2hpbGRyZW5Gcm9tQXJyYXlNYXBwaW5nIGRvZXMgc28gYWxyZWFkeS5cbiAgICAgICAgICAgICAgICBrby5zZWxlY3RFeHRlbnNpb25zLndyaXRlVmFsdWUoZWxlbWVudCwga28udXRpbHMudW53cmFwT2JzZXJ2YWJsZShhbGxCaW5kaW5ncy5nZXQoJ3ZhbHVlJykpLCB0cnVlIC8qIGFsbG93VW5zZXQgKi8pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwcmV2aW91c1NlbGVjdGVkVmFsdWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIC8vIElFNiBkb2Vzbid0IGxpa2UgdXMgdG8gYXNzaWduIHNlbGVjdGlvbiB0byBPUFRJT04gbm9kZXMgYmVmb3JlIHRoZXkncmUgYWRkZWQgdG8gdGhlIGRvY3VtZW50LlxuICAgICAgICAgICAgICAgIC8vIFRoYXQncyB3aHkgd2UgZmlyc3QgYWRkZWQgdGhlbSB3aXRob3V0IHNlbGVjdGlvbi4gTm93IGl0J3MgdGltZSB0byBzZXQgdGhlIHNlbGVjdGlvbi5cbiAgICAgICAgICAgICAgICB2YXIgaXNTZWxlY3RlZCA9IGtvLnV0aWxzLmFycmF5SW5kZXhPZihwcmV2aW91c1NlbGVjdGVkVmFsdWVzLCBrby5zZWxlY3RFeHRlbnNpb25zLnJlYWRWYWx1ZShuZXdPcHRpb25zWzBdKSkgPj0gMDtcbiAgICAgICAgICAgICAgICBrby51dGlscy5zZXRPcHRpb25Ob2RlU2VsZWN0aW9uU3RhdGUobmV3T3B0aW9uc1swXSwgaXNTZWxlY3RlZCk7XG5cbiAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIG9wdGlvbiB3YXMgY2hhbmdlZCBmcm9tIGJlaW5nIHNlbGVjdGVkIGR1cmluZyBhIHNpbmdsZS1pdGVtIHVwZGF0ZSwgbm90aWZ5IHRoZSBjaGFuZ2VcbiAgICAgICAgICAgICAgICBpZiAoaXRlbVVwZGF0ZSAmJiAhaXNTZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgICAgICBrby5kZXBlbmRlbmN5RGV0ZWN0aW9uLmlnbm9yZShrby51dGlscy50cmlnZ2VyRXZlbnQsIG51bGwsIFtlbGVtZW50LCBcImNoYW5nZVwiXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGNhbGxiYWNrID0gc2V0U2VsZWN0aW9uQ2FsbGJhY2s7XG4gICAgICAgIGlmIChhbGxCaW5kaW5nc1snaGFzJ10oJ29wdGlvbnNBZnRlclJlbmRlcicpICYmIHR5cGVvZiBhbGxCaW5kaW5ncy5nZXQoJ29wdGlvbnNBZnRlclJlbmRlcicpID09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgY2FsbGJhY2sgPSBmdW5jdGlvbihhcnJheUVudHJ5LCBuZXdPcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgc2V0U2VsZWN0aW9uQ2FsbGJhY2soYXJyYXlFbnRyeSwgbmV3T3B0aW9ucyk7XG4gICAgICAgICAgICAgICAga28uZGVwZW5kZW5jeURldGVjdGlvbi5pZ25vcmUoYWxsQmluZGluZ3MuZ2V0KCdvcHRpb25zQWZ0ZXJSZW5kZXInKSwgbnVsbCwgW25ld09wdGlvbnNbMF0sIGFycmF5RW50cnkgIT09IGNhcHRpb25QbGFjZWhvbGRlciA/IGFycmF5RW50cnkgOiB1bmRlZmluZWRdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGtvLnV0aWxzLnNldERvbU5vZGVDaGlsZHJlbkZyb21BcnJheU1hcHBpbmcoZWxlbWVudCwgZmlsdGVyZWRBcnJheSwgb3B0aW9uRm9yQXJyYXlJdGVtLCBhcnJheVRvRG9tTm9kZUNoaWxkcmVuT3B0aW9ucywgY2FsbGJhY2spO1xuXG4gICAgICAgIGtvLmRlcGVuZGVuY3lEZXRlY3Rpb24uaWdub3JlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZUFsbG93VW5zZXQpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgbW9kZWwgdmFsdWUgaXMgYXV0aG9yaXRhdGl2ZSwgc28gbWFrZSBzdXJlIGl0cyB2YWx1ZSBpcyB0aGUgb25lIHNlbGVjdGVkXG4gICAgICAgICAgICAgICAga28uc2VsZWN0RXh0ZW5zaW9ucy53cml0ZVZhbHVlKGVsZW1lbnQsIGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUoYWxsQmluZGluZ3MuZ2V0KCd2YWx1ZScpKSwgdHJ1ZSAvKiBhbGxvd1Vuc2V0ICovKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIGlmIHRoZSBzZWxlY3Rpb24gaGFzIGNoYW5nZWQgYXMgYSByZXN1bHQgb2YgdXBkYXRpbmcgdGhlIG9wdGlvbnMgbGlzdFxuICAgICAgICAgICAgICAgIHZhciBzZWxlY3Rpb25DaGFuZ2VkO1xuICAgICAgICAgICAgICAgIGlmIChtdWx0aXBsZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBGb3IgYSBtdWx0aXBsZS1zZWxlY3QgYm94LCBjb21wYXJlIHRoZSBuZXcgc2VsZWN0aW9uIGNvdW50IHRvIHRoZSBwcmV2aW91cyBvbmVcbiAgICAgICAgICAgICAgICAgICAgLy8gQnV0IGlmIG5vdGhpbmcgd2FzIHNlbGVjdGVkIGJlZm9yZSwgdGhlIHNlbGVjdGlvbiBjYW4ndCBoYXZlIGNoYW5nZWRcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uQ2hhbmdlZCA9IHByZXZpb3VzU2VsZWN0ZWRWYWx1ZXMubGVuZ3RoICYmIHNlbGVjdGVkT3B0aW9ucygpLmxlbmd0aCA8IHByZXZpb3VzU2VsZWN0ZWRWYWx1ZXMubGVuZ3RoO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEZvciBhIHNpbmdsZS1zZWxlY3QgYm94LCBjb21wYXJlIHRoZSBjdXJyZW50IHZhbHVlIHRvIHRoZSBwcmV2aW91cyB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAvLyBCdXQgaWYgbm90aGluZyB3YXMgc2VsZWN0ZWQgYmVmb3JlIG9yIG5vdGhpbmcgaXMgc2VsZWN0ZWQgbm93LCBqdXN0IGxvb2sgZm9yIGEgY2hhbmdlIGluIHNlbGVjdGlvblxuICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25DaGFuZ2VkID0gKHByZXZpb3VzU2VsZWN0ZWRWYWx1ZXMubGVuZ3RoICYmIGVsZW1lbnQuc2VsZWN0ZWRJbmRleCA+PSAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyAoa28uc2VsZWN0RXh0ZW5zaW9ucy5yZWFkVmFsdWUoZWxlbWVudC5vcHRpb25zW2VsZW1lbnQuc2VsZWN0ZWRJbmRleF0pICE9PSBwcmV2aW91c1NlbGVjdGVkVmFsdWVzWzBdKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiAocHJldmlvdXNTZWxlY3RlZFZhbHVlcy5sZW5ndGggfHwgZWxlbWVudC5zZWxlY3RlZEluZGV4ID49IDApO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIEVuc3VyZSBjb25zaXN0ZW5jeSBiZXR3ZWVuIG1vZGVsIHZhbHVlIGFuZCBzZWxlY3RlZCBvcHRpb24uXG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIGRyb3Bkb3duIHdhcyBjaGFuZ2VkIHNvIHRoYXQgc2VsZWN0aW9uIGlzIG5vIGxvbmdlciB0aGUgc2FtZSxcbiAgICAgICAgICAgICAgICAvLyBub3RpZnkgdGhlIHZhbHVlIG9yIHNlbGVjdGVkT3B0aW9ucyBiaW5kaW5nLlxuICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb25DaGFuZ2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIGtvLnV0aWxzLnRyaWdnZXJFdmVudChlbGVtZW50LCBcImNoYW5nZVwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFdvcmthcm91bmQgZm9yIElFIGJ1Z1xuICAgICAgICBrby51dGlscy5lbnN1cmVTZWxlY3RFbGVtZW50SXNSZW5kZXJlZENvcnJlY3RseShlbGVtZW50KTtcblxuICAgICAgICBpZiAocHJldmlvdXNTY3JvbGxUb3AgJiYgTWF0aC5hYnMocHJldmlvdXNTY3JvbGxUb3AgLSBlbGVtZW50LnNjcm9sbFRvcCkgPiAyMClcbiAgICAgICAgICAgIGVsZW1lbnQuc2Nyb2xsVG9wID0gcHJldmlvdXNTY3JvbGxUb3A7XG4gICAgfVxufTtcbmtvLmJpbmRpbmdIYW5kbGVyc1snb3B0aW9ucyddLm9wdGlvblZhbHVlRG9tRGF0YUtleSA9IGtvLnV0aWxzLmRvbURhdGEubmV4dEtleSgpO1xua28uYmluZGluZ0hhbmRsZXJzWydzZWxlY3RlZE9wdGlvbnMnXSA9IHtcbiAgICAnYWZ0ZXInOiBbJ29wdGlvbnMnLCAnZm9yZWFjaCddLFxuICAgICdpbml0JzogZnVuY3Rpb24gKGVsZW1lbnQsIHZhbHVlQWNjZXNzb3IsIGFsbEJpbmRpbmdzKSB7XG4gICAgICAgIGtvLnV0aWxzLnJlZ2lzdGVyRXZlbnRIYW5kbGVyKGVsZW1lbnQsIFwiY2hhbmdlXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IHZhbHVlQWNjZXNzb3IoKSwgdmFsdWVUb1dyaXRlID0gW107XG4gICAgICAgICAgICBrby51dGlscy5hcnJheUZvckVhY2goZWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcIm9wdGlvblwiKSwgZnVuY3Rpb24obm9kZSkge1xuICAgICAgICAgICAgICAgIGlmIChub2RlLnNlbGVjdGVkKVxuICAgICAgICAgICAgICAgICAgICB2YWx1ZVRvV3JpdGUucHVzaChrby5zZWxlY3RFeHRlbnNpb25zLnJlYWRWYWx1ZShub2RlKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGtvLmV4cHJlc3Npb25SZXdyaXRpbmcud3JpdGVWYWx1ZVRvUHJvcGVydHkodmFsdWUsIGFsbEJpbmRpbmdzLCAnc2VsZWN0ZWRPcHRpb25zJywgdmFsdWVUb1dyaXRlKTtcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICAndXBkYXRlJzogZnVuY3Rpb24gKGVsZW1lbnQsIHZhbHVlQWNjZXNzb3IpIHtcbiAgICAgICAgaWYgKGtvLnV0aWxzLnRhZ05hbWVMb3dlcihlbGVtZW50KSAhPSBcInNlbGVjdFwiKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidmFsdWVzIGJpbmRpbmcgYXBwbGllcyBvbmx5IHRvIFNFTEVDVCBlbGVtZW50c1wiKTtcblxuICAgICAgICB2YXIgbmV3VmFsdWUgPSBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKHZhbHVlQWNjZXNzb3IoKSksXG4gICAgICAgICAgICBwcmV2aW91c1Njcm9sbFRvcCA9IGVsZW1lbnQuc2Nyb2xsVG9wO1xuXG4gICAgICAgIGlmIChuZXdWYWx1ZSAmJiB0eXBlb2YgbmV3VmFsdWUubGVuZ3RoID09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgIGtvLnV0aWxzLmFycmF5Rm9yRWFjaChlbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwib3B0aW9uXCIpLCBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgICAgICAgICAgdmFyIGlzU2VsZWN0ZWQgPSBrby51dGlscy5hcnJheUluZGV4T2YobmV3VmFsdWUsIGtvLnNlbGVjdEV4dGVuc2lvbnMucmVhZFZhbHVlKG5vZGUpKSA+PSAwO1xuICAgICAgICAgICAgICAgIGlmIChub2RlLnNlbGVjdGVkICE9IGlzU2VsZWN0ZWQpIHsgICAgICAvLyBUaGlzIGNoZWNrIHByZXZlbnRzIGZsYXNoaW5nIG9mIHRoZSBzZWxlY3QgZWxlbWVudCBpbiBJRVxuICAgICAgICAgICAgICAgICAgICBrby51dGlscy5zZXRPcHRpb25Ob2RlU2VsZWN0aW9uU3RhdGUobm9kZSwgaXNTZWxlY3RlZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBlbGVtZW50LnNjcm9sbFRvcCA9IHByZXZpb3VzU2Nyb2xsVG9wO1xuICAgIH1cbn07XG5rby5leHByZXNzaW9uUmV3cml0aW5nLnR3b1dheUJpbmRpbmdzWydzZWxlY3RlZE9wdGlvbnMnXSA9IHRydWU7XG5rby5iaW5kaW5nSGFuZGxlcnNbJ3N0eWxlJ10gPSB7XG4gICAgJ3VwZGF0ZSc6IGZ1bmN0aW9uIChlbGVtZW50LCB2YWx1ZUFjY2Vzc29yKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUodmFsdWVBY2Nlc3NvcigpIHx8IHt9KTtcbiAgICAgICAga28udXRpbHMub2JqZWN0Rm9yRWFjaCh2YWx1ZSwgZnVuY3Rpb24oc3R5bGVOYW1lLCBzdHlsZVZhbHVlKSB7XG4gICAgICAgICAgICBzdHlsZVZhbHVlID0ga28udXRpbHMudW53cmFwT2JzZXJ2YWJsZShzdHlsZVZhbHVlKTtcblxuICAgICAgICAgICAgaWYgKHN0eWxlVmFsdWUgPT09IG51bGwgfHwgc3R5bGVWYWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHN0eWxlVmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgLy8gRW1wdHkgc3RyaW5nIHJlbW92ZXMgdGhlIHZhbHVlLCB3aGVyZWFzIG51bGwvdW5kZWZpbmVkIGhhdmUgbm8gZWZmZWN0XG4gICAgICAgICAgICAgICAgc3R5bGVWYWx1ZSA9IFwiXCI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGVbc3R5bGVOYW1lXSA9IHN0eWxlVmFsdWU7XG4gICAgICAgIH0pO1xuICAgIH1cbn07XG5rby5iaW5kaW5nSGFuZGxlcnNbJ3N1Ym1pdCddID0ge1xuICAgICdpbml0JzogZnVuY3Rpb24gKGVsZW1lbnQsIHZhbHVlQWNjZXNzb3IsIGFsbEJpbmRpbmdzLCB2aWV3TW9kZWwsIGJpbmRpbmdDb250ZXh0KSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWVBY2Nlc3NvcigpICE9IFwiZnVuY3Rpb25cIilcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSB2YWx1ZSBmb3IgYSBzdWJtaXQgYmluZGluZyBtdXN0IGJlIGEgZnVuY3Rpb25cIik7XG4gICAgICAgIGtvLnV0aWxzLnJlZ2lzdGVyRXZlbnRIYW5kbGVyKGVsZW1lbnQsIFwic3VibWl0XCIsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgdmFyIGhhbmRsZXJSZXR1cm5WYWx1ZTtcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IHZhbHVlQWNjZXNzb3IoKTtcbiAgICAgICAgICAgIHRyeSB7IGhhbmRsZXJSZXR1cm5WYWx1ZSA9IHZhbHVlLmNhbGwoYmluZGluZ0NvbnRleHRbJyRkYXRhJ10sIGVsZW1lbnQpOyB9XG4gICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICBpZiAoaGFuZGxlclJldHVyblZhbHVlICE9PSB0cnVlKSB7IC8vIE5vcm1hbGx5IHdlIHdhbnQgdG8gcHJldmVudCBkZWZhdWx0IGFjdGlvbi4gRGV2ZWxvcGVyIGNhbiBvdmVycmlkZSB0aGlzIGJlIGV4cGxpY2l0bHkgcmV0dXJuaW5nIHRydWUuXG4gICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5wcmV2ZW50RGVmYXVsdClcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnJldHVyblZhbHVlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59O1xua28uYmluZGluZ0hhbmRsZXJzWyd0ZXh0J10gPSB7XG4gICAgJ2luaXQnOiBmdW5jdGlvbigpIHtcbiAgICAgICAgLy8gUHJldmVudCBiaW5kaW5nIG9uIHRoZSBkeW5hbWljYWxseS1pbmplY3RlZCB0ZXh0IG5vZGUgKGFzIGRldmVsb3BlcnMgYXJlIHVubGlrZWx5IHRvIGV4cGVjdCB0aGF0LCBhbmQgaXQgaGFzIHNlY3VyaXR5IGltcGxpY2F0aW9ucykuXG4gICAgICAgIC8vIEl0IHNob3VsZCBhbHNvIG1ha2UgdGhpbmdzIGZhc3RlciwgYXMgd2Ugbm8gbG9uZ2VyIGhhdmUgdG8gY29uc2lkZXIgd2hldGhlciB0aGUgdGV4dCBub2RlIG1pZ2h0IGJlIGJpbmRhYmxlLlxuICAgICAgICByZXR1cm4geyAnY29udHJvbHNEZXNjZW5kYW50QmluZGluZ3MnOiB0cnVlIH07XG4gICAgfSxcbiAgICAndXBkYXRlJzogZnVuY3Rpb24gKGVsZW1lbnQsIHZhbHVlQWNjZXNzb3IpIHtcbiAgICAgICAga28udXRpbHMuc2V0VGV4dENvbnRlbnQoZWxlbWVudCwgdmFsdWVBY2Nlc3NvcigpKTtcbiAgICB9XG59O1xua28udmlydHVhbEVsZW1lbnRzLmFsbG93ZWRCaW5kaW5nc1sndGV4dCddID0gdHJ1ZTtcbihmdW5jdGlvbiAoKSB7XG5cbmlmICh3aW5kb3cgJiYgd2luZG93Lm5hdmlnYXRvcikge1xuICAgIHZhciBwYXJzZVZlcnNpb24gPSBmdW5jdGlvbiAobWF0Y2hlcykge1xuICAgICAgICBpZiAobWF0Y2hlcykge1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlRmxvYXQobWF0Y2hlc1sxXSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gRGV0ZWN0IHZhcmlvdXMgYnJvd3NlciB2ZXJzaW9ucyBiZWNhdXNlIHNvbWUgb2xkIHZlcnNpb25zIGRvbid0IGZ1bGx5IHN1cHBvcnQgdGhlICdpbnB1dCcgZXZlbnRcbiAgICB2YXIgb3BlcmFWZXJzaW9uID0gd2luZG93Lm9wZXJhICYmIHdpbmRvdy5vcGVyYS52ZXJzaW9uICYmIHBhcnNlSW50KHdpbmRvdy5vcGVyYS52ZXJzaW9uKCkpLFxuICAgICAgICB1c2VyQWdlbnQgPSB3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCxcbiAgICAgICAgc2FmYXJpVmVyc2lvbiA9IHBhcnNlVmVyc2lvbih1c2VyQWdlbnQubWF0Y2goL14oPzooPyFjaHJvbWUpLikqdmVyc2lvblxcLyhbXiBdKikgc2FmYXJpL2kpKSxcbiAgICAgICAgZmlyZWZveFZlcnNpb24gPSBwYXJzZVZlcnNpb24odXNlckFnZW50Lm1hdGNoKC9GaXJlZm94XFwvKFteIF0qKS8pKTtcbn1cblxuLy8gSUUgOCBhbmQgOSBoYXZlIGJ1Z3MgdGhhdCBwcmV2ZW50IHRoZSBub3JtYWwgZXZlbnRzIGZyb20gZmlyaW5nIHdoZW4gdGhlIHZhbHVlIGNoYW5nZXMuXG4vLyBCdXQgaXQgZG9lcyBmaXJlIHRoZSAnc2VsZWN0aW9uY2hhbmdlJyBldmVudCBvbiBtYW55IG9mIHRob3NlLCBwcmVzdW1hYmx5IGJlY2F1c2UgdGhlXG4vLyBjdXJzb3IgaXMgbW92aW5nIGFuZCB0aGF0IGNvdW50cyBhcyB0aGUgc2VsZWN0aW9uIGNoYW5naW5nLiBUaGUgJ3NlbGVjdGlvbmNoYW5nZScgZXZlbnQgaXNcbi8vIGZpcmVkIGF0IHRoZSBkb2N1bWVudCBsZXZlbCBvbmx5IGFuZCBkb2Vzbid0IGRpcmVjdGx5IGluZGljYXRlIHdoaWNoIGVsZW1lbnQgY2hhbmdlZC4gV2Vcbi8vIHNldCB1cCBqdXN0IG9uZSBldmVudCBoYW5kbGVyIGZvciB0aGUgZG9jdW1lbnQgYW5kIHVzZSAnYWN0aXZlRWxlbWVudCcgdG8gZGV0ZXJtaW5lIHdoaWNoXG4vLyBlbGVtZW50IHdhcyBjaGFuZ2VkLlxuaWYgKGtvLnV0aWxzLmllVmVyc2lvbiA8IDEwKSB7XG4gICAgdmFyIHNlbGVjdGlvbkNoYW5nZVJlZ2lzdGVyZWROYW1lID0ga28udXRpbHMuZG9tRGF0YS5uZXh0S2V5KCksXG4gICAgICAgIHNlbGVjdGlvbkNoYW5nZUhhbmRsZXJOYW1lID0ga28udXRpbHMuZG9tRGF0YS5uZXh0S2V5KCk7XG4gICAgdmFyIHNlbGVjdGlvbkNoYW5nZUhhbmRsZXIgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICB2YXIgdGFyZ2V0ID0gdGhpcy5hY3RpdmVFbGVtZW50LFxuICAgICAgICAgICAgaGFuZGxlciA9IHRhcmdldCAmJiBrby51dGlscy5kb21EYXRhLmdldCh0YXJnZXQsIHNlbGVjdGlvbkNoYW5nZUhhbmRsZXJOYW1lKTtcbiAgICAgICAgaWYgKGhhbmRsZXIpIHtcbiAgICAgICAgICAgIGhhbmRsZXIoZXZlbnQpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICB2YXIgcmVnaXN0ZXJGb3JTZWxlY3Rpb25DaGFuZ2VFdmVudCA9IGZ1bmN0aW9uIChlbGVtZW50LCBoYW5kbGVyKSB7XG4gICAgICAgIHZhciBvd25lckRvYyA9IGVsZW1lbnQub3duZXJEb2N1bWVudDtcbiAgICAgICAgaWYgKCFrby51dGlscy5kb21EYXRhLmdldChvd25lckRvYywgc2VsZWN0aW9uQ2hhbmdlUmVnaXN0ZXJlZE5hbWUpKSB7XG4gICAgICAgICAgICBrby51dGlscy5kb21EYXRhLnNldChvd25lckRvYywgc2VsZWN0aW9uQ2hhbmdlUmVnaXN0ZXJlZE5hbWUsIHRydWUpO1xuICAgICAgICAgICAga28udXRpbHMucmVnaXN0ZXJFdmVudEhhbmRsZXIob3duZXJEb2MsICdzZWxlY3Rpb25jaGFuZ2UnLCBzZWxlY3Rpb25DaGFuZ2VIYW5kbGVyKTtcbiAgICAgICAgfVxuICAgICAgICBrby51dGlscy5kb21EYXRhLnNldChlbGVtZW50LCBzZWxlY3Rpb25DaGFuZ2VIYW5kbGVyTmFtZSwgaGFuZGxlcik7XG4gICAgfTtcbn1cblxua28uYmluZGluZ0hhbmRsZXJzWyd0ZXh0SW5wdXQnXSA9IHtcbiAgICAnaW5pdCc6IGZ1bmN0aW9uIChlbGVtZW50LCB2YWx1ZUFjY2Vzc29yLCBhbGxCaW5kaW5ncykge1xuXG4gICAgICAgIHZhciBwcmV2aW91c0VsZW1lbnRWYWx1ZSA9IGVsZW1lbnQudmFsdWUsXG4gICAgICAgICAgICB0aW1lb3V0SGFuZGxlLFxuICAgICAgICAgICAgZWxlbWVudFZhbHVlQmVmb3JlRXZlbnQ7XG5cbiAgICAgICAgdmFyIHVwZGF0ZU1vZGVsID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dEhhbmRsZSk7XG4gICAgICAgICAgICBlbGVtZW50VmFsdWVCZWZvcmVFdmVudCA9IHRpbWVvdXRIYW5kbGUgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgIHZhciBlbGVtZW50VmFsdWUgPSBlbGVtZW50LnZhbHVlO1xuICAgICAgICAgICAgaWYgKHByZXZpb3VzRWxlbWVudFZhbHVlICE9PSBlbGVtZW50VmFsdWUpIHtcbiAgICAgICAgICAgICAgICAvLyBQcm92aWRlIGEgd2F5IGZvciB0ZXN0cyB0byBrbm93IGV4YWN0bHkgd2hpY2ggZXZlbnQgd2FzIHByb2Nlc3NlZFxuICAgICAgICAgICAgICAgIGlmIChERUJVRyAmJiBldmVudCkgZWxlbWVudFsnX2tvX3RleHRJbnB1dFByb2Nlc3NlZEV2ZW50J10gPSBldmVudC50eXBlO1xuICAgICAgICAgICAgICAgIHByZXZpb3VzRWxlbWVudFZhbHVlID0gZWxlbWVudFZhbHVlO1xuICAgICAgICAgICAgICAgIGtvLmV4cHJlc3Npb25SZXdyaXRpbmcud3JpdGVWYWx1ZVRvUHJvcGVydHkodmFsdWVBY2Nlc3NvcigpLCBhbGxCaW5kaW5ncywgJ3RleHRJbnB1dCcsIGVsZW1lbnRWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgdmFyIGRlZmVyVXBkYXRlTW9kZWwgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgIGlmICghdGltZW91dEhhbmRsZSkge1xuICAgICAgICAgICAgICAgIC8vIFRoZSBlbGVtZW50VmFsdWVCZWZvcmVFdmVudCB2YXJpYWJsZSBpcyBzZXQgKm9ubHkqIGR1cmluZyB0aGUgYnJpZWYgZ2FwIGJldHdlZW4gYW5cbiAgICAgICAgICAgICAgICAvLyBldmVudCBmaXJpbmcgYW5kIHRoZSB1cGRhdGVNb2RlbCBmdW5jdGlvbiBydW5uaW5nLiBUaGlzIGFsbG93cyB1cyB0byBpZ25vcmUgbW9kZWxcbiAgICAgICAgICAgICAgICAvLyB1cGRhdGVzIHRoYXQgYXJlIGZyb20gdGhlIHByZXZpb3VzIHN0YXRlIG9mIHRoZSBlbGVtZW50LCB1c3VhbGx5IGR1ZSB0byB0ZWNobmlxdWVzXG4gICAgICAgICAgICAgICAgLy8gc3VjaCBhcyByYXRlTGltaXQuIFN1Y2ggdXBkYXRlcywgaWYgbm90IGlnbm9yZWQsIGNhbiBjYXVzZSBrZXlzdHJva2VzIHRvIGJlIGxvc3QuXG4gICAgICAgICAgICAgICAgZWxlbWVudFZhbHVlQmVmb3JlRXZlbnQgPSBlbGVtZW50LnZhbHVlO1xuICAgICAgICAgICAgICAgIHZhciBoYW5kbGVyID0gREVCVUcgPyB1cGRhdGVNb2RlbC5iaW5kKGVsZW1lbnQsIHt0eXBlOiBldmVudC50eXBlfSkgOiB1cGRhdGVNb2RlbDtcbiAgICAgICAgICAgICAgICB0aW1lb3V0SGFuZGxlID0ga28udXRpbHMuc2V0VGltZW91dChoYW5kbGVyLCA0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICAvLyBJRTkgd2lsbCBtZXNzIHVwIHRoZSBET00gaWYgeW91IGhhbmRsZSBldmVudHMgc3luY2hyb25vdXNseSB3aGljaCByZXN1bHRzIGluIERPTSBjaGFuZ2VzIChzdWNoIGFzIG90aGVyIGJpbmRpbmdzKTtcbiAgICAgICAgLy8gc28gd2UnbGwgbWFrZSBzdXJlIGFsbCB1cGRhdGVzIGFyZSBhc3luY2hyb25vdXNcbiAgICAgICAgdmFyIGllVXBkYXRlTW9kZWwgPSBrby51dGlscy5pZVZlcnNpb24gPT0gOSA/IGRlZmVyVXBkYXRlTW9kZWwgOiB1cGRhdGVNb2RlbDtcblxuICAgICAgICB2YXIgdXBkYXRlVmlldyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBtb2RlbFZhbHVlID0ga28udXRpbHMudW53cmFwT2JzZXJ2YWJsZSh2YWx1ZUFjY2Vzc29yKCkpO1xuXG4gICAgICAgICAgICBpZiAobW9kZWxWYWx1ZSA9PT0gbnVsbCB8fCBtb2RlbFZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBtb2RlbFZhbHVlID0gJyc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlbGVtZW50VmFsdWVCZWZvcmVFdmVudCAhPT0gdW5kZWZpbmVkICYmIG1vZGVsVmFsdWUgPT09IGVsZW1lbnRWYWx1ZUJlZm9yZUV2ZW50KSB7XG4gICAgICAgICAgICAgICAga28udXRpbHMuc2V0VGltZW91dCh1cGRhdGVWaWV3LCA0KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgZWxlbWVudCBvbmx5IGlmIHRoZSBlbGVtZW50IGFuZCBtb2RlbCBhcmUgZGlmZmVyZW50LiBPbiBzb21lIGJyb3dzZXJzLCB1cGRhdGluZyB0aGUgdmFsdWVcbiAgICAgICAgICAgIC8vIHdpbGwgbW92ZSB0aGUgY3Vyc29yIHRvIHRoZSBlbmQgb2YgdGhlIGlucHV0LCB3aGljaCB3b3VsZCBiZSBiYWQgd2hpbGUgdGhlIHVzZXIgaXMgdHlwaW5nLlxuICAgICAgICAgICAgaWYgKGVsZW1lbnQudmFsdWUgIT09IG1vZGVsVmFsdWUpIHtcbiAgICAgICAgICAgICAgICBwcmV2aW91c0VsZW1lbnRWYWx1ZSA9IG1vZGVsVmFsdWU7ICAvLyBNYWtlIHN1cmUgd2UgaWdub3JlIGV2ZW50cyAocHJvcGVydHljaGFuZ2UpIHRoYXQgcmVzdWx0IGZyb20gdXBkYXRpbmcgdGhlIHZhbHVlXG4gICAgICAgICAgICAgICAgZWxlbWVudC52YWx1ZSA9IG1vZGVsVmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgdmFyIG9uRXZlbnQgPSBmdW5jdGlvbiAoZXZlbnQsIGhhbmRsZXIpIHtcbiAgICAgICAgICAgIGtvLnV0aWxzLnJlZ2lzdGVyRXZlbnRIYW5kbGVyKGVsZW1lbnQsIGV2ZW50LCBoYW5kbGVyKTtcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoREVCVUcgJiYga28uYmluZGluZ0hhbmRsZXJzWyd0ZXh0SW5wdXQnXVsnX2ZvcmNlVXBkYXRlT24nXSkge1xuICAgICAgICAgICAgLy8gUHJvdmlkZSBhIHdheSBmb3IgdGVzdHMgdG8gc3BlY2lmeSBleGFjdGx5IHdoaWNoIGV2ZW50cyBhcmUgYm91bmRcbiAgICAgICAgICAgIGtvLnV0aWxzLmFycmF5Rm9yRWFjaChrby5iaW5kaW5nSGFuZGxlcnNbJ3RleHRJbnB1dCddWydfZm9yY2VVcGRhdGVPbiddLCBmdW5jdGlvbihldmVudE5hbWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnROYW1lLnNsaWNlKDAsNSkgPT0gJ2FmdGVyJykge1xuICAgICAgICAgICAgICAgICAgICBvbkV2ZW50KGV2ZW50TmFtZS5zbGljZSg1KSwgZGVmZXJVcGRhdGVNb2RlbCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgb25FdmVudChldmVudE5hbWUsIHVwZGF0ZU1vZGVsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChrby51dGlscy5pZVZlcnNpb24gPCAxMCkge1xuICAgICAgICAgICAgICAgIC8vIEludGVybmV0IEV4cGxvcmVyIDw9IDggZG9lc24ndCBzdXBwb3J0IHRoZSAnaW5wdXQnIGV2ZW50LCBidXQgZG9lcyBpbmNsdWRlICdwcm9wZXJ0eWNoYW5nZScgdGhhdCBmaXJlcyB3aGVuZXZlclxuICAgICAgICAgICAgICAgIC8vIGFueSBwcm9wZXJ0eSBvZiBhbiBlbGVtZW50IGNoYW5nZXMuIFVubGlrZSAnaW5wdXQnLCBpdCBhbHNvIGZpcmVzIGlmIGEgcHJvcGVydHkgaXMgY2hhbmdlZCBmcm9tIEphdmFTY3JpcHQgY29kZSxcbiAgICAgICAgICAgICAgICAvLyBidXQgdGhhdCdzIGFuIGFjY2VwdGFibGUgY29tcHJvbWlzZSBmb3IgdGhpcyBiaW5kaW5nLiBJRSA5IGRvZXMgc3VwcG9ydCAnaW5wdXQnLCBidXQgc2luY2UgaXQgZG9lc24ndCBmaXJlIGl0XG4gICAgICAgICAgICAgICAgLy8gd2hlbiB1c2luZyBhdXRvY29tcGxldGUsIHdlJ2xsIHVzZSAncHJvcGVydHljaGFuZ2UnIGZvciBpdCBhbHNvLlxuICAgICAgICAgICAgICAgIG9uRXZlbnQoJ3Byb3BlcnR5Y2hhbmdlJywgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50LnByb3BlcnR5TmFtZSA9PT0gJ3ZhbHVlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWVVcGRhdGVNb2RlbChldmVudCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGlmIChrby51dGlscy5pZVZlcnNpb24gPT0gOCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBJRSA4IGhhcyBhIGJ1ZyB3aGVyZSBpdCBmYWlscyB0byBmaXJlICdwcm9wZXJ0eWNoYW5nZScgb24gdGhlIGZpcnN0IHVwZGF0ZSBmb2xsb3dpbmcgYSB2YWx1ZSBjaGFuZ2UgZnJvbVxuICAgICAgICAgICAgICAgICAgICAvLyBKYXZhU2NyaXB0IGNvZGUuIEl0IGFsc28gZG9lc24ndCBmaXJlIGlmIHlvdSBjbGVhciB0aGUgZW50aXJlIHZhbHVlLiBUbyBmaXggdGhpcywgd2UgYmluZCB0byB0aGUgZm9sbG93aW5nXG4gICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50cyB0b28uXG4gICAgICAgICAgICAgICAgICAgIG9uRXZlbnQoJ2tleXVwJywgdXBkYXRlTW9kZWwpOyAgICAgIC8vIEEgc2luZ2xlIGtleXN0b2tlXG4gICAgICAgICAgICAgICAgICAgIG9uRXZlbnQoJ2tleWRvd24nLCB1cGRhdGVNb2RlbCk7ICAgIC8vIFRoZSBmaXJzdCBjaGFyYWN0ZXIgd2hlbiBhIGtleSBpcyBoZWxkIGRvd25cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGtvLnV0aWxzLmllVmVyc2lvbiA+PSA4KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmV0IEV4cGxvcmVyIDkgZG9lc24ndCBmaXJlIHRoZSAnaW5wdXQnIGV2ZW50IHdoZW4gZGVsZXRpbmcgdGV4dCwgaW5jbHVkaW5nIHVzaW5nXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBiYWNrc3BhY2UsIGRlbGV0ZSwgb3IgY3RybC14IGtleXMsIGNsaWNraW5nIHRoZSAneCcgdG8gY2xlYXIgdGhlIGlucHV0LCBkcmFnZ2luZyB0ZXh0XG4gICAgICAgICAgICAgICAgICAgIC8vIG91dCBvZiB0aGUgZmllbGQsIGFuZCBjdXR0aW5nIG9yIGRlbGV0aW5nIHRleHQgdXNpbmcgdGhlIGNvbnRleHQgbWVudS4gJ3NlbGVjdGlvbmNoYW5nZSdcbiAgICAgICAgICAgICAgICAgICAgLy8gY2FuIGRldGVjdCBhbGwgb2YgdGhvc2UgZXhjZXB0IGRyYWdnaW5nIHRleHQgb3V0IG9mIHRoZSBmaWVsZCwgZm9yIHdoaWNoIHdlIHVzZSAnZHJhZ2VuZCcuXG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZXNlIGFyZSBhbHNvIG5lZWRlZCBpbiBJRTggYmVjYXVzZSBvZiB0aGUgYnVnIGRlc2NyaWJlZCBhYm92ZS5cbiAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJGb3JTZWxlY3Rpb25DaGFuZ2VFdmVudChlbGVtZW50LCBpZVVwZGF0ZU1vZGVsKTsgIC8vICdzZWxlY3Rpb25jaGFuZ2UnIGNvdmVycyBjdXQsIHBhc3RlLCBkcm9wLCBkZWxldGUsIGV0Yy5cbiAgICAgICAgICAgICAgICAgICAgb25FdmVudCgnZHJhZ2VuZCcsIGRlZmVyVXBkYXRlTW9kZWwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gQWxsIG90aGVyIHN1cHBvcnRlZCBicm93c2VycyBzdXBwb3J0IHRoZSAnaW5wdXQnIGV2ZW50LCB3aGljaCBmaXJlcyB3aGVuZXZlciB0aGUgY29udGVudCBvZiB0aGUgZWxlbWVudCBpcyBjaGFuZ2VkXG4gICAgICAgICAgICAgICAgLy8gdGhyb3VnaCB0aGUgdXNlciBpbnRlcmZhY2UuXG4gICAgICAgICAgICAgICAgb25FdmVudCgnaW5wdXQnLCB1cGRhdGVNb2RlbCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoc2FmYXJpVmVyc2lvbiA8IDUgJiYga28udXRpbHMudGFnTmFtZUxvd2VyKGVsZW1lbnQpID09PSBcInRleHRhcmVhXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2FmYXJpIDw1IGRvZXNuJ3QgZmlyZSB0aGUgJ2lucHV0JyBldmVudCBmb3IgPHRleHRhcmVhPiBlbGVtZW50cyAoaXQgZG9lcyBmaXJlICd0ZXh0SW5wdXQnXG4gICAgICAgICAgICAgICAgICAgIC8vIGJ1dCBvbmx5IHdoZW4gdHlwaW5nKS4gU28gd2UnbGwganVzdCBjYXRjaCBhcyBtdWNoIGFzIHdlIGNhbiB3aXRoIGtleWRvd24sIGN1dCwgYW5kIHBhc3RlLlxuICAgICAgICAgICAgICAgICAgICBvbkV2ZW50KCdrZXlkb3duJywgZGVmZXJVcGRhdGVNb2RlbCk7XG4gICAgICAgICAgICAgICAgICAgIG9uRXZlbnQoJ3Bhc3RlJywgZGVmZXJVcGRhdGVNb2RlbCk7XG4gICAgICAgICAgICAgICAgICAgIG9uRXZlbnQoJ2N1dCcsIGRlZmVyVXBkYXRlTW9kZWwpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob3BlcmFWZXJzaW9uIDwgMTEpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gT3BlcmEgMTAgZG9lc24ndCBhbHdheXMgZmlyZSB0aGUgJ2lucHV0JyBldmVudCBmb3IgY3V0LCBwYXN0ZSwgdW5kbyAmIGRyb3Agb3BlcmF0aW9ucy5cbiAgICAgICAgICAgICAgICAgICAgLy8gV2UgY2FuIHRyeSB0byBjYXRjaCBzb21lIG9mIHRob3NlIHVzaW5nICdrZXlkb3duJy5cbiAgICAgICAgICAgICAgICAgICAgb25FdmVudCgna2V5ZG93bicsIGRlZmVyVXBkYXRlTW9kZWwpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmlyZWZveFZlcnNpb24gPCA0LjApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRmlyZWZveCA8PSAzLjYgZG9lc24ndCBmaXJlIHRoZSAnaW5wdXQnIGV2ZW50IHdoZW4gdGV4dCBpcyBmaWxsZWQgaW4gdGhyb3VnaCBhdXRvY29tcGxldGVcbiAgICAgICAgICAgICAgICAgICAgb25FdmVudCgnRE9NQXV0b0NvbXBsZXRlJywgdXBkYXRlTW9kZWwpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIEZpcmVmb3ggPD0zLjUgZG9lc24ndCBmaXJlIHRoZSAnaW5wdXQnIGV2ZW50IHdoZW4gdGV4dCBpcyBkcm9wcGVkIGludG8gdGhlIGlucHV0LlxuICAgICAgICAgICAgICAgICAgICBvbkV2ZW50KCdkcmFnZHJvcCcsIHVwZGF0ZU1vZGVsKTsgICAgICAgLy8gPDMuNVxuICAgICAgICAgICAgICAgICAgICBvbkV2ZW50KCdkcm9wJywgdXBkYXRlTW9kZWwpOyAgICAgICAgICAgLy8gMy41XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQmluZCB0byB0aGUgY2hhbmdlIGV2ZW50IHNvIHRoYXQgd2UgY2FuIGNhdGNoIHByb2dyYW1tYXRpYyB1cGRhdGVzIG9mIHRoZSB2YWx1ZSB0aGF0IGZpcmUgdGhpcyBldmVudC5cbiAgICAgICAgb25FdmVudCgnY2hhbmdlJywgdXBkYXRlTW9kZWwpO1xuXG4gICAgICAgIGtvLmNvbXB1dGVkKHVwZGF0ZVZpZXcsIG51bGwsIHsgZGlzcG9zZVdoZW5Ob2RlSXNSZW1vdmVkOiBlbGVtZW50IH0pO1xuICAgIH1cbn07XG5rby5leHByZXNzaW9uUmV3cml0aW5nLnR3b1dheUJpbmRpbmdzWyd0ZXh0SW5wdXQnXSA9IHRydWU7XG5cbi8vIHRleHRpbnB1dCBpcyBhbiBhbGlhcyBmb3IgdGV4dElucHV0XG5rby5iaW5kaW5nSGFuZGxlcnNbJ3RleHRpbnB1dCddID0ge1xuICAgIC8vIHByZXByb2Nlc3MgaXMgdGhlIG9ubHkgd2F5IHRvIHNldCB1cCBhIGZ1bGwgYWxpYXNcbiAgICAncHJlcHJvY2Vzcyc6IGZ1bmN0aW9uICh2YWx1ZSwgbmFtZSwgYWRkQmluZGluZykge1xuICAgICAgICBhZGRCaW5kaW5nKCd0ZXh0SW5wdXQnLCB2YWx1ZSk7XG4gICAgfVxufTtcblxufSkoKTtrby5iaW5kaW5nSGFuZGxlcnNbJ3VuaXF1ZU5hbWUnXSA9IHtcbiAgICAnaW5pdCc6IGZ1bmN0aW9uIChlbGVtZW50LCB2YWx1ZUFjY2Vzc29yKSB7XG4gICAgICAgIGlmICh2YWx1ZUFjY2Vzc29yKCkpIHtcbiAgICAgICAgICAgIHZhciBuYW1lID0gXCJrb191bmlxdWVfXCIgKyAoKytrby5iaW5kaW5nSGFuZGxlcnNbJ3VuaXF1ZU5hbWUnXS5jdXJyZW50SW5kZXgpO1xuICAgICAgICAgICAga28udXRpbHMuc2V0RWxlbWVudE5hbWUoZWxlbWVudCwgbmFtZSk7XG4gICAgICAgIH1cbiAgICB9XG59O1xua28uYmluZGluZ0hhbmRsZXJzWyd1bmlxdWVOYW1lJ10uY3VycmVudEluZGV4ID0gMDtcbmtvLmJpbmRpbmdIYW5kbGVyc1sndmFsdWUnXSA9IHtcbiAgICAnYWZ0ZXInOiBbJ29wdGlvbnMnLCAnZm9yZWFjaCddLFxuICAgICdpbml0JzogZnVuY3Rpb24gKGVsZW1lbnQsIHZhbHVlQWNjZXNzb3IsIGFsbEJpbmRpbmdzKSB7XG4gICAgICAgIC8vIElmIHRoZSB2YWx1ZSBiaW5kaW5nIGlzIHBsYWNlZCBvbiBhIHJhZGlvL2NoZWNrYm94LCB0aGVuIGp1c3QgcGFzcyB0aHJvdWdoIHRvIGNoZWNrZWRWYWx1ZSBhbmQgcXVpdFxuICAgICAgICBpZiAoZWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT0gXCJpbnB1dFwiICYmIChlbGVtZW50LnR5cGUgPT0gXCJjaGVja2JveFwiIHx8IGVsZW1lbnQudHlwZSA9PSBcInJhZGlvXCIpKSB7XG4gICAgICAgICAgICBrby5hcHBseUJpbmRpbmdBY2Nlc3NvcnNUb05vZGUoZWxlbWVudCwgeyAnY2hlY2tlZFZhbHVlJzogdmFsdWVBY2Nlc3NvciB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFsd2F5cyBjYXRjaCBcImNoYW5nZVwiIGV2ZW50OyBwb3NzaWJseSBvdGhlciBldmVudHMgdG9vIGlmIGFza2VkXG4gICAgICAgIHZhciBldmVudHNUb0NhdGNoID0gW1wiY2hhbmdlXCJdO1xuICAgICAgICB2YXIgcmVxdWVzdGVkRXZlbnRzVG9DYXRjaCA9IGFsbEJpbmRpbmdzLmdldChcInZhbHVlVXBkYXRlXCIpO1xuICAgICAgICB2YXIgcHJvcGVydHlDaGFuZ2VkRmlyZWQgPSBmYWxzZTtcbiAgICAgICAgdmFyIGVsZW1lbnRWYWx1ZUJlZm9yZUV2ZW50ID0gbnVsbDtcblxuICAgICAgICBpZiAocmVxdWVzdGVkRXZlbnRzVG9DYXRjaCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiByZXF1ZXN0ZWRFdmVudHNUb0NhdGNoID09IFwic3RyaW5nXCIpIC8vIEFsbG93IGJvdGggaW5kaXZpZHVhbCBldmVudCBuYW1lcywgYW5kIGFycmF5cyBvZiBldmVudCBuYW1lc1xuICAgICAgICAgICAgICAgIHJlcXVlc3RlZEV2ZW50c1RvQ2F0Y2ggPSBbcmVxdWVzdGVkRXZlbnRzVG9DYXRjaF07XG4gICAgICAgICAgICBrby51dGlscy5hcnJheVB1c2hBbGwoZXZlbnRzVG9DYXRjaCwgcmVxdWVzdGVkRXZlbnRzVG9DYXRjaCk7XG4gICAgICAgICAgICBldmVudHNUb0NhdGNoID0ga28udXRpbHMuYXJyYXlHZXREaXN0aW5jdFZhbHVlcyhldmVudHNUb0NhdGNoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB2YWx1ZVVwZGF0ZUhhbmRsZXIgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGVsZW1lbnRWYWx1ZUJlZm9yZUV2ZW50ID0gbnVsbDtcbiAgICAgICAgICAgIHByb3BlcnR5Q2hhbmdlZEZpcmVkID0gZmFsc2U7XG4gICAgICAgICAgICB2YXIgbW9kZWxWYWx1ZSA9IHZhbHVlQWNjZXNzb3IoKTtcbiAgICAgICAgICAgIHZhciBlbGVtZW50VmFsdWUgPSBrby5zZWxlY3RFeHRlbnNpb25zLnJlYWRWYWx1ZShlbGVtZW50KTtcbiAgICAgICAgICAgIGtvLmV4cHJlc3Npb25SZXdyaXRpbmcud3JpdGVWYWx1ZVRvUHJvcGVydHkobW9kZWxWYWx1ZSwgYWxsQmluZGluZ3MsICd2YWx1ZScsIGVsZW1lbnRWYWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBXb3JrYXJvdW5kIGZvciBodHRwczovL2dpdGh1Yi5jb20vU3RldmVTYW5kZXJzb24va25vY2tvdXQvaXNzdWVzLzEyMlxuICAgICAgICAvLyBJRSBkb2Vzbid0IGZpcmUgXCJjaGFuZ2VcIiBldmVudHMgb24gdGV4dGJveGVzIGlmIHRoZSB1c2VyIHNlbGVjdHMgYSB2YWx1ZSBmcm9tIGl0cyBhdXRvY29tcGxldGUgbGlzdFxuICAgICAgICB2YXIgaWVBdXRvQ29tcGxldGVIYWNrTmVlZGVkID0ga28udXRpbHMuaWVWZXJzaW9uICYmIGVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09IFwiaW5wdXRcIiAmJiBlbGVtZW50LnR5cGUgPT0gXCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGVsZW1lbnQuYXV0b2NvbXBsZXRlICE9IFwib2ZmXCIgJiYgKCFlbGVtZW50LmZvcm0gfHwgZWxlbWVudC5mb3JtLmF1dG9jb21wbGV0ZSAhPSBcIm9mZlwiKTtcbiAgICAgICAgaWYgKGllQXV0b0NvbXBsZXRlSGFja05lZWRlZCAmJiBrby51dGlscy5hcnJheUluZGV4T2YoZXZlbnRzVG9DYXRjaCwgXCJwcm9wZXJ0eWNoYW5nZVwiKSA9PSAtMSkge1xuICAgICAgICAgICAga28udXRpbHMucmVnaXN0ZXJFdmVudEhhbmRsZXIoZWxlbWVudCwgXCJwcm9wZXJ0eWNoYW5nZVwiLCBmdW5jdGlvbiAoKSB7IHByb3BlcnR5Q2hhbmdlZEZpcmVkID0gdHJ1ZSB9KTtcbiAgICAgICAgICAgIGtvLnV0aWxzLnJlZ2lzdGVyRXZlbnRIYW5kbGVyKGVsZW1lbnQsIFwiZm9jdXNcIiwgZnVuY3Rpb24gKCkgeyBwcm9wZXJ0eUNoYW5nZWRGaXJlZCA9IGZhbHNlIH0pO1xuICAgICAgICAgICAga28udXRpbHMucmVnaXN0ZXJFdmVudEhhbmRsZXIoZWxlbWVudCwgXCJibHVyXCIsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eUNoYW5nZWRGaXJlZCkge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZVVwZGF0ZUhhbmRsZXIoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGtvLnV0aWxzLmFycmF5Rm9yRWFjaChldmVudHNUb0NhdGNoLCBmdW5jdGlvbihldmVudE5hbWUpIHtcbiAgICAgICAgICAgIC8vIFRoZSBzeW50YXggXCJhZnRlcjxldmVudG5hbWU+XCIgbWVhbnMgXCJydW4gdGhlIGhhbmRsZXIgYXN5bmNocm9ub3VzbHkgYWZ0ZXIgdGhlIGV2ZW50XCJcbiAgICAgICAgICAgIC8vIFRoaXMgaXMgdXNlZnVsLCBmb3IgZXhhbXBsZSwgdG8gY2F0Y2ggXCJrZXlkb3duXCIgZXZlbnRzIGFmdGVyIHRoZSBicm93c2VyIGhhcyB1cGRhdGVkIHRoZSBjb250cm9sXG4gICAgICAgICAgICAvLyAob3RoZXJ3aXNlLCBrby5zZWxlY3RFeHRlbnNpb25zLnJlYWRWYWx1ZSh0aGlzKSB3aWxsIHJlY2VpdmUgdGhlIGNvbnRyb2wncyB2YWx1ZSAqYmVmb3JlKiB0aGUga2V5IGV2ZW50KVxuICAgICAgICAgICAgdmFyIGhhbmRsZXIgPSB2YWx1ZVVwZGF0ZUhhbmRsZXI7XG4gICAgICAgICAgICBpZiAoa28udXRpbHMuc3RyaW5nU3RhcnRzV2l0aChldmVudE5hbWUsIFwiYWZ0ZXJcIikpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVyID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBlbGVtZW50VmFsdWVCZWZvcmVFdmVudCB2YXJpYWJsZSBpcyBub24tbnVsbCAqb25seSogZHVyaW5nIHRoZSBicmllZiBnYXAgYmV0d2VlblxuICAgICAgICAgICAgICAgICAgICAvLyBhIGtleVggZXZlbnQgZmlyaW5nIGFuZCB0aGUgdmFsdWVVcGRhdGVIYW5kbGVyIHJ1bm5pbmcsIHdoaWNoIGlzIHNjaGVkdWxlZCB0byBoYXBwZW5cbiAgICAgICAgICAgICAgICAgICAgLy8gYXQgdGhlIGVhcmxpZXN0IGFzeW5jaHJvbm91cyBvcHBvcnR1bml0eS4gV2Ugc3RvcmUgdGhpcyB0ZW1wb3JhcnkgaW5mb3JtYXRpb24gc28gdGhhdFxuICAgICAgICAgICAgICAgICAgICAvLyBpZiwgYmV0d2VlbiBrZXlYIGFuZCB2YWx1ZVVwZGF0ZUhhbmRsZXIsIHRoZSB1bmRlcmx5aW5nIG1vZGVsIHZhbHVlIGNoYW5nZXMgc2VwYXJhdGVseSxcbiAgICAgICAgICAgICAgICAgICAgLy8gd2UgY2FuIG92ZXJ3cml0ZSB0aGF0IG1vZGVsIHZhbHVlIGNoYW5nZSB3aXRoIHRoZSB2YWx1ZSB0aGUgdXNlciBqdXN0IHR5cGVkLiBPdGhlcndpc2UsXG4gICAgICAgICAgICAgICAgICAgIC8vIHRlY2huaXF1ZXMgbGlrZSByYXRlTGltaXQgY2FuIHRyaWdnZXIgbW9kZWwgY2hhbmdlcyBhdCBjcml0aWNhbCBtb21lbnRzIHRoYXQgd2lsbFxuICAgICAgICAgICAgICAgICAgICAvLyBvdmVycmlkZSB0aGUgdXNlcidzIGlucHV0cywgY2F1c2luZyBrZXlzdHJva2VzIHRvIGJlIGxvc3QuXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRWYWx1ZUJlZm9yZUV2ZW50ID0ga28uc2VsZWN0RXh0ZW5zaW9ucy5yZWFkVmFsdWUoZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIGtvLnV0aWxzLnNldFRpbWVvdXQodmFsdWVVcGRhdGVIYW5kbGVyLCAwKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGV2ZW50TmFtZSA9IGV2ZW50TmFtZS5zdWJzdHJpbmcoXCJhZnRlclwiLmxlbmd0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBrby51dGlscy5yZWdpc3RlckV2ZW50SGFuZGxlcihlbGVtZW50LCBldmVudE5hbWUsIGhhbmRsZXIpO1xuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgdXBkYXRlRnJvbU1vZGVsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIG5ld1ZhbHVlID0ga28udXRpbHMudW53cmFwT2JzZXJ2YWJsZSh2YWx1ZUFjY2Vzc29yKCkpO1xuICAgICAgICAgICAgdmFyIGVsZW1lbnRWYWx1ZSA9IGtvLnNlbGVjdEV4dGVuc2lvbnMucmVhZFZhbHVlKGVsZW1lbnQpO1xuXG4gICAgICAgICAgICBpZiAoZWxlbWVudFZhbHVlQmVmb3JlRXZlbnQgIT09IG51bGwgJiYgbmV3VmFsdWUgPT09IGVsZW1lbnRWYWx1ZUJlZm9yZUV2ZW50KSB7XG4gICAgICAgICAgICAgICAga28udXRpbHMuc2V0VGltZW91dCh1cGRhdGVGcm9tTW9kZWwsIDApO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHZhbHVlSGFzQ2hhbmdlZCA9IChuZXdWYWx1ZSAhPT0gZWxlbWVudFZhbHVlKTtcblxuICAgICAgICAgICAgaWYgKHZhbHVlSGFzQ2hhbmdlZCkge1xuICAgICAgICAgICAgICAgIGlmIChrby51dGlscy50YWdOYW1lTG93ZXIoZWxlbWVudCkgPT09IFwic2VsZWN0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFsbG93VW5zZXQgPSBhbGxCaW5kaW5ncy5nZXQoJ3ZhbHVlQWxsb3dVbnNldCcpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgYXBwbHlWYWx1ZUFjdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtvLnNlbGVjdEV4dGVuc2lvbnMud3JpdGVWYWx1ZShlbGVtZW50LCBuZXdWYWx1ZSwgYWxsb3dVbnNldCk7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGFwcGx5VmFsdWVBY3Rpb24oKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIWFsbG93VW5zZXQgJiYgbmV3VmFsdWUgIT09IGtvLnNlbGVjdEV4dGVuc2lvbnMucmVhZFZhbHVlKGVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB5b3UgdHJ5IHRvIHNldCBhIG1vZGVsIHZhbHVlIHRoYXQgY2FuJ3QgYmUgcmVwcmVzZW50ZWQgaW4gYW4gYWxyZWFkeS1wb3B1bGF0ZWQgZHJvcGRvd24sIHJlamVjdCB0aGF0IGNoYW5nZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgeW91J3JlIG5vdCBhbGxvd2VkIHRvIGhhdmUgYSBtb2RlbCB2YWx1ZSB0aGF0IGRpc2FncmVlcyB3aXRoIGEgdmlzaWJsZSBVSSBzZWxlY3Rpb24uXG4gICAgICAgICAgICAgICAgICAgICAgICBrby5kZXBlbmRlbmN5RGV0ZWN0aW9uLmlnbm9yZShrby51dGlscy50cmlnZ2VyRXZlbnQsIG51bGwsIFtlbGVtZW50LCBcImNoYW5nZVwiXSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBXb3JrYXJvdW5kIGZvciBJRTYgYnVnOiBJdCB3b24ndCByZWxpYWJseSBhcHBseSB2YWx1ZXMgdG8gU0VMRUNUIG5vZGVzIGR1cmluZyB0aGUgc2FtZSBleGVjdXRpb24gdGhyZWFkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByaWdodCBhZnRlciB5b3UndmUgY2hhbmdlZCB0aGUgc2V0IG9mIE9QVElPTiBub2RlcyBvbiBpdC4gU28gZm9yIHRoYXQgbm9kZSB0eXBlLCB3ZSdsbCBzY2hlZHVsZSBhIHNlY29uZCB0aHJlYWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGFwcGx5IHRoZSB2YWx1ZSBhcyB3ZWxsLlxuICAgICAgICAgICAgICAgICAgICAgICAga28udXRpbHMuc2V0VGltZW91dChhcHBseVZhbHVlQWN0aW9uLCAwKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGtvLnNlbGVjdEV4dGVuc2lvbnMud3JpdGVWYWx1ZShlbGVtZW50LCBuZXdWYWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGtvLmNvbXB1dGVkKHVwZGF0ZUZyb21Nb2RlbCwgbnVsbCwgeyBkaXNwb3NlV2hlbk5vZGVJc1JlbW92ZWQ6IGVsZW1lbnQgfSk7XG4gICAgfSxcbiAgICAndXBkYXRlJzogZnVuY3Rpb24oKSB7fSAvLyBLZWVwIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIGNvZGUgdGhhdCBtYXkgaGF2ZSB3cmFwcGVkIHZhbHVlIGJpbmRpbmdcbn07XG5rby5leHByZXNzaW9uUmV3cml0aW5nLnR3b1dheUJpbmRpbmdzWyd2YWx1ZSddID0gdHJ1ZTtcbmtvLmJpbmRpbmdIYW5kbGVyc1sndmlzaWJsZSddID0ge1xuICAgICd1cGRhdGUnOiBmdW5jdGlvbiAoZWxlbWVudCwgdmFsdWVBY2Nlc3Nvcikge1xuICAgICAgICB2YXIgdmFsdWUgPSBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKHZhbHVlQWNjZXNzb3IoKSk7XG4gICAgICAgIHZhciBpc0N1cnJlbnRseVZpc2libGUgPSAhKGVsZW1lbnQuc3R5bGUuZGlzcGxheSA9PSBcIm5vbmVcIik7XG4gICAgICAgIGlmICh2YWx1ZSAmJiAhaXNDdXJyZW50bHlWaXNpYmxlKVxuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gXCJcIjtcbiAgICAgICAgZWxzZSBpZiAoKCF2YWx1ZSkgJiYgaXNDdXJyZW50bHlWaXNpYmxlKVxuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgfVxufTtcbi8vICdjbGljaycgaXMganVzdCBhIHNob3J0aGFuZCBmb3IgdGhlIHVzdWFsIGZ1bGwtbGVuZ3RoIGV2ZW50OntjbGljazpoYW5kbGVyfVxubWFrZUV2ZW50SGFuZGxlclNob3J0Y3V0KCdjbGljaycpO1xuLy8gSWYgeW91IHdhbnQgdG8gbWFrZSBhIGN1c3RvbSB0ZW1wbGF0ZSBlbmdpbmUsXG4vL1xuLy8gWzFdIEluaGVyaXQgZnJvbSB0aGlzIGNsYXNzIChsaWtlIGtvLm5hdGl2ZVRlbXBsYXRlRW5naW5lIGRvZXMpXG4vLyBbMl0gT3ZlcnJpZGUgJ3JlbmRlclRlbXBsYXRlU291cmNlJywgc3VwcGx5aW5nIGEgZnVuY3Rpb24gd2l0aCB0aGlzIHNpZ25hdHVyZTpcbi8vXG4vLyAgICAgICAgZnVuY3Rpb24gKHRlbXBsYXRlU291cmNlLCBiaW5kaW5nQ29udGV4dCwgb3B0aW9ucykge1xuLy8gICAgICAgICAgICAvLyAtIHRlbXBsYXRlU291cmNlLnRleHQoKSBpcyB0aGUgdGV4dCBvZiB0aGUgdGVtcGxhdGUgeW91IHNob3VsZCByZW5kZXJcbi8vICAgICAgICAgICAgLy8gLSBiaW5kaW5nQ29udGV4dC4kZGF0YSBpcyB0aGUgZGF0YSB5b3Ugc2hvdWxkIHBhc3MgaW50byB0aGUgdGVtcGxhdGVcbi8vICAgICAgICAgICAgLy8gICAtIHlvdSBtaWdodCBhbHNvIHdhbnQgdG8gbWFrZSBiaW5kaW5nQ29udGV4dC4kcGFyZW50LCBiaW5kaW5nQ29udGV4dC4kcGFyZW50cyxcbi8vICAgICAgICAgICAgLy8gICAgIGFuZCBiaW5kaW5nQ29udGV4dC4kcm9vdCBhdmFpbGFibGUgaW4gdGhlIHRlbXBsYXRlIHRvb1xuLy8gICAgICAgICAgICAvLyAtIG9wdGlvbnMgZ2l2ZXMgeW91IGFjY2VzcyB0byBhbnkgb3RoZXIgcHJvcGVydGllcyBzZXQgb24gXCJkYXRhLWJpbmQ6IHsgdGVtcGxhdGU6IG9wdGlvbnMgfVwiXG4vLyAgICAgICAgICAgIC8vIC0gdGVtcGxhdGVEb2N1bWVudCBpcyB0aGUgZG9jdW1lbnQgb2JqZWN0IG9mIHRoZSB0ZW1wbGF0ZVxuLy8gICAgICAgICAgICAvL1xuLy8gICAgICAgICAgICAvLyBSZXR1cm4gdmFsdWU6IGFuIGFycmF5IG9mIERPTSBub2Rlc1xuLy8gICAgICAgIH1cbi8vXG4vLyBbM10gT3ZlcnJpZGUgJ2NyZWF0ZUphdmFTY3JpcHRFdmFsdWF0b3JCbG9jaycsIHN1cHBseWluZyBhIGZ1bmN0aW9uIHdpdGggdGhpcyBzaWduYXR1cmU6XG4vL1xuLy8gICAgICAgIGZ1bmN0aW9uIChzY3JpcHQpIHtcbi8vICAgICAgICAgICAgLy8gUmV0dXJuIHZhbHVlOiBXaGF0ZXZlciBzeW50YXggbWVhbnMgXCJFdmFsdWF0ZSB0aGUgSmF2YVNjcmlwdCBzdGF0ZW1lbnQgJ3NjcmlwdCcgYW5kIG91dHB1dCB0aGUgcmVzdWx0XCJcbi8vICAgICAgICAgICAgLy8gICAgICAgICAgICAgICBGb3IgZXhhbXBsZSwgdGhlIGpxdWVyeS50bXBsIHRlbXBsYXRlIGVuZ2luZSBjb252ZXJ0cyAnc29tZVNjcmlwdCcgdG8gJyR7IHNvbWVTY3JpcHQgfSdcbi8vICAgICAgICB9XG4vL1xuLy8gICAgIFRoaXMgaXMgb25seSBuZWNlc3NhcnkgaWYgeW91IHdhbnQgdG8gYWxsb3cgZGF0YS1iaW5kIGF0dHJpYnV0ZXMgdG8gcmVmZXJlbmNlIGFyYml0cmFyeSB0ZW1wbGF0ZSB2YXJpYWJsZXMuXG4vLyAgICAgSWYgeW91IGRvbid0IHdhbnQgdG8gYWxsb3cgdGhhdCwgeW91IGNhbiBzZXQgdGhlIHByb3BlcnR5ICdhbGxvd1RlbXBsYXRlUmV3cml0aW5nJyB0byBmYWxzZSAobGlrZSBrby5uYXRpdmVUZW1wbGF0ZUVuZ2luZSBkb2VzKVxuLy8gICAgIGFuZCB0aGVuIHlvdSBkb24ndCBuZWVkIHRvIG92ZXJyaWRlICdjcmVhdGVKYXZhU2NyaXB0RXZhbHVhdG9yQmxvY2snLlxuXG5rby50ZW1wbGF0ZUVuZ2luZSA9IGZ1bmN0aW9uICgpIHsgfTtcblxua28udGVtcGxhdGVFbmdpbmUucHJvdG90eXBlWydyZW5kZXJUZW1wbGF0ZVNvdXJjZSddID0gZnVuY3Rpb24gKHRlbXBsYXRlU291cmNlLCBiaW5kaW5nQ29udGV4dCwgb3B0aW9ucywgdGVtcGxhdGVEb2N1bWVudCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIk92ZXJyaWRlIHJlbmRlclRlbXBsYXRlU291cmNlXCIpO1xufTtcblxua28udGVtcGxhdGVFbmdpbmUucHJvdG90eXBlWydjcmVhdGVKYXZhU2NyaXB0RXZhbHVhdG9yQmxvY2snXSA9IGZ1bmN0aW9uIChzY3JpcHQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJPdmVycmlkZSBjcmVhdGVKYXZhU2NyaXB0RXZhbHVhdG9yQmxvY2tcIik7XG59O1xuXG5rby50ZW1wbGF0ZUVuZ2luZS5wcm90b3R5cGVbJ21ha2VUZW1wbGF0ZVNvdXJjZSddID0gZnVuY3Rpb24odGVtcGxhdGUsIHRlbXBsYXRlRG9jdW1lbnQpIHtcbiAgICAvLyBOYW1lZCB0ZW1wbGF0ZVxuICAgIGlmICh0eXBlb2YgdGVtcGxhdGUgPT0gXCJzdHJpbmdcIikge1xuICAgICAgICB0ZW1wbGF0ZURvY3VtZW50ID0gdGVtcGxhdGVEb2N1bWVudCB8fCBkb2N1bWVudDtcbiAgICAgICAgdmFyIGVsZW0gPSB0ZW1wbGF0ZURvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRlbXBsYXRlKTtcbiAgICAgICAgaWYgKCFlbGVtKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgdGVtcGxhdGUgd2l0aCBJRCBcIiArIHRlbXBsYXRlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBrby50ZW1wbGF0ZVNvdXJjZXMuZG9tRWxlbWVudChlbGVtKTtcbiAgICB9IGVsc2UgaWYgKCh0ZW1wbGF0ZS5ub2RlVHlwZSA9PSAxKSB8fCAodGVtcGxhdGUubm9kZVR5cGUgPT0gOCkpIHtcbiAgICAgICAgLy8gQW5vbnltb3VzIHRlbXBsYXRlXG4gICAgICAgIHJldHVybiBuZXcga28udGVtcGxhdGVTb3VyY2VzLmFub255bW91c1RlbXBsYXRlKHRlbXBsYXRlKTtcbiAgICB9IGVsc2VcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biB0ZW1wbGF0ZSB0eXBlOiBcIiArIHRlbXBsYXRlKTtcbn07XG5cbmtvLnRlbXBsYXRlRW5naW5lLnByb3RvdHlwZVsncmVuZGVyVGVtcGxhdGUnXSA9IGZ1bmN0aW9uICh0ZW1wbGF0ZSwgYmluZGluZ0NvbnRleHQsIG9wdGlvbnMsIHRlbXBsYXRlRG9jdW1lbnQpIHtcbiAgICB2YXIgdGVtcGxhdGVTb3VyY2UgPSB0aGlzWydtYWtlVGVtcGxhdGVTb3VyY2UnXSh0ZW1wbGF0ZSwgdGVtcGxhdGVEb2N1bWVudCk7XG4gICAgcmV0dXJuIHRoaXNbJ3JlbmRlclRlbXBsYXRlU291cmNlJ10odGVtcGxhdGVTb3VyY2UsIGJpbmRpbmdDb250ZXh0LCBvcHRpb25zLCB0ZW1wbGF0ZURvY3VtZW50KTtcbn07XG5cbmtvLnRlbXBsYXRlRW5naW5lLnByb3RvdHlwZVsnaXNUZW1wbGF0ZVJld3JpdHRlbiddID0gZnVuY3Rpb24gKHRlbXBsYXRlLCB0ZW1wbGF0ZURvY3VtZW50KSB7XG4gICAgLy8gU2tpcCByZXdyaXRpbmcgaWYgcmVxdWVzdGVkXG4gICAgaWYgKHRoaXNbJ2FsbG93VGVtcGxhdGVSZXdyaXRpbmcnXSA9PT0gZmFsc2UpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIHJldHVybiB0aGlzWydtYWtlVGVtcGxhdGVTb3VyY2UnXSh0ZW1wbGF0ZSwgdGVtcGxhdGVEb2N1bWVudClbJ2RhdGEnXShcImlzUmV3cml0dGVuXCIpO1xufTtcblxua28udGVtcGxhdGVFbmdpbmUucHJvdG90eXBlWydyZXdyaXRlVGVtcGxhdGUnXSA9IGZ1bmN0aW9uICh0ZW1wbGF0ZSwgcmV3cml0ZXJDYWxsYmFjaywgdGVtcGxhdGVEb2N1bWVudCkge1xuICAgIHZhciB0ZW1wbGF0ZVNvdXJjZSA9IHRoaXNbJ21ha2VUZW1wbGF0ZVNvdXJjZSddKHRlbXBsYXRlLCB0ZW1wbGF0ZURvY3VtZW50KTtcbiAgICB2YXIgcmV3cml0dGVuID0gcmV3cml0ZXJDYWxsYmFjayh0ZW1wbGF0ZVNvdXJjZVsndGV4dCddKCkpO1xuICAgIHRlbXBsYXRlU291cmNlWyd0ZXh0J10ocmV3cml0dGVuKTtcbiAgICB0ZW1wbGF0ZVNvdXJjZVsnZGF0YSddKFwiaXNSZXdyaXR0ZW5cIiwgdHJ1ZSk7XG59O1xuXG5rby5leHBvcnRTeW1ib2woJ3RlbXBsYXRlRW5naW5lJywga28udGVtcGxhdGVFbmdpbmUpO1xuXG5rby50ZW1wbGF0ZVJld3JpdGluZyA9IChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIG1lbW9pemVEYXRhQmluZGluZ0F0dHJpYnV0ZVN5bnRheFJlZ2V4ID0gLyg8KFthLXpdK1xcZCopKD86XFxzKyg/IWRhdGEtYmluZFxccyo9XFxzKilbYS16MC05XFwtXSsoPzo9KD86XFxcIlteXFxcIl0qXFxcInxcXCdbXlxcJ10qXFwnfFtePl0qKSk/KSpcXHMrKWRhdGEtYmluZFxccyo9XFxzKihbXCInXSkoW1xcc1xcU10qPylcXDMvZ2k7XG4gICAgdmFyIG1lbW9pemVWaXJ0dWFsQ29udGFpbmVyQmluZGluZ1N5bnRheFJlZ2V4ID0gLzwhLS1cXHMqa29cXGJcXHMqKFtcXHNcXFNdKj8pXFxzKi0tPi9nO1xuXG4gICAgZnVuY3Rpb24gdmFsaWRhdGVEYXRhQmluZFZhbHVlc0ZvclJld3JpdGluZyhrZXlWYWx1ZUFycmF5KSB7XG4gICAgICAgIHZhciBhbGxWYWxpZGF0b3JzID0ga28uZXhwcmVzc2lvblJld3JpdGluZy5iaW5kaW5nUmV3cml0ZVZhbGlkYXRvcnM7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5VmFsdWVBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGtleSA9IGtleVZhbHVlQXJyYXlbaV1bJ2tleSddO1xuICAgICAgICAgICAgaWYgKGFsbFZhbGlkYXRvcnMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgICAgIHZhciB2YWxpZGF0b3IgPSBhbGxWYWxpZGF0b3JzW2tleV07XG5cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbGlkYXRvciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBwb3NzaWJsZUVycm9yTWVzc2FnZSA9IHZhbGlkYXRvcihrZXlWYWx1ZUFycmF5W2ldWyd2YWx1ZSddKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBvc3NpYmxlRXJyb3JNZXNzYWdlKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHBvc3NpYmxlRXJyb3JNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCF2YWxpZGF0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhpcyB0ZW1wbGF0ZSBlbmdpbmUgZG9lcyBub3Qgc3VwcG9ydCB0aGUgJ1wiICsga2V5ICsgXCInIGJpbmRpbmcgd2l0aGluIGl0cyB0ZW1wbGF0ZXNcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY29uc3RydWN0TWVtb2l6ZWRUYWdSZXBsYWNlbWVudChkYXRhQmluZEF0dHJpYnV0ZVZhbHVlLCB0YWdUb1JldGFpbiwgbm9kZU5hbWUsIHRlbXBsYXRlRW5naW5lKSB7XG4gICAgICAgIHZhciBkYXRhQmluZEtleVZhbHVlQXJyYXkgPSBrby5leHByZXNzaW9uUmV3cml0aW5nLnBhcnNlT2JqZWN0TGl0ZXJhbChkYXRhQmluZEF0dHJpYnV0ZVZhbHVlKTtcbiAgICAgICAgdmFsaWRhdGVEYXRhQmluZFZhbHVlc0ZvclJld3JpdGluZyhkYXRhQmluZEtleVZhbHVlQXJyYXkpO1xuICAgICAgICB2YXIgcmV3cml0dGVuRGF0YUJpbmRBdHRyaWJ1dGVWYWx1ZSA9IGtvLmV4cHJlc3Npb25SZXdyaXRpbmcucHJlUHJvY2Vzc0JpbmRpbmdzKGRhdGFCaW5kS2V5VmFsdWVBcnJheSwgeyd2YWx1ZUFjY2Vzc29ycyc6dHJ1ZX0pO1xuXG4gICAgICAgIC8vIEZvciBubyBvYnZpb3VzIHJlYXNvbiwgT3BlcmEgZmFpbHMgdG8gZXZhbHVhdGUgcmV3cml0dGVuRGF0YUJpbmRBdHRyaWJ1dGVWYWx1ZSB1bmxlc3MgaXQncyB3cmFwcGVkIGluIGFuIGFkZGl0aW9uYWxcbiAgICAgICAgLy8gYW5vbnltb3VzIGZ1bmN0aW9uLCBldmVuIHRob3VnaCBPcGVyYSdzIGJ1aWx0LWluIGRlYnVnZ2VyIGNhbiBldmFsdWF0ZSBpdCBhbnl3YXkuIE5vIG90aGVyIGJyb3dzZXIgcmVxdWlyZXMgdGhpc1xuICAgICAgICAvLyBleHRyYSBpbmRpcmVjdGlvbi5cbiAgICAgICAgdmFyIGFwcGx5QmluZGluZ3NUb05leHRTaWJsaW5nU2NyaXB0ID1cbiAgICAgICAgICAgIFwia28uX190cl9hbWJ0bnMoZnVuY3Rpb24oJGNvbnRleHQsJGVsZW1lbnQpe3JldHVybihmdW5jdGlvbigpe3JldHVybnsgXCIgKyByZXdyaXR0ZW5EYXRhQmluZEF0dHJpYnV0ZVZhbHVlICsgXCIgfSB9KSgpfSwnXCIgKyBub2RlTmFtZS50b0xvd2VyQ2FzZSgpICsgXCInKVwiO1xuICAgICAgICByZXR1cm4gdGVtcGxhdGVFbmdpbmVbJ2NyZWF0ZUphdmFTY3JpcHRFdmFsdWF0b3JCbG9jayddKGFwcGx5QmluZGluZ3NUb05leHRTaWJsaW5nU2NyaXB0KSArIHRhZ1RvUmV0YWluO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIGVuc3VyZVRlbXBsYXRlSXNSZXdyaXR0ZW46IGZ1bmN0aW9uICh0ZW1wbGF0ZSwgdGVtcGxhdGVFbmdpbmUsIHRlbXBsYXRlRG9jdW1lbnQpIHtcbiAgICAgICAgICAgIGlmICghdGVtcGxhdGVFbmdpbmVbJ2lzVGVtcGxhdGVSZXdyaXR0ZW4nXSh0ZW1wbGF0ZSwgdGVtcGxhdGVEb2N1bWVudCkpXG4gICAgICAgICAgICAgICAgdGVtcGxhdGVFbmdpbmVbJ3Jld3JpdGVUZW1wbGF0ZSddKHRlbXBsYXRlLCBmdW5jdGlvbiAoaHRtbFN0cmluZykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ga28udGVtcGxhdGVSZXdyaXRpbmcubWVtb2l6ZUJpbmRpbmdBdHRyaWJ1dGVTeW50YXgoaHRtbFN0cmluZywgdGVtcGxhdGVFbmdpbmUpO1xuICAgICAgICAgICAgICAgIH0sIHRlbXBsYXRlRG9jdW1lbnQpO1xuICAgICAgICB9LFxuXG4gICAgICAgIG1lbW9pemVCaW5kaW5nQXR0cmlidXRlU3ludGF4OiBmdW5jdGlvbiAoaHRtbFN0cmluZywgdGVtcGxhdGVFbmdpbmUpIHtcbiAgICAgICAgICAgIHJldHVybiBodG1sU3RyaW5nLnJlcGxhY2UobWVtb2l6ZURhdGFCaW5kaW5nQXR0cmlidXRlU3ludGF4UmVnZXgsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29uc3RydWN0TWVtb2l6ZWRUYWdSZXBsYWNlbWVudCgvKiBkYXRhQmluZEF0dHJpYnV0ZVZhbHVlOiAqLyBhcmd1bWVudHNbNF0sIC8qIHRhZ1RvUmV0YWluOiAqLyBhcmd1bWVudHNbMV0sIC8qIG5vZGVOYW1lOiAqLyBhcmd1bWVudHNbMl0sIHRlbXBsYXRlRW5naW5lKTtcbiAgICAgICAgICAgIH0pLnJlcGxhY2UobWVtb2l6ZVZpcnR1YWxDb250YWluZXJCaW5kaW5nU3ludGF4UmVnZXgsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb25zdHJ1Y3RNZW1vaXplZFRhZ1JlcGxhY2VtZW50KC8qIGRhdGFCaW5kQXR0cmlidXRlVmFsdWU6ICovIGFyZ3VtZW50c1sxXSwgLyogdGFnVG9SZXRhaW46ICovIFwiPCEtLSBrbyAtLT5cIiwgLyogbm9kZU5hbWU6ICovIFwiI2NvbW1lbnRcIiwgdGVtcGxhdGVFbmdpbmUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgYXBwbHlNZW1vaXplZEJpbmRpbmdzVG9OZXh0U2libGluZzogZnVuY3Rpb24gKGJpbmRpbmdzLCBub2RlTmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIGtvLm1lbW9pemF0aW9uLm1lbW9pemUoZnVuY3Rpb24gKGRvbU5vZGUsIGJpbmRpbmdDb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgdmFyIG5vZGVUb0JpbmQgPSBkb21Ob2RlLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIGlmIChub2RlVG9CaW5kICYmIG5vZGVUb0JpbmQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbm9kZU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAga28uYXBwbHlCaW5kaW5nQWNjZXNzb3JzVG9Ob2RlKG5vZGVUb0JpbmQsIGJpbmRpbmdzLCBiaW5kaW5nQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG59KSgpO1xuXG5cbi8vIEV4cG9ydGVkIG9ubHkgYmVjYXVzZSBpdCBoYXMgdG8gYmUgcmVmZXJlbmNlZCBieSBzdHJpbmcgbG9va3VwIGZyb20gd2l0aGluIHJld3JpdHRlbiB0ZW1wbGF0ZVxua28uZXhwb3J0U3ltYm9sKCdfX3RyX2FtYnRucycsIGtvLnRlbXBsYXRlUmV3cml0aW5nLmFwcGx5TWVtb2l6ZWRCaW5kaW5nc1RvTmV4dFNpYmxpbmcpO1xuKGZ1bmN0aW9uKCkge1xuICAgIC8vIEEgdGVtcGxhdGUgc291cmNlIHJlcHJlc2VudHMgYSByZWFkL3dyaXRlIHdheSBvZiBhY2Nlc3NpbmcgYSB0ZW1wbGF0ZS4gVGhpcyBpcyB0byBlbGltaW5hdGUgdGhlIG5lZWQgZm9yIHRlbXBsYXRlIGxvYWRpbmcvc2F2aW5nXG4gICAgLy8gbG9naWMgdG8gYmUgZHVwbGljYXRlZCBpbiBldmVyeSB0ZW1wbGF0ZSBlbmdpbmUgKGFuZCBtZWFucyB0aGV5IGNhbiBhbGwgd29yayB3aXRoIGFub255bW91cyB0ZW1wbGF0ZXMsIGV0Yy4pXG4gICAgLy9cbiAgICAvLyBUd28gYXJlIHByb3ZpZGVkIGJ5IGRlZmF1bHQ6XG4gICAgLy8gIDEuIGtvLnRlbXBsYXRlU291cmNlcy5kb21FbGVtZW50ICAgICAgIC0gcmVhZHMvd3JpdGVzIHRoZSB0ZXh0IGNvbnRlbnQgb2YgYW4gYXJiaXRyYXJ5IERPTSBlbGVtZW50XG4gICAgLy8gIDIuIGtvLnRlbXBsYXRlU291cmNlcy5hbm9ueW1vdXNFbGVtZW50IC0gdXNlcyBrby51dGlscy5kb21EYXRhIHRvIHJlYWQvd3JpdGUgdGV4dCAqYXNzb2NpYXRlZCogd2l0aCB0aGUgRE9NIGVsZW1lbnQsIGJ1dFxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhvdXQgcmVhZGluZy93cml0aW5nIHRoZSBhY3R1YWwgZWxlbWVudCB0ZXh0IGNvbnRlbnQsIHNpbmNlIGl0IHdpbGwgYmUgb3ZlcndyaXR0ZW5cbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHRoZSByZW5kZXJlZCB0ZW1wbGF0ZSBvdXRwdXQuXG4gICAgLy8gWW91IGNhbiBpbXBsZW1lbnQgeW91ciBvd24gdGVtcGxhdGUgc291cmNlIGlmIHlvdSB3YW50IHRvIGZldGNoL3N0b3JlIHRlbXBsYXRlcyBzb21ld2hlcmUgb3RoZXIgdGhhbiBpbiBET00gZWxlbWVudHMuXG4gICAgLy8gVGVtcGxhdGUgc291cmNlcyBuZWVkIHRvIGhhdmUgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6XG4gICAgLy8gICB0ZXh0KCkgXHRcdFx0LSByZXR1cm5zIHRoZSB0ZW1wbGF0ZSB0ZXh0IGZyb20geW91ciBzdG9yYWdlIGxvY2F0aW9uXG4gICAgLy8gICB0ZXh0KHZhbHVlKVx0XHQtIHdyaXRlcyB0aGUgc3VwcGxpZWQgdGVtcGxhdGUgdGV4dCB0byB5b3VyIHN0b3JhZ2UgbG9jYXRpb25cbiAgICAvLyAgIGRhdGEoa2V5KVx0XHRcdC0gcmVhZHMgdmFsdWVzIHN0b3JlZCB1c2luZyBkYXRhKGtleSwgdmFsdWUpIC0gc2VlIGJlbG93XG4gICAgLy8gICBkYXRhKGtleSwgdmFsdWUpXHQtIGFzc29jaWF0ZXMgXCJ2YWx1ZVwiIHdpdGggdGhpcyB0ZW1wbGF0ZSBhbmQgdGhlIGtleSBcImtleVwiLiBJcyB1c2VkIHRvIHN0b3JlIGluZm9ybWF0aW9uIGxpa2UgXCJpc1Jld3JpdHRlblwiLlxuICAgIC8vXG4gICAgLy8gT3B0aW9uYWxseSwgdGVtcGxhdGUgc291cmNlcyBjYW4gYWxzbyBoYXZlIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zOlxuICAgIC8vICAgbm9kZXMoKSAgICAgICAgICAgIC0gcmV0dXJucyBhIERPTSBlbGVtZW50IGNvbnRhaW5pbmcgdGhlIG5vZGVzIG9mIHRoaXMgdGVtcGxhdGUsIHdoZXJlIGF2YWlsYWJsZVxuICAgIC8vICAgbm9kZXModmFsdWUpICAgICAgIC0gd3JpdGVzIHRoZSBnaXZlbiBET00gZWxlbWVudCB0byB5b3VyIHN0b3JhZ2UgbG9jYXRpb25cbiAgICAvLyBJZiBhIERPTSBlbGVtZW50IGlzIGF2YWlsYWJsZSBmb3IgYSBnaXZlbiB0ZW1wbGF0ZSBzb3VyY2UsIHRlbXBsYXRlIGVuZ2luZXMgYXJlIGVuY291cmFnZWQgdG8gdXNlIGl0IGluIHByZWZlcmVuY2Ugb3ZlciB0ZXh0KClcbiAgICAvLyBmb3IgaW1wcm92ZWQgc3BlZWQuIEhvd2V2ZXIsIGFsbCB0ZW1wbGF0ZVNvdXJjZXMgbXVzdCBzdXBwbHkgdGV4dCgpIGV2ZW4gaWYgdGhleSBkb24ndCBzdXBwbHkgbm9kZXMoKS5cbiAgICAvL1xuICAgIC8vIE9uY2UgeW91J3ZlIGltcGxlbWVudGVkIGEgdGVtcGxhdGVTb3VyY2UsIG1ha2UgeW91ciB0ZW1wbGF0ZSBlbmdpbmUgdXNlIGl0IGJ5IHN1YmNsYXNzaW5nIHdoYXRldmVyIHRlbXBsYXRlIGVuZ2luZSB5b3Ugd2VyZVxuICAgIC8vIHVzaW5nIGFuZCBvdmVycmlkaW5nIFwibWFrZVRlbXBsYXRlU291cmNlXCIgdG8gcmV0dXJuIGFuIGluc3RhbmNlIG9mIHlvdXIgY3VzdG9tIHRlbXBsYXRlIHNvdXJjZS5cblxuICAgIGtvLnRlbXBsYXRlU291cmNlcyA9IHt9O1xuXG4gICAgLy8gLS0tLSBrby50ZW1wbGF0ZVNvdXJjZXMuZG9tRWxlbWVudCAtLS0tLVxuXG4gICAgLy8gdGVtcGxhdGUgdHlwZXNcbiAgICB2YXIgdGVtcGxhdGVTY3JpcHQgPSAxLFxuICAgICAgICB0ZW1wbGF0ZVRleHRBcmVhID0gMixcbiAgICAgICAgdGVtcGxhdGVUZW1wbGF0ZSA9IDMsXG4gICAgICAgIHRlbXBsYXRlRWxlbWVudCA9IDQ7XG5cbiAgICBrby50ZW1wbGF0ZVNvdXJjZXMuZG9tRWxlbWVudCA9IGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5kb21FbGVtZW50ID0gZWxlbWVudDtcblxuICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgdmFyIHRhZ05hbWVMb3dlciA9IGtvLnV0aWxzLnRhZ05hbWVMb3dlcihlbGVtZW50KTtcbiAgICAgICAgICAgIHRoaXMudGVtcGxhdGVUeXBlID1cbiAgICAgICAgICAgICAgICB0YWdOYW1lTG93ZXIgPT09IFwic2NyaXB0XCIgPyB0ZW1wbGF0ZVNjcmlwdCA6XG4gICAgICAgICAgICAgICAgdGFnTmFtZUxvd2VyID09PSBcInRleHRhcmVhXCIgPyB0ZW1wbGF0ZVRleHRBcmVhIDpcbiAgICAgICAgICAgICAgICAgICAgLy8gRm9yIGJyb3dzZXJzIHdpdGggcHJvcGVyIDx0ZW1wbGF0ZT4gZWxlbWVudCBzdXBwb3J0LCB3aGVyZSB0aGUgLmNvbnRlbnQgcHJvcGVydHkgZ2l2ZXMgYSBkb2N1bWVudCBmcmFnbWVudFxuICAgICAgICAgICAgICAgIHRhZ05hbWVMb3dlciA9PSBcInRlbXBsYXRlXCIgJiYgZWxlbWVudC5jb250ZW50ICYmIGVsZW1lbnQuY29udGVudC5ub2RlVHlwZSA9PT0gMTEgPyB0ZW1wbGF0ZVRlbXBsYXRlIDpcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZUVsZW1lbnQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBrby50ZW1wbGF0ZVNvdXJjZXMuZG9tRWxlbWVudC5wcm90b3R5cGVbJ3RleHQnXSA9IGZ1bmN0aW9uKC8qIHZhbHVlVG9Xcml0ZSAqLykge1xuICAgICAgICB2YXIgZWxlbUNvbnRlbnRzUHJvcGVydHkgPSB0aGlzLnRlbXBsYXRlVHlwZSA9PT0gdGVtcGxhdGVTY3JpcHQgPyBcInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLnRlbXBsYXRlVHlwZSA9PT0gdGVtcGxhdGVUZXh0QXJlYSA/IFwidmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBcImlubmVySFRNTFwiO1xuXG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRvbUVsZW1lbnRbZWxlbUNvbnRlbnRzUHJvcGVydHldO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIHZhbHVlVG9Xcml0ZSA9IGFyZ3VtZW50c1swXTtcbiAgICAgICAgICAgIGlmIChlbGVtQ29udGVudHNQcm9wZXJ0eSA9PT0gXCJpbm5lckhUTUxcIilcbiAgICAgICAgICAgICAgICBrby51dGlscy5zZXRIdG1sKHRoaXMuZG9tRWxlbWVudCwgdmFsdWVUb1dyaXRlKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB0aGlzLmRvbUVsZW1lbnRbZWxlbUNvbnRlbnRzUHJvcGVydHldID0gdmFsdWVUb1dyaXRlO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHZhciBkYXRhRG9tRGF0YVByZWZpeCA9IGtvLnV0aWxzLmRvbURhdGEubmV4dEtleSgpICsgXCJfXCI7XG4gICAga28udGVtcGxhdGVTb3VyY2VzLmRvbUVsZW1lbnQucHJvdG90eXBlWydkYXRhJ10gPSBmdW5jdGlvbihrZXkgLyosIHZhbHVlVG9Xcml0ZSAqLykge1xuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIGtvLnV0aWxzLmRvbURhdGEuZ2V0KHRoaXMuZG9tRWxlbWVudCwgZGF0YURvbURhdGFQcmVmaXggKyBrZXkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAga28udXRpbHMuZG9tRGF0YS5zZXQodGhpcy5kb21FbGVtZW50LCBkYXRhRG9tRGF0YVByZWZpeCArIGtleSwgYXJndW1lbnRzWzFdKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgdGVtcGxhdGVzRG9tRGF0YUtleSA9IGtvLnV0aWxzLmRvbURhdGEubmV4dEtleSgpO1xuICAgIGZ1bmN0aW9uIGdldFRlbXBsYXRlRG9tRGF0YShlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBrby51dGlscy5kb21EYXRhLmdldChlbGVtZW50LCB0ZW1wbGF0ZXNEb21EYXRhS2V5KSB8fCB7fTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc2V0VGVtcGxhdGVEb21EYXRhKGVsZW1lbnQsIGRhdGEpIHtcbiAgICAgICAga28udXRpbHMuZG9tRGF0YS5zZXQoZWxlbWVudCwgdGVtcGxhdGVzRG9tRGF0YUtleSwgZGF0YSk7XG4gICAgfVxuXG4gICAga28udGVtcGxhdGVTb3VyY2VzLmRvbUVsZW1lbnQucHJvdG90eXBlWydub2RlcyddID0gZnVuY3Rpb24oLyogdmFsdWVUb1dyaXRlICovKSB7XG4gICAgICAgIHZhciBlbGVtZW50ID0gdGhpcy5kb21FbGVtZW50O1xuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICB2YXIgdGVtcGxhdGVEYXRhID0gZ2V0VGVtcGxhdGVEb21EYXRhKGVsZW1lbnQpLFxuICAgICAgICAgICAgICAgIGNvbnRhaW5lckRhdGEgPSB0ZW1wbGF0ZURhdGEuY29udGFpbmVyRGF0YTtcbiAgICAgICAgICAgIHJldHVybiBjb250YWluZXJEYXRhIHx8IChcbiAgICAgICAgICAgICAgICB0aGlzLnRlbXBsYXRlVHlwZSA9PT0gdGVtcGxhdGVUZW1wbGF0ZSA/IGVsZW1lbnQuY29udGVudCA6XG4gICAgICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZVR5cGUgPT09IHRlbXBsYXRlRWxlbWVudCA/IGVsZW1lbnQgOlxuICAgICAgICAgICAgICAgIHVuZGVmaW5lZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgdmFsdWVUb1dyaXRlID0gYXJndW1lbnRzWzBdO1xuICAgICAgICAgICAgc2V0VGVtcGxhdGVEb21EYXRhKGVsZW1lbnQsIHtjb250YWluZXJEYXRhOiB2YWx1ZVRvV3JpdGV9KTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvLyAtLS0tIGtvLnRlbXBsYXRlU291cmNlcy5hbm9ueW1vdXNUZW1wbGF0ZSAtLS0tLVxuICAgIC8vIEFub255bW91cyB0ZW1wbGF0ZXMgYXJlIG5vcm1hbGx5IHNhdmVkL3JldHJpZXZlZCBhcyBET00gbm9kZXMgdGhyb3VnaCBcIm5vZGVzXCIuXG4gICAgLy8gRm9yIGNvbXBhdGliaWxpdHksIHlvdSBjYW4gYWxzbyByZWFkIFwidGV4dFwiOyBpdCB3aWxsIGJlIHNlcmlhbGl6ZWQgZnJvbSB0aGUgbm9kZXMgb24gZGVtYW5kLlxuICAgIC8vIFdyaXRpbmcgdG8gXCJ0ZXh0XCIgaXMgc3RpbGwgc3VwcG9ydGVkLCBidXQgdGhlbiB0aGUgdGVtcGxhdGUgZGF0YSB3aWxsIG5vdCBiZSBhdmFpbGFibGUgYXMgRE9NIG5vZGVzLlxuXG4gICAga28udGVtcGxhdGVTb3VyY2VzLmFub255bW91c1RlbXBsYXRlID0gZnVuY3Rpb24oZWxlbWVudCkge1xuICAgICAgICB0aGlzLmRvbUVsZW1lbnQgPSBlbGVtZW50O1xuICAgIH1cbiAgICBrby50ZW1wbGF0ZVNvdXJjZXMuYW5vbnltb3VzVGVtcGxhdGUucHJvdG90eXBlID0gbmV3IGtvLnRlbXBsYXRlU291cmNlcy5kb21FbGVtZW50KCk7XG4gICAga28udGVtcGxhdGVTb3VyY2VzLmFub255bW91c1RlbXBsYXRlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGtvLnRlbXBsYXRlU291cmNlcy5hbm9ueW1vdXNUZW1wbGF0ZTtcbiAgICBrby50ZW1wbGF0ZVNvdXJjZXMuYW5vbnltb3VzVGVtcGxhdGUucHJvdG90eXBlWyd0ZXh0J10gPSBmdW5jdGlvbigvKiB2YWx1ZVRvV3JpdGUgKi8pIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgdmFyIHRlbXBsYXRlRGF0YSA9IGdldFRlbXBsYXRlRG9tRGF0YSh0aGlzLmRvbUVsZW1lbnQpO1xuICAgICAgICAgICAgaWYgKHRlbXBsYXRlRGF0YS50ZXh0RGF0YSA9PT0gdW5kZWZpbmVkICYmIHRlbXBsYXRlRGF0YS5jb250YWluZXJEYXRhKVxuICAgICAgICAgICAgICAgIHRlbXBsYXRlRGF0YS50ZXh0RGF0YSA9IHRlbXBsYXRlRGF0YS5jb250YWluZXJEYXRhLmlubmVySFRNTDtcbiAgICAgICAgICAgIHJldHVybiB0ZW1wbGF0ZURhdGEudGV4dERhdGE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgdmFsdWVUb1dyaXRlID0gYXJndW1lbnRzWzBdO1xuICAgICAgICAgICAgc2V0VGVtcGxhdGVEb21EYXRhKHRoaXMuZG9tRWxlbWVudCwge3RleHREYXRhOiB2YWx1ZVRvV3JpdGV9KTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBrby5leHBvcnRTeW1ib2woJ3RlbXBsYXRlU291cmNlcycsIGtvLnRlbXBsYXRlU291cmNlcyk7XG4gICAga28uZXhwb3J0U3ltYm9sKCd0ZW1wbGF0ZVNvdXJjZXMuZG9tRWxlbWVudCcsIGtvLnRlbXBsYXRlU291cmNlcy5kb21FbGVtZW50KTtcbiAgICBrby5leHBvcnRTeW1ib2woJ3RlbXBsYXRlU291cmNlcy5hbm9ueW1vdXNUZW1wbGF0ZScsIGtvLnRlbXBsYXRlU291cmNlcy5hbm9ueW1vdXNUZW1wbGF0ZSk7XG59KSgpO1xuKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgX3RlbXBsYXRlRW5naW5lO1xuICAgIGtvLnNldFRlbXBsYXRlRW5naW5lID0gZnVuY3Rpb24gKHRlbXBsYXRlRW5naW5lKSB7XG4gICAgICAgIGlmICgodGVtcGxhdGVFbmdpbmUgIT0gdW5kZWZpbmVkKSAmJiAhKHRlbXBsYXRlRW5naW5lIGluc3RhbmNlb2Yga28udGVtcGxhdGVFbmdpbmUpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidGVtcGxhdGVFbmdpbmUgbXVzdCBpbmhlcml0IGZyb20ga28udGVtcGxhdGVFbmdpbmVcIik7XG4gICAgICAgIF90ZW1wbGF0ZUVuZ2luZSA9IHRlbXBsYXRlRW5naW5lO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGludm9rZUZvckVhY2hOb2RlSW5Db250aW51b3VzUmFuZ2UoZmlyc3ROb2RlLCBsYXN0Tm9kZSwgYWN0aW9uKSB7XG4gICAgICAgIHZhciBub2RlLCBuZXh0SW5RdWV1ZSA9IGZpcnN0Tm9kZSwgZmlyc3RPdXRPZlJhbmdlTm9kZSA9IGtvLnZpcnR1YWxFbGVtZW50cy5uZXh0U2libGluZyhsYXN0Tm9kZSk7XG4gICAgICAgIHdoaWxlIChuZXh0SW5RdWV1ZSAmJiAoKG5vZGUgPSBuZXh0SW5RdWV1ZSkgIT09IGZpcnN0T3V0T2ZSYW5nZU5vZGUpKSB7XG4gICAgICAgICAgICBuZXh0SW5RdWV1ZSA9IGtvLnZpcnR1YWxFbGVtZW50cy5uZXh0U2libGluZyhub2RlKTtcbiAgICAgICAgICAgIGFjdGlvbihub2RlLCBuZXh0SW5RdWV1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhY3RpdmF0ZUJpbmRpbmdzT25Db250aW51b3VzTm9kZUFycmF5KGNvbnRpbnVvdXNOb2RlQXJyYXksIGJpbmRpbmdDb250ZXh0KSB7XG4gICAgICAgIC8vIFRvIGJlIHVzZWQgb24gYW55IG5vZGVzIHRoYXQgaGF2ZSBiZWVuIHJlbmRlcmVkIGJ5IGEgdGVtcGxhdGUgYW5kIGhhdmUgYmVlbiBpbnNlcnRlZCBpbnRvIHNvbWUgcGFyZW50IGVsZW1lbnRcbiAgICAgICAgLy8gV2Fsa3MgdGhyb3VnaCBjb250aW51b3VzTm9kZUFycmF5ICh3aGljaCAqbXVzdCogYmUgY29udGludW91cywgaS5lLiwgYW4gdW5pbnRlcnJ1cHRlZCBzZXF1ZW5jZSBvZiBzaWJsaW5nIG5vZGVzLCBiZWNhdXNlXG4gICAgICAgIC8vIHRoZSBhbGdvcml0aG0gZm9yIHdhbGtpbmcgdGhlbSByZWxpZXMgb24gdGhpcyksIGFuZCBmb3IgZWFjaCB0b3AtbGV2ZWwgaXRlbSBpbiB0aGUgdmlydHVhbC1lbGVtZW50IHNlbnNlLFxuICAgICAgICAvLyAoMSkgRG9lcyBhIHJlZ3VsYXIgXCJhcHBseUJpbmRpbmdzXCIgdG8gYXNzb2NpYXRlIGJpbmRpbmdDb250ZXh0IHdpdGggdGhpcyBub2RlIGFuZCB0byBhY3RpdmF0ZSBhbnkgbm9uLW1lbW9pemVkIGJpbmRpbmdzXG4gICAgICAgIC8vICgyKSBVbm1lbW9pemVzIGFueSBtZW1vcyBpbiB0aGUgRE9NIHN1YnRyZWUgKGUuZy4sIHRvIGFjdGl2YXRlIGJpbmRpbmdzIHRoYXQgaGFkIGJlZW4gbWVtb2l6ZWQgZHVyaW5nIHRlbXBsYXRlIHJld3JpdGluZylcblxuICAgICAgICBpZiAoY29udGludW91c05vZGVBcnJheS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHZhciBmaXJzdE5vZGUgPSBjb250aW51b3VzTm9kZUFycmF5WzBdLFxuICAgICAgICAgICAgICAgIGxhc3ROb2RlID0gY29udGludW91c05vZGVBcnJheVtjb250aW51b3VzTm9kZUFycmF5Lmxlbmd0aCAtIDFdLFxuICAgICAgICAgICAgICAgIHBhcmVudE5vZGUgPSBmaXJzdE5vZGUucGFyZW50Tm9kZSxcbiAgICAgICAgICAgICAgICBwcm92aWRlciA9IGtvLmJpbmRpbmdQcm92aWRlclsnaW5zdGFuY2UnXSxcbiAgICAgICAgICAgICAgICBwcmVwcm9jZXNzTm9kZSA9IHByb3ZpZGVyWydwcmVwcm9jZXNzTm9kZSddO1xuXG4gICAgICAgICAgICBpZiAocHJlcHJvY2Vzc05vZGUpIHtcbiAgICAgICAgICAgICAgICBpbnZva2VGb3JFYWNoTm9kZUluQ29udGludW91c1JhbmdlKGZpcnN0Tm9kZSwgbGFzdE5vZGUsIGZ1bmN0aW9uKG5vZGUsIG5leHROb2RlSW5SYW5nZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbm9kZVByZXZpb3VzU2libGluZyA9IG5vZGUucHJldmlvdXNTaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICB2YXIgbmV3Tm9kZXMgPSBwcmVwcm9jZXNzTm9kZS5jYWxsKHByb3ZpZGVyLCBub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5ld05vZGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZSA9PT0gZmlyc3ROb2RlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Tm9kZSA9IG5ld05vZGVzWzBdIHx8IG5leHROb2RlSW5SYW5nZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlID09PSBsYXN0Tm9kZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0Tm9kZSA9IG5ld05vZGVzW25ld05vZGVzLmxlbmd0aCAtIDFdIHx8IG5vZGVQcmV2aW91c1NpYmxpbmc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIC8vIEJlY2F1c2UgcHJlcHJvY2Vzc05vZGUgY2FuIGNoYW5nZSB0aGUgbm9kZXMsIGluY2x1ZGluZyB0aGUgZmlyc3QgYW5kIGxhc3Qgbm9kZXMsIHVwZGF0ZSBjb250aW51b3VzTm9kZUFycmF5IHRvIG1hdGNoLlxuICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdGhlIGZ1bGwgc2V0LCBpbmNsdWRpbmcgaW5uZXIgbm9kZXMsIGJlY2F1c2UgdGhlIHVubWVtb2l6ZSBzdGVwIG1pZ2h0IHJlbW92ZSB0aGUgZmlyc3Qgbm9kZSAoYW5kIHNvIHRoZSByZWFsXG4gICAgICAgICAgICAgICAgLy8gZmlyc3Qgbm9kZSBuZWVkcyB0byBiZSBpbiB0aGUgYXJyYXkpLlxuICAgICAgICAgICAgICAgIGNvbnRpbnVvdXNOb2RlQXJyYXkubGVuZ3RoID0gMDtcbiAgICAgICAgICAgICAgICBpZiAoIWZpcnN0Tm9kZSkgeyAvLyBwcmVwcm9jZXNzTm9kZSBtaWdodCBoYXZlIHJlbW92ZWQgYWxsIHRoZSBub2RlcywgaW4gd2hpY2ggY2FzZSB0aGVyZSdzIG5vdGhpbmcgbGVmdCB0byBkb1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChmaXJzdE5vZGUgPT09IGxhc3ROb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVvdXNOb2RlQXJyYXkucHVzaChmaXJzdE5vZGUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVvdXNOb2RlQXJyYXkucHVzaChmaXJzdE5vZGUsIGxhc3ROb2RlKTtcbiAgICAgICAgICAgICAgICAgICAga28udXRpbHMuZml4VXBDb250aW51b3VzTm9kZUFycmF5KGNvbnRpbnVvdXNOb2RlQXJyYXksIHBhcmVudE5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gTmVlZCB0byBhcHBseUJpbmRpbmdzICpiZWZvcmUqIHVubWVtb3ppYXRpb24sIGJlY2F1c2UgdW5tZW1vaXphdGlvbiBtaWdodCBpbnRyb2R1Y2UgZXh0cmEgbm9kZXMgKHRoYXQgd2UgZG9uJ3Qgd2FudCB0byByZS1iaW5kKVxuICAgICAgICAgICAgLy8gd2hlcmVhcyBhIHJlZ3VsYXIgYXBwbHlCaW5kaW5ncyB3b24ndCBpbnRyb2R1Y2UgbmV3IG1lbW9pemVkIG5vZGVzXG4gICAgICAgICAgICBpbnZva2VGb3JFYWNoTm9kZUluQ29udGludW91c1JhbmdlKGZpcnN0Tm9kZSwgbGFzdE5vZGUsIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMSB8fCBub2RlLm5vZGVUeXBlID09PSA4KVxuICAgICAgICAgICAgICAgICAgICBrby5hcHBseUJpbmRpbmdzKGJpbmRpbmdDb250ZXh0LCBub2RlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaW52b2tlRm9yRWFjaE5vZGVJbkNvbnRpbnVvdXNSYW5nZShmaXJzdE5vZGUsIGxhc3ROb2RlLCBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDEgfHwgbm9kZS5ub2RlVHlwZSA9PT0gOClcbiAgICAgICAgICAgICAgICAgICAga28ubWVtb2l6YXRpb24udW5tZW1vaXplRG9tTm9kZUFuZERlc2NlbmRhbnRzKG5vZGUsIFtiaW5kaW5nQ29udGV4dF0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBhbnkgY2hhbmdlcyBkb25lIGJ5IGFwcGx5QmluZGluZ3Mgb3IgdW5tZW1vaXplIGFyZSByZWZsZWN0ZWQgaW4gdGhlIGFycmF5XG4gICAgICAgICAgICBrby51dGlscy5maXhVcENvbnRpbnVvdXNOb2RlQXJyYXkoY29udGludW91c05vZGVBcnJheSwgcGFyZW50Tm9kZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRGaXJzdE5vZGVGcm9tUG9zc2libGVBcnJheShub2RlT3JOb2RlQXJyYXkpIHtcbiAgICAgICAgcmV0dXJuIG5vZGVPck5vZGVBcnJheS5ub2RlVHlwZSA/IG5vZGVPck5vZGVBcnJheVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbm9kZU9yTm9kZUFycmF5Lmxlbmd0aCA+IDAgPyBub2RlT3JOb2RlQXJyYXlbMF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG51bGw7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZXhlY3V0ZVRlbXBsYXRlKHRhcmdldE5vZGVPck5vZGVBcnJheSwgcmVuZGVyTW9kZSwgdGVtcGxhdGUsIGJpbmRpbmdDb250ZXh0LCBvcHRpb25zKSB7XG4gICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgICAgICB2YXIgZmlyc3RUYXJnZXROb2RlID0gdGFyZ2V0Tm9kZU9yTm9kZUFycmF5ICYmIGdldEZpcnN0Tm9kZUZyb21Qb3NzaWJsZUFycmF5KHRhcmdldE5vZGVPck5vZGVBcnJheSk7XG4gICAgICAgIHZhciB0ZW1wbGF0ZURvY3VtZW50ID0gKGZpcnN0VGFyZ2V0Tm9kZSB8fCB0ZW1wbGF0ZSB8fCB7fSkub3duZXJEb2N1bWVudDtcbiAgICAgICAgdmFyIHRlbXBsYXRlRW5naW5lVG9Vc2UgPSAob3B0aW9uc1sndGVtcGxhdGVFbmdpbmUnXSB8fCBfdGVtcGxhdGVFbmdpbmUpO1xuICAgICAgICBrby50ZW1wbGF0ZVJld3JpdGluZy5lbnN1cmVUZW1wbGF0ZUlzUmV3cml0dGVuKHRlbXBsYXRlLCB0ZW1wbGF0ZUVuZ2luZVRvVXNlLCB0ZW1wbGF0ZURvY3VtZW50KTtcbiAgICAgICAgdmFyIHJlbmRlcmVkTm9kZXNBcnJheSA9IHRlbXBsYXRlRW5naW5lVG9Vc2VbJ3JlbmRlclRlbXBsYXRlJ10odGVtcGxhdGUsIGJpbmRpbmdDb250ZXh0LCBvcHRpb25zLCB0ZW1wbGF0ZURvY3VtZW50KTtcblxuICAgICAgICAvLyBMb29zZWx5IGNoZWNrIHJlc3VsdCBpcyBhbiBhcnJheSBvZiBET00gbm9kZXNcbiAgICAgICAgaWYgKCh0eXBlb2YgcmVuZGVyZWROb2Rlc0FycmF5Lmxlbmd0aCAhPSBcIm51bWJlclwiKSB8fCAocmVuZGVyZWROb2Rlc0FycmF5Lmxlbmd0aCA+IDAgJiYgdHlwZW9mIHJlbmRlcmVkTm9kZXNBcnJheVswXS5ub2RlVHlwZSAhPSBcIm51bWJlclwiKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRlbXBsYXRlIGVuZ2luZSBtdXN0IHJldHVybiBhbiBhcnJheSBvZiBET00gbm9kZXNcIik7XG5cbiAgICAgICAgdmFyIGhhdmVBZGRlZE5vZGVzVG9QYXJlbnQgPSBmYWxzZTtcbiAgICAgICAgc3dpdGNoIChyZW5kZXJNb2RlKSB7XG4gICAgICAgICAgICBjYXNlIFwicmVwbGFjZUNoaWxkcmVuXCI6XG4gICAgICAgICAgICAgICAga28udmlydHVhbEVsZW1lbnRzLnNldERvbU5vZGVDaGlsZHJlbih0YXJnZXROb2RlT3JOb2RlQXJyYXksIHJlbmRlcmVkTm9kZXNBcnJheSk7XG4gICAgICAgICAgICAgICAgaGF2ZUFkZGVkTm9kZXNUb1BhcmVudCA9IHRydWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwicmVwbGFjZU5vZGVcIjpcbiAgICAgICAgICAgICAgICBrby51dGlscy5yZXBsYWNlRG9tTm9kZXModGFyZ2V0Tm9kZU9yTm9kZUFycmF5LCByZW5kZXJlZE5vZGVzQXJyYXkpO1xuICAgICAgICAgICAgICAgIGhhdmVBZGRlZE5vZGVzVG9QYXJlbnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcImlnbm9yZVRhcmdldE5vZGVcIjogYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gcmVuZGVyTW9kZTogXCIgKyByZW5kZXJNb2RlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChoYXZlQWRkZWROb2Rlc1RvUGFyZW50KSB7XG4gICAgICAgICAgICBhY3RpdmF0ZUJpbmRpbmdzT25Db250aW51b3VzTm9kZUFycmF5KHJlbmRlcmVkTm9kZXNBcnJheSwgYmluZGluZ0NvbnRleHQpO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnNbJ2FmdGVyUmVuZGVyJ10pXG4gICAgICAgICAgICAgICAga28uZGVwZW5kZW5jeURldGVjdGlvbi5pZ25vcmUob3B0aW9uc1snYWZ0ZXJSZW5kZXInXSwgbnVsbCwgW3JlbmRlcmVkTm9kZXNBcnJheSwgYmluZGluZ0NvbnRleHRbJyRkYXRhJ11dKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZW5kZXJlZE5vZGVzQXJyYXk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVzb2x2ZVRlbXBsYXRlTmFtZSh0ZW1wbGF0ZSwgZGF0YSwgY29udGV4dCkge1xuICAgICAgICAvLyBUaGUgdGVtcGxhdGUgY2FuIGJlIHNwZWNpZmllZCBhczpcbiAgICAgICAgaWYgKGtvLmlzT2JzZXJ2YWJsZSh0ZW1wbGF0ZSkpIHtcbiAgICAgICAgICAgIC8vIDEuIEFuIG9ic2VydmFibGUsIHdpdGggc3RyaW5nIHZhbHVlXG4gICAgICAgICAgICByZXR1cm4gdGVtcGxhdGUoKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGVtcGxhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIC8vIDIuIEEgZnVuY3Rpb24gb2YgKGRhdGEsIGNvbnRleHQpIHJldHVybmluZyBhIHN0cmluZ1xuICAgICAgICAgICAgcmV0dXJuIHRlbXBsYXRlKGRhdGEsIGNvbnRleHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gMy4gQSBzdHJpbmdcbiAgICAgICAgICAgIHJldHVybiB0ZW1wbGF0ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGtvLnJlbmRlclRlbXBsYXRlID0gZnVuY3Rpb24gKHRlbXBsYXRlLCBkYXRhT3JCaW5kaW5nQ29udGV4dCwgb3B0aW9ucywgdGFyZ2V0Tm9kZU9yTm9kZUFycmF5LCByZW5kZXJNb2RlKSB7XG4gICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgICAgICBpZiAoKG9wdGlvbnNbJ3RlbXBsYXRlRW5naW5lJ10gfHwgX3RlbXBsYXRlRW5naW5lKSA9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTZXQgYSB0ZW1wbGF0ZSBlbmdpbmUgYmVmb3JlIGNhbGxpbmcgcmVuZGVyVGVtcGxhdGVcIik7XG4gICAgICAgIHJlbmRlck1vZGUgPSByZW5kZXJNb2RlIHx8IFwicmVwbGFjZUNoaWxkcmVuXCI7XG5cbiAgICAgICAgaWYgKHRhcmdldE5vZGVPck5vZGVBcnJheSkge1xuICAgICAgICAgICAgdmFyIGZpcnN0VGFyZ2V0Tm9kZSA9IGdldEZpcnN0Tm9kZUZyb21Qb3NzaWJsZUFycmF5KHRhcmdldE5vZGVPck5vZGVBcnJheSk7XG5cbiAgICAgICAgICAgIHZhciB3aGVuVG9EaXNwb3NlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gKCFmaXJzdFRhcmdldE5vZGUpIHx8ICFrby51dGlscy5kb21Ob2RlSXNBdHRhY2hlZFRvRG9jdW1lbnQoZmlyc3RUYXJnZXROb2RlKTsgfTsgLy8gUGFzc2l2ZSBkaXNwb3NhbCAob24gbmV4dCBldmFsdWF0aW9uKVxuICAgICAgICAgICAgdmFyIGFjdGl2ZWx5RGlzcG9zZVdoZW5Ob2RlSXNSZW1vdmVkID0gKGZpcnN0VGFyZ2V0Tm9kZSAmJiByZW5kZXJNb2RlID09IFwicmVwbGFjZU5vZGVcIikgPyBmaXJzdFRhcmdldE5vZGUucGFyZW50Tm9kZSA6IGZpcnN0VGFyZ2V0Tm9kZTtcblxuICAgICAgICAgICAgcmV0dXJuIGtvLmRlcGVuZGVudE9ic2VydmFibGUoIC8vIFNvIHRoZSBET00gaXMgYXV0b21hdGljYWxseSB1cGRhdGVkIHdoZW4gYW55IGRlcGVuZGVuY3kgY2hhbmdlc1xuICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRW5zdXJlIHdlJ3ZlIGdvdCBhIHByb3BlciBiaW5kaW5nIGNvbnRleHQgdG8gd29yayB3aXRoXG4gICAgICAgICAgICAgICAgICAgIHZhciBiaW5kaW5nQ29udGV4dCA9IChkYXRhT3JCaW5kaW5nQ29udGV4dCAmJiAoZGF0YU9yQmluZGluZ0NvbnRleHQgaW5zdGFuY2VvZiBrby5iaW5kaW5nQ29udGV4dCkpXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGRhdGFPckJpbmRpbmdDb250ZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICA6IG5ldyBrby5iaW5kaW5nQ29udGV4dChkYXRhT3JCaW5kaW5nQ29udGV4dCwgbnVsbCwgbnVsbCwgbnVsbCwgeyBcImV4cG9ydERlcGVuZGVuY2llc1wiOiB0cnVlIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciB0ZW1wbGF0ZU5hbWUgPSByZXNvbHZlVGVtcGxhdGVOYW1lKHRlbXBsYXRlLCBiaW5kaW5nQ29udGV4dFsnJGRhdGEnXSwgYmluZGluZ0NvbnRleHQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyZWROb2Rlc0FycmF5ID0gZXhlY3V0ZVRlbXBsYXRlKHRhcmdldE5vZGVPck5vZGVBcnJheSwgcmVuZGVyTW9kZSwgdGVtcGxhdGVOYW1lLCBiaW5kaW5nQ29udGV4dCwgb3B0aW9ucyk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlbmRlck1vZGUgPT0gXCJyZXBsYWNlTm9kZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXROb2RlT3JOb2RlQXJyYXkgPSByZW5kZXJlZE5vZGVzQXJyYXk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFRhcmdldE5vZGUgPSBnZXRGaXJzdE5vZGVGcm9tUG9zc2libGVBcnJheSh0YXJnZXROb2RlT3JOb2RlQXJyYXkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgIHsgZGlzcG9zZVdoZW46IHdoZW5Ub0Rpc3Bvc2UsIGRpc3Bvc2VXaGVuTm9kZUlzUmVtb3ZlZDogYWN0aXZlbHlEaXNwb3NlV2hlbk5vZGVJc1JlbW92ZWQgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFdlIGRvbid0IHlldCBoYXZlIGEgRE9NIG5vZGUgdG8gZXZhbHVhdGUsIHNvIHVzZSBhIG1lbW8gYW5kIHJlbmRlciB0aGUgdGVtcGxhdGUgbGF0ZXIgd2hlbiB0aGVyZSBpcyBhIERPTSBub2RlXG4gICAgICAgICAgICByZXR1cm4ga28ubWVtb2l6YXRpb24ubWVtb2l6ZShmdW5jdGlvbiAoZG9tTm9kZSkge1xuICAgICAgICAgICAgICAgIGtvLnJlbmRlclRlbXBsYXRlKHRlbXBsYXRlLCBkYXRhT3JCaW5kaW5nQ29udGV4dCwgb3B0aW9ucywgZG9tTm9kZSwgXCJyZXBsYWNlTm9kZVwiKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGtvLnJlbmRlclRlbXBsYXRlRm9yRWFjaCA9IGZ1bmN0aW9uICh0ZW1wbGF0ZSwgYXJyYXlPck9ic2VydmFibGVBcnJheSwgb3B0aW9ucywgdGFyZ2V0Tm9kZSwgcGFyZW50QmluZGluZ0NvbnRleHQpIHtcbiAgICAgICAgLy8gU2luY2Ugc2V0RG9tTm9kZUNoaWxkcmVuRnJvbUFycmF5TWFwcGluZyBhbHdheXMgY2FsbHMgZXhlY3V0ZVRlbXBsYXRlRm9yQXJyYXlJdGVtIGFuZCB0aGVuXG4gICAgICAgIC8vIGFjdGl2YXRlQmluZGluZ3NDYWxsYmFjayBmb3IgYWRkZWQgaXRlbXMsIHdlIGNhbiBzdG9yZSB0aGUgYmluZGluZyBjb250ZXh0IGluIHRoZSBmb3JtZXIgdG8gdXNlIGluIHRoZSBsYXR0ZXIuXG4gICAgICAgIHZhciBhcnJheUl0ZW1Db250ZXh0O1xuXG4gICAgICAgIC8vIFRoaXMgd2lsbCBiZSBjYWxsZWQgYnkgc2V0RG9tTm9kZUNoaWxkcmVuRnJvbUFycmF5TWFwcGluZyB0byBnZXQgdGhlIG5vZGVzIHRvIGFkZCB0byB0YXJnZXROb2RlXG4gICAgICAgIHZhciBleGVjdXRlVGVtcGxhdGVGb3JBcnJheUl0ZW0gPSBmdW5jdGlvbiAoYXJyYXlWYWx1ZSwgaW5kZXgpIHtcbiAgICAgICAgICAgIC8vIFN1cHBvcnQgc2VsZWN0aW5nIHRlbXBsYXRlIGFzIGEgZnVuY3Rpb24gb2YgdGhlIGRhdGEgYmVpbmcgcmVuZGVyZWRcbiAgICAgICAgICAgIGFycmF5SXRlbUNvbnRleHQgPSBwYXJlbnRCaW5kaW5nQ29udGV4dFsnY3JlYXRlQ2hpbGRDb250ZXh0J10oYXJyYXlWYWx1ZSwgb3B0aW9uc1snYXMnXSwgZnVuY3Rpb24oY29udGV4dCkge1xuICAgICAgICAgICAgICAgIGNvbnRleHRbJyRpbmRleCddID0gaW5kZXg7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdmFyIHRlbXBsYXRlTmFtZSA9IHJlc29sdmVUZW1wbGF0ZU5hbWUodGVtcGxhdGUsIGFycmF5VmFsdWUsIGFycmF5SXRlbUNvbnRleHQpO1xuICAgICAgICAgICAgcmV0dXJuIGV4ZWN1dGVUZW1wbGF0ZShudWxsLCBcImlnbm9yZVRhcmdldE5vZGVcIiwgdGVtcGxhdGVOYW1lLCBhcnJheUl0ZW1Db250ZXh0LCBvcHRpb25zKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoaXMgd2lsbCBiZSBjYWxsZWQgd2hlbmV2ZXIgc2V0RG9tTm9kZUNoaWxkcmVuRnJvbUFycmF5TWFwcGluZyBoYXMgYWRkZWQgbm9kZXMgdG8gdGFyZ2V0Tm9kZVxuICAgICAgICB2YXIgYWN0aXZhdGVCaW5kaW5nc0NhbGxiYWNrID0gZnVuY3Rpb24oYXJyYXlWYWx1ZSwgYWRkZWROb2Rlc0FycmF5LCBpbmRleCkge1xuICAgICAgICAgICAgYWN0aXZhdGVCaW5kaW5nc09uQ29udGludW91c05vZGVBcnJheShhZGRlZE5vZGVzQXJyYXksIGFycmF5SXRlbUNvbnRleHQpO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnNbJ2FmdGVyUmVuZGVyJ10pXG4gICAgICAgICAgICAgICAgb3B0aW9uc1snYWZ0ZXJSZW5kZXInXShhZGRlZE5vZGVzQXJyYXksIGFycmF5VmFsdWUpO1xuXG4gICAgICAgICAgICAvLyByZWxlYXNlIHRoZSBcImNhY2hlXCIgdmFyaWFibGUsIHNvIHRoYXQgaXQgY2FuIGJlIGNvbGxlY3RlZCBieVxuICAgICAgICAgICAgLy8gdGhlIEdDIHdoZW4gaXRzIHZhbHVlIGlzbid0IHVzZWQgZnJvbSB3aXRoaW4gdGhlIGJpbmRpbmdzIGFueW1vcmUuXG4gICAgICAgICAgICBhcnJheUl0ZW1Db250ZXh0ID0gbnVsbDtcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4ga28uZGVwZW5kZW50T2JzZXJ2YWJsZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdW53cmFwcGVkQXJyYXkgPSBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKGFycmF5T3JPYnNlcnZhYmxlQXJyYXkpIHx8IFtdO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB1bndyYXBwZWRBcnJheS5sZW5ndGggPT0gXCJ1bmRlZmluZWRcIikgLy8gQ29lcmNlIHNpbmdsZSB2YWx1ZSBpbnRvIGFycmF5XG4gICAgICAgICAgICAgICAgdW53cmFwcGVkQXJyYXkgPSBbdW53cmFwcGVkQXJyYXldO1xuXG4gICAgICAgICAgICAvLyBGaWx0ZXIgb3V0IGFueSBlbnRyaWVzIG1hcmtlZCBhcyBkZXN0cm95ZWRcbiAgICAgICAgICAgIHZhciBmaWx0ZXJlZEFycmF5ID0ga28udXRpbHMuYXJyYXlGaWx0ZXIodW53cmFwcGVkQXJyYXksIGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gb3B0aW9uc1snaW5jbHVkZURlc3Ryb3llZCddIHx8IGl0ZW0gPT09IHVuZGVmaW5lZCB8fCBpdGVtID09PSBudWxsIHx8ICFrby51dGlscy51bndyYXBPYnNlcnZhYmxlKGl0ZW1bJ19kZXN0cm95J10pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIENhbGwgc2V0RG9tTm9kZUNoaWxkcmVuRnJvbUFycmF5TWFwcGluZywgaWdub3JpbmcgYW55IG9ic2VydmFibGVzIHVud3JhcHBlZCB3aXRoaW4gKG1vc3QgbGlrZWx5IGZyb20gYSBjYWxsYmFjayBmdW5jdGlvbikuXG4gICAgICAgICAgICAvLyBJZiB0aGUgYXJyYXkgaXRlbXMgYXJlIG9ic2VydmFibGVzLCB0aG91Z2gsIHRoZXkgd2lsbCBiZSB1bndyYXBwZWQgaW4gZXhlY3V0ZVRlbXBsYXRlRm9yQXJyYXlJdGVtIGFuZCBtYW5hZ2VkIHdpdGhpbiBzZXREb21Ob2RlQ2hpbGRyZW5Gcm9tQXJyYXlNYXBwaW5nLlxuICAgICAgICAgICAga28uZGVwZW5kZW5jeURldGVjdGlvbi5pZ25vcmUoa28udXRpbHMuc2V0RG9tTm9kZUNoaWxkcmVuRnJvbUFycmF5TWFwcGluZywgbnVsbCwgW3RhcmdldE5vZGUsIGZpbHRlcmVkQXJyYXksIGV4ZWN1dGVUZW1wbGF0ZUZvckFycmF5SXRlbSwgb3B0aW9ucywgYWN0aXZhdGVCaW5kaW5nc0NhbGxiYWNrXSk7XG5cbiAgICAgICAgfSwgbnVsbCwgeyBkaXNwb3NlV2hlbk5vZGVJc1JlbW92ZWQ6IHRhcmdldE5vZGUgfSk7XG4gICAgfTtcblxuICAgIHZhciB0ZW1wbGF0ZUNvbXB1dGVkRG9tRGF0YUtleSA9IGtvLnV0aWxzLmRvbURhdGEubmV4dEtleSgpO1xuICAgIGZ1bmN0aW9uIGRpc3Bvc2VPbGRDb21wdXRlZEFuZFN0b3JlTmV3T25lKGVsZW1lbnQsIG5ld0NvbXB1dGVkKSB7XG4gICAgICAgIHZhciBvbGRDb21wdXRlZCA9IGtvLnV0aWxzLmRvbURhdGEuZ2V0KGVsZW1lbnQsIHRlbXBsYXRlQ29tcHV0ZWREb21EYXRhS2V5KTtcbiAgICAgICAgaWYgKG9sZENvbXB1dGVkICYmICh0eXBlb2Yob2xkQ29tcHV0ZWQuZGlzcG9zZSkgPT0gJ2Z1bmN0aW9uJykpXG4gICAgICAgICAgICBvbGRDb21wdXRlZC5kaXNwb3NlKCk7XG4gICAgICAgIGtvLnV0aWxzLmRvbURhdGEuc2V0KGVsZW1lbnQsIHRlbXBsYXRlQ29tcHV0ZWREb21EYXRhS2V5LCAobmV3Q29tcHV0ZWQgJiYgbmV3Q29tcHV0ZWQuaXNBY3RpdmUoKSkgPyBuZXdDb21wdXRlZCA6IHVuZGVmaW5lZCk7XG4gICAgfVxuXG4gICAga28uYmluZGluZ0hhbmRsZXJzWyd0ZW1wbGF0ZSddID0ge1xuICAgICAgICAnaW5pdCc6IGZ1bmN0aW9uKGVsZW1lbnQsIHZhbHVlQWNjZXNzb3IpIHtcbiAgICAgICAgICAgIC8vIFN1cHBvcnQgYW5vbnltb3VzIHRlbXBsYXRlc1xuICAgICAgICAgICAgdmFyIGJpbmRpbmdWYWx1ZSA9IGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUodmFsdWVBY2Nlc3NvcigpKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgYmluZGluZ1ZhbHVlID09IFwic3RyaW5nXCIgfHwgYmluZGluZ1ZhbHVlWyduYW1lJ10pIHtcbiAgICAgICAgICAgICAgICAvLyBJdCdzIGEgbmFtZWQgdGVtcGxhdGUgLSBjbGVhciB0aGUgZWxlbWVudFxuICAgICAgICAgICAgICAgIGtvLnZpcnR1YWxFbGVtZW50cy5lbXB0eU5vZGUoZWxlbWVudCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCdub2RlcycgaW4gYmluZGluZ1ZhbHVlKSB7XG4gICAgICAgICAgICAgICAgLy8gV2UndmUgYmVlbiBnaXZlbiBhbiBhcnJheSBvZiBET00gbm9kZXMuIFNhdmUgdGhlbSBhcyB0aGUgdGVtcGxhdGUgc291cmNlLlxuICAgICAgICAgICAgICAgIC8vIFRoZXJlIGlzIG5vIGtub3duIHVzZSBjYXNlIGZvciB0aGUgbm9kZSBhcnJheSBiZWluZyBhbiBvYnNlcnZhYmxlIGFycmF5IChpZiB0aGUgb3V0cHV0XG4gICAgICAgICAgICAgICAgLy8gdmFyaWVzLCBwdXQgdGhhdCBiZWhhdmlvciAqaW50byogeW91ciB0ZW1wbGF0ZSAtIHRoYXQncyB3aGF0IHRlbXBsYXRlcyBhcmUgZm9yKSwgYW5kXG4gICAgICAgICAgICAgICAgLy8gdGhlIGltcGxlbWVudGF0aW9uIHdvdWxkIGJlIGEgbWVzcywgc28gYXNzZXJ0IHRoYXQgaXQncyBub3Qgb2JzZXJ2YWJsZS5cbiAgICAgICAgICAgICAgICB2YXIgbm9kZXMgPSBiaW5kaW5nVmFsdWVbJ25vZGVzJ10gfHwgW107XG4gICAgICAgICAgICAgICAgaWYgKGtvLmlzT2JzZXJ2YWJsZShub2RlcykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgXCJub2Rlc1wiIG9wdGlvbiBtdXN0IGJlIGEgcGxhaW4sIG5vbi1vYnNlcnZhYmxlIGFycmF5LicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgY29udGFpbmVyID0ga28udXRpbHMubW92ZUNsZWFuZWROb2Rlc1RvQ29udGFpbmVyRWxlbWVudChub2Rlcyk7IC8vIFRoaXMgYWxzbyByZW1vdmVzIHRoZSBub2RlcyBmcm9tIHRoZWlyIGN1cnJlbnQgcGFyZW50XG4gICAgICAgICAgICAgICAgbmV3IGtvLnRlbXBsYXRlU291cmNlcy5hbm9ueW1vdXNUZW1wbGF0ZShlbGVtZW50KVsnbm9kZXMnXShjb250YWluZXIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBJdCdzIGFuIGFub255bW91cyB0ZW1wbGF0ZSAtIHN0b3JlIHRoZSBlbGVtZW50IGNvbnRlbnRzLCB0aGVuIGNsZWFyIHRoZSBlbGVtZW50XG4gICAgICAgICAgICAgICAgdmFyIHRlbXBsYXRlTm9kZXMgPSBrby52aXJ0dWFsRWxlbWVudHMuY2hpbGROb2RlcyhlbGVtZW50KSxcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyID0ga28udXRpbHMubW92ZUNsZWFuZWROb2Rlc1RvQ29udGFpbmVyRWxlbWVudCh0ZW1wbGF0ZU5vZGVzKTsgLy8gVGhpcyBhbHNvIHJlbW92ZXMgdGhlIG5vZGVzIGZyb20gdGhlaXIgY3VycmVudCBwYXJlbnRcbiAgICAgICAgICAgICAgICBuZXcga28udGVtcGxhdGVTb3VyY2VzLmFub255bW91c1RlbXBsYXRlKGVsZW1lbnQpWydub2RlcyddKGNvbnRhaW5lcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geyAnY29udHJvbHNEZXNjZW5kYW50QmluZGluZ3MnOiB0cnVlIH07XG4gICAgICAgIH0sXG4gICAgICAgICd1cGRhdGUnOiBmdW5jdGlvbiAoZWxlbWVudCwgdmFsdWVBY2Nlc3NvciwgYWxsQmluZGluZ3MsIHZpZXdNb2RlbCwgYmluZGluZ0NvbnRleHQpIHtcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IHZhbHVlQWNjZXNzb3IoKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zID0ga28udXRpbHMudW53cmFwT2JzZXJ2YWJsZSh2YWx1ZSksXG4gICAgICAgICAgICAgICAgc2hvdWxkRGlzcGxheSA9IHRydWUsXG4gICAgICAgICAgICAgICAgdGVtcGxhdGVDb21wdXRlZCA9IG51bGwsXG4gICAgICAgICAgICAgICAgdGVtcGxhdGVOYW1lO1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIHRlbXBsYXRlTmFtZSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGVtcGxhdGVOYW1lID0gb3B0aW9uc1snbmFtZSddO1xuXG4gICAgICAgICAgICAgICAgLy8gU3VwcG9ydCBcImlmXCIvXCJpZm5vdFwiIGNvbmRpdGlvbnNcbiAgICAgICAgICAgICAgICBpZiAoJ2lmJyBpbiBvcHRpb25zKVxuICAgICAgICAgICAgICAgICAgICBzaG91bGREaXNwbGF5ID0ga28udXRpbHMudW53cmFwT2JzZXJ2YWJsZShvcHRpb25zWydpZiddKTtcbiAgICAgICAgICAgICAgICBpZiAoc2hvdWxkRGlzcGxheSAmJiAnaWZub3QnIGluIG9wdGlvbnMpXG4gICAgICAgICAgICAgICAgICAgIHNob3VsZERpc3BsYXkgPSAha28udXRpbHMudW53cmFwT2JzZXJ2YWJsZShvcHRpb25zWydpZm5vdCddKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCdmb3JlYWNoJyBpbiBvcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgLy8gUmVuZGVyIG9uY2UgZm9yIGVhY2ggZGF0YSBwb2ludCAodHJlYXRpbmcgZGF0YSBzZXQgYXMgZW1wdHkgaWYgc2hvdWxkRGlzcGxheT09ZmFsc2UpXG4gICAgICAgICAgICAgICAgdmFyIGRhdGFBcnJheSA9IChzaG91bGREaXNwbGF5ICYmIG9wdGlvbnNbJ2ZvcmVhY2gnXSkgfHwgW107XG4gICAgICAgICAgICAgICAgdGVtcGxhdGVDb21wdXRlZCA9IGtvLnJlbmRlclRlbXBsYXRlRm9yRWFjaCh0ZW1wbGF0ZU5hbWUgfHwgZWxlbWVudCwgZGF0YUFycmF5LCBvcHRpb25zLCBlbGVtZW50LCBiaW5kaW5nQ29udGV4dCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFzaG91bGREaXNwbGF5KSB7XG4gICAgICAgICAgICAgICAga28udmlydHVhbEVsZW1lbnRzLmVtcHR5Tm9kZShlbGVtZW50KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gUmVuZGVyIG9uY2UgZm9yIHRoaXMgc2luZ2xlIGRhdGEgcG9pbnQgKG9yIHVzZSB0aGUgdmlld01vZGVsIGlmIG5vIGRhdGEgd2FzIHByb3ZpZGVkKVxuICAgICAgICAgICAgICAgIHZhciBpbm5lckJpbmRpbmdDb250ZXh0ID0gKCdkYXRhJyBpbiBvcHRpb25zKSA/XG4gICAgICAgICAgICAgICAgICAgIGJpbmRpbmdDb250ZXh0LmNyZWF0ZVN0YXRpY0NoaWxkQ29udGV4dChvcHRpb25zWydkYXRhJ10sIG9wdGlvbnNbJ2FzJ10pIDogIC8vIEdpdmVuIGFuIGV4cGxpdGl0ICdkYXRhJyB2YWx1ZSwgd2UgY3JlYXRlIGEgY2hpbGQgYmluZGluZyBjb250ZXh0IGZvciBpdFxuICAgICAgICAgICAgICAgICAgICBiaW5kaW5nQ29udGV4dDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdpdmVuIG5vIGV4cGxpY2l0ICdkYXRhJyB2YWx1ZSwgd2UgcmV0YWluIHRoZSBzYW1lIGJpbmRpbmcgY29udGV4dFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlQ29tcHV0ZWQgPSBrby5yZW5kZXJUZW1wbGF0ZSh0ZW1wbGF0ZU5hbWUgfHwgZWxlbWVudCwgaW5uZXJCaW5kaW5nQ29udGV4dCwgb3B0aW9ucywgZWxlbWVudCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEl0IG9ubHkgbWFrZXMgc2Vuc2UgdG8gaGF2ZSBhIHNpbmdsZSB0ZW1wbGF0ZSBjb21wdXRlZCBwZXIgZWxlbWVudCAob3RoZXJ3aXNlIHdoaWNoIG9uZSBzaG91bGQgaGF2ZSBpdHMgb3V0cHV0IGRpc3BsYXllZD8pXG4gICAgICAgICAgICBkaXNwb3NlT2xkQ29tcHV0ZWRBbmRTdG9yZU5ld09uZShlbGVtZW50LCB0ZW1wbGF0ZUNvbXB1dGVkKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBBbm9ueW1vdXMgdGVtcGxhdGVzIGNhbid0IGJlIHJld3JpdHRlbi4gR2l2ZSBhIG5pY2UgZXJyb3IgbWVzc2FnZSBpZiB5b3UgdHJ5IHRvIGRvIGl0LlxuICAgIGtvLmV4cHJlc3Npb25SZXdyaXRpbmcuYmluZGluZ1Jld3JpdGVWYWxpZGF0b3JzWyd0ZW1wbGF0ZSddID0gZnVuY3Rpb24oYmluZGluZ1ZhbHVlKSB7XG4gICAgICAgIHZhciBwYXJzZWRCaW5kaW5nVmFsdWUgPSBrby5leHByZXNzaW9uUmV3cml0aW5nLnBhcnNlT2JqZWN0TGl0ZXJhbChiaW5kaW5nVmFsdWUpO1xuXG4gICAgICAgIGlmICgocGFyc2VkQmluZGluZ1ZhbHVlLmxlbmd0aCA9PSAxKSAmJiBwYXJzZWRCaW5kaW5nVmFsdWVbMF1bJ3Vua25vd24nXSlcbiAgICAgICAgICAgIHJldHVybiBudWxsOyAvLyBJdCBsb29rcyBsaWtlIGEgc3RyaW5nIGxpdGVyYWwsIG5vdCBhbiBvYmplY3QgbGl0ZXJhbCwgc28gdHJlYXQgaXQgYXMgYSBuYW1lZCB0ZW1wbGF0ZSAod2hpY2ggaXMgYWxsb3dlZCBmb3IgcmV3cml0aW5nKVxuXG4gICAgICAgIGlmIChrby5leHByZXNzaW9uUmV3cml0aW5nLmtleVZhbHVlQXJyYXlDb250YWluc0tleShwYXJzZWRCaW5kaW5nVmFsdWUsIFwibmFtZVwiKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsOyAvLyBOYW1lZCB0ZW1wbGF0ZXMgY2FuIGJlIHJld3JpdHRlbiwgc28gcmV0dXJuIFwibm8gZXJyb3JcIlxuICAgICAgICByZXR1cm4gXCJUaGlzIHRlbXBsYXRlIGVuZ2luZSBkb2VzIG5vdCBzdXBwb3J0IGFub255bW91cyB0ZW1wbGF0ZXMgbmVzdGVkIHdpdGhpbiBpdHMgdGVtcGxhdGVzXCI7XG4gICAgfTtcblxuICAgIGtvLnZpcnR1YWxFbGVtZW50cy5hbGxvd2VkQmluZGluZ3NbJ3RlbXBsYXRlJ10gPSB0cnVlO1xufSkoKTtcblxua28uZXhwb3J0U3ltYm9sKCdzZXRUZW1wbGF0ZUVuZ2luZScsIGtvLnNldFRlbXBsYXRlRW5naW5lKTtcbmtvLmV4cG9ydFN5bWJvbCgncmVuZGVyVGVtcGxhdGUnLCBrby5yZW5kZXJUZW1wbGF0ZSk7XG4vLyBHbyB0aHJvdWdoIHRoZSBpdGVtcyB0aGF0IGhhdmUgYmVlbiBhZGRlZCBhbmQgZGVsZXRlZCBhbmQgdHJ5IHRvIGZpbmQgbWF0Y2hlcyBiZXR3ZWVuIHRoZW0uXG5rby51dGlscy5maW5kTW92ZXNJbkFycmF5Q29tcGFyaXNvbiA9IGZ1bmN0aW9uIChsZWZ0LCByaWdodCwgbGltaXRGYWlsZWRDb21wYXJlcykge1xuICAgIGlmIChsZWZ0Lmxlbmd0aCAmJiByaWdodC5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGZhaWxlZENvbXBhcmVzLCBsLCByLCBsZWZ0SXRlbSwgcmlnaHRJdGVtO1xuICAgICAgICBmb3IgKGZhaWxlZENvbXBhcmVzID0gbCA9IDA7ICghbGltaXRGYWlsZWRDb21wYXJlcyB8fCBmYWlsZWRDb21wYXJlcyA8IGxpbWl0RmFpbGVkQ29tcGFyZXMpICYmIChsZWZ0SXRlbSA9IGxlZnRbbF0pOyArK2wpIHtcbiAgICAgICAgICAgIGZvciAociA9IDA7IHJpZ2h0SXRlbSA9IHJpZ2h0W3JdOyArK3IpIHtcbiAgICAgICAgICAgICAgICBpZiAobGVmdEl0ZW1bJ3ZhbHVlJ10gPT09IHJpZ2h0SXRlbVsndmFsdWUnXSkge1xuICAgICAgICAgICAgICAgICAgICBsZWZ0SXRlbVsnbW92ZWQnXSA9IHJpZ2h0SXRlbVsnaW5kZXgnXTtcbiAgICAgICAgICAgICAgICAgICAgcmlnaHRJdGVtWydtb3ZlZCddID0gbGVmdEl0ZW1bJ2luZGV4J107XG4gICAgICAgICAgICAgICAgICAgIHJpZ2h0LnNwbGljZShyLCAxKTsgICAgICAgICAvLyBUaGlzIGl0ZW0gaXMgbWFya2VkIGFzIG1vdmVkOyBzbyByZW1vdmUgaXQgZnJvbSByaWdodCBsaXN0XG4gICAgICAgICAgICAgICAgICAgIGZhaWxlZENvbXBhcmVzID0gciA9IDA7ICAgICAvLyBSZXNldCBmYWlsZWQgY29tcGFyZXMgY291bnQgYmVjYXVzZSB3ZSdyZSBjaGVja2luZyBmb3IgY29uc2VjdXRpdmUgZmFpbHVyZXNcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmFpbGVkQ29tcGFyZXMgKz0gcjtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbmtvLnV0aWxzLmNvbXBhcmVBcnJheXMgPSAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBzdGF0dXNOb3RJbk9sZCA9ICdhZGRlZCcsIHN0YXR1c05vdEluTmV3ID0gJ2RlbGV0ZWQnO1xuXG4gICAgLy8gU2ltcGxlIGNhbGN1bGF0aW9uIGJhc2VkIG9uIExldmVuc2h0ZWluIGRpc3RhbmNlLlxuICAgIGZ1bmN0aW9uIGNvbXBhcmVBcnJheXMob2xkQXJyYXksIG5ld0FycmF5LCBvcHRpb25zKSB7XG4gICAgICAgIC8vIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCBpZiB0aGUgdGhpcmQgYXJnIGlzIGFjdHVhbGx5IGEgYm9vbCwgaW50ZXJwcmV0XG4gICAgICAgIC8vIGl0IGFzIHRoZSBvbGQgcGFyYW1ldGVyICdkb250TGltaXRNb3ZlcycuIE5ld2VyIGNvZGUgc2hvdWxkIHVzZSB7IGRvbnRMaW1pdE1vdmVzOiB0cnVlIH0uXG4gICAgICAgIG9wdGlvbnMgPSAodHlwZW9mIG9wdGlvbnMgPT09ICdib29sZWFuJykgPyB7ICdkb250TGltaXRNb3Zlcyc6IG9wdGlvbnMgfSA6IChvcHRpb25zIHx8IHt9KTtcbiAgICAgICAgb2xkQXJyYXkgPSBvbGRBcnJheSB8fCBbXTtcbiAgICAgICAgbmV3QXJyYXkgPSBuZXdBcnJheSB8fCBbXTtcblxuICAgICAgICBpZiAob2xkQXJyYXkubGVuZ3RoIDwgbmV3QXJyYXkubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIGNvbXBhcmVTbWFsbEFycmF5VG9CaWdBcnJheShvbGRBcnJheSwgbmV3QXJyYXksIHN0YXR1c05vdEluT2xkLCBzdGF0dXNOb3RJbk5ldywgb3B0aW9ucyk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiBjb21wYXJlU21hbGxBcnJheVRvQmlnQXJyYXkobmV3QXJyYXksIG9sZEFycmF5LCBzdGF0dXNOb3RJbk5ldywgc3RhdHVzTm90SW5PbGQsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNvbXBhcmVTbWFsbEFycmF5VG9CaWdBcnJheShzbWxBcnJheSwgYmlnQXJyYXksIHN0YXR1c05vdEluU21sLCBzdGF0dXNOb3RJbkJpZywgb3B0aW9ucykge1xuICAgICAgICB2YXIgbXlNaW4gPSBNYXRoLm1pbixcbiAgICAgICAgICAgIG15TWF4ID0gTWF0aC5tYXgsXG4gICAgICAgICAgICBlZGl0RGlzdGFuY2VNYXRyaXggPSBbXSxcbiAgICAgICAgICAgIHNtbEluZGV4LCBzbWxJbmRleE1heCA9IHNtbEFycmF5Lmxlbmd0aCxcbiAgICAgICAgICAgIGJpZ0luZGV4LCBiaWdJbmRleE1heCA9IGJpZ0FycmF5Lmxlbmd0aCxcbiAgICAgICAgICAgIGNvbXBhcmVSYW5nZSA9IChiaWdJbmRleE1heCAtIHNtbEluZGV4TWF4KSB8fCAxLFxuICAgICAgICAgICAgbWF4RGlzdGFuY2UgPSBzbWxJbmRleE1heCArIGJpZ0luZGV4TWF4ICsgMSxcbiAgICAgICAgICAgIHRoaXNSb3csIGxhc3RSb3csXG4gICAgICAgICAgICBiaWdJbmRleE1heEZvclJvdywgYmlnSW5kZXhNaW5Gb3JSb3c7XG5cbiAgICAgICAgZm9yIChzbWxJbmRleCA9IDA7IHNtbEluZGV4IDw9IHNtbEluZGV4TWF4OyBzbWxJbmRleCsrKSB7XG4gICAgICAgICAgICBsYXN0Um93ID0gdGhpc1JvdztcbiAgICAgICAgICAgIGVkaXREaXN0YW5jZU1hdHJpeC5wdXNoKHRoaXNSb3cgPSBbXSk7XG4gICAgICAgICAgICBiaWdJbmRleE1heEZvclJvdyA9IG15TWluKGJpZ0luZGV4TWF4LCBzbWxJbmRleCArIGNvbXBhcmVSYW5nZSk7XG4gICAgICAgICAgICBiaWdJbmRleE1pbkZvclJvdyA9IG15TWF4KDAsIHNtbEluZGV4IC0gMSk7XG4gICAgICAgICAgICBmb3IgKGJpZ0luZGV4ID0gYmlnSW5kZXhNaW5Gb3JSb3c7IGJpZ0luZGV4IDw9IGJpZ0luZGV4TWF4Rm9yUm93OyBiaWdJbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFiaWdJbmRleClcbiAgICAgICAgICAgICAgICAgICAgdGhpc1Jvd1tiaWdJbmRleF0gPSBzbWxJbmRleCArIDE7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoIXNtbEluZGV4KSAgLy8gVG9wIHJvdyAtIHRyYW5zZm9ybSBlbXB0eSBhcnJheSBpbnRvIG5ldyBhcnJheSB2aWEgYWRkaXRpb25zXG4gICAgICAgICAgICAgICAgICAgIHRoaXNSb3dbYmlnSW5kZXhdID0gYmlnSW5kZXggKyAxO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNtbEFycmF5W3NtbEluZGV4IC0gMV0gPT09IGJpZ0FycmF5W2JpZ0luZGV4IC0gMV0pXG4gICAgICAgICAgICAgICAgICAgIHRoaXNSb3dbYmlnSW5kZXhdID0gbGFzdFJvd1tiaWdJbmRleCAtIDFdOyAgICAgICAgICAgICAgICAgIC8vIGNvcHkgdmFsdWUgKG5vIGVkaXQpXG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBub3J0aERpc3RhbmNlID0gbGFzdFJvd1tiaWdJbmRleF0gfHwgbWF4RGlzdGFuY2U7ICAgICAgIC8vIG5vdCBpbiBiaWcgKGRlbGV0aW9uKVxuICAgICAgICAgICAgICAgICAgICB2YXIgd2VzdERpc3RhbmNlID0gdGhpc1Jvd1tiaWdJbmRleCAtIDFdIHx8IG1heERpc3RhbmNlOyAgICAvLyBub3QgaW4gc21hbGwgKGFkZGl0aW9uKVxuICAgICAgICAgICAgICAgICAgICB0aGlzUm93W2JpZ0luZGV4XSA9IG15TWluKG5vcnRoRGlzdGFuY2UsIHdlc3REaXN0YW5jZSkgKyAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBlZGl0U2NyaXB0ID0gW10sIG1lTWludXNPbmUsIG5vdEluU21sID0gW10sIG5vdEluQmlnID0gW107XG4gICAgICAgIGZvciAoc21sSW5kZXggPSBzbWxJbmRleE1heCwgYmlnSW5kZXggPSBiaWdJbmRleE1heDsgc21sSW5kZXggfHwgYmlnSW5kZXg7KSB7XG4gICAgICAgICAgICBtZU1pbnVzT25lID0gZWRpdERpc3RhbmNlTWF0cml4W3NtbEluZGV4XVtiaWdJbmRleF0gLSAxO1xuICAgICAgICAgICAgaWYgKGJpZ0luZGV4ICYmIG1lTWludXNPbmUgPT09IGVkaXREaXN0YW5jZU1hdHJpeFtzbWxJbmRleF1bYmlnSW5kZXgtMV0pIHtcbiAgICAgICAgICAgICAgICBub3RJblNtbC5wdXNoKGVkaXRTY3JpcHRbZWRpdFNjcmlwdC5sZW5ndGhdID0geyAgICAgLy8gYWRkZWRcbiAgICAgICAgICAgICAgICAgICAgJ3N0YXR1cyc6IHN0YXR1c05vdEluU21sLFxuICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiBiaWdBcnJheVstLWJpZ0luZGV4XSxcbiAgICAgICAgICAgICAgICAgICAgJ2luZGV4JzogYmlnSW5kZXggfSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNtbEluZGV4ICYmIG1lTWludXNPbmUgPT09IGVkaXREaXN0YW5jZU1hdHJpeFtzbWxJbmRleCAtIDFdW2JpZ0luZGV4XSkge1xuICAgICAgICAgICAgICAgIG5vdEluQmlnLnB1c2goZWRpdFNjcmlwdFtlZGl0U2NyaXB0Lmxlbmd0aF0gPSB7ICAgICAvLyBkZWxldGVkXG4gICAgICAgICAgICAgICAgICAgICdzdGF0dXMnOiBzdGF0dXNOb3RJbkJpZyxcbiAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogc21sQXJyYXlbLS1zbWxJbmRleF0sXG4gICAgICAgICAgICAgICAgICAgICdpbmRleCc6IHNtbEluZGV4IH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAtLWJpZ0luZGV4O1xuICAgICAgICAgICAgICAgIC0tc21sSW5kZXg7XG4gICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zWydzcGFyc2UnXSkge1xuICAgICAgICAgICAgICAgICAgICBlZGl0U2NyaXB0LnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgJ3N0YXR1cyc6IFwicmV0YWluZWRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6IGJpZ0FycmF5W2JpZ0luZGV4XSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZXQgYSBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIGNvbnNlY3V0aXZlIG5vbi1tYXRjaGluZyBjb21wYXJpc29uczsgaGF2aW5nIGl0IGEgbXVsdGlwbGUgb2ZcbiAgICAgICAgLy8gc21sSW5kZXhNYXgga2VlcHMgdGhlIHRpbWUgY29tcGxleGl0eSBvZiB0aGlzIGFsZ29yaXRobSBsaW5lYXIuXG4gICAgICAgIGtvLnV0aWxzLmZpbmRNb3Zlc0luQXJyYXlDb21wYXJpc29uKG5vdEluQmlnLCBub3RJblNtbCwgIW9wdGlvbnNbJ2RvbnRMaW1pdE1vdmVzJ10gJiYgc21sSW5kZXhNYXggKiAxMCk7XG5cbiAgICAgICAgcmV0dXJuIGVkaXRTY3JpcHQucmV2ZXJzZSgpO1xuICAgIH1cblxuICAgIHJldHVybiBjb21wYXJlQXJyYXlzO1xufSkoKTtcblxua28uZXhwb3J0U3ltYm9sKCd1dGlscy5jb21wYXJlQXJyYXlzJywga28udXRpbHMuY29tcGFyZUFycmF5cyk7XG4oZnVuY3Rpb24gKCkge1xuICAgIC8vIE9iamVjdGl2ZTpcbiAgICAvLyAqIEdpdmVuIGFuIGlucHV0IGFycmF5LCBhIGNvbnRhaW5lciBET00gbm9kZSwgYW5kIGEgZnVuY3Rpb24gZnJvbSBhcnJheSBlbGVtZW50cyB0byBhcnJheXMgb2YgRE9NIG5vZGVzLFxuICAgIC8vICAgbWFwIHRoZSBhcnJheSBlbGVtZW50cyB0byBhcnJheXMgb2YgRE9NIG5vZGVzLCBjb25jYXRlbmF0ZSB0b2dldGhlciBhbGwgdGhlc2UgYXJyYXlzLCBhbmQgdXNlIHRoZW0gdG8gcG9wdWxhdGUgdGhlIGNvbnRhaW5lciBET00gbm9kZVxuICAgIC8vICogTmV4dCB0aW1lIHdlJ3JlIGdpdmVuIHRoZSBzYW1lIGNvbWJpbmF0aW9uIG9mIHRoaW5ncyAod2l0aCB0aGUgYXJyYXkgcG9zc2libHkgaGF2aW5nIG11dGF0ZWQpLCB1cGRhdGUgdGhlIGNvbnRhaW5lciBET00gbm9kZVxuICAgIC8vICAgc28gdGhhdCBpdHMgY2hpbGRyZW4gaXMgYWdhaW4gdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhlIG1hcHBpbmdzIG9mIHRoZSBhcnJheSBlbGVtZW50cywgYnV0IGRvbid0IHJlLW1hcCBhbnkgYXJyYXkgZWxlbWVudHMgdGhhdCB3ZVxuICAgIC8vICAgcHJldmlvdXNseSBtYXBwZWQgLSByZXRhaW4gdGhvc2Ugbm9kZXMsIGFuZCBqdXN0IGluc2VydC9kZWxldGUgb3RoZXIgb25lc1xuXG4gICAgLy8gXCJjYWxsYmFja0FmdGVyQWRkaW5nTm9kZXNcIiB3aWxsIGJlIGludm9rZWQgYWZ0ZXIgYW55IFwibWFwcGluZ1wiLWdlbmVyYXRlZCBub2RlcyBhcmUgaW5zZXJ0ZWQgaW50byB0aGUgY29udGFpbmVyIG5vZGVcbiAgICAvLyBZb3UgY2FuIHVzZSB0aGlzLCBmb3IgZXhhbXBsZSwgdG8gYWN0aXZhdGUgYmluZGluZ3Mgb24gdGhvc2Ugbm9kZXMuXG5cbiAgICBmdW5jdGlvbiBtYXBOb2RlQW5kUmVmcmVzaFdoZW5DaGFuZ2VkKGNvbnRhaW5lck5vZGUsIG1hcHBpbmcsIHZhbHVlVG9NYXAsIGNhbGxiYWNrQWZ0ZXJBZGRpbmdOb2RlcywgaW5kZXgpIHtcbiAgICAgICAgLy8gTWFwIHRoaXMgYXJyYXkgdmFsdWUgaW5zaWRlIGEgZGVwZW5kZW50T2JzZXJ2YWJsZSBzbyB3ZSByZS1tYXAgd2hlbiBhbnkgZGVwZW5kZW5jeSBjaGFuZ2VzXG4gICAgICAgIHZhciBtYXBwZWROb2RlcyA9IFtdO1xuICAgICAgICB2YXIgZGVwZW5kZW50T2JzZXJ2YWJsZSA9IGtvLmRlcGVuZGVudE9ic2VydmFibGUoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgbmV3TWFwcGVkTm9kZXMgPSBtYXBwaW5nKHZhbHVlVG9NYXAsIGluZGV4LCBrby51dGlscy5maXhVcENvbnRpbnVvdXNOb2RlQXJyYXkobWFwcGVkTm9kZXMsIGNvbnRhaW5lck5vZGUpKSB8fCBbXTtcblxuICAgICAgICAgICAgLy8gT24gc3Vic2VxdWVudCBldmFsdWF0aW9ucywganVzdCByZXBsYWNlIHRoZSBwcmV2aW91c2x5LWluc2VydGVkIERPTSBub2Rlc1xuICAgICAgICAgICAgaWYgKG1hcHBlZE5vZGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBrby51dGlscy5yZXBsYWNlRG9tTm9kZXMobWFwcGVkTm9kZXMsIG5ld01hcHBlZE5vZGVzKTtcbiAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2tBZnRlckFkZGluZ05vZGVzKVxuICAgICAgICAgICAgICAgICAgICBrby5kZXBlbmRlbmN5RGV0ZWN0aW9uLmlnbm9yZShjYWxsYmFja0FmdGVyQWRkaW5nTm9kZXMsIG51bGwsIFt2YWx1ZVRvTWFwLCBuZXdNYXBwZWROb2RlcywgaW5kZXhdKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gUmVwbGFjZSB0aGUgY29udGVudHMgb2YgdGhlIG1hcHBlZE5vZGVzIGFycmF5LCB0aGVyZWJ5IHVwZGF0aW5nIHRoZSByZWNvcmRcbiAgICAgICAgICAgIC8vIG9mIHdoaWNoIG5vZGVzIHdvdWxkIGJlIGRlbGV0ZWQgaWYgdmFsdWVUb01hcCB3YXMgaXRzZWxmIGxhdGVyIHJlbW92ZWRcbiAgICAgICAgICAgIG1hcHBlZE5vZGVzLmxlbmd0aCA9IDA7XG4gICAgICAgICAgICBrby51dGlscy5hcnJheVB1c2hBbGwobWFwcGVkTm9kZXMsIG5ld01hcHBlZE5vZGVzKTtcbiAgICAgICAgfSwgbnVsbCwgeyBkaXNwb3NlV2hlbk5vZGVJc1JlbW92ZWQ6IGNvbnRhaW5lck5vZGUsIGRpc3Bvc2VXaGVuOiBmdW5jdGlvbigpIHsgcmV0dXJuICFrby51dGlscy5hbnlEb21Ob2RlSXNBdHRhY2hlZFRvRG9jdW1lbnQobWFwcGVkTm9kZXMpOyB9IH0pO1xuICAgICAgICByZXR1cm4geyBtYXBwZWROb2RlcyA6IG1hcHBlZE5vZGVzLCBkZXBlbmRlbnRPYnNlcnZhYmxlIDogKGRlcGVuZGVudE9ic2VydmFibGUuaXNBY3RpdmUoKSA/IGRlcGVuZGVudE9ic2VydmFibGUgOiB1bmRlZmluZWQpIH07XG4gICAgfVxuXG4gICAgdmFyIGxhc3RNYXBwaW5nUmVzdWx0RG9tRGF0YUtleSA9IGtvLnV0aWxzLmRvbURhdGEubmV4dEtleSgpLFxuICAgICAgICBkZWxldGVkSXRlbUR1bW15VmFsdWUgPSBrby51dGlscy5kb21EYXRhLm5leHRLZXkoKTtcblxuICAgIGtvLnV0aWxzLnNldERvbU5vZGVDaGlsZHJlbkZyb21BcnJheU1hcHBpbmcgPSBmdW5jdGlvbiAoZG9tTm9kZSwgYXJyYXksIG1hcHBpbmcsIG9wdGlvbnMsIGNhbGxiYWNrQWZ0ZXJBZGRpbmdOb2Rlcykge1xuICAgICAgICAvLyBDb21wYXJlIHRoZSBwcm92aWRlZCBhcnJheSBhZ2FpbnN0IHRoZSBwcmV2aW91cyBvbmVcbiAgICAgICAgYXJyYXkgPSBhcnJheSB8fCBbXTtcbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICAgIHZhciBpc0ZpcnN0RXhlY3V0aW9uID0ga28udXRpbHMuZG9tRGF0YS5nZXQoZG9tTm9kZSwgbGFzdE1hcHBpbmdSZXN1bHREb21EYXRhS2V5KSA9PT0gdW5kZWZpbmVkO1xuICAgICAgICB2YXIgbGFzdE1hcHBpbmdSZXN1bHQgPSBrby51dGlscy5kb21EYXRhLmdldChkb21Ob2RlLCBsYXN0TWFwcGluZ1Jlc3VsdERvbURhdGFLZXkpIHx8IFtdO1xuICAgICAgICB2YXIgbGFzdEFycmF5ID0ga28udXRpbHMuYXJyYXlNYXAobGFzdE1hcHBpbmdSZXN1bHQsIGZ1bmN0aW9uICh4KSB7IHJldHVybiB4LmFycmF5RW50cnk7IH0pO1xuICAgICAgICB2YXIgZWRpdFNjcmlwdCA9IGtvLnV0aWxzLmNvbXBhcmVBcnJheXMobGFzdEFycmF5LCBhcnJheSwgb3B0aW9uc1snZG9udExpbWl0TW92ZXMnXSk7XG5cbiAgICAgICAgLy8gQnVpbGQgdGhlIG5ldyBtYXBwaW5nIHJlc3VsdFxuICAgICAgICB2YXIgbmV3TWFwcGluZ1Jlc3VsdCA9IFtdO1xuICAgICAgICB2YXIgbGFzdE1hcHBpbmdSZXN1bHRJbmRleCA9IDA7XG4gICAgICAgIHZhciBuZXdNYXBwaW5nUmVzdWx0SW5kZXggPSAwO1xuXG4gICAgICAgIHZhciBub2Rlc1RvRGVsZXRlID0gW107XG4gICAgICAgIHZhciBpdGVtc1RvUHJvY2VzcyA9IFtdO1xuICAgICAgICB2YXIgaXRlbXNGb3JCZWZvcmVSZW1vdmVDYWxsYmFja3MgPSBbXTtcbiAgICAgICAgdmFyIGl0ZW1zRm9yTW92ZUNhbGxiYWNrcyA9IFtdO1xuICAgICAgICB2YXIgaXRlbXNGb3JBZnRlckFkZENhbGxiYWNrcyA9IFtdO1xuICAgICAgICB2YXIgbWFwRGF0YTtcblxuICAgICAgICBmdW5jdGlvbiBpdGVtTW92ZWRPclJldGFpbmVkKGVkaXRTY3JpcHRJbmRleCwgb2xkUG9zaXRpb24pIHtcbiAgICAgICAgICAgIG1hcERhdGEgPSBsYXN0TWFwcGluZ1Jlc3VsdFtvbGRQb3NpdGlvbl07XG4gICAgICAgICAgICBpZiAobmV3TWFwcGluZ1Jlc3VsdEluZGV4ICE9PSBvbGRQb3NpdGlvbilcbiAgICAgICAgICAgICAgICBpdGVtc0Zvck1vdmVDYWxsYmFja3NbZWRpdFNjcmlwdEluZGV4XSA9IG1hcERhdGE7XG4gICAgICAgICAgICAvLyBTaW5jZSB1cGRhdGluZyB0aGUgaW5kZXggbWlnaHQgY2hhbmdlIHRoZSBub2RlcywgZG8gc28gYmVmb3JlIGNhbGxpbmcgZml4VXBDb250aW51b3VzTm9kZUFycmF5XG4gICAgICAgICAgICBtYXBEYXRhLmluZGV4T2JzZXJ2YWJsZShuZXdNYXBwaW5nUmVzdWx0SW5kZXgrKyk7XG4gICAgICAgICAgICBrby51dGlscy5maXhVcENvbnRpbnVvdXNOb2RlQXJyYXkobWFwRGF0YS5tYXBwZWROb2RlcywgZG9tTm9kZSk7XG4gICAgICAgICAgICBuZXdNYXBwaW5nUmVzdWx0LnB1c2gobWFwRGF0YSk7XG4gICAgICAgICAgICBpdGVtc1RvUHJvY2Vzcy5wdXNoKG1hcERhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gY2FsbENhbGxiYWNrKGNhbGxiYWNrLCBpdGVtcykge1xuICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIG4gPSBpdGVtcy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW1zW2ldKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBrby51dGlscy5hcnJheUZvckVhY2goaXRlbXNbaV0ubWFwcGVkTm9kZXMsIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhub2RlLCBpLCBpdGVtc1tpXS5hcnJheUVudHJ5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGVkaXRTY3JpcHRJdGVtLCBtb3ZlZEluZGV4OyBlZGl0U2NyaXB0SXRlbSA9IGVkaXRTY3JpcHRbaV07IGkrKykge1xuICAgICAgICAgICAgbW92ZWRJbmRleCA9IGVkaXRTY3JpcHRJdGVtWydtb3ZlZCddO1xuICAgICAgICAgICAgc3dpdGNoIChlZGl0U2NyaXB0SXRlbVsnc3RhdHVzJ10pIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwiZGVsZXRlZFwiOlxuICAgICAgICAgICAgICAgICAgICBpZiAobW92ZWRJbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXBEYXRhID0gbGFzdE1hcHBpbmdSZXN1bHRbbGFzdE1hcHBpbmdSZXN1bHRJbmRleF07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN0b3AgdHJhY2tpbmcgY2hhbmdlcyB0byB0aGUgbWFwcGluZyBmb3IgdGhlc2Ugbm9kZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXBEYXRhLmRlcGVuZGVudE9ic2VydmFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBEYXRhLmRlcGVuZGVudE9ic2VydmFibGUuZGlzcG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcERhdGEuZGVwZW5kZW50T2JzZXJ2YWJsZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUXVldWUgdGhlc2Ugbm9kZXMgZm9yIGxhdGVyIHJlbW92YWxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrby51dGlscy5maXhVcENvbnRpbnVvdXNOb2RlQXJyYXkobWFwRGF0YS5tYXBwZWROb2RlcywgZG9tTm9kZSkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnNbJ2JlZm9yZVJlbW92ZSddKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld01hcHBpbmdSZXN1bHQucHVzaChtYXBEYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXNUb1Byb2Nlc3MucHVzaChtYXBEYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hcERhdGEuYXJyYXlFbnRyeSA9PT0gZGVsZXRlZEl0ZW1EdW1teVZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBEYXRhID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zRm9yQmVmb3JlUmVtb3ZlQ2FsbGJhY2tzW2ldID0gbWFwRGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWFwRGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2Rlc1RvRGVsZXRlLnB1c2guYXBwbHkobm9kZXNUb0RlbGV0ZSwgbWFwRGF0YS5tYXBwZWROb2Rlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxhc3RNYXBwaW5nUmVzdWx0SW5kZXgrKztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlIFwicmV0YWluZWRcIjpcbiAgICAgICAgICAgICAgICAgICAgaXRlbU1vdmVkT3JSZXRhaW5lZChpLCBsYXN0TWFwcGluZ1Jlc3VsdEluZGV4KyspO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgXCJhZGRlZFwiOlxuICAgICAgICAgICAgICAgICAgICBpZiAobW92ZWRJbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtTW92ZWRPclJldGFpbmVkKGksIG1vdmVkSW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWFwRGF0YSA9IHsgYXJyYXlFbnRyeTogZWRpdFNjcmlwdEl0ZW1bJ3ZhbHVlJ10sIGluZGV4T2JzZXJ2YWJsZToga28ub2JzZXJ2YWJsZShuZXdNYXBwaW5nUmVzdWx0SW5kZXgrKykgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld01hcHBpbmdSZXN1bHQucHVzaChtYXBEYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zVG9Qcm9jZXNzLnB1c2gobWFwRGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzRmlyc3RFeGVjdXRpb24pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXNGb3JBZnRlckFkZENhbGxiYWNrc1tpXSA9IG1hcERhdGE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdG9yZSBhIGNvcHkgb2YgdGhlIGFycmF5IGl0ZW1zIHdlIGp1c3QgY29uc2lkZXJlZCBzbyB3ZSBjYW4gZGlmZmVyZW5jZSBpdCBuZXh0IHRpbWVcbiAgICAgICAga28udXRpbHMuZG9tRGF0YS5zZXQoZG9tTm9kZSwgbGFzdE1hcHBpbmdSZXN1bHREb21EYXRhS2V5LCBuZXdNYXBwaW5nUmVzdWx0KTtcblxuICAgICAgICAvLyBDYWxsIGJlZm9yZU1vdmUgZmlyc3QgYmVmb3JlIGFueSBjaGFuZ2VzIGhhdmUgYmVlbiBtYWRlIHRvIHRoZSBET01cbiAgICAgICAgY2FsbENhbGxiYWNrKG9wdGlvbnNbJ2JlZm9yZU1vdmUnXSwgaXRlbXNGb3JNb3ZlQ2FsbGJhY2tzKTtcblxuICAgICAgICAvLyBOZXh0IHJlbW92ZSBub2RlcyBmb3IgZGVsZXRlZCBpdGVtcyAob3IganVzdCBjbGVhbiBpZiB0aGVyZSdzIGEgYmVmb3JlUmVtb3ZlIGNhbGxiYWNrKVxuICAgICAgICBrby51dGlscy5hcnJheUZvckVhY2gobm9kZXNUb0RlbGV0ZSwgb3B0aW9uc1snYmVmb3JlUmVtb3ZlJ10gPyBrby5jbGVhbk5vZGUgOiBrby5yZW1vdmVOb2RlKTtcblxuICAgICAgICAvLyBOZXh0IGFkZC9yZW9yZGVyIHRoZSByZW1haW5pbmcgaXRlbXMgKHdpbGwgaW5jbHVkZSBkZWxldGVkIGl0ZW1zIGlmIHRoZXJlJ3MgYSBiZWZvcmVSZW1vdmUgY2FsbGJhY2spXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBuZXh0Tm9kZSA9IGtvLnZpcnR1YWxFbGVtZW50cy5maXJzdENoaWxkKGRvbU5vZGUpLCBsYXN0Tm9kZSwgbm9kZTsgbWFwRGF0YSA9IGl0ZW1zVG9Qcm9jZXNzW2ldOyBpKyspIHtcbiAgICAgICAgICAgIC8vIEdldCBub2RlcyBmb3IgbmV3bHkgYWRkZWQgaXRlbXNcbiAgICAgICAgICAgIGlmICghbWFwRGF0YS5tYXBwZWROb2RlcylcbiAgICAgICAgICAgICAgICBrby51dGlscy5leHRlbmQobWFwRGF0YSwgbWFwTm9kZUFuZFJlZnJlc2hXaGVuQ2hhbmdlZChkb21Ob2RlLCBtYXBwaW5nLCBtYXBEYXRhLmFycmF5RW50cnksIGNhbGxiYWNrQWZ0ZXJBZGRpbmdOb2RlcywgbWFwRGF0YS5pbmRleE9ic2VydmFibGUpKTtcblxuICAgICAgICAgICAgLy8gUHV0IG5vZGVzIGluIHRoZSByaWdodCBwbGFjZSBpZiB0aGV5IGFyZW4ndCB0aGVyZSBhbHJlYWR5XG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgbm9kZSA9IG1hcERhdGEubWFwcGVkTm9kZXNbal07IG5leHROb2RlID0gbm9kZS5uZXh0U2libGluZywgbGFzdE5vZGUgPSBub2RlLCBqKyspIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZSAhPT0gbmV4dE5vZGUpXG4gICAgICAgICAgICAgICAgICAgIGtvLnZpcnR1YWxFbGVtZW50cy5pbnNlcnRBZnRlcihkb21Ob2RlLCBub2RlLCBsYXN0Tm9kZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFJ1biB0aGUgY2FsbGJhY2tzIGZvciBuZXdseSBhZGRlZCBub2RlcyAoZm9yIGV4YW1wbGUsIHRvIGFwcGx5IGJpbmRpbmdzLCBldGMuKVxuICAgICAgICAgICAgaWYgKCFtYXBEYXRhLmluaXRpYWxpemVkICYmIGNhbGxiYWNrQWZ0ZXJBZGRpbmdOb2Rlcykge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrQWZ0ZXJBZGRpbmdOb2RlcyhtYXBEYXRhLmFycmF5RW50cnksIG1hcERhdGEubWFwcGVkTm9kZXMsIG1hcERhdGEuaW5kZXhPYnNlcnZhYmxlKTtcbiAgICAgICAgICAgICAgICBtYXBEYXRhLmluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHRoZXJlJ3MgYSBiZWZvcmVSZW1vdmUgY2FsbGJhY2ssIGNhbGwgaXQgYWZ0ZXIgcmVvcmRlcmluZy5cbiAgICAgICAgLy8gTm90ZSB0aGF0IHdlIGFzc3VtZSB0aGF0IHRoZSBiZWZvcmVSZW1vdmUgY2FsbGJhY2sgd2lsbCB1c3VhbGx5IGJlIHVzZWQgdG8gcmVtb3ZlIHRoZSBub2RlcyB1c2luZ1xuICAgICAgICAvLyBzb21lIHNvcnQgb2YgYW5pbWF0aW9uLCB3aGljaCBpcyB3aHkgd2UgZmlyc3QgcmVvcmRlciB0aGUgbm9kZXMgdGhhdCB3aWxsIGJlIHJlbW92ZWQuIElmIHRoZVxuICAgICAgICAvLyBjYWxsYmFjayBpbnN0ZWFkIHJlbW92ZXMgdGhlIG5vZGVzIHJpZ2h0IGF3YXksIGl0IHdvdWxkIGJlIG1vcmUgZWZmaWNpZW50IHRvIHNraXAgcmVvcmRlcmluZyB0aGVtLlxuICAgICAgICAvLyBQZXJoYXBzIHdlJ2xsIG1ha2UgdGhhdCBjaGFuZ2UgaW4gdGhlIGZ1dHVyZSBpZiB0aGlzIHNjZW5hcmlvIGJlY29tZXMgbW9yZSBjb21tb24uXG4gICAgICAgIGNhbGxDYWxsYmFjayhvcHRpb25zWydiZWZvcmVSZW1vdmUnXSwgaXRlbXNGb3JCZWZvcmVSZW1vdmVDYWxsYmFja3MpO1xuXG4gICAgICAgIC8vIFJlcGxhY2UgdGhlIHN0b3JlZCB2YWx1ZXMgb2YgZGVsZXRlZCBpdGVtcyB3aXRoIGEgZHVtbXkgdmFsdWUuIFRoaXMgcHJvdmlkZXMgdHdvIGJlbmVmaXRzOiBpdCBtYXJrcyB0aGlzIGl0ZW1cbiAgICAgICAgLy8gYXMgYWxyZWFkeSBcInJlbW92ZWRcIiBzbyB3ZSB3b24ndCBjYWxsIGJlZm9yZVJlbW92ZSBmb3IgaXQgYWdhaW4sIGFuZCBpdCBlbnN1cmVzIHRoYXQgdGhlIGl0ZW0gd29uJ3QgbWF0Y2ggdXBcbiAgICAgICAgLy8gd2l0aCBhbiBhY3R1YWwgaXRlbSBpbiB0aGUgYXJyYXkgYW5kIGFwcGVhciBhcyBcInJldGFpbmVkXCIgb3IgXCJtb3ZlZFwiLlxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaXRlbXNGb3JCZWZvcmVSZW1vdmVDYWxsYmFja3MubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGlmIChpdGVtc0ZvckJlZm9yZVJlbW92ZUNhbGxiYWNrc1tpXSkge1xuICAgICAgICAgICAgICAgIGl0ZW1zRm9yQmVmb3JlUmVtb3ZlQ2FsbGJhY2tzW2ldLmFycmF5RW50cnkgPSBkZWxldGVkSXRlbUR1bW15VmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGaW5hbGx5IGNhbGwgYWZ0ZXJNb3ZlIGFuZCBhZnRlckFkZCBjYWxsYmFja3NcbiAgICAgICAgY2FsbENhbGxiYWNrKG9wdGlvbnNbJ2FmdGVyTW92ZSddLCBpdGVtc0Zvck1vdmVDYWxsYmFja3MpO1xuICAgICAgICBjYWxsQ2FsbGJhY2sob3B0aW9uc1snYWZ0ZXJBZGQnXSwgaXRlbXNGb3JBZnRlckFkZENhbGxiYWNrcyk7XG4gICAgfVxufSkoKTtcblxua28uZXhwb3J0U3ltYm9sKCd1dGlscy5zZXREb21Ob2RlQ2hpbGRyZW5Gcm9tQXJyYXlNYXBwaW5nJywga28udXRpbHMuc2V0RG9tTm9kZUNoaWxkcmVuRnJvbUFycmF5TWFwcGluZyk7XG5rby5uYXRpdmVUZW1wbGF0ZUVuZ2luZSA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzWydhbGxvd1RlbXBsYXRlUmV3cml0aW5nJ10gPSBmYWxzZTtcbn1cblxua28ubmF0aXZlVGVtcGxhdGVFbmdpbmUucHJvdG90eXBlID0gbmV3IGtvLnRlbXBsYXRlRW5naW5lKCk7XG5rby5uYXRpdmVUZW1wbGF0ZUVuZ2luZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBrby5uYXRpdmVUZW1wbGF0ZUVuZ2luZTtcbmtvLm5hdGl2ZVRlbXBsYXRlRW5naW5lLnByb3RvdHlwZVsncmVuZGVyVGVtcGxhdGVTb3VyY2UnXSA9IGZ1bmN0aW9uICh0ZW1wbGF0ZVNvdXJjZSwgYmluZGluZ0NvbnRleHQsIG9wdGlvbnMsIHRlbXBsYXRlRG9jdW1lbnQpIHtcbiAgICB2YXIgdXNlTm9kZXNJZkF2YWlsYWJsZSA9ICEoa28udXRpbHMuaWVWZXJzaW9uIDwgOSksIC8vIElFPDkgY2xvbmVOb2RlIGRvZXNuJ3Qgd29yayBwcm9wZXJseVxuICAgICAgICB0ZW1wbGF0ZU5vZGVzRnVuYyA9IHVzZU5vZGVzSWZBdmFpbGFibGUgPyB0ZW1wbGF0ZVNvdXJjZVsnbm9kZXMnXSA6IG51bGwsXG4gICAgICAgIHRlbXBsYXRlTm9kZXMgPSB0ZW1wbGF0ZU5vZGVzRnVuYyA/IHRlbXBsYXRlU291cmNlWydub2RlcyddKCkgOiBudWxsO1xuXG4gICAgaWYgKHRlbXBsYXRlTm9kZXMpIHtcbiAgICAgICAgcmV0dXJuIGtvLnV0aWxzLm1ha2VBcnJheSh0ZW1wbGF0ZU5vZGVzLmNsb25lTm9kZSh0cnVlKS5jaGlsZE5vZGVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgdGVtcGxhdGVUZXh0ID0gdGVtcGxhdGVTb3VyY2VbJ3RleHQnXSgpO1xuICAgICAgICByZXR1cm4ga28udXRpbHMucGFyc2VIdG1sRnJhZ21lbnQodGVtcGxhdGVUZXh0LCB0ZW1wbGF0ZURvY3VtZW50KTtcbiAgICB9XG59O1xuXG5rby5uYXRpdmVUZW1wbGF0ZUVuZ2luZS5pbnN0YW5jZSA9IG5ldyBrby5uYXRpdmVUZW1wbGF0ZUVuZ2luZSgpO1xua28uc2V0VGVtcGxhdGVFbmdpbmUoa28ubmF0aXZlVGVtcGxhdGVFbmdpbmUuaW5zdGFuY2UpO1xuXG5rby5leHBvcnRTeW1ib2woJ25hdGl2ZVRlbXBsYXRlRW5naW5lJywga28ubmF0aXZlVGVtcGxhdGVFbmdpbmUpO1xuKGZ1bmN0aW9uKCkge1xuICAgIGtvLmpxdWVyeVRtcGxUZW1wbGF0ZUVuZ2luZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gRGV0ZWN0IHdoaWNoIHZlcnNpb24gb2YganF1ZXJ5LXRtcGwgeW91J3JlIHVzaW5nLiBVbmZvcnR1bmF0ZWx5IGpxdWVyeS10bXBsXG4gICAgICAgIC8vIGRvZXNuJ3QgZXhwb3NlIGEgdmVyc2lvbiBudW1iZXIsIHNvIHdlIGhhdmUgdG8gaW5mZXIgaXQuXG4gICAgICAgIC8vIE5vdGUgdGhhdCBhcyBvZiBLbm9ja291dCAxLjMsIHdlIG9ubHkgc3VwcG9ydCBqUXVlcnkudG1wbCAxLjAuMHByZSBhbmQgbGF0ZXIsXG4gICAgICAgIC8vIHdoaWNoIEtPIGludGVybmFsbHkgcmVmZXJzIHRvIGFzIHZlcnNpb24gXCIyXCIsIHNvIG9sZGVyIHZlcnNpb25zIGFyZSBubyBsb25nZXIgZGV0ZWN0ZWQuXG4gICAgICAgIHZhciBqUXVlcnlUbXBsVmVyc2lvbiA9IHRoaXMualF1ZXJ5VG1wbFZlcnNpb24gPSAoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpZiAoIWpRdWVyeUluc3RhbmNlIHx8ICEoalF1ZXJ5SW5zdGFuY2VbJ3RtcGwnXSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICAvLyBTaW5jZSBpdCBleHBvc2VzIG5vIG9mZmljaWFsIHZlcnNpb24gbnVtYmVyLCB3ZSB1c2Ugb3VyIG93biBudW1iZXJpbmcgc3lzdGVtLiBUbyBiZSB1cGRhdGVkIGFzIGpxdWVyeS10bXBsIGV2b2x2ZXMuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmIChqUXVlcnlJbnN0YW5jZVsndG1wbCddWyd0YWcnXVsndG1wbCddWydvcGVuJ10udG9TdHJpbmcoKS5pbmRleE9mKCdfXycpID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2luY2UgMS4wLjBwcmUsIGN1c3RvbSB0YWdzIHNob3VsZCBhcHBlbmQgbWFya3VwIHRvIGFuIGFycmF5IGNhbGxlZCBcIl9fXCJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDI7IC8vIEZpbmFsIHZlcnNpb24gb2YganF1ZXJ5LnRtcGxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoKGV4KSB7IC8qIEFwcGFyZW50bHkgbm90IHRoZSB2ZXJzaW9uIHdlIHdlcmUgbG9va2luZyBmb3IgKi8gfVxuXG4gICAgICAgICAgICByZXR1cm4gMTsgLy8gQW55IG9sZGVyIHZlcnNpb24gdGhhdCB3ZSBkb24ndCBzdXBwb3J0XG4gICAgICAgIH0pKCk7XG5cbiAgICAgICAgZnVuY3Rpb24gZW5zdXJlSGFzUmVmZXJlbmNlZEpRdWVyeVRlbXBsYXRlcygpIHtcbiAgICAgICAgICAgIGlmIChqUXVlcnlUbXBsVmVyc2lvbiA8IDIpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiWW91ciB2ZXJzaW9uIG9mIGpRdWVyeS50bXBsIGlzIHRvbyBvbGQuIFBsZWFzZSB1cGdyYWRlIHRvIGpRdWVyeS50bXBsIDEuMC4wcHJlIG9yIGxhdGVyLlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGV4ZWN1dGVUZW1wbGF0ZShjb21waWxlZFRlbXBsYXRlLCBkYXRhLCBqUXVlcnlUZW1wbGF0ZU9wdGlvbnMpIHtcbiAgICAgICAgICAgIHJldHVybiBqUXVlcnlJbnN0YW5jZVsndG1wbCddKGNvbXBpbGVkVGVtcGxhdGUsIGRhdGEsIGpRdWVyeVRlbXBsYXRlT3B0aW9ucyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzWydyZW5kZXJUZW1wbGF0ZVNvdXJjZSddID0gZnVuY3Rpb24odGVtcGxhdGVTb3VyY2UsIGJpbmRpbmdDb250ZXh0LCBvcHRpb25zLCB0ZW1wbGF0ZURvY3VtZW50KSB7XG4gICAgICAgICAgICB0ZW1wbGF0ZURvY3VtZW50ID0gdGVtcGxhdGVEb2N1bWVudCB8fCBkb2N1bWVudDtcbiAgICAgICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgICAgICAgICAgZW5zdXJlSGFzUmVmZXJlbmNlZEpRdWVyeVRlbXBsYXRlcygpO1xuXG4gICAgICAgICAgICAvLyBFbnN1cmUgd2UgaGF2ZSBzdG9yZWQgYSBwcmVjb21waWxlZCB2ZXJzaW9uIG9mIHRoaXMgdGVtcGxhdGUgKGRvbid0IHdhbnQgdG8gcmVwYXJzZSBvbiBldmVyeSByZW5kZXIpXG4gICAgICAgICAgICB2YXIgcHJlY29tcGlsZWQgPSB0ZW1wbGF0ZVNvdXJjZVsnZGF0YSddKCdwcmVjb21waWxlZCcpO1xuICAgICAgICAgICAgaWYgKCFwcmVjb21waWxlZCkge1xuICAgICAgICAgICAgICAgIHZhciB0ZW1wbGF0ZVRleHQgPSB0ZW1wbGF0ZVNvdXJjZVsndGV4dCddKCkgfHwgXCJcIjtcbiAgICAgICAgICAgICAgICAvLyBXcmFwIGluIFwid2l0aCgkd2hhdGV2ZXIua29CaW5kaW5nQ29udGV4dCkgeyAuLi4gfVwiXG4gICAgICAgICAgICAgICAgdGVtcGxhdGVUZXh0ID0gXCJ7e2tvX3dpdGggJGl0ZW0ua29CaW5kaW5nQ29udGV4dH19XCIgKyB0ZW1wbGF0ZVRleHQgKyBcInt7L2tvX3dpdGh9fVwiO1xuXG4gICAgICAgICAgICAgICAgcHJlY29tcGlsZWQgPSBqUXVlcnlJbnN0YW5jZVsndGVtcGxhdGUnXShudWxsLCB0ZW1wbGF0ZVRleHQpO1xuICAgICAgICAgICAgICAgIHRlbXBsYXRlU291cmNlWydkYXRhJ10oJ3ByZWNvbXBpbGVkJywgcHJlY29tcGlsZWQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgZGF0YSA9IFtiaW5kaW5nQ29udGV4dFsnJGRhdGEnXV07IC8vIFByZXdyYXAgdGhlIGRhdGEgaW4gYW4gYXJyYXkgdG8gc3RvcCBqcXVlcnkudG1wbCBmcm9tIHRyeWluZyB0byB1bndyYXAgYW55IGFycmF5c1xuICAgICAgICAgICAgdmFyIGpRdWVyeVRlbXBsYXRlT3B0aW9ucyA9IGpRdWVyeUluc3RhbmNlWydleHRlbmQnXSh7ICdrb0JpbmRpbmdDb250ZXh0JzogYmluZGluZ0NvbnRleHQgfSwgb3B0aW9uc1sndGVtcGxhdGVPcHRpb25zJ10pO1xuXG4gICAgICAgICAgICB2YXIgcmVzdWx0Tm9kZXMgPSBleGVjdXRlVGVtcGxhdGUocHJlY29tcGlsZWQsIGRhdGEsIGpRdWVyeVRlbXBsYXRlT3B0aW9ucyk7XG4gICAgICAgICAgICByZXN1bHROb2Rlc1snYXBwZW5kVG8nXSh0ZW1wbGF0ZURvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikpOyAvLyBVc2luZyBcImFwcGVuZFRvXCIgZm9yY2VzIGpRdWVyeS9qUXVlcnkudG1wbCB0byBwZXJmb3JtIG5lY2Vzc2FyeSBjbGVhbnVwIHdvcmtcblxuICAgICAgICAgICAgalF1ZXJ5SW5zdGFuY2VbJ2ZyYWdtZW50cyddID0ge307IC8vIENsZWFyIGpRdWVyeSdzIGZyYWdtZW50IGNhY2hlIHRvIGF2b2lkIGEgbWVtb3J5IGxlYWsgYWZ0ZXIgYSBsYXJnZSBudW1iZXIgb2YgdGVtcGxhdGUgcmVuZGVyc1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdE5vZGVzO1xuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXNbJ2NyZWF0ZUphdmFTY3JpcHRFdmFsdWF0b3JCbG9jayddID0gZnVuY3Rpb24oc2NyaXB0KSB7XG4gICAgICAgICAgICByZXR1cm4gXCJ7e2tvX2NvZGUgKChmdW5jdGlvbigpIHsgcmV0dXJuIFwiICsgc2NyaXB0ICsgXCIgfSkoKSkgfX1cIjtcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzWydhZGRUZW1wbGF0ZSddID0gZnVuY3Rpb24odGVtcGxhdGVOYW1lLCB0ZW1wbGF0ZU1hcmt1cCkge1xuICAgICAgICAgICAgZG9jdW1lbnQud3JpdGUoXCI8c2NyaXB0IHR5cGU9J3RleHQvaHRtbCcgaWQ9J1wiICsgdGVtcGxhdGVOYW1lICsgXCInPlwiICsgdGVtcGxhdGVNYXJrdXAgKyBcIjxcIiArIFwiL3NjcmlwdD5cIik7XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKGpRdWVyeVRtcGxWZXJzaW9uID4gMCkge1xuICAgICAgICAgICAgalF1ZXJ5SW5zdGFuY2VbJ3RtcGwnXVsndGFnJ11bJ2tvX2NvZGUnXSA9IHtcbiAgICAgICAgICAgICAgICBvcGVuOiBcIl9fLnB1c2goJDEgfHwgJycpO1wiXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgalF1ZXJ5SW5zdGFuY2VbJ3RtcGwnXVsndGFnJ11bJ2tvX3dpdGgnXSA9IHtcbiAgICAgICAgICAgICAgICBvcGVuOiBcIndpdGgoJDEpIHtcIixcbiAgICAgICAgICAgICAgICBjbG9zZTogXCJ9IFwiXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGtvLmpxdWVyeVRtcGxUZW1wbGF0ZUVuZ2luZS5wcm90b3R5cGUgPSBuZXcga28udGVtcGxhdGVFbmdpbmUoKTtcbiAgICBrby5qcXVlcnlUbXBsVGVtcGxhdGVFbmdpbmUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0ga28uanF1ZXJ5VG1wbFRlbXBsYXRlRW5naW5lO1xuXG4gICAgLy8gVXNlIHRoaXMgb25lIGJ5IGRlZmF1bHQgKm9ubHkgaWYganF1ZXJ5LnRtcGwgaXMgcmVmZXJlbmNlZCpcbiAgICB2YXIganF1ZXJ5VG1wbFRlbXBsYXRlRW5naW5lSW5zdGFuY2UgPSBuZXcga28uanF1ZXJ5VG1wbFRlbXBsYXRlRW5naW5lKCk7XG4gICAgaWYgKGpxdWVyeVRtcGxUZW1wbGF0ZUVuZ2luZUluc3RhbmNlLmpRdWVyeVRtcGxWZXJzaW9uID4gMClcbiAgICAgICAga28uc2V0VGVtcGxhdGVFbmdpbmUoanF1ZXJ5VG1wbFRlbXBsYXRlRW5naW5lSW5zdGFuY2UpO1xuXG4gICAga28uZXhwb3J0U3ltYm9sKCdqcXVlcnlUbXBsVGVtcGxhdGVFbmdpbmUnLCBrby5qcXVlcnlUbXBsVGVtcGxhdGVFbmdpbmUpO1xufSkoKTtcbn0pKTtcbn0oKSk7XG59KSgpO1xuIiwiLy8hIG1vbWVudC5qc1xuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKSA6XG4gICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKGZhY3RvcnkpIDpcbiAgICBnbG9iYWwubW9tZW50ID0gZmFjdG9yeSgpXG59KHRoaXMsIChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIHZhciBob29rQ2FsbGJhY2s7XG5cbiAgICBmdW5jdGlvbiBob29rcyAoKSB7XG4gICAgICAgIHJldHVybiBob29rQ2FsbGJhY2suYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgICB9XG5cbiAgICAvLyBUaGlzIGlzIGRvbmUgdG8gcmVnaXN0ZXIgdGhlIG1ldGhvZCBjYWxsZWQgd2l0aCBtb21lbnQoKVxuICAgIC8vIHdpdGhvdXQgY3JlYXRpbmcgY2lyY3VsYXIgZGVwZW5kZW5jaWVzLlxuICAgIGZ1bmN0aW9uIHNldEhvb2tDYWxsYmFjayAoY2FsbGJhY2spIHtcbiAgICAgICAgaG9va0NhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNBcnJheShpbnB1dCkge1xuICAgICAgICByZXR1cm4gaW5wdXQgaW5zdGFuY2VvZiBBcnJheSB8fCBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaW5wdXQpID09PSAnW29iamVjdCBBcnJheV0nO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzT2JqZWN0KGlucHV0KSB7XG4gICAgICAgIC8vIElFOCB3aWxsIHRyZWF0IHVuZGVmaW5lZCBhbmQgbnVsbCBhcyBvYmplY3QgaWYgaXQgd2Fzbid0IGZvclxuICAgICAgICAvLyBpbnB1dCAhPSBudWxsXG4gICAgICAgIHJldHVybiBpbnB1dCAhPSBudWxsICYmIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpbnB1dCkgPT09ICdbb2JqZWN0IE9iamVjdF0nO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzT2JqZWN0RW1wdHkob2JqKSB7XG4gICAgICAgIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcykge1xuICAgICAgICAgICAgcmV0dXJuIChPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvYmopLmxlbmd0aCA9PT0gMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgaztcbiAgICAgICAgICAgIGZvciAoayBpbiBvYmopIHtcbiAgICAgICAgICAgICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGspKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzVW5kZWZpbmVkKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBpbnB1dCA9PT0gdm9pZCAwO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzTnVtYmVyKGlucHV0KSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgaW5wdXQgPT09ICdudW1iZXInIHx8IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpbnB1dCkgPT09ICdbb2JqZWN0IE51bWJlcl0nO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzRGF0ZShpbnB1dCkge1xuICAgICAgICByZXR1cm4gaW5wdXQgaW5zdGFuY2VvZiBEYXRlIHx8IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpbnB1dCkgPT09ICdbb2JqZWN0IERhdGVdJztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtYXAoYXJyLCBmbikge1xuICAgICAgICB2YXIgcmVzID0gW10sIGk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIHJlcy5wdXNoKGZuKGFycltpXSwgaSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaGFzT3duUHJvcChhLCBiKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYSwgYik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZXh0ZW5kKGEsIGIpIHtcbiAgICAgICAgZm9yICh2YXIgaSBpbiBiKSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duUHJvcChiLCBpKSkge1xuICAgICAgICAgICAgICAgIGFbaV0gPSBiW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhhc093blByb3AoYiwgJ3RvU3RyaW5nJykpIHtcbiAgICAgICAgICAgIGEudG9TdHJpbmcgPSBiLnRvU3RyaW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhhc093blByb3AoYiwgJ3ZhbHVlT2YnKSkge1xuICAgICAgICAgICAgYS52YWx1ZU9mID0gYi52YWx1ZU9mO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGE7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRlVVRDIChpbnB1dCwgZm9ybWF0LCBsb2NhbGUsIHN0cmljdCkge1xuICAgICAgICByZXR1cm4gY3JlYXRlTG9jYWxPclVUQyhpbnB1dCwgZm9ybWF0LCBsb2NhbGUsIHN0cmljdCwgdHJ1ZSkudXRjKCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGVmYXVsdFBhcnNpbmdGbGFncygpIHtcbiAgICAgICAgLy8gV2UgbmVlZCB0byBkZWVwIGNsb25lIHRoaXMgb2JqZWN0LlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZW1wdHkgICAgICAgICAgIDogZmFsc2UsXG4gICAgICAgICAgICB1bnVzZWRUb2tlbnMgICAgOiBbXSxcbiAgICAgICAgICAgIHVudXNlZElucHV0ICAgICA6IFtdLFxuICAgICAgICAgICAgb3ZlcmZsb3cgICAgICAgIDogLTIsXG4gICAgICAgICAgICBjaGFyc0xlZnRPdmVyICAgOiAwLFxuICAgICAgICAgICAgbnVsbElucHV0ICAgICAgIDogZmFsc2UsXG4gICAgICAgICAgICBpbnZhbGlkTW9udGggICAgOiBudWxsLFxuICAgICAgICAgICAgaW52YWxpZEZvcm1hdCAgIDogZmFsc2UsXG4gICAgICAgICAgICB1c2VySW52YWxpZGF0ZWQgOiBmYWxzZSxcbiAgICAgICAgICAgIGlzbyAgICAgICAgICAgICA6IGZhbHNlLFxuICAgICAgICAgICAgcGFyc2VkRGF0ZVBhcnRzIDogW10sXG4gICAgICAgICAgICBtZXJpZGllbSAgICAgICAgOiBudWxsLFxuICAgICAgICAgICAgcmZjMjgyMiAgICAgICAgIDogZmFsc2UsXG4gICAgICAgICAgICB3ZWVrZGF5TWlzbWF0Y2ggOiBmYWxzZVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFBhcnNpbmdGbGFncyhtKSB7XG4gICAgICAgIGlmIChtLl9wZiA9PSBudWxsKSB7XG4gICAgICAgICAgICBtLl9wZiA9IGRlZmF1bHRQYXJzaW5nRmxhZ3MoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbS5fcGY7XG4gICAgfVxuXG4gICAgdmFyIHNvbWU7XG4gICAgaWYgKEFycmF5LnByb3RvdHlwZS5zb21lKSB7XG4gICAgICAgIHNvbWUgPSBBcnJheS5wcm90b3R5cGUuc29tZTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBzb21lID0gZnVuY3Rpb24gKGZ1bikge1xuICAgICAgICAgICAgdmFyIHQgPSBPYmplY3QodGhpcyk7XG4gICAgICAgICAgICB2YXIgbGVuID0gdC5sZW5ndGggPj4+IDA7XG5cbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoaSBpbiB0ICYmIGZ1bi5jYWxsKHRoaXMsIHRbaV0sIGksIHQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzVmFsaWQobSkge1xuICAgICAgICBpZiAobS5faXNWYWxpZCA9PSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgZmxhZ3MgPSBnZXRQYXJzaW5nRmxhZ3MobSk7XG4gICAgICAgICAgICB2YXIgcGFyc2VkUGFydHMgPSBzb21lLmNhbGwoZmxhZ3MucGFyc2VkRGF0ZVBhcnRzLCBmdW5jdGlvbiAoaSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpICE9IG51bGw7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHZhciBpc05vd1ZhbGlkID0gIWlzTmFOKG0uX2QuZ2V0VGltZSgpKSAmJlxuICAgICAgICAgICAgICAgIGZsYWdzLm92ZXJmbG93IDwgMCAmJlxuICAgICAgICAgICAgICAgICFmbGFncy5lbXB0eSAmJlxuICAgICAgICAgICAgICAgICFmbGFncy5pbnZhbGlkTW9udGggJiZcbiAgICAgICAgICAgICAgICAhZmxhZ3MuaW52YWxpZFdlZWtkYXkgJiZcbiAgICAgICAgICAgICAgICAhZmxhZ3Mud2Vla2RheU1pc21hdGNoICYmXG4gICAgICAgICAgICAgICAgIWZsYWdzLm51bGxJbnB1dCAmJlxuICAgICAgICAgICAgICAgICFmbGFncy5pbnZhbGlkRm9ybWF0ICYmXG4gICAgICAgICAgICAgICAgIWZsYWdzLnVzZXJJbnZhbGlkYXRlZCAmJlxuICAgICAgICAgICAgICAgICghZmxhZ3MubWVyaWRpZW0gfHwgKGZsYWdzLm1lcmlkaWVtICYmIHBhcnNlZFBhcnRzKSk7XG5cbiAgICAgICAgICAgIGlmIChtLl9zdHJpY3QpIHtcbiAgICAgICAgICAgICAgICBpc05vd1ZhbGlkID0gaXNOb3dWYWxpZCAmJlxuICAgICAgICAgICAgICAgICAgICBmbGFncy5jaGFyc0xlZnRPdmVyID09PSAwICYmXG4gICAgICAgICAgICAgICAgICAgIGZsYWdzLnVudXNlZFRva2Vucy5sZW5ndGggPT09IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3MuYmlnSG91ciA9PT0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoT2JqZWN0LmlzRnJvemVuID09IG51bGwgfHwgIU9iamVjdC5pc0Zyb3plbihtKSkge1xuICAgICAgICAgICAgICAgIG0uX2lzVmFsaWQgPSBpc05vd1ZhbGlkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzTm93VmFsaWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG0uX2lzVmFsaWQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRlSW52YWxpZCAoZmxhZ3MpIHtcbiAgICAgICAgdmFyIG0gPSBjcmVhdGVVVEMoTmFOKTtcbiAgICAgICAgaWYgKGZsYWdzICE9IG51bGwpIHtcbiAgICAgICAgICAgIGV4dGVuZChnZXRQYXJzaW5nRmxhZ3MobSksIGZsYWdzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhtKS51c2VySW52YWxpZGF0ZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgLy8gUGx1Z2lucyB0aGF0IGFkZCBwcm9wZXJ0aWVzIHNob3VsZCBhbHNvIGFkZCB0aGUga2V5IGhlcmUgKG51bGwgdmFsdWUpLFxuICAgIC8vIHNvIHdlIGNhbiBwcm9wZXJseSBjbG9uZSBvdXJzZWx2ZXMuXG4gICAgdmFyIG1vbWVudFByb3BlcnRpZXMgPSBob29rcy5tb21lbnRQcm9wZXJ0aWVzID0gW107XG5cbiAgICBmdW5jdGlvbiBjb3B5Q29uZmlnKHRvLCBmcm9tKSB7XG4gICAgICAgIHZhciBpLCBwcm9wLCB2YWw7XG5cbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChmcm9tLl9pc0FNb21lbnRPYmplY3QpKSB7XG4gICAgICAgICAgICB0by5faXNBTW9tZW50T2JqZWN0ID0gZnJvbS5faXNBTW9tZW50T2JqZWN0O1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNVbmRlZmluZWQoZnJvbS5faSkpIHtcbiAgICAgICAgICAgIHRvLl9pID0gZnJvbS5faTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKGZyb20uX2YpKSB7XG4gICAgICAgICAgICB0by5fZiA9IGZyb20uX2Y7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChmcm9tLl9sKSkge1xuICAgICAgICAgICAgdG8uX2wgPSBmcm9tLl9sO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNVbmRlZmluZWQoZnJvbS5fc3RyaWN0KSkge1xuICAgICAgICAgICAgdG8uX3N0cmljdCA9IGZyb20uX3N0cmljdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKGZyb20uX3R6bSkpIHtcbiAgICAgICAgICAgIHRvLl90em0gPSBmcm9tLl90em07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChmcm9tLl9pc1VUQykpIHtcbiAgICAgICAgICAgIHRvLl9pc1VUQyA9IGZyb20uX2lzVVRDO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNVbmRlZmluZWQoZnJvbS5fb2Zmc2V0KSkge1xuICAgICAgICAgICAgdG8uX29mZnNldCA9IGZyb20uX29mZnNldDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKGZyb20uX3BmKSkge1xuICAgICAgICAgICAgdG8uX3BmID0gZ2V0UGFyc2luZ0ZsYWdzKGZyb20pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNVbmRlZmluZWQoZnJvbS5fbG9jYWxlKSkge1xuICAgICAgICAgICAgdG8uX2xvY2FsZSA9IGZyb20uX2xvY2FsZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtb21lbnRQcm9wZXJ0aWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtb21lbnRQcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgcHJvcCA9IG1vbWVudFByb3BlcnRpZXNbaV07XG4gICAgICAgICAgICAgICAgdmFsID0gZnJvbVtwcm9wXTtcbiAgICAgICAgICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKHZhbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdG9bcHJvcF0gPSB2YWw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRvO1xuICAgIH1cblxuICAgIHZhciB1cGRhdGVJblByb2dyZXNzID0gZmFsc2U7XG5cbiAgICAvLyBNb21lbnQgcHJvdG90eXBlIG9iamVjdFxuICAgIGZ1bmN0aW9uIE1vbWVudChjb25maWcpIHtcbiAgICAgICAgY29weUNvbmZpZyh0aGlzLCBjb25maWcpO1xuICAgICAgICB0aGlzLl9kID0gbmV3IERhdGUoY29uZmlnLl9kICE9IG51bGwgPyBjb25maWcuX2QuZ2V0VGltZSgpIDogTmFOKTtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgdGhpcy5fZCA9IG5ldyBEYXRlKE5hTik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUHJldmVudCBpbmZpbml0ZSBsb29wIGluIGNhc2UgdXBkYXRlT2Zmc2V0IGNyZWF0ZXMgbmV3IG1vbWVudFxuICAgICAgICAvLyBvYmplY3RzLlxuICAgICAgICBpZiAodXBkYXRlSW5Qcm9ncmVzcyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHVwZGF0ZUluUHJvZ3Jlc3MgPSB0cnVlO1xuICAgICAgICAgICAgaG9va3MudXBkYXRlT2Zmc2V0KHRoaXMpO1xuICAgICAgICAgICAgdXBkYXRlSW5Qcm9ncmVzcyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNNb21lbnQgKG9iaikge1xuICAgICAgICByZXR1cm4gb2JqIGluc3RhbmNlb2YgTW9tZW50IHx8IChvYmogIT0gbnVsbCAmJiBvYmouX2lzQU1vbWVudE9iamVjdCAhPSBudWxsKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhYnNGbG9vciAobnVtYmVyKSB7XG4gICAgICAgIGlmIChudW1iZXIgPCAwKSB7XG4gICAgICAgICAgICAvLyAtMCAtPiAwXG4gICAgICAgICAgICByZXR1cm4gTWF0aC5jZWlsKG51bWJlcikgfHwgMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLmZsb29yKG51bWJlcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0b0ludChhcmd1bWVudEZvckNvZXJjaW9uKSB7XG4gICAgICAgIHZhciBjb2VyY2VkTnVtYmVyID0gK2FyZ3VtZW50Rm9yQ29lcmNpb24sXG4gICAgICAgICAgICB2YWx1ZSA9IDA7XG5cbiAgICAgICAgaWYgKGNvZXJjZWROdW1iZXIgIT09IDAgJiYgaXNGaW5pdGUoY29lcmNlZE51bWJlcikpIHtcbiAgICAgICAgICAgIHZhbHVlID0gYWJzRmxvb3IoY29lcmNlZE51bWJlcik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgLy8gY29tcGFyZSB0d28gYXJyYXlzLCByZXR1cm4gdGhlIG51bWJlciBvZiBkaWZmZXJlbmNlc1xuICAgIGZ1bmN0aW9uIGNvbXBhcmVBcnJheXMoYXJyYXkxLCBhcnJheTIsIGRvbnRDb252ZXJ0KSB7XG4gICAgICAgIHZhciBsZW4gPSBNYXRoLm1pbihhcnJheTEubGVuZ3RoLCBhcnJheTIubGVuZ3RoKSxcbiAgICAgICAgICAgIGxlbmd0aERpZmYgPSBNYXRoLmFicyhhcnJheTEubGVuZ3RoIC0gYXJyYXkyLmxlbmd0aCksXG4gICAgICAgICAgICBkaWZmcyA9IDAsXG4gICAgICAgICAgICBpO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGlmICgoZG9udENvbnZlcnQgJiYgYXJyYXkxW2ldICE9PSBhcnJheTJbaV0pIHx8XG4gICAgICAgICAgICAgICAgKCFkb250Q29udmVydCAmJiB0b0ludChhcnJheTFbaV0pICE9PSB0b0ludChhcnJheTJbaV0pKSkge1xuICAgICAgICAgICAgICAgIGRpZmZzKys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRpZmZzICsgbGVuZ3RoRGlmZjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB3YXJuKG1zZykge1xuICAgICAgICBpZiAoaG9va3Muc3VwcHJlc3NEZXByZWNhdGlvbldhcm5pbmdzID09PSBmYWxzZSAmJlxuICAgICAgICAgICAgICAgICh0eXBlb2YgY29uc29sZSAhPT0gICd1bmRlZmluZWQnKSAmJiBjb25zb2xlLndhcm4pIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignRGVwcmVjYXRpb24gd2FybmluZzogJyArIG1zZyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkZXByZWNhdGUobXNnLCBmbikge1xuICAgICAgICB2YXIgZmlyc3RUaW1lID0gdHJ1ZTtcblxuICAgICAgICByZXR1cm4gZXh0ZW5kKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmIChob29rcy5kZXByZWNhdGlvbkhhbmRsZXIgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGhvb2tzLmRlcHJlY2F0aW9uSGFuZGxlcihudWxsLCBtc2cpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZpcnN0VGltZSkge1xuICAgICAgICAgICAgICAgIHZhciBhcmdzID0gW107XG4gICAgICAgICAgICAgICAgdmFyIGFyZztcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBhcmcgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBhcmd1bWVudHNbaV0gPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgKz0gJ1xcblsnICsgaSArICddICc7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gYXJndW1lbnRzWzBdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnICs9IGtleSArICc6ICcgKyBhcmd1bWVudHNbMF1ba2V5XSArICcsICc7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSBhcmcuc2xpY2UoMCwgLTIpOyAvLyBSZW1vdmUgdHJhaWxpbmcgY29tbWEgYW5kIHNwYWNlXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSBhcmd1bWVudHNbaV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYXJncy5wdXNoKGFyZyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHdhcm4obXNnICsgJ1xcbkFyZ3VtZW50czogJyArIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3MpLmpvaW4oJycpICsgJ1xcbicgKyAobmV3IEVycm9yKCkpLnN0YWNrKTtcbiAgICAgICAgICAgICAgICBmaXJzdFRpbWUgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICB9LCBmbik7XG4gICAgfVxuXG4gICAgdmFyIGRlcHJlY2F0aW9ucyA9IHt9O1xuXG4gICAgZnVuY3Rpb24gZGVwcmVjYXRlU2ltcGxlKG5hbWUsIG1zZykge1xuICAgICAgICBpZiAoaG9va3MuZGVwcmVjYXRpb25IYW5kbGVyICE9IG51bGwpIHtcbiAgICAgICAgICAgIGhvb2tzLmRlcHJlY2F0aW9uSGFuZGxlcihuYW1lLCBtc2cpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZGVwcmVjYXRpb25zW25hbWVdKSB7XG4gICAgICAgICAgICB3YXJuKG1zZyk7XG4gICAgICAgICAgICBkZXByZWNhdGlvbnNbbmFtZV0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaG9va3Muc3VwcHJlc3NEZXByZWNhdGlvbldhcm5pbmdzID0gZmFsc2U7XG4gICAgaG9va3MuZGVwcmVjYXRpb25IYW5kbGVyID0gbnVsbDtcblxuICAgIGZ1bmN0aW9uIGlzRnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0IGluc3RhbmNlb2YgRnVuY3Rpb24gfHwgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGlucHV0KSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZXQgKGNvbmZpZykge1xuICAgICAgICB2YXIgcHJvcCwgaTtcbiAgICAgICAgZm9yIChpIGluIGNvbmZpZykge1xuICAgICAgICAgICAgcHJvcCA9IGNvbmZpZ1tpXTtcbiAgICAgICAgICAgIGlmIChpc0Z1bmN0aW9uKHByb3ApKSB7XG4gICAgICAgICAgICAgICAgdGhpc1tpXSA9IHByb3A7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXNbJ18nICsgaV0gPSBwcm9wO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2NvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgLy8gTGVuaWVudCBvcmRpbmFsIHBhcnNpbmcgYWNjZXB0cyBqdXN0IGEgbnVtYmVyIGluIGFkZGl0aW9uIHRvXG4gICAgICAgIC8vIG51bWJlciArIChwb3NzaWJseSkgc3R1ZmYgY29taW5nIGZyb20gX2RheU9mTW9udGhPcmRpbmFsUGFyc2UuXG4gICAgICAgIC8vIFRPRE86IFJlbW92ZSBcIm9yZGluYWxQYXJzZVwiIGZhbGxiYWNrIGluIG5leHQgbWFqb3IgcmVsZWFzZS5cbiAgICAgICAgdGhpcy5fZGF5T2ZNb250aE9yZGluYWxQYXJzZUxlbmllbnQgPSBuZXcgUmVnRXhwKFxuICAgICAgICAgICAgKHRoaXMuX2RheU9mTW9udGhPcmRpbmFsUGFyc2Uuc291cmNlIHx8IHRoaXMuX29yZGluYWxQYXJzZS5zb3VyY2UpICtcbiAgICAgICAgICAgICAgICAnfCcgKyAoL1xcZHsxLDJ9Lykuc291cmNlKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtZXJnZUNvbmZpZ3MocGFyZW50Q29uZmlnLCBjaGlsZENvbmZpZykge1xuICAgICAgICB2YXIgcmVzID0gZXh0ZW5kKHt9LCBwYXJlbnRDb25maWcpLCBwcm9wO1xuICAgICAgICBmb3IgKHByb3AgaW4gY2hpbGRDb25maWcpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd25Qcm9wKGNoaWxkQ29uZmlnLCBwcm9wKSkge1xuICAgICAgICAgICAgICAgIGlmIChpc09iamVjdChwYXJlbnRDb25maWdbcHJvcF0pICYmIGlzT2JqZWN0KGNoaWxkQ29uZmlnW3Byb3BdKSkge1xuICAgICAgICAgICAgICAgICAgICByZXNbcHJvcF0gPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgZXh0ZW5kKHJlc1twcm9wXSwgcGFyZW50Q29uZmlnW3Byb3BdKTtcbiAgICAgICAgICAgICAgICAgICAgZXh0ZW5kKHJlc1twcm9wXSwgY2hpbGRDb25maWdbcHJvcF0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hpbGRDb25maWdbcHJvcF0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICByZXNbcHJvcF0gPSBjaGlsZENvbmZpZ1twcm9wXTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgcmVzW3Byb3BdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKHByb3AgaW4gcGFyZW50Q29uZmlnKSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duUHJvcChwYXJlbnRDb25maWcsIHByb3ApICYmXG4gICAgICAgICAgICAgICAgICAgICFoYXNPd25Qcm9wKGNoaWxkQ29uZmlnLCBwcm9wKSAmJlxuICAgICAgICAgICAgICAgICAgICBpc09iamVjdChwYXJlbnRDb25maWdbcHJvcF0pKSB7XG4gICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIGNoYW5nZXMgdG8gcHJvcGVydGllcyBkb24ndCBtb2RpZnkgcGFyZW50IGNvbmZpZ1xuICAgICAgICAgICAgICAgIHJlc1twcm9wXSA9IGV4dGVuZCh7fSwgcmVzW3Byb3BdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIExvY2FsZShjb25maWcpIHtcbiAgICAgICAgaWYgKGNvbmZpZyAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnNldChjb25maWcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGtleXM7XG5cbiAgICBpZiAoT2JqZWN0LmtleXMpIHtcbiAgICAgICAga2V5cyA9IE9iamVjdC5rZXlzO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGtleXMgPSBmdW5jdGlvbiAob2JqKSB7XG4gICAgICAgICAgICB2YXIgaSwgcmVzID0gW107XG4gICAgICAgICAgICBmb3IgKGkgaW4gb2JqKSB7XG4gICAgICAgICAgICAgICAgaWYgKGhhc093blByb3Aob2JqLCBpKSkge1xuICAgICAgICAgICAgICAgICAgICByZXMucHVzaChpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHZhciBkZWZhdWx0Q2FsZW5kYXIgPSB7XG4gICAgICAgIHNhbWVEYXkgOiAnW1RvZGF5IGF0XSBMVCcsXG4gICAgICAgIG5leHREYXkgOiAnW1RvbW9ycm93IGF0XSBMVCcsXG4gICAgICAgIG5leHRXZWVrIDogJ2RkZGQgW2F0XSBMVCcsXG4gICAgICAgIGxhc3REYXkgOiAnW1llc3RlcmRheSBhdF0gTFQnLFxuICAgICAgICBsYXN0V2VlayA6ICdbTGFzdF0gZGRkZCBbYXRdIExUJyxcbiAgICAgICAgc2FtZUVsc2UgOiAnTCdcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gY2FsZW5kYXIgKGtleSwgbW9tLCBub3cpIHtcbiAgICAgICAgdmFyIG91dHB1dCA9IHRoaXMuX2NhbGVuZGFyW2tleV0gfHwgdGhpcy5fY2FsZW5kYXJbJ3NhbWVFbHNlJ107XG4gICAgICAgIHJldHVybiBpc0Z1bmN0aW9uKG91dHB1dCkgPyBvdXRwdXQuY2FsbChtb20sIG5vdykgOiBvdXRwdXQ7XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRMb25nRGF0ZUZvcm1hdCA9IHtcbiAgICAgICAgTFRTICA6ICdoOm1tOnNzIEEnLFxuICAgICAgICBMVCAgIDogJ2g6bW0gQScsXG4gICAgICAgIEwgICAgOiAnTU0vREQvWVlZWScsXG4gICAgICAgIExMICAgOiAnTU1NTSBELCBZWVlZJyxcbiAgICAgICAgTExMICA6ICdNTU1NIEQsIFlZWVkgaDptbSBBJyxcbiAgICAgICAgTExMTCA6ICdkZGRkLCBNTU1NIEQsIFlZWVkgaDptbSBBJ1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBsb25nRGF0ZUZvcm1hdCAoa2V5KSB7XG4gICAgICAgIHZhciBmb3JtYXQgPSB0aGlzLl9sb25nRGF0ZUZvcm1hdFtrZXldLFxuICAgICAgICAgICAgZm9ybWF0VXBwZXIgPSB0aGlzLl9sb25nRGF0ZUZvcm1hdFtrZXkudG9VcHBlckNhc2UoKV07XG5cbiAgICAgICAgaWYgKGZvcm1hdCB8fCAhZm9ybWF0VXBwZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBmb3JtYXQ7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9sb25nRGF0ZUZvcm1hdFtrZXldID0gZm9ybWF0VXBwZXIucmVwbGFjZSgvTU1NTXxNTXxERHxkZGRkL2csIGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWwuc2xpY2UoMSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB0aGlzLl9sb25nRGF0ZUZvcm1hdFtrZXldO1xuICAgIH1cblxuICAgIHZhciBkZWZhdWx0SW52YWxpZERhdGUgPSAnSW52YWxpZCBkYXRlJztcblxuICAgIGZ1bmN0aW9uIGludmFsaWREYXRlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ludmFsaWREYXRlO1xuICAgIH1cblxuICAgIHZhciBkZWZhdWx0T3JkaW5hbCA9ICclZCc7XG4gICAgdmFyIGRlZmF1bHREYXlPZk1vbnRoT3JkaW5hbFBhcnNlID0gL1xcZHsxLDJ9LztcblxuICAgIGZ1bmN0aW9uIG9yZGluYWwgKG51bWJlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5fb3JkaW5hbC5yZXBsYWNlKCclZCcsIG51bWJlcik7XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRSZWxhdGl2ZVRpbWUgPSB7XG4gICAgICAgIGZ1dHVyZSA6ICdpbiAlcycsXG4gICAgICAgIHBhc3QgICA6ICclcyBhZ28nLFxuICAgICAgICBzICA6ICdhIGZldyBzZWNvbmRzJyxcbiAgICAgICAgc3MgOiAnJWQgc2Vjb25kcycsXG4gICAgICAgIG0gIDogJ2EgbWludXRlJyxcbiAgICAgICAgbW0gOiAnJWQgbWludXRlcycsXG4gICAgICAgIGggIDogJ2FuIGhvdXInLFxuICAgICAgICBoaCA6ICclZCBob3VycycsXG4gICAgICAgIGQgIDogJ2EgZGF5JyxcbiAgICAgICAgZGQgOiAnJWQgZGF5cycsXG4gICAgICAgIE0gIDogJ2EgbW9udGgnLFxuICAgICAgICBNTSA6ICclZCBtb250aHMnLFxuICAgICAgICB5ICA6ICdhIHllYXInLFxuICAgICAgICB5eSA6ICclZCB5ZWFycydcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gcmVsYXRpdmVUaW1lIChudW1iZXIsIHdpdGhvdXRTdWZmaXgsIHN0cmluZywgaXNGdXR1cmUpIHtcbiAgICAgICAgdmFyIG91dHB1dCA9IHRoaXMuX3JlbGF0aXZlVGltZVtzdHJpbmddO1xuICAgICAgICByZXR1cm4gKGlzRnVuY3Rpb24ob3V0cHV0KSkgP1xuICAgICAgICAgICAgb3V0cHV0KG51bWJlciwgd2l0aG91dFN1ZmZpeCwgc3RyaW5nLCBpc0Z1dHVyZSkgOlxuICAgICAgICAgICAgb3V0cHV0LnJlcGxhY2UoLyVkL2ksIG51bWJlcik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGFzdEZ1dHVyZSAoZGlmZiwgb3V0cHV0KSB7XG4gICAgICAgIHZhciBmb3JtYXQgPSB0aGlzLl9yZWxhdGl2ZVRpbWVbZGlmZiA+IDAgPyAnZnV0dXJlJyA6ICdwYXN0J107XG4gICAgICAgIHJldHVybiBpc0Z1bmN0aW9uKGZvcm1hdCkgPyBmb3JtYXQob3V0cHV0KSA6IGZvcm1hdC5yZXBsYWNlKC8lcy9pLCBvdXRwdXQpO1xuICAgIH1cblxuICAgIHZhciBhbGlhc2VzID0ge307XG5cbiAgICBmdW5jdGlvbiBhZGRVbml0QWxpYXMgKHVuaXQsIHNob3J0aGFuZCkge1xuICAgICAgICB2YXIgbG93ZXJDYXNlID0gdW5pdC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBhbGlhc2VzW2xvd2VyQ2FzZV0gPSBhbGlhc2VzW2xvd2VyQ2FzZSArICdzJ10gPSBhbGlhc2VzW3Nob3J0aGFuZF0gPSB1bml0O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZVVuaXRzKHVuaXRzKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdW5pdHMgPT09ICdzdHJpbmcnID8gYWxpYXNlc1t1bml0c10gfHwgYWxpYXNlc1t1bml0cy50b0xvd2VyQ2FzZSgpXSA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBub3JtYWxpemVPYmplY3RVbml0cyhpbnB1dE9iamVjdCkge1xuICAgICAgICB2YXIgbm9ybWFsaXplZElucHV0ID0ge30sXG4gICAgICAgICAgICBub3JtYWxpemVkUHJvcCxcbiAgICAgICAgICAgIHByb3A7XG5cbiAgICAgICAgZm9yIChwcm9wIGluIGlucHV0T2JqZWN0KSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duUHJvcChpbnB1dE9iamVjdCwgcHJvcCkpIHtcbiAgICAgICAgICAgICAgICBub3JtYWxpemVkUHJvcCA9IG5vcm1hbGl6ZVVuaXRzKHByb3ApO1xuICAgICAgICAgICAgICAgIGlmIChub3JtYWxpemVkUHJvcCkge1xuICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkSW5wdXRbbm9ybWFsaXplZFByb3BdID0gaW5wdXRPYmplY3RbcHJvcF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRJbnB1dDtcbiAgICB9XG5cbiAgICB2YXIgcHJpb3JpdGllcyA9IHt9O1xuXG4gICAgZnVuY3Rpb24gYWRkVW5pdFByaW9yaXR5KHVuaXQsIHByaW9yaXR5KSB7XG4gICAgICAgIHByaW9yaXRpZXNbdW5pdF0gPSBwcmlvcml0eTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRQcmlvcml0aXplZFVuaXRzKHVuaXRzT2JqKSB7XG4gICAgICAgIHZhciB1bml0cyA9IFtdO1xuICAgICAgICBmb3IgKHZhciB1IGluIHVuaXRzT2JqKSB7XG4gICAgICAgICAgICB1bml0cy5wdXNoKHt1bml0OiB1LCBwcmlvcml0eTogcHJpb3JpdGllc1t1XX0pO1xuICAgICAgICB9XG4gICAgICAgIHVuaXRzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgIHJldHVybiBhLnByaW9yaXR5IC0gYi5wcmlvcml0eTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB1bml0cztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB6ZXJvRmlsbChudW1iZXIsIHRhcmdldExlbmd0aCwgZm9yY2VTaWduKSB7XG4gICAgICAgIHZhciBhYnNOdW1iZXIgPSAnJyArIE1hdGguYWJzKG51bWJlciksXG4gICAgICAgICAgICB6ZXJvc1RvRmlsbCA9IHRhcmdldExlbmd0aCAtIGFic051bWJlci5sZW5ndGgsXG4gICAgICAgICAgICBzaWduID0gbnVtYmVyID49IDA7XG4gICAgICAgIHJldHVybiAoc2lnbiA/IChmb3JjZVNpZ24gPyAnKycgOiAnJykgOiAnLScpICtcbiAgICAgICAgICAgIE1hdGgucG93KDEwLCBNYXRoLm1heCgwLCB6ZXJvc1RvRmlsbCkpLnRvU3RyaW5nKCkuc3Vic3RyKDEpICsgYWJzTnVtYmVyO1xuICAgIH1cblxuICAgIHZhciBmb3JtYXR0aW5nVG9rZW5zID0gLyhcXFtbXlxcW10qXFxdKXwoXFxcXCk/KFtIaF1tbShzcyk/fE1vfE1NP00/TT98RG98REREb3xERD9EP0Q/fGRkZD9kP3xkbz98d1tvfHddP3xXW298V10/fFFvP3xZWVlZWVl8WVlZWVl8WVlZWXxZWXxnZyhnZ2c/KT98R0coR0dHPyk/fGV8RXxhfEF8aGg/fEhIP3xraz98bW0/fHNzP3xTezEsOX18eHxYfHp6P3xaWj98LikvZztcblxuICAgIHZhciBsb2NhbEZvcm1hdHRpbmdUb2tlbnMgPSAvKFxcW1teXFxbXSpcXF0pfChcXFxcKT8oTFRTfExUfExMP0w/TD98bHsxLDR9KS9nO1xuXG4gICAgdmFyIGZvcm1hdEZ1bmN0aW9ucyA9IHt9O1xuXG4gICAgdmFyIGZvcm1hdFRva2VuRnVuY3Rpb25zID0ge307XG5cbiAgICAvLyB0b2tlbjogICAgJ00nXG4gICAgLy8gcGFkZGVkOiAgIFsnTU0nLCAyXVxuICAgIC8vIG9yZGluYWw6ICAnTW8nXG4gICAgLy8gY2FsbGJhY2s6IGZ1bmN0aW9uICgpIHsgdGhpcy5tb250aCgpICsgMSB9XG4gICAgZnVuY3Rpb24gYWRkRm9ybWF0VG9rZW4gKHRva2VuLCBwYWRkZWQsIG9yZGluYWwsIGNhbGxiYWNrKSB7XG4gICAgICAgIHZhciBmdW5jID0gY2FsbGJhY2s7XG4gICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBmdW5jID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW2NhbGxiYWNrXSgpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodG9rZW4pIHtcbiAgICAgICAgICAgIGZvcm1hdFRva2VuRnVuY3Rpb25zW3Rva2VuXSA9IGZ1bmM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhZGRlZCkge1xuICAgICAgICAgICAgZm9ybWF0VG9rZW5GdW5jdGlvbnNbcGFkZGVkWzBdXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gemVyb0ZpbGwoZnVuYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpLCBwYWRkZWRbMV0sIHBhZGRlZFsyXSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcmRpbmFsKSB7XG4gICAgICAgICAgICBmb3JtYXRUb2tlbkZ1bmN0aW9uc1tvcmRpbmFsXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkub3JkaW5hbChmdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksIHRva2VuKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZW1vdmVGb3JtYXR0aW5nVG9rZW5zKGlucHV0KSB7XG4gICAgICAgIGlmIChpbnB1dC5tYXRjaCgvXFxbW1xcc1xcU10vKSkge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0LnJlcGxhY2UoL15cXFt8XFxdJC9nLCAnJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlucHV0LnJlcGxhY2UoL1xcXFwvZywgJycpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1ha2VGb3JtYXRGdW5jdGlvbihmb3JtYXQpIHtcbiAgICAgICAgdmFyIGFycmF5ID0gZm9ybWF0Lm1hdGNoKGZvcm1hdHRpbmdUb2tlbnMpLCBpLCBsZW5ndGg7XG5cbiAgICAgICAgZm9yIChpID0gMCwgbGVuZ3RoID0gYXJyYXkubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChmb3JtYXRUb2tlbkZ1bmN0aW9uc1thcnJheVtpXV0pIHtcbiAgICAgICAgICAgICAgICBhcnJheVtpXSA9IGZvcm1hdFRva2VuRnVuY3Rpb25zW2FycmF5W2ldXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYXJyYXlbaV0gPSByZW1vdmVGb3JtYXR0aW5nVG9rZW5zKGFycmF5W2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAobW9tKSB7XG4gICAgICAgICAgICB2YXIgb3V0cHV0ID0gJycsIGk7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBvdXRwdXQgKz0gaXNGdW5jdGlvbihhcnJheVtpXSkgPyBhcnJheVtpXS5jYWxsKG1vbSwgZm9ybWF0KSA6IGFycmF5W2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBmb3JtYXQgZGF0ZSB1c2luZyBuYXRpdmUgZGF0ZSBvYmplY3RcbiAgICBmdW5jdGlvbiBmb3JtYXRNb21lbnQobSwgZm9ybWF0KSB7XG4gICAgICAgIGlmICghbS5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBtLmxvY2FsZURhdGEoKS5pbnZhbGlkRGF0ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9ybWF0ID0gZXhwYW5kRm9ybWF0KGZvcm1hdCwgbS5sb2NhbGVEYXRhKCkpO1xuICAgICAgICBmb3JtYXRGdW5jdGlvbnNbZm9ybWF0XSA9IGZvcm1hdEZ1bmN0aW9uc1tmb3JtYXRdIHx8IG1ha2VGb3JtYXRGdW5jdGlvbihmb3JtYXQpO1xuXG4gICAgICAgIHJldHVybiBmb3JtYXRGdW5jdGlvbnNbZm9ybWF0XShtKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBleHBhbmRGb3JtYXQoZm9ybWF0LCBsb2NhbGUpIHtcbiAgICAgICAgdmFyIGkgPSA1O1xuXG4gICAgICAgIGZ1bmN0aW9uIHJlcGxhY2VMb25nRGF0ZUZvcm1hdFRva2VucyhpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsZS5sb25nRGF0ZUZvcm1hdChpbnB1dCkgfHwgaW5wdXQ7XG4gICAgICAgIH1cblxuICAgICAgICBsb2NhbEZvcm1hdHRpbmdUb2tlbnMubGFzdEluZGV4ID0gMDtcbiAgICAgICAgd2hpbGUgKGkgPj0gMCAmJiBsb2NhbEZvcm1hdHRpbmdUb2tlbnMudGVzdChmb3JtYXQpKSB7XG4gICAgICAgICAgICBmb3JtYXQgPSBmb3JtYXQucmVwbGFjZShsb2NhbEZvcm1hdHRpbmdUb2tlbnMsIHJlcGxhY2VMb25nRGF0ZUZvcm1hdFRva2Vucyk7XG4gICAgICAgICAgICBsb2NhbEZvcm1hdHRpbmdUb2tlbnMubGFzdEluZGV4ID0gMDtcbiAgICAgICAgICAgIGkgLT0gMTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmb3JtYXQ7XG4gICAgfVxuXG4gICAgdmFyIG1hdGNoMSAgICAgICAgID0gL1xcZC87ICAgICAgICAgICAgLy8gICAgICAgMCAtIDlcbiAgICB2YXIgbWF0Y2gyICAgICAgICAgPSAvXFxkXFxkLzsgICAgICAgICAgLy8gICAgICAwMCAtIDk5XG4gICAgdmFyIG1hdGNoMyAgICAgICAgID0gL1xcZHszfS87ICAgICAgICAgLy8gICAgIDAwMCAtIDk5OVxuICAgIHZhciBtYXRjaDQgICAgICAgICA9IC9cXGR7NH0vOyAgICAgICAgIC8vICAgIDAwMDAgLSA5OTk5XG4gICAgdmFyIG1hdGNoNiAgICAgICAgID0gL1srLV0/XFxkezZ9LzsgICAgLy8gLTk5OTk5OSAtIDk5OTk5OVxuICAgIHZhciBtYXRjaDF0bzIgICAgICA9IC9cXGRcXGQ/LzsgICAgICAgICAvLyAgICAgICAwIC0gOTlcbiAgICB2YXIgbWF0Y2gzdG80ICAgICAgPSAvXFxkXFxkXFxkXFxkPy87ICAgICAvLyAgICAgOTk5IC0gOTk5OVxuICAgIHZhciBtYXRjaDV0bzYgICAgICA9IC9cXGRcXGRcXGRcXGRcXGRcXGQ/LzsgLy8gICA5OTk5OSAtIDk5OTk5OVxuICAgIHZhciBtYXRjaDF0bzMgICAgICA9IC9cXGR7MSwzfS87ICAgICAgIC8vICAgICAgIDAgLSA5OTlcbiAgICB2YXIgbWF0Y2gxdG80ICAgICAgPSAvXFxkezEsNH0vOyAgICAgICAvLyAgICAgICAwIC0gOTk5OVxuICAgIHZhciBtYXRjaDF0bzYgICAgICA9IC9bKy1dP1xcZHsxLDZ9LzsgIC8vIC05OTk5OTkgLSA5OTk5OTlcblxuICAgIHZhciBtYXRjaFVuc2lnbmVkICA9IC9cXGQrLzsgICAgICAgICAgIC8vICAgICAgIDAgLSBpbmZcbiAgICB2YXIgbWF0Y2hTaWduZWQgICAgPSAvWystXT9cXGQrLzsgICAgICAvLyAgICAtaW5mIC0gaW5mXG5cbiAgICB2YXIgbWF0Y2hPZmZzZXQgICAgPSAvWnxbKy1dXFxkXFxkOj9cXGRcXGQvZ2k7IC8vICswMDowMCAtMDA6MDAgKzAwMDAgLTAwMDAgb3IgWlxuICAgIHZhciBtYXRjaFNob3J0T2Zmc2V0ID0gL1p8WystXVxcZFxcZCg/Ojo/XFxkXFxkKT8vZ2k7IC8vICswMCAtMDAgKzAwOjAwIC0wMDowMCArMDAwMCAtMDAwMCBvciBaXG5cbiAgICB2YXIgbWF0Y2hUaW1lc3RhbXAgPSAvWystXT9cXGQrKFxcLlxcZHsxLDN9KT8vOyAvLyAxMjM0NTY3ODkgMTIzNDU2Nzg5LjEyM1xuXG4gICAgLy8gYW55IHdvcmQgKG9yIHR3bykgY2hhcmFjdGVycyBvciBudW1iZXJzIGluY2x1ZGluZyB0d28vdGhyZWUgd29yZCBtb250aCBpbiBhcmFiaWMuXG4gICAgLy8gaW5jbHVkZXMgc2NvdHRpc2ggZ2FlbGljIHR3byB3b3JkIGFuZCBoeXBoZW5hdGVkIG1vbnRoc1xuICAgIHZhciBtYXRjaFdvcmQgPSAvWzAtOV17MCwyNTZ9WydhLXpcXHUwMEEwLVxcdTA1RkZcXHUwNzAwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGMDdcXHVGRjEwLVxcdUZGRUZdezEsMjU2fXxbXFx1MDYwMC1cXHUwNkZGXFwvXXsxLDI1Nn0oXFxzKj9bXFx1MDYwMC1cXHUwNkZGXXsxLDI1Nn0pezEsMn0vaTtcblxuICAgIHZhciByZWdleGVzID0ge307XG5cbiAgICBmdW5jdGlvbiBhZGRSZWdleFRva2VuICh0b2tlbiwgcmVnZXgsIHN0cmljdFJlZ2V4KSB7XG4gICAgICAgIHJlZ2V4ZXNbdG9rZW5dID0gaXNGdW5jdGlvbihyZWdleCkgPyByZWdleCA6IGZ1bmN0aW9uIChpc1N0cmljdCwgbG9jYWxlRGF0YSkge1xuICAgICAgICAgICAgcmV0dXJuIChpc1N0cmljdCAmJiBzdHJpY3RSZWdleCkgPyBzdHJpY3RSZWdleCA6IHJlZ2V4O1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFBhcnNlUmVnZXhGb3JUb2tlbiAodG9rZW4sIGNvbmZpZykge1xuICAgICAgICBpZiAoIWhhc093blByb3AocmVnZXhlcywgdG9rZW4pKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cCh1bmVzY2FwZUZvcm1hdCh0b2tlbikpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlZ2V4ZXNbdG9rZW5dKGNvbmZpZy5fc3RyaWN0LCBjb25maWcuX2xvY2FsZSk7XG4gICAgfVxuXG4gICAgLy8gQ29kZSBmcm9tIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzU2MTQ5My9pcy10aGVyZS1hLXJlZ2V4cC1lc2NhcGUtZnVuY3Rpb24taW4tamF2YXNjcmlwdFxuICAgIGZ1bmN0aW9uIHVuZXNjYXBlRm9ybWF0KHMpIHtcbiAgICAgICAgcmV0dXJuIHJlZ2V4RXNjYXBlKHMucmVwbGFjZSgnXFxcXCcsICcnKS5yZXBsYWNlKC9cXFxcKFxcWyl8XFxcXChcXF0pfFxcWyhbXlxcXVxcW10qKVxcXXxcXFxcKC4pL2csIGZ1bmN0aW9uIChtYXRjaGVkLCBwMSwgcDIsIHAzLCBwNCkge1xuICAgICAgICAgICAgcmV0dXJuIHAxIHx8IHAyIHx8IHAzIHx8IHA0O1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVnZXhFc2NhcGUocykge1xuICAgICAgICByZXR1cm4gcy5yZXBsYWNlKC9bLVxcL1xcXFxeJCorPy4oKXxbXFxde31dL2csICdcXFxcJCYnKTtcbiAgICB9XG5cbiAgICB2YXIgdG9rZW5zID0ge307XG5cbiAgICBmdW5jdGlvbiBhZGRQYXJzZVRva2VuICh0b2tlbiwgY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIGksIGZ1bmMgPSBjYWxsYmFjaztcbiAgICAgICAgaWYgKHR5cGVvZiB0b2tlbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRva2VuID0gW3Rva2VuXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNOdW1iZXIoY2FsbGJhY2spKSB7XG4gICAgICAgICAgICBmdW5jID0gZnVuY3Rpb24gKGlucHV0LCBhcnJheSkge1xuICAgICAgICAgICAgICAgIGFycmF5W2NhbGxiYWNrXSA9IHRvSW50KGlucHV0KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHRva2VuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0b2tlbnNbdG9rZW5baV1dID0gZnVuYztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFkZFdlZWtQYXJzZVRva2VuICh0b2tlbiwgY2FsbGJhY2spIHtcbiAgICAgICAgYWRkUGFyc2VUb2tlbih0b2tlbiwgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnLCB0b2tlbikge1xuICAgICAgICAgICAgY29uZmlnLl93ID0gY29uZmlnLl93IHx8IHt9O1xuICAgICAgICAgICAgY2FsbGJhY2soaW5wdXQsIGNvbmZpZy5fdywgY29uZmlnLCB0b2tlbik7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFkZFRpbWVUb0FycmF5RnJvbVRva2VuKHRva2VuLCBpbnB1dCwgY29uZmlnKSB7XG4gICAgICAgIGlmIChpbnB1dCAhPSBudWxsICYmIGhhc093blByb3AodG9rZW5zLCB0b2tlbikpIHtcbiAgICAgICAgICAgIHRva2Vuc1t0b2tlbl0oaW5wdXQsIGNvbmZpZy5fYSwgY29uZmlnLCB0b2tlbik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgWUVBUiA9IDA7XG4gICAgdmFyIE1PTlRIID0gMTtcbiAgICB2YXIgREFURSA9IDI7XG4gICAgdmFyIEhPVVIgPSAzO1xuICAgIHZhciBNSU5VVEUgPSA0O1xuICAgIHZhciBTRUNPTkQgPSA1O1xuICAgIHZhciBNSUxMSVNFQ09ORCA9IDY7XG4gICAgdmFyIFdFRUsgPSA3O1xuICAgIHZhciBXRUVLREFZID0gODtcblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCdZJywgMCwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgeSA9IHRoaXMueWVhcigpO1xuICAgICAgICByZXR1cm4geSA8PSA5OTk5ID8gJycgKyB5IDogJysnICsgeTtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnWVknLCAyXSwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy55ZWFyKCkgJSAxMDA7XG4gICAgfSk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1lZWVknLCAgIDRdLCAgICAgICAwLCAneWVhcicpO1xuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnWVlZWVknLCAgNV0sICAgICAgIDAsICd5ZWFyJyk7XG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydZWVlZWVknLCA2LCB0cnVlXSwgMCwgJ3llYXInKTtcblxuICAgIC8vIEFMSUFTRVNcblxuICAgIGFkZFVuaXRBbGlhcygneWVhcicsICd5Jyk7XG5cbiAgICAvLyBQUklPUklUSUVTXG5cbiAgICBhZGRVbml0UHJpb3JpdHkoJ3llYXInLCAxKTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ1knLCAgICAgIG1hdGNoU2lnbmVkKTtcbiAgICBhZGRSZWdleFRva2VuKCdZWScsICAgICBtYXRjaDF0bzIsIG1hdGNoMik7XG4gICAgYWRkUmVnZXhUb2tlbignWVlZWScsICAgbWF0Y2gxdG80LCBtYXRjaDQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ1lZWVlZJywgIG1hdGNoMXRvNiwgbWF0Y2g2KTtcbiAgICBhZGRSZWdleFRva2VuKCdZWVlZWVknLCBtYXRjaDF0bzYsIG1hdGNoNik7XG5cbiAgICBhZGRQYXJzZVRva2VuKFsnWVlZWVknLCAnWVlZWVlZJ10sIFlFQVIpO1xuICAgIGFkZFBhcnNlVG9rZW4oJ1lZWVknLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5KSB7XG4gICAgICAgIGFycmF5W1lFQVJdID0gaW5wdXQubGVuZ3RoID09PSAyID8gaG9va3MucGFyc2VUd29EaWdpdFllYXIoaW5wdXQpIDogdG9JbnQoaW5wdXQpO1xuICAgIH0pO1xuICAgIGFkZFBhcnNlVG9rZW4oJ1lZJywgZnVuY3Rpb24gKGlucHV0LCBhcnJheSkge1xuICAgICAgICBhcnJheVtZRUFSXSA9IGhvb2tzLnBhcnNlVHdvRGlnaXRZZWFyKGlucHV0KTtcbiAgICB9KTtcbiAgICBhZGRQYXJzZVRva2VuKCdZJywgZnVuY3Rpb24gKGlucHV0LCBhcnJheSkge1xuICAgICAgICBhcnJheVtZRUFSXSA9IHBhcnNlSW50KGlucHV0LCAxMCk7XG4gICAgfSk7XG5cbiAgICAvLyBIRUxQRVJTXG5cbiAgICBmdW5jdGlvbiBkYXlzSW5ZZWFyKHllYXIpIHtcbiAgICAgICAgcmV0dXJuIGlzTGVhcFllYXIoeWVhcikgPyAzNjYgOiAzNjU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNMZWFwWWVhcih5ZWFyKSB7XG4gICAgICAgIHJldHVybiAoeWVhciAlIDQgPT09IDAgJiYgeWVhciAlIDEwMCAhPT0gMCkgfHwgeWVhciAlIDQwMCA9PT0gMDtcbiAgICB9XG5cbiAgICAvLyBIT09LU1xuXG4gICAgaG9va3MucGFyc2VUd29EaWdpdFllYXIgPSBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIHRvSW50KGlucHV0KSArICh0b0ludChpbnB1dCkgPiA2OCA/IDE5MDAgOiAyMDAwKTtcbiAgICB9O1xuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgdmFyIGdldFNldFllYXIgPSBtYWtlR2V0U2V0KCdGdWxsWWVhcicsIHRydWUpO1xuXG4gICAgZnVuY3Rpb24gZ2V0SXNMZWFwWWVhciAoKSB7XG4gICAgICAgIHJldHVybiBpc0xlYXBZZWFyKHRoaXMueWVhcigpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtYWtlR2V0U2V0ICh1bml0LCBrZWVwVGltZSkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHNldCQxKHRoaXMsIHVuaXQsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICBob29rcy51cGRhdGVPZmZzZXQodGhpcywga2VlcFRpbWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0KHRoaXMsIHVuaXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldCAobW9tLCB1bml0KSB7XG4gICAgICAgIHJldHVybiBtb20uaXNWYWxpZCgpID9cbiAgICAgICAgICAgIG1vbS5fZFsnZ2V0JyArIChtb20uX2lzVVRDID8gJ1VUQycgOiAnJykgKyB1bml0XSgpIDogTmFOO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldCQxIChtb20sIHVuaXQsIHZhbHVlKSB7XG4gICAgICAgIGlmIChtb20uaXNWYWxpZCgpICYmICFpc05hTih2YWx1ZSkpIHtcbiAgICAgICAgICAgIGlmICh1bml0ID09PSAnRnVsbFllYXInICYmIGlzTGVhcFllYXIobW9tLnllYXIoKSkgJiYgbW9tLm1vbnRoKCkgPT09IDEgJiYgbW9tLmRhdGUoKSA9PT0gMjkpIHtcbiAgICAgICAgICAgICAgICBtb20uX2RbJ3NldCcgKyAobW9tLl9pc1VUQyA/ICdVVEMnIDogJycpICsgdW5pdF0odmFsdWUsIG1vbS5tb250aCgpLCBkYXlzSW5Nb250aCh2YWx1ZSwgbW9tLm1vbnRoKCkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG1vbS5fZFsnc2V0JyArIChtb20uX2lzVVRDID8gJ1VUQycgOiAnJykgKyB1bml0XSh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICBmdW5jdGlvbiBzdHJpbmdHZXQgKHVuaXRzKSB7XG4gICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHModW5pdHMpO1xuICAgICAgICBpZiAoaXNGdW5jdGlvbih0aGlzW3VuaXRzXSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzW3VuaXRzXSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuXG4gICAgZnVuY3Rpb24gc3RyaW5nU2V0ICh1bml0cywgdmFsdWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB1bml0cyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHVuaXRzID0gbm9ybWFsaXplT2JqZWN0VW5pdHModW5pdHMpO1xuICAgICAgICAgICAgdmFyIHByaW9yaXRpemVkID0gZ2V0UHJpb3JpdGl6ZWRVbml0cyh1bml0cyk7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByaW9yaXRpemVkLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdGhpc1twcmlvcml0aXplZFtpXS51bml0XSh1bml0c1twcmlvcml0aXplZFtpXS51bml0XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB1bml0cyA9IG5vcm1hbGl6ZVVuaXRzKHVuaXRzKTtcbiAgICAgICAgICAgIGlmIChpc0Z1bmN0aW9uKHRoaXNbdW5pdHNdKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW3VuaXRzXSh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbW9kKG4sIHgpIHtcbiAgICAgICAgcmV0dXJuICgobiAlIHgpICsgeCkgJSB4O1xuICAgIH1cblxuICAgIHZhciBpbmRleE9mO1xuXG4gICAgaWYgKEFycmF5LnByb3RvdHlwZS5pbmRleE9mKSB7XG4gICAgICAgIGluZGV4T2YgPSBBcnJheS5wcm90b3R5cGUuaW5kZXhPZjtcbiAgICB9IGVsc2Uge1xuICAgICAgICBpbmRleE9mID0gZnVuY3Rpb24gKG8pIHtcbiAgICAgICAgICAgIC8vIEkga25vd1xuICAgICAgICAgICAgdmFyIGk7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzW2ldID09PSBvKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkYXlzSW5Nb250aCh5ZWFyLCBtb250aCkge1xuICAgICAgICBpZiAoaXNOYU4oeWVhcikgfHwgaXNOYU4obW9udGgpKSB7XG4gICAgICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgICB9XG4gICAgICAgIHZhciBtb2RNb250aCA9IG1vZChtb250aCwgMTIpO1xuICAgICAgICB5ZWFyICs9IChtb250aCAtIG1vZE1vbnRoKSAvIDEyO1xuICAgICAgICByZXR1cm4gbW9kTW9udGggPT09IDEgPyAoaXNMZWFwWWVhcih5ZWFyKSA/IDI5IDogMjgpIDogKDMxIC0gbW9kTW9udGggJSA3ICUgMik7XG4gICAgfVxuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ00nLCBbJ01NJywgMl0sICdNbycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubW9udGgoKSArIDE7XG4gICAgfSk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbignTU1NJywgMCwgMCwgZnVuY3Rpb24gKGZvcm1hdCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkubW9udGhzU2hvcnQodGhpcywgZm9ybWF0KTtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKCdNTU1NJywgMCwgMCwgZnVuY3Rpb24gKGZvcm1hdCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkubW9udGhzKHRoaXMsIGZvcm1hdCk7XG4gICAgfSk7XG5cbiAgICAvLyBBTElBU0VTXG5cbiAgICBhZGRVbml0QWxpYXMoJ21vbnRoJywgJ00nKTtcblxuICAgIC8vIFBSSU9SSVRZXG5cbiAgICBhZGRVbml0UHJpb3JpdHkoJ21vbnRoJywgOCk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCdNJywgICAgbWF0Y2gxdG8yKTtcbiAgICBhZGRSZWdleFRva2VuKCdNTScsICAgbWF0Y2gxdG8yLCBtYXRjaDIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ01NTScsICBmdW5jdGlvbiAoaXNTdHJpY3QsIGxvY2FsZSkge1xuICAgICAgICByZXR1cm4gbG9jYWxlLm1vbnRoc1Nob3J0UmVnZXgoaXNTdHJpY3QpO1xuICAgIH0pO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ01NTU0nLCBmdW5jdGlvbiAoaXNTdHJpY3QsIGxvY2FsZSkge1xuICAgICAgICByZXR1cm4gbG9jYWxlLm1vbnRoc1JlZ2V4KGlzU3RyaWN0KTtcbiAgICB9KTtcblxuICAgIGFkZFBhcnNlVG9rZW4oWydNJywgJ01NJ10sIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXkpIHtcbiAgICAgICAgYXJyYXlbTU9OVEhdID0gdG9JbnQoaW5wdXQpIC0gMTtcbiAgICB9KTtcblxuICAgIGFkZFBhcnNlVG9rZW4oWydNTU0nLCAnTU1NTSddLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcsIHRva2VuKSB7XG4gICAgICAgIHZhciBtb250aCA9IGNvbmZpZy5fbG9jYWxlLm1vbnRoc1BhcnNlKGlucHV0LCB0b2tlbiwgY29uZmlnLl9zdHJpY3QpO1xuICAgICAgICAvLyBpZiB3ZSBkaWRuJ3QgZmluZCBhIG1vbnRoIG5hbWUsIG1hcmsgdGhlIGRhdGUgYXMgaW52YWxpZC5cbiAgICAgICAgaWYgKG1vbnRoICE9IG51bGwpIHtcbiAgICAgICAgICAgIGFycmF5W01PTlRIXSA9IG1vbnRoO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuaW52YWxpZE1vbnRoID0gaW5wdXQ7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIExPQ0FMRVNcblxuICAgIHZhciBNT05USFNfSU5fRk9STUFUID0gL0Rbb0RdPyhcXFtbXlxcW1xcXV0qXFxdfFxccykrTU1NTT8vO1xuICAgIHZhciBkZWZhdWx0TG9jYWxlTW9udGhzID0gJ0phbnVhcnlfRmVicnVhcnlfTWFyY2hfQXByaWxfTWF5X0p1bmVfSnVseV9BdWd1c3RfU2VwdGVtYmVyX09jdG9iZXJfTm92ZW1iZXJfRGVjZW1iZXInLnNwbGl0KCdfJyk7XG4gICAgZnVuY3Rpb24gbG9jYWxlTW9udGhzIChtLCBmb3JtYXQpIHtcbiAgICAgICAgaWYgKCFtKSB7XG4gICAgICAgICAgICByZXR1cm4gaXNBcnJheSh0aGlzLl9tb250aHMpID8gdGhpcy5fbW9udGhzIDpcbiAgICAgICAgICAgICAgICB0aGlzLl9tb250aHNbJ3N0YW5kYWxvbmUnXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXNBcnJheSh0aGlzLl9tb250aHMpID8gdGhpcy5fbW9udGhzW20ubW9udGgoKV0gOlxuICAgICAgICAgICAgdGhpcy5fbW9udGhzWyh0aGlzLl9tb250aHMuaXNGb3JtYXQgfHwgTU9OVEhTX0lOX0ZPUk1BVCkudGVzdChmb3JtYXQpID8gJ2Zvcm1hdCcgOiAnc3RhbmRhbG9uZSddW20ubW9udGgoKV07XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRMb2NhbGVNb250aHNTaG9ydCA9ICdKYW5fRmViX01hcl9BcHJfTWF5X0p1bl9KdWxfQXVnX1NlcF9PY3RfTm92X0RlYycuc3BsaXQoJ18nKTtcbiAgICBmdW5jdGlvbiBsb2NhbGVNb250aHNTaG9ydCAobSwgZm9ybWF0KSB7XG4gICAgICAgIGlmICghbSkge1xuICAgICAgICAgICAgcmV0dXJuIGlzQXJyYXkodGhpcy5fbW9udGhzU2hvcnQpID8gdGhpcy5fbW9udGhzU2hvcnQgOlxuICAgICAgICAgICAgICAgIHRoaXMuX21vbnRoc1Nob3J0WydzdGFuZGFsb25lJ107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzQXJyYXkodGhpcy5fbW9udGhzU2hvcnQpID8gdGhpcy5fbW9udGhzU2hvcnRbbS5tb250aCgpXSA6XG4gICAgICAgICAgICB0aGlzLl9tb250aHNTaG9ydFtNT05USFNfSU5fRk9STUFULnRlc3QoZm9ybWF0KSA/ICdmb3JtYXQnIDogJ3N0YW5kYWxvbmUnXVttLm1vbnRoKCldO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGhhbmRsZVN0cmljdFBhcnNlKG1vbnRoTmFtZSwgZm9ybWF0LCBzdHJpY3QpIHtcbiAgICAgICAgdmFyIGksIGlpLCBtb20sIGxsYyA9IG1vbnRoTmFtZS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoIXRoaXMuX21vbnRoc1BhcnNlKSB7XG4gICAgICAgICAgICAvLyB0aGlzIGlzIG5vdCB1c2VkXG4gICAgICAgICAgICB0aGlzLl9tb250aHNQYXJzZSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fbG9uZ01vbnRoc1BhcnNlID0gW107XG4gICAgICAgICAgICB0aGlzLl9zaG9ydE1vbnRoc1BhcnNlID0gW107XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTI7ICsraSkge1xuICAgICAgICAgICAgICAgIG1vbSA9IGNyZWF0ZVVUQyhbMjAwMCwgaV0pO1xuICAgICAgICAgICAgICAgIHRoaXMuX3Nob3J0TW9udGhzUGFyc2VbaV0gPSB0aGlzLm1vbnRoc1Nob3J0KG1vbSwgJycpLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fbG9uZ01vbnRoc1BhcnNlW2ldID0gdGhpcy5tb250aHMobW9tLCAnJykudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdHJpY3QpIHtcbiAgICAgICAgICAgIGlmIChmb3JtYXQgPT09ICdNTU0nKSB7XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fc2hvcnRNb250aHNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9sb25nTW9udGhzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlpICE9PSAtMSA/IGlpIDogbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChmb3JtYXQgPT09ICdNTU0nKSB7XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fc2hvcnRNb250aHNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICBpZiAoaWkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fbG9uZ01vbnRoc1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpaSAhPT0gLTEgPyBpaSA6IG51bGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX2xvbmdNb250aHNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICBpZiAoaWkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fc2hvcnRNb250aHNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbG9jYWxlTW9udGhzUGFyc2UgKG1vbnRoTmFtZSwgZm9ybWF0LCBzdHJpY3QpIHtcbiAgICAgICAgdmFyIGksIG1vbSwgcmVnZXg7XG5cbiAgICAgICAgaWYgKHRoaXMuX21vbnRoc1BhcnNlRXhhY3QpIHtcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVTdHJpY3RQYXJzZS5jYWxsKHRoaXMsIG1vbnRoTmFtZSwgZm9ybWF0LCBzdHJpY3QpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLl9tb250aHNQYXJzZSkge1xuICAgICAgICAgICAgdGhpcy5fbW9udGhzUGFyc2UgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuX2xvbmdNb250aHNQYXJzZSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fc2hvcnRNb250aHNQYXJzZSA9IFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVE9ETzogYWRkIHNvcnRpbmdcbiAgICAgICAgLy8gU29ydGluZyBtYWtlcyBzdXJlIGlmIG9uZSBtb250aCAob3IgYWJicikgaXMgYSBwcmVmaXggb2YgYW5vdGhlclxuICAgICAgICAvLyBzZWUgc29ydGluZyBpbiBjb21wdXRlTW9udGhzUGFyc2VcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDEyOyBpKyspIHtcbiAgICAgICAgICAgIC8vIG1ha2UgdGhlIHJlZ2V4IGlmIHdlIGRvbid0IGhhdmUgaXQgYWxyZWFkeVxuICAgICAgICAgICAgbW9tID0gY3JlYXRlVVRDKFsyMDAwLCBpXSk7XG4gICAgICAgICAgICBpZiAoc3RyaWN0ICYmICF0aGlzLl9sb25nTW9udGhzUGFyc2VbaV0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb25nTW9udGhzUGFyc2VbaV0gPSBuZXcgUmVnRXhwKCdeJyArIHRoaXMubW9udGhzKG1vbSwgJycpLnJlcGxhY2UoJy4nLCAnJykgKyAnJCcsICdpJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2hvcnRNb250aHNQYXJzZVtpXSA9IG5ldyBSZWdFeHAoJ14nICsgdGhpcy5tb250aHNTaG9ydChtb20sICcnKS5yZXBsYWNlKCcuJywgJycpICsgJyQnLCAnaScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFzdHJpY3QgJiYgIXRoaXMuX21vbnRoc1BhcnNlW2ldKSB7XG4gICAgICAgICAgICAgICAgcmVnZXggPSAnXicgKyB0aGlzLm1vbnRocyhtb20sICcnKSArICd8XicgKyB0aGlzLm1vbnRoc1Nob3J0KG1vbSwgJycpO1xuICAgICAgICAgICAgICAgIHRoaXMuX21vbnRoc1BhcnNlW2ldID0gbmV3IFJlZ0V4cChyZWdleC5yZXBsYWNlKCcuJywgJycpLCAnaScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gdGVzdCB0aGUgcmVnZXhcbiAgICAgICAgICAgIGlmIChzdHJpY3QgJiYgZm9ybWF0ID09PSAnTU1NTScgJiYgdGhpcy5fbG9uZ01vbnRoc1BhcnNlW2ldLnRlc3QobW9udGhOYW1lKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJpY3QgJiYgZm9ybWF0ID09PSAnTU1NJyAmJiB0aGlzLl9zaG9ydE1vbnRoc1BhcnNlW2ldLnRlc3QobW9udGhOYW1lKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyaWN0ICYmIHRoaXMuX21vbnRoc1BhcnNlW2ldLnRlc3QobW9udGhOYW1lKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgZnVuY3Rpb24gc2V0TW9udGggKG1vbSwgdmFsdWUpIHtcbiAgICAgICAgdmFyIGRheU9mTW9udGg7XG5cbiAgICAgICAgaWYgKCFtb20uaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICAvLyBObyBvcFxuICAgICAgICAgICAgcmV0dXJuIG1vbTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBpZiAoL15cXGQrJC8udGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHRvSW50KHZhbHVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBtb20ubG9jYWxlRGF0YSgpLm1vbnRoc1BhcnNlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiBBbm90aGVyIHNpbGVudCBmYWlsdXJlP1xuICAgICAgICAgICAgICAgIGlmICghaXNOdW1iZXIodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtb207XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZGF5T2ZNb250aCA9IE1hdGgubWluKG1vbS5kYXRlKCksIGRheXNJbk1vbnRoKG1vbS55ZWFyKCksIHZhbHVlKSk7XG4gICAgICAgIG1vbS5fZFsnc2V0JyArIChtb20uX2lzVVRDID8gJ1VUQycgOiAnJykgKyAnTW9udGgnXSh2YWx1ZSwgZGF5T2ZNb250aCk7XG4gICAgICAgIHJldHVybiBtb207XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0U2V0TW9udGggKHZhbHVlKSB7XG4gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICBzZXRNb250aCh0aGlzLCB2YWx1ZSk7XG4gICAgICAgICAgICBob29rcy51cGRhdGVPZmZzZXQodGhpcywgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBnZXQodGhpcywgJ01vbnRoJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXREYXlzSW5Nb250aCAoKSB7XG4gICAgICAgIHJldHVybiBkYXlzSW5Nb250aCh0aGlzLnllYXIoKSwgdGhpcy5tb250aCgpKTtcbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdE1vbnRoc1Nob3J0UmVnZXggPSBtYXRjaFdvcmQ7XG4gICAgZnVuY3Rpb24gbW9udGhzU2hvcnRSZWdleCAoaXNTdHJpY3QpIHtcbiAgICAgICAgaWYgKHRoaXMuX21vbnRoc1BhcnNlRXhhY3QpIHtcbiAgICAgICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX21vbnRoc1JlZ2V4JykpIHtcbiAgICAgICAgICAgICAgICBjb21wdXRlTW9udGhzUGFyc2UuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc1N0cmljdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9tb250aHNTaG9ydFN0cmljdFJlZ2V4O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbW9udGhzU2hvcnRSZWdleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX21vbnRoc1Nob3J0UmVnZXgnKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX21vbnRoc1Nob3J0UmVnZXggPSBkZWZhdWx0TW9udGhzU2hvcnRSZWdleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9tb250aHNTaG9ydFN0cmljdFJlZ2V4ICYmIGlzU3RyaWN0ID9cbiAgICAgICAgICAgICAgICB0aGlzLl9tb250aHNTaG9ydFN0cmljdFJlZ2V4IDogdGhpcy5fbW9udGhzU2hvcnRSZWdleDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBkZWZhdWx0TW9udGhzUmVnZXggPSBtYXRjaFdvcmQ7XG4gICAgZnVuY3Rpb24gbW9udGhzUmVnZXggKGlzU3RyaWN0KSB7XG4gICAgICAgIGlmICh0aGlzLl9tb250aHNQYXJzZUV4YWN0KSB7XG4gICAgICAgICAgICBpZiAoIWhhc093blByb3AodGhpcywgJ19tb250aHNSZWdleCcpKSB7XG4gICAgICAgICAgICAgICAgY29tcHV0ZU1vbnRoc1BhcnNlLmNhbGwodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNTdHJpY3QpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbW9udGhzU3RyaWN0UmVnZXg7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9tb250aHNSZWdleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX21vbnRoc1JlZ2V4JykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9tb250aHNSZWdleCA9IGRlZmF1bHRNb250aHNSZWdleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9tb250aHNTdHJpY3RSZWdleCAmJiBpc1N0cmljdCA/XG4gICAgICAgICAgICAgICAgdGhpcy5fbW9udGhzU3RyaWN0UmVnZXggOiB0aGlzLl9tb250aHNSZWdleDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNvbXB1dGVNb250aHNQYXJzZSAoKSB7XG4gICAgICAgIGZ1bmN0aW9uIGNtcExlblJldihhLCBiKSB7XG4gICAgICAgICAgICByZXR1cm4gYi5sZW5ndGggLSBhLmxlbmd0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBzaG9ydFBpZWNlcyA9IFtdLCBsb25nUGllY2VzID0gW10sIG1peGVkUGllY2VzID0gW10sXG4gICAgICAgICAgICBpLCBtb207XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCAxMjsgaSsrKSB7XG4gICAgICAgICAgICAvLyBtYWtlIHRoZSByZWdleCBpZiB3ZSBkb24ndCBoYXZlIGl0IGFscmVhZHlcbiAgICAgICAgICAgIG1vbSA9IGNyZWF0ZVVUQyhbMjAwMCwgaV0pO1xuICAgICAgICAgICAgc2hvcnRQaWVjZXMucHVzaCh0aGlzLm1vbnRoc1Nob3J0KG1vbSwgJycpKTtcbiAgICAgICAgICAgIGxvbmdQaWVjZXMucHVzaCh0aGlzLm1vbnRocyhtb20sICcnKSk7XG4gICAgICAgICAgICBtaXhlZFBpZWNlcy5wdXNoKHRoaXMubW9udGhzKG1vbSwgJycpKTtcbiAgICAgICAgICAgIG1peGVkUGllY2VzLnB1c2godGhpcy5tb250aHNTaG9ydChtb20sICcnKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU29ydGluZyBtYWtlcyBzdXJlIGlmIG9uZSBtb250aCAob3IgYWJicikgaXMgYSBwcmVmaXggb2YgYW5vdGhlciBpdFxuICAgICAgICAvLyB3aWxsIG1hdGNoIHRoZSBsb25nZXIgcGllY2UuXG4gICAgICAgIHNob3J0UGllY2VzLnNvcnQoY21wTGVuUmV2KTtcbiAgICAgICAgbG9uZ1BpZWNlcy5zb3J0KGNtcExlblJldik7XG4gICAgICAgIG1peGVkUGllY2VzLnNvcnQoY21wTGVuUmV2KTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDEyOyBpKyspIHtcbiAgICAgICAgICAgIHNob3J0UGllY2VzW2ldID0gcmVnZXhFc2NhcGUoc2hvcnRQaWVjZXNbaV0pO1xuICAgICAgICAgICAgbG9uZ1BpZWNlc1tpXSA9IHJlZ2V4RXNjYXBlKGxvbmdQaWVjZXNbaV0pO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCAyNDsgaSsrKSB7XG4gICAgICAgICAgICBtaXhlZFBpZWNlc1tpXSA9IHJlZ2V4RXNjYXBlKG1peGVkUGllY2VzW2ldKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX21vbnRoc1JlZ2V4ID0gbmV3IFJlZ0V4cCgnXignICsgbWl4ZWRQaWVjZXMuam9pbignfCcpICsgJyknLCAnaScpO1xuICAgICAgICB0aGlzLl9tb250aHNTaG9ydFJlZ2V4ID0gdGhpcy5fbW9udGhzUmVnZXg7XG4gICAgICAgIHRoaXMuX21vbnRoc1N0cmljdFJlZ2V4ID0gbmV3IFJlZ0V4cCgnXignICsgbG9uZ1BpZWNlcy5qb2luKCd8JykgKyAnKScsICdpJyk7XG4gICAgICAgIHRoaXMuX21vbnRoc1Nob3J0U3RyaWN0UmVnZXggPSBuZXcgUmVnRXhwKCdeKCcgKyBzaG9ydFBpZWNlcy5qb2luKCd8JykgKyAnKScsICdpJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRlRGF0ZSAoeSwgbSwgZCwgaCwgTSwgcywgbXMpIHtcbiAgICAgICAgLy8gY2FuJ3QganVzdCBhcHBseSgpIHRvIGNyZWF0ZSBhIGRhdGU6XG4gICAgICAgIC8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcS8xODEzNDhcbiAgICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZSh5LCBtLCBkLCBoLCBNLCBzLCBtcyk7XG5cbiAgICAgICAgLy8gdGhlIGRhdGUgY29uc3RydWN0b3IgcmVtYXBzIHllYXJzIDAtOTkgdG8gMTkwMC0xOTk5XG4gICAgICAgIGlmICh5IDwgMTAwICYmIHkgPj0gMCAmJiBpc0Zpbml0ZShkYXRlLmdldEZ1bGxZZWFyKCkpKSB7XG4gICAgICAgICAgICBkYXRlLnNldEZ1bGxZZWFyKHkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZVVUQ0RhdGUgKHkpIHtcbiAgICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZShEYXRlLlVUQy5hcHBseShudWxsLCBhcmd1bWVudHMpKTtcblxuICAgICAgICAvLyB0aGUgRGF0ZS5VVEMgZnVuY3Rpb24gcmVtYXBzIHllYXJzIDAtOTkgdG8gMTkwMC0xOTk5XG4gICAgICAgIGlmICh5IDwgMTAwICYmIHkgPj0gMCAmJiBpc0Zpbml0ZShkYXRlLmdldFVUQ0Z1bGxZZWFyKCkpKSB7XG4gICAgICAgICAgICBkYXRlLnNldFVUQ0Z1bGxZZWFyKHkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRlO1xuICAgIH1cblxuICAgIC8vIHN0YXJ0LW9mLWZpcnN0LXdlZWsgLSBzdGFydC1vZi15ZWFyXG4gICAgZnVuY3Rpb24gZmlyc3RXZWVrT2Zmc2V0KHllYXIsIGRvdywgZG95KSB7XG4gICAgICAgIHZhciAvLyBmaXJzdC13ZWVrIGRheSAtLSB3aGljaCBqYW51YXJ5IGlzIGFsd2F5cyBpbiB0aGUgZmlyc3Qgd2VlayAoNCBmb3IgaXNvLCAxIGZvciBvdGhlcilcbiAgICAgICAgICAgIGZ3ZCA9IDcgKyBkb3cgLSBkb3ksXG4gICAgICAgICAgICAvLyBmaXJzdC13ZWVrIGRheSBsb2NhbCB3ZWVrZGF5IC0tIHdoaWNoIGxvY2FsIHdlZWtkYXkgaXMgZndkXG4gICAgICAgICAgICBmd2RsdyA9ICg3ICsgY3JlYXRlVVRDRGF0ZSh5ZWFyLCAwLCBmd2QpLmdldFVUQ0RheSgpIC0gZG93KSAlIDc7XG5cbiAgICAgICAgcmV0dXJuIC1md2RsdyArIGZ3ZCAtIDE7XG4gICAgfVxuXG4gICAgLy8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPX3dlZWtfZGF0ZSNDYWxjdWxhdGluZ19hX2RhdGVfZ2l2ZW5fdGhlX3llYXIuMkNfd2Vla19udW1iZXJfYW5kX3dlZWtkYXlcbiAgICBmdW5jdGlvbiBkYXlPZlllYXJGcm9tV2Vla3MoeWVhciwgd2Vlaywgd2Vla2RheSwgZG93LCBkb3kpIHtcbiAgICAgICAgdmFyIGxvY2FsV2Vla2RheSA9ICg3ICsgd2Vla2RheSAtIGRvdykgJSA3LFxuICAgICAgICAgICAgd2Vla09mZnNldCA9IGZpcnN0V2Vla09mZnNldCh5ZWFyLCBkb3csIGRveSksXG4gICAgICAgICAgICBkYXlPZlllYXIgPSAxICsgNyAqICh3ZWVrIC0gMSkgKyBsb2NhbFdlZWtkYXkgKyB3ZWVrT2Zmc2V0LFxuICAgICAgICAgICAgcmVzWWVhciwgcmVzRGF5T2ZZZWFyO1xuXG4gICAgICAgIGlmIChkYXlPZlllYXIgPD0gMCkge1xuICAgICAgICAgICAgcmVzWWVhciA9IHllYXIgLSAxO1xuICAgICAgICAgICAgcmVzRGF5T2ZZZWFyID0gZGF5c0luWWVhcihyZXNZZWFyKSArIGRheU9mWWVhcjtcbiAgICAgICAgfSBlbHNlIGlmIChkYXlPZlllYXIgPiBkYXlzSW5ZZWFyKHllYXIpKSB7XG4gICAgICAgICAgICByZXNZZWFyID0geWVhciArIDE7XG4gICAgICAgICAgICByZXNEYXlPZlllYXIgPSBkYXlPZlllYXIgLSBkYXlzSW5ZZWFyKHllYXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzWWVhciA9IHllYXI7XG4gICAgICAgICAgICByZXNEYXlPZlllYXIgPSBkYXlPZlllYXI7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeWVhcjogcmVzWWVhcixcbiAgICAgICAgICAgIGRheU9mWWVhcjogcmVzRGF5T2ZZZWFyXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gd2Vla09mWWVhcihtb20sIGRvdywgZG95KSB7XG4gICAgICAgIHZhciB3ZWVrT2Zmc2V0ID0gZmlyc3RXZWVrT2Zmc2V0KG1vbS55ZWFyKCksIGRvdywgZG95KSxcbiAgICAgICAgICAgIHdlZWsgPSBNYXRoLmZsb29yKChtb20uZGF5T2ZZZWFyKCkgLSB3ZWVrT2Zmc2V0IC0gMSkgLyA3KSArIDEsXG4gICAgICAgICAgICByZXNXZWVrLCByZXNZZWFyO1xuXG4gICAgICAgIGlmICh3ZWVrIDwgMSkge1xuICAgICAgICAgICAgcmVzWWVhciA9IG1vbS55ZWFyKCkgLSAxO1xuICAgICAgICAgICAgcmVzV2VlayA9IHdlZWsgKyB3ZWVrc0luWWVhcihyZXNZZWFyLCBkb3csIGRveSk7XG4gICAgICAgIH0gZWxzZSBpZiAod2VlayA+IHdlZWtzSW5ZZWFyKG1vbS55ZWFyKCksIGRvdywgZG95KSkge1xuICAgICAgICAgICAgcmVzV2VlayA9IHdlZWsgLSB3ZWVrc0luWWVhcihtb20ueWVhcigpLCBkb3csIGRveSk7XG4gICAgICAgICAgICByZXNZZWFyID0gbW9tLnllYXIoKSArIDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNZZWFyID0gbW9tLnllYXIoKTtcbiAgICAgICAgICAgIHJlc1dlZWsgPSB3ZWVrO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHdlZWs6IHJlc1dlZWssXG4gICAgICAgICAgICB5ZWFyOiByZXNZZWFyXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gd2Vla3NJblllYXIoeWVhciwgZG93LCBkb3kpIHtcbiAgICAgICAgdmFyIHdlZWtPZmZzZXQgPSBmaXJzdFdlZWtPZmZzZXQoeWVhciwgZG93LCBkb3kpLFxuICAgICAgICAgICAgd2Vla09mZnNldE5leHQgPSBmaXJzdFdlZWtPZmZzZXQoeWVhciArIDEsIGRvdywgZG95KTtcbiAgICAgICAgcmV0dXJuIChkYXlzSW5ZZWFyKHllYXIpIC0gd2Vla09mZnNldCArIHdlZWtPZmZzZXROZXh0KSAvIDc7XG4gICAgfVxuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ3cnLCBbJ3d3JywgMl0sICd3bycsICd3ZWVrJyk7XG4gICAgYWRkRm9ybWF0VG9rZW4oJ1cnLCBbJ1dXJywgMl0sICdXbycsICdpc29XZWVrJyk7XG5cbiAgICAvLyBBTElBU0VTXG5cbiAgICBhZGRVbml0QWxpYXMoJ3dlZWsnLCAndycpO1xuICAgIGFkZFVuaXRBbGlhcygnaXNvV2VlaycsICdXJyk7XG5cbiAgICAvLyBQUklPUklUSUVTXG5cbiAgICBhZGRVbml0UHJpb3JpdHkoJ3dlZWsnLCA1KTtcbiAgICBhZGRVbml0UHJpb3JpdHkoJ2lzb1dlZWsnLCA1KTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ3cnLCAgbWF0Y2gxdG8yKTtcbiAgICBhZGRSZWdleFRva2VuKCd3dycsIG1hdGNoMXRvMiwgbWF0Y2gyKTtcbiAgICBhZGRSZWdleFRva2VuKCdXJywgIG1hdGNoMXRvMik7XG4gICAgYWRkUmVnZXhUb2tlbignV1cnLCBtYXRjaDF0bzIsIG1hdGNoMik7XG5cbiAgICBhZGRXZWVrUGFyc2VUb2tlbihbJ3cnLCAnd3cnLCAnVycsICdXVyddLCBmdW5jdGlvbiAoaW5wdXQsIHdlZWssIGNvbmZpZywgdG9rZW4pIHtcbiAgICAgICAgd2Vla1t0b2tlbi5zdWJzdHIoMCwgMSldID0gdG9JbnQoaW5wdXQpO1xuICAgIH0pO1xuXG4gICAgLy8gSEVMUEVSU1xuXG4gICAgLy8gTE9DQUxFU1xuXG4gICAgZnVuY3Rpb24gbG9jYWxlV2VlayAobW9tKSB7XG4gICAgICAgIHJldHVybiB3ZWVrT2ZZZWFyKG1vbSwgdGhpcy5fd2Vlay5kb3csIHRoaXMuX3dlZWsuZG95KS53ZWVrO1xuICAgIH1cblxuICAgIHZhciBkZWZhdWx0TG9jYWxlV2VlayA9IHtcbiAgICAgICAgZG93IDogMCwgLy8gU3VuZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgIGRveSA6IDYgIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDFzdCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gbG9jYWxlRmlyc3REYXlPZldlZWsgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fd2Vlay5kb3c7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbG9jYWxlRmlyc3REYXlPZlllYXIgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fd2Vlay5kb3k7XG4gICAgfVxuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgZnVuY3Rpb24gZ2V0U2V0V2VlayAoaW5wdXQpIHtcbiAgICAgICAgdmFyIHdlZWsgPSB0aGlzLmxvY2FsZURhdGEoKS53ZWVrKHRoaXMpO1xuICAgICAgICByZXR1cm4gaW5wdXQgPT0gbnVsbCA/IHdlZWsgOiB0aGlzLmFkZCgoaW5wdXQgLSB3ZWVrKSAqIDcsICdkJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0U2V0SVNPV2VlayAoaW5wdXQpIHtcbiAgICAgICAgdmFyIHdlZWsgPSB3ZWVrT2ZZZWFyKHRoaXMsIDEsIDQpLndlZWs7XG4gICAgICAgIHJldHVybiBpbnB1dCA9PSBudWxsID8gd2VlayA6IHRoaXMuYWRkKChpbnB1dCAtIHdlZWspICogNywgJ2QnKTtcbiAgICB9XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbignZCcsIDAsICdkbycsICdkYXknKTtcblxuICAgIGFkZEZvcm1hdFRva2VuKCdkZCcsIDAsIDAsIGZ1bmN0aW9uIChmb3JtYXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLndlZWtkYXlzTWluKHRoaXMsIGZvcm1hdCk7XG4gICAgfSk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbignZGRkJywgMCwgMCwgZnVuY3Rpb24gKGZvcm1hdCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkud2Vla2RheXNTaG9ydCh0aGlzLCBmb3JtYXQpO1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ2RkZGQnLCAwLCAwLCBmdW5jdGlvbiAoZm9ybWF0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS53ZWVrZGF5cyh0aGlzLCBmb3JtYXQpO1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ2UnLCAwLCAwLCAnd2Vla2RheScpO1xuICAgIGFkZEZvcm1hdFRva2VuKCdFJywgMCwgMCwgJ2lzb1dlZWtkYXknKTtcblxuICAgIC8vIEFMSUFTRVNcblxuICAgIGFkZFVuaXRBbGlhcygnZGF5JywgJ2QnKTtcbiAgICBhZGRVbml0QWxpYXMoJ3dlZWtkYXknLCAnZScpO1xuICAgIGFkZFVuaXRBbGlhcygnaXNvV2Vla2RheScsICdFJyk7XG5cbiAgICAvLyBQUklPUklUWVxuICAgIGFkZFVuaXRQcmlvcml0eSgnZGF5JywgMTEpO1xuICAgIGFkZFVuaXRQcmlvcml0eSgnd2Vla2RheScsIDExKTtcbiAgICBhZGRVbml0UHJpb3JpdHkoJ2lzb1dlZWtkYXknLCAxMSk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCdkJywgICAgbWF0Y2gxdG8yKTtcbiAgICBhZGRSZWdleFRva2VuKCdlJywgICAgbWF0Y2gxdG8yKTtcbiAgICBhZGRSZWdleFRva2VuKCdFJywgICAgbWF0Y2gxdG8yKTtcbiAgICBhZGRSZWdleFRva2VuKCdkZCcsICAgZnVuY3Rpb24gKGlzU3RyaWN0LCBsb2NhbGUpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsZS53ZWVrZGF5c01pblJlZ2V4KGlzU3RyaWN0KTtcbiAgICB9KTtcbiAgICBhZGRSZWdleFRva2VuKCdkZGQnLCAgIGZ1bmN0aW9uIChpc1N0cmljdCwgbG9jYWxlKSB7XG4gICAgICAgIHJldHVybiBsb2NhbGUud2Vla2RheXNTaG9ydFJlZ2V4KGlzU3RyaWN0KTtcbiAgICB9KTtcbiAgICBhZGRSZWdleFRva2VuKCdkZGRkJywgICBmdW5jdGlvbiAoaXNTdHJpY3QsIGxvY2FsZSkge1xuICAgICAgICByZXR1cm4gbG9jYWxlLndlZWtkYXlzUmVnZXgoaXNTdHJpY3QpO1xuICAgIH0pO1xuXG4gICAgYWRkV2Vla1BhcnNlVG9rZW4oWydkZCcsICdkZGQnLCAnZGRkZCddLCBmdW5jdGlvbiAoaW5wdXQsIHdlZWssIGNvbmZpZywgdG9rZW4pIHtcbiAgICAgICAgdmFyIHdlZWtkYXkgPSBjb25maWcuX2xvY2FsZS53ZWVrZGF5c1BhcnNlKGlucHV0LCB0b2tlbiwgY29uZmlnLl9zdHJpY3QpO1xuICAgICAgICAvLyBpZiB3ZSBkaWRuJ3QgZ2V0IGEgd2Vla2RheSBuYW1lLCBtYXJrIHRoZSBkYXRlIGFzIGludmFsaWRcbiAgICAgICAgaWYgKHdlZWtkYXkgIT0gbnVsbCkge1xuICAgICAgICAgICAgd2Vlay5kID0gd2Vla2RheTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmludmFsaWRXZWVrZGF5ID0gaW5wdXQ7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIGFkZFdlZWtQYXJzZVRva2VuKFsnZCcsICdlJywgJ0UnXSwgZnVuY3Rpb24gKGlucHV0LCB3ZWVrLCBjb25maWcsIHRva2VuKSB7XG4gICAgICAgIHdlZWtbdG9rZW5dID0gdG9JbnQoaW5wdXQpO1xuICAgIH0pO1xuXG4gICAgLy8gSEVMUEVSU1xuXG4gICAgZnVuY3Rpb24gcGFyc2VXZWVrZGF5KGlucHV0LCBsb2NhbGUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXNOYU4oaW5wdXQpKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQoaW5wdXQsIDEwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlucHV0ID0gbG9jYWxlLndlZWtkYXlzUGFyc2UoaW5wdXQpO1xuICAgICAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGFyc2VJc29XZWVrZGF5KGlucHV0LCBsb2NhbGUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbGUud2Vla2RheXNQYXJzZShpbnB1dCkgJSA3IHx8IDc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzTmFOKGlucHV0KSA/IG51bGwgOiBpbnB1dDtcbiAgICB9XG5cbiAgICAvLyBMT0NBTEVTXG5cbiAgICB2YXIgZGVmYXVsdExvY2FsZVdlZWtkYXlzID0gJ1N1bmRheV9Nb25kYXlfVHVlc2RheV9XZWRuZXNkYXlfVGh1cnNkYXlfRnJpZGF5X1NhdHVyZGF5Jy5zcGxpdCgnXycpO1xuICAgIGZ1bmN0aW9uIGxvY2FsZVdlZWtkYXlzIChtLCBmb3JtYXQpIHtcbiAgICAgICAgaWYgKCFtKSB7XG4gICAgICAgICAgICByZXR1cm4gaXNBcnJheSh0aGlzLl93ZWVrZGF5cykgPyB0aGlzLl93ZWVrZGF5cyA6XG4gICAgICAgICAgICAgICAgdGhpcy5fd2Vla2RheXNbJ3N0YW5kYWxvbmUnXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXNBcnJheSh0aGlzLl93ZWVrZGF5cykgPyB0aGlzLl93ZWVrZGF5c1ttLmRheSgpXSA6XG4gICAgICAgICAgICB0aGlzLl93ZWVrZGF5c1t0aGlzLl93ZWVrZGF5cy5pc0Zvcm1hdC50ZXN0KGZvcm1hdCkgPyAnZm9ybWF0JyA6ICdzdGFuZGFsb25lJ11bbS5kYXkoKV07XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRMb2NhbGVXZWVrZGF5c1Nob3J0ID0gJ1N1bl9Nb25fVHVlX1dlZF9UaHVfRnJpX1NhdCcuc3BsaXQoJ18nKTtcbiAgICBmdW5jdGlvbiBsb2NhbGVXZWVrZGF5c1Nob3J0IChtKSB7XG4gICAgICAgIHJldHVybiAobSkgPyB0aGlzLl93ZWVrZGF5c1Nob3J0W20uZGF5KCldIDogdGhpcy5fd2Vla2RheXNTaG9ydDtcbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdExvY2FsZVdlZWtkYXlzTWluID0gJ1N1X01vX1R1X1dlX1RoX0ZyX1NhJy5zcGxpdCgnXycpO1xuICAgIGZ1bmN0aW9uIGxvY2FsZVdlZWtkYXlzTWluIChtKSB7XG4gICAgICAgIHJldHVybiAobSkgPyB0aGlzLl93ZWVrZGF5c01pblttLmRheSgpXSA6IHRoaXMuX3dlZWtkYXlzTWluO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGhhbmRsZVN0cmljdFBhcnNlJDEod2Vla2RheU5hbWUsIGZvcm1hdCwgc3RyaWN0KSB7XG4gICAgICAgIHZhciBpLCBpaSwgbW9tLCBsbGMgPSB3ZWVrZGF5TmFtZS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoIXRoaXMuX3dlZWtkYXlzUGFyc2UpIHtcbiAgICAgICAgICAgIHRoaXMuX3dlZWtkYXlzUGFyc2UgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fbWluV2Vla2RheXNQYXJzZSA9IFtdO1xuXG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNzsgKytpKSB7XG4gICAgICAgICAgICAgICAgbW9tID0gY3JlYXRlVVRDKFsyMDAwLCAxXSkuZGF5KGkpO1xuICAgICAgICAgICAgICAgIHRoaXMuX21pbldlZWtkYXlzUGFyc2VbaV0gPSB0aGlzLndlZWtkYXlzTWluKG1vbSwgJycpLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlW2ldID0gdGhpcy53ZWVrZGF5c1Nob3J0KG1vbSwgJycpLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fd2Vla2RheXNQYXJzZVtpXSA9IHRoaXMud2Vla2RheXMobW9tLCAnJykudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdHJpY3QpIHtcbiAgICAgICAgICAgIGlmIChmb3JtYXQgPT09ICdkZGRkJykge1xuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX3dlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlpICE9PSAtMSA/IGlpIDogbnVsbDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZm9ybWF0ID09PSAnZGRkJykge1xuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9taW5XZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpaSAhPT0gLTEgPyBpaSA6IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoZm9ybWF0ID09PSAnZGRkZCcpIHtcbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl93ZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIGlmIChpaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9zaG9ydFdlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgaWYgKGlpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX21pbldlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlpICE9PSAtMSA/IGlpIDogbnVsbDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZm9ybWF0ID09PSAnZGRkJykge1xuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICBpZiAoaWkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fd2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICBpZiAoaWkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fbWluV2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9taW5XZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIGlmIChpaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl93ZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIGlmIChpaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9zaG9ydFdlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlpICE9PSAtMSA/IGlpIDogbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxvY2FsZVdlZWtkYXlzUGFyc2UgKHdlZWtkYXlOYW1lLCBmb3JtYXQsIHN0cmljdCkge1xuICAgICAgICB2YXIgaSwgbW9tLCByZWdleDtcblxuICAgICAgICBpZiAodGhpcy5fd2Vla2RheXNQYXJzZUV4YWN0KSB7XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlU3RyaWN0UGFyc2UkMS5jYWxsKHRoaXMsIHdlZWtkYXlOYW1lLCBmb3JtYXQsIHN0cmljdCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuX3dlZWtkYXlzUGFyc2UpIHtcbiAgICAgICAgICAgIHRoaXMuX3dlZWtkYXlzUGFyc2UgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuX21pbldlZWtkYXlzUGFyc2UgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fZnVsbFdlZWtkYXlzUGFyc2UgPSBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCA3OyBpKyspIHtcbiAgICAgICAgICAgIC8vIG1ha2UgdGhlIHJlZ2V4IGlmIHdlIGRvbid0IGhhdmUgaXQgYWxyZWFkeVxuXG4gICAgICAgICAgICBtb20gPSBjcmVhdGVVVEMoWzIwMDAsIDFdKS5kYXkoaSk7XG4gICAgICAgICAgICBpZiAoc3RyaWN0ICYmICF0aGlzLl9mdWxsV2Vla2RheXNQYXJzZVtpXSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2Z1bGxXZWVrZGF5c1BhcnNlW2ldID0gbmV3IFJlZ0V4cCgnXicgKyB0aGlzLndlZWtkYXlzKG1vbSwgJycpLnJlcGxhY2UoJy4nLCAnXFxcXC4/JykgKyAnJCcsICdpJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlW2ldID0gbmV3IFJlZ0V4cCgnXicgKyB0aGlzLndlZWtkYXlzU2hvcnQobW9tLCAnJykucmVwbGFjZSgnLicsICdcXFxcLj8nKSArICckJywgJ2knKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9taW5XZWVrZGF5c1BhcnNlW2ldID0gbmV3IFJlZ0V4cCgnXicgKyB0aGlzLndlZWtkYXlzTWluKG1vbSwgJycpLnJlcGxhY2UoJy4nLCAnXFxcXC4/JykgKyAnJCcsICdpJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXRoaXMuX3dlZWtkYXlzUGFyc2VbaV0pIHtcbiAgICAgICAgICAgICAgICByZWdleCA9ICdeJyArIHRoaXMud2Vla2RheXMobW9tLCAnJykgKyAnfF4nICsgdGhpcy53ZWVrZGF5c1Nob3J0KG1vbSwgJycpICsgJ3xeJyArIHRoaXMud2Vla2RheXNNaW4obW9tLCAnJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fd2Vla2RheXNQYXJzZVtpXSA9IG5ldyBSZWdFeHAocmVnZXgucmVwbGFjZSgnLicsICcnKSwgJ2knKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHRlc3QgdGhlIHJlZ2V4XG4gICAgICAgICAgICBpZiAoc3RyaWN0ICYmIGZvcm1hdCA9PT0gJ2RkZGQnICYmIHRoaXMuX2Z1bGxXZWVrZGF5c1BhcnNlW2ldLnRlc3Qod2Vla2RheU5hbWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmljdCAmJiBmb3JtYXQgPT09ICdkZGQnICYmIHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZVtpXS50ZXN0KHdlZWtkYXlOYW1lKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJpY3QgJiYgZm9ybWF0ID09PSAnZGQnICYmIHRoaXMuX21pbldlZWtkYXlzUGFyc2VbaV0udGVzdCh3ZWVrZGF5TmFtZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmljdCAmJiB0aGlzLl93ZWVrZGF5c1BhcnNlW2ldLnRlc3Qod2Vla2RheU5hbWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICBmdW5jdGlvbiBnZXRTZXREYXlPZldlZWsgKGlucHV0KSB7XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dCAhPSBudWxsID8gdGhpcyA6IE5hTjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZGF5ID0gdGhpcy5faXNVVEMgPyB0aGlzLl9kLmdldFVUQ0RheSgpIDogdGhpcy5fZC5nZXREYXkoKTtcbiAgICAgICAgaWYgKGlucHV0ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlucHV0ID0gcGFyc2VXZWVrZGF5KGlucHV0LCB0aGlzLmxvY2FsZURhdGEoKSk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hZGQoaW5wdXQgLSBkYXksICdkJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZGF5O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0U2V0TG9jYWxlRGF5T2ZXZWVrIChpbnB1dCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQgIT0gbnVsbCA/IHRoaXMgOiBOYU47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHdlZWtkYXkgPSAodGhpcy5kYXkoKSArIDcgLSB0aGlzLmxvY2FsZURhdGEoKS5fd2Vlay5kb3cpICUgNztcbiAgICAgICAgcmV0dXJuIGlucHV0ID09IG51bGwgPyB3ZWVrZGF5IDogdGhpcy5hZGQoaW5wdXQgLSB3ZWVrZGF5LCAnZCcpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFNldElTT0RheU9mV2VlayAoaW5wdXQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0ICE9IG51bGwgPyB0aGlzIDogTmFOO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gYmVoYXZlcyB0aGUgc2FtZSBhcyBtb21lbnQjZGF5IGV4Y2VwdFxuICAgICAgICAvLyBhcyBhIGdldHRlciwgcmV0dXJucyA3IGluc3RlYWQgb2YgMCAoMS03IHJhbmdlIGluc3RlYWQgb2YgMC02KVxuICAgICAgICAvLyBhcyBhIHNldHRlciwgc3VuZGF5IHNob3VsZCBiZWxvbmcgdG8gdGhlIHByZXZpb3VzIHdlZWsuXG5cbiAgICAgICAgaWYgKGlucHV0ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHZhciB3ZWVrZGF5ID0gcGFyc2VJc29XZWVrZGF5KGlucHV0LCB0aGlzLmxvY2FsZURhdGEoKSk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXkodGhpcy5kYXkoKSAlIDcgPyB3ZWVrZGF5IDogd2Vla2RheSAtIDcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF5KCkgfHwgNztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBkZWZhdWx0V2Vla2RheXNSZWdleCA9IG1hdGNoV29yZDtcbiAgICBmdW5jdGlvbiB3ZWVrZGF5c1JlZ2V4IChpc1N0cmljdCkge1xuICAgICAgICBpZiAodGhpcy5fd2Vla2RheXNQYXJzZUV4YWN0KSB7XG4gICAgICAgICAgICBpZiAoIWhhc093blByb3AodGhpcywgJ193ZWVrZGF5c1JlZ2V4JykpIHtcbiAgICAgICAgICAgICAgICBjb21wdXRlV2Vla2RheXNQYXJzZS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzU3RyaWN0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWtkYXlzU3RyaWN0UmVnZXg7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl93ZWVrZGF5c1JlZ2V4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfd2Vla2RheXNSZWdleCcpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fd2Vla2RheXNSZWdleCA9IGRlZmF1bHRXZWVrZGF5c1JlZ2V4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWtkYXlzU3RyaWN0UmVnZXggJiYgaXNTdHJpY3QgP1xuICAgICAgICAgICAgICAgIHRoaXMuX3dlZWtkYXlzU3RyaWN0UmVnZXggOiB0aGlzLl93ZWVrZGF5c1JlZ2V4O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRXZWVrZGF5c1Nob3J0UmVnZXggPSBtYXRjaFdvcmQ7XG4gICAgZnVuY3Rpb24gd2Vla2RheXNTaG9ydFJlZ2V4IChpc1N0cmljdCkge1xuICAgICAgICBpZiAodGhpcy5fd2Vla2RheXNQYXJzZUV4YWN0KSB7XG4gICAgICAgICAgICBpZiAoIWhhc093blByb3AodGhpcywgJ193ZWVrZGF5c1JlZ2V4JykpIHtcbiAgICAgICAgICAgICAgICBjb21wdXRlV2Vla2RheXNQYXJzZS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzU3RyaWN0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWtkYXlzU2hvcnRTdHJpY3RSZWdleDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWtkYXlzU2hvcnRSZWdleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX3dlZWtkYXlzU2hvcnRSZWdleCcpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fd2Vla2RheXNTaG9ydFJlZ2V4ID0gZGVmYXVsdFdlZWtkYXlzU2hvcnRSZWdleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl93ZWVrZGF5c1Nob3J0U3RyaWN0UmVnZXggJiYgaXNTdHJpY3QgP1xuICAgICAgICAgICAgICAgIHRoaXMuX3dlZWtkYXlzU2hvcnRTdHJpY3RSZWdleCA6IHRoaXMuX3dlZWtkYXlzU2hvcnRSZWdleDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBkZWZhdWx0V2Vla2RheXNNaW5SZWdleCA9IG1hdGNoV29yZDtcbiAgICBmdW5jdGlvbiB3ZWVrZGF5c01pblJlZ2V4IChpc1N0cmljdCkge1xuICAgICAgICBpZiAodGhpcy5fd2Vla2RheXNQYXJzZUV4YWN0KSB7XG4gICAgICAgICAgICBpZiAoIWhhc093blByb3AodGhpcywgJ193ZWVrZGF5c1JlZ2V4JykpIHtcbiAgICAgICAgICAgICAgICBjb21wdXRlV2Vla2RheXNQYXJzZS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzU3RyaWN0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWtkYXlzTWluU3RyaWN0UmVnZXg7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl93ZWVrZGF5c01pblJlZ2V4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfd2Vla2RheXNNaW5SZWdleCcpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fd2Vla2RheXNNaW5SZWdleCA9IGRlZmF1bHRXZWVrZGF5c01pblJlZ2V4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWtkYXlzTWluU3RyaWN0UmVnZXggJiYgaXNTdHJpY3QgP1xuICAgICAgICAgICAgICAgIHRoaXMuX3dlZWtkYXlzTWluU3RyaWN0UmVnZXggOiB0aGlzLl93ZWVrZGF5c01pblJlZ2V4O1xuICAgICAgICB9XG4gICAgfVxuXG5cbiAgICBmdW5jdGlvbiBjb21wdXRlV2Vla2RheXNQYXJzZSAoKSB7XG4gICAgICAgIGZ1bmN0aW9uIGNtcExlblJldihhLCBiKSB7XG4gICAgICAgICAgICByZXR1cm4gYi5sZW5ndGggLSBhLmxlbmd0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBtaW5QaWVjZXMgPSBbXSwgc2hvcnRQaWVjZXMgPSBbXSwgbG9uZ1BpZWNlcyA9IFtdLCBtaXhlZFBpZWNlcyA9IFtdLFxuICAgICAgICAgICAgaSwgbW9tLCBtaW5wLCBzaG9ydHAsIGxvbmdwO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7XG4gICAgICAgICAgICAvLyBtYWtlIHRoZSByZWdleCBpZiB3ZSBkb24ndCBoYXZlIGl0IGFscmVhZHlcbiAgICAgICAgICAgIG1vbSA9IGNyZWF0ZVVUQyhbMjAwMCwgMV0pLmRheShpKTtcbiAgICAgICAgICAgIG1pbnAgPSB0aGlzLndlZWtkYXlzTWluKG1vbSwgJycpO1xuICAgICAgICAgICAgc2hvcnRwID0gdGhpcy53ZWVrZGF5c1Nob3J0KG1vbSwgJycpO1xuICAgICAgICAgICAgbG9uZ3AgPSB0aGlzLndlZWtkYXlzKG1vbSwgJycpO1xuICAgICAgICAgICAgbWluUGllY2VzLnB1c2gobWlucCk7XG4gICAgICAgICAgICBzaG9ydFBpZWNlcy5wdXNoKHNob3J0cCk7XG4gICAgICAgICAgICBsb25nUGllY2VzLnB1c2gobG9uZ3ApO1xuICAgICAgICAgICAgbWl4ZWRQaWVjZXMucHVzaChtaW5wKTtcbiAgICAgICAgICAgIG1peGVkUGllY2VzLnB1c2goc2hvcnRwKTtcbiAgICAgICAgICAgIG1peGVkUGllY2VzLnB1c2gobG9uZ3ApO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNvcnRpbmcgbWFrZXMgc3VyZSBpZiBvbmUgd2Vla2RheSAob3IgYWJicikgaXMgYSBwcmVmaXggb2YgYW5vdGhlciBpdFxuICAgICAgICAvLyB3aWxsIG1hdGNoIHRoZSBsb25nZXIgcGllY2UuXG4gICAgICAgIG1pblBpZWNlcy5zb3J0KGNtcExlblJldik7XG4gICAgICAgIHNob3J0UGllY2VzLnNvcnQoY21wTGVuUmV2KTtcbiAgICAgICAgbG9uZ1BpZWNlcy5zb3J0KGNtcExlblJldik7XG4gICAgICAgIG1peGVkUGllY2VzLnNvcnQoY21wTGVuUmV2KTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDc7IGkrKykge1xuICAgICAgICAgICAgc2hvcnRQaWVjZXNbaV0gPSByZWdleEVzY2FwZShzaG9ydFBpZWNlc1tpXSk7XG4gICAgICAgICAgICBsb25nUGllY2VzW2ldID0gcmVnZXhFc2NhcGUobG9uZ1BpZWNlc1tpXSk7XG4gICAgICAgICAgICBtaXhlZFBpZWNlc1tpXSA9IHJlZ2V4RXNjYXBlKG1peGVkUGllY2VzW2ldKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3dlZWtkYXlzUmVnZXggPSBuZXcgUmVnRXhwKCdeKCcgKyBtaXhlZFBpZWNlcy5qb2luKCd8JykgKyAnKScsICdpJyk7XG4gICAgICAgIHRoaXMuX3dlZWtkYXlzU2hvcnRSZWdleCA9IHRoaXMuX3dlZWtkYXlzUmVnZXg7XG4gICAgICAgIHRoaXMuX3dlZWtkYXlzTWluUmVnZXggPSB0aGlzLl93ZWVrZGF5c1JlZ2V4O1xuXG4gICAgICAgIHRoaXMuX3dlZWtkYXlzU3RyaWN0UmVnZXggPSBuZXcgUmVnRXhwKCdeKCcgKyBsb25nUGllY2VzLmpvaW4oJ3wnKSArICcpJywgJ2knKTtcbiAgICAgICAgdGhpcy5fd2Vla2RheXNTaG9ydFN0cmljdFJlZ2V4ID0gbmV3IFJlZ0V4cCgnXignICsgc2hvcnRQaWVjZXMuam9pbignfCcpICsgJyknLCAnaScpO1xuICAgICAgICB0aGlzLl93ZWVrZGF5c01pblN0cmljdFJlZ2V4ID0gbmV3IFJlZ0V4cCgnXignICsgbWluUGllY2VzLmpvaW4oJ3wnKSArICcpJywgJ2knKTtcbiAgICB9XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBmdW5jdGlvbiBoRm9ybWF0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ob3VycygpICUgMTIgfHwgMTI7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24ga0Zvcm1hdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaG91cnMoKSB8fCAyNDtcbiAgICB9XG5cbiAgICBhZGRGb3JtYXRUb2tlbignSCcsIFsnSEgnLCAyXSwgMCwgJ2hvdXInKTtcbiAgICBhZGRGb3JtYXRUb2tlbignaCcsIFsnaGgnLCAyXSwgMCwgaEZvcm1hdCk7XG4gICAgYWRkRm9ybWF0VG9rZW4oJ2snLCBbJ2trJywgMl0sIDAsIGtGb3JtYXQpO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ2htbScsIDAsIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICcnICsgaEZvcm1hdC5hcHBseSh0aGlzKSArIHplcm9GaWxsKHRoaXMubWludXRlcygpLCAyKTtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKCdobW1zcycsIDAsIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICcnICsgaEZvcm1hdC5hcHBseSh0aGlzKSArIHplcm9GaWxsKHRoaXMubWludXRlcygpLCAyKSArXG4gICAgICAgICAgICB6ZXJvRmlsbCh0aGlzLnNlY29uZHMoKSwgMik7XG4gICAgfSk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbignSG1tJywgMCwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gJycgKyB0aGlzLmhvdXJzKCkgKyB6ZXJvRmlsbCh0aGlzLm1pbnV0ZXMoKSwgMik7XG4gICAgfSk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbignSG1tc3MnLCAwLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAnJyArIHRoaXMuaG91cnMoKSArIHplcm9GaWxsKHRoaXMubWludXRlcygpLCAyKSArXG4gICAgICAgICAgICB6ZXJvRmlsbCh0aGlzLnNlY29uZHMoKSwgMik7XG4gICAgfSk7XG5cbiAgICBmdW5jdGlvbiBtZXJpZGllbSAodG9rZW4sIGxvd2VyY2FzZSkge1xuICAgICAgICBhZGRGb3JtYXRUb2tlbih0b2tlbiwgMCwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLm1lcmlkaWVtKHRoaXMuaG91cnMoKSwgdGhpcy5taW51dGVzKCksIGxvd2VyY2FzZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG1lcmlkaWVtKCdhJywgdHJ1ZSk7XG4gICAgbWVyaWRpZW0oJ0EnLCBmYWxzZSk7XG5cbiAgICAvLyBBTElBU0VTXG5cbiAgICBhZGRVbml0QWxpYXMoJ2hvdXInLCAnaCcpO1xuXG4gICAgLy8gUFJJT1JJVFlcbiAgICBhZGRVbml0UHJpb3JpdHkoJ2hvdXInLCAxMyk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBmdW5jdGlvbiBtYXRjaE1lcmlkaWVtIChpc1N0cmljdCwgbG9jYWxlKSB7XG4gICAgICAgIHJldHVybiBsb2NhbGUuX21lcmlkaWVtUGFyc2U7XG4gICAgfVxuXG4gICAgYWRkUmVnZXhUb2tlbignYScsICBtYXRjaE1lcmlkaWVtKTtcbiAgICBhZGRSZWdleFRva2VuKCdBJywgIG1hdGNoTWVyaWRpZW0pO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ0gnLCAgbWF0Y2gxdG8yKTtcbiAgICBhZGRSZWdleFRva2VuKCdoJywgIG1hdGNoMXRvMik7XG4gICAgYWRkUmVnZXhUb2tlbignaycsICBtYXRjaDF0bzIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ0hIJywgbWF0Y2gxdG8yLCBtYXRjaDIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2hoJywgbWF0Y2gxdG8yLCBtYXRjaDIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2trJywgbWF0Y2gxdG8yLCBtYXRjaDIpO1xuXG4gICAgYWRkUmVnZXhUb2tlbignaG1tJywgbWF0Y2gzdG80KTtcbiAgICBhZGRSZWdleFRva2VuKCdobW1zcycsIG1hdGNoNXRvNik7XG4gICAgYWRkUmVnZXhUb2tlbignSG1tJywgbWF0Y2gzdG80KTtcbiAgICBhZGRSZWdleFRva2VuKCdIbW1zcycsIG1hdGNoNXRvNik7XG5cbiAgICBhZGRQYXJzZVRva2VuKFsnSCcsICdISCddLCBIT1VSKTtcbiAgICBhZGRQYXJzZVRva2VuKFsnaycsICdrayddLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcpIHtcbiAgICAgICAgdmFyIGtJbnB1dCA9IHRvSW50KGlucHV0KTtcbiAgICAgICAgYXJyYXlbSE9VUl0gPSBrSW5wdXQgPT09IDI0ID8gMCA6IGtJbnB1dDtcbiAgICB9KTtcbiAgICBhZGRQYXJzZVRva2VuKFsnYScsICdBJ10sIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgICAgICBjb25maWcuX2lzUG0gPSBjb25maWcuX2xvY2FsZS5pc1BNKGlucHV0KTtcbiAgICAgICAgY29uZmlnLl9tZXJpZGllbSA9IGlucHV0O1xuICAgIH0pO1xuICAgIGFkZFBhcnNlVG9rZW4oWydoJywgJ2hoJ10sIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgICAgICBhcnJheVtIT1VSXSA9IHRvSW50KGlucHV0KTtcbiAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuYmlnSG91ciA9IHRydWU7XG4gICAgfSk7XG4gICAgYWRkUGFyc2VUb2tlbignaG1tJywgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgICAgIHZhciBwb3MgPSBpbnB1dC5sZW5ndGggLSAyO1xuICAgICAgICBhcnJheVtIT1VSXSA9IHRvSW50KGlucHV0LnN1YnN0cigwLCBwb3MpKTtcbiAgICAgICAgYXJyYXlbTUlOVVRFXSA9IHRvSW50KGlucHV0LnN1YnN0cihwb3MpKTtcbiAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuYmlnSG91ciA9IHRydWU7XG4gICAgfSk7XG4gICAgYWRkUGFyc2VUb2tlbignaG1tc3MnLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcpIHtcbiAgICAgICAgdmFyIHBvczEgPSBpbnB1dC5sZW5ndGggLSA0O1xuICAgICAgICB2YXIgcG9zMiA9IGlucHV0Lmxlbmd0aCAtIDI7XG4gICAgICAgIGFycmF5W0hPVVJdID0gdG9JbnQoaW5wdXQuc3Vic3RyKDAsIHBvczEpKTtcbiAgICAgICAgYXJyYXlbTUlOVVRFXSA9IHRvSW50KGlucHV0LnN1YnN0cihwb3MxLCAyKSk7XG4gICAgICAgIGFycmF5W1NFQ09ORF0gPSB0b0ludChpbnB1dC5zdWJzdHIocG9zMikpO1xuICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5iaWdIb3VyID0gdHJ1ZTtcbiAgICB9KTtcbiAgICBhZGRQYXJzZVRva2VuKCdIbW0nLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcpIHtcbiAgICAgICAgdmFyIHBvcyA9IGlucHV0Lmxlbmd0aCAtIDI7XG4gICAgICAgIGFycmF5W0hPVVJdID0gdG9JbnQoaW5wdXQuc3Vic3RyKDAsIHBvcykpO1xuICAgICAgICBhcnJheVtNSU5VVEVdID0gdG9JbnQoaW5wdXQuc3Vic3RyKHBvcykpO1xuICAgIH0pO1xuICAgIGFkZFBhcnNlVG9rZW4oJ0htbXNzJywgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgICAgIHZhciBwb3MxID0gaW5wdXQubGVuZ3RoIC0gNDtcbiAgICAgICAgdmFyIHBvczIgPSBpbnB1dC5sZW5ndGggLSAyO1xuICAgICAgICBhcnJheVtIT1VSXSA9IHRvSW50KGlucHV0LnN1YnN0cigwLCBwb3MxKSk7XG4gICAgICAgIGFycmF5W01JTlVURV0gPSB0b0ludChpbnB1dC5zdWJzdHIocG9zMSwgMikpO1xuICAgICAgICBhcnJheVtTRUNPTkRdID0gdG9JbnQoaW5wdXQuc3Vic3RyKHBvczIpKTtcbiAgICB9KTtcblxuICAgIC8vIExPQ0FMRVNcblxuICAgIGZ1bmN0aW9uIGxvY2FsZUlzUE0gKGlucHV0KSB7XG4gICAgICAgIC8vIElFOCBRdWlya3MgTW9kZSAmIElFNyBTdGFuZGFyZHMgTW9kZSBkbyBub3QgYWxsb3cgYWNjZXNzaW5nIHN0cmluZ3MgbGlrZSBhcnJheXNcbiAgICAgICAgLy8gVXNpbmcgY2hhckF0IHNob3VsZCBiZSBtb3JlIGNvbXBhdGlibGUuXG4gICAgICAgIHJldHVybiAoKGlucHV0ICsgJycpLnRvTG93ZXJDYXNlKCkuY2hhckF0KDApID09PSAncCcpO1xuICAgIH1cblxuICAgIHZhciBkZWZhdWx0TG9jYWxlTWVyaWRpZW1QYXJzZSA9IC9bYXBdXFwuP20/XFwuPy9pO1xuICAgIGZ1bmN0aW9uIGxvY2FsZU1lcmlkaWVtIChob3VycywgbWludXRlcywgaXNMb3dlcikge1xuICAgICAgICBpZiAoaG91cnMgPiAxMSkge1xuICAgICAgICAgICAgcmV0dXJuIGlzTG93ZXIgPyAncG0nIDogJ1BNJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBpc0xvd2VyID8gJ2FtJyA6ICdBTSc7XG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIC8vIE1PTUVOVFNcblxuICAgIC8vIFNldHRpbmcgdGhlIGhvdXIgc2hvdWxkIGtlZXAgdGhlIHRpbWUsIGJlY2F1c2UgdGhlIHVzZXIgZXhwbGljaXRseVxuICAgIC8vIHNwZWNpZmllZCB3aGljaCBob3VyIHRoZXkgd2FudC4gU28gdHJ5aW5nIHRvIG1haW50YWluIHRoZSBzYW1lIGhvdXIgKGluXG4gICAgLy8gYSBuZXcgdGltZXpvbmUpIG1ha2VzIHNlbnNlLiBBZGRpbmcvc3VidHJhY3RpbmcgaG91cnMgZG9lcyBub3QgZm9sbG93XG4gICAgLy8gdGhpcyBydWxlLlxuICAgIHZhciBnZXRTZXRIb3VyID0gbWFrZUdldFNldCgnSG91cnMnLCB0cnVlKTtcblxuICAgIHZhciBiYXNlQ29uZmlnID0ge1xuICAgICAgICBjYWxlbmRhcjogZGVmYXVsdENhbGVuZGFyLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDogZGVmYXVsdExvbmdEYXRlRm9ybWF0LFxuICAgICAgICBpbnZhbGlkRGF0ZTogZGVmYXVsdEludmFsaWREYXRlLFxuICAgICAgICBvcmRpbmFsOiBkZWZhdWx0T3JkaW5hbCxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogZGVmYXVsdERheU9mTW9udGhPcmRpbmFsUGFyc2UsXG4gICAgICAgIHJlbGF0aXZlVGltZTogZGVmYXVsdFJlbGF0aXZlVGltZSxcblxuICAgICAgICBtb250aHM6IGRlZmF1bHRMb2NhbGVNb250aHMsXG4gICAgICAgIG1vbnRoc1Nob3J0OiBkZWZhdWx0TG9jYWxlTW9udGhzU2hvcnQsXG5cbiAgICAgICAgd2VlazogZGVmYXVsdExvY2FsZVdlZWssXG5cbiAgICAgICAgd2Vla2RheXM6IGRlZmF1bHRMb2NhbGVXZWVrZGF5cyxcbiAgICAgICAgd2Vla2RheXNNaW46IGRlZmF1bHRMb2NhbGVXZWVrZGF5c01pbixcbiAgICAgICAgd2Vla2RheXNTaG9ydDogZGVmYXVsdExvY2FsZVdlZWtkYXlzU2hvcnQsXG5cbiAgICAgICAgbWVyaWRpZW1QYXJzZTogZGVmYXVsdExvY2FsZU1lcmlkaWVtUGFyc2VcbiAgICB9O1xuXG4gICAgLy8gaW50ZXJuYWwgc3RvcmFnZSBmb3IgbG9jYWxlIGNvbmZpZyBmaWxlc1xuICAgIHZhciBsb2NhbGVzID0ge307XG4gICAgdmFyIGxvY2FsZUZhbWlsaWVzID0ge307XG4gICAgdmFyIGdsb2JhbExvY2FsZTtcblxuICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZUxvY2FsZShrZXkpIHtcbiAgICAgICAgcmV0dXJuIGtleSA/IGtleS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoJ18nLCAnLScpIDoga2V5O1xuICAgIH1cblxuICAgIC8vIHBpY2sgdGhlIGxvY2FsZSBmcm9tIHRoZSBhcnJheVxuICAgIC8vIHRyeSBbJ2VuLWF1JywgJ2VuLWdiJ10gYXMgJ2VuLWF1JywgJ2VuLWdiJywgJ2VuJywgYXMgaW4gbW92ZSB0aHJvdWdoIHRoZSBsaXN0IHRyeWluZyBlYWNoXG4gICAgLy8gc3Vic3RyaW5nIGZyb20gbW9zdCBzcGVjaWZpYyB0byBsZWFzdCwgYnV0IG1vdmUgdG8gdGhlIG5leHQgYXJyYXkgaXRlbSBpZiBpdCdzIGEgbW9yZSBzcGVjaWZpYyB2YXJpYW50IHRoYW4gdGhlIGN1cnJlbnQgcm9vdFxuICAgIGZ1bmN0aW9uIGNob29zZUxvY2FsZShuYW1lcykge1xuICAgICAgICB2YXIgaSA9IDAsIGosIG5leHQsIGxvY2FsZSwgc3BsaXQ7XG5cbiAgICAgICAgd2hpbGUgKGkgPCBuYW1lcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHNwbGl0ID0gbm9ybWFsaXplTG9jYWxlKG5hbWVzW2ldKS5zcGxpdCgnLScpO1xuICAgICAgICAgICAgaiA9IHNwbGl0Lmxlbmd0aDtcbiAgICAgICAgICAgIG5leHQgPSBub3JtYWxpemVMb2NhbGUobmFtZXNbaSArIDFdKTtcbiAgICAgICAgICAgIG5leHQgPSBuZXh0ID8gbmV4dC5zcGxpdCgnLScpIDogbnVsbDtcbiAgICAgICAgICAgIHdoaWxlIChqID4gMCkge1xuICAgICAgICAgICAgICAgIGxvY2FsZSA9IGxvYWRMb2NhbGUoc3BsaXQuc2xpY2UoMCwgaikuam9pbignLScpKTtcbiAgICAgICAgICAgICAgICBpZiAobG9jYWxlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChuZXh0ICYmIG5leHQubGVuZ3RoID49IGogJiYgY29tcGFyZUFycmF5cyhzcGxpdCwgbmV4dCwgdHJ1ZSkgPj0gaiAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgLy90aGUgbmV4dCBhcnJheSBpdGVtIGlzIGJldHRlciB0aGFuIGEgc2hhbGxvd2VyIHN1YnN0cmluZyBvZiB0aGlzIG9uZVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgai0tO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBnbG9iYWxMb2NhbGU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbG9hZExvY2FsZShuYW1lKSB7XG4gICAgICAgIHZhciBvbGRMb2NhbGUgPSBudWxsO1xuICAgICAgICAvLyBUT0RPOiBGaW5kIGEgYmV0dGVyIHdheSB0byByZWdpc3RlciBhbmQgbG9hZCBhbGwgdGhlIGxvY2FsZXMgaW4gTm9kZVxuICAgICAgICBpZiAoIWxvY2FsZXNbbmFtZV0gJiYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnKSAmJlxuICAgICAgICAgICAgICAgIG1vZHVsZSAmJiBtb2R1bGUuZXhwb3J0cykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBvbGRMb2NhbGUgPSBnbG9iYWxMb2NhbGUuX2FiYnI7XG4gICAgICAgICAgICAgICAgdmFyIGFsaWFzZWRSZXF1aXJlID0gcmVxdWlyZTtcbiAgICAgICAgICAgICAgICBhbGlhc2VkUmVxdWlyZSgnLi9sb2NhbGUvJyArIG5hbWUpO1xuICAgICAgICAgICAgICAgIGdldFNldEdsb2JhbExvY2FsZShvbGRMb2NhbGUpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge31cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbG9jYWxlc1tuYW1lXTtcbiAgICB9XG5cbiAgICAvLyBUaGlzIGZ1bmN0aW9uIHdpbGwgbG9hZCBsb2NhbGUgYW5kIHRoZW4gc2V0IHRoZSBnbG9iYWwgbG9jYWxlLiAgSWZcbiAgICAvLyBubyBhcmd1bWVudHMgYXJlIHBhc3NlZCBpbiwgaXQgd2lsbCBzaW1wbHkgcmV0dXJuIHRoZSBjdXJyZW50IGdsb2JhbFxuICAgIC8vIGxvY2FsZSBrZXkuXG4gICAgZnVuY3Rpb24gZ2V0U2V0R2xvYmFsTG9jYWxlIChrZXksIHZhbHVlcykge1xuICAgICAgICB2YXIgZGF0YTtcbiAgICAgICAgaWYgKGtleSkge1xuICAgICAgICAgICAgaWYgKGlzVW5kZWZpbmVkKHZhbHVlcykpIHtcbiAgICAgICAgICAgICAgICBkYXRhID0gZ2V0TG9jYWxlKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBkYXRhID0gZGVmaW5lTG9jYWxlKGtleSwgdmFsdWVzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAvLyBtb21lbnQuZHVyYXRpb24uX2xvY2FsZSA9IG1vbWVudC5fbG9jYWxlID0gZGF0YTtcbiAgICAgICAgICAgICAgICBnbG9iYWxMb2NhbGUgPSBkYXRhO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKCh0eXBlb2YgY29uc29sZSAhPT0gICd1bmRlZmluZWQnKSAmJiBjb25zb2xlLndhcm4pIHtcbiAgICAgICAgICAgICAgICAgICAgLy93YXJuIHVzZXIgaWYgYXJndW1lbnRzIGFyZSBwYXNzZWQgYnV0IHRoZSBsb2NhbGUgY291bGQgbm90IGJlIHNldFxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ0xvY2FsZSAnICsga2V5ICsgICcgbm90IGZvdW5kLiBEaWQgeW91IGZvcmdldCB0byBsb2FkIGl0PycpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBnbG9iYWxMb2NhbGUuX2FiYnI7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGVmaW5lTG9jYWxlIChuYW1lLCBjb25maWcpIHtcbiAgICAgICAgaWYgKGNvbmZpZyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIGxvY2FsZSwgcGFyZW50Q29uZmlnID0gYmFzZUNvbmZpZztcbiAgICAgICAgICAgIGNvbmZpZy5hYmJyID0gbmFtZTtcbiAgICAgICAgICAgIGlmIChsb2NhbGVzW25hbWVdICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBkZXByZWNhdGVTaW1wbGUoJ2RlZmluZUxvY2FsZU92ZXJyaWRlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICd1c2UgbW9tZW50LnVwZGF0ZUxvY2FsZShsb2NhbGVOYW1lLCBjb25maWcpIHRvIGNoYW5nZSAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdhbiBleGlzdGluZyBsb2NhbGUuIG1vbWVudC5kZWZpbmVMb2NhbGUobG9jYWxlTmFtZSwgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnY29uZmlnKSBzaG91bGQgb25seSBiZSB1c2VkIGZvciBjcmVhdGluZyBhIG5ldyBsb2NhbGUgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnU2VlIGh0dHA6Ly9tb21lbnRqcy5jb20vZ3VpZGVzLyMvd2FybmluZ3MvZGVmaW5lLWxvY2FsZS8gZm9yIG1vcmUgaW5mby4nKTtcbiAgICAgICAgICAgICAgICBwYXJlbnRDb25maWcgPSBsb2NhbGVzW25hbWVdLl9jb25maWc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZy5wYXJlbnRMb2NhbGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmIChsb2NhbGVzW2NvbmZpZy5wYXJlbnRMb2NhbGVdICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50Q29uZmlnID0gbG9jYWxlc1tjb25maWcucGFyZW50TG9jYWxlXS5fY29uZmlnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxvY2FsZSA9IGxvYWRMb2NhbGUoY29uZmlnLnBhcmVudExvY2FsZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50Q29uZmlnID0gbG9jYWxlLl9jb25maWc7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxvY2FsZUZhbWlsaWVzW2NvbmZpZy5wYXJlbnRMb2NhbGVdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxlRmFtaWxpZXNbY29uZmlnLnBhcmVudExvY2FsZV0gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsZUZhbWlsaWVzW2NvbmZpZy5wYXJlbnRMb2NhbGVdLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnOiBjb25maWdcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsb2NhbGVzW25hbWVdID0gbmV3IExvY2FsZShtZXJnZUNvbmZpZ3MocGFyZW50Q29uZmlnLCBjb25maWcpKTtcblxuICAgICAgICAgICAgaWYgKGxvY2FsZUZhbWlsaWVzW25hbWVdKSB7XG4gICAgICAgICAgICAgICAgbG9jYWxlRmFtaWxpZXNbbmFtZV0uZm9yRWFjaChmdW5jdGlvbiAoeCkge1xuICAgICAgICAgICAgICAgICAgICBkZWZpbmVMb2NhbGUoeC5uYW1lLCB4LmNvbmZpZyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGJhY2t3YXJkcyBjb21wYXQgZm9yIG5vdzogYWxzbyBzZXQgdGhlIGxvY2FsZVxuICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHdlIHNldCB0aGUgbG9jYWxlIEFGVEVSIGFsbCBjaGlsZCBsb2NhbGVzIGhhdmUgYmVlblxuICAgICAgICAgICAgLy8gY3JlYXRlZCwgc28gd2Ugd29uJ3QgZW5kIHVwIHdpdGggdGhlIGNoaWxkIGxvY2FsZSBzZXQuXG4gICAgICAgICAgICBnZXRTZXRHbG9iYWxMb2NhbGUobmFtZSk7XG5cblxuICAgICAgICAgICAgcmV0dXJuIGxvY2FsZXNbbmFtZV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyB1c2VmdWwgZm9yIHRlc3RpbmdcbiAgICAgICAgICAgIGRlbGV0ZSBsb2NhbGVzW25hbWVdO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiB1cGRhdGVMb2NhbGUobmFtZSwgY29uZmlnKSB7XG4gICAgICAgIGlmIChjb25maWcgIT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIGxvY2FsZSwgdG1wTG9jYWxlLCBwYXJlbnRDb25maWcgPSBiYXNlQ29uZmlnO1xuICAgICAgICAgICAgLy8gTUVSR0VcbiAgICAgICAgICAgIHRtcExvY2FsZSA9IGxvYWRMb2NhbGUobmFtZSk7XG4gICAgICAgICAgICBpZiAodG1wTG9jYWxlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBwYXJlbnRDb25maWcgPSB0bXBMb2NhbGUuX2NvbmZpZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbmZpZyA9IG1lcmdlQ29uZmlncyhwYXJlbnRDb25maWcsIGNvbmZpZyk7XG4gICAgICAgICAgICBsb2NhbGUgPSBuZXcgTG9jYWxlKGNvbmZpZyk7XG4gICAgICAgICAgICBsb2NhbGUucGFyZW50TG9jYWxlID0gbG9jYWxlc1tuYW1lXTtcbiAgICAgICAgICAgIGxvY2FsZXNbbmFtZV0gPSBsb2NhbGU7XG5cbiAgICAgICAgICAgIC8vIGJhY2t3YXJkcyBjb21wYXQgZm9yIG5vdzogYWxzbyBzZXQgdGhlIGxvY2FsZVxuICAgICAgICAgICAgZ2V0U2V0R2xvYmFsTG9jYWxlKG5hbWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gcGFzcyBudWxsIGZvciBjb25maWcgdG8gdW51cGRhdGUsIHVzZWZ1bCBmb3IgdGVzdHNcbiAgICAgICAgICAgIGlmIChsb2NhbGVzW25hbWVdICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAobG9jYWxlc1tuYW1lXS5wYXJlbnRMb2NhbGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBsb2NhbGVzW25hbWVdID0gbG9jYWxlc1tuYW1lXS5wYXJlbnRMb2NhbGU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsb2NhbGVzW25hbWVdICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGxvY2FsZXNbbmFtZV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsb2NhbGVzW25hbWVdO1xuICAgIH1cblxuICAgIC8vIHJldHVybnMgbG9jYWxlIGRhdGFcbiAgICBmdW5jdGlvbiBnZXRMb2NhbGUgKGtleSkge1xuICAgICAgICB2YXIgbG9jYWxlO1xuXG4gICAgICAgIGlmIChrZXkgJiYga2V5Ll9sb2NhbGUgJiYga2V5Ll9sb2NhbGUuX2FiYnIpIHtcbiAgICAgICAgICAgIGtleSA9IGtleS5fbG9jYWxlLl9hYmJyO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFrZXkpIHtcbiAgICAgICAgICAgIHJldHVybiBnbG9iYWxMb2NhbGU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzQXJyYXkoa2V5KSkge1xuICAgICAgICAgICAgLy9zaG9ydC1jaXJjdWl0IGV2ZXJ5dGhpbmcgZWxzZVxuICAgICAgICAgICAgbG9jYWxlID0gbG9hZExvY2FsZShrZXkpO1xuICAgICAgICAgICAgaWYgKGxvY2FsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBrZXkgPSBba2V5XTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjaG9vc2VMb2NhbGUoa2V5KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaXN0TG9jYWxlcygpIHtcbiAgICAgICAgcmV0dXJuIGtleXMobG9jYWxlcyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2hlY2tPdmVyZmxvdyAobSkge1xuICAgICAgICB2YXIgb3ZlcmZsb3c7XG4gICAgICAgIHZhciBhID0gbS5fYTtcblxuICAgICAgICBpZiAoYSAmJiBnZXRQYXJzaW5nRmxhZ3MobSkub3ZlcmZsb3cgPT09IC0yKSB7XG4gICAgICAgICAgICBvdmVyZmxvdyA9XG4gICAgICAgICAgICAgICAgYVtNT05USF0gICAgICAgPCAwIHx8IGFbTU9OVEhdICAgICAgID4gMTEgID8gTU9OVEggOlxuICAgICAgICAgICAgICAgIGFbREFURV0gICAgICAgIDwgMSB8fCBhW0RBVEVdICAgICAgICA+IGRheXNJbk1vbnRoKGFbWUVBUl0sIGFbTU9OVEhdKSA/IERBVEUgOlxuICAgICAgICAgICAgICAgIGFbSE9VUl0gICAgICAgIDwgMCB8fCBhW0hPVVJdICAgICAgICA+IDI0IHx8IChhW0hPVVJdID09PSAyNCAmJiAoYVtNSU5VVEVdICE9PSAwIHx8IGFbU0VDT05EXSAhPT0gMCB8fCBhW01JTExJU0VDT05EXSAhPT0gMCkpID8gSE9VUiA6XG4gICAgICAgICAgICAgICAgYVtNSU5VVEVdICAgICAgPCAwIHx8IGFbTUlOVVRFXSAgICAgID4gNTkgID8gTUlOVVRFIDpcbiAgICAgICAgICAgICAgICBhW1NFQ09ORF0gICAgICA8IDAgfHwgYVtTRUNPTkRdICAgICAgPiA1OSAgPyBTRUNPTkQgOlxuICAgICAgICAgICAgICAgIGFbTUlMTElTRUNPTkRdIDwgMCB8fCBhW01JTExJU0VDT05EXSA+IDk5OSA/IE1JTExJU0VDT05EIDpcbiAgICAgICAgICAgICAgICAtMTtcblxuICAgICAgICAgICAgaWYgKGdldFBhcnNpbmdGbGFncyhtKS5fb3ZlcmZsb3dEYXlPZlllYXIgJiYgKG92ZXJmbG93IDwgWUVBUiB8fCBvdmVyZmxvdyA+IERBVEUpKSB7XG4gICAgICAgICAgICAgICAgb3ZlcmZsb3cgPSBEQVRFO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGdldFBhcnNpbmdGbGFncyhtKS5fb3ZlcmZsb3dXZWVrcyAmJiBvdmVyZmxvdyA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBvdmVyZmxvdyA9IFdFRUs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZ2V0UGFyc2luZ0ZsYWdzKG0pLl9vdmVyZmxvd1dlZWtkYXkgJiYgb3ZlcmZsb3cgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgb3ZlcmZsb3cgPSBXRUVLREFZO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MobSkub3ZlcmZsb3cgPSBvdmVyZmxvdztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIC8vIFBpY2sgdGhlIGZpcnN0IGRlZmluZWQgb2YgdHdvIG9yIHRocmVlIGFyZ3VtZW50cy5cbiAgICBmdW5jdGlvbiBkZWZhdWx0cyhhLCBiLCBjKSB7XG4gICAgICAgIGlmIChhICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBhO1xuICAgICAgICB9XG4gICAgICAgIGlmIChiICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGN1cnJlbnREYXRlQXJyYXkoY29uZmlnKSB7XG4gICAgICAgIC8vIGhvb2tzIGlzIGFjdHVhbGx5IHRoZSBleHBvcnRlZCBtb21lbnQgb2JqZWN0XG4gICAgICAgIHZhciBub3dWYWx1ZSA9IG5ldyBEYXRlKGhvb2tzLm5vdygpKTtcbiAgICAgICAgaWYgKGNvbmZpZy5fdXNlVVRDKSB7XG4gICAgICAgICAgICByZXR1cm4gW25vd1ZhbHVlLmdldFVUQ0Z1bGxZZWFyKCksIG5vd1ZhbHVlLmdldFVUQ01vbnRoKCksIG5vd1ZhbHVlLmdldFVUQ0RhdGUoKV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtub3dWYWx1ZS5nZXRGdWxsWWVhcigpLCBub3dWYWx1ZS5nZXRNb250aCgpLCBub3dWYWx1ZS5nZXREYXRlKCldO1xuICAgIH1cblxuICAgIC8vIGNvbnZlcnQgYW4gYXJyYXkgdG8gYSBkYXRlLlxuICAgIC8vIHRoZSBhcnJheSBzaG91bGQgbWlycm9yIHRoZSBwYXJhbWV0ZXJzIGJlbG93XG4gICAgLy8gbm90ZTogYWxsIHZhbHVlcyBwYXN0IHRoZSB5ZWFyIGFyZSBvcHRpb25hbCBhbmQgd2lsbCBkZWZhdWx0IHRvIHRoZSBsb3dlc3QgcG9zc2libGUgdmFsdWUuXG4gICAgLy8gW3llYXIsIG1vbnRoLCBkYXkgLCBob3VyLCBtaW51dGUsIHNlY29uZCwgbWlsbGlzZWNvbmRdXG4gICAgZnVuY3Rpb24gY29uZmlnRnJvbUFycmF5IChjb25maWcpIHtcbiAgICAgICAgdmFyIGksIGRhdGUsIGlucHV0ID0gW10sIGN1cnJlbnREYXRlLCBleHBlY3RlZFdlZWtkYXksIHllYXJUb1VzZTtcblxuICAgICAgICBpZiAoY29uZmlnLl9kKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjdXJyZW50RGF0ZSA9IGN1cnJlbnREYXRlQXJyYXkoY29uZmlnKTtcblxuICAgICAgICAvL2NvbXB1dGUgZGF5IG9mIHRoZSB5ZWFyIGZyb20gd2Vla3MgYW5kIHdlZWtkYXlzXG4gICAgICAgIGlmIChjb25maWcuX3cgJiYgY29uZmlnLl9hW0RBVEVdID09IG51bGwgJiYgY29uZmlnLl9hW01PTlRIXSA9PSBudWxsKSB7XG4gICAgICAgICAgICBkYXlPZlllYXJGcm9tV2Vla0luZm8oY29uZmlnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vaWYgdGhlIGRheSBvZiB0aGUgeWVhciBpcyBzZXQsIGZpZ3VyZSBvdXQgd2hhdCBpdCBpc1xuICAgICAgICBpZiAoY29uZmlnLl9kYXlPZlllYXIgIT0gbnVsbCkge1xuICAgICAgICAgICAgeWVhclRvVXNlID0gZGVmYXVsdHMoY29uZmlnLl9hW1lFQVJdLCBjdXJyZW50RGF0ZVtZRUFSXSk7XG5cbiAgICAgICAgICAgIGlmIChjb25maWcuX2RheU9mWWVhciA+IGRheXNJblllYXIoeWVhclRvVXNlKSB8fCBjb25maWcuX2RheU9mWWVhciA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLl9vdmVyZmxvd0RheU9mWWVhciA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRhdGUgPSBjcmVhdGVVVENEYXRlKHllYXJUb1VzZSwgMCwgY29uZmlnLl9kYXlPZlllYXIpO1xuICAgICAgICAgICAgY29uZmlnLl9hW01PTlRIXSA9IGRhdGUuZ2V0VVRDTW9udGgoKTtcbiAgICAgICAgICAgIGNvbmZpZy5fYVtEQVRFXSA9IGRhdGUuZ2V0VVRDRGF0ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGVmYXVsdCB0byBjdXJyZW50IGRhdGUuXG4gICAgICAgIC8vICogaWYgbm8geWVhciwgbW9udGgsIGRheSBvZiBtb250aCBhcmUgZ2l2ZW4sIGRlZmF1bHQgdG8gdG9kYXlcbiAgICAgICAgLy8gKiBpZiBkYXkgb2YgbW9udGggaXMgZ2l2ZW4sIGRlZmF1bHQgbW9udGggYW5kIHllYXJcbiAgICAgICAgLy8gKiBpZiBtb250aCBpcyBnaXZlbiwgZGVmYXVsdCBvbmx5IHllYXJcbiAgICAgICAgLy8gKiBpZiB5ZWFyIGlzIGdpdmVuLCBkb24ndCBkZWZhdWx0IGFueXRoaW5nXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCAzICYmIGNvbmZpZy5fYVtpXSA9PSBudWxsOyArK2kpIHtcbiAgICAgICAgICAgIGNvbmZpZy5fYVtpXSA9IGlucHV0W2ldID0gY3VycmVudERhdGVbaV07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBaZXJvIG91dCB3aGF0ZXZlciB3YXMgbm90IGRlZmF1bHRlZCwgaW5jbHVkaW5nIHRpbWVcbiAgICAgICAgZm9yICg7IGkgPCA3OyBpKyspIHtcbiAgICAgICAgICAgIGNvbmZpZy5fYVtpXSA9IGlucHV0W2ldID0gKGNvbmZpZy5fYVtpXSA9PSBudWxsKSA/IChpID09PSAyID8gMSA6IDApIDogY29uZmlnLl9hW2ldO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgZm9yIDI0OjAwOjAwLjAwMFxuICAgICAgICBpZiAoY29uZmlnLl9hW0hPVVJdID09PSAyNCAmJlxuICAgICAgICAgICAgICAgIGNvbmZpZy5fYVtNSU5VVEVdID09PSAwICYmXG4gICAgICAgICAgICAgICAgY29uZmlnLl9hW1NFQ09ORF0gPT09IDAgJiZcbiAgICAgICAgICAgICAgICBjb25maWcuX2FbTUlMTElTRUNPTkRdID09PSAwKSB7XG4gICAgICAgICAgICBjb25maWcuX25leHREYXkgPSB0cnVlO1xuICAgICAgICAgICAgY29uZmlnLl9hW0hPVVJdID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbmZpZy5fZCA9IChjb25maWcuX3VzZVVUQyA/IGNyZWF0ZVVUQ0RhdGUgOiBjcmVhdGVEYXRlKS5hcHBseShudWxsLCBpbnB1dCk7XG4gICAgICAgIGV4cGVjdGVkV2Vla2RheSA9IGNvbmZpZy5fdXNlVVRDID8gY29uZmlnLl9kLmdldFVUQ0RheSgpIDogY29uZmlnLl9kLmdldERheSgpO1xuXG4gICAgICAgIC8vIEFwcGx5IHRpbWV6b25lIG9mZnNldCBmcm9tIGlucHV0LiBUaGUgYWN0dWFsIHV0Y09mZnNldCBjYW4gYmUgY2hhbmdlZFxuICAgICAgICAvLyB3aXRoIHBhcnNlWm9uZS5cbiAgICAgICAgaWYgKGNvbmZpZy5fdHptICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNvbmZpZy5fZC5zZXRVVENNaW51dGVzKGNvbmZpZy5fZC5nZXRVVENNaW51dGVzKCkgLSBjb25maWcuX3R6bSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnLl9uZXh0RGF5KSB7XG4gICAgICAgICAgICBjb25maWcuX2FbSE9VUl0gPSAyNDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNoZWNrIGZvciBtaXNtYXRjaGluZyBkYXkgb2Ygd2Vla1xuICAgICAgICBpZiAoY29uZmlnLl93ICYmIHR5cGVvZiBjb25maWcuX3cuZCAhPT0gJ3VuZGVmaW5lZCcgJiYgY29uZmlnLl93LmQgIT09IGV4cGVjdGVkV2Vla2RheSkge1xuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykud2Vla2RheU1pc21hdGNoID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRheU9mWWVhckZyb21XZWVrSW5mbyhjb25maWcpIHtcbiAgICAgICAgdmFyIHcsIHdlZWtZZWFyLCB3ZWVrLCB3ZWVrZGF5LCBkb3csIGRveSwgdGVtcCwgd2Vla2RheU92ZXJmbG93O1xuXG4gICAgICAgIHcgPSBjb25maWcuX3c7XG4gICAgICAgIGlmICh3LkdHICE9IG51bGwgfHwgdy5XICE9IG51bGwgfHwgdy5FICE9IG51bGwpIHtcbiAgICAgICAgICAgIGRvdyA9IDE7XG4gICAgICAgICAgICBkb3kgPSA0O1xuXG4gICAgICAgICAgICAvLyBUT0RPOiBXZSBuZWVkIHRvIHRha2UgdGhlIGN1cnJlbnQgaXNvV2Vla1llYXIsIGJ1dCB0aGF0IGRlcGVuZHMgb25cbiAgICAgICAgICAgIC8vIGhvdyB3ZSBpbnRlcnByZXQgbm93IChsb2NhbCwgdXRjLCBmaXhlZCBvZmZzZXQpLiBTbyBjcmVhdGVcbiAgICAgICAgICAgIC8vIGEgbm93IHZlcnNpb24gb2YgY3VycmVudCBjb25maWcgKHRha2UgbG9jYWwvdXRjL29mZnNldCBmbGFncywgYW5kXG4gICAgICAgICAgICAvLyBjcmVhdGUgbm93KS5cbiAgICAgICAgICAgIHdlZWtZZWFyID0gZGVmYXVsdHMody5HRywgY29uZmlnLl9hW1lFQVJdLCB3ZWVrT2ZZZWFyKGNyZWF0ZUxvY2FsKCksIDEsIDQpLnllYXIpO1xuICAgICAgICAgICAgd2VlayA9IGRlZmF1bHRzKHcuVywgMSk7XG4gICAgICAgICAgICB3ZWVrZGF5ID0gZGVmYXVsdHMody5FLCAxKTtcbiAgICAgICAgICAgIGlmICh3ZWVrZGF5IDwgMSB8fCB3ZWVrZGF5ID4gNykge1xuICAgICAgICAgICAgICAgIHdlZWtkYXlPdmVyZmxvdyA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkb3cgPSBjb25maWcuX2xvY2FsZS5fd2Vlay5kb3c7XG4gICAgICAgICAgICBkb3kgPSBjb25maWcuX2xvY2FsZS5fd2Vlay5kb3k7XG5cbiAgICAgICAgICAgIHZhciBjdXJXZWVrID0gd2Vla09mWWVhcihjcmVhdGVMb2NhbCgpLCBkb3csIGRveSk7XG5cbiAgICAgICAgICAgIHdlZWtZZWFyID0gZGVmYXVsdHMody5nZywgY29uZmlnLl9hW1lFQVJdLCBjdXJXZWVrLnllYXIpO1xuXG4gICAgICAgICAgICAvLyBEZWZhdWx0IHRvIGN1cnJlbnQgd2Vlay5cbiAgICAgICAgICAgIHdlZWsgPSBkZWZhdWx0cyh3LncsIGN1cldlZWsud2Vlayk7XG5cbiAgICAgICAgICAgIGlmICh3LmQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vIHdlZWtkYXkgLS0gbG93IGRheSBudW1iZXJzIGFyZSBjb25zaWRlcmVkIG5leHQgd2Vla1xuICAgICAgICAgICAgICAgIHdlZWtkYXkgPSB3LmQ7XG4gICAgICAgICAgICAgICAgaWYgKHdlZWtkYXkgPCAwIHx8IHdlZWtkYXkgPiA2KSB7XG4gICAgICAgICAgICAgICAgICAgIHdlZWtkYXlPdmVyZmxvdyA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmICh3LmUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vIGxvY2FsIHdlZWtkYXkgLS0gY291bnRpbmcgc3RhcnRzIGZyb20gYmVnaW5pbmcgb2Ygd2Vla1xuICAgICAgICAgICAgICAgIHdlZWtkYXkgPSB3LmUgKyBkb3c7XG4gICAgICAgICAgICAgICAgaWYgKHcuZSA8IDAgfHwgdy5lID4gNikge1xuICAgICAgICAgICAgICAgICAgICB3ZWVrZGF5T3ZlcmZsb3cgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gZGVmYXVsdCB0byBiZWdpbmluZyBvZiB3ZWVrXG4gICAgICAgICAgICAgICAgd2Vla2RheSA9IGRvdztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAod2VlayA8IDEgfHwgd2VlayA+IHdlZWtzSW5ZZWFyKHdlZWtZZWFyLCBkb3csIGRveSkpIHtcbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLl9vdmVyZmxvd1dlZWtzID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmICh3ZWVrZGF5T3ZlcmZsb3cgIT0gbnVsbCkge1xuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuX292ZXJmbG93V2Vla2RheSA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0ZW1wID0gZGF5T2ZZZWFyRnJvbVdlZWtzKHdlZWtZZWFyLCB3ZWVrLCB3ZWVrZGF5LCBkb3csIGRveSk7XG4gICAgICAgICAgICBjb25maWcuX2FbWUVBUl0gPSB0ZW1wLnllYXI7XG4gICAgICAgICAgICBjb25maWcuX2RheU9mWWVhciA9IHRlbXAuZGF5T2ZZZWFyO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gaXNvIDg2MDEgcmVnZXhcbiAgICAvLyAwMDAwLTAwLTAwIDAwMDAtVzAwIG9yIDAwMDAtVzAwLTAgKyBUICsgMDAgb3IgMDA6MDAgb3IgMDA6MDA6MDAgb3IgMDA6MDA6MDAuMDAwICsgKzAwOjAwIG9yICswMDAwIG9yICswMClcbiAgICB2YXIgZXh0ZW5kZWRJc29SZWdleCA9IC9eXFxzKigoPzpbKy1dXFxkezZ9fFxcZHs0fSktKD86XFxkXFxkLVxcZFxcZHxXXFxkXFxkLVxcZHxXXFxkXFxkfFxcZFxcZFxcZHxcXGRcXGQpKSg/OihUfCApKFxcZFxcZCg/OjpcXGRcXGQoPzo6XFxkXFxkKD86Wy4sXVxcZCspPyk/KT8pKFtcXCtcXC1dXFxkXFxkKD86Oj9cXGRcXGQpP3xcXHMqWik/KT8kLztcbiAgICB2YXIgYmFzaWNJc29SZWdleCA9IC9eXFxzKigoPzpbKy1dXFxkezZ9fFxcZHs0fSkoPzpcXGRcXGRcXGRcXGR8V1xcZFxcZFxcZHxXXFxkXFxkfFxcZFxcZFxcZHxcXGRcXGQpKSg/OihUfCApKFxcZFxcZCg/OlxcZFxcZCg/OlxcZFxcZCg/OlsuLF1cXGQrKT8pPyk/KShbXFwrXFwtXVxcZFxcZCg/Ojo/XFxkXFxkKT98XFxzKlopPyk/JC87XG5cbiAgICB2YXIgdHpSZWdleCA9IC9afFsrLV1cXGRcXGQoPzo6P1xcZFxcZCk/LztcblxuICAgIHZhciBpc29EYXRlcyA9IFtcbiAgICAgICAgWydZWVlZWVktTU0tREQnLCAvWystXVxcZHs2fS1cXGRcXGQtXFxkXFxkL10sXG4gICAgICAgIFsnWVlZWS1NTS1ERCcsIC9cXGR7NH0tXFxkXFxkLVxcZFxcZC9dLFxuICAgICAgICBbJ0dHR0ctW1ddV1ctRScsIC9cXGR7NH0tV1xcZFxcZC1cXGQvXSxcbiAgICAgICAgWydHR0dHLVtXXVdXJywgL1xcZHs0fS1XXFxkXFxkLywgZmFsc2VdLFxuICAgICAgICBbJ1lZWVktREREJywgL1xcZHs0fS1cXGR7M30vXSxcbiAgICAgICAgWydZWVlZLU1NJywgL1xcZHs0fS1cXGRcXGQvLCBmYWxzZV0sXG4gICAgICAgIFsnWVlZWVlZTU1ERCcsIC9bKy1dXFxkezEwfS9dLFxuICAgICAgICBbJ1lZWVlNTUREJywgL1xcZHs4fS9dLFxuICAgICAgICAvLyBZWVlZTU0gaXMgTk9UIGFsbG93ZWQgYnkgdGhlIHN0YW5kYXJkXG4gICAgICAgIFsnR0dHR1tXXVdXRScsIC9cXGR7NH1XXFxkezN9L10sXG4gICAgICAgIFsnR0dHR1tXXVdXJywgL1xcZHs0fVdcXGR7Mn0vLCBmYWxzZV0sXG4gICAgICAgIFsnWVlZWURERCcsIC9cXGR7N30vXVxuICAgIF07XG5cbiAgICAvLyBpc28gdGltZSBmb3JtYXRzIGFuZCByZWdleGVzXG4gICAgdmFyIGlzb1RpbWVzID0gW1xuICAgICAgICBbJ0hIOm1tOnNzLlNTU1MnLCAvXFxkXFxkOlxcZFxcZDpcXGRcXGRcXC5cXGQrL10sXG4gICAgICAgIFsnSEg6bW06c3MsU1NTUycsIC9cXGRcXGQ6XFxkXFxkOlxcZFxcZCxcXGQrL10sXG4gICAgICAgIFsnSEg6bW06c3MnLCAvXFxkXFxkOlxcZFxcZDpcXGRcXGQvXSxcbiAgICAgICAgWydISDptbScsIC9cXGRcXGQ6XFxkXFxkL10sXG4gICAgICAgIFsnSEhtbXNzLlNTU1MnLCAvXFxkXFxkXFxkXFxkXFxkXFxkXFwuXFxkKy9dLFxuICAgICAgICBbJ0hIbW1zcyxTU1NTJywgL1xcZFxcZFxcZFxcZFxcZFxcZCxcXGQrL10sXG4gICAgICAgIFsnSEhtbXNzJywgL1xcZFxcZFxcZFxcZFxcZFxcZC9dLFxuICAgICAgICBbJ0hIbW0nLCAvXFxkXFxkXFxkXFxkL10sXG4gICAgICAgIFsnSEgnLCAvXFxkXFxkL11cbiAgICBdO1xuXG4gICAgdmFyIGFzcE5ldEpzb25SZWdleCA9IC9eXFwvP0RhdGVcXCgoXFwtP1xcZCspL2k7XG5cbiAgICAvLyBkYXRlIGZyb20gaXNvIGZvcm1hdFxuICAgIGZ1bmN0aW9uIGNvbmZpZ0Zyb21JU08oY29uZmlnKSB7XG4gICAgICAgIHZhciBpLCBsLFxuICAgICAgICAgICAgc3RyaW5nID0gY29uZmlnLl9pLFxuICAgICAgICAgICAgbWF0Y2ggPSBleHRlbmRlZElzb1JlZ2V4LmV4ZWMoc3RyaW5nKSB8fCBiYXNpY0lzb1JlZ2V4LmV4ZWMoc3RyaW5nKSxcbiAgICAgICAgICAgIGFsbG93VGltZSwgZGF0ZUZvcm1hdCwgdGltZUZvcm1hdCwgdHpGb3JtYXQ7XG5cbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5pc28gPSB0cnVlO1xuXG4gICAgICAgICAgICBmb3IgKGkgPSAwLCBsID0gaXNvRGF0ZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzb0RhdGVzW2ldWzFdLmV4ZWMobWF0Y2hbMV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGVGb3JtYXQgPSBpc29EYXRlc1tpXVswXTtcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dUaW1lID0gaXNvRGF0ZXNbaV1bMl0gIT09IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZGF0ZUZvcm1hdCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29uZmlnLl9pc1ZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1hdGNoWzNdKSB7XG4gICAgICAgICAgICAgICAgZm9yIChpID0gMCwgbCA9IGlzb1RpbWVzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNvVGltZXNbaV1bMV0uZXhlYyhtYXRjaFszXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1hdGNoWzJdIHNob3VsZCBiZSAnVCcgb3Igc3BhY2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVGb3JtYXQgPSAobWF0Y2hbMl0gfHwgJyAnKSArIGlzb1RpbWVzW2ldWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRpbWVGb3JtYXQgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBjb25maWcuX2lzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghYWxsb3dUaW1lICYmIHRpbWVGb3JtYXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvbmZpZy5faXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtYXRjaFs0XSkge1xuICAgICAgICAgICAgICAgIGlmICh0elJlZ2V4LmV4ZWMobWF0Y2hbNF0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHR6Rm9ybWF0ID0gJ1onO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZy5faXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uZmlnLl9mID0gZGF0ZUZvcm1hdCArICh0aW1lRm9ybWF0IHx8ICcnKSArICh0ekZvcm1hdCB8fCAnJyk7XG4gICAgICAgICAgICBjb25maWdGcm9tU3RyaW5nQW5kRm9ybWF0KGNvbmZpZyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25maWcuX2lzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJGQyAyODIyIHJlZ2V4OiBGb3IgZGV0YWlscyBzZWUgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzI4MjIjc2VjdGlvbi0zLjNcbiAgICB2YXIgcmZjMjgyMiA9IC9eKD86KE1vbnxUdWV8V2VkfFRodXxGcml8U2F0fFN1biksP1xccyk/KFxcZHsxLDJ9KVxccyhKYW58RmVifE1hcnxBcHJ8TWF5fEp1bnxKdWx8QXVnfFNlcHxPY3R8Tm92fERlYylcXHMoXFxkezIsNH0pXFxzKFxcZFxcZCk6KFxcZFxcZCkoPzo6KFxcZFxcZCkpP1xccyg/OihVVHxHTVR8W0VDTVBdW1NEXVQpfChbWnpdKXwoWystXVxcZHs0fSkpJC87XG5cbiAgICBmdW5jdGlvbiBleHRyYWN0RnJvbVJGQzI4MjJTdHJpbmdzKHllYXJTdHIsIG1vbnRoU3RyLCBkYXlTdHIsIGhvdXJTdHIsIG1pbnV0ZVN0ciwgc2Vjb25kU3RyKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBbXG4gICAgICAgICAgICB1bnRydW5jYXRlWWVhcih5ZWFyU3RyKSxcbiAgICAgICAgICAgIGRlZmF1bHRMb2NhbGVNb250aHNTaG9ydC5pbmRleE9mKG1vbnRoU3RyKSxcbiAgICAgICAgICAgIHBhcnNlSW50KGRheVN0ciwgMTApLFxuICAgICAgICAgICAgcGFyc2VJbnQoaG91clN0ciwgMTApLFxuICAgICAgICAgICAgcGFyc2VJbnQobWludXRlU3RyLCAxMClcbiAgICAgICAgXTtcblxuICAgICAgICBpZiAoc2Vjb25kU3RyKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaChwYXJzZUludChzZWNvbmRTdHIsIDEwKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHVudHJ1bmNhdGVZZWFyKHllYXJTdHIpIHtcbiAgICAgICAgdmFyIHllYXIgPSBwYXJzZUludCh5ZWFyU3RyLCAxMCk7XG4gICAgICAgIGlmICh5ZWFyIDw9IDQ5KSB7XG4gICAgICAgICAgICByZXR1cm4gMjAwMCArIHllYXI7XG4gICAgICAgIH0gZWxzZSBpZiAoeWVhciA8PSA5OTkpIHtcbiAgICAgICAgICAgIHJldHVybiAxOTAwICsgeWVhcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geWVhcjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwcmVwcm9jZXNzUkZDMjgyMihzKSB7XG4gICAgICAgIC8vIFJlbW92ZSBjb21tZW50cyBhbmQgZm9sZGluZyB3aGl0ZXNwYWNlIGFuZCByZXBsYWNlIG11bHRpcGxlLXNwYWNlcyB3aXRoIGEgc2luZ2xlIHNwYWNlXG4gICAgICAgIHJldHVybiBzLnJlcGxhY2UoL1xcKFteKV0qXFwpfFtcXG5cXHRdL2csICcgJykucmVwbGFjZSgvKFxcc1xccyspL2csICcgJykucmVwbGFjZSgvXlxcc1xccyovLCAnJykucmVwbGFjZSgvXFxzXFxzKiQvLCAnJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2hlY2tXZWVrZGF5KHdlZWtkYXlTdHIsIHBhcnNlZElucHV0LCBjb25maWcpIHtcbiAgICAgICAgaWYgKHdlZWtkYXlTdHIpIHtcbiAgICAgICAgICAgIC8vIFRPRE86IFJlcGxhY2UgdGhlIHZhbmlsbGEgSlMgRGF0ZSBvYmplY3Qgd2l0aCBhbiBpbmRlcGVudGVudCBkYXktb2Ytd2VlayBjaGVjay5cbiAgICAgICAgICAgIHZhciB3ZWVrZGF5UHJvdmlkZWQgPSBkZWZhdWx0TG9jYWxlV2Vla2RheXNTaG9ydC5pbmRleE9mKHdlZWtkYXlTdHIpLFxuICAgICAgICAgICAgICAgIHdlZWtkYXlBY3R1YWwgPSBuZXcgRGF0ZShwYXJzZWRJbnB1dFswXSwgcGFyc2VkSW5wdXRbMV0sIHBhcnNlZElucHV0WzJdKS5nZXREYXkoKTtcbiAgICAgICAgICAgIGlmICh3ZWVrZGF5UHJvdmlkZWQgIT09IHdlZWtkYXlBY3R1YWwpIHtcbiAgICAgICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS53ZWVrZGF5TWlzbWF0Y2ggPSB0cnVlO1xuICAgICAgICAgICAgICAgIGNvbmZpZy5faXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICB2YXIgb2JzT2Zmc2V0cyA9IHtcbiAgICAgICAgVVQ6IDAsXG4gICAgICAgIEdNVDogMCxcbiAgICAgICAgRURUOiAtNCAqIDYwLFxuICAgICAgICBFU1Q6IC01ICogNjAsXG4gICAgICAgIENEVDogLTUgKiA2MCxcbiAgICAgICAgQ1NUOiAtNiAqIDYwLFxuICAgICAgICBNRFQ6IC02ICogNjAsXG4gICAgICAgIE1TVDogLTcgKiA2MCxcbiAgICAgICAgUERUOiAtNyAqIDYwLFxuICAgICAgICBQU1Q6IC04ICogNjBcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gY2FsY3VsYXRlT2Zmc2V0KG9ic09mZnNldCwgbWlsaXRhcnlPZmZzZXQsIG51bU9mZnNldCkge1xuICAgICAgICBpZiAob2JzT2Zmc2V0KSB7XG4gICAgICAgICAgICByZXR1cm4gb2JzT2Zmc2V0c1tvYnNPZmZzZXRdO1xuICAgICAgICB9IGVsc2UgaWYgKG1pbGl0YXJ5T2Zmc2V0KSB7XG4gICAgICAgICAgICAvLyB0aGUgb25seSBhbGxvd2VkIG1pbGl0YXJ5IHR6IGlzIFpcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIGhtID0gcGFyc2VJbnQobnVtT2Zmc2V0LCAxMCk7XG4gICAgICAgICAgICB2YXIgbSA9IGhtICUgMTAwLCBoID0gKGhtIC0gbSkgLyAxMDA7XG4gICAgICAgICAgICByZXR1cm4gaCAqIDYwICsgbTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGRhdGUgYW5kIHRpbWUgZnJvbSByZWYgMjgyMiBmb3JtYXRcbiAgICBmdW5jdGlvbiBjb25maWdGcm9tUkZDMjgyMihjb25maWcpIHtcbiAgICAgICAgdmFyIG1hdGNoID0gcmZjMjgyMi5leGVjKHByZXByb2Nlc3NSRkMyODIyKGNvbmZpZy5faSkpO1xuICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICAgIHZhciBwYXJzZWRBcnJheSA9IGV4dHJhY3RGcm9tUkZDMjgyMlN0cmluZ3MobWF0Y2hbNF0sIG1hdGNoWzNdLCBtYXRjaFsyXSwgbWF0Y2hbNV0sIG1hdGNoWzZdLCBtYXRjaFs3XSk7XG4gICAgICAgICAgICBpZiAoIWNoZWNrV2Vla2RheShtYXRjaFsxXSwgcGFyc2VkQXJyYXksIGNvbmZpZykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbmZpZy5fYSA9IHBhcnNlZEFycmF5O1xuICAgICAgICAgICAgY29uZmlnLl90em0gPSBjYWxjdWxhdGVPZmZzZXQobWF0Y2hbOF0sIG1hdGNoWzldLCBtYXRjaFsxMF0pO1xuXG4gICAgICAgICAgICBjb25maWcuX2QgPSBjcmVhdGVVVENEYXRlLmFwcGx5KG51bGwsIGNvbmZpZy5fYSk7XG4gICAgICAgICAgICBjb25maWcuX2Quc2V0VVRDTWludXRlcyhjb25maWcuX2QuZ2V0VVRDTWludXRlcygpIC0gY29uZmlnLl90em0pO1xuXG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5yZmMyODIyID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbmZpZy5faXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gZGF0ZSBmcm9tIGlzbyBmb3JtYXQgb3IgZmFsbGJhY2tcbiAgICBmdW5jdGlvbiBjb25maWdGcm9tU3RyaW5nKGNvbmZpZykge1xuICAgICAgICB2YXIgbWF0Y2hlZCA9IGFzcE5ldEpzb25SZWdleC5leGVjKGNvbmZpZy5faSk7XG5cbiAgICAgICAgaWYgKG1hdGNoZWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbmZpZy5fZCA9IG5ldyBEYXRlKCttYXRjaGVkWzFdKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbmZpZ0Zyb21JU08oY29uZmlnKTtcbiAgICAgICAgaWYgKGNvbmZpZy5faXNWYWxpZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBjb25maWcuX2lzVmFsaWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25maWdGcm9tUkZDMjgyMihjb25maWcpO1xuICAgICAgICBpZiAoY29uZmlnLl9pc1ZhbGlkID09PSBmYWxzZSkge1xuICAgICAgICAgICAgZGVsZXRlIGNvbmZpZy5faXNWYWxpZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEZpbmFsIGF0dGVtcHQsIHVzZSBJbnB1dCBGYWxsYmFja1xuICAgICAgICBob29rcy5jcmVhdGVGcm9tSW5wdXRGYWxsYmFjayhjb25maWcpO1xuICAgIH1cblxuICAgIGhvb2tzLmNyZWF0ZUZyb21JbnB1dEZhbGxiYWNrID0gZGVwcmVjYXRlKFxuICAgICAgICAndmFsdWUgcHJvdmlkZWQgaXMgbm90IGluIGEgcmVjb2duaXplZCBSRkMyODIyIG9yIElTTyBmb3JtYXQuIG1vbWVudCBjb25zdHJ1Y3Rpb24gZmFsbHMgYmFjayB0byBqcyBEYXRlKCksICcgK1xuICAgICAgICAnd2hpY2ggaXMgbm90IHJlbGlhYmxlIGFjcm9zcyBhbGwgYnJvd3NlcnMgYW5kIHZlcnNpb25zLiBOb24gUkZDMjgyMi9JU08gZGF0ZSBmb3JtYXRzIGFyZSAnICtcbiAgICAgICAgJ2Rpc2NvdXJhZ2VkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYW4gdXBjb21pbmcgbWFqb3IgcmVsZWFzZS4gUGxlYXNlIHJlZmVyIHRvICcgK1xuICAgICAgICAnaHR0cDovL21vbWVudGpzLmNvbS9ndWlkZXMvIy93YXJuaW5ncy9qcy1kYXRlLyBmb3IgbW9yZSBpbmZvLicsXG4gICAgICAgIGZ1bmN0aW9uIChjb25maWcpIHtcbiAgICAgICAgICAgIGNvbmZpZy5fZCA9IG5ldyBEYXRlKGNvbmZpZy5faSArIChjb25maWcuX3VzZVVUQyA/ICcgVVRDJyA6ICcnKSk7XG4gICAgICAgIH1cbiAgICApO1xuXG4gICAgLy8gY29uc3RhbnQgdGhhdCByZWZlcnMgdG8gdGhlIElTTyBzdGFuZGFyZFxuICAgIGhvb2tzLklTT184NjAxID0gZnVuY3Rpb24gKCkge307XG5cbiAgICAvLyBjb25zdGFudCB0aGF0IHJlZmVycyB0byB0aGUgUkZDIDI4MjIgZm9ybVxuICAgIGhvb2tzLlJGQ18yODIyID0gZnVuY3Rpb24gKCkge307XG5cbiAgICAvLyBkYXRlIGZyb20gc3RyaW5nIGFuZCBmb3JtYXQgc3RyaW5nXG4gICAgZnVuY3Rpb24gY29uZmlnRnJvbVN0cmluZ0FuZEZvcm1hdChjb25maWcpIHtcbiAgICAgICAgLy8gVE9ETzogTW92ZSB0aGlzIHRvIGFub3RoZXIgcGFydCBvZiB0aGUgY3JlYXRpb24gZmxvdyB0byBwcmV2ZW50IGNpcmN1bGFyIGRlcHNcbiAgICAgICAgaWYgKGNvbmZpZy5fZiA9PT0gaG9va3MuSVNPXzg2MDEpIHtcbiAgICAgICAgICAgIGNvbmZpZ0Zyb21JU08oY29uZmlnKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlnLl9mID09PSBob29rcy5SRkNfMjgyMikge1xuICAgICAgICAgICAgY29uZmlnRnJvbVJGQzI4MjIoY29uZmlnKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25maWcuX2EgPSBbXTtcbiAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuZW1wdHkgPSB0cnVlO1xuXG4gICAgICAgIC8vIFRoaXMgYXJyYXkgaXMgdXNlZCB0byBtYWtlIGEgRGF0ZSwgZWl0aGVyIHdpdGggYG5ldyBEYXRlYCBvciBgRGF0ZS5VVENgXG4gICAgICAgIHZhciBzdHJpbmcgPSAnJyArIGNvbmZpZy5faSxcbiAgICAgICAgICAgIGksIHBhcnNlZElucHV0LCB0b2tlbnMsIHRva2VuLCBza2lwcGVkLFxuICAgICAgICAgICAgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aCxcbiAgICAgICAgICAgIHRvdGFsUGFyc2VkSW5wdXRMZW5ndGggPSAwO1xuXG4gICAgICAgIHRva2VucyA9IGV4cGFuZEZvcm1hdChjb25maWcuX2YsIGNvbmZpZy5fbG9jYWxlKS5tYXRjaChmb3JtYXR0aW5nVG9rZW5zKSB8fCBbXTtcblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0b2tlbiA9IHRva2Vuc1tpXTtcbiAgICAgICAgICAgIHBhcnNlZElucHV0ID0gKHN0cmluZy5tYXRjaChnZXRQYXJzZVJlZ2V4Rm9yVG9rZW4odG9rZW4sIGNvbmZpZykpIHx8IFtdKVswXTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCd0b2tlbicsIHRva2VuLCAncGFyc2VkSW5wdXQnLCBwYXJzZWRJbnB1dCxcbiAgICAgICAgICAgIC8vICAgICAgICAgJ3JlZ2V4JywgZ2V0UGFyc2VSZWdleEZvclRva2VuKHRva2VuLCBjb25maWcpKTtcbiAgICAgICAgICAgIGlmIChwYXJzZWRJbnB1dCkge1xuICAgICAgICAgICAgICAgIHNraXBwZWQgPSBzdHJpbmcuc3Vic3RyKDAsIHN0cmluZy5pbmRleE9mKHBhcnNlZElucHV0KSk7XG4gICAgICAgICAgICAgICAgaWYgKHNraXBwZWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS51bnVzZWRJbnB1dC5wdXNoKHNraXBwZWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzdHJpbmcgPSBzdHJpbmcuc2xpY2Uoc3RyaW5nLmluZGV4T2YocGFyc2VkSW5wdXQpICsgcGFyc2VkSW5wdXQubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICB0b3RhbFBhcnNlZElucHV0TGVuZ3RoICs9IHBhcnNlZElucHV0Lmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGRvbid0IHBhcnNlIGlmIGl0J3Mgbm90IGEga25vd24gdG9rZW5cbiAgICAgICAgICAgIGlmIChmb3JtYXRUb2tlbkZ1bmN0aW9uc1t0b2tlbl0pIHtcbiAgICAgICAgICAgICAgICBpZiAocGFyc2VkSW5wdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuZW1wdHkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLnVudXNlZFRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYWRkVGltZVRvQXJyYXlGcm9tVG9rZW4odG9rZW4sIHBhcnNlZElucHV0LCBjb25maWcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY29uZmlnLl9zdHJpY3QgJiYgIXBhcnNlZElucHV0KSB7XG4gICAgICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykudW51c2VkVG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gYWRkIHJlbWFpbmluZyB1bnBhcnNlZCBpbnB1dCBsZW5ndGggdG8gdGhlIHN0cmluZ1xuICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5jaGFyc0xlZnRPdmVyID0gc3RyaW5nTGVuZ3RoIC0gdG90YWxQYXJzZWRJbnB1dExlbmd0aDtcbiAgICAgICAgaWYgKHN0cmluZy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS51bnVzZWRJbnB1dC5wdXNoKHN0cmluZyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjbGVhciBfMTJoIGZsYWcgaWYgaG91ciBpcyA8PSAxMlxuICAgICAgICBpZiAoY29uZmlnLl9hW0hPVVJdIDw9IDEyICYmXG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5iaWdIb3VyID09PSB0cnVlICYmXG4gICAgICAgICAgICBjb25maWcuX2FbSE9VUl0gPiAwKSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5iaWdIb3VyID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykucGFyc2VkRGF0ZVBhcnRzID0gY29uZmlnLl9hLnNsaWNlKDApO1xuICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5tZXJpZGllbSA9IGNvbmZpZy5fbWVyaWRpZW07XG4gICAgICAgIC8vIGhhbmRsZSBtZXJpZGllbVxuICAgICAgICBjb25maWcuX2FbSE9VUl0gPSBtZXJpZGllbUZpeFdyYXAoY29uZmlnLl9sb2NhbGUsIGNvbmZpZy5fYVtIT1VSXSwgY29uZmlnLl9tZXJpZGllbSk7XG5cbiAgICAgICAgY29uZmlnRnJvbUFycmF5KGNvbmZpZyk7XG4gICAgICAgIGNoZWNrT3ZlcmZsb3coY29uZmlnKTtcbiAgICB9XG5cblxuICAgIGZ1bmN0aW9uIG1lcmlkaWVtRml4V3JhcCAobG9jYWxlLCBob3VyLCBtZXJpZGllbSkge1xuICAgICAgICB2YXIgaXNQbTtcblxuICAgICAgICBpZiAobWVyaWRpZW0gPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gbm90aGluZyB0byBkb1xuICAgICAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvY2FsZS5tZXJpZGllbUhvdXIgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsZS5tZXJpZGllbUhvdXIoaG91ciwgbWVyaWRpZW0pO1xuICAgICAgICB9IGVsc2UgaWYgKGxvY2FsZS5pc1BNICE9IG51bGwpIHtcbiAgICAgICAgICAgIC8vIEZhbGxiYWNrXG4gICAgICAgICAgICBpc1BtID0gbG9jYWxlLmlzUE0obWVyaWRpZW0pO1xuICAgICAgICAgICAgaWYgKGlzUG0gJiYgaG91ciA8IDEyKSB7XG4gICAgICAgICAgICAgICAgaG91ciArPSAxMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaXNQbSAmJiBob3VyID09PSAxMikge1xuICAgICAgICAgICAgICAgIGhvdXIgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyB0aGlzIGlzIG5vdCBzdXBwb3NlZCB0byBoYXBwZW5cbiAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gZGF0ZSBmcm9tIHN0cmluZyBhbmQgYXJyYXkgb2YgZm9ybWF0IHN0cmluZ3NcbiAgICBmdW5jdGlvbiBjb25maWdGcm9tU3RyaW5nQW5kQXJyYXkoY29uZmlnKSB7XG4gICAgICAgIHZhciB0ZW1wQ29uZmlnLFxuICAgICAgICAgICAgYmVzdE1vbWVudCxcblxuICAgICAgICAgICAgc2NvcmVUb0JlYXQsXG4gICAgICAgICAgICBpLFxuICAgICAgICAgICAgY3VycmVudFNjb3JlO1xuXG4gICAgICAgIGlmIChjb25maWcuX2YubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5pbnZhbGlkRm9ybWF0ID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbmZpZy5fZCA9IG5ldyBEYXRlKE5hTik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29uZmlnLl9mLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjdXJyZW50U2NvcmUgPSAwO1xuICAgICAgICAgICAgdGVtcENvbmZpZyA9IGNvcHlDb25maWcoe30sIGNvbmZpZyk7XG4gICAgICAgICAgICBpZiAoY29uZmlnLl91c2VVVEMgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRlbXBDb25maWcuX3VzZVVUQyA9IGNvbmZpZy5fdXNlVVRDO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGVtcENvbmZpZy5fZiA9IGNvbmZpZy5fZltpXTtcbiAgICAgICAgICAgIGNvbmZpZ0Zyb21TdHJpbmdBbmRGb3JtYXQodGVtcENvbmZpZyk7XG5cbiAgICAgICAgICAgIGlmICghaXNWYWxpZCh0ZW1wQ29uZmlnKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBpZiB0aGVyZSBpcyBhbnkgaW5wdXQgdGhhdCB3YXMgbm90IHBhcnNlZCBhZGQgYSBwZW5hbHR5IGZvciB0aGF0IGZvcm1hdFxuICAgICAgICAgICAgY3VycmVudFNjb3JlICs9IGdldFBhcnNpbmdGbGFncyh0ZW1wQ29uZmlnKS5jaGFyc0xlZnRPdmVyO1xuXG4gICAgICAgICAgICAvL29yIHRva2Vuc1xuICAgICAgICAgICAgY3VycmVudFNjb3JlICs9IGdldFBhcnNpbmdGbGFncyh0ZW1wQ29uZmlnKS51bnVzZWRUb2tlbnMubGVuZ3RoICogMTA7XG5cbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyh0ZW1wQ29uZmlnKS5zY29yZSA9IGN1cnJlbnRTY29yZTtcblxuICAgICAgICAgICAgaWYgKHNjb3JlVG9CZWF0ID09IG51bGwgfHwgY3VycmVudFNjb3JlIDwgc2NvcmVUb0JlYXQpIHtcbiAgICAgICAgICAgICAgICBzY29yZVRvQmVhdCA9IGN1cnJlbnRTY29yZTtcbiAgICAgICAgICAgICAgICBiZXN0TW9tZW50ID0gdGVtcENvbmZpZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGV4dGVuZChjb25maWcsIGJlc3RNb21lbnQgfHwgdGVtcENvbmZpZyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY29uZmlnRnJvbU9iamVjdChjb25maWcpIHtcbiAgICAgICAgaWYgKGNvbmZpZy5fZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGkgPSBub3JtYWxpemVPYmplY3RVbml0cyhjb25maWcuX2kpO1xuICAgICAgICBjb25maWcuX2EgPSBtYXAoW2kueWVhciwgaS5tb250aCwgaS5kYXkgfHwgaS5kYXRlLCBpLmhvdXIsIGkubWludXRlLCBpLnNlY29uZCwgaS5taWxsaXNlY29uZF0sIGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgICAgIHJldHVybiBvYmogJiYgcGFyc2VJbnQob2JqLCAxMCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbmZpZ0Zyb21BcnJheShjb25maWcpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZUZyb21Db25maWcgKGNvbmZpZykge1xuICAgICAgICB2YXIgcmVzID0gbmV3IE1vbWVudChjaGVja092ZXJmbG93KHByZXBhcmVDb25maWcoY29uZmlnKSkpO1xuICAgICAgICBpZiAocmVzLl9uZXh0RGF5KSB7XG4gICAgICAgICAgICAvLyBBZGRpbmcgaXMgc21hcnQgZW5vdWdoIGFyb3VuZCBEU1RcbiAgICAgICAgICAgIHJlcy5hZGQoMSwgJ2QnKTtcbiAgICAgICAgICAgIHJlcy5fbmV4dERheSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcHJlcGFyZUNvbmZpZyAoY29uZmlnKSB7XG4gICAgICAgIHZhciBpbnB1dCA9IGNvbmZpZy5faSxcbiAgICAgICAgICAgIGZvcm1hdCA9IGNvbmZpZy5fZjtcblxuICAgICAgICBjb25maWcuX2xvY2FsZSA9IGNvbmZpZy5fbG9jYWxlIHx8IGdldExvY2FsZShjb25maWcuX2wpO1xuXG4gICAgICAgIGlmIChpbnB1dCA9PT0gbnVsbCB8fCAoZm9ybWF0ID09PSB1bmRlZmluZWQgJiYgaW5wdXQgPT09ICcnKSkge1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUludmFsaWQoe251bGxJbnB1dDogdHJ1ZX0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNvbmZpZy5faSA9IGlucHV0ID0gY29uZmlnLl9sb2NhbGUucHJlcGFyc2UoaW5wdXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzTW9tZW50KGlucHV0KSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBNb21lbnQoY2hlY2tPdmVyZmxvdyhpbnB1dCkpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzRGF0ZShpbnB1dCkpIHtcbiAgICAgICAgICAgIGNvbmZpZy5fZCA9IGlucHV0O1xuICAgICAgICB9IGVsc2UgaWYgKGlzQXJyYXkoZm9ybWF0KSkge1xuICAgICAgICAgICAgY29uZmlnRnJvbVN0cmluZ0FuZEFycmF5KGNvbmZpZyk7XG4gICAgICAgIH0gZWxzZSBpZiAoZm9ybWF0KSB7XG4gICAgICAgICAgICBjb25maWdGcm9tU3RyaW5nQW5kRm9ybWF0KGNvbmZpZyk7XG4gICAgICAgIH0gIGVsc2Uge1xuICAgICAgICAgICAgY29uZmlnRnJvbUlucHV0KGNvbmZpZyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzVmFsaWQoY29uZmlnKSkge1xuICAgICAgICAgICAgY29uZmlnLl9kID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb25maWc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY29uZmlnRnJvbUlucHV0KGNvbmZpZykge1xuICAgICAgICB2YXIgaW5wdXQgPSBjb25maWcuX2k7XG4gICAgICAgIGlmIChpc1VuZGVmaW5lZChpbnB1dCkpIHtcbiAgICAgICAgICAgIGNvbmZpZy5fZCA9IG5ldyBEYXRlKGhvb2tzLm5vdygpKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0RhdGUoaW5wdXQpKSB7XG4gICAgICAgICAgICBjb25maWcuX2QgPSBuZXcgRGF0ZShpbnB1dC52YWx1ZU9mKCkpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNvbmZpZ0Zyb21TdHJpbmcoY29uZmlnKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0FycmF5KGlucHV0KSkge1xuICAgICAgICAgICAgY29uZmlnLl9hID0gbWFwKGlucHV0LnNsaWNlKDApLCBmdW5jdGlvbiAob2JqKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KG9iaiwgMTApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25maWdGcm9tQXJyYXkoY29uZmlnKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc09iamVjdChpbnB1dCkpIHtcbiAgICAgICAgICAgIGNvbmZpZ0Zyb21PYmplY3QoY29uZmlnKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc051bWJlcihpbnB1dCkpIHtcbiAgICAgICAgICAgIC8vIGZyb20gbWlsbGlzZWNvbmRzXG4gICAgICAgICAgICBjb25maWcuX2QgPSBuZXcgRGF0ZShpbnB1dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBob29rcy5jcmVhdGVGcm9tSW5wdXRGYWxsYmFjayhjb25maWcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRlTG9jYWxPclVUQyAoaW5wdXQsIGZvcm1hdCwgbG9jYWxlLCBzdHJpY3QsIGlzVVRDKSB7XG4gICAgICAgIHZhciBjID0ge307XG5cbiAgICAgICAgaWYgKGxvY2FsZSA9PT0gdHJ1ZSB8fCBsb2NhbGUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBzdHJpY3QgPSBsb2NhbGU7XG4gICAgICAgICAgICBsb2NhbGUgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoKGlzT2JqZWN0KGlucHV0KSAmJiBpc09iamVjdEVtcHR5KGlucHV0KSkgfHxcbiAgICAgICAgICAgICAgICAoaXNBcnJheShpbnB1dCkgJiYgaW5wdXQubGVuZ3RoID09PSAwKSkge1xuICAgICAgICAgICAgaW5wdXQgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gb2JqZWN0IGNvbnN0cnVjdGlvbiBtdXN0IGJlIGRvbmUgdGhpcyB3YXkuXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tb21lbnQvbW9tZW50L2lzc3Vlcy8xNDIzXG4gICAgICAgIGMuX2lzQU1vbWVudE9iamVjdCA9IHRydWU7XG4gICAgICAgIGMuX3VzZVVUQyA9IGMuX2lzVVRDID0gaXNVVEM7XG4gICAgICAgIGMuX2wgPSBsb2NhbGU7XG4gICAgICAgIGMuX2kgPSBpbnB1dDtcbiAgICAgICAgYy5fZiA9IGZvcm1hdDtcbiAgICAgICAgYy5fc3RyaWN0ID0gc3RyaWN0O1xuXG4gICAgICAgIHJldHVybiBjcmVhdGVGcm9tQ29uZmlnKGMpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZUxvY2FsIChpbnB1dCwgZm9ybWF0LCBsb2NhbGUsIHN0cmljdCkge1xuICAgICAgICByZXR1cm4gY3JlYXRlTG9jYWxPclVUQyhpbnB1dCwgZm9ybWF0LCBsb2NhbGUsIHN0cmljdCwgZmFsc2UpO1xuICAgIH1cblxuICAgIHZhciBwcm90b3R5cGVNaW4gPSBkZXByZWNhdGUoXG4gICAgICAgICdtb21lbnQoKS5taW4gaXMgZGVwcmVjYXRlZCwgdXNlIG1vbWVudC5tYXggaW5zdGVhZC4gaHR0cDovL21vbWVudGpzLmNvbS9ndWlkZXMvIy93YXJuaW5ncy9taW4tbWF4LycsXG4gICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBvdGhlciA9IGNyZWF0ZUxvY2FsLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICBpZiAodGhpcy5pc1ZhbGlkKCkgJiYgb3RoZXIuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG90aGVyIDwgdGhpcyA/IHRoaXMgOiBvdGhlcjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUludmFsaWQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICk7XG5cbiAgICB2YXIgcHJvdG90eXBlTWF4ID0gZGVwcmVjYXRlKFxuICAgICAgICAnbW9tZW50KCkubWF4IGlzIGRlcHJlY2F0ZWQsIHVzZSBtb21lbnQubWluIGluc3RlYWQuIGh0dHA6Ly9tb21lbnRqcy5jb20vZ3VpZGVzLyMvd2FybmluZ3MvbWluLW1heC8nLFxuICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgb3RoZXIgPSBjcmVhdGVMb2NhbC5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNWYWxpZCgpICYmIG90aGVyLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBvdGhlciA+IHRoaXMgPyB0aGlzIDogb3RoZXI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVJbnZhbGlkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICApO1xuXG4gICAgLy8gUGljayBhIG1vbWVudCBtIGZyb20gbW9tZW50cyBzbyB0aGF0IG1bZm5dKG90aGVyKSBpcyB0cnVlIGZvciBhbGxcbiAgICAvLyBvdGhlci4gVGhpcyByZWxpZXMgb24gdGhlIGZ1bmN0aW9uIGZuIHRvIGJlIHRyYW5zaXRpdmUuXG4gICAgLy9cbiAgICAvLyBtb21lbnRzIHNob3VsZCBlaXRoZXIgYmUgYW4gYXJyYXkgb2YgbW9tZW50IG9iamVjdHMgb3IgYW4gYXJyYXksIHdob3NlXG4gICAgLy8gZmlyc3QgZWxlbWVudCBpcyBhbiBhcnJheSBvZiBtb21lbnQgb2JqZWN0cy5cbiAgICBmdW5jdGlvbiBwaWNrQnkoZm4sIG1vbWVudHMpIHtcbiAgICAgICAgdmFyIHJlcywgaTtcbiAgICAgICAgaWYgKG1vbWVudHMubGVuZ3RoID09PSAxICYmIGlzQXJyYXkobW9tZW50c1swXSkpIHtcbiAgICAgICAgICAgIG1vbWVudHMgPSBtb21lbnRzWzBdO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbW9tZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVMb2NhbCgpO1xuICAgICAgICB9XG4gICAgICAgIHJlcyA9IG1vbWVudHNbMF07XG4gICAgICAgIGZvciAoaSA9IDE7IGkgPCBtb21lbnRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBpZiAoIW1vbWVudHNbaV0uaXNWYWxpZCgpIHx8IG1vbWVudHNbaV1bZm5dKHJlcykpIHtcbiAgICAgICAgICAgICAgICByZXMgPSBtb21lbnRzW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgLy8gVE9ETzogVXNlIFtdLnNvcnQgaW5zdGVhZD9cbiAgICBmdW5jdGlvbiBtaW4gKCkge1xuICAgICAgICB2YXIgYXJncyA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKTtcblxuICAgICAgICByZXR1cm4gcGlja0J5KCdpc0JlZm9yZScsIGFyZ3MpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1heCAoKSB7XG4gICAgICAgIHZhciBhcmdzID0gW10uc2xpY2UuY2FsbChhcmd1bWVudHMsIDApO1xuXG4gICAgICAgIHJldHVybiBwaWNrQnkoJ2lzQWZ0ZXInLCBhcmdzKTtcbiAgICB9XG5cbiAgICB2YXIgbm93ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gRGF0ZS5ub3cgPyBEYXRlLm5vdygpIDogKyhuZXcgRGF0ZSgpKTtcbiAgICB9O1xuXG4gICAgdmFyIG9yZGVyaW5nID0gWyd5ZWFyJywgJ3F1YXJ0ZXInLCAnbW9udGgnLCAnd2VlaycsICdkYXknLCAnaG91cicsICdtaW51dGUnLCAnc2Vjb25kJywgJ21pbGxpc2Vjb25kJ107XG5cbiAgICBmdW5jdGlvbiBpc0R1cmF0aW9uVmFsaWQobSkge1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gbSkge1xuICAgICAgICAgICAgaWYgKCEoaW5kZXhPZi5jYWxsKG9yZGVyaW5nLCBrZXkpICE9PSAtMSAmJiAobVtrZXldID09IG51bGwgfHwgIWlzTmFOKG1ba2V5XSkpKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB1bml0SGFzRGVjaW1hbCA9IGZhbHNlO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9yZGVyaW5nLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBpZiAobVtvcmRlcmluZ1tpXV0pIHtcbiAgICAgICAgICAgICAgICBpZiAodW5pdEhhc0RlY2ltYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBvbmx5IGFsbG93IG5vbi1pbnRlZ2VycyBmb3Igc21hbGxlc3QgdW5pdFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocGFyc2VGbG9hdChtW29yZGVyaW5nW2ldXSkgIT09IHRvSW50KG1bb3JkZXJpbmdbaV1dKSkge1xuICAgICAgICAgICAgICAgICAgICB1bml0SGFzRGVjaW1hbCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNWYWxpZCQxKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNWYWxpZDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVJbnZhbGlkJDEoKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVEdXJhdGlvbihOYU4pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIER1cmF0aW9uIChkdXJhdGlvbikge1xuICAgICAgICB2YXIgbm9ybWFsaXplZElucHV0ID0gbm9ybWFsaXplT2JqZWN0VW5pdHMoZHVyYXRpb24pLFxuICAgICAgICAgICAgeWVhcnMgPSBub3JtYWxpemVkSW5wdXQueWVhciB8fCAwLFxuICAgICAgICAgICAgcXVhcnRlcnMgPSBub3JtYWxpemVkSW5wdXQucXVhcnRlciB8fCAwLFxuICAgICAgICAgICAgbW9udGhzID0gbm9ybWFsaXplZElucHV0Lm1vbnRoIHx8IDAsXG4gICAgICAgICAgICB3ZWVrcyA9IG5vcm1hbGl6ZWRJbnB1dC53ZWVrIHx8IDAsXG4gICAgICAgICAgICBkYXlzID0gbm9ybWFsaXplZElucHV0LmRheSB8fCAwLFxuICAgICAgICAgICAgaG91cnMgPSBub3JtYWxpemVkSW5wdXQuaG91ciB8fCAwLFxuICAgICAgICAgICAgbWludXRlcyA9IG5vcm1hbGl6ZWRJbnB1dC5taW51dGUgfHwgMCxcbiAgICAgICAgICAgIHNlY29uZHMgPSBub3JtYWxpemVkSW5wdXQuc2Vjb25kIHx8IDAsXG4gICAgICAgICAgICBtaWxsaXNlY29uZHMgPSBub3JtYWxpemVkSW5wdXQubWlsbGlzZWNvbmQgfHwgMDtcblxuICAgICAgICB0aGlzLl9pc1ZhbGlkID0gaXNEdXJhdGlvblZhbGlkKG5vcm1hbGl6ZWRJbnB1dCk7XG5cbiAgICAgICAgLy8gcmVwcmVzZW50YXRpb24gZm9yIGRhdGVBZGRSZW1vdmVcbiAgICAgICAgdGhpcy5fbWlsbGlzZWNvbmRzID0gK21pbGxpc2Vjb25kcyArXG4gICAgICAgICAgICBzZWNvbmRzICogMWUzICsgLy8gMTAwMFxuICAgICAgICAgICAgbWludXRlcyAqIDZlNCArIC8vIDEwMDAgKiA2MFxuICAgICAgICAgICAgaG91cnMgKiAxMDAwICogNjAgKiA2MDsgLy91c2luZyAxMDAwICogNjAgKiA2MCBpbnN0ZWFkIG9mIDM2ZTUgdG8gYXZvaWQgZmxvYXRpbmcgcG9pbnQgcm91bmRpbmcgZXJyb3JzIGh0dHBzOi8vZ2l0aHViLmNvbS9tb21lbnQvbW9tZW50L2lzc3Vlcy8yOTc4XG4gICAgICAgIC8vIEJlY2F1c2Ugb2YgZGF0ZUFkZFJlbW92ZSB0cmVhdHMgMjQgaG91cnMgYXMgZGlmZmVyZW50IGZyb20gYVxuICAgICAgICAvLyBkYXkgd2hlbiB3b3JraW5nIGFyb3VuZCBEU1QsIHdlIG5lZWQgdG8gc3RvcmUgdGhlbSBzZXBhcmF0ZWx5XG4gICAgICAgIHRoaXMuX2RheXMgPSArZGF5cyArXG4gICAgICAgICAgICB3ZWVrcyAqIDc7XG4gICAgICAgIC8vIEl0IGlzIGltcG9zc2libGUgdG8gdHJhbnNsYXRlIG1vbnRocyBpbnRvIGRheXMgd2l0aG91dCBrbm93aW5nXG4gICAgICAgIC8vIHdoaWNoIG1vbnRocyB5b3UgYXJlIGFyZSB0YWxraW5nIGFib3V0LCBzbyB3ZSBoYXZlIHRvIHN0b3JlXG4gICAgICAgIC8vIGl0IHNlcGFyYXRlbHkuXG4gICAgICAgIHRoaXMuX21vbnRocyA9ICttb250aHMgK1xuICAgICAgICAgICAgcXVhcnRlcnMgKiAzICtcbiAgICAgICAgICAgIHllYXJzICogMTI7XG5cbiAgICAgICAgdGhpcy5fZGF0YSA9IHt9O1xuXG4gICAgICAgIHRoaXMuX2xvY2FsZSA9IGdldExvY2FsZSgpO1xuXG4gICAgICAgIHRoaXMuX2J1YmJsZSgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzRHVyYXRpb24gKG9iaikge1xuICAgICAgICByZXR1cm4gb2JqIGluc3RhbmNlb2YgRHVyYXRpb247XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWJzUm91bmQgKG51bWJlcikge1xuICAgICAgICBpZiAobnVtYmVyIDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoLTEgKiBudW1iZXIpICogLTE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChudW1iZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgZnVuY3Rpb24gb2Zmc2V0ICh0b2tlbiwgc2VwYXJhdG9yKSB7XG4gICAgICAgIGFkZEZvcm1hdFRva2VuKHRva2VuLCAwLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgb2Zmc2V0ID0gdGhpcy51dGNPZmZzZXQoKTtcbiAgICAgICAgICAgIHZhciBzaWduID0gJysnO1xuICAgICAgICAgICAgaWYgKG9mZnNldCA8IDApIHtcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSAtb2Zmc2V0O1xuICAgICAgICAgICAgICAgIHNpZ24gPSAnLSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gc2lnbiArIHplcm9GaWxsKH5+KG9mZnNldCAvIDYwKSwgMikgKyBzZXBhcmF0b3IgKyB6ZXJvRmlsbCh+fihvZmZzZXQpICUgNjAsIDIpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBvZmZzZXQoJ1onLCAnOicpO1xuICAgIG9mZnNldCgnWlonLCAnJyk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCdaJywgIG1hdGNoU2hvcnRPZmZzZXQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ1paJywgbWF0Y2hTaG9ydE9mZnNldCk7XG4gICAgYWRkUGFyc2VUb2tlbihbJ1onLCAnWlonXSwgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgICAgIGNvbmZpZy5fdXNlVVRDID0gdHJ1ZTtcbiAgICAgICAgY29uZmlnLl90em0gPSBvZmZzZXRGcm9tU3RyaW5nKG1hdGNoU2hvcnRPZmZzZXQsIGlucHV0KTtcbiAgICB9KTtcblxuICAgIC8vIEhFTFBFUlNcblxuICAgIC8vIHRpbWV6b25lIGNodW5rZXJcbiAgICAvLyAnKzEwOjAwJyA+IFsnMTAnLCAgJzAwJ11cbiAgICAvLyAnLTE1MzAnICA+IFsnLTE1JywgJzMwJ11cbiAgICB2YXIgY2h1bmtPZmZzZXQgPSAvKFtcXCtcXC1dfFxcZFxcZCkvZ2k7XG5cbiAgICBmdW5jdGlvbiBvZmZzZXRGcm9tU3RyaW5nKG1hdGNoZXIsIHN0cmluZykge1xuICAgICAgICB2YXIgbWF0Y2hlcyA9IChzdHJpbmcgfHwgJycpLm1hdGNoKG1hdGNoZXIpO1xuXG4gICAgICAgIGlmIChtYXRjaGVzID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBjaHVuayAgID0gbWF0Y2hlc1ttYXRjaGVzLmxlbmd0aCAtIDFdIHx8IFtdO1xuICAgICAgICB2YXIgcGFydHMgICA9IChjaHVuayArICcnKS5tYXRjaChjaHVua09mZnNldCkgfHwgWyctJywgMCwgMF07XG4gICAgICAgIHZhciBtaW51dGVzID0gKyhwYXJ0c1sxXSAqIDYwKSArIHRvSW50KHBhcnRzWzJdKTtcblxuICAgICAgICByZXR1cm4gbWludXRlcyA9PT0gMCA/XG4gICAgICAgICAgMCA6XG4gICAgICAgICAgcGFydHNbMF0gPT09ICcrJyA/IG1pbnV0ZXMgOiAtbWludXRlcztcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gYSBtb21lbnQgZnJvbSBpbnB1dCwgdGhhdCBpcyBsb2NhbC91dGMvem9uZSBlcXVpdmFsZW50IHRvIG1vZGVsLlxuICAgIGZ1bmN0aW9uIGNsb25lV2l0aE9mZnNldChpbnB1dCwgbW9kZWwpIHtcbiAgICAgICAgdmFyIHJlcywgZGlmZjtcbiAgICAgICAgaWYgKG1vZGVsLl9pc1VUQykge1xuICAgICAgICAgICAgcmVzID0gbW9kZWwuY2xvbmUoKTtcbiAgICAgICAgICAgIGRpZmYgPSAoaXNNb21lbnQoaW5wdXQpIHx8IGlzRGF0ZShpbnB1dCkgPyBpbnB1dC52YWx1ZU9mKCkgOiBjcmVhdGVMb2NhbChpbnB1dCkudmFsdWVPZigpKSAtIHJlcy52YWx1ZU9mKCk7XG4gICAgICAgICAgICAvLyBVc2UgbG93LWxldmVsIGFwaSwgYmVjYXVzZSB0aGlzIGZuIGlzIGxvdy1sZXZlbCBhcGkuXG4gICAgICAgICAgICByZXMuX2Quc2V0VGltZShyZXMuX2QudmFsdWVPZigpICsgZGlmZik7XG4gICAgICAgICAgICBob29rcy51cGRhdGVPZmZzZXQocmVzLCBmYWxzZSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUxvY2FsKGlucHV0KS5sb2NhbCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0RGF0ZU9mZnNldCAobSkge1xuICAgICAgICAvLyBPbiBGaXJlZm94LjI0IERhdGUjZ2V0VGltZXpvbmVPZmZzZXQgcmV0dXJucyBhIGZsb2F0aW5nIHBvaW50LlxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbW9tZW50L21vbWVudC9wdWxsLzE4NzFcbiAgICAgICAgcmV0dXJuIC1NYXRoLnJvdW5kKG0uX2QuZ2V0VGltZXpvbmVPZmZzZXQoKSAvIDE1KSAqIDE1O1xuICAgIH1cblxuICAgIC8vIEhPT0tTXG5cbiAgICAvLyBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdoZW5ldmVyIGEgbW9tZW50IGlzIG11dGF0ZWQuXG4gICAgLy8gSXQgaXMgaW50ZW5kZWQgdG8ga2VlcCB0aGUgb2Zmc2V0IGluIHN5bmMgd2l0aCB0aGUgdGltZXpvbmUuXG4gICAgaG9va3MudXBkYXRlT2Zmc2V0ID0gZnVuY3Rpb24gKCkge307XG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICAvLyBrZWVwTG9jYWxUaW1lID0gdHJ1ZSBtZWFucyBvbmx5IGNoYW5nZSB0aGUgdGltZXpvbmUsIHdpdGhvdXRcbiAgICAvLyBhZmZlY3RpbmcgdGhlIGxvY2FsIGhvdXIuIFNvIDU6MzE6MjYgKzAzMDAgLS1bdXRjT2Zmc2V0KDIsIHRydWUpXS0tPlxuICAgIC8vIDU6MzE6MjYgKzAyMDAgSXQgaXMgcG9zc2libGUgdGhhdCA1OjMxOjI2IGRvZXNuJ3QgZXhpc3Qgd2l0aCBvZmZzZXRcbiAgICAvLyArMDIwMCwgc28gd2UgYWRqdXN0IHRoZSB0aW1lIGFzIG5lZWRlZCwgdG8gYmUgdmFsaWQuXG4gICAgLy9cbiAgICAvLyBLZWVwaW5nIHRoZSB0aW1lIGFjdHVhbGx5IGFkZHMvc3VidHJhY3RzIChvbmUgaG91cilcbiAgICAvLyBmcm9tIHRoZSBhY3R1YWwgcmVwcmVzZW50ZWQgdGltZS4gVGhhdCBpcyB3aHkgd2UgY2FsbCB1cGRhdGVPZmZzZXRcbiAgICAvLyBhIHNlY29uZCB0aW1lLiBJbiBjYXNlIGl0IHdhbnRzIHVzIHRvIGNoYW5nZSB0aGUgb2Zmc2V0IGFnYWluXG4gICAgLy8gX2NoYW5nZUluUHJvZ3Jlc3MgPT0gdHJ1ZSBjYXNlLCB0aGVuIHdlIGhhdmUgdG8gYWRqdXN0LCBiZWNhdXNlXG4gICAgLy8gdGhlcmUgaXMgbm8gc3VjaCB0aW1lIGluIHRoZSBnaXZlbiB0aW1lem9uZS5cbiAgICBmdW5jdGlvbiBnZXRTZXRPZmZzZXQgKGlucHV0LCBrZWVwTG9jYWxUaW1lLCBrZWVwTWludXRlcykge1xuICAgICAgICB2YXIgb2Zmc2V0ID0gdGhpcy5fb2Zmc2V0IHx8IDAsXG4gICAgICAgICAgICBsb2NhbEFkanVzdDtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0ICE9IG51bGwgPyB0aGlzIDogTmFOO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbnB1dCAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGlucHV0ID0gb2Zmc2V0RnJvbVN0cmluZyhtYXRjaFNob3J0T2Zmc2V0LCBpbnB1dCk7XG4gICAgICAgICAgICAgICAgaWYgKGlucHV0ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoTWF0aC5hYnMoaW5wdXQpIDwgMTYgJiYgIWtlZXBNaW51dGVzKSB7XG4gICAgICAgICAgICAgICAgaW5wdXQgPSBpbnB1dCAqIDYwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLl9pc1VUQyAmJiBrZWVwTG9jYWxUaW1lKSB7XG4gICAgICAgICAgICAgICAgbG9jYWxBZGp1c3QgPSBnZXREYXRlT2Zmc2V0KHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fb2Zmc2V0ID0gaW5wdXQ7XG4gICAgICAgICAgICB0aGlzLl9pc1VUQyA9IHRydWU7XG4gICAgICAgICAgICBpZiAobG9jYWxBZGp1c3QgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkKGxvY2FsQWRqdXN0LCAnbScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9mZnNldCAhPT0gaW5wdXQpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWtlZXBMb2NhbFRpbWUgfHwgdGhpcy5fY2hhbmdlSW5Qcm9ncmVzcykge1xuICAgICAgICAgICAgICAgICAgICBhZGRTdWJ0cmFjdCh0aGlzLCBjcmVhdGVEdXJhdGlvbihpbnB1dCAtIG9mZnNldCwgJ20nKSwgMSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuX2NoYW5nZUluUHJvZ3Jlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2hhbmdlSW5Qcm9ncmVzcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGhvb2tzLnVwZGF0ZU9mZnNldCh0aGlzLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2hhbmdlSW5Qcm9ncmVzcyA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faXNVVEMgPyBvZmZzZXQgOiBnZXREYXRlT2Zmc2V0KHRoaXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0U2V0Wm9uZSAoaW5wdXQsIGtlZXBMb2NhbFRpbWUpIHtcbiAgICAgICAgaWYgKGlucHV0ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaW5wdXQgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgaW5wdXQgPSAtaW5wdXQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMudXRjT2Zmc2V0KGlucHV0LCBrZWVwTG9jYWxUaW1lKTtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gLXRoaXMudXRjT2Zmc2V0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZXRPZmZzZXRUb1VUQyAoa2VlcExvY2FsVGltZSkge1xuICAgICAgICByZXR1cm4gdGhpcy51dGNPZmZzZXQoMCwga2VlcExvY2FsVGltZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2V0T2Zmc2V0VG9Mb2NhbCAoa2VlcExvY2FsVGltZSkge1xuICAgICAgICBpZiAodGhpcy5faXNVVEMpIHtcbiAgICAgICAgICAgIHRoaXMudXRjT2Zmc2V0KDAsIGtlZXBMb2NhbFRpbWUpO1xuICAgICAgICAgICAgdGhpcy5faXNVVEMgPSBmYWxzZTtcblxuICAgICAgICAgICAgaWYgKGtlZXBMb2NhbFRpbWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN1YnRyYWN0KGdldERhdGVPZmZzZXQodGhpcyksICdtJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2V0T2Zmc2V0VG9QYXJzZWRPZmZzZXQgKCkge1xuICAgICAgICBpZiAodGhpcy5fdHptICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMudXRjT2Zmc2V0KHRoaXMuX3R6bSwgZmFsc2UsIHRydWUpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzLl9pID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdmFyIHRab25lID0gb2Zmc2V0RnJvbVN0cmluZyhtYXRjaE9mZnNldCwgdGhpcy5faSk7XG4gICAgICAgICAgICBpZiAodFpvbmUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMudXRjT2Zmc2V0KHRab25lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMudXRjT2Zmc2V0KDAsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGhhc0FsaWduZWRIb3VyT2Zmc2V0IChpbnB1dCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaW5wdXQgPSBpbnB1dCA/IGNyZWF0ZUxvY2FsKGlucHV0KS51dGNPZmZzZXQoKSA6IDA7XG5cbiAgICAgICAgcmV0dXJuICh0aGlzLnV0Y09mZnNldCgpIC0gaW5wdXQpICUgNjAgPT09IDA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNEYXlsaWdodFNhdmluZ1RpbWUgKCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdGhpcy51dGNPZmZzZXQoKSA+IHRoaXMuY2xvbmUoKS5tb250aCgwKS51dGNPZmZzZXQoKSB8fFxuICAgICAgICAgICAgdGhpcy51dGNPZmZzZXQoKSA+IHRoaXMuY2xvbmUoKS5tb250aCg1KS51dGNPZmZzZXQoKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzRGF5bGlnaHRTYXZpbmdUaW1lU2hpZnRlZCAoKSB7XG4gICAgICAgIGlmICghaXNVbmRlZmluZWQodGhpcy5faXNEU1RTaGlmdGVkKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2lzRFNUU2hpZnRlZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBjID0ge307XG5cbiAgICAgICAgY29weUNvbmZpZyhjLCB0aGlzKTtcbiAgICAgICAgYyA9IHByZXBhcmVDb25maWcoYyk7XG5cbiAgICAgICAgaWYgKGMuX2EpIHtcbiAgICAgICAgICAgIHZhciBvdGhlciA9IGMuX2lzVVRDID8gY3JlYXRlVVRDKGMuX2EpIDogY3JlYXRlTG9jYWwoYy5fYSk7XG4gICAgICAgICAgICB0aGlzLl9pc0RTVFNoaWZ0ZWQgPSB0aGlzLmlzVmFsaWQoKSAmJlxuICAgICAgICAgICAgICAgIGNvbXBhcmVBcnJheXMoYy5fYSwgb3RoZXIudG9BcnJheSgpKSA+IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9pc0RTVFNoaWZ0ZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLl9pc0RTVFNoaWZ0ZWQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNMb2NhbCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQoKSA/ICF0aGlzLl9pc1VUQyA6IGZhbHNlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzVXRjT2Zmc2V0ICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCgpID8gdGhpcy5faXNVVEMgOiBmYWxzZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1V0YyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQoKSA/IHRoaXMuX2lzVVRDICYmIHRoaXMuX29mZnNldCA9PT0gMCA6IGZhbHNlO1xuICAgIH1cblxuICAgIC8vIEFTUC5ORVQganNvbiBkYXRlIGZvcm1hdCByZWdleFxuICAgIHZhciBhc3BOZXRSZWdleCA9IC9eKFxcLXxcXCspPyg/OihcXGQqKVsuIF0pPyhcXGQrKVxcOihcXGQrKSg/OlxcOihcXGQrKShcXC5cXGQqKT8pPyQvO1xuXG4gICAgLy8gZnJvbSBodHRwOi8vZG9jcy5jbG9zdXJlLWxpYnJhcnkuZ29vZ2xlY29kZS5jb20vZ2l0L2Nsb3N1cmVfZ29vZ19kYXRlX2RhdGUuanMuc291cmNlLmh0bWxcbiAgICAvLyBzb21ld2hhdCBtb3JlIGluIGxpbmUgd2l0aCA0LjQuMy4yIDIwMDQgc3BlYywgYnV0IGFsbG93cyBkZWNpbWFsIGFueXdoZXJlXG4gICAgLy8gYW5kIGZ1cnRoZXIgbW9kaWZpZWQgdG8gYWxsb3cgZm9yIHN0cmluZ3MgY29udGFpbmluZyBib3RoIHdlZWsgYW5kIGRheVxuICAgIHZhciBpc29SZWdleCA9IC9eKC18XFwrKT9QKD86KFstK10/WzAtOSwuXSopWSk/KD86KFstK10/WzAtOSwuXSopTSk/KD86KFstK10/WzAtOSwuXSopVyk/KD86KFstK10/WzAtOSwuXSopRCk/KD86VCg/OihbLStdP1swLTksLl0qKUgpPyg/OihbLStdP1swLTksLl0qKU0pPyg/OihbLStdP1swLTksLl0qKVMpPyk/JC87XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVEdXJhdGlvbiAoaW5wdXQsIGtleSkge1xuICAgICAgICB2YXIgZHVyYXRpb24gPSBpbnB1dCxcbiAgICAgICAgICAgIC8vIG1hdGNoaW5nIGFnYWluc3QgcmVnZXhwIGlzIGV4cGVuc2l2ZSwgZG8gaXQgb24gZGVtYW5kXG4gICAgICAgICAgICBtYXRjaCA9IG51bGwsXG4gICAgICAgICAgICBzaWduLFxuICAgICAgICAgICAgcmV0LFxuICAgICAgICAgICAgZGlmZlJlcztcblxuICAgICAgICBpZiAoaXNEdXJhdGlvbihpbnB1dCkpIHtcbiAgICAgICAgICAgIGR1cmF0aW9uID0ge1xuICAgICAgICAgICAgICAgIG1zIDogaW5wdXQuX21pbGxpc2Vjb25kcyxcbiAgICAgICAgICAgICAgICBkICA6IGlucHV0Ll9kYXlzLFxuICAgICAgICAgICAgICAgIE0gIDogaW5wdXQuX21vbnRoc1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIGlmIChpc051bWJlcihpbnB1dCkpIHtcbiAgICAgICAgICAgIGR1cmF0aW9uID0ge307XG4gICAgICAgICAgICBpZiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgZHVyYXRpb25ba2V5XSA9IGlucHV0O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkdXJhdGlvbi5taWxsaXNlY29uZHMgPSBpbnB1dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICghIShtYXRjaCA9IGFzcE5ldFJlZ2V4LmV4ZWMoaW5wdXQpKSkge1xuICAgICAgICAgICAgc2lnbiA9IChtYXRjaFsxXSA9PT0gJy0nKSA/IC0xIDogMTtcbiAgICAgICAgICAgIGR1cmF0aW9uID0ge1xuICAgICAgICAgICAgICAgIHkgIDogMCxcbiAgICAgICAgICAgICAgICBkICA6IHRvSW50KG1hdGNoW0RBVEVdKSAgICAgICAgICAgICAgICAgICAgICAgICAqIHNpZ24sXG4gICAgICAgICAgICAgICAgaCAgOiB0b0ludChtYXRjaFtIT1VSXSkgICAgICAgICAgICAgICAgICAgICAgICAgKiBzaWduLFxuICAgICAgICAgICAgICAgIG0gIDogdG9JbnQobWF0Y2hbTUlOVVRFXSkgICAgICAgICAgICAgICAgICAgICAgICogc2lnbixcbiAgICAgICAgICAgICAgICBzICA6IHRvSW50KG1hdGNoW1NFQ09ORF0pICAgICAgICAgICAgICAgICAgICAgICAqIHNpZ24sXG4gICAgICAgICAgICAgICAgbXMgOiB0b0ludChhYnNSb3VuZChtYXRjaFtNSUxMSVNFQ09ORF0gKiAxMDAwKSkgKiBzaWduIC8vIHRoZSBtaWxsaXNlY29uZCBkZWNpbWFsIHBvaW50IGlzIGluY2x1ZGVkIGluIHRoZSBtYXRjaFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIGlmICghIShtYXRjaCA9IGlzb1JlZ2V4LmV4ZWMoaW5wdXQpKSkge1xuICAgICAgICAgICAgc2lnbiA9IChtYXRjaFsxXSA9PT0gJy0nKSA/IC0xIDogKG1hdGNoWzFdID09PSAnKycpID8gMSA6IDE7XG4gICAgICAgICAgICBkdXJhdGlvbiA9IHtcbiAgICAgICAgICAgICAgICB5IDogcGFyc2VJc28obWF0Y2hbMl0sIHNpZ24pLFxuICAgICAgICAgICAgICAgIE0gOiBwYXJzZUlzbyhtYXRjaFszXSwgc2lnbiksXG4gICAgICAgICAgICAgICAgdyA6IHBhcnNlSXNvKG1hdGNoWzRdLCBzaWduKSxcbiAgICAgICAgICAgICAgICBkIDogcGFyc2VJc28obWF0Y2hbNV0sIHNpZ24pLFxuICAgICAgICAgICAgICAgIGggOiBwYXJzZUlzbyhtYXRjaFs2XSwgc2lnbiksXG4gICAgICAgICAgICAgICAgbSA6IHBhcnNlSXNvKG1hdGNoWzddLCBzaWduKSxcbiAgICAgICAgICAgICAgICBzIDogcGFyc2VJc28obWF0Y2hbOF0sIHNpZ24pXG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2UgaWYgKGR1cmF0aW9uID09IG51bGwpIHsvLyBjaGVja3MgZm9yIG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBkdXJhdGlvbiA9IHt9O1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBkdXJhdGlvbiA9PT0gJ29iamVjdCcgJiYgKCdmcm9tJyBpbiBkdXJhdGlvbiB8fCAndG8nIGluIGR1cmF0aW9uKSkge1xuICAgICAgICAgICAgZGlmZlJlcyA9IG1vbWVudHNEaWZmZXJlbmNlKGNyZWF0ZUxvY2FsKGR1cmF0aW9uLmZyb20pLCBjcmVhdGVMb2NhbChkdXJhdGlvbi50bykpO1xuXG4gICAgICAgICAgICBkdXJhdGlvbiA9IHt9O1xuICAgICAgICAgICAgZHVyYXRpb24ubXMgPSBkaWZmUmVzLm1pbGxpc2Vjb25kcztcbiAgICAgICAgICAgIGR1cmF0aW9uLk0gPSBkaWZmUmVzLm1vbnRocztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldCA9IG5ldyBEdXJhdGlvbihkdXJhdGlvbik7XG5cbiAgICAgICAgaWYgKGlzRHVyYXRpb24oaW5wdXQpICYmIGhhc093blByb3AoaW5wdXQsICdfbG9jYWxlJykpIHtcbiAgICAgICAgICAgIHJldC5fbG9jYWxlID0gaW5wdXQuX2xvY2FsZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuXG4gICAgY3JlYXRlRHVyYXRpb24uZm4gPSBEdXJhdGlvbi5wcm90b3R5cGU7XG4gICAgY3JlYXRlRHVyYXRpb24uaW52YWxpZCA9IGNyZWF0ZUludmFsaWQkMTtcblxuICAgIGZ1bmN0aW9uIHBhcnNlSXNvIChpbnAsIHNpZ24pIHtcbiAgICAgICAgLy8gV2UnZCBub3JtYWxseSB1c2Ugfn5pbnAgZm9yIHRoaXMsIGJ1dCB1bmZvcnR1bmF0ZWx5IGl0IGFsc29cbiAgICAgICAgLy8gY29udmVydHMgZmxvYXRzIHRvIGludHMuXG4gICAgICAgIC8vIGlucCBtYXkgYmUgdW5kZWZpbmVkLCBzbyBjYXJlZnVsIGNhbGxpbmcgcmVwbGFjZSBvbiBpdC5cbiAgICAgICAgdmFyIHJlcyA9IGlucCAmJiBwYXJzZUZsb2F0KGlucC5yZXBsYWNlKCcsJywgJy4nKSk7XG4gICAgICAgIC8vIGFwcGx5IHNpZ24gd2hpbGUgd2UncmUgYXQgaXRcbiAgICAgICAgcmV0dXJuIChpc05hTihyZXMpID8gMCA6IHJlcykgKiBzaWduO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBvc2l0aXZlTW9tZW50c0RpZmZlcmVuY2UoYmFzZSwgb3RoZXIpIHtcbiAgICAgICAgdmFyIHJlcyA9IHttaWxsaXNlY29uZHM6IDAsIG1vbnRoczogMH07XG5cbiAgICAgICAgcmVzLm1vbnRocyA9IG90aGVyLm1vbnRoKCkgLSBiYXNlLm1vbnRoKCkgK1xuICAgICAgICAgICAgKG90aGVyLnllYXIoKSAtIGJhc2UueWVhcigpKSAqIDEyO1xuICAgICAgICBpZiAoYmFzZS5jbG9uZSgpLmFkZChyZXMubW9udGhzLCAnTScpLmlzQWZ0ZXIob3RoZXIpKSB7XG4gICAgICAgICAgICAtLXJlcy5tb250aHM7XG4gICAgICAgIH1cblxuICAgICAgICByZXMubWlsbGlzZWNvbmRzID0gK290aGVyIC0gKyhiYXNlLmNsb25lKCkuYWRkKHJlcy5tb250aHMsICdNJykpO1xuXG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbW9tZW50c0RpZmZlcmVuY2UoYmFzZSwgb3RoZXIpIHtcbiAgICAgICAgdmFyIHJlcztcbiAgICAgICAgaWYgKCEoYmFzZS5pc1ZhbGlkKCkgJiYgb3RoZXIuaXNWYWxpZCgpKSkge1xuICAgICAgICAgICAgcmV0dXJuIHttaWxsaXNlY29uZHM6IDAsIG1vbnRoczogMH07XG4gICAgICAgIH1cblxuICAgICAgICBvdGhlciA9IGNsb25lV2l0aE9mZnNldChvdGhlciwgYmFzZSk7XG4gICAgICAgIGlmIChiYXNlLmlzQmVmb3JlKG90aGVyKSkge1xuICAgICAgICAgICAgcmVzID0gcG9zaXRpdmVNb21lbnRzRGlmZmVyZW5jZShiYXNlLCBvdGhlcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXMgPSBwb3NpdGl2ZU1vbWVudHNEaWZmZXJlbmNlKG90aGVyLCBiYXNlKTtcbiAgICAgICAgICAgIHJlcy5taWxsaXNlY29uZHMgPSAtcmVzLm1pbGxpc2Vjb25kcztcbiAgICAgICAgICAgIHJlcy5tb250aHMgPSAtcmVzLm1vbnRocztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgLy8gVE9ETzogcmVtb3ZlICduYW1lJyBhcmcgYWZ0ZXIgZGVwcmVjYXRpb24gaXMgcmVtb3ZlZFxuICAgIGZ1bmN0aW9uIGNyZWF0ZUFkZGVyKGRpcmVjdGlvbiwgbmFtZSkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHZhbCwgcGVyaW9kKSB7XG4gICAgICAgICAgICB2YXIgZHVyLCB0bXA7XG4gICAgICAgICAgICAvL2ludmVydCB0aGUgYXJndW1lbnRzLCBidXQgY29tcGxhaW4gYWJvdXQgaXRcbiAgICAgICAgICAgIGlmIChwZXJpb2QgIT09IG51bGwgJiYgIWlzTmFOKCtwZXJpb2QpKSB7XG4gICAgICAgICAgICAgICAgZGVwcmVjYXRlU2ltcGxlKG5hbWUsICdtb21lbnQoKS4nICsgbmFtZSAgKyAnKHBlcmlvZCwgbnVtYmVyKSBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIG1vbWVudCgpLicgKyBuYW1lICsgJyhudW1iZXIsIHBlcmlvZCkuICcgK1xuICAgICAgICAgICAgICAgICdTZWUgaHR0cDovL21vbWVudGpzLmNvbS9ndWlkZXMvIy93YXJuaW5ncy9hZGQtaW52ZXJ0ZWQtcGFyYW0vIGZvciBtb3JlIGluZm8uJyk7XG4gICAgICAgICAgICAgICAgdG1wID0gdmFsOyB2YWwgPSBwZXJpb2Q7IHBlcmlvZCA9IHRtcDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFsID0gdHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgPyArdmFsIDogdmFsO1xuICAgICAgICAgICAgZHVyID0gY3JlYXRlRHVyYXRpb24odmFsLCBwZXJpb2QpO1xuICAgICAgICAgICAgYWRkU3VidHJhY3QodGhpcywgZHVyLCBkaXJlY3Rpb24pO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWRkU3VidHJhY3QgKG1vbSwgZHVyYXRpb24sIGlzQWRkaW5nLCB1cGRhdGVPZmZzZXQpIHtcbiAgICAgICAgdmFyIG1pbGxpc2Vjb25kcyA9IGR1cmF0aW9uLl9taWxsaXNlY29uZHMsXG4gICAgICAgICAgICBkYXlzID0gYWJzUm91bmQoZHVyYXRpb24uX2RheXMpLFxuICAgICAgICAgICAgbW9udGhzID0gYWJzUm91bmQoZHVyYXRpb24uX21vbnRocyk7XG5cbiAgICAgICAgaWYgKCFtb20uaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICAvLyBObyBvcFxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdXBkYXRlT2Zmc2V0ID0gdXBkYXRlT2Zmc2V0ID09IG51bGwgPyB0cnVlIDogdXBkYXRlT2Zmc2V0O1xuXG4gICAgICAgIGlmIChtb250aHMpIHtcbiAgICAgICAgICAgIHNldE1vbnRoKG1vbSwgZ2V0KG1vbSwgJ01vbnRoJykgKyBtb250aHMgKiBpc0FkZGluZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRheXMpIHtcbiAgICAgICAgICAgIHNldCQxKG1vbSwgJ0RhdGUnLCBnZXQobW9tLCAnRGF0ZScpICsgZGF5cyAqIGlzQWRkaW5nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWlsbGlzZWNvbmRzKSB7XG4gICAgICAgICAgICBtb20uX2Quc2V0VGltZShtb20uX2QudmFsdWVPZigpICsgbWlsbGlzZWNvbmRzICogaXNBZGRpbmcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1cGRhdGVPZmZzZXQpIHtcbiAgICAgICAgICAgIGhvb2tzLnVwZGF0ZU9mZnNldChtb20sIGRheXMgfHwgbW9udGhzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBhZGQgICAgICA9IGNyZWF0ZUFkZGVyKDEsICdhZGQnKTtcbiAgICB2YXIgc3VidHJhY3QgPSBjcmVhdGVBZGRlcigtMSwgJ3N1YnRyYWN0Jyk7XG5cbiAgICBmdW5jdGlvbiBnZXRDYWxlbmRhckZvcm1hdChteU1vbWVudCwgbm93KSB7XG4gICAgICAgIHZhciBkaWZmID0gbXlNb21lbnQuZGlmZihub3csICdkYXlzJywgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBkaWZmIDwgLTYgPyAnc2FtZUVsc2UnIDpcbiAgICAgICAgICAgICAgICBkaWZmIDwgLTEgPyAnbGFzdFdlZWsnIDpcbiAgICAgICAgICAgICAgICBkaWZmIDwgMCA/ICdsYXN0RGF5JyA6XG4gICAgICAgICAgICAgICAgZGlmZiA8IDEgPyAnc2FtZURheScgOlxuICAgICAgICAgICAgICAgIGRpZmYgPCAyID8gJ25leHREYXknIDpcbiAgICAgICAgICAgICAgICBkaWZmIDwgNyA/ICduZXh0V2VlaycgOiAnc2FtZUVsc2UnO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNhbGVuZGFyJDEgKHRpbWUsIGZvcm1hdHMpIHtcbiAgICAgICAgLy8gV2Ugd2FudCB0byBjb21wYXJlIHRoZSBzdGFydCBvZiB0b2RheSwgdnMgdGhpcy5cbiAgICAgICAgLy8gR2V0dGluZyBzdGFydC1vZi10b2RheSBkZXBlbmRzIG9uIHdoZXRoZXIgd2UncmUgbG9jYWwvdXRjL29mZnNldCBvciBub3QuXG4gICAgICAgIHZhciBub3cgPSB0aW1lIHx8IGNyZWF0ZUxvY2FsKCksXG4gICAgICAgICAgICBzb2QgPSBjbG9uZVdpdGhPZmZzZXQobm93LCB0aGlzKS5zdGFydE9mKCdkYXknKSxcbiAgICAgICAgICAgIGZvcm1hdCA9IGhvb2tzLmNhbGVuZGFyRm9ybWF0KHRoaXMsIHNvZCkgfHwgJ3NhbWVFbHNlJztcblxuICAgICAgICB2YXIgb3V0cHV0ID0gZm9ybWF0cyAmJiAoaXNGdW5jdGlvbihmb3JtYXRzW2Zvcm1hdF0pID8gZm9ybWF0c1tmb3JtYXRdLmNhbGwodGhpcywgbm93KSA6IGZvcm1hdHNbZm9ybWF0XSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0KG91dHB1dCB8fCB0aGlzLmxvY2FsZURhdGEoKS5jYWxlbmRhcihmb3JtYXQsIHRoaXMsIGNyZWF0ZUxvY2FsKG5vdykpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjbG9uZSAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgTW9tZW50KHRoaXMpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzQWZ0ZXIgKGlucHV0LCB1bml0cykge1xuICAgICAgICB2YXIgbG9jYWxJbnB1dCA9IGlzTW9tZW50KGlucHV0KSA/IGlucHV0IDogY3JlYXRlTG9jYWwoaW5wdXQpO1xuICAgICAgICBpZiAoISh0aGlzLmlzVmFsaWQoKSAmJiBsb2NhbElucHV0LmlzVmFsaWQoKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB1bml0cyA9IG5vcm1hbGl6ZVVuaXRzKCFpc1VuZGVmaW5lZCh1bml0cykgPyB1bml0cyA6ICdtaWxsaXNlY29uZCcpO1xuICAgICAgICBpZiAodW5pdHMgPT09ICdtaWxsaXNlY29uZCcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnZhbHVlT2YoKSA+IGxvY2FsSW5wdXQudmFsdWVPZigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsSW5wdXQudmFsdWVPZigpIDwgdGhpcy5jbG9uZSgpLnN0YXJ0T2YodW5pdHMpLnZhbHVlT2YoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzQmVmb3JlIChpbnB1dCwgdW5pdHMpIHtcbiAgICAgICAgdmFyIGxvY2FsSW5wdXQgPSBpc01vbWVudChpbnB1dCkgPyBpbnB1dCA6IGNyZWF0ZUxvY2FsKGlucHV0KTtcbiAgICAgICAgaWYgKCEodGhpcy5pc1ZhbGlkKCkgJiYgbG9jYWxJbnB1dC5pc1ZhbGlkKCkpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyghaXNVbmRlZmluZWQodW5pdHMpID8gdW5pdHMgOiAnbWlsbGlzZWNvbmQnKTtcbiAgICAgICAgaWYgKHVuaXRzID09PSAnbWlsbGlzZWNvbmQnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy52YWx1ZU9mKCkgPCBsb2NhbElucHV0LnZhbHVlT2YoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNsb25lKCkuZW5kT2YodW5pdHMpLnZhbHVlT2YoKSA8IGxvY2FsSW5wdXQudmFsdWVPZigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNCZXR3ZWVuIChmcm9tLCB0bywgdW5pdHMsIGluY2x1c2l2aXR5KSB7XG4gICAgICAgIGluY2x1c2l2aXR5ID0gaW5jbHVzaXZpdHkgfHwgJygpJztcbiAgICAgICAgcmV0dXJuIChpbmNsdXNpdml0eVswXSA9PT0gJygnID8gdGhpcy5pc0FmdGVyKGZyb20sIHVuaXRzKSA6ICF0aGlzLmlzQmVmb3JlKGZyb20sIHVuaXRzKSkgJiZcbiAgICAgICAgICAgIChpbmNsdXNpdml0eVsxXSA9PT0gJyknID8gdGhpcy5pc0JlZm9yZSh0bywgdW5pdHMpIDogIXRoaXMuaXNBZnRlcih0bywgdW5pdHMpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1NhbWUgKGlucHV0LCB1bml0cykge1xuICAgICAgICB2YXIgbG9jYWxJbnB1dCA9IGlzTW9tZW50KGlucHV0KSA/IGlucHV0IDogY3JlYXRlTG9jYWwoaW5wdXQpLFxuICAgICAgICAgICAgaW5wdXRNcztcbiAgICAgICAgaWYgKCEodGhpcy5pc1ZhbGlkKCkgJiYgbG9jYWxJbnB1dC5pc1ZhbGlkKCkpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cyB8fCAnbWlsbGlzZWNvbmQnKTtcbiAgICAgICAgaWYgKHVuaXRzID09PSAnbWlsbGlzZWNvbmQnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy52YWx1ZU9mKCkgPT09IGxvY2FsSW5wdXQudmFsdWVPZigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaW5wdXRNcyA9IGxvY2FsSW5wdXQudmFsdWVPZigpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5zdGFydE9mKHVuaXRzKS52YWx1ZU9mKCkgPD0gaW5wdXRNcyAmJiBpbnB1dE1zIDw9IHRoaXMuY2xvbmUoKS5lbmRPZih1bml0cykudmFsdWVPZigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNTYW1lT3JBZnRlciAoaW5wdXQsIHVuaXRzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzU2FtZShpbnB1dCwgdW5pdHMpIHx8IHRoaXMuaXNBZnRlcihpbnB1dCx1bml0cyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNTYW1lT3JCZWZvcmUgKGlucHV0LCB1bml0cykge1xuICAgICAgICByZXR1cm4gdGhpcy5pc1NhbWUoaW5wdXQsIHVuaXRzKSB8fCB0aGlzLmlzQmVmb3JlKGlucHV0LHVuaXRzKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkaWZmIChpbnB1dCwgdW5pdHMsIGFzRmxvYXQpIHtcbiAgICAgICAgdmFyIHRoYXQsXG4gICAgICAgICAgICB6b25lRGVsdGEsXG4gICAgICAgICAgICBvdXRwdXQ7XG5cbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoYXQgPSBjbG9uZVdpdGhPZmZzZXQoaW5wdXQsIHRoaXMpO1xuXG4gICAgICAgIGlmICghdGhhdC5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBOYU47XG4gICAgICAgIH1cblxuICAgICAgICB6b25lRGVsdGEgPSAodGhhdC51dGNPZmZzZXQoKSAtIHRoaXMudXRjT2Zmc2V0KCkpICogNmU0O1xuXG4gICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHModW5pdHMpO1xuXG4gICAgICAgIHN3aXRjaCAodW5pdHMpIHtcbiAgICAgICAgICAgIGNhc2UgJ3llYXInOiBvdXRwdXQgPSBtb250aERpZmYodGhpcywgdGhhdCkgLyAxMjsgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdtb250aCc6IG91dHB1dCA9IG1vbnRoRGlmZih0aGlzLCB0aGF0KTsgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdxdWFydGVyJzogb3V0cHV0ID0gbW9udGhEaWZmKHRoaXMsIHRoYXQpIC8gMzsgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdzZWNvbmQnOiBvdXRwdXQgPSAodGhpcyAtIHRoYXQpIC8gMWUzOyBicmVhazsgLy8gMTAwMFxuICAgICAgICAgICAgY2FzZSAnbWludXRlJzogb3V0cHV0ID0gKHRoaXMgLSB0aGF0KSAvIDZlNDsgYnJlYWs7IC8vIDEwMDAgKiA2MFxuICAgICAgICAgICAgY2FzZSAnaG91cic6IG91dHB1dCA9ICh0aGlzIC0gdGhhdCkgLyAzNmU1OyBicmVhazsgLy8gMTAwMCAqIDYwICogNjBcbiAgICAgICAgICAgIGNhc2UgJ2RheSc6IG91dHB1dCA9ICh0aGlzIC0gdGhhdCAtIHpvbmVEZWx0YSkgLyA4NjRlNTsgYnJlYWs7IC8vIDEwMDAgKiA2MCAqIDYwICogMjQsIG5lZ2F0ZSBkc3RcbiAgICAgICAgICAgIGNhc2UgJ3dlZWsnOiBvdXRwdXQgPSAodGhpcyAtIHRoYXQgLSB6b25lRGVsdGEpIC8gNjA0OGU1OyBicmVhazsgLy8gMTAwMCAqIDYwICogNjAgKiAyNCAqIDcsIG5lZ2F0ZSBkc3RcbiAgICAgICAgICAgIGRlZmF1bHQ6IG91dHB1dCA9IHRoaXMgLSB0aGF0O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFzRmxvYXQgPyBvdXRwdXQgOiBhYnNGbG9vcihvdXRwdXQpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1vbnRoRGlmZiAoYSwgYikge1xuICAgICAgICAvLyBkaWZmZXJlbmNlIGluIG1vbnRoc1xuICAgICAgICB2YXIgd2hvbGVNb250aERpZmYgPSAoKGIueWVhcigpIC0gYS55ZWFyKCkpICogMTIpICsgKGIubW9udGgoKSAtIGEubW9udGgoKSksXG4gICAgICAgICAgICAvLyBiIGlzIGluIChhbmNob3IgLSAxIG1vbnRoLCBhbmNob3IgKyAxIG1vbnRoKVxuICAgICAgICAgICAgYW5jaG9yID0gYS5jbG9uZSgpLmFkZCh3aG9sZU1vbnRoRGlmZiwgJ21vbnRocycpLFxuICAgICAgICAgICAgYW5jaG9yMiwgYWRqdXN0O1xuXG4gICAgICAgIGlmIChiIC0gYW5jaG9yIDwgMCkge1xuICAgICAgICAgICAgYW5jaG9yMiA9IGEuY2xvbmUoKS5hZGQod2hvbGVNb250aERpZmYgLSAxLCAnbW9udGhzJyk7XG4gICAgICAgICAgICAvLyBsaW5lYXIgYWNyb3NzIHRoZSBtb250aFxuICAgICAgICAgICAgYWRqdXN0ID0gKGIgLSBhbmNob3IpIC8gKGFuY2hvciAtIGFuY2hvcjIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYW5jaG9yMiA9IGEuY2xvbmUoKS5hZGQod2hvbGVNb250aERpZmYgKyAxLCAnbW9udGhzJyk7XG4gICAgICAgICAgICAvLyBsaW5lYXIgYWNyb3NzIHRoZSBtb250aFxuICAgICAgICAgICAgYWRqdXN0ID0gKGIgLSBhbmNob3IpIC8gKGFuY2hvcjIgLSBhbmNob3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9jaGVjayBmb3IgbmVnYXRpdmUgemVybywgcmV0dXJuIHplcm8gaWYgbmVnYXRpdmUgemVyb1xuICAgICAgICByZXR1cm4gLSh3aG9sZU1vbnRoRGlmZiArIGFkanVzdCkgfHwgMDtcbiAgICB9XG5cbiAgICBob29rcy5kZWZhdWx0Rm9ybWF0ID0gJ1lZWVktTU0tRERUSEg6bW06c3NaJztcbiAgICBob29rcy5kZWZhdWx0Rm9ybWF0VXRjID0gJ1lZWVktTU0tRERUSEg6bW06c3NbWl0nO1xuXG4gICAgZnVuY3Rpb24gdG9TdHJpbmcgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmxvY2FsZSgnZW4nKS5mb3JtYXQoJ2RkZCBNTU0gREQgWVlZWSBISDptbTpzcyBbR01UXVpaJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG9JU09TdHJpbmcoa2VlcE9mZnNldCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdXRjID0ga2VlcE9mZnNldCAhPT0gdHJ1ZTtcbiAgICAgICAgdmFyIG0gPSB1dGMgPyB0aGlzLmNsb25lKCkudXRjKCkgOiB0aGlzO1xuICAgICAgICBpZiAobS55ZWFyKCkgPCAwIHx8IG0ueWVhcigpID4gOTk5OSkge1xuICAgICAgICAgICAgcmV0dXJuIGZvcm1hdE1vbWVudChtLCB1dGMgPyAnWVlZWVlZLU1NLUREW1RdSEg6bW06c3MuU1NTW1pdJyA6ICdZWVlZWVktTU0tRERbVF1ISDptbTpzcy5TU1NaJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzRnVuY3Rpb24oRGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmcpKSB7XG4gICAgICAgICAgICAvLyBuYXRpdmUgaW1wbGVtZW50YXRpb24gaXMgfjUweCBmYXN0ZXIsIHVzZSBpdCB3aGVuIHdlIGNhblxuICAgICAgICAgICAgaWYgKHV0Yykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRvRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZSh0aGlzLnZhbHVlT2YoKSArIHRoaXMudXRjT2Zmc2V0KCkgKiA2MCAqIDEwMDApLnRvSVNPU3RyaW5nKCkucmVwbGFjZSgnWicsIGZvcm1hdE1vbWVudChtLCAnWicpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZm9ybWF0TW9tZW50KG0sIHV0YyA/ICdZWVlZLU1NLUREW1RdSEg6bW06c3MuU1NTW1pdJyA6ICdZWVlZLU1NLUREW1RdSEg6bW06c3MuU1NTWicpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybiBhIGh1bWFuIHJlYWRhYmxlIHJlcHJlc2VudGF0aW9uIG9mIGEgbW9tZW50IHRoYXQgY2FuXG4gICAgICogYWxzbyBiZSBldmFsdWF0ZWQgdG8gZ2V0IGEgbmV3IG1vbWVudCB3aGljaCBpcyB0aGUgc2FtZVxuICAgICAqXG4gICAgICogQGxpbmsgaHR0cHM6Ly9ub2RlanMub3JnL2Rpc3QvbGF0ZXN0L2RvY3MvYXBpL3V0aWwuaHRtbCN1dGlsX2N1c3RvbV9pbnNwZWN0X2Z1bmN0aW9uX29uX29iamVjdHNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpbnNwZWN0ICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuICdtb21lbnQuaW52YWxpZCgvKiAnICsgdGhpcy5faSArICcgKi8pJztcbiAgICAgICAgfVxuICAgICAgICB2YXIgZnVuYyA9ICdtb21lbnQnO1xuICAgICAgICB2YXIgem9uZSA9ICcnO1xuICAgICAgICBpZiAoIXRoaXMuaXNMb2NhbCgpKSB7XG4gICAgICAgICAgICBmdW5jID0gdGhpcy51dGNPZmZzZXQoKSA9PT0gMCA/ICdtb21lbnQudXRjJyA6ICdtb21lbnQucGFyc2Vab25lJztcbiAgICAgICAgICAgIHpvbmUgPSAnWic7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHByZWZpeCA9ICdbJyArIGZ1bmMgKyAnKFwiXSc7XG4gICAgICAgIHZhciB5ZWFyID0gKDAgPD0gdGhpcy55ZWFyKCkgJiYgdGhpcy55ZWFyKCkgPD0gOTk5OSkgPyAnWVlZWScgOiAnWVlZWVlZJztcbiAgICAgICAgdmFyIGRhdGV0aW1lID0gJy1NTS1ERFtUXUhIOm1tOnNzLlNTUyc7XG4gICAgICAgIHZhciBzdWZmaXggPSB6b25lICsgJ1tcIildJztcblxuICAgICAgICByZXR1cm4gdGhpcy5mb3JtYXQocHJlZml4ICsgeWVhciArIGRhdGV0aW1lICsgc3VmZml4KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBmb3JtYXQgKGlucHV0U3RyaW5nKSB7XG4gICAgICAgIGlmICghaW5wdXRTdHJpbmcpIHtcbiAgICAgICAgICAgIGlucHV0U3RyaW5nID0gdGhpcy5pc1V0YygpID8gaG9va3MuZGVmYXVsdEZvcm1hdFV0YyA6IGhvb2tzLmRlZmF1bHRGb3JtYXQ7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG91dHB1dCA9IGZvcm1hdE1vbWVudCh0aGlzLCBpbnB1dFN0cmluZyk7XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5wb3N0Zm9ybWF0KG91dHB1dCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZnJvbSAodGltZSwgd2l0aG91dFN1ZmZpeCkge1xuICAgICAgICBpZiAodGhpcy5pc1ZhbGlkKCkgJiZcbiAgICAgICAgICAgICAgICAoKGlzTW9tZW50KHRpbWUpICYmIHRpbWUuaXNWYWxpZCgpKSB8fFxuICAgICAgICAgICAgICAgICBjcmVhdGVMb2NhbCh0aW1lKS5pc1ZhbGlkKCkpKSB7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlRHVyYXRpb24oe3RvOiB0aGlzLCBmcm9tOiB0aW1lfSkubG9jYWxlKHRoaXMubG9jYWxlKCkpLmh1bWFuaXplKCF3aXRob3V0U3VmZml4KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5pbnZhbGlkRGF0ZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZnJvbU5vdyAod2l0aG91dFN1ZmZpeCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mcm9tKGNyZWF0ZUxvY2FsKCksIHdpdGhvdXRTdWZmaXgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvICh0aW1lLCB3aXRob3V0U3VmZml4KSB7XG4gICAgICAgIGlmICh0aGlzLmlzVmFsaWQoKSAmJlxuICAgICAgICAgICAgICAgICgoaXNNb21lbnQodGltZSkgJiYgdGltZS5pc1ZhbGlkKCkpIHx8XG4gICAgICAgICAgICAgICAgIGNyZWF0ZUxvY2FsKHRpbWUpLmlzVmFsaWQoKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVEdXJhdGlvbih7ZnJvbTogdGhpcywgdG86IHRpbWV9KS5sb2NhbGUodGhpcy5sb2NhbGUoKSkuaHVtYW5pemUoIXdpdGhvdXRTdWZmaXgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLmludmFsaWREYXRlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0b05vdyAod2l0aG91dFN1ZmZpeCkge1xuICAgICAgICByZXR1cm4gdGhpcy50byhjcmVhdGVMb2NhbCgpLCB3aXRob3V0U3VmZml4KTtcbiAgICB9XG5cbiAgICAvLyBJZiBwYXNzZWQgYSBsb2NhbGUga2V5LCBpdCB3aWxsIHNldCB0aGUgbG9jYWxlIGZvciB0aGlzXG4gICAgLy8gaW5zdGFuY2UuICBPdGhlcndpc2UsIGl0IHdpbGwgcmV0dXJuIHRoZSBsb2NhbGUgY29uZmlndXJhdGlvblxuICAgIC8vIHZhcmlhYmxlcyBmb3IgdGhpcyBpbnN0YW5jZS5cbiAgICBmdW5jdGlvbiBsb2NhbGUgKGtleSkge1xuICAgICAgICB2YXIgbmV3TG9jYWxlRGF0YTtcblxuICAgICAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9sb2NhbGUuX2FiYnI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuZXdMb2NhbGVEYXRhID0gZ2V0TG9jYWxlKGtleSk7XG4gICAgICAgICAgICBpZiAobmV3TG9jYWxlRGF0YSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbG9jYWxlID0gbmV3TG9jYWxlRGF0YTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGxhbmcgPSBkZXByZWNhdGUoXG4gICAgICAgICdtb21lbnQoKS5sYW5nKCkgaXMgZGVwcmVjYXRlZC4gSW5zdGVhZCwgdXNlIG1vbWVudCgpLmxvY2FsZURhdGEoKSB0byBnZXQgdGhlIGxhbmd1YWdlIGNvbmZpZ3VyYXRpb24uIFVzZSBtb21lbnQoKS5sb2NhbGUoKSB0byBjaGFuZ2UgbGFuZ3VhZ2VzLicsXG4gICAgICAgIGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgIGlmIChrZXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICApO1xuXG4gICAgZnVuY3Rpb24gbG9jYWxlRGF0YSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sb2NhbGU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc3RhcnRPZiAodW5pdHMpIHtcbiAgICAgICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cyk7XG4gICAgICAgIC8vIHRoZSBmb2xsb3dpbmcgc3dpdGNoIGludGVudGlvbmFsbHkgb21pdHMgYnJlYWsga2V5d29yZHNcbiAgICAgICAgLy8gdG8gdXRpbGl6ZSBmYWxsaW5nIHRocm91Z2ggdGhlIGNhc2VzLlxuICAgICAgICBzd2l0Y2ggKHVuaXRzKSB7XG4gICAgICAgICAgICBjYXNlICd5ZWFyJzpcbiAgICAgICAgICAgICAgICB0aGlzLm1vbnRoKDApO1xuICAgICAgICAgICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgICAgICAgIGNhc2UgJ3F1YXJ0ZXInOlxuICAgICAgICAgICAgY2FzZSAnbW9udGgnOlxuICAgICAgICAgICAgICAgIHRoaXMuZGF0ZSgxKTtcbiAgICAgICAgICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICAgICAgICBjYXNlICd3ZWVrJzpcbiAgICAgICAgICAgIGNhc2UgJ2lzb1dlZWsnOlxuICAgICAgICAgICAgY2FzZSAnZGF5JzpcbiAgICAgICAgICAgIGNhc2UgJ2RhdGUnOlxuICAgICAgICAgICAgICAgIHRoaXMuaG91cnMoMCk7XG4gICAgICAgICAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgICAgICAgY2FzZSAnaG91cic6XG4gICAgICAgICAgICAgICAgdGhpcy5taW51dGVzKDApO1xuICAgICAgICAgICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgICAgICAgIGNhc2UgJ21pbnV0ZSc6XG4gICAgICAgICAgICAgICAgdGhpcy5zZWNvbmRzKDApO1xuICAgICAgICAgICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgICAgICAgIGNhc2UgJ3NlY29uZCc6XG4gICAgICAgICAgICAgICAgdGhpcy5taWxsaXNlY29uZHMoMCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB3ZWVrcyBhcmUgYSBzcGVjaWFsIGNhc2VcbiAgICAgICAgaWYgKHVuaXRzID09PSAnd2VlaycpIHtcbiAgICAgICAgICAgIHRoaXMud2Vla2RheSgwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodW5pdHMgPT09ICdpc29XZWVrJykge1xuICAgICAgICAgICAgdGhpcy5pc29XZWVrZGF5KDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcXVhcnRlcnMgYXJlIGFsc28gc3BlY2lhbFxuICAgICAgICBpZiAodW5pdHMgPT09ICdxdWFydGVyJykge1xuICAgICAgICAgICAgdGhpcy5tb250aChNYXRoLmZsb29yKHRoaXMubW9udGgoKSAvIDMpICogMyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBlbmRPZiAodW5pdHMpIHtcbiAgICAgICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cyk7XG4gICAgICAgIGlmICh1bml0cyA9PT0gdW5kZWZpbmVkIHx8IHVuaXRzID09PSAnbWlsbGlzZWNvbmQnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vICdkYXRlJyBpcyBhbiBhbGlhcyBmb3IgJ2RheScsIHNvIGl0IHNob3VsZCBiZSBjb25zaWRlcmVkIGFzIHN1Y2guXG4gICAgICAgIGlmICh1bml0cyA9PT0gJ2RhdGUnKSB7XG4gICAgICAgICAgICB1bml0cyA9ICdkYXknO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhcnRPZih1bml0cykuYWRkKDEsICh1bml0cyA9PT0gJ2lzb1dlZWsnID8gJ3dlZWsnIDogdW5pdHMpKS5zdWJ0cmFjdCgxLCAnbXMnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB2YWx1ZU9mICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2QudmFsdWVPZigpIC0gKCh0aGlzLl9vZmZzZXQgfHwgMCkgKiA2MDAwMCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdW5peCAoKSB7XG4gICAgICAgIHJldHVybiBNYXRoLmZsb29yKHRoaXMudmFsdWVPZigpIC8gMTAwMCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG9EYXRlICgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHRoaXMudmFsdWVPZigpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0b0FycmF5ICgpIHtcbiAgICAgICAgdmFyIG0gPSB0aGlzO1xuICAgICAgICByZXR1cm4gW20ueWVhcigpLCBtLm1vbnRoKCksIG0uZGF0ZSgpLCBtLmhvdXIoKSwgbS5taW51dGUoKSwgbS5zZWNvbmQoKSwgbS5taWxsaXNlY29uZCgpXTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0b09iamVjdCAoKSB7XG4gICAgICAgIHZhciBtID0gdGhpcztcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHllYXJzOiBtLnllYXIoKSxcbiAgICAgICAgICAgIG1vbnRoczogbS5tb250aCgpLFxuICAgICAgICAgICAgZGF0ZTogbS5kYXRlKCksXG4gICAgICAgICAgICBob3VyczogbS5ob3VycygpLFxuICAgICAgICAgICAgbWludXRlczogbS5taW51dGVzKCksXG4gICAgICAgICAgICBzZWNvbmRzOiBtLnNlY29uZHMoKSxcbiAgICAgICAgICAgIG1pbGxpc2Vjb25kczogbS5taWxsaXNlY29uZHMoKVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvSlNPTiAoKSB7XG4gICAgICAgIC8vIG5ldyBEYXRlKE5hTikudG9KU09OKCkgPT09IG51bGxcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCgpID8gdGhpcy50b0lTT1N0cmluZygpIDogbnVsbDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1ZhbGlkJDIgKCkge1xuICAgICAgICByZXR1cm4gaXNWYWxpZCh0aGlzKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwYXJzaW5nRmxhZ3MgKCkge1xuICAgICAgICByZXR1cm4gZXh0ZW5kKHt9LCBnZXRQYXJzaW5nRmxhZ3ModGhpcykpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGludmFsaWRBdCAoKSB7XG4gICAgICAgIHJldHVybiBnZXRQYXJzaW5nRmxhZ3ModGhpcykub3ZlcmZsb3c7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRpb25EYXRhKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaW5wdXQ6IHRoaXMuX2ksXG4gICAgICAgICAgICBmb3JtYXQ6IHRoaXMuX2YsXG4gICAgICAgICAgICBsb2NhbGU6IHRoaXMuX2xvY2FsZSxcbiAgICAgICAgICAgIGlzVVRDOiB0aGlzLl9pc1VUQyxcbiAgICAgICAgICAgIHN0cmljdDogdGhpcy5fc3RyaWN0XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydnZycsIDJdLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLndlZWtZZWFyKCkgJSAxMDA7XG4gICAgfSk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ0dHJywgMl0sIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNvV2Vla1llYXIoKSAlIDEwMDtcbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIGFkZFdlZWtZZWFyRm9ybWF0VG9rZW4gKHRva2VuLCBnZXR0ZXIpIHtcbiAgICAgICAgYWRkRm9ybWF0VG9rZW4oMCwgW3Rva2VuLCB0b2tlbi5sZW5ndGhdLCAwLCBnZXR0ZXIpO1xuICAgIH1cblxuICAgIGFkZFdlZWtZZWFyRm9ybWF0VG9rZW4oJ2dnZ2cnLCAgICAgJ3dlZWtZZWFyJyk7XG4gICAgYWRkV2Vla1llYXJGb3JtYXRUb2tlbignZ2dnZ2cnLCAgICAnd2Vla1llYXInKTtcbiAgICBhZGRXZWVrWWVhckZvcm1hdFRva2VuKCdHR0dHJywgICdpc29XZWVrWWVhcicpO1xuICAgIGFkZFdlZWtZZWFyRm9ybWF0VG9rZW4oJ0dHR0dHJywgJ2lzb1dlZWtZZWFyJyk7XG5cbiAgICAvLyBBTElBU0VTXG5cbiAgICBhZGRVbml0QWxpYXMoJ3dlZWtZZWFyJywgJ2dnJyk7XG4gICAgYWRkVW5pdEFsaWFzKCdpc29XZWVrWWVhcicsICdHRycpO1xuXG4gICAgLy8gUFJJT1JJVFlcblxuICAgIGFkZFVuaXRQcmlvcml0eSgnd2Vla1llYXInLCAxKTtcbiAgICBhZGRVbml0UHJpb3JpdHkoJ2lzb1dlZWtZZWFyJywgMSk7XG5cblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ0cnLCAgICAgIG1hdGNoU2lnbmVkKTtcbiAgICBhZGRSZWdleFRva2VuKCdnJywgICAgICBtYXRjaFNpZ25lZCk7XG4gICAgYWRkUmVnZXhUb2tlbignR0cnLCAgICAgbWF0Y2gxdG8yLCBtYXRjaDIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2dnJywgICAgIG1hdGNoMXRvMiwgbWF0Y2gyKTtcbiAgICBhZGRSZWdleFRva2VuKCdHR0dHJywgICBtYXRjaDF0bzQsIG1hdGNoNCk7XG4gICAgYWRkUmVnZXhUb2tlbignZ2dnZycsICAgbWF0Y2gxdG80LCBtYXRjaDQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ0dHR0dHJywgIG1hdGNoMXRvNiwgbWF0Y2g2KTtcbiAgICBhZGRSZWdleFRva2VuKCdnZ2dnZycsICBtYXRjaDF0bzYsIG1hdGNoNik7XG5cbiAgICBhZGRXZWVrUGFyc2VUb2tlbihbJ2dnZ2cnLCAnZ2dnZ2cnLCAnR0dHRycsICdHR0dHRyddLCBmdW5jdGlvbiAoaW5wdXQsIHdlZWssIGNvbmZpZywgdG9rZW4pIHtcbiAgICAgICAgd2Vla1t0b2tlbi5zdWJzdHIoMCwgMildID0gdG9JbnQoaW5wdXQpO1xuICAgIH0pO1xuXG4gICAgYWRkV2Vla1BhcnNlVG9rZW4oWydnZycsICdHRyddLCBmdW5jdGlvbiAoaW5wdXQsIHdlZWssIGNvbmZpZywgdG9rZW4pIHtcbiAgICAgICAgd2Vla1t0b2tlbl0gPSBob29rcy5wYXJzZVR3b0RpZ2l0WWVhcihpbnB1dCk7XG4gICAgfSk7XG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICBmdW5jdGlvbiBnZXRTZXRXZWVrWWVhciAoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIGdldFNldFdlZWtZZWFySGVscGVyLmNhbGwodGhpcyxcbiAgICAgICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgICAgICB0aGlzLndlZWsoKSxcbiAgICAgICAgICAgICAgICB0aGlzLndlZWtkYXkoKSxcbiAgICAgICAgICAgICAgICB0aGlzLmxvY2FsZURhdGEoKS5fd2Vlay5kb3csXG4gICAgICAgICAgICAgICAgdGhpcy5sb2NhbGVEYXRhKCkuX3dlZWsuZG95KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRTZXRJU09XZWVrWWVhciAoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIGdldFNldFdlZWtZZWFySGVscGVyLmNhbGwodGhpcyxcbiAgICAgICAgICAgICAgICBpbnB1dCwgdGhpcy5pc29XZWVrKCksIHRoaXMuaXNvV2Vla2RheSgpLCAxLCA0KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRJU09XZWVrc0luWWVhciAoKSB7XG4gICAgICAgIHJldHVybiB3ZWVrc0luWWVhcih0aGlzLnllYXIoKSwgMSwgNCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0V2Vla3NJblllYXIgKCkge1xuICAgICAgICB2YXIgd2Vla0luZm8gPSB0aGlzLmxvY2FsZURhdGEoKS5fd2VlaztcbiAgICAgICAgcmV0dXJuIHdlZWtzSW5ZZWFyKHRoaXMueWVhcigpLCB3ZWVrSW5mby5kb3csIHdlZWtJbmZvLmRveSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0U2V0V2Vla1llYXJIZWxwZXIoaW5wdXQsIHdlZWssIHdlZWtkYXksIGRvdywgZG95KSB7XG4gICAgICAgIHZhciB3ZWVrc1RhcmdldDtcbiAgICAgICAgaWYgKGlucHV0ID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB3ZWVrT2ZZZWFyKHRoaXMsIGRvdywgZG95KS55ZWFyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgd2Vla3NUYXJnZXQgPSB3ZWVrc0luWWVhcihpbnB1dCwgZG93LCBkb3kpO1xuICAgICAgICAgICAgaWYgKHdlZWsgPiB3ZWVrc1RhcmdldCkge1xuICAgICAgICAgICAgICAgIHdlZWsgPSB3ZWVrc1RhcmdldDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzZXRXZWVrQWxsLmNhbGwodGhpcywgaW5wdXQsIHdlZWssIHdlZWtkYXksIGRvdywgZG95KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldFdlZWtBbGwod2Vla1llYXIsIHdlZWssIHdlZWtkYXksIGRvdywgZG95KSB7XG4gICAgICAgIHZhciBkYXlPZlllYXJEYXRhID0gZGF5T2ZZZWFyRnJvbVdlZWtzKHdlZWtZZWFyLCB3ZWVrLCB3ZWVrZGF5LCBkb3csIGRveSksXG4gICAgICAgICAgICBkYXRlID0gY3JlYXRlVVRDRGF0ZShkYXlPZlllYXJEYXRhLnllYXIsIDAsIGRheU9mWWVhckRhdGEuZGF5T2ZZZWFyKTtcblxuICAgICAgICB0aGlzLnllYXIoZGF0ZS5nZXRVVENGdWxsWWVhcigpKTtcbiAgICAgICAgdGhpcy5tb250aChkYXRlLmdldFVUQ01vbnRoKCkpO1xuICAgICAgICB0aGlzLmRhdGUoZGF0ZS5nZXRVVENEYXRlKCkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbignUScsIDAsICdRbycsICdxdWFydGVyJyk7XG5cbiAgICAvLyBBTElBU0VTXG5cbiAgICBhZGRVbml0QWxpYXMoJ3F1YXJ0ZXInLCAnUScpO1xuXG4gICAgLy8gUFJJT1JJVFlcblxuICAgIGFkZFVuaXRQcmlvcml0eSgncXVhcnRlcicsIDcpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbignUScsIG1hdGNoMSk7XG4gICAgYWRkUGFyc2VUb2tlbignUScsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXkpIHtcbiAgICAgICAgYXJyYXlbTU9OVEhdID0gKHRvSW50KGlucHV0KSAtIDEpICogMztcbiAgICB9KTtcblxuICAgIC8vIE1PTUVOVFNcblxuICAgIGZ1bmN0aW9uIGdldFNldFF1YXJ0ZXIgKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBpbnB1dCA9PSBudWxsID8gTWF0aC5jZWlsKCh0aGlzLm1vbnRoKCkgKyAxKSAvIDMpIDogdGhpcy5tb250aCgoaW5wdXQgLSAxKSAqIDMgKyB0aGlzLm1vbnRoKCkgJSAzKTtcbiAgICB9XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbignRCcsIFsnREQnLCAyXSwgJ0RvJywgJ2RhdGUnKTtcblxuICAgIC8vIEFMSUFTRVNcblxuICAgIGFkZFVuaXRBbGlhcygnZGF0ZScsICdEJyk7XG5cbiAgICAvLyBQUklPUklUWVxuICAgIGFkZFVuaXRQcmlvcml0eSgnZGF0ZScsIDkpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbignRCcsICBtYXRjaDF0bzIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ0REJywgbWF0Y2gxdG8yLCBtYXRjaDIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ0RvJywgZnVuY3Rpb24gKGlzU3RyaWN0LCBsb2NhbGUpIHtcbiAgICAgICAgLy8gVE9ETzogUmVtb3ZlIFwib3JkaW5hbFBhcnNlXCIgZmFsbGJhY2sgaW4gbmV4dCBtYWpvciByZWxlYXNlLlxuICAgICAgICByZXR1cm4gaXNTdHJpY3QgP1xuICAgICAgICAgIChsb2NhbGUuX2RheU9mTW9udGhPcmRpbmFsUGFyc2UgfHwgbG9jYWxlLl9vcmRpbmFsUGFyc2UpIDpcbiAgICAgICAgICBsb2NhbGUuX2RheU9mTW9udGhPcmRpbmFsUGFyc2VMZW5pZW50O1xuICAgIH0pO1xuXG4gICAgYWRkUGFyc2VUb2tlbihbJ0QnLCAnREQnXSwgREFURSk7XG4gICAgYWRkUGFyc2VUb2tlbignRG8nLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5KSB7XG4gICAgICAgIGFycmF5W0RBVEVdID0gdG9JbnQoaW5wdXQubWF0Y2gobWF0Y2gxdG8yKVswXSk7XG4gICAgfSk7XG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICB2YXIgZ2V0U2V0RGF5T2ZNb250aCA9IG1ha2VHZXRTZXQoJ0RhdGUnLCB0cnVlKTtcblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCdEREQnLCBbJ0REREQnLCAzXSwgJ0RERG8nLCAnZGF5T2ZZZWFyJyk7XG5cbiAgICAvLyBBTElBU0VTXG5cbiAgICBhZGRVbml0QWxpYXMoJ2RheU9mWWVhcicsICdEREQnKTtcblxuICAgIC8vIFBSSU9SSVRZXG4gICAgYWRkVW5pdFByaW9yaXR5KCdkYXlPZlllYXInLCA0KTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ0RERCcsICBtYXRjaDF0bzMpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ0REREQnLCBtYXRjaDMpO1xuICAgIGFkZFBhcnNlVG9rZW4oWydEREQnLCAnRERERCddLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcpIHtcbiAgICAgICAgY29uZmlnLl9kYXlPZlllYXIgPSB0b0ludChpbnB1dCk7XG4gICAgfSk7XG5cbiAgICAvLyBIRUxQRVJTXG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICBmdW5jdGlvbiBnZXRTZXREYXlPZlllYXIgKGlucHV0KSB7XG4gICAgICAgIHZhciBkYXlPZlllYXIgPSBNYXRoLnJvdW5kKCh0aGlzLmNsb25lKCkuc3RhcnRPZignZGF5JykgLSB0aGlzLmNsb25lKCkuc3RhcnRPZigneWVhcicpKSAvIDg2NGU1KSArIDE7XG4gICAgICAgIHJldHVybiBpbnB1dCA9PSBudWxsID8gZGF5T2ZZZWFyIDogdGhpcy5hZGQoKGlucHV0IC0gZGF5T2ZZZWFyKSwgJ2QnKTtcbiAgICB9XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbignbScsIFsnbW0nLCAyXSwgMCwgJ21pbnV0ZScpO1xuXG4gICAgLy8gQUxJQVNFU1xuXG4gICAgYWRkVW5pdEFsaWFzKCdtaW51dGUnLCAnbScpO1xuXG4gICAgLy8gUFJJT1JJVFlcblxuICAgIGFkZFVuaXRQcmlvcml0eSgnbWludXRlJywgMTQpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbignbScsICBtYXRjaDF0bzIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ21tJywgbWF0Y2gxdG8yLCBtYXRjaDIpO1xuICAgIGFkZFBhcnNlVG9rZW4oWydtJywgJ21tJ10sIE1JTlVURSk7XG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICB2YXIgZ2V0U2V0TWludXRlID0gbWFrZUdldFNldCgnTWludXRlcycsIGZhbHNlKTtcblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCdzJywgWydzcycsIDJdLCAwLCAnc2Vjb25kJyk7XG5cbiAgICAvLyBBTElBU0VTXG5cbiAgICBhZGRVbml0QWxpYXMoJ3NlY29uZCcsICdzJyk7XG5cbiAgICAvLyBQUklPUklUWVxuXG4gICAgYWRkVW5pdFByaW9yaXR5KCdzZWNvbmQnLCAxNSk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCdzJywgIG1hdGNoMXRvMik7XG4gICAgYWRkUmVnZXhUb2tlbignc3MnLCBtYXRjaDF0bzIsIG1hdGNoMik7XG4gICAgYWRkUGFyc2VUb2tlbihbJ3MnLCAnc3MnXSwgU0VDT05EKTtcblxuICAgIC8vIE1PTUVOVFNcblxuICAgIHZhciBnZXRTZXRTZWNvbmQgPSBtYWtlR2V0U2V0KCdTZWNvbmRzJywgZmFsc2UpO1xuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ1MnLCAwLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB+fih0aGlzLm1pbGxpc2Vjb25kKCkgLyAxMDApO1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydTUycsIDJdLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB+fih0aGlzLm1pbGxpc2Vjb25kKCkgLyAxMCk7XG4gICAgfSk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1NTUycsIDNdLCAwLCAnbWlsbGlzZWNvbmQnKTtcbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1NTU1MnLCA0XSwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5taWxsaXNlY29uZCgpICogMTA7XG4gICAgfSk7XG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydTU1NTUycsIDVdLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbGxpc2Vjb25kKCkgKiAxMDA7XG4gICAgfSk7XG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydTU1NTU1MnLCA2XSwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5taWxsaXNlY29uZCgpICogMTAwMDtcbiAgICB9KTtcbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1NTU1NTU1MnLCA3XSwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5taWxsaXNlY29uZCgpICogMTAwMDA7XG4gICAgfSk7XG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydTU1NTU1NTUycsIDhdLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbGxpc2Vjb25kKCkgKiAxMDAwMDA7XG4gICAgfSk7XG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydTU1NTU1NTU1MnLCA5XSwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5taWxsaXNlY29uZCgpICogMTAwMDAwMDtcbiAgICB9KTtcblxuXG4gICAgLy8gQUxJQVNFU1xuXG4gICAgYWRkVW5pdEFsaWFzKCdtaWxsaXNlY29uZCcsICdtcycpO1xuXG4gICAgLy8gUFJJT1JJVFlcblxuICAgIGFkZFVuaXRQcmlvcml0eSgnbWlsbGlzZWNvbmQnLCAxNik7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCdTJywgICAgbWF0Y2gxdG8zLCBtYXRjaDEpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ1NTJywgICBtYXRjaDF0bzMsIG1hdGNoMik7XG4gICAgYWRkUmVnZXhUb2tlbignU1NTJywgIG1hdGNoMXRvMywgbWF0Y2gzKTtcblxuICAgIHZhciB0b2tlbjtcbiAgICBmb3IgKHRva2VuID0gJ1NTU1MnOyB0b2tlbi5sZW5ndGggPD0gOTsgdG9rZW4gKz0gJ1MnKSB7XG4gICAgICAgIGFkZFJlZ2V4VG9rZW4odG9rZW4sIG1hdGNoVW5zaWduZWQpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBhcnNlTXMoaW5wdXQsIGFycmF5KSB7XG4gICAgICAgIGFycmF5W01JTExJU0VDT05EXSA9IHRvSW50KCgnMC4nICsgaW5wdXQpICogMTAwMCk7XG4gICAgfVxuXG4gICAgZm9yICh0b2tlbiA9ICdTJzsgdG9rZW4ubGVuZ3RoIDw9IDk7IHRva2VuICs9ICdTJykge1xuICAgICAgICBhZGRQYXJzZVRva2VuKHRva2VuLCBwYXJzZU1zKTtcbiAgICB9XG4gICAgLy8gTU9NRU5UU1xuXG4gICAgdmFyIGdldFNldE1pbGxpc2Vjb25kID0gbWFrZUdldFNldCgnTWlsbGlzZWNvbmRzJywgZmFsc2UpO1xuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ3onLCAgMCwgMCwgJ3pvbmVBYmJyJyk7XG4gICAgYWRkRm9ybWF0VG9rZW4oJ3p6JywgMCwgMCwgJ3pvbmVOYW1lJyk7XG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICBmdW5jdGlvbiBnZXRab25lQWJiciAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc1VUQyA/ICdVVEMnIDogJyc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0Wm9uZU5hbWUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNVVEMgPyAnQ29vcmRpbmF0ZWQgVW5pdmVyc2FsIFRpbWUnIDogJyc7XG4gICAgfVxuXG4gICAgdmFyIHByb3RvID0gTW9tZW50LnByb3RvdHlwZTtcblxuICAgIHByb3RvLmFkZCAgICAgICAgICAgICAgID0gYWRkO1xuICAgIHByb3RvLmNhbGVuZGFyICAgICAgICAgID0gY2FsZW5kYXIkMTtcbiAgICBwcm90by5jbG9uZSAgICAgICAgICAgICA9IGNsb25lO1xuICAgIHByb3RvLmRpZmYgICAgICAgICAgICAgID0gZGlmZjtcbiAgICBwcm90by5lbmRPZiAgICAgICAgICAgICA9IGVuZE9mO1xuICAgIHByb3RvLmZvcm1hdCAgICAgICAgICAgID0gZm9ybWF0O1xuICAgIHByb3RvLmZyb20gICAgICAgICAgICAgID0gZnJvbTtcbiAgICBwcm90by5mcm9tTm93ICAgICAgICAgICA9IGZyb21Ob3c7XG4gICAgcHJvdG8udG8gICAgICAgICAgICAgICAgPSB0bztcbiAgICBwcm90by50b05vdyAgICAgICAgICAgICA9IHRvTm93O1xuICAgIHByb3RvLmdldCAgICAgICAgICAgICAgID0gc3RyaW5nR2V0O1xuICAgIHByb3RvLmludmFsaWRBdCAgICAgICAgID0gaW52YWxpZEF0O1xuICAgIHByb3RvLmlzQWZ0ZXIgICAgICAgICAgID0gaXNBZnRlcjtcbiAgICBwcm90by5pc0JlZm9yZSAgICAgICAgICA9IGlzQmVmb3JlO1xuICAgIHByb3RvLmlzQmV0d2VlbiAgICAgICAgID0gaXNCZXR3ZWVuO1xuICAgIHByb3RvLmlzU2FtZSAgICAgICAgICAgID0gaXNTYW1lO1xuICAgIHByb3RvLmlzU2FtZU9yQWZ0ZXIgICAgID0gaXNTYW1lT3JBZnRlcjtcbiAgICBwcm90by5pc1NhbWVPckJlZm9yZSAgICA9IGlzU2FtZU9yQmVmb3JlO1xuICAgIHByb3RvLmlzVmFsaWQgICAgICAgICAgID0gaXNWYWxpZCQyO1xuICAgIHByb3RvLmxhbmcgICAgICAgICAgICAgID0gbGFuZztcbiAgICBwcm90by5sb2NhbGUgICAgICAgICAgICA9IGxvY2FsZTtcbiAgICBwcm90by5sb2NhbGVEYXRhICAgICAgICA9IGxvY2FsZURhdGE7XG4gICAgcHJvdG8ubWF4ICAgICAgICAgICAgICAgPSBwcm90b3R5cGVNYXg7XG4gICAgcHJvdG8ubWluICAgICAgICAgICAgICAgPSBwcm90b3R5cGVNaW47XG4gICAgcHJvdG8ucGFyc2luZ0ZsYWdzICAgICAgPSBwYXJzaW5nRmxhZ3M7XG4gICAgcHJvdG8uc2V0ICAgICAgICAgICAgICAgPSBzdHJpbmdTZXQ7XG4gICAgcHJvdG8uc3RhcnRPZiAgICAgICAgICAgPSBzdGFydE9mO1xuICAgIHByb3RvLnN1YnRyYWN0ICAgICAgICAgID0gc3VidHJhY3Q7XG4gICAgcHJvdG8udG9BcnJheSAgICAgICAgICAgPSB0b0FycmF5O1xuICAgIHByb3RvLnRvT2JqZWN0ICAgICAgICAgID0gdG9PYmplY3Q7XG4gICAgcHJvdG8udG9EYXRlICAgICAgICAgICAgPSB0b0RhdGU7XG4gICAgcHJvdG8udG9JU09TdHJpbmcgICAgICAgPSB0b0lTT1N0cmluZztcbiAgICBwcm90by5pbnNwZWN0ICAgICAgICAgICA9IGluc3BlY3Q7XG4gICAgcHJvdG8udG9KU09OICAgICAgICAgICAgPSB0b0pTT047XG4gICAgcHJvdG8udG9TdHJpbmcgICAgICAgICAgPSB0b1N0cmluZztcbiAgICBwcm90by51bml4ICAgICAgICAgICAgICA9IHVuaXg7XG4gICAgcHJvdG8udmFsdWVPZiAgICAgICAgICAgPSB2YWx1ZU9mO1xuICAgIHByb3RvLmNyZWF0aW9uRGF0YSAgICAgID0gY3JlYXRpb25EYXRhO1xuICAgIHByb3RvLnllYXIgICAgICAgPSBnZXRTZXRZZWFyO1xuICAgIHByb3RvLmlzTGVhcFllYXIgPSBnZXRJc0xlYXBZZWFyO1xuICAgIHByb3RvLndlZWtZZWFyICAgID0gZ2V0U2V0V2Vla1llYXI7XG4gICAgcHJvdG8uaXNvV2Vla1llYXIgPSBnZXRTZXRJU09XZWVrWWVhcjtcbiAgICBwcm90by5xdWFydGVyID0gcHJvdG8ucXVhcnRlcnMgPSBnZXRTZXRRdWFydGVyO1xuICAgIHByb3RvLm1vbnRoICAgICAgID0gZ2V0U2V0TW9udGg7XG4gICAgcHJvdG8uZGF5c0luTW9udGggPSBnZXREYXlzSW5Nb250aDtcbiAgICBwcm90by53ZWVrICAgICAgICAgICA9IHByb3RvLndlZWtzICAgICAgICA9IGdldFNldFdlZWs7XG4gICAgcHJvdG8uaXNvV2VlayAgICAgICAgPSBwcm90by5pc29XZWVrcyAgICAgPSBnZXRTZXRJU09XZWVrO1xuICAgIHByb3RvLndlZWtzSW5ZZWFyICAgID0gZ2V0V2Vla3NJblllYXI7XG4gICAgcHJvdG8uaXNvV2Vla3NJblllYXIgPSBnZXRJU09XZWVrc0luWWVhcjtcbiAgICBwcm90by5kYXRlICAgICAgID0gZ2V0U2V0RGF5T2ZNb250aDtcbiAgICBwcm90by5kYXkgICAgICAgID0gcHJvdG8uZGF5cyAgICAgICAgICAgICA9IGdldFNldERheU9mV2VlaztcbiAgICBwcm90by53ZWVrZGF5ICAgID0gZ2V0U2V0TG9jYWxlRGF5T2ZXZWVrO1xuICAgIHByb3RvLmlzb1dlZWtkYXkgPSBnZXRTZXRJU09EYXlPZldlZWs7XG4gICAgcHJvdG8uZGF5T2ZZZWFyICA9IGdldFNldERheU9mWWVhcjtcbiAgICBwcm90by5ob3VyID0gcHJvdG8uaG91cnMgPSBnZXRTZXRIb3VyO1xuICAgIHByb3RvLm1pbnV0ZSA9IHByb3RvLm1pbnV0ZXMgPSBnZXRTZXRNaW51dGU7XG4gICAgcHJvdG8uc2Vjb25kID0gcHJvdG8uc2Vjb25kcyA9IGdldFNldFNlY29uZDtcbiAgICBwcm90by5taWxsaXNlY29uZCA9IHByb3RvLm1pbGxpc2Vjb25kcyA9IGdldFNldE1pbGxpc2Vjb25kO1xuICAgIHByb3RvLnV0Y09mZnNldCAgICAgICAgICAgID0gZ2V0U2V0T2Zmc2V0O1xuICAgIHByb3RvLnV0YyAgICAgICAgICAgICAgICAgID0gc2V0T2Zmc2V0VG9VVEM7XG4gICAgcHJvdG8ubG9jYWwgICAgICAgICAgICAgICAgPSBzZXRPZmZzZXRUb0xvY2FsO1xuICAgIHByb3RvLnBhcnNlWm9uZSAgICAgICAgICAgID0gc2V0T2Zmc2V0VG9QYXJzZWRPZmZzZXQ7XG4gICAgcHJvdG8uaGFzQWxpZ25lZEhvdXJPZmZzZXQgPSBoYXNBbGlnbmVkSG91ck9mZnNldDtcbiAgICBwcm90by5pc0RTVCAgICAgICAgICAgICAgICA9IGlzRGF5bGlnaHRTYXZpbmdUaW1lO1xuICAgIHByb3RvLmlzTG9jYWwgICAgICAgICAgICAgID0gaXNMb2NhbDtcbiAgICBwcm90by5pc1V0Y09mZnNldCAgICAgICAgICA9IGlzVXRjT2Zmc2V0O1xuICAgIHByb3RvLmlzVXRjICAgICAgICAgICAgICAgID0gaXNVdGM7XG4gICAgcHJvdG8uaXNVVEMgICAgICAgICAgICAgICAgPSBpc1V0YztcbiAgICBwcm90by56b25lQWJiciA9IGdldFpvbmVBYmJyO1xuICAgIHByb3RvLnpvbmVOYW1lID0gZ2V0Wm9uZU5hbWU7XG4gICAgcHJvdG8uZGF0ZXMgID0gZGVwcmVjYXRlKCdkYXRlcyBhY2Nlc3NvciBpcyBkZXByZWNhdGVkLiBVc2UgZGF0ZSBpbnN0ZWFkLicsIGdldFNldERheU9mTW9udGgpO1xuICAgIHByb3RvLm1vbnRocyA9IGRlcHJlY2F0ZSgnbW9udGhzIGFjY2Vzc29yIGlzIGRlcHJlY2F0ZWQuIFVzZSBtb250aCBpbnN0ZWFkJywgZ2V0U2V0TW9udGgpO1xuICAgIHByb3RvLnllYXJzICA9IGRlcHJlY2F0ZSgneWVhcnMgYWNjZXNzb3IgaXMgZGVwcmVjYXRlZC4gVXNlIHllYXIgaW5zdGVhZCcsIGdldFNldFllYXIpO1xuICAgIHByb3RvLnpvbmUgICA9IGRlcHJlY2F0ZSgnbW9tZW50KCkuem9uZSBpcyBkZXByZWNhdGVkLCB1c2UgbW9tZW50KCkudXRjT2Zmc2V0IGluc3RlYWQuIGh0dHA6Ly9tb21lbnRqcy5jb20vZ3VpZGVzLyMvd2FybmluZ3Mvem9uZS8nLCBnZXRTZXRab25lKTtcbiAgICBwcm90by5pc0RTVFNoaWZ0ZWQgPSBkZXByZWNhdGUoJ2lzRFNUU2hpZnRlZCBpcyBkZXByZWNhdGVkLiBTZWUgaHR0cDovL21vbWVudGpzLmNvbS9ndWlkZXMvIy93YXJuaW5ncy9kc3Qtc2hpZnRlZC8gZm9yIG1vcmUgaW5mb3JtYXRpb24nLCBpc0RheWxpZ2h0U2F2aW5nVGltZVNoaWZ0ZWQpO1xuXG4gICAgZnVuY3Rpb24gY3JlYXRlVW5peCAoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUxvY2FsKGlucHV0ICogMTAwMCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRlSW5ab25lICgpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUxvY2FsLmFwcGx5KG51bGwsIGFyZ3VtZW50cykucGFyc2Vab25lKCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcHJlUGFyc2VQb3N0Rm9ybWF0IChzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZztcbiAgICB9XG5cbiAgICB2YXIgcHJvdG8kMSA9IExvY2FsZS5wcm90b3R5cGU7XG5cbiAgICBwcm90byQxLmNhbGVuZGFyICAgICAgICA9IGNhbGVuZGFyO1xuICAgIHByb3RvJDEubG9uZ0RhdGVGb3JtYXQgID0gbG9uZ0RhdGVGb3JtYXQ7XG4gICAgcHJvdG8kMS5pbnZhbGlkRGF0ZSAgICAgPSBpbnZhbGlkRGF0ZTtcbiAgICBwcm90byQxLm9yZGluYWwgICAgICAgICA9IG9yZGluYWw7XG4gICAgcHJvdG8kMS5wcmVwYXJzZSAgICAgICAgPSBwcmVQYXJzZVBvc3RGb3JtYXQ7XG4gICAgcHJvdG8kMS5wb3N0Zm9ybWF0ICAgICAgPSBwcmVQYXJzZVBvc3RGb3JtYXQ7XG4gICAgcHJvdG8kMS5yZWxhdGl2ZVRpbWUgICAgPSByZWxhdGl2ZVRpbWU7XG4gICAgcHJvdG8kMS5wYXN0RnV0dXJlICAgICAgPSBwYXN0RnV0dXJlO1xuICAgIHByb3RvJDEuc2V0ICAgICAgICAgICAgID0gc2V0O1xuXG4gICAgcHJvdG8kMS5tb250aHMgICAgICAgICAgICA9ICAgICAgICBsb2NhbGVNb250aHM7XG4gICAgcHJvdG8kMS5tb250aHNTaG9ydCAgICAgICA9ICAgICAgICBsb2NhbGVNb250aHNTaG9ydDtcbiAgICBwcm90byQxLm1vbnRoc1BhcnNlICAgICAgID0gICAgICAgIGxvY2FsZU1vbnRoc1BhcnNlO1xuICAgIHByb3RvJDEubW9udGhzUmVnZXggICAgICAgPSBtb250aHNSZWdleDtcbiAgICBwcm90byQxLm1vbnRoc1Nob3J0UmVnZXggID0gbW9udGhzU2hvcnRSZWdleDtcbiAgICBwcm90byQxLndlZWsgPSBsb2NhbGVXZWVrO1xuICAgIHByb3RvJDEuZmlyc3REYXlPZlllYXIgPSBsb2NhbGVGaXJzdERheU9mWWVhcjtcbiAgICBwcm90byQxLmZpcnN0RGF5T2ZXZWVrID0gbG9jYWxlRmlyc3REYXlPZldlZWs7XG5cbiAgICBwcm90byQxLndlZWtkYXlzICAgICAgID0gICAgICAgIGxvY2FsZVdlZWtkYXlzO1xuICAgIHByb3RvJDEud2Vla2RheXNNaW4gICAgPSAgICAgICAgbG9jYWxlV2Vla2RheXNNaW47XG4gICAgcHJvdG8kMS53ZWVrZGF5c1Nob3J0ICA9ICAgICAgICBsb2NhbGVXZWVrZGF5c1Nob3J0O1xuICAgIHByb3RvJDEud2Vla2RheXNQYXJzZSAgPSAgICAgICAgbG9jYWxlV2Vla2RheXNQYXJzZTtcblxuICAgIHByb3RvJDEud2Vla2RheXNSZWdleCAgICAgICA9ICAgICAgICB3ZWVrZGF5c1JlZ2V4O1xuICAgIHByb3RvJDEud2Vla2RheXNTaG9ydFJlZ2V4ICA9ICAgICAgICB3ZWVrZGF5c1Nob3J0UmVnZXg7XG4gICAgcHJvdG8kMS53ZWVrZGF5c01pblJlZ2V4ICAgID0gICAgICAgIHdlZWtkYXlzTWluUmVnZXg7XG5cbiAgICBwcm90byQxLmlzUE0gPSBsb2NhbGVJc1BNO1xuICAgIHByb3RvJDEubWVyaWRpZW0gPSBsb2NhbGVNZXJpZGllbTtcblxuICAgIGZ1bmN0aW9uIGdldCQxIChmb3JtYXQsIGluZGV4LCBmaWVsZCwgc2V0dGVyKSB7XG4gICAgICAgIHZhciBsb2NhbGUgPSBnZXRMb2NhbGUoKTtcbiAgICAgICAgdmFyIHV0YyA9IGNyZWF0ZVVUQygpLnNldChzZXR0ZXIsIGluZGV4KTtcbiAgICAgICAgcmV0dXJuIGxvY2FsZVtmaWVsZF0odXRjLCBmb3JtYXQpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpc3RNb250aHNJbXBsIChmb3JtYXQsIGluZGV4LCBmaWVsZCkge1xuICAgICAgICBpZiAoaXNOdW1iZXIoZm9ybWF0KSkge1xuICAgICAgICAgICAgaW5kZXggPSBmb3JtYXQ7XG4gICAgICAgICAgICBmb3JtYXQgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBmb3JtYXQgPSBmb3JtYXQgfHwgJyc7XG5cbiAgICAgICAgaWYgKGluZGV4ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBnZXQkMShmb3JtYXQsIGluZGV4LCBmaWVsZCwgJ21vbnRoJyk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaTtcbiAgICAgICAgdmFyIG91dCA9IFtdO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTI7IGkrKykge1xuICAgICAgICAgICAgb3V0W2ldID0gZ2V0JDEoZm9ybWF0LCBpLCBmaWVsZCwgJ21vbnRoJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dDtcbiAgICB9XG5cbiAgICAvLyAoKVxuICAgIC8vICg1KVxuICAgIC8vIChmbXQsIDUpXG4gICAgLy8gKGZtdClcbiAgICAvLyAodHJ1ZSlcbiAgICAvLyAodHJ1ZSwgNSlcbiAgICAvLyAodHJ1ZSwgZm10LCA1KVxuICAgIC8vICh0cnVlLCBmbXQpXG4gICAgZnVuY3Rpb24gbGlzdFdlZWtkYXlzSW1wbCAobG9jYWxlU29ydGVkLCBmb3JtYXQsIGluZGV4LCBmaWVsZCkge1xuICAgICAgICBpZiAodHlwZW9mIGxvY2FsZVNvcnRlZCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICBpZiAoaXNOdW1iZXIoZm9ybWF0KSkge1xuICAgICAgICAgICAgICAgIGluZGV4ID0gZm9ybWF0O1xuICAgICAgICAgICAgICAgIGZvcm1hdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9ybWF0ID0gZm9ybWF0IHx8ICcnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9ybWF0ID0gbG9jYWxlU29ydGVkO1xuICAgICAgICAgICAgaW5kZXggPSBmb3JtYXQ7XG4gICAgICAgICAgICBsb2NhbGVTb3J0ZWQgPSBmYWxzZTtcblxuICAgICAgICAgICAgaWYgKGlzTnVtYmVyKGZvcm1hdCkpIHtcbiAgICAgICAgICAgICAgICBpbmRleCA9IGZvcm1hdDtcbiAgICAgICAgICAgICAgICBmb3JtYXQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvcm1hdCA9IGZvcm1hdCB8fCAnJztcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBsb2NhbGUgPSBnZXRMb2NhbGUoKSxcbiAgICAgICAgICAgIHNoaWZ0ID0gbG9jYWxlU29ydGVkID8gbG9jYWxlLl93ZWVrLmRvdyA6IDA7XG5cbiAgICAgICAgaWYgKGluZGV4ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBnZXQkMShmb3JtYXQsIChpbmRleCArIHNoaWZ0KSAlIDcsIGZpZWxkLCAnZGF5Jyk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaTtcbiAgICAgICAgdmFyIG91dCA9IFtdO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7XG4gICAgICAgICAgICBvdXRbaV0gPSBnZXQkMShmb3JtYXQsIChpICsgc2hpZnQpICUgNywgZmllbGQsICdkYXknKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpc3RNb250aHMgKGZvcm1hdCwgaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGxpc3RNb250aHNJbXBsKGZvcm1hdCwgaW5kZXgsICdtb250aHMnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaXN0TW9udGhzU2hvcnQgKGZvcm1hdCwgaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGxpc3RNb250aHNJbXBsKGZvcm1hdCwgaW5kZXgsICdtb250aHNTaG9ydCcpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpc3RXZWVrZGF5cyAobG9jYWxlU29ydGVkLCBmb3JtYXQsIGluZGV4KSB7XG4gICAgICAgIHJldHVybiBsaXN0V2Vla2RheXNJbXBsKGxvY2FsZVNvcnRlZCwgZm9ybWF0LCBpbmRleCwgJ3dlZWtkYXlzJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGlzdFdlZWtkYXlzU2hvcnQgKGxvY2FsZVNvcnRlZCwgZm9ybWF0LCBpbmRleCkge1xuICAgICAgICByZXR1cm4gbGlzdFdlZWtkYXlzSW1wbChsb2NhbGVTb3J0ZWQsIGZvcm1hdCwgaW5kZXgsICd3ZWVrZGF5c1Nob3J0Jyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGlzdFdlZWtkYXlzTWluIChsb2NhbGVTb3J0ZWQsIGZvcm1hdCwgaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGxpc3RXZWVrZGF5c0ltcGwobG9jYWxlU29ydGVkLCBmb3JtYXQsIGluZGV4LCAnd2Vla2RheXNNaW4nKTtcbiAgICB9XG5cbiAgICBnZXRTZXRHbG9iYWxMb2NhbGUoJ2VuJywge1xuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0odGh8c3R8bmR8cmQpLyxcbiAgICAgICAgb3JkaW5hbCA6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHZhciBiID0gbnVtYmVyICUgMTAsXG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gKHRvSW50KG51bWJlciAlIDEwMCAvIDEwKSA9PT0gMSkgPyAndGgnIDpcbiAgICAgICAgICAgICAgICAoYiA9PT0gMSkgPyAnc3QnIDpcbiAgICAgICAgICAgICAgICAoYiA9PT0gMikgPyAnbmQnIDpcbiAgICAgICAgICAgICAgICAoYiA9PT0gMykgPyAncmQnIDogJ3RoJztcbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyBvdXRwdXQ7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFNpZGUgZWZmZWN0IGltcG9ydHNcblxuICAgIGhvb2tzLmxhbmcgPSBkZXByZWNhdGUoJ21vbWVudC5sYW5nIGlzIGRlcHJlY2F0ZWQuIFVzZSBtb21lbnQubG9jYWxlIGluc3RlYWQuJywgZ2V0U2V0R2xvYmFsTG9jYWxlKTtcbiAgICBob29rcy5sYW5nRGF0YSA9IGRlcHJlY2F0ZSgnbW9tZW50LmxhbmdEYXRhIGlzIGRlcHJlY2F0ZWQuIFVzZSBtb21lbnQubG9jYWxlRGF0YSBpbnN0ZWFkLicsIGdldExvY2FsZSk7XG5cbiAgICB2YXIgbWF0aEFicyA9IE1hdGguYWJzO1xuXG4gICAgZnVuY3Rpb24gYWJzICgpIHtcbiAgICAgICAgdmFyIGRhdGEgICAgICAgICAgID0gdGhpcy5fZGF0YTtcblxuICAgICAgICB0aGlzLl9taWxsaXNlY29uZHMgPSBtYXRoQWJzKHRoaXMuX21pbGxpc2Vjb25kcyk7XG4gICAgICAgIHRoaXMuX2RheXMgICAgICAgICA9IG1hdGhBYnModGhpcy5fZGF5cyk7XG4gICAgICAgIHRoaXMuX21vbnRocyAgICAgICA9IG1hdGhBYnModGhpcy5fbW9udGhzKTtcblxuICAgICAgICBkYXRhLm1pbGxpc2Vjb25kcyAgPSBtYXRoQWJzKGRhdGEubWlsbGlzZWNvbmRzKTtcbiAgICAgICAgZGF0YS5zZWNvbmRzICAgICAgID0gbWF0aEFicyhkYXRhLnNlY29uZHMpO1xuICAgICAgICBkYXRhLm1pbnV0ZXMgICAgICAgPSBtYXRoQWJzKGRhdGEubWludXRlcyk7XG4gICAgICAgIGRhdGEuaG91cnMgICAgICAgICA9IG1hdGhBYnMoZGF0YS5ob3Vycyk7XG4gICAgICAgIGRhdGEubW9udGhzICAgICAgICA9IG1hdGhBYnMoZGF0YS5tb250aHMpO1xuICAgICAgICBkYXRhLnllYXJzICAgICAgICAgPSBtYXRoQWJzKGRhdGEueWVhcnMpO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFkZFN1YnRyYWN0JDEgKGR1cmF0aW9uLCBpbnB1dCwgdmFsdWUsIGRpcmVjdGlvbikge1xuICAgICAgICB2YXIgb3RoZXIgPSBjcmVhdGVEdXJhdGlvbihpbnB1dCwgdmFsdWUpO1xuXG4gICAgICAgIGR1cmF0aW9uLl9taWxsaXNlY29uZHMgKz0gZGlyZWN0aW9uICogb3RoZXIuX21pbGxpc2Vjb25kcztcbiAgICAgICAgZHVyYXRpb24uX2RheXMgICAgICAgICArPSBkaXJlY3Rpb24gKiBvdGhlci5fZGF5cztcbiAgICAgICAgZHVyYXRpb24uX21vbnRocyAgICAgICArPSBkaXJlY3Rpb24gKiBvdGhlci5fbW9udGhzO1xuXG4gICAgICAgIHJldHVybiBkdXJhdGlvbi5fYnViYmxlKCk7XG4gICAgfVxuXG4gICAgLy8gc3VwcG9ydHMgb25seSAyLjAtc3R5bGUgYWRkKDEsICdzJykgb3IgYWRkKGR1cmF0aW9uKVxuICAgIGZ1bmN0aW9uIGFkZCQxIChpbnB1dCwgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGFkZFN1YnRyYWN0JDEodGhpcywgaW5wdXQsIHZhbHVlLCAxKTtcbiAgICB9XG5cbiAgICAvLyBzdXBwb3J0cyBvbmx5IDIuMC1zdHlsZSBzdWJ0cmFjdCgxLCAncycpIG9yIHN1YnRyYWN0KGR1cmF0aW9uKVxuICAgIGZ1bmN0aW9uIHN1YnRyYWN0JDEgKGlucHV0LCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gYWRkU3VidHJhY3QkMSh0aGlzLCBpbnB1dCwgdmFsdWUsIC0xKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhYnNDZWlsIChudW1iZXIpIHtcbiAgICAgICAgaWYgKG51bWJlciA8IDApIHtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLmZsb29yKG51bWJlcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5jZWlsKG51bWJlcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBidWJibGUgKCkge1xuICAgICAgICB2YXIgbWlsbGlzZWNvbmRzID0gdGhpcy5fbWlsbGlzZWNvbmRzO1xuICAgICAgICB2YXIgZGF5cyAgICAgICAgID0gdGhpcy5fZGF5cztcbiAgICAgICAgdmFyIG1vbnRocyAgICAgICA9IHRoaXMuX21vbnRocztcbiAgICAgICAgdmFyIGRhdGEgICAgICAgICA9IHRoaXMuX2RhdGE7XG4gICAgICAgIHZhciBzZWNvbmRzLCBtaW51dGVzLCBob3VycywgeWVhcnMsIG1vbnRoc0Zyb21EYXlzO1xuXG4gICAgICAgIC8vIGlmIHdlIGhhdmUgYSBtaXggb2YgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIHZhbHVlcywgYnViYmxlIGRvd24gZmlyc3RcbiAgICAgICAgLy8gY2hlY2s6IGh0dHBzOi8vZ2l0aHViLmNvbS9tb21lbnQvbW9tZW50L2lzc3Vlcy8yMTY2XG4gICAgICAgIGlmICghKChtaWxsaXNlY29uZHMgPj0gMCAmJiBkYXlzID49IDAgJiYgbW9udGhzID49IDApIHx8XG4gICAgICAgICAgICAgICAgKG1pbGxpc2Vjb25kcyA8PSAwICYmIGRheXMgPD0gMCAmJiBtb250aHMgPD0gMCkpKSB7XG4gICAgICAgICAgICBtaWxsaXNlY29uZHMgKz0gYWJzQ2VpbChtb250aHNUb0RheXMobW9udGhzKSArIGRheXMpICogODY0ZTU7XG4gICAgICAgICAgICBkYXlzID0gMDtcbiAgICAgICAgICAgIG1vbnRocyA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGNvZGUgYnViYmxlcyB1cCB2YWx1ZXMsIHNlZSB0aGUgdGVzdHMgZm9yXG4gICAgICAgIC8vIGV4YW1wbGVzIG9mIHdoYXQgdGhhdCBtZWFucy5cbiAgICAgICAgZGF0YS5taWxsaXNlY29uZHMgPSBtaWxsaXNlY29uZHMgJSAxMDAwO1xuXG4gICAgICAgIHNlY29uZHMgICAgICAgICAgID0gYWJzRmxvb3IobWlsbGlzZWNvbmRzIC8gMTAwMCk7XG4gICAgICAgIGRhdGEuc2Vjb25kcyAgICAgID0gc2Vjb25kcyAlIDYwO1xuXG4gICAgICAgIG1pbnV0ZXMgICAgICAgICAgID0gYWJzRmxvb3Ioc2Vjb25kcyAvIDYwKTtcbiAgICAgICAgZGF0YS5taW51dGVzICAgICAgPSBtaW51dGVzICUgNjA7XG5cbiAgICAgICAgaG91cnMgICAgICAgICAgICAgPSBhYnNGbG9vcihtaW51dGVzIC8gNjApO1xuICAgICAgICBkYXRhLmhvdXJzICAgICAgICA9IGhvdXJzICUgMjQ7XG5cbiAgICAgICAgZGF5cyArPSBhYnNGbG9vcihob3VycyAvIDI0KTtcblxuICAgICAgICAvLyBjb252ZXJ0IGRheXMgdG8gbW9udGhzXG4gICAgICAgIG1vbnRoc0Zyb21EYXlzID0gYWJzRmxvb3IoZGF5c1RvTW9udGhzKGRheXMpKTtcbiAgICAgICAgbW9udGhzICs9IG1vbnRoc0Zyb21EYXlzO1xuICAgICAgICBkYXlzIC09IGFic0NlaWwobW9udGhzVG9EYXlzKG1vbnRoc0Zyb21EYXlzKSk7XG5cbiAgICAgICAgLy8gMTIgbW9udGhzIC0+IDEgeWVhclxuICAgICAgICB5ZWFycyA9IGFic0Zsb29yKG1vbnRocyAvIDEyKTtcbiAgICAgICAgbW9udGhzICU9IDEyO1xuXG4gICAgICAgIGRhdGEuZGF5cyAgID0gZGF5cztcbiAgICAgICAgZGF0YS5tb250aHMgPSBtb250aHM7XG4gICAgICAgIGRhdGEueWVhcnMgID0geWVhcnM7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGF5c1RvTW9udGhzIChkYXlzKSB7XG4gICAgICAgIC8vIDQwMCB5ZWFycyBoYXZlIDE0NjA5NyBkYXlzICh0YWtpbmcgaW50byBhY2NvdW50IGxlYXAgeWVhciBydWxlcylcbiAgICAgICAgLy8gNDAwIHllYXJzIGhhdmUgMTIgbW9udGhzID09PSA0ODAwXG4gICAgICAgIHJldHVybiBkYXlzICogNDgwMCAvIDE0NjA5NztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtb250aHNUb0RheXMgKG1vbnRocykge1xuICAgICAgICAvLyB0aGUgcmV2ZXJzZSBvZiBkYXlzVG9Nb250aHNcbiAgICAgICAgcmV0dXJuIG1vbnRocyAqIDE0NjA5NyAvIDQ4MDA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYXMgKHVuaXRzKSB7XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBOYU47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGRheXM7XG4gICAgICAgIHZhciBtb250aHM7XG4gICAgICAgIHZhciBtaWxsaXNlY29uZHMgPSB0aGlzLl9taWxsaXNlY29uZHM7XG5cbiAgICAgICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cyk7XG5cbiAgICAgICAgaWYgKHVuaXRzID09PSAnbW9udGgnIHx8IHVuaXRzID09PSAneWVhcicpIHtcbiAgICAgICAgICAgIGRheXMgICA9IHRoaXMuX2RheXMgICArIG1pbGxpc2Vjb25kcyAvIDg2NGU1O1xuICAgICAgICAgICAgbW9udGhzID0gdGhpcy5fbW9udGhzICsgZGF5c1RvTW9udGhzKGRheXMpO1xuICAgICAgICAgICAgcmV0dXJuIHVuaXRzID09PSAnbW9udGgnID8gbW9udGhzIDogbW9udGhzIC8gMTI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBoYW5kbGUgbWlsbGlzZWNvbmRzIHNlcGFyYXRlbHkgYmVjYXVzZSBvZiBmbG9hdGluZyBwb2ludCBtYXRoIGVycm9ycyAoaXNzdWUgIzE4NjcpXG4gICAgICAgICAgICBkYXlzID0gdGhpcy5fZGF5cyArIE1hdGgucm91bmQobW9udGhzVG9EYXlzKHRoaXMuX21vbnRocykpO1xuICAgICAgICAgICAgc3dpdGNoICh1bml0cykge1xuICAgICAgICAgICAgICAgIGNhc2UgJ3dlZWsnICAgOiByZXR1cm4gZGF5cyAvIDcgICAgICsgbWlsbGlzZWNvbmRzIC8gNjA0OGU1O1xuICAgICAgICAgICAgICAgIGNhc2UgJ2RheScgICAgOiByZXR1cm4gZGF5cyAgICAgICAgICsgbWlsbGlzZWNvbmRzIC8gODY0ZTU7XG4gICAgICAgICAgICAgICAgY2FzZSAnaG91cicgICA6IHJldHVybiBkYXlzICogMjQgICAgKyBtaWxsaXNlY29uZHMgLyAzNmU1O1xuICAgICAgICAgICAgICAgIGNhc2UgJ21pbnV0ZScgOiByZXR1cm4gZGF5cyAqIDE0NDAgICsgbWlsbGlzZWNvbmRzIC8gNmU0O1xuICAgICAgICAgICAgICAgIGNhc2UgJ3NlY29uZCcgOiByZXR1cm4gZGF5cyAqIDg2NDAwICsgbWlsbGlzZWNvbmRzIC8gMTAwMDtcbiAgICAgICAgICAgICAgICAvLyBNYXRoLmZsb29yIHByZXZlbnRzIGZsb2F0aW5nIHBvaW50IG1hdGggZXJyb3JzIGhlcmVcbiAgICAgICAgICAgICAgICBjYXNlICdtaWxsaXNlY29uZCc6IHJldHVybiBNYXRoLmZsb29yKGRheXMgKiA4NjRlNSkgKyBtaWxsaXNlY29uZHM7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIHVuaXQgJyArIHVuaXRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRPRE86IFVzZSB0aGlzLmFzKCdtcycpP1xuICAgIGZ1bmN0aW9uIHZhbHVlT2YkMSAoKSB7XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBOYU47XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHRoaXMuX21pbGxpc2Vjb25kcyArXG4gICAgICAgICAgICB0aGlzLl9kYXlzICogODY0ZTUgK1xuICAgICAgICAgICAgKHRoaXMuX21vbnRocyAlIDEyKSAqIDI1OTJlNiArXG4gICAgICAgICAgICB0b0ludCh0aGlzLl9tb250aHMgLyAxMikgKiAzMTUzNmU2XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWFrZUFzIChhbGlhcykge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXMoYWxpYXMpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHZhciBhc01pbGxpc2Vjb25kcyA9IG1ha2VBcygnbXMnKTtcbiAgICB2YXIgYXNTZWNvbmRzICAgICAgPSBtYWtlQXMoJ3MnKTtcbiAgICB2YXIgYXNNaW51dGVzICAgICAgPSBtYWtlQXMoJ20nKTtcbiAgICB2YXIgYXNIb3VycyAgICAgICAgPSBtYWtlQXMoJ2gnKTtcbiAgICB2YXIgYXNEYXlzICAgICAgICAgPSBtYWtlQXMoJ2QnKTtcbiAgICB2YXIgYXNXZWVrcyAgICAgICAgPSBtYWtlQXMoJ3cnKTtcbiAgICB2YXIgYXNNb250aHMgICAgICAgPSBtYWtlQXMoJ00nKTtcbiAgICB2YXIgYXNZZWFycyAgICAgICAgPSBtYWtlQXMoJ3knKTtcblxuICAgIGZ1bmN0aW9uIGNsb25lJDEgKCkge1xuICAgICAgICByZXR1cm4gY3JlYXRlRHVyYXRpb24odGhpcyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0JDIgKHVuaXRzKSB7XG4gICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHModW5pdHMpO1xuICAgICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkKCkgPyB0aGlzW3VuaXRzICsgJ3MnXSgpIDogTmFOO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1ha2VHZXR0ZXIobmFtZSkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCgpID8gdGhpcy5fZGF0YVtuYW1lXSA6IE5hTjtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgbWlsbGlzZWNvbmRzID0gbWFrZUdldHRlcignbWlsbGlzZWNvbmRzJyk7XG4gICAgdmFyIHNlY29uZHMgICAgICA9IG1ha2VHZXR0ZXIoJ3NlY29uZHMnKTtcbiAgICB2YXIgbWludXRlcyAgICAgID0gbWFrZUdldHRlcignbWludXRlcycpO1xuICAgIHZhciBob3VycyAgICAgICAgPSBtYWtlR2V0dGVyKCdob3VycycpO1xuICAgIHZhciBkYXlzICAgICAgICAgPSBtYWtlR2V0dGVyKCdkYXlzJyk7XG4gICAgdmFyIG1vbnRocyAgICAgICA9IG1ha2VHZXR0ZXIoJ21vbnRocycpO1xuICAgIHZhciB5ZWFycyAgICAgICAgPSBtYWtlR2V0dGVyKCd5ZWFycycpO1xuXG4gICAgZnVuY3Rpb24gd2Vla3MgKCkge1xuICAgICAgICByZXR1cm4gYWJzRmxvb3IodGhpcy5kYXlzKCkgLyA3KTtcbiAgICB9XG5cbiAgICB2YXIgcm91bmQgPSBNYXRoLnJvdW5kO1xuICAgIHZhciB0aHJlc2hvbGRzID0ge1xuICAgICAgICBzczogNDQsICAgICAgICAgLy8gYSBmZXcgc2Vjb25kcyB0byBzZWNvbmRzXG4gICAgICAgIHMgOiA0NSwgICAgICAgICAvLyBzZWNvbmRzIHRvIG1pbnV0ZVxuICAgICAgICBtIDogNDUsICAgICAgICAgLy8gbWludXRlcyB0byBob3VyXG4gICAgICAgIGggOiAyMiwgICAgICAgICAvLyBob3VycyB0byBkYXlcbiAgICAgICAgZCA6IDI2LCAgICAgICAgIC8vIGRheXMgdG8gbW9udGhcbiAgICAgICAgTSA6IDExICAgICAgICAgIC8vIG1vbnRocyB0byB5ZWFyXG4gICAgfTtcblxuICAgIC8vIGhlbHBlciBmdW5jdGlvbiBmb3IgbW9tZW50LmZuLmZyb20sIG1vbWVudC5mbi5mcm9tTm93LCBhbmQgbW9tZW50LmR1cmF0aW9uLmZuLmh1bWFuaXplXG4gICAgZnVuY3Rpb24gc3Vic3RpdHV0ZVRpbWVBZ28oc3RyaW5nLCBudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGlzRnV0dXJlLCBsb2NhbGUpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsZS5yZWxhdGl2ZVRpbWUobnVtYmVyIHx8IDEsICEhd2l0aG91dFN1ZmZpeCwgc3RyaW5nLCBpc0Z1dHVyZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVsYXRpdmVUaW1lJDEgKHBvc05lZ0R1cmF0aW9uLCB3aXRob3V0U3VmZml4LCBsb2NhbGUpIHtcbiAgICAgICAgdmFyIGR1cmF0aW9uID0gY3JlYXRlRHVyYXRpb24ocG9zTmVnRHVyYXRpb24pLmFicygpO1xuICAgICAgICB2YXIgc2Vjb25kcyAgPSByb3VuZChkdXJhdGlvbi5hcygncycpKTtcbiAgICAgICAgdmFyIG1pbnV0ZXMgID0gcm91bmQoZHVyYXRpb24uYXMoJ20nKSk7XG4gICAgICAgIHZhciBob3VycyAgICA9IHJvdW5kKGR1cmF0aW9uLmFzKCdoJykpO1xuICAgICAgICB2YXIgZGF5cyAgICAgPSByb3VuZChkdXJhdGlvbi5hcygnZCcpKTtcbiAgICAgICAgdmFyIG1vbnRocyAgID0gcm91bmQoZHVyYXRpb24uYXMoJ00nKSk7XG4gICAgICAgIHZhciB5ZWFycyAgICA9IHJvdW5kKGR1cmF0aW9uLmFzKCd5JykpO1xuXG4gICAgICAgIHZhciBhID0gc2Vjb25kcyA8PSB0aHJlc2hvbGRzLnNzICYmIFsncycsIHNlY29uZHNdICB8fFxuICAgICAgICAgICAgICAgIHNlY29uZHMgPCB0aHJlc2hvbGRzLnMgICAmJiBbJ3NzJywgc2Vjb25kc10gfHxcbiAgICAgICAgICAgICAgICBtaW51dGVzIDw9IDEgICAgICAgICAgICAgJiYgWydtJ10gICAgICAgICAgIHx8XG4gICAgICAgICAgICAgICAgbWludXRlcyA8IHRocmVzaG9sZHMubSAgICYmIFsnbW0nLCBtaW51dGVzXSB8fFxuICAgICAgICAgICAgICAgIGhvdXJzICAgPD0gMSAgICAgICAgICAgICAmJiBbJ2gnXSAgICAgICAgICAgfHxcbiAgICAgICAgICAgICAgICBob3VycyAgIDwgdGhyZXNob2xkcy5oICAgJiYgWydoaCcsIGhvdXJzXSAgIHx8XG4gICAgICAgICAgICAgICAgZGF5cyAgICA8PSAxICAgICAgICAgICAgICYmIFsnZCddICAgICAgICAgICB8fFxuICAgICAgICAgICAgICAgIGRheXMgICAgPCB0aHJlc2hvbGRzLmQgICAmJiBbJ2RkJywgZGF5c10gICAgfHxcbiAgICAgICAgICAgICAgICBtb250aHMgIDw9IDEgICAgICAgICAgICAgJiYgWydNJ10gICAgICAgICAgIHx8XG4gICAgICAgICAgICAgICAgbW9udGhzICA8IHRocmVzaG9sZHMuTSAgICYmIFsnTU0nLCBtb250aHNdICB8fFxuICAgICAgICAgICAgICAgIHllYXJzICAgPD0gMSAgICAgICAgICAgICAmJiBbJ3knXSAgICAgICAgICAgfHwgWyd5eScsIHllYXJzXTtcblxuICAgICAgICBhWzJdID0gd2l0aG91dFN1ZmZpeDtcbiAgICAgICAgYVszXSA9ICtwb3NOZWdEdXJhdGlvbiA+IDA7XG4gICAgICAgIGFbNF0gPSBsb2NhbGU7XG4gICAgICAgIHJldHVybiBzdWJzdGl0dXRlVGltZUFnby5hcHBseShudWxsLCBhKTtcbiAgICB9XG5cbiAgICAvLyBUaGlzIGZ1bmN0aW9uIGFsbG93cyB5b3UgdG8gc2V0IHRoZSByb3VuZGluZyBmdW5jdGlvbiBmb3IgcmVsYXRpdmUgdGltZSBzdHJpbmdzXG4gICAgZnVuY3Rpb24gZ2V0U2V0UmVsYXRpdmVUaW1lUm91bmRpbmcgKHJvdW5kaW5nRnVuY3Rpb24pIHtcbiAgICAgICAgaWYgKHJvdW5kaW5nRnVuY3Rpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHJvdW5kO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Yocm91bmRpbmdGdW5jdGlvbikgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJvdW5kID0gcm91bmRpbmdGdW5jdGlvbjtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBUaGlzIGZ1bmN0aW9uIGFsbG93cyB5b3UgdG8gc2V0IGEgdGhyZXNob2xkIGZvciByZWxhdGl2ZSB0aW1lIHN0cmluZ3NcbiAgICBmdW5jdGlvbiBnZXRTZXRSZWxhdGl2ZVRpbWVUaHJlc2hvbGQgKHRocmVzaG9sZCwgbGltaXQpIHtcbiAgICAgICAgaWYgKHRocmVzaG9sZHNbdGhyZXNob2xkXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxpbWl0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aHJlc2hvbGRzW3RocmVzaG9sZF07XG4gICAgICAgIH1cbiAgICAgICAgdGhyZXNob2xkc1t0aHJlc2hvbGRdID0gbGltaXQ7XG4gICAgICAgIGlmICh0aHJlc2hvbGQgPT09ICdzJykge1xuICAgICAgICAgICAgdGhyZXNob2xkcy5zcyA9IGxpbWl0IC0gMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBodW1hbml6ZSAod2l0aFN1ZmZpeCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkuaW52YWxpZERhdGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBsb2NhbGUgPSB0aGlzLmxvY2FsZURhdGEoKTtcbiAgICAgICAgdmFyIG91dHB1dCA9IHJlbGF0aXZlVGltZSQxKHRoaXMsICF3aXRoU3VmZml4LCBsb2NhbGUpO1xuXG4gICAgICAgIGlmICh3aXRoU3VmZml4KSB7XG4gICAgICAgICAgICBvdXRwdXQgPSBsb2NhbGUucGFzdEZ1dHVyZSgrdGhpcywgb3V0cHV0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBsb2NhbGUucG9zdGZvcm1hdChvdXRwdXQpO1xuICAgIH1cblxuICAgIHZhciBhYnMkMSA9IE1hdGguYWJzO1xuXG4gICAgZnVuY3Rpb24gc2lnbih4KSB7XG4gICAgICAgIHJldHVybiAoKHggPiAwKSAtICh4IDwgMCkpIHx8ICt4O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvSVNPU3RyaW5nJDEoKSB7XG4gICAgICAgIC8vIGZvciBJU08gc3RyaW5ncyB3ZSBkbyBub3QgdXNlIHRoZSBub3JtYWwgYnViYmxpbmcgcnVsZXM6XG4gICAgICAgIC8vICAqIG1pbGxpc2Vjb25kcyBidWJibGUgdXAgdW50aWwgdGhleSBiZWNvbWUgaG91cnNcbiAgICAgICAgLy8gICogZGF5cyBkbyBub3QgYnViYmxlIGF0IGFsbFxuICAgICAgICAvLyAgKiBtb250aHMgYnViYmxlIHVwIHVudGlsIHRoZXkgYmVjb21lIHllYXJzXG4gICAgICAgIC8vIFRoaXMgaXMgYmVjYXVzZSB0aGVyZSBpcyBubyBjb250ZXh0LWZyZWUgY29udmVyc2lvbiBiZXR3ZWVuIGhvdXJzIGFuZCBkYXlzXG4gICAgICAgIC8vICh0aGluayBvZiBjbG9jayBjaGFuZ2VzKVxuICAgICAgICAvLyBhbmQgYWxzbyBub3QgYmV0d2VlbiBkYXlzIGFuZCBtb250aHMgKDI4LTMxIGRheXMgcGVyIG1vbnRoKVxuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkuaW52YWxpZERhdGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBzZWNvbmRzID0gYWJzJDEodGhpcy5fbWlsbGlzZWNvbmRzKSAvIDEwMDA7XG4gICAgICAgIHZhciBkYXlzICAgICAgICAgPSBhYnMkMSh0aGlzLl9kYXlzKTtcbiAgICAgICAgdmFyIG1vbnRocyAgICAgICA9IGFicyQxKHRoaXMuX21vbnRocyk7XG4gICAgICAgIHZhciBtaW51dGVzLCBob3VycywgeWVhcnM7XG5cbiAgICAgICAgLy8gMzYwMCBzZWNvbmRzIC0+IDYwIG1pbnV0ZXMgLT4gMSBob3VyXG4gICAgICAgIG1pbnV0ZXMgICAgICAgICAgID0gYWJzRmxvb3Ioc2Vjb25kcyAvIDYwKTtcbiAgICAgICAgaG91cnMgICAgICAgICAgICAgPSBhYnNGbG9vcihtaW51dGVzIC8gNjApO1xuICAgICAgICBzZWNvbmRzICU9IDYwO1xuICAgICAgICBtaW51dGVzICU9IDYwO1xuXG4gICAgICAgIC8vIDEyIG1vbnRocyAtPiAxIHllYXJcbiAgICAgICAgeWVhcnMgID0gYWJzRmxvb3IobW9udGhzIC8gMTIpO1xuICAgICAgICBtb250aHMgJT0gMTI7XG5cblxuICAgICAgICAvLyBpbnNwaXJlZCBieSBodHRwczovL2dpdGh1Yi5jb20vZG9yZGlsbGUvbW9tZW50LWlzb2R1cmF0aW9uL2Jsb2IvbWFzdGVyL21vbWVudC5pc29kdXJhdGlvbi5qc1xuICAgICAgICB2YXIgWSA9IHllYXJzO1xuICAgICAgICB2YXIgTSA9IG1vbnRocztcbiAgICAgICAgdmFyIEQgPSBkYXlzO1xuICAgICAgICB2YXIgaCA9IGhvdXJzO1xuICAgICAgICB2YXIgbSA9IG1pbnV0ZXM7XG4gICAgICAgIHZhciBzID0gc2Vjb25kcyA/IHNlY29uZHMudG9GaXhlZCgzKS5yZXBsYWNlKC9cXC4/MCskLywgJycpIDogJyc7XG4gICAgICAgIHZhciB0b3RhbCA9IHRoaXMuYXNTZWNvbmRzKCk7XG5cbiAgICAgICAgaWYgKCF0b3RhbCkge1xuICAgICAgICAgICAgLy8gdGhpcyBpcyB0aGUgc2FtZSBhcyBDIydzIChOb2RhKSBhbmQgcHl0aG9uIChpc29kYXRlKS4uLlxuICAgICAgICAgICAgLy8gYnV0IG5vdCBvdGhlciBKUyAoZ29vZy5kYXRlKVxuICAgICAgICAgICAgcmV0dXJuICdQMEQnO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHRvdGFsU2lnbiA9IHRvdGFsIDwgMCA/ICctJyA6ICcnO1xuICAgICAgICB2YXIgeW1TaWduID0gc2lnbih0aGlzLl9tb250aHMpICE9PSBzaWduKHRvdGFsKSA/ICctJyA6ICcnO1xuICAgICAgICB2YXIgZGF5c1NpZ24gPSBzaWduKHRoaXMuX2RheXMpICE9PSBzaWduKHRvdGFsKSA/ICctJyA6ICcnO1xuICAgICAgICB2YXIgaG1zU2lnbiA9IHNpZ24odGhpcy5fbWlsbGlzZWNvbmRzKSAhPT0gc2lnbih0b3RhbCkgPyAnLScgOiAnJztcblxuICAgICAgICByZXR1cm4gdG90YWxTaWduICsgJ1AnICtcbiAgICAgICAgICAgIChZID8geW1TaWduICsgWSArICdZJyA6ICcnKSArXG4gICAgICAgICAgICAoTSA/IHltU2lnbiArIE0gKyAnTScgOiAnJykgK1xuICAgICAgICAgICAgKEQgPyBkYXlzU2lnbiArIEQgKyAnRCcgOiAnJykgK1xuICAgICAgICAgICAgKChoIHx8IG0gfHwgcykgPyAnVCcgOiAnJykgK1xuICAgICAgICAgICAgKGggPyBobXNTaWduICsgaCArICdIJyA6ICcnKSArXG4gICAgICAgICAgICAobSA/IGhtc1NpZ24gKyBtICsgJ00nIDogJycpICtcbiAgICAgICAgICAgIChzID8gaG1zU2lnbiArIHMgKyAnUycgOiAnJyk7XG4gICAgfVxuXG4gICAgdmFyIHByb3RvJDIgPSBEdXJhdGlvbi5wcm90b3R5cGU7XG5cbiAgICBwcm90byQyLmlzVmFsaWQgICAgICAgID0gaXNWYWxpZCQxO1xuICAgIHByb3RvJDIuYWJzICAgICAgICAgICAgPSBhYnM7XG4gICAgcHJvdG8kMi5hZGQgICAgICAgICAgICA9IGFkZCQxO1xuICAgIHByb3RvJDIuc3VidHJhY3QgICAgICAgPSBzdWJ0cmFjdCQxO1xuICAgIHByb3RvJDIuYXMgICAgICAgICAgICAgPSBhcztcbiAgICBwcm90byQyLmFzTWlsbGlzZWNvbmRzID0gYXNNaWxsaXNlY29uZHM7XG4gICAgcHJvdG8kMi5hc1NlY29uZHMgICAgICA9IGFzU2Vjb25kcztcbiAgICBwcm90byQyLmFzTWludXRlcyAgICAgID0gYXNNaW51dGVzO1xuICAgIHByb3RvJDIuYXNIb3VycyAgICAgICAgPSBhc0hvdXJzO1xuICAgIHByb3RvJDIuYXNEYXlzICAgICAgICAgPSBhc0RheXM7XG4gICAgcHJvdG8kMi5hc1dlZWtzICAgICAgICA9IGFzV2Vla3M7XG4gICAgcHJvdG8kMi5hc01vbnRocyAgICAgICA9IGFzTW9udGhzO1xuICAgIHByb3RvJDIuYXNZZWFycyAgICAgICAgPSBhc1llYXJzO1xuICAgIHByb3RvJDIudmFsdWVPZiAgICAgICAgPSB2YWx1ZU9mJDE7XG4gICAgcHJvdG8kMi5fYnViYmxlICAgICAgICA9IGJ1YmJsZTtcbiAgICBwcm90byQyLmNsb25lICAgICAgICAgID0gY2xvbmUkMTtcbiAgICBwcm90byQyLmdldCAgICAgICAgICAgID0gZ2V0JDI7XG4gICAgcHJvdG8kMi5taWxsaXNlY29uZHMgICA9IG1pbGxpc2Vjb25kcztcbiAgICBwcm90byQyLnNlY29uZHMgICAgICAgID0gc2Vjb25kcztcbiAgICBwcm90byQyLm1pbnV0ZXMgICAgICAgID0gbWludXRlcztcbiAgICBwcm90byQyLmhvdXJzICAgICAgICAgID0gaG91cnM7XG4gICAgcHJvdG8kMi5kYXlzICAgICAgICAgICA9IGRheXM7XG4gICAgcHJvdG8kMi53ZWVrcyAgICAgICAgICA9IHdlZWtzO1xuICAgIHByb3RvJDIubW9udGhzICAgICAgICAgPSBtb250aHM7XG4gICAgcHJvdG8kMi55ZWFycyAgICAgICAgICA9IHllYXJzO1xuICAgIHByb3RvJDIuaHVtYW5pemUgICAgICAgPSBodW1hbml6ZTtcbiAgICBwcm90byQyLnRvSVNPU3RyaW5nICAgID0gdG9JU09TdHJpbmckMTtcbiAgICBwcm90byQyLnRvU3RyaW5nICAgICAgID0gdG9JU09TdHJpbmckMTtcbiAgICBwcm90byQyLnRvSlNPTiAgICAgICAgID0gdG9JU09TdHJpbmckMTtcbiAgICBwcm90byQyLmxvY2FsZSAgICAgICAgID0gbG9jYWxlO1xuICAgIHByb3RvJDIubG9jYWxlRGF0YSAgICAgPSBsb2NhbGVEYXRhO1xuXG4gICAgcHJvdG8kMi50b0lzb1N0cmluZyA9IGRlcHJlY2F0ZSgndG9Jc29TdHJpbmcoKSBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIHRvSVNPU3RyaW5nKCkgaW5zdGVhZCAobm90aWNlIHRoZSBjYXBpdGFscyknLCB0b0lTT1N0cmluZyQxKTtcbiAgICBwcm90byQyLmxhbmcgPSBsYW5nO1xuXG4gICAgLy8gU2lkZSBlZmZlY3QgaW1wb3J0c1xuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ1gnLCAwLCAwLCAndW5peCcpO1xuICAgIGFkZEZvcm1hdFRva2VuKCd4JywgMCwgMCwgJ3ZhbHVlT2YnKTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ3gnLCBtYXRjaFNpZ25lZCk7XG4gICAgYWRkUmVnZXhUb2tlbignWCcsIG1hdGNoVGltZXN0YW1wKTtcbiAgICBhZGRQYXJzZVRva2VuKCdYJywgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgICAgIGNvbmZpZy5fZCA9IG5ldyBEYXRlKHBhcnNlRmxvYXQoaW5wdXQsIDEwKSAqIDEwMDApO1xuICAgIH0pO1xuICAgIGFkZFBhcnNlVG9rZW4oJ3gnLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcpIHtcbiAgICAgICAgY29uZmlnLl9kID0gbmV3IERhdGUodG9JbnQoaW5wdXQpKTtcbiAgICB9KTtcblxuICAgIC8vIFNpZGUgZWZmZWN0IGltcG9ydHNcblxuXG4gICAgaG9va3MudmVyc2lvbiA9ICcyLjIyLjInO1xuXG4gICAgc2V0SG9va0NhbGxiYWNrKGNyZWF0ZUxvY2FsKTtcblxuICAgIGhvb2tzLmZuICAgICAgICAgICAgICAgICAgICA9IHByb3RvO1xuICAgIGhvb2tzLm1pbiAgICAgICAgICAgICAgICAgICA9IG1pbjtcbiAgICBob29rcy5tYXggICAgICAgICAgICAgICAgICAgPSBtYXg7XG4gICAgaG9va3Mubm93ICAgICAgICAgICAgICAgICAgID0gbm93O1xuICAgIGhvb2tzLnV0YyAgICAgICAgICAgICAgICAgICA9IGNyZWF0ZVVUQztcbiAgICBob29rcy51bml4ICAgICAgICAgICAgICAgICAgPSBjcmVhdGVVbml4O1xuICAgIGhvb2tzLm1vbnRocyAgICAgICAgICAgICAgICA9IGxpc3RNb250aHM7XG4gICAgaG9va3MuaXNEYXRlICAgICAgICAgICAgICAgID0gaXNEYXRlO1xuICAgIGhvb2tzLmxvY2FsZSAgICAgICAgICAgICAgICA9IGdldFNldEdsb2JhbExvY2FsZTtcbiAgICBob29rcy5pbnZhbGlkICAgICAgICAgICAgICAgPSBjcmVhdGVJbnZhbGlkO1xuICAgIGhvb2tzLmR1cmF0aW9uICAgICAgICAgICAgICA9IGNyZWF0ZUR1cmF0aW9uO1xuICAgIGhvb2tzLmlzTW9tZW50ICAgICAgICAgICAgICA9IGlzTW9tZW50O1xuICAgIGhvb2tzLndlZWtkYXlzICAgICAgICAgICAgICA9IGxpc3RXZWVrZGF5cztcbiAgICBob29rcy5wYXJzZVpvbmUgICAgICAgICAgICAgPSBjcmVhdGVJblpvbmU7XG4gICAgaG9va3MubG9jYWxlRGF0YSAgICAgICAgICAgID0gZ2V0TG9jYWxlO1xuICAgIGhvb2tzLmlzRHVyYXRpb24gICAgICAgICAgICA9IGlzRHVyYXRpb247XG4gICAgaG9va3MubW9udGhzU2hvcnQgICAgICAgICAgID0gbGlzdE1vbnRoc1Nob3J0O1xuICAgIGhvb2tzLndlZWtkYXlzTWluICAgICAgICAgICA9IGxpc3RXZWVrZGF5c01pbjtcbiAgICBob29rcy5kZWZpbmVMb2NhbGUgICAgICAgICAgPSBkZWZpbmVMb2NhbGU7XG4gICAgaG9va3MudXBkYXRlTG9jYWxlICAgICAgICAgID0gdXBkYXRlTG9jYWxlO1xuICAgIGhvb2tzLmxvY2FsZXMgICAgICAgICAgICAgICA9IGxpc3RMb2NhbGVzO1xuICAgIGhvb2tzLndlZWtkYXlzU2hvcnQgICAgICAgICA9IGxpc3RXZWVrZGF5c1Nob3J0O1xuICAgIGhvb2tzLm5vcm1hbGl6ZVVuaXRzICAgICAgICA9IG5vcm1hbGl6ZVVuaXRzO1xuICAgIGhvb2tzLnJlbGF0aXZlVGltZVJvdW5kaW5nICA9IGdldFNldFJlbGF0aXZlVGltZVJvdW5kaW5nO1xuICAgIGhvb2tzLnJlbGF0aXZlVGltZVRocmVzaG9sZCA9IGdldFNldFJlbGF0aXZlVGltZVRocmVzaG9sZDtcbiAgICBob29rcy5jYWxlbmRhckZvcm1hdCAgICAgICAgPSBnZXRDYWxlbmRhckZvcm1hdDtcbiAgICBob29rcy5wcm90b3R5cGUgICAgICAgICAgICAgPSBwcm90bztcblxuICAgIC8vIGN1cnJlbnRseSBIVE1MNSBpbnB1dCB0eXBlIG9ubHkgc3VwcG9ydHMgMjQtaG91ciBmb3JtYXRzXG4gICAgaG9va3MuSFRNTDVfRk1UID0ge1xuICAgICAgICBEQVRFVElNRV9MT0NBTDogJ1lZWVktTU0tRERUSEg6bW0nLCAgICAgICAgICAgICAvLyA8aW5wdXQgdHlwZT1cImRhdGV0aW1lLWxvY2FsXCIgLz5cbiAgICAgICAgREFURVRJTUVfTE9DQUxfU0VDT05EUzogJ1lZWVktTU0tRERUSEg6bW06c3MnLCAgLy8gPGlucHV0IHR5cGU9XCJkYXRldGltZS1sb2NhbFwiIHN0ZXA9XCIxXCIgLz5cbiAgICAgICAgREFURVRJTUVfTE9DQUxfTVM6ICdZWVlZLU1NLUREVEhIOm1tOnNzLlNTUycsICAgLy8gPGlucHV0IHR5cGU9XCJkYXRldGltZS1sb2NhbFwiIHN0ZXA9XCIwLjAwMVwiIC8+XG4gICAgICAgIERBVEU6ICdZWVlZLU1NLUREJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDxpbnB1dCB0eXBlPVwiZGF0ZVwiIC8+XG4gICAgICAgIFRJTUU6ICdISDptbScsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDxpbnB1dCB0eXBlPVwidGltZVwiIC8+XG4gICAgICAgIFRJTUVfU0VDT05EUzogJ0hIOm1tOnNzJywgICAgICAgICAgICAgICAgICAgICAgIC8vIDxpbnB1dCB0eXBlPVwidGltZVwiIHN0ZXA9XCIxXCIgLz5cbiAgICAgICAgVElNRV9NUzogJ0hIOm1tOnNzLlNTUycsICAgICAgICAgICAgICAgICAgICAgICAgLy8gPGlucHV0IHR5cGU9XCJ0aW1lXCIgc3RlcD1cIjAuMDAxXCIgLz5cbiAgICAgICAgV0VFSzogJ1lZWVktW1ddV1cnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gPGlucHV0IHR5cGU9XCJ3ZWVrXCIgLz5cbiAgICAgICAgTU9OVEg6ICdZWVlZLU1NJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gPGlucHV0IHR5cGU9XCJtb250aFwiIC8+XG4gICAgfTtcblxuICAgIHJldHVybiBob29rcztcblxufSkpKTtcbiIsIihmdW5jdGlvbiAoZ2xvYmFsKXtcbi8vICAgICBVbmRlcnNjb3JlLmpzIDEuOS4xXG4vLyAgICAgaHR0cDovL3VuZGVyc2NvcmVqcy5vcmdcbi8vICAgICAoYykgMjAwOS0yMDE4IEplcmVteSBBc2hrZW5hcywgRG9jdW1lbnRDbG91ZCBhbmQgSW52ZXN0aWdhdGl2ZSBSZXBvcnRlcnMgJiBFZGl0b3JzXG4vLyAgICAgVW5kZXJzY29yZSBtYXkgYmUgZnJlZWx5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cblxuKGZ1bmN0aW9uKCkge1xuXG4gIC8vIEJhc2VsaW5lIHNldHVwXG4gIC8vIC0tLS0tLS0tLS0tLS0tXG5cbiAgLy8gRXN0YWJsaXNoIHRoZSByb290IG9iamVjdCwgYHdpbmRvd2AgKGBzZWxmYCkgaW4gdGhlIGJyb3dzZXIsIGBnbG9iYWxgXG4gIC8vIG9uIHRoZSBzZXJ2ZXIsIG9yIGB0aGlzYCBpbiBzb21lIHZpcnR1YWwgbWFjaGluZXMuIFdlIHVzZSBgc2VsZmBcbiAgLy8gaW5zdGVhZCBvZiBgd2luZG93YCBmb3IgYFdlYldvcmtlcmAgc3VwcG9ydC5cbiAgdmFyIHJvb3QgPSB0eXBlb2Ygc2VsZiA9PSAnb2JqZWN0JyAmJiBzZWxmLnNlbGYgPT09IHNlbGYgJiYgc2VsZiB8fFxuICAgICAgICAgICAgdHlwZW9mIGdsb2JhbCA9PSAnb2JqZWN0JyAmJiBnbG9iYWwuZ2xvYmFsID09PSBnbG9iYWwgJiYgZ2xvYmFsIHx8XG4gICAgICAgICAgICB0aGlzIHx8XG4gICAgICAgICAgICB7fTtcblxuICAvLyBTYXZlIHRoZSBwcmV2aW91cyB2YWx1ZSBvZiB0aGUgYF9gIHZhcmlhYmxlLlxuICB2YXIgcHJldmlvdXNVbmRlcnNjb3JlID0gcm9vdC5fO1xuXG4gIC8vIFNhdmUgYnl0ZXMgaW4gdGhlIG1pbmlmaWVkIChidXQgbm90IGd6aXBwZWQpIHZlcnNpb246XG4gIHZhciBBcnJheVByb3RvID0gQXJyYXkucHJvdG90eXBlLCBPYmpQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG4gIHZhciBTeW1ib2xQcm90byA9IHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnID8gU3ltYm9sLnByb3RvdHlwZSA6IG51bGw7XG5cbiAgLy8gQ3JlYXRlIHF1aWNrIHJlZmVyZW5jZSB2YXJpYWJsZXMgZm9yIHNwZWVkIGFjY2VzcyB0byBjb3JlIHByb3RvdHlwZXMuXG4gIHZhciBwdXNoID0gQXJyYXlQcm90by5wdXNoLFxuICAgICAgc2xpY2UgPSBBcnJheVByb3RvLnNsaWNlLFxuICAgICAgdG9TdHJpbmcgPSBPYmpQcm90by50b1N0cmluZyxcbiAgICAgIGhhc093blByb3BlcnR5ID0gT2JqUHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbiAgLy8gQWxsICoqRUNNQVNjcmlwdCA1KiogbmF0aXZlIGZ1bmN0aW9uIGltcGxlbWVudGF0aW9ucyB0aGF0IHdlIGhvcGUgdG8gdXNlXG4gIC8vIGFyZSBkZWNsYXJlZCBoZXJlLlxuICB2YXIgbmF0aXZlSXNBcnJheSA9IEFycmF5LmlzQXJyYXksXG4gICAgICBuYXRpdmVLZXlzID0gT2JqZWN0LmtleXMsXG4gICAgICBuYXRpdmVDcmVhdGUgPSBPYmplY3QuY3JlYXRlO1xuXG4gIC8vIE5ha2VkIGZ1bmN0aW9uIHJlZmVyZW5jZSBmb3Igc3Vycm9nYXRlLXByb3RvdHlwZS1zd2FwcGluZy5cbiAgdmFyIEN0b3IgPSBmdW5jdGlvbigpe307XG5cbiAgLy8gQ3JlYXRlIGEgc2FmZSByZWZlcmVuY2UgdG8gdGhlIFVuZGVyc2NvcmUgb2JqZWN0IGZvciB1c2UgYmVsb3cuXG4gIHZhciBfID0gZnVuY3Rpb24ob2JqKSB7XG4gICAgaWYgKG9iaiBpbnN0YW5jZW9mIF8pIHJldHVybiBvYmo7XG4gICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIF8pKSByZXR1cm4gbmV3IF8ob2JqKTtcbiAgICB0aGlzLl93cmFwcGVkID0gb2JqO1xuICB9O1xuXG4gIC8vIEV4cG9ydCB0aGUgVW5kZXJzY29yZSBvYmplY3QgZm9yICoqTm9kZS5qcyoqLCB3aXRoXG4gIC8vIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5IGZvciB0aGVpciBvbGQgbW9kdWxlIEFQSS4gSWYgd2UncmUgaW5cbiAgLy8gdGhlIGJyb3dzZXIsIGFkZCBgX2AgYXMgYSBnbG9iYWwgb2JqZWN0LlxuICAvLyAoYG5vZGVUeXBlYCBpcyBjaGVja2VkIHRvIGVuc3VyZSB0aGF0IGBtb2R1bGVgXG4gIC8vIGFuZCBgZXhwb3J0c2AgYXJlIG5vdCBIVE1MIGVsZW1lbnRzLilcbiAgaWYgKHR5cGVvZiBleHBvcnRzICE9ICd1bmRlZmluZWQnICYmICFleHBvcnRzLm5vZGVUeXBlKSB7XG4gICAgaWYgKHR5cGVvZiBtb2R1bGUgIT0gJ3VuZGVmaW5lZCcgJiYgIW1vZHVsZS5ub2RlVHlwZSAmJiBtb2R1bGUuZXhwb3J0cykge1xuICAgICAgZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gXztcbiAgICB9XG4gICAgZXhwb3J0cy5fID0gXztcbiAgfSBlbHNlIHtcbiAgICByb290Ll8gPSBfO1xuICB9XG5cbiAgLy8gQ3VycmVudCB2ZXJzaW9uLlxuICBfLlZFUlNJT04gPSAnMS45LjEnO1xuXG4gIC8vIEludGVybmFsIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhbiBlZmZpY2llbnQgKGZvciBjdXJyZW50IGVuZ2luZXMpIHZlcnNpb25cbiAgLy8gb2YgdGhlIHBhc3NlZC1pbiBjYWxsYmFjaywgdG8gYmUgcmVwZWF0ZWRseSBhcHBsaWVkIGluIG90aGVyIFVuZGVyc2NvcmVcbiAgLy8gZnVuY3Rpb25zLlxuICB2YXIgb3B0aW1pemVDYiA9IGZ1bmN0aW9uKGZ1bmMsIGNvbnRleHQsIGFyZ0NvdW50KSB7XG4gICAgaWYgKGNvbnRleHQgPT09IHZvaWQgMCkgcmV0dXJuIGZ1bmM7XG4gICAgc3dpdGNoIChhcmdDb3VudCA9PSBudWxsID8gMyA6IGFyZ0NvdW50KSB7XG4gICAgICBjYXNlIDE6IHJldHVybiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gZnVuYy5jYWxsKGNvbnRleHQsIHZhbHVlKTtcbiAgICAgIH07XG4gICAgICAvLyBUaGUgMi1hcmd1bWVudCBjYXNlIGlzIG9taXR0ZWQgYmVjYXVzZSB3ZeKAmXJlIG5vdCB1c2luZyBpdC5cbiAgICAgIGNhc2UgMzogcmV0dXJuIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikge1xuICAgICAgICByZXR1cm4gZnVuYy5jYWxsKGNvbnRleHQsIHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbik7XG4gICAgICB9O1xuICAgICAgY2FzZSA0OiByZXR1cm4gZnVuY3Rpb24oYWNjdW11bGF0b3IsIHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikge1xuICAgICAgICByZXR1cm4gZnVuYy5jYWxsKGNvbnRleHQsIGFjY3VtdWxhdG9yLCB2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pO1xuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkoY29udGV4dCwgYXJndW1lbnRzKTtcbiAgICB9O1xuICB9O1xuXG4gIHZhciBidWlsdGluSXRlcmF0ZWU7XG5cbiAgLy8gQW4gaW50ZXJuYWwgZnVuY3Rpb24gdG8gZ2VuZXJhdGUgY2FsbGJhY2tzIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gZWFjaFxuICAvLyBlbGVtZW50IGluIGEgY29sbGVjdGlvbiwgcmV0dXJuaW5nIHRoZSBkZXNpcmVkIHJlc3VsdCDigJQgZWl0aGVyIGBpZGVudGl0eWAsXG4gIC8vIGFuIGFyYml0cmFyeSBjYWxsYmFjaywgYSBwcm9wZXJ0eSBtYXRjaGVyLCBvciBhIHByb3BlcnR5IGFjY2Vzc29yLlxuICB2YXIgY2IgPSBmdW5jdGlvbih2YWx1ZSwgY29udGV4dCwgYXJnQ291bnQpIHtcbiAgICBpZiAoXy5pdGVyYXRlZSAhPT0gYnVpbHRpbkl0ZXJhdGVlKSByZXR1cm4gXy5pdGVyYXRlZSh2YWx1ZSwgY29udGV4dCk7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiBfLmlkZW50aXR5O1xuICAgIGlmIChfLmlzRnVuY3Rpb24odmFsdWUpKSByZXR1cm4gb3B0aW1pemVDYih2YWx1ZSwgY29udGV4dCwgYXJnQ291bnQpO1xuICAgIGlmIChfLmlzT2JqZWN0KHZhbHVlKSAmJiAhXy5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIF8ubWF0Y2hlcih2YWx1ZSk7XG4gICAgcmV0dXJuIF8ucHJvcGVydHkodmFsdWUpO1xuICB9O1xuXG4gIC8vIEV4dGVybmFsIHdyYXBwZXIgZm9yIG91ciBjYWxsYmFjayBnZW5lcmF0b3IuIFVzZXJzIG1heSBjdXN0b21pemVcbiAgLy8gYF8uaXRlcmF0ZWVgIGlmIHRoZXkgd2FudCBhZGRpdGlvbmFsIHByZWRpY2F0ZS9pdGVyYXRlZSBzaG9ydGhhbmQgc3R5bGVzLlxuICAvLyBUaGlzIGFic3RyYWN0aW9uIGhpZGVzIHRoZSBpbnRlcm5hbC1vbmx5IGFyZ0NvdW50IGFyZ3VtZW50LlxuICBfLml0ZXJhdGVlID0gYnVpbHRpbkl0ZXJhdGVlID0gZnVuY3Rpb24odmFsdWUsIGNvbnRleHQpIHtcbiAgICByZXR1cm4gY2IodmFsdWUsIGNvbnRleHQsIEluZmluaXR5KTtcbiAgfTtcblxuICAvLyBTb21lIGZ1bmN0aW9ucyB0YWtlIGEgdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50cywgb3IgYSBmZXcgZXhwZWN0ZWRcbiAgLy8gYXJndW1lbnRzIGF0IHRoZSBiZWdpbm5pbmcgYW5kIHRoZW4gYSB2YXJpYWJsZSBudW1iZXIgb2YgdmFsdWVzIHRvIG9wZXJhdGVcbiAgLy8gb24uIFRoaXMgaGVscGVyIGFjY3VtdWxhdGVzIGFsbCByZW1haW5pbmcgYXJndW1lbnRzIHBhc3QgdGhlIGZ1bmN0aW9u4oCZc1xuICAvLyBhcmd1bWVudCBsZW5ndGggKG9yIGFuIGV4cGxpY2l0IGBzdGFydEluZGV4YCksIGludG8gYW4gYXJyYXkgdGhhdCBiZWNvbWVzXG4gIC8vIHRoZSBsYXN0IGFyZ3VtZW50LiBTaW1pbGFyIHRvIEVTNuKAmXMgXCJyZXN0IHBhcmFtZXRlclwiLlxuICB2YXIgcmVzdEFyZ3VtZW50cyA9IGZ1bmN0aW9uKGZ1bmMsIHN0YXJ0SW5kZXgpIHtcbiAgICBzdGFydEluZGV4ID0gc3RhcnRJbmRleCA9PSBudWxsID8gZnVuYy5sZW5ndGggLSAxIDogK3N0YXJ0SW5kZXg7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGxlbmd0aCA9IE1hdGgubWF4KGFyZ3VtZW50cy5sZW5ndGggLSBzdGFydEluZGV4LCAwKSxcbiAgICAgICAgICByZXN0ID0gQXJyYXkobGVuZ3RoKSxcbiAgICAgICAgICBpbmRleCA9IDA7XG4gICAgICBmb3IgKDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgcmVzdFtpbmRleF0gPSBhcmd1bWVudHNbaW5kZXggKyBzdGFydEluZGV4XTtcbiAgICAgIH1cbiAgICAgIHN3aXRjaCAoc3RhcnRJbmRleCkge1xuICAgICAgICBjYXNlIDA6IHJldHVybiBmdW5jLmNhbGwodGhpcywgcmVzdCk7XG4gICAgICAgIGNhc2UgMTogcmV0dXJuIGZ1bmMuY2FsbCh0aGlzLCBhcmd1bWVudHNbMF0sIHJlc3QpO1xuICAgICAgICBjYXNlIDI6IHJldHVybiBmdW5jLmNhbGwodGhpcywgYXJndW1lbnRzWzBdLCBhcmd1bWVudHNbMV0sIHJlc3QpO1xuICAgICAgfVxuICAgICAgdmFyIGFyZ3MgPSBBcnJheShzdGFydEluZGV4ICsgMSk7XG4gICAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBzdGFydEluZGV4OyBpbmRleCsrKSB7XG4gICAgICAgIGFyZ3NbaW5kZXhdID0gYXJndW1lbnRzW2luZGV4XTtcbiAgICAgIH1cbiAgICAgIGFyZ3Nbc3RhcnRJbmRleF0gPSByZXN0O1xuICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpcywgYXJncyk7XG4gICAgfTtcbiAgfTtcblxuICAvLyBBbiBpbnRlcm5hbCBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYSBuZXcgb2JqZWN0IHRoYXQgaW5oZXJpdHMgZnJvbSBhbm90aGVyLlxuICB2YXIgYmFzZUNyZWF0ZSA9IGZ1bmN0aW9uKHByb3RvdHlwZSkge1xuICAgIGlmICghXy5pc09iamVjdChwcm90b3R5cGUpKSByZXR1cm4ge307XG4gICAgaWYgKG5hdGl2ZUNyZWF0ZSkgcmV0dXJuIG5hdGl2ZUNyZWF0ZShwcm90b3R5cGUpO1xuICAgIEN0b3IucHJvdG90eXBlID0gcHJvdG90eXBlO1xuICAgIHZhciByZXN1bHQgPSBuZXcgQ3RvcjtcbiAgICBDdG9yLnByb3RvdHlwZSA9IG51bGw7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICB2YXIgc2hhbGxvd1Byb3BlcnR5ID0gZnVuY3Rpb24oa2V5KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKG9iaikge1xuICAgICAgcmV0dXJuIG9iaiA9PSBudWxsID8gdm9pZCAwIDogb2JqW2tleV07XG4gICAgfTtcbiAgfTtcblxuICB2YXIgaGFzID0gZnVuY3Rpb24ob2JqLCBwYXRoKSB7XG4gICAgcmV0dXJuIG9iaiAhPSBudWxsICYmIGhhc093blByb3BlcnR5LmNhbGwob2JqLCBwYXRoKTtcbiAgfVxuXG4gIHZhciBkZWVwR2V0ID0gZnVuY3Rpb24ob2JqLCBwYXRoKSB7XG4gICAgdmFyIGxlbmd0aCA9IHBhdGgubGVuZ3RoO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChvYmogPT0gbnVsbCkgcmV0dXJuIHZvaWQgMDtcbiAgICAgIG9iaiA9IG9ialtwYXRoW2ldXTtcbiAgICB9XG4gICAgcmV0dXJuIGxlbmd0aCA/IG9iaiA6IHZvaWQgMDtcbiAgfTtcblxuICAvLyBIZWxwZXIgZm9yIGNvbGxlY3Rpb24gbWV0aG9kcyB0byBkZXRlcm1pbmUgd2hldGhlciBhIGNvbGxlY3Rpb25cbiAgLy8gc2hvdWxkIGJlIGl0ZXJhdGVkIGFzIGFuIGFycmF5IG9yIGFzIGFuIG9iamVjdC5cbiAgLy8gUmVsYXRlZDogaHR0cDovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtdG9sZW5ndGhcbiAgLy8gQXZvaWRzIGEgdmVyeSBuYXN0eSBpT1MgOCBKSVQgYnVnIG9uIEFSTS02NC4gIzIwOTRcbiAgdmFyIE1BWF9BUlJBWV9JTkRFWCA9IE1hdGgucG93KDIsIDUzKSAtIDE7XG4gIHZhciBnZXRMZW5ndGggPSBzaGFsbG93UHJvcGVydHkoJ2xlbmd0aCcpO1xuICB2YXIgaXNBcnJheUxpa2UgPSBmdW5jdGlvbihjb2xsZWN0aW9uKSB7XG4gICAgdmFyIGxlbmd0aCA9IGdldExlbmd0aChjb2xsZWN0aW9uKTtcbiAgICByZXR1cm4gdHlwZW9mIGxlbmd0aCA9PSAnbnVtYmVyJyAmJiBsZW5ndGggPj0gMCAmJiBsZW5ndGggPD0gTUFYX0FSUkFZX0lOREVYO1xuICB9O1xuXG4gIC8vIENvbGxlY3Rpb24gRnVuY3Rpb25zXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLy8gVGhlIGNvcm5lcnN0b25lLCBhbiBgZWFjaGAgaW1wbGVtZW50YXRpb24sIGFrYSBgZm9yRWFjaGAuXG4gIC8vIEhhbmRsZXMgcmF3IG9iamVjdHMgaW4gYWRkaXRpb24gdG8gYXJyYXktbGlrZXMuIFRyZWF0cyBhbGxcbiAgLy8gc3BhcnNlIGFycmF5LWxpa2VzIGFzIGlmIHRoZXkgd2VyZSBkZW5zZS5cbiAgXy5lYWNoID0gXy5mb3JFYWNoID0gZnVuY3Rpb24ob2JqLCBpdGVyYXRlZSwgY29udGV4dCkge1xuICAgIGl0ZXJhdGVlID0gb3B0aW1pemVDYihpdGVyYXRlZSwgY29udGV4dCk7XG4gICAgdmFyIGksIGxlbmd0aDtcbiAgICBpZiAoaXNBcnJheUxpa2Uob2JqKSkge1xuICAgICAgZm9yIChpID0gMCwgbGVuZ3RoID0gb2JqLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGl0ZXJhdGVlKG9ialtpXSwgaSwgb2JqKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGtleXMgPSBfLmtleXMob2JqKTtcbiAgICAgIGZvciAoaSA9IDAsIGxlbmd0aCA9IGtleXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaXRlcmF0ZWUob2JqW2tleXNbaV1dLCBrZXlzW2ldLCBvYmopO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb2JqO1xuICB9O1xuXG4gIC8vIFJldHVybiB0aGUgcmVzdWx0cyBvZiBhcHBseWluZyB0aGUgaXRlcmF0ZWUgdG8gZWFjaCBlbGVtZW50LlxuICBfLm1hcCA9IF8uY29sbGVjdCA9IGZ1bmN0aW9uKG9iaiwgaXRlcmF0ZWUsIGNvbnRleHQpIHtcbiAgICBpdGVyYXRlZSA9IGNiKGl0ZXJhdGVlLCBjb250ZXh0KTtcbiAgICB2YXIga2V5cyA9ICFpc0FycmF5TGlrZShvYmopICYmIF8ua2V5cyhvYmopLFxuICAgICAgICBsZW5ndGggPSAoa2V5cyB8fCBvYmopLmxlbmd0aCxcbiAgICAgICAgcmVzdWx0cyA9IEFycmF5KGxlbmd0aCk7XG4gICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgdmFyIGN1cnJlbnRLZXkgPSBrZXlzID8ga2V5c1tpbmRleF0gOiBpbmRleDtcbiAgICAgIHJlc3VsdHNbaW5kZXhdID0gaXRlcmF0ZWUob2JqW2N1cnJlbnRLZXldLCBjdXJyZW50S2V5LCBvYmopO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfTtcblxuICAvLyBDcmVhdGUgYSByZWR1Y2luZyBmdW5jdGlvbiBpdGVyYXRpbmcgbGVmdCBvciByaWdodC5cbiAgdmFyIGNyZWF0ZVJlZHVjZSA9IGZ1bmN0aW9uKGRpcikge1xuICAgIC8vIFdyYXAgY29kZSB0aGF0IHJlYXNzaWducyBhcmd1bWVudCB2YXJpYWJsZXMgaW4gYSBzZXBhcmF0ZSBmdW5jdGlvbiB0aGFuXG4gICAgLy8gdGhlIG9uZSB0aGF0IGFjY2Vzc2VzIGBhcmd1bWVudHMubGVuZ3RoYCB0byBhdm9pZCBhIHBlcmYgaGl0LiAoIzE5OTEpXG4gICAgdmFyIHJlZHVjZXIgPSBmdW5jdGlvbihvYmosIGl0ZXJhdGVlLCBtZW1vLCBpbml0aWFsKSB7XG4gICAgICB2YXIga2V5cyA9ICFpc0FycmF5TGlrZShvYmopICYmIF8ua2V5cyhvYmopLFxuICAgICAgICAgIGxlbmd0aCA9IChrZXlzIHx8IG9iaikubGVuZ3RoLFxuICAgICAgICAgIGluZGV4ID0gZGlyID4gMCA/IDAgOiBsZW5ndGggLSAxO1xuICAgICAgaWYgKCFpbml0aWFsKSB7XG4gICAgICAgIG1lbW8gPSBvYmpba2V5cyA/IGtleXNbaW5kZXhdIDogaW5kZXhdO1xuICAgICAgICBpbmRleCArPSBkaXI7XG4gICAgICB9XG4gICAgICBmb3IgKDsgaW5kZXggPj0gMCAmJiBpbmRleCA8IGxlbmd0aDsgaW5kZXggKz0gZGlyKSB7XG4gICAgICAgIHZhciBjdXJyZW50S2V5ID0ga2V5cyA/IGtleXNbaW5kZXhdIDogaW5kZXg7XG4gICAgICAgIG1lbW8gPSBpdGVyYXRlZShtZW1vLCBvYmpbY3VycmVudEtleV0sIGN1cnJlbnRLZXksIG9iaik7XG4gICAgICB9XG4gICAgICByZXR1cm4gbWVtbztcbiAgICB9O1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uKG9iaiwgaXRlcmF0ZWUsIG1lbW8sIGNvbnRleHQpIHtcbiAgICAgIHZhciBpbml0aWFsID0gYXJndW1lbnRzLmxlbmd0aCA+PSAzO1xuICAgICAgcmV0dXJuIHJlZHVjZXIob2JqLCBvcHRpbWl6ZUNiKGl0ZXJhdGVlLCBjb250ZXh0LCA0KSwgbWVtbywgaW5pdGlhbCk7XG4gICAgfTtcbiAgfTtcblxuICAvLyAqKlJlZHVjZSoqIGJ1aWxkcyB1cCBhIHNpbmdsZSByZXN1bHQgZnJvbSBhIGxpc3Qgb2YgdmFsdWVzLCBha2EgYGluamVjdGAsXG4gIC8vIG9yIGBmb2xkbGAuXG4gIF8ucmVkdWNlID0gXy5mb2xkbCA9IF8uaW5qZWN0ID0gY3JlYXRlUmVkdWNlKDEpO1xuXG4gIC8vIFRoZSByaWdodC1hc3NvY2lhdGl2ZSB2ZXJzaW9uIG9mIHJlZHVjZSwgYWxzbyBrbm93biBhcyBgZm9sZHJgLlxuICBfLnJlZHVjZVJpZ2h0ID0gXy5mb2xkciA9IGNyZWF0ZVJlZHVjZSgtMSk7XG5cbiAgLy8gUmV0dXJuIHRoZSBmaXJzdCB2YWx1ZSB3aGljaCBwYXNzZXMgYSB0cnV0aCB0ZXN0LiBBbGlhc2VkIGFzIGBkZXRlY3RgLlxuICBfLmZpbmQgPSBfLmRldGVjdCA9IGZ1bmN0aW9uKG9iaiwgcHJlZGljYXRlLCBjb250ZXh0KSB7XG4gICAgdmFyIGtleUZpbmRlciA9IGlzQXJyYXlMaWtlKG9iaikgPyBfLmZpbmRJbmRleCA6IF8uZmluZEtleTtcbiAgICB2YXIga2V5ID0ga2V5RmluZGVyKG9iaiwgcHJlZGljYXRlLCBjb250ZXh0KTtcbiAgICBpZiAoa2V5ICE9PSB2b2lkIDAgJiYga2V5ICE9PSAtMSkgcmV0dXJuIG9ialtrZXldO1xuICB9O1xuXG4gIC8vIFJldHVybiBhbGwgdGhlIGVsZW1lbnRzIHRoYXQgcGFzcyBhIHRydXRoIHRlc3QuXG4gIC8vIEFsaWFzZWQgYXMgYHNlbGVjdGAuXG4gIF8uZmlsdGVyID0gXy5zZWxlY3QgPSBmdW5jdGlvbihvYmosIHByZWRpY2F0ZSwgY29udGV4dCkge1xuICAgIHZhciByZXN1bHRzID0gW107XG4gICAgcHJlZGljYXRlID0gY2IocHJlZGljYXRlLCBjb250ZXh0KTtcbiAgICBfLmVhY2gob2JqLCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGxpc3QpIHtcbiAgICAgIGlmIChwcmVkaWNhdGUodmFsdWUsIGluZGV4LCBsaXN0KSkgcmVzdWx0cy5wdXNoKHZhbHVlKTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfTtcblxuICAvLyBSZXR1cm4gYWxsIHRoZSBlbGVtZW50cyBmb3Igd2hpY2ggYSB0cnV0aCB0ZXN0IGZhaWxzLlxuICBfLnJlamVjdCA9IGZ1bmN0aW9uKG9iaiwgcHJlZGljYXRlLCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIF8uZmlsdGVyKG9iaiwgXy5uZWdhdGUoY2IocHJlZGljYXRlKSksIGNvbnRleHQpO1xuICB9O1xuXG4gIC8vIERldGVybWluZSB3aGV0aGVyIGFsbCBvZiB0aGUgZWxlbWVudHMgbWF0Y2ggYSB0cnV0aCB0ZXN0LlxuICAvLyBBbGlhc2VkIGFzIGBhbGxgLlxuICBfLmV2ZXJ5ID0gXy5hbGwgPSBmdW5jdGlvbihvYmosIHByZWRpY2F0ZSwgY29udGV4dCkge1xuICAgIHByZWRpY2F0ZSA9IGNiKHByZWRpY2F0ZSwgY29udGV4dCk7XG4gICAgdmFyIGtleXMgPSAhaXNBcnJheUxpa2Uob2JqKSAmJiBfLmtleXMob2JqKSxcbiAgICAgICAgbGVuZ3RoID0gKGtleXMgfHwgb2JqKS5sZW5ndGg7XG4gICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgdmFyIGN1cnJlbnRLZXkgPSBrZXlzID8ga2V5c1tpbmRleF0gOiBpbmRleDtcbiAgICAgIGlmICghcHJlZGljYXRlKG9ialtjdXJyZW50S2V5XSwgY3VycmVudEtleSwgb2JqKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcblxuICAvLyBEZXRlcm1pbmUgaWYgYXQgbGVhc3Qgb25lIGVsZW1lbnQgaW4gdGhlIG9iamVjdCBtYXRjaGVzIGEgdHJ1dGggdGVzdC5cbiAgLy8gQWxpYXNlZCBhcyBgYW55YC5cbiAgXy5zb21lID0gXy5hbnkgPSBmdW5jdGlvbihvYmosIHByZWRpY2F0ZSwgY29udGV4dCkge1xuICAgIHByZWRpY2F0ZSA9IGNiKHByZWRpY2F0ZSwgY29udGV4dCk7XG4gICAgdmFyIGtleXMgPSAhaXNBcnJheUxpa2Uob2JqKSAmJiBfLmtleXMob2JqKSxcbiAgICAgICAgbGVuZ3RoID0gKGtleXMgfHwgb2JqKS5sZW5ndGg7XG4gICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgdmFyIGN1cnJlbnRLZXkgPSBrZXlzID8ga2V5c1tpbmRleF0gOiBpbmRleDtcbiAgICAgIGlmIChwcmVkaWNhdGUob2JqW2N1cnJlbnRLZXldLCBjdXJyZW50S2V5LCBvYmopKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIC8vIERldGVybWluZSBpZiB0aGUgYXJyYXkgb3Igb2JqZWN0IGNvbnRhaW5zIGEgZ2l2ZW4gaXRlbSAodXNpbmcgYD09PWApLlxuICAvLyBBbGlhc2VkIGFzIGBpbmNsdWRlc2AgYW5kIGBpbmNsdWRlYC5cbiAgXy5jb250YWlucyA9IF8uaW5jbHVkZXMgPSBfLmluY2x1ZGUgPSBmdW5jdGlvbihvYmosIGl0ZW0sIGZyb21JbmRleCwgZ3VhcmQpIHtcbiAgICBpZiAoIWlzQXJyYXlMaWtlKG9iaikpIG9iaiA9IF8udmFsdWVzKG9iaik7XG4gICAgaWYgKHR5cGVvZiBmcm9tSW5kZXggIT0gJ251bWJlcicgfHwgZ3VhcmQpIGZyb21JbmRleCA9IDA7XG4gICAgcmV0dXJuIF8uaW5kZXhPZihvYmosIGl0ZW0sIGZyb21JbmRleCkgPj0gMDtcbiAgfTtcblxuICAvLyBJbnZva2UgYSBtZXRob2QgKHdpdGggYXJndW1lbnRzKSBvbiBldmVyeSBpdGVtIGluIGEgY29sbGVjdGlvbi5cbiAgXy5pbnZva2UgPSByZXN0QXJndW1lbnRzKGZ1bmN0aW9uKG9iaiwgcGF0aCwgYXJncykge1xuICAgIHZhciBjb250ZXh0UGF0aCwgZnVuYztcbiAgICBpZiAoXy5pc0Z1bmN0aW9uKHBhdGgpKSB7XG4gICAgICBmdW5jID0gcGF0aDtcbiAgICB9IGVsc2UgaWYgKF8uaXNBcnJheShwYXRoKSkge1xuICAgICAgY29udGV4dFBhdGggPSBwYXRoLnNsaWNlKDAsIC0xKTtcbiAgICAgIHBhdGggPSBwYXRoW3BhdGgubGVuZ3RoIC0gMV07XG4gICAgfVxuICAgIHJldHVybiBfLm1hcChvYmosIGZ1bmN0aW9uKGNvbnRleHQpIHtcbiAgICAgIHZhciBtZXRob2QgPSBmdW5jO1xuICAgICAgaWYgKCFtZXRob2QpIHtcbiAgICAgICAgaWYgKGNvbnRleHRQYXRoICYmIGNvbnRleHRQYXRoLmxlbmd0aCkge1xuICAgICAgICAgIGNvbnRleHQgPSBkZWVwR2V0KGNvbnRleHQsIGNvbnRleHRQYXRoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKSByZXR1cm4gdm9pZCAwO1xuICAgICAgICBtZXRob2QgPSBjb250ZXh0W3BhdGhdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG1ldGhvZCA9PSBudWxsID8gbWV0aG9kIDogbWV0aG9kLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyBDb252ZW5pZW5jZSB2ZXJzaW9uIG9mIGEgY29tbW9uIHVzZSBjYXNlIG9mIGBtYXBgOiBmZXRjaGluZyBhIHByb3BlcnR5LlxuICBfLnBsdWNrID0gZnVuY3Rpb24ob2JqLCBrZXkpIHtcbiAgICByZXR1cm4gXy5tYXAob2JqLCBfLnByb3BlcnR5KGtleSkpO1xuICB9O1xuXG4gIC8vIENvbnZlbmllbmNlIHZlcnNpb24gb2YgYSBjb21tb24gdXNlIGNhc2Ugb2YgYGZpbHRlcmA6IHNlbGVjdGluZyBvbmx5IG9iamVjdHNcbiAgLy8gY29udGFpbmluZyBzcGVjaWZpYyBga2V5OnZhbHVlYCBwYWlycy5cbiAgXy53aGVyZSA9IGZ1bmN0aW9uKG9iaiwgYXR0cnMpIHtcbiAgICByZXR1cm4gXy5maWx0ZXIob2JqLCBfLm1hdGNoZXIoYXR0cnMpKTtcbiAgfTtcblxuICAvLyBDb252ZW5pZW5jZSB2ZXJzaW9uIG9mIGEgY29tbW9uIHVzZSBjYXNlIG9mIGBmaW5kYDogZ2V0dGluZyB0aGUgZmlyc3Qgb2JqZWN0XG4gIC8vIGNvbnRhaW5pbmcgc3BlY2lmaWMgYGtleTp2YWx1ZWAgcGFpcnMuXG4gIF8uZmluZFdoZXJlID0gZnVuY3Rpb24ob2JqLCBhdHRycykge1xuICAgIHJldHVybiBfLmZpbmQob2JqLCBfLm1hdGNoZXIoYXR0cnMpKTtcbiAgfTtcblxuICAvLyBSZXR1cm4gdGhlIG1heGltdW0gZWxlbWVudCAob3IgZWxlbWVudC1iYXNlZCBjb21wdXRhdGlvbikuXG4gIF8ubWF4ID0gZnVuY3Rpb24ob2JqLCBpdGVyYXRlZSwgY29udGV4dCkge1xuICAgIHZhciByZXN1bHQgPSAtSW5maW5pdHksIGxhc3RDb21wdXRlZCA9IC1JbmZpbml0eSxcbiAgICAgICAgdmFsdWUsIGNvbXB1dGVkO1xuICAgIGlmIChpdGVyYXRlZSA9PSBudWxsIHx8IHR5cGVvZiBpdGVyYXRlZSA9PSAnbnVtYmVyJyAmJiB0eXBlb2Ygb2JqWzBdICE9ICdvYmplY3QnICYmIG9iaiAhPSBudWxsKSB7XG4gICAgICBvYmogPSBpc0FycmF5TGlrZShvYmopID8gb2JqIDogXy52YWx1ZXMob2JqKTtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBvYmoubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFsdWUgPSBvYmpbaV07XG4gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlID4gcmVzdWx0KSB7XG4gICAgICAgICAgcmVzdWx0ID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaXRlcmF0ZWUgPSBjYihpdGVyYXRlZSwgY29udGV4dCk7XG4gICAgICBfLmVhY2gob2JqLCBmdW5jdGlvbih2LCBpbmRleCwgbGlzdCkge1xuICAgICAgICBjb21wdXRlZCA9IGl0ZXJhdGVlKHYsIGluZGV4LCBsaXN0KTtcbiAgICAgICAgaWYgKGNvbXB1dGVkID4gbGFzdENvbXB1dGVkIHx8IGNvbXB1dGVkID09PSAtSW5maW5pdHkgJiYgcmVzdWx0ID09PSAtSW5maW5pdHkpIHtcbiAgICAgICAgICByZXN1bHQgPSB2O1xuICAgICAgICAgIGxhc3RDb21wdXRlZCA9IGNvbXB1dGVkO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICAvLyBSZXR1cm4gdGhlIG1pbmltdW0gZWxlbWVudCAob3IgZWxlbWVudC1iYXNlZCBjb21wdXRhdGlvbikuXG4gIF8ubWluID0gZnVuY3Rpb24ob2JqLCBpdGVyYXRlZSwgY29udGV4dCkge1xuICAgIHZhciByZXN1bHQgPSBJbmZpbml0eSwgbGFzdENvbXB1dGVkID0gSW5maW5pdHksXG4gICAgICAgIHZhbHVlLCBjb21wdXRlZDtcbiAgICBpZiAoaXRlcmF0ZWUgPT0gbnVsbCB8fCB0eXBlb2YgaXRlcmF0ZWUgPT0gJ251bWJlcicgJiYgdHlwZW9mIG9ialswXSAhPSAnb2JqZWN0JyAmJiBvYmogIT0gbnVsbCkge1xuICAgICAgb2JqID0gaXNBcnJheUxpa2Uob2JqKSA/IG9iaiA6IF8udmFsdWVzKG9iaik7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gb2JqLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhbHVlID0gb2JqW2ldO1xuICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZSA8IHJlc3VsdCkge1xuICAgICAgICAgIHJlc3VsdCA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGl0ZXJhdGVlID0gY2IoaXRlcmF0ZWUsIGNvbnRleHQpO1xuICAgICAgXy5lYWNoKG9iaiwgZnVuY3Rpb24odiwgaW5kZXgsIGxpc3QpIHtcbiAgICAgICAgY29tcHV0ZWQgPSBpdGVyYXRlZSh2LCBpbmRleCwgbGlzdCk7XG4gICAgICAgIGlmIChjb21wdXRlZCA8IGxhc3RDb21wdXRlZCB8fCBjb21wdXRlZCA9PT0gSW5maW5pdHkgJiYgcmVzdWx0ID09PSBJbmZpbml0eSkge1xuICAgICAgICAgIHJlc3VsdCA9IHY7XG4gICAgICAgICAgbGFzdENvbXB1dGVkID0gY29tcHV0ZWQ7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIC8vIFNodWZmbGUgYSBjb2xsZWN0aW9uLlxuICBfLnNodWZmbGUgPSBmdW5jdGlvbihvYmopIHtcbiAgICByZXR1cm4gXy5zYW1wbGUob2JqLCBJbmZpbml0eSk7XG4gIH07XG5cbiAgLy8gU2FtcGxlICoqbioqIHJhbmRvbSB2YWx1ZXMgZnJvbSBhIGNvbGxlY3Rpb24gdXNpbmcgdGhlIG1vZGVybiB2ZXJzaW9uIG9mIHRoZVxuICAvLyBbRmlzaGVyLVlhdGVzIHNodWZmbGVdKGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRmlzaGVy4oCTWWF0ZXNfc2h1ZmZsZSkuXG4gIC8vIElmICoqbioqIGlzIG5vdCBzcGVjaWZpZWQsIHJldHVybnMgYSBzaW5nbGUgcmFuZG9tIGVsZW1lbnQuXG4gIC8vIFRoZSBpbnRlcm5hbCBgZ3VhcmRgIGFyZ3VtZW50IGFsbG93cyBpdCB0byB3b3JrIHdpdGggYG1hcGAuXG4gIF8uc2FtcGxlID0gZnVuY3Rpb24ob2JqLCBuLCBndWFyZCkge1xuICAgIGlmIChuID09IG51bGwgfHwgZ3VhcmQpIHtcbiAgICAgIGlmICghaXNBcnJheUxpa2Uob2JqKSkgb2JqID0gXy52YWx1ZXMob2JqKTtcbiAgICAgIHJldHVybiBvYmpbXy5yYW5kb20ob2JqLmxlbmd0aCAtIDEpXTtcbiAgICB9XG4gICAgdmFyIHNhbXBsZSA9IGlzQXJyYXlMaWtlKG9iaikgPyBfLmNsb25lKG9iaikgOiBfLnZhbHVlcyhvYmopO1xuICAgIHZhciBsZW5ndGggPSBnZXRMZW5ndGgoc2FtcGxlKTtcbiAgICBuID0gTWF0aC5tYXgoTWF0aC5taW4obiwgbGVuZ3RoKSwgMCk7XG4gICAgdmFyIGxhc3QgPSBsZW5ndGggLSAxO1xuICAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCBuOyBpbmRleCsrKSB7XG4gICAgICB2YXIgcmFuZCA9IF8ucmFuZG9tKGluZGV4LCBsYXN0KTtcbiAgICAgIHZhciB0ZW1wID0gc2FtcGxlW2luZGV4XTtcbiAgICAgIHNhbXBsZVtpbmRleF0gPSBzYW1wbGVbcmFuZF07XG4gICAgICBzYW1wbGVbcmFuZF0gPSB0ZW1wO1xuICAgIH1cbiAgICByZXR1cm4gc2FtcGxlLnNsaWNlKDAsIG4pO1xuICB9O1xuXG4gIC8vIFNvcnQgdGhlIG9iamVjdCdzIHZhbHVlcyBieSBhIGNyaXRlcmlvbiBwcm9kdWNlZCBieSBhbiBpdGVyYXRlZS5cbiAgXy5zb3J0QnkgPSBmdW5jdGlvbihvYmosIGl0ZXJhdGVlLCBjb250ZXh0KSB7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICBpdGVyYXRlZSA9IGNiKGl0ZXJhdGVlLCBjb250ZXh0KTtcbiAgICByZXR1cm4gXy5wbHVjayhfLm1hcChvYmosIGZ1bmN0aW9uKHZhbHVlLCBrZXksIGxpc3QpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgaW5kZXg6IGluZGV4KyssXG4gICAgICAgIGNyaXRlcmlhOiBpdGVyYXRlZSh2YWx1ZSwga2V5LCBsaXN0KVxuICAgICAgfTtcbiAgICB9KS5zb3J0KGZ1bmN0aW9uKGxlZnQsIHJpZ2h0KSB7XG4gICAgICB2YXIgYSA9IGxlZnQuY3JpdGVyaWE7XG4gICAgICB2YXIgYiA9IHJpZ2h0LmNyaXRlcmlhO1xuICAgICAgaWYgKGEgIT09IGIpIHtcbiAgICAgICAgaWYgKGEgPiBiIHx8IGEgPT09IHZvaWQgMCkgcmV0dXJuIDE7XG4gICAgICAgIGlmIChhIDwgYiB8fCBiID09PSB2b2lkIDApIHJldHVybiAtMTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBsZWZ0LmluZGV4IC0gcmlnaHQuaW5kZXg7XG4gICAgfSksICd2YWx1ZScpO1xuICB9O1xuXG4gIC8vIEFuIGludGVybmFsIGZ1bmN0aW9uIHVzZWQgZm9yIGFnZ3JlZ2F0ZSBcImdyb3VwIGJ5XCIgb3BlcmF0aW9ucy5cbiAgdmFyIGdyb3VwID0gZnVuY3Rpb24oYmVoYXZpb3IsIHBhcnRpdGlvbikge1xuICAgIHJldHVybiBmdW5jdGlvbihvYmosIGl0ZXJhdGVlLCBjb250ZXh0KSB7XG4gICAgICB2YXIgcmVzdWx0ID0gcGFydGl0aW9uID8gW1tdLCBbXV0gOiB7fTtcbiAgICAgIGl0ZXJhdGVlID0gY2IoaXRlcmF0ZWUsIGNvbnRleHQpO1xuICAgICAgXy5lYWNoKG9iaiwgZnVuY3Rpb24odmFsdWUsIGluZGV4KSB7XG4gICAgICAgIHZhciBrZXkgPSBpdGVyYXRlZSh2YWx1ZSwgaW5kZXgsIG9iaik7XG4gICAgICAgIGJlaGF2aW9yKHJlc3VsdCwgdmFsdWUsIGtleSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgfTtcblxuICAvLyBHcm91cHMgdGhlIG9iamVjdCdzIHZhbHVlcyBieSBhIGNyaXRlcmlvbi4gUGFzcyBlaXRoZXIgYSBzdHJpbmcgYXR0cmlidXRlXG4gIC8vIHRvIGdyb3VwIGJ5LCBvciBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgY3JpdGVyaW9uLlxuICBfLmdyb3VwQnkgPSBncm91cChmdW5jdGlvbihyZXN1bHQsIHZhbHVlLCBrZXkpIHtcbiAgICBpZiAoaGFzKHJlc3VsdCwga2V5KSkgcmVzdWx0W2tleV0ucHVzaCh2YWx1ZSk7IGVsc2UgcmVzdWx0W2tleV0gPSBbdmFsdWVdO1xuICB9KTtcblxuICAvLyBJbmRleGVzIHRoZSBvYmplY3QncyB2YWx1ZXMgYnkgYSBjcml0ZXJpb24sIHNpbWlsYXIgdG8gYGdyb3VwQnlgLCBidXQgZm9yXG4gIC8vIHdoZW4geW91IGtub3cgdGhhdCB5b3VyIGluZGV4IHZhbHVlcyB3aWxsIGJlIHVuaXF1ZS5cbiAgXy5pbmRleEJ5ID0gZ3JvdXAoZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gICAgcmVzdWx0W2tleV0gPSB2YWx1ZTtcbiAgfSk7XG5cbiAgLy8gQ291bnRzIGluc3RhbmNlcyBvZiBhbiBvYmplY3QgdGhhdCBncm91cCBieSBhIGNlcnRhaW4gY3JpdGVyaW9uLiBQYXNzXG4gIC8vIGVpdGhlciBhIHN0cmluZyBhdHRyaWJ1dGUgdG8gY291bnQgYnksIG9yIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZVxuICAvLyBjcml0ZXJpb24uXG4gIF8uY291bnRCeSA9IGdyb3VwKGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkge1xuICAgIGlmIChoYXMocmVzdWx0LCBrZXkpKSByZXN1bHRba2V5XSsrOyBlbHNlIHJlc3VsdFtrZXldID0gMTtcbiAgfSk7XG5cbiAgdmFyIHJlU3RyU3ltYm9sID0gL1teXFx1ZDgwMC1cXHVkZmZmXXxbXFx1ZDgwMC1cXHVkYmZmXVtcXHVkYzAwLVxcdWRmZmZdfFtcXHVkODAwLVxcdWRmZmZdL2c7XG4gIC8vIFNhZmVseSBjcmVhdGUgYSByZWFsLCBsaXZlIGFycmF5IGZyb20gYW55dGhpbmcgaXRlcmFibGUuXG4gIF8udG9BcnJheSA9IGZ1bmN0aW9uKG9iaikge1xuICAgIGlmICghb2JqKSByZXR1cm4gW107XG4gICAgaWYgKF8uaXNBcnJheShvYmopKSByZXR1cm4gc2xpY2UuY2FsbChvYmopO1xuICAgIGlmIChfLmlzU3RyaW5nKG9iaikpIHtcbiAgICAgIC8vIEtlZXAgc3Vycm9nYXRlIHBhaXIgY2hhcmFjdGVycyB0b2dldGhlclxuICAgICAgcmV0dXJuIG9iai5tYXRjaChyZVN0clN5bWJvbCk7XG4gICAgfVxuICAgIGlmIChpc0FycmF5TGlrZShvYmopKSByZXR1cm4gXy5tYXAob2JqLCBfLmlkZW50aXR5KTtcbiAgICByZXR1cm4gXy52YWx1ZXMob2JqKTtcbiAgfTtcblxuICAvLyBSZXR1cm4gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBhbiBvYmplY3QuXG4gIF8uc2l6ZSA9IGZ1bmN0aW9uKG9iaikge1xuICAgIGlmIChvYmogPT0gbnVsbCkgcmV0dXJuIDA7XG4gICAgcmV0dXJuIGlzQXJyYXlMaWtlKG9iaikgPyBvYmoubGVuZ3RoIDogXy5rZXlzKG9iaikubGVuZ3RoO1xuICB9O1xuXG4gIC8vIFNwbGl0IGEgY29sbGVjdGlvbiBpbnRvIHR3byBhcnJheXM6IG9uZSB3aG9zZSBlbGVtZW50cyBhbGwgc2F0aXNmeSB0aGUgZ2l2ZW5cbiAgLy8gcHJlZGljYXRlLCBhbmQgb25lIHdob3NlIGVsZW1lbnRzIGFsbCBkbyBub3Qgc2F0aXNmeSB0aGUgcHJlZGljYXRlLlxuICBfLnBhcnRpdGlvbiA9IGdyb3VwKGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIHBhc3MpIHtcbiAgICByZXN1bHRbcGFzcyA/IDAgOiAxXS5wdXNoKHZhbHVlKTtcbiAgfSwgdHJ1ZSk7XG5cbiAgLy8gQXJyYXkgRnVuY3Rpb25zXG4gIC8vIC0tLS0tLS0tLS0tLS0tLVxuXG4gIC8vIEdldCB0aGUgZmlyc3QgZWxlbWVudCBvZiBhbiBhcnJheS4gUGFzc2luZyAqKm4qKiB3aWxsIHJldHVybiB0aGUgZmlyc3QgTlxuICAvLyB2YWx1ZXMgaW4gdGhlIGFycmF5LiBBbGlhc2VkIGFzIGBoZWFkYCBhbmQgYHRha2VgLiBUaGUgKipndWFyZCoqIGNoZWNrXG4gIC8vIGFsbG93cyBpdCB0byB3b3JrIHdpdGggYF8ubWFwYC5cbiAgXy5maXJzdCA9IF8uaGVhZCA9IF8udGFrZSA9IGZ1bmN0aW9uKGFycmF5LCBuLCBndWFyZCkge1xuICAgIGlmIChhcnJheSA9PSBudWxsIHx8IGFycmF5Lmxlbmd0aCA8IDEpIHJldHVybiBuID09IG51bGwgPyB2b2lkIDAgOiBbXTtcbiAgICBpZiAobiA9PSBudWxsIHx8IGd1YXJkKSByZXR1cm4gYXJyYXlbMF07XG4gICAgcmV0dXJuIF8uaW5pdGlhbChhcnJheSwgYXJyYXkubGVuZ3RoIC0gbik7XG4gIH07XG5cbiAgLy8gUmV0dXJucyBldmVyeXRoaW5nIGJ1dCB0aGUgbGFzdCBlbnRyeSBvZiB0aGUgYXJyYXkuIEVzcGVjaWFsbHkgdXNlZnVsIG9uXG4gIC8vIHRoZSBhcmd1bWVudHMgb2JqZWN0LiBQYXNzaW5nICoqbioqIHdpbGwgcmV0dXJuIGFsbCB0aGUgdmFsdWVzIGluXG4gIC8vIHRoZSBhcnJheSwgZXhjbHVkaW5nIHRoZSBsYXN0IE4uXG4gIF8uaW5pdGlhbCA9IGZ1bmN0aW9uKGFycmF5LCBuLCBndWFyZCkge1xuICAgIHJldHVybiBzbGljZS5jYWxsKGFycmF5LCAwLCBNYXRoLm1heCgwLCBhcnJheS5sZW5ndGggLSAobiA9PSBudWxsIHx8IGd1YXJkID8gMSA6IG4pKSk7XG4gIH07XG5cbiAgLy8gR2V0IHRoZSBsYXN0IGVsZW1lbnQgb2YgYW4gYXJyYXkuIFBhc3NpbmcgKipuKiogd2lsbCByZXR1cm4gdGhlIGxhc3QgTlxuICAvLyB2YWx1ZXMgaW4gdGhlIGFycmF5LlxuICBfLmxhc3QgPSBmdW5jdGlvbihhcnJheSwgbiwgZ3VhcmQpIHtcbiAgICBpZiAoYXJyYXkgPT0gbnVsbCB8fCBhcnJheS5sZW5ndGggPCAxKSByZXR1cm4gbiA9PSBudWxsID8gdm9pZCAwIDogW107XG4gICAgaWYgKG4gPT0gbnVsbCB8fCBndWFyZCkgcmV0dXJuIGFycmF5W2FycmF5Lmxlbmd0aCAtIDFdO1xuICAgIHJldHVybiBfLnJlc3QoYXJyYXksIE1hdGgubWF4KDAsIGFycmF5Lmxlbmd0aCAtIG4pKTtcbiAgfTtcblxuICAvLyBSZXR1cm5zIGV2ZXJ5dGhpbmcgYnV0IHRoZSBmaXJzdCBlbnRyeSBvZiB0aGUgYXJyYXkuIEFsaWFzZWQgYXMgYHRhaWxgIGFuZCBgZHJvcGAuXG4gIC8vIEVzcGVjaWFsbHkgdXNlZnVsIG9uIHRoZSBhcmd1bWVudHMgb2JqZWN0LiBQYXNzaW5nIGFuICoqbioqIHdpbGwgcmV0dXJuXG4gIC8vIHRoZSByZXN0IE4gdmFsdWVzIGluIHRoZSBhcnJheS5cbiAgXy5yZXN0ID0gXy50YWlsID0gXy5kcm9wID0gZnVuY3Rpb24oYXJyYXksIG4sIGd1YXJkKSB7XG4gICAgcmV0dXJuIHNsaWNlLmNhbGwoYXJyYXksIG4gPT0gbnVsbCB8fCBndWFyZCA/IDEgOiBuKTtcbiAgfTtcblxuICAvLyBUcmltIG91dCBhbGwgZmFsc3kgdmFsdWVzIGZyb20gYW4gYXJyYXkuXG4gIF8uY29tcGFjdCA9IGZ1bmN0aW9uKGFycmF5KSB7XG4gICAgcmV0dXJuIF8uZmlsdGVyKGFycmF5LCBCb29sZWFuKTtcbiAgfTtcblxuICAvLyBJbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBvZiBhIHJlY3Vyc2l2ZSBgZmxhdHRlbmAgZnVuY3Rpb24uXG4gIHZhciBmbGF0dGVuID0gZnVuY3Rpb24oaW5wdXQsIHNoYWxsb3csIHN0cmljdCwgb3V0cHV0KSB7XG4gICAgb3V0cHV0ID0gb3V0cHV0IHx8IFtdO1xuICAgIHZhciBpZHggPSBvdXRwdXQubGVuZ3RoO1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBnZXRMZW5ndGgoaW5wdXQpOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB2YWx1ZSA9IGlucHV0W2ldO1xuICAgICAgaWYgKGlzQXJyYXlMaWtlKHZhbHVlKSAmJiAoXy5pc0FycmF5KHZhbHVlKSB8fCBfLmlzQXJndW1lbnRzKHZhbHVlKSkpIHtcbiAgICAgICAgLy8gRmxhdHRlbiBjdXJyZW50IGxldmVsIG9mIGFycmF5IG9yIGFyZ3VtZW50cyBvYmplY3QuXG4gICAgICAgIGlmIChzaGFsbG93KSB7XG4gICAgICAgICAgdmFyIGogPSAwLCBsZW4gPSB2YWx1ZS5sZW5ndGg7XG4gICAgICAgICAgd2hpbGUgKGogPCBsZW4pIG91dHB1dFtpZHgrK10gPSB2YWx1ZVtqKytdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZsYXR0ZW4odmFsdWUsIHNoYWxsb3csIHN0cmljdCwgb3V0cHV0KTtcbiAgICAgICAgICBpZHggPSBvdXRwdXQubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCFzdHJpY3QpIHtcbiAgICAgICAgb3V0cHV0W2lkeCsrXSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb3V0cHV0O1xuICB9O1xuXG4gIC8vIEZsYXR0ZW4gb3V0IGFuIGFycmF5LCBlaXRoZXIgcmVjdXJzaXZlbHkgKGJ5IGRlZmF1bHQpLCBvciBqdXN0IG9uZSBsZXZlbC5cbiAgXy5mbGF0dGVuID0gZnVuY3Rpb24oYXJyYXksIHNoYWxsb3cpIHtcbiAgICByZXR1cm4gZmxhdHRlbihhcnJheSwgc2hhbGxvdywgZmFsc2UpO1xuICB9O1xuXG4gIC8vIFJldHVybiBhIHZlcnNpb24gb2YgdGhlIGFycmF5IHRoYXQgZG9lcyBub3QgY29udGFpbiB0aGUgc3BlY2lmaWVkIHZhbHVlKHMpLlxuICBfLndpdGhvdXQgPSByZXN0QXJndW1lbnRzKGZ1bmN0aW9uKGFycmF5LCBvdGhlckFycmF5cykge1xuICAgIHJldHVybiBfLmRpZmZlcmVuY2UoYXJyYXksIG90aGVyQXJyYXlzKTtcbiAgfSk7XG5cbiAgLy8gUHJvZHVjZSBhIGR1cGxpY2F0ZS1mcmVlIHZlcnNpb24gb2YgdGhlIGFycmF5LiBJZiB0aGUgYXJyYXkgaGFzIGFscmVhZHlcbiAgLy8gYmVlbiBzb3J0ZWQsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgdXNpbmcgYSBmYXN0ZXIgYWxnb3JpdGhtLlxuICAvLyBUaGUgZmFzdGVyIGFsZ29yaXRobSB3aWxsIG5vdCB3b3JrIHdpdGggYW4gaXRlcmF0ZWUgaWYgdGhlIGl0ZXJhdGVlXG4gIC8vIGlzIG5vdCBhIG9uZS10by1vbmUgZnVuY3Rpb24sIHNvIHByb3ZpZGluZyBhbiBpdGVyYXRlZSB3aWxsIGRpc2FibGVcbiAgLy8gdGhlIGZhc3RlciBhbGdvcml0aG0uXG4gIC8vIEFsaWFzZWQgYXMgYHVuaXF1ZWAuXG4gIF8udW5pcSA9IF8udW5pcXVlID0gZnVuY3Rpb24oYXJyYXksIGlzU29ydGVkLCBpdGVyYXRlZSwgY29udGV4dCkge1xuICAgIGlmICghXy5pc0Jvb2xlYW4oaXNTb3J0ZWQpKSB7XG4gICAgICBjb250ZXh0ID0gaXRlcmF0ZWU7XG4gICAgICBpdGVyYXRlZSA9IGlzU29ydGVkO1xuICAgICAgaXNTb3J0ZWQgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGl0ZXJhdGVlICE9IG51bGwpIGl0ZXJhdGVlID0gY2IoaXRlcmF0ZWUsIGNvbnRleHQpO1xuICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICB2YXIgc2VlbiA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBnZXRMZW5ndGgoYXJyYXkpOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2ldLFxuICAgICAgICAgIGNvbXB1dGVkID0gaXRlcmF0ZWUgPyBpdGVyYXRlZSh2YWx1ZSwgaSwgYXJyYXkpIDogdmFsdWU7XG4gICAgICBpZiAoaXNTb3J0ZWQgJiYgIWl0ZXJhdGVlKSB7XG4gICAgICAgIGlmICghaSB8fCBzZWVuICE9PSBjb21wdXRlZCkgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgICAgICBzZWVuID0gY29tcHV0ZWQ7XG4gICAgICB9IGVsc2UgaWYgKGl0ZXJhdGVlKSB7XG4gICAgICAgIGlmICghXy5jb250YWlucyhzZWVuLCBjb21wdXRlZCkpIHtcbiAgICAgICAgICBzZWVuLnB1c2goY29tcHV0ZWQpO1xuICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICghXy5jb250YWlucyhyZXN1bHQsIHZhbHVlKSkge1xuICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgLy8gUHJvZHVjZSBhbiBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSB1bmlvbjogZWFjaCBkaXN0aW5jdCBlbGVtZW50IGZyb20gYWxsIG9mXG4gIC8vIHRoZSBwYXNzZWQtaW4gYXJyYXlzLlxuICBfLnVuaW9uID0gcmVzdEFyZ3VtZW50cyhmdW5jdGlvbihhcnJheXMpIHtcbiAgICByZXR1cm4gXy51bmlxKGZsYXR0ZW4oYXJyYXlzLCB0cnVlLCB0cnVlKSk7XG4gIH0pO1xuXG4gIC8vIFByb2R1Y2UgYW4gYXJyYXkgdGhhdCBjb250YWlucyBldmVyeSBpdGVtIHNoYXJlZCBiZXR3ZWVuIGFsbCB0aGVcbiAgLy8gcGFzc2VkLWluIGFycmF5cy5cbiAgXy5pbnRlcnNlY3Rpb24gPSBmdW5jdGlvbihhcnJheSkge1xuICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICB2YXIgYXJnc0xlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IGdldExlbmd0aChhcnJheSk7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGl0ZW0gPSBhcnJheVtpXTtcbiAgICAgIGlmIChfLmNvbnRhaW5zKHJlc3VsdCwgaXRlbSkpIGNvbnRpbnVlO1xuICAgICAgdmFyIGo7XG4gICAgICBmb3IgKGogPSAxOyBqIDwgYXJnc0xlbmd0aDsgaisrKSB7XG4gICAgICAgIGlmICghXy5jb250YWlucyhhcmd1bWVudHNbal0sIGl0ZW0pKSBicmVhaztcbiAgICAgIH1cbiAgICAgIGlmIChqID09PSBhcmdzTGVuZ3RoKSByZXN1bHQucHVzaChpdGVtKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICAvLyBUYWtlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gb25lIGFycmF5IGFuZCBhIG51bWJlciBvZiBvdGhlciBhcnJheXMuXG4gIC8vIE9ubHkgdGhlIGVsZW1lbnRzIHByZXNlbnQgaW4ganVzdCB0aGUgZmlyc3QgYXJyYXkgd2lsbCByZW1haW4uXG4gIF8uZGlmZmVyZW5jZSA9IHJlc3RBcmd1bWVudHMoZnVuY3Rpb24oYXJyYXksIHJlc3QpIHtcbiAgICByZXN0ID0gZmxhdHRlbihyZXN0LCB0cnVlLCB0cnVlKTtcbiAgICByZXR1cm4gXy5maWx0ZXIoYXJyYXksIGZ1bmN0aW9uKHZhbHVlKXtcbiAgICAgIHJldHVybiAhXy5jb250YWlucyhyZXN0LCB2YWx1ZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIENvbXBsZW1lbnQgb2YgXy56aXAuIFVuemlwIGFjY2VwdHMgYW4gYXJyYXkgb2YgYXJyYXlzIGFuZCBncm91cHNcbiAgLy8gZWFjaCBhcnJheSdzIGVsZW1lbnRzIG9uIHNoYXJlZCBpbmRpY2VzLlxuICBfLnVuemlwID0gZnVuY3Rpb24oYXJyYXkpIHtcbiAgICB2YXIgbGVuZ3RoID0gYXJyYXkgJiYgXy5tYXgoYXJyYXksIGdldExlbmd0aCkubGVuZ3RoIHx8IDA7XG4gICAgdmFyIHJlc3VsdCA9IEFycmF5KGxlbmd0aCk7XG5cbiAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICByZXN1bHRbaW5kZXhdID0gXy5wbHVjayhhcnJheSwgaW5kZXgpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIC8vIFppcCB0b2dldGhlciBtdWx0aXBsZSBsaXN0cyBpbnRvIGEgc2luZ2xlIGFycmF5IC0tIGVsZW1lbnRzIHRoYXQgc2hhcmVcbiAgLy8gYW4gaW5kZXggZ28gdG9nZXRoZXIuXG4gIF8uemlwID0gcmVzdEFyZ3VtZW50cyhfLnVuemlwKTtcblxuICAvLyBDb252ZXJ0cyBsaXN0cyBpbnRvIG9iamVjdHMuIFBhc3MgZWl0aGVyIGEgc2luZ2xlIGFycmF5IG9mIGBba2V5LCB2YWx1ZV1gXG4gIC8vIHBhaXJzLCBvciB0d28gcGFyYWxsZWwgYXJyYXlzIG9mIHRoZSBzYW1lIGxlbmd0aCAtLSBvbmUgb2Yga2V5cywgYW5kIG9uZSBvZlxuICAvLyB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZXMuIFBhc3NpbmcgYnkgcGFpcnMgaXMgdGhlIHJldmVyc2Ugb2YgXy5wYWlycy5cbiAgXy5vYmplY3QgPSBmdW5jdGlvbihsaXN0LCB2YWx1ZXMpIHtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IGdldExlbmd0aChsaXN0KTsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodmFsdWVzKSB7XG4gICAgICAgIHJlc3VsdFtsaXN0W2ldXSA9IHZhbHVlc1tpXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdFtsaXN0W2ldWzBdXSA9IGxpc3RbaV1bMV07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgLy8gR2VuZXJhdG9yIGZ1bmN0aW9uIHRvIGNyZWF0ZSB0aGUgZmluZEluZGV4IGFuZCBmaW5kTGFzdEluZGV4IGZ1bmN0aW9ucy5cbiAgdmFyIGNyZWF0ZVByZWRpY2F0ZUluZGV4RmluZGVyID0gZnVuY3Rpb24oZGlyKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKGFycmF5LCBwcmVkaWNhdGUsIGNvbnRleHQpIHtcbiAgICAgIHByZWRpY2F0ZSA9IGNiKHByZWRpY2F0ZSwgY29udGV4dCk7XG4gICAgICB2YXIgbGVuZ3RoID0gZ2V0TGVuZ3RoKGFycmF5KTtcbiAgICAgIHZhciBpbmRleCA9IGRpciA+IDAgPyAwIDogbGVuZ3RoIC0gMTtcbiAgICAgIGZvciAoOyBpbmRleCA+PSAwICYmIGluZGV4IDwgbGVuZ3RoOyBpbmRleCArPSBkaXIpIHtcbiAgICAgICAgaWYgKHByZWRpY2F0ZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpIHJldHVybiBpbmRleDtcbiAgICAgIH1cbiAgICAgIHJldHVybiAtMTtcbiAgICB9O1xuICB9O1xuXG4gIC8vIFJldHVybnMgdGhlIGZpcnN0IGluZGV4IG9uIGFuIGFycmF5LWxpa2UgdGhhdCBwYXNzZXMgYSBwcmVkaWNhdGUgdGVzdC5cbiAgXy5maW5kSW5kZXggPSBjcmVhdGVQcmVkaWNhdGVJbmRleEZpbmRlcigxKTtcbiAgXy5maW5kTGFzdEluZGV4ID0gY3JlYXRlUHJlZGljYXRlSW5kZXhGaW5kZXIoLTEpO1xuXG4gIC8vIFVzZSBhIGNvbXBhcmF0b3IgZnVuY3Rpb24gdG8gZmlndXJlIG91dCB0aGUgc21hbGxlc3QgaW5kZXggYXQgd2hpY2hcbiAgLy8gYW4gb2JqZWN0IHNob3VsZCBiZSBpbnNlcnRlZCBzbyBhcyB0byBtYWludGFpbiBvcmRlci4gVXNlcyBiaW5hcnkgc2VhcmNoLlxuICBfLnNvcnRlZEluZGV4ID0gZnVuY3Rpb24oYXJyYXksIG9iaiwgaXRlcmF0ZWUsIGNvbnRleHQpIHtcbiAgICBpdGVyYXRlZSA9IGNiKGl0ZXJhdGVlLCBjb250ZXh0LCAxKTtcbiAgICB2YXIgdmFsdWUgPSBpdGVyYXRlZShvYmopO1xuICAgIHZhciBsb3cgPSAwLCBoaWdoID0gZ2V0TGVuZ3RoKGFycmF5KTtcbiAgICB3aGlsZSAobG93IDwgaGlnaCkge1xuICAgICAgdmFyIG1pZCA9IE1hdGguZmxvb3IoKGxvdyArIGhpZ2gpIC8gMik7XG4gICAgICBpZiAoaXRlcmF0ZWUoYXJyYXlbbWlkXSkgPCB2YWx1ZSkgbG93ID0gbWlkICsgMTsgZWxzZSBoaWdoID0gbWlkO1xuICAgIH1cbiAgICByZXR1cm4gbG93O1xuICB9O1xuXG4gIC8vIEdlbmVyYXRvciBmdW5jdGlvbiB0byBjcmVhdGUgdGhlIGluZGV4T2YgYW5kIGxhc3RJbmRleE9mIGZ1bmN0aW9ucy5cbiAgdmFyIGNyZWF0ZUluZGV4RmluZGVyID0gZnVuY3Rpb24oZGlyLCBwcmVkaWNhdGVGaW5kLCBzb3J0ZWRJbmRleCkge1xuICAgIHJldHVybiBmdW5jdGlvbihhcnJheSwgaXRlbSwgaWR4KSB7XG4gICAgICB2YXIgaSA9IDAsIGxlbmd0aCA9IGdldExlbmd0aChhcnJheSk7XG4gICAgICBpZiAodHlwZW9mIGlkeCA9PSAnbnVtYmVyJykge1xuICAgICAgICBpZiAoZGlyID4gMCkge1xuICAgICAgICAgIGkgPSBpZHggPj0gMCA/IGlkeCA6IE1hdGgubWF4KGlkeCArIGxlbmd0aCwgaSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbGVuZ3RoID0gaWR4ID49IDAgPyBNYXRoLm1pbihpZHggKyAxLCBsZW5ndGgpIDogaWR4ICsgbGVuZ3RoICsgMTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzb3J0ZWRJbmRleCAmJiBpZHggJiYgbGVuZ3RoKSB7XG4gICAgICAgIGlkeCA9IHNvcnRlZEluZGV4KGFycmF5LCBpdGVtKTtcbiAgICAgICAgcmV0dXJuIGFycmF5W2lkeF0gPT09IGl0ZW0gPyBpZHggOiAtMTtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVtICE9PSBpdGVtKSB7XG4gICAgICAgIGlkeCA9IHByZWRpY2F0ZUZpbmQoc2xpY2UuY2FsbChhcnJheSwgaSwgbGVuZ3RoKSwgXy5pc05hTik7XG4gICAgICAgIHJldHVybiBpZHggPj0gMCA/IGlkeCArIGkgOiAtMTtcbiAgICAgIH1cbiAgICAgIGZvciAoaWR4ID0gZGlyID4gMCA/IGkgOiBsZW5ndGggLSAxOyBpZHggPj0gMCAmJiBpZHggPCBsZW5ndGg7IGlkeCArPSBkaXIpIHtcbiAgICAgICAgaWYgKGFycmF5W2lkeF0gPT09IGl0ZW0pIHJldHVybiBpZHg7XG4gICAgICB9XG4gICAgICByZXR1cm4gLTE7XG4gICAgfTtcbiAgfTtcblxuICAvLyBSZXR1cm4gdGhlIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIGFuIGl0ZW0gaW4gYW4gYXJyYXksXG4gIC8vIG9yIC0xIGlmIHRoZSBpdGVtIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgYXJyYXkuXG4gIC8vIElmIHRoZSBhcnJheSBpcyBsYXJnZSBhbmQgYWxyZWFkeSBpbiBzb3J0IG9yZGVyLCBwYXNzIGB0cnVlYFxuICAvLyBmb3IgKippc1NvcnRlZCoqIHRvIHVzZSBiaW5hcnkgc2VhcmNoLlxuICBfLmluZGV4T2YgPSBjcmVhdGVJbmRleEZpbmRlcigxLCBfLmZpbmRJbmRleCwgXy5zb3J0ZWRJbmRleCk7XG4gIF8ubGFzdEluZGV4T2YgPSBjcmVhdGVJbmRleEZpbmRlcigtMSwgXy5maW5kTGFzdEluZGV4KTtcblxuICAvLyBHZW5lcmF0ZSBhbiBpbnRlZ2VyIEFycmF5IGNvbnRhaW5pbmcgYW4gYXJpdGhtZXRpYyBwcm9ncmVzc2lvbi4gQSBwb3J0IG9mXG4gIC8vIHRoZSBuYXRpdmUgUHl0aG9uIGByYW5nZSgpYCBmdW5jdGlvbi4gU2VlXG4gIC8vIFt0aGUgUHl0aG9uIGRvY3VtZW50YXRpb25dKGh0dHA6Ly9kb2NzLnB5dGhvbi5vcmcvbGlicmFyeS9mdW5jdGlvbnMuaHRtbCNyYW5nZSkuXG4gIF8ucmFuZ2UgPSBmdW5jdGlvbihzdGFydCwgc3RvcCwgc3RlcCkge1xuICAgIGlmIChzdG9wID09IG51bGwpIHtcbiAgICAgIHN0b3AgPSBzdGFydCB8fCAwO1xuICAgICAgc3RhcnQgPSAwO1xuICAgIH1cbiAgICBpZiAoIXN0ZXApIHtcbiAgICAgIHN0ZXAgPSBzdG9wIDwgc3RhcnQgPyAtMSA6IDE7XG4gICAgfVxuXG4gICAgdmFyIGxlbmd0aCA9IE1hdGgubWF4KE1hdGguY2VpbCgoc3RvcCAtIHN0YXJ0KSAvIHN0ZXApLCAwKTtcbiAgICB2YXIgcmFuZ2UgPSBBcnJheShsZW5ndGgpO1xuXG4gICAgZm9yICh2YXIgaWR4ID0gMDsgaWR4IDwgbGVuZ3RoOyBpZHgrKywgc3RhcnQgKz0gc3RlcCkge1xuICAgICAgcmFuZ2VbaWR4XSA9IHN0YXJ0O1xuICAgIH1cblxuICAgIHJldHVybiByYW5nZTtcbiAgfTtcblxuICAvLyBDaHVuayBhIHNpbmdsZSBhcnJheSBpbnRvIG11bHRpcGxlIGFycmF5cywgZWFjaCBjb250YWluaW5nIGBjb3VudGAgb3IgZmV3ZXJcbiAgLy8gaXRlbXMuXG4gIF8uY2h1bmsgPSBmdW5jdGlvbihhcnJheSwgY291bnQpIHtcbiAgICBpZiAoY291bnQgPT0gbnVsbCB8fCBjb3VudCA8IDEpIHJldHVybiBbXTtcbiAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgdmFyIGkgPSAwLCBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG4gICAgd2hpbGUgKGkgPCBsZW5ndGgpIHtcbiAgICAgIHJlc3VsdC5wdXNoKHNsaWNlLmNhbGwoYXJyYXksIGksIGkgKz0gY291bnQpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICAvLyBGdW5jdGlvbiAoYWhlbSkgRnVuY3Rpb25zXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8vIERldGVybWluZXMgd2hldGhlciB0byBleGVjdXRlIGEgZnVuY3Rpb24gYXMgYSBjb25zdHJ1Y3RvclxuICAvLyBvciBhIG5vcm1hbCBmdW5jdGlvbiB3aXRoIHRoZSBwcm92aWRlZCBhcmd1bWVudHMuXG4gIHZhciBleGVjdXRlQm91bmQgPSBmdW5jdGlvbihzb3VyY2VGdW5jLCBib3VuZEZ1bmMsIGNvbnRleHQsIGNhbGxpbmdDb250ZXh0LCBhcmdzKSB7XG4gICAgaWYgKCEoY2FsbGluZ0NvbnRleHQgaW5zdGFuY2VvZiBib3VuZEZ1bmMpKSByZXR1cm4gc291cmNlRnVuYy5hcHBseShjb250ZXh0LCBhcmdzKTtcbiAgICB2YXIgc2VsZiA9IGJhc2VDcmVhdGUoc291cmNlRnVuYy5wcm90b3R5cGUpO1xuICAgIHZhciByZXN1bHQgPSBzb3VyY2VGdW5jLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICAgIGlmIChfLmlzT2JqZWN0KHJlc3VsdCkpIHJldHVybiByZXN1bHQ7XG4gICAgcmV0dXJuIHNlbGY7XG4gIH07XG5cbiAgLy8gQ3JlYXRlIGEgZnVuY3Rpb24gYm91bmQgdG8gYSBnaXZlbiBvYmplY3QgKGFzc2lnbmluZyBgdGhpc2AsIGFuZCBhcmd1bWVudHMsXG4gIC8vIG9wdGlvbmFsbHkpLiBEZWxlZ2F0ZXMgdG8gKipFQ01BU2NyaXB0IDUqKidzIG5hdGl2ZSBgRnVuY3Rpb24uYmluZGAgaWZcbiAgLy8gYXZhaWxhYmxlLlxuICBfLmJpbmQgPSByZXN0QXJndW1lbnRzKGZ1bmN0aW9uKGZ1bmMsIGNvbnRleHQsIGFyZ3MpIHtcbiAgICBpZiAoIV8uaXNGdW5jdGlvbihmdW5jKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignQmluZCBtdXN0IGJlIGNhbGxlZCBvbiBhIGZ1bmN0aW9uJyk7XG4gICAgdmFyIGJvdW5kID0gcmVzdEFyZ3VtZW50cyhmdW5jdGlvbihjYWxsQXJncykge1xuICAgICAgcmV0dXJuIGV4ZWN1dGVCb3VuZChmdW5jLCBib3VuZCwgY29udGV4dCwgdGhpcywgYXJncy5jb25jYXQoY2FsbEFyZ3MpKTtcbiAgICB9KTtcbiAgICByZXR1cm4gYm91bmQ7XG4gIH0pO1xuXG4gIC8vIFBhcnRpYWxseSBhcHBseSBhIGZ1bmN0aW9uIGJ5IGNyZWF0aW5nIGEgdmVyc2lvbiB0aGF0IGhhcyBoYWQgc29tZSBvZiBpdHNcbiAgLy8gYXJndW1lbnRzIHByZS1maWxsZWQsIHdpdGhvdXQgY2hhbmdpbmcgaXRzIGR5bmFtaWMgYHRoaXNgIGNvbnRleHQuIF8gYWN0c1xuICAvLyBhcyBhIHBsYWNlaG9sZGVyIGJ5IGRlZmF1bHQsIGFsbG93aW5nIGFueSBjb21iaW5hdGlvbiBvZiBhcmd1bWVudHMgdG8gYmVcbiAgLy8gcHJlLWZpbGxlZC4gU2V0IGBfLnBhcnRpYWwucGxhY2Vob2xkZXJgIGZvciBhIGN1c3RvbSBwbGFjZWhvbGRlciBhcmd1bWVudC5cbiAgXy5wYXJ0aWFsID0gcmVzdEFyZ3VtZW50cyhmdW5jdGlvbihmdW5jLCBib3VuZEFyZ3MpIHtcbiAgICB2YXIgcGxhY2Vob2xkZXIgPSBfLnBhcnRpYWwucGxhY2Vob2xkZXI7XG4gICAgdmFyIGJvdW5kID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgcG9zaXRpb24gPSAwLCBsZW5ndGggPSBib3VuZEFyZ3MubGVuZ3RoO1xuICAgICAgdmFyIGFyZ3MgPSBBcnJheShsZW5ndGgpO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICBhcmdzW2ldID0gYm91bmRBcmdzW2ldID09PSBwbGFjZWhvbGRlciA/IGFyZ3VtZW50c1twb3NpdGlvbisrXSA6IGJvdW5kQXJnc1tpXTtcbiAgICAgIH1cbiAgICAgIHdoaWxlIChwb3NpdGlvbiA8IGFyZ3VtZW50cy5sZW5ndGgpIGFyZ3MucHVzaChhcmd1bWVudHNbcG9zaXRpb24rK10pO1xuICAgICAgcmV0dXJuIGV4ZWN1dGVCb3VuZChmdW5jLCBib3VuZCwgdGhpcywgdGhpcywgYXJncyk7XG4gICAgfTtcbiAgICByZXR1cm4gYm91bmQ7XG4gIH0pO1xuXG4gIF8ucGFydGlhbC5wbGFjZWhvbGRlciA9IF87XG5cbiAgLy8gQmluZCBhIG51bWJlciBvZiBhbiBvYmplY3QncyBtZXRob2RzIHRvIHRoYXQgb2JqZWN0LiBSZW1haW5pbmcgYXJndW1lbnRzXG4gIC8vIGFyZSB0aGUgbWV0aG9kIG5hbWVzIHRvIGJlIGJvdW5kLiBVc2VmdWwgZm9yIGVuc3VyaW5nIHRoYXQgYWxsIGNhbGxiYWNrc1xuICAvLyBkZWZpbmVkIG9uIGFuIG9iamVjdCBiZWxvbmcgdG8gaXQuXG4gIF8uYmluZEFsbCA9IHJlc3RBcmd1bWVudHMoZnVuY3Rpb24ob2JqLCBrZXlzKSB7XG4gICAga2V5cyA9IGZsYXR0ZW4oa2V5cywgZmFsc2UsIGZhbHNlKTtcbiAgICB2YXIgaW5kZXggPSBrZXlzLmxlbmd0aDtcbiAgICBpZiAoaW5kZXggPCAxKSB0aHJvdyBuZXcgRXJyb3IoJ2JpbmRBbGwgbXVzdCBiZSBwYXNzZWQgZnVuY3Rpb24gbmFtZXMnKTtcbiAgICB3aGlsZSAoaW5kZXgtLSkge1xuICAgICAgdmFyIGtleSA9IGtleXNbaW5kZXhdO1xuICAgICAgb2JqW2tleV0gPSBfLmJpbmQob2JqW2tleV0sIG9iaik7XG4gICAgfVxuICB9KTtcblxuICAvLyBNZW1vaXplIGFuIGV4cGVuc2l2ZSBmdW5jdGlvbiBieSBzdG9yaW5nIGl0cyByZXN1bHRzLlxuICBfLm1lbW9pemUgPSBmdW5jdGlvbihmdW5jLCBoYXNoZXIpIHtcbiAgICB2YXIgbWVtb2l6ZSA9IGZ1bmN0aW9uKGtleSkge1xuICAgICAgdmFyIGNhY2hlID0gbWVtb2l6ZS5jYWNoZTtcbiAgICAgIHZhciBhZGRyZXNzID0gJycgKyAoaGFzaGVyID8gaGFzaGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiBrZXkpO1xuICAgICAgaWYgKCFoYXMoY2FjaGUsIGFkZHJlc3MpKSBjYWNoZVthZGRyZXNzXSA9IGZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIHJldHVybiBjYWNoZVthZGRyZXNzXTtcbiAgICB9O1xuICAgIG1lbW9pemUuY2FjaGUgPSB7fTtcbiAgICByZXR1cm4gbWVtb2l6ZTtcbiAgfTtcblxuICAvLyBEZWxheXMgYSBmdW5jdGlvbiBmb3IgdGhlIGdpdmVuIG51bWJlciBvZiBtaWxsaXNlY29uZHMsIGFuZCB0aGVuIGNhbGxzXG4gIC8vIGl0IHdpdGggdGhlIGFyZ3VtZW50cyBzdXBwbGllZC5cbiAgXy5kZWxheSA9IHJlc3RBcmd1bWVudHMoZnVuY3Rpb24oZnVuYywgd2FpdCwgYXJncykge1xuICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkobnVsbCwgYXJncyk7XG4gICAgfSwgd2FpdCk7XG4gIH0pO1xuXG4gIC8vIERlZmVycyBhIGZ1bmN0aW9uLCBzY2hlZHVsaW5nIGl0IHRvIHJ1biBhZnRlciB0aGUgY3VycmVudCBjYWxsIHN0YWNrIGhhc1xuICAvLyBjbGVhcmVkLlxuICBfLmRlZmVyID0gXy5wYXJ0aWFsKF8uZGVsYXksIF8sIDEpO1xuXG4gIC8vIFJldHVybnMgYSBmdW5jdGlvbiwgdGhhdCwgd2hlbiBpbnZva2VkLCB3aWxsIG9ubHkgYmUgdHJpZ2dlcmVkIGF0IG1vc3Qgb25jZVxuICAvLyBkdXJpbmcgYSBnaXZlbiB3aW5kb3cgb2YgdGltZS4gTm9ybWFsbHksIHRoZSB0aHJvdHRsZWQgZnVuY3Rpb24gd2lsbCBydW5cbiAgLy8gYXMgbXVjaCBhcyBpdCBjYW4sIHdpdGhvdXQgZXZlciBnb2luZyBtb3JlIHRoYW4gb25jZSBwZXIgYHdhaXRgIGR1cmF0aW9uO1xuICAvLyBidXQgaWYgeW91J2QgbGlrZSB0byBkaXNhYmxlIHRoZSBleGVjdXRpb24gb24gdGhlIGxlYWRpbmcgZWRnZSwgcGFzc1xuICAvLyBge2xlYWRpbmc6IGZhbHNlfWAuIFRvIGRpc2FibGUgZXhlY3V0aW9uIG9uIHRoZSB0cmFpbGluZyBlZGdlLCBkaXR0by5cbiAgXy50aHJvdHRsZSA9IGZ1bmN0aW9uKGZ1bmMsIHdhaXQsIG9wdGlvbnMpIHtcbiAgICB2YXIgdGltZW91dCwgY29udGV4dCwgYXJncywgcmVzdWx0O1xuICAgIHZhciBwcmV2aW91cyA9IDA7XG4gICAgaWYgKCFvcHRpb25zKSBvcHRpb25zID0ge307XG5cbiAgICB2YXIgbGF0ZXIgPSBmdW5jdGlvbigpIHtcbiAgICAgIHByZXZpb3VzID0gb3B0aW9ucy5sZWFkaW5nID09PSBmYWxzZSA/IDAgOiBfLm5vdygpO1xuICAgICAgdGltZW91dCA9IG51bGw7XG4gICAgICByZXN1bHQgPSBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xuICAgICAgaWYgKCF0aW1lb3V0KSBjb250ZXh0ID0gYXJncyA9IG51bGw7XG4gICAgfTtcblxuICAgIHZhciB0aHJvdHRsZWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBub3cgPSBfLm5vdygpO1xuICAgICAgaWYgKCFwcmV2aW91cyAmJiBvcHRpb25zLmxlYWRpbmcgPT09IGZhbHNlKSBwcmV2aW91cyA9IG5vdztcbiAgICAgIHZhciByZW1haW5pbmcgPSB3YWl0IC0gKG5vdyAtIHByZXZpb3VzKTtcbiAgICAgIGNvbnRleHQgPSB0aGlzO1xuICAgICAgYXJncyA9IGFyZ3VtZW50cztcbiAgICAgIGlmIChyZW1haW5pbmcgPD0gMCB8fCByZW1haW5pbmcgPiB3YWl0KSB7XG4gICAgICAgIGlmICh0aW1lb3V0KSB7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICAgIHRpbWVvdXQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHByZXZpb3VzID0gbm93O1xuICAgICAgICByZXN1bHQgPSBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xuICAgICAgICBpZiAoIXRpbWVvdXQpIGNvbnRleHQgPSBhcmdzID0gbnVsbDtcbiAgICAgIH0gZWxzZSBpZiAoIXRpbWVvdXQgJiYgb3B0aW9ucy50cmFpbGluZyAhPT0gZmFsc2UpIHtcbiAgICAgICAgdGltZW91dCA9IHNldFRpbWVvdXQobGF0ZXIsIHJlbWFpbmluZyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgICB0aHJvdHRsZWQuY2FuY2VsID0gZnVuY3Rpb24oKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICBwcmV2aW91cyA9IDA7XG4gICAgICB0aW1lb3V0ID0gY29udGV4dCA9IGFyZ3MgPSBudWxsO1xuICAgIH07XG5cbiAgICByZXR1cm4gdGhyb3R0bGVkO1xuICB9O1xuXG4gIC8vIFJldHVybnMgYSBmdW5jdGlvbiwgdGhhdCwgYXMgbG9uZyBhcyBpdCBjb250aW51ZXMgdG8gYmUgaW52b2tlZCwgd2lsbCBub3RcbiAgLy8gYmUgdHJpZ2dlcmVkLiBUaGUgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgYWZ0ZXIgaXQgc3RvcHMgYmVpbmcgY2FsbGVkIGZvclxuICAvLyBOIG1pbGxpc2Vjb25kcy4gSWYgYGltbWVkaWF0ZWAgaXMgcGFzc2VkLCB0cmlnZ2VyIHRoZSBmdW5jdGlvbiBvbiB0aGVcbiAgLy8gbGVhZGluZyBlZGdlLCBpbnN0ZWFkIG9mIHRoZSB0cmFpbGluZy5cbiAgXy5kZWJvdW5jZSA9IGZ1bmN0aW9uKGZ1bmMsIHdhaXQsIGltbWVkaWF0ZSkge1xuICAgIHZhciB0aW1lb3V0LCByZXN1bHQ7XG5cbiAgICB2YXIgbGF0ZXIgPSBmdW5jdGlvbihjb250ZXh0LCBhcmdzKSB7XG4gICAgICB0aW1lb3V0ID0gbnVsbDtcbiAgICAgIGlmIChhcmdzKSByZXN1bHQgPSBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xuICAgIH07XG5cbiAgICB2YXIgZGVib3VuY2VkID0gcmVzdEFyZ3VtZW50cyhmdW5jdGlvbihhcmdzKSB7XG4gICAgICBpZiAodGltZW91dCkgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgaWYgKGltbWVkaWF0ZSkge1xuICAgICAgICB2YXIgY2FsbE5vdyA9ICF0aW1lb3V0O1xuICAgICAgICB0aW1lb3V0ID0gc2V0VGltZW91dChsYXRlciwgd2FpdCk7XG4gICAgICAgIGlmIChjYWxsTm93KSByZXN1bHQgPSBmdW5jLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGltZW91dCA9IF8uZGVsYXkobGF0ZXIsIHdhaXQsIHRoaXMsIGFyZ3MpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuXG4gICAgZGVib3VuY2VkLmNhbmNlbCA9IGZ1bmN0aW9uKCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgdGltZW91dCA9IG51bGw7XG4gICAgfTtcblxuICAgIHJldHVybiBkZWJvdW5jZWQ7XG4gIH07XG5cbiAgLy8gUmV0dXJucyB0aGUgZmlyc3QgZnVuY3Rpb24gcGFzc2VkIGFzIGFuIGFyZ3VtZW50IHRvIHRoZSBzZWNvbmQsXG4gIC8vIGFsbG93aW5nIHlvdSB0byBhZGp1c3QgYXJndW1lbnRzLCBydW4gY29kZSBiZWZvcmUgYW5kIGFmdGVyLCBhbmRcbiAgLy8gY29uZGl0aW9uYWxseSBleGVjdXRlIHRoZSBvcmlnaW5hbCBmdW5jdGlvbi5cbiAgXy53cmFwID0gZnVuY3Rpb24oZnVuYywgd3JhcHBlcikge1xuICAgIHJldHVybiBfLnBhcnRpYWwod3JhcHBlciwgZnVuYyk7XG4gIH07XG5cbiAgLy8gUmV0dXJucyBhIG5lZ2F0ZWQgdmVyc2lvbiBvZiB0aGUgcGFzc2VkLWluIHByZWRpY2F0ZS5cbiAgXy5uZWdhdGUgPSBmdW5jdGlvbihwcmVkaWNhdGUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gIXByZWRpY2F0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG4gIH07XG5cbiAgLy8gUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgaXMgdGhlIGNvbXBvc2l0aW9uIG9mIGEgbGlzdCBvZiBmdW5jdGlvbnMsIGVhY2hcbiAgLy8gY29uc3VtaW5nIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGZ1bmN0aW9uIHRoYXQgZm9sbG93cy5cbiAgXy5jb21wb3NlID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgdmFyIHN0YXJ0ID0gYXJncy5sZW5ndGggLSAxO1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBpID0gc3RhcnQ7XG4gICAgICB2YXIgcmVzdWx0ID0gYXJnc1tzdGFydF0uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIHdoaWxlIChpLS0pIHJlc3VsdCA9IGFyZ3NbaV0uY2FsbCh0aGlzLCByZXN1bHQpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICB9O1xuXG4gIC8vIFJldHVybnMgYSBmdW5jdGlvbiB0aGF0IHdpbGwgb25seSBiZSBleGVjdXRlZCBvbiBhbmQgYWZ0ZXIgdGhlIE50aCBjYWxsLlxuICBfLmFmdGVyID0gZnVuY3Rpb24odGltZXMsIGZ1bmMpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoLS10aW1lcyA8IDEpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cbiAgICB9O1xuICB9O1xuXG4gIC8vIFJldHVybnMgYSBmdW5jdGlvbiB0aGF0IHdpbGwgb25seSBiZSBleGVjdXRlZCB1cCB0byAoYnV0IG5vdCBpbmNsdWRpbmcpIHRoZSBOdGggY2FsbC5cbiAgXy5iZWZvcmUgPSBmdW5jdGlvbih0aW1lcywgZnVuYykge1xuICAgIHZhciBtZW1vO1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIGlmICgtLXRpbWVzID4gMCkge1xuICAgICAgICBtZW1vID0gZnVuYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuICAgICAgaWYgKHRpbWVzIDw9IDEpIGZ1bmMgPSBudWxsO1xuICAgICAgcmV0dXJuIG1lbW87XG4gICAgfTtcbiAgfTtcblxuICAvLyBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIGF0IG1vc3Qgb25lIHRpbWUsIG5vIG1hdHRlciBob3dcbiAgLy8gb2Z0ZW4geW91IGNhbGwgaXQuIFVzZWZ1bCBmb3IgbGF6eSBpbml0aWFsaXphdGlvbi5cbiAgXy5vbmNlID0gXy5wYXJ0aWFsKF8uYmVmb3JlLCAyKTtcblxuICBfLnJlc3RBcmd1bWVudHMgPSByZXN0QXJndW1lbnRzO1xuXG4gIC8vIE9iamVjdCBGdW5jdGlvbnNcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8vIEtleXMgaW4gSUUgPCA5IHRoYXQgd29uJ3QgYmUgaXRlcmF0ZWQgYnkgYGZvciBrZXkgaW4gLi4uYCBhbmQgdGh1cyBtaXNzZWQuXG4gIHZhciBoYXNFbnVtQnVnID0gIXt0b1N0cmluZzogbnVsbH0ucHJvcGVydHlJc0VudW1lcmFibGUoJ3RvU3RyaW5nJyk7XG4gIHZhciBub25FbnVtZXJhYmxlUHJvcHMgPSBbJ3ZhbHVlT2YnLCAnaXNQcm90b3R5cGVPZicsICd0b1N0cmluZycsXG4gICAgJ3Byb3BlcnR5SXNFbnVtZXJhYmxlJywgJ2hhc093blByb3BlcnR5JywgJ3RvTG9jYWxlU3RyaW5nJ107XG5cbiAgdmFyIGNvbGxlY3ROb25FbnVtUHJvcHMgPSBmdW5jdGlvbihvYmosIGtleXMpIHtcbiAgICB2YXIgbm9uRW51bUlkeCA9IG5vbkVudW1lcmFibGVQcm9wcy5sZW5ndGg7XG4gICAgdmFyIGNvbnN0cnVjdG9yID0gb2JqLmNvbnN0cnVjdG9yO1xuICAgIHZhciBwcm90byA9IF8uaXNGdW5jdGlvbihjb25zdHJ1Y3RvcikgJiYgY29uc3RydWN0b3IucHJvdG90eXBlIHx8IE9ialByb3RvO1xuXG4gICAgLy8gQ29uc3RydWN0b3IgaXMgYSBzcGVjaWFsIGNhc2UuXG4gICAgdmFyIHByb3AgPSAnY29uc3RydWN0b3InO1xuICAgIGlmIChoYXMob2JqLCBwcm9wKSAmJiAhXy5jb250YWlucyhrZXlzLCBwcm9wKSkga2V5cy5wdXNoKHByb3ApO1xuXG4gICAgd2hpbGUgKG5vbkVudW1JZHgtLSkge1xuICAgICAgcHJvcCA9IG5vbkVudW1lcmFibGVQcm9wc1tub25FbnVtSWR4XTtcbiAgICAgIGlmIChwcm9wIGluIG9iaiAmJiBvYmpbcHJvcF0gIT09IHByb3RvW3Byb3BdICYmICFfLmNvbnRhaW5zKGtleXMsIHByb3ApKSB7XG4gICAgICAgIGtleXMucHVzaChwcm9wKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLy8gUmV0cmlldmUgdGhlIG5hbWVzIG9mIGFuIG9iamVjdCdzIG93biBwcm9wZXJ0aWVzLlxuICAvLyBEZWxlZ2F0ZXMgdG8gKipFQ01BU2NyaXB0IDUqKidzIG5hdGl2ZSBgT2JqZWN0LmtleXNgLlxuICBfLmtleXMgPSBmdW5jdGlvbihvYmopIHtcbiAgICBpZiAoIV8uaXNPYmplY3Qob2JqKSkgcmV0dXJuIFtdO1xuICAgIGlmIChuYXRpdmVLZXlzKSByZXR1cm4gbmF0aXZlS2V5cyhvYmopO1xuICAgIHZhciBrZXlzID0gW107XG4gICAgZm9yICh2YXIga2V5IGluIG9iaikgaWYgKGhhcyhvYmosIGtleSkpIGtleXMucHVzaChrZXkpO1xuICAgIC8vIEFoZW0sIElFIDwgOS5cbiAgICBpZiAoaGFzRW51bUJ1ZykgY29sbGVjdE5vbkVudW1Qcm9wcyhvYmosIGtleXMpO1xuICAgIHJldHVybiBrZXlzO1xuICB9O1xuXG4gIC8vIFJldHJpZXZlIGFsbCB0aGUgcHJvcGVydHkgbmFtZXMgb2YgYW4gb2JqZWN0LlxuICBfLmFsbEtleXMgPSBmdW5jdGlvbihvYmopIHtcbiAgICBpZiAoIV8uaXNPYmplY3Qob2JqKSkgcmV0dXJuIFtdO1xuICAgIHZhciBrZXlzID0gW107XG4gICAgZm9yICh2YXIga2V5IGluIG9iaikga2V5cy5wdXNoKGtleSk7XG4gICAgLy8gQWhlbSwgSUUgPCA5LlxuICAgIGlmIChoYXNFbnVtQnVnKSBjb2xsZWN0Tm9uRW51bVByb3BzKG9iaiwga2V5cyk7XG4gICAgcmV0dXJuIGtleXM7XG4gIH07XG5cbiAgLy8gUmV0cmlldmUgdGhlIHZhbHVlcyBvZiBhbiBvYmplY3QncyBwcm9wZXJ0aWVzLlxuICBfLnZhbHVlcyA9IGZ1bmN0aW9uKG9iaikge1xuICAgIHZhciBrZXlzID0gXy5rZXlzKG9iaik7XG4gICAgdmFyIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICAgIHZhciB2YWx1ZXMgPSBBcnJheShsZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhbHVlc1tpXSA9IG9ialtrZXlzW2ldXTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlcztcbiAgfTtcblxuICAvLyBSZXR1cm5zIHRoZSByZXN1bHRzIG9mIGFwcGx5aW5nIHRoZSBpdGVyYXRlZSB0byBlYWNoIGVsZW1lbnQgb2YgdGhlIG9iamVjdC5cbiAgLy8gSW4gY29udHJhc3QgdG8gXy5tYXAgaXQgcmV0dXJucyBhbiBvYmplY3QuXG4gIF8ubWFwT2JqZWN0ID0gZnVuY3Rpb24ob2JqLCBpdGVyYXRlZSwgY29udGV4dCkge1xuICAgIGl0ZXJhdGVlID0gY2IoaXRlcmF0ZWUsIGNvbnRleHQpO1xuICAgIHZhciBrZXlzID0gXy5rZXlzKG9iaiksXG4gICAgICAgIGxlbmd0aCA9IGtleXMubGVuZ3RoLFxuICAgICAgICByZXN1bHRzID0ge307XG4gICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgdmFyIGN1cnJlbnRLZXkgPSBrZXlzW2luZGV4XTtcbiAgICAgIHJlc3VsdHNbY3VycmVudEtleV0gPSBpdGVyYXRlZShvYmpbY3VycmVudEtleV0sIGN1cnJlbnRLZXksIG9iaik7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHRzO1xuICB9O1xuXG4gIC8vIENvbnZlcnQgYW4gb2JqZWN0IGludG8gYSBsaXN0IG9mIGBba2V5LCB2YWx1ZV1gIHBhaXJzLlxuICAvLyBUaGUgb3Bwb3NpdGUgb2YgXy5vYmplY3QuXG4gIF8ucGFpcnMgPSBmdW5jdGlvbihvYmopIHtcbiAgICB2YXIga2V5cyA9IF8ua2V5cyhvYmopO1xuICAgIHZhciBsZW5ndGggPSBrZXlzLmxlbmd0aDtcbiAgICB2YXIgcGFpcnMgPSBBcnJheShsZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIHBhaXJzW2ldID0gW2tleXNbaV0sIG9ialtrZXlzW2ldXV07XG4gICAgfVxuICAgIHJldHVybiBwYWlycztcbiAgfTtcblxuICAvLyBJbnZlcnQgdGhlIGtleXMgYW5kIHZhbHVlcyBvZiBhbiBvYmplY3QuIFRoZSB2YWx1ZXMgbXVzdCBiZSBzZXJpYWxpemFibGUuXG4gIF8uaW52ZXJ0ID0gZnVuY3Rpb24ob2JqKSB7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIHZhciBrZXlzID0gXy5rZXlzKG9iaik7XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IGtleXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlc3VsdFtvYmpba2V5c1tpXV1dID0ga2V5c1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICAvLyBSZXR1cm4gYSBzb3J0ZWQgbGlzdCBvZiB0aGUgZnVuY3Rpb24gbmFtZXMgYXZhaWxhYmxlIG9uIHRoZSBvYmplY3QuXG4gIC8vIEFsaWFzZWQgYXMgYG1ldGhvZHNgLlxuICBfLmZ1bmN0aW9ucyA9IF8ubWV0aG9kcyA9IGZ1bmN0aW9uKG9iaikge1xuICAgIHZhciBuYW1lcyA9IFtdO1xuICAgIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICAgIGlmIChfLmlzRnVuY3Rpb24ob2JqW2tleV0pKSBuYW1lcy5wdXNoKGtleSk7XG4gICAgfVxuICAgIHJldHVybiBuYW1lcy5zb3J0KCk7XG4gIH07XG5cbiAgLy8gQW4gaW50ZXJuYWwgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGFzc2lnbmVyIGZ1bmN0aW9ucy5cbiAgdmFyIGNyZWF0ZUFzc2lnbmVyID0gZnVuY3Rpb24oa2V5c0Z1bmMsIGRlZmF1bHRzKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKG9iaikge1xuICAgICAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgICBpZiAoZGVmYXVsdHMpIG9iaiA9IE9iamVjdChvYmopO1xuICAgICAgaWYgKGxlbmd0aCA8IDIgfHwgb2JqID09IG51bGwpIHJldHVybiBvYmo7XG4gICAgICBmb3IgKHZhciBpbmRleCA9IDE7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaW5kZXhdLFxuICAgICAgICAgICAga2V5cyA9IGtleXNGdW5jKHNvdXJjZSksXG4gICAgICAgICAgICBsID0ga2V5cy5sZW5ndGg7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGtleSA9IGtleXNbaV07XG4gICAgICAgICAgaWYgKCFkZWZhdWx0cyB8fCBvYmpba2V5XSA9PT0gdm9pZCAwKSBvYmpba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqO1xuICAgIH07XG4gIH07XG5cbiAgLy8gRXh0ZW5kIGEgZ2l2ZW4gb2JqZWN0IHdpdGggYWxsIHRoZSBwcm9wZXJ0aWVzIGluIHBhc3NlZC1pbiBvYmplY3QocykuXG4gIF8uZXh0ZW5kID0gY3JlYXRlQXNzaWduZXIoXy5hbGxLZXlzKTtcblxuICAvLyBBc3NpZ25zIGEgZ2l2ZW4gb2JqZWN0IHdpdGggYWxsIHRoZSBvd24gcHJvcGVydGllcyBpbiB0aGUgcGFzc2VkLWluIG9iamVjdChzKS5cbiAgLy8gKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdC9hc3NpZ24pXG4gIF8uZXh0ZW5kT3duID0gXy5hc3NpZ24gPSBjcmVhdGVBc3NpZ25lcihfLmtleXMpO1xuXG4gIC8vIFJldHVybnMgdGhlIGZpcnN0IGtleSBvbiBhbiBvYmplY3QgdGhhdCBwYXNzZXMgYSBwcmVkaWNhdGUgdGVzdC5cbiAgXy5maW5kS2V5ID0gZnVuY3Rpb24ob2JqLCBwcmVkaWNhdGUsIGNvbnRleHQpIHtcbiAgICBwcmVkaWNhdGUgPSBjYihwcmVkaWNhdGUsIGNvbnRleHQpO1xuICAgIHZhciBrZXlzID0gXy5rZXlzKG9iaiksIGtleTtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0ga2V5cy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAga2V5ID0ga2V5c1tpXTtcbiAgICAgIGlmIChwcmVkaWNhdGUob2JqW2tleV0sIGtleSwgb2JqKSkgcmV0dXJuIGtleTtcbiAgICB9XG4gIH07XG5cbiAgLy8gSW50ZXJuYWwgcGljayBoZWxwZXIgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGlmIGBvYmpgIGhhcyBrZXkgYGtleWAuXG4gIHZhciBrZXlJbk9iaiA9IGZ1bmN0aW9uKHZhbHVlLCBrZXksIG9iaikge1xuICAgIHJldHVybiBrZXkgaW4gb2JqO1xuICB9O1xuXG4gIC8vIFJldHVybiBhIGNvcHkgb2YgdGhlIG9iamVjdCBvbmx5IGNvbnRhaW5pbmcgdGhlIHdoaXRlbGlzdGVkIHByb3BlcnRpZXMuXG4gIF8ucGljayA9IHJlc3RBcmd1bWVudHMoZnVuY3Rpb24ob2JqLCBrZXlzKSB7XG4gICAgdmFyIHJlc3VsdCA9IHt9LCBpdGVyYXRlZSA9IGtleXNbMF07XG4gICAgaWYgKG9iaiA9PSBudWxsKSByZXR1cm4gcmVzdWx0O1xuICAgIGlmIChfLmlzRnVuY3Rpb24oaXRlcmF0ZWUpKSB7XG4gICAgICBpZiAoa2V5cy5sZW5ndGggPiAxKSBpdGVyYXRlZSA9IG9wdGltaXplQ2IoaXRlcmF0ZWUsIGtleXNbMV0pO1xuICAgICAga2V5cyA9IF8uYWxsS2V5cyhvYmopO1xuICAgIH0gZWxzZSB7XG4gICAgICBpdGVyYXRlZSA9IGtleUluT2JqO1xuICAgICAga2V5cyA9IGZsYXR0ZW4oa2V5cywgZmFsc2UsIGZhbHNlKTtcbiAgICAgIG9iaiA9IE9iamVjdChvYmopO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0ga2V5cy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGtleSA9IGtleXNbaV07XG4gICAgICB2YXIgdmFsdWUgPSBvYmpba2V5XTtcbiAgICAgIGlmIChpdGVyYXRlZSh2YWx1ZSwga2V5LCBvYmopKSByZXN1bHRba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9KTtcblxuICAvLyBSZXR1cm4gYSBjb3B5IG9mIHRoZSBvYmplY3Qgd2l0aG91dCB0aGUgYmxhY2tsaXN0ZWQgcHJvcGVydGllcy5cbiAgXy5vbWl0ID0gcmVzdEFyZ3VtZW50cyhmdW5jdGlvbihvYmosIGtleXMpIHtcbiAgICB2YXIgaXRlcmF0ZWUgPSBrZXlzWzBdLCBjb250ZXh0O1xuICAgIGlmIChfLmlzRnVuY3Rpb24oaXRlcmF0ZWUpKSB7XG4gICAgICBpdGVyYXRlZSA9IF8ubmVnYXRlKGl0ZXJhdGVlKTtcbiAgICAgIGlmIChrZXlzLmxlbmd0aCA+IDEpIGNvbnRleHQgPSBrZXlzWzFdO1xuICAgIH0gZWxzZSB7XG4gICAgICBrZXlzID0gXy5tYXAoZmxhdHRlbihrZXlzLCBmYWxzZSwgZmFsc2UpLCBTdHJpbmcpO1xuICAgICAgaXRlcmF0ZWUgPSBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICAgIHJldHVybiAhXy5jb250YWlucyhrZXlzLCBrZXkpO1xuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIF8ucGljayhvYmosIGl0ZXJhdGVlLCBjb250ZXh0KTtcbiAgfSk7XG5cbiAgLy8gRmlsbCBpbiBhIGdpdmVuIG9iamVjdCB3aXRoIGRlZmF1bHQgcHJvcGVydGllcy5cbiAgXy5kZWZhdWx0cyA9IGNyZWF0ZUFzc2lnbmVyKF8uYWxsS2V5cywgdHJ1ZSk7XG5cbiAgLy8gQ3JlYXRlcyBhbiBvYmplY3QgdGhhdCBpbmhlcml0cyBmcm9tIHRoZSBnaXZlbiBwcm90b3R5cGUgb2JqZWN0LlxuICAvLyBJZiBhZGRpdGlvbmFsIHByb3BlcnRpZXMgYXJlIHByb3ZpZGVkIHRoZW4gdGhleSB3aWxsIGJlIGFkZGVkIHRvIHRoZVxuICAvLyBjcmVhdGVkIG9iamVjdC5cbiAgXy5jcmVhdGUgPSBmdW5jdGlvbihwcm90b3R5cGUsIHByb3BzKSB7XG4gICAgdmFyIHJlc3VsdCA9IGJhc2VDcmVhdGUocHJvdG90eXBlKTtcbiAgICBpZiAocHJvcHMpIF8uZXh0ZW5kT3duKHJlc3VsdCwgcHJvcHMpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgLy8gQ3JlYXRlIGEgKHNoYWxsb3ctY2xvbmVkKSBkdXBsaWNhdGUgb2YgYW4gb2JqZWN0LlxuICBfLmNsb25lID0gZnVuY3Rpb24ob2JqKSB7XG4gICAgaWYgKCFfLmlzT2JqZWN0KG9iaikpIHJldHVybiBvYmo7XG4gICAgcmV0dXJuIF8uaXNBcnJheShvYmopID8gb2JqLnNsaWNlKCkgOiBfLmV4dGVuZCh7fSwgb2JqKTtcbiAgfTtcblxuICAvLyBJbnZva2VzIGludGVyY2VwdG9yIHdpdGggdGhlIG9iaiwgYW5kIHRoZW4gcmV0dXJucyBvYmouXG4gIC8vIFRoZSBwcmltYXJ5IHB1cnBvc2Ugb2YgdGhpcyBtZXRob2QgaXMgdG8gXCJ0YXAgaW50b1wiIGEgbWV0aG9kIGNoYWluLCBpblxuICAvLyBvcmRlciB0byBwZXJmb3JtIG9wZXJhdGlvbnMgb24gaW50ZXJtZWRpYXRlIHJlc3VsdHMgd2l0aGluIHRoZSBjaGFpbi5cbiAgXy50YXAgPSBmdW5jdGlvbihvYmosIGludGVyY2VwdG9yKSB7XG4gICAgaW50ZXJjZXB0b3Iob2JqKTtcbiAgICByZXR1cm4gb2JqO1xuICB9O1xuXG4gIC8vIFJldHVybnMgd2hldGhlciBhbiBvYmplY3QgaGFzIGEgZ2l2ZW4gc2V0IG9mIGBrZXk6dmFsdWVgIHBhaXJzLlxuICBfLmlzTWF0Y2ggPSBmdW5jdGlvbihvYmplY3QsIGF0dHJzKSB7XG4gICAgdmFyIGtleXMgPSBfLmtleXMoYXR0cnMpLCBsZW5ndGggPSBrZXlzLmxlbmd0aDtcbiAgICBpZiAob2JqZWN0ID09IG51bGwpIHJldHVybiAhbGVuZ3RoO1xuICAgIHZhciBvYmogPSBPYmplY3Qob2JqZWN0KTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIga2V5ID0ga2V5c1tpXTtcbiAgICAgIGlmIChhdHRyc1trZXldICE9PSBvYmpba2V5XSB8fCAhKGtleSBpbiBvYmopKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9O1xuXG5cbiAgLy8gSW50ZXJuYWwgcmVjdXJzaXZlIGNvbXBhcmlzb24gZnVuY3Rpb24gZm9yIGBpc0VxdWFsYC5cbiAgdmFyIGVxLCBkZWVwRXE7XG4gIGVxID0gZnVuY3Rpb24oYSwgYiwgYVN0YWNrLCBiU3RhY2spIHtcbiAgICAvLyBJZGVudGljYWwgb2JqZWN0cyBhcmUgZXF1YWwuIGAwID09PSAtMGAsIGJ1dCB0aGV5IGFyZW4ndCBpZGVudGljYWwuXG4gICAgLy8gU2VlIHRoZSBbSGFybW9ueSBgZWdhbGAgcHJvcG9zYWxdKGh0dHA6Ly93aWtpLmVjbWFzY3JpcHQub3JnL2Rva3UucGhwP2lkPWhhcm1vbnk6ZWdhbCkuXG4gICAgaWYgKGEgPT09IGIpIHJldHVybiBhICE9PSAwIHx8IDEgLyBhID09PSAxIC8gYjtcbiAgICAvLyBgbnVsbGAgb3IgYHVuZGVmaW5lZGAgb25seSBlcXVhbCB0byBpdHNlbGYgKHN0cmljdCBjb21wYXJpc29uKS5cbiAgICBpZiAoYSA9PSBudWxsIHx8IGIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICAgIC8vIGBOYU5gcyBhcmUgZXF1aXZhbGVudCwgYnV0IG5vbi1yZWZsZXhpdmUuXG4gICAgaWYgKGEgIT09IGEpIHJldHVybiBiICE9PSBiO1xuICAgIC8vIEV4aGF1c3QgcHJpbWl0aXZlIGNoZWNrc1xuICAgIHZhciB0eXBlID0gdHlwZW9mIGE7XG4gICAgaWYgKHR5cGUgIT09ICdmdW5jdGlvbicgJiYgdHlwZSAhPT0gJ29iamVjdCcgJiYgdHlwZW9mIGIgIT0gJ29iamVjdCcpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gZGVlcEVxKGEsIGIsIGFTdGFjaywgYlN0YWNrKTtcbiAgfTtcblxuICAvLyBJbnRlcm5hbCByZWN1cnNpdmUgY29tcGFyaXNvbiBmdW5jdGlvbiBmb3IgYGlzRXF1YWxgLlxuICBkZWVwRXEgPSBmdW5jdGlvbihhLCBiLCBhU3RhY2ssIGJTdGFjaykge1xuICAgIC8vIFVud3JhcCBhbnkgd3JhcHBlZCBvYmplY3RzLlxuICAgIGlmIChhIGluc3RhbmNlb2YgXykgYSA9IGEuX3dyYXBwZWQ7XG4gICAgaWYgKGIgaW5zdGFuY2VvZiBfKSBiID0gYi5fd3JhcHBlZDtcbiAgICAvLyBDb21wYXJlIGBbW0NsYXNzXV1gIG5hbWVzLlxuICAgIHZhciBjbGFzc05hbWUgPSB0b1N0cmluZy5jYWxsKGEpO1xuICAgIGlmIChjbGFzc05hbWUgIT09IHRvU3RyaW5nLmNhbGwoYikpIHJldHVybiBmYWxzZTtcbiAgICBzd2l0Y2ggKGNsYXNzTmFtZSkge1xuICAgICAgLy8gU3RyaW5ncywgbnVtYmVycywgcmVndWxhciBleHByZXNzaW9ucywgZGF0ZXMsIGFuZCBib29sZWFucyBhcmUgY29tcGFyZWQgYnkgdmFsdWUuXG4gICAgICBjYXNlICdbb2JqZWN0IFJlZ0V4cF0nOlxuICAgICAgLy8gUmVnRXhwcyBhcmUgY29lcmNlZCB0byBzdHJpbmdzIGZvciBjb21wYXJpc29uIChOb3RlOiAnJyArIC9hL2kgPT09ICcvYS9pJylcbiAgICAgIGNhc2UgJ1tvYmplY3QgU3RyaW5nXSc6XG4gICAgICAgIC8vIFByaW1pdGl2ZXMgYW5kIHRoZWlyIGNvcnJlc3BvbmRpbmcgb2JqZWN0IHdyYXBwZXJzIGFyZSBlcXVpdmFsZW50OyB0aHVzLCBgXCI1XCJgIGlzXG4gICAgICAgIC8vIGVxdWl2YWxlbnQgdG8gYG5ldyBTdHJpbmcoXCI1XCIpYC5cbiAgICAgICAgcmV0dXJuICcnICsgYSA9PT0gJycgKyBiO1xuICAgICAgY2FzZSAnW29iamVjdCBOdW1iZXJdJzpcbiAgICAgICAgLy8gYE5hTmBzIGFyZSBlcXVpdmFsZW50LCBidXQgbm9uLXJlZmxleGl2ZS5cbiAgICAgICAgLy8gT2JqZWN0KE5hTikgaXMgZXF1aXZhbGVudCB0byBOYU4uXG4gICAgICAgIGlmICgrYSAhPT0gK2EpIHJldHVybiArYiAhPT0gK2I7XG4gICAgICAgIC8vIEFuIGBlZ2FsYCBjb21wYXJpc29uIGlzIHBlcmZvcm1lZCBmb3Igb3RoZXIgbnVtZXJpYyB2YWx1ZXMuXG4gICAgICAgIHJldHVybiArYSA9PT0gMCA/IDEgLyArYSA9PT0gMSAvIGIgOiArYSA9PT0gK2I7XG4gICAgICBjYXNlICdbb2JqZWN0IERhdGVdJzpcbiAgICAgIGNhc2UgJ1tvYmplY3QgQm9vbGVhbl0nOlxuICAgICAgICAvLyBDb2VyY2UgZGF0ZXMgYW5kIGJvb2xlYW5zIHRvIG51bWVyaWMgcHJpbWl0aXZlIHZhbHVlcy4gRGF0ZXMgYXJlIGNvbXBhcmVkIGJ5IHRoZWlyXG4gICAgICAgIC8vIG1pbGxpc2Vjb25kIHJlcHJlc2VudGF0aW9ucy4gTm90ZSB0aGF0IGludmFsaWQgZGF0ZXMgd2l0aCBtaWxsaXNlY29uZCByZXByZXNlbnRhdGlvbnNcbiAgICAgICAgLy8gb2YgYE5hTmAgYXJlIG5vdCBlcXVpdmFsZW50LlxuICAgICAgICByZXR1cm4gK2EgPT09ICtiO1xuICAgICAgY2FzZSAnW29iamVjdCBTeW1ib2xdJzpcbiAgICAgICAgcmV0dXJuIFN5bWJvbFByb3RvLnZhbHVlT2YuY2FsbChhKSA9PT0gU3ltYm9sUHJvdG8udmFsdWVPZi5jYWxsKGIpO1xuICAgIH1cblxuICAgIHZhciBhcmVBcnJheXMgPSBjbGFzc05hbWUgPT09ICdbb2JqZWN0IEFycmF5XSc7XG4gICAgaWYgKCFhcmVBcnJheXMpIHtcbiAgICAgIGlmICh0eXBlb2YgYSAhPSAnb2JqZWN0JyB8fCB0eXBlb2YgYiAhPSAnb2JqZWN0JykgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAvLyBPYmplY3RzIHdpdGggZGlmZmVyZW50IGNvbnN0cnVjdG9ycyBhcmUgbm90IGVxdWl2YWxlbnQsIGJ1dCBgT2JqZWN0YHMgb3IgYEFycmF5YHNcbiAgICAgIC8vIGZyb20gZGlmZmVyZW50IGZyYW1lcyBhcmUuXG4gICAgICB2YXIgYUN0b3IgPSBhLmNvbnN0cnVjdG9yLCBiQ3RvciA9IGIuY29uc3RydWN0b3I7XG4gICAgICBpZiAoYUN0b3IgIT09IGJDdG9yICYmICEoXy5pc0Z1bmN0aW9uKGFDdG9yKSAmJiBhQ3RvciBpbnN0YW5jZW9mIGFDdG9yICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXy5pc0Z1bmN0aW9uKGJDdG9yKSAmJiBiQ3RvciBpbnN0YW5jZW9mIGJDdG9yKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoJ2NvbnN0cnVjdG9yJyBpbiBhICYmICdjb25zdHJ1Y3RvcicgaW4gYikpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBBc3N1bWUgZXF1YWxpdHkgZm9yIGN5Y2xpYyBzdHJ1Y3R1cmVzLiBUaGUgYWxnb3JpdGhtIGZvciBkZXRlY3RpbmcgY3ljbGljXG4gICAgLy8gc3RydWN0dXJlcyBpcyBhZGFwdGVkIGZyb20gRVMgNS4xIHNlY3Rpb24gMTUuMTIuMywgYWJzdHJhY3Qgb3BlcmF0aW9uIGBKT2AuXG5cbiAgICAvLyBJbml0aWFsaXppbmcgc3RhY2sgb2YgdHJhdmVyc2VkIG9iamVjdHMuXG4gICAgLy8gSXQncyBkb25lIGhlcmUgc2luY2Ugd2Ugb25seSBuZWVkIHRoZW0gZm9yIG9iamVjdHMgYW5kIGFycmF5cyBjb21wYXJpc29uLlxuICAgIGFTdGFjayA9IGFTdGFjayB8fCBbXTtcbiAgICBiU3RhY2sgPSBiU3RhY2sgfHwgW107XG4gICAgdmFyIGxlbmd0aCA9IGFTdGFjay5sZW5ndGg7XG4gICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAvLyBMaW5lYXIgc2VhcmNoLiBQZXJmb3JtYW5jZSBpcyBpbnZlcnNlbHkgcHJvcG9ydGlvbmFsIHRvIHRoZSBudW1iZXIgb2ZcbiAgICAgIC8vIHVuaXF1ZSBuZXN0ZWQgc3RydWN0dXJlcy5cbiAgICAgIGlmIChhU3RhY2tbbGVuZ3RoXSA9PT0gYSkgcmV0dXJuIGJTdGFja1tsZW5ndGhdID09PSBiO1xuICAgIH1cblxuICAgIC8vIEFkZCB0aGUgZmlyc3Qgb2JqZWN0IHRvIHRoZSBzdGFjayBvZiB0cmF2ZXJzZWQgb2JqZWN0cy5cbiAgICBhU3RhY2sucHVzaChhKTtcbiAgICBiU3RhY2sucHVzaChiKTtcblxuICAgIC8vIFJlY3Vyc2l2ZWx5IGNvbXBhcmUgb2JqZWN0cyBhbmQgYXJyYXlzLlxuICAgIGlmIChhcmVBcnJheXMpIHtcbiAgICAgIC8vIENvbXBhcmUgYXJyYXkgbGVuZ3RocyB0byBkZXRlcm1pbmUgaWYgYSBkZWVwIGNvbXBhcmlzb24gaXMgbmVjZXNzYXJ5LlxuICAgICAgbGVuZ3RoID0gYS5sZW5ndGg7XG4gICAgICBpZiAobGVuZ3RoICE9PSBiLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgICAgLy8gRGVlcCBjb21wYXJlIHRoZSBjb250ZW50cywgaWdub3Jpbmcgbm9uLW51bWVyaWMgcHJvcGVydGllcy5cbiAgICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICBpZiAoIWVxKGFbbGVuZ3RoXSwgYltsZW5ndGhdLCBhU3RhY2ssIGJTdGFjaykpIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRGVlcCBjb21wYXJlIG9iamVjdHMuXG4gICAgICB2YXIga2V5cyA9IF8ua2V5cyhhKSwga2V5O1xuICAgICAgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gICAgICAvLyBFbnN1cmUgdGhhdCBib3RoIG9iamVjdHMgY29udGFpbiB0aGUgc2FtZSBudW1iZXIgb2YgcHJvcGVydGllcyBiZWZvcmUgY29tcGFyaW5nIGRlZXAgZXF1YWxpdHkuXG4gICAgICBpZiAoXy5rZXlzKGIpLmxlbmd0aCAhPT0gbGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgICAgLy8gRGVlcCBjb21wYXJlIGVhY2ggbWVtYmVyXG4gICAgICAgIGtleSA9IGtleXNbbGVuZ3RoXTtcbiAgICAgICAgaWYgKCEoaGFzKGIsIGtleSkgJiYgZXEoYVtrZXldLCBiW2tleV0sIGFTdGFjaywgYlN0YWNrKSkpIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gUmVtb3ZlIHRoZSBmaXJzdCBvYmplY3QgZnJvbSB0aGUgc3RhY2sgb2YgdHJhdmVyc2VkIG9iamVjdHMuXG4gICAgYVN0YWNrLnBvcCgpO1xuICAgIGJTdGFjay5wb3AoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcblxuICAvLyBQZXJmb3JtIGEgZGVlcCBjb21wYXJpc29uIHRvIGNoZWNrIGlmIHR3byBvYmplY3RzIGFyZSBlcXVhbC5cbiAgXy5pc0VxdWFsID0gZnVuY3Rpb24oYSwgYikge1xuICAgIHJldHVybiBlcShhLCBiKTtcbiAgfTtcblxuICAvLyBJcyBhIGdpdmVuIGFycmF5LCBzdHJpbmcsIG9yIG9iamVjdCBlbXB0eT9cbiAgLy8gQW4gXCJlbXB0eVwiIG9iamVjdCBoYXMgbm8gZW51bWVyYWJsZSBvd24tcHJvcGVydGllcy5cbiAgXy5pc0VtcHR5ID0gZnVuY3Rpb24ob2JqKSB7XG4gICAgaWYgKG9iaiA9PSBudWxsKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNBcnJheUxpa2Uob2JqKSAmJiAoXy5pc0FycmF5KG9iaikgfHwgXy5pc1N0cmluZyhvYmopIHx8IF8uaXNBcmd1bWVudHMob2JqKSkpIHJldHVybiBvYmoubGVuZ3RoID09PSAwO1xuICAgIHJldHVybiBfLmtleXMob2JqKS5sZW5ndGggPT09IDA7XG4gIH07XG5cbiAgLy8gSXMgYSBnaXZlbiB2YWx1ZSBhIERPTSBlbGVtZW50P1xuICBfLmlzRWxlbWVudCA9IGZ1bmN0aW9uKG9iaikge1xuICAgIHJldHVybiAhIShvYmogJiYgb2JqLm5vZGVUeXBlID09PSAxKTtcbiAgfTtcblxuICAvLyBJcyBhIGdpdmVuIHZhbHVlIGFuIGFycmF5P1xuICAvLyBEZWxlZ2F0ZXMgdG8gRUNNQTUncyBuYXRpdmUgQXJyYXkuaXNBcnJheVxuICBfLmlzQXJyYXkgPSBuYXRpdmVJc0FycmF5IHx8IGZ1bmN0aW9uKG9iaikge1xuICAgIHJldHVybiB0b1N0cmluZy5jYWxsKG9iaikgPT09ICdbb2JqZWN0IEFycmF5XSc7XG4gIH07XG5cbiAgLy8gSXMgYSBnaXZlbiB2YXJpYWJsZSBhbiBvYmplY3Q/XG4gIF8uaXNPYmplY3QgPSBmdW5jdGlvbihvYmopIHtcbiAgICB2YXIgdHlwZSA9IHR5cGVvZiBvYmo7XG4gICAgcmV0dXJuIHR5cGUgPT09ICdmdW5jdGlvbicgfHwgdHlwZSA9PT0gJ29iamVjdCcgJiYgISFvYmo7XG4gIH07XG5cbiAgLy8gQWRkIHNvbWUgaXNUeXBlIG1ldGhvZHM6IGlzQXJndW1lbnRzLCBpc0Z1bmN0aW9uLCBpc1N0cmluZywgaXNOdW1iZXIsIGlzRGF0ZSwgaXNSZWdFeHAsIGlzRXJyb3IsIGlzTWFwLCBpc1dlYWtNYXAsIGlzU2V0LCBpc1dlYWtTZXQuXG4gIF8uZWFjaChbJ0FyZ3VtZW50cycsICdGdW5jdGlvbicsICdTdHJpbmcnLCAnTnVtYmVyJywgJ0RhdGUnLCAnUmVnRXhwJywgJ0Vycm9yJywgJ1N5bWJvbCcsICdNYXAnLCAnV2Vha01hcCcsICdTZXQnLCAnV2Vha1NldCddLCBmdW5jdGlvbihuYW1lKSB7XG4gICAgX1snaXMnICsgbmFtZV0gPSBmdW5jdGlvbihvYmopIHtcbiAgICAgIHJldHVybiB0b1N0cmluZy5jYWxsKG9iaikgPT09ICdbb2JqZWN0ICcgKyBuYW1lICsgJ10nO1xuICAgIH07XG4gIH0pO1xuXG4gIC8vIERlZmluZSBhIGZhbGxiYWNrIHZlcnNpb24gb2YgdGhlIG1ldGhvZCBpbiBicm93c2VycyAoYWhlbSwgSUUgPCA5KSwgd2hlcmVcbiAgLy8gdGhlcmUgaXNuJ3QgYW55IGluc3BlY3RhYmxlIFwiQXJndW1lbnRzXCIgdHlwZS5cbiAgaWYgKCFfLmlzQXJndW1lbnRzKGFyZ3VtZW50cykpIHtcbiAgICBfLmlzQXJndW1lbnRzID0gZnVuY3Rpb24ob2JqKSB7XG4gICAgICByZXR1cm4gaGFzKG9iaiwgJ2NhbGxlZScpO1xuICAgIH07XG4gIH1cblxuICAvLyBPcHRpbWl6ZSBgaXNGdW5jdGlvbmAgaWYgYXBwcm9wcmlhdGUuIFdvcmsgYXJvdW5kIHNvbWUgdHlwZW9mIGJ1Z3MgaW4gb2xkIHY4LFxuICAvLyBJRSAxMSAoIzE2MjEpLCBTYWZhcmkgOCAoIzE5MjkpLCBhbmQgUGhhbnRvbUpTICgjMjIzNikuXG4gIHZhciBub2RlbGlzdCA9IHJvb3QuZG9jdW1lbnQgJiYgcm9vdC5kb2N1bWVudC5jaGlsZE5vZGVzO1xuICBpZiAodHlwZW9mIC8uLyAhPSAnZnVuY3Rpb24nICYmIHR5cGVvZiBJbnQ4QXJyYXkgIT0gJ29iamVjdCcgJiYgdHlwZW9mIG5vZGVsaXN0ICE9ICdmdW5jdGlvbicpIHtcbiAgICBfLmlzRnVuY3Rpb24gPSBmdW5jdGlvbihvYmopIHtcbiAgICAgIHJldHVybiB0eXBlb2Ygb2JqID09ICdmdW5jdGlvbicgfHwgZmFsc2U7XG4gICAgfTtcbiAgfVxuXG4gIC8vIElzIGEgZ2l2ZW4gb2JqZWN0IGEgZmluaXRlIG51bWJlcj9cbiAgXy5pc0Zpbml0ZSA9IGZ1bmN0aW9uKG9iaikge1xuICAgIHJldHVybiAhXy5pc1N5bWJvbChvYmopICYmIGlzRmluaXRlKG9iaikgJiYgIWlzTmFOKHBhcnNlRmxvYXQob2JqKSk7XG4gIH07XG5cbiAgLy8gSXMgdGhlIGdpdmVuIHZhbHVlIGBOYU5gP1xuICBfLmlzTmFOID0gZnVuY3Rpb24ob2JqKSB7XG4gICAgcmV0dXJuIF8uaXNOdW1iZXIob2JqKSAmJiBpc05hTihvYmopO1xuICB9O1xuXG4gIC8vIElzIGEgZ2l2ZW4gdmFsdWUgYSBib29sZWFuP1xuICBfLmlzQm9vbGVhbiA9IGZ1bmN0aW9uKG9iaikge1xuICAgIHJldHVybiBvYmogPT09IHRydWUgfHwgb2JqID09PSBmYWxzZSB8fCB0b1N0cmluZy5jYWxsKG9iaikgPT09ICdbb2JqZWN0IEJvb2xlYW5dJztcbiAgfTtcblxuICAvLyBJcyBhIGdpdmVuIHZhbHVlIGVxdWFsIHRvIG51bGw/XG4gIF8uaXNOdWxsID0gZnVuY3Rpb24ob2JqKSB7XG4gICAgcmV0dXJuIG9iaiA9PT0gbnVsbDtcbiAgfTtcblxuICAvLyBJcyBhIGdpdmVuIHZhcmlhYmxlIHVuZGVmaW5lZD9cbiAgXy5pc1VuZGVmaW5lZCA9IGZ1bmN0aW9uKG9iaikge1xuICAgIHJldHVybiBvYmogPT09IHZvaWQgMDtcbiAgfTtcblxuICAvLyBTaG9ydGN1dCBmdW5jdGlvbiBmb3IgY2hlY2tpbmcgaWYgYW4gb2JqZWN0IGhhcyBhIGdpdmVuIHByb3BlcnR5IGRpcmVjdGx5XG4gIC8vIG9uIGl0c2VsZiAoaW4gb3RoZXIgd29yZHMsIG5vdCBvbiBhIHByb3RvdHlwZSkuXG4gIF8uaGFzID0gZnVuY3Rpb24ob2JqLCBwYXRoKSB7XG4gICAgaWYgKCFfLmlzQXJyYXkocGF0aCkpIHtcbiAgICAgIHJldHVybiBoYXMob2JqLCBwYXRoKTtcbiAgICB9XG4gICAgdmFyIGxlbmd0aCA9IHBhdGgubGVuZ3RoO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBrZXkgPSBwYXRoW2ldO1xuICAgICAgaWYgKG9iaiA9PSBudWxsIHx8ICFoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBvYmogPSBvYmpba2V5XTtcbiAgICB9XG4gICAgcmV0dXJuICEhbGVuZ3RoO1xuICB9O1xuXG4gIC8vIFV0aWxpdHkgRnVuY3Rpb25zXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLy8gUnVuIFVuZGVyc2NvcmUuanMgaW4gKm5vQ29uZmxpY3QqIG1vZGUsIHJldHVybmluZyB0aGUgYF9gIHZhcmlhYmxlIHRvIGl0c1xuICAvLyBwcmV2aW91cyBvd25lci4gUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgVW5kZXJzY29yZSBvYmplY3QuXG4gIF8ubm9Db25mbGljdCA9IGZ1bmN0aW9uKCkge1xuICAgIHJvb3QuXyA9IHByZXZpb3VzVW5kZXJzY29yZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvLyBLZWVwIHRoZSBpZGVudGl0eSBmdW5jdGlvbiBhcm91bmQgZm9yIGRlZmF1bHQgaXRlcmF0ZWVzLlxuICBfLmlkZW50aXR5ID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH07XG5cbiAgLy8gUHJlZGljYXRlLWdlbmVyYXRpbmcgZnVuY3Rpb25zLiBPZnRlbiB1c2VmdWwgb3V0c2lkZSBvZiBVbmRlcnNjb3JlLlxuICBfLmNvbnN0YW50ID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfTtcbiAgfTtcblxuICBfLm5vb3AgPSBmdW5jdGlvbigpe307XG5cbiAgLy8gQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQsIHdoZW4gcGFzc2VkIGFuIG9iamVjdCwgd2lsbCB0cmF2ZXJzZSB0aGF0IG9iamVjdOKAmXNcbiAgLy8gcHJvcGVydGllcyBkb3duIHRoZSBnaXZlbiBgcGF0aGAsIHNwZWNpZmllZCBhcyBhbiBhcnJheSBvZiBrZXlzIG9yIGluZGV4ZXMuXG4gIF8ucHJvcGVydHkgPSBmdW5jdGlvbihwYXRoKSB7XG4gICAgaWYgKCFfLmlzQXJyYXkocGF0aCkpIHtcbiAgICAgIHJldHVybiBzaGFsbG93UHJvcGVydHkocGF0aCk7XG4gICAgfVxuICAgIHJldHVybiBmdW5jdGlvbihvYmopIHtcbiAgICAgIHJldHVybiBkZWVwR2V0KG9iaiwgcGF0aCk7XG4gICAgfTtcbiAgfTtcblxuICAvLyBHZW5lcmF0ZXMgYSBmdW5jdGlvbiBmb3IgYSBnaXZlbiBvYmplY3QgdGhhdCByZXR1cm5zIGEgZ2l2ZW4gcHJvcGVydHkuXG4gIF8ucHJvcGVydHlPZiA9IGZ1bmN0aW9uKG9iaikge1xuICAgIGlmIChvYmogPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCl7fTtcbiAgICB9XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHBhdGgpIHtcbiAgICAgIHJldHVybiAhXy5pc0FycmF5KHBhdGgpID8gb2JqW3BhdGhdIDogZGVlcEdldChvYmosIHBhdGgpO1xuICAgIH07XG4gIH07XG5cbiAgLy8gUmV0dXJucyBhIHByZWRpY2F0ZSBmb3IgY2hlY2tpbmcgd2hldGhlciBhbiBvYmplY3QgaGFzIGEgZ2l2ZW4gc2V0IG9mXG4gIC8vIGBrZXk6dmFsdWVgIHBhaXJzLlxuICBfLm1hdGNoZXIgPSBfLm1hdGNoZXMgPSBmdW5jdGlvbihhdHRycykge1xuICAgIGF0dHJzID0gXy5leHRlbmRPd24oe30sIGF0dHJzKTtcbiAgICByZXR1cm4gZnVuY3Rpb24ob2JqKSB7XG4gICAgICByZXR1cm4gXy5pc01hdGNoKG9iaiwgYXR0cnMpO1xuICAgIH07XG4gIH07XG5cbiAgLy8gUnVuIGEgZnVuY3Rpb24gKipuKiogdGltZXMuXG4gIF8udGltZXMgPSBmdW5jdGlvbihuLCBpdGVyYXRlZSwgY29udGV4dCkge1xuICAgIHZhciBhY2N1bSA9IEFycmF5KE1hdGgubWF4KDAsIG4pKTtcbiAgICBpdGVyYXRlZSA9IG9wdGltaXplQ2IoaXRlcmF0ZWUsIGNvbnRleHQsIDEpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSBhY2N1bVtpXSA9IGl0ZXJhdGVlKGkpO1xuICAgIHJldHVybiBhY2N1bTtcbiAgfTtcblxuICAvLyBSZXR1cm4gYSByYW5kb20gaW50ZWdlciBiZXR3ZWVuIG1pbiBhbmQgbWF4IChpbmNsdXNpdmUpLlxuICBfLnJhbmRvbSA9IGZ1bmN0aW9uKG1pbiwgbWF4KSB7XG4gICAgaWYgKG1heCA9PSBudWxsKSB7XG4gICAgICBtYXggPSBtaW47XG4gICAgICBtaW4gPSAwO1xuICAgIH1cbiAgICByZXR1cm4gbWluICsgTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbiArIDEpKTtcbiAgfTtcblxuICAvLyBBIChwb3NzaWJseSBmYXN0ZXIpIHdheSB0byBnZXQgdGhlIGN1cnJlbnQgdGltZXN0YW1wIGFzIGFuIGludGVnZXIuXG4gIF8ubm93ID0gRGF0ZS5ub3cgfHwgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICB9O1xuXG4gIC8vIExpc3Qgb2YgSFRNTCBlbnRpdGllcyBmb3IgZXNjYXBpbmcuXG4gIHZhciBlc2NhcGVNYXAgPSB7XG4gICAgJyYnOiAnJmFtcDsnLFxuICAgICc8JzogJyZsdDsnLFxuICAgICc+JzogJyZndDsnLFxuICAgICdcIic6ICcmcXVvdDsnLFxuICAgIFwiJ1wiOiAnJiN4Mjc7JyxcbiAgICAnYCc6ICcmI3g2MDsnXG4gIH07XG4gIHZhciB1bmVzY2FwZU1hcCA9IF8uaW52ZXJ0KGVzY2FwZU1hcCk7XG5cbiAgLy8gRnVuY3Rpb25zIGZvciBlc2NhcGluZyBhbmQgdW5lc2NhcGluZyBzdHJpbmdzIHRvL2Zyb20gSFRNTCBpbnRlcnBvbGF0aW9uLlxuICB2YXIgY3JlYXRlRXNjYXBlciA9IGZ1bmN0aW9uKG1hcCkge1xuICAgIHZhciBlc2NhcGVyID0gZnVuY3Rpb24obWF0Y2gpIHtcbiAgICAgIHJldHVybiBtYXBbbWF0Y2hdO1xuICAgIH07XG4gICAgLy8gUmVnZXhlcyBmb3IgaWRlbnRpZnlpbmcgYSBrZXkgdGhhdCBuZWVkcyB0byBiZSBlc2NhcGVkLlxuICAgIHZhciBzb3VyY2UgPSAnKD86JyArIF8ua2V5cyhtYXApLmpvaW4oJ3wnKSArICcpJztcbiAgICB2YXIgdGVzdFJlZ2V4cCA9IFJlZ0V4cChzb3VyY2UpO1xuICAgIHZhciByZXBsYWNlUmVnZXhwID0gUmVnRXhwKHNvdXJjZSwgJ2cnKTtcbiAgICByZXR1cm4gZnVuY3Rpb24oc3RyaW5nKSB7XG4gICAgICBzdHJpbmcgPSBzdHJpbmcgPT0gbnVsbCA/ICcnIDogJycgKyBzdHJpbmc7XG4gICAgICByZXR1cm4gdGVzdFJlZ2V4cC50ZXN0KHN0cmluZykgPyBzdHJpbmcucmVwbGFjZShyZXBsYWNlUmVnZXhwLCBlc2NhcGVyKSA6IHN0cmluZztcbiAgICB9O1xuICB9O1xuICBfLmVzY2FwZSA9IGNyZWF0ZUVzY2FwZXIoZXNjYXBlTWFwKTtcbiAgXy51bmVzY2FwZSA9IGNyZWF0ZUVzY2FwZXIodW5lc2NhcGVNYXApO1xuXG4gIC8vIFRyYXZlcnNlcyB0aGUgY2hpbGRyZW4gb2YgYG9iamAgYWxvbmcgYHBhdGhgLiBJZiBhIGNoaWxkIGlzIGEgZnVuY3Rpb24sIGl0XG4gIC8vIGlzIGludm9rZWQgd2l0aCBpdHMgcGFyZW50IGFzIGNvbnRleHQuIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBmaW5hbFxuICAvLyBjaGlsZCwgb3IgYGZhbGxiYWNrYCBpZiBhbnkgY2hpbGQgaXMgdW5kZWZpbmVkLlxuICBfLnJlc3VsdCA9IGZ1bmN0aW9uKG9iaiwgcGF0aCwgZmFsbGJhY2spIHtcbiAgICBpZiAoIV8uaXNBcnJheShwYXRoKSkgcGF0aCA9IFtwYXRoXTtcbiAgICB2YXIgbGVuZ3RoID0gcGF0aC5sZW5ndGg7XG4gICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgIHJldHVybiBfLmlzRnVuY3Rpb24oZmFsbGJhY2spID8gZmFsbGJhY2suY2FsbChvYmopIDogZmFsbGJhY2s7XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwcm9wID0gb2JqID09IG51bGwgPyB2b2lkIDAgOiBvYmpbcGF0aFtpXV07XG4gICAgICBpZiAocHJvcCA9PT0gdm9pZCAwKSB7XG4gICAgICAgIHByb3AgPSBmYWxsYmFjaztcbiAgICAgICAgaSA9IGxlbmd0aDsgLy8gRW5zdXJlIHdlIGRvbid0IGNvbnRpbnVlIGl0ZXJhdGluZy5cbiAgICAgIH1cbiAgICAgIG9iaiA9IF8uaXNGdW5jdGlvbihwcm9wKSA/IHByb3AuY2FsbChvYmopIDogcHJvcDtcbiAgICB9XG4gICAgcmV0dXJuIG9iajtcbiAgfTtcblxuICAvLyBHZW5lcmF0ZSBhIHVuaXF1ZSBpbnRlZ2VyIGlkICh1bmlxdWUgd2l0aGluIHRoZSBlbnRpcmUgY2xpZW50IHNlc3Npb24pLlxuICAvLyBVc2VmdWwgZm9yIHRlbXBvcmFyeSBET00gaWRzLlxuICB2YXIgaWRDb3VudGVyID0gMDtcbiAgXy51bmlxdWVJZCA9IGZ1bmN0aW9uKHByZWZpeCkge1xuICAgIHZhciBpZCA9ICsraWRDb3VudGVyICsgJyc7XG4gICAgcmV0dXJuIHByZWZpeCA/IHByZWZpeCArIGlkIDogaWQ7XG4gIH07XG5cbiAgLy8gQnkgZGVmYXVsdCwgVW5kZXJzY29yZSB1c2VzIEVSQi1zdHlsZSB0ZW1wbGF0ZSBkZWxpbWl0ZXJzLCBjaGFuZ2UgdGhlXG4gIC8vIGZvbGxvd2luZyB0ZW1wbGF0ZSBzZXR0aW5ncyB0byB1c2UgYWx0ZXJuYXRpdmUgZGVsaW1pdGVycy5cbiAgXy50ZW1wbGF0ZVNldHRpbmdzID0ge1xuICAgIGV2YWx1YXRlOiAvPCUoW1xcc1xcU10rPyklPi9nLFxuICAgIGludGVycG9sYXRlOiAvPCU9KFtcXHNcXFNdKz8pJT4vZyxcbiAgICBlc2NhcGU6IC88JS0oW1xcc1xcU10rPyklPi9nXG4gIH07XG5cbiAgLy8gV2hlbiBjdXN0b21pemluZyBgdGVtcGxhdGVTZXR0aW5nc2AsIGlmIHlvdSBkb24ndCB3YW50IHRvIGRlZmluZSBhblxuICAvLyBpbnRlcnBvbGF0aW9uLCBldmFsdWF0aW9uIG9yIGVzY2FwaW5nIHJlZ2V4LCB3ZSBuZWVkIG9uZSB0aGF0IGlzXG4gIC8vIGd1YXJhbnRlZWQgbm90IHRvIG1hdGNoLlxuICB2YXIgbm9NYXRjaCA9IC8oLileLztcblxuICAvLyBDZXJ0YWluIGNoYXJhY3RlcnMgbmVlZCB0byBiZSBlc2NhcGVkIHNvIHRoYXQgdGhleSBjYW4gYmUgcHV0IGludG8gYVxuICAvLyBzdHJpbmcgbGl0ZXJhbC5cbiAgdmFyIGVzY2FwZXMgPSB7XG4gICAgXCInXCI6IFwiJ1wiLFxuICAgICdcXFxcJzogJ1xcXFwnLFxuICAgICdcXHInOiAncicsXG4gICAgJ1xcbic6ICduJyxcbiAgICAnXFx1MjAyOCc6ICd1MjAyOCcsXG4gICAgJ1xcdTIwMjknOiAndTIwMjknXG4gIH07XG5cbiAgdmFyIGVzY2FwZVJlZ0V4cCA9IC9cXFxcfCd8XFxyfFxcbnxcXHUyMDI4fFxcdTIwMjkvZztcblxuICB2YXIgZXNjYXBlQ2hhciA9IGZ1bmN0aW9uKG1hdGNoKSB7XG4gICAgcmV0dXJuICdcXFxcJyArIGVzY2FwZXNbbWF0Y2hdO1xuICB9O1xuXG4gIC8vIEphdmFTY3JpcHQgbWljcm8tdGVtcGxhdGluZywgc2ltaWxhciB0byBKb2huIFJlc2lnJ3MgaW1wbGVtZW50YXRpb24uXG4gIC8vIFVuZGVyc2NvcmUgdGVtcGxhdGluZyBoYW5kbGVzIGFyYml0cmFyeSBkZWxpbWl0ZXJzLCBwcmVzZXJ2ZXMgd2hpdGVzcGFjZSxcbiAgLy8gYW5kIGNvcnJlY3RseSBlc2NhcGVzIHF1b3RlcyB3aXRoaW4gaW50ZXJwb2xhdGVkIGNvZGUuXG4gIC8vIE5COiBgb2xkU2V0dGluZ3NgIG9ubHkgZXhpc3RzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS5cbiAgXy50ZW1wbGF0ZSA9IGZ1bmN0aW9uKHRleHQsIHNldHRpbmdzLCBvbGRTZXR0aW5ncykge1xuICAgIGlmICghc2V0dGluZ3MgJiYgb2xkU2V0dGluZ3MpIHNldHRpbmdzID0gb2xkU2V0dGluZ3M7XG4gICAgc2V0dGluZ3MgPSBfLmRlZmF1bHRzKHt9LCBzZXR0aW5ncywgXy50ZW1wbGF0ZVNldHRpbmdzKTtcblxuICAgIC8vIENvbWJpbmUgZGVsaW1pdGVycyBpbnRvIG9uZSByZWd1bGFyIGV4cHJlc3Npb24gdmlhIGFsdGVybmF0aW9uLlxuICAgIHZhciBtYXRjaGVyID0gUmVnRXhwKFtcbiAgICAgIChzZXR0aW5ncy5lc2NhcGUgfHwgbm9NYXRjaCkuc291cmNlLFxuICAgICAgKHNldHRpbmdzLmludGVycG9sYXRlIHx8IG5vTWF0Y2gpLnNvdXJjZSxcbiAgICAgIChzZXR0aW5ncy5ldmFsdWF0ZSB8fCBub01hdGNoKS5zb3VyY2VcbiAgICBdLmpvaW4oJ3wnKSArICd8JCcsICdnJyk7XG5cbiAgICAvLyBDb21waWxlIHRoZSB0ZW1wbGF0ZSBzb3VyY2UsIGVzY2FwaW5nIHN0cmluZyBsaXRlcmFscyBhcHByb3ByaWF0ZWx5LlxuICAgIHZhciBpbmRleCA9IDA7XG4gICAgdmFyIHNvdXJjZSA9IFwiX19wKz0nXCI7XG4gICAgdGV4dC5yZXBsYWNlKG1hdGNoZXIsIGZ1bmN0aW9uKG1hdGNoLCBlc2NhcGUsIGludGVycG9sYXRlLCBldmFsdWF0ZSwgb2Zmc2V0KSB7XG4gICAgICBzb3VyY2UgKz0gdGV4dC5zbGljZShpbmRleCwgb2Zmc2V0KS5yZXBsYWNlKGVzY2FwZVJlZ0V4cCwgZXNjYXBlQ2hhcik7XG4gICAgICBpbmRleCA9IG9mZnNldCArIG1hdGNoLmxlbmd0aDtcblxuICAgICAgaWYgKGVzY2FwZSkge1xuICAgICAgICBzb3VyY2UgKz0gXCInK1xcbigoX190PShcIiArIGVzY2FwZSArIFwiKSk9PW51bGw/Jyc6Xy5lc2NhcGUoX190KSkrXFxuJ1wiO1xuICAgICAgfSBlbHNlIGlmIChpbnRlcnBvbGF0ZSkge1xuICAgICAgICBzb3VyY2UgKz0gXCInK1xcbigoX190PShcIiArIGludGVycG9sYXRlICsgXCIpKT09bnVsbD8nJzpfX3QpK1xcbidcIjtcbiAgICAgIH0gZWxzZSBpZiAoZXZhbHVhdGUpIHtcbiAgICAgICAgc291cmNlICs9IFwiJztcXG5cIiArIGV2YWx1YXRlICsgXCJcXG5fX3ArPSdcIjtcbiAgICAgIH1cblxuICAgICAgLy8gQWRvYmUgVk1zIG5lZWQgdGhlIG1hdGNoIHJldHVybmVkIHRvIHByb2R1Y2UgdGhlIGNvcnJlY3Qgb2Zmc2V0LlxuICAgICAgcmV0dXJuIG1hdGNoO1xuICAgIH0pO1xuICAgIHNvdXJjZSArPSBcIic7XFxuXCI7XG5cbiAgICAvLyBJZiBhIHZhcmlhYmxlIGlzIG5vdCBzcGVjaWZpZWQsIHBsYWNlIGRhdGEgdmFsdWVzIGluIGxvY2FsIHNjb3BlLlxuICAgIGlmICghc2V0dGluZ3MudmFyaWFibGUpIHNvdXJjZSA9ICd3aXRoKG9ianx8e30pe1xcbicgKyBzb3VyY2UgKyAnfVxcbic7XG5cbiAgICBzb3VyY2UgPSBcInZhciBfX3QsX19wPScnLF9faj1BcnJheS5wcm90b3R5cGUuam9pbixcIiArXG4gICAgICBcInByaW50PWZ1bmN0aW9uKCl7X19wKz1fX2ouY2FsbChhcmd1bWVudHMsJycpO307XFxuXCIgK1xuICAgICAgc291cmNlICsgJ3JldHVybiBfX3A7XFxuJztcblxuICAgIHZhciByZW5kZXI7XG4gICAgdHJ5IHtcbiAgICAgIHJlbmRlciA9IG5ldyBGdW5jdGlvbihzZXR0aW5ncy52YXJpYWJsZSB8fCAnb2JqJywgJ18nLCBzb3VyY2UpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGUuc291cmNlID0gc291cmNlO1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG5cbiAgICB2YXIgdGVtcGxhdGUgPSBmdW5jdGlvbihkYXRhKSB7XG4gICAgICByZXR1cm4gcmVuZGVyLmNhbGwodGhpcywgZGF0YSwgXyk7XG4gICAgfTtcblxuICAgIC8vIFByb3ZpZGUgdGhlIGNvbXBpbGVkIHNvdXJjZSBhcyBhIGNvbnZlbmllbmNlIGZvciBwcmVjb21waWxhdGlvbi5cbiAgICB2YXIgYXJndW1lbnQgPSBzZXR0aW5ncy52YXJpYWJsZSB8fCAnb2JqJztcbiAgICB0ZW1wbGF0ZS5zb3VyY2UgPSAnZnVuY3Rpb24oJyArIGFyZ3VtZW50ICsgJyl7XFxuJyArIHNvdXJjZSArICd9JztcblxuICAgIHJldHVybiB0ZW1wbGF0ZTtcbiAgfTtcblxuICAvLyBBZGQgYSBcImNoYWluXCIgZnVuY3Rpb24uIFN0YXJ0IGNoYWluaW5nIGEgd3JhcHBlZCBVbmRlcnNjb3JlIG9iamVjdC5cbiAgXy5jaGFpbiA9IGZ1bmN0aW9uKG9iaikge1xuICAgIHZhciBpbnN0YW5jZSA9IF8ob2JqKTtcbiAgICBpbnN0YW5jZS5fY2hhaW4gPSB0cnVlO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfTtcblxuICAvLyBPT1BcbiAgLy8gLS0tLS0tLS0tLS0tLS0tXG4gIC8vIElmIFVuZGVyc2NvcmUgaXMgY2FsbGVkIGFzIGEgZnVuY3Rpb24sIGl0IHJldHVybnMgYSB3cmFwcGVkIG9iamVjdCB0aGF0XG4gIC8vIGNhbiBiZSB1c2VkIE9PLXN0eWxlLiBUaGlzIHdyYXBwZXIgaG9sZHMgYWx0ZXJlZCB2ZXJzaW9ucyBvZiBhbGwgdGhlXG4gIC8vIHVuZGVyc2NvcmUgZnVuY3Rpb25zLiBXcmFwcGVkIG9iamVjdHMgbWF5IGJlIGNoYWluZWQuXG5cbiAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNvbnRpbnVlIGNoYWluaW5nIGludGVybWVkaWF0ZSByZXN1bHRzLlxuICB2YXIgY2hhaW5SZXN1bHQgPSBmdW5jdGlvbihpbnN0YW5jZSwgb2JqKSB7XG4gICAgcmV0dXJuIGluc3RhbmNlLl9jaGFpbiA/IF8ob2JqKS5jaGFpbigpIDogb2JqO1xuICB9O1xuXG4gIC8vIEFkZCB5b3VyIG93biBjdXN0b20gZnVuY3Rpb25zIHRvIHRoZSBVbmRlcnNjb3JlIG9iamVjdC5cbiAgXy5taXhpbiA9IGZ1bmN0aW9uKG9iaikge1xuICAgIF8uZWFjaChfLmZ1bmN0aW9ucyhvYmopLCBmdW5jdGlvbihuYW1lKSB7XG4gICAgICB2YXIgZnVuYyA9IF9bbmFtZV0gPSBvYmpbbmFtZV07XG4gICAgICBfLnByb3RvdHlwZVtuYW1lXSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgYXJncyA9IFt0aGlzLl93cmFwcGVkXTtcbiAgICAgICAgcHVzaC5hcHBseShhcmdzLCBhcmd1bWVudHMpO1xuICAgICAgICByZXR1cm4gY2hhaW5SZXN1bHQodGhpcywgZnVuYy5hcHBseShfLCBhcmdzKSk7XG4gICAgICB9O1xuICAgIH0pO1xuICAgIHJldHVybiBfO1xuICB9O1xuXG4gIC8vIEFkZCBhbGwgb2YgdGhlIFVuZGVyc2NvcmUgZnVuY3Rpb25zIHRvIHRoZSB3cmFwcGVyIG9iamVjdC5cbiAgXy5taXhpbihfKTtcblxuICAvLyBBZGQgYWxsIG11dGF0b3IgQXJyYXkgZnVuY3Rpb25zIHRvIHRoZSB3cmFwcGVyLlxuICBfLmVhY2goWydwb3AnLCAncHVzaCcsICdyZXZlcnNlJywgJ3NoaWZ0JywgJ3NvcnQnLCAnc3BsaWNlJywgJ3Vuc2hpZnQnXSwgZnVuY3Rpb24obmFtZSkge1xuICAgIHZhciBtZXRob2QgPSBBcnJheVByb3RvW25hbWVdO1xuICAgIF8ucHJvdG90eXBlW25hbWVdID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgb2JqID0gdGhpcy5fd3JhcHBlZDtcbiAgICAgIG1ldGhvZC5hcHBseShvYmosIGFyZ3VtZW50cyk7XG4gICAgICBpZiAoKG5hbWUgPT09ICdzaGlmdCcgfHwgbmFtZSA9PT0gJ3NwbGljZScpICYmIG9iai5sZW5ndGggPT09IDApIGRlbGV0ZSBvYmpbMF07XG4gICAgICByZXR1cm4gY2hhaW5SZXN1bHQodGhpcywgb2JqKTtcbiAgICB9O1xuICB9KTtcblxuICAvLyBBZGQgYWxsIGFjY2Vzc29yIEFycmF5IGZ1bmN0aW9ucyB0byB0aGUgd3JhcHBlci5cbiAgXy5lYWNoKFsnY29uY2F0JywgJ2pvaW4nLCAnc2xpY2UnXSwgZnVuY3Rpb24obmFtZSkge1xuICAgIHZhciBtZXRob2QgPSBBcnJheVByb3RvW25hbWVdO1xuICAgIF8ucHJvdG90eXBlW25hbWVdID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gY2hhaW5SZXN1bHQodGhpcywgbWV0aG9kLmFwcGx5KHRoaXMuX3dyYXBwZWQsIGFyZ3VtZW50cykpO1xuICAgIH07XG4gIH0pO1xuXG4gIC8vIEV4dHJhY3RzIHRoZSByZXN1bHQgZnJvbSBhIHdyYXBwZWQgYW5kIGNoYWluZWQgb2JqZWN0LlxuICBfLnByb3RvdHlwZS52YWx1ZSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl93cmFwcGVkO1xuICB9O1xuXG4gIC8vIFByb3ZpZGUgdW53cmFwcGluZyBwcm94eSBmb3Igc29tZSBtZXRob2RzIHVzZWQgaW4gZW5naW5lIG9wZXJhdGlvbnNcbiAgLy8gc3VjaCBhcyBhcml0aG1ldGljIGFuZCBKU09OIHN0cmluZ2lmaWNhdGlvbi5cbiAgXy5wcm90b3R5cGUudmFsdWVPZiA9IF8ucHJvdG90eXBlLnRvSlNPTiA9IF8ucHJvdG90eXBlLnZhbHVlO1xuXG4gIF8ucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIFN0cmluZyh0aGlzLl93cmFwcGVkKTtcbiAgfTtcblxuICAvLyBBTUQgcmVnaXN0cmF0aW9uIGhhcHBlbnMgYXQgdGhlIGVuZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIEFNRCBsb2FkZXJzXG4gIC8vIHRoYXQgbWF5IG5vdCBlbmZvcmNlIG5leHQtdHVybiBzZW1hbnRpY3Mgb24gbW9kdWxlcy4gRXZlbiB0aG91Z2ggZ2VuZXJhbFxuICAvLyBwcmFjdGljZSBmb3IgQU1EIHJlZ2lzdHJhdGlvbiBpcyB0byBiZSBhbm9ueW1vdXMsIHVuZGVyc2NvcmUgcmVnaXN0ZXJzXG4gIC8vIGFzIGEgbmFtZWQgbW9kdWxlIGJlY2F1c2UsIGxpa2UgalF1ZXJ5LCBpdCBpcyBhIGJhc2UgbGlicmFyeSB0aGF0IGlzXG4gIC8vIHBvcHVsYXIgZW5vdWdoIHRvIGJlIGJ1bmRsZWQgaW4gYSB0aGlyZCBwYXJ0eSBsaWIsIGJ1dCBub3QgYmUgcGFydCBvZlxuICAvLyBhbiBBTUQgbG9hZCByZXF1ZXN0LiBUaG9zZSBjYXNlcyBjb3VsZCBnZW5lcmF0ZSBhbiBlcnJvciB3aGVuIGFuXG4gIC8vIGFub255bW91cyBkZWZpbmUoKSBpcyBjYWxsZWQgb3V0c2lkZSBvZiBhIGxvYWRlciByZXF1ZXN0LlxuICBpZiAodHlwZW9mIGRlZmluZSA9PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHtcbiAgICBkZWZpbmUoJ3VuZGVyc2NvcmUnLCBbXSwgZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gXztcbiAgICB9KTtcbiAgfVxufSgpKTtcblxufSkuY2FsbCh0aGlzLHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIgPyBnbG9iYWwgOiB0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiA/IHNlbGYgOiB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiID8gd2luZG93IDoge30pXG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldDp1dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJbTV2WkdWZmJXOWtkV3hsY3k5MWJtUmxjbk5qYjNKbEwzVnVaR1Z5YzJOdmNtVXVhbk1pWFN3aWJtRnRaWE1pT2x0ZExDSnRZWEJ3YVc1bmN5STZJanRCUVVGQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQklpd2labWxzWlNJNkltZGxibVZ5WVhSbFpDNXFjeUlzSW5OdmRYSmpaVkp2YjNRaU9pSWlMQ0p6YjNWeVkyVnpRMjl1ZEdWdWRDSTZXeUl2THlBZ0lDQWdWVzVrWlhKelkyOXlaUzVxY3lBeExqa3VNVnh1THk4Z0lDQWdJR2gwZEhBNkx5OTFibVJsY25OamIzSmxhbk11YjNKblhHNHZMeUFnSUNBZ0tHTXBJREl3TURrdE1qQXhPQ0JLWlhKbGJYa2dRWE5vYTJWdVlYTXNJRVJ2WTNWdFpXNTBRMnh2ZFdRZ1lXNWtJRWx1ZG1WemRHbG5ZWFJwZG1VZ1VtVndiM0owWlhKeklDWWdSV1JwZEc5eWMxeHVMeThnSUNBZ0lGVnVaR1Z5YzJOdmNtVWdiV0Y1SUdKbElHWnlaV1ZzZVNCa2FYTjBjbWxpZFhSbFpDQjFibVJsY2lCMGFHVWdUVWxVSUd4cFkyVnVjMlV1WEc1Y2JpaG1kVzVqZEdsdmJpZ3BJSHRjYmx4dUlDQXZMeUJDWVhObGJHbHVaU0J6WlhSMWNGeHVJQ0F2THlBdExTMHRMUzB0TFMwdExTMHRMVnh1WEc0Z0lDOHZJRVZ6ZEdGaWJHbHphQ0IwYUdVZ2NtOXZkQ0J2WW1wbFkzUXNJR0IzYVc1a2IzZGdJQ2hnYzJWc1ptQXBJR2x1SUhSb1pTQmljbTkzYzJWeUxDQmdaMnh2WW1Gc1lGeHVJQ0F2THlCdmJpQjBhR1VnYzJWeWRtVnlMQ0J2Y2lCZ2RHaHBjMkFnYVc0Z2MyOXRaU0IyYVhKMGRXRnNJRzFoWTJocGJtVnpMaUJYWlNCMWMyVWdZSE5sYkdaZ1hHNGdJQzh2SUdsdWMzUmxZV1FnYjJZZ1lIZHBibVJ2ZDJBZ1ptOXlJR0JYWldKWGIzSnJaWEpnSUhOMWNIQnZjblF1WEc0Z0lIWmhjaUJ5YjI5MElEMGdkSGx3Wlc5bUlITmxiR1lnUFQwZ0oyOWlhbVZqZENjZ0ppWWdjMlZzWmk1elpXeG1JRDA5UFNCelpXeG1JQ1ltSUhObGJHWWdmSHhjYmlBZ0lDQWdJQ0FnSUNBZ0lIUjVjR1Z2WmlCbmJHOWlZV3dnUFQwZ0oyOWlhbVZqZENjZ0ppWWdaMnh2WW1Gc0xtZHNiMkpoYkNBOVBUMGdaMnh2WW1Gc0lDWW1JR2RzYjJKaGJDQjhmRnh1SUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeUI4ZkZ4dUlDQWdJQ0FnSUNBZ0lDQWdlMzA3WEc1Y2JpQWdMeThnVTJGMlpTQjBhR1VnY0hKbGRtbHZkWE1nZG1Gc2RXVWdiMllnZEdobElHQmZZQ0IyWVhKcFlXSnNaUzVjYmlBZ2RtRnlJSEJ5WlhacGIzVnpWVzVrWlhKelkyOXlaU0E5SUhKdmIzUXVYenRjYmx4dUlDQXZMeUJUWVhabElHSjVkR1Z6SUdsdUlIUm9aU0J0YVc1cFptbGxaQ0FvWW5WMElHNXZkQ0JuZW1sd2NHVmtLU0IyWlhKemFXOXVPbHh1SUNCMllYSWdRWEp5WVhsUWNtOTBieUE5SUVGeWNtRjVMbkJ5YjNSdmRIbHdaU3dnVDJKcVVISnZkRzhnUFNCUFltcGxZM1F1Y0hKdmRHOTBlWEJsTzF4dUlDQjJZWElnVTNsdFltOXNVSEp2ZEc4Z1BTQjBlWEJsYjJZZ1UzbHRZbTlzSUNFOVBTQW5kVzVrWldacGJtVmtKeUEvSUZONWJXSnZiQzV3Y205MGIzUjVjR1VnT2lCdWRXeHNPMXh1WEc0Z0lDOHZJRU55WldGMFpTQnhkV2xqYXlCeVpXWmxjbVZ1WTJVZ2RtRnlhV0ZpYkdWeklHWnZjaUJ6Y0dWbFpDQmhZMk5sYzNNZ2RHOGdZMjl5WlNCd2NtOTBiM1I1Y0dWekxseHVJQ0IyWVhJZ2NIVnphQ0E5SUVGeWNtRjVVSEp2ZEc4dWNIVnphQ3hjYmlBZ0lDQWdJSE5zYVdObElEMGdRWEp5WVhsUWNtOTBieTV6YkdsalpTeGNiaUFnSUNBZ0lIUnZVM1J5YVc1bklEMGdUMkpxVUhKdmRHOHVkRzlUZEhKcGJtY3NYRzRnSUNBZ0lDQm9ZWE5QZDI1UWNtOXdaWEowZVNBOUlFOWlhbEJ5YjNSdkxtaGhjMDkzYmxCeWIzQmxjblI1TzF4dVhHNGdJQzh2SUVGc2JDQXFLa1ZEVFVGVFkzSnBjSFFnTlNvcUlHNWhkR2wyWlNCbWRXNWpkR2x2YmlCcGJYQnNaVzFsYm5SaGRHbHZibk1nZEdoaGRDQjNaU0JvYjNCbElIUnZJSFZ6WlZ4dUlDQXZMeUJoY21VZ1pHVmpiR0Z5WldRZ2FHVnlaUzVjYmlBZ2RtRnlJRzVoZEdsMlpVbHpRWEp5WVhrZ1BTQkJjbkpoZVM1cGMwRnljbUY1TEZ4dUlDQWdJQ0FnYm1GMGFYWmxTMlY1Y3lBOUlFOWlhbVZqZEM1clpYbHpMRnh1SUNBZ0lDQWdibUYwYVhabFEzSmxZWFJsSUQwZ1QySnFaV04wTG1OeVpXRjBaVHRjYmx4dUlDQXZMeUJPWVd0bFpDQm1kVzVqZEdsdmJpQnlaV1psY21WdVkyVWdabTl5SUhOMWNuSnZaMkYwWlMxd2NtOTBiM1I1Y0dVdGMzZGhjSEJwYm1jdVhHNGdJSFpoY2lCRGRHOXlJRDBnWm5WdVkzUnBiMjRvS1h0OU8xeHVYRzRnSUM4dklFTnlaV0YwWlNCaElITmhabVVnY21WbVpYSmxibU5sSUhSdklIUm9aU0JWYm1SbGNuTmpiM0psSUc5aWFtVmpkQ0JtYjNJZ2RYTmxJR0psYkc5M0xseHVJQ0IyWVhJZ1h5QTlJR1oxYm1OMGFXOXVLRzlpYWlrZ2UxeHVJQ0FnSUdsbUlDaHZZbW9nYVc1emRHRnVZMlZ2WmlCZktTQnlaWFIxY200Z2IySnFPMXh1SUNBZ0lHbG1JQ2doS0hSb2FYTWdhVzV6ZEdGdVkyVnZaaUJmS1NrZ2NtVjBkWEp1SUc1bGR5QmZLRzlpYWlrN1hHNGdJQ0FnZEdocGN5NWZkM0poY0hCbFpDQTlJRzlpYWp0Y2JpQWdmVHRjYmx4dUlDQXZMeUJGZUhCdmNuUWdkR2hsSUZWdVpHVnljMk52Y21VZ2IySnFaV04wSUdadmNpQXFLazV2WkdVdWFuTXFLaXdnZDJsMGFGeHVJQ0F2THlCaVlXTnJkMkZ5WkhNdFkyOXRjR0YwYVdKcGJHbDBlU0JtYjNJZ2RHaGxhWElnYjJ4a0lHMXZaSFZzWlNCQlVFa3VJRWxtSUhkbEozSmxJR2x1WEc0Z0lDOHZJSFJvWlNCaWNtOTNjMlZ5TENCaFpHUWdZRjlnSUdGeklHRWdaMnh2WW1Gc0lHOWlhbVZqZEM1Y2JpQWdMeThnS0dCdWIyUmxWSGx3WldBZ2FYTWdZMmhsWTJ0bFpDQjBieUJsYm5OMWNtVWdkR2hoZENCZ2JXOWtkV3hsWUZ4dUlDQXZMeUJoYm1RZ1lHVjRjRzl5ZEhOZ0lHRnlaU0J1YjNRZ1NGUk5UQ0JsYkdWdFpXNTBjeTRwWEc0Z0lHbG1JQ2gwZVhCbGIyWWdaWGh3YjNKMGN5QWhQU0FuZFc1a1pXWnBibVZrSnlBbUppQWhaWGh3YjNKMGN5NXViMlJsVkhsd1pTa2dlMXh1SUNBZ0lHbG1JQ2gwZVhCbGIyWWdiVzlrZFd4bElDRTlJQ2QxYm1SbFptbHVaV1FuSUNZbUlDRnRiMlIxYkdVdWJtOWtaVlI1Y0dVZ0ppWWdiVzlrZFd4bExtVjRjRzl5ZEhNcElIdGNiaUFnSUNBZ0lHVjRjRzl5ZEhNZ1BTQnRiMlIxYkdVdVpYaHdiM0owY3lBOUlGODdYRzRnSUNBZ2ZWeHVJQ0FnSUdWNGNHOXlkSE11WHlBOUlGODdYRzRnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdjbTl2ZEM1ZklEMGdYenRjYmlBZ2ZWeHVYRzRnSUM4dklFTjFjbkpsYm5RZ2RtVnljMmx2Ymk1Y2JpQWdYeTVXUlZKVFNVOU9JRDBnSnpFdU9TNHhKenRjYmx4dUlDQXZMeUJKYm5SbGNtNWhiQ0JtZFc1amRHbHZiaUIwYUdGMElISmxkSFZ5Ym5NZ1lXNGdaV1ptYVdOcFpXNTBJQ2htYjNJZ1kzVnljbVZ1ZENCbGJtZHBibVZ6S1NCMlpYSnphVzl1WEc0Z0lDOHZJRzltSUhSb1pTQndZWE56WldRdGFXNGdZMkZzYkdKaFkyc3NJSFJ2SUdKbElISmxjR1ZoZEdWa2JIa2dZWEJ3YkdsbFpDQnBiaUJ2ZEdobGNpQlZibVJsY25OamIzSmxYRzRnSUM4dklHWjFibU4wYVc5dWN5NWNiaUFnZG1GeUlHOXdkR2x0YVhwbFEySWdQU0JtZFc1amRHbHZiaWhtZFc1akxDQmpiMjUwWlhoMExDQmhjbWREYjNWdWRDa2dlMXh1SUNBZ0lHbG1JQ2hqYjI1MFpYaDBJRDA5UFNCMmIybGtJREFwSUhKbGRIVnliaUJtZFc1ak8xeHVJQ0FnSUhOM2FYUmphQ0FvWVhKblEyOTFiblFnUFQwZ2JuVnNiQ0EvSURNZ09pQmhjbWREYjNWdWRDa2dlMXh1SUNBZ0lDQWdZMkZ6WlNBeE9pQnlaWFIxY200Z1puVnVZM1JwYjI0b2RtRnNkV1VwSUh0Y2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUdaMWJtTXVZMkZzYkNoamIyNTBaWGgwTENCMllXeDFaU2s3WEc0Z0lDQWdJQ0I5TzF4dUlDQWdJQ0FnTHk4Z1ZHaGxJREl0WVhKbmRXMWxiblFnWTJGelpTQnBjeUJ2YldsMGRHVmtJR0psWTJGMWMyVWdkMlhpZ0pseVpTQnViM1FnZFhOcGJtY2dhWFF1WEc0Z0lDQWdJQ0JqWVhObElETTZJSEpsZEhWeWJpQm1kVzVqZEdsdmJpaDJZV3gxWlN3Z2FXNWtaWGdzSUdOdmJHeGxZM1JwYjI0cElIdGNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlHWjFibU11WTJGc2JDaGpiMjUwWlhoMExDQjJZV3gxWlN3Z2FXNWtaWGdzSUdOdmJHeGxZM1JwYjI0cE8xeHVJQ0FnSUNBZ2ZUdGNiaUFnSUNBZ0lHTmhjMlVnTkRvZ2NtVjBkWEp1SUdaMWJtTjBhVzl1S0dGalkzVnRkV3hoZEc5eUxDQjJZV3gxWlN3Z2FXNWtaWGdzSUdOdmJHeGxZM1JwYjI0cElIdGNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlHWjFibU11WTJGc2JDaGpiMjUwWlhoMExDQmhZMk4xYlhWc1lYUnZjaXdnZG1Gc2RXVXNJR2x1WkdWNExDQmpiMnhzWldOMGFXOXVLVHRjYmlBZ0lDQWdJSDA3WEc0Z0lDQWdmVnh1SUNBZ0lISmxkSFZ5YmlCbWRXNWpkR2x2YmlncElIdGNiaUFnSUNBZ0lISmxkSFZ5YmlCbWRXNWpMbUZ3Y0d4NUtHTnZiblJsZUhRc0lHRnlaM1Z0Wlc1MGN5azdYRzRnSUNBZ2ZUdGNiaUFnZlR0Y2JseHVJQ0IyWVhJZ1luVnBiSFJwYmtsMFpYSmhkR1ZsTzF4dVhHNGdJQzh2SUVGdUlHbHVkR1Z5Ym1Gc0lHWjFibU4wYVc5dUlIUnZJR2RsYm1WeVlYUmxJR05oYkd4aVlXTnJjeUIwYUdGMElHTmhiaUJpWlNCaGNIQnNhV1ZrSUhSdklHVmhZMmhjYmlBZ0x5OGdaV3hsYldWdWRDQnBiaUJoSUdOdmJHeGxZM1JwYjI0c0lISmxkSFZ5Ym1sdVp5QjBhR1VnWkdWemFYSmxaQ0J5WlhOMWJIUWc0b0NVSUdWcGRHaGxjaUJnYVdSbGJuUnBkSGxnTEZ4dUlDQXZMeUJoYmlCaGNtSnBkSEpoY25rZ1kyRnNiR0poWTJzc0lHRWdjSEp2Y0dWeWRIa2diV0YwWTJobGNpd2diM0lnWVNCd2NtOXdaWEowZVNCaFkyTmxjM052Y2k1Y2JpQWdkbUZ5SUdOaUlEMGdablZ1WTNScGIyNG9kbUZzZFdVc0lHTnZiblJsZUhRc0lHRnlaME52ZFc1MEtTQjdYRzRnSUNBZ2FXWWdLRjh1YVhSbGNtRjBaV1VnSVQwOUlHSjFhV3gwYVc1SmRHVnlZWFJsWlNrZ2NtVjBkWEp1SUY4dWFYUmxjbUYwWldVb2RtRnNkV1VzSUdOdmJuUmxlSFFwTzF4dUlDQWdJR2xtSUNoMllXeDFaU0E5UFNCdWRXeHNLU0J5WlhSMWNtNGdYeTVwWkdWdWRHbDBlVHRjYmlBZ0lDQnBaaUFvWHk1cGMwWjFibU4wYVc5dUtIWmhiSFZsS1NrZ2NtVjBkWEp1SUc5d2RHbHRhWHBsUTJJb2RtRnNkV1VzSUdOdmJuUmxlSFFzSUdGeVowTnZkVzUwS1R0Y2JpQWdJQ0JwWmlBb1h5NXBjMDlpYW1WamRDaDJZV3gxWlNrZ0ppWWdJVjh1YVhOQmNuSmhlU2gyWVd4MVpTa3BJSEpsZEhWeWJpQmZMbTFoZEdOb1pYSW9kbUZzZFdVcE8xeHVJQ0FnSUhKbGRIVnliaUJmTG5CeWIzQmxjblI1S0haaGJIVmxLVHRjYmlBZ2ZUdGNibHh1SUNBdkx5QkZlSFJsY201aGJDQjNjbUZ3Y0dWeUlHWnZjaUJ2ZFhJZ1kyRnNiR0poWTJzZ1oyVnVaWEpoZEc5eUxpQlZjMlZ5Y3lCdFlYa2dZM1Z6ZEc5dGFYcGxYRzRnSUM4dklHQmZMbWwwWlhKaGRHVmxZQ0JwWmlCMGFHVjVJSGRoYm5RZ1lXUmthWFJwYjI1aGJDQndjbVZrYVdOaGRHVXZhWFJsY21GMFpXVWdjMmh2Y25Sb1lXNWtJSE4wZVd4bGN5NWNiaUFnTHk4Z1ZHaHBjeUJoWW5OMGNtRmpkR2x2YmlCb2FXUmxjeUIwYUdVZ2FXNTBaWEp1WVd3dGIyNXNlU0JoY21kRGIzVnVkQ0JoY21kMWJXVnVkQzVjYmlBZ1h5NXBkR1Z5WVhSbFpTQTlJR0oxYVd4MGFXNUpkR1Z5WVhSbFpTQTlJR1oxYm1OMGFXOXVLSFpoYkhWbExDQmpiMjUwWlhoMEtTQjdYRzRnSUNBZ2NtVjBkWEp1SUdOaUtIWmhiSFZsTENCamIyNTBaWGgwTENCSmJtWnBibWwwZVNrN1hHNGdJSDA3WEc1Y2JpQWdMeThnVTI5dFpTQm1kVzVqZEdsdmJuTWdkR0ZyWlNCaElIWmhjbWxoWW14bElHNTFiV0psY2lCdlppQmhjbWQxYldWdWRITXNJRzl5SUdFZ1ptVjNJR1Y0Y0dWamRHVmtYRzRnSUM4dklHRnlaM1Z0Wlc1MGN5QmhkQ0IwYUdVZ1ltVm5hVzV1YVc1bklHRnVaQ0IwYUdWdUlHRWdkbUZ5YVdGaWJHVWdiblZ0WW1WeUlHOW1JSFpoYkhWbGN5QjBieUJ2Y0dWeVlYUmxYRzRnSUM4dklHOXVMaUJVYUdseklHaGxiSEJsY2lCaFkyTjFiWFZzWVhSbGN5QmhiR3dnY21WdFlXbHVhVzVuSUdGeVozVnRaVzUwY3lCd1lYTjBJSFJvWlNCbWRXNWpkR2x2YnVLQW1YTmNiaUFnTHk4Z1lYSm5kVzFsYm5RZ2JHVnVaM1JvSUNodmNpQmhiaUJsZUhCc2FXTnBkQ0JnYzNSaGNuUkpibVJsZUdBcExDQnBiblJ2SUdGdUlHRnljbUY1SUhSb1lYUWdZbVZqYjIxbGMxeHVJQ0F2THlCMGFHVWdiR0Z6ZENCaGNtZDFiV1Z1ZEM0Z1UybHRhV3hoY2lCMGJ5QkZVemJpZ0pseklGd2ljbVZ6ZENCd1lYSmhiV1YwWlhKY0lpNWNiaUFnZG1GeUlISmxjM1JCY21kMWJXVnVkSE1nUFNCbWRXNWpkR2x2YmlobWRXNWpMQ0J6ZEdGeWRFbHVaR1Y0S1NCN1hHNGdJQ0FnYzNSaGNuUkpibVJsZUNBOUlITjBZWEowU1c1a1pYZ2dQVDBnYm5Wc2JDQS9JR1oxYm1NdWJHVnVaM1JvSUMwZ01TQTZJQ3R6ZEdGeWRFbHVaR1Y0TzF4dUlDQWdJSEpsZEhWeWJpQm1kVzVqZEdsdmJpZ3BJSHRjYmlBZ0lDQWdJSFpoY2lCc1pXNW5kR2dnUFNCTllYUm9MbTFoZUNoaGNtZDFiV1Z1ZEhNdWJHVnVaM1JvSUMwZ2MzUmhjblJKYm1SbGVDd2dNQ2tzWEc0Z0lDQWdJQ0FnSUNBZ2NtVnpkQ0E5SUVGeWNtRjVLR3hsYm1kMGFDa3NYRzRnSUNBZ0lDQWdJQ0FnYVc1a1pYZ2dQU0F3TzF4dUlDQWdJQ0FnWm05eUlDZzdJR2x1WkdWNElEd2diR1Z1WjNSb095QnBibVJsZUNzcktTQjdYRzRnSUNBZ0lDQWdJSEpsYzNSYmFXNWtaWGhkSUQwZ1lYSm5kVzFsYm5SelcybHVaR1Y0SUNzZ2MzUmhjblJKYm1SbGVGMDdYRzRnSUNBZ0lDQjlYRzRnSUNBZ0lDQnpkMmwwWTJnZ0tITjBZWEowU1c1a1pYZ3BJSHRjYmlBZ0lDQWdJQ0FnWTJGelpTQXdPaUJ5WlhSMWNtNGdablZ1WXk1allXeHNLSFJvYVhNc0lISmxjM1FwTzF4dUlDQWdJQ0FnSUNCallYTmxJREU2SUhKbGRIVnliaUJtZFc1akxtTmhiR3dvZEdocGN5d2dZWEpuZFcxbGJuUnpXekJkTENCeVpYTjBLVHRjYmlBZ0lDQWdJQ0FnWTJGelpTQXlPaUJ5WlhSMWNtNGdablZ1WXk1allXeHNLSFJvYVhNc0lHRnlaM1Z0Wlc1MGMxc3dYU3dnWVhKbmRXMWxiblJ6V3pGZExDQnlaWE4wS1R0Y2JpQWdJQ0FnSUgxY2JpQWdJQ0FnSUhaaGNpQmhjbWR6SUQwZ1FYSnlZWGtvYzNSaGNuUkpibVJsZUNBcklERXBPMXh1SUNBZ0lDQWdabTl5SUNocGJtUmxlQ0E5SURBN0lHbHVaR1Y0SUR3Z2MzUmhjblJKYm1SbGVEc2dhVzVrWlhnckt5a2dlMXh1SUNBZ0lDQWdJQ0JoY21kelcybHVaR1Y0WFNBOUlHRnlaM1Z0Wlc1MGMxdHBibVJsZUYwN1hHNGdJQ0FnSUNCOVhHNGdJQ0FnSUNCaGNtZHpXM04wWVhKMFNXNWtaWGhkSUQwZ2NtVnpkRHRjYmlBZ0lDQWdJSEpsZEhWeWJpQm1kVzVqTG1Gd2NHeDVLSFJvYVhNc0lHRnlaM01wTzF4dUlDQWdJSDA3WEc0Z0lIMDdYRzVjYmlBZ0x5OGdRVzRnYVc1MFpYSnVZV3dnWm5WdVkzUnBiMjRnWm05eUlHTnlaV0YwYVc1bklHRWdibVYzSUc5aWFtVmpkQ0IwYUdGMElHbHVhR1Z5YVhSeklHWnliMjBnWVc1dmRHaGxjaTVjYmlBZ2RtRnlJR0poYzJWRGNtVmhkR1VnUFNCbWRXNWpkR2x2Ymlod2NtOTBiM1I1Y0dVcElIdGNiaUFnSUNCcFppQW9JVjh1YVhOUFltcGxZM1FvY0hKdmRHOTBlWEJsS1NrZ2NtVjBkWEp1SUh0OU8xeHVJQ0FnSUdsbUlDaHVZWFJwZG1WRGNtVmhkR1VwSUhKbGRIVnliaUJ1WVhScGRtVkRjbVZoZEdVb2NISnZkRzkwZVhCbEtUdGNiaUFnSUNCRGRHOXlMbkJ5YjNSdmRIbHdaU0E5SUhCeWIzUnZkSGx3WlR0Y2JpQWdJQ0IyWVhJZ2NtVnpkV3gwSUQwZ2JtVjNJRU4wYjNJN1hHNGdJQ0FnUTNSdmNpNXdjbTkwYjNSNWNHVWdQU0J1ZFd4c08xeHVJQ0FnSUhKbGRIVnliaUJ5WlhOMWJIUTdYRzRnSUgwN1hHNWNiaUFnZG1GeUlITm9ZV3hzYjNkUWNtOXdaWEowZVNBOUlHWjFibU4wYVc5dUtHdGxlU2tnZTF4dUlDQWdJSEpsZEhWeWJpQm1kVzVqZEdsdmJpaHZZbW9wSUh0Y2JpQWdJQ0FnSUhKbGRIVnliaUJ2WW1vZ1BUMGdiblZzYkNBL0lIWnZhV1FnTUNBNklHOWlhbHRyWlhsZE8xeHVJQ0FnSUgwN1hHNGdJSDA3WEc1Y2JpQWdkbUZ5SUdoaGN5QTlJR1oxYm1OMGFXOXVLRzlpYWl3Z2NHRjBhQ2tnZTF4dUlDQWdJSEpsZEhWeWJpQnZZbW9nSVQwZ2JuVnNiQ0FtSmlCb1lYTlBkMjVRY205d1pYSjBlUzVqWVd4c0tHOWlhaXdnY0dGMGFDazdYRzRnSUgxY2JseHVJQ0IyWVhJZ1pHVmxjRWRsZENBOUlHWjFibU4wYVc5dUtHOWlhaXdnY0dGMGFDa2dlMXh1SUNBZ0lIWmhjaUJzWlc1bmRHZ2dQU0J3WVhSb0xteGxibWQwYUR0Y2JpQWdJQ0JtYjNJZ0tIWmhjaUJwSUQwZ01Ec2dhU0E4SUd4bGJtZDBhRHNnYVNzcktTQjdYRzRnSUNBZ0lDQnBaaUFvYjJKcUlEMDlJRzUxYkd3cElISmxkSFZ5YmlCMmIybGtJREE3WEc0Z0lDQWdJQ0J2WW1vZ1BTQnZZbXBiY0dGMGFGdHBYVjA3WEc0Z0lDQWdmVnh1SUNBZ0lISmxkSFZ5YmlCc1pXNW5kR2dnUHlCdlltb2dPaUIyYjJsa0lEQTdYRzRnSUgwN1hHNWNiaUFnTHk4Z1NHVnNjR1Z5SUdadmNpQmpiMnhzWldOMGFXOXVJRzFsZEdodlpITWdkRzhnWkdWMFpYSnRhVzVsSUhkb1pYUm9aWElnWVNCamIyeHNaV04wYVc5dVhHNGdJQzh2SUhOb2IzVnNaQ0JpWlNCcGRHVnlZWFJsWkNCaGN5QmhiaUJoY25KaGVTQnZjaUJoY3lCaGJpQnZZbXBsWTNRdVhHNGdJQzh2SUZKbGJHRjBaV1E2SUdoMGRIQTZMeTl3Wlc5d2JHVXViVzk2YVd4c1lTNXZjbWN2Zm1wdmNtVnVaRzl5Wm1ZdlpYTTJMV1J5WVdaMExtaDBiV3dqYzJWakxYUnZiR1Z1WjNSb1hHNGdJQzh2SUVGMmIybGtjeUJoSUhabGNua2dibUZ6ZEhrZ2FVOVRJRGdnU2tsVUlHSjFaeUJ2YmlCQlVrMHROalF1SUNNeU1EazBYRzRnSUhaaGNpQk5RVmhmUVZKU1FWbGZTVTVFUlZnZ1BTQk5ZWFJvTG5CdmR5Z3lMQ0ExTXlrZ0xTQXhPMXh1SUNCMllYSWdaMlYwVEdWdVozUm9JRDBnYzJoaGJHeHZkMUJ5YjNCbGNuUjVLQ2RzWlc1bmRHZ25LVHRjYmlBZ2RtRnlJR2x6UVhKeVlYbE1hV3RsSUQwZ1puVnVZM1JwYjI0b1kyOXNiR1ZqZEdsdmJpa2dlMXh1SUNBZ0lIWmhjaUJzWlc1bmRHZ2dQU0JuWlhSTVpXNW5kR2dvWTI5c2JHVmpkR2x2YmlrN1hHNGdJQ0FnY21WMGRYSnVJSFI1Y0dWdlppQnNaVzVuZEdnZ1BUMGdKMjUxYldKbGNpY2dKaVlnYkdWdVozUm9JRDQ5SURBZ0ppWWdiR1Z1WjNSb0lEdzlJRTFCV0Y5QlVsSkJXVjlKVGtSRldEdGNiaUFnZlR0Y2JseHVJQ0F2THlCRGIyeHNaV04wYVc5dUlFWjFibU4wYVc5dWMxeHVJQ0F2THlBdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExWeHVYRzRnSUM4dklGUm9aU0JqYjNKdVpYSnpkRzl1WlN3Z1lXNGdZR1ZoWTJoZ0lHbHRjR3hsYldWdWRHRjBhVzl1TENCaGEyRWdZR1p2Y2tWaFkyaGdMbHh1SUNBdkx5QklZVzVrYkdWeklISmhkeUJ2WW1wbFkzUnpJR2x1SUdGa1pHbDBhVzl1SUhSdklHRnljbUY1TFd4cGEyVnpMaUJVY21WaGRITWdZV3hzWEc0Z0lDOHZJSE53WVhKelpTQmhjbkpoZVMxc2FXdGxjeUJoY3lCcFppQjBhR1Y1SUhkbGNtVWdaR1Z1YzJVdVhHNGdJRjh1WldGamFDQTlJRjh1Wm05eVJXRmphQ0E5SUdaMWJtTjBhVzl1S0c5aWFpd2dhWFJsY21GMFpXVXNJR052Ym5SbGVIUXBJSHRjYmlBZ0lDQnBkR1Z5WVhSbFpTQTlJRzl3ZEdsdGFYcGxRMklvYVhSbGNtRjBaV1VzSUdOdmJuUmxlSFFwTzF4dUlDQWdJSFpoY2lCcExDQnNaVzVuZEdnN1hHNGdJQ0FnYVdZZ0tHbHpRWEp5WVhsTWFXdGxLRzlpYWlrcElIdGNiaUFnSUNBZ0lHWnZjaUFvYVNBOUlEQXNJR3hsYm1kMGFDQTlJRzlpYWk1c1pXNW5kR2c3SUdrZ1BDQnNaVzVuZEdnN0lHa3JLeWtnZTF4dUlDQWdJQ0FnSUNCcGRHVnlZWFJsWlNodlltcGJhVjBzSUdrc0lHOWlhaWs3WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdmU0JsYkhObElIdGNiaUFnSUNBZ0lIWmhjaUJyWlhseklEMGdYeTVyWlhsektHOWlhaWs3WEc0Z0lDQWdJQ0JtYjNJZ0tHa2dQU0F3TENCc1pXNW5kR2dnUFNCclpYbHpMbXhsYm1kMGFEc2dhU0E4SUd4bGJtZDBhRHNnYVNzcktTQjdYRzRnSUNBZ0lDQWdJR2wwWlhKaGRHVmxLRzlpYWx0clpYbHpXMmxkWFN3Z2EyVjVjMXRwWFN3Z2IySnFLVHRjYmlBZ0lDQWdJSDFjYmlBZ0lDQjlYRzRnSUNBZ2NtVjBkWEp1SUc5aWFqdGNiaUFnZlR0Y2JseHVJQ0F2THlCU1pYUjFjbTRnZEdobElISmxjM1ZzZEhNZ2IyWWdZWEJ3YkhscGJtY2dkR2hsSUdsMFpYSmhkR1ZsSUhSdklHVmhZMmdnWld4bGJXVnVkQzVjYmlBZ1h5NXRZWEFnUFNCZkxtTnZiR3hsWTNRZ1BTQm1kVzVqZEdsdmJpaHZZbW9zSUdsMFpYSmhkR1ZsTENCamIyNTBaWGgwS1NCN1hHNGdJQ0FnYVhSbGNtRjBaV1VnUFNCallpaHBkR1Z5WVhSbFpTd2dZMjl1ZEdWNGRDazdYRzRnSUNBZ2RtRnlJR3RsZVhNZ1BTQWhhWE5CY25KaGVVeHBhMlVvYjJKcUtTQW1KaUJmTG10bGVYTW9iMkpxS1N4Y2JpQWdJQ0FnSUNBZ2JHVnVaM1JvSUQwZ0tHdGxlWE1nZkh3Z2IySnFLUzVzWlc1bmRHZ3NYRzRnSUNBZ0lDQWdJSEpsYzNWc2RITWdQU0JCY25KaGVTaHNaVzVuZEdncE8xeHVJQ0FnSUdadmNpQW9kbUZ5SUdsdVpHVjRJRDBnTURzZ2FXNWtaWGdnUENCc1pXNW5kR2c3SUdsdVpHVjRLeXNwSUh0Y2JpQWdJQ0FnSUhaaGNpQmpkWEp5Wlc1MFMyVjVJRDBnYTJWNWN5QS9JR3RsZVhOYmFXNWtaWGhkSURvZ2FXNWtaWGc3WEc0Z0lDQWdJQ0J5WlhOMWJIUnpXMmx1WkdWNFhTQTlJR2wwWlhKaGRHVmxLRzlpYWx0amRYSnlaVzUwUzJWNVhTd2dZM1Z5Y21WdWRFdGxlU3dnYjJKcUtUdGNiaUFnSUNCOVhHNGdJQ0FnY21WMGRYSnVJSEpsYzNWc2RITTdYRzRnSUgwN1hHNWNiaUFnTHk4Z1EzSmxZWFJsSUdFZ2NtVmtkV05wYm1jZ1puVnVZM1JwYjI0Z2FYUmxjbUYwYVc1bklHeGxablFnYjNJZ2NtbG5hSFF1WEc0Z0lIWmhjaUJqY21WaGRHVlNaV1IxWTJVZ1BTQm1kVzVqZEdsdmJpaGthWElwSUh0Y2JpQWdJQ0F2THlCWGNtRndJR052WkdVZ2RHaGhkQ0J5WldGemMybG5ibk1nWVhKbmRXMWxiblFnZG1GeWFXRmliR1Z6SUdsdUlHRWdjMlZ3WVhKaGRHVWdablZ1WTNScGIyNGdkR2hoYmx4dUlDQWdJQzh2SUhSb1pTQnZibVVnZEdoaGRDQmhZMk5sYzNObGN5QmdZWEpuZFcxbGJuUnpMbXhsYm1kMGFHQWdkRzhnWVhadmFXUWdZU0J3WlhKbUlHaHBkQzRnS0NNeE9Ua3hLVnh1SUNBZ0lIWmhjaUJ5WldSMVkyVnlJRDBnWm5WdVkzUnBiMjRvYjJKcUxDQnBkR1Z5WVhSbFpTd2diV1Z0Ynl3Z2FXNXBkR2xoYkNrZ2UxeHVJQ0FnSUNBZ2RtRnlJR3RsZVhNZ1BTQWhhWE5CY25KaGVVeHBhMlVvYjJKcUtTQW1KaUJmTG10bGVYTW9iMkpxS1N4Y2JpQWdJQ0FnSUNBZ0lDQnNaVzVuZEdnZ1BTQW9hMlY1Y3lCOGZDQnZZbW9wTG14bGJtZDBhQ3hjYmlBZ0lDQWdJQ0FnSUNCcGJtUmxlQ0E5SUdScGNpQStJREFnUHlBd0lEb2diR1Z1WjNSb0lDMGdNVHRjYmlBZ0lDQWdJR2xtSUNnaGFXNXBkR2xoYkNrZ2UxeHVJQ0FnSUNBZ0lDQnRaVzF2SUQwZ2IySnFXMnRsZVhNZ1B5QnJaWGx6VzJsdVpHVjRYU0E2SUdsdVpHVjRYVHRjYmlBZ0lDQWdJQ0FnYVc1a1pYZ2dLejBnWkdseU8xeHVJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ1ptOXlJQ2c3SUdsdVpHVjRJRDQ5SURBZ0ppWWdhVzVrWlhnZ1BDQnNaVzVuZEdnN0lHbHVaR1Y0SUNzOUlHUnBjaWtnZTF4dUlDQWdJQ0FnSUNCMllYSWdZM1Z5Y21WdWRFdGxlU0E5SUd0bGVYTWdQeUJyWlhselcybHVaR1Y0WFNBNklHbHVaR1Y0TzF4dUlDQWdJQ0FnSUNCdFpXMXZJRDBnYVhSbGNtRjBaV1VvYldWdGJ5d2diMkpxVzJOMWNuSmxiblJMWlhsZExDQmpkWEp5Wlc1MFMyVjVMQ0J2WW1vcE8xeHVJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ2NtVjBkWEp1SUcxbGJXODdYRzRnSUNBZ2ZUdGNibHh1SUNBZ0lISmxkSFZ5YmlCbWRXNWpkR2x2Ymlodlltb3NJR2wwWlhKaGRHVmxMQ0J0WlcxdkxDQmpiMjUwWlhoMEtTQjdYRzRnSUNBZ0lDQjJZWElnYVc1cGRHbGhiQ0E5SUdGeVozVnRaVzUwY3k1c1pXNW5kR2dnUGowZ016dGNiaUFnSUNBZ0lISmxkSFZ5YmlCeVpXUjFZMlZ5S0c5aWFpd2diM0IwYVcxcGVtVkRZaWhwZEdWeVlYUmxaU3dnWTI5dWRHVjRkQ3dnTkNrc0lHMWxiVzhzSUdsdWFYUnBZV3dwTzF4dUlDQWdJSDA3WEc0Z0lIMDdYRzVjYmlBZ0x5OGdLaXBTWldSMVkyVXFLaUJpZFdsc1pITWdkWEFnWVNCemFXNW5iR1VnY21WemRXeDBJR1p5YjIwZ1lTQnNhWE4wSUc5bUlIWmhiSFZsY3l3Z1lXdGhJR0JwYm1wbFkzUmdMRnh1SUNBdkx5QnZjaUJnWm05c1pHeGdMbHh1SUNCZkxuSmxaSFZqWlNBOUlGOHVabTlzWkd3Z1BTQmZMbWx1YW1WamRDQTlJR055WldGMFpWSmxaSFZqWlNneEtUdGNibHh1SUNBdkx5QlVhR1VnY21sbmFIUXRZWE56YjJOcFlYUnBkbVVnZG1WeWMybHZiaUJ2WmlCeVpXUjFZMlVzSUdGc2MyOGdhMjV2ZDI0Z1lYTWdZR1p2YkdSeVlDNWNiaUFnWHk1eVpXUjFZMlZTYVdkb2RDQTlJRjh1Wm05c1pISWdQU0JqY21WaGRHVlNaV1IxWTJVb0xURXBPMXh1WEc0Z0lDOHZJRkpsZEhWeWJpQjBhR1VnWm1seWMzUWdkbUZzZFdVZ2QyaHBZMmdnY0dGemMyVnpJR0VnZEhKMWRHZ2dkR1Z6ZEM0Z1FXeHBZWE5sWkNCaGN5QmdaR1YwWldOMFlDNWNiaUFnWHk1bWFXNWtJRDBnWHk1a1pYUmxZM1FnUFNCbWRXNWpkR2x2Ymlodlltb3NJSEJ5WldScFkyRjBaU3dnWTI5dWRHVjRkQ2tnZTF4dUlDQWdJSFpoY2lCclpYbEdhVzVrWlhJZ1BTQnBjMEZ5Y21GNVRHbHJaU2h2WW1vcElEOGdYeTVtYVc1a1NXNWtaWGdnT2lCZkxtWnBibVJMWlhrN1hHNGdJQ0FnZG1GeUlHdGxlU0E5SUd0bGVVWnBibVJsY2lodlltb3NJSEJ5WldScFkyRjBaU3dnWTI5dWRHVjRkQ2s3WEc0Z0lDQWdhV1lnS0d0bGVTQWhQVDBnZG05cFpDQXdJQ1ltSUd0bGVTQWhQVDBnTFRFcElISmxkSFZ5YmlCdlltcGJhMlY1WFR0Y2JpQWdmVHRjYmx4dUlDQXZMeUJTWlhSMWNtNGdZV3hzSUhSb1pTQmxiR1Z0Wlc1MGN5QjBhR0YwSUhCaGMzTWdZU0IwY25WMGFDQjBaWE4wTGx4dUlDQXZMeUJCYkdsaGMyVmtJR0Z6SUdCelpXeGxZM1JnTGx4dUlDQmZMbVpwYkhSbGNpQTlJRjh1YzJWc1pXTjBJRDBnWm5WdVkzUnBiMjRvYjJKcUxDQndjbVZrYVdOaGRHVXNJR052Ym5SbGVIUXBJSHRjYmlBZ0lDQjJZWElnY21WemRXeDBjeUE5SUZ0ZE8xeHVJQ0FnSUhCeVpXUnBZMkYwWlNBOUlHTmlLSEJ5WldScFkyRjBaU3dnWTI5dWRHVjRkQ2s3WEc0Z0lDQWdYeTVsWVdOb0tHOWlhaXdnWm5WdVkzUnBiMjRvZG1Gc2RXVXNJR2x1WkdWNExDQnNhWE4wS1NCN1hHNGdJQ0FnSUNCcFppQW9jSEpsWkdsallYUmxLSFpoYkhWbExDQnBibVJsZUN3Z2JHbHpkQ2twSUhKbGMzVnNkSE11Y0hWemFDaDJZV3gxWlNrN1hHNGdJQ0FnZlNrN1hHNGdJQ0FnY21WMGRYSnVJSEpsYzNWc2RITTdYRzRnSUgwN1hHNWNiaUFnTHk4Z1VtVjBkWEp1SUdGc2JDQjBhR1VnWld4bGJXVnVkSE1nWm05eUlIZG9hV05vSUdFZ2RISjFkR2dnZEdWemRDQm1ZV2xzY3k1Y2JpQWdYeTV5WldwbFkzUWdQU0JtZFc1amRHbHZiaWh2WW1vc0lIQnlaV1JwWTJGMFpTd2dZMjl1ZEdWNGRDa2dlMXh1SUNBZ0lISmxkSFZ5YmlCZkxtWnBiSFJsY2lodlltb3NJRjh1Ym1WbllYUmxLR05pS0hCeVpXUnBZMkYwWlNrcExDQmpiMjUwWlhoMEtUdGNiaUFnZlR0Y2JseHVJQ0F2THlCRVpYUmxjbTFwYm1VZ2QyaGxkR2hsY2lCaGJHd2diMllnZEdobElHVnNaVzFsYm5SeklHMWhkR05vSUdFZ2RISjFkR2dnZEdWemRDNWNiaUFnTHk4Z1FXeHBZWE5sWkNCaGN5QmdZV3hzWUM1Y2JpQWdYeTVsZG1WeWVTQTlJRjh1WVd4c0lEMGdablZ1WTNScGIyNG9iMkpxTENCd2NtVmthV05oZEdVc0lHTnZiblJsZUhRcElIdGNiaUFnSUNCd2NtVmthV05oZEdVZ1BTQmpZaWh3Y21Wa2FXTmhkR1VzSUdOdmJuUmxlSFFwTzF4dUlDQWdJSFpoY2lCclpYbHpJRDBnSVdselFYSnlZWGxNYVd0bEtHOWlhaWtnSmlZZ1h5NXJaWGx6S0c5aWFpa3NYRzRnSUNBZ0lDQWdJR3hsYm1kMGFDQTlJQ2hyWlhseklIeDhJRzlpYWlrdWJHVnVaM1JvTzF4dUlDQWdJR1p2Y2lBb2RtRnlJR2x1WkdWNElEMGdNRHNnYVc1a1pYZ2dQQ0JzWlc1bmRHZzdJR2x1WkdWNEt5c3BJSHRjYmlBZ0lDQWdJSFpoY2lCamRYSnlaVzUwUzJWNUlEMGdhMlY1Y3lBL0lHdGxlWE5iYVc1a1pYaGRJRG9nYVc1a1pYZzdYRzRnSUNBZ0lDQnBaaUFvSVhCeVpXUnBZMkYwWlNodlltcGJZM1Z5Y21WdWRFdGxlVjBzSUdOMWNuSmxiblJMWlhrc0lHOWlhaWtwSUhKbGRIVnliaUJtWVd4elpUdGNiaUFnSUNCOVhHNGdJQ0FnY21WMGRYSnVJSFJ5ZFdVN1hHNGdJSDA3WEc1Y2JpQWdMeThnUkdWMFpYSnRhVzVsSUdsbUlHRjBJR3hsWVhOMElHOXVaU0JsYkdWdFpXNTBJR2x1SUhSb1pTQnZZbXBsWTNRZ2JXRjBZMmhsY3lCaElIUnlkWFJvSUhSbGMzUXVYRzRnSUM4dklFRnNhV0Z6WldRZ1lYTWdZR0Z1ZVdBdVhHNGdJRjh1YzI5dFpTQTlJRjh1WVc1NUlEMGdablZ1WTNScGIyNG9iMkpxTENCd2NtVmthV05oZEdVc0lHTnZiblJsZUhRcElIdGNiaUFnSUNCd2NtVmthV05oZEdVZ1BTQmpZaWh3Y21Wa2FXTmhkR1VzSUdOdmJuUmxlSFFwTzF4dUlDQWdJSFpoY2lCclpYbHpJRDBnSVdselFYSnlZWGxNYVd0bEtHOWlhaWtnSmlZZ1h5NXJaWGx6S0c5aWFpa3NYRzRnSUNBZ0lDQWdJR3hsYm1kMGFDQTlJQ2hyWlhseklIeDhJRzlpYWlrdWJHVnVaM1JvTzF4dUlDQWdJR1p2Y2lBb2RtRnlJR2x1WkdWNElEMGdNRHNnYVc1a1pYZ2dQQ0JzWlc1bmRHZzdJR2x1WkdWNEt5c3BJSHRjYmlBZ0lDQWdJSFpoY2lCamRYSnlaVzUwUzJWNUlEMGdhMlY1Y3lBL0lHdGxlWE5iYVc1a1pYaGRJRG9nYVc1a1pYZzdYRzRnSUNBZ0lDQnBaaUFvY0hKbFpHbGpZWFJsS0c5aWFsdGpkWEp5Wlc1MFMyVjVYU3dnWTNWeWNtVnVkRXRsZVN3Z2IySnFLU2tnY21WMGRYSnVJSFJ5ZFdVN1hHNGdJQ0FnZlZ4dUlDQWdJSEpsZEhWeWJpQm1ZV3h6WlR0Y2JpQWdmVHRjYmx4dUlDQXZMeUJFWlhSbGNtMXBibVVnYVdZZ2RHaGxJR0Z5Y21GNUlHOXlJRzlpYW1WamRDQmpiMjUwWVdsdWN5QmhJR2RwZG1WdUlHbDBaVzBnS0hWemFXNW5JR0E5UFQxZ0tTNWNiaUFnTHk4Z1FXeHBZWE5sWkNCaGN5QmdhVzVqYkhWa1pYTmdJR0Z1WkNCZ2FXNWpiSFZrWldBdVhHNGdJRjh1WTI5dWRHRnBibk1nUFNCZkxtbHVZMngxWkdWeklEMGdYeTVwYm1Oc2RXUmxJRDBnWm5WdVkzUnBiMjRvYjJKcUxDQnBkR1Z0TENCbWNtOXRTVzVrWlhnc0lHZDFZWEprS1NCN1hHNGdJQ0FnYVdZZ0tDRnBjMEZ5Y21GNVRHbHJaU2h2WW1vcEtTQnZZbW9nUFNCZkxuWmhiSFZsY3lodlltb3BPMXh1SUNBZ0lHbG1JQ2gwZVhCbGIyWWdabkp2YlVsdVpHVjRJQ0U5SUNkdWRXMWlaWEluSUh4OElHZDFZWEprS1NCbWNtOXRTVzVrWlhnZ1BTQXdPMXh1SUNBZ0lISmxkSFZ5YmlCZkxtbHVaR1Y0VDJZb2IySnFMQ0JwZEdWdExDQm1jbTl0U1c1a1pYZ3BJRDQ5SURBN1hHNGdJSDA3WEc1Y2JpQWdMeThnU1c1MmIydGxJR0VnYldWMGFHOWtJQ2gzYVhSb0lHRnlaM1Z0Wlc1MGN5a2diMjRnWlhabGNua2dhWFJsYlNCcGJpQmhJR052Ykd4bFkzUnBiMjR1WEc0Z0lGOHVhVzUyYjJ0bElEMGdjbVZ6ZEVGeVozVnRaVzUwY3lobWRXNWpkR2x2Ymlodlltb3NJSEJoZEdnc0lHRnlaM01wSUh0Y2JpQWdJQ0IyWVhJZ1kyOXVkR1Y0ZEZCaGRHZ3NJR1oxYm1NN1hHNGdJQ0FnYVdZZ0tGOHVhWE5HZFc1amRHbHZiaWh3WVhSb0tTa2dlMXh1SUNBZ0lDQWdablZ1WXlBOUlIQmhkR2c3WEc0Z0lDQWdmU0JsYkhObElHbG1JQ2hmTG1selFYSnlZWGtvY0dGMGFDa3BJSHRjYmlBZ0lDQWdJR052Ym5SbGVIUlFZWFJvSUQwZ2NHRjBhQzV6YkdsalpTZ3dMQ0F0TVNrN1hHNGdJQ0FnSUNCd1lYUm9JRDBnY0dGMGFGdHdZWFJvTG14bGJtZDBhQ0F0SURGZE8xeHVJQ0FnSUgxY2JpQWdJQ0J5WlhSMWNtNGdYeTV0WVhBb2IySnFMQ0JtZFc1amRHbHZiaWhqYjI1MFpYaDBLU0I3WEc0Z0lDQWdJQ0IyWVhJZ2JXVjBhRzlrSUQwZ1puVnVZenRjYmlBZ0lDQWdJR2xtSUNnaGJXVjBhRzlrS1NCN1hHNGdJQ0FnSUNBZ0lHbG1JQ2hqYjI1MFpYaDBVR0YwYUNBbUppQmpiMjUwWlhoMFVHRjBhQzVzWlc1bmRHZ3BJSHRjYmlBZ0lDQWdJQ0FnSUNCamIyNTBaWGgwSUQwZ1pHVmxjRWRsZENoamIyNTBaWGgwTENCamIyNTBaWGgwVUdGMGFDazdYRzRnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnYVdZZ0tHTnZiblJsZUhRZ1BUMGdiblZzYkNrZ2NtVjBkWEp1SUhadmFXUWdNRHRjYmlBZ0lDQWdJQ0FnYldWMGFHOWtJRDBnWTI5dWRHVjRkRnR3WVhSb1hUdGNiaUFnSUNBZ0lIMWNiaUFnSUNBZ0lISmxkSFZ5YmlCdFpYUm9iMlFnUFQwZ2JuVnNiQ0EvSUcxbGRHaHZaQ0E2SUcxbGRHaHZaQzVoY0hCc2VTaGpiMjUwWlhoMExDQmhjbWR6S1R0Y2JpQWdJQ0I5S1R0Y2JpQWdmU2s3WEc1Y2JpQWdMeThnUTI5dWRtVnVhV1Z1WTJVZ2RtVnljMmx2YmlCdlppQmhJR052YlcxdmJpQjFjMlVnWTJGelpTQnZaaUJnYldGd1lEb2dabVYwWTJocGJtY2dZU0J3Y205d1pYSjBlUzVjYmlBZ1h5NXdiSFZqYXlBOUlHWjFibU4wYVc5dUtHOWlhaXdnYTJWNUtTQjdYRzRnSUNBZ2NtVjBkWEp1SUY4dWJXRndLRzlpYWl3Z1h5NXdjbTl3WlhKMGVTaHJaWGtwS1R0Y2JpQWdmVHRjYmx4dUlDQXZMeUJEYjI1MlpXNXBaVzVqWlNCMlpYSnphVzl1SUc5bUlHRWdZMjl0Ylc5dUlIVnpaU0JqWVhObElHOW1JR0JtYVd4MFpYSmdPaUJ6Wld4bFkzUnBibWNnYjI1c2VTQnZZbXBsWTNSelhHNGdJQzh2SUdOdmJuUmhhVzVwYm1jZ2MzQmxZMmxtYVdNZ1lHdGxlVHAyWVd4MVpXQWdjR0ZwY25NdVhHNGdJRjh1ZDJobGNtVWdQU0JtZFc1amRHbHZiaWh2WW1vc0lHRjBkSEp6S1NCN1hHNGdJQ0FnY21WMGRYSnVJRjh1Wm1sc2RHVnlLRzlpYWl3Z1h5NXRZWFJqYUdWeUtHRjBkSEp6S1NrN1hHNGdJSDA3WEc1Y2JpQWdMeThnUTI5dWRtVnVhV1Z1WTJVZ2RtVnljMmx2YmlCdlppQmhJR052YlcxdmJpQjFjMlVnWTJGelpTQnZaaUJnWm1sdVpHQTZJR2RsZEhScGJtY2dkR2hsSUdacGNuTjBJRzlpYW1WamRGeHVJQ0F2THlCamIyNTBZV2x1YVc1bklITndaV05wWm1saklHQnJaWGs2ZG1Gc2RXVmdJSEJoYVhKekxseHVJQ0JmTG1acGJtUlhhR1Z5WlNBOUlHWjFibU4wYVc5dUtHOWlhaXdnWVhSMGNuTXBJSHRjYmlBZ0lDQnlaWFIxY200Z1h5NW1hVzVrS0c5aWFpd2dYeTV0WVhSamFHVnlLR0YwZEhKektTazdYRzRnSUgwN1hHNWNiaUFnTHk4Z1VtVjBkWEp1SUhSb1pTQnRZWGhwYlhWdElHVnNaVzFsYm5RZ0tHOXlJR1ZzWlcxbGJuUXRZbUZ6WldRZ1kyOXRjSFYwWVhScGIyNHBMbHh1SUNCZkxtMWhlQ0E5SUdaMWJtTjBhVzl1S0c5aWFpd2dhWFJsY21GMFpXVXNJR052Ym5SbGVIUXBJSHRjYmlBZ0lDQjJZWElnY21WemRXeDBJRDBnTFVsdVptbHVhWFI1TENCc1lYTjBRMjl0Y0hWMFpXUWdQU0F0U1c1bWFXNXBkSGtzWEc0Z0lDQWdJQ0FnSUhaaGJIVmxMQ0JqYjIxd2RYUmxaRHRjYmlBZ0lDQnBaaUFvYVhSbGNtRjBaV1VnUFQwZ2JuVnNiQ0I4ZkNCMGVYQmxiMllnYVhSbGNtRjBaV1VnUFQwZ0oyNTFiV0psY2ljZ0ppWWdkSGx3Wlc5bUlHOWlhbHN3WFNBaFBTQW5iMkpxWldOMEp5QW1KaUJ2WW1vZ0lUMGdiblZzYkNrZ2UxeHVJQ0FnSUNBZ2IySnFJRDBnYVhOQmNuSmhlVXhwYTJVb2IySnFLU0EvSUc5aWFpQTZJRjh1ZG1Gc2RXVnpLRzlpYWlrN1hHNGdJQ0FnSUNCbWIzSWdLSFpoY2lCcElEMGdNQ3dnYkdWdVozUm9JRDBnYjJKcUxteGxibWQwYURzZ2FTQThJR3hsYm1kMGFEc2dhU3NyS1NCN1hHNGdJQ0FnSUNBZ0lIWmhiSFZsSUQwZ2IySnFXMmxkTzF4dUlDQWdJQ0FnSUNCcFppQW9kbUZzZFdVZ0lUMGdiblZzYkNBbUppQjJZV3gxWlNBK0lISmxjM1ZzZENrZ2UxeHVJQ0FnSUNBZ0lDQWdJSEpsYzNWc2RDQTlJSFpoYkhWbE8xeHVJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQjlYRzRnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUdsMFpYSmhkR1ZsSUQwZ1kySW9hWFJsY21GMFpXVXNJR052Ym5SbGVIUXBPMXh1SUNBZ0lDQWdYeTVsWVdOb0tHOWlhaXdnWm5WdVkzUnBiMjRvZGl3Z2FXNWtaWGdzSUd4cGMzUXBJSHRjYmlBZ0lDQWdJQ0FnWTI5dGNIVjBaV1FnUFNCcGRHVnlZWFJsWlNoMkxDQnBibVJsZUN3Z2JHbHpkQ2s3WEc0Z0lDQWdJQ0FnSUdsbUlDaGpiMjF3ZFhSbFpDQStJR3hoYzNSRGIyMXdkWFJsWkNCOGZDQmpiMjF3ZFhSbFpDQTlQVDBnTFVsdVptbHVhWFI1SUNZbUlISmxjM1ZzZENBOVBUMGdMVWx1Wm1sdWFYUjVLU0I3WEc0Z0lDQWdJQ0FnSUNBZ2NtVnpkV3gwSUQwZ2RqdGNiaUFnSUNBZ0lDQWdJQ0JzWVhOMFEyOXRjSFYwWldRZ1BTQmpiMjF3ZFhSbFpEdGNiaUFnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdmU2s3WEc0Z0lDQWdmVnh1SUNBZ0lISmxkSFZ5YmlCeVpYTjFiSFE3WEc0Z0lIMDdYRzVjYmlBZ0x5OGdVbVYwZFhKdUlIUm9aU0J0YVc1cGJYVnRJR1ZzWlcxbGJuUWdLRzl5SUdWc1pXMWxiblF0WW1GelpXUWdZMjl0Y0hWMFlYUnBiMjRwTGx4dUlDQmZMbTFwYmlBOUlHWjFibU4wYVc5dUtHOWlhaXdnYVhSbGNtRjBaV1VzSUdOdmJuUmxlSFFwSUh0Y2JpQWdJQ0IyWVhJZ2NtVnpkV3gwSUQwZ1NXNW1hVzVwZEhrc0lHeGhjM1JEYjIxd2RYUmxaQ0E5SUVsdVptbHVhWFI1TEZ4dUlDQWdJQ0FnSUNCMllXeDFaU3dnWTI5dGNIVjBaV1E3WEc0Z0lDQWdhV1lnS0dsMFpYSmhkR1ZsSUQwOUlHNTFiR3dnZkh3Z2RIbHdaVzltSUdsMFpYSmhkR1ZsSUQwOUlDZHVkVzFpWlhJbklDWW1JSFI1Y0dWdlppQnZZbXBiTUYwZ0lUMGdKMjlpYW1WamRDY2dKaVlnYjJKcUlDRTlJRzUxYkd3cElIdGNiaUFnSUNBZ0lHOWlhaUE5SUdselFYSnlZWGxNYVd0bEtHOWlhaWtnUHlCdlltb2dPaUJmTG5aaGJIVmxjeWh2WW1vcE8xeHVJQ0FnSUNBZ1ptOXlJQ2gyWVhJZ2FTQTlJREFzSUd4bGJtZDBhQ0E5SUc5aWFpNXNaVzVuZEdnN0lHa2dQQ0JzWlc1bmRHZzdJR2tyS3lrZ2UxeHVJQ0FnSUNBZ0lDQjJZV3gxWlNBOUlHOWlhbHRwWFR0Y2JpQWdJQ0FnSUNBZ2FXWWdLSFpoYkhWbElDRTlJRzUxYkd3Z0ppWWdkbUZzZFdVZ1BDQnlaWE4xYkhRcElIdGNiaUFnSUNBZ0lDQWdJQ0J5WlhOMWJIUWdQU0IyWVd4MVpUdGNiaUFnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdmVnh1SUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNCcGRHVnlZWFJsWlNBOUlHTmlLR2wwWlhKaGRHVmxMQ0JqYjI1MFpYaDBLVHRjYmlBZ0lDQWdJRjh1WldGamFDaHZZbW9zSUdaMWJtTjBhVzl1S0hZc0lHbHVaR1Y0TENCc2FYTjBLU0I3WEc0Z0lDQWdJQ0FnSUdOdmJYQjFkR1ZrSUQwZ2FYUmxjbUYwWldVb2Rpd2dhVzVrWlhnc0lHeHBjM1FwTzF4dUlDQWdJQ0FnSUNCcFppQW9ZMjl0Y0hWMFpXUWdQQ0JzWVhOMFEyOXRjSFYwWldRZ2ZId2dZMjl0Y0hWMFpXUWdQVDA5SUVsdVptbHVhWFI1SUNZbUlISmxjM1ZzZENBOVBUMGdTVzVtYVc1cGRIa3BJSHRjYmlBZ0lDQWdJQ0FnSUNCeVpYTjFiSFFnUFNCMk8xeHVJQ0FnSUNBZ0lDQWdJR3hoYzNSRGIyMXdkWFJsWkNBOUlHTnZiWEIxZEdWa08xeHVJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQjlLVHRjYmlBZ0lDQjlYRzRnSUNBZ2NtVjBkWEp1SUhKbGMzVnNkRHRjYmlBZ2ZUdGNibHh1SUNBdkx5QlRhSFZtWm14bElHRWdZMjlzYkdWamRHbHZiaTVjYmlBZ1h5NXphSFZtWm14bElEMGdablZ1WTNScGIyNG9iMkpxS1NCN1hHNGdJQ0FnY21WMGRYSnVJRjh1YzJGdGNHeGxLRzlpYWl3Z1NXNW1hVzVwZEhrcE8xeHVJQ0I5TzF4dVhHNGdJQzh2SUZOaGJYQnNaU0FxS200cUtpQnlZVzVrYjIwZ2RtRnNkV1Z6SUdaeWIyMGdZU0JqYjJ4c1pXTjBhVzl1SUhWemFXNW5JSFJvWlNCdGIyUmxjbTRnZG1WeWMybHZiaUJ2WmlCMGFHVmNiaUFnTHk4Z1cwWnBjMmhsY2kxWllYUmxjeUJ6YUhWbVpteGxYU2hvZEhSd09pOHZaVzR1ZDJscmFYQmxaR2xoTG05eVp5OTNhV3RwTDBacGMyaGxjdUtBazFsaGRHVnpYM05vZFdabWJHVXBMbHh1SUNBdkx5QkpaaUFxS200cUtpQnBjeUJ1YjNRZ2MzQmxZMmxtYVdWa0xDQnlaWFIxY201eklHRWdjMmx1WjJ4bElISmhibVJ2YlNCbGJHVnRaVzUwTGx4dUlDQXZMeUJVYUdVZ2FXNTBaWEp1WVd3Z1lHZDFZWEprWUNCaGNtZDFiV1Z1ZENCaGJHeHZkM01nYVhRZ2RHOGdkMjl5YXlCM2FYUm9JR0J0WVhCZ0xseHVJQ0JmTG5OaGJYQnNaU0E5SUdaMWJtTjBhVzl1S0c5aWFpd2diaXdnWjNWaGNtUXBJSHRjYmlBZ0lDQnBaaUFvYmlBOVBTQnVkV3hzSUh4OElHZDFZWEprS1NCN1hHNGdJQ0FnSUNCcFppQW9JV2x6UVhKeVlYbE1hV3RsS0c5aWFpa3BJRzlpYWlBOUlGOHVkbUZzZFdWektHOWlhaWs3WEc0Z0lDQWdJQ0J5WlhSMWNtNGdiMkpxVzE4dWNtRnVaRzl0S0c5aWFpNXNaVzVuZEdnZ0xTQXhLVjA3WEc0Z0lDQWdmVnh1SUNBZ0lIWmhjaUJ6WVcxd2JHVWdQU0JwYzBGeWNtRjVUR2xyWlNodlltb3BJRDhnWHk1amJHOXVaU2h2WW1vcElEb2dYeTUyWVd4MVpYTW9iMkpxS1R0Y2JpQWdJQ0IyWVhJZ2JHVnVaM1JvSUQwZ1oyVjBUR1Z1WjNSb0tITmhiWEJzWlNrN1hHNGdJQ0FnYmlBOUlFMWhkR2d1YldGNEtFMWhkR2d1YldsdUtHNHNJR3hsYm1kMGFDa3NJREFwTzF4dUlDQWdJSFpoY2lCc1lYTjBJRDBnYkdWdVozUm9JQzBnTVR0Y2JpQWdJQ0JtYjNJZ0tIWmhjaUJwYm1SbGVDQTlJREE3SUdsdVpHVjRJRHdnYmpzZ2FXNWtaWGdyS3lrZ2UxeHVJQ0FnSUNBZ2RtRnlJSEpoYm1RZ1BTQmZMbkpoYm1SdmJTaHBibVJsZUN3Z2JHRnpkQ2s3WEc0Z0lDQWdJQ0IyWVhJZ2RHVnRjQ0E5SUhOaGJYQnNaVnRwYm1SbGVGMDdYRzRnSUNBZ0lDQnpZVzF3YkdWYmFXNWtaWGhkSUQwZ2MyRnRjR3hsVzNKaGJtUmRPMXh1SUNBZ0lDQWdjMkZ0Y0d4bFczSmhibVJkSUQwZ2RHVnRjRHRjYmlBZ0lDQjlYRzRnSUNBZ2NtVjBkWEp1SUhOaGJYQnNaUzV6YkdsalpTZ3dMQ0J1S1R0Y2JpQWdmVHRjYmx4dUlDQXZMeUJUYjNKMElIUm9aU0J2WW1wbFkzUW5jeUIyWVd4MVpYTWdZbmtnWVNCamNtbDBaWEpwYjI0Z2NISnZaSFZqWldRZ1lua2dZVzRnYVhSbGNtRjBaV1V1WEc0Z0lGOHVjMjl5ZEVKNUlEMGdablZ1WTNScGIyNG9iMkpxTENCcGRHVnlZWFJsWlN3Z1kyOXVkR1Y0ZENrZ2UxeHVJQ0FnSUhaaGNpQnBibVJsZUNBOUlEQTdYRzRnSUNBZ2FYUmxjbUYwWldVZ1BTQmpZaWhwZEdWeVlYUmxaU3dnWTI5dWRHVjRkQ2s3WEc0Z0lDQWdjbVYwZFhKdUlGOHVjR3gxWTJzb1h5NXRZWEFvYjJKcUxDQm1kVzVqZEdsdmJpaDJZV3gxWlN3Z2EyVjVMQ0JzYVhOMEtTQjdYRzRnSUNBZ0lDQnlaWFIxY200Z2UxeHVJQ0FnSUNBZ0lDQjJZV3gxWlRvZ2RtRnNkV1VzWEc0Z0lDQWdJQ0FnSUdsdVpHVjRPaUJwYm1SbGVDc3JMRnh1SUNBZ0lDQWdJQ0JqY21sMFpYSnBZVG9nYVhSbGNtRjBaV1VvZG1Gc2RXVXNJR3RsZVN3Z2JHbHpkQ2xjYmlBZ0lDQWdJSDA3WEc0Z0lDQWdmU2t1YzI5eWRDaG1kVzVqZEdsdmJpaHNaV1owTENCeWFXZG9kQ2tnZTF4dUlDQWdJQ0FnZG1GeUlHRWdQU0JzWldaMExtTnlhWFJsY21saE8xeHVJQ0FnSUNBZ2RtRnlJR0lnUFNCeWFXZG9kQzVqY21sMFpYSnBZVHRjYmlBZ0lDQWdJR2xtSUNoaElDRTlQU0JpS1NCN1hHNGdJQ0FnSUNBZ0lHbG1JQ2hoSUQ0Z1lpQjhmQ0JoSUQwOVBTQjJiMmxrSURBcElISmxkSFZ5YmlBeE8xeHVJQ0FnSUNBZ0lDQnBaaUFvWVNBOElHSWdmSHdnWWlBOVBUMGdkbTlwWkNBd0tTQnlaWFIxY200Z0xURTdYRzRnSUNBZ0lDQjlYRzRnSUNBZ0lDQnlaWFIxY200Z2JHVm1kQzVwYm1SbGVDQXRJSEpwWjJoMExtbHVaR1Y0TzF4dUlDQWdJSDBwTENBbmRtRnNkV1VuS1R0Y2JpQWdmVHRjYmx4dUlDQXZMeUJCYmlCcGJuUmxjbTVoYkNCbWRXNWpkR2x2YmlCMWMyVmtJR1p2Y2lCaFoyZHlaV2RoZEdVZ1hDSm5jbTkxY0NCaWVWd2lJRzl3WlhKaGRHbHZibk11WEc0Z0lIWmhjaUJuY205MWNDQTlJR1oxYm1OMGFXOXVLR0psYUdGMmFXOXlMQ0J3WVhKMGFYUnBiMjRwSUh0Y2JpQWdJQ0J5WlhSMWNtNGdablZ1WTNScGIyNG9iMkpxTENCcGRHVnlZWFJsWlN3Z1kyOXVkR1Y0ZENrZ2UxeHVJQ0FnSUNBZ2RtRnlJSEpsYzNWc2RDQTlJSEJoY25ScGRHbHZiaUEvSUZ0YlhTd2dXMTFkSURvZ2UzMDdYRzRnSUNBZ0lDQnBkR1Z5WVhSbFpTQTlJR05pS0dsMFpYSmhkR1ZsTENCamIyNTBaWGgwS1R0Y2JpQWdJQ0FnSUY4dVpXRmphQ2h2WW1vc0lHWjFibU4wYVc5dUtIWmhiSFZsTENCcGJtUmxlQ2tnZTF4dUlDQWdJQ0FnSUNCMllYSWdhMlY1SUQwZ2FYUmxjbUYwWldVb2RtRnNkV1VzSUdsdVpHVjRMQ0J2WW1vcE8xeHVJQ0FnSUNBZ0lDQmlaV2hoZG1sdmNpaHlaWE4xYkhRc0lIWmhiSFZsTENCclpYa3BPMXh1SUNBZ0lDQWdmU2s3WEc0Z0lDQWdJQ0J5WlhSMWNtNGdjbVZ6ZFd4ME8xeHVJQ0FnSUgwN1hHNGdJSDA3WEc1Y2JpQWdMeThnUjNKdmRYQnpJSFJvWlNCdlltcGxZM1FuY3lCMllXeDFaWE1nWW5rZ1lTQmpjbWwwWlhKcGIyNHVJRkJoYzNNZ1pXbDBhR1Z5SUdFZ2MzUnlhVzVuSUdGMGRISnBZblYwWlZ4dUlDQXZMeUIwYnlCbmNtOTFjQ0JpZVN3Z2IzSWdZU0JtZFc1amRHbHZiaUIwYUdGMElISmxkSFZ5Ym5NZ2RHaGxJR055YVhSbGNtbHZiaTVjYmlBZ1h5NW5jbTkxY0VKNUlEMGdaM0p2ZFhBb1puVnVZM1JwYjI0b2NtVnpkV3gwTENCMllXeDFaU3dnYTJWNUtTQjdYRzRnSUNBZ2FXWWdLR2hoY3loeVpYTjFiSFFzSUd0bGVTa3BJSEpsYzNWc2RGdHJaWGxkTG5CMWMyZ29kbUZzZFdVcE95QmxiSE5sSUhKbGMzVnNkRnRyWlhsZElEMGdXM1poYkhWbFhUdGNiaUFnZlNrN1hHNWNiaUFnTHk4Z1NXNWtaWGhsY3lCMGFHVWdiMkpxWldOMEozTWdkbUZzZFdWeklHSjVJR0VnWTNKcGRHVnlhVzl1TENCemFXMXBiR0Z5SUhSdklHQm5jbTkxY0VKNVlDd2dZblYwSUdadmNseHVJQ0F2THlCM2FHVnVJSGx2ZFNCcmJtOTNJSFJvWVhRZ2VXOTFjaUJwYm1SbGVDQjJZV3gxWlhNZ2QybHNiQ0JpWlNCMWJtbHhkV1V1WEc0Z0lGOHVhVzVrWlhoQ2VTQTlJR2R5YjNWd0tHWjFibU4wYVc5dUtISmxjM1ZzZEN3Z2RtRnNkV1VzSUd0bGVTa2dlMXh1SUNBZ0lISmxjM1ZzZEZ0clpYbGRJRDBnZG1Gc2RXVTdYRzRnSUgwcE8xeHVYRzRnSUM4dklFTnZkVzUwY3lCcGJuTjBZVzVqWlhNZ2IyWWdZVzRnYjJKcVpXTjBJSFJvWVhRZ1ozSnZkWEFnWW5rZ1lTQmpaWEowWVdsdUlHTnlhWFJsY21sdmJpNGdVR0Z6YzF4dUlDQXZMeUJsYVhSb1pYSWdZU0J6ZEhKcGJtY2dZWFIwY21saWRYUmxJSFJ2SUdOdmRXNTBJR0o1TENCdmNpQmhJR1oxYm1OMGFXOXVJSFJvWVhRZ2NtVjBkWEp1Y3lCMGFHVmNiaUFnTHk4Z1kzSnBkR1Z5YVc5dUxseHVJQ0JmTG1OdmRXNTBRbmtnUFNCbmNtOTFjQ2htZFc1amRHbHZiaWh5WlhOMWJIUXNJSFpoYkhWbExDQnJaWGtwSUh0Y2JpQWdJQ0JwWmlBb2FHRnpLSEpsYzNWc2RDd2dhMlY1S1NrZ2NtVnpkV3gwVzJ0bGVWMHJLenNnWld4elpTQnlaWE4xYkhSYmEyVjVYU0E5SURFN1hHNGdJSDBwTzF4dVhHNGdJSFpoY2lCeVpWTjBjbE41YldKdmJDQTlJQzliWGx4Y2RXUTRNREF0WEZ4MVpHWm1abDE4VzF4Y2RXUTRNREF0WEZ4MVpHSm1abDFiWEZ4MVpHTXdNQzFjWEhWa1ptWm1YWHhiWEZ4MVpEZ3dNQzFjWEhWa1ptWm1YUzluTzF4dUlDQXZMeUJUWVdabGJIa2dZM0psWVhSbElHRWdjbVZoYkN3Z2JHbDJaU0JoY25KaGVTQm1jbTl0SUdGdWVYUm9hVzVuSUdsMFpYSmhZbXhsTGx4dUlDQmZMblJ2UVhKeVlYa2dQU0JtZFc1amRHbHZiaWh2WW1vcElIdGNiaUFnSUNCcFppQW9JVzlpYWlrZ2NtVjBkWEp1SUZ0ZE8xeHVJQ0FnSUdsbUlDaGZMbWx6UVhKeVlYa29iMkpxS1NrZ2NtVjBkWEp1SUhOc2FXTmxMbU5oYkd3b2IySnFLVHRjYmlBZ0lDQnBaaUFvWHk1cGMxTjBjbWx1Wnlodlltb3BLU0I3WEc0Z0lDQWdJQ0F2THlCTFpXVndJSE4xY25KdloyRjBaU0J3WVdseUlHTm9ZWEpoWTNSbGNuTWdkRzluWlhSb1pYSmNiaUFnSUNBZ0lISmxkSFZ5YmlCdlltb3ViV0YwWTJnb2NtVlRkSEpUZVcxaWIyd3BPMXh1SUNBZ0lIMWNiaUFnSUNCcFppQW9hWE5CY25KaGVVeHBhMlVvYjJKcUtTa2djbVYwZFhKdUlGOHViV0Z3S0c5aWFpd2dYeTVwWkdWdWRHbDBlU2s3WEc0Z0lDQWdjbVYwZFhKdUlGOHVkbUZzZFdWektHOWlhaWs3WEc0Z0lIMDdYRzVjYmlBZ0x5OGdVbVYwZFhKdUlIUm9aU0J1ZFcxaVpYSWdiMllnWld4bGJXVnVkSE1nYVc0Z1lXNGdiMkpxWldOMExseHVJQ0JmTG5OcGVtVWdQU0JtZFc1amRHbHZiaWh2WW1vcElIdGNiaUFnSUNCcFppQW9iMkpxSUQwOUlHNTFiR3dwSUhKbGRIVnliaUF3TzF4dUlDQWdJSEpsZEhWeWJpQnBjMEZ5Y21GNVRHbHJaU2h2WW1vcElEOGdiMkpxTG14bGJtZDBhQ0E2SUY4dWEyVjVjeWh2WW1vcExteGxibWQwYUR0Y2JpQWdmVHRjYmx4dUlDQXZMeUJUY0d4cGRDQmhJR052Ykd4bFkzUnBiMjRnYVc1MGJ5QjBkMjhnWVhKeVlYbHpPaUJ2Ym1VZ2QyaHZjMlVnWld4bGJXVnVkSE1nWVd4c0lITmhkR2x6Wm5rZ2RHaGxJR2RwZG1WdVhHNGdJQzh2SUhCeVpXUnBZMkYwWlN3Z1lXNWtJRzl1WlNCM2FHOXpaU0JsYkdWdFpXNTBjeUJoYkd3Z1pHOGdibTkwSUhOaGRHbHpabmtnZEdobElIQnlaV1JwWTJGMFpTNWNiaUFnWHk1d1lYSjBhWFJwYjI0Z1BTQm5jbTkxY0NobWRXNWpkR2x2YmloeVpYTjFiSFFzSUhaaGJIVmxMQ0J3WVhOektTQjdYRzRnSUNBZ2NtVnpkV3gwVzNCaGMzTWdQeUF3SURvZ01WMHVjSFZ6YUNoMllXeDFaU2s3WEc0Z0lIMHNJSFJ5ZFdVcE8xeHVYRzRnSUM4dklFRnljbUY1SUVaMWJtTjBhVzl1YzF4dUlDQXZMeUF0TFMwdExTMHRMUzB0TFMwdExTMWNibHh1SUNBdkx5QkhaWFFnZEdobElHWnBjbk4wSUdWc1pXMWxiblFnYjJZZ1lXNGdZWEp5WVhrdUlGQmhjM05wYm1jZ0tpcHVLaW9nZDJsc2JDQnlaWFIxY200Z2RHaGxJR1pwY25OMElFNWNiaUFnTHk4Z2RtRnNkV1Z6SUdsdUlIUm9aU0JoY25KaGVTNGdRV3hwWVhObFpDQmhjeUJnYUdWaFpHQWdZVzVrSUdCMFlXdGxZQzRnVkdobElDb3FaM1ZoY21RcUtpQmphR1ZqYTF4dUlDQXZMeUJoYkd4dmQzTWdhWFFnZEc4Z2QyOXlheUIzYVhSb0lHQmZMbTFoY0dBdVhHNGdJRjh1Wm1seWMzUWdQU0JmTG1obFlXUWdQU0JmTG5SaGEyVWdQU0JtZFc1amRHbHZiaWhoY25KaGVTd2diaXdnWjNWaGNtUXBJSHRjYmlBZ0lDQnBaaUFvWVhKeVlYa2dQVDBnYm5Wc2JDQjhmQ0JoY25KaGVTNXNaVzVuZEdnZ1BDQXhLU0J5WlhSMWNtNGdiaUE5UFNCdWRXeHNJRDhnZG05cFpDQXdJRG9nVzEwN1hHNGdJQ0FnYVdZZ0tHNGdQVDBnYm5Wc2JDQjhmQ0JuZFdGeVpDa2djbVYwZFhKdUlHRnljbUY1V3pCZE8xeHVJQ0FnSUhKbGRIVnliaUJmTG1sdWFYUnBZV3dvWVhKeVlYa3NJR0Z5Y21GNUxteGxibWQwYUNBdElHNHBPMXh1SUNCOU8xeHVYRzRnSUM4dklGSmxkSFZ5Ym5NZ1pYWmxjbmwwYUdsdVp5QmlkWFFnZEdobElHeGhjM1FnWlc1MGNua2diMllnZEdobElHRnljbUY1TGlCRmMzQmxZMmxoYkd4NUlIVnpaV1oxYkNCdmJseHVJQ0F2THlCMGFHVWdZWEpuZFcxbGJuUnpJRzlpYW1WamRDNGdVR0Z6YzJsdVp5QXFLbTRxS2lCM2FXeHNJSEpsZEhWeWJpQmhiR3dnZEdobElIWmhiSFZsY3lCcGJseHVJQ0F2THlCMGFHVWdZWEp5WVhrc0lHVjRZMngxWkdsdVp5QjBhR1VnYkdGemRDQk9MbHh1SUNCZkxtbHVhWFJwWVd3Z1BTQm1kVzVqZEdsdmJpaGhjbkpoZVN3Z2Jpd2daM1ZoY21RcElIdGNiaUFnSUNCeVpYUjFjbTRnYzJ4cFkyVXVZMkZzYkNoaGNuSmhlU3dnTUN3Z1RXRjBhQzV0WVhnb01Dd2dZWEp5WVhrdWJHVnVaM1JvSUMwZ0tHNGdQVDBnYm5Wc2JDQjhmQ0JuZFdGeVpDQS9JREVnT2lCdUtTa3BPMXh1SUNCOU8xeHVYRzRnSUM4dklFZGxkQ0IwYUdVZ2JHRnpkQ0JsYkdWdFpXNTBJRzltSUdGdUlHRnljbUY1TGlCUVlYTnphVzVuSUNvcWJpb3FJSGRwYkd3Z2NtVjBkWEp1SUhSb1pTQnNZWE4wSUU1Y2JpQWdMeThnZG1Gc2RXVnpJR2x1SUhSb1pTQmhjbkpoZVM1Y2JpQWdYeTVzWVhOMElEMGdablZ1WTNScGIyNG9ZWEp5WVhrc0lHNHNJR2QxWVhKa0tTQjdYRzRnSUNBZ2FXWWdLR0Z5Y21GNUlEMDlJRzUxYkd3Z2ZId2dZWEp5WVhrdWJHVnVaM1JvSUR3Z01Ta2djbVYwZFhKdUlHNGdQVDBnYm5Wc2JDQS9JSFp2YVdRZ01DQTZJRnRkTzF4dUlDQWdJR2xtSUNodUlEMDlJRzUxYkd3Z2ZId2daM1ZoY21RcElISmxkSFZ5YmlCaGNuSmhlVnRoY25KaGVTNXNaVzVuZEdnZ0xTQXhYVHRjYmlBZ0lDQnlaWFIxY200Z1h5NXlaWE4wS0dGeWNtRjVMQ0JOWVhSb0xtMWhlQ2d3TENCaGNuSmhlUzVzWlc1bmRHZ2dMU0J1S1NrN1hHNGdJSDA3WEc1Y2JpQWdMeThnVW1WMGRYSnVjeUJsZG1WeWVYUm9hVzVuSUdKMWRDQjBhR1VnWm1seWMzUWdaVzUwY25rZ2IyWWdkR2hsSUdGeWNtRjVMaUJCYkdsaGMyVmtJR0Z6SUdCMFlXbHNZQ0JoYm1RZ1lHUnliM0JnTGx4dUlDQXZMeUJGYzNCbFkybGhiR3g1SUhWelpXWjFiQ0J2YmlCMGFHVWdZWEpuZFcxbGJuUnpJRzlpYW1WamRDNGdVR0Z6YzJsdVp5QmhiaUFxS200cUtpQjNhV3hzSUhKbGRIVnlibHh1SUNBdkx5QjBhR1VnY21WemRDQk9JSFpoYkhWbGN5QnBiaUIwYUdVZ1lYSnlZWGt1WEc0Z0lGOHVjbVZ6ZENBOUlGOHVkR0ZwYkNBOUlGOHVaSEp2Y0NBOUlHWjFibU4wYVc5dUtHRnljbUY1TENCdUxDQm5kV0Z5WkNrZ2UxeHVJQ0FnSUhKbGRIVnliaUJ6YkdsalpTNWpZV3hzS0dGeWNtRjVMQ0J1SUQwOUlHNTFiR3dnZkh3Z1ozVmhjbVFnUHlBeElEb2diaWs3WEc0Z0lIMDdYRzVjYmlBZ0x5OGdWSEpwYlNCdmRYUWdZV3hzSUdaaGJITjVJSFpoYkhWbGN5Qm1jbTl0SUdGdUlHRnljbUY1TGx4dUlDQmZMbU52YlhCaFkzUWdQU0JtZFc1amRHbHZiaWhoY25KaGVTa2dlMXh1SUNBZ0lISmxkSFZ5YmlCZkxtWnBiSFJsY2loaGNuSmhlU3dnUW05dmJHVmhiaWs3WEc0Z0lIMDdYRzVjYmlBZ0x5OGdTVzUwWlhKdVlXd2dhVzF3YkdWdFpXNTBZWFJwYjI0Z2IyWWdZU0J5WldOMWNuTnBkbVVnWUdac1lYUjBaVzVnSUdaMWJtTjBhVzl1TGx4dUlDQjJZWElnWm14aGRIUmxiaUE5SUdaMWJtTjBhVzl1S0dsdWNIVjBMQ0J6YUdGc2JHOTNMQ0J6ZEhKcFkzUXNJRzkxZEhCMWRDa2dlMXh1SUNBZ0lHOTFkSEIxZENBOUlHOTFkSEIxZENCOGZDQmJYVHRjYmlBZ0lDQjJZWElnYVdSNElEMGdiM1YwY0hWMExteGxibWQwYUR0Y2JpQWdJQ0JtYjNJZ0tIWmhjaUJwSUQwZ01Dd2diR1Z1WjNSb0lEMGdaMlYwVEdWdVozUm9LR2x1Y0hWMEtUc2dhU0E4SUd4bGJtZDBhRHNnYVNzcktTQjdYRzRnSUNBZ0lDQjJZWElnZG1Gc2RXVWdQU0JwYm5CMWRGdHBYVHRjYmlBZ0lDQWdJR2xtSUNocGMwRnljbUY1VEdsclpTaDJZV3gxWlNrZ0ppWWdLRjh1YVhOQmNuSmhlU2gyWVd4MVpTa2dmSHdnWHk1cGMwRnlaM1Z0Wlc1MGN5aDJZV3gxWlNrcEtTQjdYRzRnSUNBZ0lDQWdJQzh2SUVac1lYUjBaVzRnWTNWeWNtVnVkQ0JzWlhabGJDQnZaaUJoY25KaGVTQnZjaUJoY21kMWJXVnVkSE1nYjJKcVpXTjBMbHh1SUNBZ0lDQWdJQ0JwWmlBb2MyaGhiR3h2ZHlrZ2UxeHVJQ0FnSUNBZ0lDQWdJSFpoY2lCcUlEMGdNQ3dnYkdWdUlEMGdkbUZzZFdVdWJHVnVaM1JvTzF4dUlDQWdJQ0FnSUNBZ0lIZG9hV3hsSUNocUlEd2diR1Z1S1NCdmRYUndkWFJiYVdSNEt5dGRJRDBnZG1Gc2RXVmJhaXNyWFR0Y2JpQWdJQ0FnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUNBZ0lDQm1iR0YwZEdWdUtIWmhiSFZsTENCemFHRnNiRzkzTENCemRISnBZM1FzSUc5MWRIQjFkQ2s3WEc0Z0lDQWdJQ0FnSUNBZ2FXUjRJRDBnYjNWMGNIVjBMbXhsYm1kMGFEdGNiaUFnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdmU0JsYkhObElHbG1JQ2doYzNSeWFXTjBLU0I3WEc0Z0lDQWdJQ0FnSUc5MWRIQjFkRnRwWkhncksxMGdQU0IyWVd4MVpUdGNiaUFnSUNBZ0lIMWNiaUFnSUNCOVhHNGdJQ0FnY21WMGRYSnVJRzkxZEhCMWREdGNiaUFnZlR0Y2JseHVJQ0F2THlCR2JHRjBkR1Z1SUc5MWRDQmhiaUJoY25KaGVTd2daV2wwYUdWeUlISmxZM1Z5YzJsMlpXeDVJQ2hpZVNCa1pXWmhkV3gwS1N3Z2IzSWdhblZ6ZENCdmJtVWdiR1YyWld3dVhHNGdJRjh1Wm14aGRIUmxiaUE5SUdaMWJtTjBhVzl1S0dGeWNtRjVMQ0J6YUdGc2JHOTNLU0I3WEc0Z0lDQWdjbVYwZFhKdUlHWnNZWFIwWlc0b1lYSnlZWGtzSUhOb1lXeHNiM2NzSUdaaGJITmxLVHRjYmlBZ2ZUdGNibHh1SUNBdkx5QlNaWFIxY200Z1lTQjJaWEp6YVc5dUlHOW1JSFJvWlNCaGNuSmhlU0IwYUdGMElHUnZaWE1nYm05MElHTnZiblJoYVc0Z2RHaGxJSE53WldOcFptbGxaQ0IyWVd4MVpTaHpLUzVjYmlBZ1h5NTNhWFJvYjNWMElEMGdjbVZ6ZEVGeVozVnRaVzUwY3lobWRXNWpkR2x2YmloaGNuSmhlU3dnYjNSb1pYSkJjbkpoZVhNcElIdGNiaUFnSUNCeVpYUjFjbTRnWHk1a2FXWm1aWEpsYm1ObEtHRnljbUY1TENCdmRHaGxja0Z5Y21GNWN5azdYRzRnSUgwcE8xeHVYRzRnSUM4dklGQnliMlIxWTJVZ1lTQmtkWEJzYVdOaGRHVXRabkpsWlNCMlpYSnphVzl1SUc5bUlIUm9aU0JoY25KaGVTNGdTV1lnZEdobElHRnljbUY1SUdoaGN5QmhiSEpsWVdSNVhHNGdJQzh2SUdKbFpXNGdjMjl5ZEdWa0xDQjViM1VnYUdGMlpTQjBhR1VnYjNCMGFXOXVJRzltSUhWemFXNW5JR0VnWm1GemRHVnlJR0ZzWjI5eWFYUm9iUzVjYmlBZ0x5OGdWR2hsSUdaaGMzUmxjaUJoYkdkdmNtbDBhRzBnZDJsc2JDQnViM1FnZDI5eWF5QjNhWFJvSUdGdUlHbDBaWEpoZEdWbElHbG1JSFJvWlNCcGRHVnlZWFJsWlZ4dUlDQXZMeUJwY3lCdWIzUWdZU0J2Ym1VdGRHOHRiMjVsSUdaMWJtTjBhVzl1TENCemJ5QndjbTkyYVdScGJtY2dZVzRnYVhSbGNtRjBaV1VnZDJsc2JDQmthWE5oWW14bFhHNGdJQzh2SUhSb1pTQm1ZWE4wWlhJZ1lXeG5iM0pwZEdodExseHVJQ0F2THlCQmJHbGhjMlZrSUdGeklHQjFibWx4ZFdWZ0xseHVJQ0JmTG5WdWFYRWdQU0JmTG5WdWFYRjFaU0E5SUdaMWJtTjBhVzl1S0dGeWNtRjVMQ0JwYzFOdmNuUmxaQ3dnYVhSbGNtRjBaV1VzSUdOdmJuUmxlSFFwSUh0Y2JpQWdJQ0JwWmlBb0lWOHVhWE5DYjI5c1pXRnVLR2x6VTI5eWRHVmtLU2tnZTF4dUlDQWdJQ0FnWTI5dWRHVjRkQ0E5SUdsMFpYSmhkR1ZsTzF4dUlDQWdJQ0FnYVhSbGNtRjBaV1VnUFNCcGMxTnZjblJsWkR0Y2JpQWdJQ0FnSUdselUyOXlkR1ZrSUQwZ1ptRnNjMlU3WEc0Z0lDQWdmVnh1SUNBZ0lHbG1JQ2hwZEdWeVlYUmxaU0FoUFNCdWRXeHNLU0JwZEdWeVlYUmxaU0E5SUdOaUtHbDBaWEpoZEdWbExDQmpiMjUwWlhoMEtUdGNiaUFnSUNCMllYSWdjbVZ6ZFd4MElEMGdXMTA3WEc0Z0lDQWdkbUZ5SUhObFpXNGdQU0JiWFR0Y2JpQWdJQ0JtYjNJZ0tIWmhjaUJwSUQwZ01Dd2diR1Z1WjNSb0lEMGdaMlYwVEdWdVozUm9LR0Z5Y21GNUtUc2dhU0E4SUd4bGJtZDBhRHNnYVNzcktTQjdYRzRnSUNBZ0lDQjJZWElnZG1Gc2RXVWdQU0JoY25KaGVWdHBYU3hjYmlBZ0lDQWdJQ0FnSUNCamIyMXdkWFJsWkNBOUlHbDBaWEpoZEdWbElEOGdhWFJsY21GMFpXVW9kbUZzZFdVc0lHa3NJR0Z5Y21GNUtTQTZJSFpoYkhWbE8xeHVJQ0FnSUNBZ2FXWWdLR2x6VTI5eWRHVmtJQ1ltSUNGcGRHVnlZWFJsWlNrZ2UxeHVJQ0FnSUNBZ0lDQnBaaUFvSVdrZ2ZId2djMlZsYmlBaFBUMGdZMjl0Y0hWMFpXUXBJSEpsYzNWc2RDNXdkWE5vS0haaGJIVmxLVHRjYmlBZ0lDQWdJQ0FnYzJWbGJpQTlJR052YlhCMWRHVmtPMXh1SUNBZ0lDQWdmU0JsYkhObElHbG1JQ2hwZEdWeVlYUmxaU2tnZTF4dUlDQWdJQ0FnSUNCcFppQW9JVjh1WTI5dWRHRnBibk1vYzJWbGJpd2dZMjl0Y0hWMFpXUXBLU0I3WEc0Z0lDQWdJQ0FnSUNBZ2MyVmxiaTV3ZFhOb0tHTnZiWEIxZEdWa0tUdGNiaUFnSUNBZ0lDQWdJQ0J5WlhOMWJIUXVjSFZ6YUNoMllXeDFaU2s3WEc0Z0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUgwZ1pXeHpaU0JwWmlBb0lWOHVZMjl1ZEdGcGJuTW9jbVZ6ZFd4MExDQjJZV3gxWlNrcElIdGNiaUFnSUNBZ0lDQWdjbVZ6ZFd4MExuQjFjMmdvZG1Gc2RXVXBPMXh1SUNBZ0lDQWdmVnh1SUNBZ0lIMWNiaUFnSUNCeVpYUjFjbTRnY21WemRXeDBPMXh1SUNCOU8xeHVYRzRnSUM4dklGQnliMlIxWTJVZ1lXNGdZWEp5WVhrZ2RHaGhkQ0JqYjI1MFlXbHVjeUIwYUdVZ2RXNXBiMjQ2SUdWaFkyZ2daR2x6ZEdsdVkzUWdaV3hsYldWdWRDQm1jbTl0SUdGc2JDQnZabHh1SUNBdkx5QjBhR1VnY0dGemMyVmtMV2x1SUdGeWNtRjVjeTVjYmlBZ1h5NTFibWx2YmlBOUlISmxjM1JCY21kMWJXVnVkSE1vWm5WdVkzUnBiMjRvWVhKeVlYbHpLU0I3WEc0Z0lDQWdjbVYwZFhKdUlGOHVkVzVwY1NobWJHRjBkR1Z1S0dGeWNtRjVjeXdnZEhKMVpTd2dkSEoxWlNrcE8xeHVJQ0I5S1R0Y2JseHVJQ0F2THlCUWNtOWtkV05sSUdGdUlHRnljbUY1SUhSb1lYUWdZMjl1ZEdGcGJuTWdaWFpsY25rZ2FYUmxiU0J6YUdGeVpXUWdZbVYwZDJWbGJpQmhiR3dnZEdobFhHNGdJQzh2SUhCaGMzTmxaQzFwYmlCaGNuSmhlWE11WEc0Z0lGOHVhVzUwWlhKelpXTjBhVzl1SUQwZ1puVnVZM1JwYjI0b1lYSnlZWGtwSUh0Y2JpQWdJQ0IyWVhJZ2NtVnpkV3gwSUQwZ1cxMDdYRzRnSUNBZ2RtRnlJR0Z5WjNOTVpXNW5kR2dnUFNCaGNtZDFiV1Z1ZEhNdWJHVnVaM1JvTzF4dUlDQWdJR1p2Y2lBb2RtRnlJR2tnUFNBd0xDQnNaVzVuZEdnZ1BTQm5aWFJNWlc1bmRHZ29ZWEp5WVhrcE95QnBJRHdnYkdWdVozUm9PeUJwS3lzcElIdGNiaUFnSUNBZ0lIWmhjaUJwZEdWdElEMGdZWEp5WVhsYmFWMDdYRzRnSUNBZ0lDQnBaaUFvWHk1amIyNTBZV2x1Y3loeVpYTjFiSFFzSUdsMFpXMHBLU0JqYjI1MGFXNTFaVHRjYmlBZ0lDQWdJSFpoY2lCcU8xeHVJQ0FnSUNBZ1ptOXlJQ2hxSUQwZ01Uc2dhaUE4SUdGeVozTk1aVzVuZEdnN0lHb3JLeWtnZTF4dUlDQWdJQ0FnSUNCcFppQW9JVjh1WTI5dWRHRnBibk1vWVhKbmRXMWxiblJ6VzJwZExDQnBkR1Z0S1NrZ1luSmxZV3M3WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdJQ0JwWmlBb2FpQTlQVDBnWVhKbmMweGxibWQwYUNrZ2NtVnpkV3gwTG5CMWMyZ29hWFJsYlNrN1hHNGdJQ0FnZlZ4dUlDQWdJSEpsZEhWeWJpQnlaWE4xYkhRN1hHNGdJSDA3WEc1Y2JpQWdMeThnVkdGclpTQjBhR1VnWkdsbVptVnlaVzVqWlNCaVpYUjNaV1Z1SUc5dVpTQmhjbkpoZVNCaGJtUWdZU0J1ZFcxaVpYSWdiMllnYjNSb1pYSWdZWEp5WVhsekxseHVJQ0F2THlCUGJteDVJSFJvWlNCbGJHVnRaVzUwY3lCd2NtVnpaVzUwSUdsdUlHcDFjM1FnZEdobElHWnBjbk4wSUdGeWNtRjVJSGRwYkd3Z2NtVnRZV2x1TGx4dUlDQmZMbVJwWm1abGNtVnVZMlVnUFNCeVpYTjBRWEpuZFcxbGJuUnpLR1oxYm1OMGFXOXVLR0Z5Y21GNUxDQnlaWE4wS1NCN1hHNGdJQ0FnY21WemRDQTlJR1pzWVhSMFpXNG9jbVZ6ZEN3Z2RISjFaU3dnZEhKMVpTazdYRzRnSUNBZ2NtVjBkWEp1SUY4dVptbHNkR1Z5S0dGeWNtRjVMQ0JtZFc1amRHbHZiaWgyWVd4MVpTbDdYRzRnSUNBZ0lDQnlaWFIxY200Z0lWOHVZMjl1ZEdGcGJuTW9jbVZ6ZEN3Z2RtRnNkV1VwTzF4dUlDQWdJSDBwTzF4dUlDQjlLVHRjYmx4dUlDQXZMeUJEYjIxd2JHVnRaVzUwSUc5bUlGOHVlbWx3TGlCVmJucHBjQ0JoWTJObGNIUnpJR0Z1SUdGeWNtRjVJRzltSUdGeWNtRjVjeUJoYm1RZ1ozSnZkWEJ6WEc0Z0lDOHZJR1ZoWTJnZ1lYSnlZWGtuY3lCbGJHVnRaVzUwY3lCdmJpQnphR0Z5WldRZ2FXNWthV05sY3k1Y2JpQWdYeTUxYm5wcGNDQTlJR1oxYm1OMGFXOXVLR0Z5Y21GNUtTQjdYRzRnSUNBZ2RtRnlJR3hsYm1kMGFDQTlJR0Z5Y21GNUlDWW1JRjh1YldGNEtHRnljbUY1TENCblpYUk1aVzVuZEdncExteGxibWQwYUNCOGZDQXdPMXh1SUNBZ0lIWmhjaUJ5WlhOMWJIUWdQU0JCY25KaGVTaHNaVzVuZEdncE8xeHVYRzRnSUNBZ1ptOXlJQ2gyWVhJZ2FXNWtaWGdnUFNBd095QnBibVJsZUNBOElHeGxibWQwYURzZ2FXNWtaWGdyS3lrZ2UxeHVJQ0FnSUNBZ2NtVnpkV3gwVzJsdVpHVjRYU0E5SUY4dWNHeDFZMnNvWVhKeVlYa3NJR2x1WkdWNEtUdGNiaUFnSUNCOVhHNGdJQ0FnY21WMGRYSnVJSEpsYzNWc2REdGNiaUFnZlR0Y2JseHVJQ0F2THlCYWFYQWdkRzluWlhSb1pYSWdiWFZzZEdsd2JHVWdiR2x6ZEhNZ2FXNTBieUJoSUhOcGJtZHNaU0JoY25KaGVTQXRMU0JsYkdWdFpXNTBjeUIwYUdGMElITm9ZWEpsWEc0Z0lDOHZJR0Z1SUdsdVpHVjRJR2R2SUhSdloyVjBhR1Z5TGx4dUlDQmZMbnBwY0NBOUlISmxjM1JCY21kMWJXVnVkSE1vWHk1MWJucHBjQ2s3WEc1Y2JpQWdMeThnUTI5dWRtVnlkSE1nYkdsemRITWdhVzUwYnlCdlltcGxZM1J6TGlCUVlYTnpJR1ZwZEdobGNpQmhJSE5wYm1kc1pTQmhjbkpoZVNCdlppQmdXMnRsZVN3Z2RtRnNkV1ZkWUZ4dUlDQXZMeUJ3WVdseWN5d2diM0lnZEhkdklIQmhjbUZzYkdWc0lHRnljbUY1Y3lCdlppQjBhR1VnYzJGdFpTQnNaVzVuZEdnZ0xTMGdiMjVsSUc5bUlHdGxlWE1zSUdGdVpDQnZibVVnYjJaY2JpQWdMeThnZEdobElHTnZjbkpsYzNCdmJtUnBibWNnZG1Gc2RXVnpMaUJRWVhOemFXNW5JR0o1SUhCaGFYSnpJR2x6SUhSb1pTQnlaWFpsY25ObElHOW1JRjh1Y0dGcGNuTXVYRzRnSUY4dWIySnFaV04wSUQwZ1puVnVZM1JwYjI0b2JHbHpkQ3dnZG1Gc2RXVnpLU0I3WEc0Z0lDQWdkbUZ5SUhKbGMzVnNkQ0E5SUh0OU8xeHVJQ0FnSUdadmNpQW9kbUZ5SUdrZ1BTQXdMQ0JzWlc1bmRHZ2dQU0JuWlhSTVpXNW5kR2dvYkdsemRDazdJR2tnUENCc1pXNW5kR2c3SUdrckt5a2dlMXh1SUNBZ0lDQWdhV1lnS0haaGJIVmxjeWtnZTF4dUlDQWdJQ0FnSUNCeVpYTjFiSFJiYkdsemRGdHBYVjBnUFNCMllXeDFaWE5iYVYwN1hHNGdJQ0FnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnSUNCeVpYTjFiSFJiYkdsemRGdHBYVnN3WFYwZ1BTQnNhWE4wVzJsZFd6RmRPMXh1SUNBZ0lDQWdmVnh1SUNBZ0lIMWNiaUFnSUNCeVpYUjFjbTRnY21WemRXeDBPMXh1SUNCOU8xeHVYRzRnSUM4dklFZGxibVZ5WVhSdmNpQm1kVzVqZEdsdmJpQjBieUJqY21WaGRHVWdkR2hsSUdacGJtUkpibVJsZUNCaGJtUWdabWx1WkV4aGMzUkpibVJsZUNCbWRXNWpkR2x2Ym5NdVhHNGdJSFpoY2lCamNtVmhkR1ZRY21Wa2FXTmhkR1ZKYm1SbGVFWnBibVJsY2lBOUlHWjFibU4wYVc5dUtHUnBjaWtnZTF4dUlDQWdJSEpsZEhWeWJpQm1kVzVqZEdsdmJpaGhjbkpoZVN3Z2NISmxaR2xqWVhSbExDQmpiMjUwWlhoMEtTQjdYRzRnSUNBZ0lDQndjbVZrYVdOaGRHVWdQU0JqWWlod2NtVmthV05oZEdVc0lHTnZiblJsZUhRcE8xeHVJQ0FnSUNBZ2RtRnlJR3hsYm1kMGFDQTlJR2RsZEV4bGJtZDBhQ2hoY25KaGVTazdYRzRnSUNBZ0lDQjJZWElnYVc1a1pYZ2dQU0JrYVhJZ1BpQXdJRDhnTUNBNklHeGxibWQwYUNBdElERTdYRzRnSUNBZ0lDQm1iM0lnS0RzZ2FXNWtaWGdnUGowZ01DQW1KaUJwYm1SbGVDQThJR3hsYm1kMGFEc2dhVzVrWlhnZ0t6MGdaR2x5S1NCN1hHNGdJQ0FnSUNBZ0lHbG1JQ2h3Y21Wa2FXTmhkR1VvWVhKeVlYbGJhVzVrWlhoZExDQnBibVJsZUN3Z1lYSnlZWGtwS1NCeVpYUjFjbTRnYVc1a1pYZzdYRzRnSUNBZ0lDQjlYRzRnSUNBZ0lDQnlaWFIxY200Z0xURTdYRzRnSUNBZ2ZUdGNiaUFnZlR0Y2JseHVJQ0F2THlCU1pYUjFjbTV6SUhSb1pTQm1hWEp6ZENCcGJtUmxlQ0J2YmlCaGJpQmhjbkpoZVMxc2FXdGxJSFJvWVhRZ2NHRnpjMlZ6SUdFZ2NISmxaR2xqWVhSbElIUmxjM1F1WEc0Z0lGOHVabWx1WkVsdVpHVjRJRDBnWTNKbFlYUmxVSEpsWkdsallYUmxTVzVrWlhoR2FXNWtaWElvTVNrN1hHNGdJRjh1Wm1sdVpFeGhjM1JKYm1SbGVDQTlJR055WldGMFpWQnlaV1JwWTJGMFpVbHVaR1Y0Um1sdVpHVnlLQzB4S1R0Y2JseHVJQ0F2THlCVmMyVWdZU0JqYjIxd1lYSmhkRzl5SUdaMWJtTjBhVzl1SUhSdklHWnBaM1Z5WlNCdmRYUWdkR2hsSUhOdFlXeHNaWE4wSUdsdVpHVjRJR0YwSUhkb2FXTm9YRzRnSUM4dklHRnVJRzlpYW1WamRDQnphRzkxYkdRZ1ltVWdhVzV6WlhKMFpXUWdjMjhnWVhNZ2RHOGdiV0ZwYm5SaGFXNGdiM0prWlhJdUlGVnpaWE1nWW1sdVlYSjVJSE5sWVhKamFDNWNiaUFnWHk1emIzSjBaV1JKYm1SbGVDQTlJR1oxYm1OMGFXOXVLR0Z5Y21GNUxDQnZZbW9zSUdsMFpYSmhkR1ZsTENCamIyNTBaWGgwS1NCN1hHNGdJQ0FnYVhSbGNtRjBaV1VnUFNCallpaHBkR1Z5WVhSbFpTd2dZMjl1ZEdWNGRDd2dNU2s3WEc0Z0lDQWdkbUZ5SUhaaGJIVmxJRDBnYVhSbGNtRjBaV1VvYjJKcUtUdGNiaUFnSUNCMllYSWdiRzkzSUQwZ01Dd2dhR2xuYUNBOUlHZGxkRXhsYm1kMGFDaGhjbkpoZVNrN1hHNGdJQ0FnZDJocGJHVWdLR3h2ZHlBOElHaHBaMmdwSUh0Y2JpQWdJQ0FnSUhaaGNpQnRhV1FnUFNCTllYUm9MbVpzYjI5eUtDaHNiM2NnS3lCb2FXZG9LU0F2SURJcE8xeHVJQ0FnSUNBZ2FXWWdLR2wwWlhKaGRHVmxLR0Z5Y21GNVcyMXBaRjBwSUR3Z2RtRnNkV1VwSUd4dmR5QTlJRzFwWkNBcklERTdJR1ZzYzJVZ2FHbG5hQ0E5SUcxcFpEdGNiaUFnSUNCOVhHNGdJQ0FnY21WMGRYSnVJR3h2ZHp0Y2JpQWdmVHRjYmx4dUlDQXZMeUJIWlc1bGNtRjBiM0lnWm5WdVkzUnBiMjRnZEc4Z1kzSmxZWFJsSUhSb1pTQnBibVJsZUU5bUlHRnVaQ0JzWVhOMFNXNWtaWGhQWmlCbWRXNWpkR2x2Ym5NdVhHNGdJSFpoY2lCamNtVmhkR1ZKYm1SbGVFWnBibVJsY2lBOUlHWjFibU4wYVc5dUtHUnBjaXdnY0hKbFpHbGpZWFJsUm1sdVpDd2djMjl5ZEdWa1NXNWtaWGdwSUh0Y2JpQWdJQ0J5WlhSMWNtNGdablZ1WTNScGIyNG9ZWEp5WVhrc0lHbDBaVzBzSUdsa2VDa2dlMXh1SUNBZ0lDQWdkbUZ5SUdrZ1BTQXdMQ0JzWlc1bmRHZ2dQU0JuWlhSTVpXNW5kR2dvWVhKeVlYa3BPMXh1SUNBZ0lDQWdhV1lnS0hSNWNHVnZaaUJwWkhnZ1BUMGdKMjUxYldKbGNpY3BJSHRjYmlBZ0lDQWdJQ0FnYVdZZ0tHUnBjaUErSURBcElIdGNiaUFnSUNBZ0lDQWdJQ0JwSUQwZ2FXUjRJRDQ5SURBZ1B5QnBaSGdnT2lCTllYUm9MbTFoZUNocFpIZ2dLeUJzWlc1bmRHZ3NJR2twTzF4dUlDQWdJQ0FnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnSUNBZ0lHeGxibWQwYUNBOUlHbGtlQ0ErUFNBd0lEOGdUV0YwYUM1dGFXNG9hV1I0SUNzZ01Td2diR1Z1WjNSb0tTQTZJR2xrZUNBcklHeGxibWQwYUNBcklERTdYRzRnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJSDBnWld4elpTQnBaaUFvYzI5eWRHVmtTVzVrWlhnZ0ppWWdhV1I0SUNZbUlHeGxibWQwYUNrZ2UxeHVJQ0FnSUNBZ0lDQnBaSGdnUFNCemIzSjBaV1JKYm1SbGVDaGhjbkpoZVN3Z2FYUmxiU2s3WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUJoY25KaGVWdHBaSGhkSUQwOVBTQnBkR1Z0SUQ4Z2FXUjRJRG9nTFRFN1hHNGdJQ0FnSUNCOVhHNGdJQ0FnSUNCcFppQW9hWFJsYlNBaFBUMGdhWFJsYlNrZ2UxeHVJQ0FnSUNBZ0lDQnBaSGdnUFNCd2NtVmthV05oZEdWR2FXNWtLSE5zYVdObExtTmhiR3dvWVhKeVlYa3NJR2tzSUd4bGJtZDBhQ2tzSUY4dWFYTk9ZVTRwTzF4dUlDQWdJQ0FnSUNCeVpYUjFjbTRnYVdSNElENDlJREFnUHlCcFpIZ2dLeUJwSURvZ0xURTdYRzRnSUNBZ0lDQjlYRzRnSUNBZ0lDQm1iM0lnS0dsa2VDQTlJR1JwY2lBK0lEQWdQeUJwSURvZ2JHVnVaM1JvSUMwZ01Uc2dhV1I0SUQ0OUlEQWdKaVlnYVdSNElEd2diR1Z1WjNSb095QnBaSGdnS3owZ1pHbHlLU0I3WEc0Z0lDQWdJQ0FnSUdsbUlDaGhjbkpoZVZ0cFpIaGRJRDA5UFNCcGRHVnRLU0J5WlhSMWNtNGdhV1I0TzF4dUlDQWdJQ0FnZlZ4dUlDQWdJQ0FnY21WMGRYSnVJQzB4TzF4dUlDQWdJSDA3WEc0Z0lIMDdYRzVjYmlBZ0x5OGdVbVYwZFhKdUlIUm9aU0J3YjNOcGRHbHZiaUJ2WmlCMGFHVWdabWx5YzNRZ2IyTmpkWEp5Wlc1alpTQnZaaUJoYmlCcGRHVnRJR2x1SUdGdUlHRnljbUY1TEZ4dUlDQXZMeUJ2Y2lBdE1TQnBaaUIwYUdVZ2FYUmxiU0JwY3lCdWIzUWdhVzVqYkhWa1pXUWdhVzRnZEdobElHRnljbUY1TGx4dUlDQXZMeUJKWmlCMGFHVWdZWEp5WVhrZ2FYTWdiR0Z5WjJVZ1lXNWtJR0ZzY21WaFpIa2dhVzRnYzI5eWRDQnZjbVJsY2l3Z2NHRnpjeUJnZEhKMVpXQmNiaUFnTHk4Z1ptOXlJQ29xYVhOVGIzSjBaV1FxS2lCMGJ5QjFjMlVnWW1sdVlYSjVJSE5sWVhKamFDNWNiaUFnWHk1cGJtUmxlRTltSUQwZ1kzSmxZWFJsU1c1a1pYaEdhVzVrWlhJb01Td2dYeTVtYVc1a1NXNWtaWGdzSUY4dWMyOXlkR1ZrU1c1a1pYZ3BPMXh1SUNCZkxteGhjM1JKYm1SbGVFOW1JRDBnWTNKbFlYUmxTVzVrWlhoR2FXNWtaWElvTFRFc0lGOHVabWx1WkV4aGMzUkpibVJsZUNrN1hHNWNiaUFnTHk4Z1IyVnVaWEpoZEdVZ1lXNGdhVzUwWldkbGNpQkJjbkpoZVNCamIyNTBZV2x1YVc1bklHRnVJR0Z5YVhSb2JXVjBhV01nY0hKdlozSmxjM05wYjI0dUlFRWdjRzl5ZENCdlpseHVJQ0F2THlCMGFHVWdibUYwYVhabElGQjVkR2h2YmlCZ2NtRnVaMlVvS1dBZ1puVnVZM1JwYjI0dUlGTmxaVnh1SUNBdkx5QmJkR2hsSUZCNWRHaHZiaUJrYjJOMWJXVnVkR0YwYVc5dVhTaG9kSFJ3T2k4dlpHOWpjeTV3ZVhSb2IyNHViM0puTDJ4cFluSmhjbmt2Wm5WdVkzUnBiMjV6TG1oMGJXd2pjbUZ1WjJVcExseHVJQ0JmTG5KaGJtZGxJRDBnWm5WdVkzUnBiMjRvYzNSaGNuUXNJSE4wYjNBc0lITjBaWEFwSUh0Y2JpQWdJQ0JwWmlBb2MzUnZjQ0E5UFNCdWRXeHNLU0I3WEc0Z0lDQWdJQ0J6ZEc5d0lEMGdjM1JoY25RZ2ZId2dNRHRjYmlBZ0lDQWdJSE4wWVhKMElEMGdNRHRjYmlBZ0lDQjlYRzRnSUNBZ2FXWWdLQ0Z6ZEdWd0tTQjdYRzRnSUNBZ0lDQnpkR1Z3SUQwZ2MzUnZjQ0E4SUhOMFlYSjBJRDhnTFRFZ09pQXhPMXh1SUNBZ0lIMWNibHh1SUNBZ0lIWmhjaUJzWlc1bmRHZ2dQU0JOWVhSb0xtMWhlQ2hOWVhSb0xtTmxhV3dvS0hOMGIzQWdMU0J6ZEdGeWRDa2dMeUJ6ZEdWd0tTd2dNQ2s3WEc0Z0lDQWdkbUZ5SUhKaGJtZGxJRDBnUVhKeVlYa29iR1Z1WjNSb0tUdGNibHh1SUNBZ0lHWnZjaUFvZG1GeUlHbGtlQ0E5SURBN0lHbGtlQ0E4SUd4bGJtZDBhRHNnYVdSNEt5c3NJSE4wWVhKMElDczlJSE4wWlhBcElIdGNiaUFnSUNBZ0lISmhibWRsVzJsa2VGMGdQU0J6ZEdGeWREdGNiaUFnSUNCOVhHNWNiaUFnSUNCeVpYUjFjbTRnY21GdVoyVTdYRzRnSUgwN1hHNWNiaUFnTHk4Z1EyaDFibXNnWVNCemFXNW5iR1VnWVhKeVlYa2dhVzUwYnlCdGRXeDBhWEJzWlNCaGNuSmhlWE1zSUdWaFkyZ2dZMjl1ZEdGcGJtbHVaeUJnWTI5MWJuUmdJRzl5SUdabGQyVnlYRzRnSUM4dklHbDBaVzF6TGx4dUlDQmZMbU5vZFc1cklEMGdablZ1WTNScGIyNG9ZWEp5WVhrc0lHTnZkVzUwS1NCN1hHNGdJQ0FnYVdZZ0tHTnZkVzUwSUQwOUlHNTFiR3dnZkh3Z1kyOTFiblFnUENBeEtTQnlaWFIxY200Z1cxMDdYRzRnSUNBZ2RtRnlJSEpsYzNWc2RDQTlJRnRkTzF4dUlDQWdJSFpoY2lCcElEMGdNQ3dnYkdWdVozUm9JRDBnWVhKeVlYa3ViR1Z1WjNSb08xeHVJQ0FnSUhkb2FXeGxJQ2hwSUR3Z2JHVnVaM1JvS1NCN1hHNGdJQ0FnSUNCeVpYTjFiSFF1Y0hWemFDaHpiR2xqWlM1allXeHNLR0Z5Y21GNUxDQnBMQ0JwSUNzOUlHTnZkVzUwS1NrN1hHNGdJQ0FnZlZ4dUlDQWdJSEpsZEhWeWJpQnlaWE4xYkhRN1hHNGdJSDA3WEc1Y2JpQWdMeThnUm5WdVkzUnBiMjRnS0dGb1pXMHBJRVoxYm1OMGFXOXVjMXh1SUNBdkx5QXRMUzB0TFMwdExTMHRMUzB0TFMwdExTMWNibHh1SUNBdkx5QkVaWFJsY20xcGJtVnpJSGRvWlhSb1pYSWdkRzhnWlhobFkzVjBaU0JoSUdaMWJtTjBhVzl1SUdGeklHRWdZMjl1YzNSeWRXTjBiM0pjYmlBZ0x5OGdiM0lnWVNCdWIzSnRZV3dnWm5WdVkzUnBiMjRnZDJsMGFDQjBhR1VnY0hKdmRtbGtaV1FnWVhKbmRXMWxiblJ6TGx4dUlDQjJZWElnWlhobFkzVjBaVUp2ZFc1a0lEMGdablZ1WTNScGIyNG9jMjkxY21ObFJuVnVZeXdnWW05MWJtUkdkVzVqTENCamIyNTBaWGgwTENCallXeHNhVzVuUTI5dWRHVjRkQ3dnWVhKbmN5a2dlMXh1SUNBZ0lHbG1JQ2doS0dOaGJHeHBibWREYjI1MFpYaDBJR2x1YzNSaGJtTmxiMllnWW05MWJtUkdkVzVqS1NrZ2NtVjBkWEp1SUhOdmRYSmpaVVoxYm1NdVlYQndiSGtvWTI5dWRHVjRkQ3dnWVhKbmN5azdYRzRnSUNBZ2RtRnlJSE5sYkdZZ1BTQmlZWE5sUTNKbFlYUmxLSE52ZFhKalpVWjFibU11Y0hKdmRHOTBlWEJsS1R0Y2JpQWdJQ0IyWVhJZ2NtVnpkV3gwSUQwZ2MyOTFjbU5sUm5WdVl5NWhjSEJzZVNoelpXeG1MQ0JoY21kektUdGNiaUFnSUNCcFppQW9YeTVwYzA5aWFtVmpkQ2h5WlhOMWJIUXBLU0J5WlhSMWNtNGdjbVZ6ZFd4ME8xeHVJQ0FnSUhKbGRIVnliaUJ6Wld4bU8xeHVJQ0I5TzF4dVhHNGdJQzh2SUVOeVpXRjBaU0JoSUdaMWJtTjBhVzl1SUdKdmRXNWtJSFJ2SUdFZ1oybDJaVzRnYjJKcVpXTjBJQ2hoYzNOcFoyNXBibWNnWUhSb2FYTmdMQ0JoYm1RZ1lYSm5kVzFsYm5SekxGeHVJQ0F2THlCdmNIUnBiMjVoYkd4NUtTNGdSR1ZzWldkaGRHVnpJSFJ2SUNvcVJVTk5RVk5qY21sd2RDQTFLaW9uY3lCdVlYUnBkbVVnWUVaMWJtTjBhVzl1TG1KcGJtUmdJR2xtWEc0Z0lDOHZJR0YyWVdsc1lXSnNaUzVjYmlBZ1h5NWlhVzVrSUQwZ2NtVnpkRUZ5WjNWdFpXNTBjeWhtZFc1amRHbHZiaWhtZFc1akxDQmpiMjUwWlhoMExDQmhjbWR6S1NCN1hHNGdJQ0FnYVdZZ0tDRmZMbWx6Um5WdVkzUnBiMjRvWm5WdVl5a3BJSFJvY205M0lHNWxkeUJVZVhCbFJYSnliM0lvSjBKcGJtUWdiWFZ6ZENCaVpTQmpZV3hzWldRZ2IyNGdZU0JtZFc1amRHbHZiaWNwTzF4dUlDQWdJSFpoY2lCaWIzVnVaQ0E5SUhKbGMzUkJjbWQxYldWdWRITW9ablZ1WTNScGIyNG9ZMkZzYkVGeVozTXBJSHRjYmlBZ0lDQWdJSEpsZEhWeWJpQmxlR1ZqZFhSbFFtOTFibVFvWm5WdVl5d2dZbTkxYm1Rc0lHTnZiblJsZUhRc0lIUm9hWE1zSUdGeVozTXVZMjl1WTJGMEtHTmhiR3hCY21kektTazdYRzRnSUNBZ2ZTazdYRzRnSUNBZ2NtVjBkWEp1SUdKdmRXNWtPMXh1SUNCOUtUdGNibHh1SUNBdkx5QlFZWEowYVdGc2JIa2dZWEJ3YkhrZ1lTQm1kVzVqZEdsdmJpQmllU0JqY21WaGRHbHVaeUJoSUhabGNuTnBiMjRnZEdoaGRDQm9ZWE1nYUdGa0lITnZiV1VnYjJZZ2FYUnpYRzRnSUM4dklHRnlaM1Z0Wlc1MGN5QndjbVV0Wm1sc2JHVmtMQ0IzYVhSb2IzVjBJR05vWVc1bmFXNW5JR2wwY3lCa2VXNWhiV2xqSUdCMGFHbHpZQ0JqYjI1MFpYaDBMaUJmSUdGamRITmNiaUFnTHk4Z1lYTWdZU0J3YkdGalpXaHZiR1JsY2lCaWVTQmtaV1poZFd4MExDQmhiR3h2ZDJsdVp5QmhibmtnWTI5dFltbHVZWFJwYjI0Z2IyWWdZWEpuZFcxbGJuUnpJSFJ2SUdKbFhHNGdJQzh2SUhCeVpTMW1hV3hzWldRdUlGTmxkQ0JnWHk1d1lYSjBhV0ZzTG5Cc1lXTmxhRzlzWkdWeVlDQm1iM0lnWVNCamRYTjBiMjBnY0d4aFkyVm9iMnhrWlhJZ1lYSm5kVzFsYm5RdVhHNGdJRjh1Y0dGeWRHbGhiQ0E5SUhKbGMzUkJjbWQxYldWdWRITW9ablZ1WTNScGIyNG9ablZ1WXl3Z1ltOTFibVJCY21kektTQjdYRzRnSUNBZ2RtRnlJSEJzWVdObGFHOXNaR1Z5SUQwZ1h5NXdZWEowYVdGc0xuQnNZV05sYUc5c1pHVnlPMXh1SUNBZ0lIWmhjaUJpYjNWdVpDQTlJR1oxYm1OMGFXOXVLQ2tnZTF4dUlDQWdJQ0FnZG1GeUlIQnZjMmwwYVc5dUlEMGdNQ3dnYkdWdVozUm9JRDBnWW05MWJtUkJjbWR6TG14bGJtZDBhRHRjYmlBZ0lDQWdJSFpoY2lCaGNtZHpJRDBnUVhKeVlYa29iR1Z1WjNSb0tUdGNiaUFnSUNBZ0lHWnZjaUFvZG1GeUlHa2dQU0F3T3lCcElEd2diR1Z1WjNSb095QnBLeXNwSUh0Y2JpQWdJQ0FnSUNBZ1lYSm5jMXRwWFNBOUlHSnZkVzVrUVhKbmMxdHBYU0E5UFQwZ2NHeGhZMlZvYjJ4a1pYSWdQeUJoY21kMWJXVnVkSE5iY0c5emFYUnBiMjRySzEwZ09pQmliM1Z1WkVGeVozTmJhVjA3WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdJQ0IzYUdsc1pTQW9jRzl6YVhScGIyNGdQQ0JoY21kMWJXVnVkSE11YkdWdVozUm9LU0JoY21kekxuQjFjMmdvWVhKbmRXMWxiblJ6VzNCdmMybDBhVzl1S3l0ZEtUdGNiaUFnSUNBZ0lISmxkSFZ5YmlCbGVHVmpkWFJsUW05MWJtUW9ablZ1WXl3Z1ltOTFibVFzSUhSb2FYTXNJSFJvYVhNc0lHRnlaM01wTzF4dUlDQWdJSDA3WEc0Z0lDQWdjbVYwZFhKdUlHSnZkVzVrTzF4dUlDQjlLVHRjYmx4dUlDQmZMbkJoY25ScFlXd3VjR3hoWTJWb2IyeGtaWElnUFNCZk8xeHVYRzRnSUM4dklFSnBibVFnWVNCdWRXMWlaWElnYjJZZ1lXNGdiMkpxWldOMEozTWdiV1YwYUc5a2N5QjBieUIwYUdGMElHOWlhbVZqZEM0Z1VtVnRZV2x1YVc1bklHRnlaM1Z0Wlc1MGMxeHVJQ0F2THlCaGNtVWdkR2hsSUcxbGRHaHZaQ0J1WVcxbGN5QjBieUJpWlNCaWIzVnVaQzRnVlhObFpuVnNJR1p2Y2lCbGJuTjFjbWx1WnlCMGFHRjBJR0ZzYkNCallXeHNZbUZqYTNOY2JpQWdMeThnWkdWbWFXNWxaQ0J2YmlCaGJpQnZZbXBsWTNRZ1ltVnNiMjVuSUhSdklHbDBMbHh1SUNCZkxtSnBibVJCYkd3Z1BTQnlaWE4wUVhKbmRXMWxiblJ6S0daMWJtTjBhVzl1S0c5aWFpd2dhMlY1Y3lrZ2UxeHVJQ0FnSUd0bGVYTWdQU0JtYkdGMGRHVnVLR3RsZVhNc0lHWmhiSE5sTENCbVlXeHpaU2s3WEc0Z0lDQWdkbUZ5SUdsdVpHVjRJRDBnYTJWNWN5NXNaVzVuZEdnN1hHNGdJQ0FnYVdZZ0tHbHVaR1Y0SUR3Z01Ta2dkR2h5YjNjZ2JtVjNJRVZ5Y205eUtDZGlhVzVrUVd4c0lHMTFjM1FnWW1VZ2NHRnpjMlZrSUdaMWJtTjBhVzl1SUc1aGJXVnpKeWs3WEc0Z0lDQWdkMmhwYkdVZ0tHbHVaR1Y0TFMwcElIdGNiaUFnSUNBZ0lIWmhjaUJyWlhrZ1BTQnJaWGx6VzJsdVpHVjRYVHRjYmlBZ0lDQWdJRzlpYWx0clpYbGRJRDBnWHk1aWFXNWtLRzlpYWx0clpYbGRMQ0J2WW1vcE8xeHVJQ0FnSUgxY2JpQWdmU2s3WEc1Y2JpQWdMeThnVFdWdGIybDZaU0JoYmlCbGVIQmxibk5wZG1VZ1puVnVZM1JwYjI0Z1lua2djM1J2Y21sdVp5QnBkSE1nY21WemRXeDBjeTVjYmlBZ1h5NXRaVzF2YVhwbElEMGdablZ1WTNScGIyNG9ablZ1WXl3Z2FHRnphR1Z5S1NCN1hHNGdJQ0FnZG1GeUlHMWxiVzlwZW1VZ1BTQm1kVzVqZEdsdmJpaHJaWGtwSUh0Y2JpQWdJQ0FnSUhaaGNpQmpZV05vWlNBOUlHMWxiVzlwZW1VdVkyRmphR1U3WEc0Z0lDQWdJQ0IyWVhJZ1lXUmtjbVZ6Y3lBOUlDY25JQ3NnS0doaGMyaGxjaUEvSUdoaGMyaGxjaTVoY0hCc2VTaDBhR2x6TENCaGNtZDFiV1Z1ZEhNcElEb2dhMlY1S1R0Y2JpQWdJQ0FnSUdsbUlDZ2hhR0Z6S0dOaFkyaGxMQ0JoWkdSeVpYTnpLU2tnWTJGamFHVmJZV1JrY21WemMxMGdQU0JtZFc1akxtRndjR3g1S0hSb2FYTXNJR0Z5WjNWdFpXNTBjeWs3WEc0Z0lDQWdJQ0J5WlhSMWNtNGdZMkZqYUdWYllXUmtjbVZ6YzEwN1hHNGdJQ0FnZlR0Y2JpQWdJQ0J0WlcxdmFYcGxMbU5oWTJobElEMGdlMzA3WEc0Z0lDQWdjbVYwZFhKdUlHMWxiVzlwZW1VN1hHNGdJSDA3WEc1Y2JpQWdMeThnUkdWc1lYbHpJR0VnWm5WdVkzUnBiMjRnWm05eUlIUm9aU0JuYVhabGJpQnVkVzFpWlhJZ2IyWWdiV2xzYkdselpXTnZibVJ6TENCaGJtUWdkR2hsYmlCallXeHNjMXh1SUNBdkx5QnBkQ0IzYVhSb0lIUm9aU0JoY21kMWJXVnVkSE1nYzNWd2NHeHBaV1F1WEc0Z0lGOHVaR1ZzWVhrZ1BTQnlaWE4wUVhKbmRXMWxiblJ6S0daMWJtTjBhVzl1S0daMWJtTXNJSGRoYVhRc0lHRnlaM01wSUh0Y2JpQWdJQ0J5WlhSMWNtNGdjMlYwVkdsdFpXOTFkQ2htZFc1amRHbHZiaWdwSUh0Y2JpQWdJQ0FnSUhKbGRIVnliaUJtZFc1akxtRndjR3g1S0c1MWJHd3NJR0Z5WjNNcE8xeHVJQ0FnSUgwc0lIZGhhWFFwTzF4dUlDQjlLVHRjYmx4dUlDQXZMeUJFWldabGNuTWdZU0JtZFc1amRHbHZiaXdnYzJOb1pXUjFiR2x1WnlCcGRDQjBieUJ5ZFc0Z1lXWjBaWElnZEdobElHTjFjbkpsYm5RZ1kyRnNiQ0J6ZEdGamF5Qm9ZWE5jYmlBZ0x5OGdZMnhsWVhKbFpDNWNiaUFnWHk1a1pXWmxjaUE5SUY4dWNHRnlkR2xoYkNoZkxtUmxiR0Y1TENCZkxDQXhLVHRjYmx4dUlDQXZMeUJTWlhSMWNtNXpJR0VnWm5WdVkzUnBiMjRzSUhSb1lYUXNJSGRvWlc0Z2FXNTJiMnRsWkN3Z2QybHNiQ0J2Ym14NUlHSmxJSFJ5YVdkblpYSmxaQ0JoZENCdGIzTjBJRzl1WTJWY2JpQWdMeThnWkhWeWFXNW5JR0VnWjJsMlpXNGdkMmx1Wkc5M0lHOW1JSFJwYldVdUlFNXZjbTFoYkd4NUxDQjBhR1VnZEdoeWIzUjBiR1ZrSUdaMWJtTjBhVzl1SUhkcGJHd2djblZ1WEc0Z0lDOHZJR0Z6SUcxMVkyZ2dZWE1nYVhRZ1kyRnVMQ0IzYVhSb2IzVjBJR1YyWlhJZ1oyOXBibWNnYlc5eVpTQjBhR0Z1SUc5dVkyVWdjR1Z5SUdCM1lXbDBZQ0JrZFhKaGRHbHZianRjYmlBZ0x5OGdZblYwSUdsbUlIbHZkU2RrSUd4cGEyVWdkRzhnWkdsellXSnNaU0IwYUdVZ1pYaGxZM1YwYVc5dUlHOXVJSFJvWlNCc1pXRmthVzVuSUdWa1oyVXNJSEJoYzNOY2JpQWdMeThnWUh0c1pXRmthVzVuT2lCbVlXeHpaWDFnTGlCVWJ5QmthWE5oWW14bElHVjRaV04xZEdsdmJpQnZiaUIwYUdVZ2RISmhhV3hwYm1jZ1pXUm5aU3dnWkdsMGRHOHVYRzRnSUY4dWRHaHliM1IwYkdVZ1BTQm1kVzVqZEdsdmJpaG1kVzVqTENCM1lXbDBMQ0J2Y0hScGIyNXpLU0I3WEc0Z0lDQWdkbUZ5SUhScGJXVnZkWFFzSUdOdmJuUmxlSFFzSUdGeVozTXNJSEpsYzNWc2REdGNiaUFnSUNCMllYSWdjSEpsZG1sdmRYTWdQU0F3TzF4dUlDQWdJR2xtSUNnaGIzQjBhVzl1Y3lrZ2IzQjBhVzl1Y3lBOUlIdDlPMXh1WEc0Z0lDQWdkbUZ5SUd4aGRHVnlJRDBnWm5WdVkzUnBiMjRvS1NCN1hHNGdJQ0FnSUNCd2NtVjJhVzkxY3lBOUlHOXdkR2x2Ym5NdWJHVmhaR2x1WnlBOVBUMGdabUZzYzJVZ1B5QXdJRG9nWHk1dWIzY29LVHRjYmlBZ0lDQWdJSFJwYldWdmRYUWdQU0J1ZFd4c08xeHVJQ0FnSUNBZ2NtVnpkV3gwSUQwZ1puVnVZeTVoY0hCc2VTaGpiMjUwWlhoMExDQmhjbWR6S1R0Y2JpQWdJQ0FnSUdsbUlDZ2hkR2x0Wlc5MWRDa2dZMjl1ZEdWNGRDQTlJR0Z5WjNNZ1BTQnVkV3hzTzF4dUlDQWdJSDA3WEc1Y2JpQWdJQ0IyWVhJZ2RHaHliM1IwYkdWa0lEMGdablZ1WTNScGIyNG9LU0I3WEc0Z0lDQWdJQ0IyWVhJZ2JtOTNJRDBnWHk1dWIzY29LVHRjYmlBZ0lDQWdJR2xtSUNnaGNISmxkbWx2ZFhNZ0ppWWdiM0IwYVc5dWN5NXNaV0ZrYVc1bklEMDlQU0JtWVd4elpTa2djSEpsZG1sdmRYTWdQU0J1YjNjN1hHNGdJQ0FnSUNCMllYSWdjbVZ0WVdsdWFXNW5JRDBnZDJGcGRDQXRJQ2h1YjNjZ0xTQndjbVYyYVc5MWN5azdYRzRnSUNBZ0lDQmpiMjUwWlhoMElEMGdkR2hwY3p0Y2JpQWdJQ0FnSUdGeVozTWdQU0JoY21kMWJXVnVkSE03WEc0Z0lDQWdJQ0JwWmlBb2NtVnRZV2x1YVc1bklEdzlJREFnZkh3Z2NtVnRZV2x1YVc1bklENGdkMkZwZENrZ2UxeHVJQ0FnSUNBZ0lDQnBaaUFvZEdsdFpXOTFkQ2tnZTF4dUlDQWdJQ0FnSUNBZ0lHTnNaV0Z5VkdsdFpXOTFkQ2gwYVcxbGIzVjBLVHRjYmlBZ0lDQWdJQ0FnSUNCMGFXMWxiM1YwSUQwZ2JuVnNiRHRjYmlBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnSUNCd2NtVjJhVzkxY3lBOUlHNXZkenRjYmlBZ0lDQWdJQ0FnY21WemRXeDBJRDBnWm5WdVl5NWhjSEJzZVNoamIyNTBaWGgwTENCaGNtZHpLVHRjYmlBZ0lDQWdJQ0FnYVdZZ0tDRjBhVzFsYjNWMEtTQmpiMjUwWlhoMElEMGdZWEpuY3lBOUlHNTFiR3c3WEc0Z0lDQWdJQ0I5SUdWc2MyVWdhV1lnS0NGMGFXMWxiM1YwSUNZbUlHOXdkR2x2Ym5NdWRISmhhV3hwYm1jZ0lUMDlJR1poYkhObEtTQjdYRzRnSUNBZ0lDQWdJSFJwYldWdmRYUWdQU0J6WlhSVWFXMWxiM1YwS0d4aGRHVnlMQ0J5WlcxaGFXNXBibWNwTzF4dUlDQWdJQ0FnZlZ4dUlDQWdJQ0FnY21WMGRYSnVJSEpsYzNWc2REdGNiaUFnSUNCOU8xeHVYRzRnSUNBZ2RHaHliM1IwYkdWa0xtTmhibU5sYkNBOUlHWjFibU4wYVc5dUtDa2dlMXh1SUNBZ0lDQWdZMnhsWVhKVWFXMWxiM1YwS0hScGJXVnZkWFFwTzF4dUlDQWdJQ0FnY0hKbGRtbHZkWE1nUFNBd08xeHVJQ0FnSUNBZ2RHbHRaVzkxZENBOUlHTnZiblJsZUhRZ1BTQmhjbWR6SUQwZ2JuVnNiRHRjYmlBZ0lDQjlPMXh1WEc0Z0lDQWdjbVYwZFhKdUlIUm9jbTkwZEd4bFpEdGNiaUFnZlR0Y2JseHVJQ0F2THlCU1pYUjFjbTV6SUdFZ1puVnVZM1JwYjI0c0lIUm9ZWFFzSUdGeklHeHZibWNnWVhNZ2FYUWdZMjl1ZEdsdWRXVnpJSFJ2SUdKbElHbHVkbTlyWldRc0lIZHBiR3dnYm05MFhHNGdJQzh2SUdKbElIUnlhV2RuWlhKbFpDNGdWR2hsSUdaMWJtTjBhVzl1SUhkcGJHd2dZbVVnWTJGc2JHVmtJR0ZtZEdWeUlHbDBJSE4wYjNCeklHSmxhVzVuSUdOaGJHeGxaQ0JtYjNKY2JpQWdMeThnVGlCdGFXeHNhWE5sWTI5dVpITXVJRWxtSUdCcGJXMWxaR2xoZEdWZ0lHbHpJSEJoYzNObFpDd2dkSEpwWjJkbGNpQjBhR1VnWm5WdVkzUnBiMjRnYjI0Z2RHaGxYRzRnSUM4dklHeGxZV1JwYm1jZ1pXUm5aU3dnYVc1emRHVmhaQ0J2WmlCMGFHVWdkSEpoYVd4cGJtY3VYRzRnSUY4dVpHVmliM1Z1WTJVZ1BTQm1kVzVqZEdsdmJpaG1kVzVqTENCM1lXbDBMQ0JwYlcxbFpHbGhkR1VwSUh0Y2JpQWdJQ0IyWVhJZ2RHbHRaVzkxZEN3Z2NtVnpkV3gwTzF4dVhHNGdJQ0FnZG1GeUlHeGhkR1Z5SUQwZ1puVnVZM1JwYjI0b1kyOXVkR1Y0ZEN3Z1lYSm5jeWtnZTF4dUlDQWdJQ0FnZEdsdFpXOTFkQ0E5SUc1MWJHdzdYRzRnSUNBZ0lDQnBaaUFvWVhKbmN5a2djbVZ6ZFd4MElEMGdablZ1WXk1aGNIQnNlU2hqYjI1MFpYaDBMQ0JoY21kektUdGNiaUFnSUNCOU8xeHVYRzRnSUNBZ2RtRnlJR1JsWW05MWJtTmxaQ0E5SUhKbGMzUkJjbWQxYldWdWRITW9ablZ1WTNScGIyNG9ZWEpuY3lrZ2UxeHVJQ0FnSUNBZ2FXWWdLSFJwYldWdmRYUXBJR05zWldGeVZHbHRaVzkxZENoMGFXMWxiM1YwS1R0Y2JpQWdJQ0FnSUdsbUlDaHBiVzFsWkdsaGRHVXBJSHRjYmlBZ0lDQWdJQ0FnZG1GeUlHTmhiR3hPYjNjZ1BTQWhkR2x0Wlc5MWREdGNiaUFnSUNBZ0lDQWdkR2x0Wlc5MWRDQTlJSE5sZEZScGJXVnZkWFFvYkdGMFpYSXNJSGRoYVhRcE8xeHVJQ0FnSUNBZ0lDQnBaaUFvWTJGc2JFNXZkeWtnY21WemRXeDBJRDBnWm5WdVl5NWhjSEJzZVNoMGFHbHpMQ0JoY21kektUdGNiaUFnSUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNBZ0lIUnBiV1Z2ZFhRZ1BTQmZMbVJsYkdGNUtHeGhkR1Z5TENCM1lXbDBMQ0IwYUdsekxDQmhjbWR6S1R0Y2JpQWdJQ0FnSUgxY2JseHVJQ0FnSUNBZ2NtVjBkWEp1SUhKbGMzVnNkRHRjYmlBZ0lDQjlLVHRjYmx4dUlDQWdJR1JsWW05MWJtTmxaQzVqWVc1alpXd2dQU0JtZFc1amRHbHZiaWdwSUh0Y2JpQWdJQ0FnSUdOc1pXRnlWR2x0Wlc5MWRDaDBhVzFsYjNWMEtUdGNiaUFnSUNBZ0lIUnBiV1Z2ZFhRZ1BTQnVkV3hzTzF4dUlDQWdJSDA3WEc1Y2JpQWdJQ0J5WlhSMWNtNGdaR1ZpYjNWdVkyVmtPMXh1SUNCOU8xeHVYRzRnSUM4dklGSmxkSFZ5Ym5NZ2RHaGxJR1pwY25OMElHWjFibU4wYVc5dUlIQmhjM05sWkNCaGN5QmhiaUJoY21kMWJXVnVkQ0IwYnlCMGFHVWdjMlZqYjI1a0xGeHVJQ0F2THlCaGJHeHZkMmx1WnlCNWIzVWdkRzhnWVdScWRYTjBJR0Z5WjNWdFpXNTBjeXdnY25WdUlHTnZaR1VnWW1WbWIzSmxJR0Z1WkNCaFpuUmxjaXdnWVc1a1hHNGdJQzh2SUdOdmJtUnBkR2x2Ym1Gc2JIa2daWGhsWTNWMFpTQjBhR1VnYjNKcFoybHVZV3dnWm5WdVkzUnBiMjR1WEc0Z0lGOHVkM0poY0NBOUlHWjFibU4wYVc5dUtHWjFibU1zSUhkeVlYQndaWElwSUh0Y2JpQWdJQ0J5WlhSMWNtNGdYeTV3WVhKMGFXRnNLSGR5WVhCd1pYSXNJR1oxYm1NcE8xeHVJQ0I5TzF4dVhHNGdJQzh2SUZKbGRIVnlibk1nWVNCdVpXZGhkR1ZrSUhabGNuTnBiMjRnYjJZZ2RHaGxJSEJoYzNObFpDMXBiaUJ3Y21Wa2FXTmhkR1V1WEc0Z0lGOHVibVZuWVhSbElEMGdablZ1WTNScGIyNG9jSEpsWkdsallYUmxLU0I3WEc0Z0lDQWdjbVYwZFhKdUlHWjFibU4wYVc5dUtDa2dlMXh1SUNBZ0lDQWdjbVYwZFhKdUlDRndjbVZrYVdOaGRHVXVZWEJ3Ykhrb2RHaHBjeXdnWVhKbmRXMWxiblJ6S1R0Y2JpQWdJQ0I5TzF4dUlDQjlPMXh1WEc0Z0lDOHZJRkpsZEhWeWJuTWdZU0JtZFc1amRHbHZiaUIwYUdGMElHbHpJSFJvWlNCamIyMXdiM05wZEdsdmJpQnZaaUJoSUd4cGMzUWdiMllnWm5WdVkzUnBiMjV6TENCbFlXTm9YRzRnSUM4dklHTnZibk4xYldsdVp5QjBhR1VnY21WMGRYSnVJSFpoYkhWbElHOW1JSFJvWlNCbWRXNWpkR2x2YmlCMGFHRjBJR1p2Ykd4dmQzTXVYRzRnSUY4dVkyOXRjRzl6WlNBOUlHWjFibU4wYVc5dUtDa2dlMXh1SUNBZ0lIWmhjaUJoY21keklEMGdZWEpuZFcxbGJuUnpPMXh1SUNBZ0lIWmhjaUJ6ZEdGeWRDQTlJR0Z5WjNNdWJHVnVaM1JvSUMwZ01UdGNiaUFnSUNCeVpYUjFjbTRnWm5WdVkzUnBiMjRvS1NCN1hHNGdJQ0FnSUNCMllYSWdhU0E5SUhOMFlYSjBPMXh1SUNBZ0lDQWdkbUZ5SUhKbGMzVnNkQ0E5SUdGeVozTmJjM1JoY25SZExtRndjR3g1S0hSb2FYTXNJR0Z5WjNWdFpXNTBjeWs3WEc0Z0lDQWdJQ0IzYUdsc1pTQW9hUzB0S1NCeVpYTjFiSFFnUFNCaGNtZHpXMmxkTG1OaGJHd29kR2hwY3l3Z2NtVnpkV3gwS1R0Y2JpQWdJQ0FnSUhKbGRIVnliaUJ5WlhOMWJIUTdYRzRnSUNBZ2ZUdGNiaUFnZlR0Y2JseHVJQ0F2THlCU1pYUjFjbTV6SUdFZ1puVnVZM1JwYjI0Z2RHaGhkQ0IzYVd4c0lHOXViSGtnWW1VZ1pYaGxZM1YwWldRZ2IyNGdZVzVrSUdGbWRHVnlJSFJvWlNCT2RHZ2dZMkZzYkM1Y2JpQWdYeTVoWm5SbGNpQTlJR1oxYm1OMGFXOXVLSFJwYldWekxDQm1kVzVqS1NCN1hHNGdJQ0FnY21WMGRYSnVJR1oxYm1OMGFXOXVLQ2tnZTF4dUlDQWdJQ0FnYVdZZ0tDMHRkR2x0WlhNZ1BDQXhLU0I3WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUJtZFc1akxtRndjR3g1S0hSb2FYTXNJR0Z5WjNWdFpXNTBjeWs3WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdmVHRjYmlBZ2ZUdGNibHh1SUNBdkx5QlNaWFIxY201eklHRWdablZ1WTNScGIyNGdkR2hoZENCM2FXeHNJRzl1YkhrZ1ltVWdaWGhsWTNWMFpXUWdkWEFnZEc4Z0tHSjFkQ0J1YjNRZ2FXNWpiSFZrYVc1bktTQjBhR1VnVG5Sb0lHTmhiR3d1WEc0Z0lGOHVZbVZtYjNKbElEMGdablZ1WTNScGIyNG9kR2x0WlhNc0lHWjFibU1wSUh0Y2JpQWdJQ0IyWVhJZ2JXVnRienRjYmlBZ0lDQnlaWFIxY200Z1puVnVZM1JwYjI0b0tTQjdYRzRnSUNBZ0lDQnBaaUFvTFMxMGFXMWxjeUErSURBcElIdGNiaUFnSUNBZ0lDQWdiV1Z0YnlBOUlHWjFibU11WVhCd2JIa29kR2hwY3l3Z1lYSm5kVzFsYm5SektUdGNiaUFnSUNBZ0lIMWNiaUFnSUNBZ0lHbG1JQ2gwYVcxbGN5QThQU0F4S1NCbWRXNWpJRDBnYm5Wc2JEdGNiaUFnSUNBZ0lISmxkSFZ5YmlCdFpXMXZPMXh1SUNBZ0lIMDdYRzRnSUgwN1hHNWNiaUFnTHk4Z1VtVjBkWEp1Y3lCaElHWjFibU4wYVc5dUlIUm9ZWFFnZDJsc2JDQmlaU0JsZUdWamRYUmxaQ0JoZENCdGIzTjBJRzl1WlNCMGFXMWxMQ0J1YnlCdFlYUjBaWElnYUc5M1hHNGdJQzh2SUc5bWRHVnVJSGx2ZFNCallXeHNJR2wwTGlCVmMyVm1kV3dnWm05eUlHeGhlbmtnYVc1cGRHbGhiR2w2WVhScGIyNHVYRzRnSUY4dWIyNWpaU0E5SUY4dWNHRnlkR2xoYkNoZkxtSmxabTl5WlN3Z01pazdYRzVjYmlBZ1h5NXlaWE4wUVhKbmRXMWxiblJ6SUQwZ2NtVnpkRUZ5WjNWdFpXNTBjenRjYmx4dUlDQXZMeUJQWW1wbFkzUWdSblZ1WTNScGIyNXpYRzRnSUM4dklDMHRMUzB0TFMwdExTMHRMUzB0TFMxY2JseHVJQ0F2THlCTFpYbHpJR2x1SUVsRklEd2dPU0IwYUdGMElIZHZiaWQwSUdKbElHbDBaWEpoZEdWa0lHSjVJR0JtYjNJZ2EyVjVJR2x1SUM0dUxtQWdZVzVrSUhSb2RYTWdiV2x6YzJWa0xseHVJQ0IyWVhJZ2FHRnpSVzUxYlVKMVp5QTlJQ0Y3ZEc5VGRISnBibWM2SUc1MWJHeDlMbkJ5YjNCbGNuUjVTWE5GYm5WdFpYSmhZbXhsS0NkMGIxTjBjbWx1WnljcE8xeHVJQ0IyWVhJZ2JtOXVSVzUxYldWeVlXSnNaVkJ5YjNCeklEMGdXeWQyWVd4MVpVOW1KeXdnSjJselVISnZkRzkwZVhCbFQyWW5MQ0FuZEc5VGRISnBibWNuTEZ4dUlDQWdJQ2R3Y205d1pYSjBlVWx6Ulc1MWJXVnlZV0pzWlNjc0lDZG9ZWE5QZDI1UWNtOXdaWEowZVNjc0lDZDBiMHh2WTJGc1pWTjBjbWx1WnlkZE8xeHVYRzRnSUhaaGNpQmpiMnhzWldOMFRtOXVSVzUxYlZCeWIzQnpJRDBnWm5WdVkzUnBiMjRvYjJKcUxDQnJaWGx6S1NCN1hHNGdJQ0FnZG1GeUlHNXZia1Z1ZFcxSlpIZ2dQU0J1YjI1RmJuVnRaWEpoWW14bFVISnZjSE11YkdWdVozUm9PMXh1SUNBZ0lIWmhjaUJqYjI1emRISjFZM1J2Y2lBOUlHOWlhaTVqYjI1emRISjFZM1J2Y2p0Y2JpQWdJQ0IyWVhJZ2NISnZkRzhnUFNCZkxtbHpSblZ1WTNScGIyNG9ZMjl1YzNSeWRXTjBiM0lwSUNZbUlHTnZibk4wY25WamRHOXlMbkJ5YjNSdmRIbHdaU0I4ZkNCUFltcFFjbTkwYnp0Y2JseHVJQ0FnSUM4dklFTnZibk4wY25WamRHOXlJR2x6SUdFZ2MzQmxZMmxoYkNCallYTmxMbHh1SUNBZ0lIWmhjaUJ3Y205d0lEMGdKMk52Ym5OMGNuVmpkRzl5Snp0Y2JpQWdJQ0JwWmlBb2FHRnpLRzlpYWl3Z2NISnZjQ2tnSmlZZ0lWOHVZMjl1ZEdGcGJuTW9hMlY1Y3l3Z2NISnZjQ2twSUd0bGVYTXVjSFZ6YUNod2NtOXdLVHRjYmx4dUlDQWdJSGRvYVd4bElDaHViMjVGYm5WdFNXUjRMUzBwSUh0Y2JpQWdJQ0FnSUhCeWIzQWdQU0J1YjI1RmJuVnRaWEpoWW14bFVISnZjSE5iYm05dVJXNTFiVWxrZUYwN1hHNGdJQ0FnSUNCcFppQW9jSEp2Y0NCcGJpQnZZbW9nSmlZZ2IySnFXM0J5YjNCZElDRTlQU0J3Y205MGIxdHdjbTl3WFNBbUppQWhYeTVqYjI1MFlXbHVjeWhyWlhsekxDQndjbTl3S1NrZ2UxeHVJQ0FnSUNBZ0lDQnJaWGx6TG5CMWMyZ29jSEp2Y0NrN1hHNGdJQ0FnSUNCOVhHNGdJQ0FnZlZ4dUlDQjlPMXh1WEc0Z0lDOHZJRkpsZEhKcFpYWmxJSFJvWlNCdVlXMWxjeUJ2WmlCaGJpQnZZbXBsWTNRbmN5QnZkMjRnY0hKdmNHVnlkR2xsY3k1Y2JpQWdMeThnUkdWc1pXZGhkR1Z6SUhSdklDb3FSVU5OUVZOamNtbHdkQ0ExS2lvbmN5QnVZWFJwZG1VZ1lFOWlhbVZqZEM1clpYbHpZQzVjYmlBZ1h5NXJaWGx6SUQwZ1puVnVZM1JwYjI0b2IySnFLU0I3WEc0Z0lDQWdhV1lnS0NGZkxtbHpUMkpxWldOMEtHOWlhaWtwSUhKbGRIVnliaUJiWFR0Y2JpQWdJQ0JwWmlBb2JtRjBhWFpsUzJWNWN5a2djbVYwZFhKdUlHNWhkR2wyWlV0bGVYTW9iMkpxS1R0Y2JpQWdJQ0IyWVhJZ2EyVjVjeUE5SUZ0ZE8xeHVJQ0FnSUdadmNpQW9kbUZ5SUd0bGVTQnBiaUJ2WW1vcElHbG1JQ2hvWVhNb2IySnFMQ0JyWlhrcEtTQnJaWGx6TG5CMWMyZ29hMlY1S1R0Y2JpQWdJQ0F2THlCQmFHVnRMQ0JKUlNBOElEa3VYRzRnSUNBZ2FXWWdLR2hoYzBWdWRXMUNkV2NwSUdOdmJHeGxZM1JPYjI1RmJuVnRVSEp2Y0hNb2IySnFMQ0JyWlhsektUdGNiaUFnSUNCeVpYUjFjbTRnYTJWNWN6dGNiaUFnZlR0Y2JseHVJQ0F2THlCU1pYUnlhV1YyWlNCaGJHd2dkR2hsSUhCeWIzQmxjblI1SUc1aGJXVnpJRzltSUdGdUlHOWlhbVZqZEM1Y2JpQWdYeTVoYkd4TFpYbHpJRDBnWm5WdVkzUnBiMjRvYjJKcUtTQjdYRzRnSUNBZ2FXWWdLQ0ZmTG1selQySnFaV04wS0c5aWFpa3BJSEpsZEhWeWJpQmJYVHRjYmlBZ0lDQjJZWElnYTJWNWN5QTlJRnRkTzF4dUlDQWdJR1p2Y2lBb2RtRnlJR3RsZVNCcGJpQnZZbW9wSUd0bGVYTXVjSFZ6YUNoclpYa3BPMXh1SUNBZ0lDOHZJRUZvWlcwc0lFbEZJRHdnT1M1Y2JpQWdJQ0JwWmlBb2FHRnpSVzUxYlVKMVp5a2dZMjlzYkdWamRFNXZia1Z1ZFcxUWNtOXdjeWh2WW1vc0lHdGxlWE1wTzF4dUlDQWdJSEpsZEhWeWJpQnJaWGx6TzF4dUlDQjlPMXh1WEc0Z0lDOHZJRkpsZEhKcFpYWmxJSFJvWlNCMllXeDFaWE1nYjJZZ1lXNGdiMkpxWldOMEozTWdjSEp2Y0dWeWRHbGxjeTVjYmlBZ1h5NTJZV3gxWlhNZ1BTQm1kVzVqZEdsdmJpaHZZbW9wSUh0Y2JpQWdJQ0IyWVhJZ2EyVjVjeUE5SUY4dWEyVjVjeWh2WW1vcE8xeHVJQ0FnSUhaaGNpQnNaVzVuZEdnZ1BTQnJaWGx6TG14bGJtZDBhRHRjYmlBZ0lDQjJZWElnZG1Gc2RXVnpJRDBnUVhKeVlYa29iR1Z1WjNSb0tUdGNiaUFnSUNCbWIzSWdLSFpoY2lCcElEMGdNRHNnYVNBOElHeGxibWQwYURzZ2FTc3JLU0I3WEc0Z0lDQWdJQ0IyWVd4MVpYTmJhVjBnUFNCdlltcGJhMlY1YzF0cFhWMDdYRzRnSUNBZ2ZWeHVJQ0FnSUhKbGRIVnliaUIyWVd4MVpYTTdYRzRnSUgwN1hHNWNiaUFnTHk4Z1VtVjBkWEp1Y3lCMGFHVWdjbVZ6ZFd4MGN5QnZaaUJoY0hCc2VXbHVaeUIwYUdVZ2FYUmxjbUYwWldVZ2RHOGdaV0ZqYUNCbGJHVnRaVzUwSUc5bUlIUm9aU0J2WW1wbFkzUXVYRzRnSUM4dklFbHVJR052Ym5SeVlYTjBJSFJ2SUY4dWJXRndJR2wwSUhKbGRIVnlibk1nWVc0Z2IySnFaV04wTGx4dUlDQmZMbTFoY0U5aWFtVmpkQ0E5SUdaMWJtTjBhVzl1S0c5aWFpd2dhWFJsY21GMFpXVXNJR052Ym5SbGVIUXBJSHRjYmlBZ0lDQnBkR1Z5WVhSbFpTQTlJR05pS0dsMFpYSmhkR1ZsTENCamIyNTBaWGgwS1R0Y2JpQWdJQ0IyWVhJZ2EyVjVjeUE5SUY4dWEyVjVjeWh2WW1vcExGeHVJQ0FnSUNBZ0lDQnNaVzVuZEdnZ1BTQnJaWGx6TG14bGJtZDBhQ3hjYmlBZ0lDQWdJQ0FnY21WemRXeDBjeUE5SUh0OU8xeHVJQ0FnSUdadmNpQW9kbUZ5SUdsdVpHVjRJRDBnTURzZ2FXNWtaWGdnUENCc1pXNW5kR2c3SUdsdVpHVjRLeXNwSUh0Y2JpQWdJQ0FnSUhaaGNpQmpkWEp5Wlc1MFMyVjVJRDBnYTJWNWMxdHBibVJsZUYwN1hHNGdJQ0FnSUNCeVpYTjFiSFJ6VzJOMWNuSmxiblJMWlhsZElEMGdhWFJsY21GMFpXVW9iMkpxVzJOMWNuSmxiblJMWlhsZExDQmpkWEp5Wlc1MFMyVjVMQ0J2WW1vcE8xeHVJQ0FnSUgxY2JpQWdJQ0J5WlhSMWNtNGdjbVZ6ZFd4MGN6dGNiaUFnZlR0Y2JseHVJQ0F2THlCRGIyNTJaWEowSUdGdUlHOWlhbVZqZENCcGJuUnZJR0VnYkdsemRDQnZaaUJnVzJ0bGVTd2dkbUZzZFdWZFlDQndZV2x5Y3k1Y2JpQWdMeThnVkdobElHOXdjRzl6YVhSbElHOW1JRjh1YjJKcVpXTjBMbHh1SUNCZkxuQmhhWEp6SUQwZ1puVnVZM1JwYjI0b2IySnFLU0I3WEc0Z0lDQWdkbUZ5SUd0bGVYTWdQU0JmTG10bGVYTW9iMkpxS1R0Y2JpQWdJQ0IyWVhJZ2JHVnVaM1JvSUQwZ2EyVjVjeTVzWlc1bmRHZzdYRzRnSUNBZ2RtRnlJSEJoYVhKeklEMGdRWEp5WVhrb2JHVnVaM1JvS1R0Y2JpQWdJQ0JtYjNJZ0tIWmhjaUJwSUQwZ01Ec2dhU0E4SUd4bGJtZDBhRHNnYVNzcktTQjdYRzRnSUNBZ0lDQndZV2x5YzF0cFhTQTlJRnRyWlhselcybGRMQ0J2WW1wYmEyVjVjMXRwWFYxZE8xeHVJQ0FnSUgxY2JpQWdJQ0J5WlhSMWNtNGdjR0ZwY25NN1hHNGdJSDA3WEc1Y2JpQWdMeThnU1c1MlpYSjBJSFJvWlNCclpYbHpJR0Z1WkNCMllXeDFaWE1nYjJZZ1lXNGdiMkpxWldOMExpQlVhR1VnZG1Gc2RXVnpJRzExYzNRZ1ltVWdjMlZ5YVdGc2FYcGhZbXhsTGx4dUlDQmZMbWx1ZG1WeWRDQTlJR1oxYm1OMGFXOXVLRzlpYWlrZ2UxeHVJQ0FnSUhaaGNpQnlaWE4xYkhRZ1BTQjdmVHRjYmlBZ0lDQjJZWElnYTJWNWN5QTlJRjh1YTJWNWN5aHZZbW9wTzF4dUlDQWdJR1p2Y2lBb2RtRnlJR2tnUFNBd0xDQnNaVzVuZEdnZ1BTQnJaWGx6TG14bGJtZDBhRHNnYVNBOElHeGxibWQwYURzZ2FTc3JLU0I3WEc0Z0lDQWdJQ0J5WlhOMWJIUmJiMkpxVzJ0bGVYTmJhVjFkWFNBOUlHdGxlWE5iYVYwN1hHNGdJQ0FnZlZ4dUlDQWdJSEpsZEhWeWJpQnlaWE4xYkhRN1hHNGdJSDA3WEc1Y2JpQWdMeThnVW1WMGRYSnVJR0VnYzI5eWRHVmtJR3hwYzNRZ2IyWWdkR2hsSUdaMWJtTjBhVzl1SUc1aGJXVnpJR0YyWVdsc1lXSnNaU0J2YmlCMGFHVWdiMkpxWldOMExseHVJQ0F2THlCQmJHbGhjMlZrSUdGeklHQnRaWFJvYjJSellDNWNiaUFnWHk1bWRXNWpkR2x2Ym5NZ1BTQmZMbTFsZEdodlpITWdQU0JtZFc1amRHbHZiaWh2WW1vcElIdGNiaUFnSUNCMllYSWdibUZ0WlhNZ1BTQmJYVHRjYmlBZ0lDQm1iM0lnS0haaGNpQnJaWGtnYVc0Z2IySnFLU0I3WEc0Z0lDQWdJQ0JwWmlBb1h5NXBjMFoxYm1OMGFXOXVLRzlpYWx0clpYbGRLU2tnYm1GdFpYTXVjSFZ6YUNoclpYa3BPMXh1SUNBZ0lIMWNiaUFnSUNCeVpYUjFjbTRnYm1GdFpYTXVjMjl5ZENncE8xeHVJQ0I5TzF4dVhHNGdJQzh2SUVGdUlHbHVkR1Z5Ym1Gc0lHWjFibU4wYVc5dUlHWnZjaUJqY21WaGRHbHVaeUJoYzNOcFoyNWxjaUJtZFc1amRHbHZibk11WEc0Z0lIWmhjaUJqY21WaGRHVkJjM05wWjI1bGNpQTlJR1oxYm1OMGFXOXVLR3RsZVhOR2RXNWpMQ0JrWldaaGRXeDBjeWtnZTF4dUlDQWdJSEpsZEhWeWJpQm1kVzVqZEdsdmJpaHZZbW9wSUh0Y2JpQWdJQ0FnSUhaaGNpQnNaVzVuZEdnZ1BTQmhjbWQxYldWdWRITXViR1Z1WjNSb08xeHVJQ0FnSUNBZ2FXWWdLR1JsWm1GMWJIUnpLU0J2WW1vZ1BTQlBZbXBsWTNRb2IySnFLVHRjYmlBZ0lDQWdJR2xtSUNoc1pXNW5kR2dnUENBeUlIeDhJRzlpYWlBOVBTQnVkV3hzS1NCeVpYUjFjbTRnYjJKcU8xeHVJQ0FnSUNBZ1ptOXlJQ2gyWVhJZ2FXNWtaWGdnUFNBeE95QnBibVJsZUNBOElHeGxibWQwYURzZ2FXNWtaWGdyS3lrZ2UxeHVJQ0FnSUNBZ0lDQjJZWElnYzI5MWNtTmxJRDBnWVhKbmRXMWxiblJ6VzJsdVpHVjRYU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lHdGxlWE1nUFNCclpYbHpSblZ1WXloemIzVnlZMlVwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdiQ0E5SUd0bGVYTXViR1Z1WjNSb08xeHVJQ0FnSUNBZ0lDQm1iM0lnS0haaGNpQnBJRDBnTURzZ2FTQThJR3c3SUdrckt5a2dlMXh1SUNBZ0lDQWdJQ0FnSUhaaGNpQnJaWGtnUFNCclpYbHpXMmxkTzF4dUlDQWdJQ0FnSUNBZ0lHbG1JQ2doWkdWbVlYVnNkSE1nZkh3Z2IySnFXMnRsZVYwZ1BUMDlJSFp2YVdRZ01Da2diMkpxVzJ0bGVWMGdQU0J6YjNWeVkyVmJhMlY1WFR0Y2JpQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ2NtVjBkWEp1SUc5aWFqdGNiaUFnSUNCOU8xeHVJQ0I5TzF4dVhHNGdJQzh2SUVWNGRHVnVaQ0JoSUdkcGRtVnVJRzlpYW1WamRDQjNhWFJvSUdGc2JDQjBhR1VnY0hKdmNHVnlkR2xsY3lCcGJpQndZWE56WldRdGFXNGdiMkpxWldOMEtITXBMbHh1SUNCZkxtVjRkR1Z1WkNBOUlHTnlaV0YwWlVGemMybG5ibVZ5S0Y4dVlXeHNTMlY1Y3lrN1hHNWNiaUFnTHk4Z1FYTnphV2R1Y3lCaElHZHBkbVZ1SUc5aWFtVmpkQ0IzYVhSb0lHRnNiQ0IwYUdVZ2IzZHVJSEJ5YjNCbGNuUnBaWE1nYVc0Z2RHaGxJSEJoYzNObFpDMXBiaUJ2WW1wbFkzUW9jeWt1WEc0Z0lDOHZJQ2hvZEhSd2N6b3ZMMlJsZG1Wc2IzQmxjaTV0YjNwcGJHeGhMbTl5Wnk5a2IyTnpMMWRsWWk5S1lYWmhVMk55YVhCMEwxSmxabVZ5Wlc1alpTOUhiRzlpWVd4ZlQySnFaV04wY3k5UFltcGxZM1F2WVhOemFXZHVLVnh1SUNCZkxtVjRkR1Z1WkU5M2JpQTlJRjh1WVhOemFXZHVJRDBnWTNKbFlYUmxRWE56YVdkdVpYSW9YeTVyWlhsektUdGNibHh1SUNBdkx5QlNaWFIxY201eklIUm9aU0JtYVhKemRDQnJaWGtnYjI0Z1lXNGdiMkpxWldOMElIUm9ZWFFnY0dGemMyVnpJR0VnY0hKbFpHbGpZWFJsSUhSbGMzUXVYRzRnSUY4dVptbHVaRXRsZVNBOUlHWjFibU4wYVc5dUtHOWlhaXdnY0hKbFpHbGpZWFJsTENCamIyNTBaWGgwS1NCN1hHNGdJQ0FnY0hKbFpHbGpZWFJsSUQwZ1kySW9jSEpsWkdsallYUmxMQ0JqYjI1MFpYaDBLVHRjYmlBZ0lDQjJZWElnYTJWNWN5QTlJRjh1YTJWNWN5aHZZbW9wTENCclpYazdYRzRnSUNBZ1ptOXlJQ2gyWVhJZ2FTQTlJREFzSUd4bGJtZDBhQ0E5SUd0bGVYTXViR1Z1WjNSb095QnBJRHdnYkdWdVozUm9PeUJwS3lzcElIdGNiaUFnSUNBZ0lHdGxlU0E5SUd0bGVYTmJhVjA3WEc0Z0lDQWdJQ0JwWmlBb2NISmxaR2xqWVhSbEtHOWlhbHRyWlhsZExDQnJaWGtzSUc5aWFpa3BJSEpsZEhWeWJpQnJaWGs3WEc0Z0lDQWdmVnh1SUNCOU8xeHVYRzRnSUM4dklFbHVkR1Z5Ym1Gc0lIQnBZMnNnYUdWc2NHVnlJR1oxYm1OMGFXOXVJSFJ2SUdSbGRHVnliV2x1WlNCcFppQmdiMkpxWUNCb1lYTWdhMlY1SUdCclpYbGdMbHh1SUNCMllYSWdhMlY1U1c1UFltb2dQU0JtZFc1amRHbHZiaWgyWVd4MVpTd2dhMlY1TENCdlltb3BJSHRjYmlBZ0lDQnlaWFIxY200Z2EyVjVJR2x1SUc5aWFqdGNiaUFnZlR0Y2JseHVJQ0F2THlCU1pYUjFjbTRnWVNCamIzQjVJRzltSUhSb1pTQnZZbXBsWTNRZ2IyNXNlU0JqYjI1MFlXbHVhVzVuSUhSb1pTQjNhR2wwWld4cGMzUmxaQ0J3Y205d1pYSjBhV1Z6TGx4dUlDQmZMbkJwWTJzZ1BTQnlaWE4wUVhKbmRXMWxiblJ6S0daMWJtTjBhVzl1S0c5aWFpd2dhMlY1Y3lrZ2UxeHVJQ0FnSUhaaGNpQnlaWE4xYkhRZ1BTQjdmU3dnYVhSbGNtRjBaV1VnUFNCclpYbHpXekJkTzF4dUlDQWdJR2xtSUNodlltb2dQVDBnYm5Wc2JDa2djbVYwZFhKdUlISmxjM1ZzZER0Y2JpQWdJQ0JwWmlBb1h5NXBjMFoxYm1OMGFXOXVLR2wwWlhKaGRHVmxLU2tnZTF4dUlDQWdJQ0FnYVdZZ0tHdGxlWE11YkdWdVozUm9JRDRnTVNrZ2FYUmxjbUYwWldVZ1BTQnZjSFJwYldsNlpVTmlLR2wwWlhKaGRHVmxMQ0JyWlhseld6RmRLVHRjYmlBZ0lDQWdJR3RsZVhNZ1BTQmZMbUZzYkV0bGVYTW9iMkpxS1R0Y2JpQWdJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lDQWdhWFJsY21GMFpXVWdQU0JyWlhsSmJrOWlhanRjYmlBZ0lDQWdJR3RsZVhNZ1BTQm1iR0YwZEdWdUtHdGxlWE1zSUdaaGJITmxMQ0JtWVd4elpTazdYRzRnSUNBZ0lDQnZZbW9nUFNCUFltcGxZM1FvYjJKcUtUdGNiaUFnSUNCOVhHNGdJQ0FnWm05eUlDaDJZWElnYVNBOUlEQXNJR3hsYm1kMGFDQTlJR3RsZVhNdWJHVnVaM1JvT3lCcElEd2diR1Z1WjNSb095QnBLeXNwSUh0Y2JpQWdJQ0FnSUhaaGNpQnJaWGtnUFNCclpYbHpXMmxkTzF4dUlDQWdJQ0FnZG1GeUlIWmhiSFZsSUQwZ2IySnFXMnRsZVYwN1hHNGdJQ0FnSUNCcFppQW9hWFJsY21GMFpXVW9kbUZzZFdVc0lHdGxlU3dnYjJKcUtTa2djbVZ6ZFd4MFcydGxlVjBnUFNCMllXeDFaVHRjYmlBZ0lDQjlYRzRnSUNBZ2NtVjBkWEp1SUhKbGMzVnNkRHRjYmlBZ2ZTazdYRzVjYmlBZ0x5OGdVbVYwZFhKdUlHRWdZMjl3ZVNCdlppQjBhR1VnYjJKcVpXTjBJSGRwZEdodmRYUWdkR2hsSUdKc1lXTnJiR2x6ZEdWa0lIQnliM0JsY25ScFpYTXVYRzRnSUY4dWIyMXBkQ0E5SUhKbGMzUkJjbWQxYldWdWRITW9ablZ1WTNScGIyNG9iMkpxTENCclpYbHpLU0I3WEc0Z0lDQWdkbUZ5SUdsMFpYSmhkR1ZsSUQwZ2EyVjVjMXN3WFN3Z1kyOXVkR1Y0ZER0Y2JpQWdJQ0JwWmlBb1h5NXBjMFoxYm1OMGFXOXVLR2wwWlhKaGRHVmxLU2tnZTF4dUlDQWdJQ0FnYVhSbGNtRjBaV1VnUFNCZkxtNWxaMkYwWlNocGRHVnlZWFJsWlNrN1hHNGdJQ0FnSUNCcFppQW9hMlY1Y3k1c1pXNW5kR2dnUGlBeEtTQmpiMjUwWlhoMElEMGdhMlY1YzFzeFhUdGNiaUFnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnYTJWNWN5QTlJRjh1YldGd0tHWnNZWFIwWlc0b2EyVjVjeXdnWm1Gc2MyVXNJR1poYkhObEtTd2dVM1J5YVc1bktUdGNiaUFnSUNBZ0lHbDBaWEpoZEdWbElEMGdablZ1WTNScGIyNG9kbUZzZFdVc0lHdGxlU2tnZTF4dUlDQWdJQ0FnSUNCeVpYUjFjbTRnSVY4dVkyOXVkR0ZwYm5Nb2EyVjVjeXdnYTJWNUtUdGNiaUFnSUNBZ0lIMDdYRzRnSUNBZ2ZWeHVJQ0FnSUhKbGRIVnliaUJmTG5CcFkyc29iMkpxTENCcGRHVnlZWFJsWlN3Z1kyOXVkR1Y0ZENrN1hHNGdJSDBwTzF4dVhHNGdJQzh2SUVacGJHd2dhVzRnWVNCbmFYWmxiaUJ2WW1wbFkzUWdkMmwwYUNCa1pXWmhkV3gwSUhCeWIzQmxjblJwWlhNdVhHNGdJRjh1WkdWbVlYVnNkSE1nUFNCamNtVmhkR1ZCYzNOcFoyNWxjaWhmTG1Gc2JFdGxlWE1zSUhSeWRXVXBPMXh1WEc0Z0lDOHZJRU55WldGMFpYTWdZVzRnYjJKcVpXTjBJSFJvWVhRZ2FXNW9aWEpwZEhNZ1puSnZiU0IwYUdVZ1oybDJaVzRnY0hKdmRHOTBlWEJsSUc5aWFtVmpkQzVjYmlBZ0x5OGdTV1lnWVdSa2FYUnBiMjVoYkNCd2NtOXdaWEowYVdWeklHRnlaU0J3Y205MmFXUmxaQ0IwYUdWdUlIUm9aWGtnZDJsc2JDQmlaU0JoWkdSbFpDQjBieUIwYUdWY2JpQWdMeThnWTNKbFlYUmxaQ0J2WW1wbFkzUXVYRzRnSUY4dVkzSmxZWFJsSUQwZ1puVnVZM1JwYjI0b2NISnZkRzkwZVhCbExDQndjbTl3Y3lrZ2UxeHVJQ0FnSUhaaGNpQnlaWE4xYkhRZ1BTQmlZWE5sUTNKbFlYUmxLSEJ5YjNSdmRIbHdaU2s3WEc0Z0lDQWdhV1lnS0hCeWIzQnpLU0JmTG1WNGRHVnVaRTkzYmloeVpYTjFiSFFzSUhCeWIzQnpLVHRjYmlBZ0lDQnlaWFIxY200Z2NtVnpkV3gwTzF4dUlDQjlPMXh1WEc0Z0lDOHZJRU55WldGMFpTQmhJQ2h6YUdGc2JHOTNMV05zYjI1bFpDa2daSFZ3YkdsallYUmxJRzltSUdGdUlHOWlhbVZqZEM1Y2JpQWdYeTVqYkc5dVpTQTlJR1oxYm1OMGFXOXVLRzlpYWlrZ2UxeHVJQ0FnSUdsbUlDZ2hYeTVwYzA5aWFtVmpkQ2h2WW1vcEtTQnlaWFIxY200Z2IySnFPMXh1SUNBZ0lISmxkSFZ5YmlCZkxtbHpRWEp5WVhrb2IySnFLU0EvSUc5aWFpNXpiR2xqWlNncElEb2dYeTVsZUhSbGJtUW9lMzBzSUc5aWFpazdYRzRnSUgwN1hHNWNiaUFnTHk4Z1NXNTJiMnRsY3lCcGJuUmxjbU5sY0hSdmNpQjNhWFJvSUhSb1pTQnZZbW9zSUdGdVpDQjBhR1Z1SUhKbGRIVnlibk1nYjJKcUxseHVJQ0F2THlCVWFHVWdjSEpwYldGeWVTQndkWEp3YjNObElHOW1JSFJvYVhNZ2JXVjBhRzlrSUdseklIUnZJRndpZEdGd0lHbHVkRzljSWlCaElHMWxkR2h2WkNCamFHRnBiaXdnYVc1Y2JpQWdMeThnYjNKa1pYSWdkRzhnY0dWeVptOXliU0J2Y0dWeVlYUnBiMjV6SUc5dUlHbHVkR1Z5YldWa2FXRjBaU0J5WlhOMWJIUnpJSGRwZEdocGJpQjBhR1VnWTJoaGFXNHVYRzRnSUY4dWRHRndJRDBnWm5WdVkzUnBiMjRvYjJKcUxDQnBiblJsY21ObGNIUnZjaWtnZTF4dUlDQWdJR2x1ZEdWeVkyVndkRzl5S0c5aWFpazdYRzRnSUNBZ2NtVjBkWEp1SUc5aWFqdGNiaUFnZlR0Y2JseHVJQ0F2THlCU1pYUjFjbTV6SUhkb1pYUm9aWElnWVc0Z2IySnFaV04wSUdoaGN5QmhJR2RwZG1WdUlITmxkQ0J2WmlCZ2EyVjVPblpoYkhWbFlDQndZV2x5Y3k1Y2JpQWdYeTVwYzAxaGRHTm9JRDBnWm5WdVkzUnBiMjRvYjJKcVpXTjBMQ0JoZEhSeWN5a2dlMXh1SUNBZ0lIWmhjaUJyWlhseklEMGdYeTVyWlhsektHRjBkSEp6S1N3Z2JHVnVaM1JvSUQwZ2EyVjVjeTVzWlc1bmRHZzdYRzRnSUNBZ2FXWWdLRzlpYW1WamRDQTlQU0J1ZFd4c0tTQnlaWFIxY200Z0lXeGxibWQwYUR0Y2JpQWdJQ0IyWVhJZ2IySnFJRDBnVDJKcVpXTjBLRzlpYW1WamRDazdYRzRnSUNBZ1ptOXlJQ2gyWVhJZ2FTQTlJREE3SUdrZ1BDQnNaVzVuZEdnN0lHa3JLeWtnZTF4dUlDQWdJQ0FnZG1GeUlHdGxlU0E5SUd0bGVYTmJhVjA3WEc0Z0lDQWdJQ0JwWmlBb1lYUjBjbk5iYTJWNVhTQWhQVDBnYjJKcVcydGxlVjBnZkh3Z0lTaHJaWGtnYVc0Z2IySnFLU2tnY21WMGRYSnVJR1poYkhObE8xeHVJQ0FnSUgxY2JpQWdJQ0J5WlhSMWNtNGdkSEoxWlR0Y2JpQWdmVHRjYmx4dVhHNGdJQzh2SUVsdWRHVnlibUZzSUhKbFkzVnljMmwyWlNCamIyMXdZWEpwYzI5dUlHWjFibU4wYVc5dUlHWnZjaUJnYVhORmNYVmhiR0F1WEc0Z0lIWmhjaUJsY1N3Z1pHVmxjRVZ4TzF4dUlDQmxjU0E5SUdaMWJtTjBhVzl1S0dFc0lHSXNJR0ZUZEdGamF5d2dZbE4wWVdOcktTQjdYRzRnSUNBZ0x5OGdTV1JsYm5ScFkyRnNJRzlpYW1WamRITWdZWEpsSUdWeGRXRnNMaUJnTUNBOVBUMGdMVEJnTENCaWRYUWdkR2hsZVNCaGNtVnVKM1FnYVdSbGJuUnBZMkZzTGx4dUlDQWdJQzh2SUZObFpTQjBhR1VnVzBoaGNtMXZibmtnWUdWbllXeGdJSEJ5YjNCdmMyRnNYU2hvZEhSd09pOHZkMmxyYVM1bFkyMWhjMk55YVhCMExtOXlaeTlrYjJ0MUxuQm9jRDlwWkQxb1lYSnRiMjU1T21WbllXd3BMbHh1SUNBZ0lHbG1JQ2hoSUQwOVBTQmlLU0J5WlhSMWNtNGdZU0FoUFQwZ01DQjhmQ0F4SUM4Z1lTQTlQVDBnTVNBdklHSTdYRzRnSUNBZ0x5OGdZRzUxYkd4Z0lHOXlJR0IxYm1SbFptbHVaV1JnSUc5dWJIa2daWEYxWVd3Z2RHOGdhWFJ6Wld4bUlDaHpkSEpwWTNRZ1kyOXRjR0Z5YVhOdmJpa3VYRzRnSUNBZ2FXWWdLR0VnUFQwZ2JuVnNiQ0I4ZkNCaUlEMDlJRzUxYkd3cElISmxkSFZ5YmlCbVlXeHpaVHRjYmlBZ0lDQXZMeUJnVG1GT1lITWdZWEpsSUdWeGRXbDJZV3hsYm5Rc0lHSjFkQ0J1YjI0dGNtVm1iR1Y0YVhabExseHVJQ0FnSUdsbUlDaGhJQ0U5UFNCaEtTQnlaWFIxY200Z1lpQWhQVDBnWWp0Y2JpQWdJQ0F2THlCRmVHaGhkWE4wSUhCeWFXMXBkR2wyWlNCamFHVmphM05jYmlBZ0lDQjJZWElnZEhsd1pTQTlJSFI1Y0dWdlppQmhPMXh1SUNBZ0lHbG1JQ2gwZVhCbElDRTlQU0FuWm5WdVkzUnBiMjRuSUNZbUlIUjVjR1VnSVQwOUlDZHZZbXBsWTNRbklDWW1JSFI1Y0dWdlppQmlJQ0U5SUNkdlltcGxZM1FuS1NCeVpYUjFjbTRnWm1Gc2MyVTdYRzRnSUNBZ2NtVjBkWEp1SUdSbFpYQkZjU2hoTENCaUxDQmhVM1JoWTJzc0lHSlRkR0ZqYXlrN1hHNGdJSDA3WEc1Y2JpQWdMeThnU1c1MFpYSnVZV3dnY21WamRYSnphWFpsSUdOdmJYQmhjbWx6YjI0Z1puVnVZM1JwYjI0Z1ptOXlJR0JwYzBWeGRXRnNZQzVjYmlBZ1pHVmxjRVZ4SUQwZ1puVnVZM1JwYjI0b1lTd2dZaXdnWVZOMFlXTnJMQ0JpVTNSaFkyc3BJSHRjYmlBZ0lDQXZMeUJWYm5keVlYQWdZVzU1SUhkeVlYQndaV1FnYjJKcVpXTjBjeTVjYmlBZ0lDQnBaaUFvWVNCcGJuTjBZVzVqWlc5bUlGOHBJR0VnUFNCaExsOTNjbUZ3Y0dWa08xeHVJQ0FnSUdsbUlDaGlJR2x1YzNSaGJtTmxiMllnWHlrZ1lpQTlJR0l1WDNkeVlYQndaV1E3WEc0Z0lDQWdMeThnUTI5dGNHRnlaU0JnVzF0RGJHRnpjMTFkWUNCdVlXMWxjeTVjYmlBZ0lDQjJZWElnWTJ4aGMzTk9ZVzFsSUQwZ2RHOVRkSEpwYm1jdVkyRnNiQ2hoS1R0Y2JpQWdJQ0JwWmlBb1kyeGhjM05PWVcxbElDRTlQU0IwYjFOMGNtbHVaeTVqWVd4c0tHSXBLU0J5WlhSMWNtNGdabUZzYzJVN1hHNGdJQ0FnYzNkcGRHTm9JQ2hqYkdGemMwNWhiV1VwSUh0Y2JpQWdJQ0FnSUM4dklGTjBjbWx1WjNNc0lHNTFiV0psY25Nc0lISmxaM1ZzWVhJZ1pYaHdjbVZ6YzJsdmJuTXNJR1JoZEdWekxDQmhibVFnWW05dmJHVmhibk1nWVhKbElHTnZiWEJoY21Wa0lHSjVJSFpoYkhWbExseHVJQ0FnSUNBZ1kyRnpaU0FuVzI5aWFtVmpkQ0JTWldkRmVIQmRKenBjYmlBZ0lDQWdJQzh2SUZKbFowVjRjSE1nWVhKbElHTnZaWEpqWldRZ2RHOGdjM1J5YVc1bmN5Qm1iM0lnWTI5dGNHRnlhWE52YmlBb1RtOTBaVG9nSnljZ0t5QXZZUzlwSUQwOVBTQW5MMkV2YVNjcFhHNGdJQ0FnSUNCallYTmxJQ2RiYjJKcVpXTjBJRk4wY21sdVoxMG5PbHh1SUNBZ0lDQWdJQ0F2THlCUWNtbHRhWFJwZG1WeklHRnVaQ0IwYUdWcGNpQmpiM0p5WlhOd2IyNWthVzVuSUc5aWFtVmpkQ0IzY21Gd2NHVnljeUJoY21VZ1pYRjFhWFpoYkdWdWREc2dkR2gxY3l3Z1lGd2lOVndpWUNCcGMxeHVJQ0FnSUNBZ0lDQXZMeUJsY1hWcGRtRnNaVzUwSUhSdklHQnVaWGNnVTNSeWFXNW5LRndpTlZ3aUtXQXVYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQW5KeUFySUdFZ1BUMDlJQ2NuSUNzZ1lqdGNiaUFnSUNBZ0lHTmhjMlVnSjF0dlltcGxZM1FnVG5WdFltVnlYU2M2WEc0Z0lDQWdJQ0FnSUM4dklHQk9ZVTVnY3lCaGNtVWdaWEYxYVhaaGJHVnVkQ3dnWW5WMElHNXZiaTF5Wldac1pYaHBkbVV1WEc0Z0lDQWdJQ0FnSUM4dklFOWlhbVZqZENoT1lVNHBJR2x6SUdWeGRXbDJZV3hsYm5RZ2RHOGdUbUZPTGx4dUlDQWdJQ0FnSUNCcFppQW9LMkVnSVQwOUlDdGhLU0J5WlhSMWNtNGdLMklnSVQwOUlDdGlPMXh1SUNBZ0lDQWdJQ0F2THlCQmJpQmdaV2RoYkdBZ1kyOXRjR0Z5YVhOdmJpQnBjeUJ3WlhKbWIzSnRaV1FnWm05eUlHOTBhR1Z5SUc1MWJXVnlhV01nZG1Gc2RXVnpMbHh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdLMkVnUFQwOUlEQWdQeUF4SUM4Z0syRWdQVDA5SURFZ0x5QmlJRG9nSzJFZ1BUMDlJQ3RpTzF4dUlDQWdJQ0FnWTJGelpTQW5XMjlpYW1WamRDQkVZWFJsWFNjNlhHNGdJQ0FnSUNCallYTmxJQ2RiYjJKcVpXTjBJRUp2YjJ4bFlXNWRKenBjYmlBZ0lDQWdJQ0FnTHk4Z1EyOWxjbU5sSUdSaGRHVnpJR0Z1WkNCaWIyOXNaV0Z1Y3lCMGJ5QnVkVzFsY21saklIQnlhVzFwZEdsMlpTQjJZV3gxWlhNdUlFUmhkR1Z6SUdGeVpTQmpiMjF3WVhKbFpDQmllU0IwYUdWcGNseHVJQ0FnSUNBZ0lDQXZMeUJ0YVd4c2FYTmxZMjl1WkNCeVpYQnlaWE5sYm5SaGRHbHZibk11SUU1dmRHVWdkR2hoZENCcGJuWmhiR2xrSUdSaGRHVnpJSGRwZEdnZ2JXbHNiR2x6WldOdmJtUWdjbVZ3Y21WelpXNTBZWFJwYjI1elhHNGdJQ0FnSUNBZ0lDOHZJRzltSUdCT1lVNWdJR0Z5WlNCdWIzUWdaWEYxYVhaaGJHVnVkQzVjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJQ3RoSUQwOVBTQXJZanRjYmlBZ0lDQWdJR05oYzJVZ0oxdHZZbXBsWTNRZ1UzbHRZbTlzWFNjNlhHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCVGVXMWliMnhRY205MGJ5NTJZV3gxWlU5bUxtTmhiR3dvWVNrZ1BUMDlJRk41YldKdmJGQnliM1J2TG5aaGJIVmxUMll1WTJGc2JDaGlLVHRjYmlBZ0lDQjlYRzVjYmlBZ0lDQjJZWElnWVhKbFFYSnlZWGx6SUQwZ1kyeGhjM05PWVcxbElEMDlQU0FuVzI5aWFtVmpkQ0JCY25KaGVWMG5PMXh1SUNBZ0lHbG1JQ2doWVhKbFFYSnlZWGx6S1NCN1hHNGdJQ0FnSUNCcFppQW9kSGx3Wlc5bUlHRWdJVDBnSjI5aWFtVmpkQ2NnZkh3Z2RIbHdaVzltSUdJZ0lUMGdKMjlpYW1WamRDY3BJSEpsZEhWeWJpQm1ZV3h6WlR0Y2JseHVJQ0FnSUNBZ0x5OGdUMkpxWldOMGN5QjNhWFJvSUdScFptWmxjbVZ1ZENCamIyNXpkSEoxWTNSdmNuTWdZWEpsSUc1dmRDQmxjWFZwZG1Gc1pXNTBMQ0JpZFhRZ1lFOWlhbVZqZEdCeklHOXlJR0JCY25KaGVXQnpYRzRnSUNBZ0lDQXZMeUJtY205dElHUnBabVpsY21WdWRDQm1jbUZ0WlhNZ1lYSmxMbHh1SUNBZ0lDQWdkbUZ5SUdGRGRHOXlJRDBnWVM1amIyNXpkSEoxWTNSdmNpd2dZa04wYjNJZ1BTQmlMbU52Ym5OMGNuVmpkRzl5TzF4dUlDQWdJQ0FnYVdZZ0tHRkRkRzl5SUNFOVBTQmlRM1J2Y2lBbUppQWhLRjh1YVhOR2RXNWpkR2x2YmloaFEzUnZjaWtnSmlZZ1lVTjBiM0lnYVc1emRHRnVZMlZ2WmlCaFEzUnZjaUFtSmx4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRjh1YVhOR2RXNWpkR2x2YmloaVEzUnZjaWtnSmlZZ1lrTjBiM0lnYVc1emRHRnVZMlZ2WmlCaVEzUnZjaWxjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSmlZZ0tDZGpiMjV6ZEhKMVkzUnZjaWNnYVc0Z1lTQW1KaUFuWTI5dWMzUnlkV04wYjNJbklHbHVJR0lwS1NCN1hHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCbVlXeHpaVHRjYmlBZ0lDQWdJSDFjYmlBZ0lDQjlYRzRnSUNBZ0x5OGdRWE56ZFcxbElHVnhkV0ZzYVhSNUlHWnZjaUJqZVdOc2FXTWdjM1J5ZFdOMGRYSmxjeTRnVkdobElHRnNaMjl5YVhSb2JTQm1iM0lnWkdWMFpXTjBhVzVuSUdONVkyeHBZMXh1SUNBZ0lDOHZJSE4wY25WamRIVnlaWE1nYVhNZ1lXUmhjSFJsWkNCbWNtOXRJRVZUSURVdU1TQnpaV04wYVc5dUlERTFMakV5TGpNc0lHRmljM1J5WVdOMElHOXdaWEpoZEdsdmJpQmdTazlnTGx4dVhHNGdJQ0FnTHk4Z1NXNXBkR2xoYkdsNmFXNW5JSE4wWVdOcklHOW1JSFJ5WVhabGNuTmxaQ0J2WW1wbFkzUnpMbHh1SUNBZ0lDOHZJRWwwSjNNZ1pHOXVaU0JvWlhKbElITnBibU5sSUhkbElHOXViSGtnYm1WbFpDQjBhR1Z0SUdadmNpQnZZbXBsWTNSeklHRnVaQ0JoY25KaGVYTWdZMjl0Y0dGeWFYTnZiaTVjYmlBZ0lDQmhVM1JoWTJzZ1BTQmhVM1JoWTJzZ2ZId2dXMTA3WEc0Z0lDQWdZbE4wWVdOcklEMGdZbE4wWVdOcklIeDhJRnRkTzF4dUlDQWdJSFpoY2lCc1pXNW5kR2dnUFNCaFUzUmhZMnN1YkdWdVozUm9PMXh1SUNBZ0lIZG9hV3hsSUNoc1pXNW5kR2d0TFNrZ2UxeHVJQ0FnSUNBZ0x5OGdUR2x1WldGeUlITmxZWEpqYUM0Z1VHVnlabTl5YldGdVkyVWdhWE1nYVc1MlpYSnpaV3g1SUhCeWIzQnZjblJwYjI1aGJDQjBieUIwYUdVZ2JuVnRZbVZ5SUc5bVhHNGdJQ0FnSUNBdkx5QjFibWx4ZFdVZ2JtVnpkR1ZrSUhOMGNuVmpkSFZ5WlhNdVhHNGdJQ0FnSUNCcFppQW9ZVk4wWVdOclcyeGxibWQwYUYwZ1BUMDlJR0VwSUhKbGRIVnliaUJpVTNSaFkydGJiR1Z1WjNSb1hTQTlQVDBnWWp0Y2JpQWdJQ0I5WEc1Y2JpQWdJQ0F2THlCQlpHUWdkR2hsSUdacGNuTjBJRzlpYW1WamRDQjBieUIwYUdVZ2MzUmhZMnNnYjJZZ2RISmhkbVZ5YzJWa0lHOWlhbVZqZEhNdVhHNGdJQ0FnWVZOMFlXTnJMbkIxYzJnb1lTazdYRzRnSUNBZ1lsTjBZV05yTG5CMWMyZ29ZaWs3WEc1Y2JpQWdJQ0F2THlCU1pXTjFjbk5wZG1Wc2VTQmpiMjF3WVhKbElHOWlhbVZqZEhNZ1lXNWtJR0Z5Y21GNWN5NWNiaUFnSUNCcFppQW9ZWEpsUVhKeVlYbHpLU0I3WEc0Z0lDQWdJQ0F2THlCRGIyMXdZWEpsSUdGeWNtRjVJR3hsYm1kMGFITWdkRzhnWkdWMFpYSnRhVzVsSUdsbUlHRWdaR1ZsY0NCamIyMXdZWEpwYzI5dUlHbHpJRzVsWTJWemMyRnllUzVjYmlBZ0lDQWdJR3hsYm1kMGFDQTlJR0V1YkdWdVozUm9PMXh1SUNBZ0lDQWdhV1lnS0d4bGJtZDBhQ0FoUFQwZ1lpNXNaVzVuZEdncElISmxkSFZ5YmlCbVlXeHpaVHRjYmlBZ0lDQWdJQzh2SUVSbFpYQWdZMjl0Y0dGeVpTQjBhR1VnWTI5dWRHVnVkSE1zSUdsbmJtOXlhVzVuSUc1dmJpMXVkVzFsY21saklIQnliM0JsY25ScFpYTXVYRzRnSUNBZ0lDQjNhR2xzWlNBb2JHVnVaM1JvTFMwcElIdGNiaUFnSUNBZ0lDQWdhV1lnS0NGbGNTaGhXMnhsYm1kMGFGMHNJR0piYkdWdVozUm9YU3dnWVZOMFlXTnJMQ0JpVTNSaFkyc3BLU0J5WlhSMWNtNGdabUZzYzJVN1hHNGdJQ0FnSUNCOVhHNGdJQ0FnZlNCbGJITmxJSHRjYmlBZ0lDQWdJQzh2SUVSbFpYQWdZMjl0Y0dGeVpTQnZZbXBsWTNSekxseHVJQ0FnSUNBZ2RtRnlJR3RsZVhNZ1BTQmZMbXRsZVhNb1lTa3NJR3RsZVR0Y2JpQWdJQ0FnSUd4bGJtZDBhQ0E5SUd0bGVYTXViR1Z1WjNSb08xeHVJQ0FnSUNBZ0x5OGdSVzV6ZFhKbElIUm9ZWFFnWW05MGFDQnZZbXBsWTNSeklHTnZiblJoYVc0Z2RHaGxJSE5oYldVZ2JuVnRZbVZ5SUc5bUlIQnliM0JsY25ScFpYTWdZbVZtYjNKbElHTnZiWEJoY21sdVp5QmtaV1Z3SUdWeGRXRnNhWFI1TGx4dUlDQWdJQ0FnYVdZZ0tGOHVhMlY1Y3loaUtTNXNaVzVuZEdnZ0lUMDlJR3hsYm1kMGFDa2djbVYwZFhKdUlHWmhiSE5sTzF4dUlDQWdJQ0FnZDJocGJHVWdLR3hsYm1kMGFDMHRLU0I3WEc0Z0lDQWdJQ0FnSUM4dklFUmxaWEFnWTI5dGNHRnlaU0JsWVdOb0lHMWxiV0psY2x4dUlDQWdJQ0FnSUNCclpYa2dQU0JyWlhselcyeGxibWQwYUYwN1hHNGdJQ0FnSUNBZ0lHbG1JQ2doS0doaGN5aGlMQ0JyWlhrcElDWW1JR1Z4S0dGYmEyVjVYU3dnWWx0clpYbGRMQ0JoVTNSaFkyc3NJR0pUZEdGamF5a3BLU0J5WlhSMWNtNGdabUZzYzJVN1hHNGdJQ0FnSUNCOVhHNGdJQ0FnZlZ4dUlDQWdJQzh2SUZKbGJXOTJaU0IwYUdVZ1ptbHljM1FnYjJKcVpXTjBJR1p5YjIwZ2RHaGxJSE4wWVdOcklHOW1JSFJ5WVhabGNuTmxaQ0J2WW1wbFkzUnpMbHh1SUNBZ0lHRlRkR0ZqYXk1d2IzQW9LVHRjYmlBZ0lDQmlVM1JoWTJzdWNHOXdLQ2s3WEc0Z0lDQWdjbVYwZFhKdUlIUnlkV1U3WEc0Z0lIMDdYRzVjYmlBZ0x5OGdVR1Z5Wm05eWJTQmhJR1JsWlhBZ1kyOXRjR0Z5YVhOdmJpQjBieUJqYUdWamF5QnBaaUIwZDI4Z2IySnFaV04wY3lCaGNtVWdaWEYxWVd3dVhHNGdJRjh1YVhORmNYVmhiQ0E5SUdaMWJtTjBhVzl1S0dFc0lHSXBJSHRjYmlBZ0lDQnlaWFIxY200Z1pYRW9ZU3dnWWlrN1hHNGdJSDA3WEc1Y2JpQWdMeThnU1hNZ1lTQm5hWFpsYmlCaGNuSmhlU3dnYzNSeWFXNW5MQ0J2Y2lCdlltcGxZM1FnWlcxd2RIay9YRzRnSUM4dklFRnVJRndpWlcxd2RIbGNJaUJ2WW1wbFkzUWdhR0Z6SUc1dklHVnVkVzFsY21GaWJHVWdiM2R1TFhCeWIzQmxjblJwWlhNdVhHNGdJRjh1YVhORmJYQjBlU0E5SUdaMWJtTjBhVzl1S0c5aWFpa2dlMXh1SUNBZ0lHbG1JQ2h2WW1vZ1BUMGdiblZzYkNrZ2NtVjBkWEp1SUhSeWRXVTdYRzRnSUNBZ2FXWWdLR2x6UVhKeVlYbE1hV3RsS0c5aWFpa2dKaVlnS0Y4dWFYTkJjbkpoZVNodlltb3BJSHg4SUY4dWFYTlRkSEpwYm1jb2IySnFLU0I4ZkNCZkxtbHpRWEpuZFcxbGJuUnpLRzlpYWlrcEtTQnlaWFIxY200Z2IySnFMbXhsYm1kMGFDQTlQVDBnTUR0Y2JpQWdJQ0J5WlhSMWNtNGdYeTVyWlhsektHOWlhaWt1YkdWdVozUm9JRDA5UFNBd08xeHVJQ0I5TzF4dVhHNGdJQzh2SUVseklHRWdaMmwyWlc0Z2RtRnNkV1VnWVNCRVQwMGdaV3hsYldWdWREOWNiaUFnWHk1cGMwVnNaVzFsYm5RZ1BTQm1kVzVqZEdsdmJpaHZZbW9wSUh0Y2JpQWdJQ0J5WlhSMWNtNGdJU0VvYjJKcUlDWW1JRzlpYWk1dWIyUmxWSGx3WlNBOVBUMGdNU2s3WEc0Z0lIMDdYRzVjYmlBZ0x5OGdTWE1nWVNCbmFYWmxiaUIyWVd4MVpTQmhiaUJoY25KaGVUOWNiaUFnTHk4Z1JHVnNaV2RoZEdWeklIUnZJRVZEVFVFMUozTWdibUYwYVhabElFRnljbUY1TG1selFYSnlZWGxjYmlBZ1h5NXBjMEZ5Y21GNUlEMGdibUYwYVhabFNYTkJjbkpoZVNCOGZDQm1kVzVqZEdsdmJpaHZZbW9wSUh0Y2JpQWdJQ0J5WlhSMWNtNGdkRzlUZEhKcGJtY3VZMkZzYkNodlltb3BJRDA5UFNBblcyOWlhbVZqZENCQmNuSmhlVjBuTzF4dUlDQjlPMXh1WEc0Z0lDOHZJRWx6SUdFZ1oybDJaVzRnZG1GeWFXRmliR1VnWVc0Z2IySnFaV04wUDF4dUlDQmZMbWx6VDJKcVpXTjBJRDBnWm5WdVkzUnBiMjRvYjJKcUtTQjdYRzRnSUNBZ2RtRnlJSFI1Y0dVZ1BTQjBlWEJsYjJZZ2IySnFPMXh1SUNBZ0lISmxkSFZ5YmlCMGVYQmxJRDA5UFNBblpuVnVZM1JwYjI0bklIeDhJSFI1Y0dVZ1BUMDlJQ2R2WW1wbFkzUW5JQ1ltSUNFaGIySnFPMXh1SUNCOU8xeHVYRzRnSUM4dklFRmtaQ0J6YjIxbElHbHpWSGx3WlNCdFpYUm9iMlJ6T2lCcGMwRnlaM1Z0Wlc1MGN5d2dhWE5HZFc1amRHbHZiaXdnYVhOVGRISnBibWNzSUdselRuVnRZbVZ5TENCcGMwUmhkR1VzSUdselVtVm5SWGh3TENCcGMwVnljbTl5TENCcGMwMWhjQ3dnYVhOWFpXRnJUV0Z3TENCcGMxTmxkQ3dnYVhOWFpXRnJVMlYwTGx4dUlDQmZMbVZoWTJnb1d5ZEJjbWQxYldWdWRITW5MQ0FuUm5WdVkzUnBiMjRuTENBblUzUnlhVzVuSnl3Z0owNTFiV0psY2ljc0lDZEVZWFJsSnl3Z0oxSmxaMFY0Y0Njc0lDZEZjbkp2Y2ljc0lDZFRlVzFpYjJ3bkxDQW5UV0Z3Snl3Z0oxZGxZV3ROWVhBbkxDQW5VMlYwSnl3Z0oxZGxZV3RUWlhRblhTd2dablZ1WTNScGIyNG9ibUZ0WlNrZ2UxeHVJQ0FnSUY5YkoybHpKeUFySUc1aGJXVmRJRDBnWm5WdVkzUnBiMjRvYjJKcUtTQjdYRzRnSUNBZ0lDQnlaWFIxY200Z2RHOVRkSEpwYm1jdVkyRnNiQ2h2WW1vcElEMDlQU0FuVzI5aWFtVmpkQ0FuSUNzZ2JtRnRaU0FySUNkZEp6dGNiaUFnSUNCOU8xeHVJQ0I5S1R0Y2JseHVJQ0F2THlCRVpXWnBibVVnWVNCbVlXeHNZbUZqYXlCMlpYSnphVzl1SUc5bUlIUm9aU0J0WlhSb2IyUWdhVzRnWW5KdmQzTmxjbk1nS0dGb1pXMHNJRWxGSUR3Z09Ta3NJSGRvWlhKbFhHNGdJQzh2SUhSb1pYSmxJR2x6YmlkMElHRnVlU0JwYm5Od1pXTjBZV0pzWlNCY0lrRnlaM1Z0Wlc1MGMxd2lJSFI1Y0dVdVhHNGdJR2xtSUNnaFh5NXBjMEZ5WjNWdFpXNTBjeWhoY21kMWJXVnVkSE1wS1NCN1hHNGdJQ0FnWHk1cGMwRnlaM1Z0Wlc1MGN5QTlJR1oxYm1OMGFXOXVLRzlpYWlrZ2UxeHVJQ0FnSUNBZ2NtVjBkWEp1SUdoaGN5aHZZbW9zSUNkallXeHNaV1VuS1R0Y2JpQWdJQ0I5TzF4dUlDQjlYRzVjYmlBZ0x5OGdUM0IwYVcxcGVtVWdZR2x6Um5WdVkzUnBiMjVnSUdsbUlHRndjSEp2Y0hKcFlYUmxMaUJYYjNKcklHRnliM1Z1WkNCemIyMWxJSFI1Y0dWdlppQmlkV2R6SUdsdUlHOXNaQ0IyT0N4Y2JpQWdMeThnU1VVZ01URWdLQ014TmpJeEtTd2dVMkZtWVhKcElEZ2dLQ014T1RJNUtTd2dZVzVrSUZCb1lXNTBiMjFLVXlBb0l6SXlNellwTGx4dUlDQjJZWElnYm05a1pXeHBjM1FnUFNCeWIyOTBMbVJ2WTNWdFpXNTBJQ1ltSUhKdmIzUXVaRzlqZFcxbGJuUXVZMmhwYkdST2IyUmxjenRjYmlBZ2FXWWdLSFI1Y0dWdlppQXZMaThnSVQwZ0oyWjFibU4wYVc5dUp5QW1KaUIwZVhCbGIyWWdTVzUwT0VGeWNtRjVJQ0U5SUNkdlltcGxZM1FuSUNZbUlIUjVjR1Z2WmlCdWIyUmxiR2x6ZENBaFBTQW5ablZ1WTNScGIyNG5LU0I3WEc0Z0lDQWdYeTVwYzBaMWJtTjBhVzl1SUQwZ1puVnVZM1JwYjI0b2IySnFLU0I3WEc0Z0lDQWdJQ0J5WlhSMWNtNGdkSGx3Wlc5bUlHOWlhaUE5UFNBblpuVnVZM1JwYjI0bklIeDhJR1poYkhObE8xeHVJQ0FnSUgwN1hHNGdJSDFjYmx4dUlDQXZMeUJKY3lCaElHZHBkbVZ1SUc5aWFtVmpkQ0JoSUdacGJtbDBaU0J1ZFcxaVpYSS9YRzRnSUY4dWFYTkdhVzVwZEdVZ1BTQm1kVzVqZEdsdmJpaHZZbW9wSUh0Y2JpQWdJQ0J5WlhSMWNtNGdJVjh1YVhOVGVXMWliMndvYjJKcUtTQW1KaUJwYzBacGJtbDBaU2h2WW1vcElDWW1JQ0ZwYzA1aFRpaHdZWEp6WlVac2IyRjBLRzlpYWlrcE8xeHVJQ0I5TzF4dVhHNGdJQzh2SUVseklIUm9aU0JuYVhabGJpQjJZV3gxWlNCZ1RtRk9ZRDljYmlBZ1h5NXBjMDVoVGlBOUlHWjFibU4wYVc5dUtHOWlhaWtnZTF4dUlDQWdJSEpsZEhWeWJpQmZMbWx6VG5WdFltVnlLRzlpYWlrZ0ppWWdhWE5PWVU0b2IySnFLVHRjYmlBZ2ZUdGNibHh1SUNBdkx5QkpjeUJoSUdkcGRtVnVJSFpoYkhWbElHRWdZbTl2YkdWaGJqOWNiaUFnWHk1cGMwSnZiMnhsWVc0Z1BTQm1kVzVqZEdsdmJpaHZZbW9wSUh0Y2JpQWdJQ0J5WlhSMWNtNGdiMkpxSUQwOVBTQjBjblZsSUh4OElHOWlhaUE5UFQwZ1ptRnNjMlVnZkh3Z2RHOVRkSEpwYm1jdVkyRnNiQ2h2WW1vcElEMDlQU0FuVzI5aWFtVmpkQ0JDYjI5c1pXRnVYU2M3WEc0Z0lIMDdYRzVjYmlBZ0x5OGdTWE1nWVNCbmFYWmxiaUIyWVd4MVpTQmxjWFZoYkNCMGJ5QnVkV3hzUDF4dUlDQmZMbWx6VG5Wc2JDQTlJR1oxYm1OMGFXOXVLRzlpYWlrZ2UxeHVJQ0FnSUhKbGRIVnliaUJ2WW1vZ1BUMDlJRzUxYkd3N1hHNGdJSDA3WEc1Y2JpQWdMeThnU1hNZ1lTQm5hWFpsYmlCMllYSnBZV0pzWlNCMWJtUmxabWx1WldRL1hHNGdJRjh1YVhOVmJtUmxabWx1WldRZ1BTQm1kVzVqZEdsdmJpaHZZbW9wSUh0Y2JpQWdJQ0J5WlhSMWNtNGdiMkpxSUQwOVBTQjJiMmxrSURBN1hHNGdJSDA3WEc1Y2JpQWdMeThnVTJodmNuUmpkWFFnWm5WdVkzUnBiMjRnWm05eUlHTm9aV05yYVc1bklHbG1JR0Z1SUc5aWFtVmpkQ0JvWVhNZ1lTQm5hWFpsYmlCd2NtOXdaWEowZVNCa2FYSmxZM1JzZVZ4dUlDQXZMeUJ2YmlCcGRITmxiR1lnS0dsdUlHOTBhR1Z5SUhkdmNtUnpMQ0J1YjNRZ2IyNGdZU0J3Y205MGIzUjVjR1VwTGx4dUlDQmZMbWhoY3lBOUlHWjFibU4wYVc5dUtHOWlhaXdnY0dGMGFDa2dlMXh1SUNBZ0lHbG1JQ2doWHk1cGMwRnljbUY1S0hCaGRHZ3BLU0I3WEc0Z0lDQWdJQ0J5WlhSMWNtNGdhR0Z6S0c5aWFpd2djR0YwYUNrN1hHNGdJQ0FnZlZ4dUlDQWdJSFpoY2lCc1pXNW5kR2dnUFNCd1lYUm9MbXhsYm1kMGFEdGNiaUFnSUNCbWIzSWdLSFpoY2lCcElEMGdNRHNnYVNBOElHeGxibWQwYURzZ2FTc3JLU0I3WEc0Z0lDQWdJQ0IyWVhJZ2EyVjVJRDBnY0dGMGFGdHBYVHRjYmlBZ0lDQWdJR2xtSUNodlltb2dQVDBnYm5Wc2JDQjhmQ0FoYUdGelQzZHVVSEp2Y0dWeWRIa3VZMkZzYkNodlltb3NJR3RsZVNrcElIdGNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlHWmhiSE5sTzF4dUlDQWdJQ0FnZlZ4dUlDQWdJQ0FnYjJKcUlEMGdiMkpxVzJ0bGVWMDdYRzRnSUNBZ2ZWeHVJQ0FnSUhKbGRIVnliaUFoSVd4bGJtZDBhRHRjYmlBZ2ZUdGNibHh1SUNBdkx5QlZkR2xzYVhSNUlFWjFibU4wYVc5dWMxeHVJQ0F2THlBdExTMHRMUzB0TFMwdExTMHRMUzB0TFZ4dVhHNGdJQzh2SUZKMWJpQlZibVJsY25OamIzSmxMbXB6SUdsdUlDcHViME52Ym1ac2FXTjBLaUJ0YjJSbExDQnlaWFIxY201cGJtY2dkR2hsSUdCZllDQjJZWEpwWVdKc1pTQjBieUJwZEhOY2JpQWdMeThnY0hKbGRtbHZkWE1nYjNkdVpYSXVJRkpsZEhWeWJuTWdZU0J5WldabGNtVnVZMlVnZEc4Z2RHaGxJRlZ1WkdWeWMyTnZjbVVnYjJKcVpXTjBMbHh1SUNCZkxtNXZRMjl1Wm14cFkzUWdQU0JtZFc1amRHbHZiaWdwSUh0Y2JpQWdJQ0J5YjI5MExsOGdQU0J3Y21WMmFXOTFjMVZ1WkdWeWMyTnZjbVU3WEc0Z0lDQWdjbVYwZFhKdUlIUm9hWE03WEc0Z0lIMDdYRzVjYmlBZ0x5OGdTMlZsY0NCMGFHVWdhV1JsYm5ScGRIa2dablZ1WTNScGIyNGdZWEp2ZFc1a0lHWnZjaUJrWldaaGRXeDBJR2wwWlhKaGRHVmxjeTVjYmlBZ1h5NXBaR1Z1ZEdsMGVTQTlJR1oxYm1OMGFXOXVLSFpoYkhWbEtTQjdYRzRnSUNBZ2NtVjBkWEp1SUhaaGJIVmxPMXh1SUNCOU8xeHVYRzRnSUM4dklGQnlaV1JwWTJGMFpTMW5aVzVsY21GMGFXNW5JR1oxYm1OMGFXOXVjeTRnVDJaMFpXNGdkWE5sWm5Wc0lHOTFkSE5wWkdVZ2IyWWdWVzVrWlhKelkyOXlaUzVjYmlBZ1h5NWpiMjV6ZEdGdWRDQTlJR1oxYm1OMGFXOXVLSFpoYkhWbEtTQjdYRzRnSUNBZ2NtVjBkWEp1SUdaMWJtTjBhVzl1S0NrZ2UxeHVJQ0FnSUNBZ2NtVjBkWEp1SUhaaGJIVmxPMXh1SUNBZ0lIMDdYRzRnSUgwN1hHNWNiaUFnWHk1dWIyOXdJRDBnWm5WdVkzUnBiMjRvS1h0OU8xeHVYRzRnSUM4dklFTnlaV0YwWlhNZ1lTQm1kVzVqZEdsdmJpQjBhR0YwTENCM2FHVnVJSEJoYzNObFpDQmhiaUJ2WW1wbFkzUXNJSGRwYkd3Z2RISmhkbVZ5YzJVZ2RHaGhkQ0J2WW1wbFkzVGlnSmx6WEc0Z0lDOHZJSEJ5YjNCbGNuUnBaWE1nWkc5M2JpQjBhR1VnWjJsMlpXNGdZSEJoZEdoZ0xDQnpjR1ZqYVdacFpXUWdZWE1nWVc0Z1lYSnlZWGtnYjJZZ2EyVjVjeUJ2Y2lCcGJtUmxlR1Z6TGx4dUlDQmZMbkJ5YjNCbGNuUjVJRDBnWm5WdVkzUnBiMjRvY0dGMGFDa2dlMXh1SUNBZ0lHbG1JQ2doWHk1cGMwRnljbUY1S0hCaGRHZ3BLU0I3WEc0Z0lDQWdJQ0J5WlhSMWNtNGdjMmhoYkd4dmQxQnliM0JsY25SNUtIQmhkR2dwTzF4dUlDQWdJSDFjYmlBZ0lDQnlaWFIxY200Z1puVnVZM1JwYjI0b2IySnFLU0I3WEc0Z0lDQWdJQ0J5WlhSMWNtNGdaR1ZsY0VkbGRDaHZZbW9zSUhCaGRHZ3BPMXh1SUNBZ0lIMDdYRzRnSUgwN1hHNWNiaUFnTHk4Z1IyVnVaWEpoZEdWeklHRWdablZ1WTNScGIyNGdabTl5SUdFZ1oybDJaVzRnYjJKcVpXTjBJSFJvWVhRZ2NtVjBkWEp1Y3lCaElHZHBkbVZ1SUhCeWIzQmxjblI1TGx4dUlDQmZMbkJ5YjNCbGNuUjVUMllnUFNCbWRXNWpkR2x2Ymlodlltb3BJSHRjYmlBZ0lDQnBaaUFvYjJKcUlEMDlJRzUxYkd3cElIdGNiaUFnSUNBZ0lISmxkSFZ5YmlCbWRXNWpkR2x2YmlncGUzMDdYRzRnSUNBZ2ZWeHVJQ0FnSUhKbGRIVnliaUJtZFc1amRHbHZiaWh3WVhSb0tTQjdYRzRnSUNBZ0lDQnlaWFIxY200Z0lWOHVhWE5CY25KaGVTaHdZWFJvS1NBL0lHOWlhbHR3WVhSb1hTQTZJR1JsWlhCSFpYUW9iMkpxTENCd1lYUm9LVHRjYmlBZ0lDQjlPMXh1SUNCOU8xeHVYRzRnSUM4dklGSmxkSFZ5Ym5NZ1lTQndjbVZrYVdOaGRHVWdabTl5SUdOb1pXTnJhVzVuSUhkb1pYUm9aWElnWVc0Z2IySnFaV04wSUdoaGN5QmhJR2RwZG1WdUlITmxkQ0J2Wmx4dUlDQXZMeUJnYTJWNU9uWmhiSFZsWUNCd1lXbHljeTVjYmlBZ1h5NXRZWFJqYUdWeUlEMGdYeTV0WVhSamFHVnpJRDBnWm5WdVkzUnBiMjRvWVhSMGNuTXBJSHRjYmlBZ0lDQmhkSFJ5Y3lBOUlGOHVaWGgwWlc1a1QzZHVLSHQ5TENCaGRIUnljeWs3WEc0Z0lDQWdjbVYwZFhKdUlHWjFibU4wYVc5dUtHOWlhaWtnZTF4dUlDQWdJQ0FnY21WMGRYSnVJRjh1YVhOTllYUmphQ2h2WW1vc0lHRjBkSEp6S1R0Y2JpQWdJQ0I5TzF4dUlDQjlPMXh1WEc0Z0lDOHZJRkoxYmlCaElHWjFibU4wYVc5dUlDb3FiaW9xSUhScGJXVnpMbHh1SUNCZkxuUnBiV1Z6SUQwZ1puVnVZM1JwYjI0b2Jpd2dhWFJsY21GMFpXVXNJR052Ym5SbGVIUXBJSHRjYmlBZ0lDQjJZWElnWVdOamRXMGdQU0JCY25KaGVTaE5ZWFJvTG0xaGVDZ3dMQ0J1S1NrN1hHNGdJQ0FnYVhSbGNtRjBaV1VnUFNCdmNIUnBiV2w2WlVOaUtHbDBaWEpoZEdWbExDQmpiMjUwWlhoMExDQXhLVHRjYmlBZ0lDQm1iM0lnS0haaGNpQnBJRDBnTURzZ2FTQThJRzQ3SUdrckt5a2dZV05qZFcxYmFWMGdQU0JwZEdWeVlYUmxaU2hwS1R0Y2JpQWdJQ0J5WlhSMWNtNGdZV05qZFcwN1hHNGdJSDA3WEc1Y2JpQWdMeThnVW1WMGRYSnVJR0VnY21GdVpHOXRJR2x1ZEdWblpYSWdZbVYwZDJWbGJpQnRhVzRnWVc1a0lHMWhlQ0FvYVc1amJIVnphWFpsS1M1Y2JpQWdYeTV5WVc1a2IyMGdQU0JtZFc1amRHbHZiaWh0YVc0c0lHMWhlQ2tnZTF4dUlDQWdJR2xtSUNodFlYZ2dQVDBnYm5Wc2JDa2dlMXh1SUNBZ0lDQWdiV0Y0SUQwZ2JXbHVPMXh1SUNBZ0lDQWdiV2x1SUQwZ01EdGNiaUFnSUNCOVhHNGdJQ0FnY21WMGRYSnVJRzFwYmlBcklFMWhkR2d1Wm14dmIzSW9UV0YwYUM1eVlXNWtiMjBvS1NBcUlDaHRZWGdnTFNCdGFXNGdLeUF4S1NrN1hHNGdJSDA3WEc1Y2JpQWdMeThnUVNBb2NHOXpjMmxpYkhrZ1ptRnpkR1Z5S1NCM1lYa2dkRzhnWjJWMElIUm9aU0JqZFhKeVpXNTBJSFJwYldWemRHRnRjQ0JoY3lCaGJpQnBiblJsWjJWeUxseHVJQ0JmTG01dmR5QTlJRVJoZEdVdWJtOTNJSHg4SUdaMWJtTjBhVzl1S0NrZ2UxeHVJQ0FnSUhKbGRIVnliaUJ1WlhjZ1JHRjBaU2dwTG1kbGRGUnBiV1VvS1R0Y2JpQWdmVHRjYmx4dUlDQXZMeUJNYVhOMElHOW1JRWhVVFV3Z1pXNTBhWFJwWlhNZ1ptOXlJR1Z6WTJGd2FXNW5MbHh1SUNCMllYSWdaWE5qWVhCbFRXRndJRDBnZTF4dUlDQWdJQ2NtSnpvZ0p5WmhiWEE3Snl4Y2JpQWdJQ0FuUENjNklDY21iSFE3Snl4Y2JpQWdJQ0FuUGljNklDY21aM1E3Snl4Y2JpQWdJQ0FuWENJbk9pQW5KbkYxYjNRN0p5eGNiaUFnSUNCY0lpZGNJam9nSnlZamVESTNPeWNzWEc0Z0lDQWdKMkFuT2lBbkppTjROakE3SjF4dUlDQjlPMXh1SUNCMllYSWdkVzVsYzJOaGNHVk5ZWEFnUFNCZkxtbHVkbVZ5ZENobGMyTmhjR1ZOWVhBcE8xeHVYRzRnSUM4dklFWjFibU4wYVc5dWN5Qm1iM0lnWlhOallYQnBibWNnWVc1a0lIVnVaWE5qWVhCcGJtY2djM1J5YVc1bmN5QjBieTltY205dElFaFVUVXdnYVc1MFpYSndiMnhoZEdsdmJpNWNiaUFnZG1GeUlHTnlaV0YwWlVWelkyRndaWElnUFNCbWRXNWpkR2x2YmlodFlYQXBJSHRjYmlBZ0lDQjJZWElnWlhOallYQmxjaUE5SUdaMWJtTjBhVzl1S0cxaGRHTm9LU0I3WEc0Z0lDQWdJQ0J5WlhSMWNtNGdiV0Z3VzIxaGRHTm9YVHRjYmlBZ0lDQjlPMXh1SUNBZ0lDOHZJRkpsWjJWNFpYTWdabTl5SUdsa1pXNTBhV1o1YVc1bklHRWdhMlY1SUhSb1lYUWdibVZsWkhNZ2RHOGdZbVVnWlhOallYQmxaQzVjYmlBZ0lDQjJZWElnYzI5MWNtTmxJRDBnSnlnL09pY2dLeUJmTG10bGVYTW9iV0Z3S1M1cWIybHVLQ2Q4SnlrZ0t5QW5LU2M3WEc0Z0lDQWdkbUZ5SUhSbGMzUlNaV2RsZUhBZ1BTQlNaV2RGZUhBb2MyOTFjbU5sS1R0Y2JpQWdJQ0IyWVhJZ2NtVndiR0ZqWlZKbFoyVjRjQ0E5SUZKbFowVjRjQ2h6YjNWeVkyVXNJQ2RuSnlrN1hHNGdJQ0FnY21WMGRYSnVJR1oxYm1OMGFXOXVLSE4wY21sdVp5a2dlMXh1SUNBZ0lDQWdjM1J5YVc1bklEMGdjM1J5YVc1bklEMDlJRzUxYkd3Z1B5QW5KeUE2SUNjbklDc2djM1J5YVc1bk8xeHVJQ0FnSUNBZ2NtVjBkWEp1SUhSbGMzUlNaV2RsZUhBdWRHVnpkQ2h6ZEhKcGJtY3BJRDhnYzNSeWFXNW5MbkpsY0d4aFkyVW9jbVZ3YkdGalpWSmxaMlY0Y0N3Z1pYTmpZWEJsY2lrZ09pQnpkSEpwYm1jN1hHNGdJQ0FnZlR0Y2JpQWdmVHRjYmlBZ1h5NWxjMk5oY0dVZ1BTQmpjbVZoZEdWRmMyTmhjR1Z5S0dWelkyRndaVTFoY0NrN1hHNGdJRjh1ZFc1bGMyTmhjR1VnUFNCamNtVmhkR1ZGYzJOaGNHVnlLSFZ1WlhOallYQmxUV0Z3S1R0Y2JseHVJQ0F2THlCVWNtRjJaWEp6WlhNZ2RHaGxJR05vYVd4a2NtVnVJRzltSUdCdlltcGdJR0ZzYjI1bklHQndZWFJvWUM0Z1NXWWdZU0JqYUdsc1pDQnBjeUJoSUdaMWJtTjBhVzl1TENCcGRGeHVJQ0F2THlCcGN5QnBiblp2YTJWa0lIZHBkR2dnYVhSeklIQmhjbVZ1ZENCaGN5QmpiMjUwWlhoMExpQlNaWFIxY201eklIUm9aU0IyWVd4MVpTQnZaaUIwYUdVZ1ptbHVZV3hjYmlBZ0x5OGdZMmhwYkdRc0lHOXlJR0JtWVd4c1ltRmphMkFnYVdZZ1lXNTVJR05vYVd4a0lHbHpJSFZ1WkdWbWFXNWxaQzVjYmlBZ1h5NXlaWE4xYkhRZ1BTQm1kVzVqZEdsdmJpaHZZbW9zSUhCaGRHZ3NJR1poYkd4aVlXTnJLU0I3WEc0Z0lDQWdhV1lnS0NGZkxtbHpRWEp5WVhrb2NHRjBhQ2twSUhCaGRHZ2dQU0JiY0dGMGFGMDdYRzRnSUNBZ2RtRnlJR3hsYm1kMGFDQTlJSEJoZEdndWJHVnVaM1JvTzF4dUlDQWdJR2xtSUNnaGJHVnVaM1JvS1NCN1hHNGdJQ0FnSUNCeVpYUjFjbTRnWHk1cGMwWjFibU4wYVc5dUtHWmhiR3hpWVdOcktTQS9JR1poYkd4aVlXTnJMbU5oYkd3b2IySnFLU0E2SUdaaGJHeGlZV05yTzF4dUlDQWdJSDFjYmlBZ0lDQm1iM0lnS0haaGNpQnBJRDBnTURzZ2FTQThJR3hsYm1kMGFEc2dhU3NyS1NCN1hHNGdJQ0FnSUNCMllYSWdjSEp2Y0NBOUlHOWlhaUE5UFNCdWRXeHNJRDhnZG05cFpDQXdJRG9nYjJKcVczQmhkR2hiYVYxZE8xeHVJQ0FnSUNBZ2FXWWdLSEJ5YjNBZ1BUMDlJSFp2YVdRZ01Da2dlMXh1SUNBZ0lDQWdJQ0J3Y205d0lEMGdabUZzYkdKaFkyczdYRzRnSUNBZ0lDQWdJR2tnUFNCc1pXNW5kR2c3SUM4dklFVnVjM1Z5WlNCM1pTQmtiMjRuZENCamIyNTBhVzUxWlNCcGRHVnlZWFJwYm1jdVhHNGdJQ0FnSUNCOVhHNGdJQ0FnSUNCdlltb2dQU0JmTG1selJuVnVZM1JwYjI0b2NISnZjQ2tnUHlCd2NtOXdMbU5oYkd3b2IySnFLU0E2SUhCeWIzQTdYRzRnSUNBZ2ZWeHVJQ0FnSUhKbGRIVnliaUJ2WW1vN1hHNGdJSDA3WEc1Y2JpQWdMeThnUjJWdVpYSmhkR1VnWVNCMWJtbHhkV1VnYVc1MFpXZGxjaUJwWkNBb2RXNXBjWFZsSUhkcGRHaHBiaUIwYUdVZ1pXNTBhWEpsSUdOc2FXVnVkQ0J6WlhOemFXOXVLUzVjYmlBZ0x5OGdWWE5sWm5Wc0lHWnZjaUIwWlcxd2IzSmhjbmtnUkU5TklHbGtjeTVjYmlBZ2RtRnlJR2xrUTI5MWJuUmxjaUE5SURBN1hHNGdJRjh1ZFc1cGNYVmxTV1FnUFNCbWRXNWpkR2x2Ymlod2NtVm1hWGdwSUh0Y2JpQWdJQ0IyWVhJZ2FXUWdQU0FySzJsa1EyOTFiblJsY2lBcklDY25PMXh1SUNBZ0lISmxkSFZ5YmlCd2NtVm1hWGdnUHlCd2NtVm1hWGdnS3lCcFpDQTZJR2xrTzF4dUlDQjlPMXh1WEc0Z0lDOHZJRUo1SUdSbFptRjFiSFFzSUZWdVpHVnljMk52Y21VZ2RYTmxjeUJGVWtJdGMzUjViR1VnZEdWdGNHeGhkR1VnWkdWc2FXMXBkR1Z5Y3l3Z1kyaGhibWRsSUhSb1pWeHVJQ0F2THlCbWIyeHNiM2RwYm1jZ2RHVnRjR3hoZEdVZ2MyVjBkR2x1WjNNZ2RHOGdkWE5sSUdGc2RHVnlibUYwYVhabElHUmxiR2x0YVhSbGNuTXVYRzRnSUY4dWRHVnRjR3hoZEdWVFpYUjBhVzVuY3lBOUlIdGNiaUFnSUNCbGRtRnNkV0YwWlRvZ0x6d2xLRnRjWEhOY1hGTmRLejhwSlQ0dlp5eGNiaUFnSUNCcGJuUmxjbkJ2YkdGMFpUb2dMendsUFNoYlhGeHpYRnhUWFNzL0tTVStMMmNzWEc0Z0lDQWdaWE5qWVhCbE9pQXZQQ1V0S0Z0Y1hITmNYRk5kS3o4cEpUNHZaMXh1SUNCOU8xeHVYRzRnSUM4dklGZG9aVzRnWTNWemRHOXRhWHBwYm1jZ1lIUmxiWEJzWVhSbFUyVjBkR2x1WjNOZ0xDQnBaaUI1YjNVZ1pHOXVKM1FnZDJGdWRDQjBieUJrWldacGJtVWdZVzVjYmlBZ0x5OGdhVzUwWlhKd2IyeGhkR2x2Yml3Z1pYWmhiSFZoZEdsdmJpQnZjaUJsYzJOaGNHbHVaeUJ5WldkbGVDd2dkMlVnYm1WbFpDQnZibVVnZEdoaGRDQnBjMXh1SUNBdkx5Qm5kV0Z5WVc1MFpXVmtJRzV2ZENCMGJ5QnRZWFJqYUM1Y2JpQWdkbUZ5SUc1dlRXRjBZMmdnUFNBdktDNHBYaTg3WEc1Y2JpQWdMeThnUTJWeWRHRnBiaUJqYUdGeVlXTjBaWEp6SUc1bFpXUWdkRzhnWW1VZ1pYTmpZWEJsWkNCemJ5QjBhR0YwSUhSb1pYa2dZMkZ1SUdKbElIQjFkQ0JwYm5SdklHRmNiaUFnTHk4Z2MzUnlhVzVuSUd4cGRHVnlZV3d1WEc0Z0lIWmhjaUJsYzJOaGNHVnpJRDBnZTF4dUlDQWdJRndpSjF3aU9pQmNJaWRjSWl4Y2JpQWdJQ0FuWEZ4Y1hDYzZJQ2RjWEZ4Y0p5eGNiaUFnSUNBblhGeHlKem9nSjNJbkxGeHVJQ0FnSUNkY1hHNG5PaUFuYmljc1hHNGdJQ0FnSjF4Y2RUSXdNamduT2lBbmRUSXdNamduTEZ4dUlDQWdJQ2RjWEhVeU1ESTVKem9nSjNVeU1ESTVKMXh1SUNCOU8xeHVYRzRnSUhaaGNpQmxjMk5oY0dWU1pXZEZlSEFnUFNBdlhGeGNYSHduZkZ4Y2NueGNYRzU4WEZ4MU1qQXlPSHhjWEhVeU1ESTVMMmM3WEc1Y2JpQWdkbUZ5SUdWelkyRndaVU5vWVhJZ1BTQm1kVzVqZEdsdmJpaHRZWFJqYUNrZ2UxeHVJQ0FnSUhKbGRIVnliaUFuWEZ4Y1hDY2dLeUJsYzJOaGNHVnpXMjFoZEdOb1hUdGNiaUFnZlR0Y2JseHVJQ0F2THlCS1lYWmhVMk55YVhCMElHMXBZM0p2TFhSbGJYQnNZWFJwYm1jc0lITnBiV2xzWVhJZ2RHOGdTbTlvYmlCU1pYTnBaeWR6SUdsdGNHeGxiV1Z1ZEdGMGFXOXVMbHh1SUNBdkx5QlZibVJsY25OamIzSmxJSFJsYlhCc1lYUnBibWNnYUdGdVpHeGxjeUJoY21KcGRISmhjbmtnWkdWc2FXMXBkR1Z5Y3l3Z2NISmxjMlZ5ZG1WeklIZG9hWFJsYzNCaFkyVXNYRzRnSUM4dklHRnVaQ0JqYjNKeVpXTjBiSGtnWlhOallYQmxjeUJ4ZFc5MFpYTWdkMmwwYUdsdUlHbHVkR1Z5Y0c5c1lYUmxaQ0JqYjJSbExseHVJQ0F2THlCT1Fqb2dZRzlzWkZObGRIUnBibWR6WUNCdmJteDVJR1Y0YVhOMGN5Qm1iM0lnWW1GamEzZGhjbVJ6SUdOdmJYQmhkR2xpYVd4cGRIa3VYRzRnSUY4dWRHVnRjR3hoZEdVZ1BTQm1kVzVqZEdsdmJpaDBaWGgwTENCelpYUjBhVzVuY3l3Z2IyeGtVMlYwZEdsdVozTXBJSHRjYmlBZ0lDQnBaaUFvSVhObGRIUnBibWR6SUNZbUlHOXNaRk5sZEhScGJtZHpLU0J6WlhSMGFXNW5jeUE5SUc5c1pGTmxkSFJwYm1kek8xeHVJQ0FnSUhObGRIUnBibWR6SUQwZ1h5NWtaV1poZFd4MGN5aDdmU3dnYzJWMGRHbHVaM01zSUY4dWRHVnRjR3hoZEdWVFpYUjBhVzVuY3lrN1hHNWNiaUFnSUNBdkx5QkRiMjFpYVc1bElHUmxiR2x0YVhSbGNuTWdhVzUwYnlCdmJtVWdjbVZuZFd4aGNpQmxlSEJ5WlhOemFXOXVJSFpwWVNCaGJIUmxjbTVoZEdsdmJpNWNiaUFnSUNCMllYSWdiV0YwWTJobGNpQTlJRkpsWjBWNGNDaGJYRzRnSUNBZ0lDQW9jMlYwZEdsdVozTXVaWE5qWVhCbElIeDhJRzV2VFdGMFkyZ3BMbk52ZFhKalpTeGNiaUFnSUNBZ0lDaHpaWFIwYVc1bmN5NXBiblJsY25CdmJHRjBaU0I4ZkNCdWIwMWhkR05vS1M1emIzVnlZMlVzWEc0Z0lDQWdJQ0FvYzJWMGRHbHVaM011WlhaaGJIVmhkR1VnZkh3Z2JtOU5ZWFJqYUNrdWMyOTFjbU5sWEc0Z0lDQWdYUzVxYjJsdUtDZDhKeWtnS3lBbmZDUW5MQ0FuWnljcE8xeHVYRzRnSUNBZ0x5OGdRMjl0Y0dsc1pTQjBhR1VnZEdWdGNHeGhkR1VnYzI5MWNtTmxMQ0JsYzJOaGNHbHVaeUJ6ZEhKcGJtY2diR2wwWlhKaGJITWdZWEJ3Y205d2NtbGhkR1ZzZVM1Y2JpQWdJQ0IyWVhJZ2FXNWtaWGdnUFNBd08xeHVJQ0FnSUhaaGNpQnpiM1Z5WTJVZ1BTQmNJbDlmY0NzOUoxd2lPMXh1SUNBZ0lIUmxlSFF1Y21Wd2JHRmpaU2h0WVhSamFHVnlMQ0JtZFc1amRHbHZiaWh0WVhSamFDd2daWE5qWVhCbExDQnBiblJsY25CdmJHRjBaU3dnWlhaaGJIVmhkR1VzSUc5bVpuTmxkQ2tnZTF4dUlDQWdJQ0FnYzI5MWNtTmxJQ3M5SUhSbGVIUXVjMnhwWTJVb2FXNWtaWGdzSUc5bVpuTmxkQ2t1Y21Wd2JHRmpaU2hsYzJOaGNHVlNaV2RGZUhBc0lHVnpZMkZ3WlVOb1lYSXBPMXh1SUNBZ0lDQWdhVzVrWlhnZ1BTQnZabVp6WlhRZ0t5QnRZWFJqYUM1c1pXNW5kR2c3WEc1Y2JpQWdJQ0FnSUdsbUlDaGxjMk5oY0dVcElIdGNiaUFnSUNBZ0lDQWdjMjkxY21ObElDczlJRndpSnl0Y1hHNG9LRjlmZEQwb1hDSWdLeUJsYzJOaGNHVWdLeUJjSWlrcFBUMXVkV3hzUHljbk9sOHVaWE5qWVhCbEtGOWZkQ2twSzF4Y2JpZGNJanRjYmlBZ0lDQWdJSDBnWld4elpTQnBaaUFvYVc1MFpYSndiMnhoZEdVcElIdGNiaUFnSUNBZ0lDQWdjMjkxY21ObElDczlJRndpSnl0Y1hHNG9LRjlmZEQwb1hDSWdLeUJwYm5SbGNuQnZiR0YwWlNBcklGd2lLU2s5UFc1MWJHdy9KeWM2WDE5MEtTdGNYRzRuWENJN1hHNGdJQ0FnSUNCOUlHVnNjMlVnYVdZZ0tHVjJZV3gxWVhSbEtTQjdYRzRnSUNBZ0lDQWdJSE52ZFhKalpTQXJQU0JjSWljN1hGeHVYQ0lnS3lCbGRtRnNkV0YwWlNBcklGd2lYRnh1WDE5d0t6MG5YQ0k3WEc0Z0lDQWdJQ0I5WEc1Y2JpQWdJQ0FnSUM4dklFRmtiMkpsSUZaTmN5QnVaV1ZrSUhSb1pTQnRZWFJqYUNCeVpYUjFjbTVsWkNCMGJ5QndjbTlrZFdObElIUm9aU0JqYjNKeVpXTjBJRzltWm5ObGRDNWNiaUFnSUNBZ0lISmxkSFZ5YmlCdFlYUmphRHRjYmlBZ0lDQjlLVHRjYmlBZ0lDQnpiM1Z5WTJVZ0t6MGdYQ0luTzF4Y2Jsd2lPMXh1WEc0Z0lDQWdMeThnU1dZZ1lTQjJZWEpwWVdKc1pTQnBjeUJ1YjNRZ2MzQmxZMmxtYVdWa0xDQndiR0ZqWlNCa1lYUmhJSFpoYkhWbGN5QnBiaUJzYjJOaGJDQnpZMjl3WlM1Y2JpQWdJQ0JwWmlBb0lYTmxkSFJwYm1kekxuWmhjbWxoWW14bEtTQnpiM1Z5WTJVZ1BTQW5kMmwwYUNodlltcDhmSHQ5S1h0Y1hHNG5JQ3NnYzI5MWNtTmxJQ3NnSjMxY1hHNG5PMXh1WEc0Z0lDQWdjMjkxY21ObElEMGdYQ0oyWVhJZ1gxOTBMRjlmY0Qwbkp5eGZYMm85UVhKeVlYa3VjSEp2ZEc5MGVYQmxMbXB2YVc0c1hDSWdLMXh1SUNBZ0lDQWdYQ0p3Y21sdWREMW1kVzVqZEdsdmJpZ3BlMTlmY0NzOVgxOXFMbU5oYkd3b1lYSm5kVzFsYm5SekxDY25LVHQ5TzF4Y2Jsd2lJQ3RjYmlBZ0lDQWdJSE52ZFhKalpTQXJJQ2R5WlhSMWNtNGdYMTl3TzF4Y2JpYzdYRzVjYmlBZ0lDQjJZWElnY21WdVpHVnlPMXh1SUNBZ0lIUnllU0I3WEc0Z0lDQWdJQ0J5Wlc1a1pYSWdQU0J1WlhjZ1JuVnVZM1JwYjI0b2MyVjBkR2x1WjNNdWRtRnlhV0ZpYkdVZ2ZId2dKMjlpYWljc0lDZGZKeXdnYzI5MWNtTmxLVHRjYmlBZ0lDQjlJR05oZEdOb0lDaGxLU0I3WEc0Z0lDQWdJQ0JsTG5OdmRYSmpaU0E5SUhOdmRYSmpaVHRjYmlBZ0lDQWdJSFJvY205M0lHVTdYRzRnSUNBZ2ZWeHVYRzRnSUNBZ2RtRnlJSFJsYlhCc1lYUmxJRDBnWm5WdVkzUnBiMjRvWkdGMFlTa2dlMXh1SUNBZ0lDQWdjbVYwZFhKdUlISmxibVJsY2k1allXeHNLSFJvYVhNc0lHUmhkR0VzSUY4cE8xeHVJQ0FnSUgwN1hHNWNiaUFnSUNBdkx5QlFjbTkyYVdSbElIUm9aU0JqYjIxd2FXeGxaQ0J6YjNWeVkyVWdZWE1nWVNCamIyNTJaVzVwWlc1alpTQm1iM0lnY0hKbFkyOXRjR2xzWVhScGIyNHVYRzRnSUNBZ2RtRnlJR0Z5WjNWdFpXNTBJRDBnYzJWMGRHbHVaM011ZG1GeWFXRmliR1VnZkh3Z0oyOWlhaWM3WEc0Z0lDQWdkR1Z0Y0d4aGRHVXVjMjkxY21ObElEMGdKMloxYm1OMGFXOXVLQ2NnS3lCaGNtZDFiV1Z1ZENBcklDY3BlMXhjYmljZ0t5QnpiM1Z5WTJVZ0t5QW5mU2M3WEc1Y2JpQWdJQ0J5WlhSMWNtNGdkR1Z0Y0d4aGRHVTdYRzRnSUgwN1hHNWNiaUFnTHk4Z1FXUmtJR0VnWENKamFHRnBibHdpSUdaMWJtTjBhVzl1TGlCVGRHRnlkQ0JqYUdGcGJtbHVaeUJoSUhkeVlYQndaV1FnVlc1a1pYSnpZMjl5WlNCdlltcGxZM1F1WEc0Z0lGOHVZMmhoYVc0Z1BTQm1kVzVqZEdsdmJpaHZZbW9wSUh0Y2JpQWdJQ0IyWVhJZ2FXNXpkR0Z1WTJVZ1BTQmZLRzlpYWlrN1hHNGdJQ0FnYVc1emRHRnVZMlV1WDJOb1lXbHVJRDBnZEhKMVpUdGNiaUFnSUNCeVpYUjFjbTRnYVc1emRHRnVZMlU3WEc0Z0lIMDdYRzVjYmlBZ0x5OGdUMDlRWEc0Z0lDOHZJQzB0TFMwdExTMHRMUzB0TFMwdExWeHVJQ0F2THlCSlppQlZibVJsY25OamIzSmxJR2x6SUdOaGJHeGxaQ0JoY3lCaElHWjFibU4wYVc5dUxDQnBkQ0J5WlhSMWNtNXpJR0VnZDNKaGNIQmxaQ0J2WW1wbFkzUWdkR2hoZEZ4dUlDQXZMeUJqWVc0Z1ltVWdkWE5sWkNCUFR5MXpkSGxzWlM0Z1ZHaHBjeUIzY21Gd2NHVnlJR2h2YkdSeklHRnNkR1Z5WldRZ2RtVnljMmx2Ym5NZ2IyWWdZV3hzSUhSb1pWeHVJQ0F2THlCMWJtUmxjbk5qYjNKbElHWjFibU4wYVc5dWN5NGdWM0poY0hCbFpDQnZZbXBsWTNSeklHMWhlU0JpWlNCamFHRnBibVZrTGx4dVhHNGdJQzh2SUVobGJIQmxjaUJtZFc1amRHbHZiaUIwYnlCamIyNTBhVzUxWlNCamFHRnBibWx1WnlCcGJuUmxjbTFsWkdsaGRHVWdjbVZ6ZFd4MGN5NWNiaUFnZG1GeUlHTm9ZV2x1VW1WemRXeDBJRDBnWm5WdVkzUnBiMjRvYVc1emRHRnVZMlVzSUc5aWFpa2dlMXh1SUNBZ0lISmxkSFZ5YmlCcGJuTjBZVzVqWlM1ZlkyaGhhVzRnUHlCZktHOWlhaWt1WTJoaGFXNG9LU0E2SUc5aWFqdGNiaUFnZlR0Y2JseHVJQ0F2THlCQlpHUWdlVzkxY2lCdmQyNGdZM1Z6ZEc5dElHWjFibU4wYVc5dWN5QjBieUIwYUdVZ1ZXNWtaWEp6WTI5eVpTQnZZbXBsWTNRdVhHNGdJRjh1YldsNGFXNGdQU0JtZFc1amRHbHZiaWh2WW1vcElIdGNiaUFnSUNCZkxtVmhZMmdvWHk1bWRXNWpkR2x2Ym5Nb2IySnFLU3dnWm5WdVkzUnBiMjRvYm1GdFpTa2dlMXh1SUNBZ0lDQWdkbUZ5SUdaMWJtTWdQU0JmVzI1aGJXVmRJRDBnYjJKcVcyNWhiV1ZkTzF4dUlDQWdJQ0FnWHk1d2NtOTBiM1I1Y0dWYmJtRnRaVjBnUFNCbWRXNWpkR2x2YmlncElIdGNiaUFnSUNBZ0lDQWdkbUZ5SUdGeVozTWdQU0JiZEdocGN5NWZkM0poY0hCbFpGMDdYRzRnSUNBZ0lDQWdJSEIxYzJndVlYQndiSGtvWVhKbmN5d2dZWEpuZFcxbGJuUnpLVHRjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJR05vWVdsdVVtVnpkV3gwS0hSb2FYTXNJR1oxYm1NdVlYQndiSGtvWHl3Z1lYSm5jeWtwTzF4dUlDQWdJQ0FnZlR0Y2JpQWdJQ0I5S1R0Y2JpQWdJQ0J5WlhSMWNtNGdYenRjYmlBZ2ZUdGNibHh1SUNBdkx5QkJaR1FnWVd4c0lHOW1JSFJvWlNCVmJtUmxjbk5qYjNKbElHWjFibU4wYVc5dWN5QjBieUIwYUdVZ2QzSmhjSEJsY2lCdlltcGxZM1F1WEc0Z0lGOHViV2w0YVc0b1h5azdYRzVjYmlBZ0x5OGdRV1JrSUdGc2JDQnRkWFJoZEc5eUlFRnljbUY1SUdaMWJtTjBhVzl1Y3lCMGJ5QjBhR1VnZDNKaGNIQmxjaTVjYmlBZ1h5NWxZV05vS0ZzbmNHOXdKeXdnSjNCMWMyZ25MQ0FuY21WMlpYSnpaU2NzSUNkemFHbG1kQ2NzSUNkemIzSjBKeXdnSjNOd2JHbGpaU2NzSUNkMWJuTm9hV1owSjEwc0lHWjFibU4wYVc5dUtHNWhiV1VwSUh0Y2JpQWdJQ0IyWVhJZ2JXVjBhRzlrSUQwZ1FYSnlZWGxRY205MGIxdHVZVzFsWFR0Y2JpQWdJQ0JmTG5CeWIzUnZkSGx3WlZ0dVlXMWxYU0E5SUdaMWJtTjBhVzl1S0NrZ2UxeHVJQ0FnSUNBZ2RtRnlJRzlpYWlBOUlIUm9hWE11WDNkeVlYQndaV1E3WEc0Z0lDQWdJQ0J0WlhSb2IyUXVZWEJ3Ykhrb2IySnFMQ0JoY21kMWJXVnVkSE1wTzF4dUlDQWdJQ0FnYVdZZ0tDaHVZVzFsSUQwOVBTQW5jMmhwWm5RbklIeDhJRzVoYldVZ1BUMDlJQ2R6Y0d4cFkyVW5LU0FtSmlCdlltb3ViR1Z1WjNSb0lEMDlQU0F3S1NCa1pXeGxkR1VnYjJKcVd6QmRPMXh1SUNBZ0lDQWdjbVYwZFhKdUlHTm9ZV2x1VW1WemRXeDBLSFJvYVhNc0lHOWlhaWs3WEc0Z0lDQWdmVHRjYmlBZ2ZTazdYRzVjYmlBZ0x5OGdRV1JrSUdGc2JDQmhZMk5sYzNOdmNpQkJjbkpoZVNCbWRXNWpkR2x2Ym5NZ2RHOGdkR2hsSUhkeVlYQndaWEl1WEc0Z0lGOHVaV0ZqYUNoYkoyTnZibU5oZENjc0lDZHFiMmx1Snl3Z0ozTnNhV05sSjEwc0lHWjFibU4wYVc5dUtHNWhiV1VwSUh0Y2JpQWdJQ0IyWVhJZ2JXVjBhRzlrSUQwZ1FYSnlZWGxRY205MGIxdHVZVzFsWFR0Y2JpQWdJQ0JmTG5CeWIzUnZkSGx3WlZ0dVlXMWxYU0E5SUdaMWJtTjBhVzl1S0NrZ2UxeHVJQ0FnSUNBZ2NtVjBkWEp1SUdOb1lXbHVVbVZ6ZFd4MEtIUm9hWE1zSUcxbGRHaHZaQzVoY0hCc2VTaDBhR2x6TGw5M2NtRndjR1ZrTENCaGNtZDFiV1Z1ZEhNcEtUdGNiaUFnSUNCOU8xeHVJQ0I5S1R0Y2JseHVJQ0F2THlCRmVIUnlZV04wY3lCMGFHVWdjbVZ6ZFd4MElHWnliMjBnWVNCM2NtRndjR1ZrSUdGdVpDQmphR0ZwYm1Wa0lHOWlhbVZqZEM1Y2JpQWdYeTV3Y205MGIzUjVjR1V1ZG1Gc2RXVWdQU0JtZFc1amRHbHZiaWdwSUh0Y2JpQWdJQ0J5WlhSMWNtNGdkR2hwY3k1ZmQzSmhjSEJsWkR0Y2JpQWdmVHRjYmx4dUlDQXZMeUJRY205MmFXUmxJSFZ1ZDNKaGNIQnBibWNnY0hKdmVIa2dabTl5SUhOdmJXVWdiV1YwYUc5a2N5QjFjMlZrSUdsdUlHVnVaMmx1WlNCdmNHVnlZWFJwYjI1elhHNGdJQzh2SUhOMVkyZ2dZWE1nWVhKcGRHaHRaWFJwWXlCaGJtUWdTbE5QVGlCemRISnBibWRwWm1sallYUnBiMjR1WEc0Z0lGOHVjSEp2ZEc5MGVYQmxMblpoYkhWbFQyWWdQU0JmTG5CeWIzUnZkSGx3WlM1MGIwcFRUMDRnUFNCZkxuQnliM1J2ZEhsd1pTNTJZV3gxWlR0Y2JseHVJQ0JmTG5CeWIzUnZkSGx3WlM1MGIxTjBjbWx1WnlBOUlHWjFibU4wYVc5dUtDa2dlMXh1SUNBZ0lISmxkSFZ5YmlCVGRISnBibWNvZEdocGN5NWZkM0poY0hCbFpDazdYRzRnSUgwN1hHNWNiaUFnTHk4Z1FVMUVJSEpsWjJsemRISmhkR2x2YmlCb1lYQndaVzV6SUdGMElIUm9aU0JsYm1RZ1ptOXlJR052YlhCaGRHbGlhV3hwZEhrZ2QybDBhQ0JCVFVRZ2JHOWhaR1Z5YzF4dUlDQXZMeUIwYUdGMElHMWhlU0J1YjNRZ1pXNW1iM0pqWlNCdVpYaDBMWFIxY200Z2MyVnRZVzUwYVdOeklHOXVJRzF2WkhWc1pYTXVJRVYyWlc0Z2RHaHZkV2RvSUdkbGJtVnlZV3hjYmlBZ0x5OGdjSEpoWTNScFkyVWdabTl5SUVGTlJDQnlaV2RwYzNSeVlYUnBiMjRnYVhNZ2RHOGdZbVVnWVc1dmJubHRiM1Z6TENCMWJtUmxjbk5qYjNKbElISmxaMmx6ZEdWeWMxeHVJQ0F2THlCaGN5QmhJRzVoYldWa0lHMXZaSFZzWlNCaVpXTmhkWE5sTENCc2FXdGxJR3BSZFdWeWVTd2dhWFFnYVhNZ1lTQmlZWE5sSUd4cFluSmhjbmtnZEdoaGRDQnBjMXh1SUNBdkx5QndiM0IxYkdGeUlHVnViM1ZuYUNCMGJ5QmlaU0JpZFc1a2JHVmtJR2x1SUdFZ2RHaHBjbVFnY0dGeWRIa2diR2xpTENCaWRYUWdibTkwSUdKbElIQmhjblFnYjJaY2JpQWdMeThnWVc0Z1FVMUVJR3h2WVdRZ2NtVnhkV1Z6ZEM0Z1ZHaHZjMlVnWTJGelpYTWdZMjkxYkdRZ1oyVnVaWEpoZEdVZ1lXNGdaWEp5YjNJZ2QyaGxiaUJoYmx4dUlDQXZMeUJoYm05dWVXMXZkWE1nWkdWbWFXNWxLQ2tnYVhNZ1kyRnNiR1ZrSUc5MWRITnBaR1VnYjJZZ1lTQnNiMkZrWlhJZ2NtVnhkV1Z6ZEM1Y2JpQWdhV1lnS0hSNWNHVnZaaUJrWldacGJtVWdQVDBnSjJaMWJtTjBhVzl1SnlBbUppQmtaV1pwYm1VdVlXMWtLU0I3WEc0Z0lDQWdaR1ZtYVc1bEtDZDFibVJsY25OamIzSmxKeXdnVzEwc0lHWjFibU4wYVc5dUtDa2dlMXh1SUNBZ0lDQWdjbVYwZFhKdUlGODdYRzRnSUNBZ2ZTazdYRzRnSUgxY2JuMG9LU2s3WEc0aVhYMD0iXX0=
;
!function(t,e){"object"==typeof module&&"object"==typeof module.exports?module.exports=t.document?e(t,!0):function(t){if(!t.document)throw new Error("jQuery requires a window with a document");return e(t)}:e(t)}("undefined"!=typeof window?window:this,function(t,e){function n(t){var e=t.length,n=it.type(t);return"function"!==n&&!it.isWindow(t)&&(!(1!==t.nodeType||!e)||("array"===n||0===e||"number"==typeof e&&e>0&&e-1 in t))}function r(t,e,n){if(it.isFunction(e))return it.grep(t,function(t,r){return!!e.call(t,r,t)!==n});if(e.nodeType)return it.grep(t,function(t){return t===e!==n});if("string"==typeof e){if(dt.test(e))return it.filter(e,t,n);e=it.filter(e,t)}return it.grep(t,function(t){return it.inArray(t,e)>=0!==n})}function i(t,e){do t=t[e];while(t&&1!==t.nodeType);return t}function o(t){var e=wt[t]={};return it.each(t.match(bt)||[],function(t,n){e[n]=!0}),e}function a(){ht.addEventListener?(ht.removeEventListener("DOMContentLoaded",s,!1),t.removeEventListener("load",s,!1)):(ht.detachEvent("onreadystatechange",s),t.detachEvent("onload",s))}function s(){(ht.addEventListener||"load"===event.type||"complete"===ht.readyState)&&(a(),it.ready())}function l(t,e,n){if(void 0===n&&1===t.nodeType){var r="data-"+e.replace(Tt,"-$1").toLowerCase();if(n=t.getAttribute(r),"string"==typeof n){try{n="true"===n||"false"!==n&&("null"===n?null:+n+""===n?+n:St.test(n)?it.parseJSON(n):n)}catch(i){}it.data(t,e,n)}else n=void 0}return n}function u(t){var e;for(e in t)if(("data"!==e||!it.isEmptyObject(t[e]))&&"toJSON"!==e)return!1;return!0}function c(t,e,n,r){if(it.acceptData(t)){var i,o,a=it.expando,s=t.nodeType,l=s?it.cache:t,u=s?t[a]:t[a]&&a;if(u&&l[u]&&(r||l[u].data)||void 0!==n||"string"!=typeof e)return u||(u=s?t[a]=Q.pop()||it.guid++:a),l[u]||(l[u]=s?{}:{toJSON:it.noop}),("object"==typeof e||"function"==typeof e)&&(r?l[u]=it.extend(l[u],e):l[u].data=it.extend(l[u].data,e)),o=l[u],r||(o.data||(o.data={}),o=o.data),void 0!==n&&(o[it.camelCase(e)]=n),"string"==typeof e?(i=o[e],null==i&&(i=o[it.camelCase(e)])):i=o,i}}function f(t,e,n){if(it.acceptData(t)){var r,i,o=t.nodeType,a=o?it.cache:t,s=o?t[it.expando]:it.expando;if(a[s]){if(e&&(r=n?a[s]:a[s].data)){it.isArray(e)?e=e.concat(it.map(e,it.camelCase)):e in r?e=[e]:(e=it.camelCase(e),e=e in r?[e]:e.split(" ")),i=e.length;for(;i--;)delete r[e[i]];if(n?!u(r):!it.isEmptyObject(r))return}(n||(delete a[s].data,u(a[s])))&&(o?it.cleanData([t],!0):nt.deleteExpando||a!=a.window?delete a[s]:a[s]=null)}}}function d(){return!0}function p(){return!1}function h(){try{return ht.activeElement}catch(t){}}function g(t){var e=Bt.split("|"),n=t.createDocumentFragment();if(n.createElement)for(;e.length;)n.createElement(e.pop());return n}function v(t,e){var n,r,i=0,o=typeof t.getElementsByTagName!==Ct?t.getElementsByTagName(e||"*"):typeof t.querySelectorAll!==Ct?t.querySelectorAll(e||"*"):void 0;if(!o)for(o=[],n=t.childNodes||t;null!=(r=n[i]);i++)!e||it.nodeName(r,e)?o.push(r):it.merge(o,v(r,e));return void 0===e||e&&it.nodeName(t,e)?it.merge([t],o):o}function m(t){Lt.test(t.type)&&(t.defaultChecked=t.checked)}function y(t,e){return it.nodeName(t,"table")&&it.nodeName(11!==e.nodeType?e:e.firstChild,"tr")?t.getElementsByTagName("tbody")[0]||t.appendChild(t.ownerDocument.createElement("tbody")):t}function b(t){return t.type=(null!==it.find.attr(t,"type"))+"/"+t.type,t}function w(t){var e=Gt.exec(t.type);return e?t.type=e[1]:t.removeAttribute("type"),t}function x(t,e){for(var n,r=0;null!=(n=t[r]);r++)it._data(n,"globalEval",!e||it._data(e[r],"globalEval"))}function _(t,e){if(1===e.nodeType&&it.hasData(t)){var n,r,i,o=it._data(t),a=it._data(e,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)it.event.add(e,n,s[n][r])}a.data&&(a.data=it.extend({},a.data))}}function C(t,e){var n,r,i;if(1===e.nodeType){if(n=e.nodeName.toLowerCase(),!nt.noCloneEvent&&e[it.expando]){i=it._data(e);for(r in i.events)it.removeEvent(e,r,i.handle);e.removeAttribute(it.expando)}"script"===n&&e.text!==t.text?(b(e).text=t.text,w(e)):"object"===n?(e.parentNode&&(e.outerHTML=t.outerHTML),nt.html5Clone&&t.innerHTML&&!it.trim(e.innerHTML)&&(e.innerHTML=t.innerHTML)):"input"===n&&Lt.test(t.type)?(e.defaultChecked=e.checked=t.checked,e.value!==t.value&&(e.value=t.value)):"option"===n?e.defaultSelected=e.selected=t.defaultSelected:("input"===n||"textarea"===n)&&(e.defaultValue=t.defaultValue)}}function S(e,n){var r,i=it(n.createElement(e)).appendTo(n.body),o=t.getDefaultComputedStyle&&(r=t.getDefaultComputedStyle(i[0]))?r.display:it.css(i[0],"display");return i.detach(),o}function T(t){var e=ht,n=Kt[t];return n||(n=S(t,e),"none"!==n&&n||(Zt=(Zt||it("<iframe frameborder='0' width='0' height='0'/>")).appendTo(e.documentElement),e=(Zt[0].contentWindow||Zt[0].contentDocument).document,e.write(),e.close(),n=S(t,e),Zt.detach()),Kt[t]=n),n}function k(t,e){return{get:function(){var n=t();if(null!=n)return n?void delete this.get:(this.get=e).apply(this,arguments)}}}function j(t,e){if(e in t)return e;for(var n=e.charAt(0).toUpperCase()+e.slice(1),r=e,i=de.length;i--;)if(e=de[i]+n,e in t)return e;return r}function I(t,e){for(var n,r,i,o=[],a=0,s=t.length;s>a;a++)r=t[a],r.style&&(o[a]=it._data(r,"olddisplay"),n=r.style.display,e?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&It(r)&&(o[a]=it._data(r,"olddisplay",T(r.nodeName)))):(i=It(r),(n&&"none"!==n||!i)&&it._data(r,"olddisplay",i?n:it.css(r,"display"))));for(a=0;s>a;a++)r=t[a],r.style&&(e&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=e?o[a]||"":"none"));return t}function E(t,e,n){var r=le.exec(e);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):e}function L(t,e,n,r,i){for(var o=n===(r?"border":"content")?4:"width"===e?1:0,a=0;4>o;o+=2)"margin"===n&&(a+=it.css(t,n+jt[o],!0,i)),r?("content"===n&&(a-=it.css(t,"padding"+jt[o],!0,i)),"margin"!==n&&(a-=it.css(t,"border"+jt[o]+"Width",!0,i))):(a+=it.css(t,"padding"+jt[o],!0,i),"padding"!==n&&(a+=it.css(t,"border"+jt[o]+"Width",!0,i)));return a}function A(t,e,n){var r=!0,i="width"===e?t.offsetWidth:t.offsetHeight,o=te(t),a=nt.boxSizing&&"border-box"===it.css(t,"boxSizing",!1,o);if(0>=i||null==i){if(i=ee(t,e,o),(0>i||null==i)&&(i=t.style[e]),re.test(i))return i;r=a&&(nt.boxSizingReliable()||i===t.style[e]),i=parseFloat(i)||0}return i+L(t,e,n||(a?"border":"content"),r,o)+"px"}function N(t,e,n,r,i){return new N.prototype.init(t,e,n,r,i)}function D(){return setTimeout(function(){pe=void 0}),pe=it.now()}function P(t,e){var n,r={height:t},i=0;for(e=e?1:0;4>i;i+=2-e)n=jt[i],r["margin"+n]=r["padding"+n]=t;return e&&(r.opacity=r.width=t),r}function O(t,e,n){for(var r,i=(be[e]||[]).concat(be["*"]),o=0,a=i.length;a>o;o++)if(r=i[o].call(n,e,t))return r}function B(t,e,n){var r,i,o,a,s,l,u,c,f=this,d={},p=t.style,h=t.nodeType&&It(t),g=it._data(t,"fxshow");n.queue||(s=it._queueHooks(t,"fx"),null==s.unqueued&&(s.unqueued=0,l=s.empty.fire,s.empty.fire=function(){s.unqueued||l()}),s.unqueued++,f.always(function(){f.always(function(){s.unqueued--,it.queue(t,"fx").length||s.empty.fire()})})),1===t.nodeType&&("height"in e||"width"in e)&&(n.overflow=[p.overflow,p.overflowX,p.overflowY],u=it.css(t,"display"),c="none"===u?it._data(t,"olddisplay")||T(t.nodeName):u,"inline"===c&&"none"===it.css(t,"float")&&(nt.inlineBlockNeedsLayout&&"inline"!==T(t.nodeName)?p.zoom=1:p.display="inline-block")),n.overflow&&(p.overflow="hidden",nt.shrinkWrapBlocks()||f.always(function(){p.overflow=n.overflow[0],p.overflowX=n.overflow[1],p.overflowY=n.overflow[2]}));for(r in e)if(i=e[r],ge.exec(i)){if(delete e[r],o=o||"toggle"===i,i===(h?"hide":"show")){if("show"!==i||!g||void 0===g[r])continue;h=!0}d[r]=g&&g[r]||it.style(t,r)}else u=void 0;if(it.isEmptyObject(d))"inline"===("none"===u?T(t.nodeName):u)&&(p.display=u);else{g?"hidden"in g&&(h=g.hidden):g=it._data(t,"fxshow",{}),o&&(g.hidden=!h),h?it(t).show():f.done(function(){it(t).hide()}),f.done(function(){var e;it._removeData(t,"fxshow");for(e in d)it.style(t,e,d[e])});for(r in d)a=O(h?g[r]:0,r,f),r in g||(g[r]=a.start,h&&(a.end=a.start,a.start="width"===r||"height"===r?1:0))}}function H(t,e){var n,r,i,o,a;for(n in t)if(r=it.camelCase(n),i=e[r],o=t[n],it.isArray(o)&&(i=o[1],o=t[n]=o[0]),n!==r&&(t[r]=o,delete t[n]),a=it.cssHooks[r],a&&"expand"in a){o=a.expand(o),delete t[r];for(n in o)n in t||(t[n]=o[n],e[n]=i)}else e[r]=i}function M(t,e,n){var r,i,o=0,a=ye.length,s=it.Deferred().always(function(){delete l.elem}),l=function(){if(i)return!1;for(var e=pe||D(),n=Math.max(0,u.startTime+u.duration-e),r=n/u.duration||0,o=1-r,a=0,l=u.tweens.length;l>a;a++)u.tweens[a].run(o);return s.notifyWith(t,[u,o,n]),1>o&&l?n:(s.resolveWith(t,[u]),!1)},u=s.promise({elem:t,props:it.extend({},e),opts:it.extend(!0,{specialEasing:{}},n),originalProperties:e,originalOptions:n,startTime:pe||D(),duration:n.duration,tweens:[],createTween:function(e,n){var r=it.Tween(t,u.opts,e,n,u.opts.specialEasing[e]||u.opts.easing);return u.tweens.push(r),r},stop:function(e){var n=0,r=e?u.tweens.length:0;if(i)return this;for(i=!0;r>n;n++)u.tweens[n].run(1);return e?s.resolveWith(t,[u,e]):s.rejectWith(t,[u,e]),this}}),c=u.props;for(H(c,u.opts.specialEasing);a>o;o++)if(r=ye[o].call(u,t,c,u.opts))return r;return it.map(c,O,u),it.isFunction(u.opts.start)&&u.opts.start.call(t,u),it.fx.timer(it.extend(l,{elem:t,anim:u,queue:u.opts.queue})),u.progress(u.opts.progress).done(u.opts.done,u.opts.complete).fail(u.opts.fail).always(u.opts.always)}function $(t){return function(e,n){"string"!=typeof e&&(n=e,e="*");var r,i=0,o=e.toLowerCase().match(bt)||[];if(it.isFunction(n))for(;r=o[i++];)"+"===r.charAt(0)?(r=r.slice(1)||"*",(t[r]=t[r]||[]).unshift(n)):(t[r]=t[r]||[]).push(n)}}function F(t,e,n,r){function i(s){var l;return o[s]=!0,it.each(t[s]||[],function(t,s){var u=s(e,n,r);return"string"!=typeof u||a||o[u]?a?!(l=u):void 0:(e.dataTypes.unshift(u),i(u),!1)}),l}var o={},a=t===ze;return i(e.dataTypes[0])||!o["*"]&&i("*")}function R(t,e){var n,r,i=it.ajaxSettings.flatOptions||{};for(r in e)void 0!==e[r]&&((i[r]?t:n||(n={}))[r]=e[r]);return n&&it.extend(!0,t,n),t}function W(t,e,n){for(var r,i,o,a,s=t.contents,l=t.dataTypes;"*"===l[0];)l.shift(),void 0===i&&(i=t.mimeType||e.getResponseHeader("Content-Type"));if(i)for(a in s)if(s[a]&&s[a].test(i)){l.unshift(a);break}if(l[0]in n)o=l[0];else{for(a in n){if(!l[0]||t.converters[a+" "+l[0]]){o=a;break}r||(r=a)}o=o||r}return o?(o!==l[0]&&l.unshift(o),n[o]):void 0}function z(t,e,n,r){var i,o,a,s,l,u={},c=t.dataTypes.slice();if(c[1])for(a in t.converters)u[a.toLowerCase()]=t.converters[a];for(o=c.shift();o;)if(t.responseFields[o]&&(n[t.responseFields[o]]=e),!l&&r&&t.dataFilter&&(e=t.dataFilter(e,t.dataType)),l=o,o=c.shift())if("*"===o)o=l;else if("*"!==l&&l!==o){if(a=u[l+" "+o]||u["* "+o],!a)for(i in u)if(s=i.split(" "),s[1]===o&&(a=u[l+" "+s[0]]||u["* "+s[0]])){a===!0?a=u[i]:u[i]!==!0&&(o=s[0],c.unshift(s[1]));break}if(a!==!0)if(a&&t["throws"])e=a(e);else try{e=a(e)}catch(f){return{state:"parsererror",error:a?f:"No conversion from "+l+" to "+o}}}return{state:"success",data:e}}function q(t,e,n,r){var i;if(it.isArray(e))it.each(e,function(e,i){n||Ge.test(t)?r(t,i):q(t+"["+("object"==typeof i?e:"")+"]",i,n,r)});else if(n||"object"!==it.type(e))r(t,e);else for(i in e)q(t+"["+i+"]",e[i],n,r)}function U(){try{return new t.XMLHttpRequest}catch(e){}}function X(){try{return new t.ActiveXObject("Microsoft.XMLHTTP")}catch(e){}}function G(t){return it.isWindow(t)?t:9===t.nodeType&&(t.defaultView||t.parentWindow)}var Q=[],V=Q.slice,Y=Q.concat,J=Q.push,Z=Q.indexOf,K={},tt=K.toString,et=K.hasOwnProperty,nt={},rt="1.11.2",it=function(t,e){return new it.fn.init(t,e)},ot=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,at=/^-ms-/,st=/-([\da-z])/gi,lt=function(t,e){return e.toUpperCase()};it.fn=it.prototype={jquery:rt,constructor:it,selector:"",length:0,toArray:function(){return V.call(this)},get:function(t){return null!=t?0>t?this[t+this.length]:this[t]:V.call(this)},pushStack:function(t){var e=it.merge(this.constructor(),t);return e.prevObject=this,e.context=this.context,e},each:function(t,e){return it.each(this,t,e)},map:function(t){return this.pushStack(it.map(this,function(e,n){return t.call(e,n,e)}))},slice:function(){return this.pushStack(V.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(t){var e=this.length,n=+t+(0>t?e:0);return this.pushStack(n>=0&&e>n?[this[n]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:J,sort:Q.sort,splice:Q.splice},it.extend=it.fn.extend=function(){var t,e,n,r,i,o,a=arguments[0]||{},s=1,l=arguments.length,u=!1;for("boolean"==typeof a&&(u=a,a=arguments[s]||{},s++),"object"==typeof a||it.isFunction(a)||(a={}),s===l&&(a=this,s--);l>s;s++)if(null!=(i=arguments[s]))for(r in i)t=a[r],n=i[r],a!==n&&(u&&n&&(it.isPlainObject(n)||(e=it.isArray(n)))?(e?(e=!1,o=t&&it.isArray(t)?t:[]):o=t&&it.isPlainObject(t)?t:{},a[r]=it.extend(u,o,n)):void 0!==n&&(a[r]=n));return a},it.extend({expando:"jQuery"+(rt+Math.random()).replace(/\D/g,""),isReady:!0,error:function(t){throw new Error(t)},noop:function(){},isFunction:function(t){return"function"===it.type(t)},isArray:Array.isArray||function(t){return"array"===it.type(t)},isWindow:function(t){return null!=t&&t==t.window},isNumeric:function(t){return!it.isArray(t)&&t-parseFloat(t)+1>=0},isEmptyObject:function(t){var e;for(e in t)return!1;return!0},isPlainObject:function(t){var e;if(!t||"object"!==it.type(t)||t.nodeType||it.isWindow(t))return!1;try{if(t.constructor&&!et.call(t,"constructor")&&!et.call(t.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}if(nt.ownLast)for(e in t)return et.call(t,e);for(e in t);return void 0===e||et.call(t,e)},type:function(t){return null==t?t+"":"object"==typeof t||"function"==typeof t?K[tt.call(t)]||"object":typeof t},globalEval:function(e){e&&it.trim(e)&&(t.execScript||function(e){t.eval.call(t,e)})(e)},camelCase:function(t){return t.replace(at,"ms-").replace(st,lt)},nodeName:function(t,e){return t.nodeName&&t.nodeName.toLowerCase()===e.toLowerCase()},each:function(t,e,r){var i,o=0,a=t.length,s=n(t);if(r){if(s)for(;a>o&&(i=e.apply(t[o],r),i!==!1);o++);else for(o in t)if(i=e.apply(t[o],r),i===!1)break}else if(s)for(;a>o&&(i=e.call(t[o],o,t[o]),i!==!1);o++);else for(o in t)if(i=e.call(t[o],o,t[o]),i===!1)break;return t},trim:function(t){return null==t?"":(t+"").replace(ot,"")},makeArray:function(t,e){var r=e||[];return null!=t&&(n(Object(t))?it.merge(r,"string"==typeof t?[t]:t):J.call(r,t)),r},inArray:function(t,e,n){var r;if(e){if(Z)return Z.call(e,t,n);for(r=e.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in e&&e[n]===t)return n}return-1},merge:function(t,e){for(var n=+e.length,r=0,i=t.length;n>r;)t[i++]=e[r++];if(n!==n)for(;void 0!==e[r];)t[i++]=e[r++];return t.length=i,t},grep:function(t,e,n){for(var r,i=[],o=0,a=t.length,s=!n;a>o;o++)r=!e(t[o],o),r!==s&&i.push(t[o]);return i},map:function(t,e,r){var i,o=0,a=t.length,s=n(t),l=[];if(s)for(;a>o;o++)i=e(t[o],o,r),null!=i&&l.push(i);else for(o in t)i=e(t[o],o,r),null!=i&&l.push(i);return Y.apply([],l)},guid:1,proxy:function(t,e){var n,r,i;return"string"==typeof e&&(i=t[e],e=t,t=i),it.isFunction(t)?(n=V.call(arguments,2),r=function(){return t.apply(e||this,n.concat(V.call(arguments)))},r.guid=t.guid=t.guid||it.guid++,r):void 0},now:function(){return+new Date},support:nt}),it.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(t,e){K["[object "+e+"]"]=e.toLowerCase()});var ut=function(t){function e(t,e,n,r){var i,o,a,s,l,u,f,p,h,g;if((e?e.ownerDocument||e:F)!==N&&A(e),e=e||N,n=n||[],s=e.nodeType,"string"!=typeof t||!t||1!==s&&9!==s&&11!==s)return n;if(!r&&P){if(11!==s&&(i=yt.exec(t)))if(a=i[1]){if(9===s){if(o=e.getElementById(a),!o||!o.parentNode)return n;if(o.id===a)return n.push(o),n}else if(e.ownerDocument&&(o=e.ownerDocument.getElementById(a))&&M(e,o)&&o.id===a)return n.push(o),n}else{if(i[2])return Z.apply(n,e.getElementsByTagName(t)),n;if((a=i[3])&&x.getElementsByClassName)return Z.apply(n,e.getElementsByClassName(a)),n}if(x.qsa&&(!O||!O.test(t))){if(p=f=$,h=e,g=1!==s&&t,1===s&&"object"!==e.nodeName.toLowerCase()){for(u=T(t),(f=e.getAttribute("id"))?p=f.replace(wt,"\\$&"):e.setAttribute("id",p),p="[id='"+p+"'] ",l=u.length;l--;)u[l]=p+d(u[l]);h=bt.test(t)&&c(e.parentNode)||e,g=u.join(",")}if(g)try{return Z.apply(n,h.querySelectorAll(g)),n}catch(v){}finally{f||e.removeAttribute("id")}}}return j(t.replace(lt,"$1"),e,n,r)}function n(){function t(n,r){return e.push(n+" ")>_.cacheLength&&delete t[e.shift()],t[n+" "]=r}var e=[];return t}function r(t){return t[$]=!0,t}function i(t){var e=N.createElement("div");try{return!!t(e)}catch(n){return!1}finally{e.parentNode&&e.parentNode.removeChild(e),e=null}}function o(t,e){for(var n=t.split("|"),r=t.length;r--;)_.attrHandle[n[r]]=e}function a(t,e){var n=e&&t,r=n&&1===t.nodeType&&1===e.nodeType&&(~e.sourceIndex||G)-(~t.sourceIndex||G);if(r)return r;if(n)for(;n=n.nextSibling;)if(n===e)return-1;return t?1:-1}function s(t){return function(e){var n=e.nodeName.toLowerCase();return"input"===n&&e.type===t}}function l(t){return function(e){var n=e.nodeName.toLowerCase();return("input"===n||"button"===n)&&e.type===t}}function u(t){return r(function(e){return e=+e,r(function(n,r){for(var i,o=t([],n.length,e),a=o.length;a--;)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}function c(t){return t&&"undefined"!=typeof t.getElementsByTagName&&t}function f(){}function d(t){for(var e=0,n=t.length,r="";n>e;e++)r+=t[e].value;return r}function p(t,e,n){var r=e.dir,i=n&&"parentNode"===r,o=W++;return e.first?function(e,n,o){for(;e=e[r];)if(1===e.nodeType||i)return t(e,n,o)}:function(e,n,a){var s,l,u=[R,o];if(a){for(;e=e[r];)if((1===e.nodeType||i)&&t(e,n,a))return!0}else for(;e=e[r];)if(1===e.nodeType||i){if(l=e[$]||(e[$]={}),(s=l[r])&&s[0]===R&&s[1]===o)return u[2]=s[2];if(l[r]=u,u[2]=t(e,n,a))return!0}}}function h(t){return t.length>1?function(e,n,r){for(var i=t.length;i--;)if(!t[i](e,n,r))return!1;return!0}:t[0]}function g(t,n,r){for(var i=0,o=n.length;o>i;i++)e(t,n[i],r);return r}function v(t,e,n,r,i){for(var o,a=[],s=0,l=t.length,u=null!=e;l>s;s++)(o=t[s])&&(!n||n(o,r,i))&&(a.push(o),u&&e.push(s));return a}function m(t,e,n,i,o,a){return i&&!i[$]&&(i=m(i)),o&&!o[$]&&(o=m(o,a)),r(function(r,a,s,l){var u,c,f,d=[],p=[],h=a.length,m=r||g(e||"*",s.nodeType?[s]:s,[]),y=!t||!r&&e?m:v(m,d,t,s,l),b=n?o||(r?t:h||i)?[]:a:y;if(n&&n(y,b,s,l),i)for(u=v(b,p),i(u,[],s,l),c=u.length;c--;)(f=u[c])&&(b[p[c]]=!(y[p[c]]=f));if(r){if(o||t){if(o){for(u=[],c=b.length;c--;)(f=b[c])&&u.push(y[c]=f);o(null,b=[],u,l)}for(c=b.length;c--;)(f=b[c])&&(u=o?tt(r,f):d[c])>-1&&(r[u]=!(a[u]=f))}}else b=v(b===a?b.splice(h,b.length):b),o?o(null,a,b,l):Z.apply(a,b)})}function y(t){for(var e,n,r,i=t.length,o=_.relative[t[0].type],a=o||_.relative[" "],s=o?1:0,l=p(function(t){return t===e},a,!0),u=p(function(t){return tt(e,t)>-1},a,!0),c=[function(t,n,r){var i=!o&&(r||n!==I)||((e=n).nodeType?l(t,n,r):u(t,n,r));return e=null,i}];i>s;s++)if(n=_.relative[t[s].type])c=[p(h(c),n)];else{if(n=_.filter[t[s].type].apply(null,t[s].matches),n[$]){for(r=++s;i>r&&!_.relative[t[r].type];r++);return m(s>1&&h(c),s>1&&d(t.slice(0,s-1).concat({value:" "===t[s-2].type?"*":""})).replace(lt,"$1"),n,r>s&&y(t.slice(s,r)),i>r&&y(t=t.slice(r)),i>r&&d(t))}c.push(n)}return h(c)}function b(t,n){var i=n.length>0,o=t.length>0,a=function(r,a,s,l,u){var c,f,d,p=0,h="0",g=r&&[],m=[],y=I,b=r||o&&_.find.TAG("*",u),w=R+=null==y?1:Math.random()||.1,x=b.length;for(u&&(I=a!==N&&a);h!==x&&null!=(c=b[h]);h++){if(o&&c){for(f=0;d=t[f++];)if(d(c,a,s)){l.push(c);break}u&&(R=w)}i&&((c=!d&&c)&&p--,r&&g.push(c))}if(p+=h,i&&h!==p){for(f=0;d=n[f++];)d(g,m,a,s);if(r){if(p>0)for(;h--;)g[h]||m[h]||(m[h]=Y.call(l));m=v(m)}Z.apply(l,m),u&&!r&&m.length>0&&p+n.length>1&&e.uniqueSort(l)}return u&&(R=w,I=y),g};return i?r(a):a}var w,x,_,C,S,T,k,j,I,E,L,A,N,D,P,O,B,H,M,$="sizzle"+1*new Date,F=t.document,R=0,W=0,z=n(),q=n(),U=n(),X=function(t,e){return t===e&&(L=!0),0},G=1<<31,Q={}.hasOwnProperty,V=[],Y=V.pop,J=V.push,Z=V.push,K=V.slice,tt=function(t,e){for(var n=0,r=t.length;r>n;n++)if(t[n]===e)return n;return-1},et="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",nt="[\\x20\\t\\r\\n\\f]",rt="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",it=rt.replace("w","w#"),ot="\\["+nt+"*("+rt+")(?:"+nt+"*([*^$|!~]?=)"+nt+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+it+"))|)"+nt+"*\\]",at=":("+rt+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+ot+")*)|.*)\\)|)",st=new RegExp(nt+"+","g"),lt=new RegExp("^"+nt+"+|((?:^|[^\\\\])(?:\\\\.)*)"+nt+"+$","g"),ut=new RegExp("^"+nt+"*,"+nt+"*"),ct=new RegExp("^"+nt+"*([>+~]|"+nt+")"+nt+"*"),ft=new RegExp("="+nt+"*([^\\]'\"]*?)"+nt+"*\\]","g"),dt=new RegExp(at),pt=new RegExp("^"+it+"$"),ht={ID:new RegExp("^#("+rt+")"),CLASS:new RegExp("^\\.("+rt+")"),TAG:new RegExp("^("+rt.replace("w","w*")+")"),ATTR:new RegExp("^"+ot),PSEUDO:new RegExp("^"+at),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+nt+"*(even|odd|(([+-]|)(\\d*)n|)"+nt+"*(?:([+-]|)"+nt+"*(\\d+)|))"+nt+"*\\)|)","i"),bool:new RegExp("^(?:"+et+")$","i"),needsContext:new RegExp("^"+nt+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+nt+"*((?:-\\d)?\\d*)"+nt+"*\\)|)(?=[^-]|$)","i")},gt=/^(?:input|select|textarea|button)$/i,vt=/^h\d$/i,mt=/^[^{]+\{\s*\[native \w/,yt=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,bt=/[+~]/,wt=/'|\\/g,xt=new RegExp("\\\\([\\da-f]{1,6}"+nt+"?|("+nt+")|.)","ig"),_t=function(t,e,n){var r="0x"+e-65536;return r!==r||n?e:0>r?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},Ct=function(){A()};try{Z.apply(V=K.call(F.childNodes),F.childNodes),V[F.childNodes.length].nodeType}catch(St){Z={apply:V.length?function(t,e){J.apply(t,K.call(e))}:function(t,e){for(var n=t.length,r=0;t[n++]=e[r++];);t.length=n-1}}}x=e.support={},S=e.isXML=function(t){var e=t&&(t.ownerDocument||t).documentElement;return!!e&&"HTML"!==e.nodeName},A=e.setDocument=function(t){var e,n,r=t?t.ownerDocument||t:F;return r!==N&&9===r.nodeType&&r.documentElement?(N=r,D=r.documentElement,n=r.defaultView,n&&n!==n.top&&(n.addEventListener?n.addEventListener("unload",Ct,!1):n.attachEvent&&n.attachEvent("onunload",Ct)),P=!S(r),x.attributes=i(function(t){return t.className="i",!t.getAttribute("className")}),x.getElementsByTagName=i(function(t){return t.appendChild(r.createComment("")),!t.getElementsByTagName("*").length}),x.getElementsByClassName=mt.test(r.getElementsByClassName),x.getById=i(function(t){return D.appendChild(t).id=$,!r.getElementsByName||!r.getElementsByName($).length}),x.getById?(_.find.ID=function(t,e){if("undefined"!=typeof e.getElementById&&P){var n=e.getElementById(t);return n&&n.parentNode?[n]:[]}},_.filter.ID=function(t){var e=t.replace(xt,_t);return function(t){return t.getAttribute("id")===e}}):(delete _.find.ID,_.filter.ID=function(t){var e=t.replace(xt,_t);return function(t){var n="undefined"!=typeof t.getAttributeNode&&t.getAttributeNode("id");return n&&n.value===e}}),_.find.TAG=x.getElementsByTagName?function(t,e){return"undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t):x.qsa?e.querySelectorAll(t):void 0}:function(t,e){var n,r=[],i=0,o=e.getElementsByTagName(t);if("*"===t){for(;n=o[i++];)1===n.nodeType&&r.push(n);return r}return o},_.find.CLASS=x.getElementsByClassName&&function(t,e){return P?e.getElementsByClassName(t):void 0},B=[],O=[],(x.qsa=mt.test(r.querySelectorAll))&&(i(function(t){D.appendChild(t).innerHTML="<a id='"+$+"'></a><select id='"+$+"-\f]' msallowcapture=''><option selected=''></option></select>",t.querySelectorAll("[msallowcapture^='']").length&&O.push("[*^$]="+nt+"*(?:''|\"\")"),t.querySelectorAll("[selected]").length||O.push("\\["+nt+"*(?:value|"+et+")"),t.querySelectorAll("[id~="+$+"-]").length||O.push("~="),t.querySelectorAll(":checked").length||O.push(":checked"),t.querySelectorAll("a#"+$+"+*").length||O.push(".#.+[+~]")}),i(function(t){var e=r.createElement("input");e.setAttribute("type","hidden"),t.appendChild(e).setAttribute("name","D"),t.querySelectorAll("[name=d]").length&&O.push("name"+nt+"*[*^$|!~]?="),t.querySelectorAll(":enabled").length||O.push(":enabled",":disabled"),t.querySelectorAll("*,:x"),O.push(",.*:")})),(x.matchesSelector=mt.test(H=D.matches||D.webkitMatchesSelector||D.mozMatchesSelector||D.oMatchesSelector||D.msMatchesSelector))&&i(function(t){x.disconnectedMatch=H.call(t,"div"),H.call(t,"[s!='']:x"),B.push("!=",at)}),O=O.length&&new RegExp(O.join("|")),B=B.length&&new RegExp(B.join("|")),e=mt.test(D.compareDocumentPosition),M=e||mt.test(D.contains)?function(t,e){var n=9===t.nodeType?t.documentElement:t,r=e&&e.parentNode;return t===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):t.compareDocumentPosition&&16&t.compareDocumentPosition(r)))}:function(t,e){if(e)for(;e=e.parentNode;)if(e===t)return!0;return!1},X=e?function(t,e){if(t===e)return L=!0,0;var n=!t.compareDocumentPosition-!e.compareDocumentPosition;return n?n:(n=(t.ownerDocument||t)===(e.ownerDocument||e)?t.compareDocumentPosition(e):1,1&n||!x.sortDetached&&e.compareDocumentPosition(t)===n?t===r||t.ownerDocument===F&&M(F,t)?-1:e===r||e.ownerDocument===F&&M(F,e)?1:E?tt(E,t)-tt(E,e):0:4&n?-1:1)}:function(t,e){if(t===e)return L=!0,0;var n,i=0,o=t.parentNode,s=e.parentNode,l=[t],u=[e];if(!o||!s)return t===r?-1:e===r?1:o?-1:s?1:E?tt(E,t)-tt(E,e):0;if(o===s)return a(t,e);for(n=t;n=n.parentNode;)l.unshift(n);for(n=e;n=n.parentNode;)u.unshift(n);for(;l[i]===u[i];)i++;return i?a(l[i],u[i]):l[i]===F?-1:u[i]===F?1:0},r):N},e.matches=function(t,n){return e(t,null,null,n)},e.matchesSelector=function(t,n){if((t.ownerDocument||t)!==N&&A(t),n=n.replace(ft,"='$1']"),!(!x.matchesSelector||!P||B&&B.test(n)||O&&O.test(n)))try{var r=H.call(t,n);if(r||x.disconnectedMatch||t.document&&11!==t.document.nodeType)return r}catch(i){}return e(n,N,null,[t]).length>0},e.contains=function(t,e){return(t.ownerDocument||t)!==N&&A(t),M(t,e)},e.attr=function(t,e){(t.ownerDocument||t)!==N&&A(t);var n=_.attrHandle[e.toLowerCase()],r=n&&Q.call(_.attrHandle,e.toLowerCase())?n(t,e,!P):void 0;return void 0!==r?r:x.attributes||!P?t.getAttribute(e):(r=t.getAttributeNode(e))&&r.specified?r.value:null},e.error=function(t){throw new Error("Syntax error, unrecognized expression: "+t)},e.uniqueSort=function(t){var e,n=[],r=0,i=0;if(L=!x.detectDuplicates,E=!x.sortStable&&t.slice(0),t.sort(X),L){for(;e=t[i++];)e===t[i]&&(r=n.push(i));for(;r--;)t.splice(n[r],1)}return E=null,t},C=e.getText=function(t){var e,n="",r=0,i=t.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof t.textContent)return t.textContent;for(t=t.firstChild;t;t=t.nextSibling)n+=C(t)}else if(3===i||4===i)return t.nodeValue}else for(;e=t[r++];)n+=C(e);return n},_=e.selectors={cacheLength:50,createPseudo:r,match:ht,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(t){return t[1]=t[1].replace(xt,_t),t[3]=(t[3]||t[4]||t[5]||"").replace(xt,_t),"~="===t[2]&&(t[3]=" "+t[3]+" "),t.slice(0,4)},CHILD:function(t){return t[1]=t[1].toLowerCase(),"nth"===t[1].slice(0,3)?(t[3]||e.error(t[0]),t[4]=+(t[4]?t[5]+(t[6]||1):2*("even"===t[3]||"odd"===t[3])),t[5]=+(t[7]+t[8]||"odd"===t[3])):t[3]&&e.error(t[0]),t},PSEUDO:function(t){var e,n=!t[6]&&t[2];return ht.CHILD.test(t[0])?null:(t[3]?t[2]=t[4]||t[5]||"":n&&dt.test(n)&&(e=T(n,!0))&&(e=n.indexOf(")",n.length-e)-n.length)&&(t[0]=t[0].slice(0,e),t[2]=n.slice(0,e)),t.slice(0,3))}},filter:{TAG:function(t){var e=t.replace(xt,_t).toLowerCase();return"*"===t?function(){return!0}:function(t){return t.nodeName&&t.nodeName.toLowerCase()===e}},CLASS:function(t){var e=z[t+" "];return e||(e=new RegExp("(^|"+nt+")"+t+"("+nt+"|$)"))&&z(t,function(t){return e.test("string"==typeof t.className&&t.className||"undefined"!=typeof t.getAttribute&&t.getAttribute("class")||"")})},ATTR:function(t,n,r){return function(i){var o=e.attr(i,t);return null==o?"!="===n:!n||(o+="","="===n?o===r:"!="===n?o!==r:"^="===n?r&&0===o.indexOf(r):"*="===n?r&&o.indexOf(r)>-1:"$="===n?r&&o.slice(-r.length)===r:"~="===n?(" "+o.replace(st," ")+" ").indexOf(r)>-1:"|="===n&&(o===r||o.slice(0,r.length+1)===r+"-"))}},CHILD:function(t,e,n,r,i){var o="nth"!==t.slice(0,3),a="last"!==t.slice(-4),s="of-type"===e;return 1===r&&0===i?function(t){return!!t.parentNode}:function(e,n,l){var u,c,f,d,p,h,g=o!==a?"nextSibling":"previousSibling",v=e.parentNode,m=s&&e.nodeName.toLowerCase(),y=!l&&!s;if(v){if(o){for(;g;){for(f=e;f=f[g];)if(s?f.nodeName.toLowerCase()===m:1===f.nodeType)return!1;h=g="only"===t&&!h&&"nextSibling"}return!0}if(h=[a?v.firstChild:v.lastChild],a&&y){for(c=v[$]||(v[$]={}),u=c[t]||[],p=u[0]===R&&u[1],d=u[0]===R&&u[2],f=p&&v.childNodes[p];f=++p&&f&&f[g]||(d=p=0)||h.pop();)if(1===f.nodeType&&++d&&f===e){c[t]=[R,p,d];break}}else if(y&&(u=(e[$]||(e[$]={}))[t])&&u[0]===R)d=u[1];else for(;(f=++p&&f&&f[g]||(d=p=0)||h.pop())&&((s?f.nodeName.toLowerCase()!==m:1!==f.nodeType)||!++d||(y&&((f[$]||(f[$]={}))[t]=[R,d]),f!==e)););return d-=i,d===r||d%r===0&&d/r>=0}}},PSEUDO:function(t,n){var i,o=_.pseudos[t]||_.setFilters[t.toLowerCase()]||e.error("unsupported pseudo: "+t);return o[$]?o(n):o.length>1?(i=[t,t,"",n],_.setFilters.hasOwnProperty(t.toLowerCase())?r(function(t,e){for(var r,i=o(t,n),a=i.length;a--;)r=tt(t,i[a]),t[r]=!(e[r]=i[a])}):function(t){return o(t,0,i)}):o}},pseudos:{not:r(function(t){var e=[],n=[],i=k(t.replace(lt,"$1"));return i[$]?r(function(t,e,n,r){for(var o,a=i(t,null,r,[]),s=t.length;s--;)(o=a[s])&&(t[s]=!(e[s]=o))}):function(t,r,o){return e[0]=t,i(e,null,o,n),e[0]=null,!n.pop()}}),has:r(function(t){return function(n){return e(t,n).length>0}}),contains:r(function(t){return t=t.replace(xt,_t),function(e){return(e.textContent||e.innerText||C(e)).indexOf(t)>-1}}),lang:r(function(t){return pt.test(t||"")||e.error("unsupported lang: "+t),t=t.replace(xt,_t).toLowerCase(),function(e){var n;do if(n=P?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return n=n.toLowerCase(),n===t||0===n.indexOf(t+"-");while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var n=t.location&&t.location.hash;return n&&n.slice(1)===e.id},root:function(t){return t===D},focus:function(t){return t===N.activeElement&&(!N.hasFocus||N.hasFocus())&&!!(t.type||t.href||~t.tabIndex)},enabled:function(t){return t.disabled===!1},disabled:function(t){return t.disabled===!0},checked:function(t){var e=t.nodeName.toLowerCase();return"input"===e&&!!t.checked||"option"===e&&!!t.selected},selected:function(t){return t.parentNode&&t.parentNode.selectedIndex,t.selected===!0},empty:function(t){for(t=t.firstChild;t;t=t.nextSibling)if(t.nodeType<6)return!1;return!0},parent:function(t){return!_.pseudos.empty(t)},header:function(t){return vt.test(t.nodeName)},input:function(t){return gt.test(t.nodeName)},button:function(t){var e=t.nodeName.toLowerCase();return"input"===e&&"button"===t.type||"button"===e},text:function(t){var e;return"input"===t.nodeName.toLowerCase()&&"text"===t.type&&(null==(e=t.getAttribute("type"))||"text"===e.toLowerCase())},first:u(function(){return[0]}),last:u(function(t,e){return[e-1]}),eq:u(function(t,e,n){return[0>n?n+e:n]}),even:u(function(t,e){for(var n=0;e>n;n+=2)t.push(n);return t}),odd:u(function(t,e){for(var n=1;e>n;n+=2)t.push(n);return t}),lt:u(function(t,e,n){for(var r=0>n?n+e:n;--r>=0;)t.push(r);return t}),gt:u(function(t,e,n){for(var r=0>n?n+e:n;++r<e;)t.push(r);return t})}},_.pseudos.nth=_.pseudos.eq;for(w in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})_.pseudos[w]=s(w);for(w in{submit:!0,reset:!0})_.pseudos[w]=l(w);return f.prototype=_.filters=_.pseudos,_.setFilters=new f,T=e.tokenize=function(t,n){var r,i,o,a,s,l,u,c=q[t+" "];if(c)return n?0:c.slice(0);for(s=t,l=[],u=_.preFilter;s;){(!r||(i=ut.exec(s)))&&(i&&(s=s.slice(i[0].length)||s),l.push(o=[])),r=!1,(i=ct.exec(s))&&(r=i.shift(),o.push({value:r,type:i[0].replace(lt," ")}),s=s.slice(r.length));for(a in _.filter)!(i=ht[a].exec(s))||u[a]&&!(i=u[a](i))||(r=i.shift(),
o.push({value:r,type:a,matches:i}),s=s.slice(r.length));if(!r)break}return n?s.length:s?e.error(t):q(t,l).slice(0)},k=e.compile=function(t,e){var n,r=[],i=[],o=U[t+" "];if(!o){for(e||(e=T(t)),n=e.length;n--;)o=y(e[n]),o[$]?r.push(o):i.push(o);o=U(t,b(i,r)),o.selector=t}return o},j=e.select=function(t,e,n,r){var i,o,a,s,l,u="function"==typeof t&&t,f=!r&&T(t=u.selector||t);if(n=n||[],1===f.length){if(o=f[0]=f[0].slice(0),o.length>2&&"ID"===(a=o[0]).type&&x.getById&&9===e.nodeType&&P&&_.relative[o[1].type]){if(e=(_.find.ID(a.matches[0].replace(xt,_t),e)||[])[0],!e)return n;u&&(e=e.parentNode),t=t.slice(o.shift().value.length)}for(i=ht.needsContext.test(t)?0:o.length;i--&&(a=o[i],!_.relative[s=a.type]);)if((l=_.find[s])&&(r=l(a.matches[0].replace(xt,_t),bt.test(o[0].type)&&c(e.parentNode)||e))){if(o.splice(i,1),t=r.length&&d(o),!t)return Z.apply(n,r),n;break}}return(u||k(t,f))(r,e,!P,n,bt.test(t)&&c(e.parentNode)||e),n},x.sortStable=$.split("").sort(X).join("")===$,x.detectDuplicates=!!L,A(),x.sortDetached=i(function(t){return 1&t.compareDocumentPosition(N.createElement("div"))}),i(function(t){return t.innerHTML="<a href='#'></a>","#"===t.firstChild.getAttribute("href")})||o("type|href|height|width",function(t,e,n){return n?void 0:t.getAttribute(e,"type"===e.toLowerCase()?1:2)}),x.attributes&&i(function(t){return t.innerHTML="<input/>",t.firstChild.setAttribute("value",""),""===t.firstChild.getAttribute("value")})||o("value",function(t,e,n){return n||"input"!==t.nodeName.toLowerCase()?void 0:t.defaultValue}),i(function(t){return null==t.getAttribute("disabled")})||o(et,function(t,e,n){var r;return n?void 0:t[e]===!0?e.toLowerCase():(r=t.getAttributeNode(e))&&r.specified?r.value:null}),e}(t);it.find=ut,it.expr=ut.selectors,it.expr[":"]=it.expr.pseudos,it.unique=ut.uniqueSort,it.text=ut.getText,it.isXMLDoc=ut.isXML,it.contains=ut.contains;var ct=it.expr.match.needsContext,ft=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,dt=/^.[^:#\[\.,]*$/;it.filter=function(t,e,n){var r=e[0];return n&&(t=":not("+t+")"),1===e.length&&1===r.nodeType?it.find.matchesSelector(r,t)?[r]:[]:it.find.matches(t,it.grep(e,function(t){return 1===t.nodeType}))},it.fn.extend({find:function(t){var e,n=[],r=this,i=r.length;if("string"!=typeof t)return this.pushStack(it(t).filter(function(){for(e=0;i>e;e++)if(it.contains(r[e],this))return!0}));for(e=0;i>e;e++)it.find(t,r[e],n);return n=this.pushStack(i>1?it.unique(n):n),n.selector=this.selector?this.selector+" "+t:t,n},filter:function(t){return this.pushStack(r(this,t||[],!1))},not:function(t){return this.pushStack(r(this,t||[],!0))},is:function(t){return!!r(this,"string"==typeof t&&ct.test(t)?it(t):t||[],!1).length}});var pt,ht=t.document,gt=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,vt=it.fn.init=function(t,e){var n,r;if(!t)return this;if("string"==typeof t){if(n="<"===t.charAt(0)&&">"===t.charAt(t.length-1)&&t.length>=3?[null,t,null]:gt.exec(t),!n||!n[1]&&e)return!e||e.jquery?(e||pt).find(t):this.constructor(e).find(t);if(n[1]){if(e=e instanceof it?e[0]:e,it.merge(this,it.parseHTML(n[1],e&&e.nodeType?e.ownerDocument||e:ht,!0)),ft.test(n[1])&&it.isPlainObject(e))for(n in e)it.isFunction(this[n])?this[n](e[n]):this.attr(n,e[n]);return this}if(r=ht.getElementById(n[2]),r&&r.parentNode){if(r.id!==n[2])return pt.find(t);this.length=1,this[0]=r}return this.context=ht,this.selector=t,this}return t.nodeType?(this.context=this[0]=t,this.length=1,this):it.isFunction(t)?"undefined"!=typeof pt.ready?pt.ready(t):t(it):(void 0!==t.selector&&(this.selector=t.selector,this.context=t.context),it.makeArray(t,this))};vt.prototype=it.fn,pt=it(ht);var mt=/^(?:parents|prev(?:Until|All))/,yt={children:!0,contents:!0,next:!0,prev:!0};it.extend({dir:function(t,e,n){for(var r=[],i=t[e];i&&9!==i.nodeType&&(void 0===n||1!==i.nodeType||!it(i).is(n));)1===i.nodeType&&r.push(i),i=i[e];return r},sibling:function(t,e){for(var n=[];t;t=t.nextSibling)1===t.nodeType&&t!==e&&n.push(t);return n}}),it.fn.extend({has:function(t){var e,n=it(t,this),r=n.length;return this.filter(function(){for(e=0;r>e;e++)if(it.contains(this,n[e]))return!0})},closest:function(t,e){for(var n,r=0,i=this.length,o=[],a=ct.test(t)||"string"!=typeof t?it(t,e||this.context):0;i>r;r++)for(n=this[r];n&&n!==e;n=n.parentNode)if(n.nodeType<11&&(a?a.index(n)>-1:1===n.nodeType&&it.find.matchesSelector(n,t))){o.push(n);break}return this.pushStack(o.length>1?it.unique(o):o)},index:function(t){return t?"string"==typeof t?it.inArray(this[0],it(t)):it.inArray(t.jquery?t[0]:t,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(t,e){return this.pushStack(it.unique(it.merge(this.get(),it(t,e))))},addBack:function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}}),it.each({parent:function(t){var e=t.parentNode;return e&&11!==e.nodeType?e:null},parents:function(t){return it.dir(t,"parentNode")},parentsUntil:function(t,e,n){return it.dir(t,"parentNode",n)},next:function(t){return i(t,"nextSibling")},prev:function(t){return i(t,"previousSibling")},nextAll:function(t){return it.dir(t,"nextSibling")},prevAll:function(t){return it.dir(t,"previousSibling")},nextUntil:function(t,e,n){return it.dir(t,"nextSibling",n)},prevUntil:function(t,e,n){return it.dir(t,"previousSibling",n)},siblings:function(t){return it.sibling((t.parentNode||{}).firstChild,t)},children:function(t){return it.sibling(t.firstChild)},contents:function(t){return it.nodeName(t,"iframe")?t.contentDocument||t.contentWindow.document:it.merge([],t.childNodes)}},function(t,e){it.fn[t]=function(n,r){var i=it.map(this,e,n);return"Until"!==t.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=it.filter(r,i)),this.length>1&&(yt[t]||(i=it.unique(i)),mt.test(t)&&(i=i.reverse())),this.pushStack(i)}});var bt=/\S+/g,wt={};it.Callbacks=function(t){t="string"==typeof t?wt[t]||o(t):it.extend({},t);var e,n,r,i,a,s,l=[],u=!t.once&&[],c=function(o){for(n=t.memory&&o,r=!0,a=s||0,s=0,i=l.length,e=!0;l&&i>a;a++)if(l[a].apply(o[0],o[1])===!1&&t.stopOnFalse){n=!1;break}e=!1,l&&(u?u.length&&c(u.shift()):n?l=[]:f.disable())},f={add:function(){if(l){var r=l.length;!function o(e){it.each(e,function(e,n){var r=it.type(n);"function"===r?t.unique&&f.has(n)||l.push(n):n&&n.length&&"string"!==r&&o(n)})}(arguments),e?i=l.length:n&&(s=r,c(n))}return this},remove:function(){return l&&it.each(arguments,function(t,n){for(var r;(r=it.inArray(n,l,r))>-1;)l.splice(r,1),e&&(i>=r&&i--,a>=r&&a--)}),this},has:function(t){return t?it.inArray(t,l)>-1:!(!l||!l.length)},empty:function(){return l=[],i=0,this},disable:function(){return l=u=n=void 0,this},disabled:function(){return!l},lock:function(){return u=void 0,n||f.disable(),this},locked:function(){return!u},fireWith:function(t,n){return!l||r&&!u||(n=n||[],n=[t,n.slice?n.slice():n],e?u.push(n):c(n)),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!r}};return f},it.extend({Deferred:function(t){var e=[["resolve","done",it.Callbacks("once memory"),"resolved"],["reject","fail",it.Callbacks("once memory"),"rejected"],["notify","progress",it.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var t=arguments;return it.Deferred(function(n){it.each(e,function(e,o){var a=it.isFunction(t[e])&&t[e];i[o[1]](function(){var t=a&&a.apply(this,arguments);t&&it.isFunction(t.promise)?t.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[o[0]+"With"](this===r?n.promise():this,a?[t]:arguments)})}),t=null}).promise()},promise:function(t){return null!=t?it.extend(t,r):r}},i={};return r.pipe=r.then,it.each(e,function(t,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},e[1^t][2].disable,e[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),t&&t.call(i,i),i},when:function(t){var e,n,r,i=0,o=V.call(arguments),a=o.length,s=1!==a||t&&it.isFunction(t.promise)?a:0,l=1===s?t:it.Deferred(),u=function(t,n,r){return function(i){n[t]=this,r[t]=arguments.length>1?V.call(arguments):i,r===e?l.notifyWith(n,r):--s||l.resolveWith(n,r)}};if(a>1)for(e=new Array(a),n=new Array(a),r=new Array(a);a>i;i++)o[i]&&it.isFunction(o[i].promise)?o[i].promise().done(u(i,r,o)).fail(l.reject).progress(u(i,n,e)):--s;return s||l.resolveWith(r,o),l.promise()}});var xt;it.fn.ready=function(t){return it.ready.promise().done(t),this},it.extend({isReady:!1,readyWait:1,holdReady:function(t){t?it.readyWait++:it.ready(!0)},ready:function(t){if(t===!0?!--it.readyWait:!it.isReady){if(!ht.body)return setTimeout(it.ready);it.isReady=!0,t!==!0&&--it.readyWait>0||(xt.resolveWith(ht,[it]),it.fn.triggerHandler&&(it(ht).triggerHandler("ready"),it(ht).off("ready")))}}}),it.ready.promise=function(e){if(!xt)if(xt=it.Deferred(),"complete"===ht.readyState)setTimeout(it.ready);else if(ht.addEventListener)ht.addEventListener("DOMContentLoaded",s,!1),t.addEventListener("load",s,!1);else{ht.attachEvent("onreadystatechange",s),t.attachEvent("onload",s);var n=!1;try{n=null==t.frameElement&&ht.documentElement}catch(r){}n&&n.doScroll&&!function i(){if(!it.isReady){try{n.doScroll("left")}catch(t){return setTimeout(i,50)}a(),it.ready()}}()}return xt.promise(e)};var _t,Ct="undefined";for(_t in it(nt))break;nt.ownLast="0"!==_t,nt.inlineBlockNeedsLayout=!1,it(function(){var t,e,n,r;n=ht.getElementsByTagName("body")[0],n&&n.style&&(e=ht.createElement("div"),r=ht.createElement("div"),r.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",n.appendChild(r).appendChild(e),typeof e.style.zoom!==Ct&&(e.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",nt.inlineBlockNeedsLayout=t=3===e.offsetWidth,t&&(n.style.zoom=1)),n.removeChild(r))}),function(){var t=ht.createElement("div");if(null==nt.deleteExpando){nt.deleteExpando=!0;try{delete t.test}catch(e){nt.deleteExpando=!1}}t=null}(),it.acceptData=function(t){var e=it.noData[(t.nodeName+" ").toLowerCase()],n=+t.nodeType||1;return(1===n||9===n)&&(!e||e!==!0&&t.getAttribute("classid")===e)};var St=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Tt=/([A-Z])/g;it.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(t){return t=t.nodeType?it.cache[t[it.expando]]:t[it.expando],!!t&&!u(t)},data:function(t,e,n){return c(t,e,n)},removeData:function(t,e){return f(t,e)},_data:function(t,e,n){return c(t,e,n,!0)},_removeData:function(t,e){return f(t,e,!0)}}),it.fn.extend({data:function(t,e){var n,r,i,o=this[0],a=o&&o.attributes;if(void 0===t){if(this.length&&(i=it.data(o),1===o.nodeType&&!it._data(o,"parsedAttrs"))){for(n=a.length;n--;)a[n]&&(r=a[n].name,0===r.indexOf("data-")&&(r=it.camelCase(r.slice(5)),l(o,r,i[r])));it._data(o,"parsedAttrs",!0)}return i}return"object"==typeof t?this.each(function(){it.data(this,t)}):arguments.length>1?this.each(function(){it.data(this,t,e)}):o?l(o,t,it.data(o,t)):void 0},removeData:function(t){return this.each(function(){it.removeData(this,t)})}}),it.extend({queue:function(t,e,n){var r;return t?(e=(e||"fx")+"queue",r=it._data(t,e),n&&(!r||it.isArray(n)?r=it._data(t,e,it.makeArray(n)):r.push(n)),r||[]):void 0},dequeue:function(t,e){e=e||"fx";var n=it.queue(t,e),r=n.length,i=n.shift(),o=it._queueHooks(t,e),a=function(){it.dequeue(t,e)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===e&&n.unshift("inprogress"),delete o.stop,i.call(t,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(t,e){var n=e+"queueHooks";return it._data(t,n)||it._data(t,n,{empty:it.Callbacks("once memory").add(function(){it._removeData(t,e+"queue"),it._removeData(t,n)})})}}),it.fn.extend({queue:function(t,e){var n=2;return"string"!=typeof t&&(e=t,t="fx",n--),arguments.length<n?it.queue(this[0],t):void 0===e?this:this.each(function(){var n=it.queue(this,t,e);it._queueHooks(this,t),"fx"===t&&"inprogress"!==n[0]&&it.dequeue(this,t)})},dequeue:function(t){return this.each(function(){it.dequeue(this,t)})},clearQueue:function(t){return this.queue(t||"fx",[])},promise:function(t,e){var n,r=1,i=it.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};for("string"!=typeof t&&(e=t,t=void 0),t=t||"fx";a--;)n=it._data(o[a],t+"queueHooks"),n&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(e)}});var kt=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,jt=["Top","Right","Bottom","Left"],It=function(t,e){return t=e||t,"none"===it.css(t,"display")||!it.contains(t.ownerDocument,t)},Et=it.access=function(t,e,n,r,i,o,a){var s=0,l=t.length,u=null==n;if("object"===it.type(n)){i=!0;for(s in n)it.access(t,e,s,n[s],!0,o,a)}else if(void 0!==r&&(i=!0,it.isFunction(r)||(a=!0),u&&(a?(e.call(t,r),e=null):(u=e,e=function(t,e,n){return u.call(it(t),n)})),e))for(;l>s;s++)e(t[s],n,a?r:r.call(t[s],s,e(t[s],n)));return i?t:u?e.call(t):l?e(t[0],n):o},Lt=/^(?:checkbox|radio)$/i;!function(){var t=ht.createElement("input"),e=ht.createElement("div"),n=ht.createDocumentFragment();if(e.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",nt.leadingWhitespace=3===e.firstChild.nodeType,nt.tbody=!e.getElementsByTagName("tbody").length,nt.htmlSerialize=!!e.getElementsByTagName("link").length,nt.html5Clone="<:nav></:nav>"!==ht.createElement("nav").cloneNode(!0).outerHTML,t.type="checkbox",t.checked=!0,n.appendChild(t),nt.appendChecked=t.checked,e.innerHTML="<textarea>x</textarea>",nt.noCloneChecked=!!e.cloneNode(!0).lastChild.defaultValue,n.appendChild(e),e.innerHTML="<input type='radio' checked='checked' name='t'/>",nt.checkClone=e.cloneNode(!0).cloneNode(!0).lastChild.checked,nt.noCloneEvent=!0,e.attachEvent&&(e.attachEvent("onclick",function(){nt.noCloneEvent=!1}),e.cloneNode(!0).click()),null==nt.deleteExpando){nt.deleteExpando=!0;try{delete e.test}catch(r){nt.deleteExpando=!1}}}(),function(){var e,n,r=ht.createElement("div");for(e in{submit:!0,change:!0,focusin:!0})n="on"+e,(nt[e+"Bubbles"]=n in t)||(r.setAttribute(n,"t"),nt[e+"Bubbles"]=r.attributes[n].expando===!1);r=null}();var At=/^(?:input|select|textarea)$/i,Nt=/^key/,Dt=/^(?:mouse|pointer|contextmenu)|click/,Pt=/^(?:focusinfocus|focusoutblur)$/,Ot=/^([^.]*)(?:\.(.+)|)$/;it.event={global:{},add:function(t,e,n,r,i){var o,a,s,l,u,c,f,d,p,h,g,v=it._data(t);if(v){for(n.handler&&(l=n,n=l.handler,i=l.selector),n.guid||(n.guid=it.guid++),(a=v.events)||(a=v.events={}),(c=v.handle)||(c=v.handle=function(t){return typeof it===Ct||t&&it.event.triggered===t.type?void 0:it.event.dispatch.apply(c.elem,arguments)},c.elem=t),e=(e||"").match(bt)||[""],s=e.length;s--;)o=Ot.exec(e[s])||[],p=g=o[1],h=(o[2]||"").split(".").sort(),p&&(u=it.event.special[p]||{},p=(i?u.delegateType:u.bindType)||p,u=it.event.special[p]||{},f=it.extend({type:p,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&it.expr.match.needsContext.test(i),namespace:h.join(".")},l),(d=a[p])||(d=a[p]=[],d.delegateCount=0,u.setup&&u.setup.call(t,r,h,c)!==!1||(t.addEventListener?t.addEventListener(p,c,!1):t.attachEvent&&t.attachEvent("on"+p,c))),u.add&&(u.add.call(t,f),f.handler.guid||(f.handler.guid=n.guid)),i?d.splice(d.delegateCount++,0,f):d.push(f),it.event.global[p]=!0);t=null}},remove:function(t,e,n,r,i){var o,a,s,l,u,c,f,d,p,h,g,v=it.hasData(t)&&it._data(t);if(v&&(c=v.events)){for(e=(e||"").match(bt)||[""],u=e.length;u--;)if(s=Ot.exec(e[u])||[],p=g=s[1],h=(s[2]||"").split(".").sort(),p){for(f=it.event.special[p]||{},p=(r?f.delegateType:f.bindType)||p,d=c[p]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),l=o=d.length;o--;)a=d[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(d.splice(o,1),a.selector&&d.delegateCount--,f.remove&&f.remove.call(t,a));l&&!d.length&&(f.teardown&&f.teardown.call(t,h,v.handle)!==!1||it.removeEvent(t,p,v.handle),delete c[p])}else for(p in c)it.event.remove(t,p+e[u],n,r,!0);it.isEmptyObject(c)&&(delete v.handle,it._removeData(t,"events"))}},trigger:function(e,n,r,i){var o,a,s,l,u,c,f,d=[r||ht],p=et.call(e,"type")?e.type:e,h=et.call(e,"namespace")?e.namespace.split("."):[];if(s=c=r=r||ht,3!==r.nodeType&&8!==r.nodeType&&!Pt.test(p+it.event.triggered)&&(p.indexOf(".")>=0&&(h=p.split("."),p=h.shift(),h.sort()),a=p.indexOf(":")<0&&"on"+p,e=e[it.expando]?e:new it.Event(p,"object"==typeof e&&e),e.isTrigger=i?2:3,e.namespace=h.join("."),e.namespace_re=e.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=r),n=null==n?[e]:it.makeArray(n,[e]),u=it.event.special[p]||{},i||!u.trigger||u.trigger.apply(r,n)!==!1)){if(!i&&!u.noBubble&&!it.isWindow(r)){for(l=u.delegateType||p,Pt.test(l+p)||(s=s.parentNode);s;s=s.parentNode)d.push(s),c=s;c===(r.ownerDocument||ht)&&d.push(c.defaultView||c.parentWindow||t)}for(f=0;(s=d[f++])&&!e.isPropagationStopped();)e.type=f>1?l:u.bindType||p,o=(it._data(s,"events")||{})[e.type]&&it._data(s,"handle"),o&&o.apply(s,n),o=a&&s[a],o&&o.apply&&it.acceptData(s)&&(e.result=o.apply(s,n),e.result===!1&&e.preventDefault());if(e.type=p,!i&&!e.isDefaultPrevented()&&(!u._default||u._default.apply(d.pop(),n)===!1)&&it.acceptData(r)&&a&&r[p]&&!it.isWindow(r)){c=r[a],c&&(r[a]=null),it.event.triggered=p;try{r[p]()}catch(g){}it.event.triggered=void 0,c&&(r[a]=c)}return e.result}},dispatch:function(t){t=it.event.fix(t);var e,n,r,i,o,a=[],s=V.call(arguments),l=(it._data(this,"events")||{})[t.type]||[],u=it.event.special[t.type]||{};if(s[0]=t,t.delegateTarget=this,!u.preDispatch||u.preDispatch.call(this,t)!==!1){for(a=it.event.handlers.call(this,t,l),e=0;(i=a[e++])&&!t.isPropagationStopped();)for(t.currentTarget=i.elem,o=0;(r=i.handlers[o++])&&!t.isImmediatePropagationStopped();)(!t.namespace_re||t.namespace_re.test(r.namespace))&&(t.handleObj=r,t.data=r.data,n=((it.event.special[r.origType]||{}).handle||r.handler).apply(i.elem,s),void 0!==n&&(t.result=n)===!1&&(t.preventDefault(),t.stopPropagation()));return u.postDispatch&&u.postDispatch.call(this,t),t.result}},handlers:function(t,e){var n,r,i,o,a=[],s=e.delegateCount,l=t.target;if(s&&l.nodeType&&(!t.button||"click"!==t.type))for(;l!=this;l=l.parentNode||this)if(1===l.nodeType&&(l.disabled!==!0||"click"!==t.type)){for(i=[],o=0;s>o;o++)r=e[o],n=r.selector+" ",void 0===i[n]&&(i[n]=r.needsContext?it(n,this).index(l)>=0:it.find(n,this,null,[l]).length),i[n]&&i.push(r);i.length&&a.push({elem:l,handlers:i})}return s<e.length&&a.push({elem:this,handlers:e.slice(s)}),a},fix:function(t){if(t[it.expando])return t;var e,n,r,i=t.type,o=t,a=this.fixHooks[i];for(a||(this.fixHooks[i]=a=Dt.test(i)?this.mouseHooks:Nt.test(i)?this.keyHooks:{}),r=a.props?this.props.concat(a.props):this.props,t=new it.Event(o),e=r.length;e--;)n=r[e],t[n]=o[n];return t.target||(t.target=o.srcElement||ht),3===t.target.nodeType&&(t.target=t.target.parentNode),t.metaKey=!!t.metaKey,a.filter?a.filter(t,o):t},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(t,e){return null==t.which&&(t.which=null!=e.charCode?e.charCode:e.keyCode),t}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(t,e){var n,r,i,o=e.button,a=e.fromElement;return null==t.pageX&&null!=e.clientX&&(r=t.target.ownerDocument||ht,i=r.documentElement,n=r.body,t.pageX=e.clientX+(i&&i.scrollLeft||n&&n.scrollLeft||0)-(i&&i.clientLeft||n&&n.clientLeft||0),t.pageY=e.clientY+(i&&i.scrollTop||n&&n.scrollTop||0)-(i&&i.clientTop||n&&n.clientTop||0)),!t.relatedTarget&&a&&(t.relatedTarget=a===t.target?e.toElement:a),t.which||void 0===o||(t.which=1&o?1:2&o?3:4&o?2:0),t}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==h()&&this.focus)try{return this.focus(),!1}catch(t){}},delegateType:"focusin"},blur:{trigger:function(){return this===h()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return it.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):void 0},_default:function(t){return it.nodeName(t.target,"a")}},beforeunload:{postDispatch:function(t){void 0!==t.result&&t.originalEvent&&(t.originalEvent.returnValue=t.result)}}},simulate:function(t,e,n,r){var i=it.extend(new it.Event,n,{type:t,isSimulated:!0,originalEvent:{}});r?it.event.trigger(i,null,e):it.event.dispatch.call(e,i),i.isDefaultPrevented()&&n.preventDefault()}},it.removeEvent=ht.removeEventListener?function(t,e,n){t.removeEventListener&&t.removeEventListener(e,n,!1)}:function(t,e,n){var r="on"+e;t.detachEvent&&(typeof t[r]===Ct&&(t[r]=null),t.detachEvent(r,n))},it.Event=function(t,e){return this instanceof it.Event?(t&&t.type?(this.originalEvent=t,this.type=t.type,this.isDefaultPrevented=t.defaultPrevented||void 0===t.defaultPrevented&&t.returnValue===!1?d:p):this.type=t,e&&it.extend(this,e),this.timeStamp=t&&t.timeStamp||it.now(),void(this[it.expando]=!0)):new it.Event(t,e)},it.Event.prototype={isDefaultPrevented:p,isPropagationStopped:p,isImmediatePropagationStopped:p,preventDefault:function(){var t=this.originalEvent;this.isDefaultPrevented=d,t&&(t.preventDefault?t.preventDefault():t.returnValue=!1)},stopPropagation:function(){var t=this.originalEvent;this.isPropagationStopped=d,t&&(t.stopPropagation&&t.stopPropagation(),t.cancelBubble=!0)},stopImmediatePropagation:function(){var t=this.originalEvent;this.isImmediatePropagationStopped=d,t&&t.stopImmediatePropagation&&t.stopImmediatePropagation(),this.stopPropagation()}},it.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(t,e){it.event.special[t]={delegateType:e,bindType:e,handle:function(t){var n,r=this,i=t.relatedTarget,o=t.handleObj;return(!i||i!==r&&!it.contains(r,i))&&(t.type=o.origType,n=o.handler.apply(this,arguments),t.type=e),n}}}),nt.submitBubbles||(it.event.special.submit={setup:function(){return!it.nodeName(this,"form")&&void it.event.add(this,"click._submit keypress._submit",function(t){var e=t.target,n=it.nodeName(e,"input")||it.nodeName(e,"button")?e.form:void 0;n&&!it._data(n,"submitBubbles")&&(it.event.add(n,"submit._submit",function(t){t._submit_bubble=!0}),it._data(n,"submitBubbles",!0))})},postDispatch:function(t){t._submit_bubble&&(delete t._submit_bubble,this.parentNode&&!t.isTrigger&&it.event.simulate("submit",this.parentNode,t,!0))},teardown:function(){return!it.nodeName(this,"form")&&void it.event.remove(this,"._submit")}}),nt.changeBubbles||(it.event.special.change={setup:function(){return At.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(it.event.add(this,"propertychange._change",function(t){"checked"===t.originalEvent.propertyName&&(this._just_changed=!0)}),it.event.add(this,"click._change",function(t){this._just_changed&&!t.isTrigger&&(this._just_changed=!1),it.event.simulate("change",this,t,!0)})),!1):void it.event.add(this,"beforeactivate._change",function(t){var e=t.target;At.test(e.nodeName)&&!it._data(e,"changeBubbles")&&(it.event.add(e,"change._change",function(t){!this.parentNode||t.isSimulated||t.isTrigger||it.event.simulate("change",this.parentNode,t,!0)}),it._data(e,"changeBubbles",!0))})},handle:function(t){var e=t.target;return this!==e||t.isSimulated||t.isTrigger||"radio"!==e.type&&"checkbox"!==e.type?t.handleObj.handler.apply(this,arguments):void 0},teardown:function(){return it.event.remove(this,"._change"),!At.test(this.nodeName)}}),nt.focusinBubbles||it.each({focus:"focusin",blur:"focusout"},function(t,e){var n=function(t){it.event.simulate(e,t.target,it.event.fix(t),!0)};it.event.special[e]={setup:function(){var r=this.ownerDocument||this,i=it._data(r,e);i||r.addEventListener(t,n,!0),it._data(r,e,(i||0)+1)},teardown:function(){var r=this.ownerDocument||this,i=it._data(r,e)-1;i?it._data(r,e,i):(r.removeEventListener(t,n,!0),it._removeData(r,e))}}}),it.fn.extend({on:function(t,e,n,r,i){var o,a;if("object"==typeof t){"string"!=typeof e&&(n=n||e,e=void 0);for(o in t)this.on(o,e,n,t[o],i);return this}if(null==n&&null==r?(r=e,n=e=void 0):null==r&&("string"==typeof e?(r=n,n=void 0):(r=n,n=e,e=void 0)),r===!1)r=p;else if(!r)return this;return 1===i&&(a=r,r=function(t){return it().off(t),a.apply(this,arguments)},r.guid=a.guid||(a.guid=it.guid++)),this.each(function(){it.event.add(this,t,r,n,e)})},one:function(t,e,n,r){return this.on(t,e,n,r,1)},off:function(t,e,n){var r,i;if(t&&t.preventDefault&&t.handleObj)return r=t.handleObj,it(t.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof t){for(i in t)this.off(i,e,t[i]);return this}return(e===!1||"function"==typeof e)&&(n=e,e=void 0),n===!1&&(n=p),this.each(function(){it.event.remove(this,t,n,e)})},trigger:function(t,e){return this.each(function(){it.event.trigger(t,e,this)})},triggerHandler:function(t,e){var n=this[0];return n?it.event.trigger(t,e,n,!0):void 0}});var Bt="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",Ht=/ jQuery\d+="(?:null|\d+)"/g,Mt=new RegExp("<(?:"+Bt+")[\\s/>]","i"),$t=/^\s+/,Ft=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,Rt=/<([\w:]+)/,Wt=/<tbody/i,zt=/<|&#?\w+;/,qt=/<(?:script|style|link)/i,Ut=/checked\s*(?:[^=]|=\s*.checked.)/i,Xt=/^$|\/(?:java|ecma)script/i,Gt=/^true\/(.*)/,Qt=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,Vt={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:nt.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},Yt=g(ht),Jt=Yt.appendChild(ht.createElement("div"));Vt.optgroup=Vt.option,Vt.tbody=Vt.tfoot=Vt.colgroup=Vt.caption=Vt.thead,Vt.th=Vt.td,it.extend({clone:function(t,e,n){var r,i,o,a,s,l=it.contains(t.ownerDocument,t);if(nt.html5Clone||it.isXMLDoc(t)||!Mt.test("<"+t.nodeName+">")?o=t.cloneNode(!0):(Jt.innerHTML=t.outerHTML,Jt.removeChild(o=Jt.firstChild)),!(nt.noCloneEvent&&nt.noCloneChecked||1!==t.nodeType&&11!==t.nodeType||it.isXMLDoc(t)))for(r=v(o),s=v(t),a=0;null!=(i=s[a]);++a)r[a]&&C(i,r[a]);if(e)if(n)for(s=s||v(t),r=r||v(o),a=0;null!=(i=s[a]);a++)_(i,r[a]);else _(t,o);return r=v(o,"script"),r.length>0&&x(r,!l&&v(t,"script")),r=s=i=null,o},buildFragment:function(t,e,n,r){for(var i,o,a,s,l,u,c,f=t.length,d=g(e),p=[],h=0;f>h;h++)if(o=t[h],o||0===o)if("object"===it.type(o))it.merge(p,o.nodeType?[o]:o);else if(zt.test(o)){for(s=s||d.appendChild(e.createElement("div")),l=(Rt.exec(o)||["",""])[1].toLowerCase(),c=Vt[l]||Vt._default,s.innerHTML=c[1]+o.replace(Ft,"<$1></$2>")+c[2],i=c[0];i--;)s=s.lastChild;if(!nt.leadingWhitespace&&$t.test(o)&&p.push(e.createTextNode($t.exec(o)[0])),!nt.tbody)for(o="table"!==l||Wt.test(o)?"<table>"!==c[1]||Wt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;i--;)it.nodeName(u=o.childNodes[i],"tbody")&&!u.childNodes.length&&o.removeChild(u);for(it.merge(p,s.childNodes),s.textContent="";s.firstChild;)s.removeChild(s.firstChild);s=d.lastChild}else p.push(e.createTextNode(o));for(s&&d.removeChild(s),nt.appendChecked||it.grep(v(p,"input"),m),h=0;o=p[h++];)if((!r||-1===it.inArray(o,r))&&(a=it.contains(o.ownerDocument,o),s=v(d.appendChild(o),"script"),a&&x(s),n))for(i=0;o=s[i++];)Xt.test(o.type||"")&&n.push(o);return s=null,d},cleanData:function(t,e){for(var n,r,i,o,a=0,s=it.expando,l=it.cache,u=nt.deleteExpando,c=it.event.special;null!=(n=t[a]);a++)if((e||it.acceptData(n))&&(i=n[s],o=i&&l[i])){if(o.events)for(r in o.events)c[r]?it.event.remove(n,r):it.removeEvent(n,r,o.handle);l[i]&&(delete l[i],u?delete n[s]:typeof n.removeAttribute!==Ct?n.removeAttribute(s):n[s]=null,Q.push(i))}}}),it.fn.extend({text:function(t){return Et(this,function(t){return void 0===t?it.text(this):this.empty().append((this[0]&&this[0].ownerDocument||ht).createTextNode(t))},null,t,arguments.length)},append:function(){return this.domManip(arguments,function(t){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var e=y(this,t);e.appendChild(t)}})},prepend:function(){return this.domManip(arguments,function(t){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var e=y(this,t);e.insertBefore(t,e.firstChild)}})},before:function(){return this.domManip(arguments,function(t){this.parentNode&&this.parentNode.insertBefore(t,this)})},after:function(){return this.domManip(arguments,function(t){this.parentNode&&this.parentNode.insertBefore(t,this.nextSibling)})},remove:function(t,e){for(var n,r=t?it.filter(t,this):this,i=0;null!=(n=r[i]);i++)e||1!==n.nodeType||it.cleanData(v(n)),n.parentNode&&(e&&it.contains(n.ownerDocument,n)&&x(v(n,"script")),n.parentNode.removeChild(n));return this},empty:function(){for(var t,e=0;null!=(t=this[e]);e++){for(1===t.nodeType&&it.cleanData(v(t,!1));t.firstChild;)t.removeChild(t.firstChild);t.options&&it.nodeName(t,"select")&&(t.options.length=0)}return this},clone:function(t,e){return t=null!=t&&t,e=null==e?t:e,this.map(function(){return it.clone(this,t,e)})},html:function(t){return Et(this,function(t){var e=this[0]||{},n=0,r=this.length;if(void 0===t)return 1===e.nodeType?e.innerHTML.replace(Ht,""):void 0;if(!("string"!=typeof t||qt.test(t)||!nt.htmlSerialize&&Mt.test(t)||!nt.leadingWhitespace&&$t.test(t)||Vt[(Rt.exec(t)||["",""])[1].toLowerCase()])){t=t.replace(Ft,"<$1></$2>");try{for(;r>n;n++)e=this[n]||{},1===e.nodeType&&(it.cleanData(v(e,!1)),e.innerHTML=t);e=0}catch(i){}}e&&this.empty().append(t)},null,t,arguments.length)},replaceWith:function(){var t=arguments[0];return this.domManip(arguments,function(e){t=this.parentNode,it.cleanData(v(this)),t&&t.replaceChild(e,this)}),t&&(t.length||t.nodeType)?this:this.remove()},detach:function(t){return this.remove(t,!0)},domManip:function(t,e){t=Y.apply([],t);var n,r,i,o,a,s,l=0,u=this.length,c=this,f=u-1,d=t[0],p=it.isFunction(d);if(p||u>1&&"string"==typeof d&&!nt.checkClone&&Ut.test(d))return this.each(function(n){var r=c.eq(n);p&&(t[0]=d.call(this,n,r.html())),r.domManip(t,e)});if(u&&(s=it.buildFragment(t,this[0].ownerDocument,!1,this),n=s.firstChild,1===s.childNodes.length&&(s=n),n)){for(o=it.map(v(s,"script"),b),i=o.length;u>l;l++)r=s,l!==f&&(r=it.clone(r,!0,!0),i&&it.merge(o,v(r,"script"))),e.call(this[l],r,l);if(i)for(a=o[o.length-1].ownerDocument,it.map(o,w),l=0;i>l;l++)r=o[l],Xt.test(r.type||"")&&!it._data(r,"globalEval")&&it.contains(a,r)&&(r.src?it._evalUrl&&it._evalUrl(r.src):it.globalEval((r.text||r.textContent||r.innerHTML||"").replace(Qt,"")));s=n=null}return this}}),it.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(t,e){it.fn[t]=function(t){for(var n,r=0,i=[],o=it(t),a=o.length-1;a>=r;r++)n=r===a?this:this.clone(!0),it(o[r])[e](n),J.apply(i,n.get());return this.pushStack(i)}});var Zt,Kt={};!function(){var t;nt.shrinkWrapBlocks=function(){if(null!=t)return t;t=!1;var e,n,r;return n=ht.getElementsByTagName("body")[0],n&&n.style?(e=ht.createElement("div"),r=ht.createElement("div"),r.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",n.appendChild(r).appendChild(e),typeof e.style.zoom!==Ct&&(e.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1",e.appendChild(ht.createElement("div")).style.width="5px",t=3!==e.offsetWidth),n.removeChild(r),t):void 0}}();var te,ee,ne=/^margin/,re=new RegExp("^("+kt+")(?!px)[a-z%]+$","i"),ie=/^(top|right|bottom|left)$/;t.getComputedStyle?(te=function(e){return e.ownerDocument.defaultView.opener?e.ownerDocument.defaultView.getComputedStyle(e,null):t.getComputedStyle(e,null)},ee=function(t,e,n){var r,i,o,a,s=t.style;return n=n||te(t),a=n?n.getPropertyValue(e)||n[e]:void 0,n&&(""!==a||it.contains(t.ownerDocument,t)||(a=it.style(t,e)),re.test(a)&&ne.test(e)&&(r=s.width,i=s.minWidth,
o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0===a?a:a+""}):ht.documentElement.currentStyle&&(te=function(t){return t.currentStyle},ee=function(t,e,n){var r,i,o,a,s=t.style;return n=n||te(t),a=n?n[e]:void 0,null==a&&s&&s[e]&&(a=s[e]),re.test(a)&&!ie.test(e)&&(r=s.left,i=t.runtimeStyle,o=i&&i.left,o&&(i.left=t.currentStyle.left),s.left="fontSize"===e?"1em":a,a=s.pixelLeft+"px",s.left=r,o&&(i.left=o)),void 0===a?a:a+""||"auto"}),!function(){function e(){var e,n,r,i;n=ht.getElementsByTagName("body")[0],n&&n.style&&(e=ht.createElement("div"),r=ht.createElement("div"),r.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",n.appendChild(r).appendChild(e),e.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute",o=a=!1,l=!0,t.getComputedStyle&&(o="1%"!==(t.getComputedStyle(e,null)||{}).top,a="4px"===(t.getComputedStyle(e,null)||{width:"4px"}).width,i=e.appendChild(ht.createElement("div")),i.style.cssText=e.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",i.style.marginRight=i.style.width="0",e.style.width="1px",l=!parseFloat((t.getComputedStyle(i,null)||{}).marginRight),e.removeChild(i)),e.innerHTML="<table><tr><td></td><td>t</td></tr></table>",i=e.getElementsByTagName("td"),i[0].style.cssText="margin:0;border:0;padding:0;display:none",s=0===i[0].offsetHeight,s&&(i[0].style.display="",i[1].style.display="none",s=0===i[0].offsetHeight),n.removeChild(r))}var n,r,i,o,a,s,l;n=ht.createElement("div"),n.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",i=n.getElementsByTagName("a")[0],(r=i&&i.style)&&(r.cssText="float:left;opacity:.5",nt.opacity="0.5"===r.opacity,nt.cssFloat=!!r.cssFloat,n.style.backgroundClip="content-box",n.cloneNode(!0).style.backgroundClip="",nt.clearCloneStyle="content-box"===n.style.backgroundClip,nt.boxSizing=""===r.boxSizing||""===r.MozBoxSizing||""===r.WebkitBoxSizing,it.extend(nt,{reliableHiddenOffsets:function(){return null==s&&e(),s},boxSizingReliable:function(){return null==a&&e(),a},pixelPosition:function(){return null==o&&e(),o},reliableMarginRight:function(){return null==l&&e(),l}}))}(),it.swap=function(t,e,n,r){var i,o,a={};for(o in e)a[o]=t.style[o],t.style[o]=e[o];i=n.apply(t,r||[]);for(o in e)t.style[o]=a[o];return i};var oe=/alpha\([^)]*\)/i,ae=/opacity\s*=\s*([^)]*)/,se=/^(none|table(?!-c[ea]).+)/,le=new RegExp("^("+kt+")(.*)$","i"),ue=new RegExp("^([+-])=("+kt+")","i"),ce={position:"absolute",visibility:"hidden",display:"block"},fe={letterSpacing:"0",fontWeight:"400"},de=["Webkit","O","Moz","ms"];it.extend({cssHooks:{opacity:{get:function(t,e){if(e){var n=ee(t,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":nt.cssFloat?"cssFloat":"styleFloat"},style:function(t,e,n,r){if(t&&3!==t.nodeType&&8!==t.nodeType&&t.style){var i,o,a,s=it.camelCase(e),l=t.style;if(e=it.cssProps[s]||(it.cssProps[s]=j(l,s)),a=it.cssHooks[e]||it.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(t,!1,r))?i:l[e];if(o=typeof n,"string"===o&&(i=ue.exec(n))&&(n=(i[1]+1)*i[2]+parseFloat(it.css(t,e)),o="number"),null!=n&&n===n&&("number"!==o||it.cssNumber[s]||(n+="px"),nt.clearCloneStyle||""!==n||0!==e.indexOf("background")||(l[e]="inherit"),!(a&&"set"in a&&void 0===(n=a.set(t,n,r)))))try{l[e]=n}catch(u){}}},css:function(t,e,n,r){var i,o,a,s=it.camelCase(e);return e=it.cssProps[s]||(it.cssProps[s]=j(t.style,s)),a=it.cssHooks[e]||it.cssHooks[s],a&&"get"in a&&(o=a.get(t,!0,n)),void 0===o&&(o=ee(t,e,r)),"normal"===o&&e in fe&&(o=fe[e]),""===n||n?(i=parseFloat(o),n===!0||it.isNumeric(i)?i||0:o):o}}),it.each(["height","width"],function(t,e){it.cssHooks[e]={get:function(t,n,r){return n?se.test(it.css(t,"display"))&&0===t.offsetWidth?it.swap(t,ce,function(){return A(t,e,r)}):A(t,e,r):void 0},set:function(t,n,r){var i=r&&te(t);return E(t,n,r?L(t,e,r,nt.boxSizing&&"border-box"===it.css(t,"boxSizing",!1,i),i):0)}}}),nt.opacity||(it.cssHooks.opacity={get:function(t,e){return ae.test((e&&t.currentStyle?t.currentStyle.filter:t.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":e?"1":""},set:function(t,e){var n=t.style,r=t.currentStyle,i=it.isNumeric(e)?"alpha(opacity="+100*e+")":"",o=r&&r.filter||n.filter||"";n.zoom=1,(e>=1||""===e)&&""===it.trim(o.replace(oe,""))&&n.removeAttribute&&(n.removeAttribute("filter"),""===e||r&&!r.filter)||(n.filter=oe.test(o)?o.replace(oe,i):o+" "+i)}}),it.cssHooks.marginRight=k(nt.reliableMarginRight,function(t,e){return e?it.swap(t,{display:"inline-block"},ee,[t,"marginRight"]):void 0}),it.each({margin:"",padding:"",border:"Width"},function(t,e){it.cssHooks[t+e]={expand:function(n){for(var r=0,i={},o="string"==typeof n?n.split(" "):[n];4>r;r++)i[t+jt[r]+e]=o[r]||o[r-2]||o[0];return i}},ne.test(t)||(it.cssHooks[t+e].set=E)}),it.fn.extend({css:function(t,e){return Et(this,function(t,e,n){var r,i,o={},a=0;if(it.isArray(e)){for(r=te(t),i=e.length;i>a;a++)o[e[a]]=it.css(t,e[a],!1,r);return o}return void 0!==n?it.style(t,e,n):it.css(t,e)},t,e,arguments.length>1)},show:function(){return I(this,!0)},hide:function(){return I(this)},toggle:function(t){return"boolean"==typeof t?t?this.show():this.hide():this.each(function(){It(this)?it(this).show():it(this).hide()})}}),it.Tween=N,N.prototype={constructor:N,init:function(t,e,n,r,i,o){this.elem=t,this.prop=n,this.easing=i||"swing",this.options=e,this.start=this.now=this.cur(),this.end=r,this.unit=o||(it.cssNumber[n]?"":"px")},cur:function(){var t=N.propHooks[this.prop];return t&&t.get?t.get(this):N.propHooks._default.get(this)},run:function(t){var e,n=N.propHooks[this.prop];return this.pos=e=this.options.duration?it.easing[this.easing](t,this.options.duration*t,0,1,this.options.duration):t,this.now=(this.end-this.start)*e+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):N.propHooks._default.set(this),this}},N.prototype.init.prototype=N.prototype,N.propHooks={_default:{get:function(t){var e;return null==t.elem[t.prop]||t.elem.style&&null!=t.elem.style[t.prop]?(e=it.css(t.elem,t.prop,""),e&&"auto"!==e?e:0):t.elem[t.prop]},set:function(t){it.fx.step[t.prop]?it.fx.step[t.prop](t):t.elem.style&&(null!=t.elem.style[it.cssProps[t.prop]]||it.cssHooks[t.prop])?it.style(t.elem,t.prop,t.now+t.unit):t.elem[t.prop]=t.now}}},N.propHooks.scrollTop=N.propHooks.scrollLeft={set:function(t){t.elem.nodeType&&t.elem.parentNode&&(t.elem[t.prop]=t.now)}},it.easing={linear:function(t){return t},swing:function(t){return.5-Math.cos(t*Math.PI)/2}},it.fx=N.prototype.init,it.fx.step={};var pe,he,ge=/^(?:toggle|show|hide)$/,ve=new RegExp("^(?:([+-])=|)("+kt+")([a-z%]*)$","i"),me=/queueHooks$/,ye=[B],be={"*":[function(t,e){var n=this.createTween(t,e),r=n.cur(),i=ve.exec(e),o=i&&i[3]||(it.cssNumber[t]?"":"px"),a=(it.cssNumber[t]||"px"!==o&&+r)&&ve.exec(it.css(n.elem,t)),s=1,l=20;if(a&&a[3]!==o){o=o||a[3],i=i||[],a=+r||1;do s=s||".5",a/=s,it.style(n.elem,t,a+o);while(s!==(s=n.cur()/r)&&1!==s&&--l)}return i&&(a=n.start=+a||+r||0,n.unit=o,n.end=i[1]?a+(i[1]+1)*i[2]:+i[2]),n}]};it.Animation=it.extend(M,{tweener:function(t,e){it.isFunction(t)?(e=t,t=["*"]):t=t.split(" ");for(var n,r=0,i=t.length;i>r;r++)n=t[r],be[n]=be[n]||[],be[n].unshift(e)},prefilter:function(t,e){e?ye.unshift(t):ye.push(t)}}),it.speed=function(t,e,n){var r=t&&"object"==typeof t?it.extend({},t):{complete:n||!n&&e||it.isFunction(t)&&t,duration:t,easing:n&&e||e&&!it.isFunction(e)&&e};return r.duration=it.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in it.fx.speeds?it.fx.speeds[r.duration]:it.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue="fx"),r.old=r.complete,r.complete=function(){it.isFunction(r.old)&&r.old.call(this),r.queue&&it.dequeue(this,r.queue)},r},it.fn.extend({fadeTo:function(t,e,n,r){return this.filter(It).css("opacity",0).show().end().animate({opacity:e},t,n,r)},animate:function(t,e,n,r){var i=it.isEmptyObject(t),o=it.speed(e,n,r),a=function(){var e=M(this,it.extend({},t),o);(i||it._data(this,"finish"))&&e.stop(!0)};return a.finish=a,i||o.queue===!1?this.each(a):this.queue(o.queue,a)},stop:function(t,e,n){var r=function(t){var e=t.stop;delete t.stop,e(n)};return"string"!=typeof t&&(n=e,e=t,t=void 0),e&&t!==!1&&this.queue(t||"fx",[]),this.each(function(){var e=!0,i=null!=t&&t+"queueHooks",o=it.timers,a=it._data(this);if(i)a[i]&&a[i].stop&&r(a[i]);else for(i in a)a[i]&&a[i].stop&&me.test(i)&&r(a[i]);for(i=o.length;i--;)o[i].elem!==this||null!=t&&o[i].queue!==t||(o[i].anim.stop(n),e=!1,o.splice(i,1));(e||!n)&&it.dequeue(this,t)})},finish:function(t){return t!==!1&&(t=t||"fx"),this.each(function(){var e,n=it._data(this),r=n[t+"queue"],i=n[t+"queueHooks"],o=it.timers,a=r?r.length:0;for(n.finish=!0,it.queue(this,t,[]),i&&i.stop&&i.stop.call(this,!0),e=o.length;e--;)o[e].elem===this&&o[e].queue===t&&(o[e].anim.stop(!0),o.splice(e,1));for(e=0;a>e;e++)r[e]&&r[e].finish&&r[e].finish.call(this);delete n.finish})}}),it.each(["toggle","show","hide"],function(t,e){var n=it.fn[e];it.fn[e]=function(t,r,i){return null==t||"boolean"==typeof t?n.apply(this,arguments):this.animate(P(e,!0),t,r,i)}}),it.each({slideDown:P("show"),slideUp:P("hide"),slideToggle:P("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(t,e){it.fn[t]=function(t,n,r){return this.animate(e,t,n,r)}}),it.timers=[],it.fx.tick=function(){var t,e=it.timers,n=0;for(pe=it.now();n<e.length;n++)t=e[n],t()||e[n]!==t||e.splice(n--,1);e.length||it.fx.stop(),pe=void 0},it.fx.timer=function(t){it.timers.push(t),t()?it.fx.start():it.timers.pop()},it.fx.interval=13,it.fx.start=function(){he||(he=setInterval(it.fx.tick,it.fx.interval))},it.fx.stop=function(){clearInterval(he),he=null},it.fx.speeds={slow:600,fast:200,_default:400},it.fn.delay=function(t,e){return t=it.fx?it.fx.speeds[t]||t:t,e=e||"fx",this.queue(e,function(e,n){var r=setTimeout(e,t);n.stop=function(){clearTimeout(r)}})},function(){var t,e,n,r,i;e=ht.createElement("div"),e.setAttribute("className","t"),e.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",r=e.getElementsByTagName("a")[0],n=ht.createElement("select"),i=n.appendChild(ht.createElement("option")),t=e.getElementsByTagName("input")[0],r.style.cssText="top:1px",nt.getSetAttribute="t"!==e.className,nt.style=/top/.test(r.getAttribute("style")),nt.hrefNormalized="/a"===r.getAttribute("href"),nt.checkOn=!!t.value,nt.optSelected=i.selected,nt.enctype=!!ht.createElement("form").enctype,n.disabled=!0,nt.optDisabled=!i.disabled,t=ht.createElement("input"),t.setAttribute("value",""),nt.input=""===t.getAttribute("value"),t.value="t",t.setAttribute("type","radio"),nt.radioValue="t"===t.value}();var we=/\r/g;it.fn.extend({val:function(t){var e,n,r,i=this[0];return arguments.length?(r=it.isFunction(t),this.each(function(n){var i;1===this.nodeType&&(i=r?t.call(this,n,it(this).val()):t,null==i?i="":"number"==typeof i?i+="":it.isArray(i)&&(i=it.map(i,function(t){return null==t?"":t+""})),e=it.valHooks[this.type]||it.valHooks[this.nodeName.toLowerCase()],e&&"set"in e&&void 0!==e.set(this,i,"value")||(this.value=i))})):i?(e=it.valHooks[i.type]||it.valHooks[i.nodeName.toLowerCase()],e&&"get"in e&&void 0!==(n=e.get(i,"value"))?n:(n=i.value,"string"==typeof n?n.replace(we,""):null==n?"":n)):void 0}}),it.extend({valHooks:{option:{get:function(t){var e=it.find.attr(t,"value");return null!=e?e:it.trim(it.text(t))}},select:{get:function(t){for(var e,n,r=t.options,i=t.selectedIndex,o="select-one"===t.type||0>i,a=o?null:[],s=o?i+1:r.length,l=0>i?s:o?i:0;s>l;l++)if(n=r[l],!(!n.selected&&l!==i||(nt.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&it.nodeName(n.parentNode,"optgroup"))){if(e=it(n).val(),o)return e;a.push(e)}return a},set:function(t,e){for(var n,r,i=t.options,o=it.makeArray(e),a=i.length;a--;)if(r=i[a],it.inArray(it.valHooks.option.get(r),o)>=0)try{r.selected=n=!0}catch(s){r.scrollHeight}else r.selected=!1;return n||(t.selectedIndex=-1),i}}}}),it.each(["radio","checkbox"],function(){it.valHooks[this]={set:function(t,e){return it.isArray(e)?t.checked=it.inArray(it(t).val(),e)>=0:void 0}},nt.checkOn||(it.valHooks[this].get=function(t){return null===t.getAttribute("value")?"on":t.value})});var xe,_e,Ce=it.expr.attrHandle,Se=/^(?:checked|selected)$/i,Te=nt.getSetAttribute,ke=nt.input;it.fn.extend({attr:function(t,e){return Et(this,it.attr,t,e,arguments.length>1)},removeAttr:function(t){return this.each(function(){it.removeAttr(this,t)})}}),it.extend({attr:function(t,e,n){var r,i,o=t.nodeType;if(t&&3!==o&&8!==o&&2!==o)return typeof t.getAttribute===Ct?it.prop(t,e,n):(1===o&&it.isXMLDoc(t)||(e=e.toLowerCase(),r=it.attrHooks[e]||(it.expr.match.bool.test(e)?_e:xe)),void 0===n?r&&"get"in r&&null!==(i=r.get(t,e))?i:(i=it.find.attr(t,e),null==i?void 0:i):null!==n?r&&"set"in r&&void 0!==(i=r.set(t,n,e))?i:(t.setAttribute(e,n+""),n):void it.removeAttr(t,e))},removeAttr:function(t,e){var n,r,i=0,o=e&&e.match(bt);if(o&&1===t.nodeType)for(;n=o[i++];)r=it.propFix[n]||n,it.expr.match.bool.test(n)?ke&&Te||!Se.test(n)?t[r]=!1:t[it.camelCase("default-"+n)]=t[r]=!1:it.attr(t,n,""),t.removeAttribute(Te?n:r)},attrHooks:{type:{set:function(t,e){if(!nt.radioValue&&"radio"===e&&it.nodeName(t,"input")){var n=t.value;return t.setAttribute("type",e),n&&(t.value=n),e}}}}}),_e={set:function(t,e,n){return e===!1?it.removeAttr(t,n):ke&&Te||!Se.test(n)?t.setAttribute(!Te&&it.propFix[n]||n,n):t[it.camelCase("default-"+n)]=t[n]=!0,n}},it.each(it.expr.match.bool.source.match(/\w+/g),function(t,e){var n=Ce[e]||it.find.attr;Ce[e]=ke&&Te||!Se.test(e)?function(t,e,r){var i,o;return r||(o=Ce[e],Ce[e]=i,i=null!=n(t,e,r)?e.toLowerCase():null,Ce[e]=o),i}:function(t,e,n){return n?void 0:t[it.camelCase("default-"+e)]?e.toLowerCase():null}}),ke&&Te||(it.attrHooks.value={set:function(t,e,n){return it.nodeName(t,"input")?void(t.defaultValue=e):xe&&xe.set(t,e,n)}}),Te||(xe={set:function(t,e,n){var r=t.getAttributeNode(n);return r||t.setAttributeNode(r=t.ownerDocument.createAttribute(n)),r.value=e+="","value"===n||e===t.getAttribute(n)?e:void 0}},Ce.id=Ce.name=Ce.coords=function(t,e,n){var r;return n?void 0:(r=t.getAttributeNode(e))&&""!==r.value?r.value:null},it.valHooks.button={get:function(t,e){var n=t.getAttributeNode(e);return n&&n.specified?n.value:void 0},set:xe.set},it.attrHooks.contenteditable={set:function(t,e,n){xe.set(t,""!==e&&e,n)}},it.each(["width","height"],function(t,e){it.attrHooks[e]={set:function(t,n){return""===n?(t.setAttribute(e,"auto"),n):void 0}}})),nt.style||(it.attrHooks.style={get:function(t){return t.style.cssText||void 0},set:function(t,e){return t.style.cssText=e+""}});var je=/^(?:input|select|textarea|button|object)$/i,Ie=/^(?:a|area)$/i;it.fn.extend({prop:function(t,e){return Et(this,it.prop,t,e,arguments.length>1)},removeProp:function(t){return t=it.propFix[t]||t,this.each(function(){try{this[t]=void 0,delete this[t]}catch(e){}})}}),it.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(t,e,n){var r,i,o,a=t.nodeType;if(t&&3!==a&&8!==a&&2!==a)return o=1!==a||!it.isXMLDoc(t),o&&(e=it.propFix[e]||e,i=it.propHooks[e]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(t,n,e))?r:t[e]=n:i&&"get"in i&&null!==(r=i.get(t,e))?r:t[e]},propHooks:{tabIndex:{get:function(t){var e=it.find.attr(t,"tabindex");return e?parseInt(e,10):je.test(t.nodeName)||Ie.test(t.nodeName)&&t.href?0:-1}}}}),nt.hrefNormalized||it.each(["href","src"],function(t,e){it.propHooks[e]={get:function(t){return t.getAttribute(e,4)}}}),nt.optSelected||(it.propHooks.selected={get:function(t){var e=t.parentNode;return e&&(e.selectedIndex,e.parentNode&&e.parentNode.selectedIndex),null}}),it.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){it.propFix[this.toLowerCase()]=this}),nt.enctype||(it.propFix.enctype="encoding");var Ee=/[\t\r\n\f]/g;it.fn.extend({addClass:function(t){var e,n,r,i,o,a,s=0,l=this.length,u="string"==typeof t&&t;if(it.isFunction(t))return this.each(function(e){it(this).addClass(t.call(this,e,this.className))});if(u)for(e=(t||"").match(bt)||[];l>s;s++)if(n=this[s],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(Ee," "):" ")){for(o=0;i=e[o++];)r.indexOf(" "+i+" ")<0&&(r+=i+" ");a=it.trim(r),n.className!==a&&(n.className=a)}return this},removeClass:function(t){var e,n,r,i,o,a,s=0,l=this.length,u=0===arguments.length||"string"==typeof t&&t;if(it.isFunction(t))return this.each(function(e){it(this).removeClass(t.call(this,e,this.className))});if(u)for(e=(t||"").match(bt)||[];l>s;s++)if(n=this[s],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(Ee," "):"")){for(o=0;i=e[o++];)for(;r.indexOf(" "+i+" ")>=0;)r=r.replace(" "+i+" "," ");a=t?it.trim(r):"",n.className!==a&&(n.className=a)}return this},toggleClass:function(t,e){var n=typeof t;return"boolean"==typeof e&&"string"===n?e?this.addClass(t):this.removeClass(t):this.each(it.isFunction(t)?function(n){it(this).toggleClass(t.call(this,n,this.className,e),e)}:function(){if("string"===n)for(var e,r=0,i=it(this),o=t.match(bt)||[];e=o[r++];)i.hasClass(e)?i.removeClass(e):i.addClass(e);else(n===Ct||"boolean"===n)&&(this.className&&it._data(this,"__className__",this.className),this.className=this.className||t===!1?"":it._data(this,"__className__")||"")})},hasClass:function(t){for(var e=" "+t+" ",n=0,r=this.length;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(Ee," ").indexOf(e)>=0)return!0;return!1}}),it.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(t,e){it.fn[e]=function(t,n){return arguments.length>0?this.on(e,null,t,n):this.trigger(e)}}),it.fn.extend({hover:function(t,e){return this.mouseenter(t).mouseleave(e||t)},bind:function(t,e,n){return this.on(t,null,e,n)},unbind:function(t,e){return this.off(t,null,e)},delegate:function(t,e,n,r){return this.on(e,t,n,r)},undelegate:function(t,e,n){return 1===arguments.length?this.off(t,"**"):this.off(e,t||"**",n)}});var Le=it.now(),Ae=/\?/,Ne=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;it.parseJSON=function(e){if(t.JSON&&t.JSON.parse)return t.JSON.parse(e+"");var n,r=null,i=it.trim(e+"");return i&&!it.trim(i.replace(Ne,function(t,e,i,o){return n&&e&&(r=0),0===r?t:(n=i||e,r+=!o-!i,"")}))?Function("return "+i)():it.error("Invalid JSON: "+e)},it.parseXML=function(e){var n,r;if(!e||"string"!=typeof e)return null;try{t.DOMParser?(r=new DOMParser,n=r.parseFromString(e,"text/xml")):(n=new ActiveXObject("Microsoft.XMLDOM"),n.async="false",n.loadXML(e))}catch(i){n=void 0}return n&&n.documentElement&&!n.getElementsByTagName("parsererror").length||it.error("Invalid XML: "+e),n};var De,Pe,Oe=/#.*$/,Be=/([?&])_=[^&]*/,He=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Me=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,$e=/^(?:GET|HEAD)$/,Fe=/^\/\//,Re=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,We={},ze={},qe="*/".concat("*");try{Pe=location.href}catch(Ue){Pe=ht.createElement("a"),Pe.href="",Pe=Pe.href}De=Re.exec(Pe.toLowerCase())||[],it.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Pe,type:"GET",isLocal:Me.test(De[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":qe,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":it.parseJSON,"text xml":it.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(t,e){return e?R(R(t,it.ajaxSettings),e):R(it.ajaxSettings,t)},ajaxPrefilter:$(We),ajaxTransport:$(ze),ajax:function(t,e){function n(t,e,n,r){var i,c,m,y,w,_=e;2!==b&&(b=2,s&&clearTimeout(s),u=void 0,a=r||"",x.readyState=t>0?4:0,i=t>=200&&300>t||304===t,n&&(y=W(f,x,n)),y=z(f,y,x,i),i?(f.ifModified&&(w=x.getResponseHeader("Last-Modified"),w&&(it.lastModified[o]=w),w=x.getResponseHeader("etag"),w&&(it.etag[o]=w)),204===t||"HEAD"===f.type?_="nocontent":304===t?_="notmodified":(_=y.state,c=y.data,m=y.error,i=!m)):(m=_,(t||!_)&&(_="error",0>t&&(t=0))),x.status=t,x.statusText=(e||_)+"",i?h.resolveWith(d,[c,_,x]):h.rejectWith(d,[x,_,m]),x.statusCode(v),v=void 0,l&&p.trigger(i?"ajaxSuccess":"ajaxError",[x,f,i?c:m]),g.fireWith(d,[x,_]),l&&(p.trigger("ajaxComplete",[x,f]),--it.active||it.event.trigger("ajaxStop")))}"object"==typeof t&&(e=t,t=void 0),e=e||{};var r,i,o,a,s,l,u,c,f=it.ajaxSetup({},e),d=f.context||f,p=f.context&&(d.nodeType||d.jquery)?it(d):it.event,h=it.Deferred(),g=it.Callbacks("once memory"),v=f.statusCode||{},m={},y={},b=0,w="canceled",x={readyState:0,getResponseHeader:function(t){var e;if(2===b){if(!c)for(c={};e=He.exec(a);)c[e[1].toLowerCase()]=e[2];e=c[t.toLowerCase()]}return null==e?null:e},getAllResponseHeaders:function(){return 2===b?a:null},setRequestHeader:function(t,e){var n=t.toLowerCase();return b||(t=y[n]=y[n]||t,m[t]=e),this},overrideMimeType:function(t){return b||(f.mimeType=t),this},statusCode:function(t){var e;if(t)if(2>b)for(e in t)v[e]=[v[e],t[e]];else x.always(t[x.status]);return this},abort:function(t){var e=t||w;return u&&u.abort(e),n(0,e),this}};if(h.promise(x).complete=g.add,x.success=x.done,x.error=x.fail,f.url=((t||f.url||Pe)+"").replace(Oe,"").replace(Fe,De[1]+"//"),f.type=e.method||e.type||f.method||f.type,f.dataTypes=it.trim(f.dataType||"*").toLowerCase().match(bt)||[""],null==f.crossDomain&&(r=Re.exec(f.url.toLowerCase()),f.crossDomain=!(!r||r[1]===De[1]&&r[2]===De[2]&&(r[3]||("http:"===r[1]?"80":"443"))===(De[3]||("http:"===De[1]?"80":"443")))),f.data&&f.processData&&"string"!=typeof f.data&&(f.data=it.param(f.data,f.traditional)),F(We,f,e,x),2===b)return x;l=it.event&&f.global,l&&0===it.active++&&it.event.trigger("ajaxStart"),f.type=f.type.toUpperCase(),f.hasContent=!$e.test(f.type),o=f.url,f.hasContent||(f.data&&(o=f.url+=(Ae.test(o)?"&":"?")+f.data,delete f.data),f.cache===!1&&(f.url=Be.test(o)?o.replace(Be,"$1_="+Le++):o+(Ae.test(o)?"&":"?")+"_="+Le++)),f.ifModified&&(it.lastModified[o]&&x.setRequestHeader("If-Modified-Since",it.lastModified[o]),it.etag[o]&&x.setRequestHeader("If-None-Match",it.etag[o])),(f.data&&f.hasContent&&f.contentType!==!1||e.contentType)&&x.setRequestHeader("Content-Type",f.contentType),x.setRequestHeader("Accept",f.dataTypes[0]&&f.accepts[f.dataTypes[0]]?f.accepts[f.dataTypes[0]]+("*"!==f.dataTypes[0]?", "+qe+"; q=0.01":""):f.accepts["*"]);for(i in f.headers)x.setRequestHeader(i,f.headers[i]);if(f.beforeSend&&(f.beforeSend.call(d,x,f)===!1||2===b))return x.abort();w="abort";for(i in{success:1,error:1,complete:1})x[i](f[i]);if(u=F(ze,f,e,x)){x.readyState=1,l&&p.trigger("ajaxSend",[x,f]),f.async&&f.timeout>0&&(s=setTimeout(function(){x.abort("timeout")},f.timeout));try{b=1,u.send(m,n)}catch(_){if(!(2>b))throw _;n(-1,_)}}else n(-1,"No Transport");return x},getJSON:function(t,e,n){return it.get(t,e,n,"json")},getScript:function(t,e){return it.get(t,void 0,e,"script")}}),it.each(["get","post"],function(t,e){it[e]=function(t,n,r,i){return it.isFunction(n)&&(i=i||r,r=n,n=void 0),it.ajax({url:t,type:e,dataType:i,data:n,success:r})}}),it._evalUrl=function(t){return it.ajax({url:t,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},it.fn.extend({wrapAll:function(t){if(it.isFunction(t))return this.each(function(e){it(this).wrapAll(t.call(this,e))});if(this[0]){var e=it(t,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&e.insertBefore(this[0]),e.map(function(){for(var t=this;t.firstChild&&1===t.firstChild.nodeType;)t=t.firstChild;return t}).append(this)}return this},wrapInner:function(t){return this.each(it.isFunction(t)?function(e){it(this).wrapInner(t.call(this,e))}:function(){var e=it(this),n=e.contents();n.length?n.wrapAll(t):e.append(t)})},wrap:function(t){var e=it.isFunction(t);return this.each(function(n){it(this).wrapAll(e?t.call(this,n):t)})},unwrap:function(){return this.parent().each(function(){it.nodeName(this,"body")||it(this).replaceWith(this.childNodes)}).end()}}),it.expr.filters.hidden=function(t){return t.offsetWidth<=0&&t.offsetHeight<=0||!nt.reliableHiddenOffsets()&&"none"===(t.style&&t.style.display||it.css(t,"display"))},it.expr.filters.visible=function(t){return!it.expr.filters.hidden(t)};var Xe=/%20/g,Ge=/\[\]$/,Qe=/\r?\n/g,Ve=/^(?:submit|button|image|reset|file)$/i,Ye=/^(?:input|select|textarea|keygen)/i;it.param=function(t,e){var n,r=[],i=function(t,e){e=it.isFunction(e)?e():null==e?"":e,r[r.length]=encodeURIComponent(t)+"="+encodeURIComponent(e)};if(void 0===e&&(e=it.ajaxSettings&&it.ajaxSettings.traditional),it.isArray(t)||t.jquery&&!it.isPlainObject(t))it.each(t,function(){i(this.name,this.value)});else for(n in t)q(n,t[n],e,i);return r.join("&").replace(Xe,"+")},it.fn.extend({serialize:function(){return it.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var t=it.prop(this,"elements");return t?it.makeArray(t):this}).filter(function(){var t=this.type;return this.name&&!it(this).is(":disabled")&&Ye.test(this.nodeName)&&!Ve.test(t)&&(this.checked||!Lt.test(t))}).map(function(t,e){var n=it(this).val();return null==n?null:it.isArray(n)?it.map(n,function(t){return{name:e.name,value:t.replace(Qe,"\r\n")}}):{name:e.name,value:n.replace(Qe,"\r\n")}}).get()}}),it.ajaxSettings.xhr=void 0!==t.ActiveXObject?function(){return!this.isLocal&&/^(get|post|head|put|delete|options)$/i.test(this.type)&&U()||X()}:U;var Je=0,Ze={},Ke=it.ajaxSettings.xhr();t.attachEvent&&t.attachEvent("onunload",function(){for(var t in Ze)Ze[t](void 0,!0)}),nt.cors=!!Ke&&"withCredentials"in Ke,Ke=nt.ajax=!!Ke,Ke&&it.ajaxTransport(function(t){if(!t.crossDomain||nt.cors){var e;return{send:function(n,r){var i,o=t.xhr(),a=++Je;if(o.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(i in t.xhrFields)o[i]=t.xhrFields[i];t.mimeType&&o.overrideMimeType&&o.overrideMimeType(t.mimeType),t.crossDomain||n["X-Requested-With"]||(n["X-Requested-With"]="XMLHttpRequest");for(i in n)void 0!==n[i]&&o.setRequestHeader(i,n[i]+"");o.send(t.hasContent&&t.data||null),e=function(n,i){var s,l,u;if(e&&(i||4===o.readyState))if(delete Ze[a],e=void 0,o.onreadystatechange=it.noop,i)4!==o.readyState&&o.abort();else{u={},s=o.status,"string"==typeof o.responseText&&(u.text=o.responseText);try{l=o.statusText}catch(c){l=""}s||!t.isLocal||t.crossDomain?1223===s&&(s=204):s=u.text?200:404}u&&r(s,l,u,o.getAllResponseHeaders())},t.async?4===o.readyState?setTimeout(e):o.onreadystatechange=Ze[a]=e:e()},abort:function(){e&&e(void 0,!0)}}}}),it.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(t){return it.globalEval(t),t}}}),it.ajaxPrefilter("script",function(t){void 0===t.cache&&(t.cache=!1),t.crossDomain&&(t.type="GET",t.global=!1)}),it.ajaxTransport("script",function(t){if(t.crossDomain){var e,n=ht.head||it("head")[0]||ht.documentElement;return{send:function(r,i){e=ht.createElement("script"),e.async=!0,t.scriptCharset&&(e.charset=t.scriptCharset),e.src=t.url,e.onload=e.onreadystatechange=function(t,n){(n||!e.readyState||/loaded|complete/.test(e.readyState))&&(e.onload=e.onreadystatechange=null,e.parentNode&&e.parentNode.removeChild(e),e=null,n||i(200,"success"))},n.insertBefore(e,n.firstChild)},abort:function(){e&&e.onload(void 0,!0)}}}});var tn=[],en=/(=)\?(?=&|$)|\?\?/;it.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var t=tn.pop()||it.expando+"_"+Le++;return this[t]=!0,t}}),it.ajaxPrefilter("json jsonp",function(e,n,r){var i,o,a,s=e.jsonp!==!1&&(en.test(e.url)?"url":"string"==typeof e.data&&!(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&en.test(e.data)&&"data");return s||"jsonp"===e.dataTypes[0]?(i=e.jsonpCallback=it.isFunction(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,s?e[s]=e[s].replace(en,"$1"+i):e.jsonp!==!1&&(e.url+=(Ae.test(e.url)?"&":"?")+e.jsonp+"="+i),e.converters["script json"]=function(){return a||it.error(i+" was not called"),a[0]},e.dataTypes[0]="json",o=t[i],t[i]=function(){a=arguments},r.always(function(){t[i]=o,e[i]&&(e.jsonpCallback=n.jsonpCallback,tn.push(i)),a&&it.isFunction(o)&&o(a[0]),a=o=void 0}),"script"):void 0}),it.parseHTML=function(t,e,n){if(!t||"string"!=typeof t)return null;"boolean"==typeof e&&(n=e,e=!1),e=e||ht;var r=ft.exec(t),i=!n&&[];return r?[e.createElement(r[1])]:(r=it.buildFragment([t],e,i),i&&i.length&&it(i).remove(),it.merge([],r.childNodes))};var nn=it.fn.load;it.fn.load=function(t,e,n){if("string"!=typeof t&&nn)return nn.apply(this,arguments);var r,i,o,a=this,s=t.indexOf(" ");return s>=0&&(r=it.trim(t.slice(s,t.length)),t=t.slice(0,s)),it.isFunction(e)?(n=e,e=void 0):e&&"object"==typeof e&&(o="POST"),a.length>0&&it.ajax({url:t,type:o,dataType:"html",data:e}).done(function(t){i=arguments,a.html(r?it("<div>").append(it.parseHTML(t)).find(r):t)}).complete(n&&function(t,e){a.each(n,i||[t.responseText,e,t])}),this},it.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(t,e){it.fn[e]=function(t){return this.on(e,t)}}),it.expr.filters.animated=function(t){return it.grep(it.timers,function(e){return t===e.elem}).length};var rn=t.document.documentElement;it.offset={setOffset:function(t,e,n){var r,i,o,a,s,l,u,c=it.css(t,"position"),f=it(t),d={};"static"===c&&(t.style.position="relative"),s=f.offset(),o=it.css(t,"top"),l=it.css(t,"left"),u=("absolute"===c||"fixed"===c)&&it.inArray("auto",[o,l])>-1,u?(r=f.position(),a=r.top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(l)||0),it.isFunction(e)&&(e=e.call(t,n,s)),null!=e.top&&(d.top=e.top-s.top+a),null!=e.left&&(d.left=e.left-s.left+i),"using"in e?e.using.call(t,d):f.css(d)}},it.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){it.offset.setOffset(this,t,e)});var e,n,r={top:0,left:0},i=this[0],o=i&&i.ownerDocument;return o?(e=o.documentElement,it.contains(e,i)?(typeof i.getBoundingClientRect!==Ct&&(r=i.getBoundingClientRect()),n=G(o),{top:r.top+(n.pageYOffset||e.scrollTop)-(e.clientTop||0),left:r.left+(n.pageXOffset||e.scrollLeft)-(e.clientLeft||0)}):r):void 0},position:function(){if(this[0]){var t,e,n={top:0,left:0},r=this[0];return"fixed"===it.css(r,"position")?e=r.getBoundingClientRect():(t=this.offsetParent(),e=this.offset(),it.nodeName(t[0],"html")||(n=t.offset()),n.top+=it.css(t[0],"borderTopWidth",!0),n.left+=it.css(t[0],"borderLeftWidth",!0)),{top:e.top-n.top-it.css(r,"marginTop",!0),left:e.left-n.left-it.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){for(var t=this.offsetParent||rn;t&&!it.nodeName(t,"html")&&"static"===it.css(t,"position");)t=t.offsetParent;return t||rn})}}),it.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,e){var n=/Y/.test(e);it.fn[t]=function(r){return Et(this,function(t,r,i){var o=G(t);return void 0===i?o?e in o?o[e]:o.document.documentElement[r]:t[r]:void(o?o.scrollTo(n?it(o).scrollLeft():i,n?i:it(o).scrollTop()):t[r]=i)},t,r,arguments.length,null)}}),it.each(["top","left"],function(t,e){it.cssHooks[e]=k(nt.pixelPosition,function(t,n){return n?(n=ee(t,e),re.test(n)?it(t).position()[e]+"px":n):void 0})}),it.each({Height:"height",Width:"width"},function(t,e){it.each({padding:"inner"+t,content:e,"":"outer"+t},function(n,r){it.fn[r]=function(r,i){var o=arguments.length&&(n||"boolean"!=typeof r),a=n||(r===!0||i===!0?"margin":"border");return Et(this,function(e,n,r){
var i;return it.isWindow(e)?e.document.documentElement["client"+t]:9===e.nodeType?(i=e.documentElement,Math.max(e.body["scroll"+t],i["scroll"+t],e.body["offset"+t],i["offset"+t],i["client"+t])):void 0===r?it.css(e,n,a):it.style(e,n,r,a)},e,o?r:void 0,o,null)}})}),it.fn.size=function(){return this.length},it.fn.andSelf=it.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return it});var on=t.jQuery,an=t.$;return it.noConflict=function(e){return t.$===it&&(t.$=an),e&&t.jQuery===it&&(t.jQuery=on),it},typeof e===Ct&&(t.jQuery=t.$=it),it}),function t(e,n,r){function i(a,s){if(!n[a]){if(!e[a]){var l="function"==typeof require&&require;if(!s&&l)return l(a,!0);if(o)return o(a,!0);var u=new Error("Cannot find module '"+a+"'");throw u.code="MODULE_NOT_FOUND",u}var c=n[a]={exports:{}};e[a][0].call(c.exports,function(t){var n=e[a][1][t];return i(n?n:t)},c,c.exports,t,e,n,r)}return n[a].exports}for(var o="function"==typeof require&&require,a=0;a<r.length;a++)i(r[a]);return i}({1:[function(t,e,n){var r=window.jQuery,i=window.PX={},o=t("./modules/helpers/analytics.js"),a=t("./modules/behavior.js"),s=t("./modules/carousel.js"),l=t("./modules/helpers/debugger.js"),u=t("./modules/dynamic-images.js"),c=t("./modules/formatting.js"),f=t("./modules/locations/locations.js"),d=t("./modules/nearest-panda.js"),p=t("./modules/nutrition/nutrition.js"),h=t("./modules/our-family-story.js"),g=t("./modules/setup.js");i.locations={callbackInit:f.callbackInit,closeBoxes:f.closeBoxes,setFavoritePanda:f.setFavoritePanda},r(document).ready(function(){l.init(),r(window).trigger("Scripts/Started"),g.init(),o.init(),d.init(),c.init(),a.init(),f.init(),p.init(),h.init(),u.init(),s.init(),r(window).trigger("Scripts/Loaded")})},{"./modules/behavior.js":3,"./modules/carousel.js":4,"./modules/dynamic-images.js":9,"./modules/formatting.js":10,"./modules/helpers/analytics.js":11,"./modules/helpers/debugger.js":13,"./modules/locations/locations.js":20,"./modules/nearest-panda.js":22,"./modules/nutrition/nutrition.js":24,"./modules/our-family-story.js":25,"./modules/setup.js":27}],2:[function(t,e,n){(function(t){(function(){function r(t,e){if(t!==e){var n=null===t,r=t===T,i=t===t,o=null===e,a=e===T,s=e===e;if(t>e&&!o||!i||n&&!a&&s||r&&s)return 1;if(t<e&&!n||!s||o&&!r&&i||a&&i)return-1}return 0}function i(t,e,n){for(var r=t.length,i=n?r:-1;n?i--:++i<r;)if(e(t[i],i,t))return i;return-1}function o(t,e,n){if(e!==e)return v(t,n);for(var r=n-1,i=t.length;++r<i;)if(t[r]===e)return r;return-1}function a(t){return"function"==typeof t||!1}function s(t){return null==t?"":t+""}function l(t,e){for(var n=-1,r=t.length;++n<r&&e.indexOf(t.charAt(n))>-1;);return n}function u(t,e){for(var n=t.length;n--&&e.indexOf(t.charAt(n))>-1;);return n}function c(t,e){return r(t.criteria,e.criteria)||t.index-e.index}function f(t,e,n){for(var i=-1,o=t.criteria,a=e.criteria,s=o.length,l=n.length;++i<s;){var u=r(o[i],a[i]);if(u){if(i>=l)return u;var c=n[i];return u*("asc"===c||c===!0?1:-1)}}return t.index-e.index}function d(t){return qt[t]}function p(t){return Ut[t]}function h(t,e,n){return e?t=Qt[t]:n&&(t=Vt[t]),"\\"+t}function g(t){return"\\"+Vt[t]}function v(t,e,n){for(var r=t.length,i=e+(n?0:-1);n?i--:++i<r;){var o=t[i];if(o!==o)return i}return-1}function m(t){return!!t&&"object"==typeof t}function y(t){return t<=160&&t>=9&&t<=13||32==t||160==t||5760==t||6158==t||t>=8192&&(t<=8202||8232==t||8233==t||8239==t||8287==t||12288==t||65279==t)}function b(t,e){for(var n=-1,r=t.length,i=-1,o=[];++n<r;)t[n]===e&&(t[n]=q,o[++i]=n);return o}function w(t,e){for(var n,r=-1,i=t.length,o=-1,a=[];++r<i;){var s=t[r],l=e?e(s,r,t):s;r&&n===l||(n=l,a[++o]=s)}return a}function x(t){for(var e=-1,n=t.length;++e<n&&y(t.charCodeAt(e)););return e}function _(t){for(var e=t.length;e--&&y(t.charCodeAt(e)););return e}function C(t){return Xt[t]}function S(t){function e(t){if(m(t)&&!Es(t)&&!(t instanceof J)){if(t instanceof y)return t;if(ea.call(t,"__chain__")&&ea.call(t,"__wrapped__"))return pr(t)}return new y(t)}function n(){}function y(t,e,n){this.__wrapped__=t,this.__actions__=n||[],this.__chain__=!!e}function J(t){this.__wrapped__=t,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=Ia,this.__views__=[]}function et(){var t=new J(this.__wrapped__);return t.__actions__=te(this.__actions__),t.__dir__=this.__dir__,t.__filtered__=this.__filtered__,t.__iteratees__=te(this.__iteratees__),t.__takeCount__=this.__takeCount__,t.__views__=te(this.__views__),t}function rt(){if(this.__filtered__){var t=new J(this);t.__dir__=-1,t.__filtered__=!0}else t=this.clone(),t.__dir__*=-1;return t}function qt(){var t=this.__wrapped__.value(),e=this.__dir__,n=Es(t),r=e<0,i=n?t.length:0,o=Xn(0,i,this.__views__),a=o.start,s=o.end,l=s-a,u=r?s:a-1,c=this.__iteratees__,f=c.length,d=0,p=Ca(l,this.__takeCount__);if(!n||i<F||i==l&&p==l)return nn(r&&n?t.reverse():t,this.__actions__);var h=[];t:for(;l--&&d<p;){u+=e;for(var g=-1,v=t[u];++g<f;){var m=c[g],y=m.iteratee,b=m.type,w=y(v);if(b==W)v=w;else if(!w){if(b==R)continue t;break t}}h[d++]=v}return h}function Ut(){this.__data__={}}function Xt(t){return this.has(t)&&delete this.__data__[t]}function Gt(t){return"__proto__"==t?T:this.__data__[t]}function Qt(t){return"__proto__"!=t&&ea.call(this.__data__,t)}function Vt(t,e){return"__proto__"!=t&&(this.__data__[t]=e),this}function Yt(t){var e=t?t.length:0;for(this.data={hash:ma(null),set:new fa};e--;)this.push(t[e])}function Jt(t,e){var n=t.data,r="string"==typeof e||Pi(e)?n.set.has(e):n.hash[e];return r?0:-1}function Zt(t){var e=this.data;"string"==typeof t||Pi(t)?e.set.add(t):e.hash[t]=!0}function Kt(t,e){for(var n=-1,r=t.length,i=-1,o=e.length,a=Ro(r+o);++n<r;)a[n]=t[n];for(;++i<o;)a[n++]=e[i];return a}function te(t,e){var n=-1,r=t.length;for(e||(e=Ro(r));++n<r;)e[n]=t[n];return e}function ee(t,e){for(var n=-1,r=t.length;++n<r&&e(t[n],n,t)!==!1;);return t}function ie(t,e){for(var n=t.length;n--&&e(t[n],n,t)!==!1;);return t}function oe(t,e){for(var n=-1,r=t.length;++n<r;)if(!e(t[n],n,t))return!1;return!0}function ae(t,e,n,r){for(var i=-1,o=t.length,a=r,s=a;++i<o;){var l=t[i],u=+e(l);n(u,a)&&(a=u,s=l)}return s}function se(t,e){for(var n=-1,r=t.length,i=-1,o=[];++n<r;){var a=t[n];e(a,n,t)&&(o[++i]=a)}return o}function le(t,e){for(var n=-1,r=t.length,i=Ro(r);++n<r;)i[n]=e(t[n],n,t);return i}function ue(t,e){for(var n=-1,r=e.length,i=t.length;++n<r;)t[i+n]=e[n];return t}function ce(t,e,n,r){var i=-1,o=t.length;for(r&&o&&(n=t[++i]);++i<o;)n=e(n,t[i],i,t);return n}function fe(t,e,n,r){var i=t.length;for(r&&i&&(n=t[--i]);i--;)n=e(n,t[i],i,t);return n}function de(t,e){for(var n=-1,r=t.length;++n<r;)if(e(t[n],n,t))return!0;return!1}function pe(t,e){for(var n=t.length,r=0;n--;)r+=+e(t[n])||0;return r}function he(t,e){return t===T?e:t}function ge(t,e,n,r){return t!==T&&ea.call(r,n)?t:e}function ve(t,e,n){for(var r=-1,i=Fs(e),o=i.length;++r<o;){var a=i[r],s=t[a],l=n(s,e[a],a,t,e);(l===l?l===s:s!==s)&&(s!==T||a in t)||(t[a]=l)}return t}function me(t,e){return null==e?t:be(e,Fs(e),t)}function ye(t,e){for(var n=-1,r=null==t,i=!r&&Jn(t),o=i?t.length:0,a=e.length,s=Ro(a);++n<a;){var l=e[n];i?s[n]=Zn(l,o)?t[l]:T:s[n]=r?T:t[l]}return s}function be(t,e,n){n||(n={});for(var r=-1,i=e.length;++r<i;){var o=e[r];n[o]=t[o]}return n}function we(t,e,n){var r=typeof t;return"function"==r?e===T?t:an(t,e,n):null==t?Io:"object"==r?$e(t):e===T?Po(t):Fe(t,e)}function xe(t,e,n,r,i,o,a){var s;if(n&&(s=i?n(t,r,i):n(t)),s!==T)return s;if(!Pi(t))return t;var l=Es(t);if(l){if(s=Gn(t),!e)return te(t,s)}else{var u=ra.call(t),c=u==Y;if(u!=K&&u!=U&&(!c||i))return zt[u]?Vn(t,u,e):i?t:{};if(s=Qn(c?{}:t),!e)return me(s,t)}o||(o=[]),a||(a=[]);for(var f=o.length;f--;)if(o[f]==t)return a[f];return o.push(t),a.push(s),(l?ee:Ae)(t,function(r,i){s[i]=xe(r,e,n,i,t,o,a)}),s}function _e(t,e,n){if("function"!=typeof t)throw new Yo(z);return da(function(){t.apply(T,n)},e)}function Ce(t,e){var n=t?t.length:0,r=[];if(!n)return r;var i=-1,a=zn(),s=a==o,l=s&&e.length>=F?gn(e):null,u=e.length;l&&(a=Jt,s=!1,e=l);t:for(;++i<n;){var c=t[i];if(s&&c===c){for(var f=u;f--;)if(e[f]===c)continue t;r.push(c)}else a(e,c,0)<0&&r.push(c)}return r}function Se(t,e){var n=!0;return Ba(t,function(t,r,i){return n=!!e(t,r,i)}),n}function Te(t,e,n,r){var i=r,o=i;return Ba(t,function(t,a,s){var l=+e(t,a,s);(n(l,i)||l===r&&l===o)&&(i=l,o=t)}),o}function ke(t,e,n,r){var i=t.length;for(n=null==n?0:+n||0,n<0&&(n=-n>i?0:i+n),r=r===T||r>i?i:+r||0,r<0&&(r+=i),i=n>r?0:r>>>0,n>>>=0;n<i;)t[n++]=e;return t}function je(t,e){var n=[];return Ba(t,function(t,r,i){e(t,r,i)&&n.push(t)}),n}function Ie(t,e,n,r){var i;return n(t,function(t,n,o){if(e(t,n,o))return i=r?n:t,!1}),i}function Ee(t,e,n,r){r||(r=[]);for(var i=-1,o=t.length;++i<o;){var a=t[i];m(a)&&Jn(a)&&(n||Es(a)||Ti(a))?e?Ee(a,e,n,r):ue(r,a):n||(r[r.length]=a)}return r}function Le(t,e){return Ma(t,e,to)}function Ae(t,e){return Ma(t,e,Fs)}function Ne(t,e){return $a(t,e,Fs)}function De(t,e){for(var n=-1,r=e.length,i=-1,o=[];++n<r;){var a=e[n];Di(t[a])&&(o[++i]=a)}return o}function Pe(t,e,n){if(null!=t){n!==T&&n in fr(t)&&(e=[n]);for(var r=0,i=e.length;null!=t&&r<i;)t=t[e[r++]];return r&&r==i?t:T}}function Oe(t,e,n,r,i,o){return t===e||(null==t||null==e||!Pi(t)&&!m(e)?t!==t&&e!==e:Be(t,e,Oe,n,r,i,o))}function Be(t,e,n,r,i,o,a){var s=Es(t),l=Es(e),u=X,c=X;s||(u=ra.call(t),u==U?u=K:u!=K&&(s=zi(t))),l||(c=ra.call(e),c==U?c=K:c!=K&&(l=zi(e)));var f=u==K,d=c==K,p=u==c;if(p&&!s&&!f)return $n(t,e,u);if(!i){var h=f&&ea.call(t,"__wrapped__"),g=d&&ea.call(e,"__wrapped__");if(h||g)return n(h?t.value():t,g?e.value():e,r,i,o,a)}if(!p)return!1;o||(o=[]),a||(a=[]);for(var v=o.length;v--;)if(o[v]==t)return a[v]==e;o.push(t),a.push(e);var m=(s?Mn:Fn)(t,e,n,r,i,o,a);return o.pop(),a.pop(),m}function He(t,e,n){var r=e.length,i=r,o=!n;if(null==t)return!i;for(t=fr(t);r--;){var a=e[r];if(o&&a[2]?a[1]!==t[a[0]]:!(a[0]in t))return!1}for(;++r<i;){a=e[r];var s=a[0],l=t[s],u=a[1];if(o&&a[2]){if(l===T&&!(s in t))return!1}else{var c=n?n(l,u,s):T;if(!(c===T?Oe(u,l,n,!0):c))return!1}}return!0}function Me(t,e){var n=-1,r=Jn(t)?Ro(t.length):[];return Ba(t,function(t,i,o){r[++n]=e(t,i,o)}),r}function $e(t){var e=qn(t);if(1==e.length&&e[0][2]){var n=e[0][0],r=e[0][1];return function(t){return null!=t&&(t[n]===r&&(r!==T||n in fr(t)))}}return function(t){return He(t,e)}}function Fe(t,e){var n=Es(t),r=tr(t)&&rr(e),i=t+"";return t=dr(t),function(o){if(null==o)return!1;var a=i;if(o=fr(o),(n||!r)&&!(a in o)){if(o=1==t.length?o:Pe(o,Qe(t,0,-1)),null==o)return!1;a=kr(t),o=fr(o)}return o[a]===e?e!==T||a in o:Oe(e,o[a],T,!0)}}function Re(t,e,n,r,i){if(!Pi(t))return t;var o=Jn(e)&&(Es(e)||zi(e)),a=o?T:Fs(e);return ee(a||e,function(s,l){if(a&&(l=s,s=e[l]),m(s))r||(r=[]),i||(i=[]),We(t,e,l,Re,n,r,i);else{var u=t[l],c=n?n(u,s,l,t,e):T,f=c===T;f&&(c=s),c===T&&(!o||l in t)||!f&&(c===c?c===u:u!==u)||(t[l]=c)}}),t}function We(t,e,n,r,i,o,a){for(var s=o.length,l=e[n];s--;)if(o[s]==l)return void(t[n]=a[s]);var u=t[n],c=i?i(u,l,n,t,e):T,f=c===T;f&&(c=l,Jn(l)&&(Es(l)||zi(l))?c=Es(u)?u:Jn(u)?te(u):[]:Fi(l)||Ti(l)?c=Ti(u)?Qi(u):Fi(u)?u:{}:f=!1),o.push(l),a.push(c),f?t[n]=r(c,l,i,o,a):(c===c?c!==u:u===u)&&(t[n]=c)}function ze(t){return function(e){return null==e?T:e[t]}}function qe(t){var e=t+"";return t=dr(t),function(n){return Pe(n,t,e)}}function Ue(t,e){for(var n=t?e.length:0;n--;){var r=e[n];if(r!=i&&Zn(r)){var i=r;pa.call(t,r,1)}}return t}function Xe(t,e){return t+ya(ka()*(e-t+1))}function Ge(t,e,n,r,i){return i(t,function(t,i,o){n=r?(r=!1,t):e(n,t,i,o)}),n}function Qe(t,e,n){var r=-1,i=t.length;e=null==e?0:+e||0,e<0&&(e=-e>i?0:i+e),n=n===T||n>i?i:+n||0,n<0&&(n+=i),i=e>n?0:n-e>>>0,e>>>=0;for(var o=Ro(i);++r<i;)o[r]=t[r+e];return o}function Ve(t,e){var n;return Ba(t,function(t,r,i){return n=e(t,r,i),!n}),!!n}function Ye(t,e){var n=t.length;for(t.sort(e);n--;)t[n]=t[n].value;return t}function Je(t,e,n){var r=Rn(),i=-1;e=le(e,function(t){return r(t)});var o=Me(t,function(t){var n=le(e,function(e){return e(t)});return{criteria:n,index:++i,value:t}});return Ye(o,function(t,e){return f(t,e,n)})}function Ze(t,e){var n=0;return Ba(t,function(t,r,i){n+=+e(t,r,i)||0}),n}function Ke(t,e){var n=-1,r=zn(),i=t.length,a=r==o,s=a&&i>=F,l=s?gn():null,u=[];l?(r=Jt,a=!1):(s=!1,l=e?[]:u);t:for(;++n<i;){var c=t[n],f=e?e(c,n,t):c;if(a&&c===c){for(var d=l.length;d--;)if(l[d]===f)continue t;e&&l.push(f),u.push(c)}else r(l,f,0)<0&&((e||s)&&l.push(f),u.push(c))}return u}function tn(t,e){for(var n=-1,r=e.length,i=Ro(r);++n<r;)i[n]=t[e[n]];return i}function en(t,e,n,r){for(var i=t.length,o=r?i:-1;(r?o--:++o<i)&&e(t[o],o,t););return n?Qe(t,r?0:o,r?o+1:i):Qe(t,r?o+1:0,r?i:o)}function nn(t,e){var n=t;n instanceof J&&(n=n.value());for(var r=-1,i=e.length;++r<i;){var o=e[r];n=o.func.apply(o.thisArg,ue([n],o.args))}return n}function rn(t,e,n){var r=0,i=t?t.length:r;if("number"==typeof e&&e===e&&i<=Aa){for(;r<i;){var o=r+i>>>1,a=t[o];(n?a<=e:a<e)&&null!==a?r=o+1:i=o}return i}return on(t,e,Io,n)}function on(t,e,n,r){e=n(e);for(var i=0,o=t?t.length:0,a=e!==e,s=null===e,l=e===T;i<o;){var u=ya((i+o)/2),c=n(t[u]),f=c!==T,d=c===c;if(a)var p=d||r;else p=s?d&&f&&(r||null!=c):l?d&&(r||f):null!=c&&(r?c<=e:c<e);p?i=u+1:o=u}return Ca(o,La)}function an(t,e,n){if("function"!=typeof t)return Io;if(e===T)return t;switch(n){case 1:return function(n){return t.call(e,n)};case 3:return function(n,r,i){return t.call(e,n,r,i)};case 4:return function(n,r,i,o){return t.call(e,n,r,i,o)};case 5:return function(n,r,i,o,a){return t.call(e,n,r,i,o,a)}}return function(){return t.apply(e,arguments)}}function sn(t){var e=new aa(t.byteLength),n=new ha(e);return n.set(new ha(t)),e}function ln(t,e,n){for(var r=n.length,i=-1,o=_a(t.length-r,0),a=-1,s=e.length,l=Ro(s+o);++a<s;)l[a]=e[a];for(;++i<r;)l[n[i]]=t[i];for(;o--;)l[a++]=t[i++];return l}function un(t,e,n){for(var r=-1,i=n.length,o=-1,a=_a(t.length-i,0),s=-1,l=e.length,u=Ro(a+l);++o<a;)u[o]=t[o];for(var c=o;++s<l;)u[c+s]=e[s];for(;++r<i;)u[c+n[r]]=t[o++];return u}function cn(t,e){return function(n,r,i){var o=e?e():{};if(r=Rn(r,i,3),Es(n))for(var a=-1,s=n.length;++a<s;){var l=n[a];t(o,l,r(l,a,n),n)}else Ba(n,function(e,n,i){t(o,e,r(e,n,i),i)});return o}}function fn(t){return mi(function(e,n){var r=-1,i=null==e?0:n.length,o=i>2?n[i-2]:T,a=i>2?n[2]:T,s=i>1?n[i-1]:T;for("function"==typeof o?(o=an(o,s,5),i-=2):(o="function"==typeof s?s:T,i-=o?1:0),a&&Kn(n[0],n[1],a)&&(o=i<3?T:o,i=1);++r<i;){var l=n[r];l&&t(e,l,o)}return e})}function dn(t,e){return function(n,r){var i=n?Wa(n):0;if(!nr(i))return t(n,r);for(var o=e?i:-1,a=fr(n);(e?o--:++o<i)&&r(a[o],o,a)!==!1;);return n}}function pn(t){return function(e,n,r){for(var i=fr(e),o=r(e),a=o.length,s=t?a:-1;t?s--:++s<a;){var l=o[s];if(n(i[l],l,i)===!1)break}return e}}function hn(t,e){function n(){var i=this&&this!==ne&&this instanceof n?r:t;return i.apply(e,arguments)}var r=mn(t);return n}function gn(t){return ma&&fa?new Yt(t):null}function vn(t){return function(e){for(var n=-1,r=To(co(e)),i=r.length,o="";++n<i;)o=t(o,r[n],n);return o}}function mn(t){return function(){var e=arguments;switch(e.length){case 0:return new t;case 1:return new t(e[0]);case 2:return new t(e[0],e[1]);case 3:return new t(e[0],e[1],e[2]);case 4:return new t(e[0],e[1],e[2],e[3]);case 5:return new t(e[0],e[1],e[2],e[3],e[4]);case 6:return new t(e[0],e[1],e[2],e[3],e[4],e[5]);case 7:return new t(e[0],e[1],e[2],e[3],e[4],e[5],e[6])}var n=Oa(t.prototype),r=t.apply(n,e);return Pi(r)?r:n}}function yn(t){function e(n,r,i){i&&Kn(n,r,i)&&(r=T);var o=Hn(n,t,T,T,T,T,T,r);return o.placeholder=e.placeholder,o}return e}function bn(t,e){return mi(function(n){var r=n[0];return null==r?r:(n.push(e),t.apply(T,n))})}function wn(t,e){return function(n,r,i){if(i&&Kn(n,r,i)&&(r=T),r=Rn(r,i,3),1==r.length){n=Es(n)?n:cr(n);var o=ae(n,r,t,e);if(!n.length||o!==e)return o}return Te(n,r,t,e)}}function xn(t,e){return function(n,r,o){if(r=Rn(r,o,3),Es(n)){var a=i(n,r,e);return a>-1?n[a]:T}return Ie(n,r,t)}}function _n(t){return function(e,n,r){return e&&e.length?(n=Rn(n,r,3),i(e,n,t)):-1}}function Cn(t){return function(e,n,r){return n=Rn(n,r,3),Ie(e,n,t,!0)}}function Sn(t){return function(){for(var e,n=arguments.length,r=t?n:-1,i=0,o=Ro(n);t?r--:++r<n;){var a=o[i++]=arguments[r];if("function"!=typeof a)throw new Yo(z);!e&&y.prototype.thru&&"wrapper"==Wn(a)&&(e=new y([],(!0)))}for(r=e?-1:n;++r<n;){a=o[r];var s=Wn(a),l="wrapper"==s?Ra(a):T;e=l&&er(l[0])&&l[1]==(P|L|N|O)&&!l[4].length&&1==l[9]?e[Wn(l[0])].apply(e,l[3]):1==a.length&&er(a)?e[s]():e.thru(a)}return function(){var t=arguments,r=t[0];if(e&&1==t.length&&Es(r)&&r.length>=F)return e.plant(r).value();for(var i=0,a=n?o[i].apply(this,t):r;++i<n;)a=o[i].call(this,a);return a}}}function Tn(t,e){return function(n,r,i){return"function"==typeof r&&i===T&&Es(n)?t(n,r):e(n,an(r,i,3))}}function kn(t){return function(e,n,r){return"function"==typeof n&&r===T||(n=an(n,r,3)),t(e,n,to)}}function jn(t){return function(e,n,r){return"function"==typeof n&&r===T||(n=an(n,r,3)),t(e,n)}}function In(t){return function(e,n,r){var i={};return n=Rn(n,r,3),Ae(e,function(e,r,o){var a=n(e,r,o);r=t?a:r,e=t?e:a,i[r]=e}),i}}function En(t){return function(e,n,r){return e=s(e),(t?e:"")+Dn(e,n,r)+(t?"":e)}}function Ln(t){var e=mi(function(n,r){var i=b(r,e.placeholder);return Hn(n,t,T,r,i)});return e}function An(t,e){return function(n,r,i,o){var a=arguments.length<3;return"function"==typeof r&&o===T&&Es(n)?t(n,r,i,a):Ge(n,Rn(r,o,4),i,a,e)}}function Nn(t,e,n,r,i,o,a,s,l,u){function c(){for(var y=arguments.length,w=y,x=Ro(y);w--;)x[w]=arguments[w];if(r&&(x=ln(x,r,i)),o&&(x=un(x,o,a)),h||v){var _=c.placeholder,C=b(x,_);if(y-=C.length,y<u){var S=s?te(s):T,k=_a(u-y,0),E=h?C:T,L=h?T:C,A=h?x:T,P=h?T:x;e|=h?N:D,e&=~(h?D:N),g||(e&=~(j|I));var O=[t,e,n,A,E,P,L,S,l,k],B=Nn.apply(T,O);return er(t)&&za(B,O),B.placeholder=_,B}}var H=d?n:this,M=p?H[t]:t;return s&&(x=lr(x,s)),f&&l<x.length&&(x.length=l),this&&this!==ne&&this instanceof c&&(M=m||mn(t)),M.apply(H,x)}var f=e&P,d=e&j,p=e&I,h=e&L,g=e&E,v=e&A,m=p?T:mn(t);return c}function Dn(t,e,n){var r=t.length;if(e=+e,r>=e||!wa(e))return"";var i=e-r;return n=null==n?" ":n+"",mo(n,va(i/n.length)).slice(0,i)}function Pn(t,e,n,r){function i(){for(var e=-1,s=arguments.length,l=-1,u=r.length,c=Ro(u+s);++l<u;)c[l]=r[l];for(;s--;)c[l++]=arguments[++e];var f=this&&this!==ne&&this instanceof i?a:t;return f.apply(o?n:this,c)}var o=e&j,a=mn(t);return i}function On(t){var e=Uo[t];return function(t,n){return n=n===T?0:+n||0,n?(n=ua(10,n),e(t*n)/n):e(t)}}function Bn(t){return function(e,n,r,i){var o=Rn(r);return null==r&&o===we?rn(e,n,t):on(e,n,o(r,i,1),t)}}function Hn(t,e,n,r,i,o,a,s){var l=e&I;if(!l&&"function"!=typeof t)throw new Yo(z);var u=r?r.length:0;if(u||(e&=~(N|D),r=i=T),u-=i?i.length:0,e&D){var c=r,f=i;r=i=T}var d=l?T:Ra(t),p=[t,e,n,r,i,c,f,o,a,s];if(d&&(ir(p,d),e=p[1],s=p[9]),p[9]=null==s?l?0:t.length:_a(s-u,0)||0,e==j)var h=hn(p[0],p[2]);else h=e!=N&&e!=(j|N)||p[4].length?Nn.apply(T,p):Pn.apply(T,p);var g=d?Fa:za;return g(h,p)}function Mn(t,e,n,r,i,o,a){var s=-1,l=t.length,u=e.length;if(l!=u&&!(i&&u>l))return!1;for(;++s<l;){var c=t[s],f=e[s],d=r?r(i?f:c,i?c:f,s):T;if(d!==T){if(d)continue;return!1}if(i){if(!de(e,function(t){return c===t||n(c,t,r,i,o,a)}))return!1}else if(c!==f&&!n(c,f,r,i,o,a))return!1}return!0}function $n(t,e,n){switch(n){case G:case Q:return+t==+e;case V:return t.name==e.name&&t.message==e.message;case Z:return t!=+t?e!=+e:t==+e;case tt:case nt:return t==e+""}return!1}function Fn(t,e,n,r,i,o,a){var s=Fs(t),l=s.length,u=Fs(e),c=u.length;if(l!=c&&!i)return!1;for(var f=l;f--;){var d=s[f];if(!(i?d in e:ea.call(e,d)))return!1}for(var p=i;++f<l;){d=s[f];var h=t[d],g=e[d],v=r?r(i?g:h,i?h:g,d):T;if(!(v===T?n(h,g,r,i,o,a):v))return!1;p||(p="constructor"==d)}if(!p){var m=t.constructor,y=e.constructor;if(m!=y&&"constructor"in t&&"constructor"in e&&!("function"==typeof m&&m instanceof m&&"function"==typeof y&&y instanceof y))return!1}return!0}function Rn(t,n,r){var i=e.callback||ko;return i=i===ko?we:i,r?i(t,n,r):i}function Wn(t){for(var e=t.name,n=Pa[e],r=n?n.length:0;r--;){var i=n[r],o=i.func;if(null==o||o==t)return i.name}return e}function zn(t,n,r){var i=e.indexOf||Sr;return i=i===Sr?o:i,t?i(t,n,r):i}function qn(t){for(var e=eo(t),n=e.length;n--;)e[n][2]=rr(e[n][1]);return e}function Un(t,e){var n=null==t?T:t[e];return Hi(n)?n:T}function Xn(t,e,n){for(var r=-1,i=n.length;++r<i;){var o=n[r],a=o.size;switch(o.type){case"drop":t+=a;break;case"dropRight":e-=a;break;case"take":e=Ca(e,t+a);break;case"takeRight":t=_a(t,e-a)}}return{start:t,end:e}}function Gn(t){var e=t.length,n=new t.constructor(e);return e&&"string"==typeof t[0]&&ea.call(t,"index")&&(n.index=t.index,n.input=t.input),n}function Qn(t){var e=t.constructor;return"function"==typeof e&&e instanceof e||(e=Go),new e}function Vn(t,e,n){var r=t.constructor;switch(e){case it:return sn(t);case G:case Q:return new r((+t));case ot:case at:case st:case lt:case ut:case ct:case ft:case dt:case pt:var i=t.buffer;return new r(n?sn(i):i,t.byteOffset,t.length);case Z:case nt:return new r(t);case tt:var o=new r(t.source,Nt.exec(t));o.lastIndex=t.lastIndex}return o}function Yn(t,e,n){null==t||tr(e,t)||(e=dr(e),t=1==e.length?t:Pe(t,Qe(e,0,-1)),e=kr(e));var r=null==t?t:t[e];return null==r?T:r.apply(t,n)}function Jn(t){return null!=t&&nr(Wa(t))}function Zn(t,e){return t="number"==typeof t||Ot.test(t)?+t:-1,e=null==e?Na:e,t>-1&&t%1==0&&t<e}function Kn(t,e,n){if(!Pi(n))return!1;var r=typeof e;if("number"==r?Jn(n)&&Zn(e,n.length):"string"==r&&e in n){var i=n[e];return t===t?t===i:i!==i}return!1}function tr(t,e){var n=typeof t;if("string"==n&&Tt.test(t)||"number"==n)return!0;if(Es(t))return!1;var r=!St.test(t);return r||null!=e&&t in fr(e)}function er(t){var n=Wn(t);if(!(n in J.prototype))return!1;var r=e[n];if(t===r)return!0;var i=Ra(r);return!!i&&t===i[0]}function nr(t){return"number"==typeof t&&t>-1&&t%1==0&&t<=Na}function rr(t){return t===t&&!Pi(t)}function ir(t,e){var n=t[1],r=e[1],i=n|r,o=i<P,a=r==P&&n==L||r==P&&n==O&&t[7].length<=e[8]||r==(P|O)&&n==L;if(!o&&!a)return t;r&j&&(t[2]=e[2],i|=n&j?0:E);var s=e[3];if(s){var l=t[3];t[3]=l?ln(l,s,e[4]):te(s),t[4]=l?b(t[3],q):te(e[4])}return s=e[5],s&&(l=t[5],t[5]=l?un(l,s,e[6]):te(s),t[6]=l?b(t[5],q):te(e[6])),s=e[7],s&&(t[7]=te(s)),r&P&&(t[8]=null==t[8]?e[8]:Ca(t[8],e[8])),null==t[9]&&(t[9]=e[9]),t[0]=e[0],t[1]=i,t}function or(t,e){return t===T?e:Ls(t,e,or)}function ar(t,e){t=fr(t);for(var n=-1,r=e.length,i={};++n<r;){var o=e[n];o in t&&(i[o]=t[o])}return i}function sr(t,e){var n={};return Le(t,function(t,r,i){e(t,r,i)&&(n[r]=t)}),n}function lr(t,e){for(var n=t.length,r=Ca(e.length,n),i=te(t);r--;){var o=e[r];t[r]=Zn(o,n)?i[o]:T}return t}function ur(t){for(var e=to(t),n=e.length,r=n&&t.length,i=!!r&&nr(r)&&(Es(t)||Ti(t)),o=-1,a=[];++o<n;){var s=e[o];(i&&Zn(s,r)||ea.call(t,s))&&a.push(s)}return a}function cr(t){return null==t?[]:Jn(t)?Pi(t)?t:Go(t):oo(t)}function fr(t){return Pi(t)?t:Go(t)}function dr(t){if(Es(t))return t;var e=[];return s(t).replace(kt,function(t,n,r,i){e.push(r?i.replace(Lt,"$1"):n||t)}),e}function pr(t){return t instanceof J?t.clone():new y(t.__wrapped__,t.__chain__,te(t.__actions__))}function hr(t,e,n){e=(n?Kn(t,e,n):null==e)?1:_a(ya(e)||1,1);for(var r=0,i=t?t.length:0,o=-1,a=Ro(va(i/e));r<i;)a[++o]=Qe(t,r,r+=e);return a}function gr(t){for(var e=-1,n=t?t.length:0,r=-1,i=[];++e<n;){var o=t[e];o&&(i[++r]=o)}return i}function vr(t,e,n){var r=t?t.length:0;return r?((n?Kn(t,e,n):null==e)&&(e=1),Qe(t,e<0?0:e)):[]}function mr(t,e,n){var r=t?t.length:0;return r?((n?Kn(t,e,n):null==e)&&(e=1),e=r-(+e||0),Qe(t,0,e<0?0:e)):[]}function yr(t,e,n){return t&&t.length?en(t,Rn(e,n,3),!0,!0):[]}function br(t,e,n){return t&&t.length?en(t,Rn(e,n,3),!0):[]}function wr(t,e,n,r){var i=t?t.length:0;return i?(n&&"number"!=typeof n&&Kn(t,e,n)&&(n=0,r=i),ke(t,e,n,r)):[]}function xr(t){return t?t[0]:T}function _r(t,e,n){var r=t?t.length:0;return n&&Kn(t,e,n)&&(e=!1),r?Ee(t,e):[]}function Cr(t){var e=t?t.length:0;return e?Ee(t,!0):[]}function Sr(t,e,n){var r=t?t.length:0;if(!r)return-1;if("number"==typeof n)n=n<0?_a(r+n,0):n;else if(n){var i=rn(t,e);return i<r&&(e===e?e===t[i]:t[i]!==t[i])?i:-1}return o(t,e,n||0)}function Tr(t){return mr(t,1)}function kr(t){var e=t?t.length:0;return e?t[e-1]:T}function jr(t,e,n){var r=t?t.length:0;if(!r)return-1;var i=r;if("number"==typeof n)i=(n<0?_a(r+n,0):Ca(n||0,r-1))+1;else if(n){i=rn(t,e,!0)-1;var o=t[i];return(e===e?e===o:o!==o)?i:-1}if(e!==e)return v(t,i,!0);for(;i--;)if(t[i]===e)return i;return-1}function Ir(){var t=arguments,e=t[0];if(!e||!e.length)return e;for(var n=0,r=zn(),i=t.length;++n<i;)for(var o=0,a=t[n];(o=r(e,a,o))>-1;)pa.call(e,o,1);return e}function Er(t,e,n){var r=[];if(!t||!t.length)return r;var i=-1,o=[],a=t.length;for(e=Rn(e,n,3);++i<a;){var s=t[i];e(s,i,t)&&(r.push(s),o.push(i))}return Ue(t,o),r}function Lr(t){return vr(t,1)}function Ar(t,e,n){var r=t?t.length:0;return r?(n&&"number"!=typeof n&&Kn(t,e,n)&&(e=0,n=r),Qe(t,e,n)):[]}function Nr(t,e,n){var r=t?t.length:0;return r?((n?Kn(t,e,n):null==e)&&(e=1),Qe(t,0,e<0?0:e)):[]}function Dr(t,e,n){var r=t?t.length:0;return r?((n?Kn(t,e,n):null==e)&&(e=1),e=r-(+e||0),Qe(t,e<0?0:e)):[]}function Pr(t,e,n){return t&&t.length?en(t,Rn(e,n,3),!1,!0):[]}function Or(t,e,n){return t&&t.length?en(t,Rn(e,n,3)):[]}function Br(t,e,n,r){var i=t?t.length:0;if(!i)return[];null!=e&&"boolean"!=typeof e&&(r=n,n=Kn(t,e,r)?T:e,e=!1);var a=Rn();return null==n&&a===we||(n=a(n,r,3)),e&&zn()==o?w(t,n):Ke(t,n)}function Hr(t){if(!t||!t.length)return[];var e=-1,n=0;t=se(t,function(t){if(Jn(t))return n=_a(t.length,n),!0});for(var r=Ro(n);++e<n;)r[e]=le(t,ze(e));return r}function Mr(t,e,n){var r=t?t.length:0;if(!r)return[];var i=Hr(t);return null==e?i:(e=an(e,n,4),le(i,function(t){return ce(t,e,T,!0)}))}function $r(){for(var t=-1,e=arguments.length;++t<e;){var n=arguments[t];if(Jn(n))var r=r?ue(Ce(r,n),Ce(n,r)):n}return r?Ke(r):[]}function Fr(t,e){var n=-1,r=t?t.length:0,i={};for(!r||e||Es(t[0])||(e=[]);++n<r;){var o=t[n];e?i[o]=e[n]:o&&(i[o[0]]=o[1])}return i}function Rr(t){var n=e(t);return n.__chain__=!0,n}function Wr(t,e,n){return e.call(n,t),t}function zr(t,e,n){return e.call(n,t)}function qr(){return Rr(this)}function Ur(){return new y(this.value(),this.__chain__)}function Xr(t){for(var e,r=this;r instanceof n;){var i=pr(r);e?o.__wrapped__=i:e=i;var o=i;r=r.__wrapped__}return o.__wrapped__=t,e}function Gr(){var t=this.__wrapped__,e=function(t){return n&&n.__dir__<0?t:t.reverse()};if(t instanceof J){var n=t;return this.__actions__.length&&(n=new J(this)),n=n.reverse(),n.__actions__.push({func:zr,args:[e],thisArg:T}),new y(n,this.__chain__)}return this.thru(e)}function Qr(){return this.value()+""}function Vr(){return nn(this.__wrapped__,this.__actions__)}function Yr(t,e,n){var r=Es(t)?oe:Se;return n&&Kn(t,e,n)&&(e=T),"function"==typeof e&&n===T||(e=Rn(e,n,3)),r(t,e)}function Jr(t,e,n){var r=Es(t)?se:je;return e=Rn(e,n,3),r(t,e)}function Zr(t,e){return is(t,$e(e))}function Kr(t,e,n,r){var i=t?Wa(t):0;return nr(i)||(t=oo(t),i=t.length),n="number"!=typeof n||r&&Kn(e,n,r)?0:n<0?_a(i+n,0):n||0,"string"==typeof t||!Es(t)&&Wi(t)?n<=i&&t.indexOf(e,n)>-1:!!i&&zn(t,e,n)>-1}function ti(t,e,n){var r=Es(t)?le:Me;return e=Rn(e,n,3),r(t,e)}function ei(t,e){return ti(t,Po(e))}function ni(t,e,n){var r=Es(t)?se:je;return e=Rn(e,n,3),r(t,function(t,n,r){return!e(t,n,r)})}function ri(t,e,n){if(n?Kn(t,e,n):null==e){t=cr(t);var r=t.length;return r>0?t[Xe(0,r-1)]:T}var i=-1,o=Gi(t),r=o.length,a=r-1;for(e=Ca(e<0?0:+e||0,r);++i<e;){var s=Xe(i,a),l=o[s];o[s]=o[i],o[i]=l}return o.length=e,o}function ii(t){return ri(t,Ia)}function oi(t){var e=t?Wa(t):0;return nr(e)?e:Fs(t).length}function ai(t,e,n){var r=Es(t)?de:Ve;return n&&Kn(t,e,n)&&(e=T),"function"==typeof e&&n===T||(e=Rn(e,n,3)),r(t,e)}function si(t,e,n){if(null==t)return[];n&&Kn(t,e,n)&&(e=T);var r=-1;e=Rn(e,n,3);var i=Me(t,function(t,n,i){return{criteria:e(t,n,i),index:++r,value:t}});return Ye(i,c)}function li(t,e,n,r){return null==t?[]:(r&&Kn(e,n,r)&&(n=T),Es(e)||(e=null==e?[]:[e]),Es(n)||(n=null==n?[]:[n]),Je(t,e,n))}function ui(t,e){return Jr(t,$e(e))}function ci(t,e){if("function"!=typeof e){if("function"!=typeof t)throw new Yo(z);var n=t;t=e,e=n}return t=wa(t=+t)?t:0,function(){if(--t<1)return e.apply(this,arguments)}}function fi(t,e,n){return n&&Kn(t,e,n)&&(e=T),e=t&&null==e?t.length:_a(+e||0,0),Hn(t,P,T,T,T,T,e)}function di(t,e){var n;if("function"!=typeof e){if("function"!=typeof t)throw new Yo(z);var r=t;t=e,e=r}return function(){return--t>0&&(n=e.apply(this,arguments)),t<=1&&(e=T),n}}function pi(t,e,n){function r(){p&&sa(p),u&&sa(u),g=0,u=p=h=T}function i(e,n){n&&sa(n),u=p=h=T,e&&(g=gs(),c=t.apply(d,l),p||u||(l=d=T))}function o(){var t=e-(gs()-f);t<=0||t>e?i(h,u):p=da(o,t)}function a(){i(m,p)}function s(){if(l=arguments,f=gs(),d=this,h=m&&(p||!y),v===!1)var n=y&&!p;else{u||y||(g=f);var r=v-(f-g),i=r<=0||r>v;i?(u&&(u=sa(u)),g=f,c=t.apply(d,l)):u||(u=da(a,r))}return i&&p?p=sa(p):p||e===v||(p=da(o,e)),n&&(i=!0,c=t.apply(d,l)),!i||p||u||(l=d=T),c}var l,u,c,f,d,p,h,g=0,v=!1,m=!0;if("function"!=typeof t)throw new Yo(z);if(e=e<0?0:+e||0,n===!0){var y=!0;m=!1}else Pi(n)&&(y=!!n.leading,v="maxWait"in n&&_a(+n.maxWait||0,e),m="trailing"in n?!!n.trailing:m);return s.cancel=r,s}function hi(t,e){if("function"!=typeof t||e&&"function"!=typeof e)throw new Yo(z);var n=function(){var r=arguments,i=e?e.apply(this,r):r[0],o=n.cache;if(o.has(i))return o.get(i);var a=t.apply(this,r);return n.cache=o.set(i,a),a};return n.cache=new hi.Cache,n}function gi(t){if("function"!=typeof t)throw new Yo(z);return function(){return!t.apply(this,arguments)}}function vi(t){return di(2,t)}function mi(t,e){if("function"!=typeof t)throw new Yo(z);return e=_a(e===T?t.length-1:+e||0,0),function(){for(var n=arguments,r=-1,i=_a(n.length-e,0),o=Ro(i);++r<i;)o[r]=n[e+r];switch(e){case 0:return t.call(this,o);case 1:return t.call(this,n[0],o);case 2:return t.call(this,n[0],n[1],o)}var a=Ro(e+1);for(r=-1;++r<e;)a[r]=n[r];return a[e]=o,t.apply(this,a)}}function yi(t){if("function"!=typeof t)throw new Yo(z);return function(e){return t.apply(this,e)}}function bi(t,e,n){var r=!0,i=!0;if("function"!=typeof t)throw new Yo(z);return n===!1?r=!1:Pi(n)&&(r="leading"in n?!!n.leading:r,i="trailing"in n?!!n.trailing:i),pi(t,e,{leading:r,maxWait:+e,trailing:i})}function wi(t,e){return e=null==e?Io:e,Hn(e,N,T,[t],[])}function xi(t,e,n,r){return e&&"boolean"!=typeof e&&Kn(t,e,n)?e=!1:"function"==typeof e&&(r=n,n=e,e=!1),"function"==typeof n?xe(t,e,an(n,r,1)):xe(t,e)}function _i(t,e,n){return"function"==typeof e?xe(t,!0,an(e,n,1)):xe(t,!0)}function Ci(t,e){return t>e}function Si(t,e){return t>=e}function Ti(t){return m(t)&&Jn(t)&&ea.call(t,"callee")&&!ca.call(t,"callee")}function ki(t){return t===!0||t===!1||m(t)&&ra.call(t)==G}function ji(t){return m(t)&&ra.call(t)==Q}function Ii(t){return!!t&&1===t.nodeType&&m(t)&&!Fi(t)}function Ei(t){return null==t||(Jn(t)&&(Es(t)||Wi(t)||Ti(t)||m(t)&&Di(t.splice))?!t.length:!Fs(t).length)}function Li(t,e,n,r){n="function"==typeof n?an(n,r,3):T;var i=n?n(t,e):T;return i===T?Oe(t,e,n):!!i}function Ai(t){return m(t)&&"string"==typeof t.message&&ra.call(t)==V}function Ni(t){return"number"==typeof t&&wa(t)}function Di(t){return Pi(t)&&ra.call(t)==Y}function Pi(t){var e=typeof t;return!!t&&("object"==e||"function"==e)}function Oi(t,e,n,r){return n="function"==typeof n?an(n,r,3):T,He(t,qn(e),n)}function Bi(t){return $i(t)&&t!=+t}function Hi(t){return null!=t&&(Di(t)?oa.test(ta.call(t)):m(t)&&Pt.test(t))}function Mi(t){return null===t}function $i(t){return"number"==typeof t||m(t)&&ra.call(t)==Z}function Fi(t){var e;if(!m(t)||ra.call(t)!=K||Ti(t)||!ea.call(t,"constructor")&&(e=t.constructor,"function"==typeof e&&!(e instanceof e)))return!1;var n;return Le(t,function(t,e){n=e}),n===T||ea.call(t,n)}function Ri(t){return Pi(t)&&ra.call(t)==tt}function Wi(t){return"string"==typeof t||m(t)&&ra.call(t)==nt}function zi(t){return m(t)&&nr(t.length)&&!!Wt[ra.call(t)]}function qi(t){return t===T}function Ui(t,e){return t<e}function Xi(t,e){return t<=e}function Gi(t){var e=t?Wa(t):0;
return nr(e)?e?te(t):[]:oo(t)}function Qi(t){return be(t,to(t))}function Vi(t,e,n){var r=Oa(t);return n&&Kn(t,e,n)&&(e=T),e?me(r,e):r}function Yi(t){return De(t,to(t))}function Ji(t,e,n){var r=null==t?T:Pe(t,dr(e),e+"");return r===T?n:r}function Zi(t,e){if(null==t)return!1;var n=ea.call(t,e);if(!n&&!tr(e)){if(e=dr(e),t=1==e.length?t:Pe(t,Qe(e,0,-1)),null==t)return!1;e=kr(e),n=ea.call(t,e)}return n||nr(t.length)&&Zn(e,t.length)&&(Es(t)||Ti(t))}function Ki(t,e,n){n&&Kn(t,e,n)&&(e=T);for(var r=-1,i=Fs(t),o=i.length,a={};++r<o;){var s=i[r],l=t[s];e?ea.call(a,l)?a[l].push(s):a[l]=[s]:a[l]=s}return a}function to(t){if(null==t)return[];Pi(t)||(t=Go(t));var e=t.length;e=e&&nr(e)&&(Es(t)||Ti(t))&&e||0;for(var n=t.constructor,r=-1,i="function"==typeof n&&n.prototype===t,o=Ro(e),a=e>0;++r<e;)o[r]=r+"";for(var s in t)a&&Zn(s,e)||"constructor"==s&&(i||!ea.call(t,s))||o.push(s);return o}function eo(t){t=fr(t);for(var e=-1,n=Fs(t),r=n.length,i=Ro(r);++e<r;){var o=n[e];i[e]=[o,t[o]]}return i}function no(t,e,n){var r=null==t?T:t[e];return r===T&&(null==t||tr(e,t)||(e=dr(e),t=1==e.length?t:Pe(t,Qe(e,0,-1)),r=null==t?T:t[kr(e)]),r=r===T?n:r),Di(r)?r.call(t):r}function ro(t,e,n){if(null==t)return t;var r=e+"";e=null!=t[r]||tr(e,t)?[r]:dr(e);for(var i=-1,o=e.length,a=o-1,s=t;null!=s&&++i<o;){var l=e[i];Pi(s)&&(i==a?s[l]=n:null==s[l]&&(s[l]=Zn(e[i+1])?[]:{})),s=s[l]}return t}function io(t,e,n,r){var i=Es(t)||zi(t);if(e=Rn(e,r,4),null==n)if(i||Pi(t)){var o=t.constructor;n=i?Es(t)?new o:[]:Oa(Di(o)?o.prototype:T)}else n={};return(i?ee:Ae)(t,function(t,r,i){return e(n,t,r,i)}),n}function oo(t){return tn(t,Fs(t))}function ao(t){return tn(t,to(t))}function so(t,e,n){return e=+e||0,n===T?(n=e,e=0):n=+n||0,t>=Ca(e,n)&&t<_a(e,n)}function lo(t,e,n){n&&Kn(t,e,n)&&(e=n=T);var r=null==t,i=null==e;if(null==n&&(i&&"boolean"==typeof t?(n=t,t=1):"boolean"==typeof e&&(n=e,i=!0)),r&&i&&(e=1,i=!1),t=+t||0,i?(e=t,t=0):e=+e||0,n||t%1||e%1){var o=ka();return Ca(t+o*(e-t+la("1e-"+((o+"").length-1))),e)}return Xe(t,e)}function uo(t){return t=s(t),t&&t.charAt(0).toUpperCase()+t.slice(1)}function co(t){return t=s(t),t&&t.replace(Bt,d).replace(Et,"")}function fo(t,e,n){t=s(t),e+="";var r=t.length;return n=n===T?r:Ca(n<0?0:+n||0,r),n-=e.length,n>=0&&t.indexOf(e,n)==n}function po(t){return t=s(t),t&&wt.test(t)?t.replace(yt,p):t}function ho(t){return t=s(t),t&&It.test(t)?t.replace(jt,h):t||"(?:)"}function go(t,e,n){t=s(t),e=+e;var r=t.length;if(r>=e||!wa(e))return t;var i=(e-r)/2,o=ya(i),a=va(i);return n=Dn("",a,n),n.slice(0,o)+t+n}function vo(t,e,n){return(n?Kn(t,e,n):null==e)?e=0:e&&(e=+e),t=wo(t),Ta(t,e||(Dt.test(t)?16:10))}function mo(t,e){var n="";if(t=s(t),e=+e,e<1||!t||!wa(e))return n;do e%2&&(n+=t),e=ya(e/2),t+=t;while(e);return n}function yo(t,e,n){return t=s(t),n=null==n?0:Ca(n<0?0:+n||0,t.length),t.lastIndexOf(e,n)==n}function bo(t,n,r){var i=e.templateSettings;r&&Kn(t,n,r)&&(n=r=T),t=s(t),n=ve(me({},r||n),i,ge);var o,a,l=ve(me({},n.imports),i.imports,ge),u=Fs(l),c=tn(l,u),f=0,d=n.interpolate||Ht,p="__p += '",h=Qo((n.escape||Ht).source+"|"+d.source+"|"+(d===Ct?At:Ht).source+"|"+(n.evaluate||Ht).source+"|$","g"),v="//# sourceURL="+("sourceURL"in n?n.sourceURL:"lodash.templateSources["+ ++Rt+"]")+"\n";t.replace(h,function(e,n,r,i,s,l){return r||(r=i),p+=t.slice(f,l).replace(Mt,g),n&&(o=!0,p+="' +\n__e("+n+") +\n'"),s&&(a=!0,p+="';\n"+s+";\n__p += '"),r&&(p+="' +\n((__t = ("+r+")) == null ? '' : __t) +\n'"),f=l+e.length,e}),p+="';\n";var m=n.variable;m||(p="with (obj) {\n"+p+"\n}\n"),p=(a?p.replace(ht,""):p).replace(gt,"$1").replace(vt,"$1;"),p="function("+(m||"obj")+") {\n"+(m?"":"obj || (obj = {});\n")+"var __t, __p = ''"+(o?", __e = _.escape":"")+(a?", __j = Array.prototype.join;\nfunction print() { __p += __j.call(arguments, '') }\n":";\n")+p+"return __p\n}";var y=Js(function(){return qo(u,v+"return "+p).apply(T,c)});if(y.source=p,Ai(y))throw y;return y}function wo(t,e,n){var r=t;return(t=s(t))?(n?Kn(r,e,n):null==e)?t.slice(x(t),_(t)+1):(e+="",t.slice(l(t,e),u(t,e)+1)):t}function xo(t,e,n){var r=t;return t=s(t),t?(n?Kn(r,e,n):null==e)?t.slice(x(t)):t.slice(l(t,e+"")):t}function _o(t,e,n){var r=t;return t=s(t),t?(n?Kn(r,e,n):null==e)?t.slice(0,_(t)+1):t.slice(0,u(t,e+"")+1):t}function Co(t,e,n){n&&Kn(t,e,n)&&(e=T);var r=B,i=H;if(null!=e)if(Pi(e)){var o="separator"in e?e.separator:o;r="length"in e?+e.length||0:r,i="omission"in e?s(e.omission):i}else r=+e||0;if(t=s(t),r>=t.length)return t;var a=r-i.length;if(a<1)return i;var l=t.slice(0,a);if(null==o)return l+i;if(Ri(o)){if(t.slice(a).search(o)){var u,c,f=t.slice(0,a);for(o.global||(o=Qo(o.source,(Nt.exec(o)||"")+"g")),o.lastIndex=0;u=o.exec(f);)c=u.index;l=l.slice(0,null==c?a:c)}}else if(t.indexOf(o,a)!=a){var d=l.lastIndexOf(o);d>-1&&(l=l.slice(0,d))}return l+i}function So(t){return t=s(t),t&&bt.test(t)?t.replace(mt,C):t}function To(t,e,n){return n&&Kn(t,e,n)&&(e=T),t=s(t),t.match(e||$t)||[]}function ko(t,e,n){return n&&Kn(t,e,n)&&(e=T),m(t)?Eo(t):we(t,e)}function jo(t){return function(){return t}}function Io(t){return t}function Eo(t){return $e(xe(t,!0))}function Lo(t,e){return Fe(t,xe(e,!0))}function Ao(t,e,n){if(null==n){var r=Pi(e),i=r?Fs(e):T,o=i&&i.length?De(e,i):T;(o?o.length:r)||(o=!1,n=e,e=t,t=this)}o||(o=De(e,Fs(e)));var a=!0,s=-1,l=Di(t),u=o.length;n===!1?a=!1:Pi(n)&&"chain"in n&&(a=n.chain);for(;++s<u;){var c=o[s],f=e[c];t[c]=f,l&&(t.prototype[c]=function(e){return function(){var n=this.__chain__;if(a||n){var r=t(this.__wrapped__),i=r.__actions__=te(this.__actions__);return i.push({func:e,args:arguments,thisArg:t}),r.__chain__=n,r}return e.apply(t,ue([this.value()],arguments))}}(f))}return t}function No(){return ne._=ia,this}function Do(){}function Po(t){return tr(t)?ze(t):qe(t)}function Oo(t){return function(e){return Pe(t,dr(e),e+"")}}function Bo(t,e,n){n&&Kn(t,e,n)&&(e=n=T),t=+t||0,n=null==n?1:+n||0,null==e?(e=t,t=0):e=+e||0;for(var r=-1,i=_a(va((e-t)/(n||1)),0),o=Ro(i);++r<i;)o[r]=t,t+=n;return o}function Ho(t,e,n){if(t=ya(t),t<1||!wa(t))return[];var r=-1,i=Ro(Ca(t,Ea));for(e=an(e,n,1);++r<t;)r<Ea?i[r]=e(r):e(r);return i}function Mo(t){var e=++na;return s(t)+e}function $o(t,e){return(+t||0)+(+e||0)}function Fo(t,e,n){return n&&Kn(t,e,n)&&(e=T),e=Rn(e,n,3),1==e.length?pe(Es(t)?t:cr(t),e):Ze(t,e)}t=t?re.defaults(ne.Object(),t,re.pick(ne,Ft)):ne;var Ro=t.Array,Wo=t.Date,zo=t.Error,qo=t.Function,Uo=t.Math,Xo=t.Number,Go=t.Object,Qo=t.RegExp,Vo=t.String,Yo=t.TypeError,Jo=Ro.prototype,Zo=Go.prototype,Ko=Vo.prototype,ta=qo.prototype.toString,ea=Zo.hasOwnProperty,na=0,ra=Zo.toString,ia=ne._,oa=Qo("^"+ta.call(ea).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),aa=t.ArrayBuffer,sa=t.clearTimeout,la=t.parseFloat,ua=Uo.pow,ca=Zo.propertyIsEnumerable,fa=Un(t,"Set"),da=t.setTimeout,pa=Jo.splice,ha=t.Uint8Array,ga=Un(t,"WeakMap"),va=Uo.ceil,ma=Un(Go,"create"),ya=Uo.floor,ba=Un(Ro,"isArray"),wa=t.isFinite,xa=Un(Go,"keys"),_a=Uo.max,Ca=Uo.min,Sa=Un(Wo,"now"),Ta=t.parseInt,ka=Uo.random,ja=Xo.NEGATIVE_INFINITY,Ia=Xo.POSITIVE_INFINITY,Ea=4294967295,La=Ea-1,Aa=Ea>>>1,Na=9007199254740991,Da=ga&&new ga,Pa={};e.support={};e.templateSettings={escape:xt,evaluate:_t,interpolate:Ct,variable:"",imports:{_:e}};var Oa=function(){function t(){}return function(e){if(Pi(e)){t.prototype=e;var n=new t;t.prototype=T}return n||{}}}(),Ba=dn(Ae),Ha=dn(Ne,!0),Ma=pn(),$a=pn(!0),Fa=Da?function(t,e){return Da.set(t,e),t}:Io,Ra=Da?function(t){return Da.get(t)}:Do,Wa=ze("length"),za=function(){var t=0,e=0;return function(n,r){var i=gs(),o=$-(i-e);if(e=i,o>0){if(++t>=M)return n}else t=0;return Fa(n,r)}}(),qa=mi(function(t,e){return m(t)&&Jn(t)?Ce(t,Ee(e,!1,!0)):[]}),Ua=_n(),Xa=_n(!0),Ga=mi(function(t){for(var e=t.length,n=e,r=Ro(f),i=zn(),a=i==o,s=[];n--;){var l=t[n]=Jn(l=t[n])?l:[];r[n]=a&&l.length>=120?gn(n&&l):null}var u=t[0],c=-1,f=u?u.length:0,d=r[0];t:for(;++c<f;)if(l=u[c],(d?Jt(d,l):i(s,l,0))<0){for(var n=e;--n;){var p=r[n];if((p?Jt(p,l):i(t[n],l,0))<0)continue t}d&&d.push(l),s.push(l)}return s}),Qa=mi(function(t,e){e=Ee(e);var n=ye(t,e);return Ue(t,e.sort(r)),n}),Va=Bn(),Ya=Bn(!0),Ja=mi(function(t){return Ke(Ee(t,!1,!0))}),Za=mi(function(t,e){return Jn(t)?Ce(t,e):[]}),Ka=mi(Hr),ts=mi(function(t){var e=t.length,n=e>2?t[e-2]:T,r=e>1?t[e-1]:T;return e>2&&"function"==typeof n?e-=2:(n=e>1&&"function"==typeof r?(--e,r):T,r=T),t.length=e,Mr(t,n,r)}),es=mi(function(t){return t=Ee(t),this.thru(function(e){return Kt(Es(e)?e:[fr(e)],t)})}),ns=mi(function(t,e){return ye(t,Ee(e))}),rs=cn(function(t,e,n){ea.call(t,n)?++t[n]:t[n]=1}),is=xn(Ba),os=xn(Ha,!0),as=Tn(ee,Ba),ss=Tn(ie,Ha),ls=cn(function(t,e,n){ea.call(t,n)?t[n].push(e):t[n]=[e]}),us=cn(function(t,e,n){t[n]=e}),cs=mi(function(t,e,n){var r=-1,i="function"==typeof e,o=tr(e),a=Jn(t)?Ro(t.length):[];return Ba(t,function(t){var s=i?e:o&&null!=t?t[e]:T;a[++r]=s?s.apply(t,n):Yn(t,e,n)}),a}),fs=cn(function(t,e,n){t[n?0:1].push(e)},function(){return[[],[]]}),ds=An(ce,Ba),ps=An(fe,Ha),hs=mi(function(t,e){if(null==t)return[];var n=e[2];return n&&Kn(e[0],e[1],n)&&(e.length=1),Je(t,Ee(e),[])}),gs=Sa||function(){return(new Wo).getTime()},vs=mi(function(t,e,n){var r=j;if(n.length){var i=b(n,vs.placeholder);r|=N}return Hn(t,r,e,n,i)}),ms=mi(function(t,e){e=e.length?Ee(e):Yi(t);for(var n=-1,r=e.length;++n<r;){var i=e[n];t[i]=Hn(t[i],j,t)}return t}),ys=mi(function(t,e,n){var r=j|I;if(n.length){var i=b(n,ys.placeholder);r|=N}return Hn(e,r,t,n,i)}),bs=yn(L),ws=yn(A),xs=mi(function(t,e){return _e(t,1,e)}),_s=mi(function(t,e,n){return _e(t,e,n)}),Cs=Sn(),Ss=Sn(!0),Ts=mi(function(t,e){if(e=Ee(e),"function"!=typeof t||!oe(e,a))throw new Yo(z);var n=e.length;return mi(function(r){for(var i=Ca(r.length,n);i--;)r[i]=e[i](r[i]);return t.apply(this,r)})}),ks=Ln(N),js=Ln(D),Is=mi(function(t,e){return Hn(t,O,T,T,T,Ee(e))}),Es=ba||function(t){return m(t)&&nr(t.length)&&ra.call(t)==X},Ls=fn(Re),As=fn(function(t,e,n){return n?ve(t,e,n):me(t,e)}),Ns=bn(As,he),Ds=bn(Ls,or),Ps=Cn(Ae),Os=Cn(Ne),Bs=kn(Ma),Hs=kn($a),Ms=jn(Ae),$s=jn(Ne),Fs=xa?function(t){var e=null==t?T:t.constructor;return"function"==typeof e&&e.prototype===t||"function"!=typeof t&&Jn(t)?ur(t):Pi(t)?xa(t):[]}:ur,Rs=In(!0),Ws=In(),zs=mi(function(t,e){if(null==t)return{};if("function"!=typeof e[0]){var e=le(Ee(e),Vo);return ar(t,Ce(to(t),e))}var n=an(e[0],e[1],3);return sr(t,function(t,e,r){return!n(t,e,r)})}),qs=mi(function(t,e){return null==t?{}:"function"==typeof e[0]?sr(t,an(e[0],e[1],3)):ar(t,Ee(e))}),Us=vn(function(t,e,n){return e=e.toLowerCase(),t+(n?e.charAt(0).toUpperCase()+e.slice(1):e)}),Xs=vn(function(t,e,n){return t+(n?"-":"")+e.toLowerCase()}),Gs=En(),Qs=En(!0),Vs=vn(function(t,e,n){return t+(n?"_":"")+e.toLowerCase()}),Ys=vn(function(t,e,n){return t+(n?" ":"")+(e.charAt(0).toUpperCase()+e.slice(1))}),Js=mi(function(t,e){try{return t.apply(T,e)}catch(n){return Ai(n)?n:new zo(n)}}),Zs=mi(function(t,e){return function(n){return Yn(n,t,e)}}),Ks=mi(function(t,e){return function(n){return Yn(t,n,e)}}),tl=On("ceil"),el=On("floor"),nl=wn(Ci,ja),rl=wn(Ui,Ia),il=On("round");return e.prototype=n.prototype,y.prototype=Oa(n.prototype),y.prototype.constructor=y,J.prototype=Oa(n.prototype),J.prototype.constructor=J,Ut.prototype["delete"]=Xt,Ut.prototype.get=Gt,Ut.prototype.has=Qt,Ut.prototype.set=Vt,Yt.prototype.push=Zt,hi.Cache=Ut,e.after=ci,e.ary=fi,e.assign=As,e.at=ns,e.before=di,e.bind=vs,e.bindAll=ms,e.bindKey=ys,e.callback=ko,e.chain=Rr,e.chunk=hr,e.compact=gr,e.constant=jo,e.countBy=rs,e.create=Vi,e.curry=bs,e.curryRight=ws,e.debounce=pi,e.defaults=Ns,e.defaultsDeep=Ds,e.defer=xs,e.delay=_s,e.difference=qa,e.drop=vr,e.dropRight=mr,e.dropRightWhile=yr,e.dropWhile=br,e.fill=wr,e.filter=Jr,e.flatten=_r,e.flattenDeep=Cr,e.flow=Cs,e.flowRight=Ss,e.forEach=as,e.forEachRight=ss,e.forIn=Bs,e.forInRight=Hs,e.forOwn=Ms,e.forOwnRight=$s,e.functions=Yi,e.groupBy=ls,e.indexBy=us,e.initial=Tr,e.intersection=Ga,e.invert=Ki,e.invoke=cs,e.keys=Fs,e.keysIn=to,e.map=ti,e.mapKeys=Rs,e.mapValues=Ws,e.matches=Eo,e.matchesProperty=Lo,e.memoize=hi,e.merge=Ls,e.method=Zs,e.methodOf=Ks,e.mixin=Ao,e.modArgs=Ts,e.negate=gi,e.omit=zs,e.once=vi,e.pairs=eo,e.partial=ks,e.partialRight=js,e.partition=fs,e.pick=qs,e.pluck=ei,e.property=Po,e.propertyOf=Oo,e.pull=Ir,e.pullAt=Qa,e.range=Bo,e.rearg=Is,e.reject=ni,e.remove=Er,e.rest=Lr,e.restParam=mi,e.set=ro,e.shuffle=ii,e.slice=Ar,e.sortBy=si,e.sortByAll=hs,e.sortByOrder=li,e.spread=yi,e.take=Nr,e.takeRight=Dr,e.takeRightWhile=Pr,e.takeWhile=Or,e.tap=Wr,e.throttle=bi,e.thru=zr,e.times=Ho,e.toArray=Gi,e.toPlainObject=Qi,e.transform=io,e.union=Ja,e.uniq=Br,e.unzip=Hr,e.unzipWith=Mr,e.values=oo,e.valuesIn=ao,e.where=ui,e.without=Za,e.wrap=wi,e.xor=$r,e.zip=Ka,e.zipObject=Fr,e.zipWith=ts,e.backflow=Ss,e.collect=ti,e.compose=Ss,e.each=as,e.eachRight=ss,e.extend=As,e.iteratee=ko,e.methods=Yi,e.object=Fr,e.select=Jr,e.tail=Lr,e.unique=Br,Ao(e,e),e.add=$o,e.attempt=Js,e.camelCase=Us,e.capitalize=uo,e.ceil=tl,e.clone=xi,e.cloneDeep=_i,e.deburr=co,e.endsWith=fo,e.escape=po,e.escapeRegExp=ho,e.every=Yr,e.find=is,e.findIndex=Ua,e.findKey=Ps,e.findLast=os,e.findLastIndex=Xa,e.findLastKey=Os,e.findWhere=Zr,e.first=xr,e.floor=el,e.get=Ji,e.gt=Ci,e.gte=Si,e.has=Zi,e.identity=Io,e.includes=Kr,e.indexOf=Sr,e.inRange=so,e.isArguments=Ti,e.isArray=Es,e.isBoolean=ki,e.isDate=ji,e.isElement=Ii,e.isEmpty=Ei,e.isEqual=Li,e.isError=Ai,e.isFinite=Ni,e.isFunction=Di,e.isMatch=Oi,e.isNaN=Bi,e.isNative=Hi,e.isNull=Mi,e.isNumber=$i,e.isObject=Pi,e.isPlainObject=Fi,e.isRegExp=Ri,e.isString=Wi,e.isTypedArray=zi,e.isUndefined=qi,e.kebabCase=Xs,e.last=kr,e.lastIndexOf=jr,e.lt=Ui,e.lte=Xi,e.max=nl,e.min=rl,e.noConflict=No,e.noop=Do,e.now=gs,e.pad=go,e.padLeft=Gs,e.padRight=Qs,e.parseInt=vo,e.random=lo,e.reduce=ds,e.reduceRight=ps,e.repeat=mo,e.result=no,e.round=il,e.runInContext=S,e.size=oi,e.snakeCase=Vs,e.some=ai,e.sortedIndex=Va,e.sortedLastIndex=Ya,e.startCase=Ys,e.startsWith=yo,e.sum=Fo,e.template=bo,e.trim=wo,e.trimLeft=xo,e.trimRight=_o,e.trunc=Co,e.unescape=So,e.uniqueId=Mo,e.words=To,e.all=Yr,e.any=ai,e.contains=Kr,e.eq=Li,e.detect=is,e.foldl=ds,e.foldr=ps,e.head=xr,e.include=Kr,e.inject=ds,Ao(e,function(){var t={};return Ae(e,function(n,r){e.prototype[r]||(t[r]=n)}),t}(),!1),e.sample=ri,e.prototype.sample=function(t){return this.__chain__||null!=t?this.thru(function(e){return ri(e,t)}):ri(this.value())},e.VERSION=k,ee(["bind","bindKey","curry","curryRight","partial","partialRight"],function(t){e[t].placeholder=e}),ee(["drop","take"],function(t,e){J.prototype[t]=function(n){var r=this.__filtered__;if(r&&!e)return new J(this);n=null==n?1:_a(ya(n)||0,0);var i=this.clone();return r?i.__takeCount__=Ca(i.__takeCount__,n):i.__views__.push({size:n,type:t+(i.__dir__<0?"Right":"")}),i},J.prototype[t+"Right"]=function(e){return this.reverse()[t](e).reverse()}}),ee(["filter","map","takeWhile"],function(t,e){var n=e+1,r=n!=W;J.prototype[t]=function(t,e){var i=this.clone();return i.__iteratees__.push({iteratee:Rn(t,e,1),type:n}),i.__filtered__=i.__filtered__||r,i}}),ee(["first","last"],function(t,e){var n="take"+(e?"Right":"");J.prototype[t]=function(){return this[n](1).value()[0]}}),ee(["initial","rest"],function(t,e){var n="drop"+(e?"":"Right");J.prototype[t]=function(){return this.__filtered__?new J(this):this[n](1)}}),ee(["pluck","where"],function(t,e){var n=e?"filter":"map",r=e?$e:Po;J.prototype[t]=function(t){return this[n](r(t))}}),J.prototype.compact=function(){return this.filter(Io)},J.prototype.reject=function(t,e){return t=Rn(t,e,1),this.filter(function(e){return!t(e)})},J.prototype.slice=function(t,e){t=null==t?0:+t||0;var n=this;return n.__filtered__&&(t>0||e<0)?new J(n):(t<0?n=n.takeRight(-t):t&&(n=n.drop(t)),e!==T&&(e=+e||0,n=e<0?n.dropRight(-e):n.take(e-t)),n)},J.prototype.takeRightWhile=function(t,e){return this.reverse().takeWhile(t,e).reverse()},J.prototype.toArray=function(){return this.take(Ia)},Ae(J.prototype,function(t,n){var r=/^(?:filter|map|reject)|While$/.test(n),i=/^(?:first|last)$/.test(n),o=e[i?"take"+("last"==n?"Right":""):n];o&&(e.prototype[n]=function(){var e=i?[1]:arguments,n=this.__chain__,a=this.__wrapped__,s=!!this.__actions__.length,l=a instanceof J,u=e[0],c=l||Es(a);c&&r&&"function"==typeof u&&1!=u.length&&(l=c=!1);var f=function(t){return i&&n?o(t,1)[0]:o.apply(T,ue([t],e))},d={func:zr,args:[f],thisArg:T},p=l&&!s;if(i&&!n)return p?(a=a.clone(),a.__actions__.push(d),t.call(a)):o.call(T,this.value())[0];if(!i&&c){a=p?a:new J(this);var h=t.apply(a,e);return h.__actions__.push(d),new y(h,n)}return this.thru(f)})}),ee(["join","pop","push","replace","shift","sort","splice","split","unshift"],function(t){var n=(/^(?:replace|split)$/.test(t)?Ko:Jo)[t],r=/^(?:push|sort|unshift)$/.test(t)?"tap":"thru",i=/^(?:join|pop|replace|shift)$/.test(t);e.prototype[t]=function(){var t=arguments;return i&&!this.__chain__?n.apply(this.value(),t):this[r](function(e){return n.apply(e,t)})}}),Ae(J.prototype,function(t,n){var r=e[n];if(r){var i=r.name,o=Pa[i]||(Pa[i]=[]);o.push({name:n,func:r})}}),Pa[Nn(T,I).name]=[{name:"wrapper",func:T}],J.prototype.clone=et,J.prototype.reverse=rt,J.prototype.value=qt,e.prototype.chain=qr,e.prototype.commit=Ur,e.prototype.concat=es,e.prototype.plant=Xr,e.prototype.reverse=Gr,e.prototype.toString=Qr,e.prototype.run=e.prototype.toJSON=e.prototype.valueOf=e.prototype.value=Vr,e.prototype.collect=e.prototype.map,e.prototype.head=e.prototype.first,e.prototype.select=e.prototype.filter,e.prototype.tail=e.prototype.rest,e}var T,k="3.10.1",j=1,I=2,E=4,L=8,A=16,N=32,D=64,P=128,O=256,B=30,H="...",M=150,$=16,F=200,R=1,W=2,z="Expected a function",q="__lodash_placeholder__",U="[object Arguments]",X="[object Array]",G="[object Boolean]",Q="[object Date]",V="[object Error]",Y="[object Function]",J="[object Map]",Z="[object Number]",K="[object Object]",tt="[object RegExp]",et="[object Set]",nt="[object String]",rt="[object WeakMap]",it="[object ArrayBuffer]",ot="[object Float32Array]",at="[object Float64Array]",st="[object Int8Array]",lt="[object Int16Array]",ut="[object Int32Array]",ct="[object Uint8Array]",ft="[object Uint8ClampedArray]",dt="[object Uint16Array]",pt="[object Uint32Array]",ht=/\b__p \+= '';/g,gt=/\b(__p \+=) '' \+/g,vt=/(__e\(.*?\)|\b__t\)) \+\n'';/g,mt=/&(?:amp|lt|gt|quot|#39|#96);/g,yt=/[&<>"'`]/g,bt=RegExp(mt.source),wt=RegExp(yt.source),xt=/<%-([\s\S]+?)%>/g,_t=/<%([\s\S]+?)%>/g,Ct=/<%=([\s\S]+?)%>/g,St=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\n\\]|\\.)*?\1)\]/,Tt=/^\w*$/,kt=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\n\\]|\\.)*?)\2)\]/g,jt=/^[:!,]|[\\^$.*+?()[\]{}|\/]|(^[0-9a-fA-Fnrtuvx])|([\n\r\u2028\u2029])/g,It=RegExp(jt.source),Et=/[\u0300-\u036f\ufe20-\ufe23]/g,Lt=/\\(\\)?/g,At=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,Nt=/\w*$/,Dt=/^0[xX]/,Pt=/^\[object .+?Constructor\]$/,Ot=/^\d+$/,Bt=/[\xc0-\xd6\xd8-\xde\xdf-\xf6\xf8-\xff]/g,Ht=/($^)/,Mt=/['\n\r\u2028\u2029\\]/g,$t=function(){var t="[A-Z\\xc0-\\xd6\\xd8-\\xde]",e="[a-z\\xdf-\\xf6\\xf8-\\xff]+";return RegExp(t+"+(?="+t+e+")|"+t+"?"+e+"|"+t+"+|[0-9]+","g")}(),Ft=["Array","ArrayBuffer","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Math","Number","Object","RegExp","Set","String","_","clearTimeout","isFinite","parseFloat","parseInt","setTimeout","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap"],Rt=-1,Wt={};Wt[ot]=Wt[at]=Wt[st]=Wt[lt]=Wt[ut]=Wt[ct]=Wt[ft]=Wt[dt]=Wt[pt]=!0,Wt[U]=Wt[X]=Wt[it]=Wt[G]=Wt[Q]=Wt[V]=Wt[Y]=Wt[J]=Wt[Z]=Wt[K]=Wt[tt]=Wt[et]=Wt[nt]=Wt[rt]=!1;var zt={};zt[U]=zt[X]=zt[it]=zt[G]=zt[Q]=zt[ot]=zt[at]=zt[st]=zt[lt]=zt[ut]=zt[Z]=zt[K]=zt[tt]=zt[nt]=zt[ct]=zt[ft]=zt[dt]=zt[pt]=!0,zt[V]=zt[Y]=zt[J]=zt[et]=zt[rt]=!1;var qt={"À":"A","Á":"A","Â":"A","Ã":"A","Ä":"A","Å":"A","à":"a","á":"a","â":"a","ã":"a","ä":"a","å":"a","Ç":"C","ç":"c","Ð":"D","ð":"d","È":"E","É":"E","Ê":"E","Ë":"E","è":"e","é":"e","ê":"e","ë":"e","Ì":"I","Í":"I","Î":"I","Ï":"I","ì":"i","í":"i","î":"i","ï":"i","Ñ":"N","ñ":"n","Ò":"O","Ó":"O","Ô":"O","Õ":"O","Ö":"O","Ø":"O","ò":"o","ó":"o","ô":"o","õ":"o","ö":"o","ø":"o","Ù":"U","Ú":"U","Û":"U","Ü":"U","ù":"u","ú":"u","û":"u","ü":"u","Ý":"Y","ý":"y","ÿ":"y","Æ":"Ae","æ":"ae","Þ":"Th","þ":"th","ß":"ss"},Ut={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;","`":"&#96;"},Xt={"&amp;":"&","&lt;":"<","&gt;":">","&quot;":'"',"&#39;":"'","&#96;":"`"},Gt={"function":!0,object:!0},Qt={0:"x30",1:"x31",2:"x32",3:"x33",4:"x34",5:"x35",6:"x36",7:"x37",8:"x38",9:"x39",A:"x41",B:"x42",C:"x43",D:"x44",E:"x45",F:"x46",a:"x61",b:"x62",c:"x63",d:"x64",e:"x65",f:"x66",n:"x6e",r:"x72",t:"x74",u:"x75",v:"x76",x:"x78"},Vt={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},Yt=Gt[typeof n]&&n&&!n.nodeType&&n,Jt=Gt[typeof e]&&e&&!e.nodeType&&e,Zt=Yt&&Jt&&"object"==typeof t&&t&&t.Object&&t,Kt=Gt[typeof self]&&self&&self.Object&&self,te=Gt[typeof window]&&window&&window.Object&&window,ee=Jt&&Jt.exports===Yt&&Yt,ne=Zt||te!==(this&&this.window)&&te||Kt||this,re=S();"function"==typeof define&&"object"==typeof define.amd&&define.amd?(ne._=re,define(function(){return re})):Yt&&Jt?ee?(Jt.exports=re)._=re:Yt._=re:ne._=re}).call(this)}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],3:[function(t,e,n){function r(){m(window).trigger("Scripts/Behavior"),a(),u(),c(),f(),l(),s(),o(),g(),p(),h(),i(),v(),y.support.IS_TABLET&&d()}function i(){m(".nav-location-search").on("submit",function(t){t.preventDefault();var e=m(this),n=e.find("input.search").val(),r=m("input[name='nav-search-type']:checked").val(),i=b.locations.locationUrl+"?stype="+r+"#"+n;window.location.href=i,window.location.pathname===i&&window.location.reload()})}function o(){m("[data-mobile-menu-toggle]").on("click",function(t){t.preventDefault();var e=m("[data-mobile-active]").first(),n="true"===e.attr("data-mobile-active")?"false":"true",r=(m(".mobile-nav"),0);e.attr("data-mobile-active",n),"true"===n?(r=x.scrollTop(),x.addClass("no-scroll fixed").css("top",-r),_.addClass("no-scroll")):(x.removeClass("no-scroll fixed").off(".mobile-nav").css("top",0),_.removeClass("no-scroll"))}),m("[data-mobile-sublink]").on("click",function(t){t.preventDefault();var e=m(this),n="true"===e.attr("data-active")?"false":"true",r=e.closest(".submenu");r.length||(r=e.closest(".mobile-nav")),"true"===n?(r.scrollTop(0),r.css("overflow","hidden")):r.removeAttr("style"),e.attr("data-active",n)}),m("[data-mobile-back]").on("click",function(t){t.preventDefault();var e=m(this),n=e.parent().parent().find("[data-mobile-sublink]").first();n.trigger("click")})}function a(){var t=m("[data-toggle]");t.length>0&&t.each(function(){var t=m(this),e=m('[data-toggled-by="'+t.data("toggle")+'"]').first();t.on("click",function(){e.toggleClass("display-none")})})}function s(){m("[data-a11y-focus], .menu-block").on("focusin",function(){m(this).attr("data-a11y-focus","true")}),m("[data-a11y-focus], .menu-block").on("focusout",function(){m(this).attr("data-a11y-focus","false")})}function l(){var t=window.location.href;m(".fb-share-button").attr("data-href",t),m(".twitter-share-button").attr("href",t)}function u(){m("[data-back-button]").on("click",function(t){t.preventDefault(),window.history.back()})}function c(){m("[data-order-now-button]").on("click",function(t){t.preventDefault();var e=m(this).attr("data-order-now-button");if("false"!==e){var n=y.favoriteId?y.favoriteId:y.closest;n="undefined"!=typeof n&&"0"!==n?"?storeid="+n:"";var r=b.locations.onlineOrderUrl;w.track("Menu","Menu-Clicked","Online Ordering"),window.open(r)}})}function f(){m(".button.inactive").on("click keypress",function(t){t.preventDefault()})}function d(){var t=!1;m(".submenu-link .info-container [data-order-now-button]").attr("data-order-now-button","false"),m(".submenu-link .anchor, .submenu-link .info-container [data-order-now-button]").each(function(){var e=m(this);if("undefined"!=typeof e.attr("data-ga-event-menu")){var n=e.attr("data-ga-event-menu");e.attr("data-ga-event-dropdown-menu",n),e.off("click"),e.removeAttr("data-ga-event-menu")}e.on("click touchstart MSPointerDown",function(n){if(e!==t)n.preventDefault(),e.focus(),t=e,"undefined"!=typeof e.attr("data-order-now-button")?e.attr("data-order-now-button","true"):m(".submenu-link .info-container [data-order-now-button]").attr("data-order-now-button","false");else if("undefined"!=typeof e.attr("data-ga-event-dropdown-menu")){n.preventDefault();var r=e.attr("data-ga-event-dropdown-menu"),i=e.attr("href");w.track("Menu","Menu-Clicked",r,function(){window.location.href=i})}})})}function p(){m(".side-nav button.submenu-toggle").on("click",function(t){var e=m(this),n=e.closest("li");n.attr("data-open","false"===n.attr("data-open")?"true":"false")})}function h(){m(".main-nav .submenu-link").on("mouseenter",function(t){m(this).attr("data-open","true")}),m(".main-nav .submenu-link").on("mouseleave",function(t){m(this).attr("data-open","false")}),m("button.toggle-submenu").on("click",function(t){t.preventDefault(),m(this).blur(),m(this).closest(".submenu-link").attr("data-open","false")})}function g(){var t=m(".main-nav").first().next();m("[data-skip-to-content]").on("click",function(e){e.preventDefault(),t.attr("tabindex","0"),t.focus(),t.blur(function(){t.removeAttr("tabindex")})})}function v(){var t=m("input.js-lang-changer");t.off("change.lang").on("change.lang",function(){var t=m(this),e=t.attr("name"),n=m('[name="'+e+'"]').filter(":checked").val(),r=t.closest("tr").find(".js-lang-change");r.attr("href",r.attr("data-"+n+"-href"))})}var m=window.jQuery,y=window.PX||{},b=t("./settings.js"),w=t("./helpers/analytics.js"),x=m("body").first(),_=m("html").first();y._toggleLangInit=v,e.exports={init:r}},{"./helpers/analytics.js":11,"./settings.js":26}],4:[function(t,e,n){"use strict";function r(t,e){var n=t;return t<0&&(n=e-1),t>=e&&(n=0),n}function i(){var t=o(".carousel"),e=null;a.carousels=[],t.each(function(){e=Object.create(l),e.init(o(this)),a.carousels.push(e)})}var o=window.jQuery,a=window.PX||{},s=t("lodash"),l={$el:null,activeIndex:0,newIndex:0,slides:[],len:0,timer:5e3,interval:null,slideHeight:null,init:function(t){var e=this,n=t.find(".main-feature-banner"),r=t.attr("data-carousel-timer");e.$el=t,e.slides=[],e.interval=null,e.len=n.length,n.length&&n.each(function(){e.slides.push(o(this))}),"undefined"!=typeof r&&(e.timer=1e3*r),o(window).on("Resize/Stop",function(){e.setHeight()}).on("blur",function(){e.stop()}).on("focus",function(){e.start()}),e.setHeight(),e.goTo(e.activeIndex),e.start()},setHeight:function(){var t=this;s.forEach(t.slides,function(e){e.css({position:"relative",height:"auto"}),e.outerHeight()>t.slideHeight&&(t.slideHeight=e.outerHeight())}),t.$el.css("height",t.slideHeight+"px"),s.forEach(t.slides,function(e){e.css({position:"",height:t.slideHeight+"px"})})},goTo:function(t){var e,n,i=this;i.newIndex=r(t,i.len),i.activeIndex=r(i.activeIndex,i.len),e=i.slides[i.newIndex],n=i.slides[i.activeIndex],s.forEach(i.slides,function(t){t.attr("data-ui-transition","off"),t.attr("aria-hidden","true")}),n.attr("data-ui-transition","out"),e.attr("data-ui-transition","in"),e.attr("aria-hidden","false"),i.activeIndex=i.newIndex},start:function(){var t=this;t.interval&&t.stop(),t.interval=setInterval(function(){t.goTo(t.activeIndex+1)},t.timer)},stop:function(){var t=this;clearInterval(t.interval),t.interval=null}};e.exports.init=i},{lodash:2}],5:[function(t,e,n){function r(t){this.self=t,this.initOffset=t.offset(),this.initialized=!1}var i=window.jQuery;r.prototype.resize=function(){var t=this.self.parent().offset().left,e=this.self.parent().width()-30;this.self.css({width:e,left:t})},r.prototype.init=function(){var t=this;i(window).on("scrollStart",function(){var e=i(window).scrollTop();e+100>t.initOffset.top?(t.self.attr("data-state","fixed"),t.resize()):t.self.attr("data-state","relative").removeAttr("style")}),i(window).on("resizeStart",function(){t.resize()})},e.exports=r},{}],6:[function(t,e,n){function r(t,e){this.$self=t,this.imgUrl=this.$self.attr("data-bg-cover"),this.img=i('<div data-bg-img="'+e+'"><img src="'+this.imgUrl+'"></div>'),this.size={height:this.$self.outerHeight(),width:this.$self.outerWidth()},this.selfRatio=this.size.height/this.size.width,this.index=e}var i=window.jQuery;r.prototype.init=function(){this.$div=i('[data-bg-img="'+this.index+'"]').first(),this.$div.length<1&&(this.$self.prepend(this.img),this.$div=i('[data-bg-img="'+this.index+'"]').first()),this.$img=this.$div.find("img").first();var t=this.$img.height()/this.$img.width(),e=t<this.selfRatio?"100%":"auto",n=t<this.selfRatio?"auto":"100%";"static"===this.$self.css("position")&&this.$self.css("position","relative"),this.$self.css({background:"none !important"}),this.$div.css({display:"block",width:"100%",height:this.size.height+"px",overflow:"hidden","z-index":"0",position:"absolute",top:0,left:0}),this.$img.css({position:"absolute",top:0,left:0,"z-index":0,height:e,width:n})},e.exports=r},{}],7:[function(t,e,n){function r(t){this.name=t,this.visible=!1,this.$trigger=i('[data-modal-trigger="'+t+'"]'),this.$modal=i('[data-modal="'+t+'"]')}var i=window.jQuery,o=window.PX||{};r.prototype.init=function(){var t=this;i("[data-modal-overlay]").length<1&&i(".wrapper").after('<div class="modal-overlay" data-modal-overlay data-state="hidden"></div>'),i("[data-modal-overlay], [data-modal-close]").on("click",function(e){e.preventDefault(),t.close()}),this.$modal.attr("data-state","hidden"),this.$trigger.on("click",function(e){e.preventDefault(),t.open(this)})},r.prototype.open=function(t){var e=i("[data-modal-overlay]").first(),n=this.$modal.find("a[href], button")[0];this.$modal.attr("data-state","visible"),e.attr("data-state","visible"),this.$modal.data("open-trigger",t),this.visible=!0,o.support.IS_IE8&&e.parents().addClass("z").removeClass("z"),n&&setTimeout(function(){n.focus()},10)},r.prototype.close=function(){var t=i("[data-modal-overlay]").first(),e=this.$modal.data("open-trigger");this.$modal.attr("data-state","hidden"),t.attr("data-state","hidden"),this.visible=!1,e&&(setTimeout(function(){e.focus()},10),this.$modal.data("open-trigger",null))},e.exports=r},{}],8:[function(t,e,n){function r(t){this.self=t,this.selfTop=t.offset().top,this.selfHeight=t.height()}var i=window.jQuery;r.prototype.init=function(){var t=i("<div></div>").addClass("sticky-placeholder"),e=this;e.self.before(t),e.$placeholder=e.self.prev(".sticky-placeholder"),i(window).on("scrollStart",function(t,n){n>e.selfTop&&(e.self.attr("data-sticky","true"),e.$placeholder.height(e.selfHeight)),n<=e.selfTop+1&&(e.self.attr("data-sticky","false"),e.$placeholder.height(0))})},e.exports=r},{}],9:[function(t,e,n){function r(t){this.$el=t,this.imgSrc={sm:t.attr("data-sm-bg"),lg:t.attr("data-lg-bg")},this.hasSmallImage="string"==typeof this.imgSrc.sm&&this.imgSrc.sm.length>0,this.hasLargeImage="string"==typeof this.imgSrc.lg&&this.imgSrc.lg.length>0,this.hasBothImages=this.hasSmallImage&&this.hasLargeImage,this.hasNoImages=!this.hasSmallImage&&!this.hasLargeImage,this.img}function i(){a.length&&a.each(function(){var t=o(this),e=new r(t);e.init()})}var o=window.jQuery,a=o("[data-sm-bg], [data-lg-bg]"),s=o(window).width();r.prototype.showCorrectImage=function(){var t=this;if(s=o(window).width(),t.hasBothImages)t.img=s<768?t.imgSrc.sm:t.imgSrc.lg;else if(t.hasSmallImage)t.img=t.imgSrc.sm;else{if(!t.hasLargeImage)return!1;t.img=t.imgSrc.lg}"undefined"!=typeof t.img&&t.img.length&&t.$el.css({"background-image":"url("+t.img+")"})},r.prototype.init=function(){var t=this;t.showCorrectImage(),o(window).on("resizeStop",function(){t.showCorrectImage()})},e.exports.init=i},{}],10:[function(t,e,n){function r(){f(window).trigger("Scripts/Formatting"),i(),a(),o(),s(),c(),u(),d.support.IS_IE8&&l()}function i(){f("[data-equal-height]").each(function(){var t=f(this),e=t.children(),n=0;e.each(function(){var t=f(this);t.height()>n&&(n=t.height())}),e.each(function(){f(this).height(n)})})}function o(){f("[data-sticky]").each(function(){var t=f(this),e=new v(t);e.init()})}function a(){var t=f(".follow-box");t.length>0&&t.each(function(){
var t=new h(f(this));t.init()})}function s(){var t=f("[data-modal]");t.length>0&&t.each(function(){var t=f(this).data("modal"),e=new p(t);e.init()})}function l(){var t=f("[data-bg-cover]");t.each(function(t){var e=f(this),n=new g(e,t);n.init()})}function u(){if(d.support.IS_MOBILE){var t=f("body");f(document).on("focus","input, textarea",function(){t.addClass("mobile-input-focused")}),f(document).on("blur","input, textarea",function(){t.removeClass("mobile-input-focused")})}}function c(){d.bodyTop=0,f(window).on("Body-Prevent-Scroll",function(){d.bodyTop=f("body").scrollTop(),f("body").css({overflow:"hidden",position:"fixed"}),f(".wrapper").css({top:-d.bodyTop})}),f(window).on("Body-Resume-Scroll",function(){f(".wrapper").removeAttr("style"),f("body").removeAttr("style").scrollTop(d.bodyTop)})}var f=window.jQuery,d=window.PX||{},p=t("./classes/modal.js"),h=t("./classes/follow-box.js"),g=t("./classes/ie-bg-image.js"),v=t("./classes/sticky.js");n.init=r},{"./classes/follow-box.js":5,"./classes/ie-bg-image.js":6,"./classes/modal.js":7,"./classes/sticky.js":8}],11:[function(t,e,n){function r(t,e,n,r){r=r||!1,r&&r(),dataLayer.push({event:"gaEvent","ga.category":t,"ga.action":e,"ga.label":n})}function i(){var t=l("[data-ga-event-view-item]").first();if(t.length>0){var e=t.attr("data-ga-event-view-item");r("Menu","ViewItem",e)}}function o(){l("[data-ga-event-menu]").on("click",function(t){t.preventDefault();var e=l(this).attr("data-ga-event-menu"),n=l(this).is("a")?l(this).attr("href"):l(this).find("a").attr("href");r("Menu","Menu-Clicked",e,function(){window.location.href=n})})}function a(){l(".side-nav .submenu a").on("click",function(t){t.preventDefault();var e=l(this).html(),n=l(this).attr("href");r("SubNav","SubNav-Clicked",e,function(){window.location.href=n})})}function s(){i(),o(),a()}var l=window.jQuery;n.init=s,n.track=r},{}],12:[function(t,e,n){function r(t,e,n,r,i){t=t||!1,e=e||!1,n=n||!1,r=r||!1,i=i||!1;var o=i?"domain="+i:"",a=r?"path="+r:"path=/",s="";if(n){var l=new Date;l.setTime(l.getTime()+24*n*60*60*1e3),s="expires="+l.toUTCString()}document.cookie=t+"="+e+";"+o+";"+a+";"+s}function i(t){for(var e=t+"=",n=document.cookie.split(";"),r=0;r<n.length;r++){for(var i=n[r];" "===i.charAt(0);)i=i.substring(1);if(0===i.indexOf(e)){var a=i.substring(e.length,i.length);return a.split("&").length>1?o(a):a}}return""}function o(t){for(var e=t.split("&"),n={},r=0;r<e.length;r++){var i=e[r].split("=");i.length>1&&(n[i[0]]=i[1])}return n}e.exports={set:r,get:i}},{}],13:[function(t,e,n){function r(){i(window).on(s,function(t){(o.debug||PX.debug)&&window.console&&console.log&&window.console.log(t.type)})}var i=window.jQuery,o=t("../settings"),a=["Geo/Started","Geo/Updated","Geo/GotFromGeoLocCookie","Geo/NotSupported","Geo/Error","Locations/GoogleCallback","Locations/CreatingElements","Locations/AddingElementsDesktop","Locations/AddingElementsMobile","Locations/GetStoresByLocation","Locations/GetStoresByQuery","Locations/SetupMap","Scripts/Loaded","Scripts/Started","Scripts/Setup","Scripts/Formatting","Scripts/Behavior","Scripts/Locations","FavoritePanda/SetupStarted","FavoritePanda/PXfavorite","FavoritePanda/PXclosest","FavoritePanda/PXlocal","FavoritePanda/Endpoint","Nutrition/GetCurrentCart","Nutrition/GetCurrentPageItems","Nutrition/GetAllItems","Nutrition/GetAllItemsFromCache","Nutrition/ItemAdded","Nutrition/ItemRemoved","Nutrition/CartCleared"],s=a.join(" ");e.exports={init:r}},{"../settings":26}],14:[function(t,e,n){function r(){a(window).trigger("Geo/Started"),c?a(window).trigger("Geo/GotFromGeoLocCookie",u):navigator.geolocation?navigator.geolocation.getCurrentPosition(i,o,l):(s.set("geoloc","lat=&lng="),a(window).trigger("Geo/NotSupported"))}function i(t){s.set("geoloc","lat="+t.coords.latitude+"&lng="+t.coords.longitude,1),u=s.get("geoloc"),a(window).trigger("Geo/Updated",u)}function o(){s.set("geoloc","lat=&lng="),a(window).trigger("Geo/Error")}var a=window.jQuery,s=t("./cookie.js"),l={maximumAge:432e5,timeout:5e3},u=s.get("geoloc"),c=u&&u.hasOwnProperty("lat")&&u.hasOwnProperty("lng")&&u.lat.length>0&&u.lng.length>0;window.addEventListener("load",r),e.exports={init:r}},{"./cookie.js":12}],15:[function(t,e,n){var r=function(){try{return window.localStorage.setItem("foo","bar"),window.localStorage.removeItem("foo"),!0}catch(t){return!1}}(),i={get:function(t){return!(!r||!window.localStorage.getItem(t))&&("undefined"!==window.localStorage.getItem(t)&&JSON.parse(window.localStorage.getItem(t)))},set:function(t,e){r&&"undefined"!==e&&window.localStorage.setItem(t,JSON.stringify(e))}};e.exports=i},{}],16:[function(t,e,n){function r(t,e){e||(e=window.location.href),t=t.replace(/[\[\]]/g,"\\$&");var n=new RegExp("[?&]"+t+"(=([^&#]*)|&|#|$)","i"),r=n.exec(e);return r?r[2]?decodeURIComponent(r[2].replace(/\+/g," ")):"":null}e.exports={getParameterByName:r}},{}],17:[function(t,e,n){function r(){l.support.IS_IE8?(s(window).on("scroll",i),s(window).on("resize",o)):(s(window).on("scroll",u.debounce(i,100,{leading:!0,maxWait:100,trailing:!0})),s(window).on("resize",u.debounce(o,100,{leading:!0,maxWait:200,trailing:!0})))}function i(){var t=s(window).scrollTop();s(window).trigger("scrollStart",[t]),clearTimeout(a),a=setTimeout(function(){var t=s(window).scrollTop();s(window).trigger("scrollStop",[t])},250)}function o(){s(window).trigger("resizeStart"),clearTimeout(a),a=setTimeout(function(){s(window).trigger("resizeStop")},250)}var a,s=window.jQuery,l=window.PX||{},u=t("lodash");e.exports={init:r}},{lodash:2}],18:[function(t,e,n){function r(t,e,n,r,i){var o=25,l=50;n=n||s.locations.limit,a(window).trigger("Locations/GetStoresByLocation");var u=a.Deferred();return t&&e?a.ajax({method:"GET",timeout:2e4,dataType:"json",cache:!0,url:s.locations.endPoints.storesByLocation+"?lat="+t+"&lng="+e+"&desiredDistance="+o+"&maxDistance="+l+"&page="+i+"&limit="+n+"&hours=true&filters="+JSON.stringify(r)}).success(function(t){u.resolve(t)}).error(function(t){u.reject(t)}):u.reject([]),u.promise()}function i(t,e,n,r){a(window).trigger("Locations/GetStoresByQuery");var i=25,o=50,l=a.Deferred();return e?a.ajax({method:"GET",timeout:2e4,dataType:"json",cache:!0,url:s.locations.endPoints.storesByQuery+"?searchType="+t+"&query="+e+"&desiredDistance="+i+"&maxDistance="+o+"&page="+r+"&limit="+s.locations.limit+"&hours=true&filters="+JSON.stringify(n)}).success(function(t){l.resolve(t)}).error(function(t){l.reject(t)}):l.reject([]),l.promise()}function o(t){t=t||!1,a(window).trigger("Locations/GetStoresByQuery");var e=a.Deferred();return t?a.ajax({method:"GET",timeout:5e3,dataType:"json",cache:!0,url:s.locations.endPoints.storeById+"?storeId="+t}).success(function(t){e.resolve(t)}).error(function(t){e.reject(t)}):e.reject([]),e.promise()}var a=window.jQuery,s=t("../settings.js");e.exports={byLocation:r,byQuery:i,byStoreId:o}},{"../settings.js":26}],19:[function(t,e,n){function r(t){t=t||{},google.maps.OverlayView.apply(this,arguments),this.content_=t.content||"",this.disableAutoPan_=t.disableAutoPan||!1,this.maxWidth_=t.maxWidth||0,this.pixelOffset_=t.pixelOffset||new google.maps.Size(0,0),this.position_=t.position||new google.maps.LatLng(0,0),this.zIndex_=t.zIndex||null,this.boxClass_=t.boxClass||"infoBox",this.boxStyle_=t.boxStyle||{},this.closeBoxMargin_=t.closeBoxMargin||"2px",this.closeBoxURL_=t.closeBoxURL||"http://www.google.com/intl/en_us/mapfiles/close.gif",""===t.closeBoxURL&&(this.closeBoxURL_=""),this.infoBoxClearance_=t.infoBoxClearance||new google.maps.Size(1,1),this.isHidden_=t.isHidden||!1,this.alignBottom_=t.alignBottom||!1,this.pane_=t.pane||"floatPane",this.enableEventPropagation_=t.enableEventPropagation||!1,this.div_=null,this.closeListener_=null,this.eventListener1_=null,this.eventListener2_=null,this.eventListener3_=null,this.moveListener_=null,this.contextListener_=null,this.fixedWidthSet_=null}r.prototype=new google.maps.OverlayView,r.prototype.createInfoBoxDiv_=function(){var t,e=this,n=function(t){t.cancelBubble=!0,t.stopPropagation&&t.stopPropagation()},r=function(t){t.returnValue=!1,t.preventDefault&&t.preventDefault(),e.enableEventPropagation_||n(t)};this.div_||(this.div_=document.createElement("div"),this.setBoxStyle_(),"undefined"==typeof this.content_.nodeType?this.div_.innerHTML=this.getCloseBoxImg_()+this.content_:(this.div_.innerHTML=this.getCloseBoxImg_(),this.div_.appendChild(this.content_)),this.getPanes()[this.pane_].appendChild(this.div_),this.addClickHandler_(),this.div_.style.width?this.fixedWidthSet_=!0:0!==this.maxWidth_&&this.div_.offsetWidth>this.maxWidth_?(this.div_.style.width=this.maxWidth_,this.div_.style.overflow="auto",this.fixedWidthSet_=!0):(t=this.getBoxWidths_(),this.div_.style.width=this.div_.offsetWidth-t.left-t.right+"px",this.fixedWidthSet_=!1),this.panBox_(this.disableAutoPan_),this.enableEventPropagation_||(this.eventListener1_=google.maps.event.addDomListener(this.div_,"mousedown",n),this.eventListener2_=google.maps.event.addDomListener(this.div_,"click",n),this.eventListener3_=google.maps.event.addDomListener(this.div_,"dblclick",n),this.eventListener4_=google.maps.event.addDomListener(this.div_,"mouseover",function(t){this.style.cursor="default"})),this.contextListener_=google.maps.event.addDomListener(this.div_,"contextmenu",r),google.maps.event.trigger(this,"domready"))},r.prototype.getCloseBoxImg_=function(){var t="";return""!==this.closeBoxURL_&&(t="<img",t+=" src='"+this.closeBoxURL_+"'",t+=" align=right",t+=" style='",t+=" position: relative;",t+=" cursor: pointer;",t+=" margin: "+this.closeBoxMargin_+";",t+="'>"),t},r.prototype.addClickHandler_=function(){var t;""!==this.closeBoxURL_?(t=this.div_.firstChild,this.closeListener_=google.maps.event.addDomListener(t,"click",this.getCloseClickHandler_())):this.closeListener_=null},r.prototype.getCloseClickHandler_=function(){var t=this;return function(e){e.cancelBubble=!0,e.stopPropagation&&e.stopPropagation(),t.close(),google.maps.event.trigger(t,"closeclick")}},r.prototype.panBox_=function(t){var e,n,r=0,i=0;if(!t&&(e=this.getMap(),e instanceof google.maps.Map)){e.getBounds().contains(this.position_)||e.setCenter(this.position_),n=e.getBounds();var o=e.getDiv(),a=o.offsetWidth,s=o.offsetHeight,l=this.pixelOffset_.width,u=this.pixelOffset_.height,c=this.div_.offsetWidth,f=this.div_.offsetHeight,d=this.infoBoxClearance_.width,p=this.infoBoxClearance_.height,h=this.getProjection().fromLatLngToContainerPixel(this.position_);if(h.x<-l+d?r=h.x+l-d:h.x+c+l+d>a&&(r=h.x+c+l+d-a),this.alignBottom_?h.y<-u+p+f?i=h.y+u-p-f:h.y+u+p>s&&(i=h.y+u+p-s):h.y<-u+p?i=h.y+u-p:h.y+f+u+p>s&&(i=h.y+f+u+p-s),0!==r||0!==i){e.getCenter();e.panBy(r,i)}}},r.prototype.setBoxStyle_=function(){var t,e;if(this.div_){this.div_.className=this.boxClass_,this.div_.style.cssText="",e=this.boxStyle_;for(t in e)e.hasOwnProperty(t)&&(this.div_.style[t]=e[t]);"undefined"!=typeof this.div_.style.opacity&&""!==this.div_.style.opacity&&(this.div_.style.filter="alpha(opacity="+100*this.div_.style.opacity+")"),this.div_.style.position="absolute",this.div_.style.visibility="hidden",null!==this.zIndex_&&(this.div_.style.zIndex=this.zIndex_)}},r.prototype.getBoxWidths_=function(){var t,e={top:0,bottom:0,left:0,right:0},n=this.div_;return document.defaultView&&document.defaultView.getComputedStyle?(t=n.ownerDocument.defaultView.getComputedStyle(n,""),t&&(e.top=parseInt(t.borderTopWidth,10)||0,e.bottom=parseInt(t.borderBottomWidth,10)||0,e.left=parseInt(t.borderLeftWidth,10)||0,e.right=parseInt(t.borderRightWidth,10)||0)):document.documentElement.currentStyle&&n.currentStyle&&(e.top=parseInt(n.currentStyle.borderTopWidth,10)||0,e.bottom=parseInt(n.currentStyle.borderBottomWidth,10)||0,e.left=parseInt(n.currentStyle.borderLeftWidth,10)||0,e.right=parseInt(n.currentStyle.borderRightWidth,10)||0),e},r.prototype.onRemove=function(){this.div_&&(this.div_.parentNode.removeChild(this.div_),this.div_=null)},r.prototype.draw=function(){this.createInfoBoxDiv_();var t=this.getProjection().fromLatLngToDivPixel(this.position_);this.div_.style.left=t.x+this.pixelOffset_.width+"px",this.alignBottom_?this.div_.style.bottom=-(t.y+this.pixelOffset_.height)+"px":this.div_.style.top=t.y+this.pixelOffset_.height+"px",this.isHidden_?this.div_.style.visibility="hidden":this.div_.style.visibility="visible"},r.prototype.setOptions=function(t){"undefined"!=typeof t.boxClass&&(this.boxClass_=t.boxClass,this.setBoxStyle_()),"undefined"!=typeof t.boxStyle&&(this.boxStyle_=t.boxStyle,this.setBoxStyle_()),"undefined"!=typeof t.content&&this.setContent(t.content),"undefined"!=typeof t.disableAutoPan&&(this.disableAutoPan_=t.disableAutoPan),"undefined"!=typeof t.maxWidth&&(this.maxWidth_=t.maxWidth),"undefined"!=typeof t.pixelOffset&&(this.pixelOffset_=t.pixelOffset),"undefined"!=typeof t.alignBottom&&(this.alignBottom_=t.alignBottom),"undefined"!=typeof t.position&&this.setPosition(t.position),"undefined"!=typeof t.zIndex&&this.setZIndex(t.zIndex),"undefined"!=typeof t.closeBoxMargin&&(this.closeBoxMargin_=t.closeBoxMargin),"undefined"!=typeof t.closeBoxURL&&(this.closeBoxURL_=t.closeBoxURL),"undefined"!=typeof t.infoBoxClearance&&(this.infoBoxClearance_=t.infoBoxClearance),"undefined"!=typeof t.isHidden&&(this.isHidden_=t.isHidden),"undefined"!=typeof t.enableEventPropagation&&(this.enableEventPropagation_=t.enableEventPropagation),this.div_&&this.draw()},r.prototype.setContent=function(t){this.content_=t,this.div_&&(this.closeListener_&&(google.maps.event.removeListener(this.closeListener_),this.closeListener_=null),this.fixedWidthSet_||(this.div_.style.width=""),"undefined"==typeof t.nodeType?this.div_.innerHTML=this.getCloseBoxImg_()+t:(this.div_.innerHTML=this.getCloseBoxImg_(),this.div_.appendChild(t)),this.fixedWidthSet_||(this.div_.style.width=this.div_.offsetWidth+"px","undefined"==typeof t.nodeType?this.div_.innerHTML=this.getCloseBoxImg_()+t:(this.div_.innerHTML=this.getCloseBoxImg_(),this.div_.appendChild(t))),this.addClickHandler_()),google.maps.event.trigger(this,"content_changed")},r.prototype.setPosition=function(t){this.position_=t,this.div_&&this.draw(),google.maps.event.trigger(this,"position_changed")},r.prototype.setZIndex=function(t){this.zIndex_=t,this.div_&&(this.div_.style.zIndex=t),google.maps.event.trigger(this,"zindex_changed")},r.prototype.getContent=function(){return this.content_},r.prototype.getPosition=function(){return this.position_},r.prototype.getZIndex=function(){return this.zIndex_},r.prototype.show=function(){this.isHidden_=!1,this.div_&&(this.div_.style.visibility="visible")},r.prototype.hide=function(){this.isHidden_=!0,this.div_&&(this.div_.style.visibility="hidden")},r.prototype.open=function(t,e){var n=this;e&&(this.position_=e.getPosition(),this.moveListener_=google.maps.event.addListener(e,"position_changed",function(){n.setPosition(this.getPosition())})),this.setMap(t),this.div_&&this.panBox_()},r.prototype.close=function(){this.closeListener_&&(google.maps.event.removeListener(this.closeListener_),this.closeListener_=null),this.eventListener1_&&(google.maps.event.removeListener(this.eventListener1_),google.maps.event.removeListener(this.eventListener2_),google.maps.event.removeListener(this.eventListener3_),google.maps.event.removeListener(this.eventListener4_),this.eventListener1_=null,this.eventListener2_=null,this.eventListener3_=null,this.eventListener4_=null),this.moveListener_&&(google.maps.event.removeListener(this.moveListener_),this.moveListener_=null),this.contextListener_&&(google.maps.event.removeListener(this.contextListener_),this.contextListener_=null),this.setMap(null)},e.exports=r},{}],20:[function(t,e,n){function r(){O(window).trigger("Scripts/Locations"),U&&(B.support.IS_MOBILE?l():i(),G=!("object"!=typeof G||!G.lat||!G.lng)&&G)}function i(){var t=document.createElement("script");t.type="text/javascript",t.src="https://maps.googleapis.com/maps/api/js?v=3.exp&key="+q+"&callback=PX.locations.callbackInit",document.body.appendChild(t)}function o(){O(window).trigger("Locations/GoogleCallback"),C(),l()}function a(t){var e=M.get("pxfav").toString()===t.toString()?"0":t;if(M.set("pxfav",e,180),B.favoriteId=e,U){var n=!1,r=z.filter(B.currentStores,function(r,i){return n||r.Id!==t||(n=i),r.Id===e});B.favorite=!!e&&r[0],W.set("pxfavstore",B.favorite),s(e,n)}else B.closest&&B.closest.Id.toString()===e.toString()?(B.favorite=B.closest,W.set("pxfavstore",B.favorite)):(B.favorite=!1,W.set("pxfavstore",B.favorite));O(window).trigger("Favorite-Panda-Updated")}function s(t,e){X.maps?(p(),B.support.IS_IE8?(D(B.currentStores,!0),P(),Z[e].infobox.open(J.map,Z[e].marker)):(z.forEach(Z,function(e){var n=O(e.infobox.content_),r=n.find(".star");e.store.Id.toString()===t.toString()?r.addClass("favorite"):r.removeClass("favorite");var i=n.prop("outerHTML");e.infobox.content_=i}),e>=0&&Z[e].infobox.open(J.map,Z[e].marker))):z.forEach(Z,function(e){var n=e.$infobox.find(".star");e.store.Id.toString()===t.toString()?n.addClass("favorite"):n.removeClass("favorite")})}function l(){g(),Y.length>0&&O(".location-search input.search").val(Y),m(),v(),y(),h(),w(),O(window).on("Geo/Updated",function(){d(void 0,0)})}function u(t,e,n,r){j(),B.IsGeoQuery=!1;var i=R.byQuery(t,e,n,r);i.done(function(t){D(t.List),P(),x(t.PageInfo)}),i.fail(function(){N()})}function c(t){var e=/^\d{5}(-\d{4})?$/.test(t),n=/^[A-Za-z- ]+,[ ]?[A-Za-z]{2}$/.test(t);return""===t?"zip":e?"zip":n?"community":"address"}function f(t){var e=O("input:radio[name=search-type]");e.filter("[value="+t+"]").prop("checked",!0)}function d(t,e){var n,r,i=M.get("geoloc"),o=M.get("loc"),a=""===i||""===i.lat?o:i;B.IsGeoQuery=!0,a&&a.hasOwnProperty("lat")&&a.hasOwnProperty("lng")&&a.lat.length>0&&a.lng.length>0?(r=a.lng,n=a.lat):(r=H.locations.defaultLong,n=H.locations.defaultLat),j();var s=R.byLocation(n,r,H.locations.limit,t,e);s.done(function(t){D(t.List),P(),x(t.PageInfo)}),s.fail(function(){N()})}function p(t){t=t||!1,X.maps?(z.forEach(Z,function(t){t.infobox.close(),t.$card.removeClass("active")}),t&&J.map.fitBounds(J.mapBounds)):(O(".location-map-popup").attr("data-state","closed"),setTimeout(function(){O(".location-map-popup").remove()},300),O("body").removeClass("no-scroll"))}function h(){O(".toggle-panel").on("click",function(t){t.preventDefault();var e=O(this),n=O(this).closest(".location-panel"),r="open"===n.attr("data-state")?"closed":"open",i="open"===n.attr("data-state")?"Show":"Hide",o=J.map.getZoom();n.attr("data-state",r),e.html(i),X.maps.event.trigger(J.map,"resize"),setTimeout(function(){J.map.setZoom(o),X.maps.event.trigger(J.map,"resize"),J.map.fitBounds(J.mapBounds)},50),O(window).on("resizeStop",function(){var t=O(window).width();(t>1024||t<768)&&(n.attr("data-state","open"),e.html("Hide"))})})}function g(){var t=$.getParameterByName("filter");if(null!=t&&""!=t){for(var e=!1,n=t.split(","),r=0;r<n.length;r++){var i=O('[data-filter="'+n[r]+'"]').first();i.length>0&&(e=!0),i.prop("checked",!0)}if(e){var o="open";O(".toggle-location-filters").attr("data-state",o),O(".location-filters").attr("data-state",o)}}}function v(){O(".toggle-location-filters").on("click",function(){var t="open"===O(".location-filters").attr("data-state")?"closed":"open";O(this).attr("data-state",t),O(".location-filters").attr("data-state",t)}),B.support.IS_IE8||(O(".location-filters .filter").on("click",function(t){var e=O(this).find("input");e.trigger("click")}),O(".location-filters .filter label").on("click",function(t){t.preventDefault(),t.stopPropagation()}),O(".location-filters .filter input").on("click",function(t){t.stopPropagation()})),O('.location-filters input[type="checkbox"]').on("change",function(t){t.preventDefault(),m()})}function m(){var t=b("stype");void 0===t?t=O("input[name='search-type']:checked").val():f(t),V.$driveThru=O('[data-filter="drive-thru"]').first(),V.$orderOnline=O('[data-filter="order-online"]').first(),V.$teaBar=O('[data-filter="tea-bar"]').first(),V.$saladsWraps=O('[data-filter="salads-wraps"]').first(),Q.driveThru=V.$driveThru.prop("checked"),Q.orderOnline=V.$orderOnline.prop("checked"),Q.teaBar=V.$teaBar.prop("checked"),Q.saladsWraps=V.$saladsWraps.prop("checked");var e=O(".location-search input.search").val();e?u(t,e,Q,0):d(Q,0)}function y(){O(".location-search").on("submit",function(t){t.preventDefault();var e=O(this),n=e.find("input.search").val(),r=0;Q.driveThru=V.$driveThru.prop("checked"),Q.orderOnline=V.$orderOnline.prop("checked"),Q.teaBar=V.$teaBar.prop("checked"),Q.saladsWraps=V.$saladsWraps.prop("checked");var i=O("input[name='search-type']:checked").val();u(i,n,Q,r)})}function b(t){for(var e=window.location.search.substring(1),n=e.split("&"),r=0;r<n.length;r++){var i=n[r].split("=");if(i[0]==t)return i[1]}}function w(){O(".location-search-pagination").on("click","button.pagination",function(t){t.preventDefault();var e=O(this).attr("data-page"),n=O(".location-search"),r=n.find("input.search").val();Q.driveThru=V.$driveThru.prop("checked"),Q.orderOnline=V.$orderOnline.prop("checked"),Q.teaBar=V.$teaBar.prop("checked"),Q.saladsWraps=V.$saladsWraps.prop("checked");var i=O("input[name='search-type']:checked").val();B.IsGeoQuery?d(Q,e):u(i,r,Q,e)})}function x(t){if(Z&&!(Z.length<1)){var e=t.PageNumber,n=t.PageCount;O(".location-search-pagination").removeClass("hidden"),O(".location-search-pagination .current-page").val(e);var r="";e-3>0&&(r+=_(1,0,!1),r+='<span class="ellipses"> ... </span>'),e-2>0&&(r+=_(e-2,e-3,!1)),e-1>0&&(r+=_(e-1,e-2,!1)),r+=_(e,e-1,!0),e+1<=n&&(r+=_(e+1,e,!1)),e+2<=n&&(r+=_(e+2,e+1,!1)),e+3<n&&(r+='<span class="ellipses"> ... </span>',r+=_(n,n-1,!1)),O(".location-search-pagination .pages").html(r),t.IsFirstPage?O(".location-search-pagination .prev").prop("disabled",!0):(O(".location-search-pagination .prev").prop("disabled",!1),O(".location-search-pagination .prev").attr("data-page",e-2)),t.IsLastPage?O(".location-search-pagination .next").prop("disabled",!0):(O(".location-search-pagination .next").prop("disabled",!1),O(".location-search-pagination .next").attr("data-page",e))}}function _(t,e,n){var r='<button data-page="'+e+'"',i="pagination";return n&&(r+=" disabled ",i+=" active"),r=r+'class="'+i+'">'+t+"</button>"}function C(){O(window).trigger("Locations/SetupMap"),X=window.google,K=t("./infobox.js"),J.icon={url:H.googleMaps.mapIcon,size:new X.maps.Size(68,92),scaledSize:new X.maps.Size(34,46),origin:new X.maps.Point(0,0),anchor:new X.maps.Point(17,46)},J.closedIcon={url:H.googleMaps.mapIconClosed,size:new X.maps.Size(68,92),scaledSize:new X.maps.Size(34,46),origin:new X.maps.Point(0,0),anchor:new X.maps.Point(17,46)},J.mapOptions={zoom:11,center:new X.maps.LatLng(0,0),mapTypeId:X.maps.MapTypeId.ROADMAP,styles:H.googleMaps.styles,disableDefaultUI:!0,zoomControl:!0,zoomControlOptions:{style:X.maps.ZoomControlStyle.SMALL,position:X.maps.ControlPosition.RIGHT_TOP}},J.mapBounds=new X.maps.LatLngBounds,J.map=new X.maps.Map(document.querySelector(".location-map"),J.mapOptions)}function S(t,e){var n=F.infoWindow(t,e),r=new K({content:n,alignBottom:!0,disableAutoPan:!1,maxWidth:0,pixelOffset:new X.maps.Size((-130),(-60)),closeBoxMargin:"",closeBoxURL:"",infoBoxClearance:new X.maps.Size(40,40),isHidden:!1,pane:"floatPane",enableEventPropagation:!1});return r}function T(t){switch(t){case"suggest":O(".location-message.suggest").attr("data-state","visible").attr("aria-hidden","false");break;case"nomatch":O(".location-message.no-match").attr("data-state","visible").attr("aria-hidden","false");break;case"error":O(".location-message.error").attr("data-state","visible").attr("aria-hidden","false")}}function k(){p(),X.maps&&(z.forEach(Z,function(t){t.marker.setMap(null)}),J.mapBounds=new X.maps.LatLngBounds),Z.length=0}function j(){E(),L(),O(".location-cards").html('<div class="location-message"><h4 class="message-title loading">Loading..</h4></div>')}function I(){z.forEach(function(t){t.$card=t.$card.detach()}),O(".location-cards").empty()}function E(){O(".location-message").attr("data-state","hidden").attr("aria-hidden","true")}function L(){O(".location-search-pagination").addClass("hidden")}function A(){X.maps&&(J.mapBounds=new X.maps.LatLngBounds)}function N(t){t=t||"error",k(),I(),E(),T(t)}function D(t,e){O(window).trigger("Locations/CreatingElements"),e=e||!1,e||(B.currentStores.length=0,B.currentStores=t),k(),"object"==typeof t&&t.length>0&&(X.maps?z.forEach(t,function(t,e){var n=new X.maps.Marker({position:new X.maps.LatLng(t.Latitude,t.Longitude),map:J.map,title:t.Name,animation:X.maps.Animation.DROP,icon:t.TempClose?J.closedIcon:J.icon}),r=S(t,e),i=O(F.locCard(t)),o={store:t,marker:n,infobox:r,$card:i,active:!0};Z.push(o)}):z.forEach(t,function(t,e){var n=O(F.locCard(t)),r=O(F.infoWindow(t,e,"mobile")),i={store:t,marker:!1,$infobox:r,$card:n,active:!0};Z.push(i)}))}function P(){if(I(),p(),E(),!Z||Z.length<1)T("suggest");else{var t=!1;z.forEach(Z,function(e){e.active&&(t=!0)}),t?A():T("nomatch"),X.maps?(O(window).trigger("Locations/AddingElementsDesktop"),z.forEach(Z,function(t){t.active?(X.maps.event.addListener(t.marker,"click",function(){p(),t.$card.addClass("active"),t.infobox.open(J.map,t.marker)}),t.$card.on("click focus",function(){p(),O(this).addClass("active"),t.infobox.open(J.map,t.marker)}),O(".location-cards").append(t.$card),t.marker.setMap(J.map),J.mapBounds.extend(t.marker.position)):t.marker.setMap(null)}),J.map.fitBounds(J.mapBounds)):(O(window).trigger("Locations/AddingElementsMobile"),z.forEach(Z,function(t){t.active&&(t.$card.on("click",function(){O(".wrapper").append(t.$infobox),O(".location-map-popup").attr("data-state","open")}),O(".location-cards").append(t.$card))}))}}var O=window.jQuery,B=window.PX||{},H=t("../settings.js"),M=t("../helpers/cookie.js"),$=t("../helpers/querystring.js"),F=t("./templates.js"),R=t("./ajax-stores.js"),W=t("../helpers/local-storage.js"),z=t("lodash"),q=H.googleMaps.ApiKey,U=O(".location-map").length>0,X=window.google||{},G=M.get("loc"),Q={driveThru:!0,orderOnline:!0,teaBar:!0,saladsWraps:!0},V={},Y=decodeURIComponent(location.hash.substring(1,location.hash.length).replace(/\+/g," ")),J={},Z=[],K={};B.currentStores=[],B.IsGeoQuery=!1,O("#location-query").keyup(function(){var t=O("#location-query").val(),e=c(t);f(e)}),e.exports={init:r,callbackInit:o,closeBoxes:p,setFavoritePanda:a}},{"../helpers/cookie.js":12,"../helpers/local-storage.js":15,"../helpers/querystring.js":16,"../settings.js":26,"./ajax-stores.js":18,"./infobox.js":19,"./templates.js":21,lodash:2}],21:[function(t,e,n){function r(t){if("undefined"==typeof t)return!1;var e=t.Distance?Math.floor(10*t.Distance)/10:"",n=t.DriveThrough?'<span class="px-car" role="listitem">Drive Thru</span>':"",r=t.TeaBar?'<span class="px-boba" role="listitem">Tea Bar</span>':"",i=t.SaladsAndWraps?'<span class="px-wrap" role="listitem">Salads and Wraps</span>':"",o=t.OnlineOrder?'<a class="order-now" href="'+l.locations.onlineOrderUrl+'" target="_blank" role="listitem">Order Now</a>':"",a=t.Phone?t.Phone.replace(/(\d{3})(\d{3})(\d{4})/,"$1-$2-$3"):"",u=t.Fax?t.Fax.replace(/(\d{3})(\d{3})(\d{4})/,"$1-$2-$3"):"",c="Panda Express,+"+t.Address.split(" ").join("+"),f=new Date,d=f.getDay(),p=t.OperationalHours.Normal.Hours,h=$.map(p,function(t,e){return[t]}),g=h.length>0?h[d].StartTime:"CLOSE",v=h.length>0?h[d].EndTime:"CLOSE",m=t.Address.replace(/[^A-Za-z0-9 -]/g,""),y=t.City.replace(/[^A-Za-z0-9 -]/g,"");m=m.split(" ").join("-").split("--").join("-"),y=y.split(" ").join("-").split("--").join("-");var b;b="CLOSE"===g?"CLOSED":g+" - "+v;var w=s.template('<div class="location-list-card" tabindex="0"><span class="name">{{Name}}</span><span class="distance">'+e+'Mi</span><span class="address">{{ Address }}<br>{{ City }}, {{State}} {{ Zip }}<span class="features" aria-label="Features at this location" role="list">'+n+r+i+"</span></span>"+(t.TempClose?'<a href="https://www.pandaexpress.com/forourPandafamily" style="padding-left: 0" class="fundraising">Temporarily Closed</a>':o+'<a href="'+l.locations.fundraiserUrl+'" class="fundraising">Fundraising</a><a target="_blank" href="https://maps.google.com/maps?daddr='+c+'" class="directions">Directions</a><a href="/userlocation/'+t.Id.toString()+"/"+t.State.toString()+"/"+y+"/"+m+'" class="directions">More info</a>')+'<div style="display: none;"><span aria-label="Phone Number">'+a+'</span><span aria-label="Fax Number">'+u+'</span><span aria-label="Open Today">'+b+"</span></div></div>")(t);return w}function i(t){return t.Phone?t.Phone.replace(/(\d{3})(\d{3})(\d{4})/,"$1-$2-$3"):""}function o(t,e,n){if(n=n||!1,"undefined"==typeof t)return!1;var r,o=t.Directions&&t.Directions.length>0?'<span class="cross-streets">{{Directions}}</span>':"",u=t.DriveThrough?'<span class="px-car">Drive Thru</span>':"",c=t.TeaBar?'<span class="px-boba">Tea Bar</span>':"",f=t.SaladsAndWraps?'<span class="px-wrap">Salads and Wraps</span>':"",d=t.OnlineOrder?'<a href="'+l.locations.onlineOrderUrl+'" target="_blank" class="order-now">Order Now</a>':"",p=t.OnlineOrder?"":"Call us to order ahead",h=i(t),g=t.Fax?t.Fax.replace(/(\d{3})(\d{3})(\d{4})/,"$1-$2-$3"):"",v=t.Id.toString()===a.get("pxfav").toString()?"favorite":"",m=t.Id.toString()===a.get("pxfav").toString()?"Remove My Panda":"Save as My Panda",y="Panda Express,+"+t.Address.split(" ").join("+"),b="",w=new Date,x=w.getDay(),_=t.OperationalHours.Normal.Hours,C=$.map(_,function(t,e){return[t]}),S=C.length>0?C[x].StartTime:"CLOSE",T=C.length>0?C[x].EndTime:"CLOSE";r="CLOSE"===S?"CLOSED":S+" - "+T;var k=t.Address.replace(/[^A-Za-z0-9 -]/g,""),j=t.City.replace(/[^A-Za-z0-9 -]/g,"");return k=k.split(" ").join("-").split("--").join("-"),j=j.split(" ").join("-").split("--").join("-"),b="mobile"===n?s.template('<div class="location-map-popup" data-state="open" data-store="{{Id}}"><div class="container"><button class="close" onclick="PX.locations.closeBoxes()" aria-label="Close Infobox"></button><button class="star '+v+'" onclick="PX.locations.setFavoritePanda({{Id}},'+e+')" aria-label="'+m+'"></button><div class="title">Store Details</div><div class="name">{{Name }}</div><span class="address">{{ Address }}<br>{{ City }}, {{State}} {{ Zip }}<span class="features" aria-label="Features at this location" role="list">'+u+c+f+p+"</span></span>"+o+'<div class="popup-row"><span class="phone"><a href=tel:'+h+">"+h+'</a></span><span class="fax">'+g+'</span></div><span class="hours">'+(t.TempClose?"Closed":r)+"</span>"+(t.TempClose?"":d+'<a target="_blank" href="https://maps.google.com/maps?daddr='+y+'" class="get-directions">Get Directions</a>')+'<a href="/userlocation/'+t.Id.toString()+"/"+t.State.toString()+"/"+j+"/"+k+'" class="location-item">More info</a></div></div>')(t):"nav"===n?s.template('<div class="location-map-popup" data-store="{{Id}}"><div class="name"><button class="star '+v+'" onclick="PX.locations.setFavoritePanda({{Id}})" data-has-tooltip aria-label="'+m+'"><span class="tooltip"></span></button> {{Name }}</div><span class="address">{{ Address }}<br>{{ City }}, {{State}} {{ Zip }}</span><div class="popup-row"><span class="phone">'+h+'</span><div class="features">'+u+c+f+p+'</div></div><span class="hours">'+(t.TempClose?"Closed":r)+"</span></div>")(t):s.template('<div class="location-map-popup" data-store="{{Id}}"><button class="close" onclick="PX.locations.closeBoxes(true)" aria-label="Close Infobox"></button><div class="name"><button class="star '+v+'" onclick="PX.locations.setFavoritePanda({{Id}})" data-has-tooltip aria-label="'+m+'"><span class="tooltip"></span></button> {{Name }}</div><span class="address">{{ Address }}<br>{{ City }}, {{State}} {{ Zip }}</span>'+o+'<div class="popup-row"><span class="phone">'+h+'</span><span class="fax">'+g+'</span></div><span class="hours">'+(t.TempClose?"Closed":r)+"</span>"+(t.TempClose?"":d+'<a target="_blank" href="https://maps.google.com/maps?daddr='+y+'" class="get-directions">Get Directions</button>')+'<a href="/userlocation/'+t.Id.toString()+"/"+t.State.toString()+"/"+j+"/"+k+'" class="location-item">Location Details</a></div>')(t)}var a=t("../helpers/cookie.js"),s=t("lodash"),l=t("../settings.js");s.templateSettings.interpolate=/{{([\s\S]+?)}}/g,
e.exports={locCard:r,infoWindow:o}},{"../helpers/cookie.js":12,"../settings.js":26,lodash:2}],22:[function(t,e,n){function r(){f.get("pxfav")||f.set("pxfav","0"),u.favoriteId=f.get("pxfav"),u.favoriteId&&"0"!==u.favoriteId?i():o(),l(window).on("Favorite-Panda-Updated",function(){u.favoriteId=f.get("pxfav"),i()}),l(window).on("Geo/Updated",function(){o()})}function i(){l(window).trigger("FavoritePanda/SetupStarted"),l(".location-map-popup button.star").addClass("inactive");var t=u.favoriteId&&"0"!==u.favoriteId,e=!!u.favorite&&u.favorite.hasOwnProperty("Id"),n=!!u.closest&&u.closest.hasOwnProperty("Id"),r=t&&n&&u.favoriteId.toString()===u.closest.Id.toString(),i=h.get("pxfavstore"),a=i&&i.Id.toString()===u.favoriteId.toString();if(t){var c={},f={};if(e)l(window).trigger("FavoritePanda/PXfavorite"),c=u.favorite,f=d.infoWindow(c,0,"nav"),s(c,f,!0);else if(r)l(window).trigger("FavoritePanda/PXclosest"),u.favorite=u.closest,c=u.favorite,f=d.infoWindow(c,0,"nav"),s(c,f,!0);else if(a)l(window).trigger("FavoritePanda/PXlocal"),u.favorite=i,c=u.favorite,f=d.infoWindow(c,0,"nav"),s(c,f,!0);else{l(window).trigger("FavoritePanda/Endpoint");var g=p.byStoreId(u.favoriteId);g.done(function(t){c=u.favorite=t,f=d.infoWindow(c,0,"nav"),s(c,f,!0)}),g.fail(function(){o()})}}else o()}function o(){var t=f.get("geoloc"),e=f.get("loc"),n=""===t||""===t.lat?e:t,r=n&&n.hasOwnProperty("lat")&&n.hasOwnProperty("lng")&&n.lat.length>0&&n.lng.length>0;r?a(n.lat,n.lng):l.get(c.locations.getUserLocationEndpoint,function(t){a(t.ItemDetail.latitude,t.ItemDetail.longitude)},"json")}function a(t,e){var n=p.byLocation(t,e,1);n.done(function(t){var e=t.List[0];u.closest=e;var n=d.infoWindow(e,0,"nav");s(e,n,!1)}),n.fail(function(){})}function s(t,e,n){n=n||!1;var r=n?"My Panda":"Your Nearest Panda",i=n?"My Panda Express":"Nearest Panda Express",o=!n&&t.Distance?Math.floor(10*t.Distance)/10+"Mi":"",a=t.Name.length<25?t.Name.toLowerCase():t.Name.substr(0,25).toLowerCase()+"..",s="https://maps.googleapis.com/maps/api/staticmap?center="+t.Address+"&zoom=17&scale=1&size=500x500&maptype=roadmap&key="+c.googleMaps.staticApiKey+"&format=png&visual_refresh=true&markers=icon:"+c.googleMaps.staticIconHref+"%7Cshadow:false%7C"+t.Address+"&style=feature%3Alandscape%7Celement%3Aall%7Chue%3A0x000000%7C&style=feature%3Apoi%7Celement%3Alabels%7Cvisibility%3Aoff%7C&style=feature%3Aroad%7Celement%3Ageometry.stroke%7Cvisibility%3Aoff%7C",u=t.hasOwnProperty("EstimatedPickupMinutes")&&t.EstimatedPickupMinutes?t.EstimatedPickupMinutes+" minutes *":0;n?l(".nearest-panda .map-area > .title").find(".title-icon").addClass("favorite"):l(".nearest-panda .map-area > .title").find(".title-icon").removeClass("favorite"),u?(l(".nearest-panda .order-info").attr("data-has-time","true"),l(".nearest-panda .order-time").html(u)):(l(".nearest-panda .order-info").attr("data-has-time","false"),l(".nearest-panda .order-time").html("")),l(".nearest-panda .map-area > .title").find(".title-text").html(i).end().find(".title-miles").html(o).end(),l(".nearest-panda .static-map").attr("src",s),l(".nearest-panda .static-map").attr("alt","Map of panda location nearest to you at "+a),l(".nearest-panda .info .title").html(r),l(".current-panda").html(a),l(".nearest-panda .location-card").html(e)}var l=window.jQuery,u=window.PX||{},c=t("./settings.js"),f=t("./helpers/cookie.js"),d=t("./locations/templates.js"),p=t("./locations/ajax-stores.js"),h=t("./helpers/local-storage.js");e.exports={init:r}},{"./helpers/cookie.js":12,"./helpers/local-storage.js":15,"./locations/ajax-stores.js":18,"./locations/templates.js":21,"./settings.js":26}],23:[function(t,e,n){function r(){u(window).trigger("Nutrition/GetCurrentCart");var t=u.Deferred();return u.ajax({method:"GET",timeout:12e3,dataType:"json",cache:!1,url:c.nutrition.getCurrentCartUrl}).success(function(e){t.resolve(e)}).error(function(e){t.reject(e)}),t.promise()}function i(){u(window).trigger("Nutrition/GetCurrentPageItems");var t=u.Deferred();return u.ajax({method:"GET",timeout:8e3,dataType:"json",cache:!1,url:c.nutrition.getCurrentPageItemsUrl}).success(function(e){t.resolve(e)}).error(function(e){t.reject(e)}),t.promise()}function o(){u(window).trigger("Nutrition/GetAllItems");var t=u.Deferred();return u.ajax({method:"GET",timeout:8e3,dataType:"json",cache:!1,url:c.nutrition.getAllItems}).success(function(e){t.resolve(e)}).error(function(e,n,r){t.reject(e,n,r)}),t.promise()}function a(t){u(window).trigger("Nutrition/ItemAdded");var e=u.Deferred();return u.ajax({method:"POST",timeout:8e3,data:{menuItemId:t},cache:!1,url:c.nutrition.postItemAdded}).success(function(t){e.resolve(t)}).error(function(t){e.reject(t)}),e.promise()}function s(t){u(window).trigger("Nutrition/ItemRemoved");var e=u.Deferred();return u.ajax({method:"POST",timeout:8e3,data:{menuItemId:t},cache:!1,url:c.nutrition.postItemRemoved}).success(function(t){e.resolve(t)}).error(function(t){e.reject(t)}),e.promise()}function l(){u(window).trigger("Nutrition/CartCleared");var t=u.Deferred();return u.ajax({method:"POST",timeout:8e3,cache:!1,url:c.nutrition.postCartCleared}).success(function(e){t.resolve(e)}).error(function(e){t.reject(e)}),t.promise()}var u=window.jQuery,c=t("../settings.js");e.exports={getCurrentCart:r,getCurrentPageItems:i,getAllItems:o,postItemAdded:a,postItemRemoved:s,postCartCleared:l}},{"../settings.js":26}],24:[function(t,e,n){function r(){if(p.length){var t=new i;t.init()}}function i(){this.cart=[],this.initialized=!1,this.isOpen=!1,this.menuItems=[],this.hasHalfItem=!1,this.halfItemId=0,this.halfTable=[],this.nutrition={servingSize:0,calories:0,caloriesFat:0,totalFat:0,saturatedFat:0,cholesterol:0,sodium:0,carbs:0,fiber:0,sugar:0,protein:0},this.$itemsList=o(".calc-items-list").first()}var o=window.jQuery,a=window.PX||{},s=t("lodash"),l=t("../settings.js"),u=t("../helpers/analytics.js"),c=t("../helpers/cookie.js"),f=t("./ajax-menu.js"),d=t("../helpers/local-storage.js"),p=o(".nutrition-calculator").first();i.prototype.calculate=function(){var t=this;s.forIn(t.nutrition,function(e,n){t.nutrition[n]=0}),s.forEach(t.cart,function(e){e.item.isHalf||(t.nutrition.servingSize+=e.item.ServingSize,t.nutrition.calories+=e.item.Calories,t.nutrition.caloriesFat+=e.item.CaloriesFromFat,t.nutrition.totalFat+=e.item.TotalFat,t.nutrition.saturatedFat+=e.item.SaturatedFat,t.nutrition.cholesterol+=e.item.Cholesterol,t.nutrition.sodium+=e.item.Sodium,t.nutrition.carbs+=e.item.TotalCarb,t.nutrition.fiber+=e.item.DietaryFiber,t.nutrition.sugar+=e.item.Sugars,t.nutrition.protein+=e.item.Protein)}),t.nutrition.servingSize=t.nutrition.servingSize.toFixed(1)},i.prototype.update=function(){var t=this,e=t.cart.length?t.cart.length+" Items":"Show";o(".calc-toggle").attr("data-closed-label",e),t.calculate(),o("[data-nutrition-serving]").html(t.nutrition.servingSize),o("[data-nutrition-calories]").html(t.nutrition.calories),o("[data-nutrition-calories-fat]").html(t.nutrition.caloriesFat),o("[data-nutrition-total-fat]").html(t.nutrition.totalFat),o("[data-nutrition-sat-fat]").html(t.nutrition.saturatedFat),o("[data-nutrition-cholesterol]").html(t.nutrition.cholesterol),o("[data-nutrition-sodium]").html(t.nutrition.sodium),o("[data-nutrition-carbs]").html(t.nutrition.carbs),o("[data-nutrition-fiber]").html(t.nutrition.fiber),o("[data-nutrition-sugar]").html(t.nutrition.sugar),o("[data-nutrition-protein]").html(t.nutrition.protein)},i.prototype.add=function(t,e,n){t=t||!1,e=e||!1,n=n||!1;var r=this,i=0;if(t){var a=s.find(r.menuItems,function(e){return e.Id.toString()===t.toString()}),d=s.clone(a,!0);if(!d)return!1;if(d.isHalf=n||!1,d.isHalf)if(r.hasHalfItem){if(r.halfItemId.toString()!==d.Id.toString()){var p=s.filter(r.halfTable,function(t){return t.MenuItemId1===r.halfItemId||t.MenuItemId2===r.halfItemId}),h=s.find(p,function(t){return t.MenuItemId1===d.Id||t.MenuItemId2===d.Id});i=h.CombinedMenuItemId;var g=s.find(r.menuItems,function(t){return t.Id.toString()===i.toString()});d=s.clone(g,!0)}r.halfItemId=0,r.hasHalfItem=!1,d.isHalf=!1;for(var v=r.cart.length;v--;){var m=v;r.cart[m].item.isHalf&&r.remove(r.cart[m].$el)}}else e=!1,r.halfItemId=d.Id,r.hasHalfItem=!0;var y=d.isHalf&&r.hasHalfItem,b=y?"Half "+d.Name+" /":d.Name,w=y?"true":"false",x={};if(x.item=d,x.$el=o('<li class="item" data-menu-id="'+d.Id+'" data-calc-pending-half="'+w+'"><img class="item-thumb" src="'+l.nutrition.imagesPath+d.ThumbnailImgURL+'" alt=""><span class="item-title" >'+b+'</span><button class="item-delete-button" data-calc-delete>Delete Item</button></li>'),x.$el.find("[data-calc-delete]").on("click",function(t){var e=!y;t.preventDefault(),r.remove(x.$el,e)}),r.$itemsList.append(x.$el),r.cart.push(x),r.update(),e){u.track("Nutrition Calculator","Item-Added",x.item.Name),r.initialized||1!==r.cart.length||r.isOpen?r.initialized=!0:(r.toggleCalc(),r.initialized=!0);var _=f.postItemAdded(x.item.Id);_.done(function(t){t.cookie&&c.get("nutritionplanowner")!==t.cookie&&c.set("nutritionplanowner",t.cookie)})}}},i.prototype.remove=function(t,e){var n,r=this;t=t||!1,e=e||!1,t&&(s.forEach(r.cart,function(e,i){if(e.$el===t)return n=e.item,t.remove(),r.cart.splice(i,1),r.update(),!1}),e&&n&&(f.postItemRemoved(n.Id),u.track("Nutrition Calculator","Item-Removed",n.Name)))},i.prototype.clearCart=function(t){var e=this;t=t||!1,e.cart.length=0,e.hasHalfItem=!1,e.halfItemId=0,e.$itemsList.html(""),e.update(),t&&(f.postCartCleared(),u.track("Nutrition Calculator","Menu Reset"))},i.prototype.getAllMenuItems=function(){var t=this,e=d.get("pxMenuItems"),n=(new Date).getTime();if(e&&e.hasOwnProperty("dateSaved")&&e.dateSaved+36e5>n)o(window).trigger("Nutrition/GetAllItemsFromCache"),t.menuItems=e.data.List,t.halfTable=e.data.HalfAndHalfTable;else{var r=f.getAllItems();r.done(function(e){var r={dateSaved:n,data:e};d.set("pxMenuItems",r),t.menuItems=e.List,t.halfTable=e.HalfAndHalfTable}),r.fail(function(){})}},i.prototype.toggleCalc=function(){var t=this,e="open"===p.attr("data-state"),n=e?"closed":"open";p.attr("data-state",n),t.isOpen=!e,!e&&a.support.IS_MOBILE?o(window).trigger("Body-Prevent-Scroll"):o(window).trigger("Body-Resume-Scroll")},i.prototype.toggleNutrition=function(){var t="open"===p.attr("data-nutrition-state"),e=t?"closed":"open";p.attr("data-nutrition-state",e)},i.prototype.init=function(){var t=this;t.$itemsList.html("");var e=f.getCurrentCart();e.done(function(e){"object"==typeof e&&e.hasOwnProperty("MealPlates")&&(e.MealPlates[0].MealPlateItems.length?(s.forEach(e.MealPlates[0].MealPlateItems,function(e){t.add(e.MenuItemId)}),t.update()):t.clearCart(!1))}),e.fail(function(){t.clearCart(!1)}),t.getAllMenuItems(),o(".calc-toggle").on("click",function(e){e.preventDefault(),t.toggleCalc()}),o(".calc-mobile-close-button").on("click",function(e){e.preventDefault(),t.toggleCalc()}),o(".calc-nutrition-details-button").on("click",function(e){e.preventDefault(),t.toggleNutrition()}),o("[data-add-to-calc], [data-add-to-calc-half]").on("click",function(e){e.preventDefault();var n=!1,r=o(this).attr("data-add-to-calc");"undefined"==typeof r&&(r=o(this).attr("data-add-to-calc-half"),n=!0),t.add(r,!0,n),o(this).blur()}),o("[data-clear-calc]").on("click",function(e){e.preventDefault(),t.clearCart(!0)})},e.exports={init:r}},{"../helpers/analytics.js":11,"../helpers/cookie.js":12,"../helpers/local-storage.js":15,"../settings.js":26,"./ajax-menu.js":23,lodash:2}],25:[function(t,e,n){function r(){a("main.our-family-story").length&&(a("li.timeline-period").each(function(){s.push({$el:a(this),visible:!1})}),setInterval(i,500),i())}function i(){for(var t,e=0;t=s[e++];)!t.visible&&o(t.$el)&&(t.visible=!0,t.$el.attr("data-visible","true"))}function o(t){var e=t[0].getBoundingClientRect();return e.left>=0&&e.right<=(window.innerWidth||document.documentElement.clientWidth)&&e.top+(e.bottom-e.top)/2<=(window.innerHeight||document.documentElement.clientHeight)}var a=window.jQuery,s=[];t("lodash");e.exports={init:r}},{lodash:2}],26:[function(t,e,n){var r=!1,i=!1,o="",a="",s="",l="",u="",c="",f="",d="",p="",o="",a="",h="";r||(h="/userlocation",fundraiserUrl="/fundraiser-landing",getUserLocationEndpoint="/userlocation/getuserlocation",o="/userlocation/searchbycoordinates",a="/userlocation/searchbyquery",s="/userlocation/searchbyid",l="/meal/getcalculator/",u="/Menu/getall",c="/meal/additem/",f="/meal/removeitem/",d="/meal/reset/",p="https://s3.amazonaws.com/PandaExpressWebsite/Responsive/img/food/"),e.exports={debug:i,googleMaps:{ApiKey:"AIzaSyAoeHgnqOAt3YD59yuh27Sys_Q3JpX52yc",staticApiKey:"AIzaSyAoeHgnqOAt3YD59yuh27Sys_Q3JpX52yc",staticIconHref:"http://i.imgsafe.org/649972e.png",styles:[{featureType:"landscape",elementType:"all",stylers:[{hue:"#000000"}]},{featureType:"poi",elementType:"labels",stylers:[{visibility:"off"}]},{featureType:"road",elementType:"geometry.stroke",stylers:[{visibility:"off"}]}],mapIcon:"https://s3.us-east-1.amazonaws.com/PandaExpressWebsite/Responsive/img/home/map-icon.png",mapIconClosed:"https://s3.us-east-1.amazonaws.com/PandaExpressWebsite/Responsive/img/home/map-icon-closed.png"},locations:{limit:10,locationUrl:h,fundraiserUrl:fundraiserUrl,getUserLocationEndpoint:getUserLocationEndpoint,endPoints:{storesByLocation:o,storesByQuery:a,storeById:s},onlineOrderUrl:"http://order.pandaexpress.com/",defaultLat:0,defaultLong:0},nutrition:{getCurrentCartUrl:l,getAllItems:u,postItemAdded:c,postItemRemoved:f,postCartCleared:d,imagesPath:p+"thumbnails/"}}},{}],27:[function(t,e,n){function r(){s(window).trigger("Scripts/Setup"),i(),o(),l.init(),c.init(),a.support.IS_MOBILE&&u.init(),"function"!=typeof Object.create&&(Object.create=function(t,e){function n(){}if(n.prototype=t,"object"==typeof e)for(var r in e)e.hasOwnProperty(r)&&(n[r]=e[r]);return new n})}function i(){var t=s(window).width();a.support={},a.support={HAS_TOUCH:!!("ontouchstart"in window||window.DocumentTouch&&window.document instanceof window.DocumentTouch),IS_IE8:!!window.IS_IE8,IS_IE9:!!window.IS_IE9,IS_IE11:!window.ActiveXObject&&"ActiveXObject"in window},a.support.IS_MOBILE=!!(a.support.HAS_TOUCH&&t<768),a.support.IS_TABLET=!!(a.support.HAS_TOUCH&&t<=1024&&t>=768)}function o(){var t=a.support.HAS_TOUCH?"touch":"not-touch",e=a.support.IS_IE8?"ie8":"not-ie8",n=a.support.IS_IE9?"ie9":"not-ie9",r=a.support.IS_MOBILE?"mobile":"not-mobile",i=a.support.IS_TABLET?"tablet":"not-tablet",o=[t,e,r,n,i,"is-top"];o=o.join(" "),s("body").addClass(o),s(window).on("scrollStart",function(){s("body").addClass("is-scrolling")}),s(window).on("scrollStop",function(t,e){e=e||0,s("body").removeClass("is-scrolling"),e<10?s("body").addClass("is-top"):s("body").removeClass("is-top"),e<100?s("body").addClass("is-top-100"):s("body").removeClass("is-top-100")}),a.support.IS_IE11&&s("html").css("overflow","hidden")}var a=window.PX||{},s=window.jQuery,l=t("./helpers/window-events.js"),u=t("./helpers/geolocation.js"),c=t("./video.js");e.exports={init:r}},{"./helpers/geolocation.js":14,"./helpers/window-events.js":17,"./video.js":28}],28:[function(t,e,n){function r(t){t.length>1&&(d=c(window).scrollTop(),c(".video-modal").attr("data-state","visible"),c(window).on("keydown",a),u=new window.YT.Player("video-player",{videoId:t,playerVars:{rel:0},events:{onReady:i}}))}function i(t){f.support.IS_MOBILE||t.target.playVideo();var e=p.getParameterByName("dvi");null!=e&&e.length>0&&(c(".video-block[data-video-id*="+e+"]").focus(),c(".video-block[data-video-id*="+e+"]").trigger("click"))}function o(){u&&u.destroy(),c(".video-modal").attr("data-state","hidden"),c(".video-modal").find(".video-container").html('<div id="video-player"></div>'),c(window).off("keydown")}function a(t){27===t.which&&o()}function s(){var t=p.getParameterByName("dvi");if(c("[data-video-id]").length>0||t){c("body").prepend('<div class="video-modal" data-state="hidden"><div class="video-wrapper"><div class="video-container"><div id="video-player"></div></div></div</div>'),t&&c("body").append('<div style="display:none;" class="c12 video-block jade" data-video-id="'+t+'"><div class="container"><span class="play-icon" aria-label"Play Button, Click to play video"></span><span class="text">Watch the Commercial</span></div></div>');var e=document.createElement("script");e.src="https://www.youtube.com/iframe_api";var n=document.getElementsByTagName("script")[0];n.parentNode.insertBefore(e,n),c("[data-video-id]").on("click",function(){var t=c(this).data("video-id");f.support.IS_IE8?window.open("http://youtube.com?rel=0&v="+t):r(t)}),c(".video-modal").on("click",function(){o()}),null!=t&&t.length>0&&l(t)}}function l(t){"undefined"!=typeof window.YT&&"undefined"!=typeof window.YT.Player?(c(".video-block[data-video-id*="+t+"]").focus(),c(".video-block[data-video-id*="+t+"]").trigger("click")):setTimeout(function(){l(t)},250)}var u,c=window.jQuery,f=window.PX||{},d=0,p=t("./helpers/querystring.js");e.exports={init:s}},{"./helpers/querystring.js":16}]},{},[1]);;
