Privacy policy for AVSOX

Introduction

The site operator takes your right to privacy seriously, and wants you to feel comfortable using this site. This 'Privacy policy' covers personally-identifiable information (referred to as 'information' or 'data' below) that may be collected or acquired by this site. This policy does not apply to other entities that are not owned or controlled by the site operator, nor does it apply to persons that are not employees or agents of the site operator, or that are not under the site operator's control. Please take time to read this site's 'Terms of use'.

1. Collection of data

Registration for an account on this site requires only a valid e-mail address, a user name that is not already in use, your date of birth and the country you are from. You are not required to provide any other information if you do not want to.

Please be aware that the user name you choose, the e-mail address you provide and any other information you enter may render you personally identifiable, and may possibly be displayed on this site intentionally (depending on choices you make during the registration process, or depending on the way in which the site is configured) or unintentionally (subsequent to a successful act of intrusion by a third party).

As on many sites, the site operator may also automatically receive general information that is contained in server log files, such as your IP address, and cookie information, together with the additional information that can be deduced from those items (such as country, location, dates and times of visits, pages visited, etc.).

Server and site logs may be purged at regular time intervals, but past records may still exist in back-ups of the site data storage system or server file system.

By registering for a user account on this site, you agree that you accept the site operator's policy with regard to retention or non-retention of log records, and you agree that this policy may change at any time, with or without notice.

Please note that advertisements may also gather information via cookies. Information about the serving of advertising on this site (if it is indeed the site operator's policy to display advertising) is provided below.

2. Use of data

Data may be used to customise and improve your user experience on this site. Efforts will be made to prevent your data being made available to third parties, except in the following circumstances:

a. if there is a provision to the contrary in this 'Privacy policy';

b. if your consent is obtained, such as when you choose to opt-in or opt-out for the sharing of data;

c. if a service provided on the site requires interaction with a third party, or is provided by a third party, such as an application service provider;

d. if an obligation arises from legal action or law enforcement;

e. if this site is purchased by a third party, in which case that third party will be able to use the data in the same manner as set out in this policy.

In the event you choose to use links displayed on this site to visit other sites, you are advised to read the privacy policies published on those sites.

3. Cookies

Like many sites, this site sets and uses cookies to enhance your user experience - to remember your personal settings, for instance. The cookies set by this site are only used for technical purposes (storage of settings, and access control, etc.). They are not used to gather other information about you, or to provide information to other parties. The site's advertising providers, if any, do not have access to this site's cookies.

However, advertisements may be displayed on the site and, if so, may also set and access cookies on your computer; such cookies are subject to the privacy policies of the parties providing the advertisement. Cookies set by outside advertising providers often use non-personally-identifiable or anonymous codes to obtain information about your visits to a site that displays their advertising, in order to tailor the advertising you see. This practice is known as 'behavioural advertising'. You can usefully visit the Network Advertising Initiative site if you want to find out more information about behavioural advertising, and to learn about your options in this respect.

By using this site and by allowing your browser software to accept cookies, you grant the site operator permission to use the technical data contained in the cookies generated by the site for the purpose of managing your sessions on the site, and for enhancing the ergonomics of your visits.

Note that most browsers provide the possibility of disabling cookies. While you are free to make this choice, you may find your usage of the site to be slightly impaired, although the site will remain functionally useable.

4. JavaScript

Like many sites, this site employs JavaScript to enhance your user experience - to provide dynamic content, for example, that adapts and reacts to your choices and actions. The JavaScript scripts used on this site are only intended for such technical purposes. They are not designed to gather information about you for any other purposes, nor to permanently affect or make changes to your browser or system.

By using this site and enabling your browser software to accept JavaScript, you grant the site operator permission to use JavaScript technology (Ajax) for managing your sessions on the site, and for enhancing the ergonomics of your visits.

Note that most browsers provide the option of disabling JavaScript in Web pages. While you are free to make this choice, most or all pages are designed to provide a fully useable content only with enabling of JavaScript.

5. Advertising

By registering for a user account on this site, you agree that you accept the site operator's policy with regard to advertising and whether or not advertising is served on the site, and you agree that this policy may change at any time, with or without notice.

However, if you see content on this site that you feel is offensive or inappropriate, please contact the site administrator.

6. Minors

The site operator might not allow people to register for a user account on the site if they are below a certain age. For more information, please read the information displayed during the account registration process.

7. Editing or deleting your personal information

During the user account registration process, you are invited to enter personal information. After logging into the site, you have the possibility at any time of amending or deleting your personal information. You can do this by visiting your user account panel, which can provide means for managing many aspects of your membership of this site.

8. User account closure and deletion

8.1. Account deletion at your request

You can request that your user account be deleted: please contact the site administrator to request a manual user account deletion.

After an account deletion, all personal information items contained in your user account profile will have been deleted from the site's data storage system, and from the server's file system. Even so, that information will still be held in any back-up taken from the site's data storage system or the server's file system.

In addition, content or other data that you may have provided, and that do not fall within the scope of personal information items stored within your user account profile, may remain on the site even after your user account is deleted. Possible examples of this are articles and other content published in the site's pages, comments you have added to articles, and messages you have posted in forums (if such exist on the site). Your user name may continue to be associated with these items as attribution. However, any information that would previously have been displayable by another user by viewing your account profile will no longer be available.

Also, if the site has a private messaging system, all messages that were previously stored in your private messaging mailbox will have been deleted. However, deletion of your account does not include deletion of messages from you that have been received by other registered users of the site.

You should remember that deletion of a user account on this site will not include deletion of information held by providers of outside services availed via this site.

Furthermore, deletion of your account on this site will not include deletion of information that might have been stored in server logs and site logs about your visits to this site (IP address, times and dates, pages visited, etc.). The extent and lifetime of information stored in logs depends on the policies of the site operator and server operator.

8.2. Account closure and deletion by the site operato

For the purpose of this 'Privacy policy', the term 'account closure' means interdiction of your further access to your user account. The term 'account deletion' means deletion of your user account and personal information from the site data storage system.

Your user account may be closed if it is found that your use of this site violates the site operator's 'Terms of use' or other applicable usage guidelines, or if it is deemed desirable by the site operator to protect the site operator's interests and/or property.

A closed account will normally be deleted, provided no illicit or illegal usage of that account is suspected. However, by using this site, you agree that the site operator has sole discretion in account closure and deletion decisions, without incurring any liability towards you.

In addition, you should be aware that the site operator can be legally compelled not to delete your user account by local or national authorities, if suspected illegal or illicit usage is involved.

Please see the site's 'Terms of use' for more information.

9. Changes to this privacy policy

Changes may be made to this 'Privacy policy' from time to time. You should be notified of noteworthy changes by one or more of the following means:

a. the posting of an announcement on the site;

b. a requirement to read and accept the new 'Privacy policy' before you can log into the site;

c. an e-mail message sent to the e-mail address you provide as part of your user account information.

Nothwithstanding, failure to post notification of changes to the site's 'Privacy policy' will in no way invalidate the application of the new clauses of the 'Privacy policy', which you are recommended to re-read regularly.

10. NO GUARANTEES

This 'Privacy policy' states intentions for preservation of information. However, while efforts will be made to fulfill the said intentions, the site operator is not in a position to guarantee non-disclosure of information. There may be factors beyond the site operator's control that may result in disclosure of information. Consequently, although the site operator will endeavour to protect your personal information, no warranties are given as regards the preservation or non-disclosure of information or data.

W3siaWQiOiJhZHN0X2pfUE9QVU5ERVIiLCJhZHNwb3QiOiJqX1BPUFVOREVSIiwid2VpZ2h0IjoiNSIsImZjYXAiOiIyIiwic2NoZWR1bGUiOmZhbHNlLCJtYXhXaWR0aCI6ZmFsc2UsIm1pbldpZHRoIjoiNzY4IiwidGltZXpvbmUiOmZhbHNlLCJleGNsdWRlIjpmYWxzZSwiZG9tYWluIjpmYWxzZSwiY29kZSI6IjxzY3JpcHQgdHlwZT0ndGV4dFwvamF2YXNjcmlwdCcgc3JjPSdcL1wvcGwxMTA3NjQucHVodG1sLmNvbVwvZjdcLzQ4XC82YVwvZjc0ODZhMDBjMjA0YjRmMGM4ZGU0NTZkN2JhNjQ2ZTAuanMnPjxcL3NjcmlwdD4ifSx7ImlkIjoiY2xpY19qX1BPUFVOREVSIiwiYWRzcG90Ijoial9QT1BVTkRFUiIsIndlaWdodCI6IjciLCJmY2FwIjoiMiIsInNjaGVkdWxlIjpmYWxzZSwibWF4V2lkdGgiOmZhbHNlLCJtaW5XaWR0aCI6ZmFsc2UsInRpbWV6b25lIjpmYWxzZSwiZXhjbHVkZSI6ZmFsc2UsImRvbWFpbiI6ZmFsc2UsImNvZGUiOiI8c2NyaXB0IGRhdGEtY2Zhc3luYz1cImZhbHNlXCIgdHlwZT1cInRleHRcL2phdmFzY3JpcHRcIiBzcmM9XCJcL1wvMmNuanVoMzRqYnBvaW50LmNvbVwvdFwvOVwvZnJldFwvbWVvdzRcLzM2OTA4OVwvYnJ0LmpzXCI+PFwvc2NyaXB0PiJ9LHsiaWQiOiJleG9jX2pfUE9QVU5ERVIiLCJhZHNwb3QiOiJqX1BPUFVOREVSIiwid2VpZ2h0IjoiNiIsImZjYXAiOiIyIiwic2NoZWR1bGUiOmZhbHNlLCJtYXhXaWR0aCI6ZmFsc2UsIm1pbldpZHRoIjoiNzY4IiwidGltZXpvbmUiOmZhbHNlLCJleGNsdWRlIjpmYWxzZSwiZG9tYWluIjpmYWxzZSwiY29kZSI6IjxzY3JpcHQgdHlwZT1cImFwcGxpY2F0aW9uXC9qYXZhc2NyaXB0XCI+XHJcbihmdW5jdGlvbigpIHtcclxuXHJcbiAgICBcL1wvdmVyc2lvbiAxLjAuMFxyXG5cclxuICAgIHZhciBhZENvbmZpZyA9IHtcclxuICAgIFwiYWRzX2hvc3RcIjogXCJhLnBlbXNydi5jb21cIixcclxuICAgIFwic3luZGljYXRpb25faG9zdFwiOiBcInMucGVtc3J2LmNvbVwiLFxyXG4gICAgXCJpZHpvbmVcIjogMTAwODEzNCxcclxuICAgIFwicG9wdXBfZmFsbGJhY2tcIjogZmFsc2UsXHJcbiAgICBcInBvcHVwX2ZvcmNlXCI6IGZhbHNlLFxyXG4gICAgXCJjaHJvbWVfZW5hYmxlZFwiOiB0cnVlLFxyXG4gICAgXCJuZXdfdGFiXCI6IGZhbHNlLFxyXG4gICAgXCJmcmVxdWVuY3lfcGVyaW9kXCI6IDcyMCxcclxuICAgIFwiZnJlcXVlbmN5X2NvdW50XCI6IDEsXHJcbiAgICBcInRyaWdnZXJfbWV0aG9kXCI6IDMsXHJcbiAgICBcInRyaWdnZXJfY2xhc3NcIjogXCJcIixcclxuICAgIFwidHJpZ2dlcl9kZWxheVwiOiAwLFxyXG4gICAgXCJvbmx5X2lubGluZVwiOiBmYWxzZVxyXG59O1xyXG5cclxuaWYoIXdpbmRvdy5kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKXtkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsPWRvY3VtZW50LmJvZHkucXVlcnlTZWxlY3RvckFsbD1PYmplY3QucXVlcnlTZWxlY3RvckFsbD1mdW5jdGlvbiBxdWVyeVNlbGVjdG9yQWxsUG9seWZpbGwocixjLGksaixhKXt2YXIgZD1kb2N1bWVudCxzPWQuY3JlYXRlU3R5bGVTaGVldCgpO2E9ZC5hbGw7Yz1bXTtyPXIucmVwbGFjZShcL1xcW2ZvclxcYlwvZ2ksXCJbaHRtbEZvclwiKS5zcGxpdChcIixcIik7Zm9yKGk9ci5sZW5ndGg7aS0tOyl7cy5hZGRSdWxlKHJbaV0sXCJrOnZcIik7Zm9yKGo9YS5sZW5ndGg7ai0tOyl7YVtqXS5jdXJyZW50U3R5bGUuayYmYy5wdXNoKGFbal0pfXMucmVtb3ZlUnVsZSgwKX1yZXR1cm4gY319dmFyIHBvcE1hZ2ljPXt2ZXJzaW9uOjEsY29va2llX25hbWU6XCJcIix1cmw6XCJcIixjb25maWc6e30sb3Blbl9jb3VudDowLHRvcDpudWxsLGJyb3dzZXI6bnVsbCx2ZW5vcl9sb2FkZWQ6ZmFsc2UsdmVub3I6ZmFsc2UsY29uZmlnVHBsOnthZHNfaG9zdDpcIlwiLHN5bmRpY2F0aW9uX2hvc3Q6XCJcIixpZHpvbmU6XCJcIixmcmVxdWVuY3lfcGVyaW9kOjcyMCxmcmVxdWVuY3lfY291bnQ6MSx0cmlnZ2VyX21ldGhvZDoxLHRyaWdnZXJfY2xhc3M6XCJcIixwb3B1cF9mb3JjZTpmYWxzZSxwb3B1cF9mYWxsYmFjazpmYWxzZSxjaHJvbWVfZW5hYmxlZDp0cnVlLG5ld190YWI6ZmFsc2UsY2F0OlwiXCIsdGFnczpcIlwiLGVsOlwiXCIsc3ViOlwiXCIsc3ViMjpcIlwiLHN1YjM6XCJcIixvbmx5X2lubGluZTpmYWxzZSx0cmlnZ2VyX2RlbGF5OjAsY29va2llY29uc2VudDp0cnVlfSxpbml0OmZ1bmN0aW9uKGNvbmZpZyl7aWYodHlwZW9mIGNvbmZpZy5pZHpvbmU9PT1cInVuZGVmaW5lZFwifHwhY29uZmlnLmlkem9uZSl7cmV0dXJufWlmKHR5cGVvZiBjb25maWdbXCJjdXN0b21UYXJnZXRpbmdcIl09PT1cInVuZGVmaW5lZFwiKXtjb25maWdbXCJjdXN0b21UYXJnZXRpbmdcIl09W119d2luZG93W1wiY3VzdG9tVGFyZ2V0aW5nXCJdPWNvbmZpZ1tcImN1c3RvbVRhcmdldGluZ1wiXXx8bnVsbDt2YXIgY3VzdG9tVGFyZ2V0aW5nPU9iamVjdC5rZXlzKGNvbmZpZ1tcImN1c3RvbVRhcmdldGluZ1wiXSkuZmlsdGVyKGZ1bmN0aW9uKGMpe3JldHVybiBjLnNlYXJjaChcImV4X1wiKT49MH0pO2lmKGN1c3RvbVRhcmdldGluZy5sZW5ndGgpe2N1c3RvbVRhcmdldGluZy5mb3JFYWNoKGZ1bmN0aW9uKGN0KXtyZXR1cm4gdGhpcy5jb25maWdUcGxbY3RdPW51bGx9LmJpbmQodGhpcykpfWZvcih2YXIga2V5IGluIHRoaXMuY29uZmlnVHBsKXtpZighT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuY29uZmlnVHBsLGtleSkpe2NvbnRpbnVlfWlmKHR5cGVvZiBjb25maWdba2V5XSE9PVwidW5kZWZpbmVkXCIpe3RoaXMuY29uZmlnW2tleV09Y29uZmlnW2tleV19ZWxzZXt0aGlzLmNvbmZpZ1trZXldPXRoaXMuY29uZmlnVHBsW2tleV19fWlmKHR5cGVvZiB0aGlzLmNvbmZpZy5pZHpvbmU9PT1cInVuZGVmaW5lZFwifHx0aGlzLmNvbmZpZy5pZHpvbmU9PT1cIlwiKXtyZXR1cm59aWYodGhpcy5jb25maWcub25seV9pbmxpbmUhPT10cnVlKXt0aGlzLmxvYWRIb3N0ZWQoKX10aGlzLmFkZEV2ZW50VG9FbGVtZW50KHdpbmRvdyxcImxvYWRcIix0aGlzLnByZXBhcmVQb3ApfSxnZXRDb3VudEZyb21Db29raWU6ZnVuY3Rpb24oKXtpZighdGhpcy5jb25maWcuY29va2llY29uc2VudCl7cmV0dXJuIDB9dmFyIHNob3duQ29va2llPXBvcE1hZ2ljLmdldENvb2tpZShwb3BNYWdpYy5jb29raWVfbmFtZSk7dmFyIGN0cj10eXBlb2Ygc2hvd25Db29raWU9PT1cInVuZGVmaW5lZFwiPzA6cGFyc2VJbnQoc2hvd25Db29raWUpO2lmKGlzTmFOKGN0cikpe2N0cj0wfXJldHVybiBjdHJ9LGdldExhc3RPcGVuZWRUaW1lRnJvbUNvb2tpZTpmdW5jdGlvbigpe3ZhciBzaG93bkNvb2tpZT1wb3BNYWdpYy5nZXRDb29raWUocG9wTWFnaWMuY29va2llX25hbWUpO3ZhciBkZWxheT1udWxsO2lmKHR5cGVvZiBzaG93bkNvb2tpZSE9PVwidW5kZWZpbmVkXCIpe3ZhciB2YWx1ZT1zaG93bkNvb2tpZS5zcGxpdChcIjtcIilbMV07ZGVsYXk9dmFsdWU+MD9wYXJzZUludCh2YWx1ZSk6MH1pZihpc05hTihkZWxheSkpe2RlbGF5PW51bGx9cmV0dXJuIGRlbGF5fSxzaG91bGRTaG93OmZ1bmN0aW9uKCl7aWYocG9wTWFnaWMub3Blbl9jb3VudD49cG9wTWFnaWMuY29uZmlnLmZyZXF1ZW5jeV9jb3VudCl7cmV0dXJuIGZhbHNlfXZhciBjdHI9cG9wTWFnaWMuZ2V0Q291bnRGcm9tQ29va2llKCk7Y29uc3QgbGFzdF9vcGVuZWRfdGltZT1wb3BNYWdpYy5nZXRMYXN0T3BlbmVkVGltZUZyb21Db29raWUoKTtjb25zdCBjdXJyZW50X3RpbWU9TWF0aC5mbG9vcihEYXRlLm5vdygpXC8xZTMpO2NvbnN0IG1heGltdW1EZWxheVRpbWU9bGFzdF9vcGVuZWRfdGltZStwb3BNYWdpYy5jb25maWcudHJpZ2dlcl9kZWxheTtpZihsYXN0X29wZW5lZF90aW1lJiZtYXhpbXVtRGVsYXlUaW1lPmN1cnJlbnRfdGltZSl7cmV0dXJuIGZhbHNlfXBvcE1hZ2ljLm9wZW5fY291bnQ9Y3RyO3JldHVybiEoY3RyPj1wb3BNYWdpYy5jb25maWcuZnJlcXVlbmN5X2NvdW50KX0sdmVub3JTaG91bGRTaG93OmZ1bmN0aW9uKCl7cmV0dXJuIHBvcE1hZ2ljLnZlbm9yX2xvYWRlZCYmcG9wTWFnaWMudmVub3I9PT1cIjBcIn0sc2V0QXNPcGVuZWQ6ZnVuY3Rpb24oKXt2YXIgbmV3X2N0cj0xO2lmKHBvcE1hZ2ljLm9wZW5fY291bnQhPT0wKXtuZXdfY3RyPXBvcE1hZ2ljLm9wZW5fY291bnQrMX1lbHNle25ld19jdHI9cG9wTWFnaWMuZ2V0Q291bnRGcm9tQ29va2llKCkrMX1jb25zdCBsYXN0X29wZW5lZF90aW1lPU1hdGguZmxvb3IoRGF0ZS5ub3coKVwvMWUzKTtpZihwb3BNYWdpYy5jb25maWcuY29va2llY29uc2VudCl7cG9wTWFnaWMuc2V0Q29va2llKHBvcE1hZ2ljLmNvb2tpZV9uYW1lLGAke25ld19jdHJ9OyR7bGFzdF9vcGVuZWRfdGltZX1gLHBvcE1hZ2ljLmNvbmZpZy5mcmVxdWVuY3lfcGVyaW9kKX19LGxvYWRIb3N0ZWQ6ZnVuY3Rpb24oKXt2YXIgaG9zdGVkU2NyaXB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIik7aG9zdGVkU2NyaXB0LnR5cGU9XCJhcHBsaWNhdGlvblwvamF2YXNjcmlwdFwiO2hvc3RlZFNjcmlwdC5hc3luYz10cnVlO2hvc3RlZFNjcmlwdC5zcmM9XCJcL1wvXCIrdGhpcy5jb25maWcuYWRzX2hvc3QrXCJcL3BvcHVuZGVyMTAwMC5qc1wiO2hvc3RlZFNjcmlwdC5pZD1cInBvcG1hZ2ljbGRyXCI7Zm9yKHZhciBrZXkgaW4gdGhpcy5jb25maWcpe2lmKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5jb25maWcsa2V5KSl7Y29udGludWV9aWYoa2V5PT09XCJhZHNfaG9zdFwifHxrZXk9PT1cInN5bmRpY2F0aW9uX2hvc3RcIil7Y29udGludWV9aG9zdGVkU2NyaXB0LnNldEF0dHJpYnV0ZShcImRhdGEtZXhvLVwiK2tleSx0aGlzLmNvbmZpZ1trZXldKX12YXIgaW5zZXJ0QW5jaG9yPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiYm9keVwiKS5pdGVtKDApO2lmKGluc2VydEFuY2hvci5maXJzdENoaWxkKXtpbnNlcnRBbmNob3IuaW5zZXJ0QmVmb3JlKGhvc3RlZFNjcmlwdCxpbnNlcnRBbmNob3IuZmlyc3RDaGlsZCl9ZWxzZXtpbnNlcnRBbmNob3IuYXBwZW5kQ2hpbGQoaG9zdGVkU2NyaXB0KX19LHByZXBhcmVQb3A6ZnVuY3Rpb24oKXtpZih0eXBlb2YgZXhvSnNQb3AxMDE9PT1cIm9iamVjdFwiJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZXhvSnNQb3AxMDEsXCJhZGRcIikpe3JldHVybn1wb3BNYWdpYy50b3A9c2VsZjtpZihwb3BNYWdpYy50b3AhPT1zZWxmKXt0cnl7aWYodG9wLmRvY3VtZW50LmxvY2F0aW9uLnRvU3RyaW5nKCkpe3BvcE1hZ2ljLnRvcD10b3B9fWNhdGNoKGVycil7fX1wb3BNYWdpYy5jb29raWVfbmFtZT1cInpvbmUtY2FwLVwiK3BvcE1hZ2ljLmNvbmZpZy5pZHpvbmU7aWYocG9wTWFnaWMuc2hvdWxkU2hvdygpKXt2YXIgeG1saHR0cD1uZXcgWE1MSHR0cFJlcXVlc3Q7eG1saHR0cC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXtpZih4bWxodHRwLnJlYWR5U3RhdGU9PVhNTEh0dHBSZXF1ZXN0LkRPTkUpe3BvcE1hZ2ljLnZlbm9yX2xvYWRlZD10cnVlO2lmKHhtbGh0dHAuc3RhdHVzPT0yMDApe3BvcE1hZ2ljLnZlbm9yPXhtbGh0dHAucmVzcG9uc2VUZXh0fWVsc2V7cG9wTWFnaWMudmVub3I9XCIwXCJ9fX07dmFyIHByb3RvY29sPWRvY3VtZW50LmxvY2F0aW9uLnByb3RvY29sIT09XCJodHRwczpcIiYmZG9jdW1lbnQubG9jYXRpb24ucHJvdG9jb2whPT1cImh0dHA6XCI/XCJodHRwczpcIjpkb2N1bWVudC5sb2NhdGlvbi5wcm90b2NvbDt4bWxodHRwLm9wZW4oXCJHRVRcIixwcm90b2NvbCtcIlwvXC9cIitwb3BNYWdpYy5jb25maWcuc3luZGljYXRpb25faG9zdCtcIlwvdmVub3IucGhwXCIsdHJ1ZSk7dHJ5e3htbGh0dHAuc2VuZCgpfWNhdGNoKGVycm9yKXtwb3BNYWdpYy52ZW5vcl9sb2FkZWQ9dHJ1ZX19cG9wTWFnaWMuYnVpbGRVcmwoKTtwb3BNYWdpYy5icm93c2VyPXBvcE1hZ2ljLmJyb3dzZXJEZXRlY3Rvci5kZXRlY3RCcm93c2VyKG5hdmlnYXRvci51c2VyQWdlbnQpO2lmKCFwb3BNYWdpYy5jb25maWcuY2hyb21lX2VuYWJsZWQmJihwb3BNYWdpYy5icm93c2VyLm5hbWU9PT1cImNocm9tZVwifHxwb3BNYWdpYy5icm93c2VyLm5hbWU9PT1cImNyaW9zXCIpKXtyZXR1cm59dmFyIHBvcE1ldGhvZD1wb3BNYWdpYy5nZXRQb3BNZXRob2QocG9wTWFnaWMuYnJvd3Nlcik7cG9wTWFnaWMuYWRkRXZlbnQoXCJjbGlja1wiLHBvcE1ldGhvZCl9LGdldFBvcE1ldGhvZDpmdW5jdGlvbihicm93c2VySW5mbyl7aWYocG9wTWFnaWMuY29uZmlnLnBvcHVwX2ZvcmNlKXtyZXR1cm4gcG9wTWFnaWMubWV0aG9kcy5wb3B1cH1pZihwb3BNYWdpYy5jb25maWcucG9wdXBfZmFsbGJhY2smJmJyb3dzZXJJbmZvLm5hbWU9PT1cImNocm9tZVwiJiZicm93c2VySW5mby52ZXJzaW9uPj02OCYmIWJyb3dzZXJJbmZvLmlzTW9iaWxlKXtyZXR1cm4gcG9wTWFnaWMubWV0aG9kcy5wb3B1cH1pZihicm93c2VySW5mby5pc01vYmlsZSl7cmV0dXJuIHBvcE1hZ2ljLm1ldGhvZHMuZGVmYXVsdH1pZihicm93c2VySW5mby5uYW1lPT09XCJjaHJvbWVcIil7cmV0dXJuIHBvcE1hZ2ljLm1ldGhvZHMuY2hyb21lVGFifXJldHVybiBwb3BNYWdpYy5tZXRob2RzLmRlZmF1bHR9LGJ1aWxkVXJsOmZ1bmN0aW9uKCl7dmFyIHByb3RvY29sPWRvY3VtZW50LmxvY2F0aW9uLnByb3RvY29sIT09XCJodHRwczpcIiYmZG9jdW1lbnQubG9jYXRpb24ucHJvdG9jb2whPT1cImh0dHA6XCI/XCJodHRwczpcIjpkb2N1bWVudC5sb2NhdGlvbi5wcm90b2NvbDt2YXIgcD10b3A9PT1zZWxmP2RvY3VtZW50LlVSTDpkb2N1bWVudC5yZWZlcnJlcjt2YXIgc2NyaXB0X2luZm89e3R5cGU6XCJpbmxpbmVcIixuYW1lOlwicG9wTWFnaWNcIix2ZXI6dGhpcy52ZXJzaW9ufTt2YXIgZW5jb2RlU2NyaXB0SW5mbz1mdW5jdGlvbihzY3JpcHRfaW5mbyl7dmFyIHJlc3VsdD1zY3JpcHRfaW5mb1tcInR5cGVcIl0rXCJ8XCIrc2NyaXB0X2luZm9bXCJuYW1lXCJdK1wifFwiK3NjcmlwdF9pbmZvW1widmVyXCJdO3JldHVybiBlbmNvZGVVUklDb21wb25lbnQoYnRvYShyZXN1bHQpKX07dmFyIGN1c3RvbVRhcmdldGluZ1BhcmFtcz1cIlwiO2lmKGN1c3RvbVRhcmdldGluZyYmT2JqZWN0LmtleXMoY3VzdG9tVGFyZ2V0aW5nKS5sZW5ndGgpe3ZhciBjdXN0b21UYXJnZXRpbmdLZXlzPXR5cGVvZiBjdXN0b21UYXJnZXRpbmc9PT1cIm9iamVjdFwiP09iamVjdC5rZXlzKGN1c3RvbVRhcmdldGluZyk6Y3VzdG9tVGFyZ2V0aW5nO3ZhciB2YWx1ZTtjdXN0b21UYXJnZXRpbmdLZXlzLmZvckVhY2goZnVuY3Rpb24oa2V5KXtpZih0eXBlb2YgY3VzdG9tVGFyZ2V0aW5nPT09XCJvYmplY3RcIil7dmFsdWU9Y3VzdG9tVGFyZ2V0aW5nW2tleV19ZWxzZSBpZihBcnJheS5pc0FycmF5KGN1c3RvbVRhcmdldGluZykpe3ZhbHVlPXNjcmlwdEVsLmdldEF0dHJpYnV0ZShrZXkpfXZhciBrZXlXaXRob3V0RXhvUHJlZml4PWtleS5yZXBsYWNlKFwiZGF0YS1leG8tXCIsXCJcIik7Y3VzdG9tVGFyZ2V0aW5nUGFyYW1zKz1gJiR7a2V5V2l0aG91dEV4b1ByZWZpeH09JHt2YWx1ZX1gfSl9dGhpcy51cmw9cHJvdG9jb2wrXCJcL1wvXCIrdGhpcy5jb25maWcuc3luZGljYXRpb25faG9zdCtcIlwvc3BsYXNoLnBocFwiK1wiP2NhdD1cIit0aGlzLmNvbmZpZy5jYXQrXCImaWR6b25lPVwiK3RoaXMuY29uZmlnLmlkem9uZStcIiZ0eXBlPThcIitcIiZwPVwiK2VuY29kZVVSSUNvbXBvbmVudChwKStcIiZzdWI9XCIrdGhpcy5jb25maWcuc3ViKyh0aGlzLmNvbmZpZy5zdWIyIT09XCJcIj9cIiZzdWIyPVwiK3RoaXMuY29uZmlnLnN1YjI6XCJcIikrKHRoaXMuY29uZmlnLnN1YjMhPT1cIlwiP1wiJnN1YjM9XCIrdGhpcy5jb25maWcuc3ViMzpcIlwiKStcIiZibG9jaz0xXCIrXCImZWw9XCIrdGhpcy5jb25maWcuZWwrXCImdGFncz1cIit0aGlzLmNvbmZpZy50YWdzK1wiJmNvb2tpZWNvbnNlbnQ9XCIrdGhpcy5jb25maWcuY29va2llY29uc2VudCtcIiZzY3JfaW5mbz1cIitlbmNvZGVTY3JpcHRJbmZvKHNjcmlwdF9pbmZvKStjdXN0b21UYXJnZXRpbmdQYXJhbXN9LGFkZEV2ZW50VG9FbGVtZW50OmZ1bmN0aW9uKG9iaix0eXBlLGZuKXtpZihvYmouYWRkRXZlbnRMaXN0ZW5lcil7b2JqLmFkZEV2ZW50TGlzdGVuZXIodHlwZSxmbixmYWxzZSl9ZWxzZSBpZihvYmouYXR0YWNoRXZlbnQpe29ialtcImVcIit0eXBlK2ZuXT1mbjtvYmpbdHlwZStmbl09ZnVuY3Rpb24oKXtvYmpbXCJlXCIrdHlwZStmbl0od2luZG93LmV2ZW50KX07b2JqLmF0dGFjaEV2ZW50KFwib25cIit0eXBlLG9ialt0eXBlK2ZuXSl9ZWxzZXtvYmpbXCJvblwiK3R5cGVdPW9ialtcImVcIit0eXBlK2ZuXX19LGFkZEV2ZW50OmZ1bmN0aW9uKHR5cGUsZm4pe3ZhciB0YXJnZXRFbGVtZW50cztpZihwb3BNYWdpYy5jb25maWcudHJpZ2dlcl9tZXRob2Q9PVwiM1wiKXt0YXJnZXRFbGVtZW50cz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiYVwiKTtmb3IoaT0wO2k8dGFyZ2V0RWxlbWVudHMubGVuZ3RoO2krKyl7cG9wTWFnaWMuYWRkRXZlbnRUb0VsZW1lbnQodGFyZ2V0RWxlbWVudHNbaV0sdHlwZSxmbil9cmV0dXJufWlmKHBvcE1hZ2ljLmNvbmZpZy50cmlnZ2VyX21ldGhvZD09XCIyXCImJnBvcE1hZ2ljLmNvbmZpZy50cmlnZ2VyX21ldGhvZCE9XCJcIil7dmFyIHRyaWdnZXJfY2xhc3Nlczt2YXIgdHJpZ2dlcl9jbGFzc2VzX2ZpbmFsPVtdO2lmKHBvcE1hZ2ljLmNvbmZpZy50cmlnZ2VyX2NsYXNzLmluZGV4T2YoXCIsXCIpPT09LTEpe3RyaWdnZXJfY2xhc3Nlcz1wb3BNYWdpYy5jb25maWcudHJpZ2dlcl9jbGFzcy5zcGxpdChcIiBcIil9ZWxzZXt2YXIgdHJpbW1lZF90cmlnZ2VyX2NsYXNzZXM9cG9wTWFnaWMuY29uZmlnLnRyaWdnZXJfY2xhc3MucmVwbGFjZShcL1xcc1wvZyxcIlwiKTt0cmlnZ2VyX2NsYXNzZXM9dHJpbW1lZF90cmlnZ2VyX2NsYXNzZXMuc3BsaXQoXCIsXCIpfWZvcih2YXIgaT0wO2k8dHJpZ2dlcl9jbGFzc2VzLmxlbmd0aDtpKyspe2lmKHRyaWdnZXJfY2xhc3Nlc1tpXSE9PVwiXCIpe3RyaWdnZXJfY2xhc3Nlc19maW5hbC5wdXNoKFwiLlwiK3RyaWdnZXJfY2xhc3Nlc1tpXSl9fXRhcmdldEVsZW1lbnRzPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodHJpZ2dlcl9jbGFzc2VzX2ZpbmFsLmpvaW4oXCIsIFwiKSk7Zm9yKGk9MDtpPHRhcmdldEVsZW1lbnRzLmxlbmd0aDtpKyspe3BvcE1hZ2ljLmFkZEV2ZW50VG9FbGVtZW50KHRhcmdldEVsZW1lbnRzW2ldLHR5cGUsZm4pfXJldHVybn1wb3BNYWdpYy5hZGRFdmVudFRvRWxlbWVudChkb2N1bWVudCx0eXBlLGZuKX0sc2V0Q29va2llOmZ1bmN0aW9uKG5hbWUsdmFsdWUsdHRsX21pbnV0ZXMpe2lmKCF0aGlzLmNvbmZpZy5jb29raWVjb25zZW50KXtyZXR1cm4gZmFsc2V9dHRsX21pbnV0ZXM9cGFyc2VJbnQodHRsX21pbnV0ZXMsMTApO3ZhciBub3dfZGF0ZT1uZXcgRGF0ZTtub3dfZGF0ZS5zZXRNaW51dGVzKG5vd19kYXRlLmdldE1pbnV0ZXMoKStwYXJzZUludCh0dGxfbWludXRlcykpO3ZhciBjX3ZhbHVlPWVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSkrXCI7IGV4cGlyZXM9XCIrbm93X2RhdGUudG9VVENTdHJpbmcoKStcIjsgcGF0aD1cL1wiO2RvY3VtZW50LmNvb2tpZT1uYW1lK1wiPVwiK2NfdmFsdWV9LGdldENvb2tpZTpmdW5jdGlvbihuYW1lKXtpZighdGhpcy5jb25maWcuY29va2llY29uc2VudCl7cmV0dXJuIGZhbHNlfXZhciBpLHgseSxjb29raWVzQXJyYXk9ZG9jdW1lbnQuY29va2llLnNwbGl0KFwiO1wiKTtmb3IoaT0wO2k8Y29va2llc0FycmF5Lmxlbmd0aDtpKyspe3g9Y29va2llc0FycmF5W2ldLnN1YnN0cigwLGNvb2tpZXNBcnJheVtpXS5pbmRleE9mKFwiPVwiKSk7eT1jb29raWVzQXJyYXlbaV0uc3Vic3RyKGNvb2tpZXNBcnJheVtpXS5pbmRleE9mKFwiPVwiKSsxKTt4PXgucmVwbGFjZShcL15cXHMrfFxccyskXC9nLFwiXCIpO2lmKHg9PT1uYW1lKXtyZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHkpfX19LHJhbmRTdHI6ZnVuY3Rpb24obGVuZ3RoLHBvc3NpYmxlQ2hhcnMpe3ZhciB0ZXh0PVwiXCI7dmFyIHBvc3NpYmxlPXBvc3NpYmxlQ2hhcnN8fFwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODlcIjtmb3IodmFyIGk9MDtpPGxlbmd0aDtpKyspe3RleHQrPXBvc3NpYmxlLmNoYXJBdChNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqcG9zc2libGUubGVuZ3RoKSl9cmV0dXJuIHRleHR9LGlzVmFsaWRVc2VyRXZlbnQ6ZnVuY3Rpb24oZXZlbnQpe2lmKFwiaXNUcnVzdGVkXCJpbiBldmVudCYmZXZlbnQuaXNUcnVzdGVkJiZwb3BNYWdpYy5icm93c2VyLm5hbWUhPT1cImllXCImJnBvcE1hZ2ljLmJyb3dzZXIubmFtZSE9PVwic2FmYXJpXCIpe3JldHVybiB0cnVlfWVsc2V7cmV0dXJuIGV2ZW50LnNjcmVlblghPTAmJmV2ZW50LnNjcmVlblkhPTB9fSxpc1ZhbGlkSHJlZjpmdW5jdGlvbihocmVmKXtpZih0eXBlb2YgaHJlZj09PVwidW5kZWZpbmVkXCJ8fGhyZWY9PVwiXCIpe3JldHVybiBmYWxzZX12YXIgZW1wdHlfcmVmPVwvXFxzP2phdmFzY3JpcHRcXHM/OlwvaTtyZXR1cm4hZW1wdHlfcmVmLnRlc3QoaHJlZil9LGZpbmRMaW5rVG9PcGVuOmZ1bmN0aW9uKGNsaWNrZWRFbGVtZW50KXt2YXIgdGFyZ2V0PWNsaWNrZWRFbGVtZW50O3ZhciBsb2NhdGlvbj1mYWxzZTt0cnl7dmFyIGJyZWFrQ3RyPTA7d2hpbGUoYnJlYWtDdHI8MjAmJiF0YXJnZXQuZ2V0QXR0cmlidXRlKFwiaHJlZlwiKSYmdGFyZ2V0IT09ZG9jdW1lbnQmJnRhcmdldC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIT09XCJodG1sXCIpe3RhcmdldD10YXJnZXQucGFyZW50Tm9kZTticmVha0N0cisrfXZhciBlbGVtZW50VGFyZ2V0QXR0cj10YXJnZXQuZ2V0QXR0cmlidXRlKFwidGFyZ2V0XCIpO2lmKCFlbGVtZW50VGFyZ2V0QXR0cnx8ZWxlbWVudFRhcmdldEF0dHIuaW5kZXhPZihcIl9ibGFua1wiKT09PS0xKXtsb2NhdGlvbj10YXJnZXQuZ2V0QXR0cmlidXRlKFwiaHJlZlwiKX19Y2F0Y2goZXJyKXt9aWYoIXBvcE1hZ2ljLmlzVmFsaWRIcmVmKGxvY2F0aW9uKSl7bG9jYXRpb249ZmFsc2V9cmV0dXJuIGxvY2F0aW9ufHx3aW5kb3cubG9jYXRpb24uaHJlZn0sZ2V0UHVJZDpmdW5jdGlvbigpe3JldHVyblwib2tfXCIrTWF0aC5mbG9vcig4OTk5OTk5OSpNYXRoLnJhbmRvbSgpKzFlNyl9LGJyb3dzZXJEZXRlY3Rvcjp7YnJvd3NlckRlZmluaXRpb25zOltbXCJmaXJlZm94XCIsXC9GaXJlZm94XFxcLyhbMC05Ll0rKSg/Olxcc3wkKVwvXSxbXCJvcGVyYVwiLFwvT3BlcmFcXFwvKFswLTkuXSspKD86XFxzfCQpXC9dLFtcIm9wZXJhXCIsXC9PUFJcXFwvKFswLTkuXSspKDo/XFxzfCQpJFwvXSxbXCJlZGdlXCIsXC9FZGcoPzplfClcXFwvKFswLTkuX10rKVwvXSxbXCJpZVwiLFwvVHJpZGVudFxcXC83XFwuMC4qcnY6KFswLTkuXSspXFwpLipHZWNrbyRcL10sW1wiaWVcIixcL01TSUVcXHMoWzAtOS5dKyk7LipUcmlkZW50XFxcL1s0LTddLjBcL10sW1wiaWVcIixcL01TSUVcXHMoN1xcLjApXC9dLFtcInNhZmFyaVwiLFwvVmVyc2lvblxcXC8oWzAtOS5fXSspLipTYWZhcmlcL10sW1wiY2hyb21lXCIsXC8oPyFDaHJvbS4qRWRnKD86ZXwpKUNocm9tKD86ZXxpdW0pXFxcLyhbMC05Ll0rKSg6P1xcc3wkKVwvXSxbXCJjaHJvbWVcIixcLyg/IUNocm9tLipPUFIpQ2hyb20oPzplfGl1bSlcXFwvKFswLTkuXSspKDo/XFxzfCQpXC9dLFtcImJiMTBcIixcL0JCMTA7XFxzVG91Y2guKlZlcnNpb25cXFwvKFswLTkuXSspXC9dLFtcImFuZHJvaWRcIixcL0FuZHJvaWRcXHMoWzAtOS5dKylcL10sW1wiaW9zXCIsXC9WZXJzaW9uXFxcLyhbMC05Ll9dKykuKk1vYmlsZS4qU2FmYXJpLipcL10sW1wieWFuZGV4YnJvd3NlclwiLFwvWWFCcm93c2VyXFxcLyhbMC05Ll9dKylcL10sW1wiY3Jpb3NcIixcL0NyaU9TXFxcLyhbMC05Ll0rKSg6P1xcc3wkKVwvXV0sZGV0ZWN0QnJvd3NlcjpmdW5jdGlvbih1c2VyQWdlbnQpe3ZhciBpc01vYmlsZT11c2VyQWdlbnQubWF0Y2goXC9BbmRyb2lkfEJsYWNrQmVycnl8aVBob25lfGlQYWR8aVBvZHxPcGVyYSBNaW5pfElFTW9iaWxlfFdlYk9TfFdpbmRvd3MgUGhvbmVcL2kpO2Zvcih2YXIgaSBpbiB0aGlzLmJyb3dzZXJEZWZpbml0aW9ucyl7dmFyIGRlZmluaXRpb249dGhpcy5icm93c2VyRGVmaW5pdGlvbnNbaV07aWYoZGVmaW5pdGlvblsxXS50ZXN0KHVzZXJBZ2VudCkpe3ZhciBtYXRjaD1kZWZpbml0aW9uWzFdLmV4ZWModXNlckFnZW50KTt2YXIgdmVyc2lvbj1tYXRjaCYmbWF0Y2hbMV0uc3BsaXQoXC9bLl9dXC8pLnNsaWNlKDAsMyk7dmFyIHZlcnNpb25UYWlscz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh2ZXJzaW9uLDEpLmpvaW4oXCJcIil8fFwiMFwiO2lmKHZlcnNpb24mJnZlcnNpb24ubGVuZ3RoPDMpe0FycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KHZlcnNpb24sdmVyc2lvbi5sZW5ndGg9PT0xP1swLDBdOlswXSl9cmV0dXJue25hbWU6ZGVmaW5pdGlvblswXSx2ZXJzaW9uOnZlcnNpb24uam9pbihcIi5cIiksdmVyc2lvbk51bWJlcjpwYXJzZUZsb2F0KHZlcnNpb25bMF0rXCIuXCIrdmVyc2lvblRhaWxzKSxpc01vYmlsZTppc01vYmlsZX19fXJldHVybntuYW1lOlwib3RoZXJcIix2ZXJzaW9uOlwiMS4wXCIsdmVyc2lvbk51bWJlcjoxLGlzTW9iaWxlOmlzTW9iaWxlfX19LG1ldGhvZHM6e2RlZmF1bHQ6ZnVuY3Rpb24odHJpZ2dlcmVkRXZlbnQpe2lmKCFwb3BNYWdpYy5zaG91bGRTaG93KCl8fCFwb3BNYWdpYy52ZW5vclNob3VsZFNob3coKXx8IXBvcE1hZ2ljLmlzVmFsaWRVc2VyRXZlbnQodHJpZ2dlcmVkRXZlbnQpKXJldHVybiB0cnVlO3ZhciBjbGlja2VkRWxlbWVudD10cmlnZ2VyZWRFdmVudC50YXJnZXR8fHRyaWdnZXJlZEV2ZW50LnNyY0VsZW1lbnQ7dmFyIGhyZWY9cG9wTWFnaWMuZmluZExpbmtUb09wZW4oY2xpY2tlZEVsZW1lbnQpO3dpbmRvdy5vcGVuKGhyZWYsXCJfYmxhbmtcIik7cG9wTWFnaWMuc2V0QXNPcGVuZWQoKTtwb3BNYWdpYy50b3AuZG9jdW1lbnQubG9jYXRpb249cG9wTWFnaWMudXJsO2lmKHR5cGVvZiB0cmlnZ2VyZWRFdmVudC5wcmV2ZW50RGVmYXVsdCE9PVwidW5kZWZpbmVkXCIpe3RyaWdnZXJlZEV2ZW50LnByZXZlbnREZWZhdWx0KCk7dHJpZ2dlcmVkRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCl9cmV0dXJuIHRydWV9LGNocm9tZVRhYjpmdW5jdGlvbihldmVudCl7aWYoIXBvcE1hZ2ljLnNob3VsZFNob3coKXx8IXBvcE1hZ2ljLnZlbm9yU2hvdWxkU2hvdygpfHwhcG9wTWFnaWMuaXNWYWxpZFVzZXJFdmVudChldmVudCkpcmV0dXJuIHRydWU7aWYodHlwZW9mIGV2ZW50LnByZXZlbnREZWZhdWx0IT09XCJ1bmRlZmluZWRcIil7ZXZlbnQucHJldmVudERlZmF1bHQoKTtldmVudC5zdG9wUHJvcGFnYXRpb24oKX1lbHNle3JldHVybiB0cnVlfXZhciBhPXRvcC53aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImFcIik7dmFyIHRhcmdldD1ldmVudC50YXJnZXR8fGV2ZW50LnNyY0VsZW1lbnQ7YS5ocmVmPXBvcE1hZ2ljLmZpbmRMaW5rVG9PcGVuKHRhcmdldCk7ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJib2R5XCIpWzBdLmFwcGVuZENoaWxkKGEpO3ZhciBlPW5ldyBNb3VzZUV2ZW50KFwiY2xpY2tcIix7YnViYmxlczp0cnVlLGNhbmNlbGFibGU6dHJ1ZSx2aWV3OndpbmRvdyxzY3JlZW5YOjAsc2NyZWVuWTowLGNsaWVudFg6MCxjbGllbnRZOjAsY3RybEtleTp0cnVlLGFsdEtleTpmYWxzZSxzaGlmdEtleTpmYWxzZSxtZXRhS2V5OnRydWUsYnV0dG9uOjB9KTtlLnByZXZlbnREZWZhdWx0PXVuZGVmaW5lZDthLmRpc3BhdGNoRXZlbnQoZSk7YS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGEpO3dpbmRvdy5vcGVuKHBvcE1hZ2ljLnVybCxcIl9zZWxmXCIpO3BvcE1hZ2ljLnNldEFzT3BlbmVkKCl9LHBvcHVwOmZ1bmN0aW9uKHRyaWdnZXJlZEV2ZW50KXtpZighcG9wTWFnaWMuc2hvdWxkU2hvdygpfHwhcG9wTWFnaWMudmVub3JTaG91bGRTaG93KCl8fCFwb3BNYWdpYy5pc1ZhbGlkVXNlckV2ZW50KHRyaWdnZXJlZEV2ZW50KSlyZXR1cm4gdHJ1ZTt2YXIgd2luT3B0aW9ucz1cIlwiO2lmKHBvcE1hZ2ljLmNvbmZpZy5wb3B1cF9mYWxsYmFjayYmIXBvcE1hZ2ljLmNvbmZpZy5wb3B1cF9mb3JjZSl7dmFyIGhlaWdodD1NYXRoLm1heChNYXRoLnJvdW5kKHdpbmRvdy5pbm5lckhlaWdodCouOCksMzAwKTt2YXIgd2lkdGg9TWF0aC5tYXgoTWF0aC5yb3VuZCh3aW5kb3cuaW5uZXJXaWR0aCouNyksMzAwKTt2YXIgdG9wPXdpbmRvdy5zY3JlZW5ZKzEwMDt2YXIgbGVmdD13aW5kb3cuc2NyZWVuWCsxMDA7d2luT3B0aW9ucz1cIm1lbnViYXI9MSxyZXNpemFibGU9MSx3aWR0aD1cIit3aWR0aCtcIixoZWlnaHQ9XCIraGVpZ2h0K1wiLHRvcD1cIit0b3ArXCIsbGVmdD1cIitsZWZ0fXZhciBwcmVQb3BVcmw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZjt2YXIgcG9wV2luPXdpbmRvdy5vcGVuKHByZVBvcFVybCxwb3BNYWdpYy5nZXRQdUlkKCksd2luT3B0aW9ucyk7c2V0VGltZW91dChmdW5jdGlvbigpe3BvcFdpbi5sb2NhdGlvbi5ocmVmPXBvcE1hZ2ljLnVybH0sMjAwKTtwb3BNYWdpYy5zZXRBc09wZW5lZCgpO2lmKHR5cGVvZiB0cmlnZ2VyZWRFdmVudC5wcmV2ZW50RGVmYXVsdCE9PVwidW5kZWZpbmVkXCIpe3RyaWdnZXJlZEV2ZW50LnByZXZlbnREZWZhdWx0KCk7dHJpZ2dlcmVkRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCl9fX19OyAgICBwb3BNYWdpYy5pbml0KGFkQ29uZmlnKTtcclxufSkoKTtcclxuXHJcblxyXG48XC9zY3JpcHQ+In0seyJpZCI6ImV4b21fal9QT1BVTkRFUiIsImFkc3BvdCI6ImpfUE9QVU5ERVIiLCJ3ZWlnaHQiOiI2IiwiZmNhcCI6IjIiLCJzY2hlZHVsZSI6ZmFsc2UsIm1heFdpZHRoIjoiNzY4IiwibWluV2lkdGgiOmZhbHNlLCJ0aW1lem9uZSI6ZmFsc2UsImV4Y2x1ZGUiOmZhbHNlLCJkb21haW4iOmZhbHNlLCJjb2RlIjoiPHNjcmlwdCB0eXBlPVwiYXBwbGljYXRpb25cL2phdmFzY3JpcHRcIj5cclxuKGZ1bmN0aW9uKCkge1xyXG5cclxuICAgIFwvXC92ZXJzaW9uIDEuMC4wXHJcblxyXG4gICAgdmFyIGFkQ29uZmlnID0ge1xyXG4gICAgXCJhZHNfaG9zdFwiOiBcImEucGVtc3J2LmNvbVwiLFxyXG4gICAgXCJzeW5kaWNhdGlvbl9ob3N0XCI6IFwicy5wZW1zcnYuY29tXCIsXHJcbiAgICBcImlkem9uZVwiOiAxMTM5NzI4LFxyXG4gICAgXCJwb3B1cF9mYWxsYmFja1wiOiBmYWxzZSxcclxuICAgIFwicG9wdXBfZm9yY2VcIjogZmFsc2UsXHJcbiAgICBcImNocm9tZV9lbmFibGVkXCI6IHRydWUsXHJcbiAgICBcIm5ld190YWJcIjogZmFsc2UsXHJcbiAgICBcImZyZXF1ZW5jeV9wZXJpb2RcIjogNzIwLFxyXG4gICAgXCJmcmVxdWVuY3lfY291bnRcIjogMSxcclxuICAgIFwidHJpZ2dlcl9tZXRob2RcIjogMyxcclxuICAgIFwidHJpZ2dlcl9jbGFzc1wiOiBcIlwiLFxyXG4gICAgXCJ0cmlnZ2VyX2RlbGF5XCI6IDAsXHJcbiAgICBcIm9ubHlfaW5saW5lXCI6IGZhbHNlXHJcbn07XHJcblxyXG5pZighd2luZG93LmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwpe2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGw9ZG9jdW1lbnQuYm9keS5xdWVyeVNlbGVjdG9yQWxsPU9iamVjdC5xdWVyeVNlbGVjdG9yQWxsPWZ1bmN0aW9uIHF1ZXJ5U2VsZWN0b3JBbGxQb2x5ZmlsbChyLGMsaSxqLGEpe3ZhciBkPWRvY3VtZW50LHM9ZC5jcmVhdGVTdHlsZVNoZWV0KCk7YT1kLmFsbDtjPVtdO3I9ci5yZXBsYWNlKFwvXFxbZm9yXFxiXC9naSxcIltodG1sRm9yXCIpLnNwbGl0KFwiLFwiKTtmb3IoaT1yLmxlbmd0aDtpLS07KXtzLmFkZFJ1bGUocltpXSxcIms6dlwiKTtmb3Ioaj1hLmxlbmd0aDtqLS07KXthW2pdLmN1cnJlbnRTdHlsZS5rJiZjLnB1c2goYVtqXSl9cy5yZW1vdmVSdWxlKDApfXJldHVybiBjfX12YXIgcG9wTWFnaWM9e3ZlcnNpb246MSxjb29raWVfbmFtZTpcIlwiLHVybDpcIlwiLGNvbmZpZzp7fSxvcGVuX2NvdW50OjAsdG9wOm51bGwsYnJvd3NlcjpudWxsLHZlbm9yX2xvYWRlZDpmYWxzZSx2ZW5vcjpmYWxzZSxjb25maWdUcGw6e2Fkc19ob3N0OlwiXCIsc3luZGljYXRpb25faG9zdDpcIlwiLGlkem9uZTpcIlwiLGZyZXF1ZW5jeV9wZXJpb2Q6NzIwLGZyZXF1ZW5jeV9jb3VudDoxLHRyaWdnZXJfbWV0aG9kOjEsdHJpZ2dlcl9jbGFzczpcIlwiLHBvcHVwX2ZvcmNlOmZhbHNlLHBvcHVwX2ZhbGxiYWNrOmZhbHNlLGNocm9tZV9lbmFibGVkOnRydWUsbmV3X3RhYjpmYWxzZSxjYXQ6XCJcIix0YWdzOlwiXCIsZWw6XCJcIixzdWI6XCJcIixzdWIyOlwiXCIsc3ViMzpcIlwiLG9ubHlfaW5saW5lOmZhbHNlLHRyaWdnZXJfZGVsYXk6MCxjb29raWVjb25zZW50OnRydWV9LGluaXQ6ZnVuY3Rpb24oY29uZmlnKXtpZih0eXBlb2YgY29uZmlnLmlkem9uZT09PVwidW5kZWZpbmVkXCJ8fCFjb25maWcuaWR6b25lKXtyZXR1cm59aWYodHlwZW9mIGNvbmZpZ1tcImN1c3RvbVRhcmdldGluZ1wiXT09PVwidW5kZWZpbmVkXCIpe2NvbmZpZ1tcImN1c3RvbVRhcmdldGluZ1wiXT1bXX13aW5kb3dbXCJjdXN0b21UYXJnZXRpbmdcIl09Y29uZmlnW1wiY3VzdG9tVGFyZ2V0aW5nXCJdfHxudWxsO3ZhciBjdXN0b21UYXJnZXRpbmc9T2JqZWN0LmtleXMoY29uZmlnW1wiY3VzdG9tVGFyZ2V0aW5nXCJdKS5maWx0ZXIoZnVuY3Rpb24oYyl7cmV0dXJuIGMuc2VhcmNoKFwiZXhfXCIpPj0wfSk7aWYoY3VzdG9tVGFyZ2V0aW5nLmxlbmd0aCl7Y3VzdG9tVGFyZ2V0aW5nLmZvckVhY2goZnVuY3Rpb24oY3Qpe3JldHVybiB0aGlzLmNvbmZpZ1RwbFtjdF09bnVsbH0uYmluZCh0aGlzKSl9Zm9yKHZhciBrZXkgaW4gdGhpcy5jb25maWdUcGwpe2lmKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5jb25maWdUcGwsa2V5KSl7Y29udGludWV9aWYodHlwZW9mIGNvbmZpZ1trZXldIT09XCJ1bmRlZmluZWRcIil7dGhpcy5jb25maWdba2V5XT1jb25maWdba2V5XX1lbHNle3RoaXMuY29uZmlnW2tleV09dGhpcy5jb25maWdUcGxba2V5XX19aWYodHlwZW9mIHRoaXMuY29uZmlnLmlkem9uZT09PVwidW5kZWZpbmVkXCJ8fHRoaXMuY29uZmlnLmlkem9uZT09PVwiXCIpe3JldHVybn1pZih0aGlzLmNvbmZpZy5vbmx5X2lubGluZSE9PXRydWUpe3RoaXMubG9hZEhvc3RlZCgpfXRoaXMuYWRkRXZlbnRUb0VsZW1lbnQod2luZG93LFwibG9hZFwiLHRoaXMucHJlcGFyZVBvcCl9LGdldENvdW50RnJvbUNvb2tpZTpmdW5jdGlvbigpe2lmKCF0aGlzLmNvbmZpZy5jb29raWVjb25zZW50KXtyZXR1cm4gMH12YXIgc2hvd25Db29raWU9cG9wTWFnaWMuZ2V0Q29va2llKHBvcE1hZ2ljLmNvb2tpZV9uYW1lKTt2YXIgY3RyPXR5cGVvZiBzaG93bkNvb2tpZT09PVwidW5kZWZpbmVkXCI/MDpwYXJzZUludChzaG93bkNvb2tpZSk7aWYoaXNOYU4oY3RyKSl7Y3RyPTB9cmV0dXJuIGN0cn0sZ2V0TGFzdE9wZW5lZFRpbWVGcm9tQ29va2llOmZ1bmN0aW9uKCl7dmFyIHNob3duQ29va2llPXBvcE1hZ2ljLmdldENvb2tpZShwb3BNYWdpYy5jb29raWVfbmFtZSk7dmFyIGRlbGF5PW51bGw7aWYodHlwZW9mIHNob3duQ29va2llIT09XCJ1bmRlZmluZWRcIil7dmFyIHZhbHVlPXNob3duQ29va2llLnNwbGl0KFwiO1wiKVsxXTtkZWxheT12YWx1ZT4wP3BhcnNlSW50KHZhbHVlKTowfWlmKGlzTmFOKGRlbGF5KSl7ZGVsYXk9bnVsbH1yZXR1cm4gZGVsYXl9LHNob3VsZFNob3c6ZnVuY3Rpb24oKXtpZihwb3BNYWdpYy5vcGVuX2NvdW50Pj1wb3BNYWdpYy5jb25maWcuZnJlcXVlbmN5X2NvdW50KXtyZXR1cm4gZmFsc2V9dmFyIGN0cj1wb3BNYWdpYy5nZXRDb3VudEZyb21Db29raWUoKTtjb25zdCBsYXN0X29wZW5lZF90aW1lPXBvcE1hZ2ljLmdldExhc3RPcGVuZWRUaW1lRnJvbUNvb2tpZSgpO2NvbnN0IGN1cnJlbnRfdGltZT1NYXRoLmZsb29yKERhdGUubm93KClcLzFlMyk7Y29uc3QgbWF4aW11bURlbGF5VGltZT1sYXN0X29wZW5lZF90aW1lK3BvcE1hZ2ljLmNvbmZpZy50cmlnZ2VyX2RlbGF5O2lmKGxhc3Rfb3BlbmVkX3RpbWUmJm1heGltdW1EZWxheVRpbWU+Y3VycmVudF90aW1lKXtyZXR1cm4gZmFsc2V9cG9wTWFnaWMub3Blbl9jb3VudD1jdHI7cmV0dXJuIShjdHI+PXBvcE1hZ2ljLmNvbmZpZy5mcmVxdWVuY3lfY291bnQpfSx2ZW5vclNob3VsZFNob3c6ZnVuY3Rpb24oKXtyZXR1cm4gcG9wTWFnaWMudmVub3JfbG9hZGVkJiZwb3BNYWdpYy52ZW5vcj09PVwiMFwifSxzZXRBc09wZW5lZDpmdW5jdGlvbigpe3ZhciBuZXdfY3RyPTE7aWYocG9wTWFnaWMub3Blbl9jb3VudCE9PTApe25ld19jdHI9cG9wTWFnaWMub3Blbl9jb3VudCsxfWVsc2V7bmV3X2N0cj1wb3BNYWdpYy5nZXRDb3VudEZyb21Db29raWUoKSsxfWNvbnN0IGxhc3Rfb3BlbmVkX3RpbWU9TWF0aC5mbG9vcihEYXRlLm5vdygpXC8xZTMpO2lmKHBvcE1hZ2ljLmNvbmZpZy5jb29raWVjb25zZW50KXtwb3BNYWdpYy5zZXRDb29raWUocG9wTWFnaWMuY29va2llX25hbWUsYCR7bmV3X2N0cn07JHtsYXN0X29wZW5lZF90aW1lfWAscG9wTWFnaWMuY29uZmlnLmZyZXF1ZW5jeV9wZXJpb2QpfX0sbG9hZEhvc3RlZDpmdW5jdGlvbigpe3ZhciBob3N0ZWRTY3JpcHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNjcmlwdFwiKTtob3N0ZWRTY3JpcHQudHlwZT1cImFwcGxpY2F0aW9uXC9qYXZhc2NyaXB0XCI7aG9zdGVkU2NyaXB0LmFzeW5jPXRydWU7aG9zdGVkU2NyaXB0LnNyYz1cIlwvXC9cIit0aGlzLmNvbmZpZy5hZHNfaG9zdCtcIlwvcG9wdW5kZXIxMDAwLmpzXCI7aG9zdGVkU2NyaXB0LmlkPVwicG9wbWFnaWNsZHJcIjtmb3IodmFyIGtleSBpbiB0aGlzLmNvbmZpZyl7aWYoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLmNvbmZpZyxrZXkpKXtjb250aW51ZX1pZihrZXk9PT1cImFkc19ob3N0XCJ8fGtleT09PVwic3luZGljYXRpb25faG9zdFwiKXtjb250aW51ZX1ob3N0ZWRTY3JpcHQuc2V0QXR0cmlidXRlKFwiZGF0YS1leG8tXCIra2V5LHRoaXMuY29uZmlnW2tleV0pfXZhciBpbnNlcnRBbmNob3I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJib2R5XCIpLml0ZW0oMCk7aWYoaW5zZXJ0QW5jaG9yLmZpcnN0Q2hpbGQpe2luc2VydEFuY2hvci5pbnNlcnRCZWZvcmUoaG9zdGVkU2NyaXB0LGluc2VydEFuY2hvci5maXJzdENoaWxkKX1lbHNle2luc2VydEFuY2hvci5hcHBlbmRDaGlsZChob3N0ZWRTY3JpcHQpfX0scHJlcGFyZVBvcDpmdW5jdGlvbigpe2lmKHR5cGVvZiBleG9Kc1BvcDEwMT09PVwib2JqZWN0XCImJk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChleG9Kc1BvcDEwMSxcImFkZFwiKSl7cmV0dXJufXBvcE1hZ2ljLnRvcD1zZWxmO2lmKHBvcE1hZ2ljLnRvcCE9PXNlbGYpe3RyeXtpZih0b3AuZG9jdW1lbnQubG9jYXRpb24udG9TdHJpbmcoKSl7cG9wTWFnaWMudG9wPXRvcH19Y2F0Y2goZXJyKXt9fXBvcE1hZ2ljLmNvb2tpZV9uYW1lPVwiem9uZS1jYXAtXCIrcG9wTWFnaWMuY29uZmlnLmlkem9uZTtpZihwb3BNYWdpYy5zaG91bGRTaG93KCkpe3ZhciB4bWxodHRwPW5ldyBYTUxIdHRwUmVxdWVzdDt4bWxodHRwLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe2lmKHhtbGh0dHAucmVhZHlTdGF0ZT09WE1MSHR0cFJlcXVlc3QuRE9ORSl7cG9wTWFnaWMudmVub3JfbG9hZGVkPXRydWU7aWYoeG1saHR0cC5zdGF0dXM9PTIwMCl7cG9wTWFnaWMudmVub3I9eG1saHR0cC5yZXNwb25zZVRleHR9ZWxzZXtwb3BNYWdpYy52ZW5vcj1cIjBcIn19fTt2YXIgcHJvdG9jb2w9ZG9jdW1lbnQubG9jYXRpb24ucHJvdG9jb2whPT1cImh0dHBzOlwiJiZkb2N1bWVudC5sb2NhdGlvbi5wcm90b2NvbCE9PVwiaHR0cDpcIj9cImh0dHBzOlwiOmRvY3VtZW50LmxvY2F0aW9uLnByb3RvY29sO3htbGh0dHAub3BlbihcIkdFVFwiLHByb3RvY29sK1wiXC9cL1wiK3BvcE1hZ2ljLmNvbmZpZy5zeW5kaWNhdGlvbl9ob3N0K1wiXC92ZW5vci5waHBcIix0cnVlKTt0cnl7eG1saHR0cC5zZW5kKCl9Y2F0Y2goZXJyb3Ipe3BvcE1hZ2ljLnZlbm9yX2xvYWRlZD10cnVlfX1wb3BNYWdpYy5idWlsZFVybCgpO3BvcE1hZ2ljLmJyb3dzZXI9cG9wTWFnaWMuYnJvd3NlckRldGVjdG9yLmRldGVjdEJyb3dzZXIobmF2aWdhdG9yLnVzZXJBZ2VudCk7aWYoIXBvcE1hZ2ljLmNvbmZpZy5jaHJvbWVfZW5hYmxlZCYmKHBvcE1hZ2ljLmJyb3dzZXIubmFtZT09PVwiY2hyb21lXCJ8fHBvcE1hZ2ljLmJyb3dzZXIubmFtZT09PVwiY3Jpb3NcIikpe3JldHVybn12YXIgcG9wTWV0aG9kPXBvcE1hZ2ljLmdldFBvcE1ldGhvZChwb3BNYWdpYy5icm93c2VyKTtwb3BNYWdpYy5hZGRFdmVudChcImNsaWNrXCIscG9wTWV0aG9kKX0sZ2V0UG9wTWV0aG9kOmZ1bmN0aW9uKGJyb3dzZXJJbmZvKXtpZihwb3BNYWdpYy5jb25maWcucG9wdXBfZm9yY2Upe3JldHVybiBwb3BNYWdpYy5tZXRob2RzLnBvcHVwfWlmKHBvcE1hZ2ljLmNvbmZpZy5wb3B1cF9mYWxsYmFjayYmYnJvd3NlckluZm8ubmFtZT09PVwiY2hyb21lXCImJmJyb3dzZXJJbmZvLnZlcnNpb24+PTY4JiYhYnJvd3NlckluZm8uaXNNb2JpbGUpe3JldHVybiBwb3BNYWdpYy5tZXRob2RzLnBvcHVwfWlmKGJyb3dzZXJJbmZvLmlzTW9iaWxlKXtyZXR1cm4gcG9wTWFnaWMubWV0aG9kcy5kZWZhdWx0fWlmKGJyb3dzZXJJbmZvLm5hbWU9PT1cImNocm9tZVwiKXtyZXR1cm4gcG9wTWFnaWMubWV0aG9kcy5jaHJvbWVUYWJ9cmV0dXJuIHBvcE1hZ2ljLm1ldGhvZHMuZGVmYXVsdH0sYnVpbGRVcmw6ZnVuY3Rpb24oKXt2YXIgcHJvdG9jb2w9ZG9jdW1lbnQubG9jYXRpb24ucHJvdG9jb2whPT1cImh0dHBzOlwiJiZkb2N1bWVudC5sb2NhdGlvbi5wcm90b2NvbCE9PVwiaHR0cDpcIj9cImh0dHBzOlwiOmRvY3VtZW50LmxvY2F0aW9uLnByb3RvY29sO3ZhciBwPXRvcD09PXNlbGY/ZG9jdW1lbnQuVVJMOmRvY3VtZW50LnJlZmVycmVyO3ZhciBzY3JpcHRfaW5mbz17dHlwZTpcImlubGluZVwiLG5hbWU6XCJwb3BNYWdpY1wiLHZlcjp0aGlzLnZlcnNpb259O3ZhciBlbmNvZGVTY3JpcHRJbmZvPWZ1bmN0aW9uKHNjcmlwdF9pbmZvKXt2YXIgcmVzdWx0PXNjcmlwdF9pbmZvW1widHlwZVwiXStcInxcIitzY3JpcHRfaW5mb1tcIm5hbWVcIl0rXCJ8XCIrc2NyaXB0X2luZm9bXCJ2ZXJcIl07cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChidG9hKHJlc3VsdCkpfTt2YXIgY3VzdG9tVGFyZ2V0aW5nUGFyYW1zPVwiXCI7aWYoY3VzdG9tVGFyZ2V0aW5nJiZPYmplY3Qua2V5cyhjdXN0b21UYXJnZXRpbmcpLmxlbmd0aCl7dmFyIGN1c3RvbVRhcmdldGluZ0tleXM9dHlwZW9mIGN1c3RvbVRhcmdldGluZz09PVwib2JqZWN0XCI/T2JqZWN0LmtleXMoY3VzdG9tVGFyZ2V0aW5nKTpjdXN0b21UYXJnZXRpbmc7dmFyIHZhbHVlO2N1c3RvbVRhcmdldGluZ0tleXMuZm9yRWFjaChmdW5jdGlvbihrZXkpe2lmKHR5cGVvZiBjdXN0b21UYXJnZXRpbmc9PT1cIm9iamVjdFwiKXt2YWx1ZT1jdXN0b21UYXJnZXRpbmdba2V5XX1lbHNlIGlmKEFycmF5LmlzQXJyYXkoY3VzdG9tVGFyZ2V0aW5nKSl7dmFsdWU9c2NyaXB0RWwuZ2V0QXR0cmlidXRlKGtleSl9dmFyIGtleVdpdGhvdXRFeG9QcmVmaXg9a2V5LnJlcGxhY2UoXCJkYXRhLWV4by1cIixcIlwiKTtjdXN0b21UYXJnZXRpbmdQYXJhbXMrPWAmJHtrZXlXaXRob3V0RXhvUHJlZml4fT0ke3ZhbHVlfWB9KX10aGlzLnVybD1wcm90b2NvbCtcIlwvXC9cIit0aGlzLmNvbmZpZy5zeW5kaWNhdGlvbl9ob3N0K1wiXC9zcGxhc2gucGhwXCIrXCI/Y2F0PVwiK3RoaXMuY29uZmlnLmNhdCtcIiZpZHpvbmU9XCIrdGhpcy5jb25maWcuaWR6b25lK1wiJnR5cGU9OFwiK1wiJnA9XCIrZW5jb2RlVVJJQ29tcG9uZW50KHApK1wiJnN1Yj1cIit0aGlzLmNvbmZpZy5zdWIrKHRoaXMuY29uZmlnLnN1YjIhPT1cIlwiP1wiJnN1YjI9XCIrdGhpcy5jb25maWcuc3ViMjpcIlwiKSsodGhpcy5jb25maWcuc3ViMyE9PVwiXCI/XCImc3ViMz1cIit0aGlzLmNvbmZpZy5zdWIzOlwiXCIpK1wiJmJsb2NrPTFcIitcIiZlbD1cIit0aGlzLmNvbmZpZy5lbCtcIiZ0YWdzPVwiK3RoaXMuY29uZmlnLnRhZ3MrXCImY29va2llY29uc2VudD1cIit0aGlzLmNvbmZpZy5jb29raWVjb25zZW50K1wiJnNjcl9pbmZvPVwiK2VuY29kZVNjcmlwdEluZm8oc2NyaXB0X2luZm8pK2N1c3RvbVRhcmdldGluZ1BhcmFtc30sYWRkRXZlbnRUb0VsZW1lbnQ6ZnVuY3Rpb24ob2JqLHR5cGUsZm4pe2lmKG9iai5hZGRFdmVudExpc3RlbmVyKXtvYmouYWRkRXZlbnRMaXN0ZW5lcih0eXBlLGZuLGZhbHNlKX1lbHNlIGlmKG9iai5hdHRhY2hFdmVudCl7b2JqW1wiZVwiK3R5cGUrZm5dPWZuO29ialt0eXBlK2ZuXT1mdW5jdGlvbigpe29ialtcImVcIit0eXBlK2ZuXSh3aW5kb3cuZXZlbnQpfTtvYmouYXR0YWNoRXZlbnQoXCJvblwiK3R5cGUsb2JqW3R5cGUrZm5dKX1lbHNle29ialtcIm9uXCIrdHlwZV09b2JqW1wiZVwiK3R5cGUrZm5dfX0sYWRkRXZlbnQ6ZnVuY3Rpb24odHlwZSxmbil7dmFyIHRhcmdldEVsZW1lbnRzO2lmKHBvcE1hZ2ljLmNvbmZpZy50cmlnZ2VyX21ldGhvZD09XCIzXCIpe3RhcmdldEVsZW1lbnRzPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJhXCIpO2ZvcihpPTA7aTx0YXJnZXRFbGVtZW50cy5sZW5ndGg7aSsrKXtwb3BNYWdpYy5hZGRFdmVudFRvRWxlbWVudCh0YXJnZXRFbGVtZW50c1tpXSx0eXBlLGZuKX1yZXR1cm59aWYocG9wTWFnaWMuY29uZmlnLnRyaWdnZXJfbWV0aG9kPT1cIjJcIiYmcG9wTWFnaWMuY29uZmlnLnRyaWdnZXJfbWV0aG9kIT1cIlwiKXt2YXIgdHJpZ2dlcl9jbGFzc2VzO3ZhciB0cmlnZ2VyX2NsYXNzZXNfZmluYWw9W107aWYocG9wTWFnaWMuY29uZmlnLnRyaWdnZXJfY2xhc3MuaW5kZXhPZihcIixcIik9PT0tMSl7dHJpZ2dlcl9jbGFzc2VzPXBvcE1hZ2ljLmNvbmZpZy50cmlnZ2VyX2NsYXNzLnNwbGl0KFwiIFwiKX1lbHNle3ZhciB0cmltbWVkX3RyaWdnZXJfY2xhc3Nlcz1wb3BNYWdpYy5jb25maWcudHJpZ2dlcl9jbGFzcy5yZXBsYWNlKFwvXFxzXC9nLFwiXCIpO3RyaWdnZXJfY2xhc3Nlcz10cmltbWVkX3RyaWdnZXJfY2xhc3Nlcy5zcGxpdChcIixcIil9Zm9yKHZhciBpPTA7aTx0cmlnZ2VyX2NsYXNzZXMubGVuZ3RoO2krKyl7aWYodHJpZ2dlcl9jbGFzc2VzW2ldIT09XCJcIil7dHJpZ2dlcl9jbGFzc2VzX2ZpbmFsLnB1c2goXCIuXCIrdHJpZ2dlcl9jbGFzc2VzW2ldKX19dGFyZ2V0RWxlbWVudHM9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCh0cmlnZ2VyX2NsYXNzZXNfZmluYWwuam9pbihcIiwgXCIpKTtmb3IoaT0wO2k8dGFyZ2V0RWxlbWVudHMubGVuZ3RoO2krKyl7cG9wTWFnaWMuYWRkRXZlbnRUb0VsZW1lbnQodGFyZ2V0RWxlbWVudHNbaV0sdHlwZSxmbil9cmV0dXJufXBvcE1hZ2ljLmFkZEV2ZW50VG9FbGVtZW50KGRvY3VtZW50LHR5cGUsZm4pfSxzZXRDb29raWU6ZnVuY3Rpb24obmFtZSx2YWx1ZSx0dGxfbWludXRlcyl7aWYoIXRoaXMuY29uZmlnLmNvb2tpZWNvbnNlbnQpe3JldHVybiBmYWxzZX10dGxfbWludXRlcz1wYXJzZUludCh0dGxfbWludXRlcywxMCk7dmFyIG5vd19kYXRlPW5ldyBEYXRlO25vd19kYXRlLnNldE1pbnV0ZXMobm93X2RhdGUuZ2V0TWludXRlcygpK3BhcnNlSW50KHR0bF9taW51dGVzKSk7dmFyIGNfdmFsdWU9ZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKStcIjsgZXhwaXJlcz1cIitub3dfZGF0ZS50b1VUQ1N0cmluZygpK1wiOyBwYXRoPVwvXCI7ZG9jdW1lbnQuY29va2llPW5hbWUrXCI9XCIrY192YWx1ZX0sZ2V0Q29va2llOmZ1bmN0aW9uKG5hbWUpe2lmKCF0aGlzLmNvbmZpZy5jb29raWVjb25zZW50KXtyZXR1cm4gZmFsc2V9dmFyIGkseCx5LGNvb2tpZXNBcnJheT1kb2N1bWVudC5jb29raWUuc3BsaXQoXCI7XCIpO2ZvcihpPTA7aTxjb29raWVzQXJyYXkubGVuZ3RoO2krKyl7eD1jb29raWVzQXJyYXlbaV0uc3Vic3RyKDAsY29va2llc0FycmF5W2ldLmluZGV4T2YoXCI9XCIpKTt5PWNvb2tpZXNBcnJheVtpXS5zdWJzdHIoY29va2llc0FycmF5W2ldLmluZGV4T2YoXCI9XCIpKzEpO3g9eC5yZXBsYWNlKFwvXlxccyt8XFxzKyRcL2csXCJcIik7aWYoeD09PW5hbWUpe3JldHVybiBkZWNvZGVVUklDb21wb25lbnQoeSl9fX0scmFuZFN0cjpmdW5jdGlvbihsZW5ndGgscG9zc2libGVDaGFycyl7dmFyIHRleHQ9XCJcIjt2YXIgcG9zc2libGU9cG9zc2libGVDaGFyc3x8XCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OVwiO2Zvcih2YXIgaT0wO2k8bGVuZ3RoO2krKyl7dGV4dCs9cG9zc2libGUuY2hhckF0KE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpwb3NzaWJsZS5sZW5ndGgpKX1yZXR1cm4gdGV4dH0saXNWYWxpZFVzZXJFdmVudDpmdW5jdGlvbihldmVudCl7aWYoXCJpc1RydXN0ZWRcImluIGV2ZW50JiZldmVudC5pc1RydXN0ZWQmJnBvcE1hZ2ljLmJyb3dzZXIubmFtZSE9PVwiaWVcIiYmcG9wTWFnaWMuYnJvd3Nlci5uYW1lIT09XCJzYWZhcmlcIil7cmV0dXJuIHRydWV9ZWxzZXtyZXR1cm4gZXZlbnQuc2NyZWVuWCE9MCYmZXZlbnQuc2NyZWVuWSE9MH19LGlzVmFsaWRIcmVmOmZ1bmN0aW9uKGhyZWYpe2lmKHR5cGVvZiBocmVmPT09XCJ1bmRlZmluZWRcInx8aHJlZj09XCJcIil7cmV0dXJuIGZhbHNlfXZhciBlbXB0eV9yZWY9XC9cXHM/amF2YXNjcmlwdFxccz86XC9pO3JldHVybiFlbXB0eV9yZWYudGVzdChocmVmKX0sZmluZExpbmtUb09wZW46ZnVuY3Rpb24oY2xpY2tlZEVsZW1lbnQpe3ZhciB0YXJnZXQ9Y2xpY2tlZEVsZW1lbnQ7dmFyIGxvY2F0aW9uPWZhbHNlO3RyeXt2YXIgYnJlYWtDdHI9MDt3aGlsZShicmVha0N0cjwyMCYmIXRhcmdldC5nZXRBdHRyaWJ1dGUoXCJocmVmXCIpJiZ0YXJnZXQhPT1kb2N1bWVudCYmdGFyZ2V0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkhPT1cImh0bWxcIil7dGFyZ2V0PXRhcmdldC5wYXJlbnROb2RlO2JyZWFrQ3RyKyt9dmFyIGVsZW1lbnRUYXJnZXRBdHRyPXRhcmdldC5nZXRBdHRyaWJ1dGUoXCJ0YXJnZXRcIik7aWYoIWVsZW1lbnRUYXJnZXRBdHRyfHxlbGVtZW50VGFyZ2V0QXR0ci5pbmRleE9mKFwiX2JsYW5rXCIpPT09LTEpe2xvY2F0aW9uPXRhcmdldC5nZXRBdHRyaWJ1dGUoXCJocmVmXCIpfX1jYXRjaChlcnIpe31pZighcG9wTWFnaWMuaXNWYWxpZEhyZWYobG9jYXRpb24pKXtsb2NhdGlvbj1mYWxzZX1yZXR1cm4gbG9jYXRpb258fHdpbmRvdy5sb2NhdGlvbi5ocmVmfSxnZXRQdUlkOmZ1bmN0aW9uKCl7cmV0dXJuXCJva19cIitNYXRoLmZsb29yKDg5OTk5OTk5Kk1hdGgucmFuZG9tKCkrMWU3KX0sYnJvd3NlckRldGVjdG9yOnticm93c2VyRGVmaW5pdGlvbnM6W1tcImZpcmVmb3hcIixcL0ZpcmVmb3hcXFwvKFswLTkuXSspKD86XFxzfCQpXC9dLFtcIm9wZXJhXCIsXC9PcGVyYVxcXC8oWzAtOS5dKykoPzpcXHN8JClcL10sW1wib3BlcmFcIixcL09QUlxcXC8oWzAtOS5dKykoOj9cXHN8JCkkXC9dLFtcImVkZ2VcIixcL0VkZyg/OmV8KVxcXC8oWzAtOS5fXSspXC9dLFtcImllXCIsXC9UcmlkZW50XFxcLzdcXC4wLipydjooWzAtOS5dKylcXCkuKkdlY2tvJFwvXSxbXCJpZVwiLFwvTVNJRVxccyhbMC05Ll0rKTsuKlRyaWRlbnRcXFwvWzQtN10uMFwvXSxbXCJpZVwiLFwvTVNJRVxccyg3XFwuMClcL10sW1wic2FmYXJpXCIsXC9WZXJzaW9uXFxcLyhbMC05Ll9dKykuKlNhZmFyaVwvXSxbXCJjaHJvbWVcIixcLyg/IUNocm9tLipFZGcoPzplfCkpQ2hyb20oPzplfGl1bSlcXFwvKFswLTkuXSspKDo/XFxzfCQpXC9dLFtcImNocm9tZVwiLFwvKD8hQ2hyb20uKk9QUilDaHJvbSg/OmV8aXVtKVxcXC8oWzAtOS5dKykoOj9cXHN8JClcL10sW1wiYmIxMFwiLFwvQkIxMDtcXHNUb3VjaC4qVmVyc2lvblxcXC8oWzAtOS5dKylcL10sW1wiYW5kcm9pZFwiLFwvQW5kcm9pZFxccyhbMC05Ll0rKVwvXSxbXCJpb3NcIixcL1ZlcnNpb25cXFwvKFswLTkuX10rKS4qTW9iaWxlLipTYWZhcmkuKlwvXSxbXCJ5YW5kZXhicm93c2VyXCIsXC9ZYUJyb3dzZXJcXFwvKFswLTkuX10rKVwvXSxbXCJjcmlvc1wiLFwvQ3JpT1NcXFwvKFswLTkuXSspKDo/XFxzfCQpXC9dXSxkZXRlY3RCcm93c2VyOmZ1bmN0aW9uKHVzZXJBZ2VudCl7dmFyIGlzTW9iaWxlPXVzZXJBZ2VudC5tYXRjaChcL0FuZHJvaWR8QmxhY2tCZXJyeXxpUGhvbmV8aVBhZHxpUG9kfE9wZXJhIE1pbml8SUVNb2JpbGV8V2ViT1N8V2luZG93cyBQaG9uZVwvaSk7Zm9yKHZhciBpIGluIHRoaXMuYnJvd3NlckRlZmluaXRpb25zKXt2YXIgZGVmaW5pdGlvbj10aGlzLmJyb3dzZXJEZWZpbml0aW9uc1tpXTtpZihkZWZpbml0aW9uWzFdLnRlc3QodXNlckFnZW50KSl7dmFyIG1hdGNoPWRlZmluaXRpb25bMV0uZXhlYyh1c2VyQWdlbnQpO3ZhciB2ZXJzaW9uPW1hdGNoJiZtYXRjaFsxXS5zcGxpdChcL1suX11cLykuc2xpY2UoMCwzKTt2YXIgdmVyc2lvblRhaWxzPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHZlcnNpb24sMSkuam9pbihcIlwiKXx8XCIwXCI7aWYodmVyc2lvbiYmdmVyc2lvbi5sZW5ndGg8Myl7QXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkodmVyc2lvbix2ZXJzaW9uLmxlbmd0aD09PTE/WzAsMF06WzBdKX1yZXR1cm57bmFtZTpkZWZpbml0aW9uWzBdLHZlcnNpb246dmVyc2lvbi5qb2luKFwiLlwiKSx2ZXJzaW9uTnVtYmVyOnBhcnNlRmxvYXQodmVyc2lvblswXStcIi5cIit2ZXJzaW9uVGFpbHMpLGlzTW9iaWxlOmlzTW9iaWxlfX19cmV0dXJue25hbWU6XCJvdGhlclwiLHZlcnNpb246XCIxLjBcIix2ZXJzaW9uTnVtYmVyOjEsaXNNb2JpbGU6aXNNb2JpbGV9fX0sbWV0aG9kczp7ZGVmYXVsdDpmdW5jdGlvbih0cmlnZ2VyZWRFdmVudCl7aWYoIXBvcE1hZ2ljLnNob3VsZFNob3coKXx8IXBvcE1hZ2ljLnZlbm9yU2hvdWxkU2hvdygpfHwhcG9wTWFnaWMuaXNWYWxpZFVzZXJFdmVudCh0cmlnZ2VyZWRFdmVudCkpcmV0dXJuIHRydWU7dmFyIGNsaWNrZWRFbGVtZW50PXRyaWdnZXJlZEV2ZW50LnRhcmdldHx8dHJpZ2dlcmVkRXZlbnQuc3JjRWxlbWVudDt2YXIgaHJlZj1wb3BNYWdpYy5maW5kTGlua1RvT3BlbihjbGlja2VkRWxlbWVudCk7d2luZG93Lm9wZW4oaHJlZixcIl9ibGFua1wiKTtwb3BNYWdpYy5zZXRBc09wZW5lZCgpO3BvcE1hZ2ljLnRvcC5kb2N1bWVudC5sb2NhdGlvbj1wb3BNYWdpYy51cmw7aWYodHlwZW9mIHRyaWdnZXJlZEV2ZW50LnByZXZlbnREZWZhdWx0IT09XCJ1bmRlZmluZWRcIil7dHJpZ2dlcmVkRXZlbnQucHJldmVudERlZmF1bHQoKTt0cmlnZ2VyZWRFdmVudC5zdG9wUHJvcGFnYXRpb24oKX1yZXR1cm4gdHJ1ZX0sY2hyb21lVGFiOmZ1bmN0aW9uKGV2ZW50KXtpZighcG9wTWFnaWMuc2hvdWxkU2hvdygpfHwhcG9wTWFnaWMudmVub3JTaG91bGRTaG93KCl8fCFwb3BNYWdpYy5pc1ZhbGlkVXNlckV2ZW50KGV2ZW50KSlyZXR1cm4gdHJ1ZTtpZih0eXBlb2YgZXZlbnQucHJldmVudERlZmF1bHQhPT1cInVuZGVmaW5lZFwiKXtldmVudC5wcmV2ZW50RGVmYXVsdCgpO2V2ZW50LnN0b3BQcm9wYWdhdGlvbigpfWVsc2V7cmV0dXJuIHRydWV9dmFyIGE9dG9wLndpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKTt2YXIgdGFyZ2V0PWV2ZW50LnRhcmdldHx8ZXZlbnQuc3JjRWxlbWVudDthLmhyZWY9cG9wTWFnaWMuZmluZExpbmtUb09wZW4odGFyZ2V0KTtkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcImJvZHlcIilbMF0uYXBwZW5kQ2hpbGQoYSk7dmFyIGU9bmV3IE1vdXNlRXZlbnQoXCJjbGlja1wiLHtidWJibGVzOnRydWUsY2FuY2VsYWJsZTp0cnVlLHZpZXc6d2luZG93LHNjcmVlblg6MCxzY3JlZW5ZOjAsY2xpZW50WDowLGNsaWVudFk6MCxjdHJsS2V5OnRydWUsYWx0S2V5OmZhbHNlLHNoaWZ0S2V5OmZhbHNlLG1ldGFLZXk6dHJ1ZSxidXR0b246MH0pO2UucHJldmVudERlZmF1bHQ9dW5kZWZpbmVkO2EuZGlzcGF0Y2hFdmVudChlKTthLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYSk7d2luZG93Lm9wZW4ocG9wTWFnaWMudXJsLFwiX3NlbGZcIik7cG9wTWFnaWMuc2V0QXNPcGVuZWQoKX0scG9wdXA6ZnVuY3Rpb24odHJpZ2dlcmVkRXZlbnQpe2lmKCFwb3BNYWdpYy5zaG91bGRTaG93KCl8fCFwb3BNYWdpYy52ZW5vclNob3VsZFNob3coKXx8IXBvcE1hZ2ljLmlzVmFsaWRVc2VyRXZlbnQodHJpZ2dlcmVkRXZlbnQpKXJldHVybiB0cnVlO3ZhciB3aW5PcHRpb25zPVwiXCI7aWYocG9wTWFnaWMuY29uZmlnLnBvcHVwX2ZhbGxiYWNrJiYhcG9wTWFnaWMuY29uZmlnLnBvcHVwX2ZvcmNlKXt2YXIgaGVpZ2h0PU1hdGgubWF4KE1hdGgucm91bmQod2luZG93LmlubmVySGVpZ2h0Ki44KSwzMDApO3ZhciB3aWR0aD1NYXRoLm1heChNYXRoLnJvdW5kKHdpbmRvdy5pbm5lcldpZHRoKi43KSwzMDApO3ZhciB0b3A9d2luZG93LnNjcmVlblkrMTAwO3ZhciBsZWZ0PXdpbmRvdy5zY3JlZW5YKzEwMDt3aW5PcHRpb25zPVwibWVudWJhcj0xLHJlc2l6YWJsZT0xLHdpZHRoPVwiK3dpZHRoK1wiLGhlaWdodD1cIitoZWlnaHQrXCIsdG9wPVwiK3RvcCtcIixsZWZ0PVwiK2xlZnR9dmFyIHByZVBvcFVybD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmO3ZhciBwb3BXaW49d2luZG93Lm9wZW4ocHJlUG9wVXJsLHBvcE1hZ2ljLmdldFB1SWQoKSx3aW5PcHRpb25zKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cG9wV2luLmxvY2F0aW9uLmhyZWY9cG9wTWFnaWMudXJsfSwyMDApO3BvcE1hZ2ljLnNldEFzT3BlbmVkKCk7aWYodHlwZW9mIHRyaWdnZXJlZEV2ZW50LnByZXZlbnREZWZhdWx0IT09XCJ1bmRlZmluZWRcIil7dHJpZ2dlcmVkRXZlbnQucHJldmVudERlZmF1bHQoKTt0cmlnZ2VyZWRFdmVudC5zdG9wUHJvcGFnYXRpb24oKX19fX07ICAgIHBvcE1hZ2ljLmluaXQoYWRDb25maWcpO1xyXG59KSgpO1xyXG5cclxuXHJcbjxcL3NjcmlwdD4ifV0=