From 7730f5f7ec363e1f38f3b1afc88a844d8fae533d Mon Sep 17 00:00:00 2001 From: Luke Bennett Date: Thu, 1 Sep 2016 22:00:43 +0100 Subject: [PATCH 01/31] Removed soon-to-be un-needed project title additions from builds and environments Removed unneeded `project_title` code and last reference Added CHANGELOG entry --- CHANGELOG.md | 1 + app/helpers/projects_helper.rb | 7 ++----- app/views/projects/artifacts/browse.html.haml | 1 - app/views/projects/builds/show.html.haml | 2 +- app/views/projects/environments/_header_title.html.haml | 1 - 5 files changed, 4 insertions(+), 8 deletions(-) delete mode 100644 app/views/projects/environments/_header_title.html.haml diff --git a/CHANGELOG.md b/CHANGELOG.md index 5b072ce9f60..4eefae8ed0b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ entry. - Fail gracefully when creating merge request with non-existing branch (alexsanford) - Fix mobile layout issues in admin user overview page !7087 - Fix HipChat notifications rendering (airatshigapov, eisnerd) +- Removed unneeded "Builds" and "Environments" link from project titles - Remove 'Edit' button from wiki edit view !7143 (Hiroyuki Sato) - Cleaned up global namespace JS !19661 (Jose Ivan Vargas) - Refactor Jira service to use jira-ruby gem diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb index 42c00ec3cd5..17123b1eaee 100644 --- a/app/helpers/projects_helper.rb +++ b/app/helpers/projects_helper.rb @@ -49,7 +49,7 @@ module ProjectsHelper end end - def project_title(project, name = nil, url = nil) + def project_title(project) namespace_link = if project.group link_to(simple_sanitize(project.group.name), group_path(project.group)) @@ -66,10 +66,7 @@ module ProjectsHelper end end - full_title = "#{namespace_link} / #{project_link}".html_safe - full_title << ' · '.html_safe << link_to(simple_sanitize(name), url) if name - - full_title + "#{namespace_link} / #{project_link}".html_safe end def remove_project_message(project) diff --git a/app/views/projects/artifacts/browse.html.haml b/app/views/projects/artifacts/browse.html.haml index 539d07d634a..ede01dcc1aa 100644 --- a/app/views/projects/artifacts/browse.html.haml +++ b/app/views/projects/artifacts/browse.html.haml @@ -1,5 +1,4 @@ - page_title 'Artifacts', "#{@build.name} (##{@build.id})", 'Builds' -- header_title project_title(@project, "Builds", project_builds_path(@project)) .top-block.row-content-block.clearfix .pull-right diff --git a/app/views/projects/builds/show.html.haml b/app/views/projects/builds/show.html.haml index ae7a7ecb392..f533eec642e 100644 --- a/app/views/projects/builds/show.html.haml +++ b/app/views/projects/builds/show.html.haml @@ -1,6 +1,6 @@ - @no_container = true - page_title "#{@build.name} (##{@build.id})", "Builds" -- header_title project_title(@project, "Builds", project_builds_path(@project)) +- trace_with_state = @build.trace_with_state = render "projects/pipelines/head", build_subnav: true %div{ class: container_class } diff --git a/app/views/projects/environments/_header_title.html.haml b/app/views/projects/environments/_header_title.html.haml deleted file mode 100644 index e056fccad5d..00000000000 --- a/app/views/projects/environments/_header_title.html.haml +++ /dev/null @@ -1 +0,0 @@ -- header_title project_title(@project, "Environments", project_environments_path(@project)) From f02f08f53c551c79cb26457182b584e4f38f4437 Mon Sep 17 00:00:00 2001 From: Luke Bennett Date: Fri, 21 Oct 2016 23:52:17 +0100 Subject: [PATCH 02/31] Account for merge request fixed affix bar account for merge request fixed affix bar when adjusting scroll targets --- app/assets/javascripts/application.js | 19 ++++++++++++++++++- app/assets/javascripts/merge_request_tabs.js | 2 +- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index 33c1708e1a9..5c047dd4481 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -58,11 +58,28 @@ document.addEventListener('page:fetch', gl.utils.cleanupBeforeFetch); window.addEventListener('hashchange', gl.utils.shiftWindow); + // automatically adjust scroll position for hash urls taking the height of the navbar into account + // https://github.com/twitter/bootstrap/issues/1768 + window.adjustScroll = function() { + var navbar = document.querySelector('.navbar-gitlab'); + var subnav = document.querySelector('.layout-nav'); + var fixedTabs = document.querySelector('.js-tabs-affix'); + + adjustment = 0; + if (navbar) adjustment -= navbar.offsetHeight; + if (subnav) adjustment -= subnav.offsetHeight; + if (fixedTabs) adjustment -= fixedTabs.offsetHeight; + + return scrollBy(0, adjustment); + }; + + window.addEventListener("hashchange", adjustScroll); + window.onload = function () { // Scroll the window to avoid the topnav bar // https://github.com/twitter/bootstrap/issues/1768 if (location.hash) { - return setTimeout(gl.utils.shiftWindow, 100); + return setTimeout(adjustScroll, 100); } }; diff --git a/app/assets/javascripts/merge_request_tabs.js b/app/assets/javascripts/merge_request_tabs.js index 860ee5df57e..f06b10a9cf7 100644 --- a/app/assets/javascripts/merge_request_tabs.js +++ b/app/assets/javascripts/merge_request_tabs.js @@ -130,7 +130,7 @@ MergeRequestTabs.prototype.scrollToElement = function(container) { var $el, navBarHeight; if (window.location.hash) { - navBarHeight = $('.navbar-gitlab').outerHeight() + $('.layout-nav').outerHeight(); + navBarHeight = $('.navbar-gitlab').outerHeight() + $('.layout-nav').outerHeight() + document.querySelector('.js-tabs-affix').offsetHeight; $el = $(container + " " + window.location.hash + ":not(.match)"); if ($el.length) { return $.scrollTo(container + " " + window.location.hash + ":not(.match)", { From d81d67bae44f189adddd1f4fb489a44e274e21b5 Mon Sep 17 00:00:00 2001 From: tauriedavis Date: Tue, 8 Nov 2016 12:48:28 -0800 Subject: [PATCH 03/31] 19205 Redesign group page header to match new navigation --- app/assets/stylesheets/framework/mobile.scss | 2 +- app/assets/stylesheets/pages/groups.scss | 25 ++-------------- app/assets/stylesheets/pages/projects.scss | 30 ++++++++++++------- app/views/groups/show.html.haml | 26 ++++++++-------- .../projects/buttons/_dropdown.html.haml | 2 +- app/views/projects/show.html.haml | 7 +++-- .../shared/notifications/_button.html.haml | 2 +- spec/features/groups_spec.rb | 8 ++--- 8 files changed, 45 insertions(+), 57 deletions(-) diff --git a/app/assets/stylesheets/framework/mobile.scss b/app/assets/stylesheets/framework/mobile.scss index c1ed43bc20f..9391661a595 100644 --- a/app/assets/stylesheets/framework/mobile.scss +++ b/app/assets/stylesheets/framework/mobile.scss @@ -71,7 +71,7 @@ display: none; } - .group-right-buttons { + .group-buttons { display: none; } diff --git a/app/assets/stylesheets/pages/groups.scss b/app/assets/stylesheets/pages/groups.scss index 4375e29c8db..57d028cec8c 100644 --- a/app/assets/stylesheets/pages/groups.scss +++ b/app/assets/stylesheets/pages/groups.scss @@ -10,7 +10,6 @@ } .group-row { - .stats { float: right; line-height: $list-text-height; @@ -23,36 +22,18 @@ } .ldap-group-links { - .form-actions { margin-bottom: $gl-padding; } } -.groups-cover-block { - - .container-fluid { - position: relative; - } - - .group-right-buttons { - position: absolute; - right: 16px; - - .btn { - @include btn-gray; - padding: 3px 10px; - background-color: $background-color; - } - } - - .group-avatar { - border: 0; +.group-buttons { + .notification-dropdown { + display: inline-block; } } .groups-header { - @media (min-width: $screen-sm-min) { .nav-links { width: 35%; diff --git a/app/assets/stylesheets/pages/projects.scss b/app/assets/stylesheets/pages/projects.scss index f7d54564530..ad46a2a9128 100644 --- a/app/assets/stylesheets/pages/projects.scss +++ b/app/assets/stylesheets/pages/projects.scss @@ -86,7 +86,8 @@ } } -.project-home-panel { +.project-home-panel, +.group-home-panel { padding-top: 24px; padding-bottom: 24px; @@ -94,7 +95,8 @@ border-bottom: 1px solid $border-color; } - .project-avatar { + .project-avatar, + .group-avatar { float: none; margin: 0 auto; border: none; @@ -104,7 +106,8 @@ } } - .project-title { + .project-title, + .group-title { margin-top: 10px; margin-bottom: 10px; font-size: 24px; @@ -118,10 +121,11 @@ } } - .project-home-desc { + .project-home-desc, + .group-home-desc { margin-left: auto; margin-right: auto; - margin-bottom: 15px; + margin-bottom: 0; max-width: 700px; > p { @@ -141,13 +145,18 @@ } } -.project-repo-buttons { - font-size: 0; +.project-repo-buttons, +.group-buttons { + margin-top: 15px; .btn { @include btn-gray; padding: 3px 10px; + &:last-child { + margin-left: 0; + } + .fa { color: $layout-link-gray; } @@ -168,7 +177,8 @@ } } - .project-repo-btn-group, + .download-button, + .dropdown-toggle, .notification-dropdown, .project-dropdown { margin-left: 10px; @@ -474,9 +484,7 @@ a.deploy-project-label { margin-right: $gl-padding; } - &.project-repo-buttons-right { - margin-top: 10px; - + &.right { @media (min-width: $screen-md-min) { float: right; margin-top: 0; diff --git a/app/views/groups/show.html.haml b/app/views/groups/show.html.haml index b439b40a75a..52ce26a20b1 100644 --- a/app/views/groups/show.html.haml +++ b/app/views/groups/show.html.haml @@ -4,25 +4,23 @@ - if current_user = auto_discovery_link_tag(:atom, group_url(@group, format: :atom, private_token: current_user.private_token), title: "#{@group.name} activity") -.cover-block.groups-cover-block +.group-home-panel.text-center %div{ class: container_class } .avatar-container.s70.group-avatar = image_tag group_icon(@group), class: "avatar s70 avatar-tile" - .group-info - .cover-title - %h1 - @#{@group.path} - %span.visibility-icon.has-tooltip{ data: { container: 'body' }, title: visibility_icon_description(@group) } - = visibility_level_icon(@group.visibility_level, fw: false) + %h1.group-title + @#{@group.path} + %span.visibility-icon.has-tooltip{ data: { container: 'body' }, title: visibility_icon_description(@group) } + = visibility_level_icon(@group.visibility_level, fw: false) - .group-right-buttons.btn-group - - if current_user - .pull-left.append-right-10= render 'shared/members/access_request_buttons', source: @group - = render 'shared/notifications/button', notification_setting: @notification_setting + - if @group.description.present? + .group-home-desc + = markdown_field(@group, :description) - - if @group.description.present? - .cover-desc.description - = markdown_field(@group, :description) + - if current_user + .group-buttons + = render 'shared/members/access_request_buttons', source: @group + = render 'shared/notifications/button', notification_setting: @notification_setting %div.groups-header{ class: container_class } .top-area diff --git a/app/views/projects/buttons/_dropdown.html.haml b/app/views/projects/buttons/_dropdown.html.haml index 6cd9b98a706..d3ccebbe290 100644 --- a/app/views/projects/buttons/_dropdown.html.haml +++ b/app/views/projects/buttons/_dropdown.html.haml @@ -1,5 +1,5 @@ - if current_user - .dropdown.inline.project-dropdown + .dropdown.inline %a.btn.dropdown-toggle{href: '#', "data-toggle" => "dropdown"} = icon('plus') = icon("caret-down") diff --git a/app/views/projects/show.html.haml b/app/views/projects/show.html.haml index 4de95036eef..c50093cf47c 100644 --- a/app/views/projects/show.html.haml +++ b/app/views/projects/show.html.haml @@ -66,8 +66,8 @@ = link_to add_special_file_path(@project, file_name: '.gitlab-ci.yml') do Set Up CI - %li.project-repo-buttons-right - .project-repo-buttons.project-right-buttons + %li.project-repo-buttons.right + .project-right-buttons - if current_user = render 'shared/members/access_request_buttons', source: @project = render "projects/buttons/koding" @@ -76,7 +76,8 @@ = render 'projects/buttons/download', project: @project, ref: @ref = render 'projects/buttons/dropdown' - = render 'shared/notifications/button', notification_setting: @notification_setting + .pull-right + = render 'shared/notifications/button', notification_setting: @notification_setting - if @repository.commit .project-last-commit{ class: container_class } = render 'projects/last_commit', commit: @repository.commit, ref: current_ref, project: @project diff --git a/app/views/shared/notifications/_button.html.haml b/app/views/shared/notifications/_button.html.haml index feaa5570c21..1f7df0bcd19 100644 --- a/app/views/shared/notifications/_button.html.haml +++ b/app/views/shared/notifications/_button.html.haml @@ -1,6 +1,6 @@ - left_align = local_assigns[:left_align] - if notification_setting - .dropdown.notification-dropdown.pull-right + .dropdown.notification-dropdown = form_for notification_setting, remote: true, html: { class: "inline notification-form" } do |f| = hidden_setting_source_input(notification_setting) = f.hidden_field :level, class: "notification_setting_level" diff --git a/spec/features/groups_spec.rb b/spec/features/groups_spec.rb index 13bfe90302c..4b19886274e 100644 --- a/spec/features/groups_spec.rb +++ b/spec/features/groups_spec.rb @@ -80,7 +80,7 @@ feature 'Group', feature: true do visit path - expect(page).to have_css('.description > p > strong') + expect(page).to have_css('.group-home-desc > p > strong') end it 'passes through html-pipeline' do @@ -88,7 +88,7 @@ feature 'Group', feature: true do visit path - expect(page).to have_css('.description > p > img') + expect(page).to have_css('.group-home-desc > p > img') end it 'sanitizes unwanted tags' do @@ -96,7 +96,7 @@ feature 'Group', feature: true do visit path - expect(page).not_to have_css('.description h1') + expect(page).not_to have_css('.group-home-desc h1') end it 'permits `rel` attribute on links' do @@ -104,7 +104,7 @@ feature 'Group', feature: true do visit path - expect(page).to have_css('.description a[rel]') + expect(page).to have_css('.group-home-desc a[rel]') end end end From 11deb3f1a16f426d77106a8b7efaf24eca292d76 Mon Sep 17 00:00:00 2001 From: teru Date: Thu, 10 Nov 2016 13:59:17 +0900 Subject: [PATCH 04/31] Use config param in `Repository#update_ref!` --- app/models/repository.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/repository.rb b/app/models/repository.rb index 7d06ce1e85b..6c93ba1e912 100644 --- a/app/models/repository.rb +++ b/app/models/repository.rb @@ -239,7 +239,7 @@ class Repository # offer 'compare and swap' ref updates. Without compare-and-swap we can # (and have!) accidentally reset the ref to an earlier state, clobbering # commits. See also https://github.com/libgit2/libgit2/issues/1534. - command = %w[git update-ref --stdin -z] + command = %W(#{Gitlab.config.git.bin_path} update-ref --stdin -z) _, status = Gitlab::Popen.popen(command, path_to_repo) do |stdin| stdin.write("update #{name}\x00#{newrev}\x00#{oldrev}\x00") end From a51285ade1d06f2383796cc2d9f36c33b46f79a4 Mon Sep 17 00:00:00 2001 From: Fatih Acet Date: Thu, 3 Nov 2016 00:04:37 +0300 Subject: [PATCH 05/31] Bump up vue version. --- vendor/assets/javascripts/vue.full.js | 17170 ++++++++++-------------- vendor/assets/javascripts/vue.min.js | 10 +- 2 files changed, 7310 insertions(+), 9870 deletions(-) diff --git a/vendor/assets/javascripts/vue.full.js b/vendor/assets/javascripts/vue.full.js index 7ae95897a01..ea15bfac416 100644 --- a/vendor/assets/javascripts/vue.full.js +++ b/vendor/assets/javascripts/vue.full.js @@ -1,10073 +1,7515 @@ /*! - * Vue.js v1.0.26 - * (c) 2016 Evan You + * Vue.js v2.0.3 + * (c) 2014-2016 Evan You * Released under the MIT License. */ (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : typeof define === 'function' && define.amd ? define(factory) : (global.Vue = factory()); -}(this, function () { 'use strict'; +}(this, (function () { 'use strict'; - function set(obj, key, val) { - if (hasOwn(obj, key)) { - obj[key] = val; - return; +/* */ + +/** + * Convert a value to a string that is actually rendered. + */ +function _toString (val) { + return val == null + ? '' + : typeof val === 'object' + ? JSON.stringify(val, null, 2) + : String(val) +} + +/** + * Convert a input value to a number for persistence. + * If the conversion fails, return original string. + */ +function toNumber (val) { + var n = parseFloat(val, 10); + return (n || n === 0) ? n : val +} + +/** + * Make a map and return a function for checking if a key + * is in that map. + */ +function makeMap ( + str, + expectsLowerCase +) { + var map = Object.create(null); + var list = str.split(','); + for (var i = 0; i < list.length; i++) { + map[list[i]] = true; + } + return expectsLowerCase + ? function (val) { return map[val.toLowerCase()]; } + : function (val) { return map[val]; } +} + +/** + * Check if a tag is a built-in tag. + */ +var isBuiltInTag = makeMap('slot,component', true); + +/** + * Remove an item from an array + */ +function remove$1 (arr, item) { + if (arr.length) { + var index = arr.indexOf(item); + if (index > -1) { + return arr.splice(index, 1) } - if (obj._isVue) { - set(obj._data, key, val); - return; + } +} + +/** + * Check whether the object has the property. + */ +var hasOwnProperty = Object.prototype.hasOwnProperty; +function hasOwn (obj, key) { + return hasOwnProperty.call(obj, key) +} + +/** + * Check if value is primitive + */ +function isPrimitive (value) { + return typeof value === 'string' || typeof value === 'number' +} + +/** + * Create a cached version of a pure function. + */ +function cached (fn) { + var cache = Object.create(null); + return function cachedFn (str) { + var hit = cache[str]; + return hit || (cache[str] = fn(str)) + } +} + +/** + * Camelize a hyphen-delmited string. + */ +var camelizeRE = /-(\w)/g; +var camelize = cached(function (str) { + return str.replace(camelizeRE, function (_, c) { return c ? c.toUpperCase() : ''; }) +}); + +/** + * Capitalize a string. + */ +var capitalize = cached(function (str) { + return str.charAt(0).toUpperCase() + str.slice(1) +}); + +/** + * Hyphenate a camelCase string. + */ +var hyphenateRE = /([^-])([A-Z])/g; +var hyphenate = cached(function (str) { + return str + .replace(hyphenateRE, '$1-$2') + .replace(hyphenateRE, '$1-$2') + .toLowerCase() +}); + +/** + * Simple bind, faster than native + */ +function bind$1 (fn, ctx) { + function boundFn (a) { + var l = arguments.length; + return l + ? l > 1 + ? fn.apply(ctx, arguments) + : fn.call(ctx, a) + : fn.call(ctx) + } + // record original fn length + boundFn._length = fn.length; + return boundFn +} + +/** + * Convert an Array-like object to a real Array. + */ +function toArray (list, start) { + start = start || 0; + var i = list.length - start; + var ret = new Array(i); + while (i--) { + ret[i] = list[i + start]; + } + return ret +} + +/** + * Mix properties into target object. + */ +function extend (to, _from) { + for (var key in _from) { + to[key] = _from[key]; + } + return to +} + +/** + * Quick object check - this is primarily used to tell + * Objects from primitive values when we know the value + * is a JSON-compliant type. + */ +function isObject (obj) { + return obj !== null && typeof obj === 'object' +} + +/** + * Strict object type check. Only returns true + * for plain JavaScript objects. + */ +var toString = Object.prototype.toString; +var OBJECT_STRING = '[object Object]'; +function isPlainObject (obj) { + return toString.call(obj) === OBJECT_STRING +} + +/** + * Merge an Array of Objects into a single Object. + */ +function toObject (arr) { + var res = {}; + for (var i = 0; i < arr.length; i++) { + if (arr[i]) { + extend(res, arr[i]); } - var ob = obj.__ob__; - if (!ob) { - obj[key] = val; - return; - } - ob.convert(key, val); - ob.dep.notify(); - if (ob.vms) { - var i = ob.vms.length; - while (i--) { - var vm = ob.vms[i]; - vm._proxy(key); - vm._digest(); + } + return res +} + +/** + * Perform no operation. + */ +function noop () {} + +/** + * Always return false. + */ +var no = function () { return false; }; + +/** + * Generate a static keys string from compiler modules. + */ +function genStaticKeys (modules) { + return modules.reduce(function (keys, m) { + return keys.concat(m.staticKeys || []) + }, []).join(',') +} + +/** + * Check if two values are loosely equal - that is, + * if they are plain objects, do they have the same shape? + */ +function looseEqual (a, b) { + /* eslint-disable eqeqeq */ + return a == b || ( + isObject(a) && isObject(b) + ? JSON.stringify(a) === JSON.stringify(b) + : false + ) + /* eslint-enable eqeqeq */ +} + +function looseIndexOf (arr, val) { + for (var i = 0; i < arr.length; i++) { + if (looseEqual(arr[i], val)) { return i } + } + return -1 +} + +/* */ + +var config = { + /** + * Option merge strategies (used in core/util/options) + */ + optionMergeStrategies: Object.create(null), + + /** + * Whether to suppress warnings. + */ + silent: false, + + /** + * Whether to enable devtools + */ + devtools: "development" !== 'production', + + /** + * Error handler for watcher errors + */ + errorHandler: null, + + /** + * Ignore certain custom elements + */ + ignoredElements: null, + + /** + * Custom user key aliases for v-on + */ + keyCodes: Object.create(null), + + /** + * Check if a tag is reserved so that it cannot be registered as a + * component. This is platform-dependent and may be overwritten. + */ + isReservedTag: no, + + /** + * Check if a tag is an unknown element. + * Platform-dependent. + */ + isUnknownElement: no, + + /** + * Get the namespace of an element + */ + getTagNamespace: noop, + + /** + * Check if an attribute must be bound using property, e.g. value + * Platform-dependent. + */ + mustUseProp: no, + + /** + * List of asset types that a component can own. + */ + _assetTypes: [ + 'component', + 'directive', + 'filter' + ], + + /** + * List of lifecycle hooks. + */ + _lifecycleHooks: [ + 'beforeCreate', + 'created', + 'beforeMount', + 'mounted', + 'beforeUpdate', + 'updated', + 'beforeDestroy', + 'destroyed', + 'activated', + 'deactivated' + ], + + /** + * Max circular updates allowed in a scheduler flush cycle. + */ + _maxUpdateCount: 100, + + /** + * Server rendering? + */ + _isServer: "client" === 'server' +}; + +/* */ + +/** + * Check if a string starts with $ or _ + */ +function isReserved (str) { + var c = (str + '').charCodeAt(0); + return c === 0x24 || c === 0x5F +} + +/** + * Define a property. + */ +function def (obj, key, val, enumerable) { + Object.defineProperty(obj, key, { + value: val, + enumerable: !!enumerable, + writable: true, + configurable: true + }); +} + +/** + * Parse simple path. + */ +var bailRE = /[^\w\.\$]/; +function parsePath (path) { + if (bailRE.test(path)) { + return + } else { + var segments = path.split('.'); + return function (obj) { + for (var i = 0; i < segments.length; i++) { + if (!obj) { return } + obj = obj[segments[i]]; } + return obj } - return val; } +} - /** - * Delete a property and trigger change if necessary. - * - * @param {Object} obj - * @param {String} key - */ +/* */ +/* globals MutationObserver */ - function del(obj, key) { - if (!hasOwn(obj, key)) { - return; - } - delete obj[key]; - var ob = obj.__ob__; - if (!ob) { - if (obj._isVue) { - delete obj._data[key]; - obj._digest(); - } - return; - } - ob.dep.notify(); - if (ob.vms) { - var i = ob.vms.length; - while (i--) { - var vm = ob.vms[i]; - vm._unproxy(key); - vm._digest(); - } +// can we use __proto__? +var hasProto = '__proto__' in {}; + +// Browser environment sniffing +var inBrowser = + typeof window !== 'undefined' && + Object.prototype.toString.call(window) !== '[object Object]'; + +var UA = inBrowser && window.navigator.userAgent.toLowerCase(); +var isIE = UA && /msie|trident/.test(UA); +var isIE9 = UA && UA.indexOf('msie 9.0') > 0; +var isEdge = UA && UA.indexOf('edge/') > 0; +var isAndroid = UA && UA.indexOf('android') > 0; +var isIOS = UA && /iphone|ipad|ipod|ios/.test(UA); + +// detect devtools +var devtools = inBrowser && window.__VUE_DEVTOOLS_GLOBAL_HOOK__; + +/* istanbul ignore next */ +function isNative (Ctor) { + return /native code/.test(Ctor.toString()) +} + +/** + * Defer a task to execute it asynchronously. + */ +var nextTick = (function () { + var callbacks = []; + var pending = false; + var timerFunc; + + function nextTickHandler () { + pending = false; + var copies = callbacks.slice(0); + callbacks.length = 0; + for (var i = 0; i < copies.length; i++) { + copies[i](); } } - var hasOwnProperty = Object.prototype.hasOwnProperty; - /** - * Check whether the object has the property. - * - * @param {Object} obj - * @param {String} key - * @return {Boolean} - */ - - function hasOwn(obj, key) { - return hasOwnProperty.call(obj, key); - } - - /** - * Check if an expression is a literal value. - * - * @param {String} exp - * @return {Boolean} - */ - - var literalValueRE = /^\s?(true|false|-?[\d\.]+|'[^']*'|"[^"]*")\s?$/; - - function isLiteral(exp) { - return literalValueRE.test(exp); - } - - /** - * Check if a string starts with $ or _ - * - * @param {String} str - * @return {Boolean} - */ - - function isReserved(str) { - var c = (str + '').charCodeAt(0); - return c === 0x24 || c === 0x5F; - } - - /** - * Guard text output, make sure undefined outputs - * empty string - * - * @param {*} value - * @return {String} - */ - - function _toString(value) { - return value == null ? '' : value.toString(); - } - - /** - * Check and convert possible numeric strings to numbers - * before setting back to data - * - * @param {*} value - * @return {*|Number} - */ - - function toNumber(value) { - if (typeof value !== 'string') { - return value; - } else { - var parsed = Number(value); - return isNaN(parsed) ? value : parsed; - } - } - - /** - * Convert string boolean literals into real booleans. - * - * @param {*} value - * @return {*|Boolean} - */ - - function toBoolean(value) { - return value === 'true' ? true : value === 'false' ? false : value; - } - - /** - * Strip quotes from a string - * - * @param {String} str - * @return {String | false} - */ - - function stripQuotes(str) { - var a = str.charCodeAt(0); - var b = str.charCodeAt(str.length - 1); - return a === b && (a === 0x22 || a === 0x27) ? str.slice(1, -1) : str; - } - - /** - * Camelize a hyphen-delmited string. - * - * @param {String} str - * @return {String} - */ - - var camelizeRE = /-(\w)/g; - - function camelize(str) { - return str.replace(camelizeRE, toUpper); - } - - function toUpper(_, c) { - return c ? c.toUpperCase() : ''; - } - - /** - * Hyphenate a camelCase string. - * - * @param {String} str - * @return {String} - */ - - var hyphenateRE = /([a-z\d])([A-Z])/g; - - function hyphenate(str) { - return str.replace(hyphenateRE, '$1-$2').toLowerCase(); - } - - /** - * Converts hyphen/underscore/slash delimitered names into - * camelized classNames. - * - * e.g. my-component => MyComponent - * some_else => SomeElse - * some/comp => SomeComp - * - * @param {String} str - * @return {String} - */ - - var classifyRE = /(?:^|[-_\/])(\w)/g; - - function classify(str) { - return str.replace(classifyRE, toUpper); - } - - /** - * Simple bind, faster than native - * - * @param {Function} fn - * @param {Object} ctx - * @return {Function} - */ - - function bind(fn, ctx) { - return function (a) { - var l = arguments.length; - return l ? l > 1 ? fn.apply(ctx, arguments) : fn.call(ctx, a) : fn.call(ctx); + // the nextTick behavior leverages the microtask queue, which can be accessed + // via either native Promise.then or MutationObserver. + // MutationObserver has wider support, however it is seriously bugged in + // UIWebView in iOS >= 9.3.3 when triggered in touch event handlers. It + // completely stops working after triggering a few times... so, if native + // Promise is available, we will use it: + /* istanbul ignore if */ + if (typeof Promise !== 'undefined' && isNative(Promise)) { + var p = Promise.resolve(); + timerFunc = function () { + p.then(nextTickHandler); + // in problematic UIWebViews, Promise.then doesn't completely break, but + // it can get stuck in a weird state where callbacks are pushed into the + // microtask queue but the queue isn't being flushed, until the browser + // needs to do some other work, e.g. handle a timer. Therefore we can + // "force" the microtask queue to be flushed by adding an empty timer. + if (isIOS) { setTimeout(noop); } + }; + } else if (typeof MutationObserver !== 'undefined' && ( + isNative(MutationObserver) || + // PhantomJS and iOS 7.x + MutationObserver.toString() === '[object MutationObserverConstructor]' + )) { + // use MutationObserver where native Promise is not available, + // e.g. PhantomJS IE11, iOS7, Android 4.4 + var counter = 1; + var observer = new MutationObserver(nextTickHandler); + var textNode = document.createTextNode(String(counter)); + observer.observe(textNode, { + characterData: true + }); + timerFunc = function () { + counter = (counter + 1) % 2; + textNode.data = String(counter); + }; + } else { + // fallback to setTimeout + /* istanbul ignore next */ + timerFunc = function () { + setTimeout(nextTickHandler, 0); }; } - /** - * Convert an Array-like object to a real Array. - * - * @param {Array-like} list - * @param {Number} [start] - start index - * @return {Array} - */ - - function toArray(list, start) { - start = start || 0; - var i = list.length - start; - var ret = new Array(i); - while (i--) { - ret[i] = list[i + start]; + return function queueNextTick (cb, ctx) { + var func = ctx + ? function () { cb.call(ctx); } + : cb; + callbacks.push(func); + if (!pending) { + pending = true; + timerFunc(); } - return ret; } +})(); - /** - * Mix properties into target object. - * - * @param {Object} to - * @param {Object} from - */ - - function extend(to, from) { - var keys = Object.keys(from); - var i = keys.length; - while (i--) { - to[keys[i]] = from[keys[i]]; +var _Set; +/* istanbul ignore if */ +if (typeof Set !== 'undefined' && isNative(Set)) { + // use native Set when available. + _Set = Set; +} else { + // a non-standard Set polyfill that only works with primitive keys. + _Set = (function () { + function Set () { + this.set = Object.create(null); + } + Set.prototype.has = function has (key) { + return this.set[key] !== undefined + }; + Set.prototype.add = function add (key) { + this.set[key] = 1; + }; + Set.prototype.clear = function clear () { + this.set = Object.create(null); + }; + + return Set; + }()); +} + +/* not type checking this file because flow doesn't play well with Proxy */ + +var hasProxy; +var proxyHandlers; +var initProxy; + +{ + var allowedGlobals = makeMap( + 'Infinity,undefined,NaN,isFinite,isNaN,' + + 'parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,' + + 'Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,' + + 'require' // for Webpack/Browserify + ); + + hasProxy = + typeof Proxy !== 'undefined' && + Proxy.toString().match(/native code/); + + proxyHandlers = { + has: function has (target, key) { + var has = key in target; + var isAllowed = allowedGlobals(key) || key.charAt(0) === '_'; + if (!has && !isAllowed) { + warn( + "Property or method \"" + key + "\" is not defined on the instance but " + + "referenced during render. Make sure to declare reactive data " + + "properties in the data option.", + target + ); + } + return has || !isAllowed + } + }; + + initProxy = function initProxy (vm) { + if (hasProxy) { + vm._renderProxy = new Proxy(vm, proxyHandlers); + } else { + vm._renderProxy = vm; + } + }; +} + +/* */ + + +var uid$2 = 0; + +/** + * A dep is an observable that can have multiple + * directives subscribing to it. + */ +var Dep = function Dep () { + this.id = uid$2++; + this.subs = []; +}; + +Dep.prototype.addSub = function addSub (sub) { + this.subs.push(sub); +}; + +Dep.prototype.removeSub = function removeSub (sub) { + remove$1(this.subs, sub); +}; + +Dep.prototype.depend = function depend () { + if (Dep.target) { + Dep.target.addDep(this); + } +}; + +Dep.prototype.notify = function notify () { + // stablize the subscriber list first + var subs = this.subs.slice(); + for (var i = 0, l = subs.length; i < l; i++) { + subs[i].update(); + } +}; + +// the current target watcher being evaluated. +// this is globally unique because there could be only one +// watcher being evaluated at any time. +Dep.target = null; +var targetStack = []; + +function pushTarget (_target) { + if (Dep.target) { targetStack.push(Dep.target); } + Dep.target = _target; +} + +function popTarget () { + Dep.target = targetStack.pop(); +} + +/* */ + + +var queue = []; +var has$1 = {}; +var circular = {}; +var waiting = false; +var flushing = false; +var index = 0; + +/** + * Reset the scheduler's state. + */ +function resetSchedulerState () { + queue.length = 0; + has$1 = {}; + { + circular = {}; + } + waiting = flushing = false; +} + +/** + * Flush both queues and run the watchers. + */ +function flushSchedulerQueue () { + flushing = true; + + // Sort queue before flush. + // This ensures that: + // 1. Components are updated from parent to child. (because parent is always + // created before the child) + // 2. A component's user watchers are run before its render watcher (because + // user watchers are created before the render watcher) + // 3. If a component is destroyed during a parent component's watcher run, + // its watchers can be skipped. + queue.sort(function (a, b) { return a.id - b.id; }); + + // do not cache length because more watchers might be pushed + // as we run existing watchers + for (index = 0; index < queue.length; index++) { + var watcher = queue[index]; + var id = watcher.id; + has$1[id] = null; + watcher.run(); + // in dev build, check and stop circular updates. + if ("development" !== 'production' && has$1[id] != null) { + circular[id] = (circular[id] || 0) + 1; + if (circular[id] > config._maxUpdateCount) { + warn( + 'You may have an infinite update loop ' + ( + watcher.user + ? ("in watcher with expression \"" + (watcher.expression) + "\"") + : "in a component render function." + ), + watcher.vm + ); + break + } } - return to; } - /** - * Quick object check - this is primarily used to tell - * Objects from primitive values when we know the value - * is a JSON-compliant type. - * - * @param {*} obj - * @return {Boolean} - */ - - function isObject(obj) { - return obj !== null && typeof obj === 'object'; + // devtool hook + /* istanbul ignore if */ + if (devtools && config.devtools) { + devtools.emit('flush'); } - /** - * Strict object type check. Only returns true - * for plain JavaScript objects. - * - * @param {*} obj - * @return {Boolean} - */ + resetSchedulerState(); +} - var toString = Object.prototype.toString; - var OBJECT_STRING = '[object Object]'; +/** + * Push a watcher into the watcher queue. + * Jobs with duplicate IDs will be skipped unless it's + * pushed when the queue is being flushed. + */ +function queueWatcher (watcher) { + var id = watcher.id; + if (has$1[id] == null) { + has$1[id] = true; + if (!flushing) { + queue.push(watcher); + } else { + // if already flushing, splice the watcher based on its id + // if already past its id, it will be run next immediately. + var i = queue.length - 1; + while (i >= 0 && queue[i].id > watcher.id) { + i--; + } + queue.splice(Math.max(i, index) + 1, 0, watcher); + } + // queue the flush + if (!waiting) { + waiting = true; + nextTick(flushSchedulerQueue); + } + } +} - function isPlainObject(obj) { - return toString.call(obj) === OBJECT_STRING; +/* */ + +var uid$1 = 0; + +/** + * A watcher parses an expression, collects dependencies, + * and fires callback when the expression value changes. + * This is used for both the $watch() api and directives. + */ +var Watcher = function Watcher ( + vm, + expOrFn, + cb, + options +) { + if ( options === void 0 ) options = {}; + + this.vm = vm; + vm._watchers.push(this); + // options + this.deep = !!options.deep; + this.user = !!options.user; + this.lazy = !!options.lazy; + this.sync = !!options.sync; + this.expression = expOrFn.toString(); + this.cb = cb; + this.id = ++uid$1; // uid for batching + this.active = true; + this.dirty = this.lazy; // for lazy watchers + this.deps = []; + this.newDeps = []; + this.depIds = new _Set(); + this.newDepIds = new _Set(); + // parse expression for getter + if (typeof expOrFn === 'function') { + this.getter = expOrFn; + } else { + this.getter = parsePath(expOrFn); + if (!this.getter) { + this.getter = function () {}; + "development" !== 'production' && warn( + "Failed watching path: \"" + expOrFn + "\" " + + 'Watcher only accepts simple dot-delimited paths. ' + + 'For full control, use a function instead.', + vm + ); + } + } + this.value = this.lazy + ? undefined + : this.get(); +}; + +/** + * Evaluate the getter, and re-collect dependencies. + */ +Watcher.prototype.get = function get () { + pushTarget(this); + var value = this.getter.call(this.vm, this.vm); + // "touch" every property so they are all tracked as + // dependencies for deep watching + if (this.deep) { + traverse(value); + } + popTarget(); + this.cleanupDeps(); + return value +}; + +/** + * Add a dependency to this directive. + */ +Watcher.prototype.addDep = function addDep (dep) { + var id = dep.id; + if (!this.newDepIds.has(id)) { + this.newDepIds.add(id); + this.newDeps.push(dep); + if (!this.depIds.has(id)) { + dep.addSub(this); + } + } +}; + +/** + * Clean up for dependency collection. + */ +Watcher.prototype.cleanupDeps = function cleanupDeps () { + var this$1 = this; + + var i = this.deps.length; + while (i--) { + var dep = this$1.deps[i]; + if (!this$1.newDepIds.has(dep.id)) { + dep.removeSub(this$1); + } + } + var tmp = this.depIds; + this.depIds = this.newDepIds; + this.newDepIds = tmp; + this.newDepIds.clear(); + tmp = this.deps; + this.deps = this.newDeps; + this.newDeps = tmp; + this.newDeps.length = 0; +}; + +/** + * Subscriber interface. + * Will be called when a dependency changes. + */ +Watcher.prototype.update = function update () { + /* istanbul ignore else */ + if (this.lazy) { + this.dirty = true; + } else if (this.sync) { + this.run(); + } else { + queueWatcher(this); + } +}; + +/** + * Scheduler job interface. + * Will be called by the scheduler. + */ +Watcher.prototype.run = function run () { + if (this.active) { + var value = this.get(); + if ( + value !== this.value || + // Deep watchers and watchers on Object/Arrays should fire even + // when the value is the same, because the value may + // have mutated. + isObject(value) || + this.deep + ) { + // set new value + var oldValue = this.value; + this.value = value; + if (this.user) { + try { + this.cb.call(this.vm, value, oldValue); + } catch (e) { + "development" !== 'production' && warn( + ("Error in watcher \"" + (this.expression) + "\""), + this.vm + ); + /* istanbul ignore else */ + if (config.errorHandler) { + config.errorHandler.call(null, e, this.vm); + } else { + throw e + } + } + } else { + this.cb.call(this.vm, value, oldValue); + } + } + } +}; + +/** + * Evaluate the value of the watcher. + * This only gets called for lazy watchers. + */ +Watcher.prototype.evaluate = function evaluate () { + this.value = this.get(); + this.dirty = false; +}; + +/** + * Depend on all deps collected by this watcher. + */ +Watcher.prototype.depend = function depend () { + var this$1 = this; + + var i = this.deps.length; + while (i--) { + this$1.deps[i].depend(); + } +}; + +/** + * Remove self from all dependencies' subcriber list. + */ +Watcher.prototype.teardown = function teardown () { + var this$1 = this; + + if (this.active) { + // remove self from vm's watcher list + // this is a somewhat expensive operation so we skip it + // if the vm is being destroyed or is performing a v-for + // re-render (the watcher list is then filtered by v-for). + if (!this.vm._isBeingDestroyed && !this.vm._vForRemoving) { + remove$1(this.vm._watchers, this); + } + var i = this.deps.length; + while (i--) { + this$1.deps[i].removeSub(this$1); + } + this.active = false; + } +}; + +/** + * Recursively traverse an object to evoke all converted + * getters, so that every nested property inside the object + * is collected as a "deep" dependency. + */ +var seenObjects = new _Set(); +function traverse (val, seen) { + var i, keys; + if (!seen) { + seen = seenObjects; + seen.clear(); + } + var isA = Array.isArray(val); + var isO = isObject(val); + if ((isA || isO) && Object.isExtensible(val)) { + if (val.__ob__) { + var depId = val.__ob__.dep.id; + if (seen.has(depId)) { + return + } else { + seen.add(depId); + } + } + if (isA) { + i = val.length; + while (i--) { traverse(val[i], seen); } + } else if (isO) { + keys = Object.keys(val); + i = keys.length; + while (i--) { traverse(val[keys[i]], seen); } + } + } +} + +/* + * not type checking this file because flow doesn't play well with + * dynamically accessing methods on Array prototype + */ + +var arrayProto = Array.prototype; +var arrayMethods = Object.create(arrayProto);[ + 'push', + 'pop', + 'shift', + 'unshift', + 'splice', + 'sort', + 'reverse' +] +.forEach(function (method) { + // cache original method + var original = arrayProto[method]; + def(arrayMethods, method, function mutator () { + var arguments$1 = arguments; + + // avoid leaking arguments: + // http://jsperf.com/closure-with-arguments + var i = arguments.length; + var args = new Array(i); + while (i--) { + args[i] = arguments$1[i]; + } + var result = original.apply(this, args); + var ob = this.__ob__; + var inserted; + switch (method) { + case 'push': + inserted = args; + break + case 'unshift': + inserted = args; + break + case 'splice': + inserted = args.slice(2); + break + } + if (inserted) { ob.observeArray(inserted); } + // notify change + ob.dep.notify(); + return result + }); +}); + +/* */ + +var arrayKeys = Object.getOwnPropertyNames(arrayMethods); + +/** + * By default, when a reactive property is set, the new value is + * also converted to become reactive. However when passing down props, + * we don't want to force conversion because the value may be a nested value + * under a frozen data structure. Converting it would defeat the optimization. + */ +var observerState = { + shouldConvert: true, + isSettingProps: false +}; + +/** + * Observer class that are attached to each observed + * object. Once attached, the observer converts target + * object's property keys into getter/setters that + * collect dependencies and dispatches updates. + */ +var Observer = function Observer (value) { + this.value = value; + this.dep = new Dep(); + this.vmCount = 0; + def(value, '__ob__', this); + if (Array.isArray(value)) { + var augment = hasProto + ? protoAugment + : copyAugment; + augment(value, arrayMethods, arrayKeys); + this.observeArray(value); + } else { + this.walk(value); + } +}; + +/** + * Walk through each property and convert them into + * getter/setters. This method should only be called when + * value type is Object. + */ +Observer.prototype.walk = function walk (obj) { + var keys = Object.keys(obj); + for (var i = 0; i < keys.length; i++) { + defineReactive$$1(obj, keys[i], obj[keys[i]]); + } +}; + +/** + * Observe a list of Array items. + */ +Observer.prototype.observeArray = function observeArray (items) { + for (var i = 0, l = items.length; i < l; i++) { + observe(items[i]); + } +}; + +// helpers + +/** + * Augment an target Object or Array by intercepting + * the prototype chain using __proto__ + */ +function protoAugment (target, src) { + /* eslint-disable no-proto */ + target.__proto__ = src; + /* eslint-enable no-proto */ +} + +/** + * Augment an target Object or Array by defining + * hidden properties. + * + * istanbul ignore next + */ +function copyAugment (target, src, keys) { + for (var i = 0, l = keys.length; i < l; i++) { + var key = keys[i]; + def(target, key, src[key]); + } +} + +/** + * Attempt to create an observer instance for a value, + * returns the new observer if successfully observed, + * or the existing observer if the value already has one. + */ +function observe (value) { + if (!isObject(value)) { + return + } + var ob; + if (hasOwn(value, '__ob__') && value.__ob__ instanceof Observer) { + ob = value.__ob__; + } else if ( + observerState.shouldConvert && + !config._isServer && + (Array.isArray(value) || isPlainObject(value)) && + Object.isExtensible(value) && + !value._isVue + ) { + ob = new Observer(value); + } + return ob +} + +/** + * Define a reactive property on an Object. + */ +function defineReactive$$1 ( + obj, + key, + val, + customSetter +) { + var dep = new Dep(); + + var property = Object.getOwnPropertyDescriptor(obj, key); + if (property && property.configurable === false) { + return } - /** - * Array type check. - * - * @param {*} obj - * @return {Boolean} - */ + // cater for pre-defined getter/setters + var getter = property && property.get; + var setter = property && property.set; - var isArray = Array.isArray; + var childOb = observe(val); + Object.defineProperty(obj, key, { + enumerable: true, + configurable: true, + get: function reactiveGetter () { + var value = getter ? getter.call(obj) : val; + if (Dep.target) { + dep.depend(); + if (childOb) { + childOb.dep.depend(); + } + if (Array.isArray(value)) { + dependArray(value); + } + } + return value + }, + set: function reactiveSetter (newVal) { + var value = getter ? getter.call(obj) : val; + if (newVal === value) { + return + } + if ("development" !== 'production' && customSetter) { + customSetter(); + } + if (setter) { + setter.call(obj, newVal); + } else { + val = newVal; + } + childOb = observe(newVal); + dep.notify(); + } + }); +} + +/** + * Set a property on an object. Adds the new property and + * triggers change notification if the property doesn't + * already exist. + */ +function set (obj, key, val) { + if (Array.isArray(obj)) { + obj.splice(key, 1, val); + return val + } + if (hasOwn(obj, key)) { + obj[key] = val; + return + } + var ob = obj.__ob__; + if (obj._isVue || (ob && ob.vmCount)) { + "development" !== 'production' && warn( + 'Avoid adding reactive properties to a Vue instance or its root $data ' + + 'at runtime - declare it upfront in the data option.' + ); + return + } + if (!ob) { + obj[key] = val; + return + } + defineReactive$$1(ob.value, key, val); + ob.dep.notify(); + return val +} + +/** + * Delete a property and trigger change if necessary. + */ +function del (obj, key) { + var ob = obj.__ob__; + if (obj._isVue || (ob && ob.vmCount)) { + "development" !== 'production' && warn( + 'Avoid deleting properties on a Vue instance or its root $data ' + + '- just set it to null.' + ); + return + } + if (!hasOwn(obj, key)) { + return + } + delete obj[key]; + if (!ob) { + return + } + ob.dep.notify(); +} + +/** + * Collect dependencies on array elements when the array is touched, since + * we cannot intercept array element access like property getters. + */ +function dependArray (value) { + for (var e = void 0, i = 0, l = value.length; i < l; i++) { + e = value[i]; + e && e.__ob__ && e.__ob__.dep.depend(); + if (Array.isArray(e)) { + dependArray(e); + } + } +} + +/* */ + +function initState (vm) { + vm._watchers = []; + initProps(vm); + initData(vm); + initComputed(vm); + initMethods(vm); + initWatch(vm); +} + +function initProps (vm) { + var props = vm.$options.props; + if (props) { + var propsData = vm.$options.propsData || {}; + var keys = vm.$options._propKeys = Object.keys(props); + var isRoot = !vm.$parent; + // root instance props should be converted + observerState.shouldConvert = isRoot; + var loop = function ( i ) { + var key = keys[i]; + /* istanbul ignore else */ + { + defineReactive$$1(vm, key, validateProp(key, props, propsData, vm), function () { + if (vm.$parent && !observerState.isSettingProps) { + warn( + "Avoid mutating a prop directly since the value will be " + + "overwritten whenever the parent component re-renders. " + + "Instead, use a data or computed property based on the prop's " + + "value. Prop being mutated: \"" + key + "\"", + vm + ); + } + }); + } + }; + + for (var i = 0; i < keys.length; i++) loop( i ); + observerState.shouldConvert = true; + } +} + +function initData (vm) { + var data = vm.$options.data; + data = vm._data = typeof data === 'function' + ? data.call(vm) + : data || {}; + if (!isPlainObject(data)) { + data = {}; + "development" !== 'production' && warn( + 'data functions should return an object.', + vm + ); + } + // proxy data on instance + var keys = Object.keys(data); + var props = vm.$options.props; + var i = keys.length; + while (i--) { + if (props && hasOwn(props, keys[i])) { + "development" !== 'production' && warn( + "The data property \"" + (keys[i]) + "\" is already declared as a prop. " + + "Use prop default value instead.", + vm + ); + } else { + proxy(vm, keys[i]); + } + } + // observe data + observe(data); + data.__ob__ && data.__ob__.vmCount++; +} + +var computedSharedDefinition = { + enumerable: true, + configurable: true, + get: noop, + set: noop +}; + +function initComputed (vm) { + var computed = vm.$options.computed; + if (computed) { + for (var key in computed) { + var userDef = computed[key]; + if (typeof userDef === 'function') { + computedSharedDefinition.get = makeComputedGetter(userDef, vm); + computedSharedDefinition.set = noop; + } else { + computedSharedDefinition.get = userDef.get + ? userDef.cache !== false + ? makeComputedGetter(userDef.get, vm) + : bind$1(userDef.get, vm) + : noop; + computedSharedDefinition.set = userDef.set + ? bind$1(userDef.set, vm) + : noop; + } + Object.defineProperty(vm, key, computedSharedDefinition); + } + } +} + +function makeComputedGetter (getter, owner) { + var watcher = new Watcher(owner, getter, noop, { + lazy: true + }); + return function computedGetter () { + if (watcher.dirty) { + watcher.evaluate(); + } + if (Dep.target) { + watcher.depend(); + } + return watcher.value + } +} + +function initMethods (vm) { + var methods = vm.$options.methods; + if (methods) { + for (var key in methods) { + vm[key] = methods[key] == null ? noop : bind$1(methods[key], vm); + if ("development" !== 'production' && methods[key] == null) { + warn( + "method \"" + key + "\" has an undefined value in the component definition. " + + "Did you reference the function correctly?", + vm + ); + } + } + } +} + +function initWatch (vm) { + var watch = vm.$options.watch; + if (watch) { + for (var key in watch) { + var handler = watch[key]; + if (Array.isArray(handler)) { + for (var i = 0; i < handler.length; i++) { + createWatcher(vm, key, handler[i]); + } + } else { + createWatcher(vm, key, handler); + } + } + } +} + +function createWatcher (vm, key, handler) { + var options; + if (isPlainObject(handler)) { + options = handler; + handler = handler.handler; + } + if (typeof handler === 'string') { + handler = vm[handler]; + } + vm.$watch(key, handler, options); +} + +function stateMixin (Vue) { + // flow somehow has problems with directly declared definition object + // when using Object.defineProperty, so we have to procedurally build up + // the object here. + var dataDef = {}; + dataDef.get = function () { + return this._data + }; + { + dataDef.set = function (newData) { + warn( + 'Avoid replacing instance root $data. ' + + 'Use nested data properties instead.', + this + ); + }; + } + Object.defineProperty(Vue.prototype, '$data', dataDef); + + Vue.prototype.$set = set; + Vue.prototype.$delete = del; + + Vue.prototype.$watch = function ( + expOrFn, + cb, + options + ) { + var vm = this; + options = options || {}; + options.user = true; + var watcher = new Watcher(vm, expOrFn, cb, options); + if (options.immediate) { + cb.call(vm, watcher.value); + } + return function unwatchFn () { + watcher.teardown(); + } + }; +} + +function proxy (vm, key) { + if (!isReserved(key)) { + Object.defineProperty(vm, key, { + configurable: true, + enumerable: true, + get: function proxyGetter () { + return vm._data[key] + }, + set: function proxySetter (val) { + vm._data[key] = val; + } + }); + } +} + +/* */ + +var VNode = function VNode ( + tag, + data, + children, + text, + elm, + ns, + context, + componentOptions +) { + this.tag = tag; + this.data = data; + this.children = children; + this.text = text; + this.elm = elm; + this.ns = ns; + this.context = context; + this.functionalContext = undefined; + this.key = data && data.key; + this.componentOptions = componentOptions; + this.child = undefined; + this.parent = undefined; + this.raw = false; + this.isStatic = false; + this.isRootInsert = true; + this.isComment = false; + this.isCloned = false; +}; + +var emptyVNode = function () { + var node = new VNode(); + node.text = ''; + node.isComment = true; + return node +}; + +// optimized shallow clone +// used for static nodes and slot nodes because they may be reused across +// multiple renders, cloning them avoids errors when DOM manipulations rely +// on their elm reference. +function cloneVNode (vnode) { + var cloned = new VNode( + vnode.tag, + vnode.data, + vnode.children, + vnode.text, + vnode.elm, + vnode.ns, + vnode.context, + vnode.componentOptions + ); + cloned.isStatic = vnode.isStatic; + cloned.key = vnode.key; + cloned.isCloned = true; + return cloned +} + +function cloneVNodes (vnodes) { + var res = new Array(vnodes.length); + for (var i = 0; i < vnodes.length; i++) { + res[i] = cloneVNode(vnodes[i]); + } + return res +} + +/* */ + +function mergeVNodeHook (def, hookKey, hook, key) { + key = key + hookKey; + var injectedHash = def.__injected || (def.__injected = {}); + if (!injectedHash[key]) { + injectedHash[key] = true; + var oldHook = def[hookKey]; + if (oldHook) { + def[hookKey] = function () { + oldHook.apply(this, arguments); + hook.apply(this, arguments); + }; + } else { + def[hookKey] = hook; + } + } +} + +/* */ + +function updateListeners ( + on, + oldOn, + add, + remove$$1, + vm +) { + var name, cur, old, fn, event, capture; + for (name in on) { + cur = on[name]; + old = oldOn[name]; + if (!cur) { + "development" !== 'production' && warn( + "Invalid handler for event \"" + name + "\": got " + String(cur), + vm + ); + } else if (!old) { + capture = name.charAt(0) === '!'; + event = capture ? name.slice(1) : name; + if (Array.isArray(cur)) { + add(event, (cur.invoker = arrInvoker(cur)), capture); + } else { + if (!cur.invoker) { + fn = cur; + cur = on[name] = {}; + cur.fn = fn; + cur.invoker = fnInvoker(cur); + } + add(event, cur.invoker, capture); + } + } else if (cur !== old) { + if (Array.isArray(old)) { + old.length = cur.length; + for (var i = 0; i < old.length; i++) { old[i] = cur[i]; } + on[name] = old; + } else { + old.fn = cur; + on[name] = old; + } + } + } + for (name in oldOn) { + if (!on[name]) { + event = name.charAt(0) === '!' ? name.slice(1) : name; + remove$$1(event, oldOn[name].invoker); + } + } +} + +function arrInvoker (arr) { + return function (ev) { + var arguments$1 = arguments; + + var single = arguments.length === 1; + for (var i = 0; i < arr.length; i++) { + single ? arr[i](ev) : arr[i].apply(null, arguments$1); + } + } +} + +function fnInvoker (o) { + return function (ev) { + var single = arguments.length === 1; + single ? o.fn(ev) : o.fn.apply(null, arguments); + } +} + +/* */ + +function normalizeChildren ( + children, + ns, + nestedIndex +) { + if (isPrimitive(children)) { + return [createTextVNode(children)] + } + if (Array.isArray(children)) { + var res = []; + for (var i = 0, l = children.length; i < l; i++) { + var c = children[i]; + var last = res[res.length - 1]; + // nested + if (Array.isArray(c)) { + res.push.apply(res, normalizeChildren(c, ns, ((nestedIndex || '') + "_" + i))); + } else if (isPrimitive(c)) { + if (last && last.text) { + last.text += String(c); + } else if (c !== '') { + // convert primitive to vnode + res.push(createTextVNode(c)); + } + } else if (c instanceof VNode) { + if (c.text && last && last.text) { + last.text += c.text; + } else { + // inherit parent namespace + if (ns) { + applyNS(c, ns); + } + // default key for nested array children (likely generated by v-for) + if (c.tag && c.key == null && nestedIndex != null) { + c.key = "__vlist" + nestedIndex + "_" + i + "__"; + } + res.push(c); + } + } + } + return res + } +} + +function createTextVNode (val) { + return new VNode(undefined, undefined, undefined, String(val)) +} + +function applyNS (vnode, ns) { + if (vnode.tag && !vnode.ns) { + vnode.ns = ns; + if (vnode.children) { + for (var i = 0, l = vnode.children.length; i < l; i++) { + applyNS(vnode.children[i], ns); + } + } + } +} + +/* */ + +function getFirstComponentChild (children) { + return children && children.filter(function (c) { return c && c.componentOptions; })[0] +} + +/* */ + +var activeInstance = null; + +function initLifecycle (vm) { + var options = vm.$options; + + // locate first non-abstract parent + var parent = options.parent; + if (parent && !options.abstract) { + while (parent.$options.abstract && parent.$parent) { + parent = parent.$parent; + } + parent.$children.push(vm); + } + + vm.$parent = parent; + vm.$root = parent ? parent.$root : vm; + + vm.$children = []; + vm.$refs = {}; + + vm._watcher = null; + vm._inactive = false; + vm._isMounted = false; + vm._isDestroyed = false; + vm._isBeingDestroyed = false; +} + +function lifecycleMixin (Vue) { + Vue.prototype._mount = function ( + el, + hydrating + ) { + var vm = this; + vm.$el = el; + if (!vm.$options.render) { + vm.$options.render = emptyVNode; + { + /* istanbul ignore if */ + if (vm.$options.template) { + warn( + 'You are using the runtime-only build of Vue where the template ' + + 'option is not available. Either pre-compile the templates into ' + + 'render functions, or use the compiler-included build.', + vm + ); + } else { + warn( + 'Failed to mount component: template or render function not defined.', + vm + ); + } + } + } + callHook(vm, 'beforeMount'); + vm._watcher = new Watcher(vm, function () { + vm._update(vm._render(), hydrating); + }, noop); + hydrating = false; + // manually mounted instance, call mounted on self + // mounted is called for render-created child components in its inserted hook + if (vm.$vnode == null) { + vm._isMounted = true; + callHook(vm, 'mounted'); + } + return vm + }; + + Vue.prototype._update = function (vnode, hydrating) { + var vm = this; + if (vm._isMounted) { + callHook(vm, 'beforeUpdate'); + } + var prevEl = vm.$el; + var prevActiveInstance = activeInstance; + activeInstance = vm; + var prevVnode = vm._vnode; + vm._vnode = vnode; + if (!prevVnode) { + // Vue.prototype.__patch__ is injected in entry points + // based on the rendering backend used. + vm.$el = vm.__patch__(vm.$el, vnode, hydrating); + } else { + vm.$el = vm.__patch__(prevVnode, vnode); + } + activeInstance = prevActiveInstance; + // update __vue__ reference + if (prevEl) { + prevEl.__vue__ = null; + } + if (vm.$el) { + vm.$el.__vue__ = vm; + } + // if parent is an HOC, update its $el as well + if (vm.$vnode && vm.$parent && vm.$vnode === vm.$parent._vnode) { + vm.$parent.$el = vm.$el; + } + if (vm._isMounted) { + callHook(vm, 'updated'); + } + }; + + Vue.prototype._updateFromParent = function ( + propsData, + listeners, + parentVnode, + renderChildren + ) { + var vm = this; + var hasChildren = !!(vm.$options._renderChildren || renderChildren); + vm.$options._parentVnode = parentVnode; + vm.$options._renderChildren = renderChildren; + // update props + if (propsData && vm.$options.props) { + observerState.shouldConvert = false; + { + observerState.isSettingProps = true; + } + var propKeys = vm.$options._propKeys || []; + for (var i = 0; i < propKeys.length; i++) { + var key = propKeys[i]; + vm[key] = validateProp(key, vm.$options.props, propsData, vm); + } + observerState.shouldConvert = true; + { + observerState.isSettingProps = false; + } + } + // update listeners + if (listeners) { + var oldListeners = vm.$options._parentListeners; + vm.$options._parentListeners = listeners; + vm._updateListeners(listeners, oldListeners); + } + // resolve slots + force update if has children + if (hasChildren) { + vm.$slots = resolveSlots(renderChildren, vm._renderContext); + vm.$forceUpdate(); + } + }; + + Vue.prototype.$forceUpdate = function () { + var vm = this; + if (vm._watcher) { + vm._watcher.update(); + } + }; + + Vue.prototype.$destroy = function () { + var vm = this; + if (vm._isBeingDestroyed) { + return + } + callHook(vm, 'beforeDestroy'); + vm._isBeingDestroyed = true; + // remove self from parent + var parent = vm.$parent; + if (parent && !parent._isBeingDestroyed && !vm.$options.abstract) { + remove$1(parent.$children, vm); + } + // teardown watchers + if (vm._watcher) { + vm._watcher.teardown(); + } + var i = vm._watchers.length; + while (i--) { + vm._watchers[i].teardown(); + } + // remove reference from data ob + // frozen object may not have observer. + if (vm._data.__ob__) { + vm._data.__ob__.vmCount--; + } + // call the last hook... + vm._isDestroyed = true; + callHook(vm, 'destroyed'); + // turn off all instance listeners. + vm.$off(); + // remove __vue__ reference + if (vm.$el) { + vm.$el.__vue__ = null; + } + // invoke destroy hooks on current rendered tree + vm.__patch__(vm._vnode, null); + }; +} + +function callHook (vm, hook) { + var handlers = vm.$options[hook]; + if (handlers) { + for (var i = 0, j = handlers.length; i < j; i++) { + handlers[i].call(vm); + } + } + vm.$emit('hook:' + hook); +} + +/* */ + +var hooks = { init: init, prepatch: prepatch, insert: insert, destroy: destroy$1 }; +var hooksToMerge = Object.keys(hooks); + +function createComponent ( + Ctor, + data, + context, + children, + tag +) { + if (!Ctor) { + return + } + + if (isObject(Ctor)) { + Ctor = Vue$3.extend(Ctor); + } + + if (typeof Ctor !== 'function') { + { + warn(("Invalid Component definition: " + (String(Ctor))), context); + } + return + } + + // async component + if (!Ctor.cid) { + if (Ctor.resolved) { + Ctor = Ctor.resolved; + } else { + Ctor = resolveAsyncComponent(Ctor, function () { + // it's ok to queue this on every render because + // $forceUpdate is buffered by the scheduler. + context.$forceUpdate(); + }); + if (!Ctor) { + // return nothing if this is indeed an async component + // wait for the callback to trigger parent update. + return + } + } + } + + data = data || {}; + + // extract props + var propsData = extractProps(data, Ctor); + + // functional component + if (Ctor.options.functional) { + return createFunctionalComponent(Ctor, propsData, data, context, children) + } + + // extract listeners, since these needs to be treated as + // child component listeners instead of DOM listeners + var listeners = data.on; + // replace with listeners with .native modifier + data.on = data.nativeOn; + + if (Ctor.options.abstract) { + // abstract components do not keep anything + // other than props & listeners + data = {}; + } + + // merge component management hooks onto the placeholder node + mergeHooks(data); + + // return a placeholder vnode + var name = Ctor.options.name || tag; + var vnode = new VNode( + ("vue-component-" + (Ctor.cid) + (name ? ("-" + name) : '')), + data, undefined, undefined, undefined, undefined, context, + { Ctor: Ctor, propsData: propsData, listeners: listeners, tag: tag, children: children } + ); + return vnode +} + +function createFunctionalComponent ( + Ctor, + propsData, + data, + context, + children +) { + var props = {}; + var propOptions = Ctor.options.props; + if (propOptions) { + for (var key in propOptions) { + props[key] = validateProp(key, propOptions, propsData); + } + } + var vnode = Ctor.options.render.call( + null, + // ensure the createElement function in functional components + // gets a unique context - this is necessary for correct named slot check + bind$1(createElement, { _self: Object.create(context) }), + { + props: props, + data: data, + parent: context, + children: normalizeChildren(children), + slots: function () { return resolveSlots(children, context); } + } + ); + if (vnode instanceof VNode) { + vnode.functionalContext = context; + if (data.slot) { + (vnode.data || (vnode.data = {})).slot = data.slot; + } + } + return vnode +} + +function createComponentInstanceForVnode ( + vnode, // we know it's MountedComponentVNode but flow doesn't + parent // activeInstance in lifecycle state +) { + var vnodeComponentOptions = vnode.componentOptions; + var options = { + _isComponent: true, + parent: parent, + propsData: vnodeComponentOptions.propsData, + _componentTag: vnodeComponentOptions.tag, + _parentVnode: vnode, + _parentListeners: vnodeComponentOptions.listeners, + _renderChildren: vnodeComponentOptions.children + }; + // check inline-template render functions + var inlineTemplate = vnode.data.inlineTemplate; + if (inlineTemplate) { + options.render = inlineTemplate.render; + options.staticRenderFns = inlineTemplate.staticRenderFns; + } + return new vnodeComponentOptions.Ctor(options) +} + +function init (vnode, hydrating) { + if (!vnode.child || vnode.child._isDestroyed) { + var child = vnode.child = createComponentInstanceForVnode(vnode, activeInstance); + child.$mount(hydrating ? vnode.elm : undefined, hydrating); + } +} + +function prepatch ( + oldVnode, + vnode +) { + var options = vnode.componentOptions; + var child = vnode.child = oldVnode.child; + child._updateFromParent( + options.propsData, // updated props + options.listeners, // updated listeners + vnode, // new parent vnode + options.children // new children + ); +} + +function insert (vnode) { + if (!vnode.child._isMounted) { + vnode.child._isMounted = true; + callHook(vnode.child, 'mounted'); + } + if (vnode.data.keepAlive) { + vnode.child._inactive = false; + callHook(vnode.child, 'activated'); + } +} + +function destroy$1 (vnode) { + if (!vnode.child._isDestroyed) { + if (!vnode.data.keepAlive) { + vnode.child.$destroy(); + } else { + vnode.child._inactive = true; + callHook(vnode.child, 'deactivated'); + } + } +} + +function resolveAsyncComponent ( + factory, + cb +) { + if (factory.requested) { + // pool callbacks + factory.pendingCallbacks.push(cb); + } else { + factory.requested = true; + var cbs = factory.pendingCallbacks = [cb]; + var sync = true; + + var resolve = function (res) { + if (isObject(res)) { + res = Vue$3.extend(res); + } + // cache resolved + factory.resolved = res; + // invoke callbacks only if this is not a synchronous resolve + // (async resolves are shimmed as synchronous during SSR) + if (!sync) { + for (var i = 0, l = cbs.length; i < l; i++) { + cbs[i](res); + } + } + }; + + var reject = function (reason) { + "development" !== 'production' && warn( + "Failed to resolve async component: " + (String(factory)) + + (reason ? ("\nReason: " + reason) : '') + ); + }; + + var res = factory(resolve, reject); + + // handle promise + if (res && typeof res.then === 'function' && !factory.resolved) { + res.then(resolve, reject); + } + + sync = false; + // return in case resolved synchronously + return factory.resolved + } +} + +function extractProps (data, Ctor) { + // we are only extrating raw values here. + // validation and default values are handled in the child + // component itself. + var propOptions = Ctor.options.props; + if (!propOptions) { + return + } + var res = {}; + var attrs = data.attrs; + var props = data.props; + var domProps = data.domProps; + if (attrs || props || domProps) { + for (var key in propOptions) { + var altKey = hyphenate(key); + checkProp(res, props, key, altKey, true) || + checkProp(res, attrs, key, altKey) || + checkProp(res, domProps, key, altKey); + } + } + return res +} + +function checkProp ( + res, + hash, + key, + altKey, + preserve +) { + if (hash) { + if (hasOwn(hash, key)) { + res[key] = hash[key]; + if (!preserve) { + delete hash[key]; + } + return true + } else if (hasOwn(hash, altKey)) { + res[key] = hash[altKey]; + if (!preserve) { + delete hash[altKey]; + } + return true + } + } + return false +} + +function mergeHooks (data) { + if (!data.hook) { + data.hook = {}; + } + for (var i = 0; i < hooksToMerge.length; i++) { + var key = hooksToMerge[i]; + var fromParent = data.hook[key]; + var ours = hooks[key]; + data.hook[key] = fromParent ? mergeHook$1(ours, fromParent) : ours; + } +} + +function mergeHook$1 (a, b) { + // since all hooks have at most two args, use fixed args + // to avoid having to use fn.apply(). + return function (_, __) { + a(_, __); + b(_, __); + } +} + +/* */ + +// wrapper function for providing a more flexible interface +// without getting yelled at by flow +function createElement ( + tag, + data, + children +) { + if (data && (Array.isArray(data) || typeof data !== 'object')) { + children = data; + data = undefined; + } + // make sure to use real instance instead of proxy as context + return _createElement(this._self, tag, data, children) +} + +function _createElement ( + context, + tag, + data, + children +) { + if (data && data.__ob__) { + "development" !== 'production' && warn( + "Avoid using observed data object as vnode data: " + (JSON.stringify(data)) + "\n" + + 'Always create fresh vnode data objects in each render!', + context + ); + return + } + if (!tag) { + // in case of component :is set to falsy value + return emptyVNode() + } + if (typeof tag === 'string') { + var Ctor; + var ns = config.getTagNamespace(tag); + if (config.isReservedTag(tag)) { + // platform built-in elements + return new VNode( + tag, data, normalizeChildren(children, ns), + undefined, undefined, ns, context + ) + } else if ((Ctor = resolveAsset(context.$options, 'components', tag))) { + // component + return createComponent(Ctor, data, context, children, tag) + } else { + // unknown or unlisted namespaced elements + // check at runtime because it may get assigned a namespace when its + // parent normalizes children + return new VNode( + tag, data, normalizeChildren(children, ns), + undefined, undefined, ns, context + ) + } + } else { + // direct component options / constructor + return createComponent(tag, data, context, children) + } +} + +/* */ + +function initRender (vm) { + vm.$vnode = null; // the placeholder node in parent tree + vm._vnode = null; // the root of the child tree + vm._staticTrees = null; + vm._renderContext = vm.$options._parentVnode && vm.$options._parentVnode.context; + vm.$slots = resolveSlots(vm.$options._renderChildren, vm._renderContext); + // bind the public createElement fn to this instance + // so that we get proper render context inside it. + vm.$createElement = bind$1(createElement, vm); + if (vm.$options.el) { + vm.$mount(vm.$options.el); + } +} + +function renderMixin (Vue) { + Vue.prototype.$nextTick = function (fn) { + nextTick(fn, this); + }; + + Vue.prototype._render = function () { + var vm = this; + var ref = vm.$options; + var render = ref.render; + var staticRenderFns = ref.staticRenderFns; + var _parentVnode = ref._parentVnode; + + if (vm._isMounted) { + // clone slot nodes on re-renders + for (var key in vm.$slots) { + vm.$slots[key] = cloneVNodes(vm.$slots[key]); + } + } + + if (staticRenderFns && !vm._staticTrees) { + vm._staticTrees = []; + } + // set parent vnode. this allows render functions to have access + // to the data on the placeholder node. + vm.$vnode = _parentVnode; + // render self + var vnode; + try { + vnode = render.call(vm._renderProxy, vm.$createElement); + } catch (e) { + { + warn(("Error when rendering " + (formatComponentName(vm)) + ":")); + } + /* istanbul ignore else */ + if (config.errorHandler) { + config.errorHandler.call(null, e, vm); + } else { + if (config._isServer) { + throw e + } else { + setTimeout(function () { throw e }, 0); + } + } + // return previous vnode to prevent render error causing blank component + vnode = vm._vnode; + } + // return empty vnode in case the render function errored out + if (!(vnode instanceof VNode)) { + if ("development" !== 'production' && Array.isArray(vnode)) { + warn( + 'Multiple root nodes returned from render function. Render function ' + + 'should return a single root node.', + vm + ); + } + vnode = emptyVNode(); + } + // set parent + vnode.parent = _parentVnode; + return vnode + }; + + // shorthands used in render functions + Vue.prototype._h = createElement; + // toString for mustaches + Vue.prototype._s = _toString; + // number conversion + Vue.prototype._n = toNumber; + // empty vnode + Vue.prototype._e = emptyVNode; + // loose equal + Vue.prototype._q = looseEqual; + // loose indexOf + Vue.prototype._i = looseIndexOf; + + // render static tree by index + Vue.prototype._m = function renderStatic ( + index, + isInFor + ) { + var tree = this._staticTrees[index]; + // if has already-rendered static tree and not inside v-for, + // we can reuse the same tree by doing a shallow clone. + if (tree && !isInFor) { + return Array.isArray(tree) + ? cloneVNodes(tree) + : cloneVNode(tree) + } + // otherwise, render a fresh tree. + tree = this._staticTrees[index] = this.$options.staticRenderFns[index].call(this._renderProxy); + if (Array.isArray(tree)) { + for (var i = 0; i < tree.length; i++) { + if (typeof tree[i] !== 'string') { + tree[i].isStatic = true; + tree[i].key = "__static__" + index + "_" + i; + } + } + } else { + tree.isStatic = true; + tree.key = "__static__" + index; + } + return tree + }; + + // filter resolution helper + var identity = function (_) { return _; }; + Vue.prototype._f = function resolveFilter (id) { + return resolveAsset(this.$options, 'filters', id, true) || identity + }; + + // render v-for + Vue.prototype._l = function renderList ( + val, + render + ) { + var ret, i, l, keys, key; + if (Array.isArray(val)) { + ret = new Array(val.length); + for (i = 0, l = val.length; i < l; i++) { + ret[i] = render(val[i], i); + } + } else if (typeof val === 'number') { + ret = new Array(val); + for (i = 0; i < val; i++) { + ret[i] = render(i + 1, i); + } + } else if (isObject(val)) { + keys = Object.keys(val); + ret = new Array(keys.length); + for (i = 0, l = keys.length; i < l; i++) { + key = keys[i]; + ret[i] = render(val[key], key, i); + } + } + return ret + }; + + // renderSlot + Vue.prototype._t = function ( + name, + fallback + ) { + var slotNodes = this.$slots[name]; + // warn duplicate slot usage + if (slotNodes && "development" !== 'production') { + slotNodes._rendered && warn( + "Duplicate presence of slot \"" + name + "\" found in the same render tree " + + "- this will likely cause render errors.", + this + ); + slotNodes._rendered = true; + } + return slotNodes || fallback + }; + + // apply v-bind object + Vue.prototype._b = function bindProps ( + data, + value, + asProp + ) { + if (value) { + if (!isObject(value)) { + "development" !== 'production' && warn( + 'v-bind without argument expects an Object or Array value', + this + ); + } else { + if (Array.isArray(value)) { + value = toObject(value); + } + for (var key in value) { + if (key === 'class' || key === 'style') { + data[key] = value[key]; + } else { + var hash = asProp || config.mustUseProp(key) + ? data.domProps || (data.domProps = {}) + : data.attrs || (data.attrs = {}); + hash[key] = value[key]; + } + } + } + } + return data + }; + + // expose v-on keyCodes + Vue.prototype._k = function getKeyCodes (key) { + return config.keyCodes[key] + }; +} + +function resolveSlots ( + renderChildren, + context +) { + var slots = {}; + if (!renderChildren) { + return slots + } + var children = normalizeChildren(renderChildren) || []; + var defaultSlot = []; + var name, child; + for (var i = 0, l = children.length; i < l; i++) { + child = children[i]; + // named slots should only be respected if the vnode was rendered in the + // same context. + if ((child.context === context || child.functionalContext === context) && + child.data && (name = child.data.slot)) { + var slot = (slots[name] || (slots[name] = [])); + if (child.tag === 'template') { + slot.push.apply(slot, child.children); + } else { + slot.push(child); + } + } else { + defaultSlot.push(child); + } + } + // ignore single whitespace + if (defaultSlot.length && !( + defaultSlot.length === 1 && + (defaultSlot[0].text === ' ' || defaultSlot[0].isComment) + )) { + slots.default = defaultSlot; + } + return slots +} + +/* */ + +function initEvents (vm) { + vm._events = Object.create(null); + // init parent attached events + var listeners = vm.$options._parentListeners; + var on = bind$1(vm.$on, vm); + var off = bind$1(vm.$off, vm); + vm._updateListeners = function (listeners, oldListeners) { + updateListeners(listeners, oldListeners || {}, on, off, vm); + }; + if (listeners) { + vm._updateListeners(listeners); + } +} + +function eventsMixin (Vue) { + Vue.prototype.$on = function (event, fn) { + var vm = this;(vm._events[event] || (vm._events[event] = [])).push(fn); + return vm + }; + + Vue.prototype.$once = function (event, fn) { + var vm = this; + function on () { + vm.$off(event, on); + fn.apply(vm, arguments); + } + on.fn = fn; + vm.$on(event, on); + return vm + }; + + Vue.prototype.$off = function (event, fn) { + var vm = this; + // all + if (!arguments.length) { + vm._events = Object.create(null); + return vm + } + // specific event + var cbs = vm._events[event]; + if (!cbs) { + return vm + } + if (arguments.length === 1) { + vm._events[event] = null; + return vm + } + // specific handler + var cb; + var i = cbs.length; + while (i--) { + cb = cbs[i]; + if (cb === fn || cb.fn === fn) { + cbs.splice(i, 1); + break + } + } + return vm + }; + + Vue.prototype.$emit = function (event) { + var vm = this; + var cbs = vm._events[event]; + if (cbs) { + cbs = cbs.length > 1 ? toArray(cbs) : cbs; + var args = toArray(arguments, 1); + for (var i = 0, l = cbs.length; i < l; i++) { + cbs[i].apply(vm, args); + } + } + return vm + }; +} + +/* */ + +var uid = 0; + +function initMixin (Vue) { + Vue.prototype._init = function (options) { + var vm = this; + // a uid + vm._uid = uid++; + // a flag to avoid this being observed + vm._isVue = true; + // merge options + if (options && options._isComponent) { + // optimize internal component instantiation + // since dynamic options merging is pretty slow, and none of the + // internal component options needs special treatment. + initInternalComponent(vm, options); + } else { + vm.$options = mergeOptions( + resolveConstructorOptions(vm), + options || {}, + vm + ); + } + /* istanbul ignore else */ + { + initProxy(vm); + } + // expose real self + vm._self = vm; + initLifecycle(vm); + initEvents(vm); + callHook(vm, 'beforeCreate'); + initState(vm); + callHook(vm, 'created'); + initRender(vm); + }; + + function initInternalComponent (vm, options) { + var opts = vm.$options = Object.create(resolveConstructorOptions(vm)); + // doing this because it's faster than dynamic enumeration. + opts.parent = options.parent; + opts.propsData = options.propsData; + opts._parentVnode = options._parentVnode; + opts._parentListeners = options._parentListeners; + opts._renderChildren = options._renderChildren; + opts._componentTag = options._componentTag; + if (options.render) { + opts.render = options.render; + opts.staticRenderFns = options.staticRenderFns; + } + } + + function resolveConstructorOptions (vm) { + var Ctor = vm.constructor; + var options = Ctor.options; + if (Ctor.super) { + var superOptions = Ctor.super.options; + var cachedSuperOptions = Ctor.superOptions; + if (superOptions !== cachedSuperOptions) { + // super option changed + Ctor.superOptions = superOptions; + options = Ctor.options = mergeOptions(superOptions, Ctor.extendOptions); + if (options.name) { + options.components[options.name] = Ctor; + } + } + } + return options + } +} + +function Vue$3 (options) { + if ("development" !== 'production' && + !(this instanceof Vue$3)) { + warn('Vue is a constructor and should be called with the `new` keyword'); + } + this._init(options); +} + +initMixin(Vue$3); +stateMixin(Vue$3); +eventsMixin(Vue$3); +lifecycleMixin(Vue$3); +renderMixin(Vue$3); + +var warn = noop; +var formatComponentName; + +{ + var hasConsole = typeof console !== 'undefined'; + + warn = function (msg, vm) { + if (hasConsole && (!config.silent)) { + console.error("[Vue warn]: " + msg + " " + ( + vm ? formatLocation(formatComponentName(vm)) : '' + )); + } + }; + + formatComponentName = function (vm) { + if (vm.$root === vm) { + return 'root instance' + } + var name = vm._isVue + ? vm.$options.name || vm.$options._componentTag + : vm.name; + return ( + (name ? ("component <" + name + ">") : "anonymous component") + + (vm._isVue && vm.$options.__file ? (" at " + (vm.$options.__file)) : '') + ) + }; + + var formatLocation = function (str) { + if (str === 'anonymous component') { + str += " - use the \"name\" option for better debugging messages."; + } + return ("\n(found in " + str + ")") + }; +} + +/* */ + +/** + * Option overwriting strategies are functions that handle + * how to merge a parent option value and a child option + * value into the final value. + */ +var strats = config.optionMergeStrategies; + +/** + * Options with restrictions + */ +{ + strats.el = strats.propsData = function (parent, child, vm, key) { + if (!vm) { + warn( + "option \"" + key + "\" can only be used during instance " + + 'creation with the `new` keyword.' + ); + } + return defaultStrat(parent, child) + }; +} + +/** + * Helper that recursively merges two data objects together. + */ +function mergeData (to, from) { + var key, toVal, fromVal; + for (key in from) { + toVal = to[key]; + fromVal = from[key]; + if (!hasOwn(to, key)) { + set(to, key, fromVal); + } else if (isObject(toVal) && isObject(fromVal)) { + mergeData(toVal, fromVal); + } + } + return to +} + +/** + * Data + */ +strats.data = function ( + parentVal, + childVal, + vm +) { + if (!vm) { + // in a Vue.extend merge, both should be functions + if (!childVal) { + return parentVal + } + if (typeof childVal !== 'function') { + "development" !== 'production' && warn( + 'The "data" option should be a function ' + + 'that returns a per-instance value in component ' + + 'definitions.', + vm + ); + return parentVal + } + if (!parentVal) { + return childVal + } + // when parentVal & childVal are both present, + // we need to return a function that returns the + // merged result of both functions... no need to + // check if parentVal is a function here because + // it has to be a function to pass previous merges. + return function mergedDataFn () { + return mergeData( + childVal.call(this), + parentVal.call(this) + ) + } + } else if (parentVal || childVal) { + return function mergedInstanceDataFn () { + // instance merge + var instanceData = typeof childVal === 'function' + ? childVal.call(vm) + : childVal; + var defaultData = typeof parentVal === 'function' + ? parentVal.call(vm) + : undefined; + if (instanceData) { + return mergeData(instanceData, defaultData) + } else { + return defaultData + } + } + } +}; + +/** + * Hooks and param attributes are merged as arrays. + */ +function mergeHook ( + parentVal, + childVal +) { + return childVal + ? parentVal + ? parentVal.concat(childVal) + : Array.isArray(childVal) + ? childVal + : [childVal] + : parentVal +} + +config._lifecycleHooks.forEach(function (hook) { + strats[hook] = mergeHook; +}); + +/** + * Assets + * + * When a vm is present (instance creation), we need to do + * a three-way merge between constructor options, instance + * options and parent options. + */ +function mergeAssets (parentVal, childVal) { + var res = Object.create(parentVal || null); + return childVal + ? extend(res, childVal) + : res +} + +config._assetTypes.forEach(function (type) { + strats[type + 's'] = mergeAssets; +}); + +/** + * Watchers. + * + * Watchers hashes should not overwrite one + * another, so we merge them as arrays. + */ +strats.watch = function (parentVal, childVal) { + /* istanbul ignore if */ + if (!childVal) { return parentVal } + if (!parentVal) { return childVal } + var ret = {}; + extend(ret, parentVal); + for (var key in childVal) { + var parent = ret[key]; + var child = childVal[key]; + if (parent && !Array.isArray(parent)) { + parent = [parent]; + } + ret[key] = parent + ? parent.concat(child) + : [child]; + } + return ret +}; + +/** + * Other object hashes. + */ +strats.props = +strats.methods = +strats.computed = function (parentVal, childVal) { + if (!childVal) { return parentVal } + if (!parentVal) { return childVal } + var ret = Object.create(null); + extend(ret, parentVal); + extend(ret, childVal); + return ret +}; + +/** + * Default strategy. + */ +var defaultStrat = function (parentVal, childVal) { + return childVal === undefined + ? parentVal + : childVal +}; + +/** + * Make sure component options get converted to actual + * constructors. + */ +function normalizeComponents (options) { + if (options.components) { + var components = options.components; + var def; + for (var key in components) { + var lower = key.toLowerCase(); + if (isBuiltInTag(lower) || config.isReservedTag(lower)) { + "development" !== 'production' && warn( + 'Do not use built-in or reserved HTML elements as component ' + + 'id: ' + key + ); + continue + } + def = components[key]; + if (isPlainObject(def)) { + components[key] = Vue$3.extend(def); + } + } + } +} + +/** + * Ensure all props option syntax are normalized into the + * Object-based format. + */ +function normalizeProps (options) { + var props = options.props; + if (!props) { return } + var res = {}; + var i, val, name; + if (Array.isArray(props)) { + i = props.length; + while (i--) { + val = props[i]; + if (typeof val === 'string') { + name = camelize(val); + res[name] = { type: null }; + } else { + warn('props must be strings when using array syntax.'); + } + } + } else if (isPlainObject(props)) { + for (var key in props) { + val = props[key]; + name = camelize(key); + res[name] = isPlainObject(val) + ? val + : { type: val }; + } + } + options.props = res; +} + +/** + * Normalize raw function directives into object format. + */ +function normalizeDirectives (options) { + var dirs = options.directives; + if (dirs) { + for (var key in dirs) { + var def = dirs[key]; + if (typeof def === 'function') { + dirs[key] = { bind: def, update: def }; + } + } + } +} + +/** + * Merge two option objects into a new one. + * Core utility used in both instantiation and inheritance. + */ +function mergeOptions ( + parent, + child, + vm +) { + normalizeComponents(child); + normalizeProps(child); + normalizeDirectives(child); + var extendsFrom = child.extends; + if (extendsFrom) { + parent = typeof extendsFrom === 'function' + ? mergeOptions(parent, extendsFrom.options, vm) + : mergeOptions(parent, extendsFrom, vm); + } + if (child.mixins) { + for (var i = 0, l = child.mixins.length; i < l; i++) { + var mixin = child.mixins[i]; + if (mixin.prototype instanceof Vue$3) { + mixin = mixin.options; + } + parent = mergeOptions(parent, mixin, vm); + } + } + var options = {}; + var key; + for (key in parent) { + mergeField(key); + } + for (key in child) { + if (!hasOwn(parent, key)) { + mergeField(key); + } + } + function mergeField (key) { + var strat = strats[key] || defaultStrat; + options[key] = strat(parent[key], child[key], vm, key); + } + return options +} + +/** + * Resolve an asset. + * This function is used because child instances need access + * to assets defined in its ancestor chain. + */ +function resolveAsset ( + options, + type, + id, + warnMissing +) { + /* istanbul ignore if */ + if (typeof id !== 'string') { + return + } + var assets = options[type]; + var res = assets[id] || + // camelCase ID + assets[camelize(id)] || + // Pascal Case ID + assets[capitalize(camelize(id))]; + if ("development" !== 'production' && warnMissing && !res) { + warn( + 'Failed to resolve ' + type.slice(0, -1) + ': ' + id, + options + ); + } + return res +} + +/* */ + +function validateProp ( + key, + propOptions, + propsData, + vm +) { + var prop = propOptions[key]; + var absent = !hasOwn(propsData, key); + var value = propsData[key]; + // handle boolean props + if (isBooleanType(prop.type)) { + if (absent && !hasOwn(prop, 'default')) { + value = false; + } else if (value === '' || value === hyphenate(key)) { + value = true; + } + } + // check default value + if (value === undefined) { + value = getPropDefaultValue(vm, prop, key); + // since the default value is a fresh copy, + // make sure to observe it. + var prevShouldConvert = observerState.shouldConvert; + observerState.shouldConvert = true; + observe(value); + observerState.shouldConvert = prevShouldConvert; + } + { + assertProp(prop, key, value, vm, absent); + } + return value +} + +/** + * Get the default value of a prop. + */ +function getPropDefaultValue (vm, prop, name) { + // no default, return undefined + if (!hasOwn(prop, 'default')) { + return undefined + } + var def = prop.default; + // warn against non-factory defaults for Object & Array + if (isObject(def)) { + "development" !== 'production' && warn( + 'Invalid default value for prop "' + name + '": ' + + 'Props with type Object/Array must use a factory function ' + + 'to return the default value.', + vm + ); + } + // call factory function for non-Function types + return typeof def === 'function' && prop.type !== Function + ? def.call(vm) + : def +} + +/** + * Assert whether a prop is valid. + */ +function assertProp ( + prop, + name, + value, + vm, + absent +) { + if (prop.required && absent) { + warn( + 'Missing required prop: "' + name + '"', + vm + ); + return + } + if (value == null && !prop.required) { + return + } + var type = prop.type; + var valid = !type || type === true; + var expectedTypes = []; + if (type) { + if (!Array.isArray(type)) { + type = [type]; + } + for (var i = 0; i < type.length && !valid; i++) { + var assertedType = assertType(value, type[i]); + expectedTypes.push(assertedType.expectedType); + valid = assertedType.valid; + } + } + if (!valid) { + warn( + 'Invalid prop: type check failed for prop "' + name + '".' + + ' Expected ' + expectedTypes.map(capitalize).join(', ') + + ', got ' + Object.prototype.toString.call(value).slice(8, -1) + '.', + vm + ); + return + } + var validator = prop.validator; + if (validator) { + if (!validator(value)) { + warn( + 'Invalid prop: custom validator check failed for prop "' + name + '".', + vm + ); + } + } +} + +/** + * Assert the type of a value + */ +function assertType (value, type) { + var valid; + var expectedType = getType(type); + if (expectedType === 'String') { + valid = typeof value === (expectedType = 'string'); + } else if (expectedType === 'Number') { + valid = typeof value === (expectedType = 'number'); + } else if (expectedType === 'Boolean') { + valid = typeof value === (expectedType = 'boolean'); + } else if (expectedType === 'Function') { + valid = typeof value === (expectedType = 'function'); + } else if (expectedType === 'Object') { + valid = isPlainObject(value); + } else if (expectedType === 'Array') { + valid = Array.isArray(value); + } else { + valid = value instanceof type; + } + return { + valid: valid, + expectedType: expectedType + } +} + +/** + * Use function string name to check built-in types, + * because a simple equality check will fail when running + * across different vms / iframes. + */ +function getType (fn) { + var match = fn && fn.toString().match(/^\s*function (\w+)/); + return match && match[1] +} + +function isBooleanType (fn) { + if (!Array.isArray(fn)) { + return getType(fn) === 'Boolean' + } + for (var i = 0, len = fn.length; i < len; i++) { + if (getType(fn[i]) === 'Boolean') { + return true + } + } + /* istanbul ignore next */ + return false +} + + + +var util = Object.freeze({ + defineReactive: defineReactive$$1, + _toString: _toString, + toNumber: toNumber, + makeMap: makeMap, + isBuiltInTag: isBuiltInTag, + remove: remove$1, + hasOwn: hasOwn, + isPrimitive: isPrimitive, + cached: cached, + camelize: camelize, + capitalize: capitalize, + hyphenate: hyphenate, + bind: bind$1, + toArray: toArray, + extend: extend, + isObject: isObject, + isPlainObject: isPlainObject, + toObject: toObject, + noop: noop, + no: no, + genStaticKeys: genStaticKeys, + looseEqual: looseEqual, + looseIndexOf: looseIndexOf, + isReserved: isReserved, + def: def, + parsePath: parsePath, + hasProto: hasProto, + inBrowser: inBrowser, + UA: UA, + isIE: isIE, + isIE9: isIE9, + isEdge: isEdge, + isAndroid: isAndroid, + isIOS: isIOS, + devtools: devtools, + nextTick: nextTick, + get _Set () { return _Set; }, + mergeOptions: mergeOptions, + resolveAsset: resolveAsset, + get warn () { return warn; }, + get formatComponentName () { return formatComponentName; }, + validateProp: validateProp +}); + +/* */ + +function initUse (Vue) { + Vue.use = function (plugin) { + /* istanbul ignore if */ + if (plugin.installed) { + return + } + // additional parameters + var args = toArray(arguments, 1); + args.unshift(this); + if (typeof plugin.install === 'function') { + plugin.install.apply(plugin, args); + } else { + plugin.apply(null, args); + } + plugin.installed = true; + return this + }; +} + +/* */ + +function initMixin$1 (Vue) { + Vue.mixin = function (mixin) { + Vue.options = mergeOptions(Vue.options, mixin); + }; +} + +/* */ + +function initExtend (Vue) { + /** + * Each instance constructor, including Vue, has a unique + * cid. This enables us to create wrapped "child + * constructors" for prototypal inheritance and cache them. + */ + Vue.cid = 0; + var cid = 1; /** - * Define a property. - * - * @param {Object} obj - * @param {String} key - * @param {*} val - * @param {Boolean} [enumerable] + * Class inheritance */ + Vue.extend = function (extendOptions) { + extendOptions = extendOptions || {}; + var Super = this; + var isFirstExtend = Super.cid === 0; + if (isFirstExtend && extendOptions._Ctor) { + return extendOptions._Ctor + } + var name = extendOptions.name || Super.options.name; + { + if (!/^[a-zA-Z][\w-]*$/.test(name)) { + warn( + 'Invalid component name: "' + name + '". Component names ' + + 'can only contain alphanumeric characaters and the hyphen.' + ); + name = null; + } + } + var Sub = function VueComponent (options) { + this._init(options); + }; + Sub.prototype = Object.create(Super.prototype); + Sub.prototype.constructor = Sub; + Sub.cid = cid++; + Sub.options = mergeOptions( + Super.options, + extendOptions + ); + Sub['super'] = Super; + // allow further extension + Sub.extend = Super.extend; + // create asset registers, so extended classes + // can have their private assets too. + config._assetTypes.forEach(function (type) { + Sub[type] = Super[type]; + }); + // enable recursive self-lookup + if (name) { + Sub.options.components[name] = Sub; + } + // keep a reference to the super options at extension time. + // later at instantiation we can check if Super's options have + // been updated. + Sub.superOptions = Super.options; + Sub.extendOptions = extendOptions; + // cache constructor + if (isFirstExtend) { + extendOptions._Ctor = Sub; + } + return Sub + }; +} - function def(obj, key, val, enumerable) { - Object.defineProperty(obj, key, { - value: val, - enumerable: !!enumerable, - writable: true, - configurable: true +/* */ + +function initAssetRegisters (Vue) { + /** + * Create asset registration methods. + */ + config._assetTypes.forEach(function (type) { + Vue[type] = function ( + id, + definition + ) { + if (!definition) { + return this.options[type + 's'][id] + } else { + /* istanbul ignore if */ + { + if (type === 'component' && config.isReservedTag(id)) { + warn( + 'Do not use built-in or reserved HTML elements as component ' + + 'id: ' + id + ); + } + } + if (type === 'component' && isPlainObject(definition)) { + definition.name = definition.name || id; + definition = Vue.extend(definition); + } + if (type === 'directive' && typeof definition === 'function') { + definition = { bind: definition, update: definition }; + } + this.options[type + 's'][id] = definition; + return definition + } + }; + }); +} + +var KeepAlive = { + name: 'keep-alive', + abstract: true, + created: function created () { + this.cache = Object.create(null); + }, + render: function render () { + var vnode = getFirstComponentChild(this.$slots.default); + if (vnode && vnode.componentOptions) { + var opts = vnode.componentOptions; + var key = vnode.key == null + // same constructor may get registered as different local components + // so cid alone is not enough (#3269) + ? opts.Ctor.cid + '::' + opts.tag + : vnode.key; + if (this.cache[key]) { + vnode.child = this.cache[key].child; + } else { + this.cache[key] = vnode; + } + vnode.data.keepAlive = true; + } + return vnode + }, + destroyed: function destroyed () { + var this$1 = this; + + for (var key in this.cache) { + var vnode = this$1.cache[key]; + callHook(vnode.child, 'deactivated'); + vnode.child.$destroy(); + } + } +}; + +var builtInComponents = { + KeepAlive: KeepAlive +}; + +/* */ + +function initGlobalAPI (Vue) { + // config + var configDef = {}; + configDef.get = function () { return config; }; + { + configDef.set = function () { + warn( + 'Do not replace the Vue.config object, set individual fields instead.' + ); + }; + } + Object.defineProperty(Vue, 'config', configDef); + Vue.util = util; + Vue.set = set; + Vue.delete = del; + Vue.nextTick = nextTick; + + Vue.options = Object.create(null); + config._assetTypes.forEach(function (type) { + Vue.options[type + 's'] = Object.create(null); + }); + + extend(Vue.options.components, builtInComponents); + + initUse(Vue); + initMixin$1(Vue); + initExtend(Vue); + initAssetRegisters(Vue); +} + +initGlobalAPI(Vue$3); + +Object.defineProperty(Vue$3.prototype, '$isServer', { + get: function () { return config._isServer; } +}); + +Vue$3.version = '2.0.3'; + +/* */ + +// attributes that should be using props for binding +var mustUseProp = makeMap('value,selected,checked,muted'); + +var isEnumeratedAttr = makeMap('contenteditable,draggable,spellcheck'); + +var isBooleanAttr = makeMap( + 'allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,' + + 'default,defaultchecked,defaultmuted,defaultselected,defer,disabled,' + + 'enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,' + + 'muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,' + + 'required,reversed,scoped,seamless,selected,sortable,translate,' + + 'truespeed,typemustmatch,visible' +); + +var isAttr = makeMap( + 'accept,accept-charset,accesskey,action,align,alt,async,autocomplete,' + + 'autofocus,autoplay,autosave,bgcolor,border,buffered,challenge,charset,' + + 'checked,cite,class,code,codebase,color,cols,colspan,content,http-equiv,' + + 'name,contenteditable,contextmenu,controls,coords,data,datetime,default,' + + 'defer,dir,dirname,disabled,download,draggable,dropzone,enctype,method,for,' + + 'form,formaction,headers,,height,hidden,high,href,hreflang,http-equiv,' + + 'icon,id,ismap,itemprop,keytype,kind,label,lang,language,list,loop,low,' + + 'manifest,max,maxlength,media,method,GET,POST,min,multiple,email,file,' + + 'muted,name,novalidate,open,optimum,pattern,ping,placeholder,poster,' + + 'preload,radiogroup,readonly,rel,required,reversed,rows,rowspan,sandbox,' + + 'scope,scoped,seamless,selected,shape,size,type,text,password,sizes,span,' + + 'spellcheck,src,srcdoc,srclang,srcset,start,step,style,summary,tabindex,' + + 'target,title,type,usemap,value,width,wrap' +); + + + +var xlinkNS = 'http://www.w3.org/1999/xlink'; + +var isXlink = function (name) { + return name.charAt(5) === ':' && name.slice(0, 5) === 'xlink' +}; + +var getXlinkProp = function (name) { + return isXlink(name) ? name.slice(6, name.length) : '' +}; + +var isFalsyAttrValue = function (val) { + return val == null || val === false +}; + +/* */ + +function genClassForVnode (vnode) { + var data = vnode.data; + var parentNode = vnode; + var childNode = vnode; + while (childNode.child) { + childNode = childNode.child._vnode; + if (childNode.data) { + data = mergeClassData(childNode.data, data); + } + } + while ((parentNode = parentNode.parent)) { + if (parentNode.data) { + data = mergeClassData(data, parentNode.data); + } + } + return genClassFromData(data) +} + +function mergeClassData (child, parent) { + return { + staticClass: concat(child.staticClass, parent.staticClass), + class: child.class + ? [child.class, parent.class] + : parent.class + } +} + +function genClassFromData (data) { + var dynamicClass = data.class; + var staticClass = data.staticClass; + if (staticClass || dynamicClass) { + return concat(staticClass, stringifyClass(dynamicClass)) + } + /* istanbul ignore next */ + return '' +} + +function concat (a, b) { + return a ? b ? (a + ' ' + b) : a : (b || '') +} + +function stringifyClass (value) { + var res = ''; + if (!value) { + return res + } + if (typeof value === 'string') { + return value + } + if (Array.isArray(value)) { + var stringified; + for (var i = 0, l = value.length; i < l; i++) { + if (value[i]) { + if ((stringified = stringifyClass(value[i]))) { + res += stringified + ' '; + } + } + } + return res.slice(0, -1) + } + if (isObject(value)) { + for (var key in value) { + if (value[key]) { res += key + ' '; } + } + return res.slice(0, -1) + } + /* istanbul ignore next */ + return res +} + +/* */ + +var namespaceMap = { + svg: 'http://www.w3.org/2000/svg', + math: 'http://www.w3.org/1998/Math/MathML' +}; + +var isHTMLTag = makeMap( + 'html,body,base,head,link,meta,style,title,' + + 'address,article,aside,footer,header,h1,h2,h3,h4,h5,h6,hgroup,nav,section,' + + 'div,dd,dl,dt,figcaption,figure,hr,img,li,main,ol,p,pre,ul,' + + 'a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,rtc,ruby,' + + 's,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,' + + 'embed,object,param,source,canvas,script,noscript,del,ins,' + + 'caption,col,colgroup,table,thead,tbody,td,th,tr,' + + 'button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,' + + 'output,progress,select,textarea,' + + 'details,dialog,menu,menuitem,summary,' + + 'content,element,shadow,template' +); + +var isUnaryTag = makeMap( + 'area,base,br,col,embed,frame,hr,img,input,isindex,keygen,' + + 'link,meta,param,source,track,wbr', + true +); + +// Elements that you can, intentionally, leave open +// (and which close themselves) +var canBeLeftOpenTag = makeMap( + 'colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr,source', + true +); + +// HTML5 tags https://html.spec.whatwg.org/multipage/indices.html#elements-3 +// Phrasing Content https://html.spec.whatwg.org/multipage/dom.html#phrasing-content +var isNonPhrasingTag = makeMap( + 'address,article,aside,base,blockquote,body,caption,col,colgroup,dd,' + + 'details,dialog,div,dl,dt,fieldset,figcaption,figure,footer,form,' + + 'h1,h2,h3,h4,h5,h6,head,header,hgroup,hr,html,legend,li,menuitem,meta,' + + 'optgroup,option,param,rp,rt,source,style,summary,tbody,td,tfoot,th,thead,' + + 'title,tr,track', + true +); + +// this map is intentionally selective, only covering SVG elements that may +// contain child elements. +var isSVG = makeMap( + 'svg,animate,circle,clippath,cursor,defs,desc,ellipse,filter,font,' + + 'font-face,g,glyph,image,line,marker,mask,missing-glyph,path,pattern,' + + 'polygon,polyline,rect,switch,symbol,text,textpath,tspan,use,view', + true +); + +var isPreTag = function (tag) { return tag === 'pre'; }; + +var isReservedTag = function (tag) { + return isHTMLTag(tag) || isSVG(tag) +}; + +function getTagNamespace (tag) { + if (isSVG(tag)) { + return 'svg' + } + // basic support for MathML + // note it doesn't support other MathML elements being component roots + if (tag === 'math') { + return 'math' + } +} + +var unknownElementCache = Object.create(null); +function isUnknownElement (tag) { + /* istanbul ignore if */ + if (!inBrowser) { + return true + } + if (isReservedTag(tag)) { + return false + } + tag = tag.toLowerCase(); + /* istanbul ignore if */ + if (unknownElementCache[tag] != null) { + return unknownElementCache[tag] + } + var el = document.createElement(tag); + if (tag.indexOf('-') > -1) { + // http://stackoverflow.com/a/28210364/1070244 + return (unknownElementCache[tag] = ( + el.constructor === window.HTMLUnknownElement || + el.constructor === window.HTMLElement + )) + } else { + return (unknownElementCache[tag] = /HTMLUnknownElement/.test(el.toString())) + } +} + +/* */ + +/** + * Query an element selector if it's not an element already. + */ +function query (el) { + if (typeof el === 'string') { + var selector = el; + el = document.querySelector(el); + if (!el) { + "development" !== 'production' && warn( + 'Cannot find element: ' + selector + ); + return document.createElement('div') + } + } + return el +} + +/* */ + +function createElement$1 (tagName, vnode) { + var elm = document.createElement(tagName); + if (tagName !== 'select') { + return elm + } + if (vnode.data && vnode.data.attrs && 'multiple' in vnode.data.attrs) { + elm.setAttribute('multiple', 'multiple'); + } + return elm +} + +function createElementNS (namespace, tagName) { + return document.createElementNS(namespaceMap[namespace], tagName) +} + +function createTextNode (text) { + return document.createTextNode(text) +} + +function createComment (text) { + return document.createComment(text) +} + +function insertBefore (parentNode, newNode, referenceNode) { + parentNode.insertBefore(newNode, referenceNode); +} + +function removeChild (node, child) { + node.removeChild(child); +} + +function appendChild (node, child) { + node.appendChild(child); +} + +function parentNode (node) { + return node.parentNode +} + +function nextSibling (node) { + return node.nextSibling +} + +function tagName (node) { + return node.tagName +} + +function setTextContent (node, text) { + node.textContent = text; +} + +function childNodes (node) { + return node.childNodes +} + +function setAttribute (node, key, val) { + node.setAttribute(key, val); +} + + +var nodeOps = Object.freeze({ + createElement: createElement$1, + createElementNS: createElementNS, + createTextNode: createTextNode, + createComment: createComment, + insertBefore: insertBefore, + removeChild: removeChild, + appendChild: appendChild, + parentNode: parentNode, + nextSibling: nextSibling, + tagName: tagName, + setTextContent: setTextContent, + childNodes: childNodes, + setAttribute: setAttribute +}); + +/* */ + +var ref = { + create: function create (_, vnode) { + registerRef(vnode); + }, + update: function update (oldVnode, vnode) { + if (oldVnode.data.ref !== vnode.data.ref) { + registerRef(oldVnode, true); + registerRef(vnode); + } + }, + destroy: function destroy (vnode) { + registerRef(vnode, true); + } +}; + +function registerRef (vnode, isRemoval) { + var key = vnode.data.ref; + if (!key) { return } + + var vm = vnode.context; + var ref = vnode.child || vnode.elm; + var refs = vm.$refs; + if (isRemoval) { + if (Array.isArray(refs[key])) { + remove$1(refs[key], ref); + } else if (refs[key] === ref) { + refs[key] = undefined; + } + } else { + if (vnode.data.refInFor) { + if (Array.isArray(refs[key])) { + refs[key].push(ref); + } else { + refs[key] = [ref]; + } + } else { + refs[key] = ref; + } + } +} + +/** + * Virtual DOM patching algorithm based on Snabbdom by + * Simon Friis Vindum (@paldepind) + * Licensed under the MIT License + * https://github.com/paldepind/snabbdom/blob/master/LICENSE + * + * modified by Evan You (@yyx990803) + * + +/* + * Not type-checking this because this file is perf-critical and the cost + * of making flow understand it is not worth it. + */ + +var emptyNode = new VNode('', {}, []); + +var hooks$1 = ['create', 'update', 'remove', 'destroy']; + +function isUndef (s) { + return s == null +} + +function isDef (s) { + return s != null +} + +function sameVnode (vnode1, vnode2) { + return ( + vnode1.key === vnode2.key && + vnode1.tag === vnode2.tag && + vnode1.isComment === vnode2.isComment && + !vnode1.data === !vnode2.data + ) +} + +function createKeyToOldIdx (children, beginIdx, endIdx) { + var i, key; + var map = {}; + for (i = beginIdx; i <= endIdx; ++i) { + key = children[i].key; + if (isDef(key)) { map[key] = i; } + } + return map +} + +function createPatchFunction (backend) { + var i, j; + var cbs = {}; + + var modules = backend.modules; + var nodeOps = backend.nodeOps; + + for (i = 0; i < hooks$1.length; ++i) { + cbs[hooks$1[i]] = []; + for (j = 0; j < modules.length; ++j) { + if (modules[j][hooks$1[i]] !== undefined) { cbs[hooks$1[i]].push(modules[j][hooks$1[i]]); } + } + } + + function emptyNodeAt (elm) { + return new VNode(nodeOps.tagName(elm).toLowerCase(), {}, [], undefined, elm) + } + + function createRmCb (childElm, listeners) { + function remove$$1 () { + if (--remove$$1.listeners === 0) { + removeElement(childElm); + } + } + remove$$1.listeners = listeners; + return remove$$1 + } + + function removeElement (el) { + var parent = nodeOps.parentNode(el); + nodeOps.removeChild(parent, el); + } + + function createElm (vnode, insertedVnodeQueue, nested) { + var i; + var data = vnode.data; + vnode.isRootInsert = !nested; + if (isDef(data)) { + if (isDef(i = data.hook) && isDef(i = i.init)) { i(vnode); } + // after calling the init hook, if the vnode is a child component + // it should've created a child instance and mounted it. the child + // component also has set the placeholder vnode's elm. + // in that case we can just return the element and be done. + if (isDef(i = vnode.child)) { + initComponent(vnode, insertedVnodeQueue); + return vnode.elm + } + } + var children = vnode.children; + var tag = vnode.tag; + if (isDef(tag)) { + { + if ( + !vnode.ns && + !(config.ignoredElements && config.ignoredElements.indexOf(tag) > -1) && + config.isUnknownElement(tag) + ) { + warn( + 'Unknown custom element: <' + tag + '> - did you ' + + 'register the component correctly? For recursive components, ' + + 'make sure to provide the "name" option.', + vnode.context + ); + } + } + vnode.elm = vnode.ns + ? nodeOps.createElementNS(vnode.ns, tag) + : nodeOps.createElement(tag, vnode); + setScope(vnode); + createChildren(vnode, children, insertedVnodeQueue); + if (isDef(data)) { + invokeCreateHooks(vnode, insertedVnodeQueue); + } + } else if (vnode.isComment) { + vnode.elm = nodeOps.createComment(vnode.text); + } else { + vnode.elm = nodeOps.createTextNode(vnode.text); + } + return vnode.elm + } + + function createChildren (vnode, children, insertedVnodeQueue) { + if (Array.isArray(children)) { + for (var i = 0; i < children.length; ++i) { + nodeOps.appendChild(vnode.elm, createElm(children[i], insertedVnodeQueue, true)); + } + } else if (isPrimitive(vnode.text)) { + nodeOps.appendChild(vnode.elm, nodeOps.createTextNode(vnode.text)); + } + } + + function isPatchable (vnode) { + while (vnode.child) { + vnode = vnode.child._vnode; + } + return isDef(vnode.tag) + } + + function invokeCreateHooks (vnode, insertedVnodeQueue) { + for (var i$1 = 0; i$1 < cbs.create.length; ++i$1) { + cbs.create[i$1](emptyNode, vnode); + } + i = vnode.data.hook; // Reuse variable + if (isDef(i)) { + if (i.create) { i.create(emptyNode, vnode); } + if (i.insert) { insertedVnodeQueue.push(vnode); } + } + } + + function initComponent (vnode, insertedVnodeQueue) { + if (vnode.data.pendingInsert) { + insertedVnodeQueue.push.apply(insertedVnodeQueue, vnode.data.pendingInsert); + } + vnode.elm = vnode.child.$el; + if (isPatchable(vnode)) { + invokeCreateHooks(vnode, insertedVnodeQueue); + setScope(vnode); + } else { + // empty component root. + // skip all element-related modules except for ref (#3455) + registerRef(vnode); + // make sure to invoke the insert hook + insertedVnodeQueue.push(vnode); + } + } + + // set scope id attribute for scoped CSS. + // this is implemented as a special case to avoid the overhead + // of going through the normal attribute patching process. + function setScope (vnode) { + var i; + if (isDef(i = vnode.context) && isDef(i = i.$options._scopeId)) { + nodeOps.setAttribute(vnode.elm, i, ''); + } + if (isDef(i = activeInstance) && + i !== vnode.context && + isDef(i = i.$options._scopeId)) { + nodeOps.setAttribute(vnode.elm, i, ''); + } + } + + function addVnodes (parentElm, before, vnodes, startIdx, endIdx, insertedVnodeQueue) { + for (; startIdx <= endIdx; ++startIdx) { + nodeOps.insertBefore(parentElm, createElm(vnodes[startIdx], insertedVnodeQueue), before); + } + } + + function invokeDestroyHook (vnode) { + var i, j; + var data = vnode.data; + if (isDef(data)) { + if (isDef(i = data.hook) && isDef(i = i.destroy)) { i(vnode); } + for (i = 0; i < cbs.destroy.length; ++i) { cbs.destroy[i](vnode); } + } + if (isDef(i = vnode.children)) { + for (j = 0; j < vnode.children.length; ++j) { + invokeDestroyHook(vnode.children[j]); + } + } + } + + function removeVnodes (parentElm, vnodes, startIdx, endIdx) { + for (; startIdx <= endIdx; ++startIdx) { + var ch = vnodes[startIdx]; + if (isDef(ch)) { + if (isDef(ch.tag)) { + removeAndInvokeRemoveHook(ch); + invokeDestroyHook(ch); + } else { // Text node + nodeOps.removeChild(parentElm, ch.elm); + } + } + } + } + + function removeAndInvokeRemoveHook (vnode, rm) { + if (rm || isDef(vnode.data)) { + var listeners = cbs.remove.length + 1; + if (!rm) { + // directly removing + rm = createRmCb(vnode.elm, listeners); + } else { + // we have a recursively passed down rm callback + // increase the listeners count + rm.listeners += listeners; + } + // recursively invoke hooks on child component root node + if (isDef(i = vnode.child) && isDef(i = i._vnode) && isDef(i.data)) { + removeAndInvokeRemoveHook(i, rm); + } + for (i = 0; i < cbs.remove.length; ++i) { + cbs.remove[i](vnode, rm); + } + if (isDef(i = vnode.data.hook) && isDef(i = i.remove)) { + i(vnode, rm); + } else { + rm(); + } + } else { + removeElement(vnode.elm); + } + } + + function updateChildren (parentElm, oldCh, newCh, insertedVnodeQueue, removeOnly) { + var oldStartIdx = 0; + var newStartIdx = 0; + var oldEndIdx = oldCh.length - 1; + var oldStartVnode = oldCh[0]; + var oldEndVnode = oldCh[oldEndIdx]; + var newEndIdx = newCh.length - 1; + var newStartVnode = newCh[0]; + var newEndVnode = newCh[newEndIdx]; + var oldKeyToIdx, idxInOld, elmToMove, before; + + // removeOnly is a special flag used only by + // to ensure removed elements stay in correct relative positions + // during leaving transitions + var canMove = !removeOnly; + + while (oldStartIdx <= oldEndIdx && newStartIdx <= newEndIdx) { + if (isUndef(oldStartVnode)) { + oldStartVnode = oldCh[++oldStartIdx]; // Vnode has been moved left + } else if (isUndef(oldEndVnode)) { + oldEndVnode = oldCh[--oldEndIdx]; + } else if (sameVnode(oldStartVnode, newStartVnode)) { + patchVnode(oldStartVnode, newStartVnode, insertedVnodeQueue); + oldStartVnode = oldCh[++oldStartIdx]; + newStartVnode = newCh[++newStartIdx]; + } else if (sameVnode(oldEndVnode, newEndVnode)) { + patchVnode(oldEndVnode, newEndVnode, insertedVnodeQueue); + oldEndVnode = oldCh[--oldEndIdx]; + newEndVnode = newCh[--newEndIdx]; + } else if (sameVnode(oldStartVnode, newEndVnode)) { // Vnode moved right + patchVnode(oldStartVnode, newEndVnode, insertedVnodeQueue); + canMove && nodeOps.insertBefore(parentElm, oldStartVnode.elm, nodeOps.nextSibling(oldEndVnode.elm)); + oldStartVnode = oldCh[++oldStartIdx]; + newEndVnode = newCh[--newEndIdx]; + } else if (sameVnode(oldEndVnode, newStartVnode)) { // Vnode moved left + patchVnode(oldEndVnode, newStartVnode, insertedVnodeQueue); + canMove && nodeOps.insertBefore(parentElm, oldEndVnode.elm, oldStartVnode.elm); + oldEndVnode = oldCh[--oldEndIdx]; + newStartVnode = newCh[++newStartIdx]; + } else { + if (isUndef(oldKeyToIdx)) { oldKeyToIdx = createKeyToOldIdx(oldCh, oldStartIdx, oldEndIdx); } + idxInOld = isDef(newStartVnode.key) ? oldKeyToIdx[newStartVnode.key] : null; + if (isUndef(idxInOld)) { // New element + nodeOps.insertBefore(parentElm, createElm(newStartVnode, insertedVnodeQueue), oldStartVnode.elm); + newStartVnode = newCh[++newStartIdx]; + } else { + elmToMove = oldCh[idxInOld]; + /* istanbul ignore if */ + if ("development" !== 'production' && !elmToMove) { + warn( + 'It seems there are duplicate keys that is causing an update error. ' + + 'Make sure each v-for item has a unique key.' + ); + } + if (elmToMove.tag !== newStartVnode.tag) { + // same key but different element. treat as new element + nodeOps.insertBefore(parentElm, createElm(newStartVnode, insertedVnodeQueue), oldStartVnode.elm); + newStartVnode = newCh[++newStartIdx]; + } else { + patchVnode(elmToMove, newStartVnode, insertedVnodeQueue); + oldCh[idxInOld] = undefined; + canMove && nodeOps.insertBefore(parentElm, newStartVnode.elm, oldStartVnode.elm); + newStartVnode = newCh[++newStartIdx]; + } + } + } + } + if (oldStartIdx > oldEndIdx) { + before = isUndef(newCh[newEndIdx + 1]) ? null : newCh[newEndIdx + 1].elm; + addVnodes(parentElm, before, newCh, newStartIdx, newEndIdx, insertedVnodeQueue); + } else if (newStartIdx > newEndIdx) { + removeVnodes(parentElm, oldCh, oldStartIdx, oldEndIdx); + } + } + + function patchVnode (oldVnode, vnode, insertedVnodeQueue, removeOnly) { + if (oldVnode === vnode) { + return + } + // reuse element for static trees. + // note we only do this if the vnode is cloned - + // if the new node is not cloned it means the render functions have been + // reset by the hot-reload-api and we need to do a proper re-render. + if (vnode.isStatic && + oldVnode.isStatic && + vnode.key === oldVnode.key && + vnode.isCloned) { + vnode.elm = oldVnode.elm; + return + } + var i; + var data = vnode.data; + var hasData = isDef(data); + if (hasData && isDef(i = data.hook) && isDef(i = i.prepatch)) { + i(oldVnode, vnode); + } + var elm = vnode.elm = oldVnode.elm; + var oldCh = oldVnode.children; + var ch = vnode.children; + if (hasData && isPatchable(vnode)) { + for (i = 0; i < cbs.update.length; ++i) { cbs.update[i](oldVnode, vnode); } + if (isDef(i = data.hook) && isDef(i = i.update)) { i(oldVnode, vnode); } + } + if (isUndef(vnode.text)) { + if (isDef(oldCh) && isDef(ch)) { + if (oldCh !== ch) { updateChildren(elm, oldCh, ch, insertedVnodeQueue, removeOnly); } + } else if (isDef(ch)) { + if (isDef(oldVnode.text)) { nodeOps.setTextContent(elm, ''); } + addVnodes(elm, null, ch, 0, ch.length - 1, insertedVnodeQueue); + } else if (isDef(oldCh)) { + removeVnodes(elm, oldCh, 0, oldCh.length - 1); + } else if (isDef(oldVnode.text)) { + nodeOps.setTextContent(elm, ''); + } + } else if (oldVnode.text !== vnode.text) { + nodeOps.setTextContent(elm, vnode.text); + } + if (hasData) { + if (isDef(i = data.hook) && isDef(i = i.postpatch)) { i(oldVnode, vnode); } + } + } + + function invokeInsertHook (vnode, queue, initial) { + // delay insert hooks for component root nodes, invoke them after the + // element is really inserted + if (initial && vnode.parent) { + vnode.parent.data.pendingInsert = queue; + } else { + for (var i = 0; i < queue.length; ++i) { + queue[i].data.hook.insert(queue[i]); + } + } + } + + var bailed = false; + function hydrate (elm, vnode, insertedVnodeQueue) { + { + if (!assertNodeMatch(elm, vnode)) { + return false + } + } + vnode.elm = elm; + var tag = vnode.tag; + var data = vnode.data; + var children = vnode.children; + if (isDef(data)) { + if (isDef(i = data.hook) && isDef(i = i.init)) { i(vnode, true /* hydrating */); } + if (isDef(i = vnode.child)) { + // child component. it should have hydrated its own tree. + initComponent(vnode, insertedVnodeQueue); + return true + } + } + if (isDef(tag)) { + if (isDef(children)) { + var childNodes = nodeOps.childNodes(elm); + // empty element, allow client to pick up and populate children + if (!childNodes.length) { + createChildren(vnode, children, insertedVnodeQueue); + } else { + var childrenMatch = true; + if (childNodes.length !== children.length) { + childrenMatch = false; + } else { + for (var i$1 = 0; i$1 < children.length; i$1++) { + if (!hydrate(childNodes[i$1], children[i$1], insertedVnodeQueue)) { + childrenMatch = false; + break + } + } + } + if (!childrenMatch) { + if ("development" !== 'production' && + typeof console !== 'undefined' && + !bailed) { + bailed = true; + console.warn('Parent: ', elm); + console.warn('Mismatching childNodes vs. VNodes: ', childNodes, children); + } + return false + } + } + } + if (isDef(data)) { + invokeCreateHooks(vnode, insertedVnodeQueue); + } + } + return true + } + + function assertNodeMatch (node, vnode) { + if (vnode.tag) { + return ( + vnode.tag.indexOf('vue-component') === 0 || + vnode.tag === nodeOps.tagName(node).toLowerCase() + ) + } else { + return _toString(vnode.text) === node.data + } + } + + return function patch (oldVnode, vnode, hydrating, removeOnly) { + if (!vnode) { + if (oldVnode) { invokeDestroyHook(oldVnode); } + return + } + + var elm, parent; + var isInitialPatch = false; + var insertedVnodeQueue = []; + + if (!oldVnode) { + // empty mount, create new root element + isInitialPatch = true; + createElm(vnode, insertedVnodeQueue); + } else { + var isRealElement = isDef(oldVnode.nodeType); + if (!isRealElement && sameVnode(oldVnode, vnode)) { + patchVnode(oldVnode, vnode, insertedVnodeQueue, removeOnly); + } else { + if (isRealElement) { + // mounting to a real element + // check if this is server-rendered content and if we can perform + // a successful hydration. + if (oldVnode.nodeType === 1 && oldVnode.hasAttribute('server-rendered')) { + oldVnode.removeAttribute('server-rendered'); + hydrating = true; + } + if (hydrating) { + if (hydrate(oldVnode, vnode, insertedVnodeQueue)) { + invokeInsertHook(vnode, insertedVnodeQueue, true); + return oldVnode + } else { + warn( + 'The client-side rendered virtual DOM tree is not matching ' + + 'server-rendered content. This is likely caused by incorrect ' + + 'HTML markup, for example nesting block-level elements inside ' + + '

, or missing . Bailing hydration and performing ' + + 'full client-side render.' + ); + } + } + // either not server-rendered, or hydration failed. + // create an empty node and replace it + oldVnode = emptyNodeAt(oldVnode); + } + elm = oldVnode.elm; + parent = nodeOps.parentNode(elm); + + createElm(vnode, insertedVnodeQueue); + + // component root element replaced. + // update parent placeholder node element. + if (vnode.parent) { + vnode.parent.elm = vnode.elm; + if (isPatchable(vnode)) { + for (var i = 0; i < cbs.create.length; ++i) { + cbs.create[i](emptyNode, vnode.parent); + } + } + } + + if (parent !== null) { + nodeOps.insertBefore(parent, vnode.elm, nodeOps.nextSibling(elm)); + removeVnodes(parent, [oldVnode], 0, 0); + } else if (isDef(oldVnode.tag)) { + invokeDestroyHook(oldVnode); + } + } + } + + invokeInsertHook(vnode, insertedVnodeQueue, isInitialPatch); + return vnode.elm + } +} + +/* */ + +var directives = { + create: updateDirectives, + update: updateDirectives, + destroy: function unbindDirectives (vnode) { + updateDirectives(vnode, emptyNode); + } +}; + +function updateDirectives ( + oldVnode, + vnode +) { + if (!oldVnode.data.directives && !vnode.data.directives) { + return + } + var isCreate = oldVnode === emptyNode; + var oldDirs = normalizeDirectives$1(oldVnode.data.directives, oldVnode.context); + var newDirs = normalizeDirectives$1(vnode.data.directives, vnode.context); + + var dirsWithInsert = []; + var dirsWithPostpatch = []; + + var key, oldDir, dir; + for (key in newDirs) { + oldDir = oldDirs[key]; + dir = newDirs[key]; + if (!oldDir) { + // new directive, bind + callHook$1(dir, 'bind', vnode, oldVnode); + if (dir.def && dir.def.inserted) { + dirsWithInsert.push(dir); + } + } else { + // existing directive, update + dir.oldValue = oldDir.value; + callHook$1(dir, 'update', vnode, oldVnode); + if (dir.def && dir.def.componentUpdated) { + dirsWithPostpatch.push(dir); + } + } + } + + if (dirsWithInsert.length) { + var callInsert = function () { + dirsWithInsert.forEach(function (dir) { + callHook$1(dir, 'inserted', vnode, oldVnode); + }); + }; + if (isCreate) { + mergeVNodeHook(vnode.data.hook || (vnode.data.hook = {}), 'insert', callInsert, 'dir-insert'); + } else { + callInsert(); + } + } + + if (dirsWithPostpatch.length) { + mergeVNodeHook(vnode.data.hook || (vnode.data.hook = {}), 'postpatch', function () { + dirsWithPostpatch.forEach(function (dir) { + callHook$1(dir, 'componentUpdated', vnode, oldVnode); + }); + }, 'dir-postpatch'); + } + + if (!isCreate) { + for (key in oldDirs) { + if (!newDirs[key]) { + // no longer present, unbind + callHook$1(oldDirs[key], 'unbind', oldVnode); + } + } + } +} + +var emptyModifiers = Object.create(null); + +function normalizeDirectives$1 ( + dirs, + vm +) { + var res = Object.create(null); + if (!dirs) { + return res + } + var i, dir; + for (i = 0; i < dirs.length; i++) { + dir = dirs[i]; + if (!dir.modifiers) { + dir.modifiers = emptyModifiers; + } + res[getRawDirName(dir)] = dir; + dir.def = resolveAsset(vm.$options, 'directives', dir.name, true); + } + return res +} + +function getRawDirName (dir) { + return dir.rawName || ((dir.name) + "." + (Object.keys(dir.modifiers || {}).join('.'))) +} + +function callHook$1 (dir, hook, vnode, oldVnode) { + var fn = dir.def && dir.def[hook]; + if (fn) { + fn(vnode.elm, dir, vnode, oldVnode); + } +} + +var baseModules = [ + ref, + directives +]; + +/* */ + +function updateAttrs (oldVnode, vnode) { + if (!oldVnode.data.attrs && !vnode.data.attrs) { + return + } + var key, cur, old; + var elm = vnode.elm; + var oldAttrs = oldVnode.data.attrs || {}; + var attrs = vnode.data.attrs || {}; + // clone observed objects, as the user probably wants to mutate it + if (attrs.__ob__) { + attrs = vnode.data.attrs = extend({}, attrs); + } + + for (key in attrs) { + cur = attrs[key]; + old = oldAttrs[key]; + if (old !== cur) { + setAttr(elm, key, cur); + } + } + for (key in oldAttrs) { + if (attrs[key] == null) { + if (isXlink(key)) { + elm.removeAttributeNS(xlinkNS, getXlinkProp(key)); + } else if (!isEnumeratedAttr(key)) { + elm.removeAttribute(key); + } + } + } +} + +function setAttr (el, key, value) { + if (isBooleanAttr(key)) { + // set attribute for blank value + // e.g. + if (isFalsyAttrValue(value)) { + el.removeAttribute(key); + } else { + el.setAttribute(key, key); + } + } else if (isEnumeratedAttr(key)) { + el.setAttribute(key, isFalsyAttrValue(value) || value === 'false' ? 'false' : 'true'); + } else if (isXlink(key)) { + if (isFalsyAttrValue(value)) { + el.removeAttributeNS(xlinkNS, getXlinkProp(key)); + } else { + el.setAttributeNS(xlinkNS, key, value); + } + } else { + if (isFalsyAttrValue(value)) { + el.removeAttribute(key); + } else { + el.setAttribute(key, value); + } + } +} + +var attrs = { + create: updateAttrs, + update: updateAttrs +}; + +/* */ + +function updateClass (oldVnode, vnode) { + var el = vnode.elm; + var data = vnode.data; + var oldData = oldVnode.data; + if (!data.staticClass && !data.class && + (!oldData || (!oldData.staticClass && !oldData.class))) { + return + } + + var cls = genClassForVnode(vnode); + + // handle transition classes + var transitionClass = el._transitionClasses; + if (transitionClass) { + cls = concat(cls, stringifyClass(transitionClass)); + } + + // set the class + if (cls !== el._prevClass) { + el.setAttribute('class', cls); + el._prevClass = cls; + } +} + +var klass = { + create: updateClass, + update: updateClass +}; + +// skip type checking this file because we need to attach private properties +// to elements + +function updateDOMListeners (oldVnode, vnode) { + if (!oldVnode.data.on && !vnode.data.on) { + return + } + var on = vnode.data.on || {}; + var oldOn = oldVnode.data.on || {}; + var add = vnode.elm._v_add || (vnode.elm._v_add = function (event, handler, capture) { + vnode.elm.addEventListener(event, handler, capture); + }); + var remove = vnode.elm._v_remove || (vnode.elm._v_remove = function (event, handler) { + vnode.elm.removeEventListener(event, handler); + }); + updateListeners(on, oldOn, add, remove, vnode.context); +} + +var events = { + create: updateDOMListeners, + update: updateDOMListeners +}; + +/* */ + +function updateDOMProps (oldVnode, vnode) { + if (!oldVnode.data.domProps && !vnode.data.domProps) { + return + } + var key, cur; + var elm = vnode.elm; + var oldProps = oldVnode.data.domProps || {}; + var props = vnode.data.domProps || {}; + // clone observed objects, as the user probably wants to mutate it + if (props.__ob__) { + props = vnode.data.domProps = extend({}, props); + } + + for (key in oldProps) { + if (props[key] == null) { + elm[key] = undefined; + } + } + for (key in props) { + // ignore children if the node has textContent or innerHTML, + // as these will throw away existing DOM nodes and cause removal errors + // on subsequent patches (#3360) + if ((key === 'textContent' || key === 'innerHTML') && vnode.children) { + vnode.children.length = 0; + } + cur = props[key]; + if (key === 'value') { + // store value as _value as well since + // non-string values will be stringified + elm._value = cur; + // avoid resetting cursor position when value is the same + var strCur = cur == null ? '' : String(cur); + if (elm.value !== strCur && !elm.composing) { + elm.value = strCur; + } + } else { + elm[key] = cur; + } + } +} + +var domProps = { + create: updateDOMProps, + update: updateDOMProps +}; + +/* */ + +var prefixes = ['Webkit', 'Moz', 'ms']; + +var testEl; +var normalize = cached(function (prop) { + testEl = testEl || document.createElement('div'); + prop = camelize(prop); + if (prop !== 'filter' && (prop in testEl.style)) { + return prop + } + var upper = prop.charAt(0).toUpperCase() + prop.slice(1); + for (var i = 0; i < prefixes.length; i++) { + var prefixed = prefixes[i] + upper; + if (prefixed in testEl.style) { + return prefixed + } + } +}); + +function updateStyle (oldVnode, vnode) { + if ((!oldVnode.data || !oldVnode.data.style) && !vnode.data.style) { + return + } + var cur, name; + var el = vnode.elm; + var oldStyle = oldVnode.data.style || {}; + var style = vnode.data.style || {}; + + // handle string + if (typeof style === 'string') { + el.style.cssText = style; + return + } + + var needClone = style.__ob__; + + // handle array syntax + if (Array.isArray(style)) { + style = vnode.data.style = toObject(style); + } + + // clone the style for future updates, + // in case the user mutates the style object in-place. + if (needClone) { + style = vnode.data.style = extend({}, style); + } + + for (name in oldStyle) { + if (style[name] == null) { + el.style[normalize(name)] = ''; + } + } + for (name in style) { + cur = style[name]; + if (cur !== oldStyle[name]) { + // ie9 setting to null has no effect, must use empty string + el.style[normalize(name)] = cur == null ? '' : cur; + } + } +} + +var style = { + create: updateStyle, + update: updateStyle +}; + +/* */ + +/** + * Add class with compatibility for SVG since classList is not supported on + * SVG elements in IE + */ +function addClass (el, cls) { + /* istanbul ignore else */ + if (el.classList) { + if (cls.indexOf(' ') > -1) { + cls.split(/\s+/).forEach(function (c) { return el.classList.add(c); }); + } else { + el.classList.add(cls); + } + } else { + var cur = ' ' + el.getAttribute('class') + ' '; + if (cur.indexOf(' ' + cls + ' ') < 0) { + el.setAttribute('class', (cur + cls).trim()); + } + } +} + +/** + * Remove class with compatibility for SVG since classList is not supported on + * SVG elements in IE + */ +function removeClass (el, cls) { + /* istanbul ignore else */ + if (el.classList) { + if (cls.indexOf(' ') > -1) { + cls.split(/\s+/).forEach(function (c) { return el.classList.remove(c); }); + } else { + el.classList.remove(cls); + } + } else { + var cur = ' ' + el.getAttribute('class') + ' '; + var tar = ' ' + cls + ' '; + while (cur.indexOf(tar) >= 0) { + cur = cur.replace(tar, ' '); + } + el.setAttribute('class', cur.trim()); + } +} + +/* */ + +var hasTransition = inBrowser && !isIE9; +var TRANSITION = 'transition'; +var ANIMATION = 'animation'; + +// Transition property/event sniffing +var transitionProp = 'transition'; +var transitionEndEvent = 'transitionend'; +var animationProp = 'animation'; +var animationEndEvent = 'animationend'; +if (hasTransition) { + /* istanbul ignore if */ + if (window.ontransitionend === undefined && + window.onwebkittransitionend !== undefined) { + transitionProp = 'WebkitTransition'; + transitionEndEvent = 'webkitTransitionEnd'; + } + if (window.onanimationend === undefined && + window.onwebkitanimationend !== undefined) { + animationProp = 'WebkitAnimation'; + animationEndEvent = 'webkitAnimationEnd'; + } +} + +var raf = (inBrowser && window.requestAnimationFrame) || setTimeout; +function nextFrame (fn) { + raf(function () { + raf(fn); + }); +} + +function addTransitionClass (el, cls) { + (el._transitionClasses || (el._transitionClasses = [])).push(cls); + addClass(el, cls); +} + +function removeTransitionClass (el, cls) { + if (el._transitionClasses) { + remove$1(el._transitionClasses, cls); + } + removeClass(el, cls); +} + +function whenTransitionEnds ( + el, + expectedType, + cb +) { + var ref = getTransitionInfo(el, expectedType); + var type = ref.type; + var timeout = ref.timeout; + var propCount = ref.propCount; + if (!type) { return cb() } + var event = type === TRANSITION ? transitionEndEvent : animationEndEvent; + var ended = 0; + var end = function () { + el.removeEventListener(event, onEnd); + cb(); + }; + var onEnd = function (e) { + if (e.target === el) { + if (++ended >= propCount) { + end(); + } + } + }; + setTimeout(function () { + if (ended < propCount) { + end(); + } + }, timeout + 1); + el.addEventListener(event, onEnd); +} + +var transformRE = /\b(transform|all)(,|$)/; + +function getTransitionInfo (el, expectedType) { + var styles = window.getComputedStyle(el); + var transitioneDelays = styles[transitionProp + 'Delay'].split(', '); + var transitionDurations = styles[transitionProp + 'Duration'].split(', '); + var transitionTimeout = getTimeout(transitioneDelays, transitionDurations); + var animationDelays = styles[animationProp + 'Delay'].split(', '); + var animationDurations = styles[animationProp + 'Duration'].split(', '); + var animationTimeout = getTimeout(animationDelays, animationDurations); + + var type; + var timeout = 0; + var propCount = 0; + /* istanbul ignore if */ + if (expectedType === TRANSITION) { + if (transitionTimeout > 0) { + type = TRANSITION; + timeout = transitionTimeout; + propCount = transitionDurations.length; + } + } else if (expectedType === ANIMATION) { + if (animationTimeout > 0) { + type = ANIMATION; + timeout = animationTimeout; + propCount = animationDurations.length; + } + } else { + timeout = Math.max(transitionTimeout, animationTimeout); + type = timeout > 0 + ? transitionTimeout > animationTimeout + ? TRANSITION + : ANIMATION + : null; + propCount = type + ? type === TRANSITION + ? transitionDurations.length + : animationDurations.length + : 0; + } + var hasTransform = + type === TRANSITION && + transformRE.test(styles[transitionProp + 'Property']); + return { + type: type, + timeout: timeout, + propCount: propCount, + hasTransform: hasTransform + } +} + +function getTimeout (delays, durations) { + return Math.max.apply(null, durations.map(function (d, i) { + return toMs(d) + toMs(delays[i]) + })) +} + +function toMs (s) { + return Number(s.slice(0, -1)) * 1000 +} + +/* */ + +function enter (vnode) { + var el = vnode.elm; + + // call leave callback now + if (el._leaveCb) { + el._leaveCb.cancelled = true; + el._leaveCb(); + } + + var data = resolveTransition(vnode.data.transition); + if (!data) { + return + } + + /* istanbul ignore if */ + if (el._enterCb || el.nodeType !== 1) { + return + } + + var css = data.css; + var type = data.type; + var enterClass = data.enterClass; + var enterActiveClass = data.enterActiveClass; + var appearClass = data.appearClass; + var appearActiveClass = data.appearActiveClass; + var beforeEnter = data.beforeEnter; + var enter = data.enter; + var afterEnter = data.afterEnter; + var enterCancelled = data.enterCancelled; + var beforeAppear = data.beforeAppear; + var appear = data.appear; + var afterAppear = data.afterAppear; + var appearCancelled = data.appearCancelled; + + // activeInstance will always be the component managing this + // transition. One edge case to check is when the is placed + // as the root node of a child component. In that case we need to check + // 's parent for appear check. + var transitionNode = activeInstance.$vnode; + var context = transitionNode && transitionNode.parent + ? transitionNode.parent.context + : activeInstance; + + var isAppear = !context._isMounted || !vnode.isRootInsert; + + if (isAppear && !appear && appear !== '') { + return + } + + var startClass = isAppear ? appearClass : enterClass; + var activeClass = isAppear ? appearActiveClass : enterActiveClass; + var beforeEnterHook = isAppear ? (beforeAppear || beforeEnter) : beforeEnter; + var enterHook = isAppear ? (typeof appear === 'function' ? appear : enter) : enter; + var afterEnterHook = isAppear ? (afterAppear || afterEnter) : afterEnter; + var enterCancelledHook = isAppear ? (appearCancelled || enterCancelled) : enterCancelled; + + var expectsCSS = css !== false && !isIE9; + var userWantsControl = + enterHook && + // enterHook may be a bound method which exposes + // the length of original fn as _length + (enterHook._length || enterHook.length) > 1; + + var cb = el._enterCb = once(function () { + if (expectsCSS) { + removeTransitionClass(el, activeClass); + } + if (cb.cancelled) { + if (expectsCSS) { + removeTransitionClass(el, startClass); + } + enterCancelledHook && enterCancelledHook(el); + } else { + afterEnterHook && afterEnterHook(el); + } + el._enterCb = null; + }); + + if (!vnode.data.show) { + // remove pending leave element on enter by injecting an insert hook + mergeVNodeHook(vnode.data.hook || (vnode.data.hook = {}), 'insert', function () { + var parent = el.parentNode; + var pendingNode = parent && parent._pending && parent._pending[vnode.key]; + if (pendingNode && pendingNode.tag === vnode.tag && pendingNode.elm._leaveCb) { + pendingNode.elm._leaveCb(); + } + enterHook && enterHook(el, cb); + }, 'transition-insert'); + } + + // start enter transition + beforeEnterHook && beforeEnterHook(el); + if (expectsCSS) { + addTransitionClass(el, startClass); + addTransitionClass(el, activeClass); + nextFrame(function () { + removeTransitionClass(el, startClass); + if (!cb.cancelled && !userWantsControl) { + whenTransitionEnds(el, type, cb); + } }); } - /** - * Debounce a function so it only gets called after the - * input stops arriving after the given wait period. - * - * @param {Function} func - * @param {Number} wait - * @return {Function} - the debounced function - */ - - function _debounce(func, wait) { - var timeout, args, context, timestamp, result; - var later = function later() { - var last = Date.now() - timestamp; - if (last < wait && last >= 0) { - timeout = setTimeout(later, wait - last); - } else { - timeout = null; - result = func.apply(context, args); - if (!timeout) context = args = null; - } - }; - return function () { - context = this; - args = arguments; - timestamp = Date.now(); - if (!timeout) { - timeout = setTimeout(later, wait); - } - return result; - }; + if (vnode.data.show) { + enterHook && enterHook(el, cb); } - /** - * Manual indexOf because it's slightly faster than - * native. - * - * @param {Array} arr - * @param {*} obj - */ + if (!expectsCSS && !userWantsControl) { + cb(); + } +} - function indexOf(arr, obj) { - var i = arr.length; - while (i--) { - if (arr[i] === obj) return i; +function leave (vnode, rm) { + var el = vnode.elm; + + // call enter callback now + if (el._enterCb) { + el._enterCb.cancelled = true; + el._enterCb(); + } + + var data = resolveTransition(vnode.data.transition); + if (!data) { + return rm() + } + + /* istanbul ignore if */ + if (el._leaveCb || el.nodeType !== 1) { + return + } + + var css = data.css; + var type = data.type; + var leaveClass = data.leaveClass; + var leaveActiveClass = data.leaveActiveClass; + var beforeLeave = data.beforeLeave; + var leave = data.leave; + var afterLeave = data.afterLeave; + var leaveCancelled = data.leaveCancelled; + var delayLeave = data.delayLeave; + + var expectsCSS = css !== false && !isIE9; + var userWantsControl = + leave && + // leave hook may be a bound method which exposes + // the length of original fn as _length + (leave._length || leave.length) > 1; + + var cb = el._leaveCb = once(function () { + if (el.parentNode && el.parentNode._pending) { + el.parentNode._pending[vnode.key] = null; } - return -1; - } - - /** - * Make a cancellable version of an async callback. - * - * @param {Function} fn - * @return {Function} - */ - - function cancellable(fn) { - var cb = function cb() { - if (!cb.cancelled) { - return fn.apply(this, arguments); + if (expectsCSS) { + removeTransitionClass(el, leaveActiveClass); + } + if (cb.cancelled) { + if (expectsCSS) { + removeTransitionClass(el, leaveClass); } - }; - cb.cancel = function () { - cb.cancelled = true; - }; - return cb; + leaveCancelled && leaveCancelled(el); + } else { + rm(); + afterLeave && afterLeave(el); + } + el._leaveCb = null; + }); + + if (delayLeave) { + delayLeave(performLeave); + } else { + performLeave(); } - /** - * Check if two values are loosely equal - that is, - * if they are plain objects, do they have the same shape? - * - * @param {*} a - * @param {*} b - * @return {Boolean} - */ - - function looseEqual(a, b) { - /* eslint-disable eqeqeq */ - return a == b || (isObject(a) && isObject(b) ? JSON.stringify(a) === JSON.stringify(b) : false); - /* eslint-enable eqeqeq */ + function performLeave () { + // the delayed leave may have already been cancelled + if (cb.cancelled) { + return + } + // record leaving element + if (!vnode.data.show) { + (el.parentNode._pending || (el.parentNode._pending = {}))[vnode.key] = vnode; + } + beforeLeave && beforeLeave(el); + if (expectsCSS) { + addTransitionClass(el, leaveClass); + addTransitionClass(el, leaveActiveClass); + nextFrame(function () { + removeTransitionClass(el, leaveClass); + if (!cb.cancelled && !userWantsControl) { + whenTransitionEnds(el, type, cb); + } + }); + } + leave && leave(el, cb); + if (!expectsCSS && !userWantsControl) { + cb(); + } } +} - var hasProto = ('__proto__' in {}); - - // Browser environment sniffing - var inBrowser = typeof window !== 'undefined' && Object.prototype.toString.call(window) !== '[object Object]'; - - // detect devtools - var devtools = inBrowser && window.__VUE_DEVTOOLS_GLOBAL_HOOK__; - - // UA sniffing for working around browser-specific quirks - var UA = inBrowser && window.navigator.userAgent.toLowerCase(); - var isIE = UA && UA.indexOf('trident') > 0; - var isIE9 = UA && UA.indexOf('msie 9.0') > 0; - var isAndroid = UA && UA.indexOf('android') > 0; - var isIos = UA && /(iphone|ipad|ipod|ios)/i.test(UA); - var iosVersionMatch = isIos && UA.match(/os ([\d_]+)/); - var iosVersion = iosVersionMatch && iosVersionMatch[1].split('_'); - - // detecting iOS UIWebView by indexedDB - var hasMutationObserverBug = iosVersion && Number(iosVersion[0]) >= 9 && Number(iosVersion[1]) >= 3 && !window.indexedDB; - - var transitionProp = undefined; - var transitionEndEvent = undefined; - var animationProp = undefined; - var animationEndEvent = undefined; - - // Transition property/event sniffing - if (inBrowser && !isIE9) { - var isWebkitTrans = window.ontransitionend === undefined && window.onwebkittransitionend !== undefined; - var isWebkitAnim = window.onanimationend === undefined && window.onwebkitanimationend !== undefined; - transitionProp = isWebkitTrans ? 'WebkitTransition' : 'transition'; - transitionEndEvent = isWebkitTrans ? 'webkitTransitionEnd' : 'transitionend'; - animationProp = isWebkitAnim ? 'WebkitAnimation' : 'animation'; - animationEndEvent = isWebkitAnim ? 'webkitAnimationEnd' : 'animationend'; +function resolveTransition (def$$1) { + if (!def$$1) { + return } + /* istanbul ignore else */ + if (typeof def$$1 === 'object') { + var res = {}; + if (def$$1.css !== false) { + extend(res, autoCssTransition(def$$1.name || 'v')); + } + extend(res, def$$1); + return res + } else if (typeof def$$1 === 'string') { + return autoCssTransition(def$$1) + } +} - /** - * Defer a task to execute it asynchronously. Ideally this - * should be executed as a microtask, so we leverage - * MutationObserver if it's available, and fallback to - * setTimeout(0). - * - * @param {Function} cb - * @param {Object} ctx - */ +var autoCssTransition = cached(function (name) { + return { + enterClass: (name + "-enter"), + leaveClass: (name + "-leave"), + appearClass: (name + "-enter"), + enterActiveClass: (name + "-enter-active"), + leaveActiveClass: (name + "-leave-active"), + appearActiveClass: (name + "-enter-active") + } +}); - var nextTick = (function () { - var callbacks = []; - var pending = false; - var timerFunc; - function nextTickHandler() { - pending = false; - var copies = callbacks.slice(0); - callbacks = []; - for (var i = 0; i < copies.length; i++) { - copies[i](); +function once (fn) { + var called = false; + return function () { + if (!called) { + called = true; + fn(); + } + } +} + +var transition = inBrowser ? { + create: function create (_, vnode) { + if (!vnode.data.show) { + enter(vnode); + } + }, + remove: function remove (vnode, rm) { + /* istanbul ignore else */ + if (!vnode.data.show) { + leave(vnode, rm); + } else { + rm(); + } + } +} : {}; + +var platformModules = [ + attrs, + klass, + events, + domProps, + style, + transition +]; + +/* */ + +// the directive module should be applied last, after all +// built-in modules have been applied. +var modules = platformModules.concat(baseModules); + +var patch$1 = createPatchFunction({ nodeOps: nodeOps, modules: modules }); + +/** + * Not type checking this file because flow doesn't like attaching + * properties to Elements. + */ + +var modelableTagRE = /^input|select|textarea|vue-component-[0-9]+(-[0-9a-zA-Z_\-]*)?$/; + +/* istanbul ignore if */ +if (isIE9) { + // http://www.matts411.com/post/internet-explorer-9-oninput/ + document.addEventListener('selectionchange', function () { + var el = document.activeElement; + if (el && el.vmodel) { + trigger(el, 'input'); + } + }); +} + +var model = { + inserted: function inserted (el, binding, vnode) { + { + if (!modelableTagRE.test(vnode.tag)) { + warn( + "v-model is not supported on element type: <" + (vnode.tag) + ">. " + + 'If you are working with contenteditable, it\'s recommended to ' + + 'wrap a library dedicated for that purpose inside a custom component.', + vnode.context + ); } } + if (vnode.tag === 'select') { + var cb = function () { + setSelected(el, binding, vnode.context); + }; + cb(); + /* istanbul ignore if */ + if (isIE || isEdge) { + setTimeout(cb, 0); + } + } else if ( + (vnode.tag === 'textarea' || el.type === 'text') && + !binding.modifiers.lazy + ) { + if (!isAndroid) { + el.addEventListener('compositionstart', onCompositionStart); + el.addEventListener('compositionend', onCompositionEnd); + } + /* istanbul ignore if */ + if (isIE9) { + el.vmodel = true; + } + } + }, + componentUpdated: function componentUpdated (el, binding, vnode) { + if (vnode.tag === 'select') { + setSelected(el, binding, vnode.context); + // in case the options rendered by v-for have changed, + // it's possible that the value is out-of-sync with the rendered options. + // detect such cases and filter out values that no longer has a matchig + // option in the DOM. + var needReset = el.multiple + ? binding.value.some(function (v) { return hasNoMatchingOption(v, el.options); }) + : binding.value !== binding.oldValue && hasNoMatchingOption(binding.value, el.options); + if (needReset) { + trigger(el, 'change'); + } + } + } +}; + +function setSelected (el, binding, vm) { + var value = binding.value; + var isMultiple = el.multiple; + if (isMultiple && !Array.isArray(value)) { + "development" !== 'production' && warn( + "', '']; - - map.thead = map.tbody = map.colgroup = map.caption = map.tfoot = [1, '', '
']; - - map.g = map.defs = map.symbol = map.use = map.image = map.text = map.circle = map.ellipse = map.line = map.path = map.polygon = map.polyline = map.rect = [1, '', '']; - - /** - * Check if a node is a supported template node with a - * DocumentFragment content. - * - * @param {Node} node - * @return {Boolean} - */ - - function isRealTemplate(node) { - return isTemplate(node) && isFragment(node.content); - } - - var tagRE$1 = /<([\w:-]+)/; - var entityRE = /&#?\w+?;/; - var commentRE = //g,"$1").replace(//g,"$1")),t.chars&&t.chars(n),""});f+=e.length-h.length,e=h,a("",d,f-v,f)}else{var m=e.indexOf("<");if(0===m){if(/^");if(g>=0){n(g+3);continue}}if(/^");if(y>=0){n(y+2);continue}}var _=e.match(Aa);if(_){n(_[0].length);continue}var b=e.match(ka);if(b){var $=f;n(b[0].length),a(b[0],b[1],$,f);continue}var w=r();if(w){i(w);continue}}var C=void 0;m>=0?(C=e.substring(0,m),n(m)):(C=e,e=""),t.chars&&t.chars(C)}if(e===o)throw new Error("Error parsing template:\n\n"+e)}a()}function tn(e){function t(){(o||(o=[])).push(e.slice(d,i).trim()),d=i+1}var n,r,i,a,o,s=!1,c=!1,u=0,l=0,f=0,d=0;for(i=0;io&&a.push(JSON.stringify(e.slice(o,i)));var s=tn(r[1].trim());a.push("_s("+s+")"),o=i+r[0].length}return o-1:_q("+t+","+r+")"),ln(e,"change","var $$a="+t+",$$el=$event.target,$$c=$$el.checked?("+r+"):("+i+");if(Array.isArray($$a)){var $$v="+n+",$$i=_i($$a,$$v);if($$c){$$i<0&&("+t+"=$$a.concat($$v))}else{$$i>-1&&("+t+"=$$a.slice(0,$$i).concat($$a.slice($$i+1)))}}else{"+t+"=$$c}",null,!0)}function cr(e,t){var n=fn(e,"value")||"null";sn(e,"checked","_q("+t+","+n+")"),ln(e,"change",t+"="+n,null,!0)}function ur(e,t,n){var r=e.attrsMap.type,i=n||{},a=i.lazy,o=i.number,s=i.trim,c=a||Nr&&"range"===r?"change":"input",u=!a&&"range"!==r,l="input"===e.tag||"textarea"===e.tag,f=l?"$event.target.value"+(s?".trim()":""):"$event",d=o||"number"===r?t+"=_n("+f+")":t+"="+f;l&&u&&(d="if($event.target.composing)return;"+d),sn(e,"value",l?"_s("+t+")":"("+t+")"),ln(e,c,d,null,!0)}function lr(e,t){var n=t+'=Array.prototype.filter.call($event.target.options,function(o){return o.selected}).map(function(o){return "_value" in o ? o._value : o.value})'+(null==e.attrsMap.multiple?"[0]":"");ln(e,"change",n,null,!0)}function fr(e,t){t.value&&sn(e,"textContent","_s("+t.value+")")}function dr(e,t){t.value&&sn(e,"innerHTML","_s("+t.value+")")}function pr(e,t){return t=t?u(u({},Co),t):Co,tr(e,t)}function vr(e,t,n){var r=(t&&t.warn||li,t&&t.delimiters?String(t.delimiters)+e:e);if(wo[r])return wo[r];var i={},a=pr(e,t);i.render=hr(a.render);var o=a.staticRenderFns.length;i.staticRenderFns=new Array(o);for(var s=0;s0,Mr=Lr&&Lr.indexOf("edge/")>0,Pr=Lr&&Lr.indexOf("android")>0,Rr=Lr&&/iphone|ipad|ipod|ios/.test(Lr),Ir=jr&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__,Br=function(){function e(){r=!1;var e=n.slice(0);n.length=0;for(var t=0;t\/=]+)/,ya=/(?:=)/,_a=[/"([^"]*)"+/.source,/'([^']*)'+/.source,/([^\s"'=<>`]+)/.source],ba=new RegExp("^\\s*"+ga.source+"(?:\\s*("+ya.source+")\\s*(?:"+_a.join("|")+"))?"),$a="[a-zA-Z_][\\w\\-\\.]*",wa="((?:"+$a+"\\:)?"+$a+")",Ca=new RegExp("^<"+wa),xa=/^\s*(\/?)>/,ka=new RegExp("^<\\/"+wa+"[^>]*>"),Aa=/^]+>/i,Oa=!1;"x".replace(/x(.)?/g,function(e,t){Oa=""===t});var Ta,Sa,Ea,ja,La,Na,Da,Ma,Pa,Ra,Ia,Ba,Fa,Ha,Ua,za,Va,Ja=n("script,style",!0),qa={},Ka=/</g,Wa=/>/g,Za=/ /g,Ga=/&/g,Ya=/"/g,Qa=/\{\{((?:.|\n)+?)\}\}/g,Xa=/[-.*+?^${}()|[\]\/\\]/g,eo=o(function(e){var t=e[0].replace(Xa,"\\$&"),n=e[1].replace(Xa,"\\$&");return new RegExp(t+"((?:.|\\n)+?)"+n,"g")}),to=/^v-|^@|^:/,no=/(.*?)\s+(?:in|of)\s+(.*)/,ro=/\(([^,]*),([^,]*)(?:,([^,]*))?\)/,io=/^:|^v-bind:/,ao=/^@|^v-on:/,oo=/:(.*)$/,so=/\.[^\.]+/g,co=/\u2028|\u2029/g,uo=o(Qt),lo=/^xmlns:NS\d+/,fo=/^NS\d+:/,po=o(Ln),vo=/^\s*[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*|\['.*?'\]|\[".*?"\]|\[\d+\]|\[[A-Za-z_$][\w$]*\])*\s*$/,ho={esc:27,tab:9,enter:13,space:32,up:38,left:37,right:39,down:40,delete:[8,46]},mo={stop:"$event.stopPropagation();",prevent:"$event.preventDefault();",self:"if($event.target !== $event.currentTarget)return;"},go={bind:Hn,cloak:p},yo=(new RegExp("\\b"+"do,if,for,let,new,try,var,case,else,with,await,break,catch,class,const,super,throw,while,yield,delete,export,import,return,switch,default,extends,finally,continue,debugger,function,arguments".split(",").join("\\b|\\b")+"\\b"),{staticKeys:["staticClass"],transformNode:nr,genData:rr}),_o={transformNode:ir,genData:ar},bo=[yo,_o],$o={model:or,text:fr,html:dr},wo=Object.create(null),Co={isIE:Nr,expectHTML:!0,modules:bo,staticKeys:v(bo),directives:$o,isReservedTag:ji,isUnaryTag:Ai,mustUseProp:gi,getTagNamespace:qe,isPreTag:Ei},xo=o(function(e){var t=We(e);return t&&t.innerHTML}),ko=Ce.prototype.$mount;return Ce.prototype.$mount=function(e,t){if(e=e&&We(e),e===document.body||e===document.documentElement)return this;var n=this.$options;if(!n.render){var r=n.template;if(r)if("string"==typeof r)"#"===r.charAt(0)&&(r=xo(r));else{if(!r.nodeType)return this;r=r.innerHTML}else e&&(r=mr(e));if(r){var i=vr(r,{warn:li,shouldDecodeNewlines:ha,delimiters:n.delimiters},this),a=i.render,o=i.staticRenderFns;n.render=a,n.staticRenderFns=o}}return ko.call(this,e,t)},Ce.compile=vr,Ce}); \ No newline at end of file From 99b421da2c5b2d889cd1e2ec6a5c60899bfe3593 Mon Sep 17 00:00:00 2001 From: Fatih Acet Date: Thu, 3 Nov 2016 03:37:33 +0300 Subject: [PATCH 06/31] Migrate Vue v1 to v2. --- app/assets/javascripts/boards/boards_bundle.js.es6 | 4 ++-- .../javascripts/boards/components/board.js.es6 | 5 +++-- .../boards/components/board_list.js.es6 | 14 +++++++------- .../boards/components/board_new_issue.js.es6 | 6 +++--- .../boards/components/board_sidebar.js.es6 | 2 +- app/assets/javascripts/boards/models/list.js.es6 | 3 ++- .../components/comment_resolve_btn.js.es6 | 2 +- .../diff_notes/components/resolve_btn.js.es6 | 6 +++--- .../components/diff_file_editor.js.es6 | 2 +- 9 files changed, 23 insertions(+), 21 deletions(-) diff --git a/app/assets/javascripts/boards/boards_bundle.js.es6 b/app/assets/javascripts/boards/boards_bundle.js.es6 index efb22d38513..0d26ebcb785 100644 --- a/app/assets/javascripts/boards/boards_bundle.js.es6 +++ b/app/assets/javascripts/boards/boards_bundle.js.es6 @@ -37,7 +37,7 @@ $(() => { issueLinkBase: $boardApp.dataset.issueLinkBase, detailIssue: Store.detail }, - init: Store.create.bind(Store), + beforeCreate: Store.create.bind(Store), computed: { detailIssueVisible () { return Object.keys(this.detailIssue.issue).length; @@ -46,7 +46,7 @@ $(() => { created () { gl.boardService = new BoardService(this.endpoint, this.boardId); }, - ready () { + mounted () { Store.disabled = this.disabled; gl.boardService.all() .then((resp) => { diff --git a/app/assets/javascripts/boards/components/board.js.es6 b/app/assets/javascripts/boards/components/board.js.es6 index 0e03d43872b..e70bf4e5851 100644 --- a/app/assets/javascripts/boards/components/board.js.es6 +++ b/app/assets/javascripts/boards/components/board.js.es6 @@ -61,7 +61,7 @@ this.showIssueForm = !this.showIssueForm; } }, - ready () { + mounted () { const options = gl.issueBoards.getBoardSortableDefaultOptions({ disabled: this.disabled, group: 'boards', @@ -88,7 +88,8 @@ this.sortable = Sortable.create(this.$el.parentNode, options); }, beforeDestroy () { - Store.state.lists.$remove(this.list); + const index = Store.state.lists.indexOf(this.list); + Store.state.lists.splice(index, 1); } }); })(); diff --git a/app/assets/javascripts/boards/components/board_list.js.es6 b/app/assets/javascripts/boards/components/board_list.js.es6 index 34fc7694241..2ff986dc07b 100644 --- a/app/assets/javascripts/boards/components/board_list.js.es6 +++ b/app/assets/javascripts/boards/components/board_list.js.es6 @@ -32,7 +32,7 @@ filters: { handler () { this.list.loadingMore = false; - this.$els.list.scrollTop = 0; + this.$refs.list.scrollTop = 0; }, deep: true }, @@ -53,13 +53,13 @@ }, methods: { listHeight () { - return this.$els.list.getBoundingClientRect().height; + return this.$refs.list.getBoundingClientRect().height; }, scrollHeight () { - return this.$els.list.scrollHeight; + return this.$refs.list.scrollHeight; }, scrollTop () { - return this.$els.list.scrollTop + this.listHeight(); + return this.$refs.list.scrollTop + this.listHeight(); }, loadNextPage () { const getIssues = this.list.nextPage(); @@ -72,7 +72,7 @@ } }, }, - ready () { + mounted () { const options = gl.issueBoards.getBoardSortableDefaultOptions({ group: 'issues', sort: false, @@ -94,10 +94,10 @@ } }); - this.sortable = Sortable.create(this.$els.list, options); + this.sortable = Sortable.create(this.$refs.list, options); // Scroll event on list to load more - this.$els.list.onscroll = () => { + this.$refs.list.onscroll = () => { if ((this.scrollTop() > this.scrollHeight() - this.scrollOffset) && !this.list.loadingMore) { this.loadNextPage(); } diff --git a/app/assets/javascripts/boards/components/board_new_issue.js.es6 b/app/assets/javascripts/boards/components/board_new_issue.js.es6 index 7fc0bfd56f3..a5f0938019a 100644 --- a/app/assets/javascripts/boards/components/board_new_issue.js.es6 +++ b/app/assets/javascripts/boards/components/board_new_issue.js.es6 @@ -17,7 +17,7 @@ }, watch: { showIssueForm () { - this.$els.input.focus(); + this.$refs.input.focus(); } }, methods: { @@ -37,13 +37,13 @@ this.list.newIssue(issue) .then((data) => { // Need this because our jQuery very kindly disables buttons on ALL form submissions - $(this.$els.submitButton).enable(); + $(this.$refs.submitButton).enable(); Store.detail.issue = issue; }) .catch(() => { // Need this because our jQuery very kindly disables buttons on ALL form submissions - $(this.$els.submitButton).enable(); + $(this.$refs.submitButton).enable(); // Remove the issue this.list.removeIssue(issue); diff --git a/app/assets/javascripts/boards/components/board_sidebar.js.es6 b/app/assets/javascripts/boards/components/board_sidebar.js.es6 index 4928320d015..d5cb6164e0b 100644 --- a/app/assets/javascripts/boards/components/board_sidebar.js.es6 +++ b/app/assets/javascripts/boards/components/board_sidebar.js.es6 @@ -41,7 +41,7 @@ this.detail.issue = {}; } }, - ready () { + mounted () { new IssuableContext(this.currentUser); new MilestoneSelect(); new gl.DueDateSelectors(); diff --git a/app/assets/javascripts/boards/models/list.js.es6 b/app/assets/javascripts/boards/models/list.js.es6 index b331a26fed5..8a7dc67409e 100644 --- a/app/assets/javascripts/boards/models/list.js.es6 +++ b/app/assets/javascripts/boards/models/list.js.es6 @@ -42,7 +42,8 @@ class List { } destroy () { - gl.issueBoards.BoardsStore.state.lists.$remove(this); + const index = gl.issueBoards.BoardsStore.state.lists.indexOf(this); + gl.issueBoards.BoardsStore.state.lists.splice(index, 1); gl.issueBoards.BoardsStore.updateNewListDropdown(this.id); gl.boardService.destroyList(this.id); diff --git a/app/assets/javascripts/diff_notes/components/comment_resolve_btn.js.es6 b/app/assets/javascripts/diff_notes/components/comment_resolve_btn.js.es6 index 29a12a2395b..bd5d8f24593 100644 --- a/app/assets/javascripts/diff_notes/components/comment_resolve_btn.js.es6 +++ b/app/assets/javascripts/diff_notes/components/comment_resolve_btn.js.es6 @@ -35,7 +35,7 @@ } } }, - ready: function () { + mounted: function () { const $textarea = $(`#new-discussion-note-form-${this.discussionId} .note-textarea`); this.textareaIsEmpty = $textarea.val() === ''; diff --git a/app/assets/javascripts/diff_notes/components/resolve_btn.js.es6 b/app/assets/javascripts/diff_notes/components/resolve_btn.js.es6 index bcc052c7c8c..3db0b4319b1 100644 --- a/app/assets/javascripts/diff_notes/components/resolve_btn.js.es6 +++ b/app/assets/javascripts/diff_notes/components/resolve_btn.js.es6 @@ -54,7 +54,7 @@ }, methods: { updateTooltip: function () { - $(this.$els.button) + $(this.$refs.button) .tooltip('hide') .tooltip('fixTitle'); }, @@ -89,8 +89,8 @@ }); } }, - compiled: function () { - $(this.$els.button).tooltip({ + mounted: function () { + $(this.$refs.button).tooltip({ container: 'body' }); }, diff --git a/app/assets/javascripts/merge_conflicts/components/diff_file_editor.js.es6 b/app/assets/javascripts/merge_conflicts/components/diff_file_editor.js.es6 index 6da3942ea52..9e4ffd07dbd 100644 --- a/app/assets/javascripts/merge_conflicts/components/diff_file_editor.js.es6 +++ b/app/assets/javascripts/merge_conflicts/components/diff_file_editor.js.es6 @@ -36,7 +36,7 @@ this.loadEditor(); } }, - ready() { + mounted() { if (this.file.loadEditor) { this.loadEditor(); } From 78c7c11dda5a90e3440e822bed80e7b76bea9065 Mon Sep 17 00:00:00 2001 From: Fatih Acet Date: Thu, 3 Nov 2016 04:06:00 +0300 Subject: [PATCH 07/31] VueJS migration, replace {{{ with v-html --- .../conflicts/components/_inline_conflict_lines.html.haml | 5 ++--- .../conflicts/components/_parallel_conflict_line.html.haml | 3 +-- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/app/views/projects/merge_requests/conflicts/components/_inline_conflict_lines.html.haml b/app/views/projects/merge_requests/conflicts/components/_inline_conflict_lines.html.haml index f094df7fcaa..d35c7bee163 100644 --- a/app/views/projects/merge_requests/conflicts/components/_inline_conflict_lines.html.haml +++ b/app/views/projects/merge_requests/conflicts/components/_inline_conflict_lines.html.haml @@ -5,11 +5,10 @@ %a {{line.new_line}} %td.diff-line-num.old_line{":class" => "lineCssClass(line)", "v-if" => "!line.isHeader"} %a {{line.old_line}} - %td.line_content{":class" => "lineCssClass(line)", "v-if" => "!line.isHeader"} - {{{line.richText}}} + %td.line_content{":class" => "lineCssClass(line)", "v-if" => "!line.isHeader", "v-html" => "line.richText"} %td.diff-line-num.header{":class" => "lineCssClass(line)", "v-if" => "line.isHeader"} %td.diff-line-num.header{":class" => "lineCssClass(line)", "v-if" => "line.isHeader"} %td.line_content.header{":class" => "lineCssClass(line)", "v-if" => "line.isHeader"} - %strong {{{line.richText}}} + %strong{"v-html" => "line.richText"} %button.btn{ "@click" => "handleSelected(file, line.id, line.section)" } {{line.buttonTitle}} diff --git a/app/views/projects/merge_requests/conflicts/components/_parallel_conflict_line.html.haml b/app/views/projects/merge_requests/conflicts/components/_parallel_conflict_line.html.haml index 5690bf7419c..7d0ab2043d9 100644 --- a/app/views/projects/merge_requests/conflicts/components/_parallel_conflict_line.html.haml +++ b/app/views/projects/merge_requests/conflicts/components/_parallel_conflict_line.html.haml @@ -6,5 +6,4 @@ {{line.buttonTitle}} %td.diff-line-num.old_line{":class" => "lineCssClass(line)", "v-if" => "!line.isHeader"} {{line.lineNumber}} - %td.line_content.parallel{":class" => "lineCssClass(line)", "v-if" => "!line.isHeader"} - {{{line.richText}}} + %td.line_content.parallel{":class" => "lineCssClass(line)", "v-if" => "!line.isHeader", "v-html" => "line.richText"} From 0eb21fd840378d54967fad055cafd1a1a6ecf55d Mon Sep 17 00:00:00 2001 From: Fatih Acet Date: Thu, 3 Nov 2016 04:06:25 +0300 Subject: [PATCH 08/31] Vue migration fix syntax highlighting. --- .../javascripts/merge_conflicts/merge_conflicts_bundle.js.es6 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/javascripts/merge_conflicts/merge_conflicts_bundle.js.es6 b/app/assets/javascripts/merge_conflicts/merge_conflicts_bundle.js.es6 index 222a5dcfc2e..03a642d7ff2 100644 --- a/app/assets/javascripts/merge_conflicts/merge_conflicts_bundle.js.es6 +++ b/app/assets/javascripts/merge_conflicts/merge_conflicts_bundle.js.es6 @@ -49,7 +49,7 @@ $(() => { mergeConflictsStore.setLoadingState(false); this.$nextTick(() => { - $(conflictsEl.querySelectorAll('.js-syntax-highlight')).syntaxHighlight(); + $('.js-syntax-highlight').syntaxHighlight(); }); }); }, From a1fc04dfad84822d0e26e60ac109f83d42d5403a Mon Sep 17 00:00:00 2001 From: Fatih Acet Date: Thu, 3 Nov 2016 15:53:54 +0300 Subject: [PATCH 09/31] VueJSMigration: Remove parallel-conflict-line component. It's because Vue says: "Component template should contain exactly one root element". --- .../components/parallel_conflict_line.js.es6 | 15 --------------- .../components/parallel_conflict_lines.js.es6 | 5 +---- .../components/_parallel_conflict_lines.html.haml | 11 ++++++++++- 3 files changed, 11 insertions(+), 20 deletions(-) delete mode 100644 app/assets/javascripts/merge_conflicts/components/parallel_conflict_line.js.es6 diff --git a/app/assets/javascripts/merge_conflicts/components/parallel_conflict_line.js.es6 b/app/assets/javascripts/merge_conflicts/components/parallel_conflict_line.js.es6 deleted file mode 100644 index 797850262cc..00000000000 --- a/app/assets/javascripts/merge_conflicts/components/parallel_conflict_line.js.es6 +++ /dev/null @@ -1,15 +0,0 @@ -/* eslint-disable */ -((global) => { - - global.mergeConflicts = global.mergeConflicts || {}; - - global.mergeConflicts.parallelConflictLine = Vue.extend({ - props: { - file: Object, - line: Object - }, - mixins: [global.mergeConflicts.utils, global.mergeConflicts.actions], - template: '#parallel-conflict-line' - }); - -})(window.gl || (window.gl = {})); diff --git a/app/assets/javascripts/merge_conflicts/components/parallel_conflict_lines.js.es6 b/app/assets/javascripts/merge_conflicts/components/parallel_conflict_lines.js.es6 index 1b3e9901f1e..083a836f92f 100644 --- a/app/assets/javascripts/merge_conflicts/components/parallel_conflict_lines.js.es6 +++ b/app/assets/javascripts/merge_conflicts/components/parallel_conflict_lines.js.es6 @@ -7,10 +7,7 @@ props: { file: Object }, - mixins: [global.mergeConflicts.utils], - components: { - 'parallel-conflict-line': gl.mergeConflicts.parallelConflictLine - } + mixins: [global.mergeConflicts.utils, global.mergeConflicts.actions] }); })(window.gl || (window.gl = {})); diff --git a/app/views/projects/merge_requests/conflicts/components/_parallel_conflict_lines.html.haml b/app/views/projects/merge_requests/conflicts/components/_parallel_conflict_lines.html.haml index a8ecdf59393..0fd7095683c 100644 --- a/app/views/projects/merge_requests/conflicts/components/_parallel_conflict_lines.html.haml +++ b/app/views/projects/merge_requests/conflicts/components/_parallel_conflict_lines.html.haml @@ -1,4 +1,13 @@ %parallel-conflict-lines{"inline-template" => "true", ":file" => "file"} %table %tr.line_holder.parallel{"v-for" => "section in file.parallelLines"} - %td{"is"=>"parallel-conflict-line", "v-for" => "line in section", ":line" => "line", ":file" => "file"} + %template{"is"=>"parallel-conflict-line", "v-for" => "line in section", ":line" => "line", ":file" => "file"} + %td.diff-line-num.header{":class" => "lineCssClass(line)", "v-if" => "line.isHeader"} + %td.line_content.header{":class" => "lineCssClass(line)", "v-if" => "line.isHeader"} + %strong {{line.richText}} + %button.btn{"@click" => "handleSelected(file, line.id, line.section)"} + {{line.buttonTitle}} + %td.diff-line-num.old_line{":class" => "lineCssClass(line)", "v-if" => "!line.isHeader"} + {{line.lineNumber}} + %td.line_content.parallel{":class" => "lineCssClass(line)", "v-if" => "!line.isHeader", "v-html" => "line.richText"} + From 1505fc3ac5a596966773abd886fb98c096322803 Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Fri, 4 Nov 2016 10:24:59 +0000 Subject: [PATCH 10/31] Refactor of issue boards to work with Vue2 --- .../javascripts/boards/boards_bundle.js.es6 | 8 +- .../boards/components/board.js.es6 | 14 +-- .../boards/components/board_card.js.es6 | 6 +- .../boards/components/board_list.js.es6 | 22 +++- .../boards/components/board_new_issue.js.es6 | 14 +-- .../components/new_list_dropdown.js.es6 | 97 ++++++++------- .../mixins/sortable_default_options.js.es6 | 2 +- .../boards/stores/boards_store.js.es6 | 2 + app/assets/stylesheets/pages/boards.scss | 8 +- app/views/projects/boards/_show.html.haml | 28 +++++ .../boards/components/_blank_state.html.haml | 2 +- .../boards/components/_board.html.haml | 112 ++++++------------ .../boards/components/_board_list.html.haml | 44 +++++++ .../boards/components/_card.html.haml | 62 ++++------ app/views/projects/boards/index.html.haml | 19 +-- app/views/projects/boards/show.html.haml | 19 +-- 16 files changed, 225 insertions(+), 234 deletions(-) create mode 100644 app/views/projects/boards/_show.html.haml create mode 100644 app/views/projects/boards/components/_board_list.html.haml diff --git a/app/assets/javascripts/boards/boards_bundle.js.es6 b/app/assets/javascripts/boards/boards_bundle.js.es6 index 0d26ebcb785..8ca7e13bb50 100644 --- a/app/assets/javascripts/boards/boards_bundle.js.es6 +++ b/app/assets/javascripts/boards/boards_bundle.js.es6 @@ -22,6 +22,8 @@ $(() => { gl.IssueBoardsApp.$destroy(true); } + Store.create(); + gl.IssueBoardsApp = new Vue({ el: $boardApp, components: { @@ -37,11 +39,10 @@ $(() => { issueLinkBase: $boardApp.dataset.issueLinkBase, detailIssue: Store.detail }, - beforeCreate: Store.create.bind(Store), computed: { detailIssueVisible () { return Object.keys(this.detailIssue.issue).length; - } + }, }, created () { gl.boardService = new BoardService(this.endpoint, this.boardId); @@ -70,6 +71,9 @@ $(() => { el: '#js-boards-seach', data: { filters: Store.state.filters + }, + mounted () { + gl.issueBoards.newListDropdownInit(); } }); }); diff --git a/app/assets/javascripts/boards/components/board.js.es6 b/app/assets/javascripts/boards/components/board.js.es6 index e70bf4e5851..31de3b25284 100644 --- a/app/assets/javascripts/boards/components/board.js.es6 +++ b/app/assets/javascripts/boards/components/board.js.es6 @@ -10,6 +10,7 @@ window.gl.issueBoards = window.gl.issueBoards || {}; gl.issueBoards.Board = Vue.extend({ + template: '#js-board-template', components: { 'board-list': gl.issueBoards.BoardList, 'board-delete': gl.issueBoards.BoardDelete, @@ -24,7 +25,6 @@ return { detailIssue: Store.detail, filters: Store.state.filters, - showIssueForm: false }; }, watch: { @@ -58,7 +58,7 @@ }, methods: { showNewIssueForm() { - this.showIssueForm = !this.showIssueForm; + this.$refs['board-list'].showIssueForm = !this.$refs['board-list'].showIssueForm; } }, mounted () { @@ -72,13 +72,9 @@ if (e.newIndex !== undefined && e.oldIndex !== e.newIndex) { const order = this.sortable.toArray(), - $board = this.$parent.$refs.board[e.oldIndex + 1], - list = $board.list; - - $board.$destroy(true); + list = Store.findList('id', parseInt(e.item.dataset.id)); this.$nextTick(() => { - Store.state.lists.splice(e.newIndex, 0, list); Store.moveList(list, order); }); } @@ -87,9 +83,5 @@ this.sortable = Sortable.create(this.$el.parentNode, options); }, - beforeDestroy () { - const index = Store.state.lists.indexOf(this.list); - Store.state.lists.splice(index, 1); - } }); })(); diff --git a/app/assets/javascripts/boards/components/board_card.js.es6 b/app/assets/javascripts/boards/components/board_card.js.es6 index 2f6c03e3538..b1afbe7d97e 100644 --- a/app/assets/javascripts/boards/components/board_card.js.es6 +++ b/app/assets/javascripts/boards/components/board_card.js.es6 @@ -6,6 +6,7 @@ window.gl.issueBoards = window.gl.issueBoards || {}; gl.issueBoards.BoardCard = Vue.extend({ + template: '#js-board-list-card', props: { list: Object, issue: Object, @@ -53,11 +54,6 @@ mouseDown () { this.showDetail = true; }, - mouseMove () { - if (this.showDetail) { - this.showDetail = false; - } - }, showIssue (e) { const targetTagName = e.target.tagName.toLowerCase(); diff --git a/app/assets/javascripts/boards/components/board_list.js.es6 b/app/assets/javascripts/boards/components/board_list.js.es6 index 2ff986dc07b..379f4f0d72b 100644 --- a/app/assets/javascripts/boards/components/board_list.js.es6 +++ b/app/assets/javascripts/boards/components/board_list.js.es6 @@ -9,6 +9,7 @@ window.gl.issueBoards = window.gl.issueBoards || {}; gl.issueBoards.BoardList = Vue.extend({ + template: '#js-board-list-template', components: { 'board-card': gl.issueBoards.BoardCard, 'board-new-issue': gl.issueBoards.BoardNewIssue @@ -19,13 +20,13 @@ issues: Array, loading: Boolean, issueLinkBase: String, - showIssueForm: Boolean }, data () { return { scrollOffset: 250, filters: Store.state.filters, - showCount: false + showCount: false, + showIssueForm: false }; }, watch: { @@ -51,6 +52,11 @@ }); } }, + computed: { + orderedIssues () { + return _.sortBy(this.issues, 'priority'); + }, + }, methods: { listHeight () { return this.$refs.list.getBoundingClientRect().height; @@ -81,17 +87,21 @@ onStart: (e) => { const card = this.$refs.issue[e.oldIndex]; + card.showDetail = false; Store.moving.issue = card.issue; Store.moving.list = card.list; gl.issueBoards.onStart(); }, onAdd: (e) => { - gl.issueBoards.BoardsStore.moveIssueToList(Store.moving.list, this.list, Store.moving.issue); + // Add the element back to original list to allow Vue to handle DOM updates + e.from.appendChild(e.item); + + this.$nextTick(() => { + // Update the issues once we know the element has been moved + gl.issueBoards.BoardsStore.moveIssueToList(Store.moving.list, this.list, Store.moving.issue); + }); }, - onRemove: (e) => { - this.$refs.issue[e.oldIndex].$destroy(true); - } }); this.sortable = Sortable.create(this.$refs.list, options); diff --git a/app/assets/javascripts/boards/components/board_new_issue.js.es6 b/app/assets/javascripts/boards/components/board_new_issue.js.es6 index a5f0938019a..a7989a2ff4c 100644 --- a/app/assets/javascripts/boards/components/board_new_issue.js.es6 +++ b/app/assets/javascripts/boards/components/board_new_issue.js.es6 @@ -7,7 +7,6 @@ gl.issueBoards.BoardNewIssue = Vue.extend({ props: { list: Object, - showIssueForm: Boolean }, data() { return { @@ -15,11 +14,6 @@ error: false }; }, - watch: { - showIssueForm () { - this.$refs.input.focus(); - } - }, methods: { submit(e) { e.preventDefault(); @@ -50,15 +44,17 @@ // Show error message this.error = true; - this.showIssueForm = true; }); this.cancel(); }, cancel() { - this.showIssueForm = false; this.title = ''; + this.$parent.showIssueForm = false; } - } + }, + mounted() { + this.$refs.input.focus(); + }, }); })(); diff --git a/app/assets/javascripts/boards/components/new_list_dropdown.js.es6 b/app/assets/javascripts/boards/components/new_list_dropdown.js.es6 index 14f618fd5d5..9f71b9abdab 100644 --- a/app/assets/javascripts/boards/components/new_list_dropdown.js.es6 +++ b/app/assets/javascripts/boards/components/new_list_dropdown.js.es6 @@ -1,5 +1,8 @@ /* eslint-disable */ -$(() => { +(() => { + window.gl = window.gl || {}; + window.gl.issueBoards = window.gl.issueBoards || {}; + const Store = gl.issueBoards.BoardsStore; $(document).off('created.label').on('created.label', (e, label) => { @@ -15,54 +18,56 @@ $(() => { }); }); - $('.js-new-board-list').each(function () { - const $this = $(this); - new gl.CreateLabelDropdown($this.closest('.dropdown').find('.dropdown-new-label'), $this.data('namespace-path'), $this.data('project-path')); + gl.issueBoards.newListDropdownInit = () => { + $('.js-new-board-list').each(function () { + const $this = $(this); + new gl.CreateLabelDropdown($this.closest('.dropdown').find('.dropdown-new-label'), $this.data('namespace-path'), $this.data('project-path')); - $this.glDropdown({ - data(term, callback) { - $.get($this.attr('data-labels')) - .then((resp) => { - callback(resp); - }); - }, - renderRow (label) { - const active = Store.findList('title', label.title), - $li = $('

  • '), - $a = $('', { - class: (active ? `is-active js-board-list-${active.id}` : ''), - text: label.title, - href: '#' - }), - $labelColor = $('', { - class: 'dropdown-label-box', - style: `background-color: ${label.color}` - }); + $this.glDropdown({ + data(term, callback) { + $.get($this.attr('data-labels')) + .then((resp) => { + callback(resp); + }); + }, + renderRow (label) { + const active = Store.findList('title', label.title), + $li = $('
  • '), + $a = $('', { + class: (active ? `is-active js-board-list-${active.id}` : ''), + text: label.title, + href: '#' + }), + $labelColor = $('', { + class: 'dropdown-label-box', + style: `background-color: ${label.color}` + }); - return $li.append($a.prepend($labelColor)); - }, - search: { - fields: ['title'] - }, - filterable: true, - selectable: true, - multiSelect: true, - clicked (label, $el, e) { - e.preventDefault(); + return $li.append($a.prepend($labelColor)); + }, + search: { + fields: ['title'] + }, + filterable: true, + selectable: true, + multiSelect: true, + clicked (label, $el, e) { + e.preventDefault(); - if (!Store.findList('title', label.title)) { - Store.new({ - title: label.title, - position: Store.state.lists.length - 2, - list_type: 'label', - label: { - id: label.id, + if (!Store.findList('title', label.title)) { + Store.new({ title: label.title, - color: label.color - } - }); + position: Store.state.lists.length - 2, + list_type: 'label', + label: { + id: label.id, + title: label.title, + color: label.color + } + }); + } } - } + }); }); - }); -}); + }; +})(); diff --git a/app/assets/javascripts/boards/mixins/sortable_default_options.js.es6 b/app/assets/javascripts/boards/mixins/sortable_default_options.js.es6 index db9a5a8e40a..5f99de39122 100644 --- a/app/assets/javascripts/boards/mixins/sortable_default_options.js.es6 +++ b/app/assets/javascripts/boards/mixins/sortable_default_options.js.es6 @@ -23,7 +23,7 @@ fallbackOnBody: true, ghostClass: 'is-ghost', filter: '.board-delete, .btn', - delay: gl.issueBoards.touchEnabled ? 100 : 50, + delay: gl.issueBoards.touchEnabled ? 100 : 0, scrollSensitivity: gl.issueBoards.touchEnabled ? 60 : 100, scrollSpeed: 20, onStart: gl.issueBoards.onStart, diff --git a/app/assets/javascripts/boards/stores/boards_store.js.es6 b/app/assets/javascripts/boards/stores/boards_store.js.es6 index 175e034afed..1d5071657b7 100644 --- a/app/assets/javascripts/boards/stores/boards_store.js.es6 +++ b/app/assets/javascripts/boards/stores/boards_store.js.es6 @@ -39,6 +39,8 @@ // Remove any new issues from the backlog // as they will be visible in the new list list.issues.forEach(backlogList.removeIssue.bind(backlogList)); + + this.state.lists = _.sortBy(this.state.lists, 'position'); }); this.removeBlankState(); }, diff --git a/app/assets/stylesheets/pages/boards.scss b/app/assets/stylesheets/pages/boards.scss index 47a7e84b5c6..4f5753f6fc6 100644 --- a/app/assets/stylesheets/pages/boards.scss +++ b/app/assets/stylesheets/pages/boards.scss @@ -166,8 +166,12 @@ } } -.board-list { +.board-list-component { height: calc(100% - 49px); +} + +.board-list { + height: 100%; margin-bottom: 0; padding: 5px; list-style: none; @@ -175,7 +179,7 @@ overflow-x: hidden; &.is-smaller { - height: calc(100% - 185px); + height: calc(100% - 136px); } } diff --git a/app/views/projects/boards/_show.html.haml b/app/views/projects/boards/_show.html.haml new file mode 100644 index 00000000000..356bd50f7f3 --- /dev/null +++ b/app/views/projects/boards/_show.html.haml @@ -0,0 +1,28 @@ +- @no_container = true +- @content_class = "issue-boards-content" +- page_title "Boards" + +- content_for :page_specific_javascripts do + = page_specific_javascript_tag('boards/boards_bundle.js') + = page_specific_javascript_tag('boards/test_utils/simulate_drag.js') if Rails.env.test? + + %script#js-board-template{ type: "text/x-template" }= render "projects/boards/components/board" + %script#js-board-list-template{ type: "text/x-template" }= render "projects/boards/components/board_list" + %script#js-board-list-card{ type: "text/x-template" }= render "projects/boards/components/card" + += render "projects/issues/head" + += render 'shared/issuable/filter', type: :boards + +#board-app.boards-app{ "v-cloak" => true, data: board_data } + .boards-list{ ":class" => "{ 'is-compact': detailIssueVisible }" } + .boards-app-loading.text-center{ "v-if" => "loading" } + = icon("spinner spin") + %board{ "v-cloak" => true, + "v-for" => "list in state.lists", + "ref" => "board", + ":list" => "list", + ":disabled" => "disabled", + ":issue-link-base" => "issueLinkBase", + ":key" => "_uid" } + = render "projects/boards/components/sidebar" diff --git a/app/views/projects/boards/components/_blank_state.html.haml b/app/views/projects/boards/components/_blank_state.html.haml index 97eb952eff1..0af40ddf8fe 100644 --- a/app/views/projects/boards/components/_blank_state.html.haml +++ b/app/views/projects/boards/components/_blank_state.html.haml @@ -1,5 +1,5 @@ %board-blank-state{ "inline-template" => true, - "v-if" => "list.id == 'blank'" } + "v-if" => 'list.id == "blank"' } .board-blank-state %p Add the following default lists to your Issue Board with one click: diff --git a/app/views/projects/boards/components/_board.html.haml b/app/views/projects/boards/components/_board.html.haml index f7071051efc..47165c70097 100644 --- a/app/views/projects/boards/components/_board.html.haml +++ b/app/views/projects/boards/components/_board.html.haml @@ -1,80 +1,34 @@ -%board{ "inline-template" => true, - "v-cloak" => true, - "v-for" => "list in state.lists | orderBy 'position'", - "v-ref:board" => true, - ":list" => "list", - ":disabled" => "disabled", - ":issue-link-base" => "issueLinkBase", - "track-by" => "_uid" } - .board{ ":class" => "{ 'is-draggable': !list.preset }", - ":data-id" => "list.id" } - .board-inner - %header.board-header{ ":class" => "{ 'has-border': list.label }", ":style" => "{ borderTopColor: (list.label ? list.label.color : null) }" } - %h3.board-title.js-board-handle{ ":class" => "{ 'user-can-drag': (!disabled && !list.preset) }" } - %span.has-tooltip{ ":title" => "(list.label ? list.label.description : '')", - data: { container: "body", placement: "bottom" } } - {{ list.title }} - .board-issue-count-holder.pull-right.clearfix{ "v-if" => "list.type !== 'blank'" } - %span.board-issue-count.pull-left{ ":class" => "{ 'has-btn': list.type !== 'done' }" } - {{ list.issuesSize }} - - if can?(current_user, :admin_issue, @project) - %button.btn.btn-small.btn-default.pull-right.has-tooltip{ type: "button", - "@click" => "showNewIssueForm", - "v-if" => "list.type !== 'done'", - "aria-label" => "Add an issue", - "title" => "Add an issue", - data: { placement: "top", container: "body" } } - = icon("plus") - - if can?(current_user, :admin_list, @project) - %board-delete{ "inline-template" => true, - ":list" => "list", - "v-if" => "!list.preset && list.id" } - %button.board-delete.has-tooltip.pull-right{ type: "button", title: "Delete list", "aria-label" => "Delete list", data: { placement: "bottom" }, "@click.stop" => "deleteBoard" } - = icon("trash") - %board-list{ "inline-template" => true, - "v-if" => "list.type !== 'blank'", - ":list" => "list", - ":issues" => "list.issues", - ":loading" => "list.loading", - ":disabled" => "disabled", - ":show-issue-form.sync" => "showIssueForm", - ":issue-link-base" => "issueLinkBase" } - .board-list-loading.text-center{ "v-if" => "loading" } - = icon("spinner spin") - - if can? current_user, :create_issue, @project - %board-new-issue{ "inline-template" => true, +.board{ ":class" => '{ "is-draggable": !list.preset }', + ":data-id" => "list.id" } + .board-inner + %header.board-header{ ":class" => '{ "has-border": list.label }', ":style" => "{ borderTopColor: (list.label ? list.label.color : null) }" } + %h3.board-title.js-board-handle{ ":class" => '{ "user-can-drag": (!disabled && !list.preset) }' } + %span.has-tooltip{ ":title" => '(list.label ? list.label.description : "")', + data: { container: "body", placement: "bottom" } } + {{ list.title }} + .board-issue-count-holder.pull-right.clearfix{ "v-if" => 'list.type !== "blank"' } + %span.board-issue-count.pull-left{ ":class" => '{ "has-btn": list.type !== "done" }' } + {{ list.issuesSize }} + - if can?(current_user, :admin_issue, @project) + %button.btn.btn-small.btn-default.pull-right.has-tooltip{ type: "button", + "@click" => "showNewIssueForm", + "v-if" => 'list.type !== "done"', + "aria-label" => "Add an issue", + "title" => "Add an issue", + data: { placement: "top", container: "body" } } + = icon("plus") + - if can?(current_user, :admin_list, @project) + %board-delete{ "inline-template" => true, ":list" => "list", - ":show-issue-form.sync" => "showIssueForm", - "v-show" => "list.type !== 'done' && showIssueForm" } - .card.board-new-issue-form - %form{ "@submit" => "submit($event)" } - .flash-container{ "v-if" => "error" } - .flash-alert - An error occured. Please try again. - %label.label-light{ ":for" => "list.id + '-title'" } - Title - %input.form-control{ type: "text", - "v-model" => "title", - "v-el:input" => true, - ":id" => "list.id + '-title'" } - .clearfix.prepend-top-10 - %button.btn.btn-success.pull-left{ type: "submit", - ":disabled" => "title === ''", - "v-el:submit-button" => true } - Submit issue - %button.btn.btn-default.pull-right{ type: "button", - "@click" => "cancel" } - Cancel - %ul.board-list{ "v-el:list" => true, - "v-show" => "!loading", - ":data-board" => "list.id", - ":class" => "{ 'is-smaller': showIssueForm }" } - = render "projects/boards/components/card" - %li.board-list-count.text-center{ "v-if" => "showCount" } - = icon("spinner spin", "v-show" => "list.loadingMore" ) - %span{ "v-if" => "list.issues.length === list.issuesSize" } - Showing all issues - %span{ "v-else" => true } - Showing {{ list.issues.length }} of {{ list.issuesSize }} issues - - if can?(current_user, :admin_list, @project) - = render "projects/boards/components/blank_state" + "v-if" => "!list.preset && list.id" } + %button.board-delete.has-tooltip.pull-right{ type: "button", title: "Delete list", "aria-label" => "Delete list", data: { placement: "bottom" }, "@click.stop" => "deleteBoard" } + = icon("trash") + %board-list{ "v-if" => 'list.type !== "blank"', + ":list" => "list", + ":issues" => "list.issues", + ":loading" => "list.loading", + ":disabled" => "disabled", + ":issue-link-base" => "issueLinkBase", + "ref" => "board-list" } + - if can?(current_user, :admin_list, @project) + = render "projects/boards/components/blank_state" diff --git a/app/views/projects/boards/components/_board_list.html.haml b/app/views/projects/boards/components/_board_list.html.haml new file mode 100644 index 00000000000..d86e0ed8540 --- /dev/null +++ b/app/views/projects/boards/components/_board_list.html.haml @@ -0,0 +1,44 @@ +.board-list-component + .board-list-loading.text-center{ "v-if" => "loading" } + = icon("spinner spin") + - if can? current_user, :create_issue, @project + %board-new-issue{ "inline-template" => true, + ":list" => "list", + "v-if" => 'list.type !== "done" && showIssueForm' } + .card.board-new-issue-form + %form{ "@submit" => "submit($event)" } + .flash-container{ "v-if" => "error" } + .flash-alert + An error occured. Please try again. + %label.label-light{ ":for" => 'list.id + "-title"' } + Title + %input.form-control{ type: "text", + "v-model" => "title", + "ref" => "input", + ":id" => 'list.id + "-title"' } + .clearfix.prepend-top-10 + %button.btn.btn-success.pull-left{ type: "submit", + ":disabled" => 'title === ""', + "ref" => "submit-button" } + Submit issue + %button.btn.btn-default.pull-right{ type: "button", + "@click" => "cancel" } + Cancel + %ul.board-list{ "ref" => "list", + "v-show" => "!loading", + ":data-board" => "list.id", + ":class" => '{ "is-smaller": showIssueForm }' } + %board-card{ "v-for" => "(issue, index) in orderedIssues", + "ref" => "issue", + ":index" => "index", + ":list" => "list", + ":issue" => "issue", + ":issue-link-base" => "issueLinkBase", + ":disabled" => "disabled", + "key" => "id" } + %li.board-list-count.text-center{ "v-if" => "showCount" } + = icon("spinner spin", "v-show" => "list.loadingMore" ) + %span{ "v-if" => "list.issues.length === list.issuesSize" } + Showing all issues + %span{ "v-else" => true } + Showing {{ list.issues.length }} of {{ list.issuesSize }} issues diff --git a/app/views/projects/boards/components/_card.html.haml b/app/views/projects/boards/components/_card.html.haml index 8fce702314c..72b31b8cdae 100644 --- a/app/views/projects/boards/components/_card.html.haml +++ b/app/views/projects/boards/components/_card.html.haml @@ -1,36 +1,26 @@ -%board-card{ "inline-template" => true, - "v-for" => "issue in issues | orderBy 'priority'", - "v-ref:issue" => true, - ":index" => "$index", - ":list" => "list", - ":issue" => "issue", - ":issue-link-base" => "issueLinkBase", - ":disabled" => "disabled", - "track-by" => "id" } - %li.card{ ":class" => "{ 'user-can-drag': !disabled && issue.id, 'is-disabled': disabled || !issue.id, 'is-active': issueDetailVisible }", - ":index" => "index", - "@mousedown" => "mouseDown", - "@mouseMove" => "mouseMove", - "@mouseup" => "showIssue($event)" } - %h4.card-title - = icon("eye-slash", class: "confidential-icon", "v-if" => "issue.confidential") - %a{ ":href" => "issueLinkBase + '/' + issue.id", - ":title" => "issue.title" } - {{ issue.title }} - .card-footer - %span.card-number{ "v-if" => "issue.id" } - = precede '#' do - {{ issue.id }} - %a.has-tooltip{ ":href" => "'#{root_path}' + issue.assignee.username", - ":title" => "'Assigned to ' + issue.assignee.name", - "v-if" => "issue.assignee", - data: { container: 'body' } } - %img.avatar.avatar-inline.s20{ ":src" => "issue.assignee.avatar", width: 20, height: 20 } - %button.label.color-label.has-tooltip{ "v-for" => "label in issue.labels", - type: "button", - "v-if" => "(!list.label || label.id !== list.label.id)", - "@click" => "filterByLabel(label, $event)", - ":style" => "{ backgroundColor: label.color, color: label.textColor }", - ":title" => "label.description", - data: { container: 'body' } } - {{ label.title }} +%li.card{ ":class" => '{ "user-can-drag": !disabled && issue.id, "is-disabled": disabled || !issue.id, "is-active": issueDetailVisible }', + ":index" => "index", + "@mousedown" => "mouseDown", + "@mouseup" => "showIssue($event)" } + %h4.card-title + = icon("eye-slash", class: "confidential-icon", "v-if" => "issue.confidential") + %a{ ":href" => 'issueLinkBase + "/" + issue.id', + ":title" => "issue.title" } + {{ issue.title }} + .card-footer + %span.card-number{ "v-if" => "issue.id" } + = precede '#' do + {{ issue.id }} + %a.has-tooltip{ ":href" => "\"#{root_path}\" + issue.assignee.username", + ":title" => '"Assigned to " + issue.assignee.name', + "v-if" => "issue.assignee", + data: { container: 'body' } } + %img.avatar.avatar-inline.s20{ ":src" => "issue.assignee.avatar", width: 20, height: 20 } + %button.label.color-label.has-tooltip{ "v-for" => "label in issue.labels", + type: "button", + "v-if" => "(!list.label || label.id !== list.label.id)", + "@click" => "filterByLabel(label, $event)", + ":style" => "{ backgroundColor: label.color, color: label.textColor }", + ":title" => "label.description", + data: { container: 'body' } } + {{ label.title }} diff --git a/app/views/projects/boards/index.html.haml b/app/views/projects/boards/index.html.haml index 29c9a43a0c1..2a5b8b1441e 100644 --- a/app/views/projects/boards/index.html.haml +++ b/app/views/projects/boards/index.html.haml @@ -1,18 +1 @@ -- @no_container = true -- @content_class = "issue-boards-content" -- page_title "Boards" - -- content_for :page_specific_javascripts do - = page_specific_javascript_tag('boards/boards_bundle.js') - = page_specific_javascript_tag('boards/test_utils/simulate_drag.js') if Rails.env.test? - -= render "projects/issues/head" - -= render 'shared/issuable/filter', type: :boards - -#board-app.boards-app{ "v-cloak" => true, data: board_data } - .boards-list{ ":class" => "{ 'is-compact': detailIssueVisible }" } - .boards-app-loading.text-center{ "v-if" => "loading" } - = icon("spinner spin") - = render "projects/boards/components/board" - = render "projects/boards/components/sidebar" += render "show" diff --git a/app/views/projects/boards/show.html.haml b/app/views/projects/boards/show.html.haml index 29c9a43a0c1..2a5b8b1441e 100644 --- a/app/views/projects/boards/show.html.haml +++ b/app/views/projects/boards/show.html.haml @@ -1,18 +1 @@ -- @no_container = true -- @content_class = "issue-boards-content" -- page_title "Boards" - -- content_for :page_specific_javascripts do - = page_specific_javascript_tag('boards/boards_bundle.js') - = page_specific_javascript_tag('boards/test_utils/simulate_drag.js') if Rails.env.test? - -= render "projects/issues/head" - -= render 'shared/issuable/filter', type: :boards - -#board-app.boards-app{ "v-cloak" => true, data: board_data } - .boards-list{ ":class" => "{ 'is-compact': detailIssueVisible }" } - .boards-app-loading.text-center{ "v-if" => "loading" } - = icon("spinner spin") - = render "projects/boards/components/board" - = render "projects/boards/components/sidebar" += render "show" From 4fba69dc90d9c423f491f58b62a9d814d07d7ef2 Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Mon, 7 Nov 2016 10:05:58 +0000 Subject: [PATCH 11/31] Fixed up resolve discussions --- .../components/comment_resolve_btn.js.es6 | 12 +++++++++--- .../diff_notes/components/resolve_btn.js.es6 | 8 +++++--- .../diff_notes/components/resolve_count.js.es6 | 3 +++ .../components/resolve_discussion_btn.js.es6 | 8 +++++--- .../diff_notes/diff_notes_bundle.js.es6 | 15 ++++++++------- app/assets/javascripts/notes.js | 3 ++- .../projects/merge_requests/_show.html.haml | 17 +++++++++-------- app/views/projects/notes/_note.html.haml | 4 ++-- 8 files changed, 43 insertions(+), 27 deletions(-) diff --git a/app/assets/javascripts/diff_notes/components/comment_resolve_btn.js.es6 b/app/assets/javascripts/diff_notes/components/comment_resolve_btn.js.es6 index bd5d8f24593..52e2846d279 100644 --- a/app/assets/javascripts/diff_notes/components/comment_resolve_btn.js.es6 +++ b/app/assets/javascripts/diff_notes/components/comment_resolve_btn.js.es6 @@ -1,9 +1,13 @@ /* eslint-disable */ -((w) => { - w.CommentAndResolveBtn = Vue.extend({ +(() => { + const CommentAndResolveBtn = Vue.extend({ props: { discussionId: String, - textareaIsEmpty: Boolean + }, + data() { + return { + textareaIsEmpty: true + } }, computed: { discussion: function () { @@ -47,4 +51,6 @@ $(`#new-discussion-note-form-${this.discussionId} .note-textarea`).off('input.comment-and-resolve-btn'); } }); + + Vue.component('comment-and-resolve-btn', CommentAndResolveBtn); })(window); diff --git a/app/assets/javascripts/diff_notes/components/resolve_btn.js.es6 b/app/assets/javascripts/diff_notes/components/resolve_btn.js.es6 index 3db0b4319b1..27af9fc96ad 100644 --- a/app/assets/javascripts/diff_notes/components/resolve_btn.js.es6 +++ b/app/assets/javascripts/diff_notes/components/resolve_btn.js.es6 @@ -1,6 +1,6 @@ /* eslint-disable */ -((w) => { - w.ResolveBtn = Vue.extend({ +(() => { + const ResolveBtn = Vue.extend({ props: { noteId: Number, discussionId: String, @@ -101,4 +101,6 @@ CommentsStore.create(this.discussionId, this.noteId, this.canResolve, this.resolved, this.resolvedBy); } }); -})(window); + + Vue.component('resolve-btn', ResolveBtn); +})(); diff --git a/app/assets/javascripts/diff_notes/components/resolve_count.js.es6 b/app/assets/javascripts/diff_notes/components/resolve_count.js.es6 index 24a99e23132..b78d63314da 100644 --- a/app/assets/javascripts/diff_notes/components/resolve_count.js.es6 +++ b/app/assets/javascripts/diff_notes/components/resolve_count.js.es6 @@ -13,6 +13,9 @@ computed: { allResolved: function () { return this.resolvedDiscussionCount === this.discussionCount; + }, + resolvedCountText() { + return this.discussionCount === 0 ? 'discussion' : 'discussions'; } } }); diff --git a/app/assets/javascripts/diff_notes/components/resolve_discussion_btn.js.es6 b/app/assets/javascripts/diff_notes/components/resolve_discussion_btn.js.es6 index 060034f049b..b945a09fcbe 100644 --- a/app/assets/javascripts/diff_notes/components/resolve_discussion_btn.js.es6 +++ b/app/assets/javascripts/diff_notes/components/resolve_discussion_btn.js.es6 @@ -1,6 +1,6 @@ /* eslint-disable */ -((w) => { - w.ResolveDiscussionBtn = Vue.extend({ +(() => { + const ResolveDiscussionBtn = Vue.extend({ props: { discussionId: String, mergeRequestId: Number, @@ -54,4 +54,6 @@ CommentsStore.createDiscussion(this.discussionId, this.canResolve); } }); -})(window); + + Vue.component('resolve-discussion-btn', ResolveDiscussionBtn); +})(); diff --git a/app/assets/javascripts/diff_notes/diff_notes_bundle.js.es6 b/app/assets/javascripts/diff_notes/diff_notes_bundle.js.es6 index 6149bfd052a..cc2d8744fd7 100644 --- a/app/assets/javascripts/diff_notes/diff_notes_bundle.js.es6 +++ b/app/assets/javascripts/diff_notes/diff_notes_bundle.js.es6 @@ -10,17 +10,18 @@ $(() => { window.DiffNotesApp = new Vue({ el: '#diff-notes-app', - components: { - 'resolve-btn': ResolveBtn, - 'resolve-discussion-btn': ResolveDiscussionBtn, - 'comment-and-resolve-btn': CommentAndResolveBtn - }, methods: { compileComponents: function () { - const $components = $('resolve-btn, resolve-discussion-btn, jump-to-discussion'); + const $components = $('resolve-btn, resolve-discussion-btn, jump-to-discussion, comment-and-resolve-btn'); + if ($components.length) { $components.each(function () { - DiffNotesApp.$compile($(this).get(0)); + const $this = $(this); + const tmp = Vue.extend({ + template: $this.get(0).outerHTML, + parent: DiffNotesApp, + }); + $this.replaceWith(new tmp().$mount().$el); }); } } diff --git a/app/assets/javascripts/notes.js b/app/assets/javascripts/notes.js index 4976eef2896..aeaf90abb77 100644 --- a/app/assets/javascripts/notes.js +++ b/app/assets/javascripts/notes.js @@ -647,7 +647,8 @@ var $commentBtn = form.find('comment-and-resolve-btn'); $commentBtn .attr(':discussion-id', "'" + dataHolder.data('discussionId') + "'"); - DiffNotesApp.$compile($commentBtn.get(0)); + + DiffNotesApp.compileComponents(); } form.find(".js-note-text").focus(); diff --git a/app/views/projects/merge_requests/_show.html.haml b/app/views/projects/merge_requests/_show.html.haml index f57abe73977..a497f418c7c 100644 --- a/app/views/projects/merge_requests/_show.html.haml +++ b/app/views/projects/merge_requests/_show.html.haml @@ -74,14 +74,15 @@ %span.badge= @merge_request.diff_size %li#resolve-count-app.line-resolve-all-container.pull-right.prepend-top-10.hidden-xs{ "v-cloak" => true } %resolve-count{ "inline-template" => true, ":logged-out" => "#{current_user.nil?}" } - .line-resolve-all{ "v-show" => "discussionCount > 0", - ":class" => "{ 'has-next-btn': !loggedOut && resolvedDiscussionCount !== discussionCount }" } - %span.line-resolve-btn.is-disabled{ type: "button", - ":class" => "{ 'is-active': resolvedDiscussionCount === discussionCount }" } - = render "shared/icons/icon_status_success.svg" - %span.line-resolve-text - {{ resolvedDiscussionCount }}/{{ discussionCount }} {{ discussionCount | pluralize 'discussion' }} resolved - = render "discussions/jump_to_next" + %div + .line-resolve-all{ "v-show" => "discussionCount > 0", + ":class" => "{ 'has-next-btn': !loggedOut && resolvedDiscussionCount !== discussionCount }" } + %span.line-resolve-btn.is-disabled{ type: "button", + ":class" => "{ 'is-active': resolvedDiscussionCount === discussionCount }" } + = render "shared/icons/icon_status_success.svg" + %span.line-resolve-text + {{ resolvedDiscussionCount }}/{{ discussionCount }} {{ resolvedCountText }} resolved + = render "discussions/jump_to_next" .tab-content#diff-notes-app #notes.notes.tab-pane.voting_notes diff --git a/app/views/projects/notes/_note.html.haml b/app/views/projects/notes/_note.html.haml index ab719e38904..afff15228c1 100644 --- a/app/views/projects/notes/_note.html.haml +++ b/app/views/projects/notes/_note.html.haml @@ -32,7 +32,7 @@ "resolved-by" => "#{note.resolved_by.try(:name)}", "v-show" => "#{can_resolve || note.resolved?}", "inline-template" => true, - "v-ref:note_#{note.id}" => true } + "ref" => "note_#{note.id}" } .note-action-button = icon("spin spinner", "v-show" => "loading") @@ -43,7 +43,7 @@ "@click" => "resolve", ":title" => "buttonText", "v-show" => "!loading", - "v-el:button" => true } + ":ref" => "'button'" } = render "shared/icons/icon_status_success.svg" From 674e9351e16d22edd5dac0c7fa29b79fcd84650b Mon Sep 17 00:00:00 2001 From: Fatih Acet Date: Tue, 8 Nov 2016 17:46:01 +0300 Subject: [PATCH 12/31] Remove unnecesarry require. --- .../javascripts/merge_conflicts/merge_conflicts_bundle.js.es6 | 1 - 1 file changed, 1 deletion(-) diff --git a/app/assets/javascripts/merge_conflicts/merge_conflicts_bundle.js.es6 b/app/assets/javascripts/merge_conflicts/merge_conflicts_bundle.js.es6 index 03a642d7ff2..815443fb54e 100644 --- a/app/assets/javascripts/merge_conflicts/merge_conflicts_bundle.js.es6 +++ b/app/assets/javascripts/merge_conflicts/merge_conflicts_bundle.js.es6 @@ -6,7 +6,6 @@ //= require ./mixins/line_conflict_actions //= require ./components/diff_file_editor //= require ./components/inline_conflict_lines -//= require ./components/parallel_conflict_line //= require ./components/parallel_conflict_lines $(() => { From c8133c53b2d68acab23c11977ee88530d4880a3c Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Tue, 8 Nov 2016 16:54:18 +0000 Subject: [PATCH 13/31] Changed how resolving notes is rendered Vue2 was taking the template out & then appending again. This changes that --- .../diff_notes/diff_notes_bundle.js.es6 | 38 +++++++++++-------- app/assets/javascripts/merge_request_tabs.js | 4 +- app/assets/javascripts/notes.js | 20 +++++----- app/assets/javascripts/single_file_diff.js | 12 +++--- 4 files changed, 39 insertions(+), 35 deletions(-) diff --git a/app/assets/javascripts/diff_notes/diff_notes_bundle.js.es6 b/app/assets/javascripts/diff_notes/diff_notes_bundle.js.es6 index cc2d8744fd7..275668f2252 100644 --- a/app/assets/javascripts/diff_notes/diff_notes_bundle.js.es6 +++ b/app/assets/javascripts/diff_notes/diff_notes_bundle.js.es6 @@ -8,25 +8,31 @@ //= require_directory ./components $(() => { - window.DiffNotesApp = new Vue({ - el: '#diff-notes-app', - methods: { - compileComponents: function () { - const $components = $('resolve-btn, resolve-discussion-btn, jump-to-discussion, comment-and-resolve-btn'); + window.gl = window.gl || {}; + window.gl.diffNoteApps = {}; - if ($components.length) { - $components.each(function () { - const $this = $(this); - const tmp = Vue.extend({ - template: $this.get(0).outerHTML, - parent: DiffNotesApp, - }); - $this.replaceWith(new tmp().$mount().$el); - }); + gl.diffNotesCompileComponents = () => { + const $components = $('resolve-btn, resolve-discussion-btn, jump-to-discussion, comment-and-resolve-btn'); + + if ($components) { + $components.each(function () { + const $this = $(this); + const noteId = $this.attr(':note-id'); + const tmp = Vue.extend({ + template: $this.get(0).outerHTML + }); + const tmpApp = new tmp().$mount(); + + if (noteId) { + gl.diffNoteApps[`note_${noteId}`] = tmpApp; } - } + + $this.replaceWith(tmpApp.$el); + }); } - }); + }; + + gl.diffNotesCompileComponents(); new Vue({ el: '#resolve-count-app', diff --git a/app/assets/javascripts/merge_request_tabs.js b/app/assets/javascripts/merge_request_tabs.js index 860ee5df57e..e3bc00de4e8 100644 --- a/app/assets/javascripts/merge_request_tabs.js +++ b/app/assets/javascripts/merge_request_tabs.js @@ -227,8 +227,8 @@ return function(data) { $('#diffs').html(data.html); - if (typeof DiffNotesApp !== 'undefined') { - DiffNotesApp.compileComponents(); + if (typeof gl.diffNotesCompileComponents !== 'undefined') { + gl.diffNotesCompileComponents(); } gl.utils.localTimeAgo($('.js-timeago', 'div#diffs')); diff --git a/app/assets/javascripts/notes.js b/app/assets/javascripts/notes.js index aeaf90abb77..df7e316ca6c 100644 --- a/app/assets/javascripts/notes.js +++ b/app/assets/javascripts/notes.js @@ -325,8 +325,8 @@ discussionContainer.append(note_html); } - if (typeof DiffNotesApp !== 'undefined') { - DiffNotesApp.compileComponents(); + if (typeof gl.diffNotesCompileComponents !== 'undefined') { + gl.diffNotesCompileComponents(); } gl.utils.localTimeAgo($('.js-timeago', note_html), false); @@ -466,8 +466,8 @@ $note_li.replaceWith($html); - if (typeof DiffNotesApp !== 'undefined') { - DiffNotesApp.compileComponents(); + if (typeof gl.diffNotesCompileComponents !== 'undefined') { + gl.diffNotesCompileComponents(); } }; @@ -559,11 +559,9 @@ note = $(el); notes = note.closest(".notes"); - if (typeof DiffNotesApp !== "undefined" && DiffNotesApp !== null) { - ref = DiffNotesApp.$refs[noteId]; - - if (ref) { - ref.$destroy(true); + if (typeof gl.diffNotesCompileComponents !== 'undefined') { + if (gl.diffNoteApps[noteId]) { + gl.diffNoteApps[noteId].$destroy(); } } @@ -643,12 +641,12 @@ form.find('.js-note-target-close').remove(); this.setupNoteForm(form); - if (typeof DiffNotesApp !== 'undefined') { + if (typeof gl.diffNotesCompileComponents !== 'undefined') { var $commentBtn = form.find('comment-and-resolve-btn'); $commentBtn .attr(':discussion-id', "'" + dataHolder.data('discussionId') + "'"); - DiffNotesApp.compileComponents(); + gl.diffNotesCompileComponents(); } form.find(".js-note-text").focus(); diff --git a/app/assets/javascripts/single_file_diff.js b/app/assets/javascripts/single_file_diff.js index 8e54ca4f0dc..01ccbe5b987 100644 --- a/app/assets/javascripts/single_file_diff.js +++ b/app/assets/javascripts/single_file_diff.js @@ -45,15 +45,15 @@ this.content.hide(); this.$toggleIcon.addClass('fa-caret-right').removeClass('fa-caret-down'); this.collapsedContent.show(); - if (typeof DiffNotesApp !== 'undefined') { - DiffNotesApp.compileComponents(); + if (typeof gl.diffNotesCompileComponents !== 'undefined') { + gl.diffNotesCompileComponents(); } } else if (this.content) { this.collapsedContent.hide(); this.content.show(); this.$toggleIcon.addClass('fa-caret-down').removeClass('fa-caret-right'); - if (typeof DiffNotesApp !== 'undefined') { - DiffNotesApp.compileComponents(); + if (typeof gl.diffNotesCompileComponents !== 'undefined') { + gl.diffNotesCompileComponents(); } } else { this.$toggleIcon.addClass('fa-caret-down').removeClass('fa-caret-right'); @@ -76,8 +76,8 @@ } _this.collapsedContent.after(_this.content); - if (typeof DiffNotesApp !== 'undefined') { - DiffNotesApp.compileComponents(); + if (typeof gl.diffNotesCompileComponents !== 'undefined') { + gl.diffNotesCompileComponents(); } if (cb) cb(); From a9349f5734410b57cf5434262727d2df3aa11fa4 Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Wed, 9 Nov 2016 08:54:48 +0000 Subject: [PATCH 14/31] Fixed jump to discussion button not showing --- app/assets/javascripts/diff_notes/diff_notes_bundle.js.es6 | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/assets/javascripts/diff_notes/diff_notes_bundle.js.es6 b/app/assets/javascripts/diff_notes/diff_notes_bundle.js.es6 index 275668f2252..bd4c20aed8b 100644 --- a/app/assets/javascripts/diff_notes/diff_notes_bundle.js.es6 +++ b/app/assets/javascripts/diff_notes/diff_notes_bundle.js.es6 @@ -8,11 +8,15 @@ //= require_directory ./components $(() => { + const COMPONENT_SELECTOR = 'resolve-btn, resolve-discussion-btn, jump-to-discussion, comment-and-resolve-btn'; + window.gl = window.gl || {}; window.gl.diffNoteApps = {}; gl.diffNotesCompileComponents = () => { - const $components = $('resolve-btn, resolve-discussion-btn, jump-to-discussion, comment-and-resolve-btn'); + const $components = $(COMPONENT_SELECTOR).filter(function () { + return $(this).closest('resolve-count').length !== 1; + }); if ($components) { $components.each(function () { From 948b4828ce75b56ddc71ac08c5e3a8a08b405fcc Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Wed, 9 Nov 2016 09:17:14 +0000 Subject: [PATCH 15/31] Issue board spec fixes --- app/assets/javascripts/boards/stores/boards_store.js.es6 | 2 ++ .../javascripts/diff_notes/components/resolve_count.js.es6 | 2 +- spec/features/boards/new_issue_spec.rb | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/app/assets/javascripts/boards/stores/boards_store.js.es6 b/app/assets/javascripts/boards/stores/boards_store.js.es6 index 1d5071657b7..3af71fcc081 100644 --- a/app/assets/javascripts/boards/stores/boards_store.js.es6 +++ b/app/assets/javascripts/boards/stores/boards_store.js.es6 @@ -27,6 +27,8 @@ const list = new List(listObj); this.state.lists.push(list); + this.state.lists = _.sortBy(this.state.lists, 'position'); + return list; }, new (listObj) { diff --git a/app/assets/javascripts/diff_notes/components/resolve_count.js.es6 b/app/assets/javascripts/diff_notes/components/resolve_count.js.es6 index b78d63314da..9522ccb49da 100644 --- a/app/assets/javascripts/diff_notes/components/resolve_count.js.es6 +++ b/app/assets/javascripts/diff_notes/components/resolve_count.js.es6 @@ -15,7 +15,7 @@ return this.resolvedDiscussionCount === this.discussionCount; }, resolvedCountText() { - return this.discussionCount === 0 ? 'discussion' : 'discussions'; + return this.discussionCount === 1 ? 'discussion' : 'discussions'; } } }); diff --git a/spec/features/boards/new_issue_spec.rb b/spec/features/boards/new_issue_spec.rb index 760a8967123..a03cd6fbf2d 100644 --- a/spec/features/boards/new_issue_spec.rb +++ b/spec/features/boards/new_issue_spec.rb @@ -46,7 +46,7 @@ describe 'Issue Boards new issue', feature: true, js: true do click_button 'Cancel' - expect(page).to have_selector('.board-new-issue-form', visible: false) + expect(page).not_to have_selector('.board-new-issue-form') end end From e9c66be12bf4c6e10f46dfed8f32c3fe7f093122 Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Wed, 9 Nov 2016 09:23:48 +0000 Subject: [PATCH 16/31] Changed how lists get sorted --- app/assets/javascripts/boards/boards_bundle.js.es6 | 2 ++ .../javascripts/boards/components/new_list_dropdown.js.es6 | 2 ++ app/assets/javascripts/boards/stores/boards_store.js.es6 | 4 ++-- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/app/assets/javascripts/boards/boards_bundle.js.es6 b/app/assets/javascripts/boards/boards_bundle.js.es6 index 8ca7e13bb50..7ba918a05f8 100644 --- a/app/assets/javascripts/boards/boards_bundle.js.es6 +++ b/app/assets/javascripts/boards/boards_bundle.js.es6 @@ -61,6 +61,8 @@ $(() => { } }); + this.state.lists = _.sortBy(this.state.lists, 'position'); + Store.addBlankState(); this.loading = false; }); diff --git a/app/assets/javascripts/boards/components/new_list_dropdown.js.es6 b/app/assets/javascripts/boards/components/new_list_dropdown.js.es6 index 9f71b9abdab..10ce746deb5 100644 --- a/app/assets/javascripts/boards/components/new_list_dropdown.js.es6 +++ b/app/assets/javascripts/boards/components/new_list_dropdown.js.es6 @@ -65,6 +65,8 @@ color: label.color } }); + + Store.state.lists = _.sortBy(Store.state.lists, 'position'); } } }); diff --git a/app/assets/javascripts/boards/stores/boards_store.js.es6 b/app/assets/javascripts/boards/stores/boards_store.js.es6 index 3af71fcc081..6bc95aa60f2 100644 --- a/app/assets/javascripts/boards/stores/boards_store.js.es6 +++ b/app/assets/javascripts/boards/stores/boards_store.js.es6 @@ -27,8 +27,6 @@ const list = new List(listObj); this.state.lists.push(list); - this.state.lists = _.sortBy(this.state.lists, 'position'); - return list; }, new (listObj) { @@ -62,6 +60,8 @@ title: 'Welcome to your Issue Board!', position: 0 }); + + this.state.lists = _.sortBy(this.state.lists, 'position'); }, removeBlankState () { this.removeList('blank'); From 6dbca36490bff0f2c1af4a323f0e76b8d971a4ab Mon Sep 17 00:00:00 2001 From: Alfredo Sumaran Date: Wed, 9 Nov 2016 15:17:49 -0500 Subject: [PATCH 17/31] Fix Merge Conflicts app to make it work with Vue 2 --- .../components/parallel_conflict_lines.js.es6 | 17 ++++++++++++++++- .../projects/merge_requests/conflicts.html.haml | 5 +---- .../_parallel_conflict_line.html.haml | 9 --------- .../_parallel_conflict_lines.html.haml | 13 ------------- 4 files changed, 17 insertions(+), 27 deletions(-) delete mode 100644 app/views/projects/merge_requests/conflicts/components/_parallel_conflict_line.html.haml delete mode 100644 app/views/projects/merge_requests/conflicts/components/_parallel_conflict_lines.html.haml diff --git a/app/assets/javascripts/merge_conflicts/components/parallel_conflict_lines.js.es6 b/app/assets/javascripts/merge_conflicts/components/parallel_conflict_lines.js.es6 index 083a836f92f..4ccbdcd6daa 100644 --- a/app/assets/javascripts/merge_conflicts/components/parallel_conflict_lines.js.es6 +++ b/app/assets/javascripts/merge_conflicts/components/parallel_conflict_lines.js.es6 @@ -7,7 +7,22 @@ props: { file: Object }, - mixins: [global.mergeConflicts.utils, global.mergeConflicts.actions] + mixins: [global.mergeConflicts.utils, global.mergeConflicts.actions], + template: ` + + + + +
    + `, }); })(window.gl || (window.gl = {})); diff --git a/app/views/projects/merge_requests/conflicts.html.haml b/app/views/projects/merge_requests/conflicts.html.haml index d9f74d2cbfb..16789f68f70 100644 --- a/app/views/projects/merge_requests/conflicts.html.haml +++ b/app/views/projects/merge_requests/conflicts.html.haml @@ -30,11 +30,8 @@ .diff-wrap-lines.code.file-content.js-syntax-highlight{"v-show" => "!isParallel && file.resolveMode === 'interactive' && file.type === 'text'" } = render partial: "projects/merge_requests/conflicts/components/inline_conflict_lines" .diff-wrap-lines.code.file-content.js-syntax-highlight{"v-show" => "isParallel && file.resolveMode === 'interactive' && file.type === 'text'" } - = render partial: "projects/merge_requests/conflicts/components/parallel_conflict_lines" + %parallel-conflict-lines{ ":file" => "file" } %div{"v-show" => "file.resolveMode === 'edit' || file.type === 'text-editor'"} = render partial: "projects/merge_requests/conflicts/components/diff_file_editor" = render partial: "projects/merge_requests/conflicts/submit_form" - --# Components -= render partial: 'projects/merge_requests/conflicts/components/parallel_conflict_line' diff --git a/app/views/projects/merge_requests/conflicts/components/_parallel_conflict_line.html.haml b/app/views/projects/merge_requests/conflicts/components/_parallel_conflict_line.html.haml deleted file mode 100644 index 7d0ab2043d9..00000000000 --- a/app/views/projects/merge_requests/conflicts/components/_parallel_conflict_line.html.haml +++ /dev/null @@ -1,9 +0,0 @@ -%script{"id" => 'parallel-conflict-line', "type" => "text/x-template"} - %td.diff-line-num.header{":class" => "lineCssClass(line)", "v-if" => "line.isHeader"} - %td.line_content.header{":class" => "lineCssClass(line)", "v-if" => "line.isHeader"} - %strong {{line.richText}} - %button.btn{"@click" => "handleSelected(file, line.id, line.section)"} - {{line.buttonTitle}} - %td.diff-line-num.old_line{":class" => "lineCssClass(line)", "v-if" => "!line.isHeader"} - {{line.lineNumber}} - %td.line_content.parallel{":class" => "lineCssClass(line)", "v-if" => "!line.isHeader", "v-html" => "line.richText"} diff --git a/app/views/projects/merge_requests/conflicts/components/_parallel_conflict_lines.html.haml b/app/views/projects/merge_requests/conflicts/components/_parallel_conflict_lines.html.haml deleted file mode 100644 index 0fd7095683c..00000000000 --- a/app/views/projects/merge_requests/conflicts/components/_parallel_conflict_lines.html.haml +++ /dev/null @@ -1,13 +0,0 @@ -%parallel-conflict-lines{"inline-template" => "true", ":file" => "file"} - %table - %tr.line_holder.parallel{"v-for" => "section in file.parallelLines"} - %template{"is"=>"parallel-conflict-line", "v-for" => "line in section", ":line" => "line", ":file" => "file"} - %td.diff-line-num.header{":class" => "lineCssClass(line)", "v-if" => "line.isHeader"} - %td.line_content.header{":class" => "lineCssClass(line)", "v-if" => "line.isHeader"} - %strong {{line.richText}} - %button.btn{"@click" => "handleSelected(file, line.id, line.section)"} - {{line.buttonTitle}} - %td.diff-line-num.old_line{":class" => "lineCssClass(line)", "v-if" => "!line.isHeader"} - {{line.lineNumber}} - %td.line_content.parallel{":class" => "lineCssClass(line)", "v-if" => "!line.isHeader", "v-html" => "line.richText"} - From c095b04b9a4c215318504a3633e8960719102f29 Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Thu, 10 Nov 2016 08:02:03 +0000 Subject: [PATCH 18/31] Fixed tests for issue boards & diff note resolving --- .../javascripts/boards/components/board_blank_state.js.es6 | 2 ++ spec/features/merge_requests/diff_notes_resolve_spec.rb | 2 -- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/assets/javascripts/boards/components/board_blank_state.js.es6 b/app/assets/javascripts/boards/components/board_blank_state.js.es6 index 885553690d3..691487b272a 100644 --- a/app/assets/javascripts/boards/components/board_blank_state.js.es6 +++ b/app/assets/javascripts/boards/components/board_blank_state.js.es6 @@ -30,6 +30,8 @@ }); }); + Store.state.lists = _.sortBy(Store.state.lists, 'position'); + // Save the labels gl.boardService.generateDefaultLists() .then((resp) => { diff --git a/spec/features/merge_requests/diff_notes_resolve_spec.rb b/spec/features/merge_requests/diff_notes_resolve_spec.rb index 5e6d8467217..d5e3d8e7eff 100644 --- a/spec/features/merge_requests/diff_notes_resolve_spec.rb +++ b/spec/features/merge_requests/diff_notes_resolve_spec.rb @@ -69,8 +69,6 @@ feature 'Diff notes resolve', feature: true, js: true do page.within '.diff-content .note' do expect(page).to have_selector('.line-resolve-btn.is-active') - - expect(find('.line-resolve-btn')['data-original-title']).to eq("Resolved by #{user.name}") end page.within '.line-resolve-all-container' do From 3fa265d19547669c60788e38e389fa12bb119235 Mon Sep 17 00:00:00 2001 From: Adam Niedzielski Date: Thu, 10 Nov 2016 18:24:12 +0100 Subject: [PATCH 19/31] Fix expanding a collapsed diff when converting a symlink to a regular file In this case comparing old_path and new_path is not enough because there are two entires that match. --- app/controllers/concerns/diff_for_path.rb | 2 +- app/views/projects/diffs/_content.html.haml | 2 +- ...-fix-collapsed-diff-symlink-file-conversion.yml | 4 ++++ lib/gitlab/diff/file.rb | 2 +- .../diff/file_collection/merge_request_diff.rb | 2 +- spec/features/expand_collapse_diffs_spec.rb | 14 ++++++++++++++ spec/support/test_env.rb | 1 + 7 files changed, 23 insertions(+), 4 deletions(-) create mode 100644 changelogs/unreleased/adam-fix-collapsed-diff-symlink-file-conversion.yml diff --git a/app/controllers/concerns/diff_for_path.rb b/app/controllers/concerns/diff_for_path.rb index aeec3009f15..1efa9fe060f 100644 --- a/app/controllers/concerns/diff_for_path.rb +++ b/app/controllers/concerns/diff_for_path.rb @@ -3,7 +3,7 @@ module DiffForPath def render_diff_for_path(diffs) diff_file = diffs.diff_files.find do |diff| - diff.old_path == params[:old_path] && diff.new_path == params[:new_path] + diff.file_identifier == params[:file_identifier] end return render_404 unless diff_file diff --git a/app/views/projects/diffs/_content.html.haml b/app/views/projects/diffs/_content.html.haml index 779c8ea0104..c3d2f80544b 100644 --- a/app/views/projects/diffs/_content.html.haml +++ b/app/views/projects/diffs/_content.html.haml @@ -9,7 +9,7 @@ - if !project.repository.diffable?(blob) .nothing-here-block This diff was suppressed by a .gitattributes entry. - elsif diff_file.collapsed? - - url = url_for(params.merge(action: :diff_for_path, old_path: diff_file.old_path, new_path: diff_file.new_path)) + - url = url_for(params.merge(action: :diff_for_path, old_path: diff_file.old_path, new_path: diff_file.new_path, file_identifier: diff_file.file_identifier)) .nothing-here-block.diff-collapsed{data: { diff_for_path: url } } This diff is collapsed. %a.click-to-expand diff --git a/changelogs/unreleased/adam-fix-collapsed-diff-symlink-file-conversion.yml b/changelogs/unreleased/adam-fix-collapsed-diff-symlink-file-conversion.yml new file mode 100644 index 00000000000..c83558f33d1 --- /dev/null +++ b/changelogs/unreleased/adam-fix-collapsed-diff-symlink-file-conversion.yml @@ -0,0 +1,4 @@ +--- +title: Fix expanding a collapsed diff when converting a symlink to a regular file +merge_request: 6953 +author: diff --git a/lib/gitlab/diff/file.rb b/lib/gitlab/diff/file.rb index ce85e5e0123..5110bfbf898 100644 --- a/lib/gitlab/diff/file.rb +++ b/lib/gitlab/diff/file.rb @@ -126,7 +126,7 @@ module Gitlab repository.blob_at(commit.id, file_path) end - def cache_key + def file_identifier "#{file_path}-#{new_file}-#{deleted_file}-#{renamed_file}" end end diff --git a/lib/gitlab/diff/file_collection/merge_request_diff.rb b/lib/gitlab/diff/file_collection/merge_request_diff.rb index dc4d47c878b..fe7adb7bed6 100644 --- a/lib/gitlab/diff/file_collection/merge_request_diff.rb +++ b/lib/gitlab/diff/file_collection/merge_request_diff.rb @@ -39,7 +39,7 @@ module Gitlab # hashes that represent serialized diff lines. # def cache_highlight!(diff_file) - item_key = diff_file.cache_key + item_key = diff_file.file_identifier if highlight_cache[item_key] highlight_diff_file_from_cache!(diff_file, highlight_cache[item_key]) diff --git a/spec/features/expand_collapse_diffs_spec.rb b/spec/features/expand_collapse_diffs_spec.rb index 6c938bdead8..3934c936f20 100644 --- a/spec/features/expand_collapse_diffs_spec.rb +++ b/spec/features/expand_collapse_diffs_spec.rb @@ -182,6 +182,20 @@ feature 'Expand and collapse diffs', js: true, feature: true do end end end + + context 'expanding a diff when symlink was converted to a regular file' do + let(:branch) { 'symlink-expand-diff' } + + it 'shows the content of the regular file' do + expect(page).to have_content('This diff is collapsed') + expect(page).to have_no_content('No longer a symlink') + + find('.click-to-expand').click + wait_for_ajax + + expect(page).to have_content('No longer a symlink') + end + end end context 'visiting a commit without collapsed diffs' do diff --git a/spec/support/test_env.rb b/spec/support/test_env.rb index 778e665500d..103f7542286 100644 --- a/spec/support/test_env.rb +++ b/spec/support/test_env.rb @@ -23,6 +23,7 @@ module TestEnv 'binary-encoding' => '7b1cf43', 'gitattributes' => '5a62481', 'expand-collapse-diffs' => '4842455', + 'symlink-expand-diff' => '81e6355', 'expand-collapse-files' => '025db92', 'expand-collapse-lines' => '238e82d', 'video' => '8879059', From 9e2964c15a7d387e46e25c83afa478c12a856d77 Mon Sep 17 00:00:00 2001 From: Patricio Cano Date: Fri, 4 Nov 2016 12:53:12 -0600 Subject: [PATCH 20/31] Allow certain Sidekiq jobs to be throttled --- Gemfile | 1 + Gemfile.lock | 3 ++ .../admin/application_settings_controller.rb | 1 + app/models/application_setting.rb | 1 + .../application_settings/_form.html.haml | 13 +++++++++ config/initializers/sidekiq.rb | 16 ++++++++++ ...ekiq_throttling_to_application_settings.rb | 29 +++++++++++++++++++ db/schema.rb | 1 + lib/gitlab/current_settings.rb | 1 + 9 files changed, 66 insertions(+) create mode 100644 db/migrate/20161103191444_add_sidekiq_throttling_to_application_settings.rb diff --git a/Gemfile b/Gemfile index cb2a8470126..f2291568d25 100644 --- a/Gemfile +++ b/Gemfile @@ -137,6 +137,7 @@ gem 'acts-as-taggable-on', '~> 4.0' gem 'sidekiq', '~> 4.2' gem 'sidekiq-cron', '~> 0.4.0' gem 'redis-namespace', '~> 1.5.2' +gem 'sidekiq-limit_fetch', '~> 3.4' # HTTP requests gem 'httparty', '~> 0.13.3' diff --git a/Gemfile.lock b/Gemfile.lock index 290e4c3e1b3..81b43f2238a 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -685,6 +685,8 @@ GEM redis-namespace (>= 1.5.2) rufus-scheduler (>= 2.0.24) sidekiq (>= 4.0.0) + sidekiq-limit_fetch (3.4.0) + sidekiq (>= 4) simplecov (0.12.0) docile (~> 1.1.0) json (>= 1.8, < 3) @@ -961,6 +963,7 @@ DEPENDENCIES shoulda-matchers (~> 2.8.0) sidekiq (~> 4.2) sidekiq-cron (~> 0.4.0) + sidekiq-limit_fetch (~> 3.4) simplecov (= 0.12.0) slack-notifier (~> 1.2.0) spinach-rails (~> 0.2.1) diff --git a/app/controllers/admin/application_settings_controller.rb b/app/controllers/admin/application_settings_controller.rb index 52e0256943a..a9dcf7615c4 100644 --- a/app/controllers/admin/application_settings_controller.rb +++ b/app/controllers/admin/application_settings_controller.rb @@ -117,6 +117,7 @@ class Admin::ApplicationSettingsController < Admin::ApplicationController :send_user_confirmation_email, :container_registry_token_expire_delay, :enabled_git_access_protocol, + :sidekiq_throttling_enabled, :housekeeping_enabled, :housekeeping_bitmaps_enabled, :housekeeping_incremental_repack_period, diff --git a/app/models/application_setting.rb b/app/models/application_setting.rb index bb60cc8736c..b728083e91c 100644 --- a/app/models/application_setting.rb +++ b/app/models/application_setting.rb @@ -180,6 +180,7 @@ class ApplicationSetting < ActiveRecord::Base container_registry_token_expire_delay: 5, repository_storages: ['default'], user_default_external: false, + sidekiq_throttling_enabled: false, housekeeping_enabled: true, housekeeping_bitmaps_enabled: true, housekeeping_incremental_repack_period: 10, diff --git a/app/views/admin/application_settings/_form.html.haml b/app/views/admin/application_settings/_form.html.haml index 450ec322f2c..01a14accbba 100644 --- a/app/views/admin/application_settings/_form.html.haml +++ b/app/views/admin/application_settings/_form.html.haml @@ -283,6 +283,19 @@ The amount of points to store in a single UDP packet. More points results in fewer but larger UDP packets being sent. + %fieldset + %legend Background Jobs + %p + These settings require a restart to take effect. + .form-group + .col-sm-offset-2.col-sm-10 + .checkbox + = f.label :sidekiq_throttling_enabled do + = f.check_box :sidekiq_throttling_enabled + Enable Sidekiq Job Throttling + .help-block + Limit the amount of resources slow running jobs are assigned. + %fieldset %legend Spam and Anti-bot Protection .form-group diff --git a/config/initializers/sidekiq.rb b/config/initializers/sidekiq.rb index 023af2af23c..6e660a8c026 100644 --- a/config/initializers/sidekiq.rb +++ b/config/initializers/sidekiq.rb @@ -1,3 +1,6 @@ +require 'gitlab/current_settings' +include Gitlab::CurrentSettings + # Custom Redis configuration redis_config_hash = Gitlab::Redis.params redis_config_hash[:namespace] = Gitlab::Redis::SIDEKIQ_NAMESPACE @@ -29,6 +32,19 @@ Sidekiq.configure_server do |config| end Sidekiq::Cron::Job.load_from_hash! cron_jobs + # allow it to fail: it may do so when create_from_defaults is executed before migrations are actually done + begin + throttling_enabled = current_application_settings.sidekiq_throttling_enabled + rescue + throttling_enabled = false + end + + if throttling_enabled + { 'project_cache' => 0.1, 'pipeline' => 0.1 }.each do |queue, ratio| + Sidekiq::Queue[queue].limit = (ratio * Sidekiq.options[:concurrency]).ceil + end + end + # Database pool should be at least `sidekiq_concurrency` + 2 # For more info, see: https://github.com/mperham/sidekiq/blob/master/4.0-Upgrade.md config = ActiveRecord::Base.configurations[Rails.env] || diff --git a/db/migrate/20161103191444_add_sidekiq_throttling_to_application_settings.rb b/db/migrate/20161103191444_add_sidekiq_throttling_to_application_settings.rb new file mode 100644 index 00000000000..e2839219fb7 --- /dev/null +++ b/db/migrate/20161103191444_add_sidekiq_throttling_to_application_settings.rb @@ -0,0 +1,29 @@ +# See http://doc.gitlab.com/ce/development/migration_style_guide.html +# for more information on how to write migrations for GitLab. + +class AddSidekiqThrottlingToApplicationSettings < ActiveRecord::Migration + include Gitlab::Database::MigrationHelpers + + # Set this constant to true if this migration requires downtime. + DOWNTIME = false + + # When a migration requires downtime you **must** uncomment the following + # constant and define a short and easy to understand explanation as to why the + # migration requires downtime. + # DOWNTIME_REASON = '' + + # When using the methods "add_concurrent_index" or "add_column_with_default" + # you must disable the use of transactions as these methods can not run in an + # existing transaction. When using "add_concurrent_index" make sure that this + # method is the _only_ method called in the migration, any other changes + # should go in a separate migration. This ensures that upon failure _only_ the + # index creation fails and can be retried or reverted easily. + # + # To disable transactions uncomment the following line and remove these + # comments: + # disable_ddl_transaction! + + def change + add_column :application_settings, :sidekiq_throttling_enabled, :boolean, default: false + end +end diff --git a/db/schema.rb b/db/schema.rb index 62c325a52d7..31d01403508 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -98,6 +98,7 @@ ActiveRecord::Schema.define(version: 20161106185620) do t.text "help_page_text_html" t.text "shared_runners_text_html" t.text "after_sign_up_text_html" + t.boolean "sidekiq_throttling_enabled", default: false t.boolean "housekeeping_enabled", default: true, null: false t.boolean "housekeeping_bitmaps_enabled", default: true, null: false t.integer "housekeeping_incremental_repack_period", default: 10, null: false diff --git a/lib/gitlab/current_settings.rb b/lib/gitlab/current_settings.rb index ef9160d6437..801c2d5abcd 100644 --- a/lib/gitlab/current_settings.rb +++ b/lib/gitlab/current_settings.rb @@ -50,6 +50,7 @@ module Gitlab repository_checks_enabled: true, container_registry_token_expire_delay: 5, user_default_external: false, + sidekiq_throttling_enabled: false, ) end From b95216aabadb336e4ed8cdc01f69e873f47f10d0 Mon Sep 17 00:00:00 2001 From: Patricio Cano Date: Fri, 4 Nov 2016 16:54:24 -0600 Subject: [PATCH 21/31] Allow the Sidekiq queues to throttle and the factor by which to throttle them to be configurable --- .../admin/application_settings_controller.rb | 4 +++- app/helpers/application_settings_helper.rb | 4 ++++ app/models/application_setting.rb | 10 ++++++++++ .../admin/application_settings/_form.html.haml | 12 ++++++++++++ config/initializers/sidekiq.rb | 16 ++++------------ ...sidekiq_throttling_to_application_settings.rb | 2 ++ db/schema.rb | 2 ++ lib/gitlab/current_settings.rb | 4 ++++ 8 files changed, 41 insertions(+), 13 deletions(-) diff --git a/app/controllers/admin/application_settings_controller.rb b/app/controllers/admin/application_settings_controller.rb index a9dcf7615c4..b81842e319b 100644 --- a/app/controllers/admin/application_settings_controller.rb +++ b/app/controllers/admin/application_settings_controller.rb @@ -118,6 +118,7 @@ class Admin::ApplicationSettingsController < Admin::ApplicationController :container_registry_token_expire_delay, :enabled_git_access_protocol, :sidekiq_throttling_enabled, + :sidekiq_throttling_factor, :housekeeping_enabled, :housekeeping_bitmaps_enabled, :housekeeping_incremental_repack_period, @@ -126,7 +127,8 @@ class Admin::ApplicationSettingsController < Admin::ApplicationController repository_storages: [], restricted_visibility_levels: [], import_sources: [], - disabled_oauth_sign_in_sources: [] + disabled_oauth_sign_in_sources: [], + sidekiq_throttling_queues: [] ) end end diff --git a/app/helpers/application_settings_helper.rb b/app/helpers/application_settings_helper.rb index 45a567a1eba..be5e0301a43 100644 --- a/app/helpers/application_settings_helper.rb +++ b/app/helpers/application_settings_helper.rb @@ -100,4 +100,8 @@ module ApplicationSettingsHelper options_for_select(options, @application_setting.repository_storages) end + + def sidekiq_queue_options_for_select + options_for_select(Sidekiq::Queue.all.map(&:name), @application_setting.sidekiq_throttling_queues) + end end diff --git a/app/models/application_setting.rb b/app/models/application_setting.rb index b728083e91c..075e4f4fc9d 100644 --- a/app/models/application_setting.rb +++ b/app/models/application_setting.rb @@ -19,6 +19,7 @@ class ApplicationSetting < ActiveRecord::Base serialize :domain_whitelist, Array serialize :domain_blacklist, Array serialize :repository_storages + serialize :sidekiq_throttling_queues cache_markdown_field :sign_in_text cache_markdown_field :help_page_text @@ -85,6 +86,15 @@ class ApplicationSetting < ActiveRecord::Base presence: { message: 'Domain blacklist cannot be empty if Blacklist is enabled.' }, if: :domain_blacklist_enabled? + validates :sidekiq_throttling_factor, + numericality: { greater_than: 0, less_than: 1 }, + presence: { message: 'Throttling factor cannot be empty if Sidekiq Throttling is enabled.' }, + if: :sidekiq_throttling_enabled? + + validates :sidekiq_throttling_queues, + presence: { message: 'Queues to throttle cannot be empty if Sidekiq Throttling is enabled.' }, + if: :sidekiq_throttling_enabled? + validates :housekeeping_incremental_repack_period, presence: true, numericality: { only_integer: true, greater_than: 0 } diff --git a/app/views/admin/application_settings/_form.html.haml b/app/views/admin/application_settings/_form.html.haml index 01a14accbba..9b1b3f0e16e 100644 --- a/app/views/admin/application_settings/_form.html.haml +++ b/app/views/admin/application_settings/_form.html.haml @@ -295,6 +295,18 @@ Enable Sidekiq Job Throttling .help-block Limit the amount of resources slow running jobs are assigned. + .form-group + = f.label :sidekiq_throttling_queues, 'Sidekiq queues to throttle', class: 'control-label col-sm-2' + .col-sm-10 + = f.select :sidekiq_throttling_queues, sidekiq_queue_options_for_select, { include_hidden: false }, multiple: true, class: 'select2 select-wide', data: { field: 'sidekiq_throttling_queues' } + .help-block + Choose which queues you wish to throttle. + .form-group + = f.label :sidekiq_throttling_factor, 'Throttling Factor', class: 'control-label col-sm-2' + .col-sm-10 + = f.number_field :sidekiq_throttling_factor, class: 'form-control', min: '0', max: '0.99', step: '0.01' + .help-block + The factor by which the queues should be throttled. A value between 0.1 and 0.9. %fieldset %legend Spam and Anti-bot Protection diff --git a/config/initializers/sidekiq.rb b/config/initializers/sidekiq.rb index 6e660a8c026..7cc5e396f98 100644 --- a/config/initializers/sidekiq.rb +++ b/config/initializers/sidekiq.rb @@ -1,6 +1,3 @@ -require 'gitlab/current_settings' -include Gitlab::CurrentSettings - # Custom Redis configuration redis_config_hash = Gitlab::Redis.params redis_config_hash[:namespace] = Gitlab::Redis::SIDEKIQ_NAMESPACE @@ -32,16 +29,11 @@ Sidekiq.configure_server do |config| end Sidekiq::Cron::Job.load_from_hash! cron_jobs - # allow it to fail: it may do so when create_from_defaults is executed before migrations are actually done - begin - throttling_enabled = current_application_settings.sidekiq_throttling_enabled - rescue - throttling_enabled = false - end + if Gitlab::CurrentSettings.sidekiq_throttling_enabled? + factor = current_application_settings.sidekiq_throttling_factor - if throttling_enabled - { 'project_cache' => 0.1, 'pipeline' => 0.1 }.each do |queue, ratio| - Sidekiq::Queue[queue].limit = (ratio * Sidekiq.options[:concurrency]).ceil + current_application_settings.sidekiq_throttling_queues.each do |queue| + Sidekiq::Queue[queue].limit = (factor * Sidekiq.options[:concurrency]).ceil end end diff --git a/db/migrate/20161103191444_add_sidekiq_throttling_to_application_settings.rb b/db/migrate/20161103191444_add_sidekiq_throttling_to_application_settings.rb index e2839219fb7..e644a174964 100644 --- a/db/migrate/20161103191444_add_sidekiq_throttling_to_application_settings.rb +++ b/db/migrate/20161103191444_add_sidekiq_throttling_to_application_settings.rb @@ -25,5 +25,7 @@ class AddSidekiqThrottlingToApplicationSettings < ActiveRecord::Migration def change add_column :application_settings, :sidekiq_throttling_enabled, :boolean, default: false + add_column :application_settings, :sidekiq_throttling_queues, :string + add_column :application_settings, :sidekiq_throttling_factor, :decimal end end diff --git a/db/schema.rb b/db/schema.rb index 31d01403508..666b54690c1 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -99,6 +99,8 @@ ActiveRecord::Schema.define(version: 20161106185620) do t.text "shared_runners_text_html" t.text "after_sign_up_text_html" t.boolean "sidekiq_throttling_enabled", default: false + t.string "sidekiq_throttling_queues" + t.decimal "sidekiq_throttling_factor" t.boolean "housekeeping_enabled", default: true, null: false t.boolean "housekeeping_bitmaps_enabled", default: true, null: false t.integer "housekeeping_incremental_repack_period", default: 10, null: false diff --git a/lib/gitlab/current_settings.rb b/lib/gitlab/current_settings.rb index 801c2d5abcd..3a651ef318a 100644 --- a/lib/gitlab/current_settings.rb +++ b/lib/gitlab/current_settings.rb @@ -23,6 +23,10 @@ module Gitlab settings || fake_application_settings end + def sidekiq_throttling_enabled? + current_application_settings.sidekiq_throttling_enabled + end + def fake_application_settings OpenStruct.new( default_projects_limit: Settings.gitlab['default_projects_limit'], From 1d3ada80ad6cb9a4927512fdf4018907bf3098a6 Mon Sep 17 00:00:00 2001 From: Patricio Cano Date: Mon, 7 Nov 2016 15:44:55 -0600 Subject: [PATCH 22/31] Added documentation and CHANGELOG item. --- .../unreleased/sidekiq-job-throttling.yml | 4 +++ doc/administration/operations.md | 1 + .../operations/img/sidekiq_job_throttling.png | Bin 0 -> 114784 bytes .../operations/sidekiq_job_throttling.md | 32 ++++++++++++++++++ 4 files changed, 37 insertions(+) create mode 100644 changelogs/unreleased/sidekiq-job-throttling.yml create mode 100644 doc/administration/operations/img/sidekiq_job_throttling.png create mode 100644 doc/administration/operations/sidekiq_job_throttling.md diff --git a/changelogs/unreleased/sidekiq-job-throttling.yml b/changelogs/unreleased/sidekiq-job-throttling.yml new file mode 100644 index 00000000000..1f3aad7ae96 --- /dev/null +++ b/changelogs/unreleased/sidekiq-job-throttling.yml @@ -0,0 +1,4 @@ +--- +title: Added ability to throttle Sidekiq Jobs +merge_request: 7292 +author: Patricio Cano diff --git a/doc/administration/operations.md b/doc/administration/operations.md index 4b582d16b64..0daceb98d99 100644 --- a/doc/administration/operations.md +++ b/doc/administration/operations.md @@ -1,6 +1,7 @@ # GitLab operations - [Sidekiq MemoryKiller](operations/sidekiq_memory_killer.md) +- [Sidekiq Job throttling](operations/sidekiq_job_throttling.md) - [Cleaning up Redis sessions](operations/cleaning_up_redis_sessions.md) - [Understanding Unicorn and unicorn-worker-killer](operations/unicorn.md) - [Moving repositories to a new location](operations/moving_repositories.md) diff --git a/doc/administration/operations/img/sidekiq_job_throttling.png b/doc/administration/operations/img/sidekiq_job_throttling.png new file mode 100644 index 0000000000000000000000000000000000000000..7f29a4d3c4620163158b93cbf9b23cf7d7a16f15 GIT binary patch literal 114784 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

    Z0NPkibI+g)dDHP0;F{N96?# zqgNNZIXe@bu*8yI(m$9ndjtK%(FMkq5-PAqF<~OoiKZsDg?A#~kWIC5)x+tQrf?G# z@dx@s))yR|aAbN-yA*6Kcx9zirPu@fxvsbN_(2i?tezu)1>f`9pYnn*rGHS^i#QkeCy(5`s zx^_OqCdL!ru+}QvZ34Q)H^NyOt55Id>oiSRSrrg4MHt1PacI=}FZ z4YPOJ+$j)F4y;rC?Lt>@PRp01` zTv&(}M7i9xB*9PdJyZFC%$iFME3wE-+@U*<+N4jhO0ZRdL zVy)1^7AtnHN!~GcSZI&^1|ccI=&I;jYoc{!ezed2z0XS87F?+v#clrG9XSlo@!qN; ziZvO3GT@Q%O3tK#_^Icy7(l`%U*+j%{=@TjghD*Ck%!+}=%I%uuT|bZ4EaxELkOHc zhmV2J8_Oa%jz)*sQ~{@%M71-%;8&4~0pEIDSd_TwM# zJihSfbA1NXll&N{BHjR^4azCguxP|uNJ;Pl5D$KpYYSNAkHInDQz_B^x?~XY2zg> z$^M^y@88c#-2Urc12 zSi1k8e(&Eg@m}qEmb?4oPlib6N^|O!Bhw7H?}nd?sm>K0d!7Fd!#~cy{|>`HhG?ze e|A*DECb(IO@ara{lVD?5WuRyJd--oJG5-gUZmS;v literal 0 HcmV?d00001 diff --git a/doc/administration/operations/sidekiq_job_throttling.md b/doc/administration/operations/sidekiq_job_throttling.md new file mode 100644 index 00000000000..33cedee7ebd --- /dev/null +++ b/doc/administration/operations/sidekiq_job_throttling.md @@ -0,0 +1,32 @@ +# Sidekiq Job throttling + +> Note: Introduced with GitLab 8.14 + +When your GitLab installation needs to handle tens of thousands of background +jobs, it can be convenient to prioritize queues that need to be executed +immediately, e.g. user initiated actions like merging a Merge Request. + +In order to accomplish this, you can limit the amount of workers that certain +slow running queues get can have available. This is what we call Sidekiq Job +Throttling. Depending on your infrastructure, you might have different slow +running queues, which is why you can choose which queues to throttle and by +how much you want to throttle them. + +These settings are available in the Application Settings of your GitLab +installation. + +![Sidekiq Job Throttling](img/sidekiq_job_throttling.png) + +The throttle factor determines the maximum number of workers a queue can run on. +This value gets multiplied by `:concurrency` value set in the Sidekiq settings +and rounded up to the closest full integer. + +So, for example, you set the `:concurrency` to 25 and the `Throttling factor` to +0.1, the maximum workers assigned to the selected queues would be 3. + +``` +limit = (factor * Sidekiq.options[:concurrency]).ceil +``` + +After enabling the job throttling, you will need to restart your GitLab +instance, in order for the changes to take effect. \ No newline at end of file From 208530494e5d2c5c62a3e1c24489aae0e4935e3a Mon Sep 17 00:00:00 2001 From: Patricio Cano Date: Tue, 8 Nov 2016 16:31:37 -0600 Subject: [PATCH 23/31] Refactored initializer code to its own class and added tests --- config/initializers/sidekiq.rb | 8 +----- lib/gitlab/sidekiq_throttler.rb | 21 ++++++++++++++ spec/lib/gitlab/sidekiq_throttler_spec.rb | 34 +++++++++++++++++++++++ 3 files changed, 56 insertions(+), 7 deletions(-) create mode 100644 lib/gitlab/sidekiq_throttler.rb create mode 100644 spec/lib/gitlab/sidekiq_throttler_spec.rb diff --git a/config/initializers/sidekiq.rb b/config/initializers/sidekiq.rb index 7cc5e396f98..b87b31d9697 100644 --- a/config/initializers/sidekiq.rb +++ b/config/initializers/sidekiq.rb @@ -29,13 +29,7 @@ Sidekiq.configure_server do |config| end Sidekiq::Cron::Job.load_from_hash! cron_jobs - if Gitlab::CurrentSettings.sidekiq_throttling_enabled? - factor = current_application_settings.sidekiq_throttling_factor - - current_application_settings.sidekiq_throttling_queues.each do |queue| - Sidekiq::Queue[queue].limit = (factor * Sidekiq.options[:concurrency]).ceil - end - end + Gitlab::SidekiqThrottler.execute! # Database pool should be at least `sidekiq_concurrency` + 2 # For more info, see: https://github.com/mperham/sidekiq/blob/master/4.0-Upgrade.md diff --git a/lib/gitlab/sidekiq_throttler.rb b/lib/gitlab/sidekiq_throttler.rb new file mode 100644 index 00000000000..771736e7606 --- /dev/null +++ b/lib/gitlab/sidekiq_throttler.rb @@ -0,0 +1,21 @@ +module Gitlab + class SidekiqThrottler + class << self + def execute! + if Gitlab::CurrentSettings.sidekiq_throttling_enabled? + current_application_settings.sidekiq_throttling_queues.each do |queue| + Sidekiq::Queue[queue].limit = set_limit + end + end + end + + private + + def set_limit + factor = current_application_settings.sidekiq_throttling_factor + + (factor * Sidekiq.options[:concurrency]).ceil + end + end + end +end diff --git a/spec/lib/gitlab/sidekiq_throttler_spec.rb b/spec/lib/gitlab/sidekiq_throttler_spec.rb new file mode 100644 index 00000000000..ac4a64c0f43 --- /dev/null +++ b/spec/lib/gitlab/sidekiq_throttler_spec.rb @@ -0,0 +1,34 @@ +require 'spec_helper' + +describe Gitlab::SidekiqThrottler do + before do + Sidekiq.options[:concurrency] = 35 + + stub_application_setting( + sidekiq_throttling_enabled: true, + sidekiq_throttling_factor: 0.1, + sidekiq_throttling_queues: %w[build project_cache] + ) + end + + describe '#set_limit' do + it 'returns the correct limit' do + expect(Gitlab::SidekiqThrottler.send(:set_limit)).to eq 4 + end + end + + describe '#execute!' do + it 'sets limits on the selected queues' do + Gitlab::SidekiqThrottler.execute! + + expect(Sidekiq::Queue['build'].limit).to eq 4 + expect(Sidekiq::Queue['project_cache'].limit).to eq 4 + end + + it 'does not set limits on other queues' do + Gitlab::SidekiqThrottler.execute! + + expect(Sidekiq::Queue['merge'].limit).to be_nil + end + end +end From 2689428ac2071cf300a11d812ad2b9249df7eaac Mon Sep 17 00:00:00 2001 From: Nick Thomas Date: Wed, 9 Nov 2016 22:54:58 +0000 Subject: [PATCH 24/31] Fix project records with invalid visibility_level values The AddVisibilityLevelToGroups migration introduced a visibility_level for namespaces and specified that projects should always have a visibility level less than or equal to their namespace. However, some invalid rows could have been created. This commit introduces a migration that updates the invalid rows, setting the invalid project to have the same visibility_level as their namespaces. This will make some projects internal or private when they would previously have been public or internal, but this is better than silently making an internal or private group public. --- ...9-group-permssion-background-migration.yml | 4 ++ ...project_records_with_invalid_visibility.rb | 49 +++++++++++++++++++ db/schema.rb | 2 +- 3 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 changelogs/unreleased/22699-group-permssion-background-migration.yml create mode 100644 db/post_migrate/20161109150329_fix_project_records_with_invalid_visibility.rb diff --git a/changelogs/unreleased/22699-group-permssion-background-migration.yml b/changelogs/unreleased/22699-group-permssion-background-migration.yml new file mode 100644 index 00000000000..e8c221b6c42 --- /dev/null +++ b/changelogs/unreleased/22699-group-permssion-background-migration.yml @@ -0,0 +1,4 @@ +--- +title: Fix project records with invalid visibility_level values +merge_request: 7391 +author: diff --git a/db/post_migrate/20161109150329_fix_project_records_with_invalid_visibility.rb b/db/post_migrate/20161109150329_fix_project_records_with_invalid_visibility.rb new file mode 100644 index 00000000000..bea1cfa4c5d --- /dev/null +++ b/db/post_migrate/20161109150329_fix_project_records_with_invalid_visibility.rb @@ -0,0 +1,49 @@ +class FixProjectRecordsWithInvalidVisibility < ActiveRecord::Migration + include Gitlab::Database::MigrationHelpers + + BATCH_SIZE = 1000 + DOWNTIME = false + + # This migration is idempotent and there's no sense in throwing away the + # partial result if it's interrupted + disable_ddl_transaction! + + def up + projects = Arel::Table.new(:projects) + namespaces = Arel::Table.new(:namespaces) + + finder = + projects. + join(namespaces, Arel::Nodes::InnerJoin). + on(projects[:namespace_id].eq(namespaces[:id])). + where(projects[:visibility_level].gt(namespaces[:visibility_level])). + project(projects[:id]). + take(BATCH_SIZE) + + # MySQL requires a derived table to perform this query + nested_finder = + projects. + from(finder.as("AS projects_inner")). + project(projects[:id]) + + valuer = + namespaces. + where(namespaces[:id].eq(projects[:namespace_id])). + project(namespaces[:visibility_level]) + + # Update matching rows until none remain. The finder contains a limit. + loop do + updater = Arel::UpdateManager.new(ActiveRecord::Base). + table(projects). + set(projects[:visibility_level] => Arel::Nodes::SqlLiteral.new("(#{valuer.to_sql})")). + where(projects[:id].in(nested_finder)) + + num_updated = connection.exec_update(updater.to_sql, self.class.name, []) + break if num_updated == 0 + end + end + + def down + # no-op + end +end diff --git a/db/schema.rb b/db/schema.rb index 62c325a52d7..64d744d8268 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20161106185620) do +ActiveRecord::Schema.define(version: 20161109150329) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" From 579090c3a0ed1e88ac3cfa0ed9666e195b1fdf19 Mon Sep 17 00:00:00 2001 From: gfyoung Date: Sat, 5 Nov 2016 03:50:07 -0400 Subject: [PATCH 25/31] Require projects before creating milestone --- app/controllers/groups/milestones_controller.rb | 2 +- app/views/groups/milestones/new.html.haml | 2 +- changelogs/unreleased/milestone-project-require.yml | 4 ++++ 3 files changed, 6 insertions(+), 2 deletions(-) create mode 100644 changelogs/unreleased/milestone-project-require.yml diff --git a/app/controllers/groups/milestones_controller.rb b/app/controllers/groups/milestones_controller.rb index 9d5a28e8d4d..506484932cc 100644 --- a/app/controllers/groups/milestones_controller.rb +++ b/app/controllers/groups/milestones_controller.rb @@ -58,7 +58,7 @@ class Groups::MilestonesController < Groups::ApplicationController def render_new_with_error(empty_project_ids) @milestone = Milestone.new(milestone_params) - @milestone.errors.add(:project_id, "Please select at least one project.") if empty_project_ids + @milestone.errors.add(:base, "Please select at least one project.") if empty_project_ids render :new end diff --git a/app/views/groups/milestones/new.html.haml b/app/views/groups/milestones/new.html.haml index 23d438b2aa1..0dfaf743992 100644 --- a/app/views/groups/milestones/new.html.haml +++ b/app/views/groups/milestones/new.html.haml @@ -34,7 +34,7 @@ = f.label :projects, "Projects", class: "control-label" .col-sm-10 = f.collection_select :project_ids, @group.projects.non_archived, :id, :name, - { selected: @group.projects.non_archived.pluck(:id) }, multiple: true, class: 'select2' + { selected: @group.projects.non_archived.pluck(:id) }, required: true, multiple: true, class: 'select2' .col-md-6 .form-group diff --git a/changelogs/unreleased/milestone-project-require.yml b/changelogs/unreleased/milestone-project-require.yml new file mode 100644 index 00000000000..e43033541c7 --- /dev/null +++ b/changelogs/unreleased/milestone-project-require.yml @@ -0,0 +1,4 @@ +--- +title: Require projects before creating milestone. +merge_request: 7301 +author: gfyoung From 11510bf729e04ea6f4a713820582b490266505d2 Mon Sep 17 00:00:00 2001 From: awhildy Date: Fri, 21 Oct 2016 14:25:09 -0700 Subject: [PATCH 26/31] [ci skip] Establish basic structure for ux_guide README.md Block out pages needed for ux_guide Add resources stub to ux_guide home Fill out principles and basics Add TOC to basics Move all of UI guide to new UX guide structure Add first level structure on ux-guide pages Add more details to buttons Add button images. Update link on development Renamed surfaces to templates. Add tooltip details Update typography and icons on Basics page Add images for color. First draft of voice and tone Delete findings page Refine pages. Fill out Surfaces pages Clean up layout on basics, surfaces, features. Add anchorlinks and counts to components Fill out components page Add item title and system info block Fill out Features page Switch tooltip placement image --- doc/development/README.md | 2 +- doc/development/ux_guide/README.md | 59 ++++ doc/development/ux_guide/basics.md | 112 +++++++ doc/development/ux_guide/components.md | 282 ++++++++++++++++++ doc/development/ux_guide/features.md | 63 ++++ .../ux_guide/img/button-primary.png | Bin 0 -> 8410 bytes .../ux_guide/img/button-secondary.png | Bin 0 -> 11160 bytes doc/development/ux_guide/img/color-blue.png | Bin 0 -> 3865 bytes doc/development/ux_guide/img/color-green.png | Bin 0 -> 4127 bytes doc/development/ux_guide/img/color-grey.png | Bin 0 -> 2384 bytes doc/development/ux_guide/img/color-orange.png | Bin 0 -> 4698 bytes doc/development/ux_guide/img/color-red.png | Bin 0 -> 3669 bytes .../ux_guide/img/components-alerts.png | Bin 0 -> 46785 bytes .../ux_guide/img/components-anchorlinks.png | Bin 0 -> 36456 bytes .../ux_guide/img/components-contentblock.png | Bin 0 -> 19841 bytes .../ux_guide/img/components-counts.png | Bin 0 -> 2438 bytes .../ux_guide/img/components-coverblock.png | Bin 0 -> 15757 bytes .../ux_guide/img/components-dateexact.png | Bin 0 -> 5609 bytes .../ux_guide/img/components-daterelative.png | Bin 0 -> 5843 bytes .../ux_guide/img/components-dropdown.png | Bin 0 -> 60448 bytes .../ux_guide/img/components-fileholder.png | Bin 0 -> 4953 bytes .../img/components-horizontalform.png | Bin 0 -> 5708 bytes .../img/components-listinsidepanel.png | Bin 0 -> 3962 bytes .../img/components-listwithavatar.png | Bin 0 -> 7952 bytes .../ux_guide/img/components-listwithhover.png | Bin 0 -> 3313 bytes .../ux_guide/img/components-panels.png | Bin 0 -> 32886 bytes .../img/components-referencehover.png | Bin 0 -> 11519 bytes .../img/components-referenceissues.png | Bin 0 -> 14587 bytes .../img/components-referencelabels.png | Bin 0 -> 4643 bytes .../img/components-referencemilestone.png | Bin 0 -> 2468 bytes .../ux_guide/img/components-referencemrs.png | Bin 0 -> 12646 bytes .../img/components-referencepeople.png | Bin 0 -> 7214 bytes .../img/components-rowcontentblock.png | Bin 0 -> 19730 bytes .../ux_guide/img/components-simplelist.png | Bin 0 -> 3078 bytes .../ux_guide/img/components-table.png | Bin 0 -> 7668 bytes .../ux_guide/img/components-verticalform.png | Bin 0 -> 6541 bytes .../ux_guide/img/features-contextualnav.png | Bin 0 -> 8051 bytes .../ux_guide/img/features-emptystates.png | Bin 0 -> 114540 bytes .../ux_guide/img/features-filters.png | Bin 0 -> 4529 bytes .../ux_guide/img/features-globalnav.png | Bin 0 -> 8953 bytes doc/development/ux_guide/img/icon-add.png | Bin 0 -> 155 bytes doc/development/ux_guide/img/icon-close.png | Bin 0 -> 225 bytes doc/development/ux_guide/img/icon-edit.png | Bin 0 -> 231 bytes .../ux_guide/img/icon-notification.png | Bin 0 -> 259 bytes doc/development/ux_guide/img/icon-rss.png | Bin 0 -> 307 bytes .../ux_guide/img/icon-subscribe.png | Bin 0 -> 348 bytes doc/development/ux_guide/img/icon-trash.png | Bin 0 -> 380 bytes .../ux_guide/img/monospacefont-sample.png | Bin 0 -> 14282 bytes .../ux_guide/img/sourcesanspro-sample.png | Bin 0 -> 10948 bytes .../img/surfaces-contentitemtitle.png | Bin 0 -> 7463 bytes .../ux_guide/img/surfaces-header.png | Bin 0 -> 6103 bytes .../img/surfaces-systeminformationblock.png | Bin 0 -> 15412 bytes doc/development/ux_guide/img/surfaces-ux.png | Bin 0 -> 7673 bytes .../ux_guide/img/tooltip-placement.png | Bin 0 -> 2645 bytes .../ux_guide/img/tooltip-usage.png | Bin 0 -> 9160 bytes doc/development/ux_guide/principles.md | 29 ++ doc/development/ux_guide/resources.md | 13 + doc/development/ux_guide/surfaces.md | 53 ++++ doc/development/ux_guide/tips.md | 46 +++ doc/development/ux_guide/users.md | 18 ++ 60 files changed, 676 insertions(+), 1 deletion(-) create mode 100644 doc/development/ux_guide/README.md create mode 100644 doc/development/ux_guide/basics.md create mode 100644 doc/development/ux_guide/components.md create mode 100644 doc/development/ux_guide/features.md create mode 100644 doc/development/ux_guide/img/button-primary.png create mode 100644 doc/development/ux_guide/img/button-secondary.png create mode 100644 doc/development/ux_guide/img/color-blue.png create mode 100644 doc/development/ux_guide/img/color-green.png create mode 100644 doc/development/ux_guide/img/color-grey.png create mode 100644 doc/development/ux_guide/img/color-orange.png create mode 100644 doc/development/ux_guide/img/color-red.png create mode 100644 doc/development/ux_guide/img/components-alerts.png create mode 100644 doc/development/ux_guide/img/components-anchorlinks.png create mode 100644 doc/development/ux_guide/img/components-contentblock.png create mode 100644 doc/development/ux_guide/img/components-counts.png create mode 100644 doc/development/ux_guide/img/components-coverblock.png create mode 100644 doc/development/ux_guide/img/components-dateexact.png create mode 100644 doc/development/ux_guide/img/components-daterelative.png create mode 100644 doc/development/ux_guide/img/components-dropdown.png create mode 100644 doc/development/ux_guide/img/components-fileholder.png create mode 100644 doc/development/ux_guide/img/components-horizontalform.png create mode 100644 doc/development/ux_guide/img/components-listinsidepanel.png create mode 100644 doc/development/ux_guide/img/components-listwithavatar.png create mode 100644 doc/development/ux_guide/img/components-listwithhover.png create mode 100644 doc/development/ux_guide/img/components-panels.png create mode 100644 doc/development/ux_guide/img/components-referencehover.png create mode 100644 doc/development/ux_guide/img/components-referenceissues.png create mode 100644 doc/development/ux_guide/img/components-referencelabels.png create mode 100644 doc/development/ux_guide/img/components-referencemilestone.png create mode 100644 doc/development/ux_guide/img/components-referencemrs.png create mode 100644 doc/development/ux_guide/img/components-referencepeople.png create mode 100644 doc/development/ux_guide/img/components-rowcontentblock.png create mode 100644 doc/development/ux_guide/img/components-simplelist.png create mode 100644 doc/development/ux_guide/img/components-table.png create mode 100644 doc/development/ux_guide/img/components-verticalform.png create mode 100644 doc/development/ux_guide/img/features-contextualnav.png create mode 100644 doc/development/ux_guide/img/features-emptystates.png create mode 100644 doc/development/ux_guide/img/features-filters.png create mode 100644 doc/development/ux_guide/img/features-globalnav.png create mode 100644 doc/development/ux_guide/img/icon-add.png create mode 100644 doc/development/ux_guide/img/icon-close.png create mode 100644 doc/development/ux_guide/img/icon-edit.png create mode 100644 doc/development/ux_guide/img/icon-notification.png create mode 100644 doc/development/ux_guide/img/icon-rss.png create mode 100644 doc/development/ux_guide/img/icon-subscribe.png create mode 100644 doc/development/ux_guide/img/icon-trash.png create mode 100644 doc/development/ux_guide/img/monospacefont-sample.png create mode 100644 doc/development/ux_guide/img/sourcesanspro-sample.png create mode 100644 doc/development/ux_guide/img/surfaces-contentitemtitle.png create mode 100644 doc/development/ux_guide/img/surfaces-header.png create mode 100644 doc/development/ux_guide/img/surfaces-systeminformationblock.png create mode 100644 doc/development/ux_guide/img/surfaces-ux.png create mode 100644 doc/development/ux_guide/img/tooltip-placement.png create mode 100644 doc/development/ux_guide/img/tooltip-usage.png create mode 100644 doc/development/ux_guide/principles.md create mode 100644 doc/development/ux_guide/resources.md create mode 100644 doc/development/ux_guide/surfaces.md create mode 100644 doc/development/ux_guide/tips.md create mode 100644 doc/development/ux_guide/users.md diff --git a/doc/development/README.md b/doc/development/README.md index bf1f054b7d5..87306b1501d 100644 --- a/doc/development/README.md +++ b/doc/development/README.md @@ -14,7 +14,7 @@ contributing to documentation. - [SQL Migration Style Guide](migration_style_guide.md) for creating safe SQL migrations - [Testing standards and style guidelines](testing.md) -- [UI guide](ui_guide.md) for building GitLab with existing CSS styles and elements +- [UX guide](ux_guide/README.md) for building GitLab with existing CSS styles and elements - [Frontend guidelines](frontend.md) - [SQL guidelines](sql.md) for working with SQL queries - [Sidekiq guidelines](sidekiq_style_guide.md) for working with Sidekiq workers diff --git a/doc/development/ux_guide/README.md b/doc/development/ux_guide/README.md new file mode 100644 index 00000000000..e17a4559069 --- /dev/null +++ b/doc/development/ux_guide/README.md @@ -0,0 +1,59 @@ +# GitLab UX Guide + +The goal of this guide is to provide standards, principles and in-depth information to design beautiful and effective GitLab features. This will be a living document, and we welcome contributions, feedback and suggestions. + +## Design + +--- + +### [Principles](principles.md) +These guiding principles set a solid foundation for our design system, and should remain relatively stable over multiple releases. They should be referenced as new design patterns are created. + +--- + +### [Basics](basics.md) +The basic ingredients of our experience establish our personality and feel. This section includes details about typography, color, and motion. + +--- + +### [Components](components.md) +Components are the controls that make up the GitLab experience, including guidance around buttons, links, dropdowns, etc. + +--- + +### [Surfaces](surfaces.md) +The GitLab experience is broken apart into several surfaces. Each of these surfaces is designated for a specific scope or type of content. Examples include the header, global menu, side pane, etc. + +--- + +### [Features](features.md) +The previous building blocks are combined into complete features in the GitLab UX. Examples include our navigation, filters, search results, and empty states. + +--- + +
    + +## Research + +--- + +### [Users](users.md) +How we think about the variety of users of GitLab, from small to large teams, comparing opensource usage to enterprise, etc. + +--- + +
    + +## Other + +--- + +### [Tips for designers](tips.md) +Tips for exporting assets, and other guidance. + +--- + +### [Resources](resources.md) +Resources for GitLab UX + +--- diff --git a/doc/development/ux_guide/basics.md b/doc/development/ux_guide/basics.md new file mode 100644 index 00000000000..7e7cb103694 --- /dev/null +++ b/doc/development/ux_guide/basics.md @@ -0,0 +1,112 @@ +# Basics + +## Contents +* [Responsive](#responsive) +* [Typography](#typography) +* [Icons](#icons) +* [Color](#color) +* [Motion](#motion) +* [Voice and tone](#voice-and-tone) + +--- + +
    + +## Responsive +GitLab is a responsive experience that works well across all screen sizes, from mobile devices to large monitors. In order to provide a great user experience, the core functionality (browsing files, creating issues, writing comments, etc.) must be available at all resolutions. However, due to size limitations, some secondary functionality may be hidden on smaller screens. Please keep this functionality limited to rare actions that aren't expected to be needed on small devices. + +--- + +
    + +## Typography +### Primary typeface +GitLab's main typeface used throughout the UI is **Source Sans Pro**. We support both the bold and regular weight. + +![Source Sans Pro sample](img/sourcesanspro-sample.png) + + +### Monospace typeface +This is the typeface used for code blocks. GitLab uses the OS default font. +- **Menlo** (Mac) +- **Consolas** (Windows) +- **Liberation Mono** (Linux) + +![Monospace font sample](img/monospacefont-sample.png) + +--- + +
    + +## Icons +GitLab uses Font Awesome icons throughout our interface. + +![Trash icon](img/icon-trash.png) +The trash icon is used for destructive actions that deletes information. + +![Edit icon](img/icon-edit.png) +The pencil icon is used for editing content such as comments. + +![Notification icon](img/icon-notification.png) +The bell icon is for notifications, such as Todos. + +![Subscribe icon](img/icon-subscribe.png) +The eye icon is for subscribing to updates. For example, you can subscribe to a label and get updated on issues with that label. + +![RSS icon](img/icon-rss.png) +The standard RSS icon is used for linking to RSS/atom feeds. + +![Close icon](img/icon-close.png) +An 'x' is used for closing UI elements such as dropdowns. + +![Add icon](img/icon-add.png) +A plus is used when creating new objects, such as issues, projects, etc. + +>>> +TODO: update this section, add more general guidance to icon usage and personality, etc. +>>> + +--- + +
    + +## Color + +![Blue](img/color-blue.png) +Blue is used to highlight primary active elements (such as current tab), as well as other organization and managing commands. + +![Green](img/color-green.png) +Green is for actions that create new objects. + +![Orange](img/color-orange.png) +Orange is used for warnings + +![Red](img/color-red.png) +Red is reserved for delete and other destructive commands + +![Grey](img/color-grey.png) +Grey, and white (depending on context) is used for netral, secondary elements + +>>> +TODO: Establish a perspective for color in terms of our personality and rationalize with Marketing usage. +>>> + +--- + +
    + +## Motion + +Motion is a tool to help convey important relationships, changes or transitions between elements. It should be used sparingly and intentionally, highlighting the right elements at the right moment. + +>>> +TODO: Determine a more concrete perspective on motion, create consistent easing/timing curves to follow. +>>> + +--- + +
    + +## Voice and tone + +The copy for GitLab is clear and direct. We strike a clear balance between professional and friendly. We can empathesize with users (such as celebrating completing all Todos), and remain respectful of the importance of the work. We are that trusted, friendly coworker that is helpful and understanding. \ No newline at end of file diff --git a/doc/development/ux_guide/components.md b/doc/development/ux_guide/components.md new file mode 100644 index 00000000000..6b21566265c --- /dev/null +++ b/doc/development/ux_guide/components.md @@ -0,0 +1,282 @@ +# Components + +## Contents +* [Tooltips](#tooltips) +* [Anchor links](#anchor-links) +* [Buttons](#buttons) +* [Dropdowns](#dropdowns) +* [Counts](#counts) +* [Lists](#lists) +* [Tables](#tables) +* [Blocks](#blocks) +* [Panels](#panels) +* [Alerts](#alerts) +* [Forms](#forms) +* [File holders](#file-holders) +* [Data formats](#data-formats) + +--- + +
    + +## Tooltips + +### Usage +A tooltip should only be added if additional information is required. + +![Tooltip usage](img/tooltip-usage.png) + +### Placement +By default, tooltips should be placed below the element that they refer to. However, if there is not enough space in the viewpoint, the tooltip should be moved to the side as needed. + +![Tooltip placement location](img/tooltip-placement.png) + +--- + +
    + +## Anchor links + +Anchor links are used for navigational actions and lone, secondary commands (such as 'Reset filters' on the Issues List) when deemed appropriate by the UX team. + +### States + +#### Rest + +Primary links are blue in their rest state. Secondary links (such as the time stamp on comments) are a neutral gray color in rest. Details on the main GitLab navigation links can be found on the [features](features.md#navigation) page. + +#### Hover + +An underline should always be added on hover. A gray link becomes blue on hover. + +#### Focus + +The focus state should match the hover state. + +![Anchor link states ](img/components-anchorlinks.png) + +--- + +
    + +## Buttons + +Buttons communicate the command that will occur when the user clicks on them. + +### Types + +#### Primary +Primary buttons communicate the main call to action. There should only be one call to action in any given experience. Visually, primary buttons are conveyed with a full background fill + +![Primary button example](img/button-primary.png) + +#### Secondary +Secondary buttons are for alternative commands. They should be conveyed by a button with an stroke, and no background fill. + +![Secondary button example](img/button-secondary.png) + +### Icon and text treatment +Text should be in sentence case, where only the first word is capitalized. "Create issue" is correct, not "Create Issue". Buttons should only contain an icon or a text, not both. + +>>> +TODO: Rationalize this. Ensure that we still believe this. +>>> + +### Colors +Follow the color guidance on the [basics](basics.md#color) page. The default color treatment is the white/grey button. + +--- + +
    + +## Dropdowns + +Dropdowns are used to allow users to choose one (or many) options from a list of options. If this list of options is more 20, there should generally be a way to search through and filter the options (see the complex filter dropdowns below.) + +>>> +TODO: Will update this section when the new filters UI is implemented. +>>> + +![Dropdown states](img/components-dropdown.png) + + + +--- + +
    + +## Counts + +A count element is used in navigation contexts where it is helpful to indicate the count, or number of items, in a list. Always use the [`number_with_delimiter`][number_with_delimiter] helper to display counts in the UI. + +![Counts example](img/components-counts.png) + +[number_with_delimiter]: http://api.rubyonrails.org/classes/ActionView/Helpers/NumberHelper.html#method-i-number_with_delimiter + +--- + +
    + +## Lists + +Lists are used where ever there is a single column of information to display. Ths [issues list](https://gitlab.com/gitlab-org/gitlab-ce/issues) is an example of a important list in the GitLab UI. + +### Types + +Simple list using .content-list + +![Simple list](img/components-simplelist.png) + +List with avatar, title and description using .content-list + +![List with avatar](img/components-listwithavatar.png) + +List with hover effect .well-list + +![List with hover effect](img/components-listwithhover.png) + +List inside panel + +![List inside panel](img/components-listinsidepanel.png) + +--- + +
    + +## Tables + +When the information is too complex for a list, with multiple columns of information, a table can be used. For example, the [pipelines page](https://gitlab.com/gitlab-org/gitlab-ce/pipelines) uses a table. + +![Table](img/components-table.png) + +--- + +
    + +## Blocks + +Blocks are a way to group related information. + +### Types + +#### Content blocks + +Content blocks (`.content-block`) are the basic grouping of content. They are commonly used in [lists](#lists), and are separated by a botton border. + +![Content block](img/components-contentblock.png) + +#### Row content blocks + +A background color can be added to this blocks. For example, items in the [issue list](https://gitlab.com/gitlab-org/gitlab-ce/issues) have a green background if they were created recently. Below is an example of a gray content block with side padding using `.row-content-block`. + +![Row content block](img/components-rowcontentblock.png) + +#### Cover blocks +Cover blocks are generally used to create a heading element for a page, such as a new project, or a user profile page. Below is a cover block (`.cover-block`) for the profile page with an avatar, name and description. + +![Cover block](img/components-coverblock.png) + +--- + +
    + +## Panels + +>>> +TODO: Catalog how we are currently using panels and rationalize how they relate to alerts +>>> + +![Panels](img/components-panels.png) + +--- + +
    + +## Alerts + +>>> +TODO: Catalog how we are currently using alerts +>>> + +![Alerts](img/components-alerts.png) + +--- + +
    + +## Forms + +There are two options shown below regarding the positioning of labels in forms. Both are options to consider based on context and available size. However, it is important to have a consistent treatment of labels in the same form. + +### Types + +#### Labels stack vertically + +Form (`form`) with label rendered above input. + +![Vertical form](img/components-verticalform.png) + +#### Labels side-by-side + +Horizontal form (`form.horizontal-form`) with label rendered inline with input. + +![Horizontal form](img/components-horizontalform.png) + +--- + +
    + +## File holders +A file holder (`.file-holder`) is used to show the contents of a file inline on a page of GitLab. + +![File Holder component](img/components-fileholder.png) + +--- + +
    + +## Data formats + +### Dates + +#### Exact + +Format for exacts dates should be ‘Mon DD, YYYY’, such as the examples below. + +![Exact date](img/components-dateexact.png) + +#### Relative + +This format relates how long since an action has occurred. The exact date can be shown as a tooltip on hover. + +![Relative date](img/components-daterelative.png) + +### References + +Referencing GitLab items depends on a symbol for each type of item. Typing that symbol will invoke a dropdown that allows you to search for and autocomplete the item you were looking for. References are shown as [links](#links) in context, and hovering on them shows the full title or name of the item. + +![Hovering on a reference](img/components-referencehover.png) + +#### `%` Milestones + +![Milestone reference](img/components-referencemilestone.png) + +#### `#` Issues + +![Issue reference](img/components-referenceissues.png) + +#### `!` Merge Requests + +![Merge request reference](img/components-referencemrs.png) + +#### `~` Labels + +![Labels reference](img/components-referencelabels.png) + +#### `@` People + +![People reference](img/components-referencepeople.png) + +>>> +Open issue: Some commit references use monospace fonts, but others don't. Need to standardize this. +>>> diff --git a/doc/development/ux_guide/features.md b/doc/development/ux_guide/features.md new file mode 100644 index 00000000000..00700af72aa --- /dev/null +++ b/doc/development/ux_guide/features.md @@ -0,0 +1,63 @@ +# Features + +## Contents +* [Navigation](#navigation) +* [Filtering](#filtering) +* [Search results](#search-results) +* [Conversations](#conversations) +* [Empty states](#empty-states) + +--- + +## Navigation + +### Global navigation + +The global navigation is accessible via the menu button on the top left of the screen, and can be pinned to keep it open. It contains a consistent list of pages that allow you to view content that is across GitLab. For example, you can view your todos, issues and merge requests across projects and groups. + +![Global nav](img/features-globalnav.png) + + +### Contextual navigation + +The navigation in the header is contextual to each page. These options change depending on if you are looking at a project, group, or settings page. There should be no more than 10 items on a level in the contextual navigation, allowing it to comfortably fit on a typical laptop screen. There can be up to too levels of navigation. Each sub nav group should be a self-contained group of functionality. For example, everything related to the issue tracker should be under the 'Issue' tab, while everything relating to the wiki will be grouped under the 'Wiki' tab. The names used for each section should be short and easy to remember, ideally 1-2 words in length. + +![Contextual nav](img/features-contextualnav.png) + +### Information architecture + +The [GitLab Product Map](https://gitlab.com/gitlab-org/gitlab-design/raw/master/production/resources/gitlab-map.png) shows a visual representation of the information architecture for GitLab. + +--- + +
    + +## Filtering + +Today, lists are filtered by a series of dropdowns. Some of these dropdowns allow multiselect (labels), while others allow you to filter to one option (milestones). However, we are currently implementing a [new model](https://gitlab.com/gitlab-org/gitlab-ce/issues/21747) for this, and will update the guide when it is ready. + +![Filters](img/features-filters.png) + +--- + +
    + +## Search results + +### Global search + +[Global search](https://gitlab.com/search?group_id=&project_id=13083&repository_ref=&scope=issues&search=mobile) allows you to search across items in a project, or even across multiple projects. You can switch tabs to filter on type of object, or filter by group. + +### List search + +There are several core lists in the GitLab experience, such as the Issue list and the Merge Request list. You are also able to [filter and search these lists](https://gitlab.com/gitlab-org/gitlab-ce/issues?utf8=%E2%9C%93&search=mobile). This UI will be updated with the [new filtering model](https://gitlab.com/gitlab-org/gitlab-ce/issues/21747). + +--- + +
    + +## Empty states + +Empty states need to be considered in the design of features. They are vital to helping onboard new users, making the experience feel more approachable and understandable. Empty states should feel inviting and provide just enough information to get people started. There should be a single call to action and a clear explanation of what to use the feature for. + +![Empty states](img/features-emptystates.png) diff --git a/doc/development/ux_guide/img/button-primary.png b/doc/development/ux_guide/img/button-primary.png new file mode 100644 index 0000000000000000000000000000000000000000..f4c673f5b88b2f8a7168eb3130968cc1c0e49873 GIT binary patch literal 8410 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 G@P7bpKm))4 literal 0 HcmV?d00001 diff --git a/doc/development/ux_guide/img/button-secondary.png b/doc/development/ux_guide/img/button-secondary.png new file mode 100644 index 0000000000000000000000000000000000000000..57fa65b247c003fc6b543f8c8c888e76a5f7afcb GIT binary patch literal 11160 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 literal 0 HcmV?d00001 diff --git a/doc/development/ux_guide/img/color-blue.png b/doc/development/ux_guide/img/color-blue.png new file mode 100644 index 0000000000000000000000000000000000000000..6449613eb169868b3cc752d9e0bd0ee953d281bc GIT binary patch literal 3865 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

    j!qN`jky2rKFI9t6yS7By^S11iL~ki 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 literal 0 HcmV?d00001 diff --git a/doc/development/ux_guide/img/components-referencehover.png b/doc/development/ux_guide/img/components-referencehover.png new file mode 100644 index 0000000000000000000000000000000000000000..e9fb27e2aa96fd2106c67088e1d5ae6fbe7f4cc8 GIT binary patch literal 11519 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 literal 0 HcmV?d00001 diff --git a/doc/development/ux_guide/img/components-referenceissues.png b/doc/development/ux_guide/img/components-referenceissues.png new file mode 100644 index 0000000000000000000000000000000000000000..caf9477db38da9f5f51a6d752d5e29c67a91a7ce GIT binary patch literal 14587 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 EKjs2P1poj5 literal 0 HcmV?d00001 diff --git a/doc/development/ux_guide/img/components-referencemilestone.png b/doc/development/ux_guide/img/components-referencemilestone.png new file mode 100644 index 0000000000000000000000000000000000000000..5aa9ecd1a783dd94d608549263ab802fca7152db GIT binary patch literal 2468 zcmY+GcU05K7RLjMC9YB<(pQRr0YX50fQqsbS|}1Qgd$CX(u7EmAc24@NN*a759Dni z3iwM1HM&56NFYR{7eUIRM35>?2`DW3_Plf6oS8c_-*eBo_k6zd$0S{`vp5Qt1%p7K zqgIw?sJ;Ec-fBH0ycdnFs6`;q;Xo@hQzwGZ!f;j&M^~(ECA!C+J!Sb4Rpv~0;$>O$ ztu;|HWoF7`9=B(qgSH?Ubf-K2BHxUptM3``z0ro_q~!>QymqqT=3dgO*X&3NZRX)(L9qHR#B6%Bp*Ow?D(mc;63)pG2< zv6cV>C)^2C^or1?o{kneyVnVW~DWx0`TB=q< zdc?AB7TfTxRdhXEUsqO1O`S2?)EGVGsJTy9k!fP3s9++9fIsp(&Fh?8$csz(;4aTm znu|(Z7O8_}-gq1P7WE&mSZ()N&^4rYN+0_YSueghF+t-VwZ=B&-IEJ8#u3K#s;}N) z=D*2X&g9@?zE56^+&*UL zcs0eCT#l$8AA;T^S7C;>7ZT!~-Tt`rL?>Cfdu=daLsd4GQ{|DvJblB&`XY)?IH*IQQfWFWEk{<)Fs8- zj7t8iBKu>*6*S$Y_W`!1+4%sW5TZBt`@aU;-dIy1OxO3?Tm}@n1MGKfcq%zi*B5?7 z(=DKaP}7I-6G~~X0Sxm8>-yR>%o|uPMvBVNLMrr;w)%0^@*5n!oMmMW#2#%PC>9ni zUvlg6eLK)t5nayYTUyvRSXJ?4gOZSUjHBarVV*5st?#xCQdu<-_U z5jVwT?%(}DVLq&)aFYRzsy-)QL>A;HJ(K+_x1gJxiG0fIW5NzE?zHM&u%+@fuwVhY*}3_$KDr>v`1)OOTp(iZ(}8~< z8)oRgUG!X6ke*uV5F+*^gZ__^5JMOW5AOwW;r+R>XJ!&RtoE^));M5Tlmzgj>Jq7Dl3!oZCU6iqllG;CsbxFO^M+*hZN zmtx|X-rWb$`$5p3hW^vy(yXt^mY6+)2;2X{!GGT5tO~sJ~*3UKoqX?qEK1;29Rd=F-1g>891D!58teAn1oO zG$nTfz&T7zCne&~b;bl>M+ZtNo#!LKoX-1cFxv!#=^>Ee1NXA{FQ86zOfy3xelrQ zr9~g}vJ3FFH(*rJjMCOls#nlwm~MB_vZHSc7J>EG!6XHO+X%kDP-mn*o$bSHdNZ9w z)_?_#c2`7-d6yM-AaszP4{{F{4`2s^J~=7No8zX&dPKus&?PYrG*OEj{~#+dnMzhD z(x#W0+-20z-|*Zo)#$-X^}(6NFvh$ZJeVn6=LkUFc9afr3cmFWjH};5T#xRQQ^zs- zdJJrtRJ0++wK6*5yU{JYLU3M;&ebV?|NQxosbVL!=gr{*co}Rv7WyWA>E;FCn`sR{ z#B=e_??fqNT6oNS8*4bcDUNKPO+}4H);9a=zFSOWteWR4|6c$0Bj$$d3gmX&R&C%+j)2vT%yPCu9>npC{nRV=dj=@&A|F2(u3 cwMUQ8Ar?7W-X(H-zb}v#!p@BTo7cU+0Zn_gApigX literal 0 HcmV?d00001 diff --git a/doc/development/ux_guide/img/components-referencemrs.png b/doc/development/ux_guide/img/components-referencemrs.png new file mode 100644 index 0000000000000000000000000000000000000000..6280243859a3c45211e9f3f83af5cae659462666 GIT binary patch literal 12646 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 literal 0 HcmV?d00001 diff --git a/doc/development/ux_guide/img/components-rowcontentblock.png b/doc/development/ux_guide/img/components-rowcontentblock.png new file mode 100644 index 0000000000000000000000000000000000000000..1c2d7096955ba2cf792b30682e1c248718113d87 GIT binary patch literal 19730 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 literal 0 HcmV?d00001 diff --git a/doc/development/ux_guide/img/components-simplelist.png b/doc/development/ux_guide/img/components-simplelist.png new file mode 100644 index 0000000000000000000000000000000000000000..892f507cfc24053f3f5a14f9f13ddf3ee3db8a0d GIT binary patch literal 3078 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 literal 0 HcmV?d00001 diff --git a/doc/development/ux_guide/img/components-table.png b/doc/development/ux_guide/img/components-table.png new file mode 100644 index 0000000000000000000000000000000000000000..7e964c885cf8e1e7c2b78bf59a349d2ff26faf35 GIT binary patch literal 7668 zcmb7}2UJtdx9AU8h}4K6MLJ5aN>Pv^Nt95fNeRV(f^-Z`I!Y)~r6UM@)X)iC2+bfM zU8Hvq0fEq^w;TQ5zuo)RdiSlBHES|upE>)??BCwA-#*rOL`BX_4gdfZTp6kj02hRa z^{*gOVrip`k^}%&931*U_Z10YiUhNx%+S2Gf9#jT{V+VlBck)6E-yff`cNBDjEyf|K4Ut!yU(K}XQwS=h0%}-a|z8ZIJB}J_c zFG6=7RM5SV&+d;?_Jk#+<5!LC5+!7%OLLBY7Jfj%!<>q@N7|bn86<0ReKQTX9wyDz zlS_Q7bQa{|eNksA;hMZwVQJmrQk*1<}JRt=gNN+cWoE%wHLzgCYlT@_+6uz9t~rVKiTVi$CdP#T41h%5V&m7t?JK5JNKg+6J&R6(XD<_V%+Zb z?uLtDMExTMoS#{@3okbsbxev)J9N$35A^(gX#Z8W&2xnhArdX>6|V#yNMVXA^|cTP zR(E`+<*_-e+xl$$N+I>tz3;uN$e&}zyCUHc(G08YCL{oGu%SFew-IwzU4CtmcSz0- zG1(+{=W`{ySu_n%k0IFepS4NE+NLEmsq(j8z(~g`UY>Bja>UF0z(L$;$_8Y_5f^}W#J&5c+n2aKiS5L0e>4fP zTbc0Tbui&RL-2Wj008n=B)Ld>3Cwqq6wF6Q9*9@u0E6hrUn@3atTo+paV^~qJ07(u zWTq3#Y2o|wa!VtXQf)40H7INl#j4w8E+2i(t#hjUIE^SE>PCPK6+$PWkF|!RMDL|Ff!k7piG4d3BUFjQL#&z)Fm7Lf)Q9# z3Sa$Hrk-RvBl3&cf84wE{bea;hQ2Br&@o+nlyW>JN#^8!IbZ2L0p6|^|C5{XdHl?J ztjF#7oOZ7BSV=vBW9!EVTfKqgbZsjGa_%hqu}Kw+F0WNjt-UrorOY8R*k|@moH^FE*rSNK$q3{p8LByhd-b&DyVepQD&hJCego8;+MxIE%`u!4b4GtwM?K-^^mjo^gjM;bwgFdsKmhDiww6H zUrI0!wlY&GG3}BWj&s7+&Yw3bQs

    g0M9qjS9bzMas&cSk48^Ak!ipP*vtae)$Gk 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 literal 0 HcmV?d00001 diff --git a/doc/development/ux_guide/img/features-filters.png b/doc/development/ux_guide/img/features-filters.png new file mode 100644 index 0000000000000000000000000000000000000000..281e55d590c3368e09bc8128c6d1e4dd237e269e GIT binary patch literal 4529 zcmZ`-2Q(Z^*Op}SW=XJiiQap3iwIFx35#V#O9+V;oydw1eYGgDSOlxAURDsj*F_K^ zYV?=HDp8}C@X7nV=luUU|M}0E^PFeq&Yih)=iIq76M@v#prl};AR{BAglnojBqIZi zUvdTD)l1x*Mm3O;(RjhtV1`~-)+d6V6O}=>G0!aL(bN8_#Qh7jc z=DfAVlKfH)LQ6&#sHB6ur2l|8>#djaLo0@!-u0(2~} zcRy>B6ohn#<{IaZdTi0RII%jP43l&uuLuvBRw~Ue9cIw+ue5AouS$mKNOBrH{-fMh znvCZYu(19!wk7&1-^vXM*bWnxJSDala9tdRKsI&9!uf1E z0M~Vf9_svCizjabNMFjzB>q@^xpoLGgtkl~B{m}Q-96NB;nnCXG9Uno z(nz^KrpnAr5}`AOn?A>i-uWpArBzbR^2q7>#uprF18c`uyW3LGD+C>36Hw3uDCpN9 z;yrNm^gh2ZeEP~>TQBzgC4UVzu7MkW0`R1uSy-Ddr2I4U5DG?Z%2pLjY>;IOp zX<3e0R)$#@!lmud1od=l-j=Ll~%?t)YXh= zRc;pjZ3$RJ&wTG5zS)38`okRrTDCppoL*zSHy>yoPI7?dr0Nt?KQy zFp+1hr~*epg$6`T*%*u*fJL4+~SrzR?mC!LPt2gYNQVf9NmRZLN*y1!IACczO4)gZ9=6 zYr;sgw(c&hn#=jSC{xP270-ObH-JLLp zou^}Et>-5_>;a?P+qcmsszdn*hFSHPtUChO&(K@PHSOF}u|!&x&$S*4B+F`YF{&l6Ncj+-?44TosJgN{iuZ_hC~^C6Q!7^X}ijWJ8_;MSSSspvBRyG zojvBxtEms^=3jt!p6eP}Kb!vu{VRoZpTar4fSP`~X|@_;ZEzDk?6P8N)ix^?ka2yC z)ygRNo?ePQ_*B<6H8_;dS-}iPuW1a4GH*|bxNC@{;#wWQo9V<42`-WI_a&Ol4~Mad z)ZNVbunQOvzl9j%qgj%vKPSpItR?YwD2hlpU=tD&M$J@^4QX+WuFLs`ZnP|?lV$m@ z&7)trYE_aKkk-wQgNX!d!u zOWJdg8TMgi+qj_@zF0o)CNU&9IKo~g?y~>lweyKMq%y}xul0LDQ&(^f3V6~l)+!sb zd%=9N*|-I|RThn(_uWPGJNyme@%0DT#+3@F2K4l;BD(ZY?mtW9EM1nPnTG6&rG%#| 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 E2j?!4i~s-t literal 0 HcmV?d00001 diff --git a/doc/development/ux_guide/img/features-globalnav.png b/doc/development/ux_guide/img/features-globalnav.png new file mode 100644 index 0000000000000000000000000000000000000000..3c0db2247ca3b5fb48ae3e8edce05f522bbbfe55 GIT binary patch literal 8953 zcma)i2UHZ@mM(~75fvqf*a(uN2!aw?5Rf1_$CjL<1OcJRL2?!lT5^<(NNfZo2MJAv z1_=!aG`YK>!|?z2-F0W)+)jkz=eS7ckd{r@;>aS_2?o$yF5z#0s$!lM= zFd`yi9L2S(t!ow4l0-yoUCQ#Zy6=hi7D!U~v>0Em&BGev>s%JUx%~XL-z2^0JW_t4 z!t;2C(C9W3Pd*>4xlMaYenIlr`WIlE_6zVA;3fDA&{S%in$J_E0+?Z@s{lp=zMUuh z9vsO`7@IEGM!qR-n3D$fIKMLx`}S1JVIs>Jv_HOe`mq3-3EV``#HnBH^h+@)5i{}RFtp-(h1M!Ql5;C##wVz+d)L-Si{oAT$Hl~xR`Pyw#ZtJ0i~;n9 zs}n;XT^jP}V;qQhzIRCloB;sF!iEtr!q6-on@qhQ}E&Z8I6I!DDzr6fk zeI5LN2Fe&dZ3ESU$Q~q+Xgwepqe#!K?%vhAb(b}1z#&~zA}yjI)UiC$K3cG?ie^HS zfsLbk@FfY;KyXXe?Bn_Pyyb@nNq!GSgb03NsFRhrI#K%JGfRgzeGAJ>rsV`d8VM36MIS5Lvatq%n2B710i;|oC8P}TC*$HE@e zK9jzL6d4b(W&+uv?`rNyR=ry!zh*?cI6$=bVS|42uxf3n@DF~p^+9#xJ;q`RKfdK2 zgOX)Bif1WhuKioc%6GMpF@ymC zy4Q2+m`cg~O!jpw?+Tz9Qz@LQJKIZF@(Z?r6*Cy5%}wz?c?K4TLwj7hdU@REDH*Uo ziQ+FP!L+efWaEjw=KE6DXM648yVgk2$Tc)W99q@#KquON%zynlDaVTEq1sv-`f}lg zGk<0vh|M>De2=|ADrcrx?jt@bY>f-+(Oej(pTTu-xTSW$RnU|?5~=*cV@!cge(Mvd zSnwy4BR+{orUaq-6M5ZcX6!N&clFkXCcnfeT}DDx3KPVP97bnCsv5&YG95ZzG>GWQ zvYH;EI1J8Sp8(a~tc60o)oU`CaNxjJ_aE?=FuPPtAvTAl?U^Mj)m!fE`jL@eU`hPZ zll3v@s%?ckkSmB^!9EKA_S#j1{1pPYAC|tCXQZ4ffU9uHzsfpSP2F>-L4Uv~tq{NS zm=G?#>--`<-JrRjwK#pDDPtdg3|O}emFs@s$4 z>Ff>5uahI3)N4l3Bkb{Rxd&RZPNKFQRSX4pc)*L2KnX?_`z(i^q%FQc-5+b{x4Rl+ zw5cC7ejBLd(w4JgNtkKcmOe=aH??~ch+Y6moiIU|*U@>(T`~K|;}DrvI>PnEb0M?Z zV~(dL!VMhfU6!V-UYJ&PLzj<`T5HfOiw?kj5aFDe=QjjWV)z_`7uxeUEJz*` zyB3rVN?tzFNcLd&u}$mcP)vykdkh0kz+dITWH(Qrh z_`H;1bdhKG)^?!ZpVi9p&cimS863O53BYgaOx~Oace*FEq1oGRef|7x9dFZ`FI?rj z^M10MwdN@EBZFKC_qNxLk}<~x@aqSj3Weo_MF#qt4^q?ZByWTFasj^F0jn9_6kfh~ z9*nle&)`d}2@WI!gMgOXx7a>r=3$QjRUoWj(-hvpW@uA~I`&ihLsvc729Vwl%US$sO5c-;a_PWoen-oC_`?8}}cdlx7rEo6dKPgfivg;5HJ6Efhsb3;otOS>2_5XKpf}(8 zUsq%%ZlW)D6CJTGhu(u7hc)2r)EZ6|K}e4`|Dy*dRZXZZG~Z3=%}K}jNlJ`6e@Psb zHjA)P01btg0UmdOih^?Nmg5og+6GRzf$E=$(A%3kGoblm?3A0Y7cQUEC;R!W<@5k! zp_#FtFRa+Md|Ge)v2~vq$~3`MzQ-l+N86~p{HhJxQG4HF*PzhIm|1QlF`_?)Jhi34 zI>lzeW6uH5G2AS~+RPkeIaLNGdvpPI88*vW*o+bo9uHqOvgQEop+aK!zC_1iB zcqpqad$rZreqU#0Kfb4al0L%qDS=Nqc%;s|1WD{p5Hz&OCcOJRTFzmm~6&N8r#Jy0ESP1do#4|zC@)FG@*hh zeIMpu}y{D75n$@YJ8qjbp7+l0uo7SlsrEX(? zlE((-mFr{D+MX-L*|Uk}CKT+fh8mSg${=t0!F^bybL=X2&VInsUT_LQsf-|*NHVMB zt!D|G>)crAc$mjD+yE)Zn_2irx#3W_aBvM0JCH(bFu)YcP!lPbP18lWvpEntt8^WJo5FWsdQr*8ZK_ zJn-y24=ZG+Ou%{{D7p&SMP%H17VUiWV`nWAKX}oTkR?Nj{*-fZypJDzl=F}!d&SEZ zOL860p@G(|l7we)!|o41GE`h9-#5XY>@9jdR_}^5gRc|J9U<`F5UMALGK&{+udz|& zSh`75@=LetYoN)K>xl>2xiww-Dv1wr5}%Wv|Y}ASK~F&Zx}DXI*S$HAm^tn=t`dQ8}f4ozoZ{M;yY7gRv* zW^8&S!}41vIW&s;r6b;%Rc2_7w;Q_us_~3n;=iGl(6-aK z|1oRsw;j=8;vAcy_!h6QjtS-l5&oVK+kvT4tRiRr4uaFwC-PWZ9`;Hb7Vw9A70${XI~rsRu=zZI1#~|DI7#beL&J;Sz0>{^ zpCPj9O_H<3Xta&LXTZ&*ozZ8e+fzZPZOyZ^&cd{m98N>Fk@=ZTE#A8zu`$N?nak#n zbx0^x-TA(2zs``5*8G8?Wk4fl%E}sinvD-x zJR9}ftj}U~T0V@H4qciq1QI%E_;T@F=sc0RWKVZ~tPYIZaKU$&pK7F4cG;zStKUo% z!q$CeIPbj~NqeUX{4P!P)=z44mt3$V_H0p=I`dE}e+$f+466wHvv>(?6VEMu#doSc zu)=ct7wr^Kww}{~l5W=FE}wUc=9kxe`0`vwGV?Y=`kfZXRrQCM0%l2ZzWtEBN%~np zGNH;@I<=XRWQ`9(5!rw5sae_7wqghA`(QlfWYh3ZGke9(wwm%Yq#l2iQZHnr(yugw z7wEFNXO|Bc-X5oQ5q9$I2&=6MPLJ^9!m7-XZRjc#=AyNJdS^qYpiso)J zS?h(+?tog~ZmLEtXy@k%7#Y1Xm=~PN?`NO1cHJPy26z$?MDhlRJ%?L)Z~N)KL{YA(Jz^V%&~A-kf^FKKw;`fM6Iw*KnV9;tx(>j z6qt2PFwOlzvK~8f`P}@qUq(5v{5k({-B_e9JyE;`@&n`OJVs@OwX;$$)d#$jnSv_) z&WC_sH$FNKe)02PK}^2co6ek9e;h6WJkWenLV%Pod~|%YPg-sDWZe1~&>`U)Xkp=A z!n0%Zy;D+hLtBTqykNAUgyGOUtKNv%Nil*3(Q`yKJ2ICm$h>S*o}PmW9#-k+?W54QgcAjV{7lPfjcu9Z6bIoNs6!Pp zsoD~w-8xy)z_YqB$6C84bIFB$zoh{hUXETl0K|wB3{&$ewGRVmV9*6>{PF|l21ksb zc$3brSxo75*envT)<<&ML3YLWg6eX}3*5hg#g`Wz1$^EQ7tvng&B83qv!2HGu1bQh zPxC*phxh4B0uXj*Q}LTJkF`+DN0@zmx^Ct?~!TUEkvKCdDL zV~nwJn;95XY&Rx*wq!z>)^+nUNw6Wbw;G>(BsMmlq@n-jOyjZ+tf~f@bJz9Oe)827 zt1D6ywB3)wNonOQmMuS+7Euro()OOf37 zYv`698>{?yZFh0u=?%W=#-A?~MK}@`Zm2cYVr?2#mdMdKhJP}Zzlg~H5?@4f|Ku;& zOFIzO={FcVTncf!R*6AEaO1RBB>^Jk-)^~5LSJtM9|jWP#g6!jr^mH!;X_dOeOi=} z#7-7}@Wft0R5RV9&0RW!2YA6ARw23JEf-)Wy1UX*k3!WTH_4$zgOQOi9HbUrLj&=qCE z9a4jX9QO~qH?40~*wV*2=#~!JZb$W~oLAKI;!WDq_b)r)#x8WuaA-fg z^K-v<5CrqV00H(lQ%p+i=_=3qt=E(5LP6J(`@#qb;b$;2leiVPQEywURvSo=@jC{A z9f9DZb$RQt&c|(Sc-E+XhK3u$|Lk?<|}A5sFDNLeQr{>*sct4rwD z3x-rzT)J5V0>0a}3;ImJZmDHiil+s*8Fm9x`8SsO@oM~9)rM1?a|K`!_;R!m^AdY1 zGy-MN(2+y{rn(F0lHa(MPGdxaPUQ ztBmHgmub4ypEoRUhVYr3B2$;%J=yB4IJy*afh1Z@m1dbSgI{IRq+N>nes?ddHyL&y z_ipN^wsY5FC`9CczDq^D(@wB@%y(d)Pm1DhUf`6U_ava&fF0QWZVvRCgOBeFz$s-* zC-PgG-?-|)WS2@xx%d1@xWUZRn6s-#9VbxurC9E*pxlU{;4g0lx`4rO=(WY`P%zam z(uy(KD+pd(7J_h67@0XZfcQr5NU2%|d)3WKCfYX1ga6FU@x=c_D6kUnc#468-! zZrC65SLsXl==IhVKL#N(DYr*`L$y{@5~qN;!%G03zncs6A#>q5!PY{*BZK$RXmDm+ zM=Ng&v#xcqj)>^;oRHWB_DuGRZ=O^K6GA^ewf(3}~8(L#%k!#}VwX_rg* z!Tmv6;UYVEAI4>O_la5|IrG#Um8xp0=kWy=qD-Wj8{g!yVp@}*<+JLu%|~x(x$^oF zcpWoDc9Tr|6Rn*BYsOcKb!>%p`a6`D0vz;#*$iV+M5yz~^u(Gicyc6}~l-~qDEU2u+zC@hP^#@c~=wa;0GIz~aEwl)1fr368Q7cb~{59KW740xt1=vV_Fy!T))d;GN?ItB$gBJ!;7H1mO zd;QQAAAJ1j#&v1P;cx#=J@uTrUK_~a?(N3T~~$i_)P*${TMWBzV~6wvG@KG z{R#Bg<3?L$N$}~$VFD}!EZ1a*KW$nnu>S#c@yW_WyyRox_v>xb7%!YgNpfXye=uO{ zta$t9xGtNO7hmqn-Ad+jfM zW`Sz_z#MYbh=6RKR|nFio#3}(9kuYU)fZfQG1>Q2m)_7bw^m=d0|9rgsrkb?{O!}9 zaJHsgV~(dFN#^jNN1yvMJn^#}S6&iJ0gV7kmf068 z0>@o$mi?_Dz+UV+W|ogSBZZm%PZ4Q6|q0p<3bEH zl)S6yFQBQKdYab}3obEeKK$UN%;(ec@kQh(Y_aPtaqoKzmUA37uGy6-*nM_@&}sGC zU+C1mF-nbwKFZE}V>6J$bLl_13ZLds$*h3n7(Anx|B~ySj5X#Qq>8Ck`*6$WZYQ{n z0SadA+wM}Ml5En|i*pLP5QK}GgI9+^8*qj;w>aoTLuhBS7=b8=z?+Xawppy0SExhJ z^-125CO$d5EWOG>M685|SLtb;WEDA1{I~G%cMkjCgonTDeJNmpYkz$zLodi~hS5*4 z&_f9YRMM9Y2Jf(EF%?IL7T^=w`O_=T^9Qa32v*Ccu2&}-^3A5CTe6(8B0qJmCT^o= z_;TkwT4u`Pw!H^sxL?%(td0XJ$O%Tt6}^<&I+e2-*Txm4YGPCNqA_5LtbVLlS`2X| ze9a!o-J375)G#2~QEmc^u2|kxBWE~Yss1@0Ca?z;-ZP`872(^A8|c^`e*a!4uB9aU zzJ}mT3sqb0@R~CqXT-9$Vb&n3u zkXXT{dj#i|Vg-eI!6fsh2ALo{J1O3w#kN%8cj-5!C0FMIP`j&IQ{SYS-s_wIKY>1Y zQ^;vWjTrz)@VG`eURD~zNpg8N%w*8XHmA%_1GOMNCKyjAR{f^jP#F+7&fm4p+Bd9R z>0a{;>0~9P<=ae`O4Anb(a9lFS~KT}$G)`n7Z(h6E<%kj-w4u;8`A@F+U$w4(QA{COU4P>D zpd_Gq?Qw)Do8UwP2cJ{Bnow*7qw--MD|oieJVV*7%uq?sv-#*g5oX+gTI6<~l1#xF zXyi&?`>mUwwm<6WSDL3|cI4)A9lu3{MljH@yKGGE!6%KD2oA82#vz9`8SxQGkqoQ} zAO!lH=u(Kk5X)ySj3^n`y(_IzgEC=OTy?t{3{G9I*W)*c-GgUK(&K+VX_dXAU(+f! zsT9}_HR3}d$o(? z%H_IDFc|QR1+tyhE0%fY2Y;!LD$x(v_2r!UO7^#- z&Xq6GjW+4Da4y~rrue=`%TXv4FCi#-d;W(8RjtVT>vHlZ5tEM^qm#7KV&>KJ@aI>3;vf#Yie>G-9Qh<+0ki0g3c8<0}8`r(zZIOo8FHJk0OG zwMPvPejJtHvqH@HydkT#C-$W1S20TC~TngVn)^}z` zzZZ6iC59)nX^R`lFw65skJfFhjqziGUL<@HZC%$OTi&ez4-R1tRXEdMk4|=T*W4ku zsXwKPe8oP`b90AjZNlw`VdK*)In(|W0pPM?GGtM+7Gm^`Dq2YFURMdL2tTzWx3;a- zDxJ^`O0r;#ujX7<;j|b@!84K6*wqq$q!Ot&4SmSSSkiWwv_v95*-5Pfz|a7^m0lOzvp6djh~a_6*GT^DTtk^bGt}5 z`4jslJlg`2yn@>y=k|Uj|0;u1Uzq3EkxZ3SlxQ=`G z!U*ni=G#6CEarY}eJGcZBh+_&yD6~Hr{m!zr+pqmWS)TD_D9F9y^4+YN=&t~yaJJ6 ze;p5@x2{5@bf|F~vXP2lED^`DAmg9GM2FlICIJMfNIh)dyevFg;78z zIDKU3?mJR}*}X<3tgb83#IJC$xf*o8my^@zj{4#fuui#GV!Lg+G%v^CcywaORqDWv zW&>V>N=)64=K1iCuNl@1_k80k@i9Au)q?8LM4I_J+fJWn6u6)Bft`G0o!on$r$>!V z)UTUyR@>gRE@{z$18cL*=NR~$wEr}8%Qjog>^khL#tKRN&1#Hd)UfPJ$lKEEzRRlm zoz_P+F52gD)x?QOHyrDU zJc?Cw$STU4->%X{&GR1yEQfCoPR@T4!Z0^zlrk$%?Bx;>Ud~YZMHxIR>Q{(L{HD7^ z+ZwP6VD+@T_4L$uuGTdNPn;rXXj|;6U*V98CHU+lkr5F^5`U`i>A^HVy=SGyn~(Yd z#F7vWX|X-PLs~-DKRW+x|I5yQ)A_%K{TqvaoG|hEe>&rTzudnc7j_MBcDU#5Hj#4m QOAC>*g1UUQ+}qIq0CALe{r~^~ literal 0 HcmV?d00001 diff --git a/doc/development/ux_guide/img/icon-add.png b/doc/development/ux_guide/img/icon-add.png new file mode 100644 index 0000000000000000000000000000000000000000..0d4c1a7692ac2d46bae0babd52fbd8937b5ace5e GIT binary patch literal 155 zcmeAS@N?(olHy`uVBq!ia0vp^%0R5h0VEj8s(kx^RFbEQV~EA+3iMhp{)J=FEOOAI~beq2eXzN8~Z&+lYZi0Yz&l#$O7fRqDrp-ih<;TvS4rw zRr;+rM7{|k8}k#*?xzrWsO%@W-3WP9S%fq~9wCbvEYqRVn=yk0>LaN85z@%AnDPvm zvIu#E^l7N8Zb1G21XX%7)XgyWUqqGuT>_Sc`L7S%?%(Cc@t+|6_c!jx;<3m7U@D&t bilhhtwAkO{q-I3500000NkvXXu0mjfdI)5g literal 0 HcmV?d00001 diff --git a/doc/development/ux_guide/img/icon-edit.png b/doc/development/ux_guide/img/icon-edit.png new file mode 100644 index 0000000000000000000000000000000000000000..f73be7a10fb627b6dc1bdce69e98e3d7b026e458 GIT binary patch literal 231 zcmV5teDWcW&AwOvzw~D5 z&n69S+vh0g=J5RpI5+_QG7K8Xit_;2H?MUTiztA*L#^U2fVIA48(2mZ!0qaX&SZCnM$JJYBAirgyok1B+skhDm*u87(3}n_B h1lecx--l+-0s!GLoK5T3wyc;#J%fGo$9=+q zD>DCNut?Zu2(mgTPK(dzco=N6VHPUNpKAx=K)&;I^>bP0 Hl+XkKT1j4D literal 0 HcmV?d00001 diff --git a/doc/development/ux_guide/img/icon-rss.png b/doc/development/ux_guide/img/icon-rss.png new file mode 100644 index 0000000000000000000000000000000000000000..c7ac9fb13491871f95bdffb728e2dda59bc3d8ca GIT binary patch literal 307 zcmV-30nGl1P)|t+AWYhJ}vmku0i%h`GDers{nugBaa6RK8@_{M5+d*gXed zYo(9)h}+;XCFa#c_jILrMLeM_<6^xyHEW{v$cu$of}0Rx6K=pnDMWb`?~%sn7a5C9 zv>Q~1*Ci=TfKx0!002{cz8(@{we|o2002ovPDHLk FV1hMBi01$R literal 0 HcmV?d00001 diff --git a/doc/development/ux_guide/img/icon-subscribe.png b/doc/development/ux_guide/img/icon-subscribe.png new file mode 100644 index 0000000000000000000000000000000000000000..5cb277bfd5d173a89cd1cb23a1afa2d47823a24e GIT binary patch literal 348 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 literal 0 HcmV?d00001 diff --git a/doc/development/ux_guide/img/sourcesanspro-sample.png b/doc/development/ux_guide/img/sourcesanspro-sample.png new file mode 100644 index 0000000000000000000000000000000000000000..f7ecf0c7c666628fa54453e6426ed8e27dad325a GIT binary patch literal 10948 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 literal 0 HcmV?d00001 diff --git a/doc/development/ux_guide/img/surfaces-header.png b/doc/development/ux_guide/img/surfaces-header.png new file mode 100644 index 0000000000000000000000000000000000000000..ab44d4de6964fc48cc94d545698c9d2e02c1ef3f GIT binary patch literal 6103 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 d`MlFCrw~%UME-N5de?_0szHA0Kgm} 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 bb2y22JwTmqk_R`w{Ync_(2y^ewFv$%Y={28 literal 0 HcmV?d00001 diff --git a/doc/development/ux_guide/img/tooltip-placement.png b/doc/development/ux_guide/img/tooltip-placement.png new file mode 100644 index 0000000000000000000000000000000000000000..29a61c8400a2a4cde8f8cc4aba1628f273aa210c GIT binary patch literal 2645 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 P=%C5VD#?^c8wdVBavAIy literal 0 HcmV?d00001 diff --git a/doc/development/ux_guide/principles.md b/doc/development/ux_guide/principles.md new file mode 100644 index 00000000000..32520845e41 --- /dev/null +++ b/doc/development/ux_guide/principles.md @@ -0,0 +1,29 @@ +# Principles + +These are the guiding principles that we should strive for to establish a solid foundation for the GitLab experience. + +
    + +## Professional and productive +GitLab is a tool to support what people do, day in, day out. We need to respect the importance of their work, and avoid gimicky details. + +
    + +## Minimal and efficient +While work can get complicated, GitLab is about bringing a sharp focus, helping our customers know what matters now. + +
    + +## Immediately recognizable +When you look at any screen, you should know immediately that it is GitLab. Our personality is strong and consistent across product and marketing experiences. + +
    + +## Human and quirky +We need to build empathy with our users, understanding their state of mind, and connect with them at a human level. Quirkiness is part of our DNA, and we should embrace it in the right moments and contexts. + +
    + +>>> +TODO: Ensure these principles align well with the goals of the Marketing team +>>> \ No newline at end of file diff --git a/doc/development/ux_guide/resources.md b/doc/development/ux_guide/resources.md new file mode 100644 index 00000000000..2f760c94414 --- /dev/null +++ b/doc/development/ux_guide/resources.md @@ -0,0 +1,13 @@ +# Resources + +## GitLab UI development kit + +We created a page inside GitLab where you can check commonly used html and css elements. + +When you run GitLab instance locally - just visit http://localhost:3000/help/ui page to see UI examples +you can use during GitLab development. + +## Design repository + +All design files are stored in the [gitlab-design](https://gitlab.com/gitlab-org/gitlab-design) +repository and maintained by GitLab UX designers. \ No newline at end of file diff --git a/doc/development/ux_guide/surfaces.md b/doc/development/ux_guide/surfaces.md new file mode 100644 index 00000000000..d9e48a66185 --- /dev/null +++ b/doc/development/ux_guide/surfaces.md @@ -0,0 +1,53 @@ +# Surfaces + +## Contents +* [Header](#header) +* [Global menu](#global-menu) +* [Side pane](#side-pane) +* [Content area](#content-area) + +--- + +![Surfaces UX](img/surfaces-ux.png) + +## Global menu + +This menu is to navigate to pages that contain content global to GitLab. + +--- + +
    + +## Header + +The header contains 3 main elements: Project switching and searching, user account avatar and settings, and a contextual menu that changes based on the current page. + +![Surfaces Header](img/surfaces-header.png) + +--- + +
    + +## Side pane + +The side pane holds supporting information and meta data for the information in the content area. + +--- + +
    + +## Content area + +The main content of the page. The content area can include other surfaces. + +### Item title bar + +The item title bar contains the top level information to identify the item, such as the name, id and status. + +![Item title](img/surfaces-contentitemtitle.png) + +### Item system information + +The system information block contains relevant system controlled information. + +![Item system information](img/surfaces-systeminformationblock.png) \ No newline at end of file diff --git a/doc/development/ux_guide/tips.md b/doc/development/ux_guide/tips.md new file mode 100644 index 00000000000..190ce9a2ee9 --- /dev/null +++ b/doc/development/ux_guide/tips.md @@ -0,0 +1,46 @@ +# Tips + +## Contents +* [SVGs](#svgs) + +--- + +## SVGs + +When exporting SVGs, be sure to follow the following guidelines: + +1. Convert all strokes to outlines. +2. Use pathfinder tools to combine overlapping paths and create compound paths. +3. SVGs that are limited to one color should be exported without a fill color so the color can be set using CSS. +4. Ensure that exported SVGs have been run through an [SVG cleaner](https://github.com/RazrFalcon/SVGCleaner) to remove unused elements and attributes. + +You can open your svg in a text editor to ensure that it is clean. +Incorrect files will look like this: + +```xml + + + + Group + Created with Sketch. + + + + + + + + + + +``` + +Correct file will look like this: + +```xml + +``` + +>>> +TODO: Checkout [https://github.com/svg/svgo](https://github.com/svg/svgo) +>>> \ No newline at end of file diff --git a/doc/development/ux_guide/users.md b/doc/development/ux_guide/users.md new file mode 100644 index 00000000000..cab4190604e --- /dev/null +++ b/doc/development/ux_guide/users.md @@ -0,0 +1,18 @@ +# Users + +>>> +TODO: Create personas. Understand the similarities and differences across the below spectrums. +>>> + +## Users by organization + +- Enterprise +- Medium company +- Small company +- Open source communities + +## Users by role + +- Admin +- Manager +- Developer \ No newline at end of file From b2a4a7fec72908001820c912203b67579e7a9582 Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Fri, 11 Nov 2016 06:30:33 +0000 Subject: [PATCH 27/31] Use GitLab.com link, remove GitHub link --- doc/integration/shibboleth.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/integration/shibboleth.md b/doc/integration/shibboleth.md index 5210ce0de9a..eb9bbb67e7d 100644 --- a/doc/integration/shibboleth.md +++ b/doc/integration/shibboleth.md @@ -10,7 +10,7 @@ To enable the Shibboleth OmniAuth provider you must: 1. Configure Apache shibboleth module. Installation and configuration of module it self is out of scope of this document. Check https://wiki.shibboleth.net/ for more info. -1. You can find Apache config in gitlab-recipes (https://github.com/gitlabhq/gitlab-recipes/blob/master/web-server/apache/gitlab-ssl.conf) +1. You can find Apache config in gitlab-recipes (https://gitlab.com/gitlab-org/gitlab-recipes/tree/master/web-server/apache) Following changes are needed to enable shibboleth: From e840749b84ceb226e46ebdfb489c735e3370cff7 Mon Sep 17 00:00:00 2001 From: Patricio Cano Date: Thu, 10 Nov 2016 11:36:52 -0600 Subject: [PATCH 28/31] Refactored Sidekiq Throttler and updated documentation --- app/models/application_setting.rb | 2 +- .../admin/application_settings/_form.html.haml | 4 ++-- changelogs/unreleased/sidekiq-job-throttling.yml | 2 +- .../operations/sidekiq_job_throttling.md | 15 ++++++++------- lib/gitlab/sidekiq_throttler.rb | 14 ++++++++------ spec/lib/gitlab/sidekiq_throttler_spec.rb | 6 ------ 6 files changed, 20 insertions(+), 23 deletions(-) diff --git a/app/models/application_setting.rb b/app/models/application_setting.rb index 075e4f4fc9d..d1e1b45ab43 100644 --- a/app/models/application_setting.rb +++ b/app/models/application_setting.rb @@ -19,7 +19,7 @@ class ApplicationSetting < ActiveRecord::Base serialize :domain_whitelist, Array serialize :domain_blacklist, Array serialize :repository_storages - serialize :sidekiq_throttling_queues + serialize :sidekiq_throttling_queues, Array cache_markdown_field :sign_in_text cache_markdown_field :help_page_text diff --git a/app/views/admin/application_settings/_form.html.haml b/app/views/admin/application_settings/_form.html.haml index 9b1b3f0e16e..a236335131a 100644 --- a/app/views/admin/application_settings/_form.html.haml +++ b/app/views/admin/application_settings/_form.html.haml @@ -304,9 +304,9 @@ .form-group = f.label :sidekiq_throttling_factor, 'Throttling Factor', class: 'control-label col-sm-2' .col-sm-10 - = f.number_field :sidekiq_throttling_factor, class: 'form-control', min: '0', max: '0.99', step: '0.01' + = f.number_field :sidekiq_throttling_factor, class: 'form-control', min: '0.01', max: '0.99', step: '0.01' .help-block - The factor by which the queues should be throttled. A value between 0.1 and 0.9. + The factor by which the queues should be throttled. A value between 0.0 and 1.0, exclusive. %fieldset %legend Spam and Anti-bot Protection diff --git a/changelogs/unreleased/sidekiq-job-throttling.yml b/changelogs/unreleased/sidekiq-job-throttling.yml index 1f3aad7ae96..ec4e2051c7e 100644 --- a/changelogs/unreleased/sidekiq-job-throttling.yml +++ b/changelogs/unreleased/sidekiq-job-throttling.yml @@ -1,4 +1,4 @@ --- title: Added ability to throttle Sidekiq Jobs merge_request: 7292 -author: Patricio Cano +author: diff --git a/doc/administration/operations/sidekiq_job_throttling.md b/doc/administration/operations/sidekiq_job_throttling.md index 33cedee7ebd..ddeaa22e288 100644 --- a/doc/administration/operations/sidekiq_job_throttling.md +++ b/doc/administration/operations/sidekiq_job_throttling.md @@ -3,14 +3,15 @@ > Note: Introduced with GitLab 8.14 When your GitLab installation needs to handle tens of thousands of background -jobs, it can be convenient to prioritize queues that need to be executed -immediately, e.g. user initiated actions like merging a Merge Request. +jobs, it can be convenient to throttle queues that do not need to be executed +immediately, e.g. long running jobs like Pipelines, thus allowing jobs that do +need to be executed immediately to have access to more resources. In order to accomplish this, you can limit the amount of workers that certain -slow running queues get can have available. This is what we call Sidekiq Job +slow running queues can have available. This is what we call Sidekiq Job Throttling. Depending on your infrastructure, you might have different slow -running queues, which is why you can choose which queues to throttle and by -how much you want to throttle them. +running queues, which is why you can choose which queues you want to throttle +and by how much you want to throttle them. These settings are available in the Application Settings of your GitLab installation. @@ -24,8 +25,8 @@ and rounded up to the closest full integer. So, for example, you set the `:concurrency` to 25 and the `Throttling factor` to 0.1, the maximum workers assigned to the selected queues would be 3. -``` -limit = (factor * Sidekiq.options[:concurrency]).ceil +```ruby +queue_limit = (factor * Sidekiq.options[:concurrency]).ceil ``` After enabling the job throttling, you will need to restart your GitLab diff --git a/lib/gitlab/sidekiq_throttler.rb b/lib/gitlab/sidekiq_throttler.rb index 771736e7606..d4d39a888e7 100644 --- a/lib/gitlab/sidekiq_throttler.rb +++ b/lib/gitlab/sidekiq_throttler.rb @@ -3,18 +3,20 @@ module Gitlab class << self def execute! if Gitlab::CurrentSettings.sidekiq_throttling_enabled? - current_application_settings.sidekiq_throttling_queues.each do |queue| - Sidekiq::Queue[queue].limit = set_limit + Gitlab::CurrentSettings.current_application_settings.sidekiq_throttling_queues.each do |queue| + Sidekiq::Queue[queue].limit = queue_limit end end end private - def set_limit - factor = current_application_settings.sidekiq_throttling_factor - - (factor * Sidekiq.options[:concurrency]).ceil + def queue_limit + @queue_limit ||= + begin + factor = Gitlab::CurrentSettings.current_application_settings.sidekiq_throttling_factor + (factor * Sidekiq.options[:concurrency]).ceil + end end end end diff --git a/spec/lib/gitlab/sidekiq_throttler_spec.rb b/spec/lib/gitlab/sidekiq_throttler_spec.rb index ac4a64c0f43..ff32e0e699d 100644 --- a/spec/lib/gitlab/sidekiq_throttler_spec.rb +++ b/spec/lib/gitlab/sidekiq_throttler_spec.rb @@ -11,12 +11,6 @@ describe Gitlab::SidekiqThrottler do ) end - describe '#set_limit' do - it 'returns the correct limit' do - expect(Gitlab::SidekiqThrottler.send(:set_limit)).to eq 4 - end - end - describe '#execute!' do it 'sets limits on the selected queues' do Gitlab::SidekiqThrottler.execute! From deef24a27dd09f7f42221e6900a1b96db0e4ad47 Mon Sep 17 00:00:00 2001 From: Achilleas Pipinellis Date: Fri, 11 Nov 2016 18:20:41 +0100 Subject: [PATCH 29/31] Rename README.md to index.md --- doc/development/ux_guide/{README.md => index.md} | 6 ------ 1 file changed, 6 deletions(-) rename doc/development/ux_guide/{README.md => index.md} (98%) diff --git a/doc/development/ux_guide/README.md b/doc/development/ux_guide/index.md similarity index 98% rename from doc/development/ux_guide/README.md rename to doc/development/ux_guide/index.md index e17a4559069..1a61be4ed51 100644 --- a/doc/development/ux_guide/README.md +++ b/doc/development/ux_guide/index.md @@ -31,8 +31,6 @@ The previous building blocks are combined into complete features in the GitLab U --- -
    - ## Research --- @@ -42,8 +40,6 @@ How we think about the variety of users of GitLab, from small to large teams, co --- -
    - ## Other --- @@ -55,5 +51,3 @@ Tips for exporting assets, and other guidance. ### [Resources](resources.md) Resources for GitLab UX - ---- From 406eda17d444e534bfa429d8c72a90c8f91a6f00 Mon Sep 17 00:00:00 2001 From: Achilleas Pipinellis Date: Fri, 11 Nov 2016 18:20:56 +0100 Subject: [PATCH 30/31] Remove
    and replace GFM blockquote with the Markdown general [ci skip] --- doc/development/ux_guide/basics.md | 26 ++++------------------ doc/development/ux_guide/components.md | 30 +------------------------- doc/development/ux_guide/features.md | 6 ------ doc/development/ux_guide/principles.md | 14 +----------- doc/development/ux_guide/surfaces.md | 8 +------ doc/development/ux_guide/tips.md | 4 +--- doc/development/ux_guide/users.md | 6 ++---- 7 files changed, 10 insertions(+), 84 deletions(-) diff --git a/doc/development/ux_guide/basics.md b/doc/development/ux_guide/basics.md index 7e7cb103694..62ac56a6bce 100644 --- a/doc/development/ux_guide/basics.md +++ b/doc/development/ux_guide/basics.md @@ -10,15 +10,11 @@ --- -
    - ## Responsive GitLab is a responsive experience that works well across all screen sizes, from mobile devices to large monitors. In order to provide a great user experience, the core functionality (browsing files, creating issues, writing comments, etc.) must be available at all resolutions. However, due to size limitations, some secondary functionality may be hidden on smaller screens. Please keep this functionality limited to rare actions that aren't expected to be needed on small devices. --- -
    - ## Typography ### Primary typeface GitLab's main typeface used throughout the UI is **Source Sans Pro**. We support both the bold and regular weight. @@ -36,8 +32,6 @@ This is the typeface used for code blocks. GitLab uses the OS default font. --- -
    - ## Icons GitLab uses Font Awesome icons throughout our interface. @@ -62,14 +56,10 @@ An 'x' is used for closing UI elements such as dropdowns. ![Add icon](img/icon-add.png) A plus is used when creating new objects, such as issues, projects, etc. ->>> -TODO: update this section, add more general guidance to icon usage and personality, etc. ->>> +> TODO: update this section, add more general guidance to icon usage and personality, etc. --- -
    - ## Color ![Blue](img/color-blue.png) @@ -87,26 +77,18 @@ Red is reserved for delete and other destructive commands ![Grey](img/color-grey.png) Grey, and white (depending on context) is used for netral, secondary elements ->>> -TODO: Establish a perspective for color in terms of our personality and rationalize with Marketing usage. ->>> +> TODO: Establish a perspective for color in terms of our personality and rationalize with Marketing usage. --- -
    - ## Motion Motion is a tool to help convey important relationships, changes or transitions between elements. It should be used sparingly and intentionally, highlighting the right elements at the right moment. ->>> -TODO: Determine a more concrete perspective on motion, create consistent easing/timing curves to follow. ->>> +> TODO: Determine a more concrete perspective on motion, create consistent easing/timing curves to follow. --- -
    - ## Voice and tone -The copy for GitLab is clear and direct. We strike a clear balance between professional and friendly. We can empathesize with users (such as celebrating completing all Todos), and remain respectful of the importance of the work. We are that trusted, friendly coworker that is helpful and understanding. \ No newline at end of file +The copy for GitLab is clear and direct. We strike a clear balance between professional and friendly. We can empathesize with users (such as celebrating completing all Todos), and remain respectful of the importance of the work. We are that trusted, friendly coworker that is helpful and understanding. diff --git a/doc/development/ux_guide/components.md b/doc/development/ux_guide/components.md index 6b21566265c..764c3355714 100644 --- a/doc/development/ux_guide/components.md +++ b/doc/development/ux_guide/components.md @@ -17,8 +17,6 @@ --- -
    - ## Tooltips ### Usage @@ -33,8 +31,6 @@ By default, tooltips should be placed below the element that they refer to. Howe --- -
    - ## Anchor links Anchor links are used for navigational actions and lone, secondary commands (such as 'Reset filters' on the Issues List) when deemed appropriate by the UX team. @@ -57,8 +53,6 @@ The focus state should match the hover state. --- -
    - ## Buttons Buttons communicate the command that will occur when the user clicks on them. @@ -87,8 +81,6 @@ Follow the color guidance on the [basics](basics.md#color) page. The default col --- -
    - ## Dropdowns Dropdowns are used to allow users to choose one (or many) options from a list of options. If this list of options is more 20, there should generally be a way to search through and filter the options (see the complex filter dropdowns below.) @@ -103,8 +95,6 @@ TODO: Will update this section when the new filters UI is implemented. --- -
    - ## Counts A count element is used in navigation contexts where it is helpful to indicate the count, or number of items, in a list. Always use the [`number_with_delimiter`][number_with_delimiter] helper to display counts in the UI. @@ -115,8 +105,6 @@ A count element is used in navigation contexts where it is helpful to indicate t --- -
    - ## Lists Lists are used where ever there is a single column of information to display. Ths [issues list](https://gitlab.com/gitlab-org/gitlab-ce/issues) is an example of a important list in the GitLab UI. @@ -141,8 +129,6 @@ List inside panel --- -
    - ## Tables When the information is too complex for a list, with multiple columns of information, a table can be used. For example, the [pipelines page](https://gitlab.com/gitlab-org/gitlab-ce/pipelines) uses a table. @@ -151,8 +137,6 @@ When the information is too complex for a list, with multiple columns of informa --- -
    - ## Blocks Blocks are a way to group related information. @@ -178,8 +162,6 @@ Cover blocks are generally used to create a heading element for a page, such as --- -
    - ## Panels >>> @@ -190,8 +172,6 @@ TODO: Catalog how we are currently using panels and rationalize how they relate --- -
    - ## Alerts >>> @@ -202,8 +182,6 @@ TODO: Catalog how we are currently using alerts --- -
    - ## Forms There are two options shown below regarding the positioning of labels in forms. Both are options to consider based on context and available size. However, it is important to have a consistent treatment of labels in the same form. @@ -224,8 +202,6 @@ Horizontal form (`form.horizontal-form`) with label rendered inline with input. --- -
    - ## File holders A file holder (`.file-holder`) is used to show the contents of a file inline on a page of GitLab. @@ -233,8 +209,6 @@ A file holder (`.file-holder`) is used to show the contents of a file inline on --- -
    - ## Data formats ### Dates @@ -277,6 +251,4 @@ Referencing GitLab items depends on a symbol for each type of item. Typing that ![People reference](img/components-referencepeople.png) ->>> -Open issue: Some commit references use monospace fonts, but others don't. Need to standardize this. ->>> +> TODO: Open issue: Some commit references use monospace fonts, but others don't. Need to standardize this. diff --git a/doc/development/ux_guide/features.md b/doc/development/ux_guide/features.md index 00700af72aa..9472995c68c 100644 --- a/doc/development/ux_guide/features.md +++ b/doc/development/ux_guide/features.md @@ -30,8 +30,6 @@ The [GitLab Product Map](https://gitlab.com/gitlab-org/gitlab-design/raw/master/ --- -
    - ## Filtering Today, lists are filtered by a series of dropdowns. Some of these dropdowns allow multiselect (labels), while others allow you to filter to one option (milestones). However, we are currently implementing a [new model](https://gitlab.com/gitlab-org/gitlab-ce/issues/21747) for this, and will update the guide when it is ready. @@ -40,8 +38,6 @@ Today, lists are filtered by a series of dropdowns. Some of these dropdowns allo --- -
    - ## Search results ### Global search @@ -54,8 +50,6 @@ There are several core lists in the GitLab experience, such as the Issue list an --- -
    - ## Empty states Empty states need to be considered in the design of features. They are vital to helping onboard new users, making the experience feel more approachable and understandable. Empty states should feel inviting and provide just enough information to get people started. There should be a single call to action and a clear explanation of what to use the feature for. diff --git a/doc/development/ux_guide/principles.md b/doc/development/ux_guide/principles.md index 32520845e41..1a297cba2cc 100644 --- a/doc/development/ux_guide/principles.md +++ b/doc/development/ux_guide/principles.md @@ -2,28 +2,16 @@ These are the guiding principles that we should strive for to establish a solid foundation for the GitLab experience. -
    - ## Professional and productive GitLab is a tool to support what people do, day in, day out. We need to respect the importance of their work, and avoid gimicky details. -
    - ## Minimal and efficient While work can get complicated, GitLab is about bringing a sharp focus, helping our customers know what matters now. -
    - ## Immediately recognizable When you look at any screen, you should know immediately that it is GitLab. Our personality is strong and consistent across product and marketing experiences. -
    - ## Human and quirky We need to build empathy with our users, understanding their state of mind, and connect with them at a human level. Quirkiness is part of our DNA, and we should embrace it in the right moments and contexts. -
    - ->>> -TODO: Ensure these principles align well with the goals of the Marketing team ->>> \ No newline at end of file +> TODO: Ensure these principles align well with the goals of the Marketing team diff --git a/doc/development/ux_guide/surfaces.md b/doc/development/ux_guide/surfaces.md index d9e48a66185..881d6aa4cd6 100644 --- a/doc/development/ux_guide/surfaces.md +++ b/doc/development/ux_guide/surfaces.md @@ -16,8 +16,6 @@ This menu is to navigate to pages that contain content global to GitLab. --- -
    - ## Header The header contains 3 main elements: Project switching and searching, user account avatar and settings, and a contextual menu that changes based on the current page. @@ -26,16 +24,12 @@ The header contains 3 main elements: Project switching and searching, user accou --- -
    - ## Side pane The side pane holds supporting information and meta data for the information in the content area. --- -
    - ## Content area The main content of the page. The content area can include other surfaces. @@ -50,4 +44,4 @@ The item title bar contains the top level information to identify the item, such The system information block contains relevant system controlled information. -![Item system information](img/surfaces-systeminformationblock.png) \ No newline at end of file +![Item system information](img/surfaces-systeminformationblock.png) diff --git a/doc/development/ux_guide/tips.md b/doc/development/ux_guide/tips.md index 190ce9a2ee9..8348de4f8a2 100644 --- a/doc/development/ux_guide/tips.md +++ b/doc/development/ux_guide/tips.md @@ -41,6 +41,4 @@ Correct file will look like this: ``` ->>> -TODO: Checkout [https://github.com/svg/svgo](https://github.com/svg/svgo) ->>> \ No newline at end of file +> TODO: Checkout [https://github.com/svg/svgo](https://github.com/svg/svgo) diff --git a/doc/development/ux_guide/users.md b/doc/development/ux_guide/users.md index cab4190604e..717a902c424 100644 --- a/doc/development/ux_guide/users.md +++ b/doc/development/ux_guide/users.md @@ -1,8 +1,6 @@ # Users ->>> -TODO: Create personas. Understand the similarities and differences across the below spectrums. ->>> +> TODO: Create personas. Understand the similarities and differences across the below spectrums. ## Users by organization @@ -15,4 +13,4 @@ TODO: Create personas. Understand the similarities and differences across the be - Admin - Manager -- Developer \ No newline at end of file +- Developer From 9d0dc681045728b561382b296f4fe1a2ddbd7ceb Mon Sep 17 00:00:00 2001 From: Victor Wu Date: Fri, 11 Nov 2016 17:25:04 +0000 Subject: [PATCH 31/31] Update README.md to link to UX guide --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index dbe6db3ebed..f63543ca39d 100644 --- a/README.md +++ b/README.md @@ -82,6 +82,10 @@ GitLab is a Ruby on Rails application that runs on the following software: For more information please see the [architecture documentation](https://docs.gitlab.com/ce/development/architecture.html). +## UX design + +Please adhere to the [UX Guide](doc/development/ux_guide/readme.md) when creating designs and implementing code. + ## Third-party applications There are a lot of [third-party applications integrating with GitLab](https://about.gitlab.com/applications/). These include GUI Git clients, mobile applications and API wrappers for various languages.

    E7)oAiokcJ#t{? z9YF+zNnc~}*`O;smwd#49;Z@6-aY)h*e=*FSpU8z_667L-4q%kqVEhz_feftvhN%j z&W~R1V0gNbE%jd)nAi20Ma+E~-#!V~U?Px7EV-H1bjN{+b2vzAm~Rmd=OE&5Cy5d} zwg!|V$wOqcB$ZqSx9c{27h2}-Q={6=jhm~*ZocV2u3pAZh1XUEZRx7|=wYx+9uhD# zCs_?*5P8e!RX1VP82`hyrsgX|9IesP95Vtde;_82H2ws*nusM^^|qImafp4{Vu2NG z^|uaCT<%M_fkaxI$5-<@?`5XC$2^Fj73?To9yT~H45f7P2e|EfW^>5^03<*R>p2_t z%F8qfG}i~7pUb~kg~84w5)ce#Wd#c$IXI9=6za#{2{}l`{6MFhoAL?j@+ zcS2P_K&3Y+2|)!zXrTnj3*Wo%yzjif-nYB6v%j6)+1Yb;X3oYV%#C@u#JB(e0I#Wu zktLH;nKZ@8&g?UshdKZNezK{NzBQUCW>%<)XPa&<&u$C*D9%rAg zs`Z@CGWV^Z{WV52x9}ZjLYp1ZL(l12PZfH0dirEoA*uELH~vDco7?uZH&iLr%Kl*y zbAakYFr@i-Z+CRsi+FRsr(yb&)FwhyJ|U*<^an?NXUq-tB(3l$fv}qDieUdCQ{aao zA|Z*VBeYvAa8>0*ij+azh&VeY+9eI_C=S7^AEYNYdgGM$C0#nDW*L4VqvKUD#7dMv zp?Y7&-v-hQ|D@8n2Ty{lYB&OMLiokFZ-T_4w+`$K?7Nxs2Tr4l6crXQ#BO|x{bV2E zR{<{XmkO>$XA>|wjF}T8DvC=KEN01t9|#zzw&)8OUy@ts7ECLPjEEA*bF@lq`Ymat znAc_o^w{EqmrU)Z$;k5*>%MUb-c$rsycwPCi)q=VheUi$b|D_Thu`cQC)!9o31G$V z=+-ve>0U6MbgtJza%*EAA2Mv5r(jZ`R#_(NJ+cZob_e?r`o&APpAC|CdVVZd~QCahjEn-ia9 zvr@m4y#mm)y+cLV4cPsd>D+8!`Qj!cONbb)v*sA!&;a!P7*>{_>i;QC2kE2ZlATU8 zt%Sk}I-kbgxBCTwZ4H3XJ+emw%}mUF-Ftp z!X`o4m$>`3t25NSOXgqlkyD=yDZ zDMi3tZN~eiRmLDDwGr7mihh$(U@^AH-WC?V{R+NKHF|b+`c2|X)*@)!c9yBr{+0(E zY=J5=&ux<^a&4926G6q!ADOcdGwD23OnItE31TZ^^K6Z^yl$h%ODf_bti8Il^%TB+ zI&ZG<&3hnkbVy37)tGbcF?@%W#Li*lArD>>Mb8@6Dj+%nz|U+tdH3wT@H)FX)&mgd z3R!31fO=wVpmb;F_jHwLw%F%2U#Co|i*6y(R2z=hjf~Hef`>e^Mt0ZL0%9*KtGBTu z&Yc-_-95czd4)leA!wU_{{0O;LE`}Oqo&Rh41k|;D!o4)iw$#P?!C%Q2Z-dMaJ3Ao zLSUY<`V<>y=x9U$xI6`b94Pbq6QF|V3}q8Vwwo)JvR!SzBjJ_|;0AjSlKdVU+tk*T ziy~w~+3K4!P95Yc_p+X5^Frn50ME)2%uaZ|(U|9jCsKu-$fYsARQE22TT*Wp*dGad z3zwyOYmg^}!>{xq!_(qvDD$N?maFZyxLQu;!IvOo&?L>TdX2vLUhd9Vr$egn{Kozw z^|I^gEVLBnFbm`t=FJV@+*7)G~a9SEqCnBgY5 z=>iCbH`9FX_9U?Fs$U`=oYWq@pn}Lq2zedUcq&_AB$N4~l0fw>CgC`l^|9V%2Q~O@ zjEF@q$oCx=%&Pmqu9=AUxr80P)e)$L;4K+@2B?FAVg1|2n;R)YZ6{VhJN$f))%nI* ziXf=)6WC9L@=*gDM#_lE4=h^YR2dhrs4QPgXkJ~8C4lO@lY_5n{tSaXBl9Iw&B>gOOAM3!J+5*{re; zMx_9_|633=l`Y_0oqI)Xs(ed|?hj+eU?AM=?DBEedJ8}Z&%JO$I6=CcAPqaJoM&O2 zJe)j0ZXO^jvqln_?P!6(e**u}_K&Xr)n*80s{S{41pdG9A4~qPp`1K&|86%Y59B|A z{LEVoNz%y&a&5In>)4ga+CQa7nMZuC;)sp)FUQV)fa2a2&~+_nb||00EmJKVrs$z9 zE@5@0;C!tTHXx#B*Q+NZVUO;W)!23ZbkIbWJAK45wy(suXyBo13#{b4)h|-d}wUrCsN;RJuJ4y7 z>ZDg!*QT0U8iMa(ev@CPdpv$Lc>rtHauIo{yRWyIr#I)*$H&hx7)I%8drq`aO|?mA5vbx`@Jw8e-@gMV%Nz$5zkZqo4h6?R!UK7SRapbxL~{IGgVU z$iY^eh0&9$NAeI$t_gKxBW}wVQ#>ZhD!um04l5?{l~+FS{-FDxld)%Hu6I%kaLvcPtA#UZ?#aT!j9-@}o0(%@f@ZQcq=&rRecv$!2bjqSaFQj=u%% z<{pY*BHR{RTD4i}u^hCj&nr(Wz8C;6NmdUNtV*(tddwB;KN4t%r5*E8tIf}2&Cnm9 zmmVBWE2K|GY@PyY*UxDYSE|?_Xrv!L!n(bEsQ?vX@#JPDRWpS6+nQS*gr8oH5;`Lb zQyQP+rX)@L>KYUoi0=xW&7VO|f7aNoKsn)`2;-!&U@@Ipgfb z0%Nz9h4t=xz>Cv#?2ummu2Y^hWfP7Y6tlQE5A9^tHm^7zDVm7p5Q$gYbw=Bv{{6=7 zM5z0EnUB>#0yGT)i5NQDJoFqCrAjFi}z?k zSqcCJLl;`2<_(bSZ+~AKrIevFTI-dT#%dhsg))4mi}_45lchkX~d0u;Z|4&w`Vct@EU1 zQUZP%{;Vs|Qfc#UjU)=7Msz#hpX<3+V;oJ`tR6+p#08(K9usF`Wg`f=`e zWzO%dkDY;*tQN0i?P`!l#7xDPP8N2SUZmW}N_U;lL@G8v&RR*B1b~{=QIB9%4Q?Ju z_;q|whu`mP=z(~l`S&Jmu@n5~WXo~(Tj6nww;7mxm2>XExz2_#SG2B}xW4k-b4N(F{z@i2OwStCIQ>cuyIre?}!| zY$eMWmqdH36!`w_fl#m(jVGpP)pWkUKU+0I-MpFP^RyZgEMbS({tV2DH@avYmdGad zHOd>cqyot`*NRv#>NWWF=oD?zDIQF5cp!Ej)b`SBHRhLy8G0n`j)NU-*QdkM0BHfV zq6<5$^_lE9B$W(Y?H;>@u;O}Ht6mL9>VW^gYG`n&9Yl^3H{OCR*`V1HpJC6eg%+yZ zB#O4QnC?)3QEz@U{OIJ;-#Zsn4-ZUhlDg9+`yz3iXHg#Z&WR_*4@$qg;@UJCAZE*( zZXnStpE-O?zIitF*mDKha#x0mi&$WY%+*3;hTn#gy3Wv+Ziq%OD8WV5kaNU8k1X(M zgeCt%S*mWRlm!r}ZzRU`|>eJjTSie#|Vqc?wKrqggt7Z=awbszmkV}h| z+4UQaPvwR3p)ZQHb&Zb`MNI1x-HaC{Vr2|YMT2O%3e}53=~tndyv-BOgm#0X^7cwx z9E`@E<2!o*4eO;F!GML2o2t)!jZqg0XA$o{i59A|cu@w$%i@G`HFNU@Ony~=5+_Ae z^fWjOY~q}M4SMkLtF{{U%Q~koi@kXLV(!~T;g)v$+w1;abj!DNhbiHRp>(`S&bxs7 zy3D*Ga6D)5N_vq~V1yzp9jA6EYIm#!aY%}vqEl7epJNnnhdp7M| zXJs~-{w8k}5J-FDfG)cV@v&%{zah=%(9Pd`z|5>dI}V6~bqDnMvc_{R@1%COF7~Gm ze>mI0^{6RR)&EQXXL%tLr)_PkvKVhkIC@c<#X%RQwm>>I9uTo{67w01%X|MyR`!O; zJT`5iM$l9GjAyDS)aymE{Cza+Q@hysO`VSyzekxdG9&*-p{?i<^ImO=X}ra{zWSjUT$%2006*?G&Qt2 z*q09`6U=e2s@(t~0RS#hq@jUrINJh^jSV0GV29_Q4T{F$-NiLa5< za!oBu6D*!9GZ~>!MOxeOy!s``v~8W*OwdU)xT*lb$kVb3NMqm4W6~)GI4;+Zgd+LP>bKjFwA{nqnVEN)c4ZvU zb+9I{j&N*WSVEJKMMH_k=*VUv|1d)g`9VY3_-eI_$v7OQCNk*uO?_O~4h3S@>Sb3Er;LzQ~Q zzp#AzMP@Xj_zCoSd6M?5E_>5@7d*Q)4ssG1v)3D8 zekcY+kg`d1JMtiUz|__m^Vzg>wqRG+Na&fS(dg`?K$3_8k}cL)UJc5e2v2dWZR3mF zwXn`xM|nQQx3L5ynyt3G?TYhb`vaz za5mVQpsKXTT-B=bb8-Vf68e6bFOfKA@dqDGLRT54(DZ$<+(eOlNaj9AvTRlUmF6cl zT0DDkZ&V-U+Lwg6l&Wk`5d%BfO35|RoMuAGWn)GD7aHF(iNtt1I@^7}kKVVqe;TcR zadat9*1f@fI$~ukc+CTzkA^Xot~t@twA|FS4wjc!2gN^JAQ=b8b?9%<0zF%Pi5`l0S96m?xJHs^^%bOAhi2?9YpQ2jp&3_bFZ(|sIrBe5|$oAeG zGB6t07>-Lp|4p%fgCOY_>HUTzeslN#BYtQ7T^7AxnSVuKkF!25HAP0dNQExor~!pZ zZ&;$fnK#oi{%3HHEG|7!l7H#`s>jE*zdV{_A5YiAne=y8#(qnhzp7-#fVnNaRd;eE zDV3|yrtAw9AcR$+Ps&XQ#Z3~I^nNU?@o`k72d=C97^_h2{Y-_UvsJdr*AVSEQZHC^ zr}R$04Aj}LynRY;DyjnP`Dsq7M2Rt%u1AGP){VIoby@OizPJBS zOjhnqY_JXXy69+m)}XbM6}8Mb1u|EbOOJ z$CwP&=kIM^t->-USdaz?HCesPb*z|^k?s(C#~Lu?>=tAq^?l%h zC#^WKrzOh_SRBtZlqWw_oTy5zBp9IslOtJxYLQY(>eH>(k3s= zT$6cj$jVPKTXJaHo9~?VAVFYUqr!)SvK>9Meh5h#UMC#VOh0Nj%7~^f%WT|K$K)^% zN}%w8Zi6q;Ruf<&Vo^sG3m7UJ!a9vi`3XNC51>QJcZgdDZ{D5;x-k5k1I(MnnnDL&H7}+0Rm* zaF^r#L3(MTOX8rj;wO$@_p5Zhh2Ne)TRUR45}^@6oa6^Xc7-Ir!D2J#=Qd)NmzN`* z@7eV7L(IXzVzy=L*iOgSfD*m6K`HRH;GeMN!GG8ZKp_{&0CaOAz!)kV#om=j{ouXX zW;b1_4=ApYnIg_lKGgwGlzBXDot8jxxRiElCye4H13UUabwHq8Xq>nW^T>1rijK#tsnHyFDQ9$K4*?Qx0qiwvmU8%N(ZInj zqw}f2|7b|oFAe!GfoKTV{3{Bj)?xzqf19Td1@wtmG~H26|7RD3G_o>$aUPBP3;*e4 A1ONa4 literal 0 HcmV?d00001 diff --git a/doc/development/ux_guide/img/color-orange.png b/doc/development/ux_guide/img/color-orange.png new file mode 100644 index 0000000000000000000000000000000000000000..f4fc09b2d9b3cb138b18378e0b1724c5536ed020 GIT binary patch literal 4698 zcma)AXH*l|woXFmAVFG0N|34$2uKs@y-9O`5h(!#q)8`$A_*mchAzDaP;jUsNGEhe zx**bvO6Z{uAnoD2nRnlNYu&Z(seAA9?frc}&N@F%w2^@pJq1zZR5@P`A^Un6sAPM=1T4&=PP4%Tk<;tFCD)4%ZvM(H$$yJ$!VT z%+QIzO%|;KzZlRf2;9TRP3T61x%^PAF^hdtk&K_-K4z~(!K1s`a~~cfV9i|!T)A9@ z!3&S@VQVuu3;QP8Gq*|}tss|`mW_>!xEx9NWUcBFHRh3E$DBR!+*YEgz>XQSTx?l7#a zuNE@$=oqr_@D;2@!DBwCq)zotjdT%H*BgMBWJ}|2n{&xFrz#N&F}a7ON%JxEye3<2 zcC(2s3go^l{~@I_x2x_crW(m&8B-g%v{&(2_f#5IHoRx1x08tm1Wn{x>EXF;o9uV` z&238ycDO<;rC6Jx+Fa7l@kik4*_f)44!g|9x($OPqT)!T0acE)je&HjBX)s z?ND6s#`$58mXC^>wt< zCimXcdlt8zQ&HtF;AdN5k3OtPvt!>M&AbPpk5&RRL-`;x40%Hb55Dajp@|mYLWKw~ zTopEWmnr0G6xPd6k!`-fROyLGjNw2qReW1Jm2Jc2edcH)F8rl z1f=Gs{E0{JnZ-m`P*`rnYJTN#Rjd#f6qUtz~ERj3{>SHZY7V&AP5iKOK9Al6N0qu+|Rxj6E zKFf1gDjoc(1Y8<qtFHLi_5~a9nsh4%UIx7l#^at)>KJ;0LE~06U95jnW5&vXt7aklOi1 z{~WbA&n)*@l6i8$1etThmz6*Cc5b7gVJchLF<;&485I&d9nNB;w)PcYfR?ch20tHSuec}ySA}4HM~KQ2s{JM`)+0(KKv#^nX#ulrDFKr z!-0-MQ`kx5JvQGl5?_zi@0@C(CGE;;w%B={>v>a3p;2kNawv zqsIffZ&>0*pa$N9G8d-?>)6akKGid>RXbpsek4EU4ega#fbZQSPBQcUfRz z7{;$WKQH=0v4ZGuf;yNV&`PHso|SP)<@( zeBT77h-I9@-07{rQ}`|B$OpFV;~Es3!00>u%91>xoi~8|+Hc65$-{{+&zO+{m~AV+ zDlI`oqyB&&6@yD0^CcWt<$Jf2|Ks#VWUd zADuq9GF6#Kqb*q3&AyjiQkp{gP%Sz3T2>j#>4ztHdL7@4^5rw;y?wJaUB?gmq{C-1 z$Wcp6p>M8vD$iI|?D{GN;)luK}Ol@tuhiTV!ue(%-sx1}h8%6BD;uDOeaJfL!8+uopK@x(Nkp7&miB7Lq*rImF6P(_&drQy*> z`v-pCV@hPo3Vv50e^iMGl7`$fccGml8}QYn8rBX_^pTZkd-o_#K=Pgw&B1J7mHbO; z%WTngbh>_M+JWoQ2ird0Me(p$g)eYdruo+Igr30nfsNE1MjWa95y})y1wCZ!^2A6! zU|1H5i&$g80O+ zBOPsY*oiC($2O&GLuHG$_~HJL4^g5%{WTQ{USe+KH{|x(u%t@-Nma8j*Jvi zQlv5e_CW-reS@+p0>{PhcsqrWifC}WL>O@w*+9v-W9^{Tl9g@4tl1{|V@6&pnE|u# z8nKFT`jX|ocEnG~1h0v%b$|Q95&NxmvByvW!p|8;X!nN1b(G!gM@7!7000OG5!PZH zW%^ddw%FBq!wrA|VpNcqL;12pen&!}5Ga@x3a0qgG2|4N$3RT}|8@Vy|Be0^9((mN z`Csne>Hohv1giVL$^Hlb57|HX1<+sI|G58F9PNK5PV|?wf5@!=O8Rd`Qu^WK9ZI5k zir|Y2SEcFYYWL};TKDN%cj4N}3PscTRb=(#0Gs*b{c#4Lq>pxkzK5$hC%r>mhYN9j zxC=*|(mH9LHsl=N`G#(-7bJE%E@AjRbHXw>b!awP19E=k+>Bk>X0QzIx%gVaw>vJJ zXes&NU89Vy_aKxyWVdwS>2^Qwwwh9cuBb5VbmX&KPMVy$^5RC-^NWH0*AAmM+jA8> z(gi=DUe>8RAuUh008R}rtox#iq0D00UZ)1z;~{!?z9*RpSf2>Lvk> z39Gm;>`Ta-GhEzf)Tzkeji42D^|8DocJ6d;bdux5g-P1$q3z|KoP{Wwn@|H2#H^cm z8HO)5xQi@q(e%1m_NBowdLPQ?OvRLTf9Qc;qz>sy<@#tWoK`j4L9QQreYN_$_$iV_WIiVK&l6=%x8jy&OWPv1L|ltjl>t(Dz2Qsr_i6srXv z-JRGzPI*ZxYULf)cKImz@re!Z$G~rVyPNC5){lxZ&B>W7Y(}eq{M#K$$=h#+bnK=e zAKk1)S8Hhb6u0!KTh8ZWmv!LT0#71)Pc#GEro+>VmEZ9(04Fq?;OtH7M&&XYj@RR3a4AZ?~c0CTu{%ZZSD%j3w z*NWFLc?|zis70ic%T@&5CUZW&<9AgP#Ol6KuXLB`Ye?AWE56qZNuB+S0piq6`wXb# zHI#=ofA0AFC(aoINuE`|mxTeFcxYbMhfK=ZJkRq&K$EP!C^c@k^hWY*R!Pz4gW!Ze z1HgOUNEU-cpC0LrBPowzxeEsjd)_PQ$WQqwE;9`lJc`d+;rJo_x(_7^v8;@I`rVN0 z2F>G4lUE%;U{PM&D}1!FQo{aPJv+uIt|ndY)03`0h{x7~U`^NI^)l`_!)vA2`AF^Z z_wNbIuS5mDkiM zn`hTf)alj&8T;Jig}=L+Giik{9rD~+RI)Fp?#DXBPq&sy6Zb+AbOpMy)Y)(f(p@FI{da(A(fs1f8|jjN#Ff9YAtZQ(mO3W zZ6Hi{?@&rtHgI_Swd(U}-7MY>ib+mazkWF8V=IQnCMJ_9G$WQ}kb?znS7zOEcYqgR zd%Kr=cDimM(F-^x@i3??xw;G1=#=ybRsP3h`GH@p3U$`q_n)m|&)b;n;;j`bh7NnB zCI_@W;ejtu{ylP;PbZPO?u4t3T9GXk$Ilmzl~DQ%gijaDWY1HpRt`N5+~gT|l!~s$ zEq72wa9Irc)t4 zO+2eAmb%|Z8s>tu7ss3Vex-!#xvF2etb-%ecQis?jo~~&_5Dx~o$_Ysh1+%+CEOZ4 zq#oHq?A~5}l5w`+98GFV^2(36xvixdyD!L%o zpLP*FFKJ0zFPi6m)fiG~Y@vD{(E0OOLx()*TXax#&_QygiRps@83^T(&5FRu zIy%UL#g80Fm5fhPu0P#6DPJNJk)`kWEs(X7t23};<}?6PCt%Tn%A&#gKv=`3(fGkMy#PnF82mBYU-3H+L&`3i@U+w@GL z_3e4y-`R+STYbYGmVaC*zI90TKO1_#b8SKD@T?(+u24CQSL3(z|rnID3t zOLxV`NDIOjF0Mgoi&Gl6yD1zdEmay#Sl+akHZRUPa$R1~%3_fhw{GBGCeqMau_@ZU zjQLuGeX-^X14VpA&y2zEWGkwfr>S_isk{CrvBo4GWq3a4rD&Qyn|7jkWlE4bGv-Dt z7jjalN#IHxfj%Gl=3#OAm$4t54a3=SpPEGoB0_`AGD%r2>-{M#Zmb*umD#l3KJA+0 zrsW@J)9nn-hT{e_!_7a_hjmlRKbV!8;w)d7DU*sT)&vOa!&1Rmvy=dp!*2{NN)R3++^k`;7}j*$xwmgl)gx7poqw@$<@yIgN+p zY!!X|Dt0782@RTd(auhta}VcVn+Sp~NwYH=5AB^6f7|O-dT&U{3P1yx)yXo-Y^S)5 z_yEtZVEYMZ43JFC5lOf-7BenwGK#@pHjvB-`B$)wKtXXCq@bgtnA7xN r33#1l0aQ$&y!4?^1mf33B9R~`>;pC-sLj@|4?$=JzGGM3Q{VG@}VuaqSu+gMW8jGa;5 zk}V-yBKsh_^5yOQ;r$1`_jB&~+;h(J+;h*p_qoq=?^&1|aj*%n0RR9Ftg(URAu|s9 zFbnihr#XFW0RWDj!W!sa#se3dNryf_YxbU%h|7Td(fChO)z~_9PL2CKaKF@NWS1uX z)oY~6GPI$}XXGF8yV_x+5WXBC(-#sR)*D*MpP?O@G!PQvpKn=Rl*u`DVd88GI%GNx zA$B(B(lXzo{+7NbSs{f=8&O3Vh!ve{%ogro?$-~wE(Lb4rVC}o`tpgO7B(Cro_6WR zioqBKi9ka@<_B<(HUGhn)@`JSubK?qp9uVL9Gu`E2`E#n31QIUI7dZx2@0iI4%yCH z6vu?4=x9T_G_Y6NHll2`SF+GE+l;I&SZ?gYMsd6c%tyk?pL^jF_G*q#xiC{4?*sEK z`Ee<+UDj^AG!_^Bg-(Fg8JKK$)@4(o0~&Vqu{5zsBsOVfowWB#xXx&Sq){s@E*1Uw z6MFtybKEkdAJ47T+F6}DsJp$}k0{tdgH2uKnsm`OAwvz|Ug?qT8M$7B7KpS*pbPng z_&QFcjs)8E*I9H{&4lg91{AD|f=wmlnufat;1dWMPa8dY>#|mU<$Z!uR8?crDAR2Y zs)D?6C2atGni{vdV3x5WW3eR=5url6s&c@2N51JY2wXDR*1Z+`gv1G{;A+b4-dg#| z?yD_fZ0?01{x$1dcV*ND5j&{X+P~d=b&5l$L^04d+gwDb6=0&5{7pq_uW!mb4dl6m*hEb9;kcVrq)U5+RWAB zh9!w#AgBr7MMh13>xE zyUQpFa?}usBfi&T)V&yRQKPsGODvz-QZlY^akUCM$>sW)KHLsH(+02#hn2@Fa6B@5 zm6&u&Fz;m5EtH4i<55jbsW-Lv^PbykmQlmsBLtcv@;mp&*@T;eV6xx&ClnX2S?g2Q zQ-&==B?%L|A)Hki(7cq_^Spxr`VtA8#74hMOsg*uOR`OuiDuFf2kMom22dVP_Xn?; zZ|XAI`*x|E-!toSg=kQ3$zGIgx1(_N3Sh2C zcmO>sUl}NrCj?DnlWppGTfLX_Wz$o2js8i=R5`-_#lph=d=Bk^Z?MS#R<2yI_{3S$ z0N88#(Qwu|c9Z7s&a7eO`oUD8sUHe1iI7;9UFcKPZgZTYRfIw!VR^+7KS~u7OPF@=^$PAy4I_a9a;Zu7zRHSgygqN3s_k=cRy|ePx?UI$jVBg{s zw!7dBZ&?DxuBhzONfi!_L55>soll8e)8%7eY5tICPmizc@@bOS(GCi>x80PKJ^(6q zrE7kPZ;rlk^_pwIaj5)rr`4ke!CT2{`xQ{*iV@VB5!Slg=Up750pp zJB@`mHo z&)2+kI@!ZuH%kHuO(O$QN17k^uXZBdJ9Ie_nKjb49gxT~#fwdgGMjU0EI2LzG3|vl zSB()f%XZ9@_gt(%2owS(F+oYdL+IiTMF+=q4adcQ1PCwxQ5X`-{r@umP5p1;|D-lK zT*v>%EMa~7gc#WZntlh|Te!;#2O%QE%JS85u6oVzE=YF9r~ zs6iw~NMCZ!IlY;QLdXY2Qz7T3*B-CO+(K6^>vSzNB*q;_EI%YLo^gkpOO2@n?+Wm& zg>sX-zwQ@vsfr{DK4{*wHO&6C9G(;%gRuc)j^Z6-J?`$GwI|PgC zEJo8;Ev;IEKm_-PI=4RE#^OBhc!M;4_mM}(H{I4F#^cz!6oDiyg&ozm0+iZS3qs@^ zvbTPTJ|4<_-pwa_dqynYXzR_Xn5n<0kSeDS)gu(0`R?Gp_2Z%Vc~~~?Kn-sHDtgNH z!P#$XA?f7RA#)sj8r0w>>3JcdRWzQeoelr?_HRRmlLR%Mb#bRcmt7PB&&FmgEHpxMu59XM&tP~dT8{tpZ1tA=%8Noh0J)nigJY3 zOJHwNauXv*?IIDKWqceU)7{x1%1z&CZR`9>5=iml(nIX^=vEBuNy-y4ES1jXDcJP~ z5C#X*nl9Q+`zYSk6XUb;_-WZ5UO(pLAk_#Ny@0?3C;kpy>R7D?^z!*xd4Cti>%EXo z4ccWPcVF`}p6D5Jh5t~>XgOhhHnV?S-@!mLe}#4BEQK(AnT`B#$M*5c$#Fb+?V&2L zphgUBQJRbjnwYM555cvp-rdhX4Ma??-%*kdwfET8<0hXQ&1aSQ>aaD9<;=O-Yp5r2 z^2X}<4nEt;EC?o;ITiKsAYGCjPT_1f3A>&kgK_2P1rtDmuV3kj@dhN>uLyB#TzpjB zjQe^cXlBrPvu(fO#T6;i#$F@i?%}C$G<3D`++;bO@HU-TJ?Ae5%8g;V*qtfJ^^jDy zG{n{yLo*3yCHtwDgx|Q;Y|X7x>V+R~98eOM&5Vm-7ngztGWh0<_J$KAfCjvea06yI zxYv-r$8MwgBvM)xcZ{{Xvq$cy*2XfEAMYu}q-SMs3N9H$ZJ7(#8iN=QSmfUSO{ly$ z3L#oRKL@>|)b5n$tdKDx4eqb0{o|ij5ArP>&fKs^U?R`AH_GJkfNILbuce$&#RNzI zyK?{P@2m}p*D8L}sW-$o9+ogvRp`AJfbw6P*m*V1xpjhkZtO;?v|{K!+ib!Zsx=|# z;@*g<-4A^ON7PDN4p~yN&R>d_YiVWSy>gO!A~oyvyo4;7ok%b0a!WrzZDzfYwC;5w2er%kaA4Mx^YwKcDcL}hQaN=mXu8|zc< zC%O7+A^|+tH)?Nk`0e%zX?2bVL`gXN-N+1>ggVkBa-_drx2~D@Qiz3sH1oeGpJZ@A zdcykfb7f(;gtz#dg9N7baaZ}9fcTwy^HfNw8_3z|F{clc3N2Cd+0sDI^z(IbTvhUE z3_*w$(OnH6iySk%fER=#t;)^?c@^6-xrlMI#{m z=Nw;vk^aLkf*e&24=9jSHUEm=p-+kqM((qt4R_t?D5ga?4=x(S3$H{ck|HawH9sB- zh}xs_av&tl_|$af*5&TUxx!zjT- zXS0^M{aj`012^4?ull>O?}`iK+3vH3mD$aeW`B&QgUic%*SjL5FN$@?*rkE9$9gHSft~)Y z;`B&mjPjUh#X4liCJFU9PDt)HmtZCjPbB=MDZ6WrF1Uv8ZF!wv;x0Js3pwGaLY^p) z2Xi44oUQ=m8huC5b54zK;a|x71nnBV^P!Df^8ADoE{a!dcFoxeH)f$xV%V<(VJPj7Z`>MTBAkC1j^^v;LG2n!-lSQqWsB#0lCD`5ad@Jg0G zYO#G)U3snDETg_lG+Q8z!mw$6&aNn`h(T7JonNFiw*Vdmncq|(soiXvij660ds9Hm z&B(_ZAz05V<}$x-DOp6eh?vty@8o|0#yXSz8R(-LeB`*`PZ9g}FDZ?!csyKc&4?~3 zrzYx4`~f0d$LkNCIxvi#SO1+RtasyWmM1&=aadTbF}kPze7neQ;N7Y3^L@ulok^|h zcRaI>B?17?`Qs#eTAtHh#OfR5m97nl0Kp(Akewd_W8vrWKlTsFPXD31e+cs5 wm_HC$Cby@cQy)CzP9*9!5s5$``1&6byo|lGwRJaN_vkB#J#TJMs)vjEAG05AxBvhE literal 0 HcmV?d00001 diff --git a/doc/development/ux_guide/img/components-alerts.png b/doc/development/ux_guide/img/components-alerts.png new file mode 100644 index 0000000000000000000000000000000000000000..0b2ecc16a5f8808fd871e465c3f8e627d4e43bad GIT binary patch literal 46785 zcmagFbyOVB-!zK51a}L;g9mqa*Puxt!2&D}!QFzpyAxa%cL@Y{Sln%K7UyohKY5<_ z-uImQ2j}cg&kj>npYEQi>JC>|mBU0MMT3EX!Bmi!)`Wq9zlMQ<)kJ}V9+}C4KZAj3 z3R94l&~}GCnTJJ%p?-tVV{cA(_3;m}1uCM)x5YPxurM$NrO>nYC}ChYATTg~Eyyr1 ze?(wlQaxc{xV`d=-7KYAno{~h>yMfKnR$91Y4nBgEetm9-XS6bH}r(fSTOXEKV(ndRbvrsmb&e5tM=*vmlef0)kzT`M>76s8CH_f#?zWk^)lMW8twEXbFaeTj} z?<^}$=QVEU@ygr%2V~pY65_afr^KRm_`uGvEGdv;LwUxB9lty0yI%|QD<>T1g>?Dh zINTlqys~1rckB5Kp(&9lc(k<6(gSqxp`~w2u?UIPs`>5~1^KiSZRN%Jb}Vw{C!K6t zUc09`iXP`&V$(YK-o>3wKsL*~OGP5U8#X5cNhQwDZg^vN>7E#bU#-GNzgu8_qfPd zeL8GzG5vJ7*CE+vrtyU(aM87t06bZ#z zuH0aSOYOZthWHZljZU;}NW0$`@+@_4_{67ryK2D7w1O{ zd%0wRfq3Ggt`gxUJcJR!Lq>6tqJq8wtKNjvRFs*1D)U(O`k?yv7Jg+F$W5KFiWN+Z z4jk0R6=8UMFT8*8qRM{2q`|YdKm3bdhkm&b!B2NpW8>^%uT(&MDX;~L_G+f6_`!p~b9KX~YOht0 z+cPJnNSO^qXWvzi;UVg*PZQ(j(<=$EB%Jpv+@B;Cm}@GuaQ)4zPNSQJt=B=b*;F^u zO`ef|2al@x$r+Ni*V6HgkE1&&Jt3xdBjvmmRp}IQ6r`g1m$`rTam_uz0eg;( zl;{ziq|vPRpMFj+EbAvwtv~4>WVLOBeyNhOX-7}lGB!Be$Z(nx>2|wRL`xr>pj--5 zsUAPN*-rDiq@qAjPY4VQD*RasLzgQGb@!_zr-{a6ZaDX!UcHa|7qm2yTHkO1v`+iJ zBI4l;Hh1?}g$kGptkIUXX7seOUpAS|E6T3u9SYTO-Jp&cDg+yOe~P0y<8ptQR0T)( zrFYJUpJwLAH#9HA)y@pZattvaD&pBX!l{d>ZOaWuRmE%I3CkYup2NT6QclbvVz2hG zq%^$ZHyL&>IB|X87$+WY<$N?W`czO$;>*VY^=DcI=NbylNQspY#%AzWaBsZr%z%G(e&$ z5oU29C62aj$3Jm@bz(;jM7aZ%|B`P4a$gs1l|lhE*GuFX=50{!Ng3AG@31rE@Q>y{ zOS-f(V;cm$cO?3dQgNfNemw{Hu7GSdEA}gzN8o8|DF1$v5vyEfdUBC1KO?YjaE{34 z&{GS+sCh^JT9Q6!{~n--LB=}W^lBvvVyIcDyhUgDgnpQJ%UpId$^Z6nP<4vZNma;I z1WiqW#pyM0;7{Wu3{L_ud(sO9QWSm4w#Sm$&?PTu)(FKs{H7!#itj4>;I^)5(sCpz+<#=b8L@hph(K* zo0n20@}yDz?nxAoYr=$cgPBRlsf} z`aY%4<@|}?&we6#MbX%GQVSRf@LuGo=5>=o8k`eV*5$zY?5z~ncysw{uL$oe5!bte z*A)Y)pTpKic*)K9adAF+LJ6OyMktUHA{L`bLqgiJxFMpOeJ*55hlj-_n%lR2UxxT~ zcYlWS>cE}sb%+jLAeZNV=8Aw2J3P9E^uMuXiu;`Z)c&);wS>p-(AYQIgIgw&GsMX* zu~`Ss`XKtW=&Jv3`LhA#3c@R_=7!i*oE(hAHZW?)(sk}Eb=$y~CNAzrJ;hD0PZaK8 z%0;Y{bES<9JNt|M^q>-WOckT8a!}I3>cB5#h$Gv`fTtX%hV5s3b#wwESmi(T-fRDs zK(`4Ev2q5_XybH-9nIj#xbyM_0H$?lknLQ??L>r`*&VUfx zaInm$vhgjp(>RH=RnreYG)K5A&T3k$^B9J_BVvDG7Jg&cYN{2dX1t3ACz`rV!#vr3 zKlpGcA1xD-4MANpq=R;V09MjXfVepFphuH-4ESs4H*7bYD(q9TF(WLJMcqe^k3G^s zH>@(cA7mPj{v*IqxNY=*1z6>;eW#BfsFtXWud8nmoWKeZ&2w7r)%?+QQf97Kk1sS> z%WR?CP=@E6&9{Bh_Z}p2zcd>Cq3j!^GM!tbZf270 z+9ol*aTs!~<$nE{6DRft1mE`=5xwoXu*1Kix_*nt=g#gS<=hE#5rv@nW!b6s*Y%Aq z-8zp;WAVWDA+w*qXjPO=sh{ahxl2#1ER)_>GNPNM!oKM|2l0v|(Q*0AC19iY!~_-< z46URRca5yL^(SNQ)!TXv#i2|4m87MwHBti$@TlpvVHQGq^w`sAymW% zeHMsBIBU&**-eD6EdgG7u#i&~wd)^QdpI}u0`{98cWAudW^Y{BD`nWr7(rI{>9O~x z*uTT0bp!(Y`Vn9T*v}b}_+)s*pU!`7i4f+JAAQ!RADKYkof{CmAP*;XUgL}N{JGgq zrVwTE`m_Bj02?Ee;Qh&M!X~DXcNRhQMIR)ik`GXV_B|-V(D&41?H|5Yc8d*Wwl16r zy2Ys$n$V$qT|)VKbIlDT0+vp^rASsB|7h^*+F`Jr4q)S-eP%3bAQYDD=VN)}%*y`i zDHRssyx~kghKe-s9><`9!lru66YVT6WMdw&ned&i*5rKgK68rZRyUNb*5ChSD`O`i zZdc?&KGwNT@3Yb)lS-Lvy-MbDw&2T{u7+bDcA+RwxPJ1hV847L}#VnWAb6R zDriPHUsPor+86X;hI+hD6N9PyDz^ z0yiday9@mcv$%NFGiRMJjUzKzMR$rn}&H%}NzzQ$xLaF4->W7R78 z%26H0Fv)wfgJA(G_3{~<7+yhw0E;6|7u_*qHb^(&4M4cPyaw2^qr8Y!b(Fv*L(TiZ zD+EA{f2`6Xrm^B9DH*kqAmI7uBAA zSW$}DyB0WsNp5hNp(~WJJS(%3s9-XAaV%SM>D_UhT$acQ#og^z{b@k|X#O!g*qXi8 z8$X&$GY6T|QNZsie0(928@_D99H4fZ;2k+^V#mV};CV?CZbAv!ylS#xt4r3@*Kr^o z=14oBlKCv-k-g{nmD$kRwFTNIWTl&wvyyw--)4)i%qDPWIuu;qlZes!ascJL;jqDn zg(64+^o)Cw3J4V!v;v605;&Ss*f6rj5k?H7_&qeL+|pWxahVSp1hclJ>zd{ka1a>KZy4bImF{b|VYw=2 zk?Nl&=f-^R0N-q6u!KWq=CU-_%(nY4Jjm>V;I5Q=!pKwp3BTg=aO+^} zYUF{R^t(S-OI=fp$B`WNdO8HvamKzOx?~JC<1a1scsCQlK)lv?h1!db@U@QmgKFj? zZc$%62!SO(9%PB!Vm3(zJbxlX5@zBP^*l7y<^j&Bq@XLPJc7W5FKT`P&bkHnOJY*R zypoMSBZLQY#pEXtAlLoERfi3vDv9l<{!;0Lio4xLp&!yHKr>Ym%%eTx!t2ODrbwK5 zMJpbhJ-kJkuW*D-45lx6H6Cw}z;n}a`0BLxuJizV{Yl;3GVz#=wtAEj6}%b z@MQv4H)X>hLKNKYJA6a_{6?AMV!k8}e4!S>1I^%Fx#lTUOi6cGr|9m%Rs1MJo;HWp zW*bu3dt~?vFRBgMRNBgwJ>h%=k_W#Ae+)yd7@l_J35m)C`+2 z^vCmD=9iPX_`|e88U{f{2kUqmdh*9uioQc78Ajht^B<9d=Vg)av+|0>X2jp@>DcP) zf0kz*-Mn&r*Ex;^)+h=|xBvLw2UtYR73CXNUoIRC`KV24X-*?k_7QE2anS5N&|=!r z6)-_E-WKO$z8K`ez0qlB7HM9zqj`UO*Z1l*qme%;EN@M4QlZ3jC$8E4;as(J@x8B- zsj17K2spcLs^g^@f6p@IkE10ZS}s2dSex zMT|#FY;uyMCMmA6^t-3u0IGunA6pa=4L>OveA|A?6+PI*C;F7m&6+dM<%VS_ME*y)0YDn)>byA9Pa)s7WRmpKqy) zDB2%$&i&OM%u_2rz3qKWzP0pOuiR|MM*=B*Y~1mnY?E<-SN5K54~E-ykdD9fqN&gh zuixm*h1oJWd|R(^-{eu%=^pL$zQ`uFJ{<RL`DppMMeaOGKHH(z;W@!Cibjr{v2u<5Pj`Qhpt z;eHXvhRKNF;b|eO)FdVc^bL4rZ^1$O2b5}>CTN|SYQQ+?o!GiGccls)Meg$tX|^H> zRG|8;XkYA{P%Nv8Fc#JZ6OnTL?XR%V{(8CLLx%z44ym_$CpxI$%f9l6@A)z@d~DKE zBG!8`0PhW2TS*BOW=8DEy}9hp_mRr$&>GdjqZ4EZLWcO$O>E@2;eV_2ntWr%)atgZ zP-pk(IL2b&n4$9^$qKZop%6ynKFx7NLBOVeX<=*iEPC}KRTp1JZD>YqJ&yz1D>GzX`gv8Db9Q|0_+v$7VY)qN&c07VgW~)n*7?A z(AHu^P<}~-L+75T8uNf}!`u=ZbK<*9v%o{e%sB*pIN*>T%}~=1@%E;13;Z+Aw~iE} z2&7yaq6vqS9@2m3RX5t`fTZVc+v1!!zII17-=OV4jK z%Tar-lcYOkst-j9xGStYxAMZUTo<3QGcVYW=`JPH&_ zWk6MAm*4XmTB@%p7L**z>~XZh`X>~$nX=rwcxPFUX({o(p_+70@5i8M9h&T;CV9aD z>@y$I(3Klp64h&_RCvh~I$|g};{{tewR#Gy5#N6PLrp_)Hoq0a_uPNI)VJGbuvlf> zrH=iV8tjDTaSC~!jpT2>tb+@n5{07M&q`URdpLBc`-`7iaV>aYd1ppY^F}y}Dc?-c z-~IEvQDv6O*uFP%j>FpQ0e^qO*>8v61 zjnng=rwB{_=S-2{)}N+LY6HGjK8K$Z z<^G0vX2>743Gap4-K_ppiO*B(QGt>rp&*RpFzE&2@y(({~@T>@S3POR?8evB<0Fw1}7MB$f}w%Sw_L>y6Sj4i9{;3e|PvMjsso{W7?YNGPKf zSah?4GzHV#t9EN^`9C0IjKGdF)UT{){&_cEIIZtgvM(&Ae#&j8d)^s5LoC{z0^>Ef z>{(PAK4vI$fT6g>85X!_R&|g11HYR;SwW8;Ry`SSSxyiSwHsQlwM#ROu3zv18PYi3 zrQq(_cJv?J#2QpS*)YB(w^H0EzQo7TQoUsvW);P0zgSm2^^rk^u`O3*4~vUmUU*B2C9lta&O^Mmlo;rl->s5!NT zw}?s2g}sd!a^3E7cEuO9pTD$X&FQyW4tvp$=oT^UeTlsjm?A|FlJ*oar&Yd+TkY{yXf;HGSEFR9b&w?B?7j9N=pk<6Cc%GmVIA4^BE- z>#2-F6KvLTH8c_v%v(LbM|W@)AHE(HS3;M!fa1Jug%dxDM z%|(3EZFrsD7b*HtCqzES7Sb6D4*+#T_ZJ~u9Xoc#!U>jfgaNC6Cj_sPPTF1i&+N1A z46rsE6B-5Q%-zpvtnfr`)HlJi0QZ#FQv->F)+W)>wpv<1moq!LPkxv1<_eK-_?&$E zxuF;>ms&>5VEDz8TV*-OBvC#`FB3Il#z06eCV$EBB{aL>v7_i!GO7uo(qBw2DoGC( z%t`~l;7WayJ$qgo_X52--j5reSGyCa(SNAn;{BD9N*D+fG199;4yc?Qgy(MKX8*fAb zO{ltSQ)Jwoj*5w!`h3pDxiJ!6{(%Ef1HA}=o_=sk=x9z@UlO{-oq`^!(cC*1*>cZ( zjU7jVetbQ3m_6-615m*O`JQl#=WR+0m&;y)H$*i^uaCsA6pQJGwmAh^C(+(d4r(pv zNukuN6fHj_*oSlFD1F232-!kA4nyA!tam7Af+cRquvzSItj}NBSX!xmC;U}escXyw zBl5oWys`C`l+XTVeAVH>09mccF^~^4k=$^WC9C>}`bqm9W7@p6l<8({Yk_2yXpPrl zk{d|~S@jW!W{GF|EPDHAt)Jqdp?BEko{p6J_!1z~zFCXyHh4x5DWtNvx-t5i`Q&-8 zfq(tS-Xfvopx@)ov~kQyz8(7hkRWG!Rc09o_fZv{b;p7Wb49R10UH`6#M0Ml1kg~IO+ZzIesIwe*34nRRoMzp*_stHQxwnJi{b=FtsI|cgp@fpLY9E zfpU;dQ*+Smpti2?AYf*CJ}R(b%1N&h8|3ob)K%5h>AO(86ep<6A)&WVsweyQF?Bu3 zb&Y{$GxjLF0=K`#z*c-N);yKtX3dIcf`9{g!$(i>mysdngvZT(KoWZT2M3NFevTcd zrEPl&zE5uSe1jW4BfxeVfEfEv@bhO~5Q+e0%#@Y?d_SCRrSDNLve!E9Qa@A?!u7}u zwjUztr1LmY)gNs@`loP6tR>&42zF^#5|$|JCOk(#C~fJN#8pLSDy9`$)l-$cRHOqh zR(QfoBbaL+)MMT|epvc=nY%b1USQq@xIADX*L3^qlLxUsmv#&Twsq#j;*4qAG`>3x z_Fm1=^NWEjn+^p^j`>X+&KD6>J%RnPMK4x25_SF^rkRBMh7;s8Z@7>^4AKQkt{Qx1 zC6;)7Gqg&(ykgDK^{+Ey0F>{KZ@St`?-tBTqsx1mHs?b4G8A? z?EpLE3#g>gTUvCpzKZAljxFpnj}sl|xiX>dW=Fhmrg356VbGu%UEu*iNzqr+Z;vU) zON+y;#}BN&#$ue`8!TO~#m2b*BL-;aKVqb%`|;~luxVo|grI6w8}nZn!8*Z!Q;KG! zU73XU=W@_>*(|5~dt$$QLb)KC#9Yk!9mNUE5oN1}zQ}hYNqJfzRhbY@!iXz_T8ee8 zFD3bb%l7kv})B8bW}Q1-;%;${WB3gw|4v5XW~@_CFp=esHUwQ@l8*6NIpjc*2^d%pn1SH0zgd_ee^yy2VIqoF;RhQ~TnEy?66ovkLAVHQ zAr<|1khjN|&2;Ys21~f?tvb|yR3Q6ER9r~u*Qy$cm0M`Ttw>=cp_BVTyeduk*tm5h zRmH&|nEs3Bny(l3J7dKEs_+gehZw2?=V!PN_`#!j&3}lMenb?P>Skg2{S>wEPg>5M zxjrpF*|vsz$M+=7N7>tHB^X;ufCb*C`1MAV;qAW^_{X>3Q{O~lK>wwZi#NhP(G#nM*wHfe+zJ0iJU@3t_QN*e|^jp6fV?)PRgoekrXtiSX(*6HZm z>Zna({fqsY9CX=#u^-(I;)ph=LM0^k(L!Va@_pdL2Z$*dnTP?KdHhm=#h#Xa;uyAa zQimLRQ+d>?`Kvdn20xFD6@?Z^uET9g!;FKufcXrVzghR4gz6ngLO>?1VTeswY%0^Jr3d4QQ3qwXvKj(NAglJyXQh|wABYERdHzZFFeruWB-LcE5yvW?{r)z>7 zdM%SpR$;xBt&ShYO-K#@&}T&sBr3G1?BK1a|jcZx0bzEE}&#in_^n7EV zVvwvQ^AYPXBrU%b0U~Ph(9%G>9YD#oz;B=gudwY}6;nc$sn*-;|D8zaD#9$yeB<(? z0*K z^8={5Vh0QS-Wlgrd=jS9i>uv(T$iiqjTlQ(A{=(F$1Tpws8Kb9I-cv0pMH+DL7G7W zHr^HY@*mY#1bln5c{7I5cn)&c(UP4oUH|pHdoFJ5sv2Zw z7JnV!2Sp83Fl)|GxEPhQOVu;CcPT{znbI!*Swbvy6w|WU(ED2!xAE_GzQv5)pZ^`Y zNGiBA_Gwoqf6!-UG0b8%dfAE39d2I^c8lz{NJSy;kN(=5-JmQ&pI2F^pi=)gazLRHA|-kS{r`MBi|uC9P;ENu~~b=;rPIKH9>M@Ekp zN9K_`vKKsqkMG`*C!Wrd+$AX>vE_8ULv2|ya}s^p4@giNELWbrm*;E9Mx7sTZ_P`d zz$_KC`8!(ZP5DJ=yCyt_fOU9M*Y}CriJju;K3EOIL3GMx<#T*l(r8jN6=ZT3K@%ID zPHsAG!_KcfokRF7{T75X9OYBWA=zgVdsiDKuN-!pEw$xv%eeIQx7gd8gUp!%0PJu( zAp&`R7`p=9G!hWDv)qT$e=K~UE#S{j&6D8xd%v`BZM->&I(PwAeLL-GuHQD^Tu`a6 zHbiv`7FEVu4|_zGZoB|z2mnt+xrMi5RzM9*;cK5B4<(E-7 z2wl1C!I>8h-(Q?I;Z2&qYyD zL-V~>#MtBiN}BYJW=M7TKF61hzlE4`MEZBsya|DT8kSzq^A0Fgl+7L%6j(~ECsT!% z_r}$d@@@d8r91F$gVefLjzCZq!wc>ZgXOwZg^<$%_d?RE&PqGkj8crLfGDZOs^_^> zyO=PWteRP)Qdf#1!1_I=gh~w@cvInoirOBTs3mRSTj%>wb&ak4Uc23IvYWDBiEC?R z%F}+YP_~yRDvf;(bLBw>eEOk`vY zyP3V4<1_T_*S$EhO6WM1R|zUnIq0K<#|E#y3uj2HBd6c@eQDX)30MrLl@LDNjcrET zRfNN`f6~_*b)YMu-;zK9}~eBY9DO>${Xh^`-G%aE+Oy6BpI`8j&rr; z2e1LNoQRcvr5R8$KS)0Q(%DcQ48zp<_Jc z-k{2A1*7Hw;U0mzByRCAZtdX;PLIqW~p}QND$Af^SFxKwp+LmQk>4X3%t_K|NSs>y{bq?h(kD(P9MaJ5ni*)iMedEy)4 zOR#lj>Nc`Vh3A=>u;*$Olac^-Kg->f^T>wCLUU#o1j|u~&8&PkA!DTD?*5`{r<0SF zg>2DQ1*gEhwlpjq)i*QZDs>6^U7$g z$GI#X=I<-*&GGGEf(r(3Bw9UW8pR!m>V(q0_?_qFe!T&R9i5u)OfL{`c`H32WKjt% z0HhVFk`>mQ;Ge}7L`rrcamJSW^;k6Ox1%9}o`Y4n@j;|FD}jlw=WKXr;2z$k^Ht~y zFVrHRXVwn~&=PAoU6p(j5v(>MMm{xE$56wx4JBV(Bs3h%&ubw+v{js_fJC1|@f9FA zDXygJxahBlweKWKcInhJjCg?;>Zm|E>?NMT1;~x><@BSQ z(G6SC7FsWNk_Xs%A9B9^D+j>S6WpcG-+S+LTQR=>%}rwyN&SF&;d@u52CMo?@JTd% zmfHA3DGDs401RNC6Puf@BR{|c_}G+0&?+J={qkufICyE^C{gkNgbU+<|-9+`fL)FW6v*sC>^g6aB1Vj&1U?e0n$EKK)S;AXPyil;@ z_w$p>Kje1>Fi}KiXws9UdbuX{9E!^}HfQx>X*=@gT)pZIPax6~^{bJO6z#dIao9$% z7XAo6q79B2#jHkPI|hxaP^5?-z zkzb|s)p|spHyM?6((YtzhevcG=y2&I&TaCoaEY=p-+wW-|JHldgl9oq)hR5Go>~Sq z@I%N7j_m4AQr^Pgc5MGlN`=p$Ka9Cnn78d3Xg^Z-yzqNF$GH+4CWYN2Oir7=wwU{V zl|QxbW2T>XcIC2AQic}}lhqoqEnrgrUOdEbm-m+DV|j+irNCi9ziKiV;idF7luB<_ zvx`>LYhGha1b1-$%X=Vpvy#iQ9g?b)gc8RV^GYB5D&?_hr#|$pVAu#As5e`XK%yX( zxj1|Wo!Zse?-;58Z0`~BPVowoZ}=QIsJ!ubtIT&k1Uc0z&G)e6KPM7Y5`dFj2(_K;_Q7+u&{T9&+Lnq1hWKXT3kIL;+-{6B z95uB@247Q4d{a25zxx?tmCtBYNRlTEb;N9+3OcUC0ZnSCSwETmcXj9z$2pB$jK%%m zf>srvok)2Fr?xx^%VQhefAeL%?)-bdFa}rXV=LZW!Aq7@lmVEmKXgK{yhW}z%sLVg zvgul;YPc3KqdtlI6F73KHQ50TC?o@+&%P+2gdZcne@?z(;N^nOn#i;0FKMLX!RGP) zzb!INJ*4PPqWk7luxJFRUYvT~(S)V(r^c8EC>WyDo&Vw^I^XWzMal{Y_HNJ`*i8z2 zJcMQq#*9@%^j#2Z9uuP?!uH`otIWsyBu*ZS9`~EoO~KADB!mk|o15BCs)h&jxJ-m@ z??;~67CZ%H>0Vg*@C_=5dOpY3Ui3}WZ80Vk)RDh_A_t(%*z&z3^w04x&(%~F#O0r0 zFtErQ1~WJmU`2De?BYWweVFxsuk3B1Oy#E9BKsCaU`gm|AfrIJ<0 zF`ctBppOTLAT_mLNpxncQ|V7@6-BqpxQ!b!ys8B+S1e|A;{g|%k6Mzi79lpMU)}kC z?OLI)O1~Xgj+Tjh1>cxNYh1l1lcBNV+5%F|zdz1+espL^&Hpbhf#L=wy#ixQ8@MR^ zuNM3tC6<|m!^vC#iJZw&!ry}$%}@|79!iJUXmtK4{lF5pD{0uNw{zV(eM`q=Eg!R|_29*qpd2~t-cO-K+!Jkj1F<`>uWj`QA$ZAU-Z?CU6^nF$) z*+HcmMT#B_*p#B<>5&@N>u`3sS^fxT&zH7L&O-JY<4d-lG=4|k?Z6>XJ2q~2ifWWs zWFh6}7d>3xEo*6R-0tU5PcEq4&u4-Q@?9H(^|en?N8$Y0-GSr(2n_)?UReD+AL)9Y zA8D}eJlldK!%#pFc3J?{-_|bO^c9sq23$B(M)WwN(mr8Bu6XRd%=yC!P;=k7kbUBq z8!KGiG}E3{)+ekndEYchM>>uH`s4q5k|2!(jQJ;7_-`BmjQO9C;r|F7{=cWnY`i2< z3`?C=d%)x8yd){($XxsrYaEVVzohetbN__0-*O7bBe`t6=^5ITFhvPq``e8+NsS41UvBm8mn;o4M)kX?v$?u})~x^77SE z;43;!ozmYQ%3I1_GtZE(`p?A6xL%x^C0*Rv_-JDt>ABd;6Zj zT=#kX!LaZ z{DXL{rQ$uzCdJ-yuVjIbTf0UDrY)qaY1fP2v$c}AtJL{>bHyr4R-5V9&biZz)^C-X zB+I9X{nz2~hs_qEDavYKbt5`-aC4wZhle^ZYtG6;h*lBI>d!!dc>OE7=*kC|Zy3th z*rZK-y3v~5B6qL+0O#|;7x{ee^@fnZ<$%xzF02G@w@ue8-7^qHNwo_KIw3x5Ce^VS z#UA42!6EGdW3Nz@`%RjCH=y$n@M zZMM&!?_^Cc)@bqG1e>vIwnNr5RC~?oHRuQ&Z(tp&o~T|;<;z*%Ya6ilRCA)^a-6ul zq$8iJW)P+otlf)uCyaKFNd=Y3)`Ks5mfWK)$w+?GOs*|-^0mtgv@~R2X^slc6t>|j znk0yQ=8rG=MTTrufIMX)-bni6t?!+CS)YR9CqcRE62HeFOJ~lfJO^`_O>f2ZjNZ|7 z+1d;d4}7q1FhEpaErnpkQx5xprS;3uv-QPj2XVDcQ&SA3Oa(jVb35>2g=jsJObuL6 zcB2cjj{2!8y16IeN#59$q)|d`L)Y+*sdqJ~*O*21I_9N)a2R^pSo% zmlY;u2nlUyBBxJo1K8+hU`KsZIUE_$l@(0h&%=+c$< zf%P)7Pq_$TeDy!tfBs5wgjufQ7+h=Y_2!Mn=^JrVsSi^O1HTdb^s2#+rEsho5@T7r?vftv98YQx+_1~+YbqXUwQb`yX0R=w zdCE2&7(8DS+uQ*aA(7ayiOO?y})z^!sZaI#dL7hJ)~@&FvyA1}6W* zCn0G38eT`ny;_=xvD&3Nqy$%b0DLbIm?Zog)&MhjjpJt81FjGDa>w0}oreW;Wnf08 zIwV#1El~ptl|}V@7MtDUpbNGmq&mx9&Z05sX+Bil!cCB*Xx$iAHmAkWjAzUioMpV= zXMcTc4G%%EEDLEucLVAmTIt&jhNb$ z^w5`-XV<*OG8lucnjlkJ*le9)xP#ESX_>hKPc1=8GYKpV_(6gaow8|_HJs0BFg-dB zOOlm;WOV6Jli1p_%_=DULd2p(pi(e^*?FK+U|?Dj@PNi-fHL|eGQa`OsJO^B`h!CR z1MZZhBYHHdSs3c7WjniW^NLLahH_T$?`~Iu@ONIr{7*sE?q^Z7o;x!0{MNOwNzE46 z8|rLp8R{VlvobkO+x?DO-si8SWt6-eG{W3%s#G3oI+I>Qnnn$`T9{{K206@!B@y<@ zz^xOd1A1eLdsGbXGYQ`v7~#oN*hH29qfoQl#cXW)nAOS3UO5DOCdK={Atj3FQjs<7 z(Aa>b>o(|&4Kspio2B^CD6`eX?P6(We7Xs@O`d5R+3cxHK)Lgt%^>A27q3j<-i!8&iJ5cV8cC#?keg!iR zUl+HdMsk5dSSIRHtN11@z}K}_^(aaj)6ZwUFcGE5y*=!Gz&L>EOeEEBg;{z&NYO~# z%GcWGOMU?N?jIvr1sB)cg2gmvnQSf)Ur^>=G2VwlZJKm)(}wE4qQrcME~lY-w#`e3 z?!!8d2zKcUe(ES!=&tXWgG1LVK9=Keg5zN-Hj^VjB0CZ^#{pp6)MBqA+k^$WBkG4*NA~qJe?;WVMUHc!^I?A2K*eo) zF}Qs6WZVcO9<2}FXBU1sl}u=e7q(*Pu7d-&J@Zuh?h{aiwY(JiEHfQZGhq!l|KDgD zMYO=4!v}qt`BDC}jQFnH0FIbbn{C9gTsye{7}qPev9_!f`-Aoh!OzECiU~)t_Lj5` zMX;}^9r6jzt|E6DQ+o?e@lk6A504;|$>LguZf?mx`b)C2j9~00GmwvQmr*B-eu(H4 z6_}{maO&oBUYX%`@5%CfTDK27mqWi-_viEddd7b#Lfye8f_CST2&1NW*K#ODp3qtX z=3}2`ivmhlYdhw^iBnf8yUb*Wh?g(zgmx~OwfUzUB(Q?Yu;6W?^e#!kbwm(Rw2QyuYK~OTpogYqn*GM9#1QybB!02xVQ7$+*{&RwfimN@rp7fGaU){ z27;67AO%#$k3&O|Aqk0bwgRYo{E9?`tR(G@(6u>L2Qm3JWLS-qLCwpjqP9bIAPqMe z|8}wJ;7DYP$|c9tpD+|qzwNIXuUUH2oFZ(8kcy(q#xm^y4=Ai4v$%jAO%?{~!7iBt zsOGUKRGnXT5<-vWCwvH3I0KB%u`6&>jRH{7U*ts^W@MH1@jd<^pE)x_@&ARkjgFH8 zi78?nr6IlbgDydkoMF$4Vrrsayo*=6CBFg*Dvhrc2Ez;jE6I~?MEA3}n>CVnl#s0% zk>eDm~9_3Tq546sAO$cD2u;{}V z8?P9R(6nw5@}hDaZTq*tl5*xz|5dU^w8KB1F>jSNO!^o_bFt_&RTATdhkZWbCh^yA zWRvjY0ZZ(pX9nCF-?s}^T;DgxD{N%XZuf{VglT5MLPm^@!9SDTZO2CB(>JR&A_Lz`|mkmwdlRUEO~}Yw^B|`xmrMrs%l! zuWvwnLQhr#{W+FO4D zJfUvoMs_QX3eh^<=N~S*&spqSA>ATnLxG;EZ;Aww!E4E~-6=g_SMXxFBIXON}OZL;Jl7kJ!dFQ-Sux-thHjQIlww-9whH24KT z`=S(=P6^u9`I44v^a>k!q&e@&;cpjJ%GhP3aIX7C102l24E9p|$`g=y^gVb^x6nsWvE4z@pYH+fHSf<@GH&8C>#;NC-P6Q_H1kD9e&%-A`UIiO`!CYH%ytM{T zI9F8pcjSa(pbFk@Cy-9`{2Z=WWNJExqFG)~QYHLBd`u+d6IEm?447ds1*=Q1Ly!!p z))o-q??^3tmre+By2#&rhxklj{hXcRBtvG+z3wb*-6eXbKAs3(#w@XHJE+Pg{kLDO zNG)8-`OmU$|9W-asujof*vQBX0~sRzx6e+-O}B~$K2)BtI)E-Pn~zPIqT_ZxZtKr1 zEM$m8xBz)Vz|qlSOGs2|ivhhwcO_Gg$OshNaiH^6M70R<@p<0iWpmM-m4|**Cuc~_ z#k0TL^~g6mJy(8gW-~G9HhqKOCZ9{@DcSwA44%wLE>w`sCUi5nCW%Mw@b^rrS>z5! z+oS{~uj_xg)`60@Q~$W>LVr3<++`6VLGJ@y*tIKG{|NcONU2$@d7AgW$Y7y{W71?2 zIH>plq@h+hVSAj6a(?pAxWY)_mr6~#s=^<4;_qsHmDt=npK@C-eHER>s&V=O2h1Ti zUH+Y0lqo#)4((%0Nyi50RHc3A{)+#jP;8b4qZkFyVq2z90Zr!D6RWrP948C9zEEz) zQd>FE1udt}-+t{U+iBAO_IDnYHhuncEr4@Fzh4Rbpx{CsS#a-Klmhj#KO^sgYu1 z2@-^Hn{ugS$>-y?4fdd*^9Y+S%`dQC*2EZ?xOXrl#O*qw<<#1eJnGqK{1#2F;U+;Z zoL6vv?ESb*8Uh%7bHij^l+>ek@d#{w7F9LO=HM6}V?1_?zI6K*Z7IvJy5Pm+!hdN2 zeWG+DJN9c0IM}*z)M^O()4|_yPnj586dSwvruXAiGCj)w!`WR%#Sv|bqQ(gxf=jSK za0wC|65QS0-Q6uX0fM``1*aQ_5J+&Rad&r@S7h&V&$w^AU++(kQC-zlwN_V`%(>>* z;vzefcxyPjY!Uaahnd-YG-BaLsqy=3uyI}abECx%b2p`?DR)1Hjdm{K90a*L8WQs8 zE{GFoOt!MGgPcK}pVsc`X9vwp&9MjM5s&9Q#vS5?6d&%3{LA?li3$GotiJ5HVrnm} z0m|cEU-zP2olJ>?L}Ed^bM?)a3778(iu-CMBQB`xKzMk=neW(7uUUSKJAhs4t561n zf1ay?;jB3Nb02i$?>_P8J<0~dI{F(GQlaxbt8g|aVf1CfjTd53QV%5 zSgLVp`Zr&N(zlG+n@ONN1L7vGz2@9&Fan zjtGr&9`Iq`W(I$(YZkU&xQhpj9u)1;3^i6V!XWvjO{WOnhpFV#K_TrRWr&K6By%KIIoyC-`j1*A^y#@0)be4Ji9SfFk= zP%&Is<|RLPoP6imJgEKSfYk8vOz%gURw^M^R%l&NL;O*bR}|IL>6hA8OV8Jyamz!- z3aB66@<#?@*fSr2p7{ve61}Ue?oCwLK}grDTVv0j%_R@-e+o`|DBJL!D+-RoE#tTW zO9sH8g2M#SBz_%jB@-6cC@bSCuP=?g05$!8@w~_;^*h* zR7=*1l3)4U2n<{I&55b~*t%y}U2HX2U0SamKd#r~NJ`vGY&X*7f5%$c7+g!NyzoAc z#l$Vtw%?(NJm&f9d+dw%h;-=8FFYqeRZ>l>gAep*6?XbeQ{%Qu8CjT?XSp`Qk!m*Ojo_rv-P4%12r*I zZf3M&eI!wAOyr{ckcDsxucg)JE!zBW1)3{2TsvSi_v`5I;1Af+f~@`-)4&+-*MZ!> zFeBF;4qnVb=+RJ624ulUovx-&C@RP6wI=P8Q&HtSPY%ZYeIg_&gb$_Y;^D6ne z*UXZvuT7MUf88Hx;Pv&b|F0RG{}%hd7Jls(y?B#jXqKD*zEZySQ3~a2AGQDQwqDDVHL@s`SqhcBN`=IA z=`Ye$Ry`AR!{ukJ`L}Z034FHZ7dF!ybFMd=h9lisBYZdPIWjqEg$Zwj&w@X#`47+% zJoRIWw{+mdUinHsaqbVJE}Gj~JzKavBN^kOv+6&E%`cJ?I~E>jpUp0Uwnj?^XU3;G ztA!DcVfB?xZy!oclg_DHUvOD6t!3rqd9zd5Kkjr8^6f2%TKXQG4J(P|W#nWtsqwou zHb^xGEg99j{=#<)O&TRiJu4U4yZ?p4c<5bKObIy%V?Irt(PrE##z|A4DF8tqw@T;8 zrwBX?9J1cDV+myD_;|zKJQOry?e!ca-9;D&%|YH-EiFbqj6gt9@9RIeUY*|FuKpbC z#8~!k_s8bcXYk__47Fckrp5rR-C#IZSMe1cpfEQSU>vM)x-)$SjR-Kb4H6==vO`ib)_uxqkY1Ou<$28|7A`k)V9EBth)4om$jx^i?OQeT4^Z;;~z zPh%f4EYy76hnakO&>OTDffwu9h>v3u&Y&*3qO@jpQE>N(ud#{-ZfixNnVg9M$XBn_h$=Lek&Ng_Cs`|4A|BrY4L#%AsH6S{b%;g{a*tYXjr<3h@fsN zFyFNp#vw*yRwEpnQ{Z2Ecsmv9IL_g@w;ptMO-vpw3;XLM`Lo*wKQJ#F&WoGKXobmhV0x7F zV&4lJsay&CG3+u#^0Ye8TgO6PF2D~qpo0_{6G3+2Z%X-^G@sa1@(O#?%|d;7Rtm(! z+rkUsxY{0?$=`miXHol00^(p;C*fj&14SRt1w@JO%Ub8+2nD<6gy+KQvw>){*S@K- z-ls1I1qxRNW`_AIx1Veda!C&L;ci^=_-Uch1rDLd{4=snhWy&X)t)e7_18b`FaF5l zr0;x?3L~tzc+qqq{mk$o42QSpIwAH+t69f&sT}ia;pgGmzM3A|UQa=8k-9N&e|N$1c6aTq<(=n0J2-*F;!sxd(3eslmW z1xQT|&CG_$h}Du1=`)MF?T{;)$6sH)+fl913Q$Zk!@vKm#Ha5DyX?>x{i_1!;%<|I zUS(lzuv6^W&!N*Jt#YA1=Ug6(!MlYQ>Qwv6Xo?D~2u4zes%Ln+gRBm1J!;uwKP^qSKP+&`a4w9`yUCBVyhnYf;WLMG zb9~QMRN&jT-w%;h(VE+= zQ}rjvC_l8p)R!@ZfOyuidRi>` zt4}(w)Qk@bF|ow<52|*6``Koj@r?uBEImoP|0uo0(Mann+_s%EgV^5(q3+48-Gp_| z4Y5>qyT#6ud@qCZ?s=eb3p0^OH*Rz(LitB6#oorB=T?|b!NrbyaX&&upkf^zP>obD zhkaT&9yvSQ@t8Rx^AP+)I0CM%uVa=CB|MKkm=3}7kABQs6{t*h;H;85%s+;FRFGd_ zTJ^KhQky<{;BY1SoMk3lCwUue$M?6!X4Q=B^B<)rs*^wI!I>PNYi%IqVEU9PUkIm) zefwNP^rA~1-NT|p0?e8NFSRE)b~KsEz;fKhN)BGQ)`_`|EKWvN}m{SD=;;xPT?c|RoC z@S{SuW{Y%;%;)L`>T>9^`GHW^xXTbs9Jb}<*WG291YNuqh;wX7D z9Dg|QL3q{QN2x+piu;^9T5?c3@~=zc1}5b&2u9_ctSsF2=Q`Iw%7lHMmL#({1)VF1 zpu%KEC-VJ~Gh%^gsB20*mi(9~Xxqx$R}iDLw^IlJihQtY`M@ zN|SHUnVXDfT{0h^(fQnAZNjv{z_FAq`=pV;B2eq^v~~S9akqo_>P~NIgqhRbuFwb+ zmQ`x@1*#D>DhldjHnlHFvJ@6sT$iu;)>~v9`;!d>f6$Ypu(Y{E*2QuWtNz5+gbynM z`r#5-TSb0l0sVu(@pA9ySB)tu<;w&pZ}&PNV;nshJ&C)$0xndqE%r&QSoB#^2XPf& zolm}M1vbX!M8_SzQkp~}7@LxZcj)}+aoTg})CrI46m+KzY*ae&F>Z|RHs4ZIJ0&SYw0 zo2W=4dDhdx8-~b}6WTJGN*a5<-;*PaUUIih{9Q_3H3SuuZXg=B@5Zhp;IZsPC^n)q zeD@t9)p3?rAOh^$B4(6{LGkaGVv655k_T0+{@m7=1mj;!Fw&wZpq7OqqBHN;%=dx} zd>L=Sc-dG>9pxlP*9k9`zui}M(T^H>)?!a^QmnKBq7@vqo#qXS?ds0TO~%-ftll=N zh6Eh;h!h-SK+qi_;*CuB6AVW`Gyljwc}@hXMa5)D6sCJCMx%1XQ?-9tr+_LT*Mhmv z(+a6k4bO!mr<*X8u=`ykfozd3?R37^I8Tmq+;HSbsRF}!NyLFMpN{nVjDqdF;ZZAz zZAfkE1RGoq6t|wETExp2XU*2s#D4?48)q&jBw8$5>;N_!f+C49p9g9z%c0;`M&N#i zo_0gHoQ%4Zj@?238tbzf2?Vo`#WO0rOI_v+H3Ua8N&0tlz&4AZk%B{JW8ob8T2~aYYDGJ_F=<9ka50$yMkV$@Om1X)mXFT_9|MR!%TExAH7fXWBV!z zK03X|>=B-);pQ>DdRwSqhkJtd?Kyc3CY@bEhFHtn@Es+JFe8pZt2l z@Q*?|RVbnC(yjC>9}U*ICk*$#wTf0GA&sP_*mW1ctKCqM{f{kcB7*iWNq5B!WYE1Eowfq6+$woEwnBYrG zv!sA$Ta5pi2IZbfbzkzea<-V&Webuyp=ZF0__tnz$Q&+#&_MuaYqN*ux5tR}uO!PE z?|NEg$8GlzhG0hDefp25Bo|#>t*o)qD=E5$?vRE$OzQKYsnXwNWR>L;^jM7gnKCL# zg24NN(gtG*>E`ZZC#aFnJ_n&C{iUi%>*Wb0CI|J-g zIdj7+n`1lW?~{zrinOOFa$}O7wtDhgp}#>_aEha()4wqHC{>IkA#9aZ&~Cm#R&D3c z409AKpBQ%jFZNZgyG*J9=zK{5TCh-Th#7P3Fdmu|!4^$#v&zOnZ*v5@84xTtd^K~D z%R4&wRS<7Bh2QDgM6KZq*rVlu5`RhMBP~vfKq9dzKeqX6I8@V)CY+{E7uNl~{EwYu zmzJ1}Yboj}%7@~X(T4U!&_lo(Q+9S<9oGp2d9%G5*~P6rTq;P`0WAo)r+Mo3^>=V* zT5o0O8r}~YAQiO~7Ntxne5Z_>H=#xz5PjOY*y8$R5N@Uf=Ro0=QDHLZiw6S1 zyWK+$s5zjuJ#1^*5LGNZ1B&c-t{)Sg3TP{7M?rV>vUJ+}SK!w={%9LdFD)g#aTl-4 zqPXwCDZjB(|DNL<@tb#LHx~HMHP?HrH=qEaxA~FNm+(sh`f$gV6az%Nh;ZW{f5d_A zH{4CTG#|5{8TL#pdBB_*!cU3B)ez9x`%ZTgK|zOFe>vn$Hn=C22He3#&S=$4udT-Q8+&>y3uXBKs| z2^ye2J@MaJZwjIvE9P{4^XAzzb(rLi(7q7?B&4H@kk#z#`VLql4aC3rZ~ub%?~0d_ z$VDx0iT6zQba=og$EZmzt_~PqjV34fJcm*vW)u}z<%XDNu)6qh-XI~p^``fZ{h#J6 z{TWw$aqo1~u=(SOaD*f+LRNmo(_1NutJg>(2#rdpa~aO>*=fWafQeOt5+`+Z0M5 z3s6k}R&{L;m6s8*@r&tVqQjE9>IeBNf!Fs}1*#Yj;Sosgt~FPeX^TnNBAbm4Re@^p zo2@waB;}W6@q~(FkgHv?sf)hMteoi zc$mg#izdA#1+Ga+}QGg#?yDE^?9|ce^w{Q;j zAovWH7expESprz({gmV3*nR@mhuG5O@wh*4FJl}15svrpE;bsMV|QS)k3v`9Qlb>i zKDlAY>H)_kge+;xfWi-Ok>Xt2HRy|`MN%<&a}!Z;rErIb1?X4(o}zz9!=L-R7Ue=o2NV zK=axMVNsm1UYc@N%PWb~kpJ$tx0CsI%W8VL;yLa~Z6DNs~bsp!ArByF`gDn4j-Rn=6miQRxz zD5z{=n@8(BX+>LLIUoc>PkHlzV@$YHsYe?Co9kbzWDm+f zuwC_Ta=~a7tN6Loe3nO?dH@;Zg6+L(_bTFwUbigYbbK)BFy!1akw*XO%VPX7u|FxR z$wjR-n+zxDmkP+XMQ`CM$Pp?%VcXlT=Ld{(cY6lHaS{PnV$s@t$H}~D!M0+wc*lN| zE(Fm{QIxCTO__apni~6Lk{&bXqe~78Fwz{tOl|Yv+i93GoQ{WNovvs<9vM6>qY|*H zS)mivfSMYyVLbbK#lHpMAT{j{2%bF5}J~bSm(iab(;Xn6>V@CjwGS z9fA0gEQS%1F>%ZbNcf)-Z;(o^5QxwZGKIw$@g z!~pk{r`zDjNsOGJqlAa!Y=nPglRVswQd&i0bRZ7}>?~%@wwLq9!h?K@E;L{^0fCF| z{Skhk&wm1l5U9zo2_fQaaryd-Z8ASnG9*a>`;DS+Gl$Xh$lO5kt0LqAC_+nu#0;A4 z)9r9&Z?TJ8j`V8kFe`ng(7&c^4+3fvwnJw!`Y}fG^^c|$>m2VvZO*5+C19vYooZV+ z>l};#-F%8n#b6Vpzw^uSSiQCl?#X9Jh{uzMSwdE#Hl4n=K63Y>X7}XKJCg-ra)t>ZTFR zW-a7j_Z$DG`~5znE!Ky!0ie*+Q}_PN+(UDUe{`F#1F0bb#jmqGqHY|8pHr8@Fv1%g ze1=szxoMsSga*;J;B}^bge>bg>~ZuREP0q4vUvLZ;|^`wuS8I9I6Xnu`HsDxYa%Z0 zCWNcS5b({?BK0Vnr&*C0HDy^OM_kKFzkbEphSg(#5*K@0JfRrcuj$vIbz&5}!cy`T zeizlvE@Fyhu#4D>AyF-+4+Y2sJ0hvic^<=05KGf)zOc$2(#)^Tr&P% zy;S2E8WlGqeqHmw%?2~MR0jF1vW0R}eg9a{Ge#K-P0t>NtzwjoIe^~&O~mN&t*>y4 z@lk6yHkB?d&Pz)Jx;0N}mf}UBV}@1||20P8IDLu?zP8Hc(@gu1QJN8Bkxks> z2)kAij+NYta0^Ovt_`v8b_On#)82QGzxqv1@*-T%OEXI~f^8D$o`q6sFqP`FR#};W zv(tmBJIs5TZ%GzonLJ|@e6Y=SdeofM5TJg~e0{Woh}hi(Cog8xKUtW%KvoSdX@y>|2v+Q0!l+- z-sGRZHRS_dFjh%Oi-;EpVb7981qw7`6+eJZWpc@3kGIB!T}UvaH_>($!wU?izc_e5 zL;hv};E-f6CckT@M;4@UK6`$HI9NXJTq}s+^N@H@%k3Or$ev!7!8_)S5FyET@2Qop z;PJGVshP2ci@vW456KmNVje-Z;~EWf>)@dv#NE9>1q5~(-q0v>6Kd{raW>VBfThriBRL%vbB)$Mq=omrS2s{&Hc2lDwT zp_?a)ekxk=lS1sH(uCd(|L5zRGEd8od)2;$!6TOGKNKF7%g58a&WTzR)iupWnEpbq z77yPel4M6!roKlhaykEW=5vEX6s7FE`i8sfVH5t^jh!umt&Dw2Cnj@;dfzxZ2j{!} z8ha?lDHYVpcx$YdB31?{eaxIDBIhe*dXDlo^MpL~cjGh{(|1s&+lWQa&C}E@G^r^qcy(Ki^r` zyPp>9eQKYXtu%Y$id|yJ7wY=(!e1hbBjrbKVjWp_TV20Ckk(yaYa<+AaLHT%Yx`P% zMp0tE>NkIH>UUwaVanaCG>GS)qs}(a)qXp@Dgb*!%Iu)9aRGe7e-3MW?x$KZmY=$) zwdP>gQ_dHP9(n@Pxd8?ITfGI>h3p*0xfkEWK<~u2L!^%cA`d+R>etf!f zZ)QG^)MQ+D&agV$){ zPg3<4X#&-yCNn&M9t4^!-lh>wwmT2l!Uift17NO?myedpAWV+b2R;Hm53LIV*qb zdxejW<8mlkY6A8R_b=&mhAXxl8Nh0`$eRmG3xwo0EzwTgCH+FLS(qKKCl(=?g@-2q0 z2o61I4-9E_r({J9S9eEVnLXA!T-=7^-H^1sc)ifrbv*hl#mvYRDnaNk+NeP!XQ9!r zPd=_Ulaui3GPjr0fQFUjzXkF$+k8zl;C4*#szof&W9?mpvVC<p0YL~8yhqA2iFazoa z0#aO!p(@miX7|~(d33AF?ME|oe_on>Nvg|a$$Z?iPWUTDqL;-NBHmjO;Jto*vbGJ% zLMo*6Az!O_AgY^V7Vny~xe=!Av7W!n9QPvvp3>pK{?eZ=vm#anasnSNbINx<`rY3P z=8m?pj#g&T^38kVykbE7i;qCFmCp@C^TjY_YQOQms6mgG@WSsRlH!`Ajm>TM_ZV|| zV6FP0uaZ2+wYV+|QB9w(`M+I^@@h5#Eduvq?-iHruEJ0n#2Ddn%d|bO9DgdehL?o;Kdmy#fX}AEMvjPrq%`n~X zIVNi|lypzo4`-ZZVLj0*etZ)Z>ygh5*QY0pIhcv$=IC}%l0p_5W%_0~QnL>|8m-Df z*6L*1O2FC&gx=xXiz024ksV@IN;faIn!+3HB<$5bQMnMw(ULwa*xl8Mx2U*oBKN`o zBG6uqUGEybCK@5`{jd|cnZ@+YXBWGCP1+cS%?BWIebp#6hQn z*&?9z5zekCRsEZEQ>I41QHSc#B>ox%B|`qTlAd!37j7pinKYDfp^N5^C}jkGtAr%Z zijQ6`9rn3Wk-~N2pem$_aNvPSMQY}%2S_uh)XfL32L05v)*+Dmiq3Mix#OE32AhLx zT6o|_-fZTGNJP}9AId*no#yryAn^*z|2zb`|y^NQF+*!JhBpD1pAp%zYJ#(T`1GfUd zD@7>1)UHvF7puC^3PwhfwIHOF2lr8USe!5n`97+IMK0${ql>`{@_YB2BI1a64xI@MYR(3ZfHrU?V*Z)McI;= zeZFFjW+bb+J{S_w^&a<%s#I$_$ra%gBJgi%8CU54C{?YNzZ<=$A)5%ic?v6y_9=L<;%cs(U*6yM>d*UCAR&+f+C(bq8k#gk9F#Jx%Z||+%8usHM zHxo-FQxu9%L@tWLwUkWygf8$F?_{rAINVO&#f@ig)$e)#5p%88#rth=Nf!S4;qj6P ztXE#2tduwb0suJ)Ufq$fSU6Lsdw8e*g_ps0I5#Cu(Nl+*Q(~DJEJ0cygsxy06DB8|1hx)> z5~7j^Oei_8*B5tBToaKX4jwmeS6CdF6NolepZ6R+4^{<8mr{E0(NqEuLdim#3L1NI z)Lp=8zyG2&x4>a2B$>V^u$cuC%CHD<)3>o$dAE(;%*g%{b*~si0@R$Tw)fW~ZY{QNABJs#5 zw*Q^K_snj51vNYKq86<_ltXTY8Pu>*H1Gy!Bs`QE#W@q>H;Uf#K$J z+0!y`hAkK1XYwZkck;u9bL$;IqoIENkGP~fp7%k{iY@AW6+UNk(z3mOU+M;j%5SDG zKo5=TV1C^R)@BDiaKsTIoYZt(Cpnz5$z;rhcP)Ab8+VB?2H9bPJ7Wl#kkRzM&=Zn% zUt$B-SJ$&p1#CiNhA#+v7$ulP6zU0+PysP3!`~#s_P=+(l)R!#6txFaILHp8^l-p= zpjHXRPD>-U;T$1XCIxVX1hWaIzsfhC$-G%}W*q)YzDrHXPkvyOv_1VzzpZk4sjxwO z<7i^gsc_}Dft3ZyPi$E#@J+X@lciM*iq}A6U!yzGmkEzdl+y#morDGlvIXXp9gaV& z{asu2$&}z-i;dvyi$@6jhm_(Pyphv0f!#=zu%3!Hq&Y@cuAVh&%_a8 z%7v{*v#YZt=hw1eK{vKYVWAa?ORH z06;309~v!>fum5Ca+FM(BMGPpVX?o>J%G%^?RyVPDV0s^)(c1?A^OsV&ck%Rc7Ssx z+2b!#n>s(ztu>6UX3S`JA{C+dH6rT3P@c1zUw>rO{l zh(N*~Bf<0}!64!|$oZQE4nZw`=fPx_Q|J%GuRNzI?-1R0)^z=IXVm0l#&Zywvkm7N zNEik7SYrByEOIr4dw^j4)vK?BXqQ@fa(q=NkXgHWxQ=PT3ND!lIk3BhvbXj~guQ9F zIa8C0#Rhlw?t@{hb{-JR>H%h`x0E!5eL*`N0G7fpDCs>MRSuiuc*2GjZPum_5e;U-|DguVE?BFXfeEPMoRp39h~|# zvLgKWCtz)DeqEinb^No2?tw$V(jg}Z!3CB2e%MOqQMa^#tBoeejiaofN(BDc5KS;9 z#TIfyWOn?gRbZMgv3xmpb-4yxwK6<2c?>Xkc2W^^j6Ofa-oubY-*JOEKVkiL-cW&W zppsFuK=@uuXil=oi&^Nh(I}6tDh;*H;WP?=WBNA~S5=>8QO!;OaS;@Fx9-ngq0++V zLYO3qBU@B_myqPWw8IC+Bk8qsn&Bq`03IMckcE7#NFn;$++(2ebKL#UDg&#GD@iFX zm#tbZ-7B~RR2>23_`(2hfgR-z0O841`KVoaEJkm^S+DVHsqI0sQ!J#*$gmz#f7rc0i62_U1?Fec2Zw81VAIa(%aNC$(rn z#E7B2*jm#wI-7Joo|N79RBpjp5myCvgDFcDJD29`JDXNcg2f)7vFc6Ahab(BOdLiR zuACg0VPzlhQ01FvJ_k#+y`5vuGaI zj|9LU5+IKY z`Bwi5&U`rou7oJ-%$eljH#kn!cQEMH4MJ6?_7j{+w?p7Z_bz@8?B4yqs@62YzPol* zy-)`q1b@f=%p0LD%@4zZ{X>>TKM?~o@?z@o>~PU!vXr5ul}$~|zr+2M-Jv>JqAYBu zuR^M-zAlz0*u~h~VzLn7AFLDr`t!fukdKrh=$eIX1n`D4 z{!eRt$3g^jSWj2=sQS;qD={Cp9%Jh~VefL&+hMz_^wiZ4j*{OKn4E&HQ@U;MIa(fg*JeG%BZS=0J$(e2N}r63E*_QiDWEH>XPqA!L&mE4z# z8BK*~nw+F$?*sL#v6Z@fM-;4#q`J{Kd_za@{BSa=wX>(bmJvX#5Y^CYEjZ(JS9?s~ z8_G@q#XFh01yb*<7$6k-aD3pD7e$bD(Ae?@XdDL+&syBk%$*QSa0FYi~#Ab10(A4=%BLN zF^iw~!9v(*N>-o(^-rILLvkypG`86!{~Ir5Le79+;|I|lA7tj`;=hYitDauQE6GnW5D5Lv583ProO zYJY32I#!_rBWg=i9w(jQfZpx;OQ8XGEuo8YB;;>;e^IOJ7w%?RP`*k~4S)pIUr7D_ zVJVt8Dop8BAxa)tb;*5Ro15Tq%Z=~3%d9T;(PeQOzeNdiDiik(3d=Bp%#6;UlhXL; z*!`w*&_35ZE_1vSwmRN(_c4cC#0&7dx2uA4!CGPd7AGG8_kR8jO=tnUZel+jjXhx; zC6ILR2`*saF#XjeGAaTuo)V?%Oopn+=>*sLG3_I5X>x@7h}C^?A5cc3+h0dx6`Ut6rAR0VY?eN&jE~M=x@)<8dCv@Ljffh~I9(!K`x&qv-}&(y78r_z z*bjLynFJ2V*?d^lCH)wEQGRfDlu9EQt7xH!SN7J-sAwaiHr(0<7Q`3N+31!^c-df$ zwyLKdD`ys*mBi!V&>}za3;JqR5j-Ha?$rMyeH34}Wc)RQ!5&t!=`#R0z5%QHLOvIjy0A}_EYXCep}=)+me z(v{!e4A(=~b-sV|rXUU}qjzp=dFkq(j-uLT9!2t#{VZ#gd(c5P!bamFj5Hr~v$QWMlqPgs4C#?UBeuK3>5dSzSDgr#SG9$WlJMnd z5b0{sB^)EewSgxpxI6C?Dp(#Q?LI$b&V>fgXp9M&?O16cYEjpzVk&-pPKE_TUO6XA z8aW#ipLksKQcj^AYA!qg_WPLQ=x3TDHCxnkC5ukWopbHl{gIr|eQniCMuw}15stpr z-jQ*2FmMo!2Oj0YA_q4Ggm#=GNAX=kh7gzT-f=s&`g<+^)h$u*sOjJD)>}0p$7vsB zv%9RQxa>yVsqGnju&+Et863`e0&b5J{Q~907?(ePH%2%;^ys%?_6<-us}L1x$u!yb zkFLx)WS^1fBlQ{M1|h}xN_^n1^6cnI&u0+{b?ni%ARLVaWfA=G{~Kl?q*Z+V`uu|l z_P071Vj^zWK9uo0nFf*;@cZ3SHYPjWz+P#_q4c3F-9#Y@n$m0*j!${47*@ezq9Tr$!gzOMhOU5>3`Qlidh zC`rI6WIUS!k3*Gxe;%O?7N{asCJTp%3%VhdIqe&*c`hE|_n0gV63z9}MU;{gWP4!7 zso9L}X?@^O@(pU%n%M*X#}Lqx5bL9s&a9K=5tiBOjGRU;^zqtsvXO2j1cypOFf@6% zIazL3`yD-DSD(=)4muB)=qJkJ{OLnfoL_Q2mN$>?ZvDplV44WPLO2V|-lUWP%vpqY z>YtC^T)bFJa$i;e6yC%IJ_Ke2J^%@X)#u^(x3L7Kdfu23LuhH#F9ri${C)&E{&xK$Gw8+J zyvk{$+dOO+)xYSh)2P}0|70b)o)+?7^A`V`ga8sFzWphF`NBys3FNkVkminB|g$M$k;%tr;Wijc;oz^IVlaS%0+NsQ%^e73inMzp3Ta zFR1@XLHK8){rBTD!&TrDpC@>(j|%p@JQ;UU%LZFOK|`y)9En}e3F-5lv-E#g`HKyu zHy!W!0-`RvbHw7Ew8!=&W?y5a9fxw{c55GT4&(;z#7H8S9m>P5oN9G0md$+hb65wu zp8h+?|K;&YH5NoIK35@=bHv%!jqJw1TuJe^dgVW{f6$A(`x1z{uA zZq58U&VZ>OlEY;dMc0%5S3S(t6FiSGWo9N{BD2ml6}*3C0xSQsv8g`cVD9agPdRr5 z`Y^=uOMplzUxjs>P{qdk!ko-jl_}zv;dLNzw^SzJ&sYr_>C1?=2hvESGgT7}`SH_l z#_<}el=QB)2HeS;iwc^muFq9 zPWl)4fBPPBs;c|KvuBU(Oe%{+vP?T7fx%-PBM)_vS;3ljgyr8VE&84})O4>z_#o{nEX0!TxMGMzYz zf6ZP>Kugj_cwr~Yy6RSk(wN;TJsLg#hR(* z-qq6FND0j%Nw%-41)7(K=|mOCM>&3@ZujgC7H^0q6{O%t^3$Ss5c`e)|11yjNzr*Rs6X;Q~pM0Sq?EZb1W0x@u3V zRO%k8WcgO@X64VUr|qYwl?FTIiLtiOY|2>OqV5CX`u?a^DY6Td zO2a*8YnEbIP?2F-2tr1JMgg)A6E^eUTj*3U^et@NyX?~JEbroJ5b$WDaT)ikFw+(>1e-f2T7h-;X(0S z?~K!NCrn{+9!pZb>A9!=Qh~ullD~@U*xn8cl9N!;f(^J; zC|wNbhhzobZ`AZWvDUbRi?m3QZS;Ek{PwoTpKIr;dukt%hv5P06CA;di_P3&tYs0% zJ7j;Zt5wVWUj)6%OJsH0z7L~r;or#=u@c7=J&{P1hBcR#cxd6JW#82T;BGSqJ_;Q)A*@(b!#A&`)ks2dhBCLx%)`7C%Q z6@98Y&H}GQ68UZ};v-E%v}}R{Z*{ynp&^Vv%wrrI$5k+lx!8F{c-rksl*=&aoozXt zP^FG!T=|{b{0uxYX`pw>`*<(zg3wg>AQ$?X7QF^F`~g6p$$b^+!+P6LJ9rXp3Rpyp{g`(=KG&h{jiwb*0}5Mcy8fow3cd z)mpx@GgpP#6%kZ10tk|E#nnSUJPHA1EqPbbU`;I555ukc1kD4<5~`n4rTz;zwYNy@ z^JkyHj_JG5QYkGgp7EMsx`ax5o^-?Usgc*|mi~rMye_emkx_9d&g4#=P|nJr!D)@r zsr^cjjV~mp44j#1RZC@KnD6n{l%&QtOiq1mmfF@yt1sO-u`n#2`TjH#Z#i6!9@l_L z1!XA#!zt?3aJqL%#G!3c)D|c-52$U>*P5b_zt>ihSztbe-UCk((jab1c z{vUh7v$6GSthmJD{P1gqm11G|WpsU+kXZLkD5AsSar^e6sSa*E#$DoBvzU|jyx~TF z+Gn!@&Asoj^?;<pS4 zrivt^!(!M?S{CLvAC43y#%Uq&cQ;d<+|L8<)nxJqh#4)HKG;9UX=39LSI$J`FNrFd zH*e>ZMcm$e!n+M%(xVoHUb3-&e-^>hmqrMmo+I(o;~iK&RMA_?2f7k*+^adD;H@>P zSZ?D~QF9B~V*>||9!dhPLS0NWo-8$Od{uad@IC7*RAh1l3VLwrl`1t-^$jHQs(+WF zjhzmSa-1c^o@<0bppwyna2&#keq1JKp`K9pAXOosQ`{vbL2Y3BIqdH!E!{T0{WUNq z{cNY(mlyghcw)kZhVw2#elyH>X;fpd@Ji)2Oc6;&=3i?|Hl&TDSC=L7iQ*>Tv9G4B zE<>wKhsJpkHf;GZ2+{g1UA2qFxNNtVh^jTb*BJ1^C`ebGw-_`3k5iQPH_-d&OpHkE zvf(zAL*+Q}UjhN0R%-ujH5*T)6UxGHVmp4`rpn)WsX`Ix{F) z7j$p7Qmti7NdSm_;6`86FK{ADkD6&+ek=@p7#ZLKm-xXGu2bF{jh7Hs%0SO7Ws#pd zi+B5;5czAN|37`5WmFv7wx~(4;K3ody9AfuF2M=z?yily6C_CE?vUWFL4pUD4(`&p z+v{ZSea^Y#-t*QN{AsGI*IZRKZO!`T8HC&Pp3H%$r*MCghDarM{a10(9Ryay2Z0s6 z#(YK1cuR5R>LX)|09vKs)4TG&u?dI!fCTDOHnFz+8&^bm1g<*z2UmplJ{qmm_97Sp zViHey8la?iGVc*!KjU4?hFn5pAKdEkO}+}lyJ@r3-@u|kfIb9R1P#6_;emAjD9Ss? zT_ZPL>Ys90#>or>^vVPgt<8RY123KTW&3U85uX9&?3~KVI*B%x zfrVtXNR@pVni-Y94wffQ&gI`5y?0&PCCfxft9OJ{Zy&j8&@Ihi5(y&_kvWbpjm| zPOzU7F*DsGpijls$ejJyo!^oS2~BdPDCmc~w1K--xsolZ*`=Q6EswbppH;FZ9FL`- zXFw*1*WW-2zwt}_A0D$`pS^bM%7ZzMNr7GuuYsVS1ob(x3Ju%m_!dW6{HDXSN!s|U z!j?}SP}*$gKIBH#PG1IhS7|`uD-UL}%rDu^BT4SekNkX8sc+tEi*+vBKu|}_Q6=rQ z<93P*hqM!}R{ARik7PBnU{Bvn6B(Agx1NTjrh(KIRiLe%y;=^WyrhemtJ;SapoKF1I#);Wx5((TUj3Ykxtue=O-iEtdv~SJUVVRm!RG?bg)3v+P zA4v{^GzjO01yP8~*8WsNuN{#bL&9%aGm&t%fh63av1;Y?7_QvgB89E34HY06*PZDD z{jXnotr`WIjJAemg|4ylm?6(>!|KpS3T5AkKUx15 zWjQzMJ~4)OrmflUuo}-3G8pmo;6GveA%bZJQ{CBk>{e|S!t_(vkvWjSA}HI6efHkj zHrOS~v@dFo6N7RYsB~0q>o>j{ss|s3RT&y z{2ezW!Nam}FQ?kEiAPuDyrN*T&f_QL;9l%Oyy%9mM|Ny^c==!mK5%0_15QkD=_t z_kVUZ?~tO_t*oXX`$iU0x52|EB8|SfG6L&hik?(T5;o2ojT!|>=(}i_mne$AUcCn zV;!&>{(gaB1$_>6kL*PQlG%bzPY<=quiX@k@?)w_d8J(qXRS+tui@DKZF>SJ6TFZ2 z-ETy;HL8)b)7ha7U9?R7{GRb1D_3otzM%mKkg#u%SC#vuI$3M_i!!cQ%hVcNra6S4 zpPs8OZw_qaY|P^lYW%=E(}RDY#A?&ysmzOt^D4c8>ruD3Q@3nC98(Q(87sBjD8*Uq z6u!;%>hT@X&IR;A6;6o~p)Vcw`(?>|AyyXn|Al@iqGb&cK_fxs%HH-4m zC|k?@?h4W`YoomnBe+6HrF(5M68KQ{4@u%EAZtI$&&NuNZua@B5&TZ?6i3Lp(^CR5 z-hC9yFBzD3lQpfg+A3o#VFl@u9SmQc!jH{9X%X{HSl@f6sq92qzX~+pl$eebK~XV| zE`Q}NW#}Ly>2OCo>Y>w(lgsaMXgJV%fNJtEDRfl+An=)ks6fQ->vBO4g#XmULeuB+ zflsI!G%*d~Kgo%SmMoLmWzME}LVE;w2{UD_C-@gezSaA~II`^Sd8jFj*~?_*ydj|A z8%;n(d;l}xDnCRNKwd5LfcEPQ&Iwda#r=&r;(m*psqQRPw)1RgmE)deZ5yv~^P_bO zvQpsDU2*0()>?b%Sg=g_Kb)f{kIi_^(>{UzYJSqxXAoe}CY<#Z&x7lZ#j9hV1&lRe zx-lASkK_wGNVUBJ#KGFI%CzN)wEzR8-X>)rFx)7{I;@2yvrgsL10U{2T>dbi>d=0j zdfsWFscI`vbIzD=a0(LHogqTj2(|48gm!c%zyyf=@`eH<>0VS~!kE-E@B8UCJyPdG zD6)YG;!B=qamV_Fn|DivRtt*;g>5qk4)y6C~plWAUWToit30O#zt#|StYD*V9{M-cq{ z4kb75Stv`NcatXvd&!Ml9_!W}ay$j3p$hrci!wZ$0iV)zVZqTX(a-};Z9@C~xn!m5 z&qu>3>T$U|c~5=*=c&Hoj`5ruf|HIGTC!DvkAE?WW-pCYvnEc@DvBvOLQMUtAdI4U z2&1U~_VF+%9+$=pM`L?r#Q9HcxdTv%R(%x5o_%<4EErNhe(XkoSX3Lj+*M%)$+F^` zVbv2by>ywoLh`h0f;L)x=uxQ#f-geuhiPyDZzF?VI?o?2&k6Pa1@`&tu>W=NABfNSzwkbPgMI!t-skrz|DcKfFXRx^Z*tPV zVMPBN3V{**`#%s05)@SY*prZlb7JA^|3V-7J-ui0|A{L4YszYn)BhKq5vd=T>TikZ zAyfRXh$4c&;75mFZ>Z?YZN|D3FFRsc*2IP=O}d1;gxPgX6P59kkvMYRS~lmc=TCl* zev2Ru{mtbgACPeq@i|FNrC6gRu2u1*L*QX1-guh7dZwK2ex$axa%A#AzLH^}Qk$^C zKY{V32S41oBQ=7FWVL-IV;P^V#ex+N8E&&A;UPSIK7+R_zKt=*mkxE~3{~)izj(;l za}gZ9duS_skcEi+!|3uAqROl#HS74KE)5t-+&$37Y227il^_Q zeh38j7_vTVIy*>{rgk+Q8+oDG)?VSfSUaP|Vp7e2i?Q`44HeS5=gq)6exSao@WD?)iP6p96HhPs=*s@J~}-Xo#;1lX{=EB6OIB}A-?2=QBv z``>&)HD_d`zJZ9`bK8{g(4b$n92vZ)uG_dv%&pIQzEyUA3g#D8>$}I)CE&N-31^Dl zWaIaJ(zTXDnYPlD5ERck7w2ubA;4oO;;J(o?K37x-YG1u8;kp3X7OV)H^1LI4Q}On zU{NH~O0$!Gt4smhc5z>*PtgK@)1&=lr_MwpMIHrb?xX(&9-ohIR6P`lakW`TQ>k)v z$mi^k_Z{!qBF16Iumr|!n+3NB5`Uc@sfd>kxO39y;`5wn)37;AMqT9a5ci1oMZD$l zTEBH1!Yv>|%A8Vx2T;&uZ3X*GY;n?l%w;k5{Nj#D#z0XguJ}&jsLUjyoRm$pAII~Q zRu$F7?59{c-?iZ{+ykyR6uQpha&x`&UFJ?25PY9qp*v$X7foA<8G9k?y!7=dB#bXb)f3U^=WOS4jzv&`7 zu-=quK^Mk!qj9lnRMqj7xw!Lc_Ml&>0k71*jQORs~R81zOqRYOrD3ZUZHKyboR znOW$?YkF>CiRPG#&vBZa4aMOqdEnO*E_-RYUGK+N_E<_ogIiOf!lBRg?l-_=KEiAP zZ4u;Q?zG;UVVG?Pc=_}ZF`vKnj}Dt2q@-hO>M4<3-L@t8^5o6)6qnh*rznXf!ROVI z&oMZV2(?yh#O?bPrwpR`z$c|COR`ub(@0N5AZ0HCz_#T;$3x@*6Jl!?^ZVCS;M>e z2oCInUBSt@?z321qnOsL95?6;7xCKAK?c3yv#)5dsMxz?(x4(a5N7x z22Q@}D$ky{n5{d=8LlPAY#K$)Mr7%p9gecl3=7dg!rRC47H=9)33ysND7#L0;TD$+ z<;talxAQp?P z)Vf`imKk$S5YIUt_e^hn<~6KuFL|zHHITq`%T1Dr8g?0Z_1;x|5}(W%X-0M6R}ImY zNhpW}usvggSwlfMt=&1LKKXU>ghD<>KFK2MljR7Dwr7B;+_Uny8NSnC&kL_DpIEH~~<10H` z9og*CsCv3WW%&^`d*?wFvqgLaTcA5Xh>gF$Yegz!$6ef1xH=;8AoPHx6k9on)8yf7 zx_Oc?&m0J{{SnZxA;Tp9DB6 zxuF6HaA{x>y$6B}nB_S1XCo=B293I}wzB;QjGQMRk3ft+WlQ{WPK4;$$EIU7z>ql2 zUW#)1VEX0!wnHM|aiHCX+TaHMs11W7W;j$O&50nFswoMutj%D@>qzd?g|=nx&C{bz zS4|!CAng7P7aymQ#s4w5$7oU<>}z%krAaYxP3?SAWLQ=_b= zAOR+Lw8Jej1AY=i$4JIi@excQOhQn`7MCnt=p~t?6-@+ihS^*cHg0pwF`a5ZU70(t za>8EvEE};keCS8#6I7}m+v?O?U9l+j$wS}ck*l&O`<5ROk+9XN^#koQVCqb6%g-nQ zwr}e>2Nh!L44oZhJ;j}CaM|2E;$M7Mg`zU_T>ZrXXS7DB6y%++i5BDWoh+vpkf)jpCd4pPH|A2Q{*k#dn* zgb{EN8iDm(5(bY!qyrus{nX^{C~4}B*>dd^RWM0=9=g=-);p)p4HNfaYn+=98g3JxpNm56q61{v(mMFr68}JQ!vr|qvZ-Jos zln;lrO}(~Va9=gx3{}DI8^Bs1H&*kO`{7ZR*Hc-Ki7&&ba>EE2tEZC6@nIrX&L!$s zz5pw3`_xF|b^XBRR1y^<5cVYuRE9`BX{i=1&>O5%_ohi*B|O5t=rFd}lJ#;p73<8u%{?44?Di}+Y~TD0i7W8wRzcZzBQO6qy$Au&uU!X&d% zVpE!W!eI1fZ0b0&1NUdcfrhV?&~`F6pa)BpdA@8c!fQ=RHN(U0DB$etTcOTcvC`UD zE1B=RHnk9inrEnKNo7bT0uI*?ctBs59(Ll3`HIaLGg|-a8e)W=JAYdtc`%C{p!UGJ zVh&qqaXPD#e{;L(5vw#^xqkg%-R##ro1D~$xpE_)mdDF;%?onX=*NCPpRzR9vU{YY z4gUr=faev9JGL@aFt3&wG?ty?+-k%r+l}!#@0UJxTsLcyQ$r^c6xXkCdugBp2ZCQ} z90f8KBXtQlzWIDR1Le6UNFo%MP+c&+^FIlT$|5Uu%%%upLTW_VxVjiY2AdkM#0?{z zsSu%-oPmR;Jt41i8KUAA#>~9hCPPK!KC$w!;2^(5%s%~gULn`K>+{%smx5-PPT&LH zRIjMJ+Y2HcP!UxbmkVyTkxTHU+j-(|<0}t7HjoEvg~jc_2uZ4>gFGO6L%teTBMB4i z(RJN_8EAR%i8kb&s;ddsFQI0O#4P^%v+td}UHnb&eLaCGp?|r|X`s5VkipvW(%1cG zIkhw)<1bqk{6hfg_ecW#Rsays%Lp=f-~YZbd$zJeA>-fYnCz!!K+ePUn z#8%H-gzWb&=Eqac@52q9yL_&Tcp?VZw>7#HbybT4U(ReA?@aLTXco$zo{xHDZ{gvO z{|+}M*vvQLDznV}V|Kv5zFU}OE1dRqRHeqRB?IS9nyO5qMrlp#e22bE0P{}44zE)c_Sn8$GM*d%FB-*V2)enWtD>G{Faf@F9-eK zpPMp&66%YASIs;a8chSiws4zfH`_~=;kJbK-uSnv8%A1HpX@e$Q-m1p)ZY@I8K|?c zblyK1Yt(a3eJ6&yQ|-IN~FT25VOi#a~qbA(5Uy!H)5z2gO$^sS3Yn_UIv;tSpwT;VQ^4 zi|e^sjt5E2YK!`{0$QjqZSX}htN}6nCNCV*>00vaP$aZh`J?YdoM}x8cnC{H^7BIj zSnd)j+-=33KyB{`MLna)Ov;hWe{YeEbH@vY7za=f^Fh?=qwX(7R^y496ytamgsN0h zRixmLUFW{H_QMxx*S7KR^D4ll=_HLX4-yWwe$09bDAUSO;pa%Pqvs5=>Q;hRl>E*h z&z_;AI}st;xvTiu)@Mk-;^~I0&q%(1&>-26uw~MVw#|c`G~l|mLllBKjr~a=uneW& zaeWHFTEK?2hWh!ziMW2>XIA&(U>Wv3%g{Cwyu#wFf>UwPGnOqh7=p@32N|T}Qr~zW z{kcQYP`L05*LzAd`0!HYk-VdI>S+1t$@3PKKR>P89oFQR)6i(tpIrlkiK<7+MzNRl zO}j1JZv$swTopQC%qM6UD+k`Jlp@Ac1m$$n$j}R;nxSkSKc83Lbm*QYWi?QyuNcpi|MFLwmstI|$*?p?Pi( zj2mI}f_<11C!@;ub&14ZK_)0O%5 z<{fDZw`{15P7$slHfmZ^SRvQaOhY6iVu&-2G~5E3h#0WwGa%BPxeW*_yR=}Tdr-3M zOz#(lhIQRuPYU|fLrS$%@7DN<*6Nt{7^Ry{pnP@dAnuT>l~|$k zkKwVCid}^p4joc3H1qLFy+1|4F!T91idK2u9|r+(;gxX5@2>r@ieq1emx|sGEd{*N z*xj!FN97`|YAgz8eU}f)-FVx2r;zXfCa+HE=(h~Z2^taUjLOW0x>EFgEF`435SE3% zufvbe2nLBuDUYs(ZlWX~;>=S!+MHES@es0qlCJ9wGjoWLvb3u&gI4@>*!EEJBhwX! z1F+&>O?@-jY8axD2}Ms*G$e5Pfvj%P1^P8Y#U`vWzj)O^9rNe42IVW=bcI}b6g~3m zymCY!$Yk_EI+rEsAzHlzh_bt)0G`D>qw1%8b8=}HdB0y+F~4Lmvgs3UG-HtJD*tXO za5gSDunVJKc-BRW5``P!I>y}zxmoh-$}z6IzY{D?!ETPJkdzkLK+AWqvD_&BNjLRu z3FblqsgyRL2A53qX@SIPzk3g355}@H`}RUCt2bc2FD!mam&5Sea?O_DX=u8P=HsDn z{TDCg38v~Et;S<6@JS$edP~sj14&*(Lh@lpCaQvs-6;dOcDy41)Bk zTSvCCFAoQQ_@-FSC~A22HMpm5WNdeGm_o$Od$(G39ZeY(SZ=|H5d^~Ie7X94wG|xH z@@FIg=wf3g-RjQ%Wn7(9|CW^)7HEvUQ;x{d8^u}*eAU>%vTS(SiKib+{!qUFJxja4Pe$Bs=Vm}}5M=R^4t(y8T0dDiO?qFoNIZwac0oI8Bf#0s|ifrz?5v=taw0ft|q`R0~QzA{o>B_n6YRVjz*-kHkAD}d#hD>vr5FqBx#6!D* z9E!?2H|uEvh6D(cD^N{WL6P_7v>C^+IOy~Zdv9@gZhJaK*mlcR3zz<6PzO)o^%oZj zG=usEeZfiRWn5OP2hO3XD(i~=w*tRHFihgEX!Z-~B(yTB8qu++KIv&h#id>$e2YFFi&%bWxRcZ)qGwgAx*Vx_` z{6{|~g@$kzAiN19ioVY|1dR@1X~USoBZLiBZD{G=Wh zM`eZ=$K$u0o8in_KQ#gl?aH>?^~AbgxHKm`@9e)Zl`P@Gb8swj>HDQS&4zATYtMVW ztA5u_9pk=>)Cx9k zJ|`Eg7%JRs2s7sxfEib>P>4jxLOr6h{y2x0Q=`?2XF0FNG6bYqWoDj`GvHYi8MBrp zQQO~M3h1e-xNv6qS7;&J`Eo-Vc)L-Z;GbWrllHq*kI{RBpz0;{8P&Beask;8W`PDYQ%0aomH^KBzas}cX zGyWcb?JxWtaQsKa@jGbgg8%LN|DSQnzs^zh{@HJggjDWPfGC9@eVpZA;f%+}bhzh1 zmbLc<8}o7Zn?ifImF;%dH^EdP$rCjrB(np(cV>U7B*;`YtC*(ueXef&I}a!&!u^LY zubUBsN+0>sqh}R?6;F-0Y%MPt`Kx*d41cyaa#9R%{t^?4wT0xKe3x);bjYH%W00m%D#l<7#icicU9Y^VN9${II=-u=L?6R1AG*_aq2 zJohu$iWoubQKNW~WMJ2nD}b6fefyQ<1w#pVSAnB%u@^hhYv+=!bWG2wJGR(}UgH3_#? z5eAHeoELq}>|bW5?pqkEW>~Xo&W`x;6dehpcAL+F5@?JL*z(L_DDwRFe9B7Z&3i`f zxZnJv{+f!zgL(jfUvlLW`$c|GpXxJq3dxRNR+*F-oTQIff37m}5J~HcyuW@~6&uE$<}{H8JoIP>>d zkXKA%mXO-TrA{&zebW~$SD&LpP&;xbbC>xqpawW_=waZk8QG##{Ga`;%eb?e=j6D} zxCUI?^Lxp@-nNJD`87^n_P^oZuNgjZ)|R&b80rusmMU&dQY-nF2C}`bMJv=z-}}6$ zz?&dgchGP0(95bPO`A+RhnB^1V}fEHSh0`$ug4ZX-!{X>){M^cV2SZ|ad-UI zPPHb;YzXrdkI+O%p(DI`TqEGH+sQPR{!Z|FF3LimtN!S1ZN(7gC~ZZ9=^zX=J%&kg z=j6RvS(gp9zAO*IxT)F3;1gK36G96RoQ>y64zwV%*eH2}gNeXc7 zbz+Sqy|I*RBee)bQsv>QF2OmLnfOu`1`{V8YP>T1@gsa+m=rFnuQWKe|J@ir5jp9l zb_CT=+L3BFbr>!&>HWPxBu5?Cbd(-S`n+48a{q5iBJ6YWHl@jYUdHBW3E{mp^n^q` zxsj+Tgei!_+mF3xoFQ0p^*Si1vL}_I{w-54hN2K4`EO=7{Hp~)GvNhYKtv*19Q3bU4{Y4M_VdOg7+5qI!< z8XfN|x8@*_2d-0t3aw0I2&{o+NV@K z%<}dy5EI@E>1{GCa+r8UQS@#(W{-x>)tM|XIV9i1we!?9bDMJdQGjxoo~fTIc$MrQ zp#^2-4FVSY9y!9Qx3ly(t!-H3qCf_#6I-Gb%Y!QzY3<(IJr|^k@zqIl28K9&N$Pkl> zD_JeYkRX{mzf}B{@=T!7+6wT3iFTaz&SR_HLOd=GmC;o>ZmUfI1q(|xya{Ib(Lr`7 z03L~f>e*n3@t>1zD9{<|h|~`lNgWbcIF(KUgx-5Z@hmq&zt~~hfdV%Zr~?yEHwlJ1 zG#*~VY-6;L#Ml^xycic()7+e@8u#7Jo85N4Q(^O7d%g0`NcGv({HK1d;V~yJJ?L() zMi%bd%s!$Kj6daMRM%>{f zmk(wu}hd}%v`#ut5(cXXU6p(S$=7=|w zFuK1w(`6Btq`DbmJoIH*sIYs`B79xM6dpm`n#cQ2)A}c<0pzUf)2F!8nWHkGE*GeBsfhM%%t?OG0UWa+8gch;V*96E4{u@XN;i;SA>yh zYJVYG_37xJ3W9RMB_8>#AEiGZGr>$K?(nFAVAlo5W!arrjC7S(twjxOSC-7@W?aL_ zwGeA@cT`gPz5T1Rznvc>4AEkbhwNQ2Jwd^}-6Gz=&nhrl$_5sPxiCSG7GJ3I6PXHB zjgh0CiCwwE>>1rj{Nu@K zg^yDJuMXj%$dC#|t;Z1f1)wfO#LeeD(oWiNI0}XGS*ctJ8!)6&!ti*ZK0P<5Il7u; zaJs?Ir?Y0<{?wX#Au+}lSdqBw{P)Ij#?VvN8zdwS*|Xl`m#;eT>QJwgpkOeq3UWAv zUu$?wu8lwiq&Ja$`qM|Pqq9CO!(O`f)BnG2E48rdKO3t3UDAa3-%FZKw;>JJV1IXY z`|~sZ^mhBt8m~W1+caMPk1{N|HaAj8Efy5((CR(mY7{vX)bBd2El7RWXGr_G-+#it j+sgg(;np(>6x5q0t1TwAwAEF}_n>4X6vV4V4TJt4N6sL+ literal 0 HcmV?d00001 diff --git a/doc/development/ux_guide/img/components-anchorlinks.png b/doc/development/ux_guide/img/components-anchorlinks.png new file mode 100644 index 0000000000000000000000000000000000000000..950f348277de500405def90452b8cf76cae894bd GIT binary patch literal 36456 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 AmH+?% literal 0 HcmV?d00001 diff --git a/doc/development/ux_guide/img/components-contentblock.png b/doc/development/ux_guide/img/components-contentblock.png new file mode 100644 index 0000000000000000000000000000000000000000..31fc1eec9df302d9eccbf3380b50d7f7f4aa3761 GIT binary patch literal 19841 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 literal 0 HcmV?d00001 diff --git a/doc/development/ux_guide/img/components-counts.png b/doc/development/ux_guide/img/components-counts.png new file mode 100644 index 0000000000000000000000000000000000000000..19280e988a05e743e36f3391f24b8d6b8866a012 GIT binary patch literal 2438 zcmV;133>L3P)0ssI2dzz&|000S1Nkl@M)}So^byK;A0d2)fW_jF zCY`1=p%Ou`wGgmL142lMASeccS&1kJ1|gjY0e0`X*WTD{#vOKQorOKLphtU)f6nio z5B)p#>f~*+*%h^N^10Ie{dy*w&09j`+#zA%FkgZ4AHPT@x4xyRsy3Th{l==9@Gr3i3m2Vk4t*XUw`B_!RX0!Rq0Mex!6eaZM>R}ioa^~_S!&*f! z2`e*_8Go*H`BmJP61nVSB|EDOlaDNOC7JlL`JFy~F$&~_Q~6BJngC>lRo8&$n($d^ z&I;gA3tA#z!Y07juTGOY~oVx8!Uc&mStM9UTioOz@&AC5IhsJX_Ln;3!kXfbM{H) zt0a+Dc+IExIcoEiOYrig2?=G54H!O+2jy#Ep zH>OTj8ZO?~i(Vc`Hs-Ebxc||N^Q8j|rd$oI4!VJP#z+)JNs?q)z!wB33b33lO&?)7 zl`tw#Pq0;oVSe<75(~v@K9ji$1R~mJnETOmEZ+l}BL_L%E_&#eAR`GxQPJ!o!>Ir! zw-%4sVQ1S9&KZlGytM^BD``0^s^U2YjmP}?PZz*wjn`Cs%PGIb%aPkp&RL$XVv5D= z%4i0CL<~BLqn?-9Xqs)6!qwzxlAtl7^j=w>rf$N zzOE94%V!aJ8+P~V-&iw8Dcp_6vg8pDoIbUWTAjQ(QYAgP`>6enXf?TI$nzB7(ML0 z=0*WLtYl{IDmt7BV6tg#k2--#lnO6Y3M)E0ZCWTFo}mMFmim1jVW>e$1SZdUi@0a( z$+weccIjV?DC~PACnp%LEiyF-e=KV^70wgtAn4H-O<%^OWNz}9Oy<`BWIxTNvHm?B zSHu!JxTZOl(0h&kN`GIk&oP$|da~#PkcyeEY##QL`O}^85hg>KMX7NF3Qh%-IZ_UT zDdsaMNl!4NhiZf#Jljfz@^!w+V=`X>Y7T5biW!pNsdK1mZ*}Dn#8BbkQ~;BZ60`P^ zNq~?TNt+dZOY-6AS+!cdK)>ge_hf6GW(c>?-6wo@>0jxob(vafbO2W!N(!jg{Y^7bWE=E6BqYUSlqEfM2`QX`|l`PO4IX|4Vf`q!g22noq>Ed*r6k zjxc#AVe3g?iXLGI(N((gALdCDwCuW6;XRX66rhq3l&0q#3fGT6?SJh4C{OAVw2PAN z9rz821rZ7er$T2u>l$>47gi>90+A=|8lM1GO)FcwR(K0fhA6Al@|etN3C8!N#3I$c z0KKK>f^XoE=xSg=%jbZ8%` zX9q33F%=q41-uJc&zfW`qs}aA_5?s8u4ZdmtOB4j-pP~2!jP_+v`vZ)ls`MlWEDl$ut)mR-D*gZ!>hSmEzQSH`(?37F=n{F zffneKDUtLWbJxJNP1{sZ?6nlrcD#_dLxm#~Y+^1HY@Fo3Dlfeo>b&aoqx4mX`hC9|_iTXsZLxRW zJ#>Ea{UnYyYBU1`5<}mPfQ9zpT~2o7gk|XojQ}ndvc4A>I6wI4pbgJ181egPn$b7; z!2`|VN9$U;!qGG49_rbm!m0T0UANc{e9%ww796eD+h6_BXMD#K2A=DB;YT01g3`a^ zp#~pe#&MivUCAciB-vBAVfXJJuf}lO!D?|#KbNI<#xZ>JS;!|)Vc@!M5S6WGzQR~N zD#h-sCh*1g-5H38&N~AU z;m$z+=%$}%JAwS~=QRmv5;O^D5;O^D5;O^D63`@Q63`@Q63`@Q63`@Qa#{D==T*?8 zCedWwase+*9=QNbf+hh?f+hh?f+hh?f+hh?jt80qPD&~CWy8$pG5`Po07*qoM6N<$ Ef}X9NJpcdz literal 0 HcmV?d00001 diff --git a/doc/development/ux_guide/img/components-coverblock.png b/doc/development/ux_guide/img/components-coverblock.png new file mode 100644 index 0000000000000000000000000000000000000000..c8f1f87a1081d3c4a4f726c2a9466200a501df5b GIT binary patch literal 15757 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 D*c9=^ literal 0 HcmV?d00001 diff --git a/doc/development/ux_guide/img/components-daterelative.png b/doc/development/ux_guide/img/components-daterelative.png new file mode 100644 index 0000000000000000000000000000000000000000..1dc6d89e4efa7bebe35ad0e33007136f44790a94 GIT binary patch literal 5843 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 literal 0 HcmV?d00001 diff --git a/doc/development/ux_guide/img/components-dropdown.png b/doc/development/ux_guide/img/components-dropdown.png new file mode 100644 index 0000000000000000000000000000000000000000..5770a393b371bcdaca4447ef4c47ca727cb5f7d5 GIT binary patch literal 60448 zcmdqJ1y@|nvH%K%1b4R}gS!(P0t^npgS)$Hupj{j86aqY5ZoPt2X_eW?jGFX&Ez}x zo^#&1?+?70tW8f#byam)SNBfD2PJ7VWMX6(7#K8J8A(+b82C;Y7`O>UI7m$;&VeQj z%;B!Aq`0~l?9nU-EDQ`P-1jRsVe(gmFgi{ckUm_|@Gvl907%Pk8OTp=Y{=t(tNy?0 z|91U9`v1G?zv2A59tt{;7di>FM_{EVhEh2*21(ybi0xv%{r~>snzzF8ojO(f`gC>e zpj7>kIaG7=P*haRFT9*Etf{DxIY|ZNO_z|yC1OGh8x$S`Ikt&jRtjWMKmfx~0D)fz zPZN|KVh3Mg%*i(M>by8K&xao`yQy&vyn=KT16@8X)QsVe3RXBi9OFc> zrs;TZKMP+MikyWY!I@BVK=Fj(a3MThbW|%TKiCoW&7Cz^d^zSb*`hF^hBlg*ofVgu zOez+5P40ggLb_8A9P{R?PQ5I&Y1}Ck?qCbOl#$j-=dhB;aaPg-Hh<%&vToawJ+YR zmNf2^kux>=yV zWL?@vGw=*pa2@_@qQg(h#>#*P)%lU@(U!*58s^V4i9cNDnHXAIl@ z4$Ej!r9~VKSAVrVTn`IYlof?V->e)aeya(8yTCQ8S2ieoF{0IW%==VCcl<9l5ltVS zB+9Ui*!1RK4|54$44aa~5Iz%kZw9affq4_ZU=h0WQ}ZYFMmnVk-0u;~I7&``uSjN; zAB=IwoR9D|Xw?KnQY1KM&04&_`QXK>?;1^{R3upUcz*oV*CH!}klz}**k8a`S_aOp zF=3Ty9KSJVSYef=ed?waFdsWs`Y(xX-R{23)lS}5eSDC16P>Uvw@$Y*Dt4GC%J*Sg z-qp}Ma#`G=%OVUH$&)uX*`h{;0Hgrov$Zdc@IH@;rmMUTx_<4vsrQ_yHrTLQUPimD zi^tY_iP0;A#;0LycfUW)qTRGlTX(Q%PJm`pcU2QkzCr_J96Z=ZCNN0(Xaw8P@_bNI zMoS!Ei^B6*ch^H8E}-vwzz`~SWf>M4Y>gzr_xqs5WlR`3si}qxd9iukVkh8IcsW*{ zwK2CB=`cN4%Me27U#b2Ac8FA?Cmzx%otA#PKNVDzVmXBOqEK@uZIWvxvi=1rx>eVH z`@~|N0eF4d+K}0U&M}>XroUjBrP-MOVc~sQwhift)679mY*TaQoEJlDx}yWz{AsF= zvy|=}*UgfIJdPCj2Y|x`8v()vOh7EZ1wCMdJAvrcmGA;>#A^aK0%m)^KSAl+Eo|+N zrW_OFR)r0fE~l-nx^~8gwk|s#1%#GccEgmHN9-pWy3h{_r#9WZSC-EDqy9|elH;heh(+KcKATSr$C5d}`m*xPBiwX3n7>{)Ofvu;d__yX3+wcJxn(j7%DFn3>Qrl~`)C@Gm- z7L;5REpB!RmVUaL)o8q%w>(j_VQUcsk!nHafHBFX-pLA}FB=hZO&Ln%UH=s*Jp1@7 zTc-YYqc?jXuIrvx^x5l&X|CXc=C*M_KuL?s>L(m5fLci@C+;WDm3al3r@UltpP5$K z&8Hh_1@h^d^m1;-xmJn&1=|SlCK_Z4G0@aC9>8Zk*lX#daf;~E(xHWMbgKGTx$QaeKidptkKY283o6{Yu~nL}}A*F95(S**xHtL#Z`fvpBIFIHqBVC)uS1vpO#}|#@?C6 zDK(_swm;>g3Awqx-lRxXkGOfdL5{4i7O8c&^zNX+J0U(HA~KMTJiQk`*{4w!7Mb!{`o*V$C+x&GUVC{~44h3ZTw*x}#EAOEpOlcfVQ}r*4-ZOS5hmYf-h}FAdvP zM%XkDl`W;uQ`u|9CgY{@o{2}l{2$O(MDbl`TgFFFcC#G)3{&l=2#c0!>k?xG6&jp6 zUgs-bo%MZ{H&s(Uu0LM((B*s6OcHnL(0cVHuvk>Y;9lUXeRYBZ$%%!i^e4F zMhtGN+^CHc{7&Y3c?ab|w~Si^Sm$+LE!3mHm{2zzkw9HN%&o5JzoLaN;BIIf1;MWK z;@mRB9HV)P5&Apuud{68Z0@{|l6n zUQhp^@Xe#h-BuZZ_qaAfieTiew^^J*S_DqmcJm4H!^23x8>7`63NU-jIhp6&dkAo& zmY)6v6gFaln=EaK}@l!pvi`OZoWgSPFYtqJ)) z%QS}8UgB-RQ*IUYw&VIso06h30j^2gin4b$%z=bNQhB!JvSqcZeo5M#hh1FInqi?ZZbQ<1N;nLcv6 zyySALF@lU7==A~{Uo!c3emCcH?6&GUl4ZHiI2rx=vRkC_^46E$IH|ljW)^Bx13W=f z81uakr&{FRlI?C+f_0ulEV^3L7)3GYI8p-16Lqt_mfyy?(?eayqQ}@J)XUP=4=P%F zziU2Pnwpsey~ajiv%|PrUnDF_e!trz&swDj@re1Bqx{p`g#>cK(FX~3U#0U@?V9#= zx?t0?{E5>|A_rS<7HCS{l%K+5qQUo;aRY=9Ox8|g!Pg(;)K53o`ls1JilU#^zqxj< ztjvsi9kNWH1w2-rt@u_I<*W8zw%tb(&cm7H`Ve2;&*cPUeX;{h(Pa3p`kAIDIyA}B z_|&j_@nwF=`>WC2GAfQ{CSa*4yrPSH z634yb8AG%Q>q#rCJ^iZ)I`vH9a~Z`!WK{-@Nk(w-q}Po;z_^gSW5JhV*rIF201r_N zln4pHsquAWa6nyt23OOEg`+@SZKk^7>J9|n?(%x87xDyaM*{sHieq-Htm`mFvbY)jp1tkS`QN#^-0w#v>szGTTEcy8*il$` z57EsXm#5~_@?`l?9ZBhm6ePIK54-KG)@DDQLqda}4S`HL`>&@o^5k9`R-dc>8a$J& zxz`aP5W5QiHWaJ%Je)LZw&%$|EZm8{*fHtCOeOEV{P}$L^kUkM&QAR%m>sn8VgPFe z!!H*2p}!DQ*3R)1&4VIirxh?&@n_nxmhIu8Zma+f<`+E?#O?+{O{Lgha{jkO0eFDe z=D(E`P!k#lwY2?ED{8idBqoXnZGtusAwfsKp#s2~Q9}WJhlBQllp&3fF~1PasG%Jo zMM(Akj7d$!s+y3MG}{>nOfqN4Q*cw2v&Mn62NrN~ay8gDpEi5E7xYgTlZ}~+yAV2k zFc8cpYghc^COZg)0SpQAlaK{=^W(}f5TB#b%!kE+W8olpHI-kzwvzZJVVstK4_8b1 z7okLOzs%o)ByjMb!jTk^3IK+X!>Rf|1#BXQe`?OHIkAZ%{^Hv&^RI%I#apeXf~>>- z;btm;dG0E7X#3G}sNNMYDKF02Aag`8b`uZ`o5Wfmew+kf#JmCVg1wmjCSW;55n~=YpDTppx;Y_8h z61jVZ3)+DQ(yqn+7Y+w7Gow`UenBOlWPCE%X{@j|I>aXpR|bvD5u>Ijt#0aPqDyD-095XLR7)$MKl zx+DMO#384-xui_RAr!yOu#Mf3V~#P0Ar~!-U!a9PxD*>9*k<@eoM;uQ*)PwZ7LX z<`?H%8u)W+af|W%I26>aG2T26^%j81W8i6TJfkg#gU#D4yrhuxZPInPSumZ6S)q1^ zx!k0ZW=pL56z`&sAn_8)1^2H#8<%kZ)>^TY0S7W3WzZG|<%D1j4BWw*_qCZxAsLU3 zvUTEVG&M$#%uEdCd!R_4bNA`Xn}4wa4{&O{%RJC%+Rt5q+W0WW%#~47F_~ z;1P?(g@u^dSo6t+g@u)sw)XZ@@3;RR@`^03NWHkBL2LFZJ3IUN*`J@Eiz~;)+0Spu zU4NdLmG$K0q}QaXp@GjEd4w8rP=yu7`Osw1K9rEnI+j30F{2;&b1 z{i;94n8KUn9@^%_u!8W5jFePQM@Q9iW@ct;x?hqiTT>(UtDF??y3@O_az&pM`w=-) zQK5+a$sxMCzrTNcRFHjkkQhWX!z3?cidRlDf89czM~D&{oSTzx-KaPE@;+~KRzs=2 zw)We%Z|`E%O2QJc`YE7(ERcLeMkBu7p5TvsWDgaZb~{b#fY~VA(dFgkpFd8nu3Y$0 zJ)38zT$~w75Gg1tE6d5rsnKCqyg(q1hmv7t#sV9-`OeeRQ&3QF+{(?{d;W!+latDp zGc}P17g<65?;M} zg@Ay7fr0T=E))tHA`$Sj4-dXY>YR$M4h~9kF2=?kFWf>xc7$Q(+AmeM2!zP5VM)UY zWW<(pF5ok$k>Ntn!O}4A$tbbV5;5(J>WbbAD;inW=vKl>UOzl?5We{p%Yci#?BLm` zx62bHBEPcd6=q+FR2n56Hl8?-qj9;gcrfqmaDpyZUK@gdSIPAy7EjNMV zE1zSJ=4l&ufehxM`=@6k_7nx$!z+R1#w92(iIC_Ay4EXo$}DQM5sgK%3NHGlJ(@=@ zgnH>AA%Yq8FMSY4&(_(2n?T;h-9c<%BGmh0Lx%lVtN@J@ps@ZkAo;5t|BgNWU4r=Z zzcBt|!2eH%c6+VjWP0gCxv*9Ju_alqAwxRHQs~SD${g?EYW>z{uRAAtKs!|H#DM-Y zHVoEp9cQf|0n1+-1&L)K@fzf54q?$R0^b`LYT5HpSRuPo$hpArvZ&*ye+~$)(Ppg{ znOCC4)ne_rt+dMuqlsU#b05~?CLLx+lVs>Oao6ZwZ$y!p8gmkf+?kLNuGvSF z>myl=*vx>o8flEGavz~ESq*EBGA{lZ(B1pdWYIxL}sm(czo7FCo0+} zDuVqD&a{jJ5TVR0q=uO*;(2+>D9YDZU_?tfiGpLrP$hVMfRzk z5zWWmwk7(U%d%jy!*fe7r10;K)I@^YQn@r57F!a%k9p4GA=sf^d9Gj`o~1kD{!%|KHL0~Tzd^>*t&JQr$R(A|e$9&0`}*qmSi>@c9q z_#qVrM)!z)zoPvX-&xl3jze{9yL*u#InCYt)L_t*1%X#MorMg*!g{wejHR`elyGJx zP+LmKZxwe;3B`($6p|3TPiA34RB?02rIg+7lj&KHJ5R=NmMc)_P;gW zSnvg-muKLkli(kr zs?0+XgJj&|slNHnRfZ`{7bW~$OF%~fH#jy#f=|}F?wB#}<&Aofog>}wfR4SLlYeLWnHV&i3=C;yxIgIOyCfy>)IG05UK z^zRp>XPD0F_hl4)to$|I?v$+o%H2s9Og5n#k%$CDb};)5GU&Ns5WVj+rEm76J84O9 z*$IjS>rjX_mqiK|(VnykK8#CO*_LOg0!u*2ep}#RSBmX4Vjnb!O_Jc*-;FOWMm70I zzF`7$IDk5Q_t&vLj1Sjmu=lm!z9w0zs@z{F-}|0rmXHF*5&xjy+;0jP|A8+sxm7G~hpN)?F9vbmw!b(_3DI!+9Te#mxZ-MLRlEbbJmaR< z_1jz1jJ)&0l`1a&kvxur zw3+oix!{zyhCD#wRC@#M810Pj!QGyf0~Ow=66MCYp%DKq?&gv^X@1}EFlcmPX~aCUB*=-`4d?rK5`n(g0p=!z*27YI-PDdXrv>LBw3~0G95otpgBrtkrw0BqK zt@FN;zCEwhN+SDuSe|ZR2EKkc&7nNwaJ^keJRMFo<>vOa9mxn7K1qFYCdl*dm2`@? zZoSgnY}|b#MuCZ_>;GU(H~hz!%8v|i252p0 zOG$7)_DQGgVmlcqQPVo3cPH&RHbKt9Sg45`Xm%d(>}qq`iU1cRHs|8Ojl%&5b)-Xs zFy?MEHcQ7U+km%39&rFMtL;^d#%>fFEpP@-e79!Isc$P*c;<`S{q_B9g5XiyNG=32JJPGuL>5NrC9J)Z{~LI!$x%n#dAEd5Vc=NejQtB5N2WBhb&<3M#Kau-B4 zB=UP!eIEv%f@B@Wy1utRsh{{e_Xzdn$o-tm_VbWNMxM9mGKz`@qxop-m*O=yNE{Uu zLoncj=iwdPGgthJ%t``X1wQ>22X7~tR#ooZZ*zubmzK`hR#1j~4sJ5_vunBC_@lr7 z3O&WZ1nFcWUSL{+Za<}ga#2Tu*$1zLv;L&%NCjpeokA1EiUA`xnh#@SYEbiNLK8K2I^&d?R%a|ILI>)J-odnSq z7R&_z;9(4ZOnq}as<=ihM$M3cZjVi8HWuFjQvPk*@`$oJd|VqEv4@ZEo>KVF`;C== z78lc6;YEwR4fv@+l$c+LWMzJ+@dyvT1&#tlvpv#|r&`WE;PY{7K!h84XE& z$1bo9%OTjn7DJ@}VEYs1qS33{AtwAS{}g8e(WmQmpojFaMJ@wn)p7lq zB5#rC9rYIa2v4SW{@rZ*&hsVR!P+Ua;io!U;vl1>UpQY<*KxiLEJhU;EC6EvBuULu zlE3mc?9|czX}w=L2ouDcG-pAwnGtDr|GB*DTs-t#JCLiK2bX}cz+<)bdCqjt$*tOH zkinwD%RrbXj_hcRRQF=}IGf7EuJlM1qTvY8$)agL~JGJTK&ZHRZ_iaWt73b6V>h$jNLi!=isofDcYH*}*Eg2aaVonchPL`|b2tC+cVJXL#mpX*7*5w{7d#b^Ky?b1+)3z+81y6n>{B{O(c$Qn3H3;&Y zw)Aj~aUZz0s0HiL!Hc(#MVOG~Y=`2;E>%rqLz!l&6K$Ib&WubH4M{4@+*8VZ4RiBiPyC?xb%(xhW8@(N}OT zy;-+6M$q9M_{MNdoA8X|Kps^?w7>o@E}R7^2JC&@wx!X7t!Cd-u23~4sX3dFzh8zC z##4IN@lz$7{6p~DomM$jaubX~vD%1xwz^gS+lOUOfST`dk1j$i1v)PW;5Fs<#chqj zF2|wWfwRra>~QqtGdWriUH4b1BbpN0s%cG~5#nT%ZZ8#_0nds>`?hmrJg-A0emxBz zkm%zbLTF$~<&2C)F4ntn5|M`?Lzf8MQj4uUYKhek1&FIAfKY4hX=2Y697IwII|jS? z$A?u8=l#zM5$;$HP%16(NJ^b1WMAPt*V@JNlk~H~TgA{+5?O;8AZo_%!JW>|%!HHt zwVk-&Q%G7HEamy#W=su(J?Y#2r*({#l6k{NxB^_!Qtn6cayCyc>>L6uoWzjRcDIh# zTc+PCi5M_3KT5@WIyTPegI3WblskJ7oz1TzrO>6+U~m2q;sJyWxTSKed(8)tjDT?E zKcXJVEvVc4s3w0aj?2IE?#a8KR9@5}iZG+!UBjP_7d+|DhsDzS*2VD;O;G7x4m@OR z9AcF*6-;gw30ObjF5Jef5nwkeFc(Y}#QM&k6ljsFpD#vXv2`o{MF;`4*A}?ZIqS?| zP{rQNGxsYf`6`U@fUL^$_hiV3Oc0C|UG?MnU=zC-WvuxLUpohGQTO#?_|Ix~myi2| zQtBi*Cb@kjUBjp$4nXXLu(nPN)VL&xPi`ClGTE@cKp}i;(-dNtV z^0-&r;ToIY#0E!%5slL^#ZMjG0Vsg;ogZHWn_haQdVEBt`LABBQCLf|Ws!?Ci0!ay zu6d309|+%kc>fr2!^r$g8odvJ8&DS&<(kQOo+*%U_oN*Zxcw_?=H24V^A=7XV-Mfz zw=d56N=)uL5eZjXsNagXKi(0&(A)Ms5h+SIqlw zq9JfiM4L6~Z=Cg4bNLO*r-MW6tTpB`{=t3-{L5G=t#HZdv&QWnw+tMmPM(!(^)7Jy~4%&jZxLHCvmpqdiRt|VUe2wQ)Vj8rh)N>BtmkodOdqY zhRvPie;9`AM3h=B+dSN~A?lUHjh%?V2S75TTd&4O=|VsCF1}dGHJU-dFw!9Px6)6P zV9ls#=hfc(jNz4x8Exc-T7?N;aNvxiir91LD|@04fgDPX2w#J-GV;!RN{v9@+k7Qz z#jpR7VATZWN?tF!l-b}%$feVglp`GGvZU5BE`&XcI)HFrx4LQiY->$cHuv=4iRW8W zzu`;QzuZw%uSw9eeY%%)hIBzT=a~lt;PAfsz!U1LGj$v;x*g^`&<%sh3vPS^@>s>c9QCfItOk!9{oKo(}fOlQdV1X zw6HQ5@=T=noEa5uX?M~C0%W|r{6_rOj?xsE^|k6&J9i_Z|x zY|Cr5T?n>~8O9drk1!F^Z8c0OO(3XLr(pjs%l%jKYah82y&W9 zg!C?~GRcS^40aL+0=tFAUQj2<{UyIunC;ZtGkv}c&q{@ivSvr4-9(slL8k*idsQ>{ zIdi|+$7pX4{_;~K;`&oXaW93&w4u0#K-kG)hd-GUFKUQ0>GSg{6AUbU8cVuPT(>=@ zI#+Y6m^hK=3}7rLFqkypw8Du6Ex#jo!AJ*!)5SdxXma0=;qDG?Q`&E!z|3s*hUJ?i zdXCqZMN@`6d?l)I6`>H*Ju3(@hg>OdCLz@EYz-}PkJ&Ox_;tDvAq2#13`;Q9=}g?ac3EaclVoU$4-kNHb^SL6*EMIItTCr4v6at ze2ok5Zl{j>YO{ZS5%+ox)D?AaP0%3| z45l{X)uA?u54;lsE74r9zYN?ycXS{{e3R7clA#I)U#hSs473suYO{K%{Xid7d1SZU zm<~hDZo|mJv%jRIUZEX2rW=WL$Sf*C2jBhFvp6~N;GqgBKvhN#jk}+pS=^bW#G|BM zZDb9&wKjP`cel3d(xqmiB9vv1haXlJhfb|6pw@uupDFt5`Nj2dt>5SQ6X=^HJOBwe z(b)ZX^q$i*aW_d7Cn-OlcK7J{ArR~kS}1YQc#jF#eEpNn|4MW;QYLz4CJu}8446Hf zE3*$tMf8b=8`6faSr}ckIG8UVBPdOpT2DqtVaqNZ{(EvMY9nk=txCrj())pgD7a76 zIOz|e6o0fkx~(H5M{ks&D3~l&gJ{mlw3unOstXIH0MH@Q7w38{{B8m~xGq{(KhpDG;|1Bi+R@6L=E%u?Q(`)s- zVUWI|69Wq>9a*Ri)f{`QDZ;rI(Hi9mV>oGaqVL1KA0DE?4Igkr;^v4DMO@P`_1woc zN)am(KAM9zPSA~48uhI$UJKy)gUg6N`Dhx@cAtccG30s*=FXn z{PpIH)Kp_Fy`O=)?C&QFGV#{^)J1=W768{#`KPHOOks6QS~t*(cToo$gSX|@IOfOx{_retS8{IUsC`gm3`+Y?Ltg!Y< zJ5)k~<8kWQf(Rq(4jF8A5(;c~*a31-uExX?fk)L#_KaJa04!_elSdr;xMKG0~CH(l~Em!*n0GEV-OW~&LGHmFF zwL_=oz?=_nR)$*rCK&#YK;#O8lc16k2|XomTI;m_AdZ0X?3XiNhmw}6%szG(OG`RT zMAVjSFc^#V7?|XUoQHruTpc;PQvil{$W9hQ%x=4K{TPdfI6#Ur=bugr^I-CPqM@nI z>ZV2o?!~C+L~HfCbFsFL(087%!w3DoEV7ikMadPAh?}>P>~HXBIWl+2C^?UoXZ%sB z;xvzFg@s+Qtkr#&h&yUdq|Cw9zKxRKJzC>8%Du{=HiI|czWPf1^I^elXlbI%i9rV! z(q|^WL%mGeU@$yD_Lp6Y%r9!#gdUlMFXEEoyFV8QgCaG*cdrW88@A93cAY_4Rq0e>{ph=GRI&O&WB5H9Zq(1t!xJ$b%BGx+z}ZUW<^}veZm;-6 zta%Hp_vqnr6dYX_1@DZu4n1PkSfj8v3k@nx&PR4Jc8nCl9ECq?@<^m;=F{_8;&3TM zPVx4sz0zy3=W}s)*9bhj$*$F5QJf_8;XU`@nQ;6Nft6If5lDVDFI4f=qjhY^X2?z; zQ(FCznKr7YGy!07C0tfEuCvd#7M$haNUz20%FI!$Z%g9l|LL-bFg|_B0G_he&BL>5 zM_lIZ>gv=NipKd8Gf_q>RT37994y-RVSkFSD=ekv8vWYf&@;M_zTs6#%dO$iI%#$r zxca3b0w+>GiQEP_vr^3 zBS45lz*xyB`&DM`gi;_)6*}+D7QT$64BP5q(tR=V(ep|i_m1i*SUy7KSZ6V=6j5{n zp!)hTAAJxRPkY;SXUOx-!`iBZpq8DcnTL9N0Px8*FO7WGSm)tSZ5m7UAoCi4e$Ki$ z0nhpW#ku-IJl6erqBV(3(W}8x3>)8k5bxtlMB5o^EiSsMgZ$N*40iQ9MyO1a9~k*A z6eq1mP8Pq)sCN64LPBYN6=P}WPB1LQY?(KiP}xlHI3aaLkc}k7`Jk>q)&0m!zYMSgm_}AnwdhW9E z=KY?KOJ8|9i?1JykaAuV7-$-bda<`}mA*A~!qcMYX3e@%u4Os_t!1q=s+abZ*P#tX z{_+0ol;sTrnLzNfEC3%lviMM${|wpAjg^R{C9rbvNVEQLm{`4M%!e z()@7&7Z0dZ2f-z=#<~2uo3At~@_mV}@_)N{46+urR1b;@kY8Dyt;L$;E`2=iDfFc_ z=;-giUJvh%v2R18gM7&tv*uhI0ZjR&|Y!G z3p?!o`SV9#v}ig9Kbv@++?L=0^`=3fM7(pxY5pD}pSnmS|emy#!zZy`P)^3VJYqCEeHjYn#z?SO<8n^JJJcg*C^i#Gzvtc&@yPUCScW_+ zBMaZwj&GOF(r8O(iyEpxoMd%;!s_Af=kNH@Wx{Aw82&hHJ>TahVOKjGtT@kc<<>+Y z8&6O3H;9t(#a-F*n;15sc2l~d*U`?h&{mGj-`o_wc@v~6WekE}O_A2+ zX}A)5eV{b8ywqKs=V?dc=V4j_;;aicq8=Aa#+%mSv;!hac_=xb*J?8)T`-d-%u^C- z1A@WPcvwg&5RvYem4sk#_KD0~tTAV{jDLsdv%*ObONNOaIT01YwfZq(?ER62Y8{)T zR#WTzA!ezD;6u|e%Bzu?>({zv5apnXF_Zd!7;X(_Yq=xLfpgXZanWg{SmPsdo ze?qop6=wfO`!_tnlZs#PEoQ;uecNdh>v2#2S9%d~zb|?EVP;$1 zpCdZBp(6%-E`BcZh!%)F%9is@?}s(A0nN4jDZxMJMcT0S*??y^TM?2A_0h^}oVC9o z`$U|7ZG7i>+E2(CY4~L&Rst$KMnuGcI|zj5zpT*%wr*fS;y{om?oxO@3d)+-A^=gkZ(HlrSjB3ozVkrl?rf0_NGRgh$^z0{s zk%jVz9Qn?tffXphYnIzFj04$o$4~%-(O9D`>$N%0y@c9YTYFv>Dr)56egF@eVoV9c z$Ia;%A$ZPr8tIH;ndKIAn4b;vDjfLu-M7W+j>jQlBCyA-uObBWhy7PCDM&AQAmm13 zdrQktyu46d71FMEAXbTa3&_0q|2uD>Wqm3aXMEkE03AKcxBGWt&V>45oMSSdk%-Xq zw@Jl;KE!%3V|EvoTNf8KIPjeD7&GSq#0tza^ zQ#ahK_%1%Rw%+)xR1?3iSqm=TV=TlaX$pRA#}tJo#T*DnrI=gzohq^^(hW{E;kPV> zFlFkUZ~}@cDtr#b7eCS6OkplQPh{V3yFyuw<_e$d_S@Rp`~{n`7UhF3#xzkJ92EL=9QNZw{69T~Zq$;KpyW~e|XXjtGq zQ%Y~P4wn^rm{!YLap;v*?mX^~z9oS{F2c;hGHp{=8pdmt%(y%j{T(t@U|>WbQZz2~ zb@uPz@3ihH+i%v#rANQ6+#7VE+%v(r~!Pjt!|ENf_0p3j#8%PM~lzu z0gW1)iFjl(GKl)sfxMj_mgAIfq^#!#@q8z3fI8NPrth_?FJja225cRVqLIxB@+^pB zaB9BwWc$XRF7C-QYioU&9f?&9*xqsxHS831t0;|4x77wK72r%#EI2LYXVKnGO`6JJ zn7$I zJMfV((`3!fIz42|EXZ)J2@j=vUK~%Bq}zh|tMg#wQTS~YTDv~YxBUCE*HbQ^nq{qu zn4|LUC}H@yz_XIFC6>El;+b``kg;;`X1* z$_iG!0gVQphUGZC_iyuWu}jF6WzWx6r{zSQo1z4hCQkCVh*z$^#9SHR4#b$>09~VZ zbTlR1+}*#v6KhtFC`BYj!eqySd^;3us7(Z5O#HsNYhzVYwbL-c!#%BloHFpD2b73i zJ*tvtNRECBI&v_XKyq|NBK(TP59RlB#ZpI@9(X?Eql*in)E4{BXnl=?k#uEpnT z))R#h)j!|JQQq%h$p7I0#*45<-XyA_GEq~c1lULp~5W z$J+|W)}Ahh_QS=zToY7T^tRH^>gqaVBVK*MV;Isr?#5wl`|;-pqHAbtdd9f{$tg@TYdT7IK4sOu@VER01}2lu zx-Xq6d9?&!%`TB_;2l2Mp-J|8W}$bwJn`sRqwxP)2g_CMK~*a!j&J z@2A<=2vQBzHIIE~>`GrvnK{BqHMw>qz=BuVD0g3=(=oiF0d)oLE2nkiQu9lc_c$?G!k%8Uiz`u~6)u9$`nRYHAlqDfqwkIb*mqiOKOXm$ zqqWK_J9G~07X={KSYpNk+GZEiJ+$RFA@?-f?=|`e+J3j&rEd7H;^0uId3(>E`qRBk zB>PZfmwduc*y+bQ-k&V~<8(*RZgsr3W@z(oh8MtEQNPZYGQdXIVf#{e!f|FwSS%{h z{w8ng%wfarOOd^yQ-9rzmXH~Y6?OHGQo0(dPo^uIXG-;>8PD$zYR=7gbkkRyrNq;V zDQP8dzgF>;1usnP91(k09fSC7o5{%t$r|J94DAiu4IWd=NU9pdMq{(RUO2CV9CONU zrht^$CWelSO(vAh$`ZC%^0V|BCi|nCSBL!W*UwI8wDYsSGM-sYShs+z9tFyfm$P17 z?eCWs@;cz+e9wG&l*S_-L_<^Ym-xyIOYC!_ud6)f2-!eus`))oLo0uIQQVIea zsqfJQyC2Ooe7Dk37}ASWU0HWZFn2f>O*sUYK_!d$FRbkL#Ii-Gt!$Qg52pc^jWK!I zK?X^#Ic(3(FIQ}?<}_n#Ki89z+5%yGY?XXJkB<*#J(?YrW_IW|LvH_n%qy!otsZrJpsL1SD5oXx>o-LT=_)_y`)guS5s`3e|mkIR}(p;RCY#KZLzy zKvi86HVlHGBB-PsN;ovqhc2l@gVK$3cQ=B7fCo5qcXxLwNOw0#O1Ct88}9pl-uM0W z@t3{VUTfB@nQN|@Sx3t)SoR5U;fgdS2wKgPxa}!uvonNYKXjL2A~09+$SJD!d_>NMNl~ z5YK|$8DKHMoCe|XWhaAv{>hIF5Yo3*33_3^VK%3IF}v3g%n z#e<)}enR<#(g!dV{NUkk|B>?o^8&hk!Vq;R^!)G9bq3acf59d`^b>esOLy_4i7dY> z0^LKPsecFd>v_O)3{neAx-4QmC~CF#;%_Oisf6;D#f*lhsx$Qiyr4vaL=YRPBMUXV zvKliza}OgfkNx8rf;)neJEdUPj`{AYMeUl3Uze6H({ij>gDCY5BIRRpfjdD^s*`KU z{aofap66kLz*r(9#z-I<*YD>oQFHx&x}R^lUvQXl8B?t}bS)kqFStfKzeVNIX$V$t z;O;Qha8Ud~YYEGWWfmpkeVhm?B;svMkIBzh^oMB|e`~kSxU9=nqb1kxZ%I5sjVBzf zpTtDUkiVr-P|OP4=&Ea#O?Bn&$a!NX9^?uKxN+`Ea&Gs z5?T29$&CY@DEi9|+=-IE!u(giQfv(vdCB_vJVzKMe^{r~Ze2dyp}R@69Avdd1&Wr` z*L1JTH76$+?+stKieuCwAo@+G6-%m31XwHtmu*DgrXU}m%L*iz^s~Qil(4LUNj=?9 zNfdK(Q+*mCEA1xkQp&d-fo1DXPtMo+4A}O}Wb;N8qSX7CfgU~gI3siH?c1X_H8Kzokp zyW%xsKq(%c=4y`{uz>8oM0!o4Q+qONUV6LSwJ7K5%Z-Q-iJ&%8wBd;I?~~6FAjj#W z-S)Q!uJ--m&(Aykk7Z~ZehAE+I# z^}0)CG{?&mbuVbw zjkIOxvw~T`x^O#@6*lnaruqk-j%qwi&MTsf0Z0iI5$oyG$MxHwnPkn-W{FgL#fK;ygTW^XDi%u-igZ8L}hTCL$>Kk0_pi@@t=!PS8{=eM)daXk!(6g~7*v`Wim~ zjx*r)zm?4ck1^Xr2EQ)8IY#i=^d%;7`}XIPkn-vAgT_C~Yp`f6@sbAd130ihNmE}` z8M)1%f-K=L>(?Ta8oz%ZVnK;|;V(bXYBw+UGKo>Ekja)e4l>*=h&9FhHFgI^9SjaI$P76B87i{Y>C;p z5I7h6LCk7zAejH|skGWEAK(a)?mglnaorhtl)73?EMQ*5#DFtAU>}GlNP~|dL0H(> zqEQjv(Io(y5hU^x3E?%9G0(8LrL(2mJdZZ!mt`V+K0;&bA_ndn89n2HzpO+^#n-}q zd9c9R`)#E=_v7v4K@V2f(kby(tN}BuGis|>VTINu-wvZ$eymo(jx=IE`CSs<^>8GL z5r0ppK+^D?R&vUouRUyPS(mi=fUx(kH-k$H4}hd(BURwi;}sZp%p1GK{HJ5H3&xT!WaU@0f)QmkYK3UOr7p!xW97b3 zoSYm;@s-<%iOFrP4cJyNhcwC5t8bHPf#MZ3?cPf=^^5#&tLfPL@pC3)kq3n5ET(Hg z^F3!_xb8bowwi;i(|uO{4qvvSH>7g;W`t?h2Py6@jW#&D09O3zsuoQYr*tuR~QGx?^ zIUmh>fkHH|u6d?DBT%oLxVj?t!kxR95AsYP>%0>%zvmlc67fj;M%qs`C?s#Uf4EYD{2s})=xsW`&+1zJHYRNg7^R224|-)bDlDmNcE2dl{0tDR-Vd72eNjr3s3(b*$V*Nv`L$g`#@>w zO0&7coqo&jyzY`?OKRZz^Ro~9~f zeS(BkSXgLGOUEMM@|l)#^E=e50Dr#Pe0i_d6#?d6;s=g5QYd5}O!&4)~QG z>UeHB;7;!4bA;YX#Wyw%9Rr!F(u|3-=Q&zful-2W!ZI;9^FPaSm678o^_%$lMFofb zNS{0u#Kn>~F-?u(grmFI4egP=Pg6#K^~*}h@OkIw+lL2y@7<5i%3f!0eG8M8lWCsJ zOU(P?4l-RyhcCzH7Z>A9GHKK?@$ubG7HiPZ(D3u~r=+9+{iI__IQStU(E=BOQzUo8 zXI%ocEobx!rZfWCd6^kkv5cFDkYiUwm(`8+b;pZC-NXTC4NCT5z3nwErVJOX;P*KHC}8$-TFh(B(|(aGU#454XQN1sw=g0DIR#=5$` z4=FZ>Pt@cS%FZ>;%|&wKC`cA!AJ5jk8}j4eNrKp^dif3VdJC=>fL!faU(7_ zQ~KwM>DhubaD)BSxr%KpmQy_9i*mFEv}T&)yk=88glCHLXk})+E@;(C%E76$d@)d! z>fQq_UXi)695@0RnezMRm*`#Sp2Z}OgMsB za+i?TW!S8G)O&_uVyu)k13-5QuOP=3d9@vg>LR%l9ZCk!3N4oY>F(^GY085)Wrv*C zohX%T@d=q&Rnf%w`D(FXC({aRYmukoVng)>b)VW%GPT1^JJ|gy`V_%6J%#vbN!Rm} z{zaXPWNuPEQILp*%?UqqwcE}ju_~Y$2xbsf>$G9AtFM+A{HhYP9mD&U$J0+8&=R|x zcivq7Qwcn%u5Siy1{nNZf34SsoS1@FdxcYKW1hjrLP}z_8`volhvc4hHEN1tq zNM64T`}6U-oTKD9S%UUNJ0t?g&>T%@HV$dA)(?v-xYOKv@z)-16z_03ad}MZ>w|ha zDzd7o+Pq-91Tu=HmNfe9wg-!i(awSb3h+wpU1e8ctL=oR*fA!%zM3>-&-IiMR)zR};wAI)FPnRu&PgO>MjOLh;pXntHF%)f$D>QGw-`S}YUa7Ih52L%70-fG|v*Z}~6xqBw zkPaBF-bQ!PuYeuj-Gw}o`izNQtRfjJ3Hrh&oj+Bop<`*vg_4$^&p z{iEzK*%M`UzhI{W2F4aJFphxX-#|bhx%tT6tP{@15_~F{D{2^9dx}>7eHZPgc5|BU zUg2+Pl>-t8_-_jTHTQKx#ebXj4npm^9iULMKM3Y>uzu{IN zU#o9#5RxX&jy)+31=vpKld?mlQj_^2UQ&?f)mnLaq~6{(L`8)Tc?8s|t3AmI3d5WFl4fAy ztHu}bQz${O!!LiVyIiV582qCURaCUgOMEsbVM|BP7+2)eBZ=Mk)U*4E0%6GvJp~GB)@&ZH?M0bo`CJgq;jo-*-UblMpm zbwM>@!hsc3j8Bc#R5!ZMBY(@;AD%8YmGVi0>jU$21LkQDHWtNx3IMe<_}^cqc74R- zy=DjH5)mBT>j6CCwciSz&3K~eYeN_}mMrxARL1N|*=u++K!ArXf?_x?>hJ8$=bKv< zHO0ddylUHz6=4RU3C@|55Za8XeKyF%qG9b141+T@e~ttV1B&`h)9cYa_Ujkiu0NmJ zmrT}HaZD`?^w3yL*-L}R>`Knm6st(*o!pHz+ASM;=Wkv-V@e#@985+-M?X6|(`t5e zghD&F#&Sg?lTwOIE=Is^Y=g?SX~4xC)P>GJp3EwXK}WYSAlZR6#gY`pOdq8reK?at z2QKkB5Hpm>Or&FfuZXgnnb+lS`BQ!v7FUs~kSm5h@rhP97W`KRj%R!ng3y>8@ zB=mk-d^{;L%W)*N2;sSYOw;WQ&OA21o=xgxM~-Q(nI{DU1-iNHRWHLLp~o>sM&H@| zk}T5_Jm7HQSleN7mc^pek<=32yJaygQ?CMXH!I7bva)H55}VG9-ofqB42M7+!&5p0 zr-;Z%|1c)YC4Nga_{K1)`mNmEFUA`0(@ehmJC0`X=JUuPql+rs)~6mm zDH!cD(#w-hf@xDk!v69N`(3_jAo9zmYgKgGiSU8nHn1PtEByteFvt1!Uv$CVc#W=3 zLS}79hvcrVu9ugW06zM(*p3Mjhrh02KfbCPgM@Ux1sj{u$`M@DG707U>~^M}QHs*xSKy)ZQRO_5`m9w+nB~ zB;g<;OP~LP`vK0)tUpQK@4v`XoVBo$%*SVo|9`Q2v;Pk3v@&+y0ksS-!ZLn3DixEC z=qtFc3wMf}j}O<$KOrgr!v~bDhC3$C)Tk@Qc!aRAql{?{u-Te%-M;ltswF;r5*z#B zv%}(%vbh{5`oH^&?r^@`Nu#~ed;%k^u?^6b{QgyC7l^No-aFKN`uOqVAKi4Z0OBOU z$ivra^=c{q4IzdAu@fIr^*Y&D2o8p3$Kd^TK*e*V=hE&8`|YK-?6IZpAGE52$f>Pe}Os15e9c;Ub2r7WvpAhRNEwQ_aqC5COxzpgR&mRK#X1FlAaZg%= zc}h6Iuzllk;0J2Z~FJ$&`! znbdGCRTrj?lP%EmVc;fEVEX?MLuA9<KSYWPFLUDo^VAIw@m;UR5!$Vsccp)=y)NyJ-UbO!VF&|MndHU7JblQns4kOwow<6^$V2gYOTBb>GV=FK1v`f?k`Y= zX?Jry82LbEB%#2`1=*$Zx{w_BcjI48iRz5({=RBxXgy!C%coj4%>S1A4?QYj)9jAx zHh21(R!?l{a?UM0OZgexl7hT9_ zG@$x<*CVAa40$IzF_;0YtCG&wxYu$g_QKLCy8YXn*=9djh>; zo2({O)@;D1{o5F!9q**|Rym}hK*{T1g>=>k)H4?~*YxN0LDXnL3bClfXv#%~k*tQ; z7~axA(?Y(o3NDFpyG(wBG^34Ni?s4siPw8r?=g7%v!IDkv*umd@*%*9^AT?5!9~oE z_{}O^c1+F2J}K1LYc&1rfI~+e?GGT3sVLD4$zOuS=U7Nv(;3?V+v=BfwPKbDdweBd z-0f!9isNm~%Q^;uED|z6<@iEpITs=Q1oQxxI;10w>lOttO?}1iuN7p8GK>axs)}R3 z!afhqw0xtLn>{PazhE*Kj&NdP7rC(_za%YAp~YWcD54!4cW1sMDi5%LompxF1o?zT zzgq{-M|i!81)&{NYVkO2O6n&CPCG}VN)|S;DZ^1Ik-t*BVv)b4GGhRJ=c4m&MbI>+M5TF7^ecQln+^PRb#7cfcK@gvS=|9vbj|F2>;= zCk6{(ibX%kcr+<^xNiYY8Nj40N;I*XE{r z=asj~eYaSYz}2VCA@4z+cPULL#saKMjpvH6-K#xou1t8cn)^*1H<{2;vGrMhq8Pmz zl7_c;YHRCFpN?|N-voAMxDo~j+Zny4N%z3s%|z)#qEt$j*p!!PxYi)(hEC_x-Dz$o zoytZXR6hRaPQv>QL?S{=Ls^q7eGhvaRcbGg_57d9A#ZB#{GaWn5R0V@(PL{5;c8PX z>o@xmWOE-rh69BZDtAlw_QZM~w}J_pw@OqxVSe%8sraXP1eF z33;H#s}9`U_N9v4<f)2oYbmg4-5#zPS^f1e_k{Y74|^#1%VcWSIj@)t*|L?r8s z>nxCt`m+2v;Yk6HbLf6#t$KcnJhzewH3vjwEBT?)L<&1YnESd z^IVw3qKJ(|;^WQZce##tBI+VMUUApGK1uw|L~Sn!CR$A_Y!fQ4+Hr2pB$hf^Xxt;Y ze%oxGNqSX9cfYM7Q)~4JX)g$?IVGiO#v;FfWud+u>A^a5hMV8b3rqL^!3?Uez^PFK=NpG<$19MwVoud;ogK^H z9R|h(pfH~?W8+p>R>-(b?Ms5URDr6WT{9P2LDQH*L7j1b@%`DO_#vi7`)s&ydHHFC z*KYh4hFS@Crx%Cy8pe?7O6 zc#u)%78r@D>U(!zp}Kg6$M}0`{tutB*!^Erf8yO|K=;o5(dm zrhZYOfw^$8yfFMZX>NWNM*BDjy?SPYLaXi^MXBPiU{Cb^OEVl5g9(mj6_UAnupS}z zIDfl__P!>QyRa{;xq+?%`*_vW#o=z`$}jsFV90R<65L|Kl|UthiF*-rbogTgL^hW| z1)MKs^Le4cctU)&+Pv!6EKEeG8UC{;Fo1Gc+)k*Wz1%owr0ju&2r2&(D4asGpdZsY- z;cjqWlPUpr6jwI9Zs9p>dX= zqiPxDJGt$+Ms7ExrfOz5DZftPusZ_?-AX!a?zb^X(JzSIE+)@z zf7tigub&xN=JuGGKYe0m9?{6V9bJtc7H4XNM4;%Mm1;^TI0tB`cbbtqz8&S1S80ZC z49^!Uh;dIe zR6dYgse+Cl$0Vz#sKxG1wd`J;_a&FwFG$3Sc5zImin>H zK#xdyltBdQ<3brtL<&3J7zN0N8W(|)4EBu`7BbmsCbY(vy<7UZQZwKIF&@wV53civ zF3P>kx|8$&lvvT3C~J2ky+VBifInbiA&>~%?(|R3M0MEtFUIx@MKp^co%9RJ}qrJNC z_klztU_~j;nVe9UhyKn-ZKYl#lN0EnM#C07MmZG)?D5$o&c;e9Zrqz29Y-|r0j z@|e+Y$sDuvCBSOjq9^1M7(|RBAv@vtfc@&{=fh6}dkr9h zQ4Oj%OLy$BV#6JZP(+Y~7qtT`Zq1BIA~ti3=~~=kw}u!JP0T0*1ktlvm|JcT4=z$m&ez6s_( z$m&!SE0dk^j72tk=H^0(Qeo5DtGy8&9d4+Fxc|W$G^Vfe0X$-mlw;;j4oy`9i1}&p zNYW+QJclB4n(szl;`?12&|rNXQJ4YRo_Gw^cNzLZRxkxdnW0vX(3X$|2Mc>=ItNP! z9krc)+aI}HV(-JuoWn8~l(6g(7PkCMF5_#mSw4xbCrkuv5zT_BrY8Qve}8%fv`H3k zuhFAXINh*|i6M&9xFv`h=9J^W*cc zzi`=36#D*1)2lfDYUyb)vTnJq9hhuRq7U&$Fv)smyln}eAVfdHoEkwykmHL3gX;H$ z{1QR+90wz;Df6yDMA!f}1qzL{r{}wps;1p%&{V&G`F3fXl^9E~S119PS}6uV#nB^h zB+x;pJ%I2EA;pa;7Gn2-N19TC4<_d*ZU#gFU!a4$2%!AE5}7dfE-A9tO^?0xpN?8an2EcRPp-bnXI|YD?GOiq4_3g!F|(_7J0~Ur9y${fJ&X{f2}jR(`Z^_h(6#(22IFORU~6ma5(-?lRjO$_1w{hnP6$ zM?*#*n+ZMu$^K#S2i0hs?|!USc#b6aEA+>Y0K%F^`hDqSA-XH#G0}52`66SL*pfb` z?;a@(ODv08Gvlx=Tb^Bgg{OqA8CGxk1SS|Y@bIy)aIml{U8AEIsCG)y-KQP%fpWEX z>0be2I5&lPevb*{H_{`+6{IPcac3!@@WPswdkp0h}I{eIu&*7P0L7 zmM@enJ*f|%c~jgxp#co^FiVZ?Z8ttXE?9uK?gy}p0-P^1EiEnpK=12Q-EA-XICb*e zJDf~`+l*?u;%3?B1kwkqYodOP{+-l}j%R)R0eX8+PoYo=HUc^GI?8bJBD_{ql zT*2bgY6sA6!5U|d@A%>;@QfwkXtFlVVERfi1KS;G%H&b@%3#Dch0@t7Q=3g$uLd80 zOpx^cjSxvoO-+f$CkdpO?aaw9=Wd?9xy;U{aC#Bki~3SXAZ01^JEg0+#HcKLUNnry z)7}{xnW3?013TL--xmopEO(@@m}QS{H=Q`;k{oRv-400n%L@4ENy)-Ra$Nq8RlMI{ zgpbNi;rQOM&BeAqpN|})v>y1b(az8diJ0A7G&L!q2|0|e5Gv?x~%;>EK)Zfl_ zh$!cC*%_D&rQEfBNWaS!V2g?Rn9a>1f0xbJ(|R>An0i0&vfgW>pa4{4bNrCV6I}Y~ zA22^ZsB6=C1PdxJTo2mYcy&**mH2yuXiT4K{7WiDp=>l*t5 zRL5Ee@WT`-nxPKxu^syAY9R5fkQz_(R$md@G=)@PDMvoP*5Z@L_1xc?vu$l_>xru~ zw=GF3Xt9?32BKx&nfXB)PJ)A=bxR`{C%`6IhPIh+;}pyg7Y zo^z-Iob&VjPD%vq4)-Ui(%|b@M!ZzB(O~|7yn6%F>EVSBX--PHWS}*i&Iov>y0M6`zGqT&VeOS>Ggp`x~T+`q^lB@9I z+`v7I{n?4LKmkru^4yW(X+?e8ax|EOE2avlr>u7!U}BnSA=n_G`RI{d%EhnrM}5fG zxGd&+xx^_Cr*DNe^@z}|P+8*=HK(p^8gA)O3^(JCmvRpGK z$8j_wD4$jB)tbO@Xyf&gXDt==cz`;Pp|E;7qQ4Aek{-Un3JCQ>emGrq=rOcD=!-Mj zWSxTL%7RZz?luLSe9FY-{B03G8190W>XPh_zPD8^Wk&nq$nm26-@>pmxt2T90Gv;;HmqzCTpjqYai8|wkCN#FubrH z3UdT%xbv;3_<(!@P**Js*15Gu#E|fJdrw7@bn*yJ!aCZoSh4fAq^8~<0u+^n zWXsZ6=5S)_$=83AUXf2guI%F)WN?=Nv#@W zQ3SK zBc`|^z{bCYkNw@5!%$Y6V;q~ZOz+f>4}vzo`}&qlU!RPX&Yk@HFuk~w00}DsXj2}+ z6KV&8Yxhg-WJ1}oN$$zse^qz*L_?Hm)id<@q!wE531iOA&)hq#xkL&coSm=FBZyTt zaSj?C{a^ZV!)n~ye#^?A#-f_vP!W4GKHc5MI4=~L8X%{_ELBvs2Eq#EH~^3-=7Vq-c3-oSPoJ>V(CVr+Lo(G$hWmELr1Y1t^Q5fa(KbE+zJHrcn zLqAxHj@8f#D!Jt@Mby#04_W*Q0KjZMppHGCh*S-H9(zW;5X^z^!c2aiG$#I&M;zdQ zqJIr#z7MltT;#%IHNG-YHO&9%i&V2=eJ70e%tai8e;lt zC*}TWWga`bU-7_I@U3Y^f4*Wz(o7hz z>;;b;CBBAW7F9jewO4};K6EJf+WSCJ2(cK8oMp2pU$9`en^ezH{(G1XP#_VlcwuZR>lE8Ku&kgT%%b4+sZg{K)2xUW?s;`y!&ZC^G1-vA zi9q`*48^~dP%Gx--gAA1JeQ3Cs4vd>!wGi!>cIi4(mqUzMAOY4rdL7ac8sT&`ZEKqQ?kzFQeesW%x)LWQcKB?5W#!fifZ)Ens(&keN`|51V#G~mO}k6brqKT`B;8@p$wRAfzN z&DYM(Zp$e&GJL_C>mTd>w%}T8wO|%rKQelq(RCgXWm?bkd8c1ayYM@^iXIhjOUu~g zeVYo*hCzRlr%9z0tV3^VmTNhjhw-((Mn{cCagK`&u}tXUu&#CEz9q#Q@5UOr3jb4N zl~`?Vb3+g6A#G^R7denK%VywU0oNT?w=>&N@Prm*=A-Ts16OIc4p4jUx)>car;|qm z>HB)UFVN9~)2Gg}IDGTOFI_Yl=i0_d`LWXfYlxvxFYvprH0yy@lP)ga@B z#K5`n%y*50fnUPEGS(94*5`$)&TX3jv@g_4ZS*+j%jv~I zEy*5BbV)@&O{vsdKPzqgEtVY^4s-7d!j@Up}gG;sRgr> zb9o*{hSZJ0L4JF?s(B+$MLXwyC(E4x^ixt^mW@92^6JUw6Y^i1hBC*t?20@bxp-LU zt~ZSsYjd@%t)}q^WT^r~v#I+U$Vb%Rm16IH>bVe5FRF$?>e4SR@N`>nwG<`0@)A+F zng;UlzP=VVu#h$|GJNIeZrXf#hLT)56p)46wKmuF;J6VMf&BG930?fSW;NcW*rZp3 zWg;}7{8=XnPQ(1WyKyJ(L-VZ7<9((pm+?`TF}oy;y88(}U5J)zditf=Z~kqrQ@wWr zmUOq~9^2&#Gc)Ik1aGTwDL%^m5+B$(9XWp16kpoZxKN)EtSSFv;);BRoiDo)eY}M= zx9Uosfry$lu;%|*c%4tZ-y*RxLJB_0XD-I+u^a2u@pXuboN82Bac}^4Cbd*;0PO|O z5!y6>(vW|0-gsKbc@RK-cWX6f*wV9pR`|%w6^xV3S|3@a@RLq$JYQh;&U|u^ruoML z>K<>nJh(f4Z_^$w|2NjH#hgpWGpLiglZob^BE%nsfB>0*LrG5ozd1fTPLFyej}ScEDoPCB15(p2Sp=z4K` z#Lx9Ips+BkPUNgcN@`Mkk;_x4S!;31kk8{6_jSK7<;_pGO%bzZE|Kwvqj@wn)VJ+Ovq(eLrqQA zaL4jJ1U7tMEN<=lSFgL+Veiam+5(y$VT8ez&z9E8xpnQ5R-x09@df4ONB;G}DN17V z-6{c7?jJ%xvq_a9iPpZuZ^m=|+z1o`f-7WBZdkb4wLgD&Pp5OLNocVP<_u!kpg73e<3y_L=F%L3-$? z`}eS2M!3l7pkoM}N+eXIl-1aaB(y7})P#c24AR{+y?sMnf9cCkGREhv1u7mZ9@=LW zX*meA>MdqgSq#44tRHAda*bQ=nLKr^{?JXtIO20@=1ZpYPoN%=a+rw09%q`qH z?(`{}buPWOsi&?F4nHeb*aiB@P}SRu`&yev4kpy=eEl`Ojm_5elK+s60I&nVneu_& zH9S<0F%jf1+xGNJe#s*cmHSNc)OmTUH!j6zW2aK4CbG& zg`EE+%Uj8vEJiUS8Ufb!@uWQJ&srC1tkJKi<=m%0F~I*?0f)Pt1B}5T0?d!W!$Uyu zZztLk(a0*ijq3UT^YB9&2LYi8=q>rDjqjftyIQjUUIM}#ltXNU!xYskg;#0tQg0^= zftl%rD`y_>iyiCBbpG*^cE+mTPYxdAOBPi`gi1KjFo`)vs-eRPJ`n(3oiMqVW?yMEEk#}dvo{uqYo4V zk~Ck&7si9d=w4V;BvI#ar@Cg1?jWgXv5TVLU@4zvrE#wE$(#5@`AD#N8O*RJ-8x1e z1R(zApPEwX3l#sM!Qt*SgvYJfA_|@G|C1r#yF*~7kSQ?-1TUXX3Ky-P#w(s=KN(Zz z7H4o5+AG~ta%kc@Q?$H|UPI>=Wa0qA`Yq8jJ5Q|x>tw+DkgqDei=?*FE!rn=@3 z@;JWF{S&WYK{s7N>pLay#&Cd<=^Z>oZIQ?DF8;k6C;P`#NqRB*vw^c;fnf;w>F2}^ca0+<{mspFSckin_+_B)C_pE-HD}7S@c(mDV zVb%|}o5v&U*tx>am0z6{p^nsXM!OPRKzbHpPFHnFhm%01M(% z4bM2qS$EJh`1Y>y)`G{JJhtrERQ5{O!3a{6xXre>xdFy z99G3Eg~m~_--g!p?#&!EU6~tC6TLXya zKP%x}wa}{f&MJBPeNF5S@aK_Gz<&v_R6ratv%*5}jB1g5*<;R?f3^prc@_}t-h7)} z8~M{QX?%OC4|}I>&N|oM_myy8p2~tcb9hxo zxnbU#Rg#1!Wyamw;`e&OKX$-QXlEmr7xRNh2Np6Qa{vM&jJSH8s|y-=%5&rBD3!ua zH`Cl&LRicCf+81M$W`N`-bbB;iyi-#Uw_FWrJs4)c_v6bd@vSzvYd$q4BP|i)Je=&ev_0QllRW1QiZSO=C!^=ZPpiBG>X@=e>wI)PgEiE zO9I;Puc7e@0&(4ttE)4JoZBZ>pD1Q%$M+*IE4&280+@pE?4y=ZCrcg9>O)HLR_=^0 zQP%7b)3qllGvHE*xac;q|19F=l`&O3`2d7rJA7P0o$_MN>F388E=t719u#0lZ=4e4 zz@`(NcoeJT=!S^g=cd%trFb44**Kwf8_I7KiRLxtMl=#?;ImRZRCyYfciMuK)oHeF z+E!-Hc2!4LZOCED4UGGRW6l)uzc=ht#d3MpDvUhQH(iq3Iu~4>T7um#hLu-g^;pR& z8{2vWH53$GT~^&iySlI&-pnSJrE|F|FtptnVORDOHtUq7UIF5g8>iOJX+9##R{+pgkg6HGR(1N#{ zO(=haO$9Up{kQ;Ou`pIN>Q60s$&0>~1s6kJ@_5aGUDp!{!HroTm1B%CZ3!MpH}Zpb zt~nK^qdVz#i+L(Dr9lS@Y9$hhZ2lxBiu(c<)|XWRLn1Vb3sUE=JtT?|KwEaL{OV^N z;S0y!7z>_#ug=m_MtP3<1;5KmArwvL-fjL6Jh-R>f+K{R;0F?wrDp9pPG!1l(_(sH zmL*JhD5_$rX>L>|P$ga^ORa^7V$VabYF=y$H#uC7B|AYnM~j(Tbn|V3MOKVgsf+u4 zf~x&QPw`bLls8Z#fe#sB4GSsLF z9fgmGX>e1+=J&xNcZB(FWX(7SQGHvARLZtjZQO!6KE#9w%6}9Du3GP=zRvV_tp){^ z1_qD=mO%L*GBh^t2;+o7q7W=A8+Jlv0Nm)N z;3mHv{=Tk}GOvE(^ke7;-QIk^>+%wIZD=SrKm1nlA&cpJH)!Ep3y8DtyT)2!j?Mv7e z)P`f2j7AvPDO=_u=0Pf|-+lSJNl#DP&5T#WLrG!83`=@E*%994=+wp<+O+fgWg3j# zh9w1-SeU=h*3nc^nlKSk1E8Tdjo#<0BzNuY_lG3>x3TvT{BB*HURO8v*E)B7?e{mS zLz=DpQ(WW*Ipwye-uKqmI#*JwJWe0kcja~_XYQ|bNbWZXOqB=CfnSwk1rd249H8Gv zdauwj!~k@;4+TKI4~uJ~n3~|96%d%l*p+IF?cpWzSP*gO-LhGXdyX$iCd`_GveK!? zH0Kxx0@0WR|`k{*Ssw02%9y2+t-*jh z;?lDCuqe)Z!MjH)dyD(bRU@{Vc6GHGwZ&JoT=U89xlL)GdBTszJO^JP&@$vkvcSUC zjosb-?q-u;Qc~95PTgOSBvrAEcWrK&S&=0ta5x5pB>VX__w;4>Yy!OO;LVg-B)r?C zfdbKF#eIR)UsbPKZIkE)FT+wltCpq@<@$IinH*M#u^k63mxGef{0V6*bvm&8IQhU6 ze;3-^qZJ~a?5EuH_Xe%Brr&ffXg4Ta`ab>~nHM$^8OeX=&o3}lcq4emVOZK{Y9Q4= z>z}Ve3*y9mxhyHZwCulQA#U$kG;u5oFUPgRfesMzpEz!qVF(j+63L?;I}wwgWQN_1eF8C$)G_f~MbRfh}2 z4&s1QPU|bSUea&2Tc%#ygn1FM3}%5T-^1Ra6UYSTHp!q(nngYhkJlpl4&1Uls~t0c za=@x=n9}|RRiQQE<;1<)#^Akc=faf+_(N-LzCnoMNu<1PHiLG=XI$Wu z0N)HO)KWUB<2`NqrZ=(4g$awit*F4Hk|G>36BKNPM$J#LvmBMPQlA&H(Rdb!$kVD0 z$?!_?=h>?@^53p_Udmq)x%R(6FzI9f;^)5%Qdi1E*IAm7E}y2YxYq1NcCcOJAD^|i zSVrXDqad{ZDXxGziQ!Ja%PP!EhewkW|8vM89Ey*=J{`)VeD!pJm_8TlG~z45&@tjx zE7HGd_(+dibWWH^UXmz0lOYL#kbVMS?X0;xA`-W1vqRUry^RW(GS^9P^{%ElP?-Fv zxcN7^yj+m7>^)oMYJ5$9wR-j9&W;F(sc$Y=U`R#>+17OY6-%G+m7gClUktJ(#%Dc} z>{IqGcAT8-`fsvw%;y~P5OUW*_WMJK&ir)mW8EAeEb?LYyrk=MUK+m(UKB0Y#R z+XOGrjs?iagwxL&U7fYUTQ75m90;)^tsDb-YM(v6z9e26Miy+epT3 zrgy}YTOJ*?kaUeGZ-@ID$`y!XEPKfHo-yS)B1g3|X#hk%;PT3xzR*!KzZ%wUy5d?7_51;KUW((bLfUcVA$^;UD!O}g_= zu%5Hfd10^nOSUJ>bv5<@kg_UUDWar~QJT`$y4U}cIMq=(rZ{a~PSVqWy7zi~3e@-O zag*Ig79(R~`D!(;iwnXY&^urN&`Fny%d9CN4}fp?4Wd0K%P=q1dLjrDX98=wP-Mcl z>~o{nxG2miw-Ma>Tz!^vT)X1CyqG%(OHO&~vj&;cvcc#s{&!v{cP%GmJ=L8n~(0L}D+{{=QmtcPBgma-{XbfszKw0#xVXL9id!+h%0{n%(`nTqhkoZs2@r zpR~`2MOqWd4rAo@AXVwKcT1x+PSp9?woVqhy|gU0UPsxUJO7a@W$L4LbeH)XXB9p< zwr>WN?h4>bhr*2U+^je%`1{D-= zMk`i`IL-E6vAt4h26cyDlT*6$3xSslfb4nNr;yC5nX;3me~lXZvdvy+lmWZ*!F#k`@}3 zL)HEvPF8w@Kep3!_czTMy)mxej0rO!R+mSP9ULb!%oMVfr`=v9*XE%r=k1j!{oYRU=$i2+6_g*Fz44tcVDG)wK_}~DP>#h53SbcTz?l!Vhg`KL51A|+EdaMEmdtDkCtB6`mKmv?+ zBq<~J?d_FCH8P*qKXoh+ELi_jeO|HT%)X$wV4Ah<6a9tqU|nX#|G3DbX17GowG|Ug zZ9nn7E0D0U<(_7BO~uE0iHMsDT$0JU<^UN7rzmgyNSl!5MCXgqDwCx5uPE11$mr>s zR?Xj{fTU?C-8$>bU#26I(ot}7UjAi8#=B^tDo(!J9vI8#kyp&0=6w9B@lU@#*ZUC! z_3ta#3FFg-r$i5>8;cP*aX>Cx0{!Cy0qN#aoRJ>Y5g)be@YDaL%K10By3OytYx&== zbChFR>EQ(O+*bT{px9y_su3AKQM40HZnm@ixI#6OirnG(+Rjj}QUPZI?A;W8npBtOX!rs=wdY@X7(AKEh805+MY5Qt_~l zXBGd_%|pr!JjK8;*Ct?ic>5{X?ki5GY1XWT@O?Q@{<2(Mm+x~L{b z%!`4(qm3$3oj5WIZ{KBRpt571Bv`Z=)rxYiR=)?F>&nX0@br7SaLC9ZMta3-0)Q0( z%3R=H_fh{te*_qpRW+7W5y}KF%{h`l-E-S{=T(g6!CkNVy$c&C2=w<81r^bp%+dlA z4$Rz9S986jICH$9lKl3*9YDn>lhAncNjWpj!5Yp^8H>1aab}b?!sK&tK$q_xLCN?v zm$3R(8P@E58r06_qc`l9_S(F~mm~Ic7KXBe>!vp2)DDgb`&U zR~W7t&$tE{-D;bVJ=`F{!wnkDE8iNM!}8+dKn8i{@tr!{XIqX2pC3FfCXJSU(e8T1 zFgU7SCUKzZYNW|AglJH7#w%X#YVt6siYd+eSq$1q@cjpSjE0Y}#;{X^Ju5ai6fkK8p__AQPZB@zS-k|>Ct=y(^Hix$jrE4NAs3$z(#q~BBKV#v<#%{m&TujfvJ87rYbJ05X zp3gXIx+(0^$&jNMJ|4w*k)erSS>g8V;j(S?dIHFH>0sT zZQA#Qp%_sh^}IQ*GrV*A5lL5KS4P(8<<#liQ`I0sbdE_d@%u2EQ;Cr$t*uL@j)BHd zhi*=n;5@q*U;jedgU-fpt2dEL$*xj=F~4RGV>}M?cb9~6aubbtgT2)=)5wr2AWPI2 z)KiwK{C9=*)8-N2eILRxX^j@&+I5VG)v+jzCi8H83osFL2Vb2q zJgt*;^-ywhzW{6TX0jSM)b1#>JbWL)I!+0T>YXc;0NJ1e$bqczW#wY?NbPNxKMP0p zjGVar;OY6JvCAU}>UJ!QFb-8R^TJ=j7Y4J^QjXM$kN-4x$2m2{KSjwX9+}=etMf@n z{cSGxifwg{YW7$66LsgV=$XOhf(|7XGpRrTX-kG#0b_QkAp%u~GZ~Oell?chu95uI z_x_^bsc&jvBxW!!q2C;L?4F0VygBD7;YmP`&UK#SBbi1xB8Y(8w~7j?)q8D`QTqgm za^OWs{Lu;xpT5J>=fKuayeHl8zbML$r6}&QcL__a%X-&Zl};A^epU((Uq%=f*EJ*+P$Hz31y|BimcKeAq$aUH%2NlMDzV`$FFM~AcW1|G}ZbSc|RRASI94NO@Id(5Ji%6Z@X1!-t{7YMd@_*oBfZQ~&nAELwQZGc3jz)$ra?tTF z{4asT`BgoWa>K2#^1DBC>}F}8hy?lek2v&-2ZN9SD%bKOPzze-)1zTlSoTXSJlwU_ znC3#y4^G)i;j!M)zlm1!AphKG;6$7ebme+|z~ims)#|v2t0XrCJn79N?|k@MIXkAeJR!@ffvv$oYt&KqaX_@j5cmovJue z-O2!B<0|i`|3}4R#V$uDRUN zbG$fLm2$T>HrDsLF*YCB*VtVSF0#<4x+UThfRb(KdT^3Zb09F{JN|si3?wl^E8l<- zk6+k+i}pd}DU5%z6>3gIWD^P-n@&T1h16Dw%)2k=$t$Wgvj$eTQ4Ri3sI#1vsf-pL z7tIXwfE|f0(E0SaCb39}?W#wH11Zk8ORCy*$xia3ZXPTR$GkKdjQP|nyJ;1*l<|rT zy=mp5f-%J^3UvP8IY2yc+LwjAe~qjs;?I+E!SfG6pK+9TQ_sjT&}TAnxI*=7a7f%0 z`JBm}+P0|**8B5_n$^J+Fd=}M2F~j_Cd(1|mtqut-UHT|?DR0d{adk3trxr)5p>Eu zbf^yTM|~1zm6JxIiwV*b`wA$v0JOX&VJe&!&#-wI`n_oc_r8aysZ}XLePln|XAiKBXleK)4H_|lb z;9scTz}Vnn?ssW5OG^~^k_TCao+NJwZ4b-mB4x-9HvdJIjJ=#-VgPxWhAGCIx%wT@ z11$JKn##0}vxk^{_en6tK**O$kC+1@#S8xk@&l?rF|V4@1 zMlHWk3gi_a%%MdG3>*LpKW`j1bgI0gITmc!zd|7#fwBGaj{Lw=E^qS%&U9|B^YSeV zzo_t*aSk=hfT@!t{0mp1A*dq4S^ob}@dx_?yps{9NA;y}`*&6g*EwKnc1sX`;a9*wXK_;bk0vLAL7m4w6(c)nPZNL1CA zG_{qqOP`oBmJVJk$Bdi>fGD$~Flol7F~&<*#n$*9kkkHj%Bw4MzK3!JF04i8&`_f*PM_CtyDOR^h{oj-RamBh+#Ux z-kj=_TWIwSr=p_gWgqcyGs8L$AlMYk^ww&=HW2iT)oh)zkturR=_vDh?&sf9h;O8w zdzKVS7>Xm+j~CK@I4;!l#J8;=&J1H>qyv5T&EHABaCN@&Pq@}X6G=@?HOJsv6&`sR z1jWK#;*~Y?YYC3rF@S^q;)D&dv1g~WOsl6Ml}Y?)U3d}DP*i5F2k18ELF^XRoXMop z6=7nK#IsAY0WQyt;Nj1y8+4h{uPsww*)H+bl3N~~NDRjQVK{mG7f1j$_^ zj*Ed=C{!19WVDMtxb=KOtna2g0{5s-PEJ!6T-$KG==;`?(;2{+ocni6GHi~v4wtT8 zM0W{ZS~0Tn^0ER_+9Cgp0)>}a4mN+bo{R7Nj~PV44P~xrif7@fb?Hi={&Zvd_hVzQ zDGIZ?Ab5hL8GN}}QxSeETNqaHWjDqbQg)hH%bqqasyj04v4&yZ3!HCxk-Bh^W$p2< zllR6)$H#*!YcGu%`C}3{mtFuN`C%S1d=;aX;WCtHq6Jv|7-xe+Uv9?Erv^4V292>@ zjffm&5ot5SZH-0-^A>CWXlK92eY{n8`(z@P_@_;|VIgz&VufK|FIJx_35q9X==C@y z?uD{xkOF$lwDS4cMKG*P!-qc?=N~W?m{EidpXUt=3MQi;v2*@89-G{tEN138W$PQ< z+*4S7Ruw8}$DI$R|NPW{V5>^49;Fj?3u}nqGs&r_lTX%sUb?f}koVZ?Xo{%uO~E)N ztJAb4QDwX!*qXb+V`zHd#g+{(_-pV;peMTxjhsxUO5w|d9k({S^W2dsW$(EB%^M5r zh~CSL+06<-D)1QJlpTeFtXptTd{<3Hov2C#HT@%h9X9vF;_xy=OQ7qSJi9G;h@TH6 zx+s6z@y%Z4*S@Qa6F_;=%)mDoo*8_xrl>2=F$g)*enVNyOO~22PfM&s`06GjsZoL+ z5lHTp=Ao^AUglAj@(EQs*~<&xk`tn=|HwlUnEX;#=0l77Z*KxzL;e`s8*$3GG*xJW z8&@E4u?0JX%UU05MCnR7PbUX#?r?qK&&1Xp93aweclbVpMd0B?qo5Qk4dHb?q{id6ns+U5sp8{dcBh%ZtSe z^TJ?q89C%gzU`=}?}0O^VYF~c{=p!gH}ZuOmecQrrUAM;#FuoGzq_ofFIiwc!Owcd zE*sV~D&1xj!dplDzkn`>-Hw4`X)AXobaW|ZWfiru*8Op8O+`y;>6g}-AUA<0?||tu zLPpAGHeTL9&x1Dchu;3|+x8kPOZK__-99nRWdbIeOnpVgy%IKWtG>~%9h;AF$uyS} zQwfJnk-Jk=CxGkF)M5$ zc!cX{rvF*RPQ0@=C`Tr+~I@Smmx{q4`PgB=8wacu`=v{q$;y%QoDMJWXD!Tx4 zgW#j%RGt9aKvy`1uiFs#!m`;ME;>l4KD3fdfw)n5Mzja93y`YycymCiAU$nK-3Ol= zF0pk17kjf+=M6jXvij;~KYweudv|sUJiUeVntsUoaQ7g8XRfVUfV}E5z$3qhS-KKZ zg=eW&c{iJebR<6Xn<(=J5d9=oPG7RQJl8hKOKJh8E>0B8%xazrZ~JB?=P(!5{#HLv*IK-yES3! z{}oGd-aCxf3Y}&(Dm1R=+MBK;;~iZNaHTrvZ|f5TNsGRV-C%wYC3HvpYCTi#&l`6& zGhbOk!X}D(H6X;Rt;xTHyv`U}=BFJJ)F1mGARyl}QaYXOKM~|!VGXeN#r;**H$Y&sJ8ormd|x2L525@Ht3 zjq-P0mEmCKB)hyVv2XVND5%?A)Xs5y;oD&Uo#S}I^P6u%nHrsQfM{%_ev^@2I&49& z_IqG47k7RQRlY^4Yl3VKwNrG#OK~NFaZzRNJY-t99)Q^9o^|SQbYSKip_F=hgDU&_ z{vRg*k+4FqWaLZP@bYR;4(oO58FR*MFz$C6(+OH71jb+8d;n2f^ej(xon@7~>Cgy- zWN2lnYB{P6iS7bM@EN_h?uGZdbfB-^lu={I!2n7|uPbwNG59?_$pl8ZusS1KCdx?+$WB9Cs z`ByIaIT9BrWw*?_8M)Ebz?D6(P|e8pNAvz(snPpiBpdn9eVOx`wUp-W{XJf@lHeP< zk0iL!%1*z}a%CUMhDQ7|ht^-I35LPju4=h$9Em4pHv zi#!=QpQopR<+TH_rW!AP0yq9!7arx@^Sr-7yuwpQa=Pg9${8fel3Cif2wSWM2Z|iL zEYyy|_c&Y-On?dlfWQ6zs!yH0h;B<2F=Kv?yvl!%ecguo0-+EHwF{htG7M1*{3nMW z9CDKJ+GR5uu73>JcM@L|O5D}ILr7_bH&vvBeJys^KpO1|JP$fTefl9E$npGP9~T3- zV+@328_a9)d}V~lZ#hm{>Yr<^TXUOq%Xu;FEN|&f`Q7zi3F?dwNWf?yN|#OupE2Qj z{Lc`s@dN`H%WzG)pnS$t1a;nv&#cTJ{4(&Msy+1`*2@{eaTy)&=Ht&lh!%K5UttV+ z_L>@JQA&&9q~|5rNJo=p-}6+GA^m%`JsO0RF+g+OxH2bX$2o35DhoBBKLN6R5mw>V zZ|?G9>5Vl1`QauJgoiJ%zSdN(CI;E&F}( zti$Z8JKGZ8zT`MJqn@`y-=czN3X{$;b@=KS>mY?;TRoYprh?kckF(d3>Q$B5KH+B^ zEknV;2>C|rCP91zhZuK!z?^^`{_wm4-s)A6!(7e<5zoDd-}aMCTq_aTx=@WDuOMBE zMkiSLJXQ$*Kq@^UFT7+u2?Kq?T>d&nqhm-@n%z9qpY7E0Oxo;rA@_%8-B(xtqSd-M zqTsn01g^iz+}i8EUpA=1B|npkoJ}Y_)YVXkx2ZGBIm_5rzjIHsUo3E0)Ka{V1bTut zpYfxGX-dv{T=evvPGBDJ=wf%+Nm+?K1O9#1YDml^|$QMymU? z5hno-%?)(6Ajf!ZLIh{qh>FwX_uz7@u;VhDhKkw=kkgrDB!41-HiSOMb!)KP9W*0* z+ekC~y+Z|SFl1u*He^T`@q=G&C%hFLs8^8%;HJ(_F&LvAJx9;x_$t`A4`aemQE_{M zRYv{nhv6ACyR1d9^+gq*4%A~Qq6))ESh9w>V|94Aq^!->BVVjgU&D+{#>|jzf{!~z zik<`i*K#ays%Ezzj=>{@uMdVR^NilAmfet*pe(H|L%E%4n*}`@Mf=BLcZ`CRjD-U4 z>E(=+S>}=SaiHZ_;Q*q;qdA>95vj;1$}Gi@S7*ub@(+CCKlY|!^5~*ynKxhS3Nvmfp76XNx;;mpHT}r z>gN@^=iHBL9z8ir&jR)$G#1l+eQ+azK}>p`_XqrwO5EX}L@ACAxH(E3!y{rr zyU8p%Uf*R9)Hl1~5#VZ&qaiRi>fwve7%s`AG-76Npaz=OT3)Yu`HQYh5>-u_W^O`j zuR)thWW{&$Wi;>}kWcIy007fu&(TF@nqe#Am(kT|6xOS+3&IjE1T!OSFbO<2TVcm1 zhR%{?B}bA?#b-%YBFv4+4Yc~l<7`7$$JcvWY%OQI1+JMH`8NuBhNv=D#`^nY61zpy zq?v^9;$7&fE;?%D?+ui!$~t_CQWoa}UN801c`)fR$b_6IzAk3(7hA&QezxtnroDHn z)TYya50obI(pmnG_x5+3UxHt@$1I-g2CR522P~j_vf5p)ZeSVe*ij~VK=nI@>gjdjEMO`)xPL3;626y$3Qw^m3sDa6l=Z$U`$U zb(3EufE_JlEjqofpSq4xF1}5`jK?FS_+2Vq+J=2xvNGIsm-JpNwc)}&k2@NDu*%`w znLX6AQbXr_6wkc{b`lwBxNzG4qcQ&JM7=jh^v7&H>GPu8SyqbrwA!K{m>-8-{L=&3 z4CS|W8prICFfWRbX_dh^!%G+WL`18bsUN|d_0`7MKSW!Jw91#NKk7g&x}Rq2w^p73 zVfGci`{I`h9?Py{4jZ$*+CW1?q_Z*lWF*Gob=Gqf!P^U3F%&qV-2^o0oMS(P!LIu% z9t%eFiOu?)l*JN;?%zt`1NAhy&Rt5hQGr<@WihTcGU3P|-?i@Xt_>c6=Uipjw=yt=qwk&;!+3*MoM_+#H ze*H7r)z*>S44nu=lv)Y3d38@-UdabrSej!m?VgS)ndi;HVuE1tyu(h~GNp{(xR zb=lP}=@@H&QsS}M%#6Ra>i{L?(dB#@SmKMffQ>AjV_9_WT<<8}V z=snJr^ej=mJu4->bo!rq*HNdzFV;bRHtc|6TIak9UFGDy&Sj8lzpZEXBpp%D#Lj6d zp3P>6&GNpV92g!257vP7|0+TR2K5qz&z1K$DD>ZL1mJX!*-REg%1TT_lqT>S6hWw# zua-4qEDCSr(`ETjT2#QMC)Qqq;2G7k$^NSHru6T4>EX+qITCT=WNvw<( zspPQiW+U7&=!}Jy;gDwem2$Nw=8^)?z=DOyMb>E2CV%Fae_y7Zz7&2`gfm~^>o#P)luq`=H$Nch-A5MA+t}ZmK$mUQXu29RUMf$g2hT_1biL|hM$OFlQinE( z8EXt5o4Ye;9Y%RNazhOUZ=4*I&IF#Kz|Q3}+~o6B38=G@V9)Jp@6pGS!=lZN7F_B| z>zIuM!L@6a$*l|HfEs%xx`BQ+j>Ye2Mw=r6)@$3$c`w^Ebj}VucKG3Wbq+C~fY~HP zs$!)MKK53QsaG-0NltM(zYi6i(TGHhCx%7mf@&H0vxl4NB*X5h&D`|7P2(?O34`X_ zXV!elB7)WE(?>A&EgE%`+TLHG;%?hGvyP=mnPXe6<%h9A;$CKD)|)l(GP4_Jf8&kx zp8a|>@Gz6o>nOSRMy%e^1nsL|6sh>Yj1xheV<&BFV+zU5 za>r%s$|0`^=y8u31BY=3e^JAqn^a#EW+hWaW5pK_7$@9A+%yA|%3~0&A$i|Lo-X9F z!p=ii3NlE93qtN?hMW-u+t)HQR)`O-a;xOr1p#r4 zYwcTp=9Np)m!e6fCa?BEjby7sLR|7wK_ozu`CHVf{VLTJ9~ip*&uSxp@K-$RR)CPn zp!8+kTCRoTl>yFPHKv}WeUJp^>uewM1824ayJnn#!LCk?i9fOj_k@64xSAEF`R=#E zf2#{s(@hsa6;ixg#RI-7Dx$eKr+)^f69XW?`aTt4o^8i_&3x}87l2^ zsn@O2>Pj;?aS%)3In?kx@ozSMvWajDX0bEZjyL1IOs>c!3Xy!dCLm2HJhT2kAM*h` zl#O%}^1G|h)vAuh4m{$OJ>h5MvQB&^hX2=F1Acl^@F5G?yWzUh&m}~_{LTve-&G?D z%kbjOZNXt~k;TD%c&bV+%7zE_(AR6%R zWl%OkPtsmUa9+G_@=&xGV3GHB(2?8~|NJgrzrtwor|zn%-Rr>j65Ppv8)=;d|6gfT z<4Q`~<#;=4!4Grp&L?9Iu7O&oLv`P1_2HrRobO@b5kCKcS4Nk!v(9X^V(AA;%Yut` z5>?mP*x-nQiOwze4&GJRvUKYv6VxxFL1GX$QSq$9Zu^)65c@1kV@^jKejiGrO<190 z&Q0;|QMia}{qbXT|0+qYJ79O5(hq${T1>9ZVLCInwn;Nrv$J~fC75M+Os**C16TH- z0ojnoM~71XPCXeNl1(a!+nXN2slZD&F^isdPBGa1AaI}XaC#DA{Ytyp>sC_$1)+g5 ziB?wM<5K zO#%T9AYzZYm~kP>9LjPDA!SQA&@Q_5P$nZXUT~qw*B=E@bJAe>l565;`6ONG4L&2= zq^0d`+K%5W=4mHY+7^CMVhArg_R&%0#(Z~15<06!H$5H2FjST!PWCJ)4oqTZ`( zbm-vC_3Ksw3d72vAJ~{Pc)L>2uFWK62Bz9o zDo_2(t{Pd=aexZ?HE^uc!w^2dfg9dtf^vk6%J6Sq%kl&$Iyt#Md-`SyA1K$op(HhI z$AZPbqHf?%<}ioJae{4AoqJd-9KM!qeJ) zxHmW8r2DsMagnEu96VF`ZEFDOujxOlxox@g$t?CtP7h)QDzn40A9HN#QLog!jE(Z@ zzqO>5n^RkK%tj|Gm^zDNF=i9}pmF(BN4B=)p2VcbQGk)1&d=B`T@ZJbG?rc_TEP1QGREAUN@ zLAf{WWcH-_G z6iXdzn^)pzJgG4f0wSEp&(3}8^DpUjfKb3s1~23vs)w2W zmPnsx50Fk~rtUPdm_;s`v{>4>P&5oAS#Iv_ zTfITENLJ6xiz{>LuWnAluR-J3}mhYS8UHTfcpk8d@7O4<%gJEpc?`K+F*U#-TWb7 z;x{AvYNBdvycf%dr&0q9y#j$Jc@*Hc`___D$;qJIeS+77%*P%V-h}5Z2mU!3B!1d1 z$0S=6(V1EoC7(jP9{3tK(73YC26U3?t_Oucq>Jhaqs{-5l$W8ew-}hOMuWazrQ!uZ zwty^{J(lKrG4l)FR{RiQkuG!=Z&|T#VcI}p^k(4tiGGqc0pkQ6d&dO7+*g*by-%{tB8Gj-E+F^IxuglYVr6}d$H)Pia zJD2s$KwNo|H?~>7f~5`glfrb4&SK(tr%Etas~c@N$fK9N?C(-Nm}67gPsiK)Jz#Oi z=TTz_+&R|F4h>=KjdPVe*IM(bO9abD$wuqj!|zx4psaS&^xcT>i%wL``ABd9fEKW1 zzv@TxCkSVWY%_#`N1kJYY2(Wy3f51T7^popk?%Baut zk~7jNo9umn$6a>LrvGiG<~}lwZF}?Y-wCo)`$^`xI}YR{P3G&cNrW-YQ$b)?#yPnt?Lj%jg= zhF{xbIku+F2hHBKZXJ8trP0)iH!Gb7fKu>pL6L-bBH5&RA)cVuN6yxz~iJcV{GOk|be=0hXir{$edK5MZ7E-rh5FaW?Hz$l) z)DtgFPm+DFHWq}Q8E+LIuH5`yPGb3FEtzB&yr`*{V7k+t z2+0c|7QJjQJBHqxFMW9~9kM&ph+pJvQFNdbWgKL-L3F0K9%=YE?Li9+fC)Y?(iDiL<9 z(a9OaVw7C;dHqGhR`K(E#4$10g0zQ(3iYN(hZ4@_M^ih*&Jsuf+7r!zXjv)aABz%! zuft|)r?_h!^6Eb`yyIBU(l>W6%88QG5rrm`4c-`71u+~phGku8tIV2h98x659&7sS zF^ExbFReNn&!6;-y{Dj1A8yZ3KJ}~AybhWtt(x(ajqDhV)o&YHh+!y<-p4s8eDXgu ziH{;Uo<5!xc1uRu+&j@W8PT*}o%7NpH@xQuS$C647~wNNM{cu>8f3pxlgo}L`1*<5 z^P+a!X&OtJL-AI3{)0@3z>PT!F41#qtK3iz1Z4kW%^~?p0#zi*XXueGTIaR<9>pFT z&Efn0YA0b76&}I=MjqhNGAj!cT{!vd=|{>SeEYj1u9sM}0Zf@htn#nJo>R(|1GtDb z#YG-SWmN?nn;e)9AhC<4nH5Nd`+Z{!GkFdEyWu>6gG(ad+xy(2FX#8NkXI_6EX=&m z0cWhu)tnk;sp<3M3uNhENAu?Y?MKn4&->FjE{?&)`mRlw$L{eMHEG~1-# z?YbDmF=5%U5y`)j&bYB9CYMiI5=v1kTsBj{&MQxclyO{|krl3{9}VW!(Y^Fp33W(t zH6;50U1{qT34r1TUPiY=A15e^jc#gBp{mD;W;@{HV9_Zn+(U)P37)GRI*BEXCATj) z-U9RCabxA)u^HAc*u@3A!k7wwX2g^P#l6eFte>T#naCO~av9nEEzB+T(&A_-4S-J^ zj3dzFt-NaL2%&uLhsrU@u9=jDC5_^&E=6U`p z^Q#dI`q~`iZ*aKD1H|%3#mXj^D(C9dz=oSjP(7ujn7@*` z8iPw~N*8QAZrwIBm99h&QLH+C&f74mzRTCoF-((MBB^IUV)E2#C93oP%G8|yz= z5d=P>x_OC*Gr{ow?=N;)BMJ@O*=cJ10-Lnz2`~S=uUdl~iFrxKQbWoWIo$h-WkQfL z8d5MK6O#bs(IzQ)RYTe&Q2YzdM8pkoFTVhcfHnK#e1~r}Cz%6w6E#HIAJ4RQI5d1g(#yEW(Sv=LeO^QVvz7>vkVR$D0`ESMt_SB67;Y-12;~y>!l) z*l`bS1wn+jOLVjKRdY9fFD9YXltf2y5AFTge$TG_O5kIEug8|tG$fHk6Lcq(XuR+LNq6k3ql_z5ljBF_y%MM%EF&MJ%YbS8x?quDo$7!!t0nfVESG&`TxGpU$U>udF(|e zszl~sFz&@O{bIFr1ZHf6d{W>A>1AwGSXE_J{en$w4O@Ljl@iw$2Fi6ACPjZ&PcH$4 zzQ0J}-%I^*CIBve4n=>B#MbZwVy>-}ILD$bKFq#mqUDA^^?n-_U#-UYV1d_}mHMX! zKH49Z%YJ2H;5Jbxy1Kkk_w4Ep7nA(uVVwcwj|hq_lMXHubj?r8!oUoQRqczNOZnl~ zS9<+Z&eM&eEV__s<%16YZqNFzsQW8lBG(&9?QSjZCY3k6Opm}2ED}!sDsOJ}GE=wv zNj5dlvw12NTb$Zn<)mkPoQ)r}lS>$Lc%CFck$;jD*|WjFra^|*u_CF>bbrEG>yPqYvWiO@;_0 z4&q#o0^TOPhaL_>ws^P8gO}IoG+)omk^0Ne<&;719ybIAA^*(#0lfS~#?NIG)QULY zi4USPt-sInnq#-<-P_$|GhD#%W(RN6lsy|VJo(a_D%vjPy%eNbV;R3=GPAa;x85xx zwP*Q<^}!VX+32jQg{FC?;bQ(@8y;-(%}N@!0?85%-eNHBN@AL#A^(dIZ}mz`?&A9Q z^80TcEYgHbO??VyyF>@y!j1b8lEQ=8U!ji`l^656Iq(`6Cs;=)CwP7}lZn+H z+c7z~CoedPnXP6T9&Ho9cf#>)9qfxgHnt3?A^jbU+vOFNgvM5xX!a`X3g5{uOz3$99ArEkn6 z?j?oA+SN<10M`I_a)6I*3<*N!`4WT-_bdOer}+0^{_7jC{^X$ke?7%N+oSUoxG>xS zKX?kn|N4Rd$0JQDhnY5&?6mEx#2eWrig#ys-R~rxIulG_ciw;N>{B$dl8KEqjBV-j zCr}{p^|ilh$(YtPk|i`^E7#GRj->ClD4d-3)G;0Pj8|nHE4mqowSMbdyw_NNB@jLs zWCS6&o?_YS9&pc^Ip8ATxQdrlNLaIPz~#)iZ3a^=Eb!I+UZ+FIEwbk?bwn@84w z_Q&uh+d8ZF!q<*jYez0Ee<@|I6asTp5A6D$)DqRXo80rL=xRk}Gh+|j!0ZxPwD2AG zbGBmj%oDHDUj{zidXjpy)9!6nWP$Bg27#AXRG!E-x>q-uBb}S?CNWDk@;(sj`k)yj z&WjRYEhtu;9{>17l#!MomCi?0@+J4j*lx00uOCUk`Fws?nG@uqlRtu~+lYy!FF|bi z>cZt~`GNm43Ia)70?DehMx7lKA51$n|$(%YQ1)vB$$NA0`mm|twHA{)QCdh}XFck9E2`q)hzr$ni%b<~$FBQTk zj_}IKAB*P?HI=Me>Ex%fUk2|eN^zbwPeKh!C!r_kl+UG-y$h69`i#|ibUk{$@GhUc zc;n9;tr=NQ()XpkhDT|M5-XeByMI)-?sFRUQ=@22SXB%|db(q&SpAn*h0eJ&{LN;f zEn7$g%~|y2RV!3vQ+1waHgQ231}7x2(zk9G@)B?MOzQN0>~M!aT7e2fJVzy&G|g#X zTI2fE4$M}!?W{u(#c#clzL#=eF7HOz{=}M^ugwcraOh296Lu+%rt7g|FK$i00B@AJ zPLyZ`QeSI+lVpbD5s$Ii~)7xTq1 z68INZE>LuZ>U7mJN(95aBv0IXagA!dVaHYR(_Tgl@9TKsY$Q8s&|5r=^-r?5TlqN6 z7mrPz)_)CdgOM-!V3BU^>%8f$sBzt$zG@TVLEHN(RF>5q*nYiN4iR>h5I2dYXRX|7 z$1BaZ>U(X+S|?}0H1(ZnfCxyJ(t@NktRS#-NS6o- z(kvwnOGx*Uij+tr-5{NUF48SOx_jxm59<5gd*A!V{ck?c%rkN3%sJoBoH^$REW@Qu z8(WxbI6r>sC}P6yUs_5M#@t0OO~x@-xLHit+e3u%H;2FG;V71e1sYJu`ZCBH-1*pf z5ufk9w;ozZftAUz$azS*_K}$=aGJGus^Rf=!{(!7wtJ<`jMcJB-U7CTU}2N*C20L$KV$|DRg=?I1?*>wIc7)%7H?K zYEie_ZkVF(i(~pO9yv4N#~&?6C{O7WUnc<5@0I>RND;kZQ_vjN5K= z-+m-8R^cTHEU`H1hbCnt;^$2N-qg{kuMH&+fu4%^I5&;54ZTzXodz8KN10MSiQo-oGRVaww^A9P;}(nGhKa z?EV!EM}aaFBg3r70qR2~E z%jp%bx2bUMTQkTix+rEo|LW-?E*85GC0Hn#@VJPEcEoi+SnSDFk%AGHjpT#omAsHn zIHPVBd{fsrpr&^G;+JQSuR2D^VqsB2wGBouD+dQy0t~%poc(HD6PEDUQ&G`62rr*T z08ghHpX&Qg6BXmfM;gAO?*mXwa#Y~$M(=Ax)qZf)ASVQo zf86Go?{Vec#yhv;ljO3QQR{gO$W1`zG$3tY6OpEZv5T>c4F)(#x)-*Lyana!-VgiC zT(QNSj=o;dhy{V#hM(F6GT%*T(j7I8^{sxo-O`a#fKuYI{JqdYTr%jo#ON3 z16J9Y>F3i?MCE5z)C6WqL2;jK!N>rwxg1-p?UHrwQR~ranaSRDj3)T8)ctGm$j)y_ zk5m~smiA=YY?G#0+PS08RvfdZ`PI&zVGfflZ(sy=Lj{8$*Q9Fe5MK8IQ} z0XWaVdbOqNbt@8#J;UW*`#5G_Yv5W}d(qqIw*iC7s$z3OZujC^80Lx_VoYJz$+YfZ zhcg$9y!o-_F7I~+X&wbGi#?*GQvz^JjN2HVd!K?WHtX#%99*YqG_&5;{98tDLCUD~ z%!yzF^JX8^Dqodkb!%Jy94?@-0hxj#OWu?fi zs40ac{dO}jdDh-jV24n-bifD<(v{h9m@6A5w>EQsMWwMYRTMjmOSSa&evra0`mXJT z2++5D4^!KXVGM5HVBsuY~K8zn5765&6gXA%arfS+qfdXnp|GDMMvdQuY*Bk$6Rf{+Db-~=Ks~^*x=6&F$WbTs zF0WP}P^tQ%&1JeZ;nPWY0_sBXjE+;5s}{8vhHf~O5*>;^hz`%jloWgDQY8x;zKvAy zX3T%MG2VnXAcGFVKIatM$ti^r72YpOVbXoFWB=+NDszS8!^Rqontf^-i}0?>-gk5$ zh=fKhKblcKkBj#uF}GgjabJHP4U8b9b5`cHFJzDZ^6XUxX3X)jGU%TFw5H~e0O(JuF;WqdY=!vIF^UXY0E#fI+ph}mh&k}urG8Bjo_ zd+>fA70s6$a*3YYqX5e@w}JdEBsn1Z61I>H)4B^Udl_-lUbI82I-QZXz+4|o8ALYE z@Ga#lY_);ZX5(cxBU-xr?a4&FqUBJ(MAr5&4>9uMk(pO3`RQOvW1#@W;XTZdYU6FU zO#1b5A-CszsbY?w2;<(K<}1p%BSfkVHS!;&tIi+z6=ys%mxVZ)vRIpJ=;6d+~iB;%)**1!(v8i*-%X!VZ) zNe>4u`w5XkSxO0&G1(D^?9-Uh()a{ZSP#%K5<%ow{Lo82wxoDkVk#wp_ki-42y-#K zuw5JlH#O*XOF>S4bOe5Yc;r=e%W@M@H@`NlUw)+B+V0I9F_7wwL=$$Ef7( z39ER%MS#jXX9tHC=6?u1NVFSwG0Urm1&D4t)=Y`g?m1?1#!|ZO)aKP;`RVlk5xIXj zrU4E8sdqB1><}KuLL>B-EIspTa>{TeBCnh4_uniI14N< zAk-}ZmXiy0nVo6eH+>Zt{flP>xqqo*(AB<~GvhV;ecIF2{8A#QNM$z8X|^{zvT_E8 zr!9e>dd$nrO3%Q2K@hz=QU6sQHiut*DO}YErI95ziRKrlYqZUV_0*BXFOund`iE2D z4=uhg(o3qJ6c)Y;lky}Z8-5x07Og%uG954Ek)v*z*-wP@tS_oVgP|QXaFQe`x1FE5 zu2U8abw`t^%GjvlBNKzy!qKy}X8Q7>hq20$c)q};*Ox1w!$RBy`}a>BB;80SHC9CY zKp0MhfM+{>Sep!D0==rB;-4}pf6G~PF}@ddM{zvC0jr{fD{2pIL^t*`+EgfikP`YL zv(oX_5p(#dI(sucPsJ09o}%1N;UQm@XYJ6`__a*iJsaGK{TXkKtaG&y49?eG3pNb+ z@^=-vs>1M_-Ou%S(tQLg+~u%BqMyS+5+od|KjGT|#H!6Xh|vwgRe zNcmJ3Z@bOxvQNZQuwom5-lN#&XEk5cCVPIOdjc=;n(X@ylp_m%-MOKO1PRu=$v{?O zz|{nBA(B=bmwVL$8HowDoipDE_g2V&2e-;lo{2g@#IBL$yX$aI;RgO~GV1KeEDhQE zEXv_-!TY~Rh;1Wf$JaQ@yu9|^f2;{k$c0bH?8EdPIb2V`KTbKYAl}$8{uvAd2zd;+ zk=kT^TbN-Vm%j=xr`FKZgnA^I={ZOT%jFp_ygMX{&8A>deW5qC@>+}}R> z@M&U}lH$N@=;$ZW;<(9JuU-t`nOF6gy&HyTIGCl^lZELdGz!-rcrM8>T+tC5%! zRu(6FmC8<`O8SS584oFVWk_kVt(X&bt)L0P?S;Dgz3Or3AvyY=$xTs^!m~zt%Q(3o zeFAARgRV{QBEhAAV|yMw;FfaZ-5lw)f>016f3d0fgClJN$ zK$)EWQExfB0B0d-*WZ}r&;GRnM);fkTWp{&?vcUa%m4@r+BJgS)ZS3Jr)UWn1Gu&V zX@LRq1Fk=%$N{3;S0&B&Zs%QVgKQW4)yu#M@a{P2g((^`0l-N(=!Jr*BX6q{CM>8s1=5ttwza&Yv zF1EYaJj(~IfpWVD+W*rJiRXfesr;l`tK{O#Ruw~%Epwi|%EKb{J^`eWY;zTtmyFQ`~ggmCZP@EpQH-F zCJ@&S>yPSFamgPuO97{ikyD^hNZF>?2&HTH$b!bXj;=B_mNDO9ysthW?K*B&#MsBt z%6d9?!x=`hpAw<^*tU7aMU<+dX6OzI3w9VCLn^F`I2eil2m$QDhYeoE*2!IL8)&84 zsRPSpM6#ti3`urB7sFC3RYle(G_Xk;Awn`=_-4O#{$bL_S^|BtediikLC7^Pu`1u! z_sL#AU!E8`rBgxyhG+!>Y2J8g0Sv^ANu^iH+4Sux0+D{P)M?~pVlJLg0Xa)fdSSb- z;;|WRAm^L1aa`V}YlMD2LSe0X{`jf0I$_)`V)*gQsM4s`(_oi{@Pm*ma=Yv|vSjxM zq3Fa=tSumk`#Oel?c5RIdeeb*x@7?CynX#(t7+`eQyw%R(g<&^&f8~`jrwe0E~BMc zBNa7~D7c!Y^%)yDr{i*er6nVX&@WO<)XjkbjtmBIi_Fz6;E~5i zS%Gsa5S8B84$En|Y=6MohdYFd=XpfUg}F^tEF-}nSjNl1W3;-DjL~8AMK$VhXK+;?_gjM|CJAfKg8v;G!GLxCJevs48KV~yJkFFR$(Xb zjePt@%hb06tmBX&o=y2K78Uea@3m9vzCUR`{U|$b+C{vO{EDiUyb2=e3|NeMn>r#RvRWQ+_N{xyR#gPxS9yxO2S3;t=$`CUJDt^NGMw|leqhB$*x zp(}&O@^-8{v>F(`Y-crozCc#S--_1)h&k-X-V=imXS_{y$^{bORggTWWTAcj*#y2f zvuQ*}Hl$ML`D~ye4l9i>o6<@R?6yC}<;Eo#>;olVyA@$n2tJYB6I;3I*B{9931s@b z5xs+aztr5-2jvUvzxjxW^4LGT2Jduj{jj(P8-&!iD<{UPmwTkf>EPbAjbD=$esi7H z_@V2`x0WRhmcrs`k@Sk_;{()2YSQ}w1O5hLH{|g7wjM3I4z8Sd#iv z0~g^sI}=yAQa{u;glN+G&c!<^=ds-|bJ3Y7jnKJ_+ijrMX}-LAJv&rgVtG+or5cF| zqN=MGntYn;6YQC)@vO*W?zU}WNy{j~Z}sa0yUFR(A_LKnVu|THYg${5%#rjkHW_`( z>Q{|sn<}o6b&#JNK`lqc|K~p6hGTt-7vY0Pct?ki%wm?!W3^T+Ba19V_1yE%EJuNb4)X5mc z?zkq(iK@i=U&AuN%l<*Lu`U)U<$l>DPW%H?WDz{nK0m==&&*|Ch^5s!v0q#=9}9&#WD;TMsX&^vr6fx#CAQ*QYQb_wt%6?^qb?5TYvKcST&MabiuBlMVRj7R)ty63 zBN;{&Nb#d4O=a2CE`cU+y4OpmGi8Cn*VRa`95$wH@hMv;(d~`{ub~6%FR-iBY^i=!xoR3qYu80)B_82Z|bZ5Qm^i~;r zm!pAJ%1>zXSD(#&CVO31Sv7AmE~B2jWDOfoTG8H)`mAm8=3P)zV3ZPn(c@n3@z(c3&k+39?f$xRHjPF-IzZPEI z?g@49l%rKTN%;C7Ejgymh`B5jJ6h`IRd*1$kLzrfH4 zFopZmbj3&RuaEZOHB<1K5@irY4W6M4*RA(F-?^hS{<~S-i~TP{Yw^Lf(cO<%YnXi_ z41zd6Ct-XiHzV)1Z2#9_2&4W5g-71AuCu>(2ztJ}S>^ShXpucFj|#*gW#%O^HNEUe z%NE0HH@qY2 zfsE%!xqsKWev_;5b-1b2t;NFIUdIGUoJYLHC3khk00H(x5XcwE9QvmO82mstZwf#l tz=8~P4}?VcAElcSfq_AwmdC$~O(2kKuYlr41uyU&Bo9-OE|xU*|1Xjzr|AFy literal 0 HcmV?d00001 diff --git a/doc/development/ux_guide/img/components-fileholder.png b/doc/development/ux_guide/img/components-fileholder.png new file mode 100644 index 0000000000000000000000000000000000000000..4b8962905d63592256c34178b08cef29ca782a2f GIT binary patch literal 4953 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 literal 0 HcmV?d00001 diff --git a/doc/development/ux_guide/img/components-listwithavatar.png b/doc/development/ux_guide/img/components-listwithavatar.png new file mode 100644 index 0000000000000000000000000000000000000000..d3cb0ebc02ba24f292bd30e814907afba5926cf9 GIT binary patch literal 7952 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